@@ -2,7 +2,7 @@ use std::net::Ipv4Addr;
2
2
3
3
use crate :: types:: {
4
4
options:: { ClientIdentifier , DhcpMessageType , ParameterRequestList } ,
5
- DhcpOption , HardwareAddr , Header , Message , MessageError , OptionData , OptionTag ,
5
+ DhcpOption , HardwareAddr , Message , MessageError , OptionData , OptionTag ,
6
6
} ;
7
7
8
8
pub struct MessageBuilder {
@@ -24,9 +24,9 @@ impl MessageBuilder {
24
24
}
25
25
}
26
26
27
- // This creates a new DHCPDISCOVER message with the values described in
28
- /// RFC 2131 Section 4.4.1
29
- pub fn discover_message (
27
+ /// This creates a new DHCPDISCOVER message with the values described in
28
+ /// RFC 2131 Section 4.
29
+ pub fn make_discover_message (
30
30
& mut self ,
31
31
xid : u32 ,
32
32
destination_addr : Option < Ipv4Addr > ,
@@ -94,6 +94,48 @@ impl MessageBuilder {
94
94
Ok ( message)
95
95
}
96
96
97
+ /// This creates a new DHCPREQUEST message with the values described in
98
+ /// RFC 2131 Section 4.
99
+ pub fn make_request_message (
100
+ & self ,
101
+ xid : u32 ,
102
+ destination_addr : Ipv4Addr ,
103
+ offered_addr : Ipv4Addr ,
104
+ offered_lease_time : u32 ,
105
+ ) -> Result < Message , MessageError > {
106
+ let mut message = Message :: new_with_xid ( xid) ;
107
+ self . add_default_options ( & mut message) ?;
108
+
109
+ // Set DHCP message type option
110
+ message. add_option_parts (
111
+ OptionTag :: DhcpMessageType ,
112
+ OptionData :: DhcpMessageType ( DhcpMessageType :: Request ) ,
113
+ ) ?;
114
+
115
+ message. add_option_parts (
116
+ OptionTag :: ServerIdentifier ,
117
+ OptionData :: ServerIdentifier ( destination_addr) ,
118
+ ) ?;
119
+
120
+ message. add_option_parts (
121
+ OptionTag :: RequestedIpAddr ,
122
+ OptionData :: RequestedIpAddr ( offered_addr) ,
123
+ ) ?;
124
+
125
+ message. add_option_parts (
126
+ OptionTag :: IpAddrLeaseTime ,
127
+ OptionData :: IpAddrLeaseTime ( offered_lease_time) ,
128
+ ) ?;
129
+
130
+ // NOTE (Techassi): Maybe add hostname option
131
+
132
+ message. add_option ( Self :: default_request_parameter_list ( ) ) ?;
133
+ message. end ( ) ?;
134
+
135
+ message. set_hardware_address ( self . client_hardware_addr . clone ( ) ) ;
136
+ Ok ( message)
137
+ }
138
+
97
139
fn add_default_options ( & self , message : & mut Message ) -> Result < ( ) , MessageError > {
98
140
message. add_option_parts (
99
141
OptionTag :: MaxDhcpMessageSize ,
0 commit comments