nex_packet/
dhcp.rs

1use crate::PrimitiveValues;
2
3use alloc::vec::Vec;
4
5use nex_core::mac::MacAddr;
6use nex_macro::packet;
7use nex_macro_helper::types::*;
8use std::net::Ipv4Addr;
9
10/// Minimum size of an DHCP packet.
11/// Options field is not included in this size.
12pub const DHCP_MIN_PACKET_SIZE: usize = 236;
13
14/// Represents an DHCP operation.
15#[repr(u8)]
16#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
17pub enum DhcpOperation {
18    Request = 1,
19    Reply = 2,
20    Unknown(u8),
21}
22
23impl DhcpOperation {
24    /// Constructs a new DhcpOperation from u8.
25    pub fn new(value: u8) -> DhcpOperation {
26        match value {
27            1 => DhcpOperation::Request,
28            2 => DhcpOperation::Reply,
29            _ => DhcpOperation::Unknown(value),
30        }
31    }
32}
33
34impl PrimitiveValues for DhcpOperation {
35    type T = (u8,);
36    fn to_primitive_values(&self) -> (u8,) {
37        match self {
38            &DhcpOperation::Request => (1,),
39            &DhcpOperation::Reply => (2,),
40            &DhcpOperation::Unknown(n) => (n,),
41        }
42    }
43}
44
45/// Represents the Dhcp hardware types.
46#[allow(non_snake_case)]
47#[repr(u8)]
48#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
49pub enum DhcpHardwareType {
50    Ethernet = 1,
51    ExperimentalEthernet = 2,
52    AmateurRadioAX25 = 3,
53    ProteonProNETTokenRing = 4,
54    Chaos = 5,
55    IEEE802Networks = 6,
56    ARCNET = 7,
57    Hyperchannel = 8,
58    Lanstar = 9,
59    AutonetShortAddress = 10,
60    LocalTalk = 11,
61    LocalNet = 12,
62    UltraLink = 13,
63    SMDS = 14,
64    FrameRelay = 15,
65    AsynchronousTransmissionMode = 16,
66    HDLC = 17,
67    FibreChannel = 18,
68    AsynchronousTransmissionMode1 = 19,
69    PropPointToPointSerial = 20,
70    PPP = 21,
71    SoftwareLoopback = 24,
72    EON = 25,
73    Ethernet3MB = 26,
74    NSIP = 27,
75    Slip = 28,
76    ULTRALink = 29,
77    DS3 = 30,
78    SIP = 31,
79    FrameRelayInterconnect = 32,
80    AsynchronousTransmissionMode2 = 33,
81    MILSTD188220 = 34,
82    Metricom = 35,
83    IEEE1394 = 37,
84    MAPOS = 39,
85    Twinaxial = 40,
86    EUI64 = 41,
87    HIPARP = 42,
88    IPandARPoverISO7816_3 = 43,
89    ARPSec = 44,
90    IPsecTunnel = 45,
91    InfiniBand = 47,
92    TIA102Project25CommonAirInterface = 48,
93    WiegandInterface = 49,
94    PureIP = 50,
95    HWExp1 = 51,
96    HFI = 52,
97    HWExp2 = 53,
98    AEthernet = 54,
99    HWExp3 = 55,
100    IPsecTransport = 56,
101    SDLCRadio = 57,
102    SDLCMultipoint = 58,
103    IWARP = 59,
104    SixLoWPAN = 61,
105    VLAN = 62,
106    ProviderBridging = 63,
107    IEEE802154 = 64,
108    MAPOSinIPv4 = 65,
109    MAPOSinIPv6 = 66,
110    IEEE802154NonASKPHY = 70,
111    Unknown(u8),
112}
113
114impl DhcpHardwareType {
115    /// Constructs a new DhcpHardwareType from u8
116    pub fn new(n: u8) -> DhcpHardwareType {
117        match n {
118            1 => DhcpHardwareType::Ethernet,
119            2 => DhcpHardwareType::ExperimentalEthernet,
120            3 => DhcpHardwareType::AmateurRadioAX25,
121            4 => DhcpHardwareType::ProteonProNETTokenRing,
122            5 => DhcpHardwareType::Chaos,
123            6 => DhcpHardwareType::IEEE802Networks,
124            7 => DhcpHardwareType::ARCNET,
125            8 => DhcpHardwareType::Hyperchannel,
126            9 => DhcpHardwareType::Lanstar,
127            10 => DhcpHardwareType::AutonetShortAddress,
128            11 => DhcpHardwareType::LocalTalk,
129            12 => DhcpHardwareType::LocalNet,
130            13 => DhcpHardwareType::UltraLink,
131            14 => DhcpHardwareType::SMDS,
132            15 => DhcpHardwareType::FrameRelay,
133            16 => DhcpHardwareType::AsynchronousTransmissionMode,
134            17 => DhcpHardwareType::HDLC,
135            18 => DhcpHardwareType::FibreChannel,
136            19 => DhcpHardwareType::AsynchronousTransmissionMode1,
137            20 => DhcpHardwareType::PropPointToPointSerial,
138            21 => DhcpHardwareType::PPP,
139            24 => DhcpHardwareType::SoftwareLoopback,
140            25 => DhcpHardwareType::EON,
141            26 => DhcpHardwareType::Ethernet3MB,
142            27 => DhcpHardwareType::NSIP,
143            28 => DhcpHardwareType::Slip,
144            29 => DhcpHardwareType::ULTRALink,
145            30 => DhcpHardwareType::DS3,
146            31 => DhcpHardwareType::SIP,
147            32 => DhcpHardwareType::FrameRelayInterconnect,
148            33 => DhcpHardwareType::AsynchronousTransmissionMode2,
149            34 => DhcpHardwareType::MILSTD188220,
150            35 => DhcpHardwareType::Metricom,
151            37 => DhcpHardwareType::IEEE1394,
152            39 => DhcpHardwareType::MAPOS,
153            40 => DhcpHardwareType::Twinaxial,
154            41 => DhcpHardwareType::EUI64,
155            42 => DhcpHardwareType::HIPARP,
156            43 => DhcpHardwareType::IPandARPoverISO7816_3,
157            44 => DhcpHardwareType::ARPSec,
158            45 => DhcpHardwareType::IPsecTunnel,
159            47 => DhcpHardwareType::InfiniBand,
160            48 => DhcpHardwareType::TIA102Project25CommonAirInterface,
161            49 => DhcpHardwareType::WiegandInterface,
162            50 => DhcpHardwareType::PureIP,
163            51 => DhcpHardwareType::HWExp1,
164            52 => DhcpHardwareType::HFI,
165            53 => DhcpHardwareType::HWExp2,
166            54 => DhcpHardwareType::AEthernet,
167            55 => DhcpHardwareType::HWExp3,
168            56 => DhcpHardwareType::IPsecTransport,
169            57 => DhcpHardwareType::SDLCRadio,
170            58 => DhcpHardwareType::SDLCMultipoint,
171            59 => DhcpHardwareType::IWARP,
172            61 => DhcpHardwareType::SixLoWPAN,
173            62 => DhcpHardwareType::VLAN,
174            63 => DhcpHardwareType::ProviderBridging,
175            64 => DhcpHardwareType::IEEE802154,
176            65 => DhcpHardwareType::MAPOSinIPv4,
177            66 => DhcpHardwareType::MAPOSinIPv6,
178            70 => DhcpHardwareType::IEEE802154NonASKPHY,
179            _ => DhcpHardwareType::Unknown(n),
180        }
181    }
182}
183
184impl PrimitiveValues for DhcpHardwareType {
185    type T = (u8,);
186    fn to_primitive_values(&self) -> (u8,) {
187        match self {
188            &DhcpHardwareType::Ethernet => (1,),
189            &DhcpHardwareType::ExperimentalEthernet => (2,),
190            &DhcpHardwareType::AmateurRadioAX25 => (3,),
191            &DhcpHardwareType::ProteonProNETTokenRing => (4,),
192            &DhcpHardwareType::Chaos => (5,),
193            &DhcpHardwareType::IEEE802Networks => (6,),
194            &DhcpHardwareType::ARCNET => (7,),
195            &DhcpHardwareType::Hyperchannel => (8,),
196            &DhcpHardwareType::Lanstar => (9,),
197            &DhcpHardwareType::AutonetShortAddress => (10,),
198            &DhcpHardwareType::LocalTalk => (11,),
199            &DhcpHardwareType::LocalNet => (12,),
200            &DhcpHardwareType::UltraLink => (13,),
201            &DhcpHardwareType::SMDS => (14,),
202            &DhcpHardwareType::FrameRelay => (15,),
203            &DhcpHardwareType::AsynchronousTransmissionMode => (16,),
204            &DhcpHardwareType::HDLC => (17,),
205            &DhcpHardwareType::FibreChannel => (18,),
206            &DhcpHardwareType::AsynchronousTransmissionMode1 => (19,),
207            &DhcpHardwareType::PropPointToPointSerial => (20,),
208            &DhcpHardwareType::PPP => (21,),
209            &DhcpHardwareType::SoftwareLoopback => (24,),
210            &DhcpHardwareType::EON => (25,),
211            &DhcpHardwareType::Ethernet3MB => (26,),
212            &DhcpHardwareType::NSIP => (27,),
213            &DhcpHardwareType::Slip => (28,),
214            &DhcpHardwareType::ULTRALink => (29,),
215            &DhcpHardwareType::DS3 => (30,),
216            &DhcpHardwareType::SIP => (31,),
217            &DhcpHardwareType::FrameRelayInterconnect => (32,),
218            &DhcpHardwareType::AsynchronousTransmissionMode2 => (33,),
219            &DhcpHardwareType::MILSTD188220 => (34,),
220            &DhcpHardwareType::Metricom => (35,),
221            &DhcpHardwareType::IEEE1394 => (37,),
222            &DhcpHardwareType::MAPOS => (39,),
223            &DhcpHardwareType::Twinaxial => (40,),
224            &DhcpHardwareType::EUI64 => (41,),
225            &DhcpHardwareType::HIPARP => (42,),
226            &DhcpHardwareType::IPandARPoverISO7816_3 => (43,),
227            &DhcpHardwareType::ARPSec => (44,),
228            &DhcpHardwareType::IPsecTunnel => (45,),
229            &DhcpHardwareType::InfiniBand => (47,),
230            &DhcpHardwareType::TIA102Project25CommonAirInterface => (48,),
231            &DhcpHardwareType::WiegandInterface => (49,),
232            &DhcpHardwareType::PureIP => (50,),
233            &DhcpHardwareType::HWExp1 => (51,),
234            &DhcpHardwareType::HFI => (52,),
235            &DhcpHardwareType::HWExp2 => (53,),
236            &DhcpHardwareType::AEthernet => (54,),
237            &DhcpHardwareType::HWExp3 => (55,),
238            &DhcpHardwareType::IPsecTransport => (56,),
239            &DhcpHardwareType::SDLCRadio => (57,),
240            &DhcpHardwareType::SDLCMultipoint => (58,),
241            &DhcpHardwareType::IWARP => (59,),
242            &DhcpHardwareType::SixLoWPAN => (61,),
243            &DhcpHardwareType::VLAN => (62,),
244            &DhcpHardwareType::ProviderBridging => (63,),
245            &DhcpHardwareType::IEEE802154 => (64,),
246            &DhcpHardwareType::MAPOSinIPv4 => (65,),
247            &DhcpHardwareType::MAPOSinIPv6 => (66,),
248            &DhcpHardwareType::IEEE802154NonASKPHY => (70,),
249            &DhcpHardwareType::Unknown(n) => (n,),
250        }
251    }
252}
253
254/// Represents an DHCP Packet.
255#[packet]
256#[allow(non_snake_case)]
257pub struct Dhcp {
258    #[construct_with(u8)]
259    pub op: DhcpOperation,
260    #[construct_with(u8)]
261    pub htype: DhcpHardwareType,
262    pub hlen: u8,
263    pub hops: u8,
264    pub xid: u32be,
265    pub secs: u16be,
266    pub flags: u16be,
267    #[construct_with(u8, u8, u8, u8)]
268    pub ciaddr: Ipv4Addr,
269    #[construct_with(u8, u8, u8, u8)]
270    pub yiaddr: Ipv4Addr,
271    #[construct_with(u8, u8, u8, u8)]
272    pub siaddr: Ipv4Addr,
273    #[construct_with(u8, u8, u8, u8)]
274    pub giaddr: Ipv4Addr,
275    #[construct_with(u8, u8, u8, u8, u8, u8)]
276    pub chaddr: MacAddr,
277    #[length = "10"]
278    pub chaddr_pad: Vec<u8>,
279    #[length = "64"]
280    pub sname: Vec<u8>,
281    #[length = "128"]
282    pub file: Vec<u8>,
283    #[payload]
284    pub options: Vec<u8>,
285}