You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by er...@apache.org on 2005/01/08 05:48:35 UTC

svn commit: r124622 - in incubator/directory/ntp/trunk/core/src: java/org/apache/ntp/io java/org/apache/ntp/message java/org/apache/ntp/service test/org/apache/ntp

Author: erodriguez
Date: Fri Jan  7 20:48:33 2005
New Revision: 124622

URL: http://svn.apache.org/viewcvs?view=rev&rev=124622
Log:
Working NTP PDU encoding and decoding.
Added:
   incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java
Modified:
   incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java
   incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java
   incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java
   incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java
   incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java

Modified: incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java&r2=124622
==============================================================================
--- incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java	(original)
+++ incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java	Fri Jan  7 20:48:33 2005
@@ -39,34 +39,28 @@
 		modifier.setVersionNumber( parseVersionNumber( header ) );
 		modifier.setMode( parseMode( header ) );
 		
-		modifier.setStratum( StratumType.getTypeByOrdinal( request.get() ) );
+		modifier.setStratum( parseStratum( request ) );
 		
-		int pollInterval = (int)Math.round( Math.pow( 2, request.get() ) );
-		modifier.setPollInterval( pollInterval );
-		
-		double precision = 1000 * Math.pow( 2, request.get() );
-		modifier.setPrecision( precision );
+		modifier.setPollInterval( parsePollInterval( request ) );
 		
+		modifier.setPrecision( parsePrecision( request ) );
 		
 		modifier.setRootDelay( parseRootDelay( request ) );
 		
 		modifier.setRootDispersion( parseRootDispersion( request ) );
 		
-		byte[] nextFourBytes = new byte[ 4 ];
-		request.get( nextFourBytes );
-		modifier.setReferenceIdentifier( parseReferenceIdentifier( nextFourBytes ) );
-		
+		modifier.setReferenceIdentifier( parseReferenceIdentifier( request ) );
 		
 		modifier.setReferenceTimestamp( new NtpTimeStamp( request ) );
 		modifier.setOriginateTimestamp( new NtpTimeStamp( request ) );
 		
 		byte[] unneededBytes = new byte[ 8 ];
 		request.get( unneededBytes );
+		
 		modifier.setReceiveTimestamp( new NtpTimeStamp() );
 		
 		modifier.setTransmitTimestamp( new NtpTimeStamp( request ) );
 		
-		
 		return modifier.getNtpMessage();
 	}
 	
@@ -85,21 +79,38 @@
 	    return ModeType.getTypeByOrdinal( header & 0x07 );
 	}
 	
-	private ReferenceIdentifier parseReferenceIdentifier( byte[] bytes )
+	private StratumType parseStratum( ByteBuffer request )
+	{
+		return StratumType.getTypeByOrdinal( request.get() );
+	}
+	
+	private byte parsePollInterval( ByteBuffer bytes )
 	{
-		return ReferenceIdentifier.getTypeByName( new String( bytes ) );
+		return (byte)Math.round( Math.pow( 2, bytes.get() ) );
 	}
 	
-    private double parseRootDelay( ByteBuffer bytes )
+	private byte parsePrecision( ByteBuffer bytes )
+	{
+		return (byte)( 1000 * Math.pow( 2, bytes.get() ) );
+	}
+	
+	private ReferenceIdentifier parseReferenceIdentifier( ByteBuffer request )
+	{
+		byte[] nextFourBytes = new byte[ 4 ];
+		request.get( nextFourBytes );
+		return ReferenceIdentifier.getTypeByName( new String( nextFourBytes ) );
+	}
+	
+    private int parseRootDelay( ByteBuffer bytes )
     {
         int temp = 256 * ( 256 * ( 256 * bytes.get() + bytes.get() ) + bytes.get() ) + bytes.get();
-        return 1000 * ( ( (double)temp ) / 0x10000 );
+        return 1000 * ( temp / 0x10000 );
     }
 
-    private double parseRootDispersion( ByteBuffer bytes )
+    private int parseRootDispersion( ByteBuffer bytes )
     {
-        long temp = 256 * ( 256 * ( 256 * bytes.get() + bytes.get() ) + bytes.get() ) + bytes.get();
-        return 1000 * ( ( (double)temp ) / 0x10000 );
+        int temp = 256 * ( 256 * ( 256 * bytes.get() + bytes.get() ) + bytes.get() ) + bytes.get();
+        return 1000 * ( temp / 0x10000 );
     }
 }
 

Added: incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java?view=auto&rev=124622
==============================================================================
--- (empty file)
+++ incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java	Fri Jan  7 20:48:33 2005
@@ -0,0 +1,70 @@
+/*
+ *   Copyright 2005 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+
+package org.apache.ntp.io;
+
+import java.nio.ByteBuffer;
+
+import org.apache.ntp.message.LeapIndicatorType;
+import org.apache.ntp.message.ModeType;
+import org.apache.ntp.message.NtpMessage;
+
+
+public class NtpMessageEncoder
+{
+	public ByteBuffer encode( NtpMessage message )
+	{
+		ByteBuffer buffer = ByteBuffer.allocate( 576 );
+		
+		byte header = 0x00;
+		header = encodeLeapIndicator( message.getLeapIndicator(), header );
+		header = encodeVersionNumber( message.getVersionNumber(), header );
+		header = encodeMode( message.getMode(), header );
+		buffer.put( header );
+		
+		buffer.put( (byte)( message.getStratum().getOrdinal() & 0xFF ) );
+		buffer.put( (byte)( message.getPollInterval() & 0xFF ) );
+		buffer.put( (byte)( message.getPrecision() & 0xFF ) );
+		
+		buffer.putInt( message.getRootDelay() );
+		buffer.putInt( message.getRootDispersion() );
+		buffer.putInt( message.getReferenceIdentifier().getOrdinal() );
+		
+		buffer.rewind();
+		
+		return buffer;
+	}
+	
+	private byte encodeLeapIndicator( LeapIndicatorType leapIndicator, byte header )
+	{
+		byte twoBits = (byte)(leapIndicator.getOrdinal() & 0x03);
+		return (byte)( ( twoBits << 6 ) | header);
+	}
+	
+	private byte encodeVersionNumber( int versionNumber, byte header )
+	{
+		byte threeBits = (byte)( versionNumber & 0x07 );
+		return (byte)( ( threeBits << 3 ) | header );
+	}
+	
+	private byte encodeMode( ModeType mode, byte header )
+	{
+		byte threeBits = (byte)( mode.getOrdinal() & 0x07 );
+		return (byte)( threeBits | header );
+	}
+}
+

Modified: incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java
Url: http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java&r2=124622
==============================================================================
--- incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java	(original)
+++ incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java	Fri Jan  7 20:48:33 2005
@@ -24,11 +24,10 @@
 	private int               versionNumber;
 	private ModeType          mode;
 	private StratumType       stratumType;
-	private int               pollInterval;
-	private double            precision;
-	
-	private double rootDelay;
-	private double rootDispersion;
+	private byte              pollInterval;
+	private byte              precision;
+	private int               rootDelay;
+	private int               rootDispersion;
 	
 	private ReferenceIdentifier referenceIdentifier;
 	
@@ -39,8 +38,8 @@
 	
 	
 	public NtpMessage( LeapIndicatorType leapIndicator, int versionNumber,
-			ModeType mode, StratumType stratumType, int pollInterval,
-			double precision, double rootDelay, double rootDispersion,
+			ModeType mode, StratumType stratumType, byte pollInterval,
+			byte precision, int rootDelay, int rootDispersion,
 			ReferenceIdentifier referenceIdentifier, NtpTimeStamp referenceTimestamp,
 			NtpTimeStamp originateTimestamp, NtpTimeStamp receiveTimestamp,
 			NtpTimeStamp transmitTimestamp )
@@ -88,7 +87,7 @@
 	/**
 	 * @return Returns the Poll Interval.
 	 */
-	public int getPollInterval()
+	public byte getPollInterval()
 	{
 		return pollInterval;
 	}
@@ -96,7 +95,7 @@
 	/**
 	 * @return Returns the Precision.
 	 */
-	public double getPrecision()
+	public byte getPrecision()
 	{
 		return precision;
 	}
@@ -128,7 +127,7 @@
 	/**
 	 * @return Returns the Root Delay.
 	 */
-	public double getRootDelay()
+	public int getRootDelay()
 	{
 		return rootDelay;
 	}
@@ -136,7 +135,7 @@
 	/**
 	 * @return Returns the Root Dispersion.
 	 */
-	public double getRootDispersion()
+	public int getRootDispersion()
 	{
 		return rootDispersion;
 	}

Modified: incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java
Url: http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java&r2=124622
==============================================================================
--- incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java	(original)
+++ incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java	Fri Jan  7 20:48:33 2005
@@ -24,11 +24,10 @@
 	private int               versionNumber;
 	private ModeType          mode;
 	private StratumType       stratumType;
-	private int               pollInterval;
-	private double            precision;
-	
-	private double rootDelay;
-	private double rootDispersion;
+	private byte              pollInterval;
+	private byte              precision;
+	private int               rootDelay;
+	private int               rootDispersion;
 	
 	private ReferenceIdentifier referenceIdentifier;
 	
@@ -74,7 +73,7 @@
 	/**
 	 * @param pollInterval The Poll Interval to set.
 	 */
-	public void setPollInterval(int pollInterval)
+	public void setPollInterval(byte pollInterval)
 	{
 		this.pollInterval = pollInterval;
 	}
@@ -82,7 +81,7 @@
 	/**
 	 * @param precision The Precision to set.
 	 */
-	public void setPrecision(double precision)
+	public void setPrecision(byte precision)
 	{
 		this.precision = precision;
 	}
@@ -114,7 +113,7 @@
 	/**
 	 * @param rootDelay The Root Delay to set.
 	 */
-	public void setRootDelay(double rootDelay)
+	public void setRootDelay(int rootDelay)
 	{
 		this.rootDelay = rootDelay;
 	}
@@ -122,7 +121,7 @@
 	/**
 	 * @param rootDispersion The Root Dispersion to set.
 	 */
-	public void setRootDispersion(double rootDispersion)
+	public void setRootDispersion(int rootDispersion)
 	{
 		this.rootDispersion = rootDispersion;
 	}

Modified: incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java
Url: http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java&r2=124622
==============================================================================
--- incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java	(original)
+++ incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java	Fri Jan  7 20:48:33 2005
@@ -37,8 +37,8 @@
 		modifier.setVersionNumber( 4 );
 		modifier.setMode( ModeType.SERVER );
 		modifier.setStratum( StratumType.SECONDARY_REFERENCE );
-		modifier.setPollInterval( 64 );
-		modifier.setPrecision( -20 );
+		modifier.setPollInterval( (byte)0x40 );
+		modifier.setPrecision( (byte)0xEC );
 		modifier.setRootDelay( 0 );
 		modifier.setRootDispersion( 0 );
 		modifier.setReferenceIdentifier( ReferenceIdentifier.LOCL );

Modified: incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java&r2=124622
==============================================================================
--- incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java	(original)
+++ incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java	Fri Jan  7 20:48:33 2005
@@ -19,9 +19,11 @@
 
 import java.nio.ByteBuffer;
 
+import org.apache.ntp.io.NtpMessageDecoder;
 import org.apache.ntp.io.NtpMessageEncoder;
 import org.apache.ntp.message.LeapIndicatorType;
 import org.apache.ntp.message.ModeType;
+import org.apache.ntp.message.NtpMessage;
 import org.apache.ntp.message.NtpMessageModifier;
 import org.apache.ntp.message.NtpTimeStamp;
 import org.apache.ntp.message.ReferenceIdentifier;
@@ -39,10 +41,10 @@
 		modifier.setVersionNumber( 4 );
 		modifier.setMode( ModeType.SERVER );
 		modifier.setStratum( StratumType.PRIMARY_REFERENCE );
-		modifier.setPollInterval( 6 );
-		modifier.setPrecision( 0.000015 );
-		modifier.setRootDelay( 0.0 );
-		modifier.setRootDispersion( 0.0006 );
+		modifier.setPollInterval( (byte)0x06 ); // 6
+		modifier.setPrecision( (byte)0xFA );    // -6
+		modifier.setRootDelay( 0 );
+		modifier.setRootDispersion( 0 );
 		modifier.setReferenceIdentifier( ReferenceIdentifier.LOCL );
 		
 		NtpTimeStamp now = new NtpTimeStamp();
@@ -52,11 +54,17 @@
 		modifier.setReceiveTimestamp( now );
 		modifier.setTransmitTimestamp( now );
 		
+		NtpMessage message = modifier.getNtpMessage();
+		
 		NtpMessageEncoder encoder = new NtpMessageEncoder();
-		replyByteBuffer = encoder.encode( modifier.getNtpMessage() );
-		replyByteBuffer.flip();
+		replyByteBuffer = encoder.encode( message );
+		
+		print( message );
+		
+		NtpMessageDecoder decoder = new NtpMessageDecoder();
+		NtpMessage reply          = decoder.decode( replyByteBuffer );
 		
-		print( modifier.getNtpMessage() );
+		print( reply );
 	}
 }