Download raw body.
bgpd: cleanup listerner handling in session.c
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;
bgpd: cleanup listerner handling in session.c