diff options
| -rw-r--r-- | 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 eee5ac96e177..8aaf9003fe6e 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) | |||
| 299 | static void xs_format_common_peer_addresses(struct rpc_xprt *xprt) | 299 | static void xs_format_common_peer_addresses(struct rpc_xprt *xprt) |
| 300 | { | 300 | { |
| 301 | struct sockaddr *sap = xs_addr(xprt); | 301 | struct sockaddr *sap = xs_addr(xprt); |
| 302 | struct sockaddr_in6 *sin6; | ||
| 303 | struct sockaddr_in *sin; | ||
| 302 | char buf[128]; | 304 | char buf[128]; |
| 303 | 305 | ||
| 304 | (void)rpc_ntop(sap, buf, sizeof(buf)); | 306 | (void)rpc_ntop(sap, buf, sizeof(buf)); |
| 305 | xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL); | 307 | xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL); |
| 306 | 308 | ||
| 309 | switch (sap->sa_family) { | ||
| 310 | case AF_INET: | ||
| 311 | sin = xs_addr_in(xprt); | ||
| 312 | (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x", | ||
| 313 | NIPQUAD(sin->sin_addr.s_addr)); | ||
| 314 | break; | ||
| 315 | case AF_INET6: | ||
| 316 | sin6 = xs_addr_in6(xprt); | ||
| 317 | (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr); | ||
| 318 | break; | ||
| 319 | default: | ||
| 320 | BUG(); | ||
| 321 | } | ||
| 322 | xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL); | ||
| 323 | } | ||
| 324 | |||
| 325 | static void xs_format_common_peer_ports(struct rpc_xprt *xprt) | ||
| 326 | { | ||
| 327 | struct sockaddr *sap = xs_addr(xprt); | ||
| 328 | char buf[128]; | ||
| 329 | |||
| 307 | (void)snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap)); | 330 | (void)snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap)); |
| 308 | xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL); | 331 | xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL); |
| 309 | 332 | ||
| @@ -311,37 +334,22 @@ static void xs_format_common_peer_addresses(struct rpc_xprt *xprt) | |||
| 311 | xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL); | 334 | xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL); |
| 312 | } | 335 | } |
| 313 | 336 | ||
| 314 | static void xs_format_ipv4_peer_addresses(struct rpc_xprt *xprt, | 337 | static void xs_format_peer_addresses(struct rpc_xprt *xprt, |
| 315 | const char *protocol, | 338 | const char *protocol, |
| 316 | const char *netid) | 339 | const char *netid) |
| 317 | { | 340 | { |
| 318 | struct sockaddr_in *sin = xs_addr_in(xprt); | ||
| 319 | char buf[16]; | ||
| 320 | |||
| 321 | xprt->address_strings[RPC_DISPLAY_PROTO] = protocol; | 341 | xprt->address_strings[RPC_DISPLAY_PROTO] = protocol; |
| 322 | xprt->address_strings[RPC_DISPLAY_NETID] = netid; | 342 | xprt->address_strings[RPC_DISPLAY_NETID] = netid; |
| 323 | |||
| 324 | (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x", | ||
| 325 | NIPQUAD(sin->sin_addr.s_addr)); | ||
| 326 | xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL); | ||
| 327 | |||
| 328 | xs_format_common_peer_addresses(xprt); | 343 | xs_format_common_peer_addresses(xprt); |
| 344 | xs_format_common_peer_ports(xprt); | ||
| 329 | } | 345 | } |
| 330 | 346 | ||
| 331 | static void xs_format_ipv6_peer_addresses(struct rpc_xprt *xprt, | 347 | static void xs_update_peer_port(struct rpc_xprt *xprt) |
| 332 | const char *protocol, | ||
| 333 | const char *netid) | ||
| 334 | { | 348 | { |
| 335 | struct sockaddr_in6 *sin6 = xs_addr_in6(xprt); | 349 | kfree(xprt->address_strings[RPC_DISPLAY_HEX_PORT]); |
| 336 | char buf[48]; | 350 | kfree(xprt->address_strings[RPC_DISPLAY_PORT]); |
| 337 | 351 | ||
| 338 | xprt->address_strings[RPC_DISPLAY_PROTO] = protocol; | 352 | xs_format_common_peer_ports(xprt); |
| 339 | xprt->address_strings[RPC_DISPLAY_NETID] = netid; | ||
| 340 | |||
| 341 | (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr); | ||
| 342 | xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL); | ||
| 343 | |||
| 344 | xs_format_common_peer_addresses(xprt); | ||
| 345 | } | 353 | } |
| 346 | 354 | ||
| 347 | static void xs_free_peer_addresses(struct rpc_xprt *xprt) | 355 | static void xs_free_peer_addresses(struct rpc_xprt *xprt) |
| @@ -1522,20 +1530,10 @@ static unsigned short xs_get_random_port(void) | |||
| 1522 | */ | 1530 | */ |
| 1523 | static void xs_set_port(struct rpc_xprt *xprt, unsigned short port) | 1531 | static void xs_set_port(struct rpc_xprt *xprt, unsigned short port) |
| 1524 | { | 1532 | { |
| 1525 | struct sockaddr *addr = xs_addr(xprt); | ||
| 1526 | |||
| 1527 | dprintk("RPC: setting port for xprt %p to %u\n", xprt, port); | 1533 | dprintk("RPC: setting port for xprt %p to %u\n", xprt, port); |
| 1528 | 1534 | ||
| 1529 | switch (addr->sa_family) { | 1535 | rpc_set_port(xs_addr(xprt), port); |
| 1530 | case AF_INET: | 1536 | xs_update_peer_port(xprt); |
| 1531 | ((struct sockaddr_in *)addr)->sin_port = htons(port); | ||
| 1532 | break; | ||
| 1533 | case AF_INET6: | ||
| 1534 | ((struct sockaddr_in6 *)addr)->sin6_port = htons(port); | ||
| 1535 | break; | ||
| 1536 | default: | ||
| 1537 | BUG(); | ||
| 1538 | } | ||
| 1539 | } | 1537 | } |
| 1540 | 1538 | ||
| 1541 | static unsigned short xs_get_srcport(struct sock_xprt *transport, struct socket *sock) | 1539 | 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) | |||
| 2216 | 2214 | ||
| 2217 | INIT_DELAYED_WORK(&transport->connect_worker, | 2215 | INIT_DELAYED_WORK(&transport->connect_worker, |
| 2218 | xs_udp_connect_worker4); | 2216 | xs_udp_connect_worker4); |
| 2219 | xs_format_ipv4_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP); | 2217 | xs_format_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP); |
| 2220 | break; | 2218 | break; |
| 2221 | case AF_INET6: | 2219 | case AF_INET6: |
| 2222 | if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) | 2220 | if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) |
| @@ -2224,7 +2222,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args) | |||
| 2224 | 2222 | ||
| 2225 | INIT_DELAYED_WORK(&transport->connect_worker, | 2223 | INIT_DELAYED_WORK(&transport->connect_worker, |
| 2226 | xs_udp_connect_worker6); | 2224 | xs_udp_connect_worker6); |
| 2227 | xs_format_ipv6_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP6); | 2225 | xs_format_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP6); |
| 2228 | break; | 2226 | break; |
| 2229 | default: | 2227 | default: |
| 2230 | kfree(xprt); | 2228 | kfree(xprt); |
| @@ -2288,15 +2286,17 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) | |||
| 2288 | if (((struct sockaddr_in *)addr)->sin_port != htons(0)) | 2286 | if (((struct sockaddr_in *)addr)->sin_port != htons(0)) |
| 2289 | xprt_set_bound(xprt); | 2287 | xprt_set_bound(xprt); |
| 2290 | 2288 | ||
| 2291 | INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_connect_worker4); | 2289 | INIT_DELAYED_WORK(&transport->connect_worker, |
| 2292 | xs_format_ipv4_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP); | 2290 | xs_tcp_connect_worker4); |
| 2291 | xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP); | ||
| 2293 | break; | 2292 | break; |
| 2294 | case AF_INET6: | 2293 | case AF_INET6: |
| 2295 | if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) | 2294 | if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) |
| 2296 | xprt_set_bound(xprt); | 2295 | xprt_set_bound(xprt); |
| 2297 | 2296 | ||
| 2298 | INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_connect_worker6); | 2297 | INIT_DELAYED_WORK(&transport->connect_worker, |
| 2299 | xs_format_ipv6_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6); | 2298 | xs_tcp_connect_worker6); |
| 2299 | xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6); | ||
| 2300 | break; | 2300 | break; |
| 2301 | default: | 2301 | default: |
| 2302 | kfree(xprt); | 2302 | kfree(xprt); |
