- struct list_head ktx_list; /* enqueue idle/delayed */
- struct list_head *ktx_idle; /* where to put when idle */
- char ktx_state; /* What I'm doing */
- uint32_t ktx_basepage; /* page offset in reserved elan tx vaddrs for mapping pages */
- int ktx_npages; /* pages reserved for mapping messages */
- int ktx_nmappedpages; /* # pages mapped for current message */
- EP_IOVEC ktx_iov[EP_MAXFRAG]; /* msg frags (elan vaddrs) */
- int ktx_niov; /* # message frags */
- int ktx_port; /* destination ep port */
- ptl_nid_t ktx_nid; /* destination node */
- void *ktx_args[2]; /* completion passthru */
- E3_Addr ktx_ebuffer; /* elan address of ktx_buffer */
- char *ktx_buffer; /* pre-allocated contiguous buffer for hdr + small payloads */
+ __u32 kqm_magic; /* I'm a qswlnd message */
+ __u16 kqm_version; /* this is my version number */
+ __u16 kqm_type; /* msg type */
+#if KQSW_CKSUM
+ __u32 kqm_cksum; /* crc32 checksum */
+ __u32 kqm_nob; /* original msg length */
+#endif
+ union {
+ kqswnal_immediate_msg_t immediate;
+ kqswnal_rdma_msg_t rdma;
+ } WIRE_ATTR kqm_u;
+} WIRE_ATTR kqswnal_msg_t;
+
+#if KQSW_CKSUM /* enable checksums ? */
+# include <linux/crc32.h>
+static inline __u32 kqswnal_csum(__u32 crc, unsigned char const *p, size_t len)
+{
+#if 1
+ return crc32_le(crc, p, len);
+#else
+ while (len-- > 0)
+ crc = ((crc + 0x100) & ~0xff) | ((crc + *p++) & 0xff) ;
+ return crc;
+#endif
+}
+# define QSWLND_PROTO_VERSION 0xbeef
+#else
+# define QSWLND_PROTO_VERSION 1
+#endif
+
+#define QSWLND_MSG_IMMEDIATE 0
+#define QSWLND_MSG_RDMA 1
+
+typedef union {
+ EP_STATUSBLK ep_statusblk;
+ struct {
+ __u32 status;
+ __u32 magic;
+ __u32 version;
+ union {
+ struct {
+ __u32 len;
+ __u32 cksum;
+ } WIRE_ATTR get;
+ } WIRE_ATTR u;
+ } WIRE_ATTR msg;
+} kqswnal_rpc_reply_t;
+
+typedef struct kqswnal_rx
+{
+ cfs_list_t krx_list; /* enqueue -> thread */
+ struct kqswnal_rx *krx_alloclist;/* stack in kqn_rxds */
+ EP_RCVR *krx_eprx; /* port to post receives to */
+ EP_RXD *krx_rxd; /* receive descriptor (for repost) */
+ EP_NMD krx_elanbuffer;/* contiguous Elan buffer */
+ int krx_npages; /* # pages in receive buffer */
+ int krx_nob; /* Number Of Bytes received into buffer */
+ int krx_rpc_reply_needed:1; /* peer waiting for EKC RPC reply */
+ int krx_state; /* what this RX is doing */
+ cfs_atomic_t krx_refcount; /* how to tell when rpc is done */
+#if KQSW_CKSUM
+ __u32 krx_cksum; /* checksum */
+#endif
+ kqswnal_rpc_reply_t krx_rpc_reply; /* rpc reply status block */
+ lnet_kiov_t krx_kiov[KQSW_NRXMSGPAGES_LARGE];/* buffer frags */
+} kqswnal_rx_t;
+
+#define KRX_POSTED 1 /* receiving */
+#define KRX_PARSE 2 /* ready to be parsed */
+#define KRX_COMPLETING 3 /* waiting to be completed */
+
+
+typedef struct kqswnal_tx
+{
+ cfs_list_t ktx_list; /* enqueue idle/active */
+ cfs_list_t ktx_schedlist; /* enqueue on scheduler */
+ struct kqswnal_tx *ktx_alloclist; /* stack in kqn_txds */
+ unsigned int ktx_state:7; /* What I'm doing */
+ unsigned int ktx_firsttmpfrag:1; /* ktx_frags[0] is in my ebuffer ? 0 : 1 */
+ __u32 ktx_basepage; /* page offset in reserved elan tx vaddrs for mapping pages */
+ int ktx_npages; /* pages reserved for mapping messages */
+ int ktx_nmappedpages; /* # pages mapped for current message */
+ int ktx_port; /* destination ep port */
+ lnet_nid_t ktx_nid; /* destination node */
+ void *ktx_args[3]; /* completion passthru */
+ char *ktx_buffer; /* pre-allocated contiguous buffer for hdr + small payloads */
+ cfs_time_t ktx_launchtime; /* when (in jiffies) the
+ * transmit was launched */
+ int ktx_status; /* completion status */
+#if KQSW_CKSUM
+ __u32 ktx_cksum; /* optimized GET payload checksum */
+#endif
+ /* debug/info fields */
+ pid_t ktx_launcher; /* pid of launching process */
+
+ int ktx_nfrag; /* # message frags */
+ int ktx_rail; /* preferred rail */
+ EP_NMD ktx_ebuffer; /* elan mapping of ktx_buffer */
+ EP_NMD ktx_frags[EP_MAXFRAG];/* elan mapping of msg frags */