001package org.apache.commons.net.ntp;
002/*
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements.  See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License.  You may obtain a copy of the License at
009 *
010 *      http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019
020/**
021 * Common NtpUtils Helper class.
022 *
023 */
024public final class NtpUtils {
025
026    /**
027      * Returns 32-bit integer address to IPv4 address string "%d.%d.%d.%d" format.
028      *
029      * @param address  the 32-bit address
030      * @return  the raw IP address in a string format.
031      */
032     public static String getHostAddress(final int address)
033     {
034          return ((address >>> 24) & 0xFF) + "." +
035                 ((address >>> 16) & 0xFF) + "." +
036                 ((address >>>  8) & 0xFF) + "." +
037                 ((address >>>  0) & 0xFF);
038     }
039
040    /**
041     * Returns NTP packet reference identifier as IP address.
042     *
043     * @param packet  NTP packet
044     * @return  the packet reference id (as IP address) in "%d.%d.%d.%d" format.
045     */
046     public static String getRefAddress(final NtpV3Packet packet)
047     {
048         final int address = (packet == null) ? 0 : packet.getReferenceId();
049         return getHostAddress(address);
050     }
051
052    /**
053     * Get refId as reference clock string (e.g. GPS, WWV, LCL). If string is
054     * invalid (non-ASCII character) then returns empty string "".
055     * For details refer to the <A HREF="http://www.eecis.udel.edu/~mills/ntp/html/refclock.html#list">Comprehensive
056     * List of Clock Drivers</A>.
057     *
058     * @param message the message to check
059     * @return reference clock string if primary NTP server
060     */
061    public static String getReferenceClock(final NtpV3Packet message) {
062        if (message == null) {
063            return "";
064        }
065        final int refId = message.getReferenceId();
066        if (refId == 0) {
067            return "";
068        }
069        final StringBuilder buf = new StringBuilder(4);
070        // start at highest-order byte (0x4c434c00 -> LCL)
071        for (int shiftBits = 24; shiftBits >= 0; shiftBits -= 8)
072        {
073            final char c = (char) ((refId >>> shiftBits) & 0xff);
074            if (c == 0) { // 0-terminated ASCII string
075                break;
076            }
077            if (!Character.isLetterOrDigit(c)) {
078                return "";
079            }
080            buf.append(c);
081        }
082        return buf.toString();
083    }
084
085    /**
086     * Return human-readable name of message mode type (RFC 1305).
087     *
088     * @param mode the mode type
089     * @return mode name
090     */
091    public static String getModeName(final int mode)
092    {
093        switch (mode) {
094            case NtpV3Packet.MODE_RESERVED:
095                return "Reserved";
096            case NtpV3Packet.MODE_SYMMETRIC_ACTIVE:
097                return "Symmetric Active";
098            case NtpV3Packet.MODE_SYMMETRIC_PASSIVE:
099                return "Symmetric Passive";
100            case NtpV3Packet.MODE_CLIENT:
101                return "Client";
102            case NtpV3Packet.MODE_SERVER:
103                return "Server";
104            case NtpV3Packet.MODE_BROADCAST:
105                return "Broadcast";
106            case NtpV3Packet.MODE_CONTROL_MESSAGE:
107                return "Control";
108            case NtpV3Packet.MODE_PRIVATE:
109                return "Private";
110            default:
111                return "Unknown";
112        }
113    }
114
115}