1
+ use core:: str:: FromStr ;
1
2
#[ cfg( feature = "async" ) ]
2
3
use core:: task:: Waker ;
3
4
5
+ use crate :: config:: DHCP_MAX_DOMAIN_NAME_SIZE ;
4
6
use crate :: iface:: Context ;
5
7
use crate :: time:: { Duration , Instant } ;
6
8
use crate :: wire:: dhcpv4:: field as dhcpv4_field;
@@ -9,7 +11,7 @@ use crate::wire::{
9
11
UdpRepr , DHCP_CLIENT_PORT , DHCP_MAX_DNS_SERVER_COUNT , DHCP_SERVER_PORT , UDP_HEADER_LEN ,
10
12
} ;
11
13
use crate :: wire:: { DhcpOption , HardwareAddress } ;
12
- use heapless:: Vec ;
14
+ use heapless:: { String , Vec } ;
13
15
14
16
#[ cfg( feature = "async" ) ]
15
17
use super :: WakerRegistration ;
@@ -22,6 +24,7 @@ const DEFAULT_PARAMETER_REQUEST_LIST: &[u8] = &[
22
24
dhcpv4_field:: OPT_SUBNET_MASK ,
23
25
dhcpv4_field:: OPT_ROUTER ,
24
26
dhcpv4_field:: OPT_DOMAIN_NAME_SERVER ,
27
+ dhcpv4_field:: OPT_DOMAIN_NAME ,
25
28
] ;
26
29
27
30
/// IPv4 configuration data provided by the DHCP server.
@@ -38,6 +41,8 @@ pub struct Config<'a> {
38
41
pub router : Option < Ipv4Address > ,
39
42
/// DNS servers
40
43
pub dns_servers : Vec < Ipv4Address , DHCP_MAX_DNS_SERVER_COUNT > ,
44
+ /// Domain name
45
+ pub domain_name : Option < String < DHCP_MAX_DOMAIN_NAME_SIZE > > ,
41
46
/// Received DHCP packet
42
47
pub packet : Option < DhcpPacket < & ' a [ u8 ] > > ,
43
48
}
@@ -494,6 +499,10 @@ impl<'a> Socket<'a> {
494
499
address : Ipv4Cidr :: new ( dhcp_repr. your_ip , prefix_len) ,
495
500
router : dhcp_repr. router ,
496
501
dns_servers,
502
+ domain_name : dhcp_repr
503
+ . domain_name
504
+ . map ( String :: from_str)
505
+ . and_then ( Result :: ok) ,
497
506
packet : None ,
498
507
} ;
499
508
@@ -589,6 +598,7 @@ impl<'a> Socket<'a> {
589
598
renew_duration : None ,
590
599
rebind_duration : None ,
591
600
dns_servers : None ,
601
+ domain_name : None ,
592
602
additional_options : self . outgoing_options ,
593
603
} ;
594
604
@@ -739,6 +749,7 @@ impl<'a> Socket<'a> {
739
749
address : state. config . address ,
740
750
router : state. config . router ,
741
751
dns_servers : state. config . dns_servers . clone ( ) ,
752
+ domain_name : state. config . domain_name . clone ( ) ,
742
753
packet : self
743
754
. receive_packet_buffer
744
755
. as_deref ( )
@@ -779,6 +790,7 @@ impl<'a> Socket<'a> {
779
790
#[ cfg( test) ]
780
791
mod test {
781
792
793
+ use core:: str:: FromStr ;
782
794
use std:: ops:: { Deref , DerefMut } ;
783
795
784
796
use super :: * ;
@@ -886,6 +898,7 @@ mod test {
886
898
const DNS_IP_2 : Ipv4Address = Ipv4Address ( [ 1 , 1 , 1 , 2 ] ) ;
887
899
const DNS_IP_3 : Ipv4Address = Ipv4Address ( [ 1 , 1 , 1 , 3 ] ) ;
888
900
const DNS_IPS : & [ Ipv4Address ] = & [ DNS_IP_1 , DNS_IP_2 , DNS_IP_3 ] ;
901
+ const DOMAIN_NAME : & str = "my.domain" ;
889
902
890
903
const MASK_24 : Ipv4Address = Ipv4Address ( [ 255 , 255 , 255 , 0 ] ) ;
891
904
@@ -969,6 +982,7 @@ mod test {
969
982
server_identifier : None ,
970
983
parameter_request_list : None ,
971
984
dns_servers : None ,
985
+ domain_name : None ,
972
986
max_size : None ,
973
987
renew_duration : None ,
974
988
rebind_duration : None ,
@@ -979,7 +993,7 @@ mod test {
979
993
const DHCP_DISCOVER : DhcpRepr = DhcpRepr {
980
994
message_type : DhcpMessageType :: Discover ,
981
995
client_identifier : Some ( MY_MAC ) ,
982
- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
996
+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
983
997
max_size : Some ( 1432 ) ,
984
998
..DHCP_DEFAULT
985
999
} ;
@@ -994,6 +1008,7 @@ mod test {
994
1008
router : Some ( SERVER_IP ) ,
995
1009
subnet_mask : Some ( MASK_24 ) ,
996
1010
dns_servers : Some ( Vec :: from_slice ( DNS_IPS ) . unwrap ( ) ) ,
1011
+ domain_name : Some ( DOMAIN_NAME ) ,
997
1012
lease_duration : Some ( 1000 ) ,
998
1013
999
1014
..DHCP_DEFAULT
@@ -1007,7 +1022,7 @@ mod test {
1007
1022
max_size : Some ( 1432 ) ,
1008
1023
1009
1024
requested_ip : Some ( MY_IP ) ,
1010
- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
1025
+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
1011
1026
..DHCP_DEFAULT
1012
1027
} ;
1013
1028
@@ -1021,6 +1036,7 @@ mod test {
1021
1036
router : Some ( SERVER_IP ) ,
1022
1037
subnet_mask : Some ( MASK_24 ) ,
1023
1038
dns_servers : Some ( Vec :: from_slice ( DNS_IPS ) . unwrap ( ) ) ,
1039
+ domain_name : Some ( DOMAIN_NAME ) ,
1024
1040
lease_duration : Some ( 1000 ) ,
1025
1041
1026
1042
..DHCP_DEFAULT
@@ -1042,7 +1058,7 @@ mod test {
1042
1058
max_size : Some ( 1432 ) ,
1043
1059
1044
1060
requested_ip : None ,
1045
- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
1061
+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
1046
1062
..DHCP_DEFAULT
1047
1063
} ;
1048
1064
@@ -1054,7 +1070,7 @@ mod test {
1054
1070
max_size : Some ( 1432 ) ,
1055
1071
1056
1072
requested_ip : None ,
1057
- parameter_request_list : Some ( & [ 1 , 3 , 6 ] ) ,
1073
+ parameter_request_list : Some ( & [ 1 , 3 , 6 , 15 ] ) ,
1058
1074
..DHCP_DEFAULT
1059
1075
} ;
1060
1076
@@ -1097,6 +1113,7 @@ mod test {
1097
1113
} ,
1098
1114
address : Ipv4Cidr :: new ( MY_IP , 24 ) ,
1099
1115
dns_servers : Vec :: from_slice ( DNS_IPS ) . unwrap ( ) ,
1116
+ domain_name : Some ( String :: from_str ( DOMAIN_NAME ) . unwrap ( ) ) ,
1100
1117
router : Some ( SERVER_IP ) ,
1101
1118
packet : None ,
1102
1119
} ,
@@ -1132,6 +1149,7 @@ mod test {
1132
1149
} ,
1133
1150
address: Ipv4Cidr :: new( MY_IP , 24 ) ,
1134
1151
dns_servers: Vec :: from_slice( DNS_IPS ) . unwrap( ) ,
1152
+ domain_name: Some ( String :: from_str( DOMAIN_NAME ) . unwrap( ) ) ,
1135
1153
router: Some ( SERVER_IP ) ,
1136
1154
packet: None ,
1137
1155
} ) )
@@ -1170,6 +1188,7 @@ mod test {
1170
1188
} ,
1171
1189
address: Ipv4Cidr :: new( MY_IP , 24 ) ,
1172
1190
dns_servers: Vec :: from_slice( DNS_IPS ) . unwrap( ) ,
1191
+ domain_name: Some ( String :: from_str( DOMAIN_NAME ) . unwrap( ) ) ,
1173
1192
router: Some ( SERVER_IP ) ,
1174
1193
packet: None ,
1175
1194
} ) )
0 commit comments