Skip to content

Commit e4a6d20

Browse files
committed
Make domain name length settable, use reference in DhcpRepr
1 parent cf5b0a7 commit e4a6d20

File tree

6 files changed

+22
-16
lines changed

6 files changed

+22
-16
lines changed

Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ dns-max-name-size-64 = []
249249
dns-max-name-size-128 = []
250250
dns-max-name-size-255 = [] # Default
251251

252+
dhcp-max-domain-name-size-32 = []
253+
dhcp-max-domain-name-size-64 = [] # Default
254+
dhcp-max-domain-name-size-128 = []
255+
252256
rpl-relations-buffer-count-1 = []
253257
rpl-relations-buffer-count-2 = []
254258
rpl-relations-buffer-count-4 = []

build.rs

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ static CONFIGS: &[(&str, usize)] = &[
1919
("DNS_MAX_RESULT_COUNT", 1),
2020
("DNS_MAX_SERVER_COUNT", 1),
2121
("DNS_MAX_NAME_SIZE", 255),
22+
("DHCP_MAX_DOMAIN_NAME_SIZE", 64),
2223
("RPL_RELATIONS_BUFFER_COUNT", 16),
2324
("RPL_PARENTS_BUFFER_COUNT", 8),
2425
// END AUTOGENERATED CONFIG FEATURES

gen_config.py

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def feature(name, default, min, max, pow2=None):
4040
feature("dns_max_result_count", default=1, min=1, max=32, pow2=4)
4141
feature("dns_max_server_count", default=1, min=1, max=32, pow2=4)
4242
feature("dns_max_name_size", default=255, min=64, max=255, pow2=True)
43+
feature("dhcp_max_domain_name_size", default=64, min=32, max=255, pow2=True)
4344
feature("rpl_relations_buffer_count", default=16, min=1, max=128, pow2=True)
4445
feature("rpl_parents_buffer_count", default=8, min=2, max=32, pow2=True)
4546

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ pub mod config {
136136
pub const DNS_MAX_NAME_SIZE: usize = 255;
137137
pub const DNS_MAX_RESULT_COUNT: usize = 1;
138138
pub const DNS_MAX_SERVER_COUNT: usize = 1;
139+
pub const DHCP_MAX_DOMAIN_NAME_SIZE: usize = 64;
139140
pub const FRAGMENTATION_BUFFER_SIZE: usize = 1500;
140141
pub const IFACE_MAX_ADDR_COUNT: usize = 8;
141142
pub const IFACE_MAX_MULTICAST_GROUP_COUNT: usize = 4;

src/socket/dhcpv4.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
use core::str::FromStr;
12
#[cfg(feature = "async")]
23
use core::task::Waker;
34

5+
use crate::config::DHCP_MAX_DOMAIN_NAME_SIZE;
46
use crate::iface::Context;
57
use crate::time::{Duration, Instant};
68
use crate::wire::dhcpv4::field as dhcpv4_field;
79
use crate::wire::{
810
DhcpMessageType, DhcpPacket, DhcpRepr, IpAddress, IpProtocol, Ipv4Address, Ipv4Cidr, Ipv4Repr,
9-
UdpRepr, DHCP_CLIENT_PORT, DHCP_MAX_DNS_SERVER_COUNT, DHCP_MAX_DOMAIN_NAME_LEN,
10-
DHCP_SERVER_PORT, UDP_HEADER_LEN,
11+
UdpRepr, DHCP_CLIENT_PORT, DHCP_MAX_DNS_SERVER_COUNT, DHCP_SERVER_PORT, UDP_HEADER_LEN,
1112
};
1213
use crate::wire::{DhcpOption, HardwareAddress};
1314
use heapless::{String, Vec};
@@ -41,7 +42,7 @@ pub struct Config<'a> {
4142
/// DNS servers
4243
pub dns_servers: Vec<Ipv4Address, DHCP_MAX_DNS_SERVER_COUNT>,
4344
/// Domain name
44-
pub domain_name: Option<String<DHCP_MAX_DOMAIN_NAME_LEN>>,
45+
pub domain_name: Option<String<DHCP_MAX_DOMAIN_NAME_SIZE>>,
4546
/// Received DHCP packet
4647
pub packet: Option<DhcpPacket<&'a [u8]>>,
4748
}
@@ -498,7 +499,10 @@ impl<'a> Socket<'a> {
498499
address: Ipv4Cidr::new(dhcp_repr.your_ip, prefix_len),
499500
router: dhcp_repr.router,
500501
dns_servers,
501-
domain_name: dhcp_repr.domain_name.clone(),
502+
domain_name: dhcp_repr
503+
.domain_name
504+
.map(String::from_str)
505+
.and_then(Result::ok),
502506
packet: None,
503507
};
504508

@@ -1004,7 +1008,7 @@ mod test {
10041008
router: Some(SERVER_IP),
10051009
subnet_mask: Some(MASK_24),
10061010
dns_servers: Some(Vec::from_slice(DNS_IPS).unwrap()),
1007-
domain_name: Some(String::from_str(DOMAIN_NAME).unwrap()),
1011+
domain_name: Some(DOMAIN_NAME),
10081012
lease_duration: Some(1000),
10091013

10101014
..DHCP_DEFAULT
@@ -1032,7 +1036,7 @@ mod test {
10321036
router: Some(SERVER_IP),
10331037
subnet_mask: Some(MASK_24),
10341038
dns_servers: Some(Vec::from_slice(DNS_IPS).unwrap()),
1035-
domain_name: Some(String::from_str(DOMAIN_NAME).unwrap()),
1039+
domain_name: Some(DOMAIN_NAME),
10361040
lease_duration: Some(1000),
10371041

10381042
..DHCP_DEFAULT

src/wire/dhcpv4.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use bitflags::bitflags;
44
use byteorder::{ByteOrder, NetworkEndian};
55
use core::iter;
6-
use heapless::{String, Vec};
6+
use heapless::Vec;
77

88
use super::{Error, Result};
99
use crate::wire::arp::Hardware;
@@ -649,7 +649,7 @@ pub struct Repr<'a> {
649649
/// DNS servers
650650
pub dns_servers: Option<Vec<Ipv4Address, MAX_DNS_SERVER_COUNT>>,
651651
/// Domain name
652-
pub domain_name: Option<String<MAX_DOMAIN_NAME_LEN>>,
652+
pub domain_name: Option<&'a str>,
653653
/// The maximum size dhcp packet the interface can receive
654654
pub max_size: Option<u16>,
655655
/// The DHCP IP lease duration, specified in seconds.
@@ -697,7 +697,7 @@ impl<'a> Repr<'a> {
697697
}
698698
if let Some(domain_name) = &self.domain_name {
699699
len += 2;
700-
len += domain_name.len();
700+
len += domain_name.as_bytes().len();
701701
}
702702
if let Some(list) = self.parameter_request_list {
703703
len += list.len() + 2;
@@ -811,13 +811,8 @@ impl<'a> Repr<'a> {
811811
}
812812
}
813813
(field::OPT_DOMAIN_NAME, _) => {
814-
let mut name = String::new();
815-
816-
if let Ok(n) = core::str::from_utf8(data) {
817-
if data.len() <= MAX_DOMAIN_NAME_LEN {
818-
name.push_str(n).ok();
819-
domain_name = Some(name);
820-
}
814+
if let Ok(name) = core::str::from_utf8(data) {
815+
domain_name = Some(name);
821816
}
822817
}
823818
_ => {}

0 commit comments

Comments
 (0)