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;  }  | 
