From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>
Subject: [PATCH v2 03/61] kvargs: add hexadecimal conversion helpers
Date: Tue, 29 Sep 2026 09:36:06 -0700 [thread overview]
Message-ID: <20260929163800.1108305-4-stephen@networkplumber.org> (raw)
In-Reply-To: <20260929163800.1108305-1-stephen@networkplumber.org>
Several device arguments are documented as a bare hexadecimal mask, with
no 0x prefix, such as the ice hw_debug_mask, the cxgbe filtermode
and filtermask, the hns3 dev_caps_mask and the ark Pkt_dir. Each
open codes strtoull() with base 16, and each gets the validation
wrong in a familiar way. ice checks errno but not the end pointer,
cxgbe checks errno without clearing it first, and hns3 checks
nothing at all, so dev_caps_mask=junk is silently taken as zero.
The existing helpers cannot be used for these. They read base 16 only
when the value carries an explicit 0x prefix, so a documented bare mask
containing a letter, such as "ff", would be rejected outright, while one
which happens to be all digits, such as "10", would be reread as decimal
and change from sixteen to ten.
The second case is the dangerous one: it silently changes the meaning of
a working command line instead of rejecting it, which is the one kind of
breakage the rest of this series is careful to avoid.
Add rte_kvargs_handle_hex32() and rte_kvargs_handle_hex64(), which are
the same as rte_kvargs_handle_u32() and rte_kvargs_handle_u64() except
that the value is always read as hexadecimal, whether or not it carries
a 0x prefix. Expose the underlying rte_kvargs_to_hex() for a mask
narrower than the target type.
A sign is rejected, as it is for the unsigned handlers, so a mask cannot
be given as -1.
Only the 32 and 64 bit widths are added, since those are the only ones
any caller needs; the family can be extended on demand.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
app/test/test_kvargs.c | 45 +++++++++
doc/guides/rel_notes/release_26_11.rst | 8 +-
lib/kvargs/rte_kvargs.c | 131 ++++++++++++++++++++++---
lib/kvargs/rte_kvargs.h | 44 +++++++++
4 files changed, 213 insertions(+), 15 deletions(-)
diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index f05c7918e9..6e84ebf35c 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -475,6 +475,50 @@ test_handle_signed(void)
return TEST_SUCCESS;
}
+static int
+test_handle_hex(void)
+{
+ uint64_t u = 0x5a;
+
+ /* The 0x prefix is optional, and a bare value is still hexadecimal. */
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "0xff", 0xff);
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "0XFF", 0xff);
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "ff", 0xff);
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "FF", 0xff);
+ /* "10" is sixteen here, not ten. */
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "10", 0x10);
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "0", 0);
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "00110F10", 0x00110f10);
+ CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "ffffffff", 0xffffffff);
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "100000000");
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "");
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "-1");
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "0x");
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "0x0x10");
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "1g");
+ CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "0x1p");
+
+ CHECK_GOOD(rte_kvargs_handle_hex64, uint64_t, "0xF", 0xf);
+ CHECK_GOOD(rte_kvargs_handle_hex64, uint64_t, "F", 0xf);
+ CHECK_GOOD(rte_kvargs_handle_hex64, uint64_t, "ffffffffffffffff",
+ UINT64_MAX);
+ CHECK_BAD(rte_kvargs_handle_hex64, uint64_t, "10000000000000000");
+ CHECK_BAD(rte_kvargs_handle_hex64, uint64_t, "-1");
+
+ /* The underlying conversion, with a mask narrower than the type. */
+ TEST_ASSERT_SUCCESS(rte_kvargs_to_hex("fff", 0xfff, &u), "fff in 0..fff");
+ TEST_ASSERT_EQUAL(u, 0xfffU, "wrong value");
+ TEST_ASSERT_EQUAL(rte_kvargs_to_hex("1000", 0xfff, &u), -ERANGE,
+ "1000 should be out of 0..fff");
+ TEST_ASSERT_EQUAL(u, 0xfffU, "target clobbered on range error");
+ TEST_ASSERT_EQUAL(rte_kvargs_to_hex(NULL, 0xfff, &u), -EINVAL,
+ "NULL should be rejected");
+ TEST_ASSERT_EQUAL(rte_kvargs_to_hex("f", 0xfff, NULL), -EINVAL,
+ "a NULL result should be rejected");
+
+ return TEST_SUCCESS;
+}
+
static int
test_handle_bool(void)
{
@@ -603,6 +647,7 @@ static struct unit_test_suite kvargs_test_suite = {
TEST_CASE(test_invalid_kvargs),
TEST_CASE(test_handle_unsigned),
TEST_CASE(test_handle_signed),
+ TEST_CASE(test_handle_hex),
TEST_CASE(test_handle_bool),
TEST_CASE(test_handle_socket_id),
TEST_CASE(test_kvargs_to_range),
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 8a75a53ab7..af19196ba3 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -156,9 +156,13 @@ New Features
* ``rte_kvargs_handle_bool``, accepting ``1``, ``y``, ``yes``, ``on``,
``true`` and their negative counterparts. A bare ``key`` means true;
an empty ``key=`` is rejected.
+ * ``rte_kvargs_handle_hex32`` and ``rte_kvargs_handle_hex64``, for the
+ arguments documented as a bare hexadecimal mask, where the value is
+ always read as hexadecimal whether or not it carries a ``0x`` prefix
- Added ``rte_kvargs_to_uint`` and ``rte_kvargs_to_int`` for the cases where
- a driver needs a narrower range than the target type allows.
+ Added ``rte_kvargs_to_uint``, ``rte_kvargs_to_int`` and
+ ``rte_kvargs_to_hex`` for the cases where a driver needs a narrower range
+ than the target type allows.
Removed Items
diff --git a/lib/kvargs/rte_kvargs.c b/lib/kvargs/rte_kvargs.c
index 6e5e3fcd7c..22bde9616c 100644
--- a/lib/kvargs/rte_kvargs.c
+++ b/lib/kvargs/rte_kvargs.c
@@ -323,6 +323,35 @@ rte_kvargs_parse_delim(const char *args, const char * const valid_keys[],
return kvlist;
}
+/*
+ * Skip over a "0x" prefix if there is one.
+ *
+ * Returns true if a prefix was consumed, and advances *str past it. Only one
+ * prefix is ever consumed: a second one is left in place so that the caller
+ * rejects it, since strtoull() would otherwise strip it itself and read
+ * "0x0x10" as sixteen rather than as the garbage it is.
+ */
+static bool
+kvargs_skip_hex_prefix(const char **str)
+{
+ const char *s = *str;
+
+ if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X') &&
+ isxdigit((unsigned char)s[2])) {
+ *str = s + 2;
+ return true;
+ }
+
+ return false;
+}
+
+/* Tell whether a "0x" prefix is present, without consuming it. */
+static bool
+kvargs_has_hex_prefix(const char *str)
+{
+ return str[0] == '0' && (str[1] == 'x' || str[1] == 'X');
+}
+
/*
* Determine the base of a numeric value and skip over its prefix.
*
@@ -331,24 +360,15 @@ rte_kvargs_parse_delim(const char *args, const char * const valid_keys[],
* has been a recurring source of surprise.
*
* Returns the base, and advances *str past the "0x" prefix if there is one.
- * Returns 0 if what follows the prefix is a second one: strtoull() would
- * strip that itself, making "0x0x10" sixteen rather than the garbage it is.
+ * Returns 0 if what follows the prefix is a second one, which is not a number.
*/
static int
kvargs_get_base(const char **str)
{
- const char *s = *str;
-
- if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X') &&
- isxdigit((unsigned char)s[2])) {
- s += 2;
- if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
- return 0;
- *str = s;
- return 16;
- }
+ if (!kvargs_skip_hex_prefix(str))
+ return 10;
- return 10;
+ return kvargs_has_hex_prefix(*str) ? 0 : 16;
}
/* Skip trailing white space, and tell whether anything else is left. */
@@ -487,6 +507,46 @@ rte_kvargs_to_int(const char *value, int64_t min, int64_t max, int64_t *result)
return 0;
}
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_kvargs_to_hex, 26.11)
+int
+rte_kvargs_to_hex(const char *value, uint64_t max, uint64_t *result)
+{
+ const char *str = value;
+ unsigned long long val;
+ char *endptr;
+
+ if (str == NULL || result == NULL)
+ return -EINVAL;
+
+ /* A mask has no sign; "-1" must not wrap around to UINT64_MAX. */
+ if (kvargs_get_sign(&str))
+ return -EINVAL;
+
+ /* The 0x prefix is optional here, but still accepted. */
+ if (kvargs_skip_hex_prefix(&str) && kvargs_has_hex_prefix(str))
+ return -EINVAL; /* doubled 0x prefix */
+
+ if (!isxdigit((unsigned char)*str))
+ return -EINVAL;
+
+ errno = 0;
+ val = strtoull(str, &endptr, 16);
+ if (endptr == str)
+ return -EINVAL;
+ if (errno == ERANGE)
+ return -ERANGE;
+ if (errno != 0)
+ return -EINVAL;
+ if (!kvargs_at_end(endptr))
+ return -EINVAL; /* trailing garbage */
+
+ if (val > max)
+ return -ERANGE;
+
+ *result = val;
+ return 0;
+}
+
/*
* The typed handlers below share this shape: convert with a range matching
* the target type, then store. The target is written only on success, so a
@@ -710,6 +770,51 @@ rte_kvargs_handle_ulong(const char *key, const char *value, void *opaque)
return ret;
}
+static int
+kvargs_store_hex(const char *key, const char *value, void *opaque,
+ uint64_t max, uint64_t *val)
+{
+ int ret;
+
+ if (opaque == NULL)
+ return -EINVAL;
+
+ ret = rte_kvargs_to_hex(value, max, val);
+ if (ret < 0)
+ KVARGS_LOG(ERR, "invalid value \"%s\" for key \"%s\", expected 0..%" PRIx64 " in hex",
+ value != NULL ? value : "", key != NULL ? key : "", max);
+
+ return ret;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_kvargs_handle_hex32, 26.11)
+int
+rte_kvargs_handle_hex32(const char *key, const char *value, void *opaque)
+{
+ uint64_t val;
+ int ret;
+
+ ret = kvargs_store_hex(key, value, opaque, UINT32_MAX, &val);
+ if (ret == 0)
+ *(uint32_t *)opaque = (uint32_t)val;
+
+ return ret;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_kvargs_handle_hex64, 26.11)
+int
+rte_kvargs_handle_hex64(const char *key, const char *value, void *opaque)
+{
+ uint64_t val;
+ int ret;
+
+ ret = kvargs_store_hex(key, value, opaque, UINT64_MAX, &val);
+ if (ret == 0)
+ *(uint64_t *)opaque = val;
+
+ return ret;
+}
+
static const char * const kvargs_true[] = { "1", "y", "yes", "on", "true" };
static const char * const kvargs_false[] = { "0", "n", "no", "off", "false" };
diff --git a/lib/kvargs/rte_kvargs.h b/lib/kvargs/rte_kvargs.h
index acc15607bc..fe18841709 100644
--- a/lib/kvargs/rte_kvargs.h
+++ b/lib/kvargs/rte_kvargs.h
@@ -330,6 +330,24 @@ int rte_kvargs_handle_ulong(const char *key, const char *value, void *opaque);
__rte_experimental
int rte_kvargs_handle_size(const char *key, const char *value, void *opaque);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Convert a bit mask to uint32_t.
+ *
+ * As rte_kvargs_handle_u32(), except that the value is always read as
+ * hexadecimal, with or without a ``0x`` prefix, so ``10`` is sixteen. This
+ * is for arguments documented as a bare hexadecimal mask; use
+ * rte_kvargs_handle_u32() for a count or a size.
+ */
+__rte_experimental
+int rte_kvargs_handle_hex32(const char *key, const char *value, void *opaque);
+
+/** Convert a hexadecimal value to uint64_t. See rte_kvargs_handle_hex32(). */
+__rte_experimental
+int rte_kvargs_handle_hex64(const char *key, const char *value, void *opaque);
+
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
@@ -443,6 +461,32 @@ __rte_experimental
int rte_kvargs_to_int(const char *value, int64_t min, int64_t max,
int64_t *result);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Convert a hexadecimal string to an unsigned integer, checking it against
+ * a maximum.
+ *
+ * This is the conversion underlying rte_kvargs_handle_hex32(), and is the
+ * hexadecimal counterpart of rte_kvargs_to_uint(). The minimum is always
+ * zero, since a negative value is rejected rather than wrapped around.
+ *
+ * @param value
+ * The string to convert. Must be non-NULL and non-empty.
+ * @param max
+ * Largest acceptable value, inclusive.
+ * @param result
+ * Where to store the converted value. Left unmodified on error.
+ *
+ * @return
+ * - 0 on success.
+ * - -EINVAL if the value is missing or malformed, or if @p result is NULL.
+ * - -ERANGE if the value is greater than @p max.
+ */
+__rte_experimental
+int rte_kvargs_to_hex(const char *value, uint64_t max, uint64_t *result);
+
#ifdef __cplusplus
}
#endif
--
2.53.0
next prev parent reply other threads:[~2026-09-29 16:38 UTC|newest]
Thread overview: 198+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 5:46 [PATCH 00/62] kvargs: add numeric conversion helpers and use them Stephen Hemminger
2026-09-14 5:46 ` [PATCH 01/62] net/txgbe: fix FDIR devarg integer width Stephen Hemminger
2026-09-14 5:46 ` [PATCH 02/62] kvargs: add numeric conversion helpers Stephen Hemminger
2026-09-14 5:46 ` [PATCH 03/62] kvargs: add a socket ID handler Stephen Hemminger
2026-09-14 5:46 ` [PATCH 04/62] kvargs: add hexadecimal conversion helpers Stephen Hemminger
2026-09-14 5:46 ` [PATCH 05/62] eal: validate memory size arguments Stephen Hemminger
2026-09-14 5:46 ` [PATCH 06/62] net/null: use kvargs numeric helpers Stephen Hemminger
2026-09-14 5:46 ` [PATCH 07/62] net/vhost: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 08/62] vdpa/ifc: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 09/62] net/softnic: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 10/62] dma/skeleton: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 11/62] raw/skeleton: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 12/62] baseband/null: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 13/62] net/memif: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 14/62] net/af_packet: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 15/62] net/pcap: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 16/62] net/ring: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 17/62] net/af_xdp: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 18/62] net/ark: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 19/62] net/failsafe: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 20/62] net/virtio: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 21/62] net/bonding: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 22/62] net/ena: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 23/62] net/netvsc: " Stephen Hemminger
2026-09-14 12:43 ` [EXTERNAL] " Wei Hu
2026-09-14 5:46 ` [PATCH 24/62] net/ice: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 25/62] net/iavf: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 26/62] net/i40e: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 27/62] net/idpf: " Stephen Hemminger
2026-09-14 5:46 ` [PATCH 28/62] net/cpfl: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 29/62] net/ixgbe: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 30/62] net/txgbe: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 31/62] net/octeontx: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 32/62] net/octeon_ep: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 33/62] net/qede: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 34/62] net/nfb: " Stephen Hemminger
2026-09-14 14:44 ` Martin Spinler
2026-09-14 5:47 ` [PATCH 35/62] net/thunderx: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 36/62] net/i40e: propagate VF queue number parse errors Stephen Hemminger
2026-09-14 5:47 ` [PATCH 37/62] net/cnxk: use kvargs numeric helpers Stephen Hemminger
2026-09-14 5:47 ` [PATCH 38/62] net/xsc: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 39/62] net/hns3: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 40/62] net/enetc: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 41/62] event/dlb2: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 42/62] net/nfp: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 43/62] drivers/crypto: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 44/62] event/sw: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 45/62] net/bnxt: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 46/62] net/bnxt: propagate devargs parsing errors Stephen Hemminger
2026-09-14 5:47 ` [PATCH 47/62] net/mlx4: use kvargs numeric helpers Stephen Hemminger
2026-09-14 5:47 ` [PATCH 48/62] net/sfc: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 49/62] crypto/mvsam: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 50/62] ml/cnxk: use kvargs numeric helpers in cn10k Stephen Hemminger
2026-09-14 5:47 ` [PATCH 51/62] ml/cnxk: use kvargs numeric helpers in mvtvm Stephen Hemminger
2026-09-14 5:47 ` [PATCH 52/62] event/opdl: use kvargs numeric helpers Stephen Hemminger
2026-09-14 5:47 ` [PATCH 53/62] mempool/cnxk: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 54/62] event/octeontx: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 55/62] baseband/turbo_sw: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 56/62] baseband/la12xx: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 57/62] dma/hisi_acc: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 58/62] crypto/virtio: " Stephen Hemminger
2026-09-14 5:47 ` [PATCH 59/62] net/ice: use kvargs hex helper for debug mask Stephen Hemminger
2026-09-14 5:47 ` [PATCH 60/62] net/hns3: use kvargs hex helper for capability mask Stephen Hemminger
2026-09-14 5:47 ` [PATCH 61/62] net/cxgbe: use kvargs numeric helpers Stephen Hemminger
2026-09-14 5:47 ` [PATCH 62/62] doc: note kvargs devargs conversion in release notes Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 00/61] kvargs: add numeric conversion helpers Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 01/61] " Stephen Hemminger
2026-09-30 0:49 ` fengchengwen
2026-09-29 16:36 ` [PATCH v2 02/61] kvargs: add a socket ID handler Stephen Hemminger
2026-09-30 1:01 ` fengchengwen
2026-09-29 16:36 ` Stephen Hemminger [this message]
2026-09-30 1:07 ` [PATCH v2 03/61] kvargs: add hexadecimal conversion helpers fengchengwen
2026-09-29 16:36 ` [PATCH v2 04/61] eal: validate memory size arguments Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 05/61] net/null: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 06/61] net/vhost: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 07/61] vdpa/ifc: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 08/61] net/softnic: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 09/61] dma/skeleton: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 10/61] raw/skeleton: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 11/61] baseband/null: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 12/61] net/memif: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 13/61] net/af_packet: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 14/61] net/pcap: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 15/61] net/ring: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 16/61] net/af_xdp: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 17/61] net/ark: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 18/61] net/failsafe: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 19/61] net/virtio: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 20/61] net/bonding: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 21/61] net/ena: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 22/61] net/netvsc: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 23/61] net/ice: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 24/61] net/iavf: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 25/61] net/i40e: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 26/61] net/idpf: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 27/61] net/cpfl: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 28/61] net/ixgbe: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 29/61] net/txgbe: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 30/61] net/octeontx: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 31/61] net/octeon_ep: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 32/61] net/qede: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 33/61] net/nfb: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 34/61] net/thunderx: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 35/61] net/i40e: propagate VF queue number parse errors Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 36/61] net/cnxk: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 37/61] net/xsc: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 38/61] net/hns3: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 39/61] net/enetc: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 40/61] event/dlb2: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 41/61] net/nfp: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 42/61] drivers/crypto: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 43/61] event/sw: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 44/61] net/bnxt: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 45/61] net/bnxt: propagate devargs parsing errors Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 46/61] net/mlx4: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 47/61] net/sfc: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 48/61] crypto/mvsam: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 49/61] ml/cnxk: use kvargs numeric helpers in cn10k Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 50/61] ml/cnxk: use kvargs numeric helpers in mvtvm Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 51/61] event/opdl: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 52/61] mempool/cnxk: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 53/61] event/octeontx: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 54/61] baseband/turbo_sw: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 55/61] baseband/la12xx: " Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 56/61] dma/hisi_acc: " Stephen Hemminger
2026-09-29 16:37 ` [PATCH v2 57/61] crypto/virtio: " Stephen Hemminger
2026-09-29 16:37 ` [PATCH v2 58/61] net/ice: use kvargs hex helper for debug mask Stephen Hemminger
2026-09-29 16:37 ` [PATCH v2 59/61] net/hns3: use kvargs hex helper for capability mask Stephen Hemminger
2026-09-29 16:37 ` [PATCH v2 60/61] net/cxgbe: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:37 ` [PATCH v2 61/61] doc: note kvargs devargs conversion in release notes Stephen Hemminger
2026-09-30 1:14 ` [PATCH v2 00/61] kvargs: add numeric conversion helpers fengchengwen
2026-09-30 15:21 ` Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 00/65] " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 01/65] net/ring: make numa node signed Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 02/65] kvargs: add numeric conversion helpers Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 03/65] kvargs: add a socket ID handler Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 04/65] kvargs: add hexadecimal conversion helpers Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 05/65] eal: validate memory size arguments Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 06/65] net/null: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 07/65] net/vhost: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 08/65] vdpa/ifc: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 09/65] net/softnic: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 10/65] dma/skeleton: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 11/65] raw/skeleton: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 12/65] baseband/null: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 13/65] net/memif: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 14/65] net/af_packet: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 15/65] net/pcap: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 16/65] net/ring: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 17/65] net/af_xdp: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 18/65] net/ark: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 19/65] net/failsafe: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 20/65] net/virtio: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 21/65] net/bonding: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 22/65] net/ena: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 23/65] net/netvsc: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 24/65] net/ice: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 25/65] net/iavf: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 26/65] net/i40e: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 27/65] net/idpf: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 28/65] net/cpfl: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 29/65] net/ixgbe: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 30/65] net/txgbe: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 31/65] net/octeontx: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 32/65] net/octeon_ep: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 33/65] net/qede: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 34/65] net/nfb: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 35/65] net/thunderx: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 36/65] net/i40e: propagate VF queue number parse errors Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 37/65] net/cnxk: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 38/65] net/xsc: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 39/65] net/hns3: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 40/65] net/enetc: " Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 41/65] event/dlb2: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 42/65] net/nfp: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 43/65] drivers/crypto: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 44/65] event/sw: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 45/65] net/bnxt: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 46/65] net/bnxt: propagate devargs parsing errors Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 47/65] net/mlx4: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 48/65] net/sfc: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 49/65] crypto/mvsam: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 50/65] ml/cnxk: use kvargs numeric helpers in cn10k Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 51/65] ml/cnxk: use kvargs numeric helpers in mvtvm Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 52/65] event/opdl: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 53/65] mempool/cnxk: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 54/65] event/octeontx: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 55/65] baseband/turbo_sw: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 56/65] baseband/la12xx: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 57/65] dma/hisi_acc: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 58/65] crypto/virtio: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 59/65] net/ice: use kvargs hex helper for debug mask Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 60/65] net/hns3: use kvargs hex helper for capability mask Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 61/65] net/cxgbe: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 62/65] kvargs: add range conversion handlers Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 63/65] event/sw: use kvargs range handlers Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 64/65] net/cnxk: " Stephen Hemminger
2026-09-30 22:41 ` [PATCH v3 65/65] doc: note kvargs devargs conversion in release notes Stephen Hemminger
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=20260929163800.1108305-4-stephen@networkplumber.org \
--to=stephen@networkplumber.org \
--cc=dev@dpdk.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox