Author: erodriguez
Date: Fri Jan  7 22:06:17 2005
New Revision: 124632

URL: http://svn.apache.org/viewcvs?view=rev&rev=124632
Log:
Working DHCP PDU encoding and decoding.
Added:
   incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/
   
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageDecoder.java
   
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageEncoder.java
   
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsDecoder.java
   
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsEncoder.java

Added: 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageDecoder.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageDecoder.java?view=auto&rev=124632
==============================================================================
--- (empty file)
+++ 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageDecoder.java
     Fri Jan  7 22:06:17 2005
@@ -0,0 +1,80 @@
+/*
+ *   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.dhcp.io;
+
+import java.nio.ByteBuffer;
+
+import org.apache.dhcp.DhcpException;
+import org.apache.dhcp.messages.DhcpMessage;
+import org.apache.dhcp.messages.DhcpMessageModifier;
+
+
+public class DhcpMessageDecoder
+{
+       /**
+        * Convert a specified byte array into a DhcpMessage.
+        * 
+        * @return a DhcpMessage.
+        * @param buffer ByteBuffer to convert to a DhcpMessage object
+        */
+       public DhcpMessage decode(ByteBuffer buffer) throws DhcpException
+       {
+               DhcpMessageModifier modifier = new DhcpMessageModifier();
+               
+               modifier.setOpCode( buffer.get() );
+               modifier.setHardwareAddressType( buffer.get() );
+               modifier.setHardwareAddressLength( buffer.get() );
+               modifier.setHardwareOptions( buffer.get() );
+               
+               modifier.setTransactionId( buffer.getInt() );
+               modifier.setSeconds( buffer.getShort() );
+               modifier.setFlags( buffer.getShort() );
+               
+               byte[] nextFourBytes = new byte[4];
+               
+               buffer.get( nextFourBytes );
+               modifier.setActualClientAddress( nextFourBytes );
+               
+               buffer.get( nextFourBytes );
+               modifier.setAssignedClientAddress( nextFourBytes );
+               
+               buffer.get( nextFourBytes );
+               modifier.setNextServerAddress( nextFourBytes );
+               
+               buffer.get( nextFourBytes );
+               modifier.setRelayAgentAddress( nextFourBytes );
+               
+               byte[] clientHardwareAddress = new byte[16];
+               buffer.get( clientHardwareAddress );
+               modifier.setClientHardwareAddress( clientHardwareAddress );
+               
+               byte[] serverHostname = new byte[64];
+               buffer.get( serverHostname );
+               modifier.setServerHostname( serverHostname );
+               
+               byte[] bootFileName = new byte[128];
+               buffer.get( bootFileName );
+               modifier.setBootFileName( bootFileName );
+
+               DhcpOptionsDecoder decoder = new DhcpOptionsDecoder();
+               modifier.setOptions( decoder.decode( buffer ) );
+               
+               return modifier.getDhcpMessage();
+       }
+}
+

Added: 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageEncoder.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageEncoder.java?view=auto&rev=124632
==============================================================================
--- (empty file)
+++ 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpMessageEncoder.java
     Fri Jan  7 22:06:17 2005
@@ -0,0 +1,61 @@
+/*
+ *   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.dhcp.io;
+
+import java.nio.ByteBuffer;
+
+import org.apache.dhcp.messages.DhcpMessage;
+import org.apache.dhcp.options.OptionsField;
+
+
+public class DhcpMessageEncoder
+{
+       /**
+        * Converts a DhcpMessage object to a byte array.
+        * 
+        * @return a byte array with information from DhcpMessage object.
+        */
+       public ByteBuffer encode(DhcpMessage message)
+       {
+               ByteBuffer buffer = ByteBuffer.allocate(1500);
+               
+               buffer.put( (byte)message.getMessageType().getOrdinal() );
+               buffer.put( message.getHardwareAddressType() );
+               buffer.put( message.getHardwareAddressLength() );
+               buffer.put( message.getHardwareOptions() );
+               buffer.putInt( message.getTransactionId() );
+               buffer.putShort( message.getSeconds() );
+               buffer.putShort( message.getFlags() );
+               buffer.put( message.getActualClientAddress() );
+               buffer.put( message.getAssignedClientAddress() );
+               buffer.put( message.getNextServerAddress() );
+               buffer.put( message.getRelayAgentAddress() );
+               buffer.put( message.getClientHardwareAddress() );
+               buffer.put( message.getServerHostname() );
+               buffer.put( message.getBootFileName() );
+               
+               OptionsField options = message.getOptions();
+               
+               DhcpOptionsEncoder optionsEncoder = new DhcpOptionsEncoder();
+               
+               optionsEncoder.encode( options, buffer );
+               
+               return buffer;
+       }
+}
+

Added: 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsDecoder.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsDecoder.java?view=auto&rev=124632
==============================================================================
--- (empty file)
+++ 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsDecoder.java
     Fri Jan  7 22:06:17 2005
@@ -0,0 +1,105 @@
+/*
+ *   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.dhcp.io;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+import org.apache.dhcp.DhcpException;
+import org.apache.dhcp.options.DhcpOption;
+import org.apache.dhcp.options.OptionsField;
+import org.apache.dhcp.options.dhcp.DhcpMessageType;
+import org.apache.dhcp.options.dhcp.IpAddressLeaseTime;
+import org.apache.dhcp.options.dhcp.ParameterRequestList;
+import org.apache.dhcp.options.dhcp.RequestedIpAddress;
+import org.apache.dhcp.options.dhcp.ServerIdentifier;
+import org.apache.dhcp.options.vendor.DomainName;
+import org.apache.dhcp.options.vendor.DomainNameServerOption;
+import org.apache.dhcp.options.vendor.EndOption;
+import org.apache.dhcp.options.vendor.PadOption;
+import org.apache.dhcp.options.vendor.SubnetMask;
+import org.apache.dhcp.options.vendor.TimeOffset;
+
+
+public class DhcpOptionsDecoder
+{
+       private static final byte[] VENDOR_MAGIC_COOKIE =
+                       { (byte) 99, (byte) 130, (byte) 83, (byte) 99 };
+       
+       public OptionsField decode( ByteBuffer message ) throws DhcpException
+       {
+               byte[] magicCookie = new byte[ 4 ];
+               message.get( magicCookie );
+               
+               if ( !Arrays.equals( VENDOR_MAGIC_COOKIE, magicCookie ) )
+               {
+                       throw new DhcpException("Parse exception.");
+               }
+               
+               byte code;
+               byte length;
+               byte value[];
+               
+               OptionsField options = new OptionsField();
+
+               while ( message.get( message.position() ) != (byte) 255)
+               {
+                       code = message.get();
+                       length = message.get();
+                       value = new byte[ length ];
+                       message.get( value );
+                       
+                       options.add( getInstance( code, value ) );
+               }
+               
+               return options;
+       }
+       
+       private DhcpOption getInstance( int tag, byte[] value)
+               throws DhcpException
+       {
+               switch (tag)
+               {
+                       case 0:
+                               return new PadOption();
+                       case 1:
+                               return new EndOption();
+                       case 2:
+                               return new SubnetMask( value );
+                       case 3:
+                               return new TimeOffset( value );
+                       case 6:
+                               return new DomainNameServerOption( value );
+                       case 15:
+                               return new DomainName( value );
+                       case 50:
+                               return new RequestedIpAddress( value );
+                       case 51:
+                               return new IpAddressLeaseTime( value );
+                       case 53:
+                               return new DhcpMessageType( value );
+                       case 54:
+                               return new ServerIdentifier( value );
+                       case 55:
+                               return new ParameterRequestList( value );
+                       default:
+                               throw new DhcpException( "Unsupported or bad 
option code:  " + tag );
+               }
+       }
+}
+

Added: 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsEncoder.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsEncoder.java?view=auto&rev=124632
==============================================================================
--- (empty file)
+++ 
incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io/DhcpOptionsEncoder.java
     Fri Jan  7 22:06:17 2005
@@ -0,0 +1,47 @@
+/*
+ *   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.dhcp.io;
+
+import java.nio.ByteBuffer;
+
+import org.apache.dhcp.options.DhcpOption;
+import org.apache.dhcp.options.OptionsField;
+import org.apache.dhcp.options.vendor.EndOption;
+
+
+public class DhcpOptionsEncoder
+{
+       private static final byte[] VENDOR_MAGIC_COOKIE =
+                       { (byte) 99, (byte) 130, (byte) 83, (byte) 99 };
+       
+    public void encode( OptionsField options, ByteBuffer message )
+    {
+       message.put( VENDOR_MAGIC_COOKIE );
+
+               DhcpOption[] optionsArray = options.toArray();
+               
+               for ( int ii=0; ii < optionsArray.length; ii++ )
+               {
+                       optionsArray[ ii ].writeTo( message );
+               }
+               
+               DhcpOption endOption = new EndOption();
+               endOption.writeTo( message );
+       }
+}
+

Reply via email to