Universal Packet Format
General Packet Format
Ping Protocol comprises a binary packet format. All packets have the same structure which is defined in the table below.
Byte index | Data Type | Name | Description |
---|---|---|---|
0 | u8 | 'B' | decimal value 66, hex 0x42 |
1 | u8 | 'R' | decimal value 82, hex 0x52 |
2-3 | u16 | N | number of bytes in the payload |
4-5 | u16 | packet_id | unique id for each packet type |
6 | u8 | reserved | set to 0 |
7 | u8 | reserved | set to 0 |
8 to (8+N-1) | u8[] | payload | payload specific to each packet_id |
(8+N) to (8+N+1) | u16 | checksum | sum of all the bytes in the packet from 0 to n, truncated to 16 bits |
Payload Conventions
Individual fields within the payload are aligned on their appropriate boundaries. So 32 bit fields are aligned on 4 byte boundaries, 16 bit fields are aligned on 2 byte boundaries and 8 bit fields can be on any byte alignment. Note that the checksum field is not necessarily aligned on a 2 byte boundary however.
Parsing Unknown Packet IDs
Note that a packet parser can easily skip over packets that it doesn't understand or need to handle by just advancing the stream beyond the payload and the checksum. It is to be expected that there could be unknown packet types in any live stream or replayed log file.
Future Proofing
It is allowed for future fields to be added to any particular packet payload. Therefore parsers should check to see that the packet length is sufficient for any fields that will be used, but should not be alarmed if the payload length is longer than expected.
Last updated