diff options
| author | Anuradha Karuppiah <anuradhak@nvidia.com> | 2021-12-18 10:47:27 -0800 |
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2022-06-27 07:56:55 -0400 |
| commit | 9898473fb4a2a6f12388a5542be7485a9f837fd6 (patch) | |
| tree | 2437a9467d59268ba32dc4c09cf6654b87df067d /zebra/zebra_dplane.c | |
| parent | 59f47eb0107517f417820d82db1226d011113039 (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.c | 104 |
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; } |
