Merge tag 'wireless-drivers-next-for-davem-2016-03-09' of git://git.kernel.org/pub...
[linux-2.6-block.git] / net / rxrpc / ar-internal.h
index 2934a73a5981ad154888904b67f8082fedac4a3c..8b495aed517d204fe2ec070e662341b851c60359 100644 (file)
@@ -16,7 +16,7 @@
        BUG_ON(atomic_read((X)) >> (sizeof(atomic_t) - 2) == \
               (POISON_FREE << 8 | POISON_FREE))
 #else
-#define CHECK_SLAB_OKAY(X) do {} while(0)
+#define CHECK_SLAB_OKAY(X) do {} while (0)
 #endif
 
 #define FCRYPT_BSIZE 8
@@ -70,11 +70,30 @@ struct rxrpc_sock {
 #define RXRPC_SECURITY_MAX     RXRPC_SECURITY_ENCRYPT
        struct sockaddr_rxrpc   srx;            /* local address */
        sa_family_t             proto;          /* protocol created with */
-       __be16                  service_id;     /* service ID of local/remote service */
 };
 
 #define rxrpc_sk(__sk) container_of((__sk), struct rxrpc_sock, sk)
 
+/*
+ * CPU-byteorder normalised Rx packet header.
+ */
+struct rxrpc_host_header {
+       u32             epoch;          /* client boot timestamp */
+       u32             cid;            /* connection and channel ID */
+       u32             callNumber;     /* call ID (0 for connection-level packets) */
+       u32             seq;            /* sequence number of pkt in call stream */
+       u32             serial;         /* serial number of pkt sent to network */
+       u8              type;           /* packet type */
+       u8              flags;          /* packet flags */
+       u8              userStatus;     /* app-layer defined status */
+       u8              securityIndex;  /* security protocol ID */
+       union {
+               u16     _rsvd;          /* reserved */
+               u16     cksum;          /* kerberos security checksum */
+       };
+       u16             serviceId;      /* service ID */
+} __packed;
+
 /*
  * RxRPC socket buffer private variables
  * - max 48 bytes (struct sk_buff::cb)
@@ -89,7 +108,7 @@ struct rxrpc_skb_priv {
                bool            need_resend;    /* T if needs resending */
        };
 
-       struct rxrpc_header     hdr;            /* RxRPC packet header from this packet */
+       struct rxrpc_host_header hdr;           /* RxRPC packet header from this packet */
 };
 
 #define rxrpc_skb(__skb) ((struct rxrpc_skb_priv *) &(__skb)->cb)
@@ -230,7 +249,7 @@ struct rxrpc_conn_bundle {
        atomic_t                usage;
        int                     debug_id;       /* debug ID for printks */
        unsigned short          num_conns;      /* number of connections in this bundle */
-       __be16                  service_id;     /* service ID */
+       u16                     service_id;     /* Service ID for this bundle */
        u8                      security_ix;    /* security type */
 };
 
@@ -260,7 +279,6 @@ struct rxrpc_connection {
        rwlock_t                lock;           /* access lock */
        spinlock_t              state_lock;     /* state-change lock */
        atomic_t                usage;
-       u32                     real_conn_id;   /* connection ID (host-endian) */
        enum {                                  /* current state of connection */
                RXRPC_CONN_UNUSED,              /* - connection not yet attempted */
                RXRPC_CONN_CLIENT,              /* - client connection */
@@ -282,16 +300,75 @@ struct rxrpc_connection {
        u8                      security_size;  /* security header size */
        u32                     security_level; /* security level negotiated */
        u32                     security_nonce; /* response re-use preventer */
-
-       /* the following are all in net order */
-       __be32                  epoch;          /* epoch of this connection */
-       __be32                  cid;            /* connection ID */
-       __be16                  service_id;     /* service ID */
+       u32                     epoch;          /* epoch of this connection */
+       u32                     cid;            /* connection ID */
+       u16                     service_id;     /* service ID for this connection */
        u8                      security_ix;    /* security type */
        u8                      in_clientflag;  /* RXRPC_CLIENT_INITIATED if we are server */
        u8                      out_clientflag; /* RXRPC_CLIENT_INITIATED if we are client */
 };
 
+/*
+ * Flags in call->flags.
+ */
+enum rxrpc_call_flag {
+       RXRPC_CALL_RELEASED,            /* call has been released - no more message to userspace */
+       RXRPC_CALL_TERMINAL_MSG,        /* call has given the socket its final message */
+       RXRPC_CALL_RCVD_LAST,           /* all packets received */
+       RXRPC_CALL_RUN_RTIMER,          /* Tx resend timer started */
+       RXRPC_CALL_TX_SOFT_ACK,         /* sent some soft ACKs */
+       RXRPC_CALL_PROC_BUSY,           /* the processor is busy */
+       RXRPC_CALL_INIT_ACCEPT,         /* acceptance was initiated */
+       RXRPC_CALL_HAS_USERID,          /* has a user ID attached */
+       RXRPC_CALL_EXPECT_OOS,          /* expect out of sequence packets */
+};
+
+/*
+ * Events that can be raised on a call.
+ */
+enum rxrpc_call_event {
+       RXRPC_CALL_EV_RCVD_ACKALL,      /* ACKALL or reply received */
+       RXRPC_CALL_EV_RCVD_BUSY,        /* busy packet received */
+       RXRPC_CALL_EV_RCVD_ABORT,       /* abort packet received */
+       RXRPC_CALL_EV_RCVD_ERROR,       /* network error received */
+       RXRPC_CALL_EV_ACK_FINAL,        /* need to generate final ACK (and release call) */
+       RXRPC_CALL_EV_ACK,              /* need to generate ACK */
+       RXRPC_CALL_EV_REJECT_BUSY,      /* need to generate busy message */
+       RXRPC_CALL_EV_ABORT,            /* need to generate abort */
+       RXRPC_CALL_EV_CONN_ABORT,       /* local connection abort generated */
+       RXRPC_CALL_EV_RESEND_TIMER,     /* Tx resend timer expired */
+       RXRPC_CALL_EV_RESEND,           /* Tx resend required */
+       RXRPC_CALL_EV_DRAIN_RX_OOS,     /* drain the Rx out of sequence queue */
+       RXRPC_CALL_EV_LIFE_TIMER,       /* call's lifetimer ran out */
+       RXRPC_CALL_EV_ACCEPTED,         /* incoming call accepted by userspace app */
+       RXRPC_CALL_EV_SECURED,          /* incoming call's connection is now secure */
+       RXRPC_CALL_EV_POST_ACCEPT,      /* need to post an "accept?" message to the app */
+       RXRPC_CALL_EV_RELEASE,          /* need to release the call's resources */
+};
+
+/*
+ * The states that a call can be in.
+ */
+enum rxrpc_call_state {
+       RXRPC_CALL_CLIENT_SEND_REQUEST, /* - client sending request phase */
+       RXRPC_CALL_CLIENT_AWAIT_REPLY,  /* - client awaiting reply */
+       RXRPC_CALL_CLIENT_RECV_REPLY,   /* - client receiving reply phase */
+       RXRPC_CALL_CLIENT_FINAL_ACK,    /* - client sending final ACK phase */
+       RXRPC_CALL_SERVER_SECURING,     /* - server securing request connection */
+       RXRPC_CALL_SERVER_ACCEPTING,    /* - server accepting request */
+       RXRPC_CALL_SERVER_RECV_REQUEST, /* - server receiving request */
+       RXRPC_CALL_SERVER_ACK_REQUEST,  /* - server pending ACK of request */
+       RXRPC_CALL_SERVER_SEND_REPLY,   /* - server sending reply */
+       RXRPC_CALL_SERVER_AWAIT_ACK,    /* - server awaiting final ACK */
+       RXRPC_CALL_COMPLETE,            /* - call completed */
+       RXRPC_CALL_SERVER_BUSY,         /* - call rejected by busy server */
+       RXRPC_CALL_REMOTELY_ABORTED,    /* - call aborted by peer */
+       RXRPC_CALL_LOCALLY_ABORTED,     /* - call aborted locally on error or close */
+       RXRPC_CALL_NETWORK_ERROR,       /* - call terminated by network error */
+       RXRPC_CALL_DEAD,                /* - call is dead */
+       NR__RXRPC_CALL_STATES
+};
+
 /*
  * RxRPC call definition
  * - matched by { connection, call_id }
@@ -317,57 +394,13 @@ struct rxrpc_call {
        unsigned long           user_call_ID;   /* user-defined call ID */
        unsigned long           creation_jif;   /* time of call creation */
        unsigned long           flags;
-#define RXRPC_CALL_RELEASED    0       /* call has been released - no more message to userspace */
-#define RXRPC_CALL_TERMINAL_MSG        1       /* call has given the socket its final message */
-#define RXRPC_CALL_RCVD_LAST   2       /* all packets received */
-#define RXRPC_CALL_RUN_RTIMER  3       /* Tx resend timer started */
-#define RXRPC_CALL_TX_SOFT_ACK 4       /* sent some soft ACKs */
-#define RXRPC_CALL_PROC_BUSY   5       /* the processor is busy */
-#define RXRPC_CALL_INIT_ACCEPT 6       /* acceptance was initiated */
-#define RXRPC_CALL_HAS_USERID  7       /* has a user ID attached */
-#define RXRPC_CALL_EXPECT_OOS  8       /* expect out of sequence packets */
        unsigned long           events;
-#define RXRPC_CALL_RCVD_ACKALL 0       /* ACKALL or reply received */
-#define RXRPC_CALL_RCVD_BUSY   1       /* busy packet received */
-#define RXRPC_CALL_RCVD_ABORT  2       /* abort packet received */
-#define RXRPC_CALL_RCVD_ERROR  3       /* network error received */
-#define RXRPC_CALL_ACK_FINAL   4       /* need to generate final ACK (and release call) */
-#define RXRPC_CALL_ACK         5       /* need to generate ACK */
-#define RXRPC_CALL_REJECT_BUSY 6       /* need to generate busy message */
-#define RXRPC_CALL_ABORT       7       /* need to generate abort */
-#define RXRPC_CALL_CONN_ABORT  8       /* local connection abort generated */
-#define RXRPC_CALL_RESEND_TIMER        9       /* Tx resend timer expired */
-#define RXRPC_CALL_RESEND      10      /* Tx resend required */
-#define RXRPC_CALL_DRAIN_RX_OOS        11      /* drain the Rx out of sequence queue */
-#define RXRPC_CALL_LIFE_TIMER  12      /* call's lifetimer ran out */
-#define RXRPC_CALL_ACCEPTED    13      /* incoming call accepted by userspace app */
-#define RXRPC_CALL_SECURED     14      /* incoming call's connection is now secure */
-#define RXRPC_CALL_POST_ACCEPT 15      /* need to post an "accept?" message to the app */
-#define RXRPC_CALL_RELEASE     16      /* need to release the call's resources */
-
        spinlock_t              lock;
        rwlock_t                state_lock;     /* lock for state transition */
        atomic_t                usage;
        atomic_t                sequence;       /* Tx data packet sequence counter */
        u32                     abort_code;     /* local/remote abort code */
-       enum {                                  /* current state of call */
-               RXRPC_CALL_CLIENT_SEND_REQUEST, /* - client sending request phase */
-               RXRPC_CALL_CLIENT_AWAIT_REPLY,  /* - client awaiting reply */
-               RXRPC_CALL_CLIENT_RECV_REPLY,   /* - client receiving reply phase */
-               RXRPC_CALL_CLIENT_FINAL_ACK,    /* - client sending final ACK phase */
-               RXRPC_CALL_SERVER_SECURING,     /* - server securing request connection */
-               RXRPC_CALL_SERVER_ACCEPTING,    /* - server accepting request */
-               RXRPC_CALL_SERVER_RECV_REQUEST, /* - server receiving request */
-               RXRPC_CALL_SERVER_ACK_REQUEST,  /* - server pending ACK of request */
-               RXRPC_CALL_SERVER_SEND_REPLY,   /* - server sending reply */
-               RXRPC_CALL_SERVER_AWAIT_ACK,    /* - server awaiting final ACK */
-               RXRPC_CALL_COMPLETE,            /* - call completed */
-               RXRPC_CALL_SERVER_BUSY,         /* - call rejected by busy server */
-               RXRPC_CALL_REMOTELY_ABORTED,    /* - call aborted by peer */
-               RXRPC_CALL_LOCALLY_ABORTED,     /* - call aborted locally on error or close */
-               RXRPC_CALL_NETWORK_ERROR,       /* - call terminated by network error */
-               RXRPC_CALL_DEAD,                /* - call is dead */
-       } state;
+       enum rxrpc_call_state   state : 8;      /* current state of call */
        int                     debug_id;       /* debug ID for printks */
        u8                      channel;        /* connection channel occupied by this call */
 
@@ -389,9 +422,9 @@ struct rxrpc_call {
        rxrpc_seq_t             rx_data_eaten;  /* last data seq ID consumed by recvmsg */
        rxrpc_seq_t             rx_first_oos;   /* first packet in rx_oos_queue (or 0) */
        rxrpc_seq_t             ackr_win_top;   /* top of ACK window (rx_data_eaten is bottom) */
-       rxrpc_seq_net_t         ackr_prev_seq;  /* previous sequence number received */
+       rxrpc_seq_t             ackr_prev_seq;  /* previous sequence number received */
        u8                      ackr_reason;    /* reason to ACK */
-       __be32                  ackr_serial;    /* serial of packet being ACK'd */
+       rxrpc_serial_t          ackr_serial;    /* serial of packet being ACK'd */
        atomic_t                ackr_not_idle;  /* number of packets in Rx queue */
 
        /* received packet records, 1 bit per record */
@@ -403,11 +436,10 @@ struct rxrpc_call {
        u8                      in_clientflag;  /* Copy of conn->in_clientflag for hashing */
        struct rxrpc_local      *local;         /* Local endpoint. Used for hashing. */
        sa_family_t             proto;          /* Frame protocol */
-       /* the following should all be in net order */
-       __be32                  cid;            /* connection ID + channel index  */
-       __be32                  call_id;        /* call ID on connection  */
-       __be32                  epoch;          /* epoch of this connection */
-       __be16                  service_id;     /* service ID */
+       u32                     call_id;        /* call ID on connection  */
+       u32                     cid;            /* connection ID plus channel index */
+       u32                     epoch;          /* epoch of this connection */
+       u16                     service_id;     /* service ID */
        union {                                 /* Peer IP address for hashing */
                __be32  ipv4_addr;
                __u8    ipv6_addr[16];          /* Anticipates eventual IPv6 support */
@@ -423,7 +455,7 @@ static inline void rxrpc_abort_call(struct rxrpc_call *call, u32 abort_code)
        if (call->state < RXRPC_CALL_COMPLETE) {
                call->abort_code = abort_code;
                call->state = RXRPC_CALL_LOCALLY_ABORTED;
-               set_bit(RXRPC_CALL_ABORT, &call->events);
+               set_bit(RXRPC_CALL_EV_ABORT, &call->events);
        }
        write_unlock_bh(&call->state_lock);
 }
@@ -432,7 +464,7 @@ static inline void rxrpc_abort_call(struct rxrpc_call *call, u32 abort_code)
  * af_rxrpc.c
  */
 extern atomic_t rxrpc_n_skbs;
-extern __be32 rxrpc_epoch;
+extern u32 rxrpc_epoch;
 extern atomic_t rxrpc_debug_id;
 extern struct workqueue_struct *rxrpc_workqueue;
 
@@ -453,8 +485,8 @@ extern unsigned rxrpc_rx_window_size;
 extern unsigned rxrpc_rx_mtu;
 extern unsigned rxrpc_rx_jumbo_max;
 
-void __rxrpc_propose_ACK(struct rxrpc_call *, u8, __be32, bool);
-void rxrpc_propose_ACK(struct rxrpc_call *, u8, __be32, bool);
+void __rxrpc_propose_ACK(struct rxrpc_call *, u8, u32, bool);
+void rxrpc_propose_ACK(struct rxrpc_call *, u8, u32, bool);
 void rxrpc_process_call(struct work_struct *);
 
 /*
@@ -466,15 +498,15 @@ extern struct kmem_cache *rxrpc_call_jar;
 extern struct list_head rxrpc_calls;
 extern rwlock_t rxrpc_call_lock;
 
-struct rxrpc_call *rxrpc_find_call_hash(u8,  __be32, __be32, __be32,
-                                       __be16, void *, sa_family_t, const u8 *);
+struct rxrpc_call *rxrpc_find_call_hash(struct rxrpc_host_header *,
+                                       void *, sa_family_t, const void *);
 struct rxrpc_call *rxrpc_get_client_call(struct rxrpc_sock *,
                                         struct rxrpc_transport *,
                                         struct rxrpc_conn_bundle *,
                                         unsigned long, int, gfp_t);
 struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *,
                                       struct rxrpc_connection *,
-                                      struct rxrpc_header *, gfp_t);
+                                      struct rxrpc_host_header *, gfp_t);
 struct rxrpc_call *rxrpc_find_server_call(struct rxrpc_sock *, unsigned long);
 void rxrpc_release_call(struct rxrpc_call *);
 void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
@@ -490,16 +522,16 @@ extern rwlock_t rxrpc_connection_lock;
 
 struct rxrpc_conn_bundle *rxrpc_get_bundle(struct rxrpc_sock *,
                                           struct rxrpc_transport *,
-                                          struct key *, __be16, gfp_t);
+                                          struct key *, u16, gfp_t);
 void rxrpc_put_bundle(struct rxrpc_transport *, struct rxrpc_conn_bundle *);
 int rxrpc_connect_call(struct rxrpc_sock *, struct rxrpc_transport *,
                       struct rxrpc_conn_bundle *, struct rxrpc_call *, gfp_t);
 void rxrpc_put_connection(struct rxrpc_connection *);
 void __exit rxrpc_destroy_all_connections(void);
 struct rxrpc_connection *rxrpc_find_connection(struct rxrpc_transport *,
-                                              struct rxrpc_header *);
+                                              struct rxrpc_host_header *);
 extern struct rxrpc_connection *
-rxrpc_incoming_connection(struct rxrpc_transport *, struct rxrpc_header *,
+rxrpc_incoming_connection(struct rxrpc_transport *, struct rxrpc_host_header *,
                          gfp_t);
 
 /*
@@ -694,7 +726,7 @@ do {                                                                \
                printk(KERN_ERR "RxRPC: Assertion failed\n");   \
                BUG();                                          \
        }                                                       \
-} while(0)
+} while (0)
 
 #define ASSERTCMP(X, OP, Y)                                            \
 do {                                                                   \
@@ -707,7 +739,7 @@ do {                                                                        \
                       (unsigned long)(X), (unsigned long)(Y));         \
                BUG();                                                  \
        }                                                               \
-} while(0)
+} while (0)
 
 #define ASSERTIF(C, X)                                         \
 do {                                                           \
@@ -716,7 +748,7 @@ do {                                                                \
                printk(KERN_ERR "RxRPC: Assertion failed\n");   \
                BUG();                                          \
        }                                                       \
-} while(0)
+} while (0)
 
 #define ASSERTIFCMP(C, X, OP, Y)                                       \
 do {                                                                   \
@@ -729,25 +761,25 @@ do {                                                                      \
                       (unsigned long)(X), (unsigned long)(Y));         \
                BUG();                                                  \
        }                                                               \
-} while(0)
+} while (0)
 
 #else
 
 #define ASSERT(X)                              \
 do {                                           \
-} while(0)
+} while (0)
 
 #define ASSERTCMP(X, OP, Y)                    \
 do {                                           \
-} while(0)
+} while (0)
 
 #define ASSERTIF(C, X)                         \
 do {                                           \
-} while(0)
+} while (0)
 
 #define ASSERTIFCMP(C, X, OP, Y)               \
 do {                                           \
-} while(0)
+} while (0)
 
 #endif /* __KDEBUGALL */
 
@@ -804,9 +836,9 @@ do {                                                        \
        CHECK_SLAB_OKAY(&(CALL)->usage);                \
        if (atomic_inc_return(&(CALL)->usage) == 1)     \
                BUG();                                  \
-} while(0)
+} while (0)
 
 #define rxrpc_put_call(CALL)                           \
 do {                                                   \
        __rxrpc_put_call(CALL);                         \
-} while(0)
+} while (0)