From 657882c430cffca3e41698b2ed76012a0ef01255 Mon Sep 17 00:00:00 2001 From: "G. Paul Ziemba" Date: Wed, 19 Jul 2023 07:50:11 -0700 Subject: [PATCH] pbrd: add vlan filters pcp/vlan-id/vlan-flags; ip-protocol any (zebra dplane) Subset: zebra dataplane Add new vlan filter fields. No kernel dataplane implementation yet (linux does not support). Changes by: Josh Werner Eli Baum G. Paul Ziemba Signed-off-by: G. Paul Ziemba --- zebra/zebra_dplane.c | 11 +++++++++++ zebra/zebra_pbr.c | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c index 6a685267a9..c5dc0e1829 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c @@ -2,6 +2,8 @@ /* * Zebra dataplane layer. * Copyright (c) 2018 Volta Networks, Inc. + * Portions: + * Copyright (c) 2021 The MITRE Corporation. */ #ifdef HAVE_CONFIG_H @@ -278,7 +280,9 @@ struct dplane_neigh_table { * Policy based routing rule info for the dataplane */ struct dplane_ctx_rule { + uint32_t seq; uint32_t priority; + uint32_t unique; /* The route table pointed by this rule */ uint32_t table; @@ -299,6 +303,10 @@ struct dplane_ctx_rule { uint32_t action_queue_id; + uint8_t filter_pcp; + uint16_t filter_vlan_id; + uint16_t filter_vlan_flags; + char ifname[INTERFACE_NAMSIZ + 1]; struct ethaddr smac; struct ethaddr dmac; @@ -3899,6 +3907,9 @@ static void dplane_ctx_rule_init_single(struct dplane_ctx_rule *dplane_rule, dplane_rule->ip_proto = rule->rule.filter.ip_proto; dplane_rule->src_port = rule->rule.filter.src_port; dplane_rule->dst_port = rule->rule.filter.dst_port; + dplane_rule->filter_pcp = rule->rule.filter.pcp; + dplane_rule->filter_vlan_id = rule->rule.filter.vlan_id; + dplane_rule->filter_vlan_flags = rule->rule.filter.vlan_flags; prefix_copy(&(dplane_rule->dst_ip), &rule->rule.filter.dst_ip); prefix_copy(&(dplane_rule->src_ip), &rule->rule.filter.src_ip); diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c index 56cac1342e..eac93dca41 100644 --- a/zebra/zebra_pbr.c +++ b/zebra/zebra_pbr.c @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* Zebra Policy Based Routing (PBR) main handling. * Copyright (C) 2018 Cumulus Networks, Inc. + * Portions: + * Copyright (c) 2021 The MITRE Corporation. + * Copyright (c) 2023 LabN Consulting, L.L.C. */ #include @@ -166,6 +169,9 @@ uint32_t zebra_pbr_rules_hash_key(const void *arg) key = jhash(rule->ifname, strlen(rule->ifname), key); + key = jhash_3words(rule->rule.filter.pcp, rule->rule.filter.vlan_id, + rule->rule.filter.vlan_flags, key); + return jhash_3words(rule->rule.filter.src_port, rule->rule.filter.dst_port, prefix_hash_key(&rule->rule.filter.dst_ip), @@ -525,6 +531,22 @@ void zebra_pbr_show_rule_unit(struct zebra_pbr_rule *rule, struct vty *vty) if (prule->filter.filter_bm & PBR_FILTER_FWMARK) vty_out(vty, " MARK Match: %u\n", prule->filter.fwmark); + if (prule->filter.filter_bm & PBR_FILTER_PCP) + vty_out(vty, " PCP Match: %u\n", prule->filter.pcp); + if (prule->filter.filter_bm & PBR_FILTER_VLAN_ID) + vty_out(vty, " VLAN ID Match: %u\n", prule->filter.vlan_id); + if (prule->filter.filter_bm & PBR_FILTER_VLAN_FLAGS) { + vty_out(vty, " VLAN Flags Match:"); + if (CHECK_FLAG(prule->filter.vlan_flags, PBR_VLAN_FLAGS_TAGGED)) + vty_out(vty, " tagged"); + if (CHECK_FLAG(prule->filter.vlan_flags, + PBR_VLAN_FLAGS_UNTAGGED)) + vty_out(vty, " untagged"); + if (CHECK_FLAG(prule->filter.vlan_flags, + PBR_VLAN_FLAGS_UNTAGGED_0)) + vty_out(vty, " untagged-or-zero"); + vty_out(vty, "\n"); + } vty_out(vty, " Tableid: %u\n", prule->action.table); if (zaction->afi == AFI_IP) @@ -1118,7 +1140,7 @@ static void zebra_pbr_display_port(struct vty *vty, uint32_t filter_bm, uint16_t port_min, uint16_t port_max, uint8_t proto) { - if (!(filter_bm & PBR_FILTER_PROTO)) { + if (!(filter_bm & PBR_FILTER_IP_PROTOCOL)) { if (port_max) vty_out(vty, ":udp/tcp:%d-%d", port_min, port_max); -- 2.39.5