use bnb::{BitEnum, bitfield, u2, u4, u6};
#[bitfield(u8, bits = msb)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
struct VersionIhl {
version: u4,
ihl: u4,
}
#[bitfield(u8, bits = msb)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
struct Tos {
dscp: u6,
ecn: Ecn,
}
#[derive(BitEnum, Clone, Copy, Debug, PartialEq, Eq)]
#[bit_enum(u2)]
enum Ecn {
NotEct,
Ect1,
Ect0,
Ce,
}
fn main() {
let vihl = VersionIhl::new()
.with_version(u4::new(4))
.with_ihl(u4::new(5));
assert_eq!(vihl.to_be_bytes(), [0x45]); println!("version/IHL byte: {:#04x}", vihl.to_raw());
let tos = Tos::new().with_dscp(u6::new(46)).with_ecn(Ecn::Ce); println!(
"ToS byte: {:#04x} (dscp={}, ecn={:?})",
tos.to_raw(),
tos.dscp(),
tos.ecn()
);
let parsed = VersionIhl::from_be_bytes([0x45]);
assert_eq!(parsed.version(), u4::new(4));
assert_eq!(parsed.ihl(), u4::new(5));
println!("parsed version={}, ihl={}", parsed.version(), parsed.ihl());
let mut tos = tos;
tos.set_ecn(Ecn::NotEct);
assert_eq!(tos.ecn(), Ecn::NotEct);
println!("after clearing ECN: {:#04x}", tos.to_raw());
}