From: NeilBrown <neilb@suse.de>
To: Andrew Morton <akpm@osdl.org>
Cc: nfs@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: [PATCH 009 of 13] knfsd: SUNRPC: teach svc_sendto() to deal with IPv6 addresses
Date: Fri, 8 Dec 2006 23:02:35 +1100 [thread overview]
Message-ID: <1061208120235.18233@suse.de> (raw)
In-Reply-To: 20061208225655.17970.patches@notabene
From: Chuck Lever <chuck.lever@oracle.com>
CMSG_DATA comes in different sizes, depending on address family.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: Aurelien Charbon <aurelien.charbon@ext.bull.net>
Signed-off-by: Neil Brown <neilb@suse.de>
### Diffstat output
./net/sunrpc/svcsock.c | 69 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 52 insertions(+), 17 deletions(-)
diff .prev/net/sunrpc/svcsock.c ./net/sunrpc/svcsock.c
--- .prev/net/sunrpc/svcsock.c 2006-12-08 13:57:20.000000000 +1100
+++ ./net/sunrpc/svcsock.c 2006-12-08 13:58:10.000000000 +1100
@@ -36,6 +36,7 @@
#include <net/sock.h>
#include <net/checksum.h>
#include <net/ip.h>
+#include <net/ipv6.h>
#include <net/tcp_states.h>
#include <asm/uaccess.h>
#include <asm/ioctls.h>
@@ -438,6 +439,47 @@ svc_wake_up(struct svc_serv *serv)
}
}
+union svc_pktinfo_u {
+ struct in_pktinfo pkti;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+ struct in6_pktinfo pkti6;
+#endif
+};
+
+static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh)
+{
+ switch (rqstp->rq_sock->sk_sk->sk_family) {
+ case AF_INET:
+ do {
+ struct in_pktinfo *pki =
+ (struct in_pktinfo *) CMSG_DATA(cmh);
+
+ cmh->cmsg_level = SOL_IP;
+ cmh->cmsg_type = IP_PKTINFO;
+ pki->ipi_ifindex = 0;
+ pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr;
+ cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
+ } while (0);
+ break;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+ case AF_INET6:
+ do {
+ struct in6_pktinfo *pki =
+ (struct in6_pktinfo *) CMSG_DATA(cmh);
+
+ cmh->cmsg_level = SOL_IPV6;
+ cmh->cmsg_type = IPV6_PKTINFO;
+ pki->ipi6_ifindex = 0;
+ ipv6_addr_copy(&pki->ipi6_addr,
+ &rqstp->rq_daddr.addr6);
+ cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
+ } while (0);
+ break;
+#endif
+ }
+ return;
+}
+
/*
* Generic sendto routine
*/
@@ -447,9 +489,8 @@ svc_sendto(struct svc_rqst *rqstp, struc
struct svc_sock *svsk = rqstp->rq_sock;
struct socket *sock = svsk->sk_sock;
int slen;
- char buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
+ char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))];
struct cmsghdr *cmh = (struct cmsghdr *)buffer;
- struct in_pktinfo *pki = (struct in_pktinfo *)CMSG_DATA(cmh);
int len = 0;
int result;
int size;
@@ -462,21 +503,15 @@ svc_sendto(struct svc_rqst *rqstp, struc
slen = xdr->len;
if (rqstp->rq_prot == IPPROTO_UDP) {
- /* set the source and destination */
- struct msghdr msg;
- msg.msg_name = &rqstp->rq_addr;
- msg.msg_namelen = rqstp->rq_addrlen;
- msg.msg_iov = NULL;
- msg.msg_iovlen = 0;
- msg.msg_flags = MSG_MORE;
-
- msg.msg_control = cmh;
- msg.msg_controllen = sizeof(buffer);
- cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
- cmh->cmsg_level = SOL_IP;
- cmh->cmsg_type = IP_PKTINFO;
- pki->ipi_ifindex = 0;
- pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr;
+ struct msghdr msg = {
+ .msg_name = &rqstp->rq_addr,
+ .msg_namelen = rqstp->rq_addrlen,
+ .msg_control = cmh,
+ .msg_controllen = sizeof(buffer),
+ .msg_flags = MSG_MORE,
+ };
+
+ svc_set_cmsg_data(rqstp, cmh);
if (sock_sendmsg(sock, &msg, 0) < 0)
goto out;
next prev parent reply other threads:[~2006-12-08 12:02 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-08 12:01 [PATCH 000 of 13] knfsd: Preparation for IPv6 support NeilBrown
2006-12-08 12:01 ` NeilBrown
2006-12-08 12:01 ` [PATCH 001 of 13] knfsd: SUNRPC: update internal API: separate pmap register and temp sockets NeilBrown
2006-12-08 12:01 ` NeilBrown
2006-12-08 12:01 ` [PATCH 002 of 13] knfsd: SUNRPC: allow creating an RPC service without registering with portmapper NeilBrown
2006-12-08 12:01 ` NeilBrown
2006-12-08 17:00 ` Trond Myklebust
2006-12-08 17:00 ` [NFS] " Trond Myklebust
2006-12-08 18:07 ` Chuck Lever
2006-12-08 12:02 ` [PATCH 003 of 13] knfsd: SUNRPC: Cache remote peer's address in svc_sock NeilBrown
2006-12-08 12:02 ` NeilBrown
2006-12-08 12:02 ` [PATCH 004 of 13] knfsd: SUNRPC: Don't set msg_name and msg_namelen when calling sock_recvmsg NeilBrown
2006-12-08 12:02 ` NeilBrown
2006-12-08 12:02 ` [PATCH 005 of 13] knfsd: SUNRPC: Use sockaddr_storage to store address in svc_deferred_req NeilBrown
2006-12-08 12:02 ` NeilBrown
2006-12-08 12:02 ` [PATCH 006 of 13] knfsd: SUNRPC: Add a function to format the address in an svc_rqst for printing NeilBrown
2006-12-08 12:02 ` NeilBrown
2006-12-08 12:02 ` [PATCH 007 of 13] knfsd: SUNRPC: Provide room in svc_rqst for larger addresses NeilBrown
2006-12-08 12:02 ` NeilBrown
2006-12-08 12:02 ` [PATCH 008 of 13] knfsd: SUNRPC: Make rq_daddr field address-version independent NeilBrown
2006-12-08 12:02 ` NeilBrown
2006-12-08 12:02 ` NeilBrown [this message]
2006-12-08 12:02 ` [PATCH 010 of 13] knfsd: SUNRPC: add a "generic" function to see if the peer uses a secure port NeilBrown
2006-12-08 12:02 ` [PATCH 011 of 13] knfsd: SUNRPC: Support IPv6 addresses in svc_tcp_accept NeilBrown
2006-12-08 12:02 ` [PATCH 012 of 13] knfsd: SUNRPC: support IPv6 addresses in RPC server's UDP receive path NeilBrown
2006-12-08 12:02 ` [PATCH 013 of 13] knfsd: SUNRPC: fix up svc_create_socket() to take a sockaddr struct + length NeilBrown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1061208120235.18233@suse.de \
--to=neilb@suse.de \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nfs@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.