[dpdk-dev] [PATCH v2 03/18] net/ixgbe: store L2 tunnel filter

Xing, Beilei beilei.xing at intel.com
Mon Jan 2 11:06:00 CET 2017


> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Wei Zhao
> Sent: Friday, December 30, 2016 3:53 PM
> To: dev at dpdk.org
> Cc: Lu, Wenzhuo <wenzhuo.lu at intel.com>; Zhao1, Wei <wei.zhao1 at intel.com>
> Subject: [dpdk-dev] [PATCH v2 03/18] net/ixgbe: store L2 tunnel filter
> 
> Add support for storing L2 tunnel filter in SW.
> 
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu at intel.com>
> Signed-off-by: Wei Zhao <wei.zhao1 at intel.com>
> ---
> 
> 
> +static inline struct ixgbe_l2_tn_filter *
> +ixgbe_l2_tn_filter_lookup(struct ixgbe_l2_tn_info *l2_tn_info,
> +			  struct ixgbe_l2_tn_key *key)
> +{
> +	int ret = 0;

Needles initialization since ret will be set bellow, it can be removed.
And this initialization can be removed in other filter lookup/insert/delete functions, either.

> +
> +	ret = rte_hash_lookup(l2_tn_info->hash_handle, (const void *)key);
> +	if (ret < 0)
> +		return NULL;
> +
> +	return l2_tn_info->hash_map[ret];
> +}
> +
> +static inline int
> +ixgbe_insert_l2_tn_filter(struct ixgbe_l2_tn_info *l2_tn_info,
> +			  struct ixgbe_l2_tn_filter *l2_tn_filter) {
> +	int ret = 0;
> +
> +	ret = rte_hash_add_key(l2_tn_info->hash_handle,
> +			       &l2_tn_filter->key);
> +
> +	if (ret < 0) {
> +		PMD_DRV_LOG(ERR,
> +			    "Failed to insert L2 tunnel filter"
> +			    " to hash table %d!",
> +			    ret);
> +		return ret;
> +	}
> +
> +	l2_tn_info->hash_map[ret] = l2_tn_filter;
> +
> +	TAILQ_INSERT_TAIL(&l2_tn_info->l2_tn_list, l2_tn_filter, entries);
> +
> +	return 0;
> +}

>  /* Add l2 tunnel filter */
>  static int
>  ixgbe_dev_l2_tunnel_filter_add(struct rte_eth_dev *dev,
>  			       struct rte_eth_l2_tunnel_conf *l2_tunnel)  {
>  	int ret = 0;
> +	struct ixgbe_l2_tn_info *l2_tn_info =
> +		IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
> +	struct ixgbe_l2_tn_key key;
> +	struct ixgbe_l2_tn_filter *node;
> +
> +	key.l2_tn_type = l2_tunnel->l2_tunnel_type;
> +	key.tn_id = l2_tunnel->tunnel_id;
> +
> +	node = ixgbe_l2_tn_filter_lookup(l2_tn_info, &key);
> +
> +	if (node) {
> +		PMD_DRV_LOG(ERR, "The L2 tunnel filter already exists!");
> +		return -EINVAL;
> +	}
> +
> +	node = rte_zmalloc("ixgbe_l2_tn",
> +			   sizeof(struct ixgbe_l2_tn_filter),
> +			   0);
> +	if (!node)
> +		return -ENOMEM;
> +
> +	(void)rte_memcpy(&node->key,
> +			 &key,
> +			 sizeof(struct ixgbe_l2_tn_key));
> +	node->pool = l2_tunnel->pool;
> +	ret = ixgbe_insert_l2_tn_filter(l2_tn_info, node);
> +	if (ret < 0) {
> +		rte_free(node);
> +		return ret;
> +	}
> 
>  	switch (l2_tunnel->l2_tunnel_type) {
>  	case RTE_L2_TUNNEL_TYPE_E_TAG:
> @@ -7195,6 +7340,9 @@ ixgbe_dev_l2_tunnel_filter_add(struct rte_eth_dev
> *dev,
>  		break;
>  	}
> 
> +	if (ret < 0)
> +		(void)ixgbe_remove_l2_tn_filter(l2_tn_info, &key);

Some confusion, why remove l2_tn_filter here? Can this check be moved before ixgbe_insert_l2_tn_filter?

> +
>  	return ret;
>  }
> 
> @@ -7204,6 +7352,15 @@ ixgbe_dev_l2_tunnel_filter_del(struct rte_eth_dev
> *dev,
>  			       struct rte_eth_l2_tunnel_conf *l2_tunnel)  {
>  	int ret = 0;
> +	struct ixgbe_l2_tn_info *l2_tn_info =
> +		IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
> +	struct ixgbe_l2_tn_key key;
> +
> +	key.l2_tn_type = l2_tunnel->l2_tunnel_type;
> +	key.tn_id = l2_tunnel->tunnel_id;
> +	ret = ixgbe_remove_l2_tn_filter(l2_tn_info, &key);
> +	if (ret < 0)
> +		return ret;
> 
>  	switch (l2_tunnel->l2_tunnel_type) {
>  	case RTE_L2_TUNNEL_TYPE_E_TAG:
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 8310220..6663fc9 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -132,6 +132,7 @@
>  #define IXGBE_RX_VEC_START
> RTE_INTR_VEC_RXTX_OFFSET
> 
>  #define IXGBE_MAX_FDIR_FILTER_NUM       (1024 * 32)
> +#define IXGBE_MAX_L2_TN_FILTER_NUM      128
> 
>  /*
>   * Information about the fdir mode.
> @@ -283,6 +284,25 @@ struct ixgbe_filter_info {
>  	uint32_t syn_info;
>  };
> 
> +struct ixgbe_l2_tn_key {
> +	enum rte_eth_tunnel_type          l2_tn_type;
> +	uint32_t                          tn_id;
> +};
> +
> +struct ixgbe_l2_tn_filter {
> +	TAILQ_ENTRY(ixgbe_l2_tn_filter)    entries;
> +	struct ixgbe_l2_tn_key             key;
> +	uint32_t                           pool;

Maybe more comments here will be helpful.

> +};
> +


More information about the dev mailing list