Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: cleanup listerner handling in session.c
To:
tech@openbsd.org
Date:
Thu, 13 Nov 2025 11:09:41 +0100

Download raw body.

Thread
I dislike how the listener handling in session.c RECONF_DONE is spread
over multiple functions. Just move everything into one place
(setup_listeners) and call it a day.

I think the result is much simpler to read.
-- 
:wq Claudio

Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
diff -u -p -r1.527 session.c
--- session.c	30 Oct 2025 12:43:18 -0000	1.527
+++ session.c	13 Nov 2025 09:40:03 -0000
@@ -108,10 +108,24 @@ int
 setup_listeners(u_int *la_cnt)
 {
 	int			 ttl = 255;
-	struct listen_addr	*la;
+	struct listen_addr	*la, *next;
 	u_int			 cnt = 0;
 
-	TAILQ_FOREACH(la, conf->listen_addrs, entry) {
+	/* add new listeners */
+	TAILQ_CONCAT(conf->listen_addrs, nconf->listen_addrs, entry);
+
+	TAILQ_FOREACH_SAFE(la, conf->listen_addrs, entry, next) {
+		/* check for and delete no longer used listeners */
+		if (la->reconf == RECONF_NONE) {
+			log_info("not listening on %s any more",
+			    log_sockaddr((struct sockaddr *)
+			    &la->sa, la->sa_len));
+			TAILQ_REMOVE(conf->listen_addrs, la, entry);
+			close(la->fd);
+			free(la);
+			continue;
+		}
+
 		la->reconf = RECONF_NONE;
 		cnt++;
 
@@ -1173,7 +1187,7 @@ session_dispatch_imsg(struct imsgbuf *im
 	struct mrt		*mrt;
 	struct imsgbuf		*i;
 	struct peer		*p;
-	struct listen_addr	*la, *next, nla;
+	struct listen_addr	*la, nla;
 	struct session_dependon	 sdon;
 	struct bgpd_config	 tconf;
 	uint32_t		 peerid;
@@ -1342,25 +1356,8 @@ session_dispatch_imsg(struct imsgbuf *im
 			copy_config(conf, nconf);
 			merge_peers(conf, nconf);
 
-			/* delete old listeners */
-			TAILQ_FOREACH_SAFE(la, conf->listen_addrs, entry,
-			    next) {
-				if (la->reconf == RECONF_NONE) {
-					log_info("not listening on %s any more",
-					    log_sockaddr((struct sockaddr *)
-					    &la->sa, la->sa_len));
-					TAILQ_REMOVE(conf->listen_addrs, la,
-					    entry);
-					close(la->fd);
-					free(la);
-				}
-			}
-
-			/* add new listeners */
-			TAILQ_CONCAT(conf->listen_addrs, nconf->listen_addrs,
-			    entry);
-
 			setup_listeners(listener_cnt);
+
 			free_config(nconf);
 			nconf = NULL;
 			pending_reconf = 0;