From 47ee608a9b50b4dea0f48d9164e89a48104b4514 Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Mon, 17 Feb 2025 17:37:17 +0100 Subject: [PATCH] net: if: Setup DAD timer regardless of DAD query result In rare occasions when sending DAD NS packet fails, we should still setup the DAD timer, unless we implement some kind of more advanced retry mechanism. If we don't do that, the IPv6 address added to the interface will never be usable in such cases. Signed-off-by: Robert Lubos (cherry picked from commit 008a7ca2024cd0c28bcfd3f4e5a0ca91503341dc) --- subsys/net/ip/net_if.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/subsys/net/ip/net_if.c b/subsys/net/ip/net_if.c index b4ffff8a5f75..d1b6f3a69c53 100644 --- a/subsys/net/ip/net_if.c +++ b/subsys/net/ip/net_if.c @@ -1295,21 +1295,25 @@ void net_if_ipv6_start_dad(struct net_if *iface, ifaddr->dad_count = 1U; - if (!net_ipv6_start_dad(iface, ifaddr)) { - ifaddr->dad_start = k_uptime_get_32(); - ifaddr->ifindex = net_if_get_by_iface(iface); - - k_mutex_lock(&lock, K_FOREVER); - sys_slist_find_and_remove(&active_dad_timers, - &ifaddr->dad_node); - sys_slist_append(&active_dad_timers, &ifaddr->dad_node); - k_mutex_unlock(&lock); - - /* FUTURE: use schedule, not reschedule. */ - if (!k_work_delayable_remaining_get(&dad_timer)) { - k_work_reschedule(&dad_timer, - K_MSEC(DAD_TIMEOUT)); - } + if (net_ipv6_start_dad(iface, ifaddr) != 0) { + NET_ERR("Interface %p failed to send DAD query for %s", + iface, + net_sprint_ipv6_addr(&ifaddr->address.in6_addr)); + } + + ifaddr->dad_start = k_uptime_get_32(); + ifaddr->ifindex = net_if_get_by_iface(iface); + + k_mutex_lock(&lock, K_FOREVER); + sys_slist_find_and_remove(&active_dad_timers, + &ifaddr->dad_node); + sys_slist_append(&active_dad_timers, &ifaddr->dad_node); + k_mutex_unlock(&lock); + + /* FUTURE: use schedule, not reschedule. */ + if (!k_work_delayable_remaining_get(&dad_timer)) { + k_work_reschedule(&dad_timer, + K_MSEC(DAD_TIMEOUT)); } } else { NET_DBG("Interface %p is down, starting DAD for %s later.",