internal static IpV6ExtensionHeaderRouting ParseData(IpV4Protocol nextHeader, DataSegment data)
        {
            if (data.Length < DataMinimumLength)
            {
                return(null);
            }
            IpV6RoutingType routingType  = (IpV6RoutingType)data[DataOffset.RoutingType];
            byte            segmentsLeft = data[DataOffset.SegmentsLeft];
            DataSegment     routingData  = data.Subsegment(DataOffset.TypeSpecificData, data.Length - DataOffset.TypeSpecificData);

            switch (routingType)
            {
            case IpV6RoutingType.SourceRoute:
                return(IpV6ExtensionHeaderRoutingSourceRoute.ParseRoutingData(nextHeader, segmentsLeft, routingData));

            case IpV6RoutingType.Nimrod:
                // Unused.
                return(null);

            case IpV6RoutingType.Type2RoutingHeader:
                return(IpV6ExtensionHeaderRoutingHomeAddress.ParseRoutingData(nextHeader, segmentsLeft, routingData));

            case IpV6RoutingType.RoutingProtocolLowPowerAndLossyNetworksSourceRouteHeader:
                return(IpV6ExtensionHeaderRoutingProtocolLowPowerAndLossyNetworks.ParseRoutingData(nextHeader, segmentsLeft, routingData));

            default:
                return(null);
            }
        }
Ejemplo n.º 2
0
        public static IpV6ExtensionHeader NextIpV6ExtensionHeader(this Random random, IpV4Protocol?nextHeader, bool isEncapsulatingSecurityPayloadPossible)
        {
            IpV4Protocol extensionHeaderType =
                random.NextValue(
                    IpV6ExtensionHeader.ExtensionHeaders.Where(extensionHeader => isEncapsulatingSecurityPayloadPossible ||
                                                               extensionHeader != IpV4Protocol.EncapsulatingSecurityPayload).ToList());

            switch (extensionHeaderType)
            {
            case IpV4Protocol.IpV6HopByHopOption:     // 0
                return(new IpV6ExtensionHeaderHopByHopOptions(nextHeader, random.NextIpV6Options()));

            case IpV4Protocol.IpV6Route:     // 43
                IpV6RoutingType routingType = random.NextEnum(IpV6RoutingType.Nimrod);
                switch (routingType)
                {
                case IpV6RoutingType.SourceRoute:
                    return(new IpV6ExtensionHeaderRoutingSourceRoute(nextHeader, random.NextByte(), random.NextIpV6AddressArray(random.NextInt(0, 10))));

                case IpV6RoutingType.Type2RoutingHeader:
                    return(new IpV6ExtensionHeaderRoutingHomeAddress(nextHeader, random.NextByte(), random.NextIpV6Address()));

                case IpV6RoutingType.RoutingProtocolLowPowerAndLossyNetworksSourceRouteHeader:
                    byte          commonPrefixLengthForNonLastAddresses = random.NextByte(IpV6ExtensionHeaderRoutingProtocolLowPowerAndLossyNetworks.MaxCommonPrefixLength + 1);
                    byte          commonPrefixLengthForLastAddress      = random.NextByte(IpV6ExtensionHeaderRoutingProtocolLowPowerAndLossyNetworks.MaxCommonPrefixLength + 1);
                    IpV6Address[] addresses = random.NextIpV6AddressWithLeadingZeroBytesArray(commonPrefixLengthForNonLastAddresses,
                                                                                              random.NextInt(0, 10));
                    if (addresses.Any() || random.NextBool())
                    {
                        addresses = addresses.Concat(random.NextIpV6AddressWithLeadingZeroBytes(commonPrefixLengthForLastAddress)).ToArray();
                    }
                    return(new IpV6ExtensionHeaderRoutingProtocolLowPowerAndLossyNetworks(nextHeader, random.NextByte(), commonPrefixLengthForNonLastAddresses,
                                                                                          commonPrefixLengthForLastAddress, addresses));

                default:
                    throw new InvalidOperationException(string.Format("Invalid routingType value {0}", routingType));
                }

            case IpV4Protocol.FragmentHeaderForIpV6:     // 44
                return(new IpV6ExtensionHeaderFragmentData(nextHeader, random.NextUShort(IpV6ExtensionHeaderFragmentData.MaxFragmentOffset + 1),
                                                           random.NextBool(), random.NextUInt()));

            case IpV4Protocol.IpV6Opts:     // 60
                IpV6Options options = random.NextIpV6Options();
                return(new IpV6ExtensionHeaderDestinationOptions(nextHeader, options));

            case IpV4Protocol.MobilityHeader:     // 135
                return(random.NextIpV6ExtensionHeaderMobility(nextHeader));

            case IpV4Protocol.EncapsulatingSecurityPayload:     // 50
                return(new IpV6ExtensionHeaderEncapsulatingSecurityPayload(random.NextUInt(), random.NextUInt(), random.NextDataSegment(random.Next(100))));

            case IpV4Protocol.AuthenticationHeader:     // 51
                return(new IpV6ExtensionHeaderAuthentication(nextHeader, random.NextUInt(), random.NextUInt(), random.NextDataSegment(random.Next(25) * 4)));

            default:
                throw new InvalidOperationException(string.Format("Invalid extensionHeaderType value {0}", extensionHeaderType));
            }
        }