]> git.puffer.fish Git - mirror/frr.git/commitdiff
pbrd: be more selective about route updates
authorWesley Coakley <wcoakley@nvidia.com>
Thu, 27 Aug 2020 14:04:52 +0000 (10:04 -0400)
committerWesley Coakley <wcoakley@nvidia.com>
Tue, 1 Sep 2020 15:11:43 +0000 (11:11 -0400)
Given a received nexthop update, only send down an update to the
relevant nexthop group. Avoid sending down superfluous updates

Signed-off-by: Wesley Coakley <wcoakley@nvidia.com>
pbrd/pbr_nht.c
pbrd/pbr_nht.h

index e615818a107cb473b8247a2e0d520013251d1bf6..d3636c9669a28864d68b97243b4250f0f6bff3bf 100644 (file)
@@ -715,7 +715,7 @@ struct pbr_nht_individual {
 
 static bool
 pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
-                                    const struct pbr_nht_individual *pnhi)
+                                    struct pbr_nht_individual *pnhi)
 {
        bool is_valid = pnhc->valid;
 
@@ -736,6 +736,7 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
                break;
        }
 
+       pnhi->nhr_matched = true;
        if (!pnhi->nhr->nexthop_num) {
                is_valid = false;
                goto done;
@@ -767,8 +768,9 @@ done:
        return pnhc->valid;
 }
 
-static bool pbr_nht_individual_nexthop_interface_update(
-       struct pbr_nexthop_cache *pnhc, const struct pbr_nht_individual *pnhi)
+static bool
+pbr_nht_individual_nexthop_interface_update(struct pbr_nexthop_cache *pnhc,
+                                           struct pbr_nht_individual *pnhi)
 {
        bool is_valid = pnhc->valid;
 
@@ -779,6 +781,7 @@ static bool pbr_nht_individual_nexthop_interface_update(
            != pnhi->ifp->ifindex) /* Un-related interface */
                goto done;
 
+       pnhi->nhr_matched = true;
        is_valid = !!if_is_up(pnhi->ifp);
 
 done:
@@ -793,9 +796,8 @@ done:
  * If the update is un-related, the subroutines shoud just return their cached
  * valid state.
  */
-static void
-pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc,
-                                 const struct pbr_nht_individual *pnhi)
+static void pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc,
+                                             struct pbr_nht_individual *pnhi)
 {
        assert(pnhi->nhr || pnhi->ifp); /* Either nexthop or interface update */
 
@@ -870,9 +872,13 @@ static void pbr_nht_nexthop_update_lookup(struct hash_bucket *b, void *data)
 
        pnhi.nhr = (struct zapi_route *)data;
        pnhi.valid = 0;
+       pnhi.nhr_matched = false;
        hash_iterate(pnhgc->nhh, pbr_nht_individual_nexthop_update_lookup,
                     &pnhi);
 
+       if (!pnhi.nhr_matched)
+               return;
+
        /*
         * If any of the specified nexthops are valid we are valid
         */
index bcd770c2cfe53c26c36162e643067929d785cae4..63467952150e822ead35279b89ebb67c1e15515f 100644 (file)
@@ -55,6 +55,7 @@ struct pbr_nexthop_cache {
 
        bool looked_at;
        bool valid;
+       bool nhr_matched;
 };
 
 extern void pbr_nht_write_table_range(struct vty *vty);