@@ -126,7 +126,7 @@ struct dhcps_t {
126126 struct netif * dhcps_netif ;
127127 ip4_addr_t broadcast_dhcps ;
128128 ip4_addr_t server_address ;
129- ip4_addr_t dns_server ;
129+ ip4_addr_t dns_server [ DNS_TYPE_MAX ] ;
130130 ip4_addr_t client_address ;
131131 ip4_addr_t client_address_plus ;
132132 ip4_addr_t dhcps_mask ;
@@ -155,7 +155,10 @@ dhcps_t *dhcps_new(void)
155155 return NULL ;
156156 }
157157 dhcps -> dhcps_netif = NULL ;
158- dhcps -> dns_server .addr = 0 ;
158+
159+ for (int i = 0 ; i < DNS_TYPE_MAX ; i ++ ) {
160+ dhcps -> dns_server [i ].addr = 0 ;
161+ }
159162#ifdef USE_CLASS_B_NET
160163 dhcps -> dhcps_mask .addr = PP_HTONL (LWIP_MAKEU32 (255 , 240 , 0 , 0 ));
161164#else
@@ -454,15 +457,30 @@ static u8_t *add_offer_options(dhcps_t *dhcps, u8_t *optptr)
454457 }
455458 }
456459
460+ // In order of preference
457461 if (dhcps_dns_enabled (dhcps -> dhcps_dns )) {
462+ uint8_t size = 4 ;
463+
464+ if (dhcps -> dns_server [DNS_TYPE_BACKUP ].addr ) {
465+ size += 4 ;
466+ }
467+
458468 * optptr ++ = DHCP_OPTION_DNS_SERVER ;
459- * optptr ++ = 4 ;
460- * optptr ++ = ip4_addr1 (& dhcps -> dns_server );
461- * optptr ++ = ip4_addr2 (& dhcps -> dns_server );
462- * optptr ++ = ip4_addr3 (& dhcps -> dns_server );
463- * optptr ++ = ip4_addr4 (& dhcps -> dns_server );
469+ * optptr ++ = size ;
470+
471+ * optptr ++ = ip4_addr1 (& dhcps -> dns_server [DNS_TYPE_MAIN ]);
472+ * optptr ++ = ip4_addr2 (& dhcps -> dns_server [DNS_TYPE_MAIN ]);
473+ * optptr ++ = ip4_addr3 (& dhcps -> dns_server [DNS_TYPE_MAIN ]);
474+ * optptr ++ = ip4_addr4 (& dhcps -> dns_server [DNS_TYPE_MAIN ]);
475+
476+ if (dhcps -> dns_server [DNS_TYPE_BACKUP ].addr ) {
477+ * optptr ++ = ip4_addr1 (& dhcps -> dns_server [DNS_TYPE_BACKUP ]);
478+ * optptr ++ = ip4_addr2 (& dhcps -> dns_server [DNS_TYPE_BACKUP ]);
479+ * optptr ++ = ip4_addr3 (& dhcps -> dns_server [DNS_TYPE_BACKUP ]);
480+ * optptr ++ = ip4_addr4 (& dhcps -> dns_server [DNS_TYPE_BACKUP ]);
481+ }
464482#ifdef CONFIG_LWIP_DHCPS_ADD_DNS
465- }else {
483+ } else {
466484 * optptr ++ = DHCP_OPTION_DNS_SERVER ;
467485 * optptr ++ = 4 ;
468486 * optptr ++ = ip4_addr1 (& ipadd );
@@ -490,8 +508,7 @@ static u8_t *add_offer_options(dhcps_t *dhcps, u8_t *optptr)
490508
491509 * optptr ++ = DHCP_OPTION_CAPTIVEPORTAL_URI ;
492510 * optptr ++ = length ;
493- for (i = 0 ; i < length ; i ++ )
494- {
511+ for (i = 0 ; i < length ; i ++ ) {
495512 * optptr ++ = dhcps -> dhcps_captiveportal_uri [i ];
496513 }
497514 }
@@ -1535,31 +1552,33 @@ bool dhcp_search_ip_on_mac(dhcps_t *dhcps, u8_t *mac, ip4_addr_t *ip)
15351552 * FunctionName : dhcps_dns_setserver
15361553 * Description : set DNS server address for dhcpserver
15371554 * Parameters : dnsserver -- The DNS server address
1555+ * type -- The DNS type
15381556 * Returns : ERR_ARG if invalid handle, ERR_OK on success
15391557*******************************************************************************/
1540- err_t dhcps_dns_setserver (dhcps_t * dhcps , const ip_addr_t * dnsserver )
1558+ err_t dhcps_dns_setserver (dhcps_t * dhcps , const ip_addr_t * dnsserver , dns_type_t type )
15411559{
15421560 if (dhcps == NULL ) {
15431561 return ERR_ARG ;
15441562 }
15451563 if (dnsserver != NULL ) {
1546- dhcps -> dns_server = * (ip_2_ip4 (dnsserver ));
1564+ dhcps -> dns_server [ type ] = * (ip_2_ip4 (dnsserver ));
15471565 } else {
1548- dhcps -> dns_server = * (ip_2_ip4 (IP_ADDR_ANY ));
1566+ dhcps -> dns_server [ type ] = * (ip_2_ip4 (IP_ADDR_ANY ));
15491567 }
15501568 return ERR_OK ;
15511569}
15521570
15531571/******************************************************************************
15541572 * FunctionName : dhcps_dns_getserver
15551573 * Description : get DNS server address for dhcpserver
1556- * Parameters : none
1557- * Returns : ip4_addr_t
1574+ * Parameters : dnsserver -- The DNS server address
1575+ * type -- The DNS type
1576+ * Returns : ERR_ARG if invalid handle, ERR_OK on success
15581577*******************************************************************************/
1559- err_t dhcps_dns_getserver (dhcps_t * dhcps , ip4_addr_t * dnsserver )
1578+ err_t dhcps_dns_getserver (dhcps_t * dhcps , ip4_addr_t * dnsserver , dns_type_t type )
15601579{
15611580 if (dhcps ) {
1562- * dnsserver = dhcps -> dns_server ;
1581+ * dnsserver = dhcps -> dns_server [ type ] ;
15631582 return ERR_OK ;
15641583 }
15651584 return ERR_ARG ;
0 commit comments