1use crate::datalink::MacAddr;
2use std::net::Ipv4Addr;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub enum DhcpOperation {
7 Request = 1,
8 Reply = 2,
9}
10
11impl DhcpOperation {
12 pub fn from_u8(n: u8) -> Option<DhcpOperation> {
14 match n {
15 1 => Some(DhcpOperation::Request),
16 2 => Some(DhcpOperation::Reply),
17 _ => None,
18 }
19 }
20}
21
22#[allow(non_snake_case)]
24#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
25pub enum DhcpHardwareType {
26 Ethernet = 1,
27 ExperimentalEthernet = 2,
28 AmateurRadioAX25 = 3,
29 ProteonProNETTokenRing = 4,
30 Chaos = 5,
31 IEEE802Networks = 6,
32 ARCNET = 7,
33 Hyperchannel = 8,
34 Lanstar = 9,
35 AutonetShortAddress = 10,
36 LocalTalk = 11,
37 LocalNet = 12,
38 UltraLink = 13,
39 SMDS = 14,
40 FrameRelay = 15,
41 AsynchronousTransmissionMode = 16,
42 HDLC = 17,
43 FibreChannel = 18,
44 AsynchronousTransmissionMode1 = 19,
45 PropPointToPointSerial = 20,
46 PPP = 21,
47 SoftwareLoopback = 24,
48 EON = 25,
49 Ethernet3MB = 26,
50 NSIP = 27,
51 Slip = 28,
52 ULTRALink = 29,
53 DS3 = 30,
54 SIP = 31,
55 FrameRelayInterconnect = 32,
56 AsynchronousTransmissionMode2 = 33,
57 MILSTD188220 = 34,
58 Metricom = 35,
59 IEEE1394 = 37,
60 MAPOS = 39,
61 Twinaxial = 40,
62 EUI64 = 41,
63 HIPARP = 42,
64 IPandARPoverISO7816_3 = 43,
65 ARPSec = 44,
66 IPsecTunnel = 45,
67 InfiniBand = 47,
68 TIA102Project25CommonAirInterface = 48,
69 WiegandInterface = 49,
70 PureIP = 50,
71 HWExp1 = 51,
72 HFI = 52,
73 HWExp2 = 53,
74 AEthernet = 54,
75 HWExp3 = 55,
76 IPsecTransport = 56,
77 SDLCRadio = 57,
78 SDLCMultipoint = 58,
79 IWARP = 59,
80 SixLoWPAN = 61,
81 VLAN = 62,
82 ProviderBridging = 63,
83 IEEE802154 = 64,
84 MAPOSinIPv4 = 65,
85 MAPOSinIPv6 = 66,
86 IEEE802154NonASKPHY = 70,
87}
88
89impl DhcpHardwareType {
90 pub fn from_u8(n: u8) -> Option<DhcpHardwareType> {
92 match n {
93 1 => Some(DhcpHardwareType::Ethernet),
94 2 => Some(DhcpHardwareType::ExperimentalEthernet),
95 3 => Some(DhcpHardwareType::AmateurRadioAX25),
96 4 => Some(DhcpHardwareType::ProteonProNETTokenRing),
97 5 => Some(DhcpHardwareType::Chaos),
98 6 => Some(DhcpHardwareType::IEEE802Networks),
99 7 => Some(DhcpHardwareType::ARCNET),
100 8 => Some(DhcpHardwareType::Hyperchannel),
101 9 => Some(DhcpHardwareType::Lanstar),
102 10 => Some(DhcpHardwareType::AutonetShortAddress),
103 11 => Some(DhcpHardwareType::LocalTalk),
104 12 => Some(DhcpHardwareType::LocalNet),
105 13 => Some(DhcpHardwareType::UltraLink),
106 14 => Some(DhcpHardwareType::SMDS),
107 15 => Some(DhcpHardwareType::FrameRelay),
108 16 => Some(DhcpHardwareType::AsynchronousTransmissionMode),
109 17 => Some(DhcpHardwareType::HDLC),
110 18 => Some(DhcpHardwareType::FibreChannel),
111 19 => Some(DhcpHardwareType::AsynchronousTransmissionMode1),
112 20 => Some(DhcpHardwareType::PropPointToPointSerial),
113 21 => Some(DhcpHardwareType::PPP),
114 24 => Some(DhcpHardwareType::SoftwareLoopback),
115 25 => Some(DhcpHardwareType::EON),
116 26 => Some(DhcpHardwareType::Ethernet3MB),
117 27 => Some(DhcpHardwareType::NSIP),
118 28 => Some(DhcpHardwareType::Slip),
119 29 => Some(DhcpHardwareType::ULTRALink),
120 30 => Some(DhcpHardwareType::DS3),
121 31 => Some(DhcpHardwareType::SIP),
122 32 => Some(DhcpHardwareType::FrameRelayInterconnect),
123 33 => Some(DhcpHardwareType::AsynchronousTransmissionMode2),
124 34 => Some(DhcpHardwareType::MILSTD188220),
125 35 => Some(DhcpHardwareType::Metricom),
126 37 => Some(DhcpHardwareType::IEEE1394),
127 39 => Some(DhcpHardwareType::MAPOS),
128 40 => Some(DhcpHardwareType::Twinaxial),
129 41 => Some(DhcpHardwareType::EUI64),
130 42 => Some(DhcpHardwareType::HIPARP),
131 43 => Some(DhcpHardwareType::IPandARPoverISO7816_3),
132 44 => Some(DhcpHardwareType::ARPSec),
133 45 => Some(DhcpHardwareType::IPsecTunnel),
134 47 => Some(DhcpHardwareType::InfiniBand),
135 48 => Some(DhcpHardwareType::TIA102Project25CommonAirInterface),
136 49 => Some(DhcpHardwareType::WiegandInterface),
137 50 => Some(DhcpHardwareType::PureIP),
138 51 => Some(DhcpHardwareType::HWExp1),
139 52 => Some(DhcpHardwareType::HFI),
140 53 => Some(DhcpHardwareType::HWExp2),
141 54 => Some(DhcpHardwareType::AEthernet),
142 55 => Some(DhcpHardwareType::HWExp3),
143 56 => Some(DhcpHardwareType::IPsecTransport),
144 57 => Some(DhcpHardwareType::SDLCRadio),
145 58 => Some(DhcpHardwareType::SDLCMultipoint),
146 59 => Some(DhcpHardwareType::IWARP),
147 61 => Some(DhcpHardwareType::SixLoWPAN),
148 62 => Some(DhcpHardwareType::VLAN),
149 63 => Some(DhcpHardwareType::ProviderBridging),
150 64 => Some(DhcpHardwareType::IEEE802154),
151 65 => Some(DhcpHardwareType::MAPOSinIPv4),
152 66 => Some(DhcpHardwareType::MAPOSinIPv6),
153 70 => Some(DhcpHardwareType::IEEE802154NonASKPHY),
154 _ => None,
155 }
156 }
157}
158
159#[derive(Clone, Debug)]
161pub struct DhcpPacket {
162 pub op: DhcpOperation,
163 pub htype: DhcpHardwareType,
164 pub hlen: u8,
165 pub hops: u8,
166 pub xid: u32,
167 pub secs: u16,
168 pub flags: u16,
169 pub ciaddr: Ipv4Addr,
170 pub yiaddr: Ipv4Addr,
171 pub siaddr: Ipv4Addr,
172 pub giaddr: Ipv4Addr,
173 pub chaddr: MacAddr,
174 pub chaddr_pad: Vec<u8>,
175 pub sname: Vec<u8>,
176 pub file: Vec<u8>,
177 pub options: Vec<u8>,
178}