]> git.karo-electronics.de Git - linux-beck.git/blob - include/linux/sunrpc/xprt.h
dcf0326bda01e932d8d5f52b2589519482a7951b
[linux-beck.git] / include / linux / sunrpc / xprt.h
1 /*
2  *  linux/include/linux/sunrpc/xprt.h
3  *
4  *  Declarations for the RPC transport interface.
5  *
6  *  Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
7  */
8
9 #ifndef _LINUX_SUNRPC_XPRT_H
10 #define _LINUX_SUNRPC_XPRT_H
11
12 #include <linux/uio.h>
13 #include <linux/socket.h>
14 #include <linux/in.h>
15 #include <linux/sunrpc/sched.h>
16 #include <linux/sunrpc/xdr.h>
17
18 extern unsigned int xprt_udp_slot_table_entries;
19 extern unsigned int xprt_tcp_slot_table_entries;
20
21 #define RPC_MIN_SLOT_TABLE      (2U)
22 #define RPC_DEF_SLOT_TABLE      (16U)
23 #define RPC_MAX_SLOT_TABLE      (128U)
24
25 /* Default timeout values */
26 #define RPC_MAX_UDP_TIMEOUT     (60*HZ)
27 #define RPC_MAX_TCP_TIMEOUT     (600*HZ)
28
29 /*
30  * Wait duration for an RPC TCP connection to be established.  Solaris
31  * NFS over TCP uses 60 seconds, for example, which is in line with how
32  * long a server takes to reboot.
33  */
34 #define RPC_CONNECT_TIMEOUT     (60*HZ)
35
36 /*
37  * Delay an arbitrary number of seconds before attempting to reconnect
38  * after an error.
39  */
40 #define RPC_REESTABLISH_TIMEOUT (15*HZ)
41
42 /*
43  * RPC transport idle timeout.
44  */
45 #define RPC_IDLE_DISCONNECT_TIMEOUT     (5*60*HZ)
46
47 /*
48  * RPC call and reply header size as number of 32bit words (verifier
49  * size computed separately)
50  */
51 #define RPC_CALLHDRSIZE         6
52 #define RPC_REPHDRSIZE          4
53
54 /*
55  * This describes a timeout strategy
56  */
57 struct rpc_timeout {
58         unsigned long           to_initval,             /* initial timeout */
59                                 to_maxval,              /* max timeout */
60                                 to_increment;           /* if !exponential */
61         unsigned int            to_retries;             /* max # of retries */
62         unsigned char           to_exponential;
63 };
64
65 /*
66  * This describes a complete RPC request
67  */
68 struct rpc_rqst {
69         /*
70          * This is the user-visible part
71          */
72         struct rpc_xprt *       rq_xprt;                /* RPC client */
73         struct xdr_buf          rq_snd_buf;             /* send buffer */
74         struct xdr_buf          rq_rcv_buf;             /* recv buffer */
75
76         /*
77          * This is the private part
78          */
79         struct rpc_task *       rq_task;        /* RPC task data */
80         __u32                   rq_xid;         /* request XID */
81         int                     rq_cong;        /* has incremented xprt->cong */
82         int                     rq_received;    /* receive completed */
83         u32                     rq_seqno;       /* gss seq no. used on req. */
84
85         struct list_head        rq_list;
86
87         struct xdr_buf          rq_private_buf;         /* The receive buffer
88                                                          * used in the softirq.
89                                                          */
90         unsigned long           rq_majortimeo;  /* major timeout alarm */
91         unsigned long           rq_timeout;     /* Current timeout value */
92         unsigned int            rq_retries;     /* # of retries */
93         /*
94          * For authentication (e.g. auth_des)
95          */
96         u32                     rq_creddata[2];
97         
98         /*
99          * Partial send handling
100          */
101         
102         u32                     rq_bytes_sent;  /* Bytes we have sent */
103
104         unsigned long           rq_xtime;       /* when transmitted */
105         int                     rq_ntrans;
106 };
107 #define rq_svec                 rq_snd_buf.head
108 #define rq_slen                 rq_snd_buf.len
109
110 struct rpc_task;
111 struct rpc_xprt;
112
113 struct rpc_xprt_ops {
114         void            (*set_buffer_size)(struct rpc_xprt *xprt);
115         int             (*reserve_xprt)(struct rpc_task *task);
116         void            (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
117         void            (*connect)(struct rpc_task *task);
118         int             (*send_request)(struct rpc_task *task);
119         void            (*set_retrans_timeout)(struct rpc_task *task);
120         void            (*timer)(struct rpc_task *task);
121         void            (*release_request)(struct rpc_task *task);
122         void            (*close)(struct rpc_xprt *xprt);
123         void            (*destroy)(struct rpc_xprt *xprt);
124 };
125
126 struct rpc_xprt {
127         struct rpc_xprt_ops *   ops;            /* transport methods */
128         struct socket *         sock;           /* BSD socket layer */
129         struct sock *           inet;           /* INET layer */
130
131         struct rpc_timeout      timeout;        /* timeout parms */
132         struct sockaddr_in      addr;           /* server address */
133         int                     prot;           /* IP protocol */
134
135         unsigned long           cong;           /* current congestion */
136         unsigned long           cwnd;           /* congestion window */
137
138         unsigned int            rcvsize,        /* transport rcv buffer size */
139                                 sndsize;        /* transport send buffer size */
140
141         size_t                  max_payload;    /* largest RPC payload size,
142                                                    in bytes */
143         unsigned int            tsh_size;       /* size of transport specific
144                                                    header */
145
146         struct rpc_wait_queue   sending;        /* requests waiting to send */
147         struct rpc_wait_queue   resend;         /* requests waiting to resend */
148         struct rpc_wait_queue   pending;        /* requests in flight */
149         struct rpc_wait_queue   backlog;        /* waiting for slot */
150         struct list_head        free;           /* free slots */
151         struct rpc_rqst *       slot;           /* slot table storage */
152         unsigned int            max_reqs;       /* total slots */
153         unsigned long           state;          /* transport state */
154         unsigned char           shutdown   : 1, /* being shut down */
155                                 resvport   : 1; /* use a reserved port */
156
157         /*
158          * XID
159          */
160         __u32                   xid;            /* Next XID value to use */
161
162         /*
163          * State of TCP reply receive stuff
164          */
165         u32                     tcp_recm,       /* Fragment header */
166                                 tcp_xid,        /* Current XID */
167                                 tcp_reclen,     /* fragment length */
168                                 tcp_offset;     /* fragment offset */
169         unsigned long           tcp_copied,     /* copied to request */
170                                 tcp_flags;
171         /*
172          * Connection of transports
173          */
174         struct work_struct      connect_worker;
175         unsigned short          port;
176         /*
177          * Disconnection of idle transports
178          */
179         struct work_struct      task_cleanup;
180         struct timer_list       timer;
181         unsigned long           last_used;
182
183         /*
184          * Send stuff
185          */
186         spinlock_t              transport_lock; /* lock transport info */
187         spinlock_t              reserve_lock;   /* lock slot table */
188         struct rpc_task *       snd_task;       /* Task blocked in send */
189
190         struct list_head        recv;
191
192
193         void                    (*old_data_ready)(struct sock *, int);
194         void                    (*old_state_change)(struct sock *);
195         void                    (*old_write_space)(struct sock *);
196 };
197
198 #define XPRT_LAST_FRAG          (1 << 0)
199 #define XPRT_COPY_RECM          (1 << 1)
200 #define XPRT_COPY_XID           (1 << 2)
201 #define XPRT_COPY_DATA          (1 << 3)
202
203 #ifdef __KERNEL__
204
205 /*
206  * Transport operations used by ULPs
207  */
208 struct rpc_xprt *       xprt_create_proto(int proto, struct sockaddr_in *addr, struct rpc_timeout *to);
209 void                    xprt_set_timeout(struct rpc_timeout *to, unsigned int retr, unsigned long incr);
210
211 /*
212  * Generic internal transport functions
213  */
214 void                    xprt_connect(struct rpc_task *task);
215 void                    xprt_reserve(struct rpc_task *task);
216 int                     xprt_reserve_xprt(struct rpc_task *task);
217 int                     xprt_reserve_xprt_cong(struct rpc_task *task);
218 int                     xprt_prepare_transmit(struct rpc_task *task);
219 void                    xprt_transmit(struct rpc_task *task);
220 int                     xprt_adjust_timeout(struct rpc_rqst *req);
221 void                    xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
222 void                    xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
223 void                    xprt_release(struct rpc_task *task);
224 int                     xprt_destroy(struct rpc_xprt *xprt);
225
226 static inline u32 *xprt_skip_transport_header(struct rpc_xprt *xprt, u32 *p)
227 {
228         return p + xprt->tsh_size;
229 }
230
231 /*
232  * Transport switch helper functions
233  */
234 void                    xprt_set_retrans_timeout_def(struct rpc_task *task);
235 void                    xprt_set_retrans_timeout_rtt(struct rpc_task *task);
236 void                    xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
237 void                    xprt_wait_for_buffer_space(struct rpc_task *task);
238 void                    xprt_write_space(struct rpc_xprt *xprt);
239 void                    xprt_update_rtt(struct rpc_task *task);
240 void                    xprt_adjust_cwnd(struct rpc_task *task, int result);
241 struct rpc_rqst *       xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid);
242 void                    xprt_complete_rqst(struct rpc_task *task, int copied);
243 void                    xprt_release_rqst_cong(struct rpc_task *task);
244 void                    xprt_disconnect(struct rpc_xprt *xprt);
245
246 /*
247  * Socket transport setup operations
248  */
249 int                     xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to);
250 int                     xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to);
251
252 /*
253  * Reserved bit positions in xprt->state
254  */
255 #define XPRT_LOCKED             (0)
256 #define XPRT_CONNECTED          (1)
257 #define XPRT_CONNECTING         (2)
258
259 static inline void xprt_set_connected(struct rpc_xprt *xprt)
260 {
261         set_bit(XPRT_CONNECTED, &xprt->state);
262 }
263
264 static inline void xprt_clear_connected(struct rpc_xprt *xprt)
265 {
266         clear_bit(XPRT_CONNECTED, &xprt->state);
267 }
268
269 static inline int xprt_connected(struct rpc_xprt *xprt)
270 {
271         return test_bit(XPRT_CONNECTED, &xprt->state);
272 }
273
274 static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt)
275 {
276         return test_and_set_bit(XPRT_CONNECTED, &xprt->state);
277 }
278
279 static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt)
280 {
281         return test_and_clear_bit(XPRT_CONNECTED, &xprt->state);
282 }
283
284 static inline void xprt_clear_connecting(struct rpc_xprt *xprt)
285 {
286         smp_mb__before_clear_bit();
287         clear_bit(XPRT_CONNECTING, &xprt->state);
288         smp_mb__after_clear_bit();
289 }
290
291 static inline int xprt_connecting(struct rpc_xprt *xprt)
292 {
293         return test_bit(XPRT_CONNECTING, &xprt->state);
294 }
295
296 static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt)
297 {
298         return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
299 }
300
301 #endif /* __KERNEL__*/
302
303 #endif /* _LINUX_SUNRPC_XPRT_H */