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 07:06:17 UTC
svn commit: r124632 - incubator/directory/dhcp/trunk/core/src/java/org/apache/dhcp/io
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 );
+ }
+}
+