/// <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 protocol; if (Protocol == null) { if (nextLayer == null) { throw new ArgumentException("Can't determine protocol automatically from next layer because there is no next layer"); } IIpNextLayer ipNextLayer = nextLayer as IIpNextLayer; if (ipNextLayer == null) { throw new ArgumentException("Can't determine protocol automatically from next layer (" + nextLayer.GetType() + ")"); } protocol = ipNextLayer.PreviousLayerProtocol; } else { protocol = Protocol.Value; } IpV4Datagram.WriteHeader(buffer, offset, TypeOfService, Identification, Fragmentation, Ttl, protocol, HeaderChecksum, Source, CurrentDestination, Options, payloadLength); }
/// <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; } IpV4Datagram.WriteTransportChecksum(buffer, offset, Length, (ushort)payloadLength, nextTransportLayer.ChecksumOffset, nextTransportLayer.IsChecksumOptional, nextTransportLayer.Checksum, Destination); }