use crate::PrimitiveValues;
use crate::ethernet::EtherType;
use alloc::vec::Vec;
use pnet_base::core_net::Ipv4Addr;
use pnet_base::MacAddr;
use pnet_macros::packet;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ArpOperation(pub u16);
impl ArpOperation {
pub fn new(value: u16) -> Self {
ArpOperation(value)
}
}
impl PrimitiveValues for ArpOperation {
type T = (u16,);
fn to_primitive_values(&self) -> (u16,) {
(self.0,)
}
}
#[allow(non_snake_case)]
#[allow(non_upper_case_globals)]
pub mod ArpOperations {
use super::ArpOperation;
pub const Request: ArpOperation = ArpOperation(1);
pub const Reply: ArpOperation = ArpOperation(2);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ArpHardwareType(pub u16);
impl ArpHardwareType {
pub fn new(value: u16) -> Self {
ArpHardwareType(value)
}
}
impl PrimitiveValues for ArpHardwareType {
type T = (u16,);
fn to_primitive_values(&self) -> (u16,) {
(self.0,)
}
}
#[allow(non_snake_case)]
#[allow(non_upper_case_globals)]
pub mod ArpHardwareTypes {
use super::ArpHardwareType;
pub const Ethernet: ArpHardwareType = ArpHardwareType(1);
}
#[packet]
#[allow(non_snake_case)]
pub struct Arp {
#[construct_with(u16)]
pub hardware_type: ArpHardwareType,
#[construct_with(u16)]
pub protocol_type: EtherType,
pub hw_addr_len: u8,
pub proto_addr_len: u8,
#[construct_with(u16)]
pub operation: ArpOperation,
#[construct_with(u8, u8, u8, u8, u8, u8)]
pub sender_hw_addr: MacAddr,
#[construct_with(u8, u8, u8, u8)]
pub sender_proto_addr: Ipv4Addr,
#[construct_with(u8, u8, u8, u8, u8, u8)]
pub target_hw_addr: MacAddr,
#[construct_with(u8, u8, u8, u8)]
pub target_proto_addr: Ipv4Addr,
#[payload]
#[length = "0"]
pub payload: Vec<u8>,
}