diff --git a/subsys/net/ip/ipv6_nbr.c b/subsys/net/ip/ipv6_nbr.c index bace919c3cbd2..73ec23b4c54fb 100644 --- a/subsys/net/ip/ipv6_nbr.c +++ b/subsys/net/ip/ipv6_nbr.c @@ -1549,7 +1549,7 @@ static void ipv6_nd_reachable_timeout(struct k_work *work) data->ns_count); ret = net_ipv6_send_ns(nbr->iface, NULL, NULL, - NULL, &data->addr, + &data->addr, &data->addr, false); if (ret < 0) { NET_DBG("Cannot send NS (%d)", ret); @@ -1727,7 +1727,7 @@ static inline bool handle_na_neighbor(struct net_pkt *pkt, if (na_hdr->flags & NET_ICMPV6_NA_FLAG_OVERRIDE || (!(na_hdr->flags & NET_ICMPV6_NA_FLAG_OVERRIDE) && - tllao_offset && !lladdr_changed)) { + !lladdr_changed)) { if (lladdr_changed) { dbg_update_neighbor_lladdr_raw( @@ -2559,12 +2559,6 @@ static int handle_ra_input(struct net_icmp_ctx *ctx, nd_opt_hdr = (struct net_icmpv6_nd_opt_hdr *) net_pkt_get_data(pkt, &nd_access); - /* Add neighbor cache entry using link local address, regardless of link layer address - * presence in Router Advertisement. - */ - nbr = net_ipv6_nbr_add(net_pkt_iface(pkt), (struct in6_addr *)NET_IPV6_HDR(pkt)->src, NULL, - true, NET_IPV6_NBR_STATE_INCOMPLETE); - while (nd_opt_hdr) { net_pkt_acknowledge_data(pkt, &nd_access); @@ -2665,6 +2659,15 @@ static int handle_ra_input(struct net_icmp_ctx *ctx, net_pkt_get_data(pkt, &nd_access); } + if (nbr == NULL) { + /* Add neighbor cache entry using link local address, regardless + * of link layer address presence in Router Advertisement. + */ + nbr = net_ipv6_nbr_add(net_pkt_iface(pkt), + (struct in6_addr *)NET_IPV6_HDR(pkt)->src, + NULL, true, NET_IPV6_NBR_STATE_INCOMPLETE); + } + router = net_if_ipv6_router_lookup(net_pkt_iface(pkt), (struct in6_addr *)ip_hdr->src); if (router) {