So this is probably a sensible next step to cleanup log_addr() a bit more.
Teach addr2sa() how to convert the VPN addresses into sockaddrs. The rd
and labelstack still needs to be handled by the caller.
OK?
--
:wq Claudio
Index: util.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
retrieving revision 1.56
diff -u -p -r1.56 util.c
--- util.c 4 Jan 2021 13:40:32 -0000 1.56
+++ util.c 4 Jan 2021 18:01:52 -0000
@@ -38,26 +38,21 @@ const char *
log_addr(const struct bgpd_addr *addr)
{
static char buf[74];
- char tbuf[40];
+ struct sockaddr *sa;
socklen_t len;
+ sa = addr2sa(addr, 0, &len);
switch (addr->aid) {
case AID_INET:
case AID_INET6:
- return log_sockaddr(addr2sa(addr, 0, &len), len);
+ return log_sockaddr(sa, len);
case AID_VPN_IPv4:
- if (inet_ntop(AF_INET, &addr->vpn4.addr, tbuf,
- sizeof(tbuf)) == NULL)
- return ("?");
snprintf(buf, sizeof(buf), "%s %s", log_rd(addr->vpn4.rd),
- tbuf);
+ log_sockaddr(sa, len));
return (buf);
case AID_VPN_IPv6:
- if (inet_ntop(aid2af(addr->aid), &addr->vpn6.addr, tbuf,
- sizeof(tbuf)) == NULL)
- return ("?");
snprintf(buf, sizeof(buf), "%s %s", log_rd(addr->vpn6.rd),
- tbuf);
+ log_sockaddr(sa, len));
return (buf);
}
return ("???");
@@ -92,7 +87,7 @@ log_sockaddr(struct sockaddr *sa, sockle
{
static char buf[NI_MAXHOST];
- if (getnameinfo(sa, len, buf, sizeof(buf), NULL, 0,
+ if (sa == NULL || getnameinfo(sa, len, buf, sizeof(buf), NULL, 0,
NI_NUMERICHOST))
return ("(unknown)");
else
@@ -835,6 +830,10 @@ af2aid(sa_family_t af, u_int8_t safi, u_
return (-1);
}
+/*
+ * Convert a struct bgpd_addr into a struct sockaddr. For VPN addresses
+ * the included label stack is ignored and needs to be handled by the caller.
+ */
struct sockaddr *
addr2sa(const struct bgpd_addr *addr, u_int16_t port, socklen_t *len)
{
@@ -842,10 +841,10 @@ addr2sa(const struct bgpd_addr *addr, u_
struct sockaddr_in *sa_in = (struct sockaddr_in *)&ss;
struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)&ss;
- if (addr == NULL || addr->aid == AID_UNSPEC)
- return (NULL);
-
bzero(&ss, sizeof(ss));
+ if (addr == NULL)
+ return ((struct sockaddr *)&ss);
+
switch (addr->aid) {
case AID_INET:
sa_in->sin_family = AF_INET;
@@ -856,6 +855,20 @@ addr2sa(const struct bgpd_addr *addr, u_
case AID_INET6:
sa_in6->sin6_family = AF_INET6;
memcpy(&sa_in6->sin6_addr, &addr->v6,
+ sizeof(sa_in6->sin6_addr));
+ sa_in6->sin6_port = htons(port);
+ sa_in6->sin6_scope_id = addr->scope_id;
+ *len = sizeof(struct sockaddr_in6);
+ break;
+ case AID_VPN_IPv4:
+ sa_in->sin_family = AF_INET;
+ sa_in->sin_addr.s_addr = addr->vpn4.addr.s_addr;
+ sa_in->sin_port = htons(port);
+ *len = sizeof(struct sockaddr_in);
+ break;
+ case AID_VPN_IPv6:
+ sa_in6->sin6_family = AF_INET6;
+ memcpy(&sa_in6->sin6_addr, &addr->vpn6.addr,
sizeof(sa_in6->sin6_addr));
sa_in6->sin6_port = htons(port);
sa_in6->sin6_scope_id = addr->scope_id;