svc_xprt.h 4.8 KB
Newer Older
T
Tom Tucker 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * linux/include/linux/sunrpc/svc_xprt.h
 *
 * RPC server transport I/O
 */

#ifndef SUNRPC_SVC_XPRT_H
#define SUNRPC_SVC_XPRT_H

#include <linux/sunrpc/svc.h>
T
Tom Tucker 已提交
11
#include <linux/module.h>
T
Tom Tucker 已提交
12 13

struct svc_xprt_ops {
14 15 16
	struct svc_xprt	*(*xpo_create)(struct svc_serv *,
				       struct sockaddr *, int,
				       int);
17
	struct svc_xprt	*(*xpo_accept)(struct svc_xprt *);
18
	int		(*xpo_has_wspace)(struct svc_xprt *);
19
	int		(*xpo_recvfrom)(struct svc_rqst *);
T
Tom Tucker 已提交
20
	void		(*xpo_prep_reply_hdr)(struct svc_rqst *);
21
	int		(*xpo_sendto)(struct svc_rqst *);
22
	void		(*xpo_release_rqst)(struct svc_rqst *);
23 24
	void		(*xpo_detach)(struct svc_xprt *);
	void		(*xpo_free)(struct svc_xprt *);
T
Tom Tucker 已提交
25 26 27 28 29 30 31
};

struct svc_xprt_class {
	const char		*xcl_name;
	struct module		*xcl_owner;
	struct svc_xprt_ops	*xcl_ops;
	struct list_head	xcl_list;
32
	u32			xcl_max_payload;
T
Tom Tucker 已提交
33 34 35 36 37
};

struct svc_xprt {
	struct svc_xprt_class	*xpt_class;
	struct svc_xprt_ops	*xpt_ops;
T
Tom Tucker 已提交
38
	struct kref		xpt_ref;
39 40
	struct list_head	xpt_list;
	struct list_head	xpt_ready;
41 42 43 44 45 46 47 48 49 50 51 52
	unsigned long		xpt_flags;
#define	XPT_BUSY	0		/* enqueued/receiving */
#define	XPT_CONN	1		/* conn pending */
#define	XPT_CLOSE	2		/* dead or dying */
#define	XPT_DATA	3		/* data pending */
#define	XPT_TEMP	4		/* connected transport */
#define	XPT_DEAD	6		/* transport closed */
#define	XPT_CHNGBUF	7		/* need to change snd/rcv buf sizes */
#define	XPT_DEFERRED	8		/* deferred request pending */
#define	XPT_OLD		9		/* used for xprt aging mark+sweep */
#define	XPT_DETACHED	10		/* detached from tempsocks list */
#define XPT_LISTENER	11		/* listening endpoint */
53
#define XPT_CACHE_AUTH	12		/* cache auth info */
54 55 56

	struct svc_pool		*xpt_pool;	/* current pool iff queued */
	struct svc_serv		*xpt_server;	/* service for transport */
T
Tom Tucker 已提交
57
	atomic_t    	    	xpt_reserved;	/* space on outq that is rsvd */
58
	struct mutex		xpt_mutex;	/* to serialize sending data */
59 60 61
	spinlock_t		xpt_lock;	/* protects sk_deferred
						 * and xpt_auth_cache */
	void			*xpt_auth_cache;/* auth cache */
62 63
	struct list_head	xpt_deferred;	/* deferred requests that need
						 * to be revisted */
64 65 66 67
	struct sockaddr_storage	xpt_local;	/* local address */
	size_t			xpt_locallen;	/* length of address */
	struct sockaddr_storage	xpt_remote;	/* remote peer's address */
	size_t			xpt_remotelen;	/* length of address */
T
Tom Tucker 已提交
68 69 70 71
};

int	svc_reg_xprt_class(struct svc_xprt_class *);
void	svc_unreg_xprt_class(struct svc_xprt_class *);
72 73
void	svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *,
		      struct svc_serv *);
74
int	svc_create_xprt(struct svc_serv *, char *, unsigned short, int);
75
void	svc_xprt_enqueue(struct svc_xprt *xprt);
76
void	svc_xprt_received(struct svc_xprt *);
T
Tom Tucker 已提交
77
void	svc_xprt_put(struct svc_xprt *xprt);
78
void	svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt);
79 80 81
void	svc_close_xprt(struct svc_xprt *xprt);
void	svc_delete_xprt(struct svc_xprt *xprt);
int	svc_port_is_privileged(struct sockaddr *sin);
82
int	svc_print_xprts(char *buf, int maxlen);
83
struct	svc_xprt *svc_find_xprt(struct svc_serv *, char *, int, int);
84
int	svc_xprt_names(struct svc_serv *serv, char *buf, int buflen);
85

T
Tom Tucker 已提交
86 87 88 89
static inline void svc_xprt_get(struct svc_xprt *xprt)
{
	kref_get(&xprt->xpt_ref);
}
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
static inline void svc_xprt_set_local(struct svc_xprt *xprt,
				      struct sockaddr *sa, int salen)
{
	memcpy(&xprt->xpt_local, sa, salen);
	xprt->xpt_locallen = salen;
}
static inline void svc_xprt_set_remote(struct svc_xprt *xprt,
				       struct sockaddr *sa, int salen)
{
	memcpy(&xprt->xpt_remote, sa, salen);
	xprt->xpt_remotelen = salen;
}
static inline unsigned short svc_addr_port(struct sockaddr *sa)
{
	unsigned short ret = 0;
	switch (sa->sa_family) {
	case AF_INET:
		ret = ntohs(((struct sockaddr_in *)sa)->sin_port);
		break;
	case AF_INET6:
		ret = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
		break;
	}
	return ret;
}

static inline size_t svc_addr_len(struct sockaddr *sa)
{
	switch (sa->sa_family) {
	case AF_INET:
		return sizeof(struct sockaddr_in);
	case AF_INET6:
		return sizeof(struct sockaddr_in6);
	}
	return -EAFNOSUPPORT;
}

static inline unsigned short svc_xprt_local_port(struct svc_xprt *xprt)
{
	return svc_addr_port((struct sockaddr *)&xprt->xpt_local);
}

static inline unsigned short svc_xprt_remote_port(struct svc_xprt *xprt)
{
	return svc_addr_port((struct sockaddr *)&xprt->xpt_remote);
}
T
Tom Tucker 已提交
136

137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
static inline char *__svc_print_addr(struct sockaddr *addr,
				     char *buf, size_t len)
{
	switch (addr->sa_family) {
	case AF_INET:
		snprintf(buf, len, "%u.%u.%u.%u, port=%u",
			NIPQUAD(((struct sockaddr_in *) addr)->sin_addr),
			ntohs(((struct sockaddr_in *) addr)->sin_port));
		break;

	case AF_INET6:
		snprintf(buf, len, "%x:%x:%x:%x:%x:%x:%x:%x, port=%u",
			NIP6(((struct sockaddr_in6 *) addr)->sin6_addr),
			ntohs(((struct sockaddr_in6 *) addr)->sin6_port));
		break;

	default:
		snprintf(buf, len, "unknown address type: %d", addr->sa_family);
		break;
	}
	return buf;
}
T
Tom Tucker 已提交
159
#endif /* SUNRPC_SVC_XPRT_H */