Hi Jason, On Fri, 2022-06-24 at 17:55 -0700, Gerd Rausch wrote: > In other words, I don't see how the STALE case was covered, and I'd have > to guess wether the -ENODATA coupling was intentional or accidental. > > Now it may be perfectly possible to just make the "neigh_event_send" > call above unconditional and call it a day. > > I mean, simpler fixes always win over more complex ones. > > But, I personally don't know the twists & turns of this code well enough > to be able to assert that this won't leave any non-covered conditional > corner cases. I certainly hadn't tested that. > I finally got around to trying the much simpler fix, and it appears to work just as well: --------%<--------%<--------%<--------%<--------%<--------%<-------- --- drivers/infiniband/core/addr.c- +++ drivers/infiniband/core/addr.c @@ -336,11 +336,11 @@ static int dst_fetch_ha(const struct dst return -ENODATA; if (!(n->nud_state & NUD_VALID)) { - neigh_event_send(n, NULL); ret = -ENODATA; } else { neigh_ha_snapshot(dev_addr->dst_dev_addr, n, dst->dev); } + neigh_event_send(n, NULL); neigh_release(n); --------%<--------%<--------%<--------%<--------%<--------%<-------- Tested with IPv4 only, but this should work just as well with IPv6: STALE neighbor entries transition to DELAY -> REACHABLE with this change, i.e. the entries get updated. Thanks, Gerd