1+ use core:: str:: FromStr ;
12#[ cfg( feature = "async" ) ]
23use core:: task:: Waker ;
34
5+ use crate :: config:: DHCP_MAX_DOMAIN_NAME_SIZE ;
46use crate :: iface:: Context ;
57use crate :: time:: { Duration , Instant } ;
68use crate :: wire:: dhcpv4:: field as dhcpv4_field;
@@ -9,7 +11,7 @@ use crate::wire::{
911 UdpRepr , DHCP_CLIENT_PORT , DHCP_MAX_DNS_SERVER_COUNT , DHCP_SERVER_PORT , UDP_HEADER_LEN ,
1012} ;
1113use crate :: wire:: { DhcpOption , HardwareAddress } ;
12- use heapless:: Vec ;
14+ use heapless:: { String , Vec } ;
1315
1416#[ cfg( feature = "async" ) ]
1517use super :: WakerRegistration ;
@@ -22,6 +24,7 @@ const DEFAULT_PARAMETER_REQUEST_LIST: &[u8] = &[
2224 dhcpv4_field:: OPT_SUBNET_MASK ,
2325 dhcpv4_field:: OPT_ROUTER ,
2426 dhcpv4_field:: OPT_DOMAIN_NAME_SERVER ,
27+ dhcpv4_field:: OPT_DOMAIN_NAME ,
2528] ;
2629
2730/// IPv4 configuration data provided by the DHCP server.
@@ -38,6 +41,8 @@ pub struct Config<'a> {
3841 pub router : Option < Ipv4Address > ,
3942 /// DNS servers
4043 pub dns_servers : Vec < Ipv4Address , DHCP_MAX_DNS_SERVER_COUNT > ,
44+ /// Domain name
45+ pub domain_name : Option < String < DHCP_MAX_DOMAIN_NAME_SIZE > > ,
4146 /// Received DHCP packet
4247 pub packet : Option < DhcpPacket < & ' a [ u8 ] > > ,
4348}
@@ -494,6 +499,10 @@ impl<'a> Socket<'a> {
494499 address : Ipv4Cidr :: new ( dhcp_repr. your_ip , prefix_len) ,
495500 router : dhcp_repr. router ,
496501 dns_servers,
502+ domain_name : dhcp_repr
503+ . domain_name
504+ . map ( String :: from_str)
505+ . and_then ( Result :: ok) ,
497506 packet : None ,
498507 } ;
499508
@@ -589,6 +598,7 @@ impl<'a> Socket<'a> {
589598 renew_duration : None ,
590599 rebind_duration : None ,
591600 dns_servers : None ,
601+ domain_name : None ,
592602 additional_options : self . outgoing_options ,
593603 } ;
594604
@@ -739,6 +749,7 @@ impl<'a> Socket<'a> {
739749 address : state. config . address ,
740750 router : state. config . router ,
741751 dns_servers : state. config . dns_servers . clone ( ) ,
752+ domain_name : state. config . domain_name . clone ( ) ,
742753 packet : self
743754 . receive_packet_buffer
744755 . as_deref ( )
@@ -779,6 +790,7 @@ impl<'a> Socket<'a> {
779790#[ cfg( test) ]
780791mod test {
781792
793+ use core:: str:: FromStr ;
782794 use std:: ops:: { Deref , DerefMut } ;
783795
784796 use super :: * ;
@@ -886,6 +898,7 @@ mod test {
886898 const DNS_IP_2 : Ipv4Address = Ipv4Address ( [ 1 , 1 , 1 , 2 ] ) ;
887899 const DNS_IP_3 : Ipv4Address = Ipv4Address ( [ 1 , 1 , 1 , 3 ] ) ;
888900 const DNS_IPS : & [ Ipv4Address ] = & [ DNS_IP_1 , DNS_IP_2 , DNS_IP_3 ] ;
901+ const DOMAIN_NAME : & str = "my.domain" ;
889902
890903 const MASK_24 : Ipv4Address = Ipv4Address ( [ 255 , 255 , 255 , 0 ] ) ;
891904
@@ -969,6 +982,7 @@ mod test {
969982 server_identifier : None ,
970983 parameter_request_list : None ,
971984 dns_servers : None ,
985+ domain_name : None ,
972986 max_size : None ,
973987 renew_duration : None ,
974988 rebind_duration : None ,
@@ -979,7 +993,7 @@ mod test {
979993 const DHCP_DISCOVER : DhcpRepr = DhcpRepr {
980994 message_type : DhcpMessageType :: Discover ,
981995 client_identifier : Some ( MY_MAC ) ,
982- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
996+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
983997 max_size : Some ( 1432 ) ,
984998 ..DHCP_DEFAULT
985999 } ;
@@ -994,6 +1008,7 @@ mod test {
9941008 router : Some ( SERVER_IP ) ,
9951009 subnet_mask : Some ( MASK_24 ) ,
9961010 dns_servers : Some ( Vec :: from_slice ( DNS_IPS ) . unwrap ( ) ) ,
1011+ domain_name : Some ( DOMAIN_NAME ) ,
9971012 lease_duration : Some ( 1000 ) ,
9981013
9991014 ..DHCP_DEFAULT
@@ -1007,7 +1022,7 @@ mod test {
10071022 max_size : Some ( 1432 ) ,
10081023
10091024 requested_ip : Some ( MY_IP ) ,
1010- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
1025+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
10111026 ..DHCP_DEFAULT
10121027 } ;
10131028
@@ -1021,6 +1036,7 @@ mod test {
10211036 router : Some ( SERVER_IP ) ,
10221037 subnet_mask : Some ( MASK_24 ) ,
10231038 dns_servers : Some ( Vec :: from_slice ( DNS_IPS ) . unwrap ( ) ) ,
1039+ domain_name : Some ( DOMAIN_NAME ) ,
10241040 lease_duration : Some ( 1000 ) ,
10251041
10261042 ..DHCP_DEFAULT
@@ -1042,7 +1058,7 @@ mod test {
10421058 max_size : Some ( 1432 ) ,
10431059
10441060 requested_ip : None ,
1045- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
1061+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
10461062 ..DHCP_DEFAULT
10471063 } ;
10481064
@@ -1054,7 +1070,7 @@ mod test {
10541070 max_size : Some ( 1432 ) ,
10551071
10561072 requested_ip : None ,
1057- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
1073+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
10581074 ..DHCP_DEFAULT
10591075 } ;
10601076
@@ -1097,6 +1113,7 @@ mod test {
10971113 } ,
10981114 address : Ipv4Cidr :: new ( MY_IP , 24 ) ,
10991115 dns_servers : Vec :: from_slice ( DNS_IPS ) . unwrap ( ) ,
1116+ domain_name : Some ( String :: from_str ( DOMAIN_NAME ) . unwrap ( ) ) ,
11001117 router : Some ( SERVER_IP ) ,
11011118 packet : None ,
11021119 } ,
@@ -1132,6 +1149,7 @@ mod test {
11321149 } ,
11331150 address: Ipv4Cidr :: new( MY_IP , 24 ) ,
11341151 dns_servers: Vec :: from_slice( DNS_IPS ) . unwrap( ) ,
1152+ domain_name: Some ( String :: from_str( DOMAIN_NAME ) . unwrap( ) ) ,
11351153 router: Some ( SERVER_IP ) ,
11361154 packet: None ,
11371155 } ) )
@@ -1170,6 +1188,7 @@ mod test {
11701188 } ,
11711189 address: Ipv4Cidr :: new( MY_IP , 24 ) ,
11721190 dns_servers: Vec :: from_slice( DNS_IPS ) . unwrap( ) ,
1191+ domain_name: Some ( String :: from_str( DOMAIN_NAME ) . unwrap( ) ) ,
11731192 router: Some ( SERVER_IP ) ,
11741193 packet: None ,
11751194 } ) )
0 commit comments