Skip to content

Commit cdc6c32

Browse files
jukkarkartben
authored andcommitted
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]>
1 parent 0310408 commit cdc6c32

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
@@ -44,6 +44,24 @@ enum dns_query_type {
4444
DNS_QUERY_TYPE_AAAA = 28
4545
};
4646

47+
/**
48+
* Entity that added the DNS server.
49+
*/
50+
enum dns_server_source {
51+
/** Source is unknown */
52+
DNS_SOURCE_UNKNOWN = 0,
53+
/** Server information is added manually, for example by an application */
54+
DNS_SOURCE_MANUAL,
55+
/** Server information is from DHCPv4 server */
56+
DNS_SOURCE_DHCPV4,
57+
/** Server information is from DHCPv6 server */
58+
DNS_SOURCE_DHCPV6,
59+
/** Server information is from IPv6 SLAAC (router advertisement) */
60+
DNS_SOURCE_IPV6_RA,
61+
/** Server information is from PPP */
62+
DNS_SOURCE_PPP,
63+
};
64+
4765
/** Max size of the resolved name. */
4866
#if defined(CONFIG_DNS_RESOLVER_MAX_NAME_LEN)
4967
#define DNS_MAX_NAME_SIZE CONFIG_DNS_RESOLVER_MAX_NAME_LEN
@@ -353,6 +371,9 @@ struct dns_resolve_context {
353371
*/
354372
int if_index;
355373

374+
/** Source of the DNS server, e.g., manual, DHCPv4/6, etc. */
375+
enum dns_server_source source;
376+
356377
/** Is this server mDNS one */
357378
uint8_t is_mdns : 1;
358379

@@ -526,12 +547,14 @@ int dns_resolve_close(struct dns_resolve_context *ctx);
526547
* @param servers_sa DNS server addresses as struct sockaddr. The array
527548
* is NULL terminated. Port numbers are optional in struct sockaddr, the
528549
* default will be used if set to 0.
550+
* @param source Source of the DNS servers, e.g., manual, DHCPv4/6, etc.
529551
*
530552
* @return 0 if ok, <0 if error.
531553
*/
532554
int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
533555
const char *servers_str[],
534-
const struct sockaddr *servers_sa[]);
556+
const struct sockaddr *servers_sa[],
557+
enum dns_server_source source);
535558

536559
/**
537560
* @brief Reconfigure DNS resolving context with new server list and
@@ -551,13 +574,15 @@ int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
551574
* @param interfaces Network interfaces to which the DNS servers are bound.
552575
* This is an array of network interface indices. The array must be
553576
* the same length as the servers_str and servers_sa arrays.
577+
* @param source Source of the DNS servers, e.g., manual, DHCPv4/6, etc.
554578
*
555579
* @return 0 if ok, <0 if error.
556580
*/
557581
int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx,
558582
const char *servers_str[],
559583
const struct sockaddr *servers_sa[],
560-
int interfaces[]);
584+
int interfaces[],
585+
enum dns_server_source source);
561586

562587
/**
563588
* @brief Remove servers from the DNS resolving context.
@@ -747,6 +772,15 @@ static inline int dns_cancel_addr_info(uint16_t dns_id)
747772

748773
/** @cond INTERNAL_HIDDEN */
749774

775+
/**
776+
* @brief Get string representation of the DNS server source.
777+
*
778+
* @param source Source of the DNS server.
779+
*
780+
* @return String representation of the DNS server source.
781+
*/
782+
const char *dns_get_source_str(enum dns_server_source source);
783+
750784
/**
751785
* @brief Initialize DNS subsystem.
752786
*/

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
@@ -341,7 +341,8 @@ static void ipcp_set_dns_servers(struct ppp_fsm *fsm)
341341

342342
dnsctx = dns_resolve_get_default();
343343
ret = dns_resolve_reconfigure_with_interfaces(dnsctx, NULL, dns_servers,
344-
interfaces);
344+
interfaces,
345+
DNS_SOURCE_PPP);
345346
if (ret < 0) {
346347
NET_ERR("Could not set DNS servers");
347348
return;

subsys/net/lib/dhcpv4/dhcpv4.c

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

11951195
status = dns_resolve_reconfigure_with_interfaces(ctx, NULL,
11961196
dns_servers,
1197-
interfaces);
1197+
interfaces,
1198+
DNS_SOURCE_DHCPV4);
11981199
} else {
1199-
status = dns_resolve_reconfigure(ctx, NULL, dns_servers);
1200+
status = dns_resolve_reconfigure(ctx, NULL, dns_servers,
1201+
DNS_SOURCE_DHCPV4);
12001202
}
12011203

12021204
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

@@ -2101,7 +2132,8 @@ static int do_dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21012132
const char *servers[],
21022133
const struct sockaddr *servers_sa[],
21032134
int interfaces[],
2104-
bool do_close)
2135+
bool do_close,
2136+
enum dns_server_source source)
21052137
{
21062138
int err;
21072139

@@ -2138,7 +2170,8 @@ static int do_dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21382170

21392171
err = dns_resolve_init_locked(ctx, servers, servers_sa,
21402172
&resolve_svc, 0, interfaces,
2141-
do_close);
2173+
do_close,
2174+
source);
21422175

21432176
unlock:
21442177
k_mutex_unlock(&ctx->lock);
@@ -2150,26 +2183,30 @@ static int do_dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21502183
int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx,
21512184
const char *servers[],
21522185
const struct sockaddr *servers_sa[],
2153-
int interfaces[])
2186+
int interfaces[],
2187+
enum dns_server_source source)
21542188
{
21552189
return do_dns_resolve_reconfigure(ctx,
21562190
servers,
21572191
servers_sa,
21582192
interfaces,
21592193
IS_ENABLED(CONFIG_DNS_RECONFIGURE_CLEANUP) ?
2160-
true : false);
2194+
true : false,
2195+
source);
21612196
}
21622197

21632198
int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21642199
const char *servers[],
2165-
const struct sockaddr *servers_sa[])
2200+
const struct sockaddr *servers_sa[],
2201+
enum dns_server_source source)
21662202
{
21672203
return do_dns_resolve_reconfigure(ctx,
21682204
servers,
21692205
servers_sa,
21702206
NULL,
21712207
IS_ENABLED(CONFIG_DNS_RECONFIGURE_CLEANUP) ?
2172-
true : false);
2208+
true : false,
2209+
source);
21732210
}
21742211

21752212
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)