diff mbox

[RFC,PATCHv2] printk: add the %pM, %p4, %p6 format specifiers

Message ID 1225067465.5672.1.camel@brick
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Harvey Harrison Oct. 27, 2008, 12:31 a.m. UTC
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(-)

Comments

Frans Pop Oct. 27, 2008, 1:21 a.m. UTC | #1
Harvey Harrison wrote:
> diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> index a013bbc..eec3879 100644
> --- a/lib/vsprintf.c
> +++ b/lib/vsprintf.c
> @@ -592,6 +644,12 @@ 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 name nor the flags)
> + * - 'M' For a 6-byte MAC address, it prints the address in the
> + *       usual colon-separated hex notation
> + * - '4' For a 4-byte IPv4 address, it prints the address in the
> + *       usual colon-separated hex notation
> + * - 'M' For a 16-byte IPv6 address, it prints the address in colon separated
> + *       big-endian 16 bit hex notation

Shouldn't that last one be '6' instead of 'M'?
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
H. Peter Anvin Oct. 27, 2008, 2:08 a.m. UTC | #2
Frans Pop wrote:
>> + * - '4' For a 4-byte IPv4 address, it prints the address in the
>> + *       usual colon-separated hex notation

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

	-hpa
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Oct. 27, 2008, 6:59 a.m. UTC | #3
On Sun, 2008-10-26 at 17:31 -0700, Harvey Harrison wrote:
> 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

As hpa points out, the usual notation would be %d.%d.%d.%d :)

> %#pM, %#p4, %#p6 are also supported and print without the colon
> separators.

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
Harvey Harrison Oct. 27, 2008, 4:28 p.m. UTC | #4
On Mon, 2008-10-27 at 07:59 +0100, Johannes Berg wrote:

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

Sure.  I'll build on top.

Harvey

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Oct. 27, 2008, 7:38 p.m. UTC | #5
From: Harvey Harrison <harvey.harrison@gmail.com>
Date: Mon, 27 Oct 2008 09:28:24 -0700

> On Mon, 2008-10-27 at 07:59 +0100, Johannes Berg wrote:
> 
> > 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)?
> > 
> 
> Sure.  I'll build on top.

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.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Oct. 27, 2008, 7:47 p.m. UTC | #6
On Mon, 2008-10-27 at 12:38 -0700, David Miller wrote:
> From: Harvey Harrison <harvey.harrison@gmail.com>
> Date: Mon, 27 Oct 2008 09:28:24 -0700
> 
> > On Mon, 2008-10-27 at 07:59 +0100, Johannes Berg wrote:
> > 
> > > 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)?
> > > 
> > 
> > Sure.  I'll build on top.
> 
> 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
diff mbox

Patch

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 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 +644,12 @@  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 name nor the flags)
+ * - 'M' For a 6-byte MAC address, it prints the address in the
+ *       usual colon-separated hex notation
+ * - '4' For a 4-byte IPv4 address, it prints the address in the
+ *       usual colon-separated hex notation
+ * - 'M' For a 16-byte IPv6 address, it prints the address in colon separated
+ *       big-endian 16 bit hex notation
  *
  * Note: The difference between 'S' and 'F' is that on ia64 and ppc64
  * function pointers are really function descriptors, which contain a
@@ -607,6 +665,12 @@  static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field
 		return symbol_string(buf, end, ptr, field_width, precision, flags);
 	case 'R':
 		return resource_string(buf, end, ptr, field_width, precision, flags);
+	case 'M':
+		return mac_address(buf, end, ptr, field_width, precision, flags);
+	case '4':
+		return ip4_address(buf, end, ptr, field_width, precision, flags);
+	case '6':
+		return ip6_address(buf, end, ptr, field_width, precision, flags);
 	}
 	flags |= SMALL;
 	if (field_width == -1) {