From: Claudio Jeker Subject: bgpd: suffle functions for more sense To: tech@openbsd.org Date: Mon, 27 Apr 2026 17:16:28 +0200 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