From 5572f45d51c587691384a9ec3a195e6a01540930 Mon Sep 17 00:00:00 2001 From: "G. Paul Ziemba" Date: Tue, 1 Aug 2023 06:49:38 -0700 Subject: [PATCH] pbrd: PBR_FILTER_DSFIELD -> {PBR_FILTER_DSCP,PBR_FILTER_ECN} DSCP and ECN matching are configured independently. Maintain these values in independent fields in pbrd, zapi, and zebra. Signed-off-by: G. Paul Ziemba --- lib/pbr.h | 3 ++- pbrd/pbr_vty.c | 4 ++++ zebra/rule_netlink.c | 4 ++-- zebra/zebra_pbr.c | 4 ++-- zebra/zebra_pbr.h | 2 -- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/pbr.h b/lib/pbr.h index 5414e97446..1c89f2f552 100644 --- a/lib/pbr.h +++ b/lib/pbr.h @@ -37,7 +37,8 @@ struct pbr_filter { #define PBR_FILTER_IP_PROTOCOL (1 << 5) #define PBR_FILTER_SRC_PORT_RANGE (1 << 6) #define PBR_FILTER_DST_PORT_RANGE (1 << 7) -#define PBR_FILTER_DSFIELD (1 << 8) +#define PBR_FILTER_DSCP (1 << 8) +#define PBR_FILTER_ECN (1 << 9) #define PBR_FILTER_PCP (1 << 10) #define PBR_FILTER_VLAN_FLAGS (1 << 11) #define PBR_FILTER_VLAN_ID (1 << 12) diff --git a/pbrd/pbr_vty.c b/pbrd/pbr_vty.c index 5ee262b9c7..cffd3794c2 100644 --- a/pbrd/pbr_vty.c +++ b/pbrd/pbr_vty.c @@ -361,8 +361,10 @@ DEFPY (pbr_map_match_dscp, /* Set the DSCP bits of the DSField */ pbrms->dsfield = (pbrms->dsfield & ~PBR_DSFIELD_DSCP) | (rawDscp << 2); + SET_FLAG(pbrms->filter_bm, PBR_FILTER_DSCP); } else { pbrms->dsfield &= ~PBR_DSFIELD_DSCP; + UNSET_FLAG(pbrms->filter_bm, PBR_FILTER_DSCP); } pbr_map_check(pbrms, true); @@ -391,8 +393,10 @@ DEFPY (pbr_map_match_ecn, /* Set the ECN bits of the DSField */ pbrms->dsfield = (pbrms->dsfield & ~PBR_DSFIELD_ECN) | ecn; + SET_FLAG(pbrms->filter_bm, PBR_FILTER_ECN); } else { pbrms->dsfield &= ~PBR_DSFIELD_ECN; + UNSET_FLAG(pbrms->filter_bm, PBR_FILTER_ECN); } pbr_map_check(pbrms, true); diff --git a/zebra/rule_netlink.c b/zebra/rule_netlink.c index 3bb4936b81..bc96e12902 100644 --- a/zebra/rule_netlink.c +++ b/zebra/rule_netlink.c @@ -117,8 +117,8 @@ static ssize_t netlink_rule_msg_encode( } /* dsfield, if specified; mask off the ECN bits */ - if (filter_bm & PBR_FILTER_DSFIELD) - req->frh.tos = dsfield & 0xfc; + if (filter_bm & PBR_FILTER_DSCP) + req->frh.tos = dsfield & PBR_DSFIELD_DSCP; /* protocol to match on */ if (filter_bm & PBR_FILTER_IP_PROTOCOL) diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c index eac93dca41..7560071e59 100644 --- a/zebra/zebra_pbr.c +++ b/zebra/zebra_pbr.c @@ -522,12 +522,12 @@ void zebra_pbr_show_rule_unit(struct zebra_pbr_rule *rule, struct vty *vty) if (prule->filter.filter_bm & PBR_FILTER_DST_PORT) vty_out(vty, " DST Port Match: %u\n", prule->filter.dst_port); - if (prule->filter.filter_bm & PBR_FILTER_DSFIELD) { + if (prule->filter.filter_bm & PBR_FILTER_DSCP) vty_out(vty, " DSCP Match: %u\n", (prule->filter.dsfield & PBR_DSFIELD_DSCP) >> 2); + if (prule->filter.filter_bm & PBR_FILTER_ECN) vty_out(vty, " ECN Match: %u\n", prule->filter.dsfield & PBR_DSFIELD_ECN); - } if (prule->filter.filter_bm & PBR_FILTER_FWMARK) vty_out(vty, " MARK Match: %u\n", prule->filter.fwmark); diff --git a/zebra/zebra_pbr.h b/zebra/zebra_pbr.h index 15ad4e35cf..ddc1460d40 100644 --- a/zebra/zebra_pbr.h +++ b/zebra/zebra_pbr.h @@ -61,8 +61,6 @@ struct zebra_pbr_rule { (r->rule.filter.filter_bm & PBR_FILTER_SRC_PORT) #define IS_RULE_FILTERING_ON_DST_PORT(r) \ (r->rule.filter.filter_bm & PBR_FILTER_DST_PORT) -#define IS_RULE_FILTERING_ON_DSFIELD(r) \ - (r->rule.filter.filter_bm & PBR_FILTER_DSFIELD) #define IS_RULE_FILTERING_ON_FWMARK(r) \ (r->rule.filter.filter_bm & PBR_FILTER_FWMARK)