[v1,2/3] net/ice: add devarg for ACL ipv4 rule number
diff mbox series

Message ID 1599723455-353059-3-git-send-email-simei.su@intel.com
State Superseded
Delegated to: Qi Zhang
Headers show
Series
  • net/ice: support DCF ACL capabiltiy
Related show

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Simei Su Sept. 10, 2020, 7:37 a.m. UTC
This patch enables devargs for ACL ipv4 rule number and refactor
DCF capability selection API to be more flexible.

Signed-off-by: Simei Su <simei.su@intel.com>
---
 drivers/net/ice/ice_dcf_ethdev.c | 102 ++++++++++++++++++++++++++++++---------
 drivers/net/ice/ice_ethdev.h     |   1 +
 2 files changed, 80 insertions(+), 23 deletions(-)

Comments

Haiyue Wang Sept. 10, 2020, 7:53 a.m. UTC | #1
> -----Original Message-----
> From: Su, Simei <simei.su@intel.com>
> Sent: Thursday, September 10, 2020 15:38
> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Yang, Qiming <qiming.yang@intel.com>
> Cc: dev@dpdk.org; Wang, Haiyue <haiyue.wang@intel.com>; Xing, Beilei <beilei.xing@intel.com>; Su,
> Simei <simei.su@intel.com>
> Subject: [PATCH v1 2/3] net/ice: add devarg for ACL ipv4 rule number
> 
> This patch enables devargs for ACL ipv4 rule number and refactor
> DCF capability selection API to be more flexible.
> 
> Signed-off-by: Simei Su <simei.su@intel.com>
> ---


> 
>  static int
> -ice_dcf_cap_check_handler(__rte_unused const char *key,
> -			  const char *value, __rte_unused void *opaque)
> +handle_dcf_arg(__rte_unused const char *key, const char *value,
> +		 __rte_unused void *arg)
>  {
> -	if (strcmp(value, "dcf"))
> -		return -1;
> +	bool *dcf = arg;
> +
> +	if (arg == NULL || value == NULL)
> +		return -EINVAL;
> +
> +	if (strcmp(value, "dcf") == 0)
> +		*dcf = true;
> +	else
> +		*dcf = false;
> 
>  	return 0;
>  }
> 
> -static int
> -ice_dcf_cap_selected(struct rte_devargs *devargs)
> +static bool
> +check_cap_dcf_enable(struct rte_devargs *devargs)
>  {
>  	struct rte_kvargs *kvlist;
> -	const char *key = "cap";
> -	int ret = 0;
> +	bool enable = false;
> 
>  	if (devargs == NULL)
> -		return 0;
> +		return false;
> 
>  	kvlist = rte_kvargs_parse(devargs->args, NULL);
>  	if (kvlist == NULL)
> -		return 0;
> -
> -	if (!rte_kvargs_count(kvlist, key))
> -		goto exit;
> -
> -	/* dcf capability selected when there's a key-value pair: cap=dcf */
> -	if (rte_kvargs_process(kvlist, key,
> -			       ice_dcf_cap_check_handler, NULL) < 0)
> -		goto exit;
> +		return false;
> 
> -	ret = 1;
> +	rte_kvargs_process(kvlist, ICE_DCF_CAP, handle_dcf_arg, &enable);
> 
> -exit:
>  	rte_kvargs_free(kvlist);
> -	return ret;
> +
> +	return enable;
>  }
> 
>  static int eth_ice_dcf_pci_probe(__rte_unused struct rte_pci_driver *pci_drv,
>  			     struct rte_pci_device *pci_dev)
>  {
> -	if (!ice_dcf_cap_selected(pci_dev->device.devargs))
> -		return 1;
> +	if (!check_cap_dcf_enable(pci_dev->device.devargs))
> +		return 1;  /* continue to probe */
> 

I didn't see how flexible about DCF capability selection. ;-)

And you add the unneeded comment "/* continue to probe */" that I did before.

>  	return rte_eth_dev_pci_generic_probe(pci_dev,
>  					     sizeof(struct ice_dcf_adapter),
> diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h
> index 758caa8..13f4167 100644
> --- a/drivers/net/ice/ice_ethdev.h
> +++ b/drivers/net/ice/ice_ethdev.h
> @@ -447,6 +447,7 @@ struct ice_devargs {
>  	int pipe_mode_support;
>  	int flow_mark_support;
>  	uint8_t proto_xtr[ICE_MAX_QUEUE_NUM];
> +	int acl_ipv4_rules_num;
>  };
> 
>  /**
> --
> 1.8.3.1

Patch
diff mbox series

diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index 2faed3c..3238ce2 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -26,6 +26,16 @@ 
 #include "ice_dcf_ethdev.h"
 #include "ice_rxtx.h"
 
+/* devargs */
+#define ICE_DCF_CAP  "cap"
+#define ICE_DCF_ACL_IPV4_RULES_NUM "acl_ipv4_nums"
+
+static const char * const ice_dcf_valid_args[] = {
+	ICE_DCF_CAP,
+	ICE_DCF_ACL_IPV4_RULES_NUM,
+	NULL,
+};
+
 static uint16_t
 ice_dcf_recv_pkts(__rte_unused void *rx_queue,
 		  __rte_unused struct rte_mbuf **bufs,
@@ -895,9 +905,51 @@ 
 };
 
 static int
+parse_int(__rte_unused const char *key, const char *value, void *args)
+{
+	int *i = (int *)args;
+	char *end;
+	int num;
+
+	num = strtoul(value, &end, 10);
+	*i = num;
+
+	return 0;
+}
+
+static int ice_dcf_parse_devargs(struct rte_eth_dev *dev)
+{
+	struct ice_dcf_adapter *adapter = dev->data->dev_private;
+	struct ice_adapter *parent_adapter = &adapter->parent;
+
+	struct rte_devargs *devargs = dev->device->devargs;
+	struct rte_kvargs *kvlist;
+	int ret;
+
+	if (devargs == NULL)
+		return 0;
+
+	kvlist = rte_kvargs_parse(devargs->args, ice_dcf_valid_args);
+	if (kvlist == NULL) {
+		PMD_INIT_LOG(ERR, "Invalid kvargs key\n");
+		return -EINVAL;
+	}
+
+	ret = rte_kvargs_process(kvlist, ICE_DCF_ACL_IPV4_RULES_NUM,
+		&parse_int, &parent_adapter->devargs.acl_ipv4_rules_num);
+	if (ret)
+		goto bail;
+
+bail:
+	rte_kvargs_free(kvlist);
+	return ret;
+}
+
+static int
 ice_dcf_dev_init(struct rte_eth_dev *eth_dev)
 {
 	struct ice_dcf_adapter *adapter = eth_dev->data->dev_private;
+	int ret;
 
 	eth_dev->dev_ops = &ice_dcf_eth_dev_ops;
 	eth_dev->rx_pkt_burst = ice_dcf_recv_pkts;
@@ -908,6 +960,12 @@ 
 
 	eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
 
+	ret = ice_dcf_parse_devargs(eth_dev);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failed to parse devargs");
+		return -EINVAL;
+	}
+
 	adapter->real_hw.vc_event_msg_cb = ice_dcf_handle_pf_event_msg;
 	if (ice_dcf_init_hw(eth_dev, &adapter->real_hw) != 0) {
 		PMD_INIT_LOG(ERR, "Failed to init DCF hardware");
@@ -932,49 +990,47 @@ 
 }
 
 static int
-ice_dcf_cap_check_handler(__rte_unused const char *key,
-			  const char *value, __rte_unused void *opaque)
+handle_dcf_arg(__rte_unused const char *key, const char *value,
+		 __rte_unused void *arg)
 {
-	if (strcmp(value, "dcf"))
-		return -1;
+	bool *dcf = arg;
+
+	if (arg == NULL || value == NULL)
+		return -EINVAL;
+
+	if (strcmp(value, "dcf") == 0)
+		*dcf = true;
+	else
+		*dcf = false;
 
 	return 0;
 }
 
-static int
-ice_dcf_cap_selected(struct rte_devargs *devargs)
+static bool
+check_cap_dcf_enable(struct rte_devargs *devargs)
 {
 	struct rte_kvargs *kvlist;
-	const char *key = "cap";
-	int ret = 0;
+	bool enable = false;
 
 	if (devargs == NULL)
-		return 0;
+		return false;
 
 	kvlist = rte_kvargs_parse(devargs->args, NULL);
 	if (kvlist == NULL)
-		return 0;
-
-	if (!rte_kvargs_count(kvlist, key))
-		goto exit;
-
-	/* dcf capability selected when there's a key-value pair: cap=dcf */
-	if (rte_kvargs_process(kvlist, key,
-			       ice_dcf_cap_check_handler, NULL) < 0)
-		goto exit;
+		return false;
 
-	ret = 1;
+	rte_kvargs_process(kvlist, ICE_DCF_CAP, handle_dcf_arg, &enable);
 
-exit:
 	rte_kvargs_free(kvlist);
-	return ret;
+
+	return enable;
 }
 
 static int eth_ice_dcf_pci_probe(__rte_unused struct rte_pci_driver *pci_drv,
 			     struct rte_pci_device *pci_dev)
 {
-	if (!ice_dcf_cap_selected(pci_dev->device.devargs))
-		return 1;
+	if (!check_cap_dcf_enable(pci_dev->device.devargs))
+		return 1;  /* continue to probe */
 
 	return rte_eth_dev_pci_generic_probe(pci_dev,
 					     sizeof(struct ice_dcf_adapter),
diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h
index 758caa8..13f4167 100644
--- a/drivers/net/ice/ice_ethdev.h
+++ b/drivers/net/ice/ice_ethdev.h
@@ -447,6 +447,7 @@  struct ice_devargs {
 	int pipe_mode_support;
 	int flow_mark_support;
 	uint8_t proto_xtr[ICE_MAX_QUEUE_NUM];
+	int acl_ipv4_rules_num;
 };
 
 /**