printf: Add format for 8-byte EUI-64 type
Subsystems (4)
PATCH v3 1/1 printf: Add format for 8-byte EUI-64 type
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.
---
Quoted 1 line
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(-)
Documentation/printk-formats.txt +12 -3
@@ -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
lib/vsprintf.c +21 -19
@@ -889,33 +889,33 @@ static noinline_for_stackchar *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
Signature · 1 line
2.6.2.307.g37023ba
Quoted 8 lines · Keith Busch
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.
Just thought of this:
An alternative is using a format of "%8phC"
Is there a use case for a bluetooth or FDDI EUI-64?
Quoted 10 lines · Joe Perches
Quoted 8 lines · Keith Busch
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.
Quoted 5 lines
Just thought of this:
An alternative is using a format of "%8phC"
Is there a use case for a bluetooth or FDDI EUI-64?
*facepalm*
I didn't know that format, but it satisfies my needs. I am not aware of bluetooth or fddi using eui64, so I've no problem withdrawing the patch. I'll just fix up the one that depended on it.
+Rasmus.
Quoted 15 lines · Keith Busch
Quoted 14 lines · Joe Perches
Quoted 8 lines · Keith Busch
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.
Just thought of this:
An alternative is using a format of "%8phC"
Quoted 7 lines
Quoted 1 line
Is there a use case for a bluetooth or FDDI EUI-64?
*facepalm*
I didn't know that format, but it satisfies my needs. I am not aware of bluetooth or fddi using eui64, so I've no problem withdrawing the patch. I'll just fix up the one that depended on it.
Of course you might try to add reversed support for %*ph.
Also you may consider print_hex_dump() [hex_dump_to_buffer()], though it looks like overkill in particular here.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 5 lines
-----Original Message-----
From: linux-kernel-owner at vger.kernel.org [mailto:linux-kernel- owner at vger.kernel.org] On Behalf Of Keith Busch
Sent: Wednesday, December 9, 2015 5:07 PM
...
Quoted 2 lines
Subject: [PATCHv3] printf: Add format for 8-byte EUI-64 type
...
lib/vsprintf.c char *pointer(const char *fmt, char *buf, char · line 1501
Quoted 7 lines
lib/vsprintf.c +2
-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) */
Should that be [FR] rather than [FM]?
---
Robert Elliott, HPE Persistent Memory