Skip to content

Commit

Permalink
vsprintf: add %pMR for Bluetooth MAC address
Browse files Browse the repository at this point in the history
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: Andrei Emeltchenko <[email protected]>
Cc: Joe Perches <[email protected]>
Cc: Marcel Holtmann <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
finikorg authored and torvalds committed Jul 31, 2012
1 parent 61e99ab commit 76597ff
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
5 changes: 5 additions & 0 deletions Documentation/printk-formats.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ Struct Resources:
MAC/FDDI addresses:

%pM 00:01:02:03:04:05
%pMR 05:04:03:02:01:00
%pMF 00-01-02-03-04-05
%pm 000102030405

Expand All @@ -67,6 +68,10 @@ MAC/FDDI addresses:
the 'M' specifier to use dash ('-') separators instead of the default
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:

%pI4 1.2.3.4
Expand Down
23 changes: 19 additions & 4 deletions lib/vsprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -662,15 +662,28 @@ char *mac_address_string(char *buf, char *end, u8 *addr,
char *p = mac_addr;
int i;
char separator;
bool reversed = false;

if (fmt[1] == 'F') { /* FDDI canonical format */
switch (fmt[1]) {
case 'F':
separator = '-';
} else {
break;

case 'R':
reversed = true;
/* fall through */

default:
separator = ':';
break;
}

for (i = 0; i < 6; i++) {
p = hex_byte_pack(p, addr[i]);
if (reversed)
p = hex_byte_pack(p, addr[5 - i]);
else
p = hex_byte_pack(p, addr[i]);

if (fmt[0] == 'M' && i != 5)
*p++ = separator;
}
Expand Down Expand Up @@ -933,6 +946,7 @@ int kptr_restrict __read_mostly;
* - '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
* - '[mM]R For a 6-byte MAC address, Reverse order (Bluetooth)
* - '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
Expand Down Expand Up @@ -995,7 +1009,8 @@ 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) */
/* [mM]F (FDDI) */
/* [mM]R (Reverse order; Bluetooth) */
return mac_address_string(buf, end, ptr, spec, fmt);
case 'I': /* Formatted IP supported
* 4: 1.2.3.4
Expand Down

0 comments on commit 76597ff

Please sign in to comment.