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); } }
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)); } }