OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [linux/] [sunrpc/] [svc.h] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * linux/include/linux/sunrpc/svc.h
3
 *
4
 * RPC server declarations.
5
 *
6
 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
7
 */
8
 
9
 
10
#ifndef SUNRPC_SVC_H
11
#define SUNRPC_SVC_H
12
 
13
#include <linux/in.h>
14
#include <linux/in6.h>
15
#include <linux/sunrpc/types.h>
16
#include <linux/sunrpc/xdr.h>
17
#include <linux/sunrpc/auth.h>
18
#include <linux/sunrpc/svcauth.h>
19
#include <linux/wait.h>
20
#include <linux/mm.h>
21
 
22
/*
23
 * This is the RPC server thread function prototype
24
 */
25
typedef void            (*svc_thread_fn)(struct svc_rqst *);
26
 
27
/*
28
 *
29
 * RPC service thread pool.
30
 *
31
 * Pool of threads and temporary sockets.  Generally there is only
32
 * a single one of these per RPC service, but on NUMA machines those
33
 * services that can benefit from it (i.e. nfs but not lockd) will
34
 * have one pool per NUMA node.  This optimisation reduces cross-
35
 * node traffic on multi-node NUMA NFS servers.
36
 */
37
struct svc_pool {
38
        unsigned int            sp_id;          /* pool id; also node id on NUMA */
39
        spinlock_t              sp_lock;        /* protects all fields */
40
        struct list_head        sp_threads;     /* idle server threads */
41
        struct list_head        sp_sockets;     /* pending sockets */
42
        unsigned int            sp_nrthreads;   /* # of threads in pool */
43
        struct list_head        sp_all_threads; /* all server threads */
44
} ____cacheline_aligned_in_smp;
45
 
46
/*
47
 * RPC service.
48
 *
49
 * An RPC service is a ``daemon,'' possibly multithreaded, which
50
 * receives and processes incoming RPC messages.
51
 * It has one or more transport sockets associated with it, and maintains
52
 * a list of idle threads waiting for input.
53
 *
54
 * We currently do not support more than one RPC program per daemon.
55
 */
56
struct svc_serv {
57
        struct svc_program *    sv_program;     /* RPC program */
58
        struct svc_stat *       sv_stats;       /* RPC statistics */
59
        spinlock_t              sv_lock;
60
        unsigned int            sv_nrthreads;   /* # of server threads */
61
        unsigned int            sv_max_payload; /* datagram payload size */
62
        unsigned int            sv_max_mesg;    /* max_payload + 1 page for overheads */
63
        unsigned int            sv_xdrsize;     /* XDR buffer size */
64
 
65
        struct list_head        sv_permsocks;   /* all permanent sockets */
66
        struct list_head        sv_tempsocks;   /* all temporary sockets */
67
        int                     sv_tmpcnt;      /* count of temporary sockets */
68
        struct timer_list       sv_temptimer;   /* timer for aging temporary sockets */
69
 
70
        char *                  sv_name;        /* service name */
71
 
72
        unsigned int            sv_nrpools;     /* number of thread pools */
73
        struct svc_pool *       sv_pools;       /* array of thread pools */
74
 
75
        void                    (*sv_shutdown)(struct svc_serv *serv);
76
                                                /* Callback to use when last thread
77
                                                 * exits.
78
                                                 */
79
 
80
        struct module *         sv_module;      /* optional module to count when
81
                                                 * adding threads */
82
        svc_thread_fn           sv_function;    /* main function for threads */
83
        int                     sv_kill_signal; /* signal to kill threads */
84
};
85
 
86
/*
87
 * We use sv_nrthreads as a reference count.  svc_destroy() drops
88
 * this refcount, so we need to bump it up around operations that
89
 * change the number of threads.  Horrible, but there it is.
90
 * Should be called with the BKL held.
91
 */
92
static inline void svc_get(struct svc_serv *serv)
93
{
94
        serv->sv_nrthreads++;
95
}
96
 
97
/*
98
 * Maximum payload size supported by a kernel RPC server.
99
 * This is use to determine the max number of pages nfsd is
100
 * willing to return in a single READ operation.
101
 *
102
 * These happen to all be powers of 2, which is not strictly
103
 * necessary but helps enforce the real limitation, which is
104
 * that they should be multiples of PAGE_CACHE_SIZE.
105
 *
106
 * For UDP transports, a block plus NFS,RPC, and UDP headers
107
 * has to fit into the IP datagram limit of 64K.  The largest
108
 * feasible number for all known page sizes is probably 48K,
109
 * but we choose 32K here.  This is the same as the historical
110
 * Linux limit; someone who cares more about NFS/UDP performance
111
 * can test a larger number.
112
 *
113
 * For TCP transports we have more freedom.  A size of 1MB is
114
 * chosen to match the client limit.  Other OSes are known to
115
 * have larger limits, but those numbers are probably beyond
116
 * the point of diminishing returns.
117
 */
118
#define RPCSVC_MAXPAYLOAD       (1*1024*1024u)
119
#define RPCSVC_MAXPAYLOAD_TCP   RPCSVC_MAXPAYLOAD
120
#define RPCSVC_MAXPAYLOAD_UDP   (32*1024u)
121
 
122
extern u32 svc_max_payload(const struct svc_rqst *rqstp);
123
 
124
/*
125
 * RPC Requsts and replies are stored in one or more pages.
126
 * We maintain an array of pages for each server thread.
127
 * Requests are copied into these pages as they arrive.  Remaining
128
 * pages are available to write the reply into.
129
 *
130
 * Pages are sent using ->sendpage so each server thread needs to
131
 * allocate more to replace those used in sending.  To help keep track
132
 * of these pages we have a receive list where all pages initialy live,
133
 * and a send list where pages are moved to when there are to be part
134
 * of a reply.
135
 *
136
 * We use xdr_buf for holding responses as it fits well with NFS
137
 * read responses (that have a header, and some data pages, and possibly
138
 * a tail) and means we can share some client side routines.
139
 *
140
 * The xdr_buf.head kvec always points to the first page in the rq_*pages
141
 * list.  The xdr_buf.pages pointer points to the second page on that
142
 * list.  xdr_buf.tail points to the end of the first page.
143
 * This assumes that the non-page part of an rpc reply will fit
144
 * in a page - NFSd ensures this.  lockd also has no trouble.
145
 *
146
 * Each request/reply pair can have at most one "payload", plus two pages,
147
 * one for the request, and one for the reply.
148
 * We using ->sendfile to return read data, we might need one extra page
149
 * if the request is not page-aligned.  So add another '1'.
150
 */
151
#define RPCSVC_MAXPAGES         ((RPCSVC_MAXPAYLOAD+PAGE_SIZE-1)/PAGE_SIZE \
152
                                + 2 + 1)
153
 
154
static inline u32 svc_getnl(struct kvec *iov)
155
{
156
        __be32 val, *vp;
157
        vp = iov->iov_base;
158
        val = *vp++;
159
        iov->iov_base = (void*)vp;
160
        iov->iov_len -= sizeof(__be32);
161
        return ntohl(val);
162
}
163
 
164
static inline void svc_putnl(struct kvec *iov, u32 val)
165
{
166
        __be32 *vp = iov->iov_base + iov->iov_len;
167
        *vp = htonl(val);
168
        iov->iov_len += sizeof(__be32);
169
}
170
 
171
static inline __be32 svc_getu32(struct kvec *iov)
172
{
173
        __be32 val, *vp;
174
        vp = iov->iov_base;
175
        val = *vp++;
176
        iov->iov_base = (void*)vp;
177
        iov->iov_len -= sizeof(__be32);
178
        return val;
179
}
180
 
181
static inline void svc_ungetu32(struct kvec *iov)
182
{
183
        __be32 *vp = (__be32 *)iov->iov_base;
184
        iov->iov_base = (void *)(vp - 1);
185
        iov->iov_len += sizeof(*vp);
186
}
187
 
188
static inline void svc_putu32(struct kvec *iov, __be32 val)
189
{
190
        __be32 *vp = iov->iov_base + iov->iov_len;
191
        *vp = val;
192
        iov->iov_len += sizeof(__be32);
193
}
194
 
195
union svc_addr_u {
196
    struct in_addr      addr;
197
    struct in6_addr     addr6;
198
};
199
 
200
/*
201
 * The context of a single thread, including the request currently being
202
 * processed.
203
 */
204
struct svc_rqst {
205
        struct list_head        rq_list;        /* idle list */
206
        struct list_head        rq_all;         /* all threads list */
207
        struct svc_sock *       rq_sock;        /* socket */
208
        struct sockaddr_storage rq_addr;        /* peer address */
209
        size_t                  rq_addrlen;
210
 
211
        struct svc_serv *       rq_server;      /* RPC service definition */
212
        struct svc_pool *       rq_pool;        /* thread pool */
213
        struct svc_procedure *  rq_procinfo;    /* procedure info */
214
        struct auth_ops *       rq_authop;      /* authentication flavour */
215
        u32                     rq_flavor;      /* pseudoflavor */
216
        struct svc_cred         rq_cred;        /* auth info */
217
        struct sk_buff *        rq_skbuff;      /* fast recv inet buffer */
218
        struct svc_deferred_req*rq_deferred;    /* deferred request we are replaying */
219
 
220
        struct xdr_buf          rq_arg;
221
        struct xdr_buf          rq_res;
222
        struct page *           rq_pages[RPCSVC_MAXPAGES];
223
        struct page *           *rq_respages;   /* points into rq_pages */
224
        int                     rq_resused;     /* number of pages used for result */
225
 
226
        struct kvec             rq_vec[RPCSVC_MAXPAGES]; /* generally useful.. */
227
 
228
        __be32                  rq_xid;         /* transmission id */
229
        u32                     rq_prog;        /* program number */
230
        u32                     rq_vers;        /* program version */
231
        u32                     rq_proc;        /* procedure number */
232
        u32                     rq_prot;        /* IP protocol */
233
        unsigned short
234
                                rq_secure  : 1; /* secure port */
235
 
236
        union svc_addr_u        rq_daddr;       /* dest addr of request
237
                                                 *  - reply from here */
238
 
239
        void *                  rq_argp;        /* decoded arguments */
240
        void *                  rq_resp;        /* xdr'd results */
241
        void *                  rq_auth_data;   /* flavor-specific data */
242
 
243
        int                     rq_reserved;    /* space on socket outq
244
                                                 * reserved for this request
245
                                                 */
246
 
247
        struct cache_req        rq_chandle;     /* handle passed to caches for
248
                                                 * request delaying
249
                                                 */
250
        /* Catering to nfsd */
251
        struct auth_domain *    rq_client;      /* RPC peer info */
252
        struct auth_domain *    rq_gssclient;   /* "gss/"-style peer info */
253
        struct svc_cacherep *   rq_cacherep;    /* cache info */
254
        struct knfsd_fh *       rq_reffh;       /* Referrence filehandle, used to
255
                                                 * determine what device number
256
                                                 * to report (real or virtual)
257
                                                 */
258
        int                     rq_splice_ok;   /* turned off in gss privacy
259
                                                 * to prevent encrypting page
260
                                                 * cache pages */
261
        wait_queue_head_t       rq_wait;        /* synchronization */
262
        struct task_struct      *rq_task;       /* service thread */
263
};
264
 
265
/*
266
 * Rigorous type checking on sockaddr type conversions
267
 */
268
static inline struct sockaddr_in *svc_addr_in(struct svc_rqst *rqst)
269
{
270
        return (struct sockaddr_in *) &rqst->rq_addr;
271
}
272
 
273
static inline struct sockaddr_in6 *svc_addr_in6(struct svc_rqst *rqst)
274
{
275
        return (struct sockaddr_in6 *) &rqst->rq_addr;
276
}
277
 
278
static inline struct sockaddr *svc_addr(struct svc_rqst *rqst)
279
{
280
        return (struct sockaddr *) &rqst->rq_addr;
281
}
282
 
283
/*
284
 * Check buffer bounds after decoding arguments
285
 */
286
static inline int
287
xdr_argsize_check(struct svc_rqst *rqstp, __be32 *p)
288
{
289
        char *cp = (char *)p;
290
        struct kvec *vec = &rqstp->rq_arg.head[0];
291
        return cp >= (char*)vec->iov_base
292
                && cp <= (char*)vec->iov_base + vec->iov_len;
293
}
294
 
295
static inline int
296
xdr_ressize_check(struct svc_rqst *rqstp, __be32 *p)
297
{
298
        struct kvec *vec = &rqstp->rq_res.head[0];
299
        char *cp = (char*)p;
300
 
301
        vec->iov_len = cp - (char*)vec->iov_base;
302
 
303
        return vec->iov_len <= PAGE_SIZE;
304
}
305
 
306
static inline void svc_free_res_pages(struct svc_rqst *rqstp)
307
{
308
        while (rqstp->rq_resused) {
309
                struct page **pp = (rqstp->rq_respages +
310
                                    --rqstp->rq_resused);
311
                if (*pp) {
312
                        put_page(*pp);
313
                        *pp = NULL;
314
                }
315
        }
316
}
317
 
318
struct svc_deferred_req {
319
        u32                     prot;   /* protocol (UDP or TCP) */
320
        struct svc_sock         *svsk;
321
        struct sockaddr_storage addr;   /* where reply must go */
322
        size_t                  addrlen;
323
        union svc_addr_u        daddr;  /* where reply must come from */
324
        struct cache_deferred_req handle;
325
        int                     argslen;
326
        __be32                  args[0];
327
};
328
 
329
/*
330
 * List of RPC programs on the same transport endpoint
331
 */
332
struct svc_program {
333
        struct svc_program *    pg_next;        /* other programs (same xprt) */
334
        u32                     pg_prog;        /* program number */
335
        unsigned int            pg_lovers;      /* lowest version */
336
        unsigned int            pg_hivers;      /* lowest version */
337
        unsigned int            pg_nvers;       /* number of versions */
338
        struct svc_version **   pg_vers;        /* version array */
339
        char *                  pg_name;        /* service name */
340
        char *                  pg_class;       /* class name: services sharing authentication */
341
        struct svc_stat *       pg_stats;       /* rpc statistics */
342
        int                     (*pg_authenticate)(struct svc_rqst *);
343
};
344
 
345
/*
346
 * RPC program version
347
 */
348
struct svc_version {
349
        u32                     vs_vers;        /* version number */
350
        u32                     vs_nproc;       /* number of procedures */
351
        struct svc_procedure *  vs_proc;        /* per-procedure info */
352
        u32                     vs_xdrsize;     /* xdrsize needed for this version */
353
 
354
        unsigned int            vs_hidden : 1;  /* Don't register with portmapper.
355
                                                 * Only used for nfsacl so far. */
356
 
357
        /* Override dispatch function (e.g. when caching replies).
358
         * A return value of 0 means drop the request.
359
         * vs_dispatch == NULL means use default dispatcher.
360
         */
361
        int                     (*vs_dispatch)(struct svc_rqst *, __be32 *);
362
};
363
 
364
/*
365
 * RPC procedure info
366
 */
367
typedef __be32  (*svc_procfunc)(struct svc_rqst *, void *argp, void *resp);
368
struct svc_procedure {
369
        svc_procfunc            pc_func;        /* process the request */
370
        kxdrproc_t              pc_decode;      /* XDR decode args */
371
        kxdrproc_t              pc_encode;      /* XDR encode result */
372
        kxdrproc_t              pc_release;     /* XDR free result */
373
        unsigned int            pc_argsize;     /* argument struct size */
374
        unsigned int            pc_ressize;     /* result struct size */
375
        unsigned int            pc_count;       /* call count */
376
        unsigned int            pc_cachetype;   /* cache info (NFS) */
377
        unsigned int            pc_xdrressize;  /* maximum size of XDR reply */
378
};
379
 
380
/*
381
 * Function prototypes.
382
 */
383
struct svc_serv *  svc_create(struct svc_program *, unsigned int,
384
                              void (*shutdown)(struct svc_serv*));
385
int                svc_create_thread(svc_thread_fn, struct svc_serv *);
386
void               svc_exit_thread(struct svc_rqst *);
387
struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,
388
                        void (*shutdown)(struct svc_serv*),
389
                        svc_thread_fn, int sig, struct module *);
390
int                svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
391
void               svc_destroy(struct svc_serv *);
392
int                svc_process(struct svc_rqst *);
393
int                svc_register(struct svc_serv *, int, unsigned short);
394
void               svc_wake_up(struct svc_serv *);
395
void               svc_reserve(struct svc_rqst *rqstp, int space);
396
struct svc_pool *  svc_pool_for_cpu(struct svc_serv *serv, int cpu);
397
char *             svc_print_addr(struct svc_rqst *, char *, size_t);
398
 
399
#define RPC_MAX_ADDRBUFLEN      (63U)
400
 
401
/*
402
 * When we want to reduce the size of the reserved space in the response
403
 * buffer, we need to take into account the size of any checksum data that
404
 * may be at the end of the packet. This is difficult to determine exactly
405
 * for all cases without actually generating the checksum, so we just use a
406
 * static value.
407
 */
408
static inline void
409
svc_reserve_auth(struct svc_rqst *rqstp, int space)
410
{
411
        int                     added_space = 0;
412
 
413
        switch(rqstp->rq_authop->flavour) {
414
                case RPC_AUTH_GSS:
415
                        added_space = RPC_MAX_AUTH_SIZE;
416
        }
417
        return svc_reserve(rqstp, space + added_space);
418
}
419
 
420
#endif /* SUNRPC_SVC_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.