That last usage of ss_len in bgpctl is there to print the local and remote
connection info. Now there are two options, a) pass or deduce the length
or b) don't use sockaddr_storage to pass this data around.
Now after a bit of back and forth I decided to go for b) since it
simplifies some code in bgpd and also bgpctl becomes a bit lighter.
So this diff does exactly that.

-- 
:wq Claudio

Index: bgpctl/bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
retrieving revision 1.233
diff -u -p -r1.233 bgpctl.c
--- bgpctl/bgpctl.c     25 Feb 2019 11:51:58 -0000      1.233
+++ bgpctl/bgpctl.c     26 Feb 2019 10:18:49 -0000
@@ -657,7 +657,7 @@ show_neighbor_msg(struct imsg *imsg, enu
        struct peer             *p;
        struct ctl_timer        *t;
        struct in_addr           ina;
-       char                     buf[NI_MAXHOST], pbuf[NI_MAXSERV], *s;
+       char                    *s;
        int                      hascapamp = 0;
        u_int8_t                 i;
 
@@ -759,25 +759,11 @@ show_neighbor_msg(struct imsg *imsg, enu
                        if (errstr)
                                printf("  Last error: %s\n\n", errstr);
                } else {
-                       if (getnameinfo((struct sockaddr *)&p->sa_local,
-                           (socklen_t)p->sa_local.ss_len,
-                           buf, sizeof(buf), pbuf, sizeof(pbuf),
-                           NI_NUMERICHOST | NI_NUMERICSERV)) {
-                               strlcpy(buf, "(unknown)", sizeof(buf));
-                               strlcpy(pbuf, "", sizeof(pbuf));
-                       }
-                       printf("  Local host:  %20s, Local port:  %5s\n", buf,
-                           pbuf);
+                       printf("  Local host:  %20s, Local port:  %5u\n",
+                           log_addr(&p->local), p->local_port);
 
-                       if (getnameinfo((struct sockaddr *)&p->sa_remote,
-                           (socklen_t)p->sa_remote.ss_len,
-                           buf, sizeof(buf), pbuf, sizeof(pbuf),
-                           NI_NUMERICHOST | NI_NUMERICSERV)) {
-                               strlcpy(buf, "(unknown)", sizeof(buf));
-                               strlcpy(pbuf, "", sizeof(pbuf));
-                       }
-                       printf("  Remote host: %20s, Remote port: %5s\n", buf,
-                           pbuf);
+                       printf("  Remote host: %20s, Remote port: %5u\n",
+                           log_addr(&p->remote), p->remote_port);
                        printf("\n");
                }
                break;
Index: bgpctl/parser.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/parser.c,v
retrieving revision 1.91
diff -u -p -r1.91 parser.c
--- bgpctl/parser.c     18 Feb 2019 21:10:25 -0000      1.91
+++ bgpctl/parser.c     26 Feb 2019 10:19:10 -0000
@@ -944,7 +944,7 @@ parse_addr(const char *word, struct bgpd
        hints.ai_socktype = SOCK_DGRAM; /*dummy*/
        hints.ai_flags = AI_NUMERICHOST;
        if (getaddrinfo(word, "0", &hints, &r) == 0) {
-               sa2addr(r->ai_addr, addr);
+               sa2addr(r->ai_addr, addr, NULL);
                freeaddrinfo(r);
                return (1);
        }
Index: bgpd/bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.374
diff -u -p -r1.374 bgpd.h
--- bgpd/bgpd.h 21 Feb 2019 11:17:22 -0000      1.374
+++ bgpd/bgpd.h 26 Feb 2019 10:15:47 -0000
@@ -1301,7 +1301,7 @@ int                afi2aid(u_int16_t, u_int8_t, u_int
 sa_family_t     aid2af(u_int8_t);
 int             af2aid(sa_family_t, u_int8_t, u_int8_t *);
 struct sockaddr        *addr2sa(struct bgpd_addr *, u_int16_t, socklen_t *);
-void            sa2addr(struct sockaddr *, struct bgpd_addr *);
+void            sa2addr(struct sockaddr *, struct bgpd_addr *, u_int16_t *);
 const char *    get_baudrate(unsigned long long, char *);
 
 static const char * const log_procnames[] = {
Index: bgpd/config.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/config.c,v
retrieving revision 1.83
diff -u -p -r1.83 config.c
--- bgpd/config.c       18 Feb 2019 09:58:19 -0000      1.83
+++ bgpd/config.c       26 Feb 2019 10:16:16 -0000
@@ -367,7 +367,7 @@ host_ip(const char *s, struct bgpd_addr 
        hints.ai_flags = AI_NUMERICHOST;
        if (getaddrinfo(s, NULL, &hints, &res) == 0) {
                *len = res->ai_family == AF_INET6 ? 128 : 32;
-               sa2addr(res->ai_addr, h);
+               sa2addr(res->ai_addr, h, NULL);
                freeaddrinfo(res);
        } else {        /* ie. for 10/8 parsing */
                if ((bits = inet_net_pton(AF_INET, s, &h->v4, sizeof(h->v4))) 
== -1)
Index: bgpd/mrt.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/mrt.c,v
retrieving revision 1.92
diff -u -p -r1.92 mrt.c
--- bgpd/mrt.c  14 Feb 2019 13:13:33 -0000      1.92
+++ bgpd/mrt.c  25 Feb 2019 14:47:01 -0000
@@ -712,15 +712,15 @@ mrt_dump_hdr_se(struct ibuf ** bp, struc
        DUMP_SHORT(*bp, type);
        DUMP_SHORT(*bp, subtype);
 
-       switch (peer->sa_local.ss_family) {
-       case AF_INET:
+       switch (peer->local.aid) {
+       case AID_INET:
                if (subtype == BGP4MP_STATE_CHANGE_AS4 ||
                    subtype == BGP4MP_MESSAGE_AS4)
                        len += MRT_BGP4MP_ET_AS4_IPv4_HEADER_SIZE;
                else
                        len += MRT_BGP4MP_ET_IPv4_HEADER_SIZE;
                break;
-       case AF_INET6:
+       case AID_INET6:
                if (subtype == BGP4MP_STATE_CHANGE_AS4 ||
                    subtype == BGP4MP_MESSAGE_AS4)
                        len += MRT_BGP4MP_ET_AS4_IPv6_HEADER_SIZE;
@@ -755,36 +755,30 @@ mrt_dump_hdr_se(struct ibuf ** bp, struc
 
        DUMP_SHORT(*bp, /* ifindex */ 0);
 
-       switch (peer->sa_local.ss_family) {
-       case AF_INET:
+       switch (peer->local.aid) {
+       case AID_INET:
                DUMP_SHORT(*bp, AFI_IPv4);
                if (!swap)
-                       DUMP_NLONG(*bp, ((struct sockaddr_in *)
-                           &peer->sa_local)->sin_addr.s_addr);
-               DUMP_NLONG(*bp,
-                   ((struct sockaddr_in *)&peer->sa_remote)->sin_addr.s_addr);
+                       DUMP_NLONG(*bp, peer->local.v4.s_addr);
+               DUMP_NLONG(*bp, peer->remote.v4.s_addr);
                if (swap)
-                       DUMP_NLONG(*bp, ((struct sockaddr_in *)
-                           &peer->sa_local)->sin_addr.s_addr);
+                       DUMP_NLONG(*bp, peer->local.v4.s_addr);
                break;
-       case AF_INET6:
+       case AID_INET6:
                DUMP_SHORT(*bp, AFI_IPv6);
                if (!swap)
-                       if (ibuf_add(*bp, &((struct sockaddr_in6 *)
-                           &peer->sa_local)->sin6_addr,
+                       if (ibuf_add(*bp, &peer->local.v6,
                            sizeof(struct in6_addr)) == -1) {
                                log_warn("mrt_dump_hdr_se: ibuf_add error");
                                goto fail;
                        }
-               if (ibuf_add(*bp,
-                   &((struct sockaddr_in6 *)&peer->sa_remote)->sin6_addr,
+               if (ibuf_add(*bp, &peer->remote.v6,
                    sizeof(struct in6_addr)) == -1) {
                        log_warn("mrt_dump_hdr_se: ibuf_add error");
                        goto fail;
                }
                if (swap)
-                       if (ibuf_add(*bp, &((struct sockaddr_in6 *)
-                           &peer->sa_local)->sin6_addr,
+                       if (ibuf_add(*bp, &peer->local.v6,
                            sizeof(struct in6_addr)) == -1) {
                                log_warn("mrt_dump_hdr_se: ibuf_add error");
                                goto fail;
Index: bgpd/rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.463
diff -u -p -r1.463 rde.c
--- bgpd/rde.c  14 Feb 2019 10:34:54 -0000      1.463
+++ bgpd/rde.c  26 Feb 2019 10:16:45 -0000
@@ -3366,7 +3366,7 @@ peer_localaddrs(struct rde_peer *peer, s
                        if (ifa->ifa_addr->sa_family ==
                            match->ifa_addr->sa_family)
                                ifa = match;
-                       sa2addr(ifa->ifa_addr, &peer->local_v4_addr);
+                       sa2addr(ifa->ifa_addr, &peer->local_v4_addr, NULL);
                        break;
                }
        }
@@ -3387,7 +3387,7 @@ peer_localaddrs(struct rde_peer *peer, s
                            &((struct sockaddr_in6 *)ifa->
                            ifa_addr)->sin6_addr))
                                continue;
-                       sa2addr(ifa->ifa_addr, &peer->local_v6_addr);
+                       sa2addr(ifa->ifa_addr, &peer->local_v6_addr, NULL);
                        break;
                }
        }
Index: bgpd/session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
retrieving revision 1.373
diff -u -p -r1.373 session.c
--- bgpd/session.c      18 Feb 2019 09:43:57 -0000      1.373
+++ bgpd/session.c      26 Feb 2019 10:15:28 -0000
@@ -1263,16 +1263,17 @@ session_setup_socket(struct peer *p)
 void
 session_tcp_established(struct peer *peer)
 {
-       socklen_t       len;
+       struct sockaddr_storage ss;
+       socklen_t               len;
 
-       len = sizeof(peer->sa_local);
-       if (getsockname(peer->fd, (struct sockaddr *)&peer->sa_local,
-           &len) == -1)
+       len = sizeof(ss);
+       if (getsockname(peer->fd, (struct sockaddr *)&ss, &len) == -1)
                log_warn("getsockname");
-       len = sizeof(peer->sa_remote);
-       if (getpeername(peer->fd, (struct sockaddr *)&peer->sa_remote,
-           &len) == -1)
+       sa2addr((struct sockaddr *)&ss, &peer->local, &peer->local_port);
+       len = sizeof(ss);
+       if (getpeername(peer->fd, (struct sockaddr *)&ss, &len) == -1)
                log_warn("getpeername");
+       sa2addr((struct sockaddr *)&ss, &peer->remote, &peer->remote_port);
 }
 
 void
@@ -3068,7 +3069,7 @@ getpeerbyip(struct sockaddr *ip)
        struct peer     *p, *newpeer, *loose = NULL;
        u_int32_t        id;
 
-       sa2addr(ip, &addr);
+       sa2addr(ip, &addr, NULL);
 
        /* we might want a more effective way to find peers by IP */
        for (p = peers; p != NULL; p = p->next)
@@ -3150,7 +3151,7 @@ session_template_clone(struct peer *p, s
        struct bgpd_addr        remote_addr;
 
        if (ip)
-               sa2addr(ip, &remote_addr);
+               sa2addr(ip, &remote_addr, NULL);
        else
                memcpy(&remote_addr, &p->conf.remote_addr, sizeof(remote_addr));
 
@@ -3226,8 +3227,8 @@ session_up(struct peer *p)
            &p->conf, sizeof(p->conf)) == -1)
                fatalx("imsg_compose error");
 
-       sa2addr((struct sockaddr *)&p->sa_local, &sup.local_addr);
-       sa2addr((struct sockaddr *)&p->sa_remote, &sup.remote_addr);
+       sup.local_addr = p->local;
+       sup.remote_addr = p->remote;
 
        sup.remote_bgpid = p->remote_bgpid;
        sup.short_as = p->short_as;
Index: bgpd/session.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.h,v
retrieving revision 1.132
diff -u -p -r1.132 session.h
--- bgpd/session.h      19 Feb 2019 09:13:23 -0000      1.132
+++ bgpd/session.h      25 Feb 2019 15:58:21 -0000
@@ -208,8 +208,8 @@ struct peer {
                enum auth_method        method;
                u_int8_t                established;
        } auth;
-       struct sockaddr_storage  sa_local;
-       struct sockaddr_storage  sa_remote;
+       struct bgpd_addr         local;
+       struct bgpd_addr         remote;
        struct peer_timer_head   timers;
        struct msgbuf            wbuf;
        struct ibuf_read        *rbuf;
@@ -224,6 +224,8 @@ struct peer {
        enum session_state       prev_state;
        u_int16_t                short_as;
        u_int16_t                holdtime;
+       u_int16_t                local_port;
+       u_int16_t                remote_port;
        u_int8_t                 depend_ok;
        u_int8_t                 demoted;
        u_int8_t                 passive;
Index: bgpd/util.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
retrieving revision 1.46
diff -u -p -r1.46 util.c
--- bgpd/util.c 21 Feb 2019 11:17:22 -0000      1.46
+++ bgpd/util.c 26 Feb 2019 10:14:24 -0000
@@ -866,7 +866,7 @@ addr2sa(struct bgpd_addr *addr, u_int16_
 }
 
 void
-sa2addr(struct sockaddr *sa, struct bgpd_addr *addr)
+sa2addr(struct sockaddr *sa, struct bgpd_addr *addr, u_int16_t *port)
 {
        struct sockaddr_in              *sa_in = (struct sockaddr_in *)sa;
        struct sockaddr_in6             *sa_in6 = (struct sockaddr_in6 *)sa;
@@ -876,11 +876,15 @@ sa2addr(struct sockaddr *sa, struct bgpd
        case AF_INET:
                addr->aid = AID_INET;
                memcpy(&addr->v4, &sa_in->sin_addr, sizeof(addr->v4));
+               if (port)
+                       *port = ntohs(sa_in->sin_port);
                break;
        case AF_INET6:
                addr->aid = AID_INET6;
                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);
                break;
        }
 }

Reply via email to