Copy the version of the __KAME__ hack from route/show.c and more
importantly copy the address after modifying the sa.
This only affects IPv6 link local addresses which are not really used by
bgpd. Still happy if a few more people can give this a spin.
--
:wq Claudio
? obj
Index: util.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
retrieving revision 1.64
diff -u -p -r1.64 util.c
--- util.c 16 Jun 2022 15:33:05 -0000 1.64
+++ util.c 16 Jun 2022 15:46:09 -0000
@@ -897,24 +897,24 @@ sa2addr(struct sockaddr *sa, struct bgpd
break;
case AF_INET6:
addr->aid = AID_INET6;
- memcpy(&addr->v6, &sa_in6->sin6_addr, sizeof(addr->v6));
#ifdef __KAME__
/*
* XXX thanks, KAME, for this ugliness...
* adopted from route/show.c
*/
- if (IN6_IS_ADDR_LINKLOCAL(&sa_in6->sin6_addr) ||
- IN6_IS_ADDR_MC_LINKLOCAL(&sa_in6->sin6_addr)) {
+ if ((IN6_IS_ADDR_LINKLOCAL(&sa_in6->sin6_addr) ||
+ IN6_IS_ADDR_MC_LINKLOCAL(&sa_in6->sin6_addr) ||
+ IN6_IS_ADDR_MC_INTFACELOCAL(&sa_in6->sin6_addr)) &&
+ sa_in6->sin6_scope_id == 0) {
uint16_t tmp16;
memcpy(&tmp16, &sa_in6->sin6_addr.s6_addr[2],
sizeof(tmp16));
- if (tmp16 != 0) {
- sa_in6->sin6_scope_id = ntohs(tmp16);
- sa_in6->sin6_addr.s6_addr[2] = 0;
- sa_in6->sin6_addr.s6_addr[3] = 0;
- }
+ sa_in6->sin6_scope_id = ntohs(tmp16);
+ sa_in6->sin6_addr.s6_addr[2] = 0;
+ sa_in6->sin6_addr.s6_addr[3] = 0;
}
#endif
+ memcpy(&addr->v6, &sa_in6->sin6_addr, sizeof(addr->v6));
addr->scope_id = sa_in6->sin6_scope_id; /* I hate v6 */
if (port)
*port = ntohs(sa_in6->sin6_port);