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
10pub const DHCP_MIN_PACKET_SIZE: usize = 236;
13
14#[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 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#[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 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#[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}