public static IpV6Layer NextIpV6Layer(this Random random, IpV4Protocol?lastNextHeader, bool allowEncapsulatingSecurityPayload)
        {
            IpV6ExtensionHeaders extensionHeaders = random.NextIpV6ExtensionHeaders(random.NextInt(0, 10), lastNextHeader, allowEncapsulatingSecurityPayload);
            IpV4Protocol?        nextHeader       = extensionHeaders.FirstHeader ?? lastNextHeader;

            return(new IpV6Layer
            {
                TrafficClass = random.NextByte(),
                FlowLabel = random.NextInt(0, IpV6Datagram.MaxFlowLabel + 1),
                NextHeader = nextHeader,
                HopLimit = random.NextByte(),
                Source = random.NextIpV6Address(),
                CurrentDestination = random.NextIpV6Address(),
                ExtensionHeaders = extensionHeaders,
            });
        }
Example #2
0
        private void ParseExtensionHeaders()
        {
            if (_extensionHeaders != null)
            {
                return;
            }

            if (Length < HeaderLength)
            {
                _isValidExtensionHeaders = false;
                _extensionHeaders        = IpV6ExtensionHeaders.Empty;
                return;
            }
            _extensionHeaders        = new IpV6ExtensionHeaders(Subsegment(HeaderLength, RealPayloadLength), NextHeader);
            _isValidExtensionHeaders = _isValidExtensionHeaders && _extensionHeaders.IsValid;
        }
Example #3
0
        private void ParseExtensionHeaders()
        {
            if (_extensionHeaders != null)
                return;

            if (Length < HeaderLength)
            {
                _isValidExtensionHeaders = false;
                _extensionHeaders = IpV6ExtensionHeaders.Empty;
                return;
            }
            _extensionHeaders = new IpV6ExtensionHeaders(Subsegment(HeaderLength, RealPayloadLength), NextHeader);
            _isValidExtensionHeaders = _isValidExtensionHeaders && _extensionHeaders.IsValid;
        }
Example #4
0
 internal static void WriteHeader(byte[] buffer, int offset,
                                  byte trafficClass, int flowLabel, ushort payloadLength, IpV4Protocol? nextHeader, IpV4Protocol? nextLayerProtocol,
                                  byte hopLimit, IpV6Address source, IpV6Address currentDestination, IpV6ExtensionHeaders extensionHeaders)
 {
     buffer.Write(offset + Offset.Version, (uint)((((DefaultVersion << 8) | trafficClass) << 20) | flowLabel), Endianity.Big);
     buffer.Write(offset + Offset.PayloadLength, payloadLength, Endianity.Big);
     IpV4Protocol actualNextHeader;
     if (nextHeader.HasValue)
         actualNextHeader = nextHeader.Value;
     else if (extensionHeaders.Any())
         actualNextHeader = extensionHeaders.FirstHeader.Value;
     else if (nextLayerProtocol.HasValue)
         actualNextHeader = nextLayerProtocol.Value;
     else
         throw new InvalidOperationException("Can't determine next header. No extension headers and no known next layer protocol.");
     buffer.Write(offset + Offset.NextHeader, (byte)actualNextHeader);
     buffer.Write(offset + Offset.HopLimit, hopLimit);
     buffer.Write(offset + Offset.SourceAddress, source, Endianity.Big);
     buffer.Write(offset + Offset.DestinationAddress, currentDestination, Endianity.Big);
     extensionHeaders.Write(buffer, offset + HeaderLength, nextLayerProtocol);
 }
Example #5
0
        internal static void WriteHeader(byte[] buffer, int offset,
                                         byte trafficClass, int flowLabel, ushort payloadLength, IpV4Protocol?nextHeader, IpV4Protocol?nextLayerProtocol,
                                         byte hopLimit, IpV6Address source, IpV6Address currentDestination, IpV6ExtensionHeaders extensionHeaders)
        {
            buffer.Write(offset + Offset.Version, (uint)((((DefaultVersion << 8) | trafficClass) << 20) | flowLabel), Endianity.Big);
            buffer.Write(offset + Offset.PayloadLength, payloadLength, Endianity.Big);
            IpV4Protocol actualNextHeader;

            if (nextHeader.HasValue)
            {
                actualNextHeader = nextHeader.Value;
            }
            else if (extensionHeaders.Any())
            {
                actualNextHeader = extensionHeaders.FirstHeader.Value;
            }
            else if (nextLayerProtocol.HasValue)
            {
                actualNextHeader = nextLayerProtocol.Value;
            }
            else
            {
                throw new InvalidOperationException("Can't determine next header. No extension headers and no known next layer protocol.");
            }
            buffer.Write(offset + Offset.NextHeader, (byte)actualNextHeader);
            buffer.Write(offset + Offset.HopLimit, hopLimit);
            buffer.Write(offset + Offset.SourceAddress, source, Endianity.Big);
            buffer.Write(offset + Offset.DestinationAddress, currentDestination, Endianity.Big);
            extensionHeaders.Write(buffer, offset + HeaderLength, nextLayerProtocol);
        }