summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pbrd/pbr_map.c17
-rw-r--r--pbrd/pbr_map.h2
-rw-r--r--pbrd/pbr_zebra.c2
3 files changed, 16 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;
}
/*
diff --git a/pbrd/pbr_map.h b/pbrd/pbr_map.h
index 7cd079d16..945f76bb2 100644
--- a/pbrd/pbr_map.h
+++ b/pbrd/pbr_map.h
@@ -147,6 +147,8 @@ extern void pbr_map_delete_nexthop_group(struct pbr_map_sequence *pbrms);
extern void pbr_map_add_interface(struct pbr_map *pbrm, struct interface *ifp);
extern void pbr_map_interface_delete(struct pbr_map *pbrm,
struct interface *ifp);
+extern void pbr_map_final_interface_deletion(struct pbr_map *pbrm,
+ struct pbr_map_interface *pmi);
extern void pbr_map_write_interfaces(struct vty *vty, struct interface *ifp);
extern void pbr_map_init(void);
diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c
index 425bc04b4..558e63574 100644
--- a/pbrd/pbr_zebra.c
+++ b/pbrd/pbr_zebra.c
@@ -250,6 +250,8 @@ static int rule_notify_owner(int command, struct zclient *zclient,
break;
}
+ pbr_map_final_interface_deletion(pbrms->parent, pmi);
+
return 0;
}