cross_socket/packet/
dhcp.rs

1use crate::datalink::MacAddr;
2use std::net::Ipv4Addr;
3
4/// Represents an DHCP operation.
5#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub enum DhcpOperation {
7    Request = 1,
8    Reply = 2,
9}
10
11impl DhcpOperation {
12    /// Constructs a new DhcpOperation from u8
13    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/// Represents the Dhcp hardware types.
23#[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    /// Constructs a new DhcpHardwareType from u8
91    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/// Represents an DHCP Packet.
160#[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}