[dpdk-dev] [PATCH v3 05/13] net/mlx5: swap items/actions validations for e-switch rules

Yongseok Koh yskoh at mellanox.com
Thu Nov 1 21:37:05 CET 2018


On Thu, Nov 01, 2018 at 05:19:26AM -0700, Slava Ovsiienko wrote:
> The rule validation function for E-Switch checks item list first,
> then action list is checked. This patch swaps the validation order,
> now actions are checked first. This is preparation for validation
> function update with VXLAN tunnel actions. VXLAN decapsulation
> action requires to check the items in special way. We could do
> this special check in the single item check pass if the action
> flags were gathered before. This is the reason to swap the
> item/actions checking loops.
> 
> Suggested-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com>
> Signed-off-by: Viacheslav Ovsiienko <viacheslavo at mellanox.com>
> ---
Acked-by: Yongseok Koh <yskoh at mellanox.com>

Thanks

>  drivers/net/mlx5/mlx5_flow_tcf.c | 260 +++++++++++++++++++--------------------
>  1 file changed, 130 insertions(+), 130 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_flow_tcf.c b/drivers/net/mlx5/mlx5_flow_tcf.c
> index 55c77e3..50f3bd1 100644
> --- a/drivers/net/mlx5/mlx5_flow_tcf.c
> +++ b/drivers/net/mlx5/mlx5_flow_tcf.c
> @@ -1174,6 +1174,136 @@ struct pedit_parser {
>  	ret = flow_tcf_validate_attributes(attr, error);
>  	if (ret < 0)
>  		return ret;
> +	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> +		unsigned int i;
> +		uint64_t current_action_flag = 0;
> +
> +		switch (actions->type) {
> +		case RTE_FLOW_ACTION_TYPE_VOID:
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_PORT_ID:
> +			current_action_flag = MLX5_FLOW_ACTION_PORT_ID;
> +			if (!actions->conf)
> +				break;
> +			conf.port_id = actions->conf;
> +			if (conf.port_id->original)
> +				i = 0;
> +			else
> +				for (i = 0; ptoi[i].ifindex; ++i)
> +					if (ptoi[i].port_id == conf.port_id->id)
> +						break;
> +			if (!ptoi[i].ifindex)
> +				return rte_flow_error_set
> +					(error, ENODEV,
> +					 RTE_FLOW_ERROR_TYPE_ACTION_CONF,
> +					 conf.port_id,
> +					 "missing data to convert port ID to"
> +					 " ifindex");
> +			port_id_dev = &rte_eth_devices[conf.port_id->id];
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_JUMP:
> +			current_action_flag = MLX5_FLOW_ACTION_JUMP;
> +			if (!actions->conf)
> +				break;
> +			conf.jump = actions->conf;
> +			if (attr->group >= conf.jump->group)
> +				return rte_flow_error_set
> +					(error, ENOTSUP,
> +					 RTE_FLOW_ERROR_TYPE_ACTION,
> +					 actions,
> +					 "can jump only to a group forward");
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_DROP:
> +			current_action_flag = MLX5_FLOW_ACTION_DROP;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_COUNT:
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN:
> +			current_action_flag = MLX5_FLOW_ACTION_OF_POP_VLAN;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN:
> +			current_action_flag = MLX5_FLOW_ACTION_OF_PUSH_VLAN;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID:
> +			if (!(action_flags & MLX5_FLOW_ACTION_OF_PUSH_VLAN))
> +				return rte_flow_error_set
> +					(error, ENOTSUP,
> +					 RTE_FLOW_ERROR_TYPE_ACTION, actions,
> +					 "vlan modify is not supported,"
> +					 " set action must follow push action");
> +			current_action_flag = MLX5_FLOW_ACTION_OF_SET_VLAN_VID;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP:
> +			if (!(action_flags & MLX5_FLOW_ACTION_OF_PUSH_VLAN))
> +				return rte_flow_error_set
> +					(error, ENOTSUP,
> +					 RTE_FLOW_ERROR_TYPE_ACTION, actions,
> +					 "vlan modify is not supported,"
> +					 " set action must follow push action");
> +			current_action_flag = MLX5_FLOW_ACTION_OF_SET_VLAN_PCP;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_IPV4_SRC;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_IPV4_DST;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_IPV6_SRC;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_IPV6_DST;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_TP_SRC:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_TP_SRC;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_TP_DST:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_TP_DST;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_TTL:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_TTL;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_DEC_TTL:
> +			current_action_flag = MLX5_FLOW_ACTION_DEC_TTL;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_MAC_SRC;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_MAC_DST:
> +			current_action_flag = MLX5_FLOW_ACTION_SET_MAC_DST;
> +			break;
> +		default:
> +			return rte_flow_error_set(error, ENOTSUP,
> +						  RTE_FLOW_ERROR_TYPE_ACTION,
> +						  actions,
> +						  "action not supported");
> +		}
> +		if (current_action_flag & MLX5_TCF_CONFIG_ACTIONS) {
> +			if (!actions->conf)
> +				return rte_flow_error_set(error, EINVAL,
> +						RTE_FLOW_ERROR_TYPE_ACTION_CONF,
> +						actions,
> +						"action configuration not set");
> +		}
> +		if ((current_action_flag & MLX5_TCF_PEDIT_ACTIONS) &&
> +		    pedit_validated)
> +			return rte_flow_error_set(error, ENOTSUP,
> +						  RTE_FLOW_ERROR_TYPE_ACTION,
> +						  actions,
> +						  "set actions should be "
> +						  "listed successively");
> +		if ((current_action_flag & ~MLX5_TCF_PEDIT_ACTIONS) &&
> +		    (action_flags & MLX5_TCF_PEDIT_ACTIONS))
> +			pedit_validated = 1;
> +		if ((current_action_flag & MLX5_TCF_FATE_ACTIONS) &&
> +		    (action_flags & MLX5_TCF_FATE_ACTIONS))
> +			return rte_flow_error_set(error, EINVAL,
> +						  RTE_FLOW_ERROR_TYPE_ACTION,
> +						  actions,
> +						  "can't have multiple fate"
> +						  " actions");
> +		action_flags |= current_action_flag;
> +	}
>  	for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
>  		unsigned int i;
>  
> @@ -1375,136 +1505,6 @@ struct pedit_parser {
>  						  NULL, "item not supported");
>  		}
>  	}
> -	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> -		unsigned int i;
> -		uint64_t current_action_flag = 0;
> -
> -		switch (actions->type) {
> -		case RTE_FLOW_ACTION_TYPE_VOID:
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_PORT_ID:
> -			current_action_flag = MLX5_FLOW_ACTION_PORT_ID;
> -			if (!actions->conf)
> -				break;
> -			conf.port_id = actions->conf;
> -			if (conf.port_id->original)
> -				i = 0;
> -			else
> -				for (i = 0; ptoi[i].ifindex; ++i)
> -					if (ptoi[i].port_id == conf.port_id->id)
> -						break;
> -			if (!ptoi[i].ifindex)
> -				return rte_flow_error_set
> -					(error, ENODEV,
> -					 RTE_FLOW_ERROR_TYPE_ACTION_CONF,
> -					 conf.port_id,
> -					 "missing data to convert port ID to"
> -					 " ifindex");
> -			port_id_dev = &rte_eth_devices[conf.port_id->id];
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_JUMP:
> -			current_action_flag = MLX5_FLOW_ACTION_JUMP;
> -			if (!actions->conf)
> -				break;
> -			conf.jump = actions->conf;
> -			if (attr->group >= conf.jump->group)
> -				return rte_flow_error_set
> -					(error, ENOTSUP,
> -					 RTE_FLOW_ERROR_TYPE_ACTION,
> -					 actions,
> -					 "can jump only to a group forward");
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_DROP:
> -			current_action_flag = MLX5_FLOW_ACTION_DROP;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_COUNT:
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN:
> -			current_action_flag = MLX5_FLOW_ACTION_OF_POP_VLAN;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN:
> -			current_action_flag = MLX5_FLOW_ACTION_OF_PUSH_VLAN;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID:
> -			if (!(action_flags & MLX5_FLOW_ACTION_OF_PUSH_VLAN))
> -				return rte_flow_error_set
> -					(error, ENOTSUP,
> -					 RTE_FLOW_ERROR_TYPE_ACTION, actions,
> -					 "vlan modify is not supported,"
> -					 " set action must follow push action");
> -			current_action_flag = MLX5_FLOW_ACTION_OF_SET_VLAN_VID;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP:
> -			if (!(action_flags & MLX5_FLOW_ACTION_OF_PUSH_VLAN))
> -				return rte_flow_error_set
> -					(error, ENOTSUP,
> -					 RTE_FLOW_ERROR_TYPE_ACTION, actions,
> -					 "vlan modify is not supported,"
> -					 " set action must follow push action");
> -			current_action_flag = MLX5_FLOW_ACTION_OF_SET_VLAN_PCP;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_IPV4_SRC;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_IPV4_DST;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_IPV6_SRC;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_IPV6_DST;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_TP_SRC:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_TP_SRC;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_TP_DST:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_TP_DST;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_TTL:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_TTL;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_DEC_TTL:
> -			current_action_flag = MLX5_FLOW_ACTION_DEC_TTL;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_MAC_SRC;
> -			break;
> -		case RTE_FLOW_ACTION_TYPE_SET_MAC_DST:
> -			current_action_flag = MLX5_FLOW_ACTION_SET_MAC_DST;
> -			break;
> -		default:
> -			return rte_flow_error_set(error, ENOTSUP,
> -						  RTE_FLOW_ERROR_TYPE_ACTION,
> -						  actions,
> -						  "action not supported");
> -		}
> -		if (current_action_flag & MLX5_TCF_CONFIG_ACTIONS) {
> -			if (!actions->conf)
> -				return rte_flow_error_set(error, EINVAL,
> -						RTE_FLOW_ERROR_TYPE_ACTION_CONF,
> -						actions,
> -						"action configuration not set");
> -		}
> -		if ((current_action_flag & MLX5_TCF_PEDIT_ACTIONS) &&
> -		    pedit_validated)
> -			return rte_flow_error_set(error, ENOTSUP,
> -						  RTE_FLOW_ERROR_TYPE_ACTION,
> -						  actions,
> -						  "set actions should be "
> -						  "listed successively");
> -		if ((current_action_flag & ~MLX5_TCF_PEDIT_ACTIONS) &&
> -		    (action_flags & MLX5_TCF_PEDIT_ACTIONS))
> -			pedit_validated = 1;
> -		if ((current_action_flag & MLX5_TCF_FATE_ACTIONS) &&
> -		    (action_flags & MLX5_TCF_FATE_ACTIONS))
> -			return rte_flow_error_set(error, EINVAL,
> -						  RTE_FLOW_ERROR_TYPE_ACTION,
> -						  actions,
> -						  "can't have multiple fate"
> -						  " actions");
> -		action_flags |= current_action_flag;
> -	}
>  	if ((action_flags & MLX5_TCF_PEDIT_ACTIONS) &&
>  	    (action_flags & MLX5_FLOW_ACTION_DROP))
>  		return rte_flow_error_set(error, ENOTSUP,
> -- 
> 1.8.3.1
> 


More information about the dev mailing list