Commit a9747692 authored by Frank van Maarseveen's avatar Frank van Maarseveen Committed by Trond Myklebust

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: default avatarFrank van Maarseveen <frankvm@frankvm.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 96802a09
...@@ -59,6 +59,7 @@ struct svc_sock { ...@@ -59,6 +59,7 @@ struct svc_sock {
/* cache of various info for TCP sockets */ /* cache of various info for TCP sockets */
void *sk_info_authunix; void *sk_info_authunix;
struct sockaddr_storage sk_local; /* local address */
struct sockaddr_storage sk_remote; /* remote peer's address */ struct sockaddr_storage sk_remote; /* remote peer's address */
int sk_remotelen; /* length of address */ int sk_remotelen; /* length of address */
}; };
......
...@@ -644,6 +644,7 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen) ...@@ -644,6 +644,7 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen)
struct msghdr msg = { struct msghdr msg = {
.msg_flags = MSG_DONTWAIT, .msg_flags = MSG_DONTWAIT,
}; };
struct sockaddr *sin;
int len; int len;
len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen, len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen,
...@@ -654,6 +655,19 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen) ...@@ -654,6 +655,19 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen)
memcpy(&rqstp->rq_addr, &svsk->sk_remote, svsk->sk_remotelen); memcpy(&rqstp->rq_addr, &svsk->sk_remote, svsk->sk_remotelen);
rqstp->rq_addrlen = 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", dprintk("svc: socket %p recvfrom(%p, %Zu) = %d\n",
svsk, iov[0].iov_base, iov[0].iov_len, len); svsk, iov[0].iov_base, iov[0].iov_len, len);
...@@ -1064,6 +1078,12 @@ svc_tcp_accept(struct svc_sock *svsk) ...@@ -1064,6 +1078,12 @@ svc_tcp_accept(struct svc_sock *svsk)
goto failed; goto failed;
memcpy(&newsvsk->sk_remote, sin, slen); memcpy(&newsvsk->sk_remote, sin, slen);
newsvsk->sk_remotelen = 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); svc_sock_received(newsvsk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment