@@ -243,37 +243,43 @@ const ip_addr_t *mbed_lwip_get_ip_addr(bool any_addr, const struct netif *netif)
243
243
return NULL ;
244
244
}
245
245
246
- #if LWIP_IPV6
247
246
void add_dns_addr (struct netif * lwip_netif )
248
247
{
248
+ // Do nothing if not brought up
249
249
const ip_addr_t * ip_addr = mbed_lwip_get_ip_addr (true, lwip_netif );
250
- if (ip_addr ) {
251
- if (IP_IS_V6 (ip_addr )) {
252
- const ip_addr_t * dns_ip_addr ;
253
- bool dns_addr_exists = false;
254
-
255
- for (char numdns = 0 ; numdns < DNS_MAX_SERVERS ; numdns ++ ) {
256
- dns_ip_addr = dns_getserver (numdns );
257
- if (!ip_addr_isany (dns_ip_addr )) {
258
- dns_addr_exists = true;
259
- break ;
260
- }
261
- }
250
+ if (!ip_addr ) {
251
+ return ;
252
+ }
262
253
263
- if (!dns_addr_exists ) {
264
- /* 2001:4860:4860::8888 google */
265
- ip_addr_t ipv6_dns_addr = IPADDR6_INIT (
266
- PP_HTONL (0x20014860UL ),
267
- PP_HTONL (0x48600000UL ),
268
- PP_HTONL (0x00000000UL ),
269
- PP_HTONL (0x00008888UL ));
270
- dns_setserver (0 , & ipv6_dns_addr );
271
- }
254
+ // Check for existing dns server
255
+ for (char numdns = 0 ; numdns < DNS_MAX_SERVERS ; numdns ++ ) {
256
+ const ip_addr_t * dns_ip_addr = dns_getserver (numdns );
257
+ if (!ip_addr_isany (dns_ip_addr )) {
258
+ return ;
272
259
}
273
260
}
274
- }
261
+
262
+ #if LWIP_IPV6
263
+ if (IP_IS_V6 (ip_addr )) {
264
+ /* 2001:4860:4860::8888 google */
265
+ ip_addr_t ipv6_dns_addr = IPADDR6_INIT (
266
+ PP_HTONL (0x20014860UL ),
267
+ PP_HTONL (0x48600000UL ),
268
+ PP_HTONL (0x00000000UL ),
269
+ PP_HTONL (0x00008888UL ));
270
+ dns_setserver (0 , & ipv6_dns_addr );
271
+ }
275
272
#endif
276
273
274
+ #if LWIP_IPV4
275
+ if (IP_IS_V4 (ip_addr )) {
276
+ /* 8.8.8.8 google */
277
+ ip_addr_t ipv4_dns_addr = IPADDR4_INIT (0x08080808 );
278
+ dns_setserver (0 , & ipv4_dns_addr );
279
+ }
280
+ #endif
281
+ }
282
+
277
283
static sys_sem_t lwip_tcpip_inited ;
278
284
static void mbed_lwip_tcpip_init_irq (void * eh )
279
285
{
@@ -495,7 +501,6 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, const char *ip, const char *netmask,
495
501
if (ret == SYS_ARCH_TIMEOUT ) {
496
502
return NSAPI_ERROR_DHCP_FAILURE ;
497
503
}
498
- lwip_connected = true;
499
504
}
500
505
501
506
#if ADDR_TIMEOUT
@@ -506,10 +511,9 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, const char *ip, const char *netmask,
506
511
}
507
512
#endif
508
513
509
- #if LWIP_IPV6
510
514
add_dns_addr (& lwip_netif );
511
- #endif
512
515
516
+ lwip_connected = true;
513
517
return 0 ;
514
518
}
515
519
@@ -618,6 +622,22 @@ static nsapi_error_t mbed_lwip_gethostbyname(nsapi_stack_t *stack, const char *h
618
622
return 0 ;
619
623
}
620
624
625
+ static nsapi_error_t mbed_lwip_add_dns_server (nsapi_stack_t * stack , nsapi_addr_t addr )
626
+ {
627
+ // Shift all dns servers down to give precedence to new server
628
+ for (int i = DNS_MAX_SERVERS - 1 ; i > 0 ; i -- ) {
629
+ dns_setserver (i , dns_getserver (i - 1 ));
630
+ }
631
+
632
+ ip_addr_t ip_addr ;
633
+ if (!convert_mbed_addr_to_lwip (& ip_addr , & addr )) {
634
+ return NSAPI_ERROR_PARAMETER ;
635
+ }
636
+
637
+ dns_setserver (0 , & ip_addr );
638
+ return 0 ;
639
+ }
640
+
621
641
static nsapi_error_t mbed_lwip_socket_open (nsapi_stack_t * stack , nsapi_socket_t * handle , nsapi_protocol_t proto )
622
642
{
623
643
// check if network is connected
@@ -874,6 +894,7 @@ static void mbed_lwip_socket_attach(nsapi_stack_t *stack, nsapi_socket_t handle,
874
894
/* LWIP network stack */
875
895
const nsapi_stack_api_t lwip_stack_api = {
876
896
.gethostbyname = mbed_lwip_gethostbyname ,
897
+ .add_dns_server = mbed_lwip_add_dns_server ,
877
898
.socket_open = mbed_lwip_socket_open ,
878
899
.socket_close = mbed_lwip_socket_close ,
879
900
.socket_bind = mbed_lwip_socket_bind ,
0 commit comments