Skip to content

Commit 2508420

Browse files
jukkarkartben
authored andcommitted
net: dhcp: Remove only added DNS servers when stopping
Make sure that we remove only the added DNS servers when the DHCP is stopped. Signed-off-by: Jukka Rissanen <[email protected]>
1 parent cdc6c32 commit 2508420

File tree

4 files changed

+50
-5
lines changed

4 files changed

+50
-5
lines changed

include/zephyr/net/dns_resolve.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,19 @@ int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx,
594594
*/
595595
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index);
596596

597+
/**
598+
* @brief Remove servers from the DNS resolving context that were added by
599+
* a specific source.
600+
*
601+
* @param ctx DNS context
602+
* @param if_index Network interface from which the DNS servers are removed.
603+
* @param source Source of the DNS servers, e.g., manual, DHCPv4/6, etc.
604+
*
605+
* @return 0 if ok, <0 if error.
606+
*/
607+
int dns_resolve_remove_source(struct dns_resolve_context *ctx, int if_index,
608+
enum dns_server_source source);
609+
597610
/**
598611
* @brief Cancel a pending DNS query.
599612
*

subsys/net/lib/dhcpv4/dhcpv4.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,8 +1691,9 @@ static void dhcpv4_iface_event_handler(struct net_mgmt_event_callback *cb,
16911691
* comes back up.
16921692
*/
16931693
if (IS_ENABLED(CONFIG_NET_DHCPV4_DNS_SERVER_VIA_INTERFACE)) {
1694-
dns_resolve_remove(dns_resolve_get_default(),
1695-
net_if_get_by_iface(iface));
1694+
dns_resolve_remove_source(dns_resolve_get_default(),
1695+
net_if_get_by_iface(iface),
1696+
DNS_SOURCE_DHCPV4);
16961697
}
16971698
}
16981699
} else if (mgmt_event == NET_EVENT_IF_UP) {
@@ -1966,6 +1967,12 @@ void net_dhcpv4_stop(struct net_if *iface)
19661967
NET_DBG("state=%s",
19671968
net_dhcpv4_state_name(iface->config.dhcpv4.state));
19681969

1970+
if (IS_ENABLED(CONFIG_NET_DHCPV4_DNS_SERVER_VIA_INTERFACE)) {
1971+
dns_resolve_remove_source(dns_resolve_get_default(),
1972+
net_if_get_by_iface(iface),
1973+
DNS_SOURCE_DHCPV4);
1974+
}
1975+
19691976
sys_slist_find_and_remove(&dhcpv4_ifaces,
19701977
&iface->config.dhcpv4.node);
19711978

subsys/net/lib/dhcpv6/dhcpv6.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,8 +2226,9 @@ static void dhcpv6_iface_event_handler(struct net_mgmt_event_callback *cb,
22262226
* comes back up.
22272227
*/
22282228
if (IS_ENABLED(CONFIG_NET_DHCPV6_DNS_SERVER_VIA_INTERFACE)) {
2229-
dns_resolve_remove(dns_resolve_get_default(),
2230-
net_if_get_by_iface(iface));
2229+
dns_resolve_remove_source(dns_resolve_get_default(),
2230+
net_if_get_by_iface(iface),
2231+
DNS_SOURCE_DHCPV6);
22312232
}
22322233
} else if (mgmt_event == NET_EVENT_IF_UP) {
22332234
NET_DBG("Interface %p coming up", iface);
@@ -2323,6 +2324,12 @@ void net_dhcpv6_stop(struct net_if *iface)
23232324

23242325
(void)dhcpv6_enter_state(iface, NET_DHCPV6_DISABLED);
23252326

2327+
if (IS_ENABLED(CONFIG_NET_DHCPV6_DNS_SERVER_VIA_INTERFACE)) {
2328+
dns_resolve_remove_source(dns_resolve_get_default(),
2329+
net_if_get_by_iface(iface),
2330+
DNS_SOURCE_DHCPV6);
2331+
}
2332+
23262333
sys_slist_find_and_remove(&dhcpv6_ifaces,
23272334
&iface->config.dhcpv6.node);
23282335

subsys/net/lib/dns/resolve.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2209,7 +2209,9 @@ int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
22092209
source);
22102210
}
22112211

2212-
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
2212+
static int dns_resolve_remove_and_check_source(struct dns_resolve_context *ctx, int if_index,
2213+
bool check_source,
2214+
enum dns_server_source source)
22132215
{
22142216
int i;
22152217
int ret = -ENOENT;
@@ -2234,6 +2236,10 @@ int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
22342236
continue;
22352237
}
22362238

2239+
if (check_source && ctx->servers[i].source != source) {
2240+
continue;
2241+
}
2242+
22372243
ctx->servers[i].if_index = 0;
22382244

22392245
/* See comment in dns_resolve_close_locked() about
@@ -2255,6 +2261,18 @@ int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
22552261
return st;
22562262
}
22572263

2264+
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
2265+
{
2266+
return dns_resolve_remove_and_check_source(ctx, if_index, false,
2267+
DNS_SOURCE_UNKNOWN);
2268+
}
2269+
2270+
int dns_resolve_remove_source(struct dns_resolve_context *ctx, int if_index,
2271+
enum dns_server_source source)
2272+
{
2273+
return dns_resolve_remove_and_check_source(ctx, if_index, true, source);
2274+
}
2275+
22582276
struct dns_resolve_context *dns_resolve_get_default(void)
22592277
{
22602278
return &dns_default_ctx;

0 commit comments

Comments
 (0)