decodeSelf method
Decodes the current object from the given RawReader.
Implementation
@override
void decodeSelf(RawReader reader) {
// 4-byte span at index 0
final v0 = reader.readUint32();
_v0 = v0;
// Check IP version
final version = v0 >> 28;
if (version != 4) {
throw ArgumentError(
'IPv4 packet version number should be 4, not $version',
);
}
// Get IHL
final ihl = 0xF & (v0 >> 24);
if (ihl < 5) {
throw StateError('IHL has invalid value $ihl (should be between 5 and 7');
}
// 4-byte span at index 4
_v1 = reader.readUint32();
// 4-byte span at index 8
_v2 = reader.readUint32();
// 4-byte source address at index 12
source = Ip4Address.decode(reader);
// 4-byte destination address at index 16
destination = Ip4Address.decode(reader);
// Calculate options length
final optionsLength = (4 * ihl) - 20;
// Options
options = RawData.decode(reader, optionsLength);
// Payload
final payloadLength = 0xFFFF & _v0;
SelfEncoder? payload;
final protocol = ipProtocolMap[payloadProtocolNumber];
if (protocol != null) {
final packetFactory = protocol.packetFactory;
if (packetFactory != null) {
final packet = packetFactory();
if (packet is IpPayload) {
packet.parentPacket = this;
}
packet.decodeSelf(reader.readRawReader(payloadLength));
payload = packet;
}
}
payload ??= RawData.decode(reader, payloadLength);
super.payload = payload;
}