]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pbrd: If changing policy on an interface be careful what you ask for
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 13 Feb 2019 00:17:05 +0000 (19:17 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 13 Feb 2019 00:21:28 +0000 (19:21 -0500)
When changing policy on an interface, only delete the old_pbrm
if it is different than the current, this covers the case:

current config:
int swp1
  pbr-policy DONNA

To a config entered of:

int swp1
  pbr-policy EVA

Additionally there is no need to reinstall if we enter the same
pbr-policy two times in a row.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pbrd/pbr_vty.c

index a4b87f99d9d0e2b8eecb6151f52a8ac5fafd3ed0..2b6c38593b304b1a30e069b6a7a534ab55578ad2 100644 (file)
@@ -349,6 +349,7 @@ DEFPY (pbr_policy,
        struct pbr_map *pbrm, *old_pbrm;
        struct pbr_interface *pbr_ifp = ifp->info;
 
+       old_pbrm = NULL;
        pbrm = pbrm_find(mapname);
 
        if (!pbr_ifp) {
@@ -369,12 +370,23 @@ DEFPY (pbr_policy,
        } else {
                if (strcmp(pbr_ifp->mapname, "") != 0) {
                        old_pbrm = pbrm_find(pbr_ifp->mapname);
-                       if (old_pbrm)
+
+                       /*
+                        * So if we have an old pbrm we should only
+                        * delete it if we are actually deleting and
+                        * moving to a new pbrm
+                        */
+                       if (old_pbrm && old_pbrm != pbrm)
                                pbr_map_interface_delete(old_pbrm, ifp);
                }
                snprintf(pbr_ifp->mapname, sizeof(pbr_ifp->mapname),
                         "%s", mapname);
-               if (pbrm)
+
+               /*
+                * So only reinstall if the old_pbrm and this pbrm are
+                * different.
+                */
+               if (pbrm && pbrm != old_pbrm)
                        pbr_map_add_interface(pbrm, ifp);
        }