dns: Allow storing dnsserver per netif

This commit is contained in:
David Cermak
2024-05-22 12:50:36 +02:00
committed by David Čermák
parent aa4f6e780f
commit 3a3d1fb3e3
7 changed files with 86 additions and 0 deletions
+27
View File
@@ -101,6 +101,10 @@
static bool s_is_tmr_start = false;
#endif /* ESP_LWIP_DNS_TIMERS_ONDEMAND */
#if LWIP_DNS_SETSERVER_WITH_NETIF
static dns_setserver_callback_t s_dns_setserver_callback = NULL;
#endif /* LWIP_DNS_SETSERVER_WITH_NETIF */
#include <string.h>
#if ESP_DNS
#include <stdbool.h>
@@ -1769,4 +1773,27 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call
LWIP_DNS_ISMDNS_ARG(is_mdns));
}
#if LWIP_DNS_SETSERVER_WITH_NETIF
void
dns_setserver_with_netif(struct netif* netif, u8_t numdns, const ip_addr_t *dnsserver)
{
if (s_dns_setserver_callback) {
s_dns_setserver_callback(netif, numdns, dnsserver);
} else {
dns_setserver(numdns, dnsserver);
}
}
err_t
dns_setserver_callback(dns_setserver_callback_t callback)
{
if (s_dns_setserver_callback) {
/* fail if the callback has been set already */
return ERR_ARG;
}
s_dns_setserver_callback = callback; /* support only one time configuration */
return ERR_OK;
}
#endif /* LWIP_DNS_SETSERVER_WITH_NETIF */
#endif /* LWIP_DNS */
+4
View File
@@ -777,7 +777,11 @@ dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in)
}
#endif
ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(netif, n, &dns_addr);
#else
dns_setserver(n, &dns_addr);
#endif
}
#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
}
+5
View File
@@ -547,7 +547,12 @@ dhcp6_handle_config_reply(struct netif *netif, struct pbuf *p_msg_in)
}
ip6_addr_assign_zone(dns_addr6, IP6_UNKNOWN, netif);
/* @todo: do we need a different offset than DHCP(v4)? */
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(netif, n, &dns_addr);
#else
dns_setserver(n, &dns_addr);
#endif
}
}
/* @ todo: parse and set Domain Search List */
+9
View File
@@ -780,14 +780,23 @@ nd6_input(struct pbuf *p, struct netif *inp)
if (htonl(rdnss_opt->lifetime) > 0) {
/* TODO implement Lifetime > 0 */
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(inp, rdnss_server_idx++, &rdnss_address);
#else
dns_setserver(rdnss_server_idx++, &rdnss_address);
#endif
} else {
/* TODO implement DNS removal in dns.c */
u8_t s;
for (s = 0; s < DNS_MAX_SERVERS; s++) {
const ip_addr_t *addr = dns_getserver(s);
if(ip_addr_cmp(addr, &rdnss_address)) {
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(inp, s, NULL);
#else
dns_setserver(s, NULL);
#endif
}
}
}
+6
View File
@@ -122,6 +122,12 @@ err_t dns_local_addhost(const char *hostname, const ip_addr_t *addr);
#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
#endif /* DNS_LOCAL_HOSTLIST */
#if LWIP_DNS_SETSERVER_WITH_NETIF
typedef void (*dns_setserver_callback_t)(struct netif* netif, u8_t numdns, const ip_addr_t *dnsserver);
void dns_setserver_with_netif(struct netif* netif, u8_t numdns, const ip_addr_t *dnsserver);
err_t dns_setserver_callback(dns_setserver_callback_t callback);
#endif /* LWIP_DNS_SETSERVER_WITH_NETIF */
#ifdef __cplusplus
}
#endif
+14
View File
@@ -1161,6 +1161,20 @@
#define DNS_LOCAL_HOSTLIST 0
#endif /* DNS_LOCAL_HOSTLIST */
/** LWIP_DNS_SETSERVER_WITH_NETIF: If this is turned on, the dns_setserver_with_netif() is enabled and called
* from all internal modules (instead of dns_setserver()) allowing to setup a user callback to collect DNS server
* information acquired by the related network interface.
* This could be used to overcome the LWIP limitation of using DNS servers
* globally, which could in some cases overwrite distinct DNS server information of one netif by another.
* If you want to use this option, you would have to set LWIP_DNS_SETSERVER_WITH_NETIF=1 and:
* 1) Register DNS setserver callback using dns_setserver_callback() and collect the DNS server information
* in the callback and store it separately for each netif.
* 2) Restore the actual DNS server information using dns_setserver() before every DNS lookup.
* */
#if !defined LWIP_DNS_SETSERVER_WITH_NETIF || defined __DOXYGEN__
#define LWIP_DNS_SETSERVER_WITH_NETIF 0
#endif /* LWIP_DNS_SETSERVER_WITH_NETIF */
/** If this is turned on, the local host-list can be dynamically changed
* at runtime. */
#if !defined DNS_LOCAL_HOSTLIST_IS_DYNAMIC || defined __DOXYGEN__
+21
View File
@@ -1109,12 +1109,23 @@ int cifproxyarp(ppp_pcb *pcb, u32_t his_adr) {
*/
int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
ip_addr_t ns;
#if !LWIP_DNS_SETSERVER_WITH_NETIF
LWIP_UNUSED_ARG(pcb);
#endif
ip_addr_set_ip4_u32_val(ns, ns1);
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(pcb->netif, 0, &ns);
#else
dns_setserver(0, &ns);
#endif
ip_addr_set_ip4_u32_val(ns, ns2);
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(pcb->netif, 1, &ns);
#else
dns_setserver(1, &ns);
#endif
return 1;
}
@@ -1125,17 +1136,27 @@ int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
const ip_addr_t *nsa;
ip_addr_t nsb;
#if !LWIP_DNS_SETSERVER_WITH_NETIF
LWIP_UNUSED_ARG(pcb);
#endif
nsa = dns_getserver(0);
ip_addr_set_ip4_u32_val(nsb, ns1);
if (ip_addr_cmp(nsa, &nsb)) {
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(pcb->netif, 0, IP_ADDR_ANY);
#else
dns_setserver(0, IP_ADDR_ANY);
#endif
}
nsa = dns_getserver(1);
ip_addr_set_ip4_u32_val(nsb, ns2);
if (ip_addr_cmp(nsa, &nsb)) {
#if LWIP_DNS_SETSERVER_WITH_NETIF
dns_setserver_with_netif(pcb->netif, 1, IP_ADDR_ANY);
#else
dns_setserver(1, IP_ADDR_ANY);
#endif
}
return 1;
}