diff options
| author | Andrei Emeltchenko <andrei.emeltchenko@intel.com> | 2012-07-30 17:40:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 20:25:14 -0400 |
| commit | 76597ff989a1fbaa9b9a1e54007cd759bf257ab7 (patch) | |
| tree | 51c5a7e99de7ff2ba88ba73b110a60c623c5d32c /lib | |
| parent | 61e99ab8e35a88b8c4d0f80d3df9ee16df471be5 (diff) | |
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: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Cc: Joe Perches <joe@perches.com>
Cc: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/vsprintf.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index c3f36d415bdf..736974576e2d 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
| @@ -662,15 +662,28 @@ char *mac_address_string(char *buf, char *end, u8 *addr, | |||
| 662 | char *p = mac_addr; | 662 | char *p = mac_addr; |
| 663 | int i; | 663 | int i; |
| 664 | char separator; | 664 | char separator; |
| 665 | bool reversed = false; | ||
| 665 | 666 | ||
| 666 | if (fmt[1] == 'F') { /* FDDI canonical format */ | 667 | switch (fmt[1]) { |
| 668 | case 'F': | ||
| 667 | separator = '-'; | 669 | separator = '-'; |
| 668 | } else { | 670 | break; |
| 671 | |||
| 672 | case 'R': | ||
| 673 | reversed = true; | ||
| 674 | /* fall through */ | ||
| 675 | |||
| 676 | default: | ||
| 669 | separator = ':'; | 677 | separator = ':'; |
| 678 | break; | ||
| 670 | } | 679 | } |
| 671 | 680 | ||
| 672 | for (i = 0; i < 6; i++) { | 681 | for (i = 0; i < 6; i++) { |
| 673 | p = hex_byte_pack(p, addr[i]); | 682 | if (reversed) |
| 683 | p = hex_byte_pack(p, addr[5 - i]); | ||
| 684 | else | ||
| 685 | p = hex_byte_pack(p, addr[i]); | ||
| 686 | |||
| 674 | if (fmt[0] == 'M' && i != 5) | 687 | if (fmt[0] == 'M' && i != 5) |
| 675 | *p++ = separator; | 688 | *p++ = separator; |
| 676 | } | 689 | } |
| @@ -933,6 +946,7 @@ int kptr_restrict __read_mostly; | |||
| 933 | * - 'm' For a 6-byte MAC address, it prints the hex address without colons | 946 | * - 'm' For a 6-byte MAC address, it prints the hex address without colons |
| 934 | * - 'MF' For a 6-byte MAC FDDI address, it prints the address | 947 | * - 'MF' For a 6-byte MAC FDDI address, it prints the address |
| 935 | * with a dash-separated hex notation | 948 | * with a dash-separated hex notation |
| 949 | * - '[mM]R For a 6-byte MAC address, Reverse order (Bluetooth) | ||
| 936 | * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way | 950 | * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way |
| 937 | * IPv4 uses dot-separated decimal without leading 0's (1.2.3.4) | 951 | * IPv4 uses dot-separated decimal without leading 0's (1.2.3.4) |
| 938 | * IPv6 uses colon separated network-order 16 bit hex with leading 0's | 952 | * 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 | return resource_string(buf, end, ptr, spec, fmt); | 1009 | return resource_string(buf, end, ptr, spec, fmt); |
| 996 | case 'M': /* Colon separated: 00:01:02:03:04:05 */ | 1010 | case 'M': /* Colon separated: 00:01:02:03:04:05 */ |
| 997 | case 'm': /* Contiguous: 000102030405 */ | 1011 | case 'm': /* Contiguous: 000102030405 */ |
| 998 | /* [mM]F (FDDI, bit reversed) */ | 1012 | /* [mM]F (FDDI) */ |
| 1013 | /* [mM]R (Reverse order; Bluetooth) */ | ||
| 999 | return mac_address_string(buf, end, ptr, spec, fmt); | 1014 | return mac_address_string(buf, end, ptr, spec, fmt); |
| 1000 | case 'I': /* Formatted IP supported | 1015 | case 'I': /* Formatted IP supported |
| 1001 | * 4: 1.2.3.4 | 1016 | * 4: 1.2.3.4 |
