parse_integer_arg() and parse_budget_arg() do not check the end pointer
or errno, so "start_queue=foo" is silently taken as zero, and they store
the unvalidated result before testing it, so a rejected argument still
overwrites the caller's default.

The shared_umem, force_copy, use_cni and use_pinned_map arguments are
booleans, and are already stored as bool in the internals, so parse them
as bool rather than as int.

The booleans use rte_kvargs_process_opt(), so that a bare key with no
value enables the option.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/net/af_xdp/rte_eth_af_xdp.c | 68 +++++++++++++++++------------
 1 file changed, 39 insertions(+), 29 deletions(-)

diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c 
b/drivers/net/af_xdp/rte_eth_af_xdp.c
index 2cdb533276..30739d07bc 100644
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c
@@ -3,6 +3,8 @@
  */
 #include <unistd.h>
 #include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include <netinet/in.h>
@@ -2002,16 +2004,20 @@ static int
 parse_budget_arg(const char *key __rte_unused,
                  const char *value, void *extra_args)
 {
-       int *i = (int *)extra_args;
-       char *end;
+       int64_t val;
+       int ret;
 
-       *i = strtol(value, &end, 10);
-       if (*i < 0 || *i > UINT16_MAX) {
-               AF_XDP_LOG_LINE(ERR, "Invalid busy_budget %i, must be >= 0 and 
<= %u",
-                               *i, UINT16_MAX);
+       if (extra_args == NULL)
                return -EINVAL;
+
+       ret = rte_kvargs_to_int(value, 0, UINT16_MAX, &val);
+       if (ret < 0) {
+               AF_XDP_LOG_LINE(ERR, "Invalid busy_budget %s, must be >= 0 and 
<= %u",
+                               value == NULL ? "" : value, UINT16_MAX);
+               return ret;
        }
 
+       *(int *)extra_args = val;
        return 0;
 }
 
@@ -2020,15 +2026,19 @@ static int
 parse_integer_arg(const char *key __rte_unused,
                  const char *value, void *extra_args)
 {
-       int *i = (int *)extra_args;
-       char *end;
+       int64_t val;
+       int ret;
 
-       *i = strtol(value, &end, 10);
-       if (*i < 0) {
-               AF_XDP_LOG_LINE(ERR, "Argument has to be positive.");
+       if (extra_args == NULL)
                return -EINVAL;
+
+       ret = rte_kvargs_to_int(value, 0, INT_MAX, &val);
+       if (ret < 0) {
+               AF_XDP_LOG_LINE(ERR, "Argument has to be positive.");
+               return ret;
        }
 
+       *(int *)extra_args = val;
        return 0;
 }
 
@@ -2144,9 +2154,9 @@ xdp_get_channels_info(const char *if_name, int 
*max_queues,
 
 static int
 parse_parameters(struct rte_kvargs *kvlist, char *if_name, int *start_queue,
-                int *queue_cnt, int *shared_umem, char *prog_path,
-                int *busy_budget, int *force_copy, int *use_cni,
-                int *use_pinned_map, char *dp_path, uint32_t *xdp_mode)
+                int *queue_cnt, bool *shared_umem, char *prog_path,
+                int *busy_budget, bool *force_copy, bool *use_cni,
+                bool *use_pinned_map, char *dp_path, uint32_t *xdp_mode)
 {
        int ret;
 
@@ -2167,8 +2177,8 @@ parse_parameters(struct rte_kvargs *kvlist, char 
*if_name, int *start_queue,
                goto free_kvlist;
        }
 
-       ret = rte_kvargs_process(kvlist, ETH_AF_XDP_SHARED_UMEM_ARG,
-                               &parse_integer_arg, shared_umem);
+       ret = rte_kvargs_process_opt(kvlist, ETH_AF_XDP_SHARED_UMEM_ARG,
+                               rte_kvargs_handle_bool, shared_umem);
        if (ret < 0)
                goto free_kvlist;
 
@@ -2182,18 +2192,18 @@ parse_parameters(struct rte_kvargs *kvlist, char 
*if_name, int *start_queue,
        if (ret < 0)
                goto free_kvlist;
 
-       ret = rte_kvargs_process(kvlist, ETH_AF_XDP_FORCE_COPY_ARG,
-                               &parse_integer_arg, force_copy);
+       ret = rte_kvargs_process_opt(kvlist, ETH_AF_XDP_FORCE_COPY_ARG,
+                               rte_kvargs_handle_bool, force_copy);
        if (ret < 0)
                goto free_kvlist;
 
-       ret = rte_kvargs_process(kvlist, ETH_AF_XDP_USE_CNI_ARG,
-                                &parse_integer_arg, use_cni);
+       ret = rte_kvargs_process_opt(kvlist, ETH_AF_XDP_USE_CNI_ARG,
+                                    rte_kvargs_handle_bool, use_cni);
        if (ret < 0)
                goto free_kvlist;
 
-       ret = rte_kvargs_process(kvlist, ETH_AF_XDP_USE_PINNED_MAP_ARG,
-                                &parse_integer_arg, use_pinned_map);
+       ret = rte_kvargs_process_opt(kvlist, ETH_AF_XDP_USE_PINNED_MAP_ARG,
+                                    rte_kvargs_handle_bool, use_pinned_map);
        if (ret < 0)
                goto free_kvlist;
 
@@ -2246,9 +2256,9 @@ get_iface_info(const char *if_name,
 
 static struct rte_eth_dev *
 init_internals(struct rte_vdev_device *dev, const char *if_name,
-              int start_queue_idx, int queue_cnt, int shared_umem,
-              const char *prog_path, int busy_budget, int force_copy,
-              int use_cni, int use_pinned_map, const char *dp_path, uint32_t 
xdp_mode)
+              int start_queue_idx, int queue_cnt, bool shared_umem,
+              const char *prog_path, int busy_budget, bool force_copy,
+              bool use_cni, bool use_pinned_map, const char *dp_path, uint32_t 
xdp_mode)
 {
        const char *name = rte_vdev_device_name(dev);
        const unsigned int numa_node = dev->device.numa_node;
@@ -2466,12 +2476,12 @@ rte_pmd_af_xdp_probe(struct rte_vdev_device *dev)
        char if_name[IFNAMSIZ] = {'\0'};
        int xsk_start_queue_idx = ETH_AF_XDP_DFLT_START_QUEUE_IDX;
        int xsk_queue_cnt = ETH_AF_XDP_DFLT_QUEUE_COUNT;
-       int shared_umem = 0;
+       bool shared_umem = false;
        char prog_path[PATH_MAX] = {'\0'};
        int busy_budget = -1, ret;
-       int force_copy = 0;
-       int use_cni = 0;
-       int use_pinned_map = 0;
+       bool force_copy = false;
+       bool use_cni = false;
+       bool use_pinned_map = false;
        uint32_t xdp_mode = 0;
        char dp_path[PATH_MAX] = {'\0'};
        struct rte_eth_dev *eth_dev = NULL;
-- 
2.53.0

Reply via email to