Skip to content

Commit 0932e31

Browse files
EvlersRbb666
authored andcommitted
add support for independent dns services for multiple network devices
1 parent 54dc928 commit 0932e31

File tree

6 files changed

+122
-15
lines changed

6 files changed

+122
-15
lines changed

components/net/lwip/lwip-2.1.2/src/core/dns.c

+55-12
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@
9999

100100
#include <rtthread.h>
101101

102+
#ifdef RT_USING_NETDEV
103+
#include "netdev.h"
104+
#endif
105+
102106
/** Random generator function to create random TXIDs and source ports for queries */
103107
#ifndef DNS_RAND_TXID
104108
#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_XID) != 0)
@@ -300,7 +304,9 @@ static u8_t dns_last_pcb_idx;
300304
static u8_t dns_seqno;
301305
static struct dns_table_entry dns_table[DNS_TABLE_SIZE];
302306
static struct dns_req_entry dns_requests[DNS_MAX_REQUESTS];
307+
#ifndef RT_USING_NETDEV
303308
static ip_addr_t dns_servers[DNS_MAX_SERVERS];
309+
#endif
304310

305311
#if LWIP_IPV4
306312
const ip_addr_t dns_mquery_v4group = DNS_MQUERY_IPV4_GROUP_INIT;
@@ -364,21 +370,25 @@ dns_setserver(u8_t numdns, const ip_addr_t *dnsserver)
364370
{
365371
if (numdns < DNS_MAX_SERVERS) {
366372
if (dnsserver != NULL) {
367-
dns_servers[numdns] = (*dnsserver);
368-
369373
#ifdef RT_USING_NETDEV
370-
extern struct netif *netif_list;
371-
extern struct netdev *netdev_get_by_name(const char *name);
372-
extern void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server);
373374
struct netif *netif = NULL;
374375

375376
/* set network interface device DNS server address */
376377
for (netif = netif_list; netif != NULL; netif = netif->next) {
377-
netdev_low_level_set_dns_server(netdev_get_by_name(netif->name), numdns, dnsserver);
378+
netdev_set_dns_server(netdev_get_by_name(netif->name), numdns, dnsserver);
378379
}
380+
#else
381+
dns_servers[numdns] = (*dnsserver);
379382
#endif /* RT_USING_NETDEV */
380383
} else {
384+
#ifdef RT_USING_NETDEV
385+
struct netif *netif = NULL;
386+
for (netif = netif_list; netif != NULL; netif = netif->next) {
387+
netdev_set_dns_server(netdev_get_by_name(netif->name), numdns, IP_ADDR_ANY);
388+
}
389+
#else
381390
dns_servers[numdns] = *IP_ADDR_ANY;
391+
#endif
382392
}
383393
}
384394
}
@@ -395,7 +405,11 @@ const ip_addr_t *
395405
dns_getserver(u8_t numdns)
396406
{
397407
if (numdns < DNS_MAX_SERVERS) {
408+
#ifdef RT_USING_NETDEV
409+
return &netdev_default->dns_servers[numdns];
410+
#else
398411
return &dns_servers[numdns];
412+
#endif
399413
} else {
400414
return IP_ADDR_ANY;
401415
}
@@ -770,11 +784,19 @@ dns_send(u8_t idx)
770784
u8_t n;
771785
u8_t pcb_idx;
772786
struct dns_table_entry *entry = &dns_table[idx];
787+
const ip_addr_t *dns_addr;
773788

774789
LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n",
775790
(u16_t)(entry->server_idx), entry->name));
776791
LWIP_ASSERT("dns server out of array", entry->server_idx < DNS_MAX_SERVERS);
777-
if (ip_addr_isany_val(dns_servers[entry->server_idx])
792+
793+
#ifdef RT_USING_NETDEV
794+
dns_addr = &netdev_default->dns_servers[entry->server_idx];
795+
#else
796+
dns_addr = &dns_servers[entry->server_idx];
797+
#endif
798+
799+
if (ip_addr_isany(dns_addr)
778800
#if LWIP_DNS_SUPPORT_MDNS_QUERIES
779801
&& !entry->is_mdns
780802
#endif
@@ -859,7 +881,11 @@ dns_send(u8_t idx)
859881
#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */
860882
{
861883
dst_port = DNS_SERVER_PORT;
862-
dst = &dns_servers[entry->server_idx];
884+
dst = dns_addr;
885+
#ifdef RT_USING_NETDEV
886+
/* set netif index for this pcb, specify the network interface corresponding to the DNS server */
887+
dns_pcbs[pcb_idx]->netif_idx = netif_get_index((struct netif *)netdev_default->user_data);
888+
#endif
863889
}
864890
err = udp_sendto(dns_pcbs[pcb_idx], p, dst, dst_port);
865891

@@ -1040,8 +1066,15 @@ dns_backupserver_available(struct dns_table_entry *pentry)
10401066
u8_t ret = 0;
10411067

10421068
if (pentry) {
1043-
if ((pentry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[pentry->server_idx + 1])) {
1044-
ret = 1;
1069+
if ((pentry->server_idx + 1 < DNS_MAX_SERVERS)) {
1070+
#ifdef RT_USING_NETDEV
1071+
const ip_addr_t *dns_addr = &netdev_default->dns_servers[pentry->server_idx + 1];
1072+
#else
1073+
const ip_addr_t *dns_addr = &dns_servers[pentry->server_idx + 1];
1074+
#endif
1075+
if (!ip_addr_isany(dns_addr)) {
1076+
ret = 1;
1077+
}
10451078
}
10461079
}
10471080

@@ -1230,9 +1263,14 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr,
12301263
if (!entry->is_mdns)
12311264
#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */
12321265
{
1266+
#ifdef RT_USING_NETDEV
1267+
const ip_addr_t *dns_addr = &netdev_default->dns_servers[entry->server_idx];
1268+
#else
1269+
const ip_addr_t *dns_addr = &dns_servers[entry->server_idx];
1270+
#endif
12331271
/* Check whether response comes from the same network address to which the
12341272
question was sent. (RFC 5452) */
1235-
if (!ip_addr_cmp(addr, &dns_servers[entry->server_idx])) {
1273+
if (!ip_addr_cmp(addr, dns_addr)) {
12361274
goto ignore_packet; /* ignore this packet */
12371275
}
12381276
}
@@ -1631,8 +1669,13 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call
16311669
if (!is_mdns)
16321670
#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */
16331671
{
1672+
#ifdef RT_USING_NETDEV
1673+
const ip_addr_t *dns_addr = &netdev_default->dns_servers[0];
1674+
#else
1675+
const ip_addr_t *dns_addr = &dns_servers[0];
1676+
#endif
16341677
/* prevent calling found callback if no server is set, return error instead */
1635-
if (ip_addr_isany_val(dns_servers[0])) {
1678+
if (ip_addr_isany(dns_addr)) {
16361679
return ERR_VAL;
16371680
}
16381681
}

components/net/lwip/lwip-2.1.2/src/core/ipv4/dhcp.c

+9
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,16 @@ dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in)
673673
for (n = 0; (n < LWIP_DHCP_PROVIDE_DNS_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) {
674674
ip_addr_t dns_addr;
675675
ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
676+
#ifdef RT_USING_NETDEV
677+
extern struct netdev *netdev_get_by_name(const char *name);
678+
extern void netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server);
679+
/* Here we only need to set the dns server of the corresponding network device,
680+
* but do not need to configure all network devices.
681+
*/
682+
netdev_set_dns_server(netdev_get_by_name(netif->name), n, &dns_addr);
683+
#else
676684
dns_setserver(n, &dns_addr);
685+
#endif
677686
}
678687
#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
679688
}

components/net/lwip/lwip-2.1.2/src/core/ipv6/dhcp6.c

+9
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,16 @@ dhcp6_handle_config_reply(struct netif *netif, struct pbuf *p_msg_in)
538538
}
539539
ip6_addr_assign_zone(dns_addr6, IP6_UNKNOWN, netif);
540540
/* @todo: do we need a different offset than DHCP(v4)? */
541+
#ifdef RT_USING_NETDEV
542+
extern struct netdev *netdev_get_by_name(const char *name);
543+
extern void netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server);
544+
/* Here we only need to set the dns server of the corresponding network device,
545+
* but do not need to configure all network devices.
546+
*/
547+
netdev_set_dns_server(netdev_get_by_name(netif->name), n, &dns_addr);
548+
#else
541549
dns_setserver(n, &dns_addr);
550+
#endif
542551
}
543552
}
544553
/* @ todo: parse and set Domain Search List */

components/net/lwip/lwip-2.1.2/src/core/ipv6/nd6.c

+19-1
Original file line numberDiff line numberDiff line change
@@ -776,14 +776,32 @@ nd6_input(struct pbuf *p, struct netif *inp)
776776

777777
if (htonl(rdnss_opt->lifetime) > 0) {
778778
/* TODO implement Lifetime > 0 */
779+
#ifdef RT_USING_NETDEV
780+
extern struct netdev *netdev_get_by_name(const char *name);
781+
extern void netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server);
782+
/* Here we only need to set the dns server of the corresponding network device,
783+
* but do not need to configure all network devices.
784+
*/
785+
netdev_set_dns_server(netdev_get_by_name(inp->name), rdnss_server_idx++, &rdnss_address);
786+
#else
779787
dns_setserver(rdnss_server_idx++, &rdnss_address);
788+
#endif
780789
} else {
781790
/* TODO implement DNS removal in dns.c */
782791
u8_t s;
783792
for (s = 0; s < DNS_MAX_SERVERS; s++) {
784793
const ip_addr_t *addr = dns_getserver(s);
785794
if(ip_addr_cmp(addr, &rdnss_address)) {
786-
dns_setserver(s, NULL);
795+
#ifdef RT_USING_NETDEV
796+
extern struct netdev *netdev_get_by_name(const char *name);
797+
extern void netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server);
798+
/* Here we only need to set the dns server of the corresponding network device,
799+
* but do not need to configure all network devices.
800+
*/
801+
netdev_set_dns_server(netdev_get_by_name(inp->name), s, IP_ADDR_ANY);
802+
#else
803+
dns_setserver(s, IP_ADDR_ANY);
804+
#endif
787805
}
788806
}
789807
}

components/net/lwip/lwip-2.1.2/src/netif/ppp/ppp.c

+24-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
*
2525
******************************************************************************
2626
* REVISION HISTORY
27-
*
27+
* 24-09-12 Evlers <[email protected]>
28+
* add support for independent dns services for multiple network devices
2829
* 03-01-01 Marc Boucher <[email protected]>
2930
* Ported to lwIP.
3031
* 97-11-05 Guy Lancaster <[email protected]>, Global Election Systems Inc.
@@ -134,6 +135,9 @@
134135
#if PPP_IPV6_SUPPORT
135136
#include "netif/ppp/ipv6cp.h"
136137
#endif /* PPP_IPV6_SUPPORT */
138+
#ifdef RT_USING_NETDEV
139+
#include "netdev.h"
140+
#endif /* RT_USING_NETDEV */
137141

138142
/*************************/
139143
/*** LOCAL DEFINITIONS ***/
@@ -1109,9 +1113,20 @@ int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
11091113
LWIP_UNUSED_ARG(pcb);
11101114

11111115
ip_addr_set_ip4_u32_val(ns, ns1);
1116+
#ifdef RT_USING_NETDEV
1117+
/* Here we only need to set the dns server of the corresponding network device,
1118+
* but do not need to configure all network cards.
1119+
*/
1120+
netdev_set_dns_server(netdev_get_by_name(pcb->netif->name), 0, &ns);
1121+
#else
11121122
dns_setserver(0, &ns);
1123+
#endif
11131124
ip_addr_set_ip4_u32_val(ns, ns2);
1125+
#ifdef RT_USING_NETDEV
1126+
netdev_set_dns_server(netdev_get_by_name(pcb->netif->name), 1, &ns);
1127+
#else
11141128
dns_setserver(1, &ns);
1129+
#endif
11151130
return 1;
11161131
}
11171132

@@ -1127,12 +1142,20 @@ int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
11271142
nsa = dns_getserver(0);
11281143
ip_addr_set_ip4_u32_val(nsb, ns1);
11291144
if (ip_addr_cmp(nsa, &nsb)) {
1145+
#ifdef RT_USING_NETDEV
1146+
netdev_set_dns_server(netdev_get_by_name(pcb->netif->name), 0, IP_ADDR_ANY);
1147+
#else
11301148
dns_setserver(0, IP_ADDR_ANY);
1149+
#endif
11311150
}
11321151
nsa = dns_getserver(1);
11331152
ip_addr_set_ip4_u32_val(nsb, ns2);
11341153
if (ip_addr_cmp(nsa, &nsb)) {
1154+
#ifdef RT_USING_NETDEV
1155+
netdev_set_dns_server(netdev_get_by_name(pcb->netif->name), 1, IP_ADDR_ANY);
1156+
#else
11351157
dns_setserver(1, IP_ADDR_ANY);
1158+
#endif
11361159
}
11371160
return 1;
11381161
}

components/net/lwip/port/ethernetif.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* 2018-11-02 MurphyZhao port to lwIP 2.1.0
1616
* 2021-09-07 Grissiom fix eth_tx_msg ack bug
1717
* 2022-02-22 xiangxistu integrate v1.4.1 v2.0.3 and v2.1.2 porting layer
18+
* 2024-09-12 Evlers add support for independent dns services for multiple network devices
1819
*/
1920

2021
/*
@@ -169,15 +170,19 @@ static int lwip_netdev_set_addr_info(struct netdev *netif, ip_addr_t *ip_addr, i
169170
}
170171

171172
#ifdef RT_LWIP_DNS
172-
static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server)
173+
static int lwip_netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server)
173174
{
175+
#if RT_USING_LWIP_VER_NUM >= 0x20102
176+
netdev_low_level_set_dns_server(netdev, dns_num, dns_server);
177+
#else
174178
#if LWIP_VERSION_MAJOR == 1U /* v1.x */
175179
extern void dns_setserver(u8_t numdns, ip_addr_t *dnsserver);
176180
#else /* >=2.x */
177181
extern void dns_setserver(uint8_t dns_num, const ip_addr_t *dns_server);
178182
#endif /* LWIP_VERSION_MAJOR == 1U */
179183

180184
dns_setserver(dns_num, dns_server);
185+
#endif /* RT_USING_LWIP_VER_NUM >= 0x20102 */
181186
return ERR_OK;
182187
}
183188
#endif /* RT_LWIP_DNS */

0 commit comments

Comments
 (0)