Skip to main content

decode_packet/
decode_packet.rs

1use spvirit_codec::{PvaPacket, PvaPacketCommand};
2
3fn main() {
4    // A minimal PVA Connection Validation packet (little-endian):
5    //   Header  (8 bytes): magic=0xCA, version=2, flags=0x00 (LE, app, client), command=1
6    //   Payload (9 bytes): buffer_size=16384(u32) + introspection_registry_size=0x7fff(u16) + qos=0(u16) + authz=""
7    let raw: &[u8] = &[
8        0xCA, 0x02, 0x00, 0x01, // header: magic, version, flags (LE), command 1
9        0x09, 0x00, 0x00, 0x00, // payload length = 9
10        0x00, 0x40, 0x00, 0x00, // buffer_size = 16384
11        0xFF, 0x7F, // introspection_registry_size = 32767
12        0x00, 0x00, // qos = 0
13        0x00, // authz = "" (empty string, size=0)
14    ];
15
16    let mut packet = PvaPacket::new(raw);
17
18    println!("Header:");
19    println!("  magic:   0x{:02X}", packet.header.magic);
20    println!("  version: {}", packet.header.version);
21    println!("  command: {}", packet.header.command);
22    println!("  payload: {} bytes", packet.header.payload_length);
23    println!("  endian:  {}", if packet.header.flags.is_msb { "big" } else { "little" });
24
25    if let Some(cmd) = packet.decode_payload() {
26        match cmd {
27            PvaPacketCommand::ConnectionValidation(cv) => {
28                println!("\nConnectionValidation:");
29                println!("  buffer_size:  {}", cv.buffer_size);
30                println!("  intro_reg:    {}", cv.introspection_registry_size);
31                println!("  qos:          {}", cv.qos);
32                println!("  authz:        {:?}", cv.authz);
33            }
34            other => println!("Decoded: {other:?}"),
35        }
36    } else {
37        eprintln!("Failed to decode payload");
38    }
39}