All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] rte_ether_unformat: accept more inputs
@ 2023-09-29 16:36 Stephen Hemminger
  2023-09-29 19:35 ` Morten Brørup
                   ` (2 more replies)
  0 siblings, 3 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-09-29 16:36 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Olivier Matz

This updates rte_ether_addr_unformat() to accept more types
of input. There have been requests to handle Windows and other formats.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
Marking this as RFC until unit tests are added.

 lib/net/rte_ether.c | 78 +++++++++++++++++++++++++++++++++++----------
 lib/net/rte_ether.h |  6 ++--
 2 files changed, 66 insertions(+), 18 deletions(-)

diff --git a/lib/net/rte_ether.c b/lib/net/rte_ether.c
index 66d9a9d0699a..5250353eb162 100644
--- a/lib/net/rte_ether.c
+++ b/lib/net/rte_ether.c
@@ -38,7 +38,8 @@ static int8_t get_xdigit(char ch)
 }
 
 /* Convert 00:11:22:33:44:55 to ethernet address */
-static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
+static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea,
+			    const char sep)
 {
 	const char *s = s0;
 	int i;
@@ -50,14 +51,17 @@ static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
 		if (x < 0)
 			return false;
 
-		ea->addr_bytes[i] = x << 4;
-		x = get_xdigit(*s++);
-		if (x < 0)
-			return false;
-		ea->addr_bytes[i] |= x;
+		ea->addr_bytes[i] = x;
+		if (*s != sep) {
+			x = get_xdigit(*s++);
+			if (x < 0)
+				return false;
+			ea->addr_bytes[i] <<= 4;
+			ea->addr_bytes[i] |= x;
+		}
 
 		if (i < RTE_ETHER_ADDR_LEN - 1 &&
-		    *s++ != ':')
+		    *s++ != sep)
 			return false;
 	}
 
@@ -66,7 +70,8 @@ static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
 }
 
 /* Convert 0011:2233:4455 to ethernet address */
-static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
+static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea,
+			    const char sep)
 {
 	int i, j;
 
@@ -80,12 +85,14 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
 			if (x < 0)
 				return false;
 			w = (w << 4) | x;
+			if (*s == sep)
+				break;
 		}
 		ea->addr_bytes[i] = w >> 8;
 		ea->addr_bytes[i + 1] = w & 0xff;
 
 		if (i < RTE_ETHER_ADDR_LEN - 2 &&
-		    *s++ != ':')
+		    *s++ != sep)
 			return false;
 	}
 
@@ -93,17 +100,56 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
 }
 
 /*
- * Like ether_aton_r but can handle either
- * XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
- * and is more restrictive.
+ * Scan input to see if seperated by dash, colon or period
+ * Returns seperator and number of matches
+ * If seperators are mixed will return
+ */
+static unsigned int get_ether_sep(const char *s, char *sep)
+{
+	const char seperators[] = "-:.";
+	unsigned int count = 0;
+	const char *cp;
+
+	cp = strpbrk(s, seperators);
+	if (cp == NULL)
+		return 0;
+
+	*sep = *cp;
+	do {
+		++count;
+		/* find next instance of seperator */
+		cp = strchr(cp + 1, *sep);
+	} while (cp != NULL);
+
+	return count;
+}
+
+/*
+ * Be libreal in accepting a wide variety of notational formats
+ * for MAC address including:
+ *  - Linux format six groups of hexadecimal digits seperated by colon
+ *  - Windows format six groups seperated by hyphen
+ *  - two groups hexadecimal digits
  */
 int
 rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)
 {
-	if (get_ether_addr6(s, ea))
-		return 0;
-	if (get_ether_addr3(s, ea))
-		return 0;
+	unsigned int count;
+	char sep = '\0';
+
+	count = get_ether_sep(s, &sep);
+	switch (count) {
+	case 5:	/* i.e 01:23:45:67:89:AB */
+		if (get_ether_addr6(s, ea, sep))
+			return 0;
+		break;
+	case 2: /* i.e 0123.4567.89AB */
+		if (get_ether_addr3(s, ea, sep))
+			return 0;
+		break;
+	default:
+		break;
+	}
 
 	rte_errno = EINVAL;
 	return -1;
diff --git a/lib/net/rte_ether.h b/lib/net/rte_ether.h
index b35c72c7b0e0..e9a4ba9b5860 100644
--- a/lib/net/rte_ether.h
+++ b/lib/net/rte_ether.h
@@ -254,8 +254,10 @@ rte_ether_format_addr(char *buf, uint16_t size,
  *
  * @param str
  *   A pointer to buffer contains the formatted MAC address.
- *   The supported formats are:
- *     XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
+ *   The example formats are:
+ *     XX:XX:XX:XX:XX:XX - Canonical form
+ *     XX-XX-XX-XX-XX-XX - Windows and IEEE 802
+ *     XXXX:XXXX:XXXX    - original DPDK
  *   where XX is a hex digit: 0-9, a-f, or A-F.
  * @param eth_addr
  *   A pointer to a ether_addr structure.
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* RE: [RFC] rte_ether_unformat: accept more inputs
  2023-09-29 16:36 [RFC] rte_ether_unformat: accept more inputs Stephen Hemminger
@ 2023-09-29 19:35 ` Morten Brørup
  2023-09-29 23:08   ` Stephen Hemminger
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
  2 siblings, 1 reply; 24+ messages in thread
From: Morten Brørup @ 2023-09-29 19:35 UTC (permalink / raw)
  To: Stephen Hemminger, dev; +Cc: Olivier Matz

> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Friday, 29 September 2023 18.36
> 
> This updates rte_ether_addr_unformat() to accept more types
> of input. There have been requests to handle Windows and other formats.

Seems very useful.

[...]

> +/*
> + * Be libreal in accepting a wide variety of notational formats

Typo: libreal -> liberal.

> + * for MAC address including:
> + *  - Linux format six groups of hexadecimal digits seperated by colon
> + *  - Windows format six groups seperated by hyphen

Typo (twice): seperated -> separated

[...]

> --- a/lib/net/rte_ether.h
> +++ b/lib/net/rte_ether.h
> @@ -254,8 +254,10 @@ rte_ether_format_addr(char *buf, uint16_t size,
>   *
>   * @param str
>   *   A pointer to buffer contains the formatted MAC address.
> - *   The supported formats are:
> - *     XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
> + *   The example formats are:
> + *     XX:XX:XX:XX:XX:XX - Canonical form
> + *     XX-XX-XX-XX-XX-XX - Windows and IEEE 802
> + *     XXXX:XXXX:XXXX    - original DPDK
>   *   where XX is a hex digit: 0-9, a-f, or A-F.

Actually, XX is a hex number, not a hex digit.

But I think the intention of this patch is also to allow a hex number of 1 or 2 (or up to 4) hex digits for XX and XXXX?


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC] rte_ether_unformat: accept more inputs
  2023-09-29 19:35 ` Morten Brørup
@ 2023-09-29 23:08   ` Stephen Hemminger
  0 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-09-29 23:08 UTC (permalink / raw)
  To: Morten Brørup; +Cc: dev, Olivier Matz

On Fri, 29 Sep 2023 21:35:45 +0200
Morten Brørup <mb@smartsharesystems.com> wrote:

> > From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> > Sent: Friday, 29 September 2023 18.36
> > 
> > This updates rte_ether_addr_unformat() to accept more types
> > of input. There have been requests to handle Windows and other formats.  
> 
> Seems very useful.
> 
> [...]
> 
> > +/*
> > + * Be libreal in accepting a wide variety of notational formats  
> 
> Typo: libreal -> liberal.
> 
> > + * for MAC address including:
> > + *  - Linux format six groups of hexadecimal digits seperated by colon
> > + *  - Windows format six groups seperated by hyphen  
> 
> Typo (twice): seperated -> separated

Typos will be fixed in next version in addition to adding tests.

> 
> > --- a/lib/net/rte_ether.h
> > +++ b/lib/net/rte_ether.h
> > @@ -254,8 +254,10 @@ rte_ether_format_addr(char *buf, uint16_t size,
> >   *
> >   * @param str
> >   *   A pointer to buffer contains the formatted MAC address.
> > - *   The supported formats are:
> > - *     XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
> > + *   The example formats are:
> > + *     XX:XX:XX:XX:XX:XX - Canonical form
> > + *     XX-XX-XX-XX-XX-XX - Windows and IEEE 802
> > + *     XXXX:XXXX:XXXX    - original DPDK
> >   *   where XX is a hex digit: 0-9, a-f, or A-F.  
> 
> Actually, XX is a hex number, not a hex digit.
> 
> But I think the intention of this patch is also to allow a hex number of 1 or 2 (or up to 4) hex digits for XX and XXXX?
> 


Good point, the single hex digit format came as a later request.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v2 0/3] rte_ether_unformat_addr changes
  2023-09-29 16:36 [RFC] rte_ether_unformat: accept more inputs Stephen Hemminger
  2023-09-29 19:35 ` Morten Brørup
@ 2023-10-02 18:37 ` Stephen Hemminger
  2023-10-02 18:37   ` [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
                     ` (4 more replies)
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
  2 siblings, 5 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-02 18:37 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

This patchset makes rte_ether_unformat_addr allow other formats
for MAC address. Need to remove some inputs from existing
cmdline_etheraddr test, and add a new test in test suite
to cover this.  There is some overlap between the two tests
but that is fine.

Stephen Hemminger (3):
  test: remove some strings from cmdline_etheraddr tests
  rte_ether_unformat: accept more inputs
  test: add tests for rte_ether routines

 app/test/meson.build              |   1 +
 app/test/test_cmdline_etheraddr.c |  11 +-
 app/test/test_net_ether.c         | 169 ++++++++++++++++++++++++++++++
 lib/net/rte_ether.c               |  87 +++++++++++----
 lib/net/rte_ether.h               |   9 +-
 5 files changed, 248 insertions(+), 29 deletions(-)
 create mode 100644 app/test/test_net_ether.c

-- 
2.39.2


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
@ 2023-10-02 18:37   ` Stephen Hemminger
  2023-10-03 10:47     ` Ferruh Yigit
  2023-10-02 18:37   ` [PATCH v2 2/3] rte_ether_unformat: accept more inputs Stephen Hemminger
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-02 18:37 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Some of the ethernet address formats which were invalid will
now become valid inputs when rte_ether_unformat_addr is modified
to allow leading zeros.

Also, make local variables static.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_cmdline_etheraddr.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/app/test/test_cmdline_etheraddr.c b/app/test/test_cmdline_etheraddr.c
index 9691c32ba250..166c5716ba9b 100644
--- a/app/test/test_cmdline_etheraddr.c
+++ b/app/test/test_cmdline_etheraddr.c
@@ -20,7 +20,7 @@ struct ether_addr_str {
 };
 
 /* valid strings */
-const struct ether_addr_str ether_addr_valid_strs[] = {
+static const struct ether_addr_str ether_addr_valid_strs[] = {
 		{"01:23:45:67:89:AB", 0xAB8967452301ULL},
 		{"4567:89AB:CDEF", 0xEFCDAB896745ULL},
 };
@@ -30,7 +30,7 @@ const struct ether_addr_str ether_addr_valid_strs[] = {
  * end of token, which is either space chars, null char or
  * a hash sign.
  */
-const char * ether_addr_garbage_strs[] = {
+static const char * const ether_addr_garbage_strs[] = {
 		"00:11:22:33:44:55\0garbage",
 		"00:11:22:33:44:55#garbage",
 		"00:11:22:33:44:55 garbage",
@@ -46,14 +46,13 @@ const char * ether_addr_garbage_strs[] = {
 #define GARBAGE_ETHERADDR 0x554433221100ULL /* corresponding address */
 
 
-const char * ether_addr_invalid_strs[] = {
+static const char * const ether_addr_invalid_strs[] = {
 		/* valid chars, invalid syntax */
 		"0123:45:67:89:AB",
 		"01:23:4567:89:AB",
 		"01:23:45:67:89AB",
 		"012:345:678:9AB",
 		"01:23:45:67:89:ABC",
-		"01:23:45:67:89:A",
 		"01:23:45:67:89",
 		"01:23:45:67:89:AB:CD",
 		/* invalid chars, valid syntax */
@@ -61,10 +60,8 @@ const char * ether_addr_invalid_strs[] = {
 		"INVA:LIDC:HARS",
 		/* misc */
 		"01 23 45 67 89 AB",
-		"01.23.45.67.89.AB",
 		"01,23,45,67,89,AB",
-		"01:23:45\0:67:89:AB",
-		"01:23:45#:67:89:AB",
+		"01:23:45:67#:89:AB",
 		"random invalid text",
 		"random text",
 		"",
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v2 2/3] rte_ether_unformat: accept more inputs
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
  2023-10-02 18:37   ` [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
@ 2023-10-02 18:37   ` Stephen Hemminger
  2023-10-02 18:37   ` [PATCH v2 3/3] test: add tests for rte_ether routines Stephen Hemminger
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-02 18:37 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

This updates rte_ether_addr_unformat() to accept more types
formats for MAC address. It allows IEEE, IETF and Cisco
formats with leading zeros as well.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/net/rte_ether.c | 87 ++++++++++++++++++++++++++++++++++-----------
 lib/net/rte_ether.h |  9 +++--
 2 files changed, 74 insertions(+), 22 deletions(-)

diff --git a/lib/net/rte_ether.c b/lib/net/rte_ether.c
index 66d9a9d0699a..de3f456207e8 100644
--- a/lib/net/rte_ether.c
+++ b/lib/net/rte_ether.c
@@ -38,7 +38,8 @@ static int8_t get_xdigit(char ch)
 }
 
 /* Convert 00:11:22:33:44:55 to ethernet address */
-static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
+static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea,
+			    const char sep)
 {
 	const char *s = s0;
 	int i;
@@ -48,25 +49,29 @@ static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
 
 		x = get_xdigit(*s++);
 		if (x < 0)
-			return false;
+			return false;	/* not a hex digit */
 
-		ea->addr_bytes[i] = x << 4;
-		x = get_xdigit(*s++);
-		if (x < 0)
-			return false;
-		ea->addr_bytes[i] |= x;
+		ea->addr_bytes[i] = x;
+		if (*s != sep && *s != '\0') {
+			x = get_xdigit(*s++);
+			if (x < 0)
+				return false;	/* not a hex digit */
+			ea->addr_bytes[i] <<= 4;
+			ea->addr_bytes[i] |= x;
+		}
 
 		if (i < RTE_ETHER_ADDR_LEN - 1 &&
-		    *s++ != ':')
-			return false;
+		    *s++ != sep)
+			return false;	/* premature end of string */
 	}
 
-	/* return true if at end of string */
+	/* return true if no trailing characters */
 	return *s == '\0';
 }
 
 /* Convert 0011:2233:4455 to ethernet address */
-static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
+static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea,
+			    const char sep)
 {
 	int i, j;
 
@@ -78,14 +83,17 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
 
 			x = get_xdigit(*s++);
 			if (x < 0)
-				return false;
+				return false;	/* not a hex digit */
 			w = (w << 4) | x;
+			if (*s == sep || *s == '\0')
+				break;
 		}
+
 		ea->addr_bytes[i] = w >> 8;
 		ea->addr_bytes[i + 1] = w & 0xff;
 
 		if (i < RTE_ETHER_ADDR_LEN - 2 &&
-		    *s++ != ':')
+		    *s++ != sep)
 			return false;
 	}
 
@@ -93,17 +101,56 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
 }
 
 /*
- * Like ether_aton_r but can handle either
- * XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
- * and is more restrictive.
+ * Scan input to see if separated by dash, colon or period
+ * Returns separator and number of matches
+ * If separators are mixed will return
+ */
+static unsigned int get_ether_sep(const char *s, char *sep)
+{
+	static const char separators[] = "-:.";
+	unsigned int count = 0;
+	const char *cp;
+
+	cp = strpbrk(s, separators);
+	if (cp == NULL)
+		return 0;	/* no separator found */
+
+	*sep = *cp;		/* return the separator */
+	do {
+		++count;
+		/* find next instance of separator */
+		cp = strchr(cp + 1, *sep);
+	} while (cp != NULL);
+
+	return count;
+}
+
+/*
+ * Be liberal in accepting a wide variety of notational formats
+ * for MAC address including:
+ *  - Linux format six groups of hexadecimal digits separated by colon
+ *  - Windows format six groups separated by hyphen
+ *  - two groups hexadecimal digits
  */
 int
 rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)
 {
-	if (get_ether_addr6(s, ea))
-		return 0;
-	if (get_ether_addr3(s, ea))
-		return 0;
+	unsigned int count;
+	char sep = '\0';
+
+	count = get_ether_sep(s, &sep);
+	switch (count) {
+	case 5:	/* i.e 01:23:45:67:89:AB */
+		if (get_ether_addr6(s, ea, sep))
+			return 0;
+		break;
+	case 2: /* i.e 0123.4567.89AB */
+		if (get_ether_addr3(s, ea, sep))
+			return 0;
+		break;
+	default:
+		break;
+	}
 
 	rte_errno = EINVAL;
 	return -1;
diff --git a/lib/net/rte_ether.h b/lib/net/rte_ether.h
index b35c72c7b0e0..097aedcf21eb 100644
--- a/lib/net/rte_ether.h
+++ b/lib/net/rte_ether.h
@@ -254,8 +254,13 @@ rte_ether_format_addr(char *buf, uint16_t size,
  *
  * @param str
  *   A pointer to buffer contains the formatted MAC address.
- *   The supported formats are:
- *     XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
+ *   Accepts either byte or word format separated by colon,
+ *   hyphen or period.
+ *
+ *   The example formats are:
+ *     XX:XX:XX:XX:XX:XX - Canonical form
+ *     XX-XX-XX-XX-XX-XX - Windows and IEEE 802
+ *     XXXX.XXXX.XXXX    - Cisco
  *   where XX is a hex digit: 0-9, a-f, or A-F.
  * @param eth_addr
  *   A pointer to a ether_addr structure.
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v2 3/3] test: add tests for rte_ether routines
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
  2023-10-02 18:37   ` [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
  2023-10-02 18:37   ` [PATCH v2 2/3] rte_ether_unformat: accept more inputs Stephen Hemminger
@ 2023-10-02 18:37   ` Stephen Hemminger
  2023-10-03  6:17   ` [PATCH v2 0/3] rte_ether_unformat_addr changes Morten Brørup
  2023-10-03 10:44   ` Ferruh Yigit
  4 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-02 18:37 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

This add some basic tests for rte_unformat_ether_addr
and other functions in rte_ether.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/meson.build      |   1 +
 app/test/test_net_ether.c | 169 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 170 insertions(+)
 create mode 100644 app/test/test_net_ether.c

diff --git a/app/test/meson.build b/app/test/meson.build
index bf9fc906128f..20a9333c726d 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -124,6 +124,7 @@ source_file_deps = {
     'test_meter.c': ['meter'],
     'test_metrics.c': ['metrics'],
     'test_mp_secondary.c': ['hash', 'lpm'],
+    'test_net_ether.c': ['net'],
     'test_pcapng.c': ['ethdev', 'net', 'pcapng'],
     'test_pdcp.c': ['eventdev', 'pdcp', 'net', 'timer', 'security'],
     'test_pdump.c': ['pdump'] + sample_packet_forward_deps,
diff --git a/app/test/test_net_ether.c b/app/test/test_net_ether.c
new file mode 100644
index 000000000000..a6d38cc2ffa0
--- /dev/null
+++ b/app/test/test_net_ether.c
@@ -0,0 +1,169 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Stephen Hemminger
+ */
+
+#include <rte_ether.h>
+
+#include <rte_test.h>
+#include "test.h"
+
+#define N 1000000
+
+static const struct rte_ether_addr zero_ea;
+static const struct rte_ether_addr bcast_ea = {
+	.addr_bytes = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+};
+
+static int
+test_ether_addr(void)
+{
+	struct rte_ether_addr rand_ea = { };
+	unsigned int i;
+
+	RTE_TEST_ASSERT(rte_is_zero_ether_addr(&zero_ea), "Zero address is not zero");
+	RTE_TEST_ASSERT(!rte_is_zero_ether_addr(&bcast_ea), "Broadcast is zero");
+
+	for (i = 0; i < N; i++) {
+		rte_eth_random_addr(rand_ea.addr_bytes);
+		RTE_TEST_ASSERT(!rte_is_zero_ether_addr(&rand_ea),
+				"Random address is zero");
+		RTE_TEST_ASSERT(rte_is_unicast_ether_addr(&rand_ea),
+				"Random addrss is not unicast");
+		RTE_TEST_ASSERT(rte_is_local_admin_ether_addr(&rand_ea),
+				"Random address is not local admin");
+	}
+
+	return 0;
+}
+
+static int
+test_format_addr(void)
+{
+	struct rte_ether_addr rand_ea = { };
+	char buf[RTE_ETHER_ADDR_FMT_SIZE];
+	unsigned int i;
+
+	for (i = 0; i < N; i++) {
+		struct rte_ether_addr result = { };
+		int ret;
+
+		rte_eth_random_addr(rand_ea.addr_bytes);
+
+		rte_ether_format_addr(buf, sizeof(buf), &rand_ea);
+
+		ret = rte_ether_unformat_addr(buf, &result);
+		if (ret != 0) {
+			fprintf(stderr, "rte_ether_unformat_addr(%s) failed\n", buf);
+			return -1;
+		}
+		RTE_TEST_ASSERT(rte_is_same_ether_addr(&rand_ea, &result),
+			"rte_ether_format/unformat mismatch");
+	}
+	return 0;
+
+}
+
+static int
+test_unformat_addr(void)
+{
+	const struct rte_ether_addr expected = {
+		.addr_bytes = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc },
+	};
+	const struct rte_ether_addr nozero_ea = {
+		.addr_bytes = { 1, 2, 3, 4, 5, 6 },
+	};
+	struct rte_ether_addr result;
+	int ret;
+
+	/* Test IETF format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("12:34:56:78:9a:bc", &result);
+	RTE_TEST_ASSERT(ret == 0, "IETF unformat failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
+		"IETF unformat mismatch");
+
+	/* Test IEEE format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("12-34-56-78-9A-BC", &result);
+	RTE_TEST_ASSERT(ret == 0, "IEEE unformat failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
+			"IEEE unformat mismatch");
+
+	/* Test Cisco format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("1234.5678.9ABC", &result);
+	RTE_TEST_ASSERT(ret == 0, "Cisco unformat failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
+			"Cisco unformat mismatch");
+
+	/* Test no leading zeros - IETF */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("1:2:3:4:5:6", &result);
+	RTE_TEST_ASSERT(ret == 0, "IETF leading zero failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
+			"IETF leading zero mismatch");
+
+	/* Test no-leading zero - IEEE format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("1-2-3-4-5-6", &result);
+	RTE_TEST_ASSERT(ret == 0, "IEEE leading zero failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
+			"IEEE leading zero mismatch");
+
+	/* Test no-leading zero - Cisco format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("102.304.506", &result);
+	RTE_TEST_ASSERT(ret == 0, "Cisco leading zero failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
+			"Cisco leading zero mismatch");
+
+	return 0;
+}
+
+static int
+test_invalid_addr(void)
+{
+	static const char * const invalid[] = {
+		"NO:ADDRESS",
+		"123",
+		"12:34:56:78:9a:gh",
+		"12:34:56:78:9a",
+		"100:34:56:78:9a:bc",
+		"34-56-78-9a-bc",
+		"12:34:56-78:9a:bc",
+		"12:34:56.78:9a:bc",
+		"123:456:789:abc",
+		"",
+	};
+	struct rte_ether_addr result;
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(invalid); ++i) {
+		if (!rte_ether_unformat_addr(invalid[i], &result)) {
+			fprintf(stderr, "rte_ether_unformat_addr(%s) succeeded!\n",
+				invalid[i]);
+			return -1;
+		}
+	}
+	return 0;
+}
+
+static int
+test_net_ether(void)
+{
+	if (test_ether_addr())
+		return -1;
+
+	if (test_format_addr())
+		return -1;
+
+	if (test_unformat_addr())
+		return -1;
+
+	if (test_invalid_addr())
+		return -1;
+
+	return 0;
+}
+
+REGISTER_FAST_TEST(net_ether_autotest, true, true, test_net_ether);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* RE: [PATCH v2 0/3] rte_ether_unformat_addr changes
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
                     ` (2 preceding siblings ...)
  2023-10-02 18:37   ` [PATCH v2 3/3] test: add tests for rte_ether routines Stephen Hemminger
@ 2023-10-03  6:17   ` Morten Brørup
  2023-10-03 10:44   ` Ferruh Yigit
  4 siblings, 0 replies; 24+ messages in thread
From: Morten Brørup @ 2023-10-03  6:17 UTC (permalink / raw)
  To: Stephen Hemminger, dev

> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Monday, 2 October 2023 20.37
] rte_ether_unformat_addr changes
> 
> This patchset makes rte_ether_unformat_addr allow other formats
> for MAC address. Need to remove some inputs from existing
> cmdline_etheraddr test, and add a new test in test suite
> to cover this.  There is some overlap between the two tests
> but that is fine.
> 
> Stephen Hemminger (3):
>   test: remove some strings from cmdline_etheraddr tests
>   rte_ether_unformat: accept more inputs
>   test: add tests for rte_ether routines
> 
>  app/test/meson.build              |   1 +
>  app/test/test_cmdline_etheraddr.c |  11 +-
>  app/test/test_net_ether.c         | 169 ++++++++++++++++++++++++++++++
>  lib/net/rte_ether.c               |  87 +++++++++++----
>  lib/net/rte_ether.h               |   9 +-
>  5 files changed, 248 insertions(+), 29 deletions(-)
>  create mode 100644 app/test/test_net_ether.c
> 
> --
> 2.39.2

Series-acked-by: Morten Brørup <mb@smartsharesystems.com>


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 0/3] rte_ether_unformat_addr changes
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
                     ` (3 preceding siblings ...)
  2023-10-03  6:17   ` [PATCH v2 0/3] rte_ether_unformat_addr changes Morten Brørup
@ 2023-10-03 10:44   ` Ferruh Yigit
  2023-10-03 16:27     ` Stephen Hemminger
  2023-10-03 16:34     ` Stephen Hemminger
  4 siblings, 2 replies; 24+ messages in thread
From: Ferruh Yigit @ 2023-10-03 10:44 UTC (permalink / raw)
  To: Stephen Hemminger, dev

On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
> This patchset makes rte_ether_unformat_addr allow other formats
> for MAC address. Need to remove some inputs from existing
> cmdline_etheraddr test, and add a new test in test suite
> to cover this.  There is some overlap between the two tests
> but that is fine.
> 
> Stephen Hemminger (3):
>   test: remove some strings from cmdline_etheraddr tests
>   rte_ether_unformat: accept more inputs
>   test: add tests for rte_ether routines
> 

Thanks Stephen,

This enables using the API as replacement to the tap PMD's local parse
implementation:
https://patchwork.dpdk.org/project/dpdk/patch/20230323170145.129901-1-drc@linux.vnet.ibm.com/

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-02 18:37   ` [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
@ 2023-10-03 10:47     ` Ferruh Yigit
  2023-10-03 10:59       ` Ferruh Yigit
  2023-10-03 16:36       ` Stephen Hemminger
  0 siblings, 2 replies; 24+ messages in thread
From: Ferruh Yigit @ 2023-10-03 10:47 UTC (permalink / raw)
  To: Stephen Hemminger, dev

On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
> Some of the ethernet address formats which were invalid will
> now become valid inputs when rte_ether_unformat_addr is modified
> to allow leading zeros.
> 
> Also, make local variables static.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> 

<...>

> @@ -61,10 +60,8 @@ const char * ether_addr_invalid_strs[] = {
>  		"INVA:LIDC:HARS",
>  		/* misc */
>  		"01 23 45 67 89 AB",
> -		"01.23.45.67.89.AB",
>  		"01,23,45,67,89,AB",
> -		"01:23:45\0:67:89:AB",
> -		"01:23:45#:67:89:AB",
>

Why these two are valid now?

And I guess second one is still not valid, but first one is parsed as
[1], is this expected?

[1] 00:01:00:23:00:45



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-03 10:47     ` Ferruh Yigit
@ 2023-10-03 10:59       ` Ferruh Yigit
  2023-10-03 16:38         ` Stephen Hemminger
  2023-10-03 16:36       ` Stephen Hemminger
  1 sibling, 1 reply; 24+ messages in thread
From: Ferruh Yigit @ 2023-10-03 10:59 UTC (permalink / raw)
  To: Stephen Hemminger, dev

On 10/3/2023 11:47 AM, Ferruh Yigit wrote:
> On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
>> Some of the ethernet address formats which were invalid will
>> now become valid inputs when rte_ether_unformat_addr is modified
>> to allow leading zeros.
>>
>> Also, make local variables static.
>>
>> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>
> 
> <...>
> 
>> @@ -61,10 +60,8 @@ const char * ether_addr_invalid_strs[] = {
>>  		"INVA:LIDC:HARS",
>>  		/* misc */
>>  		"01 23 45 67 89 AB",
>> -		"01.23.45.67.89.AB",
>>  		"01,23,45,67,89,AB",
>> -		"01:23:45\0:67:89:AB",
>> -		"01:23:45#:67:89:AB",
>>
> 
> Why these two are valid now?
> 
> And I guess second one is still not valid, but first one is parsed as
> [1], is this expected?
> 
> [1] 00:01:00:23:00:45
> 
> 

Ah, I guess it is taken as "XXXX:XXXX:XXXX" format, but number of digit
is not enforced, so "1:2:3" is a valid format, should we add this to API
documentation as example format? Or is this unintended side effect?


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 0/3] rte_ether_unformat_addr changes
  2023-10-03 10:44   ` Ferruh Yigit
@ 2023-10-03 16:27     ` Stephen Hemminger
  2023-10-03 16:34     ` Stephen Hemminger
  1 sibling, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 16:27 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev

On Tue, 3 Oct 2023 11:44:16 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
> > This patchset makes rte_ether_unformat_addr allow other formats
> > for MAC address. Need to remove some inputs from existing
> > cmdline_etheraddr test, and add a new test in test suite
> > to cover this.  There is some overlap between the two tests
> > but that is fine.
> > 
> > Stephen Hemminger (3):
> >   test: remove some strings from cmdline_etheraddr tests
> >   rte_ether_unformat: accept more inputs
> >   test: add tests for rte_ether routines
> >   
> 
> Thanks Stephen,
> 
> This enables using the API as replacement to the tap PMD's local parse
> implementation:
> https://patchwork.dpdk.org/project/dpdk/patch/20230323170145.129901-1-drc@linux.vnet.ibm.com/


That looks good, but indentation is wrong and it duplicates a check for value == NULL
which will cause a new Coverity warning.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 0/3] rte_ether_unformat_addr changes
  2023-10-03 10:44   ` Ferruh Yigit
  2023-10-03 16:27     ` Stephen Hemminger
@ 2023-10-03 16:34     ` Stephen Hemminger
  1 sibling, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 16:34 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev

On Tue, 3 Oct 2023 11:44:16 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
> > This patchset makes rte_ether_unformat_addr allow other formats
> > for MAC address. Need to remove some inputs from existing
> > cmdline_etheraddr test, and add a new test in test suite
> > to cover this.  There is some overlap between the two tests
> > but that is fine.
> > 
> > Stephen Hemminger (3):
> >   test: remove some strings from cmdline_etheraddr tests
> >   rte_ether_unformat: accept more inputs
> >   test: add tests for rte_ether routines
> >   
> 
> Thanks Stephen,
> 
> This enables using the API as replacement to the tap PMD's local parse
> implementation:
> https://patchwork.dpdk.org/project/dpdk/patch/20230323170145.129901-1-drc@linux.vnet.ibm.com/


It can be simplified to just this.
No need to check value == NULL, already checkd.
No need to check for user_mac == NULL, since only called one place and that place
passes pointer to stack variable.


From b478a17f13a1bedadca3b60608c585f31c9ad8f2 Mon Sep 17 00:00:00 2001
From: David Christensen <drc@linux.vnet.ibm.com>
Date: Thu, 23 Mar 2023 13:01:45 -0400
Subject: [PATCH] net/tap: resolve stringop-overflow with gcc 12 on ppc64le

Building DPDK with gcc 12 on a ppc64le system generates a
stringop-overflow warning. Replace the local MAC address
validation function parse_user_mac() with a call to
rte_ether_unformat_addr() instead.

Bugzilla ID: 1197
Cc: stable@dpdk.org

Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
---
 drivers/net/tap/rte_eth_tap.c | 25 +------------------------
 1 file changed, 1 insertion(+), 24 deletions(-)

diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index bf98f7555990..b25a52655fa2 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -2267,29 +2267,6 @@ set_remote_iface(const char *key __rte_unused,
 	return 0;
 }
 
-static int parse_user_mac(struct rte_ether_addr *user_mac,
-		const char *value)
-{
-	unsigned int index = 0;
-	char mac_temp[strlen(ETH_TAP_USR_MAC_FMT) + 1], *mac_byte = NULL;
-
-	if (user_mac == NULL || value == NULL)
-		return 0;
-
-	strlcpy(mac_temp, value, sizeof(mac_temp));
-	mac_byte = strtok(mac_temp, ":");
-
-	while ((mac_byte != NULL) &&
-			(strlen(mac_byte) <= 2) &&
-			(strlen(mac_byte) == strspn(mac_byte,
-					ETH_TAP_CMP_MAC_FMT))) {
-		user_mac->addr_bytes[index++] = strtoul(mac_byte, NULL, 16);
-		mac_byte = strtok(NULL, ":");
-	}
-
-	return index;
-}
-
 static int
 set_mac_type(const char *key __rte_unused,
 	     const char *value,
@@ -2311,7 +2288,7 @@ set_mac_type(const char *key __rte_unused,
 		goto success;
 	}
 
-	if (parse_user_mac(user_mac, value) != 6)
+	if (rte_ether_unformat_addr(value, user_mac) < 0)
 		goto error;
 success:
 	TAP_LOG(DEBUG, "TAP user MAC param (%s)", value);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-03 10:47     ` Ferruh Yigit
  2023-10-03 10:59       ` Ferruh Yigit
@ 2023-10-03 16:36       ` Stephen Hemminger
  2023-10-03 16:50         ` Ferruh Yigit
  1 sibling, 1 reply; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 16:36 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev

On Tue, 3 Oct 2023 11:47:51 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
> > Some of the ethernet address formats which were invalid will
> > now become valid inputs when rte_ether_unformat_addr is modified
> > to allow leading zeros.
> > 
> > Also, make local variables static.
> > 
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> >   
> 
> <...>
> 
> > @@ -61,10 +60,8 @@ const char * ether_addr_invalid_strs[] = {
> >  		"INVA:LIDC:HARS",
> >  		/* misc */
> >  		"01 23 45 67 89 AB",
> > -		"01.23.45.67.89.AB",
> >  		"01,23,45,67,89,AB",
> > -		"01:23:45\0:67:89:AB",
> > -		"01:23:45#:67:89:AB",
> >  
> 
> Why these two are valid now?
> 
> And I guess second one is still not valid, but first one is parsed as
> [1], is this expected?
> 
> [1] 00:01:00:23:00:45

The code in cmdline converts the comment character # to a null byte.
So both test are the same.

With new unformat, it allows a 3 part mac address with leading
zeros.
	01:23:45 is equivalent to 0001:0023:0045

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-03 10:59       ` Ferruh Yigit
@ 2023-10-03 16:38         ` Stephen Hemminger
  0 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 16:38 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev

On Tue, 3 Oct 2023 11:59:04 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> Ah, I guess it is taken as "XXXX:XXXX:XXXX" format, but number of digit
> is not enforced, so "1:2:3" is a valid format, should we add this to API
> documentation as example format? Or is this unintended side effect?

By allowing leading zeros, it becomes allowed.
DPDK always allowed the non-standard 3 part format.
Looking around only old Cisco ACS used 3 part MAC format and it used
periods.

The API documentation should mention leading zeros are optional.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-03 16:36       ` Stephen Hemminger
@ 2023-10-03 16:50         ` Ferruh Yigit
  2023-10-03 17:18           ` Stephen Hemminger
  0 siblings, 1 reply; 24+ messages in thread
From: Ferruh Yigit @ 2023-10-03 16:50 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On 10/3/2023 5:36 PM, Stephen Hemminger wrote:
> On Tue, 3 Oct 2023 11:47:51 +0100
> Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> 
>> On 10/2/2023 7:37 PM, Stephen Hemminger wrote:
>>> Some of the ethernet address formats which were invalid will
>>> now become valid inputs when rte_ether_unformat_addr is modified
>>> to allow leading zeros.
>>>
>>> Also, make local variables static.
>>>
>>> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>>   
>>
>> <...>
>>
>>> @@ -61,10 +60,8 @@ const char * ether_addr_invalid_strs[] = {
>>>  		"INVA:LIDC:HARS",
>>>  		/* misc */
>>>  		"01 23 45 67 89 AB",
>>> -		"01.23.45.67.89.AB",
>>>  		"01,23,45,67,89,AB",
>>> -		"01:23:45\0:67:89:AB",
>>> -		"01:23:45#:67:89:AB",
>>>  
>>
>> Why these two are valid now?
>>
>> And I guess second one is still not valid, but first one is parsed as
>> [1], is this expected?
>>
>> [1] 00:01:00:23:00:45
> 
> The code in cmdline converts the comment character # to a null byte.
> So both test are the same.
> 
> With new unformat, it allows a 3 part mac address with leading
> zeros.
> 	01:23:45 is equivalent to 0001:0023:0045
>

With 3 part MAC, omitting leading zeros looks confusing to me, because
that omitted part becomes an octet in MAC. Like:
01:23:45 being equivalent to 00:01:00:23:00:45

As 3 part MAC, and 6 part MAC has separate functions, does it makes
sense to require leading zeros in the 3 part MAC, what do you think?


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests
  2023-10-03 16:50         ` Ferruh Yigit
@ 2023-10-03 17:18           ` Stephen Hemminger
  0 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 17:18 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev

On Tue, 3 Oct 2023 17:50:13 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> On 10/3/2023 5:36 PM, Stephen Hemminger wrote:
> > On Tue, 3 Oct 2023 11:47:51 +0100
> > Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> >   
> >> On 10/2/2023 7:37 PM, Stephen Hemminger wrote:  
> >>> Some of the ethernet address formats which were invalid will
> >>> now become valid inputs when rte_ether_unformat_addr is modified
> >>> to allow leading zeros.
> >>>
> >>> Also, make local variables static.
> >>>
> >>> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> >>>     
> >>
> >> <...>
> >>  
> >>> @@ -61,10 +60,8 @@ const char * ether_addr_invalid_strs[] = {
> >>>  		"INVA:LIDC:HARS",
> >>>  		/* misc */
> >>>  		"01 23 45 67 89 AB",
> >>> -		"01.23.45.67.89.AB",
> >>>  		"01,23,45,67,89,AB",
> >>> -		"01:23:45\0:67:89:AB",
> >>> -		"01:23:45#:67:89:AB",
> >>>    
> >>
> >> Why these two are valid now?
> >>
> >> And I guess second one is still not valid, but first one is parsed as
> >> [1], is this expected?
> >>
> >> [1] 00:01:00:23:00:45  
> > 
> > The code in cmdline converts the comment character # to a null byte.
> > So both test are the same.
> > 
> > With new unformat, it allows a 3 part mac address with leading
> > zeros.
> > 	01:23:45 is equivalent to 0001:0023:0045
> >  
> 
> With 3 part MAC, omitting leading zeros looks confusing to me, because
> that omitted part becomes an octet in MAC. Like:
> 01:23:45 being equivalent to 00:01:00:23:00:45
> 
> As 3 part MAC, and 6 part MAC has separate functions, does it makes
> sense to require leading zeros in the 3 part MAC, what do you think?
> 

Right, 3 part MAC is only a legacy Cisco format, not used anywhere else.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v3 0/4] rte_ether_unformat_addr related changes
  2023-09-29 16:36 [RFC] rte_ether_unformat: accept more inputs Stephen Hemminger
  2023-09-29 19:35 ` Morten Brørup
  2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
@ 2023-10-03 20:29 ` Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 1/4] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
                     ` (4 more replies)
  2 siblings, 5 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 20:29 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

This patchset makes rte_ether_unformat_addr allow other formats
for MAC address. Need to remove some inputs from existing
cmdline_etheraddr test, and add a new test in test suite
to cover this.  There is some overlap between the two tests
but that is fine.

v4 - fix spelling errors
     don't allow leading zeros in Cisco 3 part format
     incorporate tap patch to use unformat addr

David Christensen (1):
  net/tap: use rte_ether_unformat_address

Stephen Hemminger (3):
  test: remove some strings from cmdline_etheraddr tests
  rte_ether_unformat: accept more inputs
  test: add tests for rte_ether routines

 app/test/meson.build              |   1 +
 app/test/test_cmdline_etheraddr.c |   8 +-
 app/test/test_net_ether.c         | 165 ++++++++++++++++++++++++++++++
 drivers/net/tap/rte_eth_tap.c     |  25 +----
 lib/net/rte_ether.c               |  85 +++++++++++----
 lib/net/rte_ether.h               |  10 +-
 6 files changed, 243 insertions(+), 51 deletions(-)
 create mode 100644 app/test/test_net_ether.c

-- 
2.39.2


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v3 1/4] test: remove some strings from cmdline_etheraddr tests
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
@ 2023-10-03 20:29   ` Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 2/4] rte_ether_unformat: accept more inputs Stephen Hemminger
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 20:29 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Morten Brørup, Olivier Matz

Some of the ethernet address formats which were invalid will
now become valid inputs when rte_ether_unformat_addr is modified
to allow leading zeros.

Also, make local variables static.

Acked-by: Morten Brørup <mb@smartsharesystems.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_cmdline_etheraddr.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/app/test/test_cmdline_etheraddr.c b/app/test/test_cmdline_etheraddr.c
index 9691c32ba250..74953dea6cb9 100644
--- a/app/test/test_cmdline_etheraddr.c
+++ b/app/test/test_cmdline_etheraddr.c
@@ -20,7 +20,7 @@ struct ether_addr_str {
 };
 
 /* valid strings */
-const struct ether_addr_str ether_addr_valid_strs[] = {
+static const struct ether_addr_str ether_addr_valid_strs[] = {
 		{"01:23:45:67:89:AB", 0xAB8967452301ULL},
 		{"4567:89AB:CDEF", 0xEFCDAB896745ULL},
 };
@@ -30,7 +30,7 @@ const struct ether_addr_str ether_addr_valid_strs[] = {
  * end of token, which is either space chars, null char or
  * a hash sign.
  */
-const char * ether_addr_garbage_strs[] = {
+static const char * const ether_addr_garbage_strs[] = {
 		"00:11:22:33:44:55\0garbage",
 		"00:11:22:33:44:55#garbage",
 		"00:11:22:33:44:55 garbage",
@@ -46,14 +46,13 @@ const char * ether_addr_garbage_strs[] = {
 #define GARBAGE_ETHERADDR 0x554433221100ULL /* corresponding address */
 
 
-const char * ether_addr_invalid_strs[] = {
+static const char * const ether_addr_invalid_strs[] = {
 		/* valid chars, invalid syntax */
 		"0123:45:67:89:AB",
 		"01:23:4567:89:AB",
 		"01:23:45:67:89AB",
 		"012:345:678:9AB",
 		"01:23:45:67:89:ABC",
-		"01:23:45:67:89:A",
 		"01:23:45:67:89",
 		"01:23:45:67:89:AB:CD",
 		/* invalid chars, valid syntax */
@@ -61,7 +60,6 @@ const char * ether_addr_invalid_strs[] = {
 		"INVA:LIDC:HARS",
 		/* misc */
 		"01 23 45 67 89 AB",
-		"01.23.45.67.89.AB",
 		"01,23,45,67,89,AB",
 		"01:23:45\0:67:89:AB",
 		"01:23:45#:67:89:AB",
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v3 2/4] rte_ether_unformat: accept more inputs
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 1/4] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
@ 2023-10-03 20:29   ` Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 3/4] test: add tests for rte_ether routines Stephen Hemminger
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 20:29 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Morten Brørup, Olivier Matz

This updates rte_ether_addr_unformat() to accept more types
formats for MAC address. It allows IEEE, IETF and Cisco
formats. Leading zeros are allowed for byte formats.

Acked-by: Morten Brørup <mb@smartsharesystems.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/net/rte_ether.c | 85 ++++++++++++++++++++++++++++++++++-----------
 lib/net/rte_ether.h | 10 ++++--
 2 files changed, 73 insertions(+), 22 deletions(-)

diff --git a/lib/net/rte_ether.c b/lib/net/rte_ether.c
index 66d9a9d0699a..f59c20289d37 100644
--- a/lib/net/rte_ether.c
+++ b/lib/net/rte_ether.c
@@ -38,7 +38,8 @@ static int8_t get_xdigit(char ch)
 }
 
 /* Convert 00:11:22:33:44:55 to ethernet address */
-static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
+static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea,
+			    const char sep)
 {
 	const char *s = s0;
 	int i;
@@ -48,25 +49,29 @@ static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)
 
 		x = get_xdigit(*s++);
 		if (x < 0)
-			return false;
+			return false;	/* not a hex digit */
 
-		ea->addr_bytes[i] = x << 4;
-		x = get_xdigit(*s++);
-		if (x < 0)
-			return false;
-		ea->addr_bytes[i] |= x;
+		ea->addr_bytes[i] = x;
+		if (*s != sep && *s != '\0') {
+			x = get_xdigit(*s++);
+			if (x < 0)
+				return false;	/* not a hex digit */
+			ea->addr_bytes[i] <<= 4;
+			ea->addr_bytes[i] |= x;
+		}
 
 		if (i < RTE_ETHER_ADDR_LEN - 1 &&
-		    *s++ != ':')
-			return false;
+		    *s++ != sep)
+			return false;	/* premature end of string */
 	}
 
-	/* return true if at end of string */
+	/* return true if no trailing characters */
 	return *s == '\0';
 }
 
 /* Convert 0011:2233:4455 to ethernet address */
-static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
+static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea,
+			    const char sep)
 {
 	int i, j;
 
@@ -78,14 +83,15 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
 
 			x = get_xdigit(*s++);
 			if (x < 0)
-				return false;
+				return false;	/* not a hex digit */
 			w = (w << 4) | x;
 		}
+
 		ea->addr_bytes[i] = w >> 8;
 		ea->addr_bytes[i + 1] = w & 0xff;
 
 		if (i < RTE_ETHER_ADDR_LEN - 2 &&
-		    *s++ != ':')
+		    *s++ != sep)
 			return false;
 	}
 
@@ -93,17 +99,56 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)
 }
 
 /*
- * Like ether_aton_r but can handle either
- * XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
- * and is more restrictive.
+ * Scan input to see if separated by dash, colon or period
+ * Returns separator and number of matches
+ * If separators are mixed will return
+ */
+static unsigned int get_ether_sep(const char *s, char *sep)
+{
+	static const char separators[] = "-:.";
+	unsigned int count = 0;
+	const char *cp;
+
+	cp = strpbrk(s, separators);
+	if (cp == NULL)
+		return 0;	/* no separator found */
+
+	*sep = *cp;		/* return the separator */
+	do {
+		++count;
+		/* find next instance of separator */
+		cp = strchr(cp + 1, *sep);
+	} while (cp != NULL);
+
+	return count;
+}
+
+/*
+ * Be liberal in accepting a wide variety of notational formats
+ * for MAC address including:
+ *  - Linux format six groups of hexadecimal digits separated by colon
+ *  - Windows format six groups separated by hyphen
+ *  - two groups hexadecimal digits
  */
 int
 rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)
 {
-	if (get_ether_addr6(s, ea))
-		return 0;
-	if (get_ether_addr3(s, ea))
-		return 0;
+	unsigned int count;
+	char sep = '\0';
+
+	count = get_ether_sep(s, &sep);
+	switch (count) {
+	case 5:	/* i.e 01:23:45:67:89:AB */
+		if (get_ether_addr6(s, ea, sep))
+			return 0;
+		break;
+	case 2: /* i.e 0123.4567.89AB */
+		if (get_ether_addr3(s, ea, sep))
+			return 0;
+		break;
+	default:
+		break;
+	}
 
 	rte_errno = EINVAL;
 	return -1;
diff --git a/lib/net/rte_ether.h b/lib/net/rte_ether.h
index b35c72c7b0e0..ce073ea818a2 100644
--- a/lib/net/rte_ether.h
+++ b/lib/net/rte_ether.h
@@ -254,9 +254,15 @@ rte_ether_format_addr(char *buf, uint16_t size,
  *
  * @param str
  *   A pointer to buffer contains the formatted MAC address.
- *   The supported formats are:
- *     XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
+ *   Accepts either byte or word format separated by colon,
+ *   hyphen or period.
+ *
+ *   The example formats are:
+ *     XX:XX:XX:XX:XX:XX - Canonical form
+ *     XX-XX-XX-XX-XX-XX - Windows and IEEE 802
+ *     XXXX.XXXX.XXXX    - Cisco
  *   where XX is a hex digit: 0-9, a-f, or A-F.
+ *   In the byte format, leading zeros are optional.
  * @param eth_addr
  *   A pointer to a ether_addr structure.
  * @return
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v3 3/4] test: add tests for rte_ether routines
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 1/4] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 2/4] rte_ether_unformat: accept more inputs Stephen Hemminger
@ 2023-10-03 20:29   ` Stephen Hemminger
  2023-10-03 20:29   ` [PATCH v3 4/4] net/tap: use rte_ether_unformat_address Stephen Hemminger
  2023-10-04 11:48   ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Ferruh Yigit
  4 siblings, 0 replies; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 20:29 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Morten Brørup

This add some basic tests for rte_unformat_ether_addr
and other functions in rte_ether.

Acked-by: Morten Brørup <mb@smartsharesystems.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/meson.build      |   1 +
 app/test/test_net_ether.c | 165 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 166 insertions(+)
 create mode 100644 app/test/test_net_ether.c

diff --git a/app/test/meson.build b/app/test/meson.build
index bf9fc906128f..20a9333c726d 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -124,6 +124,7 @@ source_file_deps = {
     'test_meter.c': ['meter'],
     'test_metrics.c': ['metrics'],
     'test_mp_secondary.c': ['hash', 'lpm'],
+    'test_net_ether.c': ['net'],
     'test_pcapng.c': ['ethdev', 'net', 'pcapng'],
     'test_pdcp.c': ['eventdev', 'pdcp', 'net', 'timer', 'security'],
     'test_pdump.c': ['pdump'] + sample_packet_forward_deps,
diff --git a/app/test/test_net_ether.c b/app/test/test_net_ether.c
new file mode 100644
index 000000000000..1cb6845a9c48
--- /dev/null
+++ b/app/test/test_net_ether.c
@@ -0,0 +1,165 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Stephen Hemminger
+ */
+
+#include <rte_ether.h>
+
+#include <rte_test.h>
+#include "test.h"
+
+#define N 1000000
+
+static const struct rte_ether_addr zero_ea;
+static const struct rte_ether_addr bcast_ea = {
+	.addr_bytes = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+};
+
+static int
+test_ether_addr(void)
+{
+	struct rte_ether_addr rand_ea = { };
+	unsigned int i;
+
+	RTE_TEST_ASSERT(rte_is_zero_ether_addr(&zero_ea), "Zero address is not zero");
+	RTE_TEST_ASSERT(!rte_is_zero_ether_addr(&bcast_ea), "Broadcast is zero");
+
+	for (i = 0; i < N; i++) {
+		rte_eth_random_addr(rand_ea.addr_bytes);
+		RTE_TEST_ASSERT(!rte_is_zero_ether_addr(&rand_ea),
+				"Random address is zero");
+		RTE_TEST_ASSERT(rte_is_unicast_ether_addr(&rand_ea),
+				"Random address is not unicast");
+		RTE_TEST_ASSERT(rte_is_local_admin_ether_addr(&rand_ea),
+				"Random address is not local admin");
+	}
+
+	return 0;
+}
+
+static int
+test_format_addr(void)
+{
+	struct rte_ether_addr rand_ea = { };
+	char buf[RTE_ETHER_ADDR_FMT_SIZE];
+	unsigned int i;
+
+	for (i = 0; i < N; i++) {
+		struct rte_ether_addr result = { };
+		int ret;
+
+		rte_eth_random_addr(rand_ea.addr_bytes);
+
+		rte_ether_format_addr(buf, sizeof(buf), &rand_ea);
+
+		ret = rte_ether_unformat_addr(buf, &result);
+		if (ret != 0) {
+			fprintf(stderr, "rte_ether_unformat_addr(%s) failed\n", buf);
+			return -1;
+		}
+		RTE_TEST_ASSERT(rte_is_same_ether_addr(&rand_ea, &result),
+			"rte_ether_format/unformat mismatch");
+	}
+	return 0;
+
+}
+
+static int
+test_unformat_addr(void)
+{
+	const struct rte_ether_addr expected = {
+		.addr_bytes = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc },
+	};
+	const struct rte_ether_addr nozero_ea = {
+		.addr_bytes = { 1, 2, 3, 4, 5, 6 },
+	};
+	struct rte_ether_addr result;
+	int ret;
+
+	/* Test IETF format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("12:34:56:78:9a:bc", &result);
+	RTE_TEST_ASSERT(ret == 0, "IETF unformat failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
+		"IETF unformat mismatch");
+
+	/* Test IEEE format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("12-34-56-78-9A-BC", &result);
+	RTE_TEST_ASSERT(ret == 0, "IEEE unformat failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
+			"IEEE unformat mismatch");
+
+	/* Test Cisco format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("1234.5678.9ABC", &result);
+	RTE_TEST_ASSERT(ret == 0, "Cisco unformat failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
+			"Cisco unformat mismatch");
+
+	/* Test no leading zeros - IETF */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("1:2:3:4:5:6", &result);
+	RTE_TEST_ASSERT(ret == 0, "IETF leading zero failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
+			"IETF leading zero mismatch");
+
+	/* Test no-leading zero - IEEE format */
+	memset(&result, 0, sizeof(result));
+	ret = rte_ether_unformat_addr("1-2-3-4-5-6", &result);
+	RTE_TEST_ASSERT(ret == 0, "IEEE leading zero failed");
+	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
+			"IEEE leading zero mismatch");
+
+
+	return 0;
+}
+
+static int
+test_invalid_addr(void)
+{
+	static const char * const invalid[] = {
+		"123",
+		"123:456",
+		"12:34:56:78:9a:gh",
+		"12:34:56:78:9a",
+		"100:34:56:78:9a:bc",
+		"34-56-78-9a-bc",
+		"12:34:56-78:9a:bc",
+		"12:34:56.78:9a:bc",
+		"123:456:789:abc",
+		"NOT.AN.ADDRESS",
+		"102.304.506",
+		"",
+	};
+	struct rte_ether_addr result;
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(invalid); ++i) {
+		if (!rte_ether_unformat_addr(invalid[i], &result)) {
+			fprintf(stderr, "rte_ether_unformat_addr(%s) succeeded!\n",
+				invalid[i]);
+			return -1;
+		}
+	}
+	return 0;
+}
+
+static int
+test_net_ether(void)
+{
+	if (test_ether_addr())
+		return -1;
+
+	if (test_format_addr())
+		return -1;
+
+	if (test_unformat_addr())
+		return -1;
+
+	if (test_invalid_addr())
+		return -1;
+
+	return 0;
+}
+
+REGISTER_FAST_TEST(net_ether_autotest, true, true, test_net_ether);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v3 4/4] net/tap: use rte_ether_unformat_address
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
                     ` (2 preceding siblings ...)
  2023-10-03 20:29   ` [PATCH v3 3/4] test: add tests for rte_ether routines Stephen Hemminger
@ 2023-10-03 20:29   ` Stephen Hemminger
  2023-10-11 14:25     ` Ferruh Yigit
  2023-10-04 11:48   ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Ferruh Yigit
  4 siblings, 1 reply; 24+ messages in thread
From: Stephen Hemminger @ 2023-10-03 20:29 UTC (permalink / raw)
  To: dev; +Cc: David Christensen, stable, Stephen Hemminger

From: David Christensen <drc@linux.vnet.ibm.com>

Building DPDK with gcc 12 on a ppc64le system generates a
stringop-overflow warning. Replace the local MAC address
validation function parse_user_mac() with a call to
rte_ether_unformat_addr() instead.

Bugzilla ID: 1197
Cc: stable@dpdk.org

Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/tap/rte_eth_tap.c | 25 +------------------------
 1 file changed, 1 insertion(+), 24 deletions(-)

diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index bf98f7555990..b25a52655fa2 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -2267,29 +2267,6 @@ set_remote_iface(const char *key __rte_unused,
 	return 0;
 }
 
-static int parse_user_mac(struct rte_ether_addr *user_mac,
-		const char *value)
-{
-	unsigned int index = 0;
-	char mac_temp[strlen(ETH_TAP_USR_MAC_FMT) + 1], *mac_byte = NULL;
-
-	if (user_mac == NULL || value == NULL)
-		return 0;
-
-	strlcpy(mac_temp, value, sizeof(mac_temp));
-	mac_byte = strtok(mac_temp, ":");
-
-	while ((mac_byte != NULL) &&
-			(strlen(mac_byte) <= 2) &&
-			(strlen(mac_byte) == strspn(mac_byte,
-					ETH_TAP_CMP_MAC_FMT))) {
-		user_mac->addr_bytes[index++] = strtoul(mac_byte, NULL, 16);
-		mac_byte = strtok(NULL, ":");
-	}
-
-	return index;
-}
-
 static int
 set_mac_type(const char *key __rte_unused,
 	     const char *value,
@@ -2311,7 +2288,7 @@ set_mac_type(const char *key __rte_unused,
 		goto success;
 	}
 
-	if (parse_user_mac(user_mac, value) != 6)
+	if (rte_ether_unformat_addr(value, user_mac) < 0)
 		goto error;
 success:
 	TAP_LOG(DEBUG, "TAP user MAC param (%s)", value);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v3 0/4] rte_ether_unformat_addr related changes
  2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
                     ` (3 preceding siblings ...)
  2023-10-03 20:29   ` [PATCH v3 4/4] net/tap: use rte_ether_unformat_address Stephen Hemminger
@ 2023-10-04 11:48   ` Ferruh Yigit
  4 siblings, 0 replies; 24+ messages in thread
From: Ferruh Yigit @ 2023-10-04 11:48 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On 10/3/2023 9:29 PM, Stephen Hemminger wrote:
> This patchset makes rte_ether_unformat_addr allow other formats
> for MAC address. Need to remove some inputs from existing
> cmdline_etheraddr test, and add a new test in test suite
> to cover this.  There is some overlap between the two tests
> but that is fine.
> 
> v4 - fix spelling errors
>      don't allow leading zeros in Cisco 3 part format
>      incorporate tap patch to use unformat addr
> 
> David Christensen (1):
>   net/tap: use rte_ether_unformat_address
> 
> Stephen Hemminger (3):
>   test: remove some strings from cmdline_etheraddr tests
>   rte_ether_unformat: accept more inputs
>   test: add tests for rte_ether routines
> 
>  

Thanks for the patch, appreciated.

For series,
Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>


Series applied to dpdk-next-net/main, thanks.


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v3 4/4] net/tap: use rte_ether_unformat_address
  2023-10-03 20:29   ` [PATCH v3 4/4] net/tap: use rte_ether_unformat_address Stephen Hemminger
@ 2023-10-11 14:25     ` Ferruh Yigit
  0 siblings, 0 replies; 24+ messages in thread
From: Ferruh Yigit @ 2023-10-11 14:25 UTC (permalink / raw)
  To: Stephen Hemminger, dev, David Marchand
  Cc: David Christensen, stable, Thomas Monjalon

On 10/3/2023 9:29 PM, Stephen Hemminger wrote:
> From: David Christensen <drc@linux.vnet.ibm.com>
> 
> Building DPDK with gcc 12 on a ppc64le system generates a
> stringop-overflow warning. Replace the local MAC address
> validation function parse_user_mac() with a call to
> rte_ether_unformat_addr() instead.
> 
> Bugzilla ID: 1197
>

For record, this should be 1195, caught by David:
Bugzilla ID: 1195



^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2023-10-11 14:25 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-29 16:36 [RFC] rte_ether_unformat: accept more inputs Stephen Hemminger
2023-09-29 19:35 ` Morten Brørup
2023-09-29 23:08   ` Stephen Hemminger
2023-10-02 18:37 ` [PATCH v2 0/3] rte_ether_unformat_addr changes Stephen Hemminger
2023-10-02 18:37   ` [PATCH v2 1/3] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
2023-10-03 10:47     ` Ferruh Yigit
2023-10-03 10:59       ` Ferruh Yigit
2023-10-03 16:38         ` Stephen Hemminger
2023-10-03 16:36       ` Stephen Hemminger
2023-10-03 16:50         ` Ferruh Yigit
2023-10-03 17:18           ` Stephen Hemminger
2023-10-02 18:37   ` [PATCH v2 2/3] rte_ether_unformat: accept more inputs Stephen Hemminger
2023-10-02 18:37   ` [PATCH v2 3/3] test: add tests for rte_ether routines Stephen Hemminger
2023-10-03  6:17   ` [PATCH v2 0/3] rte_ether_unformat_addr changes Morten Brørup
2023-10-03 10:44   ` Ferruh Yigit
2023-10-03 16:27     ` Stephen Hemminger
2023-10-03 16:34     ` Stephen Hemminger
2023-10-03 20:29 ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Stephen Hemminger
2023-10-03 20:29   ` [PATCH v3 1/4] test: remove some strings from cmdline_etheraddr tests Stephen Hemminger
2023-10-03 20:29   ` [PATCH v3 2/4] rte_ether_unformat: accept more inputs Stephen Hemminger
2023-10-03 20:29   ` [PATCH v3 3/4] test: add tests for rte_ether routines Stephen Hemminger
2023-10-03 20:29   ` [PATCH v3 4/4] net/tap: use rte_ether_unformat_address Stephen Hemminger
2023-10-11 14:25     ` Ferruh Yigit
2023-10-04 11:48   ` [PATCH v3 0/4] rte_ether_unformat_addr related changes Ferruh Yigit

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.