summaryrefslogtreecommitdiffstats
path: root/pbrd/pbr_map.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-02-12 20:55:15 +0100
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-02-13 01:22:30 +0100
commit38e9ccde2f8edd6946d48c80967027d05e64d73f (patch)
treef5760f72c410ef0bfb60a1138e6ba769ebfc4145 /pbrd/pbr_map.c
parentpbrd: If changing policy on an interface be careful what you ask for (diff)
downloadfrr-38e9ccde2f8edd6946d48c80967027d05e64d73f.tar.xz
frr-38e9ccde2f8edd6946d48c80967027d05e64d73f.zip
pbrd: Do not delete pmi until completion of rule delete.
When we have a pbr-policy applied to an interface and the rule is installed and then deleted, we would not properly clean up the bit field for the pmi as well as not note the rule as properly deleted. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'pbrd/pbr_map.c')
-rw-r--r--pbrd/pbr_map.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/pbrd/pbr_map.c b/pbrd/pbr_map.c
index 950ce8dfe..8f8b6aeed 100644
--- a/pbrd/pbr_map.c
+++ b/pbrd/pbr_map.c
@@ -121,6 +121,17 @@ void pbr_map_reason_string(unsigned int reason, char *buf, int size)
}
}
+void pbr_map_final_interface_deletion(struct pbr_map *pbrm,
+ struct pbr_map_interface *pmi)
+{
+ if (pmi->delete == true) {
+ listnode_delete(pbrm->incoming, pmi);
+ pmi->pbrm = NULL;
+
+ bf_release_index(pbrm->ifi_bitfield, pmi->install_bit);
+ XFREE(MTYPE_PBR_MAP_INTERFACE, pmi);
+ }
+}
void pbr_map_interface_delete(struct pbr_map *pbrm, struct interface *ifp_del)
{
@@ -466,11 +477,7 @@ void pbr_map_policy_delete(struct pbr_map *pbrm, struct pbr_map_interface *pmi)
for (ALL_LIST_ELEMENTS_RO(pbrm->seqnumbers, node, pbrms))
pbr_send_pbr_map(pbrms, pmi, false);
- listnode_delete(pbrm->incoming, pmi);
- pmi->pbrm = NULL;
-
- bf_release_index(pbrm->ifi_bitfield, pmi->install_bit);
- XFREE(MTYPE_PBR_MAP_INTERFACE, pmi);
+ pmi->delete = true;
}
/*