001    package 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     * @author Jason Mathews, MITRE Corp
024     *
025     * @version $Revision: 1299238 $
026     */
027    public final class NtpUtils {
028    
029        /***
030          * Returns 32-bit integer address to IPv4 address string "%d.%d.%d.%d" format.
031          *
032          * @param address  the 32-bit address
033          * @return  the raw IP address in a string format.
034          */
035         public static String getHostAddress(int address)
036         {
037              return ((address >>> 24) & 0xFF) + "." +
038                     ((address >>> 16) & 0xFF) + "." +
039                     ((address >>>  8) & 0xFF) + "." +
040                     ((address >>>  0) & 0xFF);
041         }
042    
043        /***
044         * Returns NTP packet reference identifier as IP address.
045         *
046         * @param packet  NTP packet
047         * @return  the packet reference id (as IP address) in "%d.%d.%d.%d" format.
048         */
049         public static String getRefAddress(NtpV3Packet packet)
050         {
051             int address = (packet == null) ? 0 : packet.getReferenceId();
052             return getHostAddress(address);
053         }
054    
055        /***
056         * Get refId as reference clock string (e.g. GPS, WWV, LCL). If string is
057         * invalid (non-ASCII character) then returns empty string "".
058         * For details refer to the <A HREF="http://www.eecis.udel.edu/~mills/ntp/html/refclock.html#list">Comprehensive
059         * List of Clock Drivers</A>.
060         *
061         * @param message
062         * @return reference clock string if primary NTP server
063         */
064        public static String getReferenceClock(NtpV3Packet message) {
065            if (message == null) {
066                return "";
067            }
068            int refId = message.getReferenceId();
069            if (refId == 0) {
070                return "";
071            }
072            StringBuilder buf = new StringBuilder(4);
073            // start at highest-order byte (0x4c434c00 -> LCL)
074            for (int shiftBits = 24; shiftBits >= 0; shiftBits -= 8)
075            {
076                char c = (char) ((refId >>> shiftBits) & 0xff);
077                if (c == 0) { // 0-terminated ASCII string
078                    break;
079                }
080                if (!Character.isLetterOrDigit(c)) {
081                    return "";
082                }
083                buf.append(c);
084            }
085            return buf.toString();
086        }
087    
088        /***
089         * Return human-readable name of message mode type (RFC 1305).
090         *
091         * @param mode
092         * @return mode name
093         */
094        public static String getModeName(int mode)
095        {
096            switch (mode) {
097                case NtpV3Packet.MODE_RESERVED:
098                    return "Reserved";
099                case NtpV3Packet.MODE_SYMMETRIC_ACTIVE:
100                    return "Symmetric Active";
101                case NtpV3Packet.MODE_SYMMETRIC_PASSIVE:
102                    return "Symmetric Passive";
103                case NtpV3Packet.MODE_CLIENT:
104                    return "Client";
105                case NtpV3Packet.MODE_SERVER:
106                    return "Server";
107                case NtpV3Packet.MODE_BROADCAST:
108                    return "Broadcast";
109                case NtpV3Packet.MODE_CONTROL_MESSAGE:
110                    return "Control";
111                case NtpV3Packet.MODE_PRIVATE:
112                    return "Private";
113                default:
114                    return "Unknown";
115            }
116        }
117    
118    }