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>
This commit is contained in:
Donald Sharp 2019-02-12 14:55:15 -05:00
parent 6eb499b031
commit 38e9ccde2f
3 changed files with 16 additions and 5 deletions

View File

@ -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;
}
/*

View File

@ -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);

View File

@ -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;
}