neigh: Support IPv6 neighbor/node discovery to fix service handling
neigh: Support IPv6 neighbor/node discovery to fix service handling

See commit 794ce347d1e5 ("neigh: Rework ARP handling to let the kernel do
the resolution") for full context of this work. 794ce347d1e5 only addressed
IPv4 / ARP handling since up to now, only IPv4 neighbor discovery was ever
supported by the agent.

However, as stated in 794ce347d1e5 and also demonstrated on user side such
as issue #17693, the lack of IPv6 neighbor discovery is hurting KPR with
backends residing in the same L2 domain as it may lead to drops when trying
to forward to backends and fib lookup fails from BPF side.

Thanks to the fact that we offload the discovery itself into the kernel,
adding IPv6 neighbor/node discovery is fairly straight forward. We're adding
a neighNextHopByNode6[] map with Identity to nextHop mapping, and otherwise
reuse neighNextHopRefCount/neighByNextHop/neighLastPingByNextHop maps where
the address string is being used as key since it won't lead to collisions
there.

Common functionality to IPv4/6 is moved into insertNeighborCommon() as well
as deleteNeighborCommon(). insertNeighbor() tries to call both insertNeighbor4()
and insertNeighbor6() if the node addressing allows for it.

Fixes: #17693
Signed-off-by: Daniel Borkmann <3d0f3b9ddcacec30c4008c5e030e6c13a478cb4f@iogearbox.net>

cilium/cilium,michi-covalent/cilium,michi-covalent/cilium,michi-covalent/cilium,cilium/cilium,cilium/cilium,michi-covalent/cilium,michi-covalent/cilium,cilium/cilium,cilium/cilium