Commit 76597ff9 authored by Andrei Emeltchenko's avatar Andrei Emeltchenko Committed by Linus Torvalds

vsprintf: add %pMR for Bluetooth MAC address

Bluetooth uses mostly LE byte order which is reversed for visual
interpretation.  Currently in Bluetooth in use unsafe batostr function.

This is a slightly modified version of Joe's patch (sent Sat, Dec 4,
2010).
Signed-off-by: default avatarAndrei Emeltchenko <andrei.emeltchenko@intel.com>
Cc: Joe Perches <joe@perches.com>
Cc: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 61e99ab8
...@@ -56,6 +56,7 @@ Struct Resources: ...@@ -56,6 +56,7 @@ Struct Resources:
MAC/FDDI addresses: MAC/FDDI addresses:
%pM 00:01:02:03:04:05 %pM 00:01:02:03:04:05
%pMR 05:04:03:02:01:00
%pMF 00-01-02-03-04-05 %pMF 00-01-02-03-04-05
%pm 000102030405 %pm 000102030405
...@@ -67,6 +68,10 @@ MAC/FDDI addresses: ...@@ -67,6 +68,10 @@ MAC/FDDI addresses:
the 'M' specifier to use dash ('-') separators instead of the default the 'M' specifier to use dash ('-') separators instead of the default
separator. separator.
For Bluetooth addresses the 'R' specifier shall be used after the 'M'
specifier to use reversed byte order suitable for visual interpretation
of Bluetooth addresses which are in the little endian order.
IPv4 addresses: IPv4 addresses:
%pI4 1.2.3.4 %pI4 1.2.3.4
......
...@@ -662,15 +662,28 @@ char *mac_address_string(char *buf, char *end, u8 *addr, ...@@ -662,15 +662,28 @@ char *mac_address_string(char *buf, char *end, u8 *addr,
char *p = mac_addr; char *p = mac_addr;
int i; int i;
char separator; char separator;
bool reversed = false;
if (fmt[1] == 'F') { /* FDDI canonical format */ switch (fmt[1]) {
case 'F':
separator = '-'; separator = '-';
} else { break;
case 'R':
reversed = true;
/* fall through */
default:
separator = ':'; separator = ':';
break;
} }
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
if (reversed)
p = hex_byte_pack(p, addr[5 - i]);
else
p = hex_byte_pack(p, addr[i]); p = hex_byte_pack(p, addr[i]);
if (fmt[0] == 'M' && i != 5) if (fmt[0] == 'M' && i != 5)
*p++ = separator; *p++ = separator;
} }
...@@ -933,6 +946,7 @@ int kptr_restrict __read_mostly; ...@@ -933,6 +946,7 @@ int kptr_restrict __read_mostly;
* - 'm' For a 6-byte MAC address, it prints the hex address without colons * - '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 * - 'MF' For a 6-byte MAC FDDI address, it prints the address
* with a dash-separated hex notation * with a dash-separated hex notation
* - '[mM]R For a 6-byte MAC address, Reverse order (Bluetooth)
* - 'I' [46] for IPv4/IPv6 addresses printed in the usual way * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way
* IPv4 uses dot-separated decimal without leading 0's (1.2.3.4) * 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 * IPv6 uses colon separated network-order 16 bit hex with leading 0's
...@@ -995,7 +1009,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, ...@@ -995,7 +1009,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
return resource_string(buf, end, ptr, spec, fmt); return resource_string(buf, end, ptr, spec, fmt);
case 'M': /* Colon separated: 00:01:02:03:04:05 */ case 'M': /* Colon separated: 00:01:02:03:04:05 */
case 'm': /* Contiguous: 000102030405 */ case 'm': /* Contiguous: 000102030405 */
/* [mM]F (FDDI, bit reversed) */ /* [mM]F (FDDI) */
/* [mM]R (Reverse order; Bluetooth) */
return mac_address_string(buf, end, ptr, spec, fmt); return mac_address_string(buf, end, ptr, spec, fmt);
case 'I': /* Formatted IP supported case 'I': /* Formatted IP supported
* 4: 1.2.3.4 * 4: 1.2.3.4
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment