mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 11:18:59 +00:00
pbrd: adjust/remove the rule correctly when dst and/or src removed
When the last match criteria was removed (dst-ip or src-ip), we were not deleting the rule correctly for ipv6. This fix retains the needed src-ip/dst-ip during the pbr_send_pbr_map process so the appropriate information is available for the rule delete. Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
This commit is contained in:
parent
a1b7005bf4
commit
49027ce856
@ -527,13 +527,6 @@ void pbr_map_check(struct pbr_map_sequence *pbrms)
|
||||
__PRETTY_FUNCTION__, pbrm->name, pbrms->seqno, pbrms->reason);
|
||||
|
||||
if (pbrms->reason == PBR_MAP_VALID_SEQUENCE_NUMBER) {
|
||||
if (pbrms->installed) {
|
||||
install = false;
|
||||
for (ALL_LIST_ELEMENTS_RO(pbrm->incoming, inode, pmi)) {
|
||||
pbr_send_pbr_map(pbrms, pmi, install);
|
||||
}
|
||||
install = true;
|
||||
}
|
||||
install = true;
|
||||
DEBUGD(&pbr_dbg_map, "%s: Installing %s(%u) reason: %" PRIu64,
|
||||
__PRETTY_FUNCTION__, pbrm->name, pbrms->seqno,
|
||||
|
@ -85,6 +85,11 @@ struct pbr_map_sequence {
|
||||
struct prefix *src;
|
||||
struct prefix *dst;
|
||||
|
||||
/*
|
||||
* Family of the src/dst. Needed when deleting since we clear them
|
||||
*/
|
||||
unsigned char family;
|
||||
|
||||
/*
|
||||
* The nexthop group we auto create
|
||||
* for when the user specifies a individual
|
||||
|
@ -95,6 +95,8 @@ DEFPY(pbr_map_match_src, pbr_map_match_src_cmd,
|
||||
{
|
||||
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
|
||||
|
||||
pbrms->family = prefix->family;
|
||||
|
||||
if (!no) {
|
||||
if (prefix_same(pbrms->src, prefix))
|
||||
return CMD_SUCCESS;
|
||||
@ -122,6 +124,8 @@ DEFPY(pbr_map_match_dst, pbr_map_match_dst_cmd,
|
||||
{
|
||||
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
|
||||
|
||||
pbrms->family = prefix->family;
|
||||
|
||||
if (!no) {
|
||||
if (prefix_same(pbrms->dst, prefix))
|
||||
return CMD_SUCCESS;
|
||||
|
@ -455,7 +455,7 @@ void pbr_send_rnh(struct nexthop *nhop, bool reg)
|
||||
|
||||
static void pbr_encode_pbr_map_sequence_prefix(struct stream *s,
|
||||
struct prefix *p,
|
||||
u_char family)
|
||||
unsigned char family)
|
||||
{
|
||||
struct prefix any;
|
||||
|
||||
@ -474,14 +474,11 @@ static void pbr_encode_pbr_map_sequence(struct stream *s,
|
||||
struct pbr_map_sequence *pbrms,
|
||||
struct interface *ifp)
|
||||
{
|
||||
u_char family;
|
||||
unsigned char family;
|
||||
|
||||
family = AF_INET;
|
||||
if (pbrms->src)
|
||||
family = pbrms->src->family;
|
||||
|
||||
if (pbrms->dst)
|
||||
family = pbrms->dst->family;
|
||||
if (pbrms->family)
|
||||
family = pbrms->family;
|
||||
|
||||
stream_putl(s, pbrms->seqno);
|
||||
stream_putl(s, pbrms->ruleno);
|
||||
|
@ -77,9 +77,6 @@ static int netlink_rule_update(int cmd, struct zebra_pbr_rule *rule)
|
||||
req.frh.family = family;
|
||||
req.frh.action = FR_ACT_TO_TBL;
|
||||
|
||||
if (cmd == RTM_NEWRULE)
|
||||
req.n.nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
|
||||
|
||||
/* rule's pref # */
|
||||
addattr32(&req.n, sizeof(req), FRA_PRIORITY, rule->priority);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user