use deku::prelude::*;
use hexlit::hex;
use std::convert::{TryFrom, TryInto};
use std::net::Ipv4Addr;
#[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 ip_header = Ipv4Header::try_from(test_data.as_ref()).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);
}