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);
        }
 }
 

Reply via email to