From 7b6b70d0585d468466767054ed83a35e1dee6344 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Fri, 28 May 2021 23:11:39 +0000 Subject: [PATCH 1/2] Account for lease time, router and subnet options in DhcpRepr::buffer_len --- src/wire/dhcpv4.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/wire/dhcpv4.rs b/src/wire/dhcpv4.rs index 7ef39d9..3614937 100644 --- a/src/wire/dhcpv4.rs +++ b/src/wire/dhcpv4.rs @@ -704,6 +704,9 @@ impl<'a> Repr<'a> { if self.client_identifier.is_some() { len += 9; } if self.server_identifier.is_some() { len += 6; } if self.max_size.is_some() { len += 4; } + if self.router.is_some() { len += 6; } + if self.subnet_mask.is_some() { len += 6; } + if self.lease_duration.is_some() { len += 6; } if let Some(list) = self.parameter_request_list { len += list.len() + 2; } len @@ -1019,6 +1022,28 @@ mod test { assert_eq!(packet, DISCOVER_BYTES); } + fn offer_repr() -> Repr<'static> { + Repr { + message_type: MessageType::Offer, + transaction_id: 0x3d1d, + client_hardware_address: CLIENT_MAC, + client_ip: IP_NULL, + your_ip: IP_NULL, + server_ip: IP_NULL, + router: Some(IP_NULL), + subnet_mask: Some(IP_NULL), + relay_agent_ip: IP_NULL, + broadcast: false, + requested_ip: None, + client_identifier: Some(CLIENT_MAC), + server_identifier: None, + parameter_request_list: None, + dns_servers: None, + max_size: None, + lease_duration: Some(u32::MAX), // Infinite lease + } + } + fn discover_repr() -> Repr<'static> { Repr { message_type: MessageType::Discover, @@ -1062,6 +1087,14 @@ mod test { } } + #[test] + fn test_emit_offer() { + let repr = offer_repr(); + let mut bytes = vec![0xa5; repr.buffer_len()]; + let mut packet = Packet::new_unchecked(&mut bytes); + repr.emit(&mut packet).unwrap(); + } + #[test] fn test_emit_dhcp_option() { static DATA: &[u8] = &[1, 3, 6]; From ea8d2ae7f41aa6a7c2d3dd975fa6ac959870a513 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Sat, 29 May 2021 01:24:57 +0200 Subject: [PATCH 2/2] Fix u32::MAX --- src/wire/dhcpv4.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wire/dhcpv4.rs b/src/wire/dhcpv4.rs index 3614937..48170fb 100644 --- a/src/wire/dhcpv4.rs +++ b/src/wire/dhcpv4.rs @@ -1040,7 +1040,7 @@ mod test { parameter_request_list: None, dns_servers: None, max_size: None, - lease_duration: Some(u32::MAX), // Infinite lease + lease_duration: Some(0xffff_ffff), // Infinite lease } }