All of lore.kernel.org
 help / color / mirror / Atom feed
From: Keith Busch <keith.busch@intel.com>
To: linux-nvme@lists.infradead.org, LKML <linux-kernel@vger.kernel.org>
Cc: Matthew Wilcox <willy@linux.intel.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jens Axboe <axboe@fb.com>, Christoph Hellwig <hch@infradead.org>,
	Dan Williams <dan.j.williams@intel.com>,
	Joe Perches <joe@perches.com>,
	Keith Busch <keith.busch@intel.com>
Subject: [PATCHv3] printf: Add format for 8-byte EUI-64 type
Date: Wed,  9 Dec 2015 16:06:53 -0700	[thread overview]
Message-ID: <1449702413-25598-1-git-send-email-keith.busch@intel.com> (raw)

MAC addresses may be formed using rules based on EUI-64, which is 2 bytes
longer than a typical 6-byte MAC. This patch adds a long specifier to
the %pM format to support the extended unique identifier.

Since there are multiple valid possible permutations of format specifiers,
the decoding is done in a loop, and the default ':' separator is
initialized at declaration time. A side effect of this allows 'F' and
'R' both be specified, so these are appended to the documentation.

Signed-off-by: Keith Busch <keith.busch@intel.com>
---
>From previous version:

  Use 'while (isalpha(*++fmt))' to loop over all the format specfiers,
  and updated documentation with the new possible formats.

 Documentation/printk-formats.txt | 15 ++++++++++++---
 lib/vsprintf.c                   | 40 +++++++++++++++++++++-------------------
 2 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt
index b784c27..b39eb37 100644
--- a/Documentation/printk-formats.txt
+++ b/Documentation/printk-formats.txt
@@ -136,14 +136,23 @@ Raw buffer as a hex string:
 MAC/FDDI addresses:
 
 	%pM	00:01:02:03:04:05
+	%pMl	00:01:02:03:04:05:06:07
 	%pMR	05:04:03:02:01:00
+	%pMRl	07:06:05:04:03:02:01:00
 	%pMF	00-01-02-03-04-05
+	%pMFl	00-01-02-03-04-05-06-07
+	%pMFR	05-04-03-02-01-00
+	%pMFRl	07-06-05-04-03-02-01-00
 	%pm	000102030405
+	%pml	0001020304050607
 	%pmR	050403020100
+	%pmRl	0706050403020100
 
-	For printing 6-byte MAC/FDDI addresses in hex notation. The 'M' and 'm'
-	specifiers result in a printed address with ('M') or without ('m') byte
-	separators. The default byte separator is the colon (':').
+	For printing 6 or 8-byte MAC/FDDI addresses in hex notation. The
+	'M' and 'm' specifiers result in a printed address with ('M')
+	or without ('m') byte separators. The default byte separator is
+	the colon (':'). Append 'l' to specify an 8-byte in accordance
+	with EUI-64 format.
 
 	Where FDDI addresses are concerned the 'F' specifier can be used after
 	the 'M' specifier to use dash ('-') separators instead of the default
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index f9cee8e..01b7ebd 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -889,33 +889,33 @@ static noinline_for_stack
 char *mac_address_string(char *buf, char *end, u8 *addr,
 			 struct printf_spec spec, const char *fmt)
 {
-	char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
+	char mac_addr[sizeof("xx:xx:xx:xx:xx:xx:xx:xx")];
 	char *p = mac_addr;
-	int i;
-	char separator;
-	bool reversed = false;
-
-	switch (fmt[1]) {
-	case 'F':
-		separator = '-';
-		break;
+	int i, bytes = 6;
+	char separator = ':';
+	bool reversed = false, separate = (fmt[0] == 'M');
 
-	case 'R':
-		reversed = true;
-		/* fall through */
-
-	default:
-		separator = ':';
-		break;
+	while (isalpha(*++fmt)) {
+		switch (*fmt) {
+		case 'F':
+			separator = '-';
+			break;
+		case 'R':
+			reversed = true;
+			break;
+		case 'l':
+			bytes = 8;
+			break;
+		}
 	}
 
-	for (i = 0; i < 6; i++) {
+	for (i = 0; i < bytes; i++) {
 		if (reversed)
-			p = hex_byte_pack(p, addr[5 - i]);
+			p = hex_byte_pack(p, addr[(bytes - 1) - i]);
 		else
 			p = hex_byte_pack(p, addr[i]);
 
-		if (fmt[0] == 'M' && i != 5)
+		if (separate && i != (bytes - 1))
 			*p++ = separator;
 	}
 	*p = '\0';
@@ -1496,6 +1496,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
 	case 'm':			/* Contiguous: 000102030405 */
 					/* [mM]F (FDDI) */
 					/* [mM]R (Reverse order; Bluetooth) */
+					/* [mM]l (EUI-64) */
+					/* [mM][FM]l (FDDI/Reverse order EUI-64) */
 		return mac_address_string(buf, end, ptr, spec, fmt);
 	case 'I':			/* Formatted IP supported
 					 * 4:	1.2.3.4
-- 
2.6.2.307.g37023ba


WARNING: multiple messages have this Message-ID (diff)
From: keith.busch@intel.com (Keith Busch)
Subject: [PATCHv3] printf: Add format for 8-byte EUI-64 type
Date: Wed,  9 Dec 2015 16:06:53 -0700	[thread overview]
Message-ID: <1449702413-25598-1-git-send-email-keith.busch@intel.com> (raw)

MAC addresses may be formed using rules based on EUI-64, which is 2 bytes
longer than a typical 6-byte MAC. This patch adds a long specifier to
the %pM format to support the extended unique identifier.

Since there are multiple valid possible permutations of format specifiers,
the decoding is done in a loop, and the default ':' separator is
initialized at declaration time. A side effect of this allows 'F' and
'R' both be specified, so these are appended to the documentation.

Signed-off-by: Keith Busch <keith.busch at intel.com>
---
>From previous version:

  Use 'while (isalpha(*++fmt))' to loop over all the format specfiers,
  and updated documentation with the new possible formats.

 Documentation/printk-formats.txt | 15 ++++++++++++---
 lib/vsprintf.c                   | 40 +++++++++++++++++++++-------------------
 2 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt
index b784c27..b39eb37 100644
--- a/Documentation/printk-formats.txt
+++ b/Documentation/printk-formats.txt
@@ -136,14 +136,23 @@ Raw buffer as a hex string:
 MAC/FDDI addresses:
 
 	%pM	00:01:02:03:04:05
+	%pMl	00:01:02:03:04:05:06:07
 	%pMR	05:04:03:02:01:00
+	%pMRl	07:06:05:04:03:02:01:00
 	%pMF	00-01-02-03-04-05
+	%pMFl	00-01-02-03-04-05-06-07
+	%pMFR	05-04-03-02-01-00
+	%pMFRl	07-06-05-04-03-02-01-00
 	%pm	000102030405
+	%pml	0001020304050607
 	%pmR	050403020100
+	%pmRl	0706050403020100
 
-	For printing 6-byte MAC/FDDI addresses in hex notation. The 'M' and 'm'
-	specifiers result in a printed address with ('M') or without ('m') byte
-	separators. The default byte separator is the colon (':').
+	For printing 6 or 8-byte MAC/FDDI addresses in hex notation. The
+	'M' and 'm' specifiers result in a printed address with ('M')
+	or without ('m') byte separators. The default byte separator is
+	the colon (':'). Append 'l' to specify an 8-byte in accordance
+	with EUI-64 format.
 
 	Where FDDI addresses are concerned the 'F' specifier can be used after
 	the 'M' specifier to use dash ('-') separators instead of the default
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index f9cee8e..01b7ebd 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -889,33 +889,33 @@ static noinline_for_stack
 char *mac_address_string(char *buf, char *end, u8 *addr,
 			 struct printf_spec spec, const char *fmt)
 {
-	char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
+	char mac_addr[sizeof("xx:xx:xx:xx:xx:xx:xx:xx")];
 	char *p = mac_addr;
-	int i;
-	char separator;
-	bool reversed = false;
-
-	switch (fmt[1]) {
-	case 'F':
-		separator = '-';
-		break;
+	int i, bytes = 6;
+	char separator = ':';
+	bool reversed = false, separate = (fmt[0] == 'M');
 
-	case 'R':
-		reversed = true;
-		/* fall through */
-
-	default:
-		separator = ':';
-		break;
+	while (isalpha(*++fmt)) {
+		switch (*fmt) {
+		case 'F':
+			separator = '-';
+			break;
+		case 'R':
+			reversed = true;
+			break;
+		case 'l':
+			bytes = 8;
+			break;
+		}
 	}
 
-	for (i = 0; i < 6; i++) {
+	for (i = 0; i < bytes; i++) {
 		if (reversed)
-			p = hex_byte_pack(p, addr[5 - i]);
+			p = hex_byte_pack(p, addr[(bytes - 1) - i]);
 		else
 			p = hex_byte_pack(p, addr[i]);
 
-		if (fmt[0] == 'M' && i != 5)
+		if (separate && i != (bytes - 1))
 			*p++ = separator;
 	}
 	*p = '\0';
@@ -1496,6 +1496,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
 	case 'm':			/* Contiguous: 000102030405 */
 					/* [mM]F (FDDI) */
 					/* [mM]R (Reverse order; Bluetooth) */
+					/* [mM]l (EUI-64) */
+					/* [mM][FM]l (FDDI/Reverse order EUI-64) */
 		return mac_address_string(buf, end, ptr, spec, fmt);
 	case 'I':			/* Formatted IP supported
 					 * 4:	1.2.3.4
-- 
2.6.2.307.g37023ba

             reply	other threads:[~2015-12-09 23:07 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-09 23:06 Keith Busch [this message]
2015-12-09 23:06 ` [PATCHv3] printf: Add format for 8-byte EUI-64 type Keith Busch
2015-12-09 23:21 ` Joe Perches
2015-12-09 23:21   ` Joe Perches
2015-12-10 15:06   ` Keith Busch
2015-12-10 15:06     ` Keith Busch
2015-12-11 15:42     ` Andy Shevchenko
2015-12-11 15:42       ` Andy Shevchenko
2015-12-10  1:40 ` Elliott, Robert (Persistent Memory)
2015-12-10  1:40   ` Elliott, Robert (Persistent Memory)

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=1449702413-25598-1-git-send-email-keith.busch@intel.com \
    --to=keith.busch@intel.com \
    --cc=axboe@fb.com \
    --cc=dan.j.williams@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@infradead.org \
    --cc=joe@perches.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=willy@linux.intel.com \
    /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 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.