Skip to content

Commit

Permalink
SUNRPC: Use "sockaddr_storage" for storing RPC client's remote peer a…
Browse files Browse the repository at this point in the history
…ddress

IPv6 addresses are big (128 bytes).  Now that no RPC client consumers treat
the addr field in rpc_xprt structs as an opaque, and access it only via the
API calls, we can safely widen the field in the rpc_xprt struct to
accomodate larger addresses.

Test plan:
Compile kernel with CONFIG_NFS enabled.

Signed-off-by: Chuck Lever <[email protected]>
Signed-off-by: Trond Myklebust <[email protected]>
chucklever authored and Trond Myklebust committed Sep 23, 2006
1 parent e7f7865 commit c4efcb1
Showing 4 changed files with 15 additions and 8 deletions.
3 changes: 2 additions & 1 deletion include/linux/sunrpc/xprt.h
Original file line number Diff line number Diff line change
@@ -134,7 +134,8 @@ struct rpc_xprt {
struct sock * inet; /* INET layer */

struct rpc_timeout timeout; /* timeout parms */
struct sockaddr_in addr; /* server address */
struct sockaddr_storage addr; /* server address */
size_t addrlen; /* size of server address */
int prot; /* IP protocol */

unsigned long cong; /* current congestion */
2 changes: 1 addition & 1 deletion net/sunrpc/clnt.c
Original file line number Diff line number Diff line change
@@ -550,7 +550,7 @@ size_t rpc_peeraddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t bufsize)
if (bytes > bufsize)
bytes = bufsize;
memcpy(buf, &clnt->cl_xprt->addr, bytes);
return sizeof(xprt->addr);
return xprt->addrlen;
}
EXPORT_SYMBOL(rpc_peeraddr);

3 changes: 2 additions & 1 deletion net/sunrpc/xprt.c
Original file line number Diff line number Diff line change
@@ -896,7 +896,8 @@ static struct rpc_xprt *xprt_setup(int proto, struct sockaddr_in *ap, struct rpc
if ((xprt = kzalloc(sizeof(struct rpc_xprt), GFP_KERNEL)) == NULL)
return ERR_PTR(-ENOMEM);

xprt->addr = *ap;
memcpy(&xprt->addr, ap, sizeof(*ap));
xprt->addrlen = sizeof(*ap);

switch (proto) {
case IPPROTO_UDP:
15 changes: 10 additions & 5 deletions net/sunrpc/xprtsock.c
Original file line number Diff line number Diff line change
@@ -341,7 +341,7 @@ static int xs_udp_send_request(struct rpc_task *task)

req->rq_xtime = jiffies;
status = xs_sendpages(xprt->sock, (struct sockaddr *) &xprt->addr,
sizeof(xprt->addr), xdr, req->rq_bytes_sent);
xprt->addrlen, xdr, req->rq_bytes_sent);

dprintk("RPC: xs_udp_send_request(%u) = %d\n",
xdr->len - req->rq_bytes_sent, status);
@@ -1027,8 +1027,11 @@ static char *xs_print_peer_address(struct rpc_xprt *xprt, enum rpc_display_forma
*/
static void xs_set_port(struct rpc_xprt *xprt, unsigned short port)
{
struct sockaddr_in *sap = (struct sockaddr_in *) &xprt->addr;

dprintk("RPC: setting port for xprt %p to %u\n", xprt, port);
xprt->addr.sin_port = htons(port);

sap->sin_port = htons(port);
}

static int xs_bindresvport(struct rpc_xprt *xprt, struct socket *sock)
@@ -1209,7 +1212,7 @@ static void xs_tcp_connect_worker(void *args)
xprt->stat.connect_count++;
xprt->stat.connect_start = jiffies;
status = sock->ops->connect(sock, (struct sockaddr *) &xprt->addr,
sizeof(xprt->addr), O_NONBLOCK);
xprt->addrlen, O_NONBLOCK);
dprintk("RPC: %p connect status %d connected %d sock state %d\n",
xprt, -status, xprt_connected(xprt), sock->sk->sk_state);
if (status < 0) {
@@ -1359,14 +1362,15 @@ static struct rpc_xprt_ops xs_tcp_ops = {
int xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to)
{
size_t slot_table_size;
struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr;

xprt->max_reqs = xprt_udp_slot_table_entries;
slot_table_size = xprt->max_reqs * sizeof(xprt->slot[0]);
xprt->slot = kzalloc(slot_table_size, GFP_KERNEL);
if (xprt->slot == NULL)
return -ENOMEM;

if (ntohs(xprt->addr.sin_port) != 0)
if (ntohs(addr->sin_port != 0))
xprt_set_bound(xprt);
xprt->port = xs_get_random_port();

@@ -1405,14 +1409,15 @@ int xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to)
int xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to)
{
size_t slot_table_size;
struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr;

xprt->max_reqs = xprt_tcp_slot_table_entries;
slot_table_size = xprt->max_reqs * sizeof(xprt->slot[0]);
xprt->slot = kzalloc(slot_table_size, GFP_KERNEL);
if (xprt->slot == NULL)
return -ENOMEM;

if (ntohs(xprt->addr.sin_port) != 0)
if (ntohs(addr->sin_port) != 0)
xprt_set_bound(xprt);
xprt->port = xs_get_random_port();

0 comments on commit c4efcb1

Please sign in to comment.