diff options
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/svc_xprt.c | 13 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 23 |
2 files changed, 19 insertions, 17 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index bd31208bbb61..d86bb673e1f6 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
@@ -254,8 +254,6 @@ EXPORT_SYMBOL_GPL(svc_create_xprt); | |||
254 | */ | 254 | */ |
255 | void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) | 255 | void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) |
256 | { | 256 | { |
257 | struct sockaddr *sin; | ||
258 | |||
259 | memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen); | 257 | memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen); |
260 | rqstp->rq_addrlen = xprt->xpt_remotelen; | 258 | rqstp->rq_addrlen = xprt->xpt_remotelen; |
261 | 259 | ||
@@ -263,15 +261,8 @@ void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) | |||
263 | * Destination address in request is needed for binding the | 261 | * Destination address in request is needed for binding the |
264 | * source address in RPC replies/callbacks later. | 262 | * source address in RPC replies/callbacks later. |
265 | */ | 263 | */ |
266 | sin = (struct sockaddr *)&xprt->xpt_local; | 264 | memcpy(&rqstp->rq_daddr, &xprt->xpt_local, xprt->xpt_locallen); |
267 | switch (sin->sa_family) { | 265 | rqstp->rq_daddrlen = xprt->xpt_locallen; |
268 | case AF_INET: | ||
269 | rqstp->rq_daddr.addr = ((struct sockaddr_in *)sin)->sin_addr; | ||
270 | break; | ||
271 | case AF_INET6: | ||
272 | rqstp->rq_daddr.addr6 = ((struct sockaddr_in6 *)sin)->sin6_addr; | ||
273 | break; | ||
274 | } | ||
275 | } | 266 | } |
276 | EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs); | 267 | EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs); |
277 | 268 | ||
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 767d494de7a2..dfd686eb0b7f 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -143,19 +143,20 @@ static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) | |||
143 | cmh->cmsg_level = SOL_IP; | 143 | cmh->cmsg_level = SOL_IP; |
144 | cmh->cmsg_type = IP_PKTINFO; | 144 | cmh->cmsg_type = IP_PKTINFO; |
145 | pki->ipi_ifindex = 0; | 145 | pki->ipi_ifindex = 0; |
146 | pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr; | 146 | pki->ipi_spec_dst.s_addr = |
147 | svc_daddr_in(rqstp)->sin_addr.s_addr; | ||
147 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); | 148 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); |
148 | } | 149 | } |
149 | break; | 150 | break; |
150 | 151 | ||
151 | case AF_INET6: { | 152 | case AF_INET6: { |
152 | struct in6_pktinfo *pki = CMSG_DATA(cmh); | 153 | struct in6_pktinfo *pki = CMSG_DATA(cmh); |
154 | struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp); | ||
153 | 155 | ||
154 | cmh->cmsg_level = SOL_IPV6; | 156 | cmh->cmsg_level = SOL_IPV6; |
155 | cmh->cmsg_type = IPV6_PKTINFO; | 157 | cmh->cmsg_type = IPV6_PKTINFO; |
156 | pki->ipi6_ifindex = 0; | 158 | pki->ipi6_ifindex = daddr->sin6_scope_id; |
157 | ipv6_addr_copy(&pki->ipi6_addr, | 159 | ipv6_addr_copy(&pki->ipi6_addr, &daddr->sin6_addr); |
158 | &rqstp->rq_daddr.addr6); | ||
159 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); | 160 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); |
160 | } | 161 | } |
161 | break; | 162 | break; |
@@ -498,9 +499,13 @@ static int svc_udp_get_dest_address4(struct svc_rqst *rqstp, | |||
498 | struct cmsghdr *cmh) | 499 | struct cmsghdr *cmh) |
499 | { | 500 | { |
500 | struct in_pktinfo *pki = CMSG_DATA(cmh); | 501 | struct in_pktinfo *pki = CMSG_DATA(cmh); |
502 | struct sockaddr_in *daddr = svc_daddr_in(rqstp); | ||
503 | |||
501 | if (cmh->cmsg_type != IP_PKTINFO) | 504 | if (cmh->cmsg_type != IP_PKTINFO) |
502 | return 0; | 505 | return 0; |
503 | rqstp->rq_daddr.addr.s_addr = pki->ipi_spec_dst.s_addr; | 506 | |
507 | daddr->sin_family = AF_INET; | ||
508 | daddr->sin_addr.s_addr = pki->ipi_spec_dst.s_addr; | ||
504 | return 1; | 509 | return 1; |
505 | } | 510 | } |
506 | 511 | ||
@@ -511,9 +516,14 @@ static int svc_udp_get_dest_address6(struct svc_rqst *rqstp, | |||
511 | struct cmsghdr *cmh) | 516 | struct cmsghdr *cmh) |
512 | { | 517 | { |
513 | struct in6_pktinfo *pki = CMSG_DATA(cmh); | 518 | struct in6_pktinfo *pki = CMSG_DATA(cmh); |
519 | struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp); | ||
520 | |||
514 | if (cmh->cmsg_type != IPV6_PKTINFO) | 521 | if (cmh->cmsg_type != IPV6_PKTINFO) |
515 | return 0; | 522 | return 0; |
516 | ipv6_addr_copy(&rqstp->rq_daddr.addr6, &pki->ipi6_addr); | 523 | |
524 | daddr->sin6_family = AF_INET6; | ||
525 | ipv6_addr_copy(&daddr->sin6_addr, &pki->ipi6_addr); | ||
526 | daddr->sin6_scope_id = pki->ipi6_ifindex; | ||
517 | return 1; | 527 | return 1; |
518 | } | 528 | } |
519 | 529 | ||
@@ -614,6 +624,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
614 | skb_free_datagram_locked(svsk->sk_sk, skb); | 624 | skb_free_datagram_locked(svsk->sk_sk, skb); |
615 | return 0; | 625 | return 0; |
616 | } | 626 | } |
627 | rqstp->rq_daddrlen = svc_addr_len(svc_daddr(rqstp)); | ||
617 | 628 | ||
618 | if (skb_is_nonlinear(skb)) { | 629 | if (skb_is_nonlinear(skb)) { |
619 | /* we have to copy */ | 630 | /* we have to copy */ |