[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