From 35bfdcbcf85333a1755aa59e38a42e59cc21681e Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Sat, 17 Aug 2024 10:02:43 +0200 Subject: [PATCH] Make DHCP option 15 optional --- Cargo.toml | 3 ++- src/socket/dhcpv4.rs | 6 ++++++ src/wire/dhcpv4.rs | 12 +++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b6868342f..9db413e0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,6 +60,7 @@ defmt = ["dep:defmt", "heapless/defmt-03"] "proto-sixlowpan" = ["proto-ipv6"] "proto-sixlowpan-fragmentation" = ["proto-sixlowpan", "_proto-fragmentation"] "proto-dns" = [] +"proto-domainname" = [] "proto-ipsec" = ["proto-ipsec-ah", "proto-ipsec-esp"] "proto-ipsec-ah" = [] "proto-ipsec-esp" = [] @@ -96,7 +97,7 @@ default = [ "std", "log", # needed for `cargo test --no-default-features --features default` :/ "medium-ethernet", "medium-ip", "medium-ieee802154", "phy-raw_socket", "phy-tuntap_interface", - "proto-ipv4", "proto-igmp", "proto-dhcpv4", "proto-ipv6", "proto-dns", + "proto-ipv4", "proto-igmp", "proto-dhcpv4", "proto-ipv6", "proto-dns", "proto-domainname", "proto-ipv4-fragmentation", "proto-sixlowpan-fragmentation", "socket-raw", "socket-icmp", "socket-udp", "socket-tcp", "socket-dhcpv4", "socket-dns", "socket-mdns", "packetmeta-id", "async" diff --git a/src/socket/dhcpv4.rs b/src/socket/dhcpv4.rs index fda4c5783..a92ad21ae 100644 --- a/src/socket/dhcpv4.rs +++ b/src/socket/dhcpv4.rs @@ -2,6 +2,7 @@ use core::str::FromStr; #[cfg(feature = "async")] use core::task::Waker; +#[cfg(feature = "proto-domainname")] use crate::config::DHCP_MAX_DOMAIN_NAME_SIZE; use crate::iface::Context; use crate::time::{Duration, Instant}; @@ -24,6 +25,7 @@ const DEFAULT_PARAMETER_REQUEST_LIST: &[u8] = &[ dhcpv4_field::OPT_SUBNET_MASK, dhcpv4_field::OPT_ROUTER, dhcpv4_field::OPT_DOMAIN_NAME_SERVER, + #[cfg(feature = "proto-domainname")] dhcpv4_field::OPT_DOMAIN_NAME, ]; @@ -42,6 +44,7 @@ pub struct Config<'a> { /// DNS servers pub dns_servers: Vec, /// Domain name + #[cfg(feature = "proto-domainname")] pub domain_name: Option>, /// Received DHCP packet pub packet: Option>, @@ -499,6 +502,7 @@ impl<'a> Socket<'a> { address: Ipv4Cidr::new(dhcp_repr.your_ip, prefix_len), router: dhcp_repr.router, dns_servers, + #[cfg(feature = "proto-domainname")] domain_name: dhcp_repr .domain_name .map(String::from_str) @@ -598,6 +602,7 @@ impl<'a> Socket<'a> { renew_duration: None, rebind_duration: None, dns_servers: None, + #[cfg(feature = "proto-domainname")] domain_name: None, additional_options: self.outgoing_options, }; @@ -749,6 +754,7 @@ impl<'a> Socket<'a> { address: state.config.address, router: state.config.router, dns_servers: state.config.dns_servers.clone(), + #[cfg(feature = "proto-domainname")] domain_name: state.config.domain_name.clone(), packet: self .receive_packet_buffer diff --git a/src/wire/dhcpv4.rs b/src/wire/dhcpv4.rs index 58fb30074..377ac1cbe 100644 --- a/src/wire/dhcpv4.rs +++ b/src/wire/dhcpv4.rs @@ -648,6 +648,7 @@ pub struct Repr<'a> { /// DNS servers pub dns_servers: Option>, /// Domain name + #[cfg(feature = "proto-domainname")] pub domain_name: Option<&'a str>, /// The maximum size dhcp packet the interface can receive pub max_size: Option, @@ -694,6 +695,7 @@ impl<'a> Repr<'a> { len += 2; len += dns_servers.iter().count() * core::mem::size_of::(); } + #[cfg(feature = "proto-domainname")] if let Some(domain_name) = &self.domain_name { len += 2; len += domain_name.as_bytes().len(); @@ -744,6 +746,7 @@ impl<'a> Repr<'a> { let mut subnet_mask = None; let mut parameter_request_list = None; let mut dns_servers = None; + #[cfg(feature = "proto-domainname")] let mut domain_name = None; let mut max_size = None; let mut lease_duration = None; @@ -809,10 +812,9 @@ impl<'a> Repr<'a> { net_trace!("DHCP domain name servers contained invalid address"); } } + #[cfg(feature = "proto-domainname")] (field::OPT_DOMAIN_NAME, _) => { - if let Ok(name) = core::str::from_utf8(data) { - domain_name = Some(name); - } + domain_name = core::str::from_utf8(data).ok(); } _ => {} } @@ -836,6 +838,7 @@ impl<'a> Repr<'a> { client_identifier, parameter_request_list, dns_servers, + #[cfg(feature = "proto-domainname")] domain_name, max_size, lease_duration, @@ -953,6 +956,7 @@ impl<'a> Repr<'a> { })?; } + #[cfg(feature = "proto-domainname")] if let Some(domain_name) = &self.domain_name { options.emit(DhcpOption { kind: field::OPT_DOMAIN_NAME, @@ -1187,6 +1191,7 @@ mod test { server_identifier: None, parameter_request_list: None, dns_servers: None, + #[cfg(feature = "proto-domainname")] domain_name: None, max_size: None, renew_duration: None, @@ -1218,6 +1223,7 @@ mod test { server_identifier: None, parameter_request_list: Some(&[1, 3, 6, 42]), dns_servers: None, + #[cfg(feature = "proto-domainname")] domain_name: None, additional_options: &[], }