Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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 */
};
};
+20 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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)
		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);