Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: suffle functions for more sense
To:
tech@openbsd.org
Date:
Mon, 27 Apr 2026 17:16:28 +0200

Download raw body.

Thread
During softreconfiguration the order of operation is:
 - softreconfig in
 - softreconfig in done
 - softreconfig out
 - softrecondig out done
 - softreconfig done

So put the function into the same order. It reduces the amount
I have to scroll up and down.
-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
diff -u -p -r1.692 rde.c
--- rde.c	27 Apr 2026 15:06:01 -0000	1.692
+++ rde.c	27 Apr 2026 15:13:44 -0000
@@ -73,11 +73,11 @@ void		 rde_dump_mrt_new(struct mrt *, pi
 
 static void	 rde_commit_pftable(void);
 void		 rde_reload_done(void);
+static void	 rde_softreconfig_in(struct rib_entry *, void *);
 static void	 rde_softreconfig_in_done(void *, uint8_t);
+static void	 rde_softreconfig_out(struct rib_entry *, void *);
 static void	 rde_softreconfig_out_done(void *, uint8_t);
 static void	 rde_softreconfig_done(void);
-static void	 rde_softreconfig_out(struct rib_entry *, void *);
-static void	 rde_softreconfig_in(struct rib_entry *, void *);
 static void	 rde_softreconfig_sync_reeval(struct rib_entry *, void *);
 static void	 rde_softreconfig_sync_fib(struct rib_entry *, void *);
 static void	 rde_softreconfig_sync_done(void *, uint8_t);
@@ -4107,6 +4107,70 @@ rde_reload_done(void)
 }
 
 static void
+rde_softreconfig_in(struct rib_entry *re, void *bula)
+{
+	struct filterstate	 state;
+	struct rib		*rib;
+	struct prefix		*p;
+	struct pt_entry		*pt;
+	struct rde_peer		*peer;
+	struct rde_aspath	*asp;
+	enum filter_action	 action;
+	struct bgpd_addr	 prefix;
+	uint16_t		 i;
+	uint8_t			 aspa_vstate;
+
+	pt = re->prefix;
+	pt_getaddr(pt, &prefix);
+	TAILQ_FOREACH(p, &re->prefix_h, rib_l) {
+		asp = prefix_aspath(p);
+		peer = prefix_peer(p);
+
+		/* possible role change update ASPA validation state */
+		if (prefix_aspa_vstate(p) == ASPA_NEVER_KNOWN)
+			aspa_vstate = ASPA_NEVER_KNOWN;
+		else
+			aspa_vstate = rde_aspa_validity(peer, asp, pt->aid);
+		prefix_set_vstate(p, prefix_roa_vstate(p), aspa_vstate);
+
+		/* skip announced networks, they are never filtered */
+		if (asp->flags & F_PREFIX_ANNOUNCED)
+			continue;
+
+		for (i = RIB_LOC_START; i < rib_size; i++) {
+			rib = rib_byid(i);
+			if (rib == NULL)
+				continue;
+
+			if (rib->state != RECONF_RELOAD)
+				continue;
+
+			rde_filterstate_prep(&state, p);
+			action = rde_filter(rib->in_rules, peer, peer, &prefix,
+			    pt->prefixlen, &state);
+
+			if (action == ACTION_ALLOW) {
+				/* update Local-RIB */
+				prefix_update(rib, peer, p->path_id,
+				    p->path_id_tx, &state, 0,
+				    &prefix, pt->prefixlen);
+			} else if (conf->filtered_in_locrib &&
+			    i == RIB_LOC_START) {
+				prefix_update(rib, peer, p->path_id,
+				    p->path_id_tx, &state, 1,
+				    &prefix, pt->prefixlen);
+			} else {
+				/* remove from Local-RIB */
+				prefix_withdraw(rib, peer, p->path_id, &prefix,
+				    pt->prefixlen);
+			}
+
+			rde_filterstate_clean(&state);
+		}
+	}
+}
+
+static void
 rde_softreconfig_in_done(void *arg, uint8_t dummy)
 {
 	struct rde_peer	*peer;
@@ -4193,6 +4257,16 @@ rde_softreconfig_in_done(void *arg, uint
 }
 
 static void
+rde_softreconfig_out(struct rib_entry *re, void *arg)
+{
+	if (prefix_best(re) == NULL)
+		/* no valid path for prefix */
+		return;
+
+	rde_generate_updates(re, NULL, 0, EVAL_RECONF);
+}
+
+static void
 rde_softreconfig_out_done(void *arg, uint8_t aid)
 {
 	struct rib	*rib = arg;
@@ -4220,80 +4294,6 @@ rde_softreconfig_done(void)
 	log_info("RDE soft reconfiguration done");
 	imsg_compose(ibuf_main, IMSG_RECONF_DONE, 0, 0,
 	    -1, NULL, 0);
-}
-
-static void
-rde_softreconfig_in(struct rib_entry *re, void *bula)
-{
-	struct filterstate	 state;
-	struct rib		*rib;
-	struct prefix		*p;
-	struct pt_entry		*pt;
-	struct rde_peer		*peer;
-	struct rde_aspath	*asp;
-	enum filter_action	 action;
-	struct bgpd_addr	 prefix;
-	uint16_t		 i;
-	uint8_t			 aspa_vstate;
-
-	pt = re->prefix;
-	pt_getaddr(pt, &prefix);
-	TAILQ_FOREACH(p, &re->prefix_h, rib_l) {
-		asp = prefix_aspath(p);
-		peer = prefix_peer(p);
-
-		/* possible role change update ASPA validation state */
-		if (prefix_aspa_vstate(p) == ASPA_NEVER_KNOWN)
-			aspa_vstate = ASPA_NEVER_KNOWN;
-		else
-			aspa_vstate = rde_aspa_validity(peer, asp, pt->aid);
-		prefix_set_vstate(p, prefix_roa_vstate(p), aspa_vstate);
-
-		/* skip announced networks, they are never filtered */
-		if (asp->flags & F_PREFIX_ANNOUNCED)
-			continue;
-
-		for (i = RIB_LOC_START; i < rib_size; i++) {
-			rib = rib_byid(i);
-			if (rib == NULL)
-				continue;
-
-			if (rib->state != RECONF_RELOAD)
-				continue;
-
-			rde_filterstate_prep(&state, p);
-			action = rde_filter(rib->in_rules, peer, peer, &prefix,
-			    pt->prefixlen, &state);
-
-			if (action == ACTION_ALLOW) {
-				/* update Local-RIB */
-				prefix_update(rib, peer, p->path_id,
-				    p->path_id_tx, &state, 0,
-				    &prefix, pt->prefixlen);
-			} else if (conf->filtered_in_locrib &&
-			    i == RIB_LOC_START) {
-				prefix_update(rib, peer, p->path_id,
-				    p->path_id_tx, &state, 1,
-				    &prefix, pt->prefixlen);
-			} else {
-				/* remove from Local-RIB */
-				prefix_withdraw(rib, peer, p->path_id, &prefix,
-				    pt->prefixlen);
-			}
-
-			rde_filterstate_clean(&state);
-		}
-	}
-}
-
-static void
-rde_softreconfig_out(struct rib_entry *re, void *arg)
-{
-	if (prefix_best(re) == NULL)
-		/* no valid path for prefix */
-		return;
-
-	rde_generate_updates(re, NULL, 0, EVAL_RECONF);
 }
 
 static void