2009-08-06 18:55:40

by Chuck Lever III

[permalink] [raw]
Subject: [PATCH 09/10] SUNRPC: Update xprt address strings after an rpcbind completes

After a bind completes, update the transport instance's address
strings so debugging messages display the current port the transport
is connected to.

Signed-off-by: Chuck Lever <[email protected]>
---

net/sunrpc/xprtsock.c | 82 +++++++++++++++++++++++++------------------------
1 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index eee5ac9..8aaf900 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -299,11 +299,34 @@ static inline struct sockaddr_in6 *xs_addr_in6(struct rpc_xprt *xprt)
static void xs_format_common_peer_addresses(struct rpc_xprt *xprt)
{
struct sockaddr *sap = xs_addr(xprt);
+ struct sockaddr_in6 *sin6;
+ struct sockaddr_in *sin;
char buf[128];

(void)rpc_ntop(sap, buf, sizeof(buf));
xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL);

+ switch (sap->sa_family) {
+ case AF_INET:
+ sin = xs_addr_in(xprt);
+ (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x",
+ NIPQUAD(sin->sin_addr.s_addr));
+ break;
+ case AF_INET6:
+ sin6 = xs_addr_in6(xprt);
+ (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr);
+ break;
+ default:
+ BUG();
+ }
+ xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL);
+}
+
+static void xs_format_common_peer_ports(struct rpc_xprt *xprt)
+{
+ struct sockaddr *sap = xs_addr(xprt);
+ char buf[128];
+
(void)snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap));
xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL);

@@ -311,37 +334,22 @@ static void xs_format_common_peer_addresses(struct rpc_xprt *xprt)
xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL);
}

-static void xs_format_ipv4_peer_addresses(struct rpc_xprt *xprt,
- const char *protocol,
- const char *netid)
+static void xs_format_peer_addresses(struct rpc_xprt *xprt,
+ const char *protocol,
+ const char *netid)
{
- struct sockaddr_in *sin = xs_addr_in(xprt);
- char buf[16];
-
xprt->address_strings[RPC_DISPLAY_PROTO] = protocol;
xprt->address_strings[RPC_DISPLAY_NETID] = netid;
-
- (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x",
- NIPQUAD(sin->sin_addr.s_addr));
- xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL);
-
xs_format_common_peer_addresses(xprt);
+ xs_format_common_peer_ports(xprt);
}

-static void xs_format_ipv6_peer_addresses(struct rpc_xprt *xprt,
- const char *protocol,
- const char *netid)
+static void xs_update_peer_port(struct rpc_xprt *xprt)
{
- struct sockaddr_in6 *sin6 = xs_addr_in6(xprt);
- char buf[48];
+ kfree(xprt->address_strings[RPC_DISPLAY_HEX_PORT]);
+ kfree(xprt->address_strings[RPC_DISPLAY_PORT]);

- xprt->address_strings[RPC_DISPLAY_PROTO] = protocol;
- xprt->address_strings[RPC_DISPLAY_NETID] = netid;
-
- (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr);
- xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL);
-
- xs_format_common_peer_addresses(xprt);
+ xs_format_common_peer_ports(xprt);
}

static void xs_free_peer_addresses(struct rpc_xprt *xprt)
@@ -1522,20 +1530,10 @@ static unsigned short xs_get_random_port(void)
*/
static void xs_set_port(struct rpc_xprt *xprt, unsigned short port)
{
- struct sockaddr *addr = xs_addr(xprt);
-
dprintk("RPC: setting port for xprt %p to %u\n", xprt, port);

- switch (addr->sa_family) {
- case AF_INET:
- ((struct sockaddr_in *)addr)->sin_port = htons(port);
- break;
- case AF_INET6:
- ((struct sockaddr_in6 *)addr)->sin6_port = htons(port);
- break;
- default:
- BUG();
- }
+ rpc_set_port(xs_addr(xprt), port);
+ xs_update_peer_port(xprt);
}

static unsigned short xs_get_srcport(struct sock_xprt *transport, struct socket *sock)
@@ -2216,7 +2214,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)

INIT_DELAYED_WORK(&transport->connect_worker,
xs_udp_connect_worker4);
- xs_format_ipv4_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP);
+ xs_format_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP);
break;
case AF_INET6:
if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0))
@@ -2224,7 +2222,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)

INIT_DELAYED_WORK(&transport->connect_worker,
xs_udp_connect_worker6);
- xs_format_ipv6_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP6);
+ xs_format_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP6);
break;
default:
kfree(xprt);
@@ -2288,15 +2286,17 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
if (((struct sockaddr_in *)addr)->sin_port != htons(0))
xprt_set_bound(xprt);

- INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_connect_worker4);
- xs_format_ipv4_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP);
+ INIT_DELAYED_WORK(&transport->connect_worker,
+ xs_tcp_connect_worker4);
+ xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP);
break;
case AF_INET6:
if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0))
xprt_set_bound(xprt);

- INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_connect_worker6);
- xs_format_ipv6_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6);
+ INIT_DELAYED_WORK(&transport->connect_worker,
+ xs_tcp_connect_worker6);
+ xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6);
break;
default:
kfree(xprt);



2009-08-06 21:19:34

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH 09/10] SUNRPC: Update xprt address strings after an rpcbind completes

On Thu, 2009-08-06 at 14:55 -0400, Chuck Lever wrote:
> After a bind completes, update the transport instance's address
> strings so debugging messages display the current port the transport
> is connected to.
>
> Signed-off-by: Chuck Lever <[email protected]>
> ---
>
> net/sunrpc/xprtsock.c | 82 +++++++++++++++++++++++++------------------------
> 1 files changed, 41 insertions(+), 41 deletions(-)
>
> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> index eee5ac9..8aaf900 100644
> --- a/net/sunrpc/xprtsock.c
> +++ b/net/sunrpc/xprtsock.c
> @@ -299,11 +299,34 @@ static inline struct sockaddr_in6 *xs_addr_in6(struct rpc_xprt *xprt)
> static void xs_format_common_peer_addresses(struct rpc_xprt *xprt)
> {
> struct sockaddr *sap = xs_addr(xprt);
> + struct sockaddr_in6 *sin6;
> + struct sockaddr_in *sin;
> char buf[128];
>
> (void)rpc_ntop(sap, buf, sizeof(buf));
> xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL);
>
> + switch (sap->sa_family) {
> + case AF_INET:
> + sin = xs_addr_in(xprt);
> + (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x",
> + NIPQUAD(sin->sin_addr.s_addr));
> + break;
> + case AF_INET6:
> + sin6 = xs_addr_in6(xprt);
> + (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr);
> + break;

Hmm... Doesn't it make sense to convert this to use rpc_ntop() now that
I've applied those patches?

Trond


2009-08-06 21:32:19

by Chuck Lever III

[permalink] [raw]
Subject: Re: [PATCH 09/10] SUNRPC: Update xprt address strings after an rpcbind completes

On Aug 6, 2009, at 5:19 PM, Trond Myklebust wrote:
> On Thu, 2009-08-06 at 14:55 -0400, Chuck Lever wrote:
>> After a bind completes, update the transport instance's address
>> strings so debugging messages display the current port the transport
>> is connected to.
>>
>> Signed-off-by: Chuck Lever <[email protected]>
>> ---
>>
>> net/sunrpc/xprtsock.c | 82 ++++++++++++++++++++++++
>> +------------------------
>> 1 files changed, 41 insertions(+), 41 deletions(-)
>>
>> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
>> index eee5ac9..8aaf900 100644
>> --- a/net/sunrpc/xprtsock.c
>> +++ b/net/sunrpc/xprtsock.c
>> @@ -299,11 +299,34 @@ static inline struct sockaddr_in6
>> *xs_addr_in6(struct rpc_xprt *xprt)
>> static void xs_format_common_peer_addresses(struct rpc_xprt *xprt)
>> {
>> struct sockaddr *sap = xs_addr(xprt);
>> + struct sockaddr_in6 *sin6;
>> + struct sockaddr_in *sin;
>> char buf[128];
>>
>> (void)rpc_ntop(sap, buf, sizeof(buf));
>> xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL);
>>
>> + switch (sap->sa_family) {
>> + case AF_INET:
>> + sin = xs_addr_in(xprt);
>> + (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x",
>> + NIPQUAD(sin->sin_addr.s_addr));
>> + break;
>> + case AF_INET6:
>> + sin6 = xs_addr_in6(xprt);
>> + (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr);
>> + break;
>
> Hmm... Doesn't it make sense to convert this to use rpc_ntop() now
> that
> I've applied those patches?

I think %pi6, used here instead of %pI6, leaves out the colons, so
it's not the same result as rpc_ntop(). I also recall that %pi4
produces the same result as %pI4 (ie still has the dots), which is why
we use NIPQUAD above instead.

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com