Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754027AbbLIXHY (ORCPT ); Wed, 9 Dec 2015 18:07:24 -0500 Received: from mga02.intel.com ([134.134.136.20]:12899 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751588AbbLIXHX (ORCPT ); Wed, 9 Dec 2015 18:07:23 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,405,1444719600"; d="scan'208";a="615488770" From: Keith Busch To: linux-nvme@lists.infradead.org, LKML Cc: Matthew Wilcox , Greg Kroah-Hartman , Jens Axboe , Christoph Hellwig , Dan Williams , Joe Perches , Keith Busch Subject: [PATCHv3] printf: Add format for 8-byte EUI-64 type Date: Wed, 9 Dec 2015 16:06:53 -0700 Message-Id: <1449702413-25598-1-git-send-email-keith.busch@intel.com> X-Mailer: git-send-email 1.7.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3973 Lines: 125 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 --- >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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/