There is no need to run against both input filters.
path_update() and prefix_remove() are both smart enough to handle all
cases (similar to a regular update). Should make reloads a bit faster.
More precise
- prefix_remove() of a non existing prefix is a NOP
- path_update() does itself a path_compare() call and will not issue an
UPDATE if nothing changed.
OK?
--
:wq Claudio
Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.383
diff -u -p -r1.383 rde.c
--- rde.c 28 Jun 2018 09:54:48 -0000 1.383
+++ rde.c 3 Jul 2018 19:09:13 -0000
@@ -3047,8 +3047,8 @@ rde_softreconfig_in(struct rib_entry *re
struct prefix *p, *np;
struct pt_entry *pt;
struct rde_peer *peer;
- struct rde_aspath *asp, *oasp, *nasp;
- enum filter_actions oa, na;
+ struct rde_aspath *asp, *fasp;
+ enum filter_actions action;
struct bgpd_addr addr;
pt = re->prefix;
@@ -3062,39 +3062,20 @@ rde_softreconfig_in(struct rib_entry *re
asp = prefix_aspath(p);
peer = asp->peer;
- /* check if prefix changed */
- if (rib->state == RECONF_RELOAD) {
- oa = rde_filter(rib->in_rules_tmp, peer, &oasp, p);
- oasp = oasp != NULL ? oasp : asp;
- } else {
- /* make sure we update everything for RECONF_REINIT */
- oa = ACTION_DENY;
- oasp = asp;
- }
- na = rde_filter(rib->in_rules, peer, &nasp, p);
- nasp = nasp != NULL ? nasp : asp;
+ action = rde_filter(rib->in_rules, peer, &fasp, p);
+ fasp = fasp != NULL ? fasp : asp;
- /* go through all 4 possible combinations */
- /* if (oa == ACTION_DENY && na == ACTION_DENY) */
- /* nothing todo */
- if (oa == ACTION_DENY && na == ACTION_ALLOW) {
+ if (action == ACTION_ALLOW) {
/* update Local-RIB */
- path_update(&rib->rib, peer, nasp, &addr,
+ path_update(&rib->rib, peer, fasp, &addr,
pt->prefixlen, 0);
- } else if (oa == ACTION_ALLOW && na == ACTION_DENY) {
+ } else if (action == ACTION_DENY) {
/* remove from Local-RIB */
prefix_remove(&rib->rib, peer, &addr, pt->prefixlen, 0);
- } else if (oa == ACTION_ALLOW && na == ACTION_ALLOW) {
- if (path_compare(nasp, oasp) != 0)
- /* send update */
- path_update(&rib->rib, peer, nasp, &addr,
- pt->prefixlen, 0);
}
- if (oasp != asp)
- path_put(oasp);
- if (nasp != asp)
- path_put(nasp);
+ if (fasp != asp)
+ path_put(fasp);
}
}