|
|
|
@ -31,6 +31,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TAG] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TNL_L2_TO_L2] = DR_ACTION_STATE_DECAP,
|
|
|
|
@ -45,6 +46,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TAG] = DR_ACTION_STATE_DECAP,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_DECAP,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -57,6 +59,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TAG] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
},
|
|
|
|
@ -64,6 +67,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TAG] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -74,6 +78,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TAG] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_POP_VLAN] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
@ -86,6 +91,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TAG] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TNL_L2_TO_L2] = DR_ACTION_STATE_DECAP,
|
|
|
|
@ -104,6 +110,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_NO_ACTION] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L3] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -114,11 +121,13 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_ENCAP] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
},
|
|
|
|
|
[DR_ACTION_STATE_MODIFY_HDR] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L3] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -128,6 +137,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_MODIFY_VLAN] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_PUSH_VLAN] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -137,6 +147,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_NON_TERM] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L3] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -152,6 +163,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_NO_ACTION] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TNL_L2_TO_L2] = DR_ACTION_STATE_DECAP,
|
|
|
|
|
[DR_ACTION_TYP_TNL_L3_TO_L2] = DR_ACTION_STATE_DECAP,
|
|
|
|
@ -166,6 +178,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_DECAP,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_MODIFY_HDR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_POP_VLAN] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_VPORT] = DR_ACTION_STATE_TERM,
|
|
|
|
@ -178,11 +191,13 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_QP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_VPORT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
},
|
|
|
|
|
[DR_ACTION_STATE_MODIFY_HDR] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_VPORT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -192,6 +207,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_MODIFY_VLAN] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_POP_VLAN] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_VPORT] = DR_ACTION_STATE_TERM,
|
|
|
|
@ -203,6 +219,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_NON_TERM] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_TNL_L2_TO_L2] = DR_ACTION_STATE_DECAP,
|
|
|
|
|
[DR_ACTION_TYP_TNL_L3_TO_L2] = DR_ACTION_STATE_DECAP,
|
|
|
|
@ -221,6 +238,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_NO_ACTION] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_MODIFY_HDR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -233,11 +251,13 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_VPORT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
},
|
|
|
|
|
[DR_ACTION_STATE_MODIFY_HDR] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L3] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -248,6 +268,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_MODIFY_VLAN] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_PUSH_VLAN] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_MODIFY_VLAN,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -258,6 +279,7 @@ next_action_state[DR_ACTION_DOMAIN_MAX][DR_ACTION_STATE_MAX][DR_ACTION_TYP_MAX]
|
|
|
|
|
[DR_ACTION_STATE_NON_TERM] = {
|
|
|
|
|
[DR_ACTION_TYP_DROP] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_FT] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = DR_ACTION_STATE_TERM,
|
|
|
|
|
[DR_ACTION_TYP_CTR] = DR_ACTION_STATE_NON_TERM,
|
|
|
|
|
[DR_ACTION_TYP_MODIFY_HDR] = DR_ACTION_STATE_MODIFY_HDR,
|
|
|
|
|
[DR_ACTION_TYP_L2_TO_TNL_L2] = DR_ACTION_STATE_ENCAP,
|
|
|
|
@ -519,6 +541,10 @@ int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher,
|
|
|
|
|
attr.reformat.size = action->reformat->size;
|
|
|
|
|
attr.reformat.id = action->reformat->id;
|
|
|
|
|
break;
|
|
|
|
|
case DR_ACTION_TYP_SAMPLER:
|
|
|
|
|
attr.final_icm_addr = rx_rule ? action->sampler->rx_icm_addr :
|
|
|
|
|
action->sampler->tx_icm_addr;
|
|
|
|
|
break;
|
|
|
|
|
case DR_ACTION_TYP_VPORT:
|
|
|
|
|
attr.hit_gvmi = action->vport->caps->vhca_gvmi;
|
|
|
|
|
dest_action = action;
|
|
|
|
@ -612,6 +638,7 @@ static unsigned int action_size[DR_ACTION_TYP_MAX] = {
|
|
|
|
|
[DR_ACTION_TYP_VPORT] = sizeof(struct mlx5dr_action_vport),
|
|
|
|
|
[DR_ACTION_TYP_PUSH_VLAN] = sizeof(struct mlx5dr_action_push_vlan),
|
|
|
|
|
[DR_ACTION_TYP_INSERT_HDR] = sizeof(struct mlx5dr_action_reformat),
|
|
|
|
|
[DR_ACTION_TYP_SAMPLER] = sizeof(struct mlx5dr_action_sampler),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static struct mlx5dr_action *
|
|
|
|
@ -824,6 +851,31 @@ struct mlx5dr_action *mlx5dr_action_create_tag(u32 tag_value)
|
|
|
|
|
return action;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct mlx5dr_action *
|
|
|
|
|
mlx5dr_action_create_flow_sampler(struct mlx5dr_domain *dmn, u32 sampler_id)
|
|
|
|
|
{
|
|
|
|
|
struct mlx5dr_action *action;
|
|
|
|
|
u64 icm_rx, icm_tx;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
ret = mlx5dr_cmd_query_flow_sampler(dmn->mdev, sampler_id,
|
|
|
|
|
&icm_rx, &icm_tx);
|
|
|
|
|
if (ret)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
action = dr_action_create_generic(DR_ACTION_TYP_SAMPLER);
|
|
|
|
|
if (!action)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
action->sampler->dmn = dmn;
|
|
|
|
|
action->sampler->sampler_id = sampler_id;
|
|
|
|
|
action->sampler->rx_icm_addr = icm_rx;
|
|
|
|
|
action->sampler->tx_icm_addr = icm_tx;
|
|
|
|
|
|
|
|
|
|
refcount_inc(&dmn->refcount);
|
|
|
|
|
return action;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
dr_action_verify_reformat_params(enum mlx5dr_action_type reformat_type,
|
|
|
|
|
struct mlx5dr_domain *dmn,
|
|
|
|
@ -1624,6 +1676,9 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
|
|
|
|
|
kfree(action->rewrite->data);
|
|
|
|
|
refcount_dec(&action->rewrite->dmn->refcount);
|
|
|
|
|
break;
|
|
|
|
|
case DR_ACTION_TYP_SAMPLER:
|
|
|
|
|
refcount_dec(&action->sampler->dmn->refcount);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|