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;

Reply via email to