use core::net::Ipv4Addr;
use deku::prelude::*;
use hexlit::hex;
#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(endian = "big")]
pub struct Ipv4Header {
#[deku(bits = 4)]
pub version: u8, #[deku(bits = 4)]
pub ihl: u8, #[deku(bits = 6)]
pub dscp: u8, #[deku(bits = 2)]
pub ecn: u8, pub length: u16, pub identification: u16, #[deku(bits = 3)]
pub flags: u8, #[deku(bits = 13)]
pub offset: u16, pub ttl: u8, pub protocol: u8, pub checksum: u16, pub src: Ipv4Addr, pub dst: Ipv4Addr,
}
fn main() {
let test_data = hex!("4500004b0f490000801163a591fea0ed91fd02cb").to_vec();
let mut cursor = no_std_io::io::Cursor::new(test_data.clone());
let mut reader = deku::reader::Reader::new(&mut cursor);
let ip_header = Ipv4Header::from_reader_with_ctx(&mut reader, ()).unwrap();
assert_eq!(
Ipv4Header {
version: 4,
ihl: 5,
ecn: 0,
dscp: 0,
length: 75,
identification: 0x0f49,
flags: 0,
offset: 0,
ttl: 128,
protocol: 17,
checksum: 0x63a5,
src: Ipv4Addr::new(145, 254, 160, 237),
dst: Ipv4Addr::new(145, 253, 2, 203),
},
ip_header
);
let ip_header_data: Vec<u8> = ip_header.try_into().unwrap();
assert_eq!(test_data, ip_header_data);
}