]> git.puffer.fish Git - mirror/frr.git/commitdiff
pbrd: PBR_FILTER_DSFIELD -> {PBR_FILTER_DSCP,PBR_FILTER_ECN}
authorG. Paul Ziemba <paulz@labn.net>
Tue, 1 Aug 2023 13:49:38 +0000 (06:49 -0700)
committerG. Paul Ziemba <paulz@labn.net>
Tue, 8 Aug 2023 17:18:22 +0000 (10:18 -0700)
    DSCP and ECN matching are configured independently. Maintain
    these values in independent fields in pbrd, zapi, and zebra.

Signed-off-by: G. Paul Ziemba <paulz@labn.net>
lib/pbr.h
pbrd/pbr_vty.c
zebra/rule_netlink.c
zebra/zebra_pbr.c
zebra/zebra_pbr.h

index 5414e97446928257350d8279b21c40a0476c3092..1c89f2f552c863f6e2b22d46201ec537ecda2abb 100644 (file)
--- 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)
index 5ee262b9c735a264490fe6d16313e2b57d7599a2..cffd3794c2e4de50b1b87766b5e7cafe0d94b42f 100644 (file)
@@ -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);
index 3bb4936b816753745101bc456e236b1d868a1118..bc96e12902cf9c456fd6c1e06291b804c937283e 100644 (file)
@@ -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)
index eac93dca415a831234f872f4c0431553b58e7fc0..7560071e59fd4d021f8450f70909098db476593b 100644 (file)
@@ -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);
index 15ad4e35cf0ec801dd25c79c07f5512b716dfefa..ddc1460d40aff53afcc90e35756139a3e7ec766c 100644 (file)
@@ -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)