Skip to content

Commit 016a4a7

Browse files
jukkarrlubos
authored andcommitted
[nrf fromtree] 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]> (cherry picked from commit 2508420) Signed-off-by: Robert Lubos <[email protected]>
1 parent 7899597 commit 016a4a7

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
@@ -586,6 +586,19 @@ int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx,
586586
*/
587587
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index);
588588

589+
/**
590+
* @brief Remove servers from the DNS resolving context that were added by
591+
* a specific source.
592+
*
593+
* @param ctx DNS context
594+
* @param if_index Network interface from which the DNS servers are removed.
595+
* @param source Source of the DNS servers, e.g., manual, DHCPv4/6, etc.
596+
*
597+
* @return 0 if ok, <0 if error.
598+
*/
599+
int dns_resolve_remove_source(struct dns_resolve_context *ctx, int if_index,
600+
enum dns_server_source source);
601+
589602
/**
590603
* @brief Cancel a pending DNS query.
591604
*

subsys/net/lib/dhcpv4/dhcpv4.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,8 +1677,9 @@ static void dhcpv4_iface_event_handler(struct net_mgmt_event_callback *cb,
16771677
* comes back up.
16781678
*/
16791679
if (IS_ENABLED(CONFIG_NET_DHCPV4_DNS_SERVER_VIA_INTERFACE)) {
1680-
dns_resolve_remove(dns_resolve_get_default(),
1681-
net_if_get_by_iface(iface));
1680+
dns_resolve_remove_source(dns_resolve_get_default(),
1681+
net_if_get_by_iface(iface),
1682+
DNS_SOURCE_DHCPV4);
16821683
}
16831684
}
16841685
} else if (mgmt_event == NET_EVENT_IF_UP) {
@@ -1944,6 +1945,12 @@ void net_dhcpv4_stop(struct net_if *iface)
19441945
NET_DBG("state=%s",
19451946
net_dhcpv4_state_name(iface->config.dhcpv4.state));
19461947

1948+
if (IS_ENABLED(CONFIG_NET_DHCPV4_DNS_SERVER_VIA_INTERFACE)) {
1949+
dns_resolve_remove_source(dns_resolve_get_default(),
1950+
net_if_get_by_iface(iface),
1951+
DNS_SOURCE_DHCPV4);
1952+
}
1953+
19471954
sys_slist_find_and_remove(&dhcpv4_ifaces,
19481955
&iface->config.dhcpv4.node);
19491956

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
@@ -2163,7 +2163,9 @@ int dns_resolve_reconfigure(struct dns_resolve_context *ctx,
21632163
source);
21642164
}
21652165

2166-
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
2166+
static int dns_resolve_remove_and_check_source(struct dns_resolve_context *ctx, int if_index,
2167+
bool check_source,
2168+
enum dns_server_source source)
21672169
{
21682170
int i;
21692171
int ret = -ENOENT;
@@ -2188,6 +2190,10 @@ int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
21882190
continue;
21892191
}
21902192

2193+
if (check_source && ctx->servers[i].source != source) {
2194+
continue;
2195+
}
2196+
21912197
ctx->servers[i].if_index = 0;
21922198

21932199
/* See comment in dns_resolve_close_locked() about
@@ -2209,6 +2215,18 @@ int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
22092215
return st;
22102216
}
22112217

2218+
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
2219+
{
2220+
return dns_resolve_remove_and_check_source(ctx, if_index, false,
2221+
DNS_SOURCE_UNKNOWN);
2222+
}
2223+
2224+
int dns_resolve_remove_source(struct dns_resolve_context *ctx, int if_index,
2225+
enum dns_server_source source)
2226+
{
2227+
return dns_resolve_remove_and_check_source(ctx, if_index, true, source);
2228+
}
2229+
22122230
struct dns_resolve_context *dns_resolve_get_default(void)
22132231
{
22142232
return &dns_default_ctx;

0 commit comments

Comments
 (0)