pbrd: If changing policy on an interface be careful what you ask for

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>
This commit is contained in:
Donald Sharp 2019-02-12 19:17:05 -05:00
parent 7e737f3d40
commit 6eb499b031

View File

@ -349,6 +349,7 @@ DEFPY (pbr_policy,
struct pbr_map *pbrm, *old_pbrm; struct pbr_map *pbrm, *old_pbrm;
struct pbr_interface *pbr_ifp = ifp->info; struct pbr_interface *pbr_ifp = ifp->info;
old_pbrm = NULL;
pbrm = pbrm_find(mapname); pbrm = pbrm_find(mapname);
if (!pbr_ifp) { if (!pbr_ifp) {
@ -369,12 +370,23 @@ DEFPY (pbr_policy,
} else { } else {
if (strcmp(pbr_ifp->mapname, "") != 0) { if (strcmp(pbr_ifp->mapname, "") != 0) {
old_pbrm = pbrm_find(pbr_ifp->mapname); 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); pbr_map_interface_delete(old_pbrm, ifp);
} }
snprintf(pbr_ifp->mapname, sizeof(pbr_ifp->mapname), snprintf(pbr_ifp->mapname, sizeof(pbr_ifp->mapname),
"%s", 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); pbr_map_add_interface(pbrm, ifp);
} }