Blame view
include/linux/sunrpc/xprt.h
11.8 KB
1da177e4c
|
1 |
/* |
55aa4f58a
|
2 |
* linux/include/linux/sunrpc/xprt.h |
1da177e4c
|
3 4 5 6 7 8 9 10 11 12 13 14 |
* * Declarations for the RPC transport interface. * * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> */ #ifndef _LINUX_SUNRPC_XPRT_H #define _LINUX_SUNRPC_XPRT_H #include <linux/uio.h> #include <linux/socket.h> #include <linux/in.h> |
ff8399709
|
15 |
#include <linux/ktime.h> |
1da177e4c
|
16 17 |
#include <linux/sunrpc/sched.h> #include <linux/sunrpc/xdr.h> |
7adae489f
|
18 |
#include <linux/sunrpc/msg_prot.h> |
1da177e4c
|
19 |
|
96802a095
|
20 |
#ifdef __KERNEL__ |
1da177e4c
|
21 22 23 |
#define RPC_MIN_SLOT_TABLE (2U) #define RPC_DEF_SLOT_TABLE (16U) #define RPC_MAX_SLOT_TABLE (128U) |
d9ba131d8
|
24 |
#define RPC_MAX_SLOT_TABLE_LIMIT (65536U) |
1da177e4c
|
25 |
|
a246b0105
|
26 |
/* |
1da177e4c
|
27 28 29 30 31 32 33 34 35 |
* This describes a timeout strategy */ struct rpc_timeout { unsigned long to_initval, /* initial timeout */ to_maxval, /* max timeout */ to_increment; /* if !exponential */ unsigned int to_retries; /* max # of retries */ unsigned char to_exponential; }; |
edb267a68
|
36 37 38 39 |
enum rpc_display_format_t { RPC_DISPLAY_ADDR = 0, RPC_DISPLAY_PORT, RPC_DISPLAY_PROTO, |
fbfe3cc67
|
40 41 |
RPC_DISPLAY_HEX_ADDR, RPC_DISPLAY_HEX_PORT, |
4417c8c41
|
42 |
RPC_DISPLAY_NETID, |
edb267a68
|
43 44 |
RPC_DISPLAY_MAX, }; |
529b33c6d
|
45 46 |
struct rpc_task; struct rpc_xprt; |
e99170ff3
|
47 |
struct seq_file; |
529b33c6d
|
48 |
|
1da177e4c
|
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/* * This describes a complete RPC request */ struct rpc_rqst { /* * This is the user-visible part */ struct rpc_xprt * rq_xprt; /* RPC client */ struct xdr_buf rq_snd_buf; /* send buffer */ struct xdr_buf rq_rcv_buf; /* recv buffer */ /* * This is the private part */ struct rpc_task * rq_task; /* RPC task data */ |
a17c2153d
|
64 |
struct rpc_cred * rq_cred; /* Bound cred */ |
d8ed029d6
|
65 |
__be32 rq_xid; /* request XID */ |
1da177e4c
|
66 |
int rq_cong; /* has incremented xprt->cong */ |
1da177e4c
|
67 |
u32 rq_seqno; /* gss seq no. used on req. */ |
ead5e1c26
|
68 69 70 71 |
int rq_enc_pages_num; struct page **rq_enc_pages; /* scratch pages for use by gss privacy code */ void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */ |
1da177e4c
|
72 |
struct list_head rq_list; |
021071483
|
73 |
__u32 * rq_buffer; /* XDR encode buffer */ |
c977a2ef4
|
74 |
size_t rq_callsize, |
2bea90d43
|
75 |
rq_rcvsize; |
d60dbb20a
|
76 77 78 |
size_t rq_xmit_bytes_sent; /* total bytes sent */ size_t rq_reply_bytes_recvd; /* total reply bytes */ /* received */ |
021071483
|
79 |
|
1da177e4c
|
80 81 82 83 84 |
struct xdr_buf rq_private_buf; /* The receive buffer * used in the softirq. */ unsigned long rq_majortimeo; /* major timeout alarm */ unsigned long rq_timeout; /* Current timeout value */ |
d60dbb20a
|
85 |
ktime_t rq_rtt; /* round-trip time */ |
1da177e4c
|
86 |
unsigned int rq_retries; /* # of retries */ |
7c1d71cf5
|
87 88 89 90 |
unsigned int rq_connect_cookie; /* A cookie used to track the state of the transport connection */ |
1da177e4c
|
91 92 93 94 |
/* * Partial send handling */ |
1da177e4c
|
95 |
u32 rq_bytes_sent; /* Bytes we have sent */ |
ff8399709
|
96 |
ktime_t rq_xtime; /* transmit time stamp */ |
1da177e4c
|
97 |
int rq_ntrans; |
56632b5bf
|
98 |
|
9e00abc3c
|
99 |
#if defined(CONFIG_SUNRPC_BACKCHANNEL) |
56632b5bf
|
100 101 102 |
struct list_head rq_bc_list; /* Callback service list */ unsigned long rq_bc_pa_state; /* Backchannel prealloc state */ struct list_head rq_bc_pa_list; /* Backchannel prealloc list */ |
9e00abc3c
|
103 |
#endif /* CONFIG_SUNRPC_BACKCHANEL */ |
1da177e4c
|
104 105 106 |
}; #define rq_svec rq_snd_buf.head #define rq_slen rq_snd_buf.len |
a246b0105
|
107 |
struct rpc_xprt_ops { |
470056c28
|
108 |
void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); |
43cedbf0e
|
109 |
int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
49e9a8908
|
110 |
void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
bbf7c1dd2
|
111 |
void (*rpcbind)(struct rpc_task *task); |
922004120
|
112 |
void (*set_port)(struct rpc_xprt *xprt, unsigned short port); |
a246b0105
|
113 |
void (*connect)(struct rpc_task *task); |
021071483
|
114 |
void * (*buf_alloc)(struct rpc_task *task, size_t size); |
c5a4dd8b7
|
115 |
void (*buf_free)(void *buffer); |
a246b0105
|
116 |
int (*send_request)(struct rpc_task *task); |
fe3aca290
|
117 |
void (*set_retrans_timeout)(struct rpc_task *task); |
46c0ee8bc
|
118 |
void (*timer)(struct rpc_task *task); |
a58dd398f
|
119 |
void (*release_request)(struct rpc_task *task); |
a246b0105
|
120 121 |
void (*close)(struct rpc_xprt *xprt); void (*destroy)(struct rpc_xprt *xprt); |
262ca07de
|
122 |
void (*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); |
a246b0105
|
123 |
}; |
1da177e4c
|
124 |
|
f300baba5
|
125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
/* * RPC transport identifiers * * To preserve compatibility with the historical use of raw IP protocol * id's for transport selection, UDP and TCP identifiers are specified * with the previous values. No such restriction exists for new transports, * except that they may not collide with these values (17 and 6, * respectively). */ #define XPRT_TRANSPORT_BC (1 << 31) enum xprt_transports { XPRT_TRANSPORT_UDP = IPPROTO_UDP, XPRT_TRANSPORT_TCP = IPPROTO_TCP, XPRT_TRANSPORT_BC_TCP = IPPROTO_TCP | XPRT_TRANSPORT_BC, |
176e21ee2
|
139 140 |
XPRT_TRANSPORT_RDMA = 256, XPRT_TRANSPORT_LOCAL = 257, |
f300baba5
|
141 |
}; |
1da177e4c
|
142 |
struct rpc_xprt { |
a8de240a9
|
143 |
atomic_t count; /* Reference count */ |
a246b0105
|
144 |
struct rpc_xprt_ops * ops; /* transport methods */ |
1da177e4c
|
145 |
|
ba7392bb3
|
146 |
const struct rpc_timeout *timeout; /* timeout parms */ |
c4efcb1d3
|
147 148 |
struct sockaddr_storage addr; /* server address */ size_t addrlen; /* size of server address */ |
1da177e4c
|
149 150 151 152 |
int prot; /* IP protocol */ unsigned long cong; /* current congestion */ unsigned long cwnd; /* congestion window */ |
1da177e4c
|
153 154 |
size_t max_payload; /* largest RPC payload size, in bytes */ |
808012fbb
|
155 156 |
unsigned int tsh_size; /* size of transport specific header */ |
1da177e4c
|
157 |
|
4a68179d3
|
158 |
struct rpc_wait_queue binding; /* requests waiting on rpcbind */ |
1da177e4c
|
159 |
struct rpc_wait_queue sending; /* requests waiting to send */ |
1da177e4c
|
160 161 162 |
struct rpc_wait_queue pending; /* requests in flight */ struct rpc_wait_queue backlog; /* waiting for slot */ struct list_head free; /* free slots */ |
d9ba131d8
|
163 164 165 |
unsigned int max_reqs; /* max number of slots */ unsigned int min_reqs; /* min number of slots */ atomic_t num_reqs; /* total slots */ |
2226feb6b
|
166 |
unsigned long state; /* transport state */ |
1da177e4c
|
167 |
unsigned char shutdown : 1, /* being shut down */ |
43118c29d
|
168 |
resvport : 1; /* use a reserved port */ |
a509050bd
|
169 |
unsigned int bind_index; /* bind function index */ |
1da177e4c
|
170 171 |
/* |
55aa4f58a
|
172 |
* Connection of transports |
1da177e4c
|
173 |
*/ |
a8ce4a8f3
|
174 |
unsigned long bind_timeout, |
03bf4b707
|
175 |
reestablish_timeout; |
7c1d71cf5
|
176 177 178 |
unsigned int connect_cookie; /* A cookie that gets bumped every time the transport is reconnected */ |
03bf4b707
|
179 |
|
1da177e4c
|
180 |
/* |
55aa4f58a
|
181 |
* Disconnection of idle transports |
1da177e4c
|
182 183 184 |
*/ struct work_struct task_cleanup; struct timer_list timer; |
03bf4b707
|
185 186 |
unsigned long last_used, idle_timeout; |
1da177e4c
|
187 188 189 190 |
/* * Send stuff */ |
4a0f8c04f
|
191 |
spinlock_t transport_lock; /* lock transport info */ |
5dc07727f
|
192 |
spinlock_t reserve_lock; /* lock slot table */ |
e744cf2e3
|
193 |
u32 xid; /* Next XID value to use */ |
1da177e4c
|
194 |
struct rpc_task * snd_task; /* Task blocked in send */ |
4cfc7e601
|
195 |
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */ |
9e00abc3c
|
196 |
#if defined(CONFIG_SUNRPC_BACKCHANNEL) |
56632b5bf
|
197 198 |
struct svc_serv *bc_serv; /* The RPC service which will */ /* process the callback */ |
fb7a0b9ad
|
199 |
unsigned int bc_alloc_count; /* Total number of preallocs */ |
56632b5bf
|
200 201 202 203 |
spinlock_t bc_pa_lock; /* Protects the preallocated * items */ struct list_head bc_pa_list; /* List of preallocated * backchannel rpc_rqst's */ |
9e00abc3c
|
204 |
#endif /* CONFIG_SUNRPC_BACKCHANNEL */ |
1da177e4c
|
205 |
struct list_head recv; |
262ca07de
|
206 207 208 209 210 211 212 213 214 215 216 217 |
struct { unsigned long bind_count, /* total number of binds */ connect_count, /* total number of connects */ connect_start, /* connect start timestamp */ connect_time, /* jiffies waiting for connect */ sends, /* how many complete requests */ recvs, /* how many complete requests */ bad_xids; /* lookup_rqst didn't find XID */ unsigned long long req_u, /* average requests on the wire */ bklog_u; /* backlog queue utilization */ } stat; |
1da177e4c
|
218 |
|
37aa21337
|
219 |
struct net *xprt_net; |
b454ae906
|
220 |
const char *address_strings[RPC_DISPLAY_MAX]; |
1da177e4c
|
221 |
}; |
9e00abc3c
|
222 |
#if defined(CONFIG_SUNRPC_BACKCHANNEL) |
56632b5bf
|
223 224 225 226 227 |
/* * Backchannel flags */ #define RPC_BC_PA_IN_USE 0x0001 /* Preallocated backchannel */ /* buffer in use */ |
9e00abc3c
|
228 |
#endif /* CONFIG_SUNRPC_BACKCHANNEL */ |
56632b5bf
|
229 |
|
9e00abc3c
|
230 |
#if defined(CONFIG_SUNRPC_BACKCHANNEL) |
55ae1aabf
|
231 232 233 234 235 236 237 238 239 |
static inline int bc_prealloc(struct rpc_rqst *req) { return test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); } #else static inline int bc_prealloc(struct rpc_rqst *req) { return 0; } |
9e00abc3c
|
240 |
#endif /* CONFIG_SUNRPC_BACKCHANNEL */ |
55ae1aabf
|
241 |
|
3c341b0b9
|
242 |
struct xprt_create { |
4fa016eb2
|
243 |
int ident; /* XPRT_TRANSPORT identifier */ |
9a23e332e
|
244 |
struct net * net; |
d3bc9a1de
|
245 |
struct sockaddr * srcaddr; /* optional local address */ |
96802a095
|
246 247 |
struct sockaddr * dstaddr; /* remote peer address */ size_t addrlen; |
f300baba5
|
248 |
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */ |
96802a095
|
249 |
}; |
1da177e4c
|
250 |
|
81c098af3
|
251 252 |
struct xprt_class { struct list_head list; |
4fa016eb2
|
253 |
int ident; /* XPRT_TRANSPORT identifier */ |
3c341b0b9
|
254 |
struct rpc_xprt * (*setup)(struct xprt_create *); |
81c098af3
|
255 256 257 |
struct module *owner; char name[32]; }; |
55aa4f58a
|
258 |
/* |
55aa4f58a
|
259 260 |
* Generic internal transport functions */ |
3c341b0b9
|
261 |
struct rpc_xprt *xprt_create_transport(struct xprt_create *args); |
55aa4f58a
|
262 263 |
void xprt_connect(struct rpc_task *task); void xprt_reserve(struct rpc_task *task); |
43cedbf0e
|
264 265 |
int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
55aa4f58a
|
266 267 |
int xprt_prepare_transmit(struct rpc_task *task); void xprt_transmit(struct rpc_task *task); |
e0ab53dea
|
268 |
void xprt_end_transmit(struct rpc_task *task); |
1da177e4c
|
269 |
int xprt_adjust_timeout(struct rpc_rqst *req); |
49e9a8908
|
270 271 |
void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
55aa4f58a
|
272 |
void xprt_release(struct rpc_task *task); |
6b6ca86b7
|
273 274 |
struct rpc_xprt * xprt_get(struct rpc_xprt *xprt); void xprt_put(struct rpc_xprt *xprt); |
d9ba131d8
|
275 276 277 |
struct rpc_xprt * xprt_alloc(struct net *net, size_t size, unsigned int num_prealloc, unsigned int max_req); |
e204e621b
|
278 |
void xprt_free(struct rpc_xprt *); |
55aa4f58a
|
279 |
|
d8ed029d6
|
280 |
static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) |
808012fbb
|
281 282 283 |
{ return p + xprt->tsh_size; } |
55aa4f58a
|
284 285 286 |
/* * Transport switch helper functions */ |
81c098af3
|
287 288 |
int xprt_register_transport(struct xprt_class *type); int xprt_unregister_transport(struct xprt_class *type); |
441e3e242
|
289 |
int xprt_load_transport(const char *); |
fe3aca290
|
290 291 |
void xprt_set_retrans_timeout_def(struct rpc_task *task); void xprt_set_retrans_timeout_rtt(struct rpc_task *task); |
55aa4f58a
|
292 |
void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status); |
b6ddf64ff
|
293 |
void xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action); |
c7b2cae8a
|
294 |
void xprt_write_space(struct rpc_xprt *xprt); |
46c0ee8bc
|
295 |
void xprt_adjust_cwnd(struct rpc_task *task, int result); |
d8ed029d6
|
296 |
struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid); |
1570c1e41
|
297 |
void xprt_complete_rqst(struct rpc_task *task, int copied); |
a58dd398f
|
298 |
void xprt_release_rqst_cong(struct rpc_task *task); |
62da3b248
|
299 |
void xprt_disconnect_done(struct rpc_xprt *xprt); |
66af1e558
|
300 |
void xprt_force_disconnect(struct rpc_xprt *xprt); |
7c1d71cf5
|
301 |
void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie); |
55aa4f58a
|
302 303 |
/* |
2226feb6b
|
304 305 306 307 308 |
* Reserved bit positions in xprt->state */ #define XPRT_LOCKED (0) #define XPRT_CONNECTED (1) #define XPRT_CONNECTING (2) |
632e3bdc5
|
309 |
#define XPRT_CLOSE_WAIT (3) |
ec739ef03
|
310 |
#define XPRT_BOUND (4) |
4a68179d3
|
311 |
#define XPRT_BINDING (5) |
3b948ae5b
|
312 |
#define XPRT_CLOSING (6) |
7d1e8255c
|
313 |
#define XPRT_CONNECTION_ABORT (7) |
f75e6745a
|
314 |
#define XPRT_CONNECTION_CLOSE (8) |
2226feb6b
|
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 |
static inline void xprt_set_connected(struct rpc_xprt *xprt) { set_bit(XPRT_CONNECTED, &xprt->state); } static inline void xprt_clear_connected(struct rpc_xprt *xprt) { clear_bit(XPRT_CONNECTED, &xprt->state); } static inline int xprt_connected(struct rpc_xprt *xprt) { return test_bit(XPRT_CONNECTED, &xprt->state); } static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt) { return test_and_set_bit(XPRT_CONNECTED, &xprt->state); } static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt) { return test_and_clear_bit(XPRT_CONNECTED, &xprt->state); } static inline void xprt_clear_connecting(struct rpc_xprt *xprt) { smp_mb__before_clear_bit(); clear_bit(XPRT_CONNECTING, &xprt->state); smp_mb__after_clear_bit(); } static inline int xprt_connecting(struct rpc_xprt *xprt) { return test_bit(XPRT_CONNECTING, &xprt->state); } static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt) { return test_and_set_bit(XPRT_CONNECTING, &xprt->state); } |
1da177e4c
|
357 |
|
ec739ef03
|
358 359 360 361 362 363 364 365 366 367 368 369 370 371 |
static inline void xprt_set_bound(struct rpc_xprt *xprt) { test_and_set_bit(XPRT_BOUND, &xprt->state); } static inline int xprt_bound(struct rpc_xprt *xprt) { return test_bit(XPRT_BOUND, &xprt->state); } static inline void xprt_clear_bound(struct rpc_xprt *xprt) { clear_bit(XPRT_BOUND, &xprt->state); } |
4a68179d3
|
372 373 374 375 376 377 378 379 380 381 382 |
static inline void xprt_clear_binding(struct rpc_xprt *xprt) { smp_mb__before_clear_bit(); clear_bit(XPRT_BINDING, &xprt->state); smp_mb__after_clear_bit(); } static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt) { return test_and_set_bit(XPRT_BINDING, &xprt->state); } |
1da177e4c
|
383 384 385 |
#endif /* __KERNEL__*/ #endif /* _LINUX_SUNRPC_XPRT_H */ |