Complete the transport dependent functions used to print the addresses:
add a raw mode (print only the value without any comment) and add a
new display for universal addresses.

Use rpc_print_peeraddr() to display the address information in NFS.

Signed-off-by: Gilles Quillard <Gilles.Quillard@bull.net>
Signed-off-by: Aurelien Charbon <Aurelien.Charbon@ext.bull.net>

---

 fs/lockd/svclock.c          |    2 
 fs/nfs/callback.c           |    8 +-
 fs/nfs/callback_proc.c      |    8 ++
 fs/nfs/delegation.c         |    8 +-
 fs/nfs/nfs4proc.c           |    8 +-
 fs/nfs/nfs4state.c          |   13 +--
 include/linux/sunrpc/clnt.h |   10 ++
 net/sunrpc/rpc_pipe.c       |    2 
 net/sunrpc/xprtsock.c       |  170 +++++++++++++++++++++++++++++++++++---------
 9 files changed, 179 insertions(+), 50 deletions(-)

---

diff -Nru linux-2.6.11-03/fs/lockd/svclock.c linux-2.6.11-04/fs/lockd/svclock.c
--- linux-2.6.11-03/fs/lockd/svclock.c	2005-03-14 14:51:31.000000000 +0100
+++ linux-2.6.11-04/fs/lockd/svclock.c	2005-03-18 15:01:03.000000000 +0100
@@ -585,7 +585,7 @@
 	char buf[255];
 
 	rpc_peeraddr(task->tk_client, &addr, sizeof(addr));
-	rpc_print_peeraddr(task->tk_client, buf, sizeof(buf), 0x1);
+	rpc_print_peeraddr(task->tk_client, buf, sizeof(buf), ADDR_FMT);
 
 	dprintk("lockd: GRANT_MSG RPC callback\n");
 	dprintk("callback: looking for cookie %s, host (%s)\n",
diff -Nru linux-2.6.11-03/fs/nfs/callback.c linux-2.6.11-04/fs/nfs/callback.c
--- linux-2.6.11-03/fs/nfs/callback.c	2005-03-18 15:01:02.000000000 +0100
+++ linux-2.6.11-04/fs/nfs/callback.c	2005-03-18 15:01:03.000000000 +0100
@@ -64,8 +64,6 @@
 					__FUNCTION__, -err);
 			break;
 		}
-		dprintk("%s: request from %u.%u.%u.%u\n", __FUNCTION__,
-				NIPQUAD(rqstp->rq_addr.sin_addr.s_addr));
 		svc_process(serv, rqstp);
 	}
 
@@ -144,13 +142,15 @@
 {
 	struct sockaddr_in *addr = &rqstp->rq_addr;
 	struct nfs4_client *clp;
+	char addr_buf[RPC_BUF_ADDR_MAX_SIZE];
 
 	/* Don't talk to strangers */
 	clp = nfs4_find_client((struct sockaddr *)addr);
 	if (clp == NULL)
 		return SVC_DROP;
-	dprintk("%s: %u.%u.%u.%u NFSv4 callback!\n", __FUNCTION__,
-		NIPQUAD(addr->sin_addr));
+	rpc_print_peeraddr(clp->cl_rpcclient, addr_buf, sizeof(addr_buf),
+			   ADDR_FMT);
+	dprintk("%s: %s NFSv4 callback!\n", __FUNCTION__, addr_buf);
 	nfs4_put_client(clp);
 	switch (rqstp->rq_authop->flavour) {
 		case RPC_AUTH_NULL:
diff -Nru linux-2.6.11-03/fs/nfs/callback_proc.c linux-2.6.11-04/fs/nfs/callback_proc.c
--- linux-2.6.11-03/fs/nfs/callback_proc.c	2005-03-18 15:01:02.000000000 +0100
+++ linux-2.6.11-04/fs/nfs/callback_proc.c	2005-03-18 15:01:03.000000000 +0100
@@ -20,12 +20,16 @@
 	struct nfs_delegation *delegation;
 	struct nfs_inode *nfsi;
 	struct inode *inode;
+	char addr_buf[255];
 	
 	res->bitmap[0] = res->bitmap[1] = 0;
 	res->status = htonl(NFS4ERR_BADHANDLE);
 	clp = nfs4_find_client((struct sockaddr *)args->addr);
 	if (clp == NULL)
 		goto out;
+	rpc_print_peeraddr(clp->cl_rpcclient, addr_buf, sizeof(addr_buf),
+			   ADDR_FMT);
+	dprintk("%s: request from %s\n", __FUNCTION__, addr_buf);
 	inode = nfs_delegation_find_inode(clp, &args->fh);
 	if (inode == NULL)
 		goto out_putclient;
@@ -57,12 +61,16 @@
 {
 	struct nfs4_client *clp;
 	struct inode *inode;
+	char addr_buf[RPC_BUF_ADDR_MAX_SIZE];
 	unsigned res;
 	
 	res = htonl(NFS4ERR_BADHANDLE);
 	clp = nfs4_find_client((struct sockaddr *)&args->addr);
 	if (clp == NULL)
 		goto out;
+	rpc_print_peeraddr(clp->cl_rpcclient, addr_buf, sizeof(addr_buf),
+			   ADDR_FMT);
+	dprintk("%s: request from %s\n", __FUNCTION__, addr_buf);
 	inode = nfs_delegation_find_inode(clp, &args->fh);
 	if (inode == NULL)
 		goto out_putclient;
diff -Nru linux-2.6.11-03/fs/nfs/delegation.c linux-2.6.11-04/fs/nfs/delegation.c
--- linux-2.6.11-03/fs/nfs/delegation.c	2005-03-18 15:01:02.000000000 +0100
+++ linux-2.6.11-04/fs/nfs/delegation.c	2005-03-18 15:01:03.000000000 +0100
@@ -83,6 +83,7 @@
 	struct nfs4_client *clp = NFS_SERVER(inode)->nfs4_state;
 	struct nfs_inode *nfsi = NFS_I(inode);
 	struct nfs_delegation *delegation;
+	char addr_buf[RPC_BUF_ADDR_MAX_SIZE];
 	int status = 0;
 
 	delegation = nfs_alloc_delegation();
@@ -105,9 +106,10 @@
 		if (memcmp(&delegation->stateid, &nfsi->delegation->stateid,
 					sizeof(delegation->stateid)) != 0 ||
 				delegation->type != nfsi->delegation->type) {
-			printk("%s: server %u.%u.%u.%u, handed out a duplicate delegation!\n",
-					__FUNCTION__,
-					NIPQUAD(((struct sockaddr_in *)clp->cl_addr)->sin_addr));
+			rpc_print_peeraddr(clp->cl_rpcclient, addr_buf,
+					   sizeof(addr_buf), ADDR_FMT);
+			printk("%s: server %s, handed out a duplicate delegation!\n",
+					__FUNCTION__, addr_buf);
 			status = -EIO;
 		}
 	}
diff -Nru linux-2.6.11-03/fs/nfs/nfs4proc.c linux-2.6.11-04/fs/nfs/nfs4proc.c
--- linux-2.6.11-03/fs/nfs/nfs4proc.c	2005-03-18 15:01:02.000000000 +0100
+++ linux-2.6.11-04/fs/nfs/nfs4proc.c	2005-03-18 15:01:03.000000000 +0100
@@ -2493,6 +2493,7 @@
 		.rpc_cred = clp->cl_cred,
 	};
 	u32 *p;
+	char addr_buf[RPC_BUF_ADDR_MAX_SIZE];
 	int loop = 0;
 	int status;
 
@@ -2501,10 +2502,11 @@
 	*p = htonl((u32)clp->cl_boot_time.tv_nsec);
 
 	for(;;) {
+		rpc_print_peeraddr(clp->cl_rpcclient, addr_buf,
+				   sizeof(addr_buf), ADDR_FMT|RAW_FMT);
 		setclientid.sc_name_len = scnprintf(setclientid.sc_name,
-				sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u",
-				clp->cl_ipaddr,
-				NIPQUAD(((struct sockaddr_in *)clp->cl_addr)->sin_addr),
+				sizeof(setclientid.sc_name), "%s/%s %s %u",
+				clp->cl_ipaddr, addr_buf,
 				clp->cl_cred->cr_ops->cr_name,
 				clp->cl_id_uniquifier);
 		setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
diff -Nru linux-2.6.11-03/fs/nfs/nfs4state.c linux-2.6.11-04/fs/nfs/nfs4state.c
--- linux-2.6.11-03/fs/nfs/nfs4state.c	2005-03-18 15:01:02.000000000 +0100
+++ linux-2.6.11-04/fs/nfs/nfs4state.c	2005-03-18 15:01:03.000000000 +0100
@@ -111,7 +111,7 @@
 		nfs_callback_down();
 		return NULL;
 	}
-	memcpy(&clp->cl_addr, addr, clp->cl_addrlen);
+	memcpy(clp->cl_addr, addr, clp->cl_addrlen);
 	init_rwsem(&clp->cl_sem);
 	INIT_LIST_HEAD(&clp->cl_delegations);
 	INIT_LIST_HEAD(&clp->cl_state_owners);
@@ -866,10 +866,12 @@
 	struct nfs4_client *clp = args->clp;
 	struct nfs4_state_owner *sp;
 	struct nfs4_state_recovery_ops *ops;
+	char addr_buf[RPC_BUF_ADDR_MAX_SIZE];
 	int status = 0;
 
-	daemonize("%u.%u.%u.%u-reclaim",
-		  NIPQUAD(((struct sockaddr_in *)clp->cl_addr)->sin_addr));
+	rpc_print_peeraddr(clp->cl_rpcclient, addr_buf, sizeof(addr_buf),
+			   ADDR_FMT);
+	daemonize("%s-reclaim", addr_buf);
 	allow_signal(SIGKILL);
 
 	atomic_inc(&clp->cl_count);
@@ -925,9 +927,8 @@
 	nfs4_put_client(clp);
 	return 0;
 out_error:
-	printk(KERN_WARNING "Error: state recovery failed on NFSv4 server %u.%u.%u.%u with error %d\n",
-			NIPQUAD(((struct sockaddr_in *)clp->cl_addr)->sin_addr),
-			-status);
+	printk(KERN_WARNING "Error: state recovery failed on NFSv4 server %s with error %d\n",
+			addr_buf, -status);
 	goto out;
 }
 
diff -Nru linux-2.6.11-03/include/linux/sunrpc/clnt.h linux-2.6.11-04/include/linux/sunrpc/clnt.h
--- linux-2.6.11-03/include/linux/sunrpc/clnt.h	2005-03-14 14:51:31.000000000 +0100
+++ linux-2.6.11-04/include/linux/sunrpc/clnt.h	2005-03-18 15:01:03.000000000 +0100
@@ -133,6 +133,16 @@
 void		rpc_client_set_xprt(struct rpc_clnt *, struct rpc_xprt *);
 void		rpc_put_xprt(struct rpc_xprt *xprt);
 
+/*
+ * Values used by rpc_print_peeraddr().
+ */
+#define RPC_BUF_ADDR_MAX_SIZE	255
+#define ADDR_FMT		0x1
+#define PORT_FMT		0x2
+#define PROTO_FMT		0x4
+#define UADDR_FMT		0x8
+#define RAW_FMT			0x80
+
 static __inline__
 int rpc_call(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags)
 {
diff -Nru linux-2.6.11-03/net/sunrpc/rpc_pipe.c linux-2.6.11-04/net/sunrpc/rpc_pipe.c
--- linux-2.6.11-03/net/sunrpc/rpc_pipe.c	2005-03-14 14:51:31.000000000 +0100
+++ linux-2.6.11-04/net/sunrpc/rpc_pipe.c	2005-03-18 15:01:03.000000000 +0100
@@ -297,7 +297,7 @@
 	seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_protname,
 			clnt->cl_prog, clnt->cl_vers);
 
- 	rpc_print_peeraddr(clnt, buf, sizeof(buf), 0x5);
+ 	rpc_print_peeraddr(clnt, buf, sizeof(buf), ADDR_FMT|PROTO_FMT);
  	seq_printf(m, "%s\n", buf);
  
 	return 0;
diff -Nru linux-2.6.11-03/net/sunrpc/xprtsock.c linux-2.6.11-04/net/sunrpc/xprtsock.c
--- linux-2.6.11-03/net/sunrpc/xprtsock.c	2005-03-18 15:01:01.000000000 +0100
+++ linux-2.6.11-04/net/sunrpc/xprtsock.c	2005-03-18 15:13:10.000000000 +0100
@@ -1133,14 +1133,40 @@
 {
 	struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr;
 
-	if (flags & 0x1)
-		buffer += snprintf(buffer, size, "ip=\"%u.%u.%u.%u\"",
-					NIPQUAD(addr->sin_addr.s_addr));
-	if (flags & 0x2)
-		buffer += snprintf(buffer, size, " port=\"%u\"",
-					ntohs(addr->sin_port));
-	if (flags & 0x4)
-		buffer += snprintf(buffer, size, " proto=\"udp\"");
+	if (flags & ADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u.%u.%u.%u",
+						NIPQUAD(addr->sin_addr.s_addr));
+		else
+			buffer += snprintf(buffer, size, "ip=\"%u.%u.%u.%u\"",
+						NIPQUAD(addr->sin_addr.s_addr));
+	}
+	if (flags & PORT_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u",
+						ntohs(addr->sin_port));
+		else
+			buffer += snprintf(buffer, size, " port=\"%u\"",
+						ntohs(addr->sin_port));
+	}
+	if (flags & PROTO_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "udp");
+		else
+			buffer += snprintf(buffer, size, " proto=\"udp\"");
+	}
+	if (flags & UADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u.%u.%u.%u.%u.%u",
+					   NIPQUAD(addr->sin_addr.s_addr),
+					   ntohs(addr->sin_port) >> 8,
+					   ntohs(addr->sin_port) & 0xff);
+		else
+			buffer += snprintf(buffer, size, "uaddr=\"%u.%u.%u.%u.%u.%u\"",
+					   NIPQUAD(addr->sin_addr.s_addr),
+					   ntohs(addr->sin_port) >> 8,
+					   ntohs(addr->sin_port) & 0xff);
+	}
 }
 
 /**
@@ -1152,14 +1178,40 @@
 {
 	struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr;
 
-	if (flags & 0x1)
-		buffer += snprintf(buffer, size, "ip=\"%u.%u.%u.%u\"",
-					NIPQUAD(addr->sin_addr.s_addr));
-	if (flags & 0x2)
-		buffer += snprintf(buffer, size, " port=\"%u\"",
-					ntohs(addr->sin_port));
-	if (flags & 0x4)
-		buffer += snprintf(buffer, size, " proto=\"tcp\"");
+	if (flags & ADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u.%u.%u.%u",
+					   NIPQUAD(addr->sin_addr.s_addr));
+		else
+			buffer += snprintf(buffer, size, "ip=\"%u.%u.%u.%u\"",
+					   NIPQUAD(addr->sin_addr.s_addr));
+	}
+	if (flags & PORT_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u",
+					   ntohs(addr->sin_port));
+		else
+			buffer += snprintf(buffer, size, " port=\"%u\"",
+					   ntohs(addr->sin_port));
+	}
+	if (flags & PROTO_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "tcp");
+		else
+			buffer += snprintf(buffer, size, " proto=\"tcp\"");
+	}
+	if (flags & UADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u.%u.%u.%u.%u.%u",
+					  NIPQUAD(addr->sin_addr.s_addr),
+					  ntohs(addr->sin_port) >> 8,
+					  ntohs(addr->sin_port) & 0xff);
+		else
+			buffer += snprintf(buffer, size, "uaddr=\"%u.%u.%u.%u.%u.%u\"",
+					  NIPQUAD(addr->sin_addr.s_addr),
+					  ntohs(addr->sin_port) >> 8,
+					  ntohs(addr->sin_port) & 0xff);
+	}
 }
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
@@ -1172,14 +1224,41 @@
 {
 	struct sockaddr_in6 *addr = (struct sockaddr_in6 *) &xprt->addr;
 
-	if (flags & 0x1)
-		buffer += snprintf(buffer, size, "ip=\"%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\"",
-					NIP6(addr->sin6_addr));
-	if (flags & 0x2)
-		buffer += snprintf(buffer, size, " port=\"%u\"",
-					ntohs(addr->sin6_port));
-	if (flags & 0x4)
-		buffer += snprintf(buffer, size, " proto=\"udp\"");
+	if (flags & ADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%x:%x:%x:%x:%x:%x:%x:%x",
+					   NIP6(addr->sin6_addr));
+		else
+			buffer += snprintf(buffer, size, "ip=\"%x:%x:%x:%x:%x:%x:%x:%x\"",
+					   NIP6(addr->sin6_addr));
+	}
+	if (flags & PORT_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u",
+					   ntohs(addr->sin6_port));
+		else
+			buffer += snprintf(buffer, size, " port=\"%u\"",
+					   ntohs(addr->sin6_port));
+	}
+	if (flags & PROTO_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "udp");
+		else
+			buffer += snprintf(buffer, size, " proto=\"udp\"");
+	}
+	if (flags & UADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%x:%x:%x:%x:%x:%x:%x:%x.%u.%u",
+					   NIP6(addr->sin6_addr),
+					   ntohs(addr->sin6_port) >> 8,
+					   ntohs(addr->sin6_port) & 0xff);
+		else
+			buffer += snprintf(buffer, size,
+					   "uaddr=\"%x:%x:%x:%x:%x:%x:%x:%x.%u.%u\"",
+					   NIP6(addr->sin6_addr),
+					   ntohs(addr->sin6_port) >> 8,
+					   ntohs(addr->sin6_port) & 0xff);
+	}
 }
 
 /**
@@ -1191,14 +1270,41 @@
 {
 	struct sockaddr_in6 *addr = (struct sockaddr_in6 *) &xprt->addr;
 
-	if (flags & 0x1)
-		buffer += snprintf(buffer, size, "ip=\"%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\"",
-					NIP6(addr->sin6_addr));
-	if (flags & 0x2)
-		buffer += snprintf(buffer, size, " port=\"%u\"",
-					ntohs(addr->sin6_port));
-	if (flags & 0x4)
-		buffer += snprintf(buffer, size, " proto=\"tcp\"");
+	if (flags & ADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%x:%x:%x:%x:%x:%x:%x:%x",
+					   NIP6(addr->sin6_addr));
+		else
+			buffer += snprintf(buffer, size, "ip=\"%x:%x:%x:%x:%x:%x:%x:%x\"",
+					   NIP6(addr->sin6_addr));
+	}
+	if (flags & PORT_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%u",
+					   ntohs(addr->sin6_port));
+		else
+			buffer += snprintf(buffer, size, " port=\"%u\"",
+					   ntohs(addr->sin6_port));
+	}
+	if (flags & PROTO_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "tcp");
+		else
+			buffer += snprintf(buffer, size, " proto=\"tcp\"");
+	}
+	if (flags & UADDR_FMT) {
+		if (flags & RAW_FMT)
+			buffer += snprintf(buffer, size, "%x:%x:%x:%x:%x:%x:%x:%x.%u.%u",
+					   NIP6(addr->sin6_addr),
+					   ntohs(addr->sin6_port) >> 8,
+					   ntohs(addr->sin6_port) & 0xff);
+		else
+			buffer += snprintf(buffer, size,
+					   "uaddr=\"%x:%x:%x:%x:%x:%x:%x:%x.%u.%u\"",
+					   NIP6(addr->sin6_addr),
+					   ntohs(addr->sin6_port) >> 8,
+					   ntohs(addr->sin6_port) & 0xff);
+	}
 }
 #endif
 
