@@ -33,7 +33,7 @@ use embassy_net_driver::{Driver, LinkState};
33
33
use embassy_sync:: waitqueue:: WakerRegistration ;
34
34
use embassy_time:: { Instant , Timer } ;
35
35
#[ allow( unused_imports) ]
36
- use heapless:: Vec ;
36
+ use heapless:: { String , Vec } ;
37
37
#[ cfg( feature = "dns" ) ]
38
38
pub use smoltcp:: config:: DNS_MAX_SERVER_COUNT ;
39
39
#[ cfg( feature = "igmp" ) ]
@@ -66,6 +66,8 @@ const LOCAL_PORT_MAX: u16 = 65535;
66
66
const MAX_QUERIES : usize = 4 ;
67
67
#[ cfg( feature = "dhcpv4-hostname" ) ]
68
68
const MAX_HOSTNAME_LEN : usize = 32 ;
69
+ #[ cfg( all( feature = "dhcpv4-domainname" , feature = "dns" ) ) ]
70
+ const MAX_DNS_QUERY_LEN : usize = 128 ;
69
71
70
72
/// Memory resources needed for a network stack.
71
73
pub struct StackResources < const SOCK : usize > {
@@ -110,6 +112,9 @@ pub struct StaticConfigV4 {
110
112
pub gateway : Option < Ipv4Address > ,
111
113
/// DNS servers.
112
114
pub dns_servers : Vec < Ipv4Address , 3 > ,
115
+ /// Domain name.
116
+ #[ cfg( feature = "dhcpv4-domainname" ) ]
117
+ pub domain_name : Option < String < { smoltcp:: config:: DHCP_MAX_DOMAIN_NAME_SIZE } > > ,
113
118
}
114
119
115
120
/// Static IPv6 address configuration
@@ -146,7 +151,7 @@ pub struct DhcpConfig {
146
151
pub client_port : u16 ,
147
152
/// Our hostname. This will be sent to the DHCP server as Option 12.
148
153
#[ cfg( feature = "dhcpv4-hostname" ) ]
149
- pub hostname : Option < heapless :: String < MAX_HOSTNAME_LEN > > ,
154
+ pub hostname : Option < String < MAX_HOSTNAME_LEN > > ,
150
155
}
151
156
152
157
#[ cfg( feature = "dhcpv4" ) ]
@@ -527,6 +532,15 @@ impl<D: Driver> Stack<D> {
527
532
_ => { }
528
533
}
529
534
535
+ #[ cfg( feature = "dhcpv4-domainname" ) ]
536
+ let name = if name. contains ( "." ) {
537
+ // Already a FQDN.
538
+ name
539
+ } else {
540
+ & self . create_fqdn ( name) ?
541
+ } ;
542
+ debug ! ( "Performing DNS lookup of: {}" , name) ;
543
+
530
544
let query = poll_fn ( |cx| {
531
545
self . with_mut ( |s, i| {
532
546
let socket = s. sockets . get_mut :: < dns:: Socket > ( i. dns_socket ) ;
@@ -602,6 +616,23 @@ impl<D: Driver> Stack<D> {
602
616
603
617
res
604
618
}
619
+
620
+ #[ cfg( feature = "dhcpv4-domainname" ) ]
621
+ fn create_fqdn ( & self , name : & str ) -> Result < String < MAX_DNS_QUERY_LEN > , dns:: Error > {
622
+ use core:: str:: FromStr ;
623
+
624
+ // Form name together with domain name.
625
+ let mut name = String :: < MAX_DNS_QUERY_LEN > :: from_str ( name) . map_err ( |_| dns:: Error :: NameTooLong ) ?;
626
+
627
+ if let Some ( Some ( domain_name) ) = & self . inner . borrow ( ) . static_v4 . as_ref ( ) . map ( |c| & c. domain_name ) {
628
+ if !domain_name. is_empty ( ) {
629
+ name. push ( '.' ) . map_err ( |_| dns:: Error :: NameTooLong ) ?;
630
+ name. push_str ( & domain_name) . map_err ( |_| dns:: Error :: NameTooLong ) ?;
631
+ }
632
+ }
633
+
634
+ Ok ( name)
635
+ }
605
636
}
606
637
607
638
#[ cfg( feature = "igmp" ) ]
@@ -788,6 +819,8 @@ impl<D: Driver> Inner<D> {
788
819
debug ! ( " DNS server: {:?}" , s) ;
789
820
unwrap ! ( dns_servers. push( s. clone( ) . into( ) ) . ok( ) ) ;
790
821
}
822
+ #[ cfg( feature = "dhcpv4-domainname" ) ]
823
+ debug ! ( " Domain name: {:?}" , config. domain_name) ;
791
824
} else {
792
825
info ! ( "IPv4: DOWN" ) ;
793
826
}
@@ -902,6 +935,8 @@ impl<D: Driver> Inner<D> {
902
935
address : config. address ,
903
936
gateway : config. router ,
904
937
dns_servers : config. dns_servers ,
938
+ #[ cfg( feature = "dhcpv4-domainname" ) ]
939
+ domain_name : config. domain_name ,
905
940
} ) ;
906
941
apply_config = true ;
907
942
}
0 commit comments