Skip to content

Commit 7899597

Browse files
jukkarrlubos
authored andcommitted
[nrf fromtree] net: dns: Save info about source when configuring DNS servers
Remember which DNS server was added by a source like DHCPv4 or v6 message. This will allow system to remove DNS servers that were added by that source. Then when stopping for example DHCP, we can remove those specific DNS servers and not leaving DNS servers hanging in the system. Signed-off-by: Jukka Rissanen <[email protected]> (cherry picked from commit cdc6c32) Signed-off-by: Robert Lubos <[email protected]>
1 parent 2007d14 commit 7899597

File tree

9 files changed

+103
-23
lines changed

9 files changed

+103
-23
lines changed

drivers/modem/hl7800.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1966,7 +1966,8 @@ static void dns_work_cb(struct k_work *work)
19661966
}
19671967
} else {
19681968
LOG_DBG("Reconfiguring DNS resolver");
1969-
ret = dns_resolve_reconfigure(dnsCtx, (const char **)dns_servers_str, NULL);
1969+
ret = dns_resolve_reconfigure(dnsCtx, (const char **)dns_servers_str, NULL,
1970+
DNS_SOURCE_MANUAL);
19701971
if (ret < 0) {
19711972
LOG_ERR("dns_resolve_reconfigure fail (%d)", ret);
19721973
retry = true;

drivers/wifi/esp_at/esp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,8 @@ static void esp_dns_work(struct k_work *work)
506506

507507
dnsctx = dns_resolve_get_default();
508508
err = dns_resolve_reconfigure_with_interfaces(dnsctx, NULL, dns_servers,
509-
interfaces);
509+
interfaces,
510+
DNS_SOURCE_MANUAL);
510511
if (err) {
511512
LOG_ERR("Could not set DNS servers: %d", err);
512513
}

include/zephyr/net/dns_resolve.h

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,24 @@ enum dns_query_type {
4242
DNS_QUERY_TYPE_AAAA = 28
4343
};
4444

45+
/**
46+
* Entity that added the DNS server.
47+
*/
48+
enum dns_server_source {
49+
/** Source is unknown */
50+
DNS_SOURCE_UNKNOWN = 0,
51+
/** Server information is added manually, for example by an application */
52+
DNS_SOURCE_MANUAL,
53+
/** Server information is from DHCPv4 server */
54+
DNS_SOURCE_DHCPV4,
55+
/** Server information is from DHCPv6 server */
56+
DNS_SOURCE_DHCPV6,
57+
/** Server information is from IPv6 SLAAC (router advertisement) */
58+
DNS_SOURCE_IPV6_RA,
59+
/** Server information is from PPP */
60+
DNS_SOURCE_PPP,
61+
};
62+
4563
/** Max size of the resolved name. */
4664
#ifndef DNS_MAX_NAME_SIZE
4765
#define DNS_MAX_NAME_SIZE 20
@@ -345,6 +363,9 @@ struct dns_resolve_context {
345363
*/
346364
int if_index;
347365

366+
/** Source of the DNS server, e.g., manual, DHCPv4/6, etc. */
367+
enum dns_server_source source;
368+
348369
/** Is this server mDNS one */
349370
uint8_t is_mdns : 1;
350371

@@ -518,12 +539,14 @@ int dns_resolve_close(struct dns_resolve_context *ctx);
518539
* @param servers_sa DNS server addresses as struct sockaddr. The array
519540
* is NULL terminated. Port numbers are optional in struct sockaddr, the
520541
* default will be used if set to 0.
542+
* @param source Source of the DNS servers, e.g., manual, DHCPv4/6, etc.
521543
*
522544
* @return 0 if ok, <0 if error.
523545
*/
524546
int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
525547
const char *servers_str[],
526-
const struct sockaddr *servers_sa[]);
548+
const struct sockaddr *servers_sa[],
549+
enum dns_server_source source);
527550

528551
/**
529552
* @brief Reconfigure DNS resolving context with new server list and
@@ -543,13 +566,15 @@ int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
543566
* @param interfaces Network interfaces to which the DNS servers are bound.
544567
* This is an array of network interface indices. The array must be
545568
* the same length as the servers_str and servers_sa arrays.
569+
* @param source Source of the DNS servers, e.g., manual, DHCPv4/6, etc.
546570
*
547571
* @return 0 if ok, <0 if error.
548572
*/
549573
int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx,
550574
const char *servers_str[],
551575
const struct sockaddr *servers_sa[],
552-
int interfaces[]);
576+
int interfaces[],
577+
enum dns_server_source source);
553578

554579
/**
555580
* @brief Remove servers from the DNS resolving context.
@@ -701,6 +726,15 @@ static inline int dns_cancel_addr_info(uint16_t dns_id)
701726

702727
/** @cond INTERNAL_HIDDEN */
703728

729+
/**
730+
* @brief Get string representation of the DNS server source.
731+
*
732+
* @param source Source of the DNS server.
733+
*
734+
* @return String representation of the DNS server source.
735+
*/
736+
const char *dns_get_source_str(enum dns_server_source source);
737+
704738
/**
705739
* @brief Initialize DNS subsystem.
706740
*/

subsys/net/ip/ipv6_nbr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2509,7 +2509,8 @@ static inline bool handle_ra_rdnss(struct net_pkt *pkt, uint8_t len)
25092509
/* TODO: Handle lifetime. */
25102510
ctx = dns_resolve_get_default();
25112511
ret = dns_resolve_reconfigure_with_interfaces(ctx, NULL, dns_servers,
2512-
interfaces);
2512+
interfaces,
2513+
DNS_SOURCE_IPV6_RA);
25132514
if (ret < 0) {
25142515
NET_DBG("Failed to set RDNSS resolve address: %d", ret);
25152516
}

subsys/net/l2/ppp/ipcp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,8 @@ static void ipcp_set_dns_servers(struct ppp_fsm *fsm)
376376

377377
dnsctx = dns_resolve_get_default();
378378
ret = dns_resolve_reconfigure_with_interfaces(dnsctx, NULL, dns_servers,
379-
interfaces);
379+
interfaces,
380+
DNS_SOURCE_PPP);
380381
if (ret < 0) {
381382
NET_ERR("Could not set DNS servers");
382383
return;

subsys/net/lib/dhcpv4/dhcpv4.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,9 +1185,11 @@ static bool dhcpv4_parse_options(struct net_pkt *pkt,
11851185

11861186
status = dns_resolve_reconfigure_with_interfaces(ctx, NULL,
11871187
dns_servers,
1188-
interfaces);
1188+
interfaces,
1189+
DNS_SOURCE_DHCPV4);
11891190
} else {
1190-
status = dns_resolve_reconfigure(ctx, NULL, dns_servers);
1191+
status = dns_resolve_reconfigure(ctx, NULL, dns_servers,
1192+
DNS_SOURCE_DHCPV4);
11911193
}
11921194

11931195
if (status < 0) {

subsys/net/lib/dhcpv6/dhcpv6.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,9 +1426,11 @@ static int dhcpv6_handle_dns_server_option(struct net_pkt *pkt)
14261426

14271427
status = dns_resolve_reconfigure_with_interfaces(ctx, NULL,
14281428
dns_servers,
1429-
interfaces);
1429+
interfaces,
1430+
DNS_SOURCE_DHCPV6);
14301431
} else {
1431-
status = dns_resolve_reconfigure(ctx, NULL, dns_servers);
1432+
status = dns_resolve_reconfigure(ctx, NULL, dns_servers,
1433+
DNS_SOURCE_DHCPV6);
14321434
}
14331435

14341436
if (status < 0) {

subsys/net/lib/dns/resolve.c

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -488,13 +488,34 @@ static int get_free_slot(struct dns_resolve_context *ctx)
488488
return -ENOENT;
489489
}
490490

491+
const char *dns_get_source_str(enum dns_server_source source)
492+
{
493+
switch (source) {
494+
case DNS_SOURCE_UNKNOWN:
495+
return "unknown";
496+
case DNS_SOURCE_MANUAL:
497+
return "manual";
498+
case DNS_SOURCE_DHCPV4:
499+
__fallthrough;
500+
case DNS_SOURCE_DHCPV6:
501+
return "DHCP";
502+
case DNS_SOURCE_IPV6_RA:
503+
return "IPv6 RA";
504+
case DNS_SOURCE_PPP:
505+
return "PPP";
506+
}
507+
508+
return "";
509+
}
510+
491511
/* Must be invoked with context lock held */
492512
static int dns_resolve_init_locked(struct dns_resolve_context *ctx,
493513
const char *servers[],
494514
const struct sockaddr *servers_sa[],
495515
const struct net_socket_service_desc *svc,
496516
uint16_t port, int interfaces[],
497-
bool do_cleanup)
517+
bool do_cleanup,
518+
enum dns_server_source source)
498519
{
499520
#if defined(CONFIG_NET_IPV6)
500521
struct sockaddr_in6 local_addr6 = {
@@ -608,6 +629,8 @@ static int dns_resolve_init_locked(struct dns_resolve_context *ctx,
608629
}
609630
}
610631

632+
ctx->servers[idx].source = source;
633+
611634
addr = &ctx->servers[idx].dns_server;
612635

613636
(void)memset(addr, 0, sizeof(*addr));
@@ -624,13 +647,16 @@ static int dns_resolve_init_locked(struct dns_resolve_context *ctx,
624647

625648
dns_postprocess_server(ctx, idx);
626649

627-
NET_DBG("[%d] %.*s%s%s%s%s", i, (int)server_len, servers[i],
650+
NET_DBG("[%d] %.*s%s%s%s%s%s%s%s", i, (int)server_len, servers[i],
628651
IS_ENABLED(CONFIG_MDNS_RESOLVER) ?
629652
(ctx->servers[i].is_mdns ? " mDNS" : "") : "",
630653
IS_ENABLED(CONFIG_LLMNR_RESOLVER) ?
631654
(ctx->servers[i].is_llmnr ? " LLMNR" : "") : "",
632655
iface_str != NULL ? " via " : "",
633-
iface_str != NULL ? iface_str : "");
656+
iface_str != NULL ? iface_str : "",
657+
source != DNS_SOURCE_UNKNOWN ? " (" : "",
658+
source != DNS_SOURCE_UNKNOWN ? dns_get_source_str(source) : "",
659+
source != DNS_SOURCE_UNKNOWN ? ")" : "");
634660
idx++;
635661
}
636662

@@ -656,6 +682,8 @@ static int dns_resolve_init_locked(struct dns_resolve_context *ctx,
656682
break;
657683
}
658684

685+
ctx->servers[idx].source = source;
686+
659687
memcpy(&ctx->servers[idx].dns_server, servers_sa[i],
660688
sizeof(ctx->servers[idx].dns_server));
661689

@@ -668,15 +696,18 @@ static int dns_resolve_init_locked(struct dns_resolve_context *ctx,
668696

669697
dns_postprocess_server(ctx, idx);
670698

671-
NET_DBG("[%d] %s%s%s%s%s", i,
699+
NET_DBG("[%d] %s%s%s%s%s%s%s%s", i,
672700
net_sprint_addr(servers_sa[i]->sa_family,
673701
&net_sin(servers_sa[i])->sin_addr),
674702
IS_ENABLED(CONFIG_MDNS_RESOLVER) ?
675703
(ctx->servers[i].is_mdns ? " mDNS" : "") : "",
676704
IS_ENABLED(CONFIG_LLMNR_RESOLVER) ?
677705
(ctx->servers[i].is_llmnr ? " LLMNR" : "") : "",
678706
interfaces != NULL ? " via " : "",
679-
interfaces != NULL ? iface_str : "");
707+
interfaces != NULL ? iface_str : "",
708+
source != DNS_SOURCE_UNKNOWN ? " (" : "",
709+
source != DNS_SOURCE_UNKNOWN ? dns_get_source_str(source) : "",
710+
source != DNS_SOURCE_UNKNOWN ? ")" : "");
680711
idx++;
681712
}
682713

@@ -871,7 +902,7 @@ int dns_resolve_init_with_svc(struct dns_resolve_context *ctx, const char *serve
871902
}
872903

873904
ret = dns_resolve_init_locked(ctx, servers, servers_sa, svc, port,
874-
interfaces, true);
905+
interfaces, true, DNS_SOURCE_UNKNOWN);
875906

876907
k_mutex_unlock(&lock);
877908

@@ -2055,7 +2086,8 @@ static int do_dns_resolve_reconfigure(struct dns_resolve_context *ctx,
20552086
const char *servers[],
20562087
const struct sockaddr *servers_sa[],
20572088
int interfaces[],
2058-
bool do_close)
2089+
bool do_close,
2090+
enum dns_server_source source)
20592091
{
20602092
int err;
20612093

@@ -2092,7 +2124,8 @@ static int do_dns_resolve_reconfigure(struct dns_resolve_context *ctx,
20922124

20932125
err = dns_resolve_init_locked(ctx, servers, servers_sa,
20942126
&resolve_svc, 0, interfaces,
2095-
do_close);
2127+
do_close,
2128+
source);
20962129

20972130
unlock:
20982131
k_mutex_unlock(&ctx->lock);
@@ -2104,26 +2137,30 @@ static int do_dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21042137
int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx,
21052138
const char *servers[],
21062139
const struct sockaddr *servers_sa[],
2107-
int interfaces[])
2140+
int interfaces[],
2141+
enum dns_server_source source)
21082142
{
21092143
return do_dns_resolve_reconfigure(ctx,
21102144
servers,
21112145
servers_sa,
21122146
interfaces,
21132147
IS_ENABLED(CONFIG_DNS_RECONFIGURE_CLEANUP) ?
2114-
true : false);
2148+
true : false,
2149+
source);
21152150
}
21162151

21172152
int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21182153
const char *servers[],
2119-
const struct sockaddr *servers_sa[])
2154+
const struct sockaddr *servers_sa[],
2155+
enum dns_server_source source)
21202156
{
21212157
return do_dns_resolve_reconfigure(ctx,
21222158
servers,
21232159
servers_sa,
21242160
NULL,
21252161
IS_ENABLED(CONFIG_DNS_RECONFIGURE_CLEANUP) ?
2126-
true : false);
2162+
true : false,
2163+
source);
21272164
}
21282165

21292166
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)

tests/net/lib/dns_addremove/src/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,8 @@ ZTEST(dns_addremove, test_dns_reconfigure_callback)
466466
"Timeout while waiting for DNS added callback");
467467
}
468468

469-
ret = dns_resolve_reconfigure(&resv_ipv4, dns2_servers_str, NULL);
469+
ret = dns_resolve_reconfigure(&resv_ipv4, dns2_servers_str, NULL,
470+
DNS_SOURCE_MANUAL);
470471
zassert_equal(ret, 0, "Cannot reconfigure DNS server");
471472

472473
/* Wait for DNS removed callback after reconfiguring DNS */

0 commit comments

Comments
 (0)