[RFC PATCH] lib/vsprintf.c: Add %pMF to for FDDI bit reversed dashed output
From: Joe Perches <joe@perches.com>
Date: 2010-01-05 01:05:50
Also in:
lkml
Subsystem:
library code, the rest, vsprintf · Maintainers:
Andrew Morton, Linus Torvalds, Petr Mladek, Steven Rostedt
On Mon, 2010-01-04 at 23:43 +0000, Maciej W. Rozycki wrote:
The example below shows an address, and the sequence of bits or symbols
that would be transmitted when the address is used in the Source Address
or Destination Address fields on the MAC header. The transmission line
shows the address bits in the order transmitted, from left to right. For
IEEE 802 LANs these correspond to actual bits on the medium. The FDDI
symbols line shows how the FDDI PHY sends the address bits as encoded
symbols.
MSB: 35:7B:12:00:00:01
Canonical: AC-DE-48-00-00-80
Transmission: 00110101 01111011 00010010 00000000 00000000 00000001
FDDI Symbols: 35 7B 12 00 00 01"
Please note that this address has its group bit clear.
This notation is also defined in the "FDDI MEDIA ACCESS CONTROL-2
(MAC-2)" (X3T9/92-120) document although that book does not have a need
to use the MSB form and it's skipped.Here's a possible patch to vsprintf to add %pMF to print FDDI bit-reversed dash separated addresses. vsprintf.o increases by 90 bytes. Perhaps it's not worth that. Signed-off-by: Joe Perches <joe@perches.com>
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index d4996cf..96f1987 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c@@ -25,6 +25,7 @@ #include <linux/kallsyms.h> #include <linux/uaccess.h> #include <linux/ioport.h> +#include <linux/bitrev.h> #include <net/addrconf.h> #include <asm/page.h> /* for PAGE_SIZE */
@@ -682,10 +683,18 @@ static char *mac_address_string(char *buf, char *end, u8 *addr, char *p = mac_addr; int i; - for (i = 0; i < 6; i++) { - p = pack_hex_byte(p, addr[i]); - if (fmt[0] == 'M' && i != 5) - *p++ = ':'; + if (fmt[1] == 'F') { /* FDDI canonical format */ + for (i = 0; i < 6; i++) { + p = pack_hex_byte(p, bitrev8(addr[i])); + if (fmt[0] == 'M' && i != 5) + *p++ = '-'; + } + } else { + for (i = 0; i < 6; i++) { + p = pack_hex_byte(p, addr[i]); + if (fmt[0] == 'M' && i != 5) + *p++ = ':'; + } } *p = '\0';
@@ -896,6 +905,10 @@ static char *uuid_string(char *buf, char *end, const u8 *addr, * - 'M' For a 6-byte MAC address, it prints the address in the * usual colon-separated hex notation * - 'm' For a 6-byte MAC address, it prints the hex address without colons + * - 'MF' For a 6-byte MAC FDDI address, it prints the address + * with a dash-separated hex notation with bit reversed bytes + * - 'mF' For a 6-byte MAC FDDI address, it prints the address + * in hex notation without separators with bit reversed bytes * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way * IPv4 uses dot-separated decimal without leading 0's (1.2.3.4) * IPv6 uses colon separated network-order 16 bit hex with leading 0's
@@ -939,6 +952,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, return resource_string(buf, end, ptr, spec, fmt); case 'M': /* Colon separated: 00:01:02:03:04:05 */ case 'm': /* Contiguous: 000102030405 */ + /* [mM]F (FDDI, bit reversed) */ return mac_address_string(buf, end, ptr, spec, fmt); case 'I': /* Formatted IP supported * 4: 1.2.3.4