[prev in list] [next in list] [prev in thread] [next in thread]
List: openbsd-tech
Subject: bgpd another sockaddr conversion
From: Claudio Jeker <cjeker () diehard ! n-r-g ! com>
Date: 2019-02-26 10:34:56
Message-ID: 20190226103456.GA72646 () diehard ! n-r-g ! com
[Download RAW message or body]
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;
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic