SUNRPC: Use short-hand IPv6 ANYADDR for RPCB_SET
authorChuck Lever <chuck.lever@oracle.com>
Mon, 15 Sep 2008 21:27:30 +0000 (16:27 -0500)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Mon, 29 Sep 2008 22:13:40 +0000 (18:13 -0400)
Clean up: When doing an RPCB_SET, make the kernel's rpcb client use the
shorthand "::" for the universal form of the IPv6 ANY address.

Without this patch, rpcbind will advertise:

  0000:0000:0000:0000:0000:0000:0000:0000.x.y

This is cosmetic only.  It cleans up the display of information from
/sbin/rpcinfo.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
net/sunrpc/rpcb_clnt.c

index cc7250d4659b4fe0dde4d40fa26ef6bd0917fa31..0fa1086cf9911d198f57b584cc62bca4a842e0d7 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/in6.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <net/ipv6.h>
 
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/sched.h>
@@ -304,10 +305,13 @@ static int rpcb_register_netid6(struct sockaddr_in6 *address_to_register,
        char buf[64];
 
        /* Construct AF_INET6 universal address */
-       snprintf(buf, sizeof(buf),
-                       NIP6_FMT".%u.%u",
-                       NIP6(address_to_register->sin6_addr),
-                       port >> 8, port & 0xff);
+       if (ipv6_addr_any(&address_to_register->sin6_addr))
+               snprintf(buf, sizeof(buf), "::.%u.%u",
+                               port >> 8, port & 0xff);
+       else
+               snprintf(buf, sizeof(buf), NIP6_FMT".%u.%u",
+                               NIP6(address_to_register->sin6_addr),
+                               port >> 8, port & 0xff);
        map->r_addr = buf;
 
        dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "