@@ -302,6 +302,7 @@ static struct dns_table_entry dns_table[DNS_TABLE_SIZE];
302
302
static struct dns_req_entry dns_requests [DNS_MAX_REQUESTS ];
303
303
#endif
304
304
static ip_addr_t dns_servers [DNS_MAX_SERVERS ];
305
+ struct dns_server_interface * multihoming_dns_servers ;
305
306
306
307
#if LWIP_IPV4
307
308
const ip_addr_t dns_mquery_v4group = DNS_MQUERY_IPV4_GROUP_INIT ;
@@ -321,7 +322,7 @@ dns_init(void)
321
322
/* initialize default DNS server address */
322
323
ip_addr_t dnsserver ;
323
324
DNS_SERVER_ADDRESS (& dnsserver );
324
- dns_setserver (0 , & dnsserver );
325
+ dns_setserver (0 , & dnsserver , NULL );
325
326
#endif /* DNS_SERVER_ADDRESS */
326
327
327
328
#if LWIP_FULL_DNS
@@ -363,15 +364,114 @@ dns_init(void)
363
364
* @param dnsserver IP address of the DNS server to set
364
365
*/
365
366
void
366
- dns_setserver (u8_t numdns , const ip_addr_t * dnsserver )
367
+ dns_setserver (u8_t numdns , const ip_addr_t * dnsserver , struct netif * netif )
367
368
{
368
- if (numdns < DNS_MAX_SERVERS ) {
369
- if (dnsserver != NULL ) {
370
- dns_servers [numdns ] = (* dnsserver );
369
+
370
+ if (netif == NULL || netif_check_default (netif )) {
371
+ if (numdns < DNS_MAX_SERVERS ) {
372
+ if (dnsserver != NULL ) {
373
+ dns_servers [numdns ] = (* dnsserver );
374
+ } else {
375
+ dns_servers [numdns ] = * IP_ADDR_ANY ;
376
+ }
377
+ }
378
+ } else {
379
+ char name [INTERFACE_NAME_MAX_SIZE ];
380
+ sprintf (name , "%c%c%d" , netif -> name [0 ], netif -> name [1 ], netif -> num );
381
+ dns_add_interface_server (numdns , name , dnsserver );
382
+ }
383
+ }
384
+
385
+ /**
386
+ * @ingroup dns
387
+ * Obtain one of the currently configured DNS server.
388
+ *
389
+ * @param numdns the index of the DNS server
390
+ * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS
391
+ * server has not been configured.
392
+ */
393
+ const ip_addr_t *
394
+ dns_getserver (u8_t numdns , const char * interface_name )
395
+ {
396
+ if (interface_name == NULL ) {
397
+ if (numdns < DNS_MAX_SERVERS ) {
398
+ return & dns_servers [numdns ];
371
399
} else {
372
- dns_servers [numdns ] = * IP_ADDR_ANY ;
400
+ return IP_ADDR_ANY ;
401
+ }
402
+ } else {
403
+ return dns_get_interface_server (numdns , interface_name );
404
+ }
405
+ }
406
+
407
+ /**
408
+ * @ingroup dns
409
+ * Initialize one of the DNS servers.
410
+ *
411
+ * @param numdns the index of the DNS server to set must be < DNS_MAX_SERVERS
412
+ * @param dnsserver IP address of the DNS server to set
413
+ */
414
+ void
415
+ dns_add_interface_server (u8_t numdns , const char * interface_name , const ip_addr_t * dnsserver )
416
+ {
417
+ struct dns_server_interface * new_interface_server ;
418
+
419
+ if (numdns >= DNS_MAX_SERVERS ) {
420
+ return ;
421
+ }
422
+
423
+ if (multihoming_dns_servers != NULL ) {
424
+ // if interface server already exists on the list just update it
425
+ for (new_interface_server = multihoming_dns_servers ; new_interface_server != NULL ; new_interface_server = new_interface_server -> next ) {
426
+ if (!strcmp (interface_name , new_interface_server -> interface_name )) {
427
+ new_interface_server -> dns_servers [numdns ] = (* dnsserver );
428
+ return ;
429
+ }
373
430
}
374
431
}
432
+ // add new dns server to the list tail
433
+ new_interface_server = mem_malloc (sizeof (struct dns_server_interface ));
434
+ strncpy (new_interface_server -> interface_name , interface_name , INTERFACE_NAME_MAX_SIZE );
435
+ new_interface_server -> dns_servers [numdns ] = (* dnsserver );
436
+ new_interface_server -> next = NULL ;
437
+
438
+ if (multihoming_dns_servers == NULL ) {
439
+ multihoming_dns_servers = new_interface_server ;
440
+ } else {
441
+ struct dns_server_interface * tail ;
442
+ tail = multihoming_dns_servers ;
443
+
444
+ while (tail -> next != NULL ) {
445
+ tail = tail -> next ;
446
+ }
447
+ tail -> next = new_interface_server ;
448
+
449
+ }
450
+ }
451
+
452
+ void
453
+ dns_remove_interface_servers (const char * interface_name )
454
+ {
455
+ struct dns_server_interface * temp = multihoming_dns_servers ;
456
+ struct dns_server_interface * prev = NULL ;
457
+
458
+ if (temp != NULL && !strcmp (interface_name , temp -> interface_name )) {
459
+ multihoming_dns_servers = temp -> next ;
460
+ mem_free (temp );
461
+ return ;
462
+ }
463
+
464
+ while (temp != NULL && strcmp (interface_name , temp -> interface_name )) {
465
+ prev = temp ;
466
+ temp = temp -> next ;
467
+ }
468
+
469
+ if (temp == NULL ) {
470
+ return ;
471
+ }
472
+
473
+ prev -> next = temp -> next ;
474
+ mem_free (temp );
375
475
}
376
476
377
477
/**
@@ -383,13 +483,20 @@ dns_setserver(u8_t numdns, const ip_addr_t *dnsserver)
383
483
* server has not been configured.
384
484
*/
385
485
const ip_addr_t *
386
- dns_getserver (u8_t numdns )
486
+ dns_get_interface_server (u8_t numdns , const char * interface_name )
387
487
{
488
+ struct dns_server_interface * interface_server ;
489
+
388
490
if (numdns < DNS_MAX_SERVERS ) {
389
- return & dns_servers [numdns ];
390
- } else {
391
491
return IP_ADDR_ANY ;
392
492
}
493
+
494
+ for (interface_server = multihoming_dns_servers ; interface_server != NULL ; interface_server = interface_server -> next ) {
495
+ if (!strcmp (interface_name , interface_server -> interface_name )) {
496
+ return & interface_server -> dns_servers [numdns ];
497
+ }
498
+ }
499
+ return IP_ADDR_ANY ;
393
500
}
394
501
395
502
/**
0 commit comments