[PATCH v2 20/61] net/bonding: use kvargs numeric helpers
Stephen Hemminger
stephen at networkplumber.org
Tue Sep 29 18:36:23 CEST 2026
The mode, socket id and time_ms parsers all assign the strtol() result
before checking the end pointer and errno, and the mode parser truncates
into a uint8_t so "mode=257" aliases onto mode 1.
parse_port_id() has the same unchecked pattern, and did not bound the
result before using it, relying on rte_eth_dev_is_valid_port() to catch
out of range values.
The socket id parser cast to int8_t when testing for SOCKET_ID_ANY, so
any value whose low byte is 0xff, such as 255 or -257, was accepted as
SOCKET_ID_ANY.
Drop the stray errno reset in the agg mode parser, which only does
string comparisons.
Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
drivers/net/bonding/eth_bond_private.h | 8 ---
drivers/net/bonding/rte_eth_bond_args.c | 71 ++++---------------------
drivers/net/bonding/rte_eth_bond_pmd.c | 8 +--
3 files changed, 14 insertions(+), 73 deletions(-)
diff --git a/drivers/net/bonding/eth_bond_private.h b/drivers/net/bonding/eth_bond_private.h
index 378bbba4e6..9a2fb7167e 100644
--- a/drivers/net/bonding/eth_bond_private.h
+++ b/drivers/net/bonding/eth_bond_private.h
@@ -298,10 +298,6 @@ int
bond_ethdev_parse_member_agg_mode_kvarg(const char *key __rte_unused,
const char *value, void *extra_args);
-int
-bond_ethdev_parse_socket_id_kvarg(const char *key,
- const char *value, void *extra_args);
-
int
bond_ethdev_parse_primary_member_port_id_kvarg(const char *key,
const char *value, void *extra_args);
@@ -314,10 +310,6 @@ int
bond_ethdev_parse_bond_mac_addr_kvarg(const char *key,
const char *value, void *extra_args);
-int
-bond_ethdev_parse_time_ms_kvarg(const char *key,
- const char *value, void *extra_args);
-
void
bond_tlb_disable(struct bond_dev_private *internals);
diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c
index 823ed80f07..25602b3b47 100644
--- a/drivers/net/bonding/rte_eth_bond_args.c
+++ b/drivers/net/bonding/rte_eth_bond_args.c
@@ -91,13 +91,13 @@ parse_port_id(const char *port_str)
/* try parsing as device name, virtual devices */
port_id = find_port_id_by_dev_name(port_str);
if (port_id < 0) {
- char *end;
- errno = 0;
+ uint64_t val;
/* try parsing as port id */
- port_id = strtol(port_str, &end, 10);
- if (*end != 0 || errno != 0)
+ if (rte_kvargs_to_uint(port_str, 0, RTE_MAX_ETHPORTS - 1, &val) < 0)
return -1;
+
+ port_id = val;
}
}
@@ -136,19 +136,17 @@ int
bond_ethdev_parse_member_mode_kvarg(const char *key __rte_unused,
const char *value, void *extra_args)
{
- uint8_t *mode;
- char *endptr;
+ uint8_t *mode = extra_args;
+ uint64_t val;
- if (value == NULL || extra_args == NULL)
+ if (extra_args == NULL)
return -1;
- mode = extra_args;
-
- errno = 0;
- *mode = strtol(value, &endptr, 10);
- if (*endptr != 0 || errno != 0)
+ if (rte_kvargs_to_uint(value, 0, UINT8_MAX, &val) < 0)
return -1;
+ *mode = val;
+
/* validate mode value */
switch (*mode) {
case BONDING_MODE_ROUND_ROBIN:
@@ -176,7 +174,6 @@ bond_ethdev_parse_member_agg_mode_kvarg(const char *key __rte_unused,
agg_mode = extra_args;
- errno = 0;
if (strncmp(value, "stable", 6) == 0)
*agg_mode = AGG_STABLE;
@@ -197,35 +194,6 @@ bond_ethdev_parse_member_agg_mode_kvarg(const char *key __rte_unused,
}
}
-int
-bond_ethdev_parse_socket_id_kvarg(const char *key __rte_unused,
- const char *value, void *extra_args)
-{
- long socket_id;
- char *endptr;
-
- if (value == NULL || extra_args == NULL)
- return -1;
-
- errno = 0;
- socket_id = strtol(value, &endptr, 10);
- if (*endptr != 0 || errno != 0)
- return -1;
-
- /* SOCKET_ID_ANY also consider a valid socket id */
- if ((int8_t)socket_id == SOCKET_ID_ANY) {
- *(int *)extra_args = SOCKET_ID_ANY;
- return 0;
- }
-
- /* validate socket id value */
- if (socket_id >= 0 && socket_id < RTE_MAX_NUMA_NODES) {
- *(int *)extra_args = (int)socket_id;
- return 0;
- }
- return -1;
-}
-
int
bond_ethdev_parse_primary_member_port_id_kvarg(const char *key __rte_unused,
const char *value, void *extra_args)
@@ -278,22 +246,3 @@ bond_ethdev_parse_bond_mac_addr_kvarg(const char *key __rte_unused,
return rte_ether_unformat_addr(value, extra_args);
}
-int
-bond_ethdev_parse_time_ms_kvarg(const char *key __rte_unused,
- const char *value, void *extra_args)
-{
- uint32_t time_ms;
- char *endptr;
-
- if (value == NULL || extra_args == NULL)
- return -1;
-
- errno = 0;
- time_ms = (uint32_t)strtol(value, &endptr, 10);
- if (*endptr != 0 || errno != 0)
- return -1;
-
- *(uint32_t *)extra_args = time_ms;
-
- return 0;
-}
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 6a4f997b5a..766dfd9459 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -3869,7 +3869,7 @@ bond_probe(struct rte_vdev_device *dev)
arg_count = rte_kvargs_count(kvlist, PMD_BOND_SOCKET_ID_KVARG);
if (arg_count == 1) {
if (rte_kvargs_process(kvlist, PMD_BOND_SOCKET_ID_KVARG,
- &bond_ethdev_parse_socket_id_kvarg, &socket_id)
+ rte_kvargs_handle_socket_id, &socket_id)
!= 0) {
RTE_BOND_LOG(ERR, "Invalid socket Id specified for "
"bonding device %s", name);
@@ -4207,7 +4207,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
if (rte_kvargs_process(kvlist,
PMD_BOND_LSC_POLL_PERIOD_KVARG,
- &bond_ethdev_parse_time_ms_kvarg,
+ rte_kvargs_handle_u32,
&lsc_poll_interval_ms) < 0) {
RTE_BOND_LOG(INFO,
"Invalid lsc polling interval value specified for bonding"
@@ -4236,7 +4236,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
if (rte_kvargs_process(kvlist,
PMD_BOND_LINK_UP_PROP_DELAY_KVARG,
- &bond_ethdev_parse_time_ms_kvarg,
+ rte_kvargs_handle_u32,
&link_up_delay_ms) < 0) {
RTE_BOND_LOG(INFO,
"Invalid link up propagation delay value specified for"
@@ -4266,7 +4266,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
if (rte_kvargs_process(kvlist,
PMD_BOND_LINK_DOWN_PROP_DELAY_KVARG,
- &bond_ethdev_parse_time_ms_kvarg,
+ rte_kvargs_handle_u32,
&link_down_delay_ms) < 0) {
RTE_BOND_LOG(INFO,
"Invalid link down propagation delay value specified for"
--
2.53.0
More information about the dev
mailing list