All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matan Azrad <matan@mellanox.com>
To: Suanming Mou <suanmingm@mellanox.com>,
	Shahaf Shuler <shahafs@mellanox.com>,
	Slava Ovsiienko <viacheslavo@mellanox.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>, Raslan Darawsheh <rasland@mellanox.com>
Subject: Re: [dpdk-dev] [PATCH v2 2/2] net/mlx5: add IPv4/IPv6 DSCP rewrite action
Date: Tue, 7 Jan 2020 07:26:34 +0000	[thread overview]
Message-ID: <AM0PR0502MB4019D6419C59529B7FCF9FF0D23F0@AM0PR0502MB4019.eurprd05.prod.outlook.com> (raw)
In-Reply-To: <1578381843-110954-3-git-send-email-suanmingm@mellanox.com>



From: Suanming Mou
> This commit add the IPv4/IPv6 DSCP rewrite actions to the PMD code.
> 
> Supported actions:
> RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP
> RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP
> 
> Signed-off-by: Suanming Mou <suanmingm@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
> ---
>  drivers/net/mlx5/mlx5_flow.h    |   6 +-
>  drivers/net/mlx5/mlx5_flow_dv.c | 184
> ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 189 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
> index 27d82ac..e42c98a 100644
> --- a/drivers/net/mlx5/mlx5_flow.h
> +++ b/drivers/net/mlx5/mlx5_flow.h
> @@ -196,6 +196,8 @@ enum mlx5_feature_name {  #define
> MLX5_FLOW_ACTION_MARK_EXT (1ull << 33)  #define
> MLX5_FLOW_ACTION_SET_META (1ull << 34)  #define
> MLX5_FLOW_ACTION_METER (1ull << 35)
> +#define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 36) #define
> +MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 37)
> 
>  #define MLX5_FLOW_FATE_ACTIONS \
>  	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
> @@ -232,7 +234,9 @@ enum mlx5_feature_name {
>  				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID
> | \
>  				      MLX5_FLOW_ACTION_SET_TAG | \
>  				      MLX5_FLOW_ACTION_MARK_EXT | \
> -				      MLX5_FLOW_ACTION_SET_META)
> +				      MLX5_FLOW_ACTION_SET_META | \
> +				      MLX5_FLOW_ACTION_SET_IPV4_DSCP | \
> +				      MLX5_FLOW_ACTION_SET_IPV6_DSCP)
> 
>  #define MLX5_FLOW_VLAN_ACTIONS
> (MLX5_FLOW_ACTION_OF_POP_VLAN | \
>  				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
> diff --git a/drivers/net/mlx5/mlx5_flow_dv.c
> b/drivers/net/mlx5/mlx5_flow_dv.c index 4c16281..685fceb 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -157,6 +157,7 @@ struct field_modify_info modify_vlan_out_first_vid[]
> = {  };
> 
>  struct field_modify_info modify_ipv4[] = {
> +	{1,  1, MLX5_MODI_OUT_IP_DSCP},
>  	{1,  8, MLX5_MODI_OUT_IPV4_TTL},
>  	{4, 12, MLX5_MODI_OUT_SIPV4},
>  	{4, 16, MLX5_MODI_OUT_DIPV4},
> @@ -164,6 +165,7 @@ struct field_modify_info modify_ipv4[] = {  };
> 
>  struct field_modify_info modify_ipv6[] = {
> +	{1,  0, MLX5_MODI_OUT_IP_DSCP},
>  	{1,  7, MLX5_MODI_OUT_IPV6_HOPLIMIT},
>  	{4,  8, MLX5_MODI_OUT_SIPV6_127_96},
>  	{4, 12, MLX5_MODI_OUT_SIPV6_95_64},
> @@ -1191,6 +1193,82 @@ struct field_modify_info modify_tcp[] = {  }
> 
>  /**
> + * Convert modify-header set IPv4 DSCP action to DV specification.
> + *
> + * @param[in,out] resource
> + *   Pointer to the modify-header resource.
> + * @param[in] action
> + *   Pointer to action specification.
> + * @param[out] error
> + *   Pointer to the error structure.
> + *
> + * @return
> + *   0 on success, a negative errno value otherwise and rte_errno is set.
> + */
> +static int
> +flow_dv_convert_action_modify_ipv4_dscp
> +			(struct mlx5_flow_dv_modify_hdr_resource
> *resource,
> +			 const struct rte_flow_action *action,
> +			 struct rte_flow_error *error)
> +{
> +	const struct rte_flow_action_set_dscp *conf =
> +		(const struct rte_flow_action_set_dscp *)(action->conf);
> +	struct rte_flow_item item = { .type = RTE_FLOW_ITEM_TYPE_IPV4 };
> +	struct rte_flow_item_ipv4 ipv4;
> +	struct rte_flow_item_ipv4 ipv4_mask;
> +
> +	memset(&ipv4, 0, sizeof(ipv4));
> +	memset(&ipv4_mask, 0, sizeof(ipv4_mask));
> +	ipv4.hdr.type_of_service = conf->dscp;
> +	ipv4_mask.hdr.type_of_service = RTE_IPV4_HDR_DSCP_MASK >> 2;
> +	item.spec = &ipv4;
> +	item.mask = &ipv4_mask;
> +	return flow_dv_convert_modify_action(&item, modify_ipv4, NULL,
> resource,
> +					     MLX5_MODIFICATION_TYPE_SET,
> error); }
> +
> +/**
> + * Convert modify-header set IPv6 DSCP action to DV specification.
> + *
> + * @param[in,out] resource
> + *   Pointer to the modify-header resource.
> + * @param[in] action
> + *   Pointer to action specification.
> + * @param[out] error
> + *   Pointer to the error structure.
> + *
> + * @return
> + *   0 on success, a negative errno value otherwise and rte_errno is set.
> + */
> +static int
> +flow_dv_convert_action_modify_ipv6_dscp
> +			(struct mlx5_flow_dv_modify_hdr_resource
> *resource,
> +			 const struct rte_flow_action *action,
> +			 struct rte_flow_error *error)
> +{
> +	const struct rte_flow_action_set_dscp *conf =
> +		(const struct rte_flow_action_set_dscp *)(action->conf);
> +	struct rte_flow_item item = { .type = RTE_FLOW_ITEM_TYPE_IPV6 };
> +	struct rte_flow_item_ipv6 ipv6;
> +	struct rte_flow_item_ipv6 ipv6_mask;
> +
> +	memset(&ipv6, 0, sizeof(ipv6));
> +	memset(&ipv6_mask, 0, sizeof(ipv6_mask));
> +	/*
> +	 * Even though the DSCP bits offset of IPv6 is not byte aligned,
> +	 * rdma-core only accept the DSCP bits byte aligned start from
> +	 * bit 0 to 5 as to be compatible with IPv4. No need to shift the
> +	 * bits in IPv6 case as rdma-core requires byte aligned value.
> +	 */
> +	ipv6.hdr.vtc_flow = conf->dscp;
> +	ipv6_mask.hdr.vtc_flow = RTE_IPV6_HDR_DSCP_MASK >> 22;
> +	item.spec = &ipv6;
> +	item.mask = &ipv6_mask;
> +	return flow_dv_convert_modify_action(&item, modify_ipv6, NULL,
> resource,
> +					     MLX5_MODIFICATION_TYPE_SET,
> error); }
> +
> +/**
>   * Validate MARK item.
>   *
>   * @param[in] dev
> @@ -3433,6 +3511,74 @@ struct field_modify_info modify_tcp[] = {  }
> 
>  /**
> + * Validate the modify-header IPv4 DSCP actions.
> + *
> + * @param[in] action_flags
> + *   Holds the actions detected until now.
> + * @param[in] action
> + *   Pointer to the modify action.
> + * @param[in] item_flags
> + *   Holds the items detected.
> + * @param[out] error
> + *   Pointer to error structure.
> + *
> + * @return
> + *   0 on success, a negative errno value otherwise and rte_errno is set.
> + */
> +static int
> +flow_dv_validate_action_modify_ipv4_dscp(const uint64_t action_flags,
> +					 const struct rte_flow_action *action,
> +					 const uint64_t item_flags,
> +					 struct rte_flow_error *error)
> +{
> +	int ret = 0;
> +
> +	ret = flow_dv_validate_action_modify_hdr(action_flags, action,
> error);
> +	if (!ret) {
> +		if (!(item_flags & MLX5_FLOW_LAYER_L3_IPV4))
> +			return rte_flow_error_set(error, EINVAL,
> +
> RTE_FLOW_ERROR_TYPE_ACTION,
> +						  NULL,
> +						  "no ipv4 item in pattern");
> +	}
> +	return ret;
> +}
> +
> +/**
> + * Validate the modify-header IPv6 DSCP actions.
> + *
> + * @param[in] action_flags
> + *   Holds the actions detected until now.
> + * @param[in] action
> + *   Pointer to the modify action.
> + * @param[in] item_flags
> + *   Holds the items detected.
> + * @param[out] error
> + *   Pointer to error structure.
> + *
> + * @return
> + *   0 on success, a negative errno value otherwise and rte_errno is set.
> + */
> +static int
> +flow_dv_validate_action_modify_ipv6_dscp(const uint64_t action_flags,
> +					 const struct rte_flow_action *action,
> +					 const uint64_t item_flags,
> +					 struct rte_flow_error *error)
> +{
> +	int ret = 0;
> +
> +	ret = flow_dv_validate_action_modify_hdr(action_flags, action,
> error);
> +	if (!ret) {
> +		if (!(item_flags & MLX5_FLOW_LAYER_L3_IPV6))
> +			return rte_flow_error_set(error, EINVAL,
> +
> RTE_FLOW_ERROR_TYPE_ACTION,
> +						  NULL,
> +						  "no ipv6 item in pattern");
> +	}
> +	return ret;
> +}
> +
> +/**
>   * Find existing modify-header resource or create and register a new one.
>   *
>   * @param dev[in, out]
> @@ -4806,6 +4952,32 @@ struct field_modify_info modify_tcp[] = {
>  			action_flags |= MLX5_FLOW_ACTION_METER;
>  			++actions_n;
>  			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP:
> +			ret = flow_dv_validate_action_modify_ipv4_dscp
> +							 (action_flags,
> +							  actions,
> +							  item_flags,
> +							  error);
> +			if (ret < 0)
> +				return ret;
> +			/* Count all modify-header actions as one action. */
> +			if (!(action_flags &
> MLX5_FLOW_MODIFY_HDR_ACTIONS))
> +				++actions_n;
> +			action_flags |=
> MLX5_FLOW_ACTION_SET_IPV4_DSCP;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP:
> +			ret = flow_dv_validate_action_modify_ipv6_dscp
> +								(action_flags,
> +								 actions,
> +								 item_flags,
> +								 error);
> +			if (ret < 0)
> +				return ret;
> +			/* Count all modify-header actions as one action. */
> +			if (!(action_flags &
> MLX5_FLOW_MODIFY_HDR_ACTIONS))
> +				++actions_n;
> +			action_flags |=
> MLX5_FLOW_ACTION_SET_IPV6_DSCP;
> +			break;
>  		default:
>  			return rte_flow_error_set(error, ENOTSUP,
> 
> RTE_FLOW_ERROR_TYPE_ACTION,
> @@ -7101,6 +7273,18 @@ struct field_modify_info modify_tcp[] = {
>  				flow->meter->mfts->meter_action;
>  			action_flags |= MLX5_FLOW_ACTION_METER;
>  			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP:
> +			if
> (flow_dv_convert_action_modify_ipv4_dscp(&mhdr_res,
> +							      actions, error))
> +				return -rte_errno;
> +			action_flags |=
> MLX5_FLOW_ACTION_SET_IPV4_DSCP;
> +			break;
> +		case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP:
> +			if
> (flow_dv_convert_action_modify_ipv6_dscp(&mhdr_res,
> +							      actions, error))
> +				return -rte_errno;
> +			action_flags |=
> MLX5_FLOW_ACTION_SET_IPV6_DSCP;
> +			break;
>  		case RTE_FLOW_ACTION_TYPE_END:
>  			actions_end = true;
>  			if (mhdr_res.actions_num) {
> --
> 1.8.3.1


  reply	other threads:[~2020-01-07  7:26 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-02  6:04 [dpdk-dev] [PATCH 0/2] add IPv4/IPv6 DSCP rewrite action Suanming Mou
2020-01-02  6:04 ` [dpdk-dev] [PATCH 1/2] ethdev: " Suanming Mou
2020-01-02  6:04 ` [dpdk-dev] [PATCH 2/2] net/mlx5: " Suanming Mou
2020-01-06 14:36   ` Matan Azrad
2020-01-07  6:33     ` Suanming Mou
2020-01-07  7:24 ` [dpdk-dev] [PATCH v2 0/2] " Suanming Mou
2020-01-07  7:24   ` [dpdk-dev] [PATCH v2 1/2] ethdev: " Suanming Mou
2020-01-07  7:24   ` [dpdk-dev] [PATCH v2 2/2] net/mlx5: " Suanming Mou
2020-01-07  7:26     ` Matan Azrad [this message]
2020-01-10 18:55   ` [dpdk-dev] [PATCH v2 0/2] " Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM0PR0502MB4019D6419C59529B7FCF9FF0D23F0@AM0PR0502MB4019.eurprd05.prod.outlook.com \
    --to=matan@mellanox.com \
    --cc=dev@dpdk.org \
    --cc=rasland@mellanox.com \
    --cc=shahafs@mellanox.com \
    --cc=suanmingm@mellanox.com \
    --cc=viacheslavo@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.