encodeSelf method

  1. @override
void encodeSelf(
  1. RawWriter writer
)

Writes this object to the provided RawWriter.

Implementation

@override
void encodeSelf(RawWriter writer) {
  final start = writer.length;

  // 4-byte span at index 0
  // We add IP version number (6)
  writer
    ..writeUint32(transformUint32Bits(_v0, 28, 0xF, 6))
    // 4-byte span at index 4
    // We will set payload length later
    ..writeUint32(_v1);

  // 16-byte source IP address
  source?.encodeSelf(writer);

  // 16-byte destination IP address
  destination?.encodeSelf(writer);

  // Payload
  final startOfPayload = writer.length;
  final payload = this.payload;
  if (payload is IpPayload && !identical(payload.parentPacket, this)) {
    final oldParentPacket = payload.parentPacket;
    try {
      payload
        ..parentPacket = this
        ..encodeSelf(writer);
    } finally {
      payload.parentPacket = oldParentPacket;
    }
  } else {
    payload.encodeSelf(writer);
  }
  final payloadLength = writer.length - startOfPayload;
  if (payloadLength >> 16 != 0) {
    throw StateError('payload length does not fit in 16 bits');
  }

  // Set payload length
  writer.bufferAsByteData.setUint16(start + 4, payloadLength);
}