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; } }