Download raw body.
bgpd: consider IPv6 lladdr as connected
In the session engine get_alternate_addr() is used to figure out a)
the local address of the oposite address family and b) decide if the
connection is directly attached and in that case set the interface scope
for the session. This allows the remote end to send IPv6 link local nexthops.
Now especially with IFF_POINTOPOINT interfaces only deciding based on the
destination address is too strict. Many IPv6 P2P setups don't set the dest
addr or set it but still use link-local addresses on the link.
To fix this consider IPv6 connections from link local addresses as
connected. This should help when using IPv6 link local sessions.
--
:wq Claudio
Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
diff -u -p -r1.478 session.c
--- session.c 22 May 2024 08:41:14 -0000 1.478
+++ session.c 5 Jun 2024 08:46:46 -0000
@@ -1254,7 +1254,11 @@ get_alternate_addr(struct bgpd_addr *loc
match->ifa_addr->sa_family != AF_INET6)
continue;
if (sa_equal(local, match->ifa_addr)) {
- if (match->ifa_flags & IFF_POINTOPOINT &&
+ if (remote->aid == AID_INET6 &&
+ IN6_IS_ADDR_LINKLOCAL(&remote->v6)) {
+ /* IPv6 LLA are by definition connected */
+ connected = 1;
+ } else if (match->ifa_flags & IFF_POINTOPOINT &&
match->ifa_dstaddr != NULL) {
if (sa_equal(remote, match->ifa_dstaddr))
connected = 1;
bgpd: consider IPv6 lladdr as connected