SUNRPC server: record the destination address of a request
Subsystems (3)
PATCH 1/3 SUNRPC server: record the destination address of a request
Save the destination address of an incoming request over TCP like is done already for UDP. It is necessary later for callbacks by the server.
Signed-off-by Frank van Maarseveen <[email protected]>
---
This patch is IPv6 clean.
include/linux/sunrpc/svcsock.h +1 -0
@@ -58,6 +58,7 @@ struct svc_sock {/* cache of various info for TCP sockets */ void *sk_info_authunix; +struct sockaddr_storage sk_local;/* local address */ struct sockaddr_storage sk_remote;/* remote peer's address */ int sk_remotelen;/* length of address */ };
net/sunrpc/svcsock.c +20 -0
@@ -643,6 +643,7 @@ svc_recvfrom(struct svc_rqst *rqstp, strstruct msghdr msg = { .msg_flags =MSG_DONTWAIT , }; +struct sockaddr *sin;int len; len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen,
@@ -653,6 +654,19 @@ svc_recvfrom(struct svc_rqst *rqstp, strmemcpy (&rqstp->rq_addr, &svsk->sk_remote, svsk->sk_remotelen); rqstp->rq_addrlen = svsk->sk_remotelen; +/* Destination address in request is needed for binding the +* source address in RPC callbacks later. +*/ + sin = (struct sockaddr *)&svsk->sk_local; +switch (sin->sa_family) { +case AF_INET : + rqstp->rq_daddr.addr = ((struct sockaddr_in *)sin)->sin_addr; +break ; +case AF_INET6 : + rqstp->rq_daddr.addr6 = ((struct sockaddr_in6 *)sin)->sin6_addr; +break ; + } +dprintk ("svc: socket %p recvfrom(%p, %Zu) = %d\n" , svsk, iov[0 ].iov_base, iov[0 ].iov_len, len);
@@ -1062,6 +1076,12 @@ svc_tcp_accept(struct svc_sock *svsk) goto failed;memcpy (&newsvsk->sk_remote, sin, slen); newsvsk->sk_remotelen = slen; + err =kernel_getsockname (newsock, sin, &slen); +if (unlikely (err <0 )) { +dprintk ("svc_tcp_accept: kernel_getsockname error %d\n" , -err); + slen = offsetof(struct sockaddr , sa_data); + } +memcpy (&newsvsk->sk_local, sin, slen);svc_sock_received (newsvsk);
Signature · 10 lines
Frank ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ NFS maillist - [email protected] https://lists.sourceforge.net/lists/listinfo/nfs