summaryrefslogtreecommitdiff
path: root/zebra/zebra_dplane.c
diff options
context:
space:
mode:
authorAnuradha Karuppiah <anuradhak@nvidia.com>2021-12-18 10:47:27 -0800
committerDonald Sharp <sharpd@nvidia.com>2022-06-27 07:56:55 -0400
commit9898473fb4a2a6f12388a5542be7485a9f837fd6 (patch)
tree2437a9467d59268ba32dc4c09cf6654b87df067d /zebra/zebra_dplane.c
parent59f47eb0107517f417820d82db1226d011113039 (diff)
zebra: pass PBR expanded actions to the dataplane
These attributes are needed for dpdk dataplane programming Signed-off-by: Anuradha Karuppiah <anuradhak@nvidia.com>
Diffstat (limited to 'zebra/zebra_dplane.c')
-rw-r--r--zebra/zebra_dplane.c104
1 files changed, 103 insertions, 1 deletions
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index 3a3bac6c74..424cea4673 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -36,6 +36,7 @@
#include "zebra/rt.h"
#include "zebra/debug.h"
#include "zebra/zebra_pbr.h"
+#include "zebra/zebra_neigh.h"
#include "printfrr.h"
/* Memory types */
@@ -265,6 +266,8 @@ struct dplane_ctx_rule {
struct prefix src_ip;
struct prefix dst_ip;
uint8_t ip_proto;
+ uint16_t src_port;
+ uint16_t dst_port;
uint8_t action_pcp;
uint16_t action_vlan_id;
@@ -273,6 +276,10 @@ struct dplane_ctx_rule {
uint32_t action_queue_id;
char ifname[INTERFACE_NAMSIZ + 1];
+ struct ethaddr smac;
+ struct ethaddr dmac;
+ int out_ifindex;
+ intptr_t dp_flow_ptr;
};
struct dplane_rule_info {
@@ -2144,6 +2151,34 @@ uint8_t dplane_ctx_rule_get_old_ipproto(const struct zebra_dplane_ctx *ctx)
return ctx->u.rule.old.ip_proto;
}
+uint16_t dplane_ctx_rule_get_src_port(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.new.src_port;
+}
+
+uint16_t dplane_ctx_rule_get_old_src_port(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.old.src_port;
+}
+
+uint16_t dplane_ctx_rule_get_dst_port(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.new.dst_port;
+}
+
+uint16_t dplane_ctx_rule_get_old_dst_port(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.old.dst_port;
+}
+
uint8_t dplane_ctx_rule_get_dsfield(const struct zebra_dplane_ctx *ctx)
{
DPLANE_CTX_VALID(ctx);
@@ -2258,6 +2293,51 @@ void dplane_ctx_get_pbr_ipset_entry(const struct zebra_dplane_ctx *ctx,
memcpy(entry, &ctx->u.ipset_entry.entry, sizeof(struct zebra_pbr_ipset_entry));
}
+const struct ethaddr *
+dplane_ctx_rule_get_smac(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return &(ctx->u.rule.new.smac);
+}
+
+const struct ethaddr *
+dplane_ctx_rule_get_dmac(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return &(ctx->u.rule.new.dmac);
+}
+
+int dplane_ctx_rule_get_out_ifindex(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.new.out_ifindex;
+}
+
+intptr_t dplane_ctx_rule_get_old_dp_flow_ptr(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.old.dp_flow_ptr;
+}
+
+intptr_t dplane_ctx_rule_get_dp_flow_ptr(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.rule.new.dp_flow_ptr;
+}
+
+void dplane_ctx_rule_set_dp_flow_ptr(struct zebra_dplane_ctx *ctx,
+ intptr_t dp_flow_ptr)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ ctx->u.rule.new.dp_flow_ptr = dp_flow_ptr;
+}
+
/*
* End of dplane context accessors
*/
@@ -2976,6 +3056,8 @@ done:
static void dplane_ctx_rule_init_single(struct dplane_ctx_rule *dplane_rule,
struct zebra_pbr_rule *rule)
{
+ struct zebra_neigh_ent *n;
+
dplane_rule->priority = rule->rule.priority;
dplane_rule->table = rule->rule.action.table;
@@ -2983,6 +3065,8 @@ static void dplane_ctx_rule_init_single(struct dplane_ctx_rule *dplane_rule,
dplane_rule->fwmark = rule->rule.filter.fwmark;
dplane_rule->dsfield = rule->rule.filter.dsfield;
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;
prefix_copy(&(dplane_rule->dst_ip), &rule->rule.filter.dst_ip);
prefix_copy(&(dplane_rule->src_ip), &rule->rule.filter.src_ip);
@@ -2992,6 +3076,19 @@ static void dplane_ctx_rule_init_single(struct dplane_ctx_rule *dplane_rule,
dplane_rule->action_queue_id = rule->rule.action.queue_id;
strlcpy(dplane_rule->ifname, rule->ifname, INTERFACE_NAMSIZ);
+ dplane_rule->dp_flow_ptr = rule->action.dp_flow_ptr;
+ n = rule->action.neigh;
+ if (n && (n->flags & ZEBRA_NEIGH_ENT_ACTIVE)) {
+ struct interface *ifp = if_lookup_by_index_per_ns(
+ zebra_ns_lookup(NS_DEFAULT), n->ifindex);
+ if (ifp) {
+ dplane_rule->out_ifindex = n->ifindex;
+ memcpy(&dplane_rule->dmac, &n->mac, ETH_ALEN);
+ memcpy(&dplane_rule->smac, ifp->hw_addr, ETH_ALEN);
+ } else {
+ dplane_rule->out_ifindex = 0;
+ }
+ }
}
/**
@@ -3031,8 +3128,13 @@ static int dplane_ctx_rule_init(struct zebra_dplane_ctx *ctx,
ctx->u.rule.seq = new_rule->rule.seq;
dplane_ctx_rule_init_single(&ctx->u.rule.new, new_rule);
- if (op == DPLANE_OP_RULE_UPDATE)
+ if (op == DPLANE_OP_RULE_UPDATE) {
dplane_ctx_rule_init_single(&ctx->u.rule.old, old_rule);
+ /* clear the dp_flow_ptr in the old_rule - it is about to be
+ * deleted
+ */
+ old_rule->action.dp_flow_ptr = (intptr_t)NULL;
+ }
return AOK;
}