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