xenet_packet/
dhcp.rs

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/// Represents an DHCP operation.
11#[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    /// Constructs a new DhcpOperation from u8.
21    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/// Represents the Dhcp hardware types.
42#[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    /// Constructs a new DhcpHardwareType from u8
112    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/// Represents an DHCP Packet.
251#[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}