svc: Make svc_sock the tcp/udp transport

Make TCP and UDP svc_sock transports, and register them
with the svc transport core.

A transport type (svc_sock) has an svc_xprt as its first member,
and calls svc_xprt_init to initialize this field.

Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
Acked-by: Neil Brown <neilb@suse.de>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Greg Banks <gnb@sgi.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
Tom Tucker 2007-12-30 21:07:17 -06:00 committed by J. Bruce Fields
parent 1d8206b97a
commit 360d873864
4 changed files with 38 additions and 3 deletions

View File

@ -20,7 +20,6 @@
#define RPCDBG_BIND 0x0020 #define RPCDBG_BIND 0x0020
#define RPCDBG_SCHED 0x0040 #define RPCDBG_SCHED 0x0040
#define RPCDBG_TRANS 0x0080 #define RPCDBG_TRANS 0x0080
#define RPCDBG_SVCSOCK 0x0100
#define RPCDBG_SVCXPRT 0x0100 #define RPCDBG_SVCXPRT 0x0100
#define RPCDBG_SVCDSP 0x0200 #define RPCDBG_SVCDSP 0x0200
#define RPCDBG_MISC 0x0400 #define RPCDBG_MISC 0x0400

View File

@ -10,11 +10,13 @@
#define SUNRPC_SVCSOCK_H #define SUNRPC_SVCSOCK_H
#include <linux/sunrpc/svc.h> #include <linux/sunrpc/svc.h>
#include <linux/sunrpc/svc_xprt.h>
/* /*
* RPC server socket. * RPC server socket.
*/ */
struct svc_sock { struct svc_sock {
struct svc_xprt sk_xprt;
struct list_head sk_ready; /* list of ready sockets */ struct list_head sk_ready; /* list of ready sockets */
struct list_head sk_list; /* list of all sockets */ struct list_head sk_list; /* list of all sockets */
struct socket * sk_sock; /* berkeley socket layer */ struct socket * sk_sock; /* berkeley socket layer */
@ -78,6 +80,8 @@ int svc_addsock(struct svc_serv *serv,
int fd, int fd,
char *name_return, char *name_return,
int *proto); int *proto);
void svc_init_xprt_sock(void);
void svc_cleanup_xprt_sock(void);
/* /*
* svc_makesock socket characteristics * svc_makesock socket characteristics

View File

@ -85,7 +85,8 @@ init_sunrpc(void)
#endif #endif
cache_register(&ip_map_cache); cache_register(&ip_map_cache);
cache_register(&unix_gid_cache); cache_register(&unix_gid_cache);
init_socket_xprt(); svc_init_xprt_sock(); /* svc sock transport */
init_socket_xprt(); /* clnt sock transport */
rpcauth_init_module(); rpcauth_init_module();
out: out:
return err; return err;
@ -96,6 +97,7 @@ cleanup_sunrpc(void)
{ {
rpcauth_remove_module(); rpcauth_remove_module();
cleanup_socket_xprt(); cleanup_socket_xprt();
svc_cleanup_xprt_sock();
unregister_rpc_pipefs(); unregister_rpc_pipefs();
rpc_destroy_mempool(); rpc_destroy_mempool();
cache_unregister(&ip_map_cache); cache_unregister(&ip_map_cache);

View File

@ -75,7 +75,7 @@
* *
*/ */
#define RPCDBG_FACILITY RPCDBG_SVCSOCK #define RPCDBG_FACILITY RPCDBG_SVCXPRT
static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *, static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *,
@ -900,12 +900,21 @@ svc_udp_sendto(struct svc_rqst *rqstp)
return error; return error;
} }
static struct svc_xprt_ops svc_udp_ops = {
};
static struct svc_xprt_class svc_udp_class = {
.xcl_name = "udp",
.xcl_ops = &svc_udp_ops,
};
static void static void
svc_udp_init(struct svc_sock *svsk) svc_udp_init(struct svc_sock *svsk)
{ {
int one = 1; int one = 1;
mm_segment_t oldfs; mm_segment_t oldfs;
svc_xprt_init(&svc_udp_class, &svsk->sk_xprt);
svsk->sk_sk->sk_data_ready = svc_udp_data_ready; svsk->sk_sk->sk_data_ready = svc_udp_data_ready;
svsk->sk_sk->sk_write_space = svc_write_space; svsk->sk_sk->sk_write_space = svc_write_space;
svsk->sk_recvfrom = svc_udp_recvfrom; svsk->sk_recvfrom = svc_udp_recvfrom;
@ -1344,12 +1353,33 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
return sent; return sent;
} }
static struct svc_xprt_ops svc_tcp_ops = {
};
static struct svc_xprt_class svc_tcp_class = {
.xcl_name = "tcp",
.xcl_ops = &svc_tcp_ops,
};
void svc_init_xprt_sock(void)
{
svc_reg_xprt_class(&svc_tcp_class);
svc_reg_xprt_class(&svc_udp_class);
}
void svc_cleanup_xprt_sock(void)
{
svc_unreg_xprt_class(&svc_tcp_class);
svc_unreg_xprt_class(&svc_udp_class);
}
static void static void
svc_tcp_init(struct svc_sock *svsk) svc_tcp_init(struct svc_sock *svsk)
{ {
struct sock *sk = svsk->sk_sk; struct sock *sk = svsk->sk_sk;
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
svc_xprt_init(&svc_tcp_class, &svsk->sk_xprt);
svsk->sk_recvfrom = svc_tcp_recvfrom; svsk->sk_recvfrom = svc_tcp_recvfrom;
svsk->sk_sendto = svc_tcp_sendto; svsk->sk_sendto = svc_tcp_sendto;