Beispiel #1
0
        public T GetOption <T>(UInt16 optionType) where T : DHCPv6PacketOption
        {
            if (HasOption(optionType) == false)
            {
                return(null);
            }
            DHCPv6PacketOption option = _options.First(x => x.Code == optionType);

            if (option is T == false)
            {
                return(null);
            }

            return((T)option);
        }
Beispiel #2
0
        internal static DHCPv6RelayPacket FromByteArray(byte[] rawData, int offset)
        {
            DHCPv6PacketTypes type = (DHCPv6PacketTypes)rawData[offset];

            offset += 1;

            Byte hopCount = rawData[offset];

            offset += 1;
            IPv6Address linkAddress = IPv6Address.FromByteArray(rawData, offset);

            offset += 16;
            IPv6Address peerAddress = IPv6Address.FromByteArray(rawData, offset);

            offset += 16;

            List <DHCPv6PacketOption> options = new List <DHCPv6PacketOption>();

            Byte[] innerPacketOptionValue = null;

            Int32 byteIndex = offset;

            while (byteIndex < rawData.Length)
            {
                UInt16 optionCode = ByteHelper.ConvertToUInt16FromByte(rawData, byteIndex);
                UInt16 length     = ByteHelper.ConvertToUInt16FromByte(rawData, byteIndex + 2);
                Byte[] optionData = ByteHelper.CopyData(rawData, byteIndex, length + 4);

                if (optionCode == (Byte)DHCPv6PacketOptionTypes.RelayMessage)
                {
                    innerPacketOptionValue = ByteHelper.CopyData(optionData, 4);
                }
                else
                {
                    DHCPv6PacketOption suboption = DHCPv6PacketOptionFactory.GetOption(optionCode, optionData);
                    options.Add(suboption);
                }

                byteIndex += 4 + length;
            }

            return(new DHCPv6RelayPacket(
                       type,
                       hopCount,
                       linkAddress, peerAddress,
                       options,
                       DHCPv6Packet.FromByteArray(innerPacketOptionValue)));
        }
Beispiel #3
0
        public static IEnumerable <DHCPv6PacketOption> GetOptions(Byte[] subOptionData, Int32 offset)
        {
            List <DHCPv6PacketOption> options = new List <DHCPv6PacketOption>();
            Int32 byteIndex = offset;

            while (byteIndex < subOptionData.Length)
            {
                UInt16 optionCode = ByteHelper.ConvertToUInt16FromByte(subOptionData, byteIndex);
                UInt16 length     = ByteHelper.ConvertToUInt16FromByte(subOptionData, byteIndex + 2);
                Byte[] optionData = ByteHelper.CopyData(subOptionData, byteIndex, length + 4);

                DHCPv6PacketOption suboption = GetOption(optionCode, optionData);
                options.Add(suboption);

                byteIndex += 4 + length;
            }

            return(options);
        }