/// <summary> /// Writes the layer to the buffer. /// </summary> /// <param name="buffer">The buffer to write the layer to.</param> /// <param name="offset">The offset in the buffer to start writing the layer at.</param> /// <param name="payloadLength">The length of the layer's payload (the number of bytes after the layer in the packet).</param> /// <param name="previousLayer">The layer that comes before this layer. null if this is the first layer.</param> /// <param name="nextLayer">The layer that comes after this layer. null if this is the last layer.</param> public override void Write(byte[] buffer, int offset, int payloadLength, ILayer previousLayer, ILayer nextLayer) { IpV4Protocol?nextLayerProtocol = null; if (nextLayer != null) { IIpNextLayer ipNextLayer = nextLayer as IIpNextLayer; if (ipNextLayer != null) { nextLayerProtocol = ipNextLayer.PreviousLayerProtocol; } } if (nextLayer != null && ExtensionHeaders.LastHeader == IpV4Protocol.EncapsulatingSecurityPayload) { throw new ArgumentException("Cannot have a layer after IpV6Layer with EncapsulatingSecurityPayload extension header.", "nextLayer"); } if (payloadLength + ExtensionHeaders.BytesLength > ushort.MaxValue) { throw new ArgumentOutOfRangeException("payloadLength", payloadLength, "Consider the extension headers, this must be no more than " + (ushort.MaxValue - ExtensionHeaders.BytesLength)); } IpV6Datagram.WriteHeader(buffer, offset, TrafficClass, FlowLabel, (ushort)(payloadLength + ExtensionHeaders.BytesLength), NextHeader, nextLayerProtocol, HopLimit, Source, CurrentDestination, ExtensionHeaders); }
/// <summary> /// Finalizes the layer data in the buffer. /// Used for fields that must be calculated according to the layer's payload (like checksum). /// </summary> /// <param name="buffer">The buffer to finalize the layer in.</param> /// <param name="offset">The offset in the buffer the layer starts.</param> /// <param name="payloadLength">The length of the layer's payload (the number of bytes after the layer in the packet).</param> /// <param name="nextLayer">The layer that comes after this layer. null if this is the last layer.</param> public override void Finalize(byte[] buffer, int offset, int payloadLength, ILayer nextLayer) { IIpNextTransportLayer nextTransportLayer = nextLayer as IIpNextTransportLayer; if (nextTransportLayer == null || !nextTransportLayer.CalculateChecksum) { return; } IpV6Datagram.WriteTransportChecksum(buffer, offset, Length, (uint)payloadLength, nextTransportLayer.ChecksumOffset, nextTransportLayer.IsChecksumOptional, nextTransportLayer.Checksum, CurrentDestination); }