pnet 0.7.3

Cross-platform, low level networking using the Rust programming language.
#[packet(Ipv4, Ipv6)]
pub struct Udp {
    // . . .

    #[checksum(udp_checksum)]
    checksum: u16be,

    // . . .
}

pub fn udp_checksum<'a>(parent: UdpParent<'a>, udp: UdpPacket<'a>) -> u16be {
    match parent {
        Ipv4Packet(_) => (),
        Ipv6Packet(_) => (),
    }
}

#[packet]
pub struct Ipv4<'a> {
    version: u4,
    header_length: u4,
    dscp: u6,
    ecn: u2,
    total_length: u16be,
    identification: u16be,
    flags: u3,
    fragment_offset: u13be,
    ttl: u8,
    protocol: u8,
    #[checksum(ipv4_checksum)]
    checksum: u16be,
    source: u32be,
    destination: u32be,
    #[length(ipv4_options_length)]
    options: &'a [Ipv4Option],
    #[payload]
    payload: &'a [u8],
}

pub fn ipv4_checksum<'a>(ipv4: Ipv4Packet<'a>) -> u16be {
    // . . .
}

pub fn ipv4_options_length<'a>(ipv4: Ipv4Packet<'a>) -> usize {
    ipv4.get_header_length() - 4
}

#[packet]
pub struct Ipv4Option {
    copied: u1,
    class: u2,
    number: u5,
    length: u8,
    #[payload]
    data: &'a [u8]
}