RPC server pre-requisites for IPv6
Subsystems (3)
cover RPC server pre-requisites for IPv6
Hi Neil-
Please consider these patches for 2.6.21. They can replace the similar patch set that is currently included in Andrew's kernel. These patches address a few minor bugs, and may fix a problem that Andrew is currently seeing.
Thanks.
Signature · 10 lines
corporate: <chuck dot lever at oracle dot com> ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ NFS maillist - [email protected] https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 1/13 SUNRPC: update internal API: separate pmap register and temp sockets
Currently in the RPC server, registering with the local portmapper and creating "permanent" sockets are tied together. Expand the internal APIs to allow these two socket characteristics to be separately specified.
This will be externalized in the next patch.
---
include/linux/sunrpc/svcsock.h | 7 ++++++ net/sunrpc/svcsock.c | 47 +++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 20 deletions(-)
include/linux/sunrpc/svcsock.h +7 -0
@@ -74,4 +74,11 @@ int svc_addsock(struct svc_serv *serv,char *name_return, int *proto); +/* +* svc_makesock socket characteristics +*/ +#define SVC_SOCK_DEFAULTS (0U) +#define SVC_SOCK_ANONYMOUS (1U << 0)/* don't register with pmap */ +#define SVC_SOCK_TEMPORARY (1U << 1)/* flag socket as temporary */ +#endif /* SUNRPC_SVCSOCK_H */
net/sunrpc/svcsock.c +27 -20
102 lines not on this page · raw message
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 2/13 SUNRPC: allow creating an RPC service without registering with portmapper
In reply to Chuck LeverSometimes we need to create an RPC service but not register it with the local portmapper. NFSv4 delegation callback, for example.
Change the svc_makesock() API to allow optionally creating temporary or permanent sockets, optionally registering with the local portmapper, and make it return the ephemeral port of the new socket.
---
fs/lockd/svc.c | 26 ++++++++++++++++---------- fs/nfs/callback.c | 20 +++++++++----------- fs/nfsd/nfssvc.c | 6 ++++-- include/linux/sunrpc/svcsock.h | 2 +- net/sunrpc/svcsock.c | 6 ++++-- 5 files changed, 34 insertions(+), 26 deletions(-)
fs/lockd/svc.c +16 -10
@@ -223,23 +223,29 @@ static int find_socket(struct svc_serv *return found; } +/* +* Make any sockets that are needed but not present. +* If nlm_udpport or nlm_tcpport were set as module +* options, make those sockets unconditionally +*/ static int make_socks (struct svc_serv *serv,int proto) { -/* Make any sockets that are needed but not present. -* If nlm_udpport or nlm_tcpport were set as module -* options, make those sockets unconditionally -*/ -static int warned; +static int warned;int err =0 ; +if (proto ==IPPROTO_UDP || nlm_udpport)if (!find_socket (serv,IPPROTO_UDP )) - err =svc_makesock (serv,IPPROTO_UDP , nlm_udpport); -if (err ==0 && (proto ==IPPROTO_TCP || nlm_tcpport)) + err =svc_makesock (serv,IPPROTO_UDP , nlm_udpport, +SVC_SOCK_DEFAULTS ); +if (err >=0 && (proto ==IPPROTO_TCP || nlm_tcpport))if (!find_socket (serv,IPPROTO_TCP )) - err=svc_makesock (serv,IPPROTO_TCP , nlm_tcpport); -if (!err) + err =svc_makesock (serv,IPPROTO_TCP , nlm_tcpport, +SVC_SOCK_DEFAULTS ); + +if (err >=0 ) { warned =0 ; -else if (warned++ ==0 ) + err =0 ; + }else if (warned++ ==0 )printk (KERN_WARNING "lockd_up: makesock failed, error=%d\n" , err);return err;
fs/nfs/callback.c +9 -11
@@ -106,7 +106,6 @@ static void nfs_callback_svc(struct svc_int nfs_callback_up (void ) {struct svc_serv *serv; -struct svc_sock *svsk;int ret =0 ;lock_kernel ();
@@ -119,17 +118,14 @@ int nfs_callback_up(void) ret = -ENOMEM ;if (!serv) goto out_err; -/* FIXME: We don't want to register this socket with the portmapper */ - ret =svc_makesock (serv,IPPROTO_TCP , nfs_callback_set_tcpport); -if (ret <0 ) + + ret =svc_makesock (serv,IPPROTO_TCP , nfs_callback_set_tcpport, +SVC_SOCK_ANONYMOUS ); +if (ret <=0 ) goto out_destroy; -if (!list_empty (&serv->sv_permsocks)) { - svsk =list_entry (serv->sv_permsocks.next, - struct svc_sock, sk_list); - nfs_callback_tcpport =ntohs (inet_sk (svsk->sk_sk)->sport); -dprintk ("Callback port = 0x%x\n" , nfs_callback_tcpport); - }else -BUG (); + nfs_callback_tcpport = ret; +dprintk ("Callback port = 0x%x\n" , nfs_callback_tcpport); + ret =svc_create_thread (nfs_callback_svc, serv);if (ret <0 ) goto out_destroy;
@@ -140,6 +136,8 @@ out:unlock_kernel ();return ret; out_destroy: +dprintk ("Couldn't create callback socket or server thread; err = %d\n" , + ret);svc_destroy (serv); out_err: nfs_callback_info.users--;
fs/nfsd/nfssvc.c +4 -2
@@ -235,7 +235,8 @@ static int nfsd_init_socks(int port) error =lockd_up (IPPROTO_UDP );if (error >=0 ) { - error =svc_makesock (nfsd_serv,IPPROTO_UDP , port); + error =svc_makesock (nfsd_serv,IPPROTO_UDP , port, +SVC_SOCK_DEFAULTS );if (error <0 )lockd_down (); }
@@ -245,7 +246,8 @@ static int nfsd_init_socks(int port)#ifdef CONFIG_NFSD_TCP error =lockd_up (IPPROTO_TCP );if (error >=0 ) { - error =svc_makesock (nfsd_serv,IPPROTO_TCP , port); + error =svc_makesock (nfsd_serv,IPPROTO_TCP , port, +SVC_SOCK_DEFAULTS );if (error <0 )lockd_down (); }
include/linux/sunrpc/svcsock.h +1 -1
@@ -62,7 +62,7 @@ #define SK_DETACHED 10 /* detached fro/* * Function prototypes. */ -int svc_makesock (struct svc_serv *,int ,unsigned short ); +int svc_makesock (struct svc_serv *,int ,unsigned short ,int flags);void svc_delete_socket (struct svc_sock *);int svc_recv (struct svc_rqst *,long );int svc_send (struct svc_rqst *);
net/sunrpc/svcsock.c +4 -2
@@ -1659,9 +1659,11 @@ svc_delete_socket(struct svc_sock *svsk)* @serv: RPC server structure * @protocol: transport protocol to use * @port: port to use +* @flags: requested socket characteristics * */ -int svc_makesock (struct svc_serv *serv,int protocol,unsigned short port) +int svc_makesock (struct svc_serv *serv,int protocol,unsigned short port, +int flags) {struct sockaddr_in sin = { .sin_family =AF_INET ,
@@ -1670,7 +1672,7 @@ int svc_makesock(struct svc_serv *serv, };dprintk ("svc: creating socket proto = %d\n" , protocol); -return svc_create_socket (serv, protocol, &sin,SVC_SOCK_DEFAULTS ); +return svc_create_socket (serv, protocol, &sin, flags); }/*
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 3/13 SUNRPC: Cache remote peer's address in svc_sock.
In reply to Chuck LeverThe remote peer's address won't change after the socket has been accepted. We don't need to call ->getname on every incoming request.
---
include/linux/sunrpc/svcsock.h | 3 +++ net/sunrpc/svcsock.c | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-)
include/linux/sunrpc/svcsock.h +3 -0
@@ -57,6 +57,9 @@ #define SK_DETACHED 10 /* detached fro/* cache of various info for TCP sockets */ void *sk_info_authunix; + +struct sockaddr_storage sk_remote;/* remote peer's address */ +int sk_remotelen;/* length of address */ };/*
net/sunrpc/svcsock.c +7 -7
@@ -560,12 +560,13 @@ svc_recv_available(struct svc_sock *svskstatic int svc_recvfrom (struct svc_rqst *rqstp,struct kvec *iov,int nr,int buflen) { +struct svc_sock *svsk = rqstp->rq_sock;struct msghdr msg;struct socket *sock; -int len, alen; +int len; rqstp->rq_addrlen =sizeof (rqstp->rq_addr); - sock = rqstp->rq_sock->sk_sock; + sock = svsk->sk_sock; msg.msg_name = &rqstp->rq_addr; msg.msg_namelen =sizeof (rqstp->rq_addr);
@@ -577,11 +578,9 @@ svc_recvfrom(struct svc_rqst *rqstp, str len =kernel_recvmsg (sock, &msg, iov, nr, buflen,MSG_DONTWAIT );/* sock_recvmsg doesn't fill in the name/namelen, so we must.. -* possibly we should cache this in the svc_sock structure -* at accept time. FIXME */ - alen =sizeof (rqstp->rq_addr); -kernel_getpeername (sock, (struct sockaddr *)&rqstp->rq_addr, &alen); +memcpy (&rqstp->rq_addr, &svsk->sk_remote, svsk->sk_remotelen); + rqstp->rq_addrlen = svsk->sk_remotelen;dprintk ("svc: socket %p recvfrom(%p, %Zu) = %d\n" , rqstp->rq_sock, iov[0 ].iov_base, iov[0 ].iov_len, len);
@@ -925,7 +924,8 @@ svc_tcp_accept(struct svc_sock *svsk)if (!(newsvsk =svc_setup_socket (serv, newsock, &err, (SVC_SOCK_ANONYMOUS |SVC_SOCK_TEMPORARY )))) goto failed; - +memcpy (&newsvsk->sk_remote, &sin, slen); + newsvsk->sk_remotelen = slen;/* make sure that we don't have too many active connections. * If we have, something must be dropped.
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 4/13 SUNRPC: Don't set msg_name and msg_namelen when calling sock_recvmsg
In reply to Chuck LeverClean-up: msg_name and msg_namelen are not used by sock_recvmsg, so don't bother to set them in svc_recvfrom.
---
net/sunrpc/svcsock.c | 22 +++++++--------------- 1 files changed, 7 insertions(+), 15 deletions(-)
net/sunrpc/svcsock.c +7 -15
@@ -561,21 +561,13 @@ static int svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen) { struct svc_sock *svsk = rqstp->rq_sock; -struct msghdr msg; -struct socket *sock; -int len; - - rqstp->rq_addrlen =sizeof (rqstp->rq_addr); - sock = svsk->sk_sock; - - msg.msg_name = &rqstp->rq_addr; - msg.msg_namelen =sizeof (rqstp->rq_addr); - msg.msg_control =NULL ; - msg.msg_controllen =0 ; - - msg.msg_flags =MSG_DONTWAIT ; +struct msghdr msg = { + .msg_flags =MSG_DONTWAIT , + }; +int len; - len =kernel_recvmsg (sock, &msg, iov, nr, buflen,MSG_DONTWAIT ); + len =kernel_recvmsg (svsk->sk_sock, &msg, iov, nr, buflen, + msg.msg_flags);/* sock_recvmsg doesn't fill in the name/namelen, so we must.. */
@@ -583,7 +575,7 @@ svc_recvfrom(struct svc_rqst *rqstp, str rqstp->rq_addrlen = svsk->sk_remotelen;dprintk ("svc: socket %p recvfrom(%p, %Zu) = %d\n" , - rqstp->rq_sock, iov[0 ].iov_base, iov[0 ].iov_len, len); + svsk, iov[0 ].iov_base, iov[0 ].iov_len, len);return len; }
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 5/13 SUNRPC: Add a function to format the address in an svc_rqst for printing
In reply to Chuck LeverThere are loads of places where the RPC server assumes that the rq_addr fields contains an IPv4 address. Top among these are error and debugging messages that display the server's IP address.
Let's refactor the address printing into a separate function that's smart enough to figure out the difference between IPv4 and IPv6 addresses.
---
fs/lockd/svc.c | 6 ++-- fs/lockd/svc4proc.c | 7 ++-- fs/lockd/svcproc.c | 7 ++-- fs/nfs/callback.c | 12 +++++-- fs/nfsd/nfsfh.c | 8 ++--- fs/nfsd/nfsproc.c | 7 ++-- include/linux/sunrpc/svc.h | 3 ++ net/sunrpc/svcsock.c | 75 ++++++++++++++++++++++++++++++++------------ 8 files changed, 84 insertions(+), 41 deletions(-)
fs/lockd/svc.c +3 -3
@@ -141,6 +141,7 @@ lockd(struct svc_rqst *rqstp)*/ while ((nlmsvc_users || !signalled ()) && nlmsvc_pid == current->pid) {long timeout =MAX_SCHEDULE_TIMEOUT ; +char buf[RPC_MAX_ADDRBUFLEN ];if (signalled ()) {flush_signals (current);
@@ -175,11 +176,10 @@ lockd(struct svc_rqst *rqstp)break ; } -dprintk ("lockd: request from %08x\n" , - (unsigned )ntohl (rqstp->rq_addr.sin_addr.s_addr)); +dprintk ("lockd: request from %s\n" , +svc_print_addr (rqstp, buf,sizeof (buf)));svc_process (rqstp); - }flush_signals (current);
fs/lockd/svc4proc.c +3 -4
@@ -426,10 +426,9 @@ nlm4svc_proc_sm_notify(struct svc_rqst *dprintk ("lockd: SM_NOTIFY called\n" );if (saddr.sin_addr.s_addr !=htonl (INADDR_LOOPBACK ) ||ntohs (saddr.sin_port) >=1024 ) { -printk (KERN_WARNING -"lockd: rejected NSM callback from %08x:%d\n" , -ntohl (rqstp->rq_addr.sin_addr.s_addr), -ntohs (rqstp->rq_addr.sin_port)); +char buf[RPC_MAX_ADDRBUFLEN ]; +printk (KERN_WARNING "lockd: rejected NSM callback from %s\n" , +svc_print_addr (rqstp, buf,sizeof (buf)));return rpc_system_err; }
fs/lockd/svcproc.c +3 -4
@@ -457,10 +457,9 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rdprintk ("lockd: SM_NOTIFY called\n" );if (saddr.sin_addr.s_addr !=htonl (INADDR_LOOPBACK ) ||ntohs (saddr.sin_port) >=1024 ) { -printk (KERN_WARNING -"lockd: rejected NSM callback from %08x:%d\n" , -ntohl (rqstp->rq_addr.sin_addr.s_addr), -ntohs (rqstp->rq_addr.sin_port)); +char buf[RPC_MAX_ADDRBUFLEN ]; +printk (KERN_WARNING "lockd: rejected NSM callback from %s\n" , +svc_print_addr (rqstp, buf,sizeof (buf)));return rpc_system_err; }
fs/nfs/callback.c +9 -3
@@ -71,6 +71,8 @@ static void nfs_callback_svc(struct svc_complete (&nfs_callback_info.started);for (;;) { +char buf[RPC_MAX_ADDRBUFLEN ]; +if (signalled ()) {if (nfs_callback_info.users ==0 )break ;
@@ -88,8 +90,8 @@ static void nfs_callback_svc(struct svc_ __FUNCTION__, -err);break ; } -dprintk ("%s: request from %u.%u.%u.%u\n" , __FUNCTION__, -NIPQUAD (rqstp->rq_addr.sin_addr.s_addr)); +dprintk ("%s: request from %s\n" , __FUNCTION__, +svc_print_addr (rqstp, buf,sizeof (buf)));svc_process (rqstp); }
@@ -166,13 +168,17 @@ static int nfs_callback_authenticate(str {struct sockaddr_in *addr = &rqstp->rq_addr;struct nfs_client *clp; +char buf[RPC_MAX_ADDRBUFLEN ];/* Don't talk to strangers */ clp =nfs_find_client (addr,4 );if (clp ==NULL )return SVC_DROP ; -dprintk ("%s: %u.%u.%u.%u NFSv4 callback!\n" , __FUNCTION__,NIPQUAD (addr->sin_addr)); + +dprintk ("%s: %s NFSv4 callback!\n" , __FUNCTION__, +svc_print_addr (rqstp, buf,sizeof (buf)));nfs_put_client (clp); +switch (rqstp->rq_authop->flavour) {case RPC_AUTH_NULL :if (rqstp->rq_proc !=CB_NULL )
fs/nfsd/nfsfh.c +4 -4
@@ -20,6 +20,7 @@ #include <linux/dcache.h>#include <linux/mount.h> #include <asm/pgtable.h> +#include <linux/sunrpc/clnt.h> #include <linux/sunrpc/svc.h> #include <linux/nfsd/nfsd.h>
@@ -182,10 +183,9 @@ fh_verify(struct svc_rqst *rqstp, struct/* Check if the request originated from a secure port. */ error = nfserr_perm;if (!rqstp->rq_secure &&EX_SECURE (exp)) { -printk (KERN_WARNING -"nfsd: request from insecure port (%u.%u.%u.%u:%d)!\n" , -NIPQUAD (rqstp->rq_addr.sin_addr.s_addr), -ntohs (rqstp->rq_addr.sin_port)); +char buf[RPC_MAX_ADDRBUFLEN ]; +printk (KERN_WARNING "nfsd: request from insecure port %s!\n" , +svc_print_addr (rqstp, buf,sizeof (buf))); goto out; }
fs/nfsd/nfsproc.c +4 -3
@@ -19,6 +19,7 @@ #include <linux/namei.h>#include <linux/unistd.h> #include <linux/slab.h> +#include <linux/sunrpc/clnt.h> #include <linux/sunrpc/svc.h> #include <linux/nfsd/nfsd.h> #include <linux/nfsd/cache.h>
@@ -147,10 +148,10 @@ nfsd_proc_read(struct svc_rqst *rqstp, s*/ if (NFSSVC_MAXBLKSIZE_V2 < argp->count) { +char buf[RPC_MAX_ADDRBUFLEN ];printk (KERN_NOTICE -"oversized read request from %u.%u.%u.%u:%d (%d bytes)\n" , -NIPQUAD (rqstp->rq_addr.sin_addr.s_addr), -ntohs (rqstp->rq_addr.sin_port), +"oversized read request from %s (%d bytes)\n" , +svc_print_addr (rqstp, buf,sizeof (buf)), argp->count); argp->count =NFSSVC_MAXBLKSIZE_V2 ; }
include/linux/sunrpc/svc.h +3 -0
@@ -365,5 +365,8 @@ int svc_register(struct svc_serv *,void svc_wake_up (struct svc_serv *);void svc_reserve (struct svc_rqst *rqstp,int space);struct svc_pool *svc_pool_for_cpu (struct svc_serv *serv,int cpu); +char *svc_print_addr (struct svc_rqst *,char *,size_t ); + +#define RPC_MAX_ADDRBUFLEN (63U)#endif /* SUNRPC_SVC_H */
net/sunrpc/svcsock.c +55 -20
128 lines not on this page · raw message
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 6/13 SUNRPC: Use sockaddr_storage to store address in svc_deferred_req
In reply to Chuck LeverSockaddr_storage will allow us to store arbitrary socket addresses in the svc_deferred_req struct.
---
include/linux/sunrpc/svc.h | 5 +++-- net/sunrpc/svcsock.c | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-)
include/linux/sunrpc/svc.h +3 -2
@@ -289,8 +289,9 @@ static inline void svc_free_res_pages(ststruct svc_deferred_req {u32 prot;/* protocol (UDP or TCP) */ -struct sockaddr_in addr; -struct svc_sock *svsk;/* where reply must go */ +struct svc_sock *svsk; +struct sockaddr_storage addr;/* where reply must go */ +size_t addrlen;__be32 daddr;/* where reply must come from */ struct cache_deferred_req handle;int argslen;
net/sunrpc/svcsock.c +4 -2
@@ -1748,7 +1748,8 @@ svc_defer(struct cache_req *req) dr->handle.owner = rqstp->rq_server; dr->prot = rqstp->rq_prot; - dr->addr = rqstp->rq_addr; +memcpy (&dr->addr, &rqstp->rq_addr, rqstp->rq_addrlen); + dr->addrlen = rqstp->rq_addrlen; dr->daddr = rqstp->rq_daddr; dr->argslen = rqstp->rq_arg.len >>2 ;memcpy (dr->args, rqstp->rq_arg.head[0 ].iov_base-skip, dr->argslen<<2 );
@@ -1772,7 +1773,8 @@ static int svc_deferred_recv(struct svc_ rqstp->rq_arg.page_len =0 ; rqstp->rq_arg.len = dr->argslen<<2 ; rqstp->rq_prot = dr->prot; - rqstp->rq_addr = dr->addr; +memcpy (&rqstp->rq_addr, &dr->addr, dr->addrlen); + rqstp->rq_addrlen = dr->addrlen; rqstp->rq_daddr = dr->daddr; rqstp->rq_respages = rqstp->rq_pages;return dr->argslen<<2 ;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 7/13 SUNRPC: Provide room in svc_rqst for larger addresses
In reply to Chuck LeverExpand the rq_addr field to allow it to contain larger addresses.
---
fs/lockd/host.c | 2 +- fs/lockd/svc4proc.c | 6 ++++-- fs/lockd/svcproc.c | 6 ++++-- fs/nfs/callback.c | 2 +- fs/nfs/callback_xdr.c | 4 ++-- fs/nfsd/nfs4state.c | 18 +++++++++--------- fs/nfsd/nfscache.c | 2 +- include/linux/sunrpc/svc.h | 17 +++++++++++++++-- net/sunrpc/svcauth_unix.c | 3 ++- net/sunrpc/svcsock.c | 19 ++++++++++++------- 10 files changed, 51 insertions(+), 28 deletions(-)
fs/lockd/host.c +1 -1
@@ -192,7 +192,7 @@ struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *rqstp, const char *hostname, int hostname_len) { - return nlm_lookup_host(1, &rqstp->rq_addr, + return nlm_lookup_host(1, svc_addr_in(rqstp), rqstp->rq_prot, rqstp->rq_vers, hostname, hostname_len); }
fs/lockd/svc4proc.c +4 -2
@@ -224,7 +224,7 @@ nlm4svc_proc_granted(struct svc_rqst *rq resp->cookie = argp->cookie;dprintk ("lockd: GRANTED called\n" ); - resp->status =nlmclnt_grant (&rqstp->rq_addr, &argp->lock); + resp->status =nlmclnt_grant (svc_addr_in (rqstp), &argp->lock);dprintk ("lockd: GRANTED status %d\n" ,ntohl (resp->status));return rpc_success; }
@@ -421,7 +421,9 @@ static __be32 nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, void *resp) { - struct sockaddr_in saddr = rqstp->rq_addr; + struct sockaddr_in saddr; + +memcpy (&saddr,svc_addr_in (rqstp),sizeof (saddr));dprintk ("lockd: SM_NOTIFY called\n" ); if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
fs/lockd/svcproc.c +4 -2
@@ -253,7 +253,7 @@ nlmsvc_proc_granted(struct svc_rqst *rqs resp->cookie = argp->cookie;dprintk ("lockd: GRANTED called\n" ); - resp->status =nlmclnt_grant (&rqstp->rq_addr, &argp->lock); + resp->status =nlmclnt_grant (svc_addr_in (rqstp), &argp->lock);dprintk ("lockd: GRANTED status %d\n" ,ntohl (resp->status));return rpc_success; }
@@ -452,7 +452,9 @@ static __be32 nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, void *resp) { - struct sockaddr_in saddr = rqstp->rq_addr; + struct sockaddr_in saddr; + +memcpy (&saddr,svc_addr_in (rqstp),sizeof (saddr));dprintk ("lockd: SM_NOTIFY called\n" ); if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
fs/nfs/callback.c +1 -1
@@ -166,7 +166,7 @@ void nfs_callback_down(void)static int nfs_callback_authenticate (struct svc_rqst *rqstp) { -struct sockaddr_in *addr = &rqstp->rq_addr; +struct sockaddr_in *addr =svc_addr_in (rqstp);struct nfs_client *clp;char buf[RPC_MAX_ADDRBUFLEN ];
fs/nfs/callback_xdr.c +2 -2
@@ -176,7 +176,7 @@ static __be32 decode_getattr_args(struct status =decode_fh (xdr, &args->fh);if (unlikely (status !=0 )) goto out; - args->addr = &rqstp->rq_addr; + args->addr =svc_addr_in (rqstp); status =decode_bitmap (xdr, args->bitmap); out:dprintk ("%s: exit with status = %d\n" , __FUNCTION__, status);
@@ -188,7 +188,7 @@ static __be32 decode_recall_args(struct__be32 *p;__be32 status; - args->addr = &rqstp->rq_addr; + args->addr =svc_addr_in (rqstp); status =decode_stateid (xdr, &args->stateid);if (unlikely (status !=0 )) goto out;
fs/nfsd/nfs4state.c +9 -9
@@ -714,7 +714,7 @@ __be32 nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_setclientid *setclid) { - __be32 ip_addr = rqstp->rq_addr.sin_addr.s_addr; + struct sockaddr_in *sin = svc_addr_in(rqstp); struct xdr_netobj clname = { .len = setclid->se_namelen, .data = setclid->se_name,
@@ -749,7 +749,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp*/ status = nfserr_clid_inuse;if (!cmp_creds (&conf->cl_cred, &rqstp->rq_cred) - || conf->cl_addr != ip_addr) { + || conf->cl_addr != sin->sin_addr.s_addr) {printk ("NFSD: setclientid: string in use by client" "(clientid %08x/%08x)\n" , conf->cl_clientid.cl_boot, conf->cl_clientid.cl_id);
@@ -769,7 +769,7 @@ nfsd4_setclientid(struct svc_rqst *rqstpif (new ==NULL ) goto out;copy_verf (new, &clverifier); - new->cl_addr = ip_addr; + new->cl_addr = sin->sin_addr.s_addr;copy_cred (&new->cl_cred,&rqstp->rq_cred);gen_clid (new);gen_confirm (new);
@@ -801,7 +801,7 @@ nfsd4_setclientid(struct svc_rqst *rqstpif (new ==NULL ) goto out;copy_verf (new,&conf->cl_verifier); - new->cl_addr = ip_addr; + new->cl_addr = sin->sin_addr.s_addr;copy_cred (&new->cl_cred,&rqstp->rq_cred);copy_clid (new, conf);gen_confirm (new);
@@ -820,7 +820,7 @@ nfsd4_setclientid(struct svc_rqst *rqstpif (new ==NULL ) goto out;copy_verf (new,&clverifier); - new->cl_addr = ip_addr; + new->cl_addr = sin->sin_addr.s_addr;copy_cred (&new->cl_cred,&rqstp->rq_cred);gen_clid (new);gen_confirm (new);
@@ -847,7 +847,7 @@ nfsd4_setclientid(struct svc_rqst *rqstpif (new ==NULL ) goto out;copy_verf (new,&clverifier); - new->cl_addr = ip_addr; + new->cl_addr = sin->sin_addr.s_addr;copy_cred (&new->cl_cred,&rqstp->rq_cred);gen_clid (new);gen_confirm (new);
@@ -881,7 +881,7 @@ nfsd4_setclientid_confirm(struct svc_rqsstruct nfsd4_compound_state *cstate, struct nfsd4_setclientid_confirm *setclientid_confirm) { - __be32 ip_addr = rqstp->rq_addr.sin_addr.s_addr; + struct sockaddr_in *sin = svc_addr_in(rqstp);struct nfs4_client *conf, *unconf;nfs4_verifier confirm = setclientid_confirm->sc_confirm;clientid_t * clid = &setclientid_confirm->sc_clientid;
@@ -900,9 +900,9 @@ nfsd4_setclientid_confirm(struct svc_rqs unconf =find_unconfirmed_client (clid); status = nfserr_clid_inuse; -if (conf && conf->cl_addr != ip_addr) +if (conf && conf->cl_addr != sin->sin_addr.s_addr) goto out; -if (unconf && unconf->cl_addr != ip_addr) +if (unconf && unconf->cl_addr != sin->sin_addr.s_addr) goto out; if ((conf && unconf) &&
fs/nfsd/nfscache.c +1 -1
@@ -185,7 +185,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp rp->c_state =RC_INPROG ; rp->c_xid = xid; rp->c_proc = proc; - rp->c_addr = rqstp->rq_addr; +memcpy (&rp->c_addr,svc_addr_in (rqstp),sizeof (rp->c_addr)); rp->c_prot = proto; rp->c_vers = vers; rp->c_timestamp = jiffies;
include/linux/sunrpc/svc.h +15 -2
@@ -197,8 +197,8 @@ struct svc_rqst {struct list_head rq_list;/* idle list */ struct list_head rq_all;/* all threads list */ struct svc_sock * rq_sock;/* socket */ -struct sockaddr_in rq_addr;/* peer address */ -int rq_addrlen; +struct sockaddr_storage rq_addr;/* peer address */ +size_t rq_addrlen;struct svc_serv * rq_server;/* RPC service definition */ struct svc_pool * rq_pool;/* thread pool */
@@ -253,6 +253,19 @@ struct svc_rqst { };/* +* Rigorous type checking on sockaddr type conversions +*/ +static inline struct sockaddr_in *svc_addr_in (struct svc_rqst *rqst) +{ +return (struct sockaddr_in *) &rqst->rq_addr; +} + +static inline struct sockaddr *svc_addr (struct svc_rqst *rqst) +{ +return (struct sockaddr *) &rqst->rq_addr; +} + +/* * Check buffer bounds after decoding arguments */ static inline int
net/sunrpc/svcauth_unix.c +2 -1
@@ -421,6 +421,7 @@ svcauth_unix_info_release(void *info)static int svcauth_unix_set_client (struct svc_rqst *rqstp) { +struct sockaddr_in *sin =svc_addr_in (rqstp);struct ip_map *ipm; rqstp->rq_client =NULL ;
@@ -430,7 +431,7 @@ svcauth_unix_set_client(struct svc_rqst ipm =ip_map_cached_get (rqstp);if (ipm ==NULL ) ipm =ip_map_lookup (rqstp->rq_server->sv_program->pg_class, - rqstp->rq_addr.sin_addr); + sin->sin_addr);if (ipm ==NULL )return SVC_DENIED ;
net/sunrpc/svcsock.c +12 -7
@@ -146,7 +146,7 @@ #endif*/ char *svc_print_addr (struct svc_rqst *rqstp,char *buf,size_t len) { -return __svc_print_addr ((struct sockaddr *) &rqstp->rq_addr, buf, len); +return __svc_print_addr (svc_addr (rqstp), buf, len); }EXPORT_SYMBOL_GPL (svc_print_addr);
@@ -465,7 +465,7 @@ svc_sendto(struct svc_rqst *rqstp, struc/* set the source and destination */ struct msghdr msg; msg.msg_name = &rqstp->rq_addr; - msg.msg_namelen =sizeof (rqstp->rq_addr); + msg.msg_namelen = rqstp->rq_addrlen; msg.msg_iov =NULL ; msg.msg_iovlen =0 ; msg.msg_flags =MSG_MORE ;
@@ -688,6 +688,7 @@ svc_write_space(struct sock *sk)static int svc_udp_recvfrom (struct svc_rqst *rqstp) { +struct sockaddr_in *sin =svc_addr_in (rqstp);struct svc_sock *svsk = rqstp->rq_sock;struct svc_serv *serv = svsk->sk_server;struct sk_buff *skb;
@@ -743,9 +744,12 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) rqstp->rq_prot =IPPROTO_UDP ;/* Get sender address */ - rqstp->rq_addr.sin_family =AF_INET ; - rqstp->rq_addr.sin_port = skb->h.uh->source; - rqstp->rq_addr.sin_addr.s_addr = skb->nh.iph->saddr; + sin->sin_family =AF_INET ; + sin->sin_port = skb->h.uh->source; + sin->sin_addr.s_addr = skb->nh.iph->saddr; + rqstp->rq_addrlen =sizeof (struct sockaddr_in ); + +/* Remember which interface received this request */ rqstp->rq_daddr = skb->nh.iph->daddr;if (skb_is_nonlinear (skb)) {
@@ -1275,7 +1279,8 @@ svc_sock_update_bufs(struct svc_serv *seint svc_recv (struct svc_rqst *rqstp,long timeout) { -struct svc_sock *svsk =NULL ; +struct svc_sock *svsk =NULL ; +struct sockaddr_in *sin =svc_addr_in (rqstp);struct svc_serv *serv = rqstp->rq_server;struct svc_pool *pool = rqstp->rq_pool;int len, i;
@@ -1370,7 +1375,7 @@ svc_recv(struct svc_rqst *rqstp, long ti svsk->sk_lastrecv =get_seconds ();clear_bit (SK_OLD , &svsk->sk_flags); - rqstp->rq_secure =ntohs (rqstp->rq_addr.sin_port) <1024 ; + rqstp->rq_secure =ntohs (sin->sin_port) <PROT_SOCK ; rqstp->rq_chandle.defer = svc_defer;if (serv->sv_stats)
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 8/13 SUNRPC: Make rq_daddr field address-version independent
In reply to Chuck LeverThe rq_daddr field must support larger addresses.
---
include/linux/sunrpc/svc.h | 14 ++++++++++---- net/sunrpc/svcsock.c | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-)
include/linux/sunrpc/svc.h +10 -4
@@ -11,6 +11,7 @@ #ifndef SUNRPC_SVC_H#define SUNRPC_SVC_H #include <linux/in.h> +#include <linux/in6.h> #include <linux/sunrpc/types.h> #include <linux/sunrpc/xdr.h> #include <linux/sunrpc/auth.h>
@@ -188,7 +189,13 @@ static inline void svc_putu32(struct kve iov->iov_len +=sizeof (__be32); } - +union svc_addr_u { +struct in_addr addr; +#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE ) +struct in6_addr addr6; +#endif +}; +/* * The context of a single thread, including the request currently being * processed.
@@ -224,8 +231,7 @@ struct svc_rqst {unsigned short rq_secure : 1; /* secure port */ - -__be32 rq_daddr;/* dest addr of request - reply from here */ +union svc_addr_u rq_daddr;/* dest addr of request - reply from here */ void * rq_argp;/* decoded arguments */ void * rq_resp;/* xdr'd results */
@@ -305,7 +311,7 @@ struct svc_deferred_req {struct svc_sock *svsk;struct sockaddr_storage addr;/* where reply must go */ size_t addrlen; -__be32 daddr;/* where reply must come from */ +union svc_addr_u daddr;/* where reply must come from */ struct cache_deferred_req handle;int argslen;__be32 args[0 ];
net/sunrpc/svcsock.c +2 -2
@@ -476,7 +476,7 @@ svc_sendto(struct svc_rqst *rqstp, struc cmh->cmsg_level =SOL_IP ; cmh->cmsg_type =IP_PKTINFO ; pki->ipi_ifindex =0 ; - pki->ipi_spec_dst.s_addr = rqstp->rq_daddr; + pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr;if (sock_sendmsg (sock, &msg,0 ) <0 ) goto out;
@@ -750,7 +750,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) rqstp->rq_addrlen =sizeof (struct sockaddr_in );/* Remember which interface received this request */ - rqstp->rq_daddr = skb->nh.iph->daddr; + rqstp->rq_daddr.addr.s_addr = skb->nh.iph->daddr;if (skb_is_nonlinear (skb)) {/* we have to copy */
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 9/13 SUNRPC: teach svc_sendto() to deal with IPv6 addresses
In reply to Chuck LeverCMSG_DATA comes in different sizes, depending on address family.
---
net/sunrpc/svcsock.c | 67 +++++++++++++++++++++++++++++++++++++------------- 1 files changed, 50 insertions(+), 17 deletions(-)
net/sunrpc/svcsock.c +50 -17
@@ -36,6 +36,7 @@ #include <linux/freezer.h>#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,45 @@ 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 =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 =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 +487,8 @@ svc_sendto(struct svc_rqst *rqstp, strucstruct 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 +501,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;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 10/13 SUNRPC: add a "generic" function to see if the peer uses a secure port
In reply to Chuck LeverThe only reason svcsock.c looks at a sockaddr's port is to check whether the remote peer is connecting from a privileged port. Refactor this check to hide processing that is specific to address format.
---
net/sunrpc/svcsock.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-)
net/sunrpc/svcsock.c +16 -3
@@ -927,6 +927,20 @@ svc_tcp_data_ready(struct sock *sk, intwake_up_interruptible (sk->sk_sleep); } +static inline int svc_port_is_privileged (struct sockaddr *sin) +{ +switch (sin->sa_family) { +case AF_INET : +return ntohs (((struct sockaddr_in *)sin)->sin_port) <PROT_SOCK ; +#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE ) +case AF_INET6 : +return ntohs (((struct sockaddr_in6 *)sin)->sin6_port) <PROT_SOCK ; +#endif +default : +return 0 ; + } +} +/* * Accept a TCP connection */
@@ -973,7 +987,7 @@ svc_tcp_accept(struct svc_sock *svsk)* hosts here, but when we get encryption, the IP of the host won't * tell us anything. For now just warn about unpriv connections. */ -if (ntohs (sin.sin_port) >=1024 ) { +if (!svc_port_is_privileged ((struct sockaddr *) &sin)) { dprintk(KERN_WARNING "%s: connect from unprivileged port: %s\n", serv->sv_name,
@@ -1313,7 +1327,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) {struct svc_sock *svsk =NULL ; -struct sockaddr_in *sin =svc_addr_in (rqstp);struct svc_serv *serv = rqstp->rq_server;struct svc_pool *pool = rqstp->rq_pool;int len, i;
@@ -1408,7 +1421,7 @@ svc_recv(struct svc_rqst *rqstp, long ti svsk->sk_lastrecv =get_seconds ();clear_bit (SK_OLD , &svsk->sk_flags); - rqstp->rq_secure =ntohs (sin->sin_port) <PROT_SOCK ; + rqstp->rq_secure =svc_port_is_privileged (svc_addr (rqstp)); rqstp->rq_chandle.defer = svc_defer;if (serv->sv_stats)
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 11/13 SUNRPC: Support IPv6 addresses in svc_tcp_accept
In reply to Chuck LeverModify svc_tcp_accept to support connecting on IPv6 sockets.
---
net/sunrpc/svcsock.c | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-)
net/sunrpc/svcsock.c +5 -6
@@ -947,7 +947,8 @@ #endifstatic void svc_tcp_accept (struct svc_sock *svsk) { -struct sockaddr_in sin; +struct sockaddr_storage addr; +struct sockaddr *sin = (struct sockaddr *) &addr;struct svc_serv *serv = svsk->sk_server;struct socket *sock = svsk->sk_sock;struct socket *newsock;
@@ -974,8 +975,7 @@ svc_tcp_accept(struct svc_sock *svsk)set_bit (SK_CONN , &svsk->sk_flags);svc_sock_enqueue (svsk); - slen =sizeof (sin); - err =kernel_getpeername (newsock, (struct sockaddr *) &sin, &slen); + err =kernel_getpeername (newsock, sin, &slen);if (err <0 ) {if (net_ratelimit ()) printk(KERN_WARNING "%s: peername failed (err %d)!\n",
@@ -987,12 +987,11 @@ svc_tcp_accept(struct svc_sock *svsk)* hosts here, but when we get encryption, the IP of the host won't * tell us anything. For now just warn about unpriv connections. */ -if (!svc_port_is_privileged ((struct sockaddr *) &sin)) { +if (!svc_port_is_privileged (sin)) {dprintk (KERN_WARNING "%s: connect from unprivileged port: %s\n" , serv->sv_name, -__svc_print_addr ((struct sockaddr *) &sin, buf, -sizeof (buf))); +__svc_print_addr (sin, buf,sizeof (buf))); }dprintk ("%s: connect from %s\n" , serv->sv_name, buf);
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 12/13 SUNRPC: support IPv6 addresses in RPC server's UDP receive path
In reply to Chuck LeverAdd support for IPv6 addresses in the RPC server's UDP receive path.
---
include/linux/sunrpc/svc.h | 5 ++++ net/sunrpc/svcsock.c | 55 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 10 deletions(-)
include/linux/sunrpc/svc.h +5 -0
@@ -266,6 +266,11 @@ static inline struct sockaddr_in *svc_adreturn (struct sockaddr_in *) &rqst->rq_addr; } +static inline struct sockaddr_in6 *svc_addr_in6 (struct svc_rqst *rqst) +{ +return (struct sockaddr_in6 *) &rqst->rq_addr; +} +static inline struct sockaddr *svc_addr (struct svc_rqst *rqst) {return (struct sockaddr *) &rqst->rq_addr;
net/sunrpc/svcsock.c +45 -10
74 lines not on this page · raw message
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
PATCH 13/13 SUNRPC: fix up svc_create_socket() to take a sockaddr struct + length
In reply to Chuck LeverReplace existing svc_create_socket() API to allow callers to pass addresses larger than a sockaddr_in.
---
net/sunrpc/svcsock.c | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-)
net/sunrpc/svcsock.c +7 -8
@@ -1678,7 +1678,7 @@ EXPORT_SYMBOL_GPL(svc_addsock);* Create socket for RPC service. */ static int svc_create_socket (struct svc_serv *serv,int protocol, -struct sockaddr_in *sin,int flags) +struct sockaddr *sin,int len,int flags) {struct svc_sock *svsk;struct socket *sock;
@@ -1688,8 +1688,7 @@ static int svc_create_socket(struct svc_dprintk ("svc: svc_create_socket(%s, %d, %s)\n" , serv->sv_program->pg_name, protocol, -__svc_print_addr ((struct sockaddr *) sin, buf, -sizeof (buf))); +__svc_print_addr (sin, buf,sizeof (buf)));if (protocol !=IPPROTO_UDP && protocol !=IPPROTO_TCP ) { printk(KERN_WARNING "svc: only UDP and TCP "
@@ -1698,15 +1697,14 @@ static int svc_create_socket(struct svc_ } type = (protocol ==IPPROTO_UDP )?SOCK_DGRAM :SOCK_STREAM ; -if ((error =sock_create_kern (PF_INET , type, protocol, &sock)) <0 ) +if ((error =sock_create_kern (sin->sa_family, type, protocol, &sock)) <0 )return error;svc_reclassify_socket (sock);if (type ==SOCK_STREAM ) - sock->sk->sk_reuse =1 ;/* allow address reuse */ - error =kernel_bind (sock, (struct sockaddr *) sin, -sizeof (*sin)); + sock->sk->sk_reuse =1 ;/* allow address reuse */ + error =kernel_bind (sock, sin, len);if (error <0 ) goto bummer;
@@ -1784,7 +1782,8 @@ int svc_makesock(struct svc_serv *serv, };dprintk ("svc: creating socket proto = %d\n" , protocol); -return svc_create_socket (serv, protocol, &sin, flags); +return svc_create_socket (serv, protocol, (struct sockaddr *) &sin, +sizeof (sin), flags); }/*
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
Quoted 5 lines · On Thursday January 18, [email protected] wrote:
Hi Neil-
Please consider these patches for 2.6.21. They can replace the similar patch set that is currently included in Andrew's kernel. These patches address a few minor bugs, and may fix a problem that Andrew is currently seeing.
Thanks Chuck, and sorry for the delay in getting to then.
Once patches are in Andrew's tree it is really a lot easier to get incremental patches rather than replacements. For one thing it makes review much easier.
I couldn't find anything significant in the first 6 patches of what is in -mm, so I am ignoring them. If there is something I missed, please tell me or send an incremental patch.
The remaining 7 (7..13) look fine.
I noticed you replacing
struct sockaddr_in *sin
with
struct sockaddr *sin
a couple of times and wondered if the name should change with the type (as 'sin' is really an abbreviation of sockaddr_in). But figured it is probably fine as it is.
I'll send them off to Andrew shortly.
How much further do we need to go until kernel-side support for an IPv6 NFS server is all there? I'm guessing there are not a lot more placed that need fixing, but some of them might be big fixes ??
Thanks,
NeilBrown
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs