Re: [RFC PATCHv3] printk: add %pM format specifier for MAC addresses

Previous thread: [PATCH/RESEND] mm: Fix problem of parameter in note by Jianjun Kong on Sunday, October 26, 2008 - 5:27 pm. (1 message)

Next thread: [PATCH 2.6.28-rc2] sata_promise: proper hardreset by Mikael Pettersson on Sunday, October 26, 2008 - 5:49 pm. (3 messages)
From: Harvey Harrison
Date: Sunday, October 26, 2008 - 5:31 pm

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 ...
From: Frans Pop
Date: Sunday, October 26, 2008 - 6:21 pm

Shouldn't that last one be '6' instead of 'M'?
--

From: H. Peter Anvin
Date: Sunday, October 26, 2008 - 7:08 pm

Since when are IPv4 addresses "usually" printed in colon-separated hex?

	-hpa
--

From: Johannes Berg
Date: Sunday, October 26, 2008 - 11:59 pm

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
Date: Monday, October 27, 2008 - 9:28 am

Sure.  I'll build on top.

Harvey

--

From: David Miller
Date: Monday, October 27, 2008 - 12:38 pm

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.
--

From: Johannes Berg
Date: Monday, October 27, 2008 - 12:47 pm

Ok, fine with me too. Harvey, can you sort out the ip4 issue and then
send with %pM included?

johannes
From: Harvey Harrison
Date: Monday, October 27, 2008 - 12:59 pm

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 ...
From: Joe Perches
Date: Monday, October 27, 2008 - 2:55 pm

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: David Miller
Date: Monday, October 27, 2008 - 3:46 pm

From: Joe Perches <joe@perches.com>

I'll make this change when I apply Harvey's patch.
--

From: David Miller
Date: Monday, October 27, 2008 - 3:47 pm

From: Harvey Harrison <harvey.harrison@gmail.com>

Applied, thanks.
--

From: Harvey Harrison
Date: Monday, October 27, 2008 - 4:14 pm

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

--

From: Alexey Dobriyan
Date: Monday, October 27, 2008 - 4:31 pm

%#pI4 is horrible and %p4 and %p6 were cool.
--

From: Joe Perches
Date: Monday, October 27, 2008 - 4:48 pm

HIPQUAD is horrible and should disappear.
Just use htonl first.

I think just %p4 %p6 %#p6 for the NIP6_SEQFMT uses.

--

From: Johannes Berg
Date: Tuesday, October 28, 2008 - 1:04 am

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: David Miller
Date: Monday, October 27, 2008 - 4:55 pm

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?
--

From: Harvey Harrison
Date: Monday, October 27, 2008 - 5:05 pm

Nothing at all, just wanted to know what color bikeshed you wanted.

I'll go with %p4 %p6.

Harvey

--

From: Joe Perches
Date: Monday, October 27, 2008 - 5:22 pm

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.

--

From: Johannes Berg
Date: Tuesday, October 28, 2008 - 1:06 am

So that code we don't touch here at all.

johannes
Previous thread: [PATCH/RESEND] mm: Fix problem of parameter in note by Jianjun Kong on Sunday, October 26, 2008 - 5:27 pm. (1 message)

Next thread: [PATCH 2.6.28-rc2] sata_promise: proper hardreset by Mikael Pettersson on Sunday, October 26, 2008 - 5:49 pm. (3 messages)