#[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]
}