Add format specifiers for printing out colon-separated bytes:
MAC addresses (%pM):
xx:xx:xx:xx:xx:xx
IPv4 addresses (%p4):
xx:xx:xx:xx
IPv6 addresses (%p6):
xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
%#pM, %#p4, %#p6 are also supported and print without the colon
separators.
[Based on Johannes Berg's initial patch]
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
---
This one without the embarrassing index typos in ip6_address and mac_address.
lib/vsprintf.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index a013bbc..eec3879 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -581,6 +581,58 @@ static char *resource_string(char *buf, char *end, struct resource *res, int fie
return string(buf, end, sym, field_width, precision, flags);
}
+static char *ip4_address(char *buf, char *end, u8 *addr, int field_width,
+ int precision, int flags)
+{
+ char ip4_addr[4 * 3]; /* (4 * 2 hex digits), 3 colons and trailing zero */
+ char *p = ip4_addr;
+ int i;
+
+ for (i = 0; i < 4; i++) {
+ p = pack_hex_byte(p, addr[i]);
+ if (!(flags & SPECIAL) && i != 3)
+ *p++ = ':';
+ }
+ *p = '\0';
+
+ return string(buf, end, ip4_addr, field_width, precision, flags & ~SPECIAL);
+}
+
+static char *ip6_address(char *buf, char *end, u8 *addr, int field_width,
+ int precision, int flags)
+{
+ char ip6_addr[8 * 5]; /* (8 * 4 hex digits), 7 colons and trailing zero */
+ char *p = ip6_addr;
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ p = pack_hex_byte(p, addr[2 * i]);
+ p = pack_hex_byte(p, addr[2 * i + 1]);
+ if (!(flags & SPECIAL) && i != 7)
+ *p++ = ':';
+ }
+ *p = '\0';
+
+ return string(buf, end, ip6_addr, field_width, precision, flags & ~SPECIAL);
+}
+
+static char *mac_address(char *buf, char *end, u8 *addr, int field_width,
+ int precision, int flags)
+{
+ char mac_addr[6 * 3]; /* (6 * 2 hex digits), 5 colons and ...Shouldn't that last one be '6' instead of 'M'? --
Since when are IPv4 addresses "usually" printed in colon-separated hex? -hpa --
The # for ipv4 we might use for cpu-endian rather than network-endian maybe? Also can you keep mac/ip address patches split up so we can use my version of the mac address patch (it's already well-tested)? johannes
From: Harvey Harrison <harvey.harrison@gmail.com> So I'll wait for Harvey's "v3" of this patch, and once I have that in the net-next-2.6 tree I'll start adding Johannes's conversions on top. --
Ok, fine with me too. Harvey, can you sort out the ip4 issue and then send with %pM included? johannes
Add format specifiers for printing out six colon-separated bytes:
MAC addresses (%pM):
xx:xx:xx:xx:xx:xx
%#pM is also supported and omits the colon separators.
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
---
Dave, this passes testing here, but I was wondering if perhaps it would be
better to allow a length to be specified as well, which would allow:
%pM6 for mac addresses, etc as there seem a lot of places in kernel that
print out a list of colon separated bytes of various lengths.
But if that was added, it may be more natural to call it
%pB (bytes)
%pW (words)
Then mac addresses would be %pB6
IPv6 addresses would be %pW8 (8 words)
It would be trivial to add, but maybe I'm overthinking this. In any event,
this patch only adds %pM for mac addresses.
lib/vsprintf.c | 21 +++++++++++++++++++++
1 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index a013bbc..2025305 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -581,6 +581,23 @@ static char *resource_string(char *buf, char *end, struct resource *res, int fie
return string(buf, end, sym, field_width, precision, flags);
}
+static char *mac_address(char *buf, char *end, u8 *addr, int field_width,
+ int precision, int flags)
+{
+ char mac_addr[6 * 3]; /* (6 * 2 hex digits), 5 colons and trailing zero */
+ char *p = mac_addr;
+ int i;
+
+ for (i = 0; i < 6; i++) {
+ p = pack_hex_byte(p, addr[i]);
+ if (!(flags & SPECIAL) && i != 5)
+ *p++ = ':';
+ }
+ *p = '\0';
+
+ return string(buf, end, mac_addr, field_width, precision, flags & ~SPECIAL);
+}
+
/*
* Show a '%p' thing. A kernel extension is that the '%p' is followed
* by an extra set of alphanumeric characters that are extended format
@@ -592,6 +609,8 @@ static char *resource_string(char *buf, char *end, struct resource *res, int fie
* - 'S' For symbolic direct pointers
* - 'R' For a struct resource pointer, it prints the range of
* addresses (not the ...On Mon, 2008-10-27 at 12:59 -0700, Harvey Harrison wrote: The changes to use %p4 aren't too bad. I did that last year using a similar style to print_mac. 80 or so files. http://repo.or.cz/w/linux-2.6/trivial-mods.git?a=shortlog;h=refs/heads/print_ipv4 ipv6 was 30 or so files I think length would not be good addition. print_dump_hex already does a fine job. There are also BE/LE expectation problems with pW. The %p6 pointer should be in6_addr * The %p4 pointer should be __be32 *. Printing an ipv4 address should use %u.%u.%u.%u I've been doodling with sparse to check calls with __attribute__(format(printf parsing the format strings for %p<FOO> and match the argument types. mac_address_string please. --
From: Joe Perches <joe@perches.com> I'll make this change when I apply Harvey's patch. --
From: Harvey Harrison <harvey.harrison@gmail.com> Applied, thanks. --
Did you happen to have a preference with regard to the specifier for IPv6 addresses: I was thinking of using %pI6 to replace NIP6() and NIP6_FMT and using %#pI6 for NIP6_SEQFMT. On the IPv4 side, maybe use %pI4 for network endian NIPQUAD() and NIPQUAD_FMT and then %#pI4 for host-endian HIQUAD(), as displaying the IPv4 address without the periods isn't useful? What do you think of that? Harvey --
%#pI4 is horrible and %p4 and %p6 were cool. --
HIPQUAD is horrible and should disappear. Just use htonl first. I think just %p4 %p6 %#p6 for the NIP6_SEQFMT uses. --
But you can't really say printk("... %p4 ...", &htonl(host_ip4)); can you? I suppose the compiler would actually create a variable for that? johannes
From: Harvey Harrison <harvey.harrison@gmail.com> I'm ok with the '#' modifier but remind me again what's wrong with using plain %p4 and %p6? --
Nothing at all, just wanted to know what color bikeshed you wanted. I'll go with %p4 %p6. Harvey --
Just an FYI for v6 addresses: There are a few uses of ipv6 address as "%08X%08X%08X%08X" Pavel Emelyanov tried to isolate them with a suggested patch: http://www.mail-archive.com/netdev@vger.kernel.org/msg51655.html These addresses are not shown in network order, but are printed backwards in host order. Oops. Apparently it's too late to fix them. --
So that code we don't touch here at all. johannes
