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