#stun #zero-copy #io #message-parser #stun-parser

no-std stun-format

No-std parser for all RFCs STUN messages

2 stable releases

1.0.1 Nov 7, 2022

#1398 in Network programming

Download history 306/week @ 2024-01-01 181/week @ 2024-01-08 141/week @ 2024-01-15 160/week @ 2024-01-22 140/week @ 2024-01-29 140/week @ 2024-02-05 148/week @ 2024-02-12 168/week @ 2024-02-19 305/week @ 2024-02-26 217/week @ 2024-03-04 222/week @ 2024-03-11 216/week @ 2024-03-18 211/week @ 2024-03-25 222/week @ 2024-04-01 171/week @ 2024-04-08 177/week @ 2024-04-15

821 downloads per month

MIT license

175KB
4K SLoC

stun-format

Github Crates.io Codacy grade Crates.io

No-std parser for all RFC STUN messages.

Highlights

  • All RFCs supported.
  • Support for each RFC can be enabled/disabled using feature flags.
  • No-std.
  • 100% code coverage.

Examples

Read STUN message

const MSG: [u8; 28] = [
    0x00, 0x01,                         // type: Binding Request
    0x00, 0x08,                         // length: 8 (header does not count)
    0x21, 0x12, 0xA4, 0x42,             // magic cookie
    0x00, 0x00, 0x00, 0x00,             
    0x00, 0x00, 0x00, 0x00,             
    0x00, 0x00, 0x00, 0x01,             // transaction id (16 bytes total incl. magic cookie)
    0x00, 0x03,                         // type: ChangeRequest
    0x00, 0x04,                         // length: 4 (only value bytes count)
    0x00, 0x00, 0x00, 0x40 | 0x20,      // change both ip and port
];

let msg = Msg::from(MSG.as_slice());

let typ = msg.typ()?;                   // MsgType::BindingRequest
let cookie = msg.cookie()?;             // 0x2112A442
let transaction_id = msg.tid()?;        // 0x01
let attr = msg.attrs_iter().next()?;    // Attr::ChangeRequest { change_ip: true, change_port: true }

Create STUN message

const MSG: [u8; 28] = [
    0x00, 0x01,                         // type: Binding Request
    0x00, 0x08,                         // length: 8 (header does not count)
    0x21, 0x12, 0xA4, 0x42,             // magic cookie
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01,             // transaction id (16 bytes total incl. magic cookie)
    0x00, 0x03,                         // type: ChangeRequest
    0x00, 0x04,                         // length: 4 (only value bytes count)
    0x00, 0x00, 0x00, 0x40 | 0x20,      // change both ip and port
];

let mut buf = [0u8; MSG.len()];
let mut msg = MsgBuilder::from(buf.as_mut_slice());

msg.typ(MsgType::BindingRequest)?;
msg.tid(1)?;
msg.add_attr(Attr::ChangeRequest { change_ip: true, change_port: true })?;

assert_eq!(&MSG, msg.as_bytes());

Contribution guidelines

Pull requests are welcome. Please make sure your contribution adheres to the Principles section above.

Dependencies