@@ -43,11 +43,14 @@
#define true 1
#endif /*__cplusplus */
+#define DCM_AH_SPACE (0xC000) /* unicast LID range */
+
/* Typedefs to map common DAPL provider types to IB verbs */
struct dcm_ib_qp {
struct _ib_hca_transport *tp;
struct dapl_ep *ep;
struct ibv_qp *qp; /* local QP1 snd-rcv or rcv from PO */
+ struct ibv_ah **ah; /* UD AH cache, LID index */
#ifdef _OPENIB_MCM_
struct dcm_ib_cq *req_cq; /* ref to req CQ for HST->MXS */
struct dcm_ib_cq *rcv_cq; /* ref to rcv CQ for HST->MXS */
@@ -98,11 +101,13 @@ typedef struct ibv_context *ib_hca_handle_t;
typedef ib_hca_handle_t dapl_ibal_ca_t;
/* QP info to exchange, wire protocol version for these CM's */
-#define DCM_VER 7
+/* Version 8, 24-bit port space and rtns value */
+#define DCM_VER 8
+#define DCM_VER_XPS 8 /* extended port space, rtns */
#define DCM_VER_MIN 6 /* backward compatibility limit */
/* CM private data areas, same for all operations */
-#define DCM_MAX_PDATA_SIZE 118
+#define DCM_MAX_PDATA_SIZE 68
/*
* UCM DAPL IB/QP address (lid, qp_num, gid) mapping to
@@ -127,7 +132,6 @@ union dcm_addr {
} ib;
};
-/* 256 bytes total; default max_inline_send, min IB MTU size */
typedef struct _ib_cm_msg
{
uint16_t ver;
@@ -140,7 +144,10 @@ typedef struct _ib_cm_msg
uint32_t s_id; /* src pid */
uint32_t d_id; /* dst pid */
uint8_t rd_in; /* atomic_rd_in */
- uint8_t resv[5];
+ uint8_t sportx; /* extend to 24 bits */
+ uint8_t dportx; /* extend to 24 bits */
+ uint8_t rtns; /* retransmissions */
+ uint8_t resv[2];
union dcm_addr saddr;
union dcm_addr daddr;
union dcm_addr saddr_alt;
@@ -33,15 +33,39 @@
#include "openib_osd.h"
#include "dapl_ib_common.h"
+#define UCM_SID_BITS 16 /* 64K */
+#define UCM_SID_SPACE (1 << UCM_SID_BITS)
+#define UCM_SID_MASK (UCM_SID_SPACE-1)
+#define UCM_SID_ENTRY 8 /* 8 bit entry */
+
+#define UCM_CHK_SID(a,p) (a[p/UCM_SID_ENTRY] & (1 << (p%UCM_SID_ENTRY)))
+#define UCM_SET_SID(a,p) (a[p/UCM_SID_ENTRY] = (a[p/UCM_SID_ENTRY] | (1 << (p%UCM_SID_ENTRY))))
+#define UCM_CLR_SID(a,p) (a[p/UCM_SID_ENTRY] = (a[p/UCM_SID_ENTRY] & ~(1 << (p%UCM_SID_ENTRY))))
+
+#define UCM_PORT_BITS 24 /* 16M total, wire protocol max */
+#define UCM_PORT_SPACE (1 << UCM_SID_BITS)
+#define UCM_PORT_MASK (UCM_PORT_SPACE-1)
+#define UCM_PORT_NTOH(hi,lo) ((((hi & 0xff) << 16) | (ntohs(lo) & 0xffff)) & (UCM_PORT_MASK))
+#define UCM_PORT(p) (p & 0xffff)
+#define UCM_PORTX(p) ((p >> 16) & 0xff)
+
+#define UCM_ENTRY_BITS 11 /* 2K entries, default */
+#define UCM_ARRAY_BITS 18 /* 256K total ports, default */
+#define UCM_ENTRY_SIZE(ebits) (1 << ebits)
+#define UCM_ARRAY_SIZE(abits, ebits) (1 << (abits - ebits))
+#define UCM_ARRAY_IDX_MAX(abits) ((1 << abits) - 1)
+#define UCM_ARRAY_IDX(idx, abits) (idx >> abits)
+#define UCM_ENTRY_IDX(idx, abits) (idx & (abits - 1))
+
+
/* DAPL CM objects MUST include list_entry, ref_count, event for EP linking */
struct ib_cm_handle
{
struct dapl_llist_entry list_entry;
struct dapl_llist_entry local_entry;
- DAPL_OS_WAIT_OBJECT d_event;
- DAPL_OS_WAIT_OBJECT f_event;
DAPL_OS_LOCK lock;
DAPL_OS_TIMEVAL timer;
+ uint32_t cm_id;
int ref_count;
int state;
int retries;
@@ -49,7 +73,6 @@ struct ib_cm_handle
struct dapl_sp *sp;
struct dapl_ep *ep;
struct dapl_cr *cr;
- struct ibv_ah *ah;
uint16_t p_size; /* accept p_data, for retries */
uint8_t p_data[DCM_MAX_PDATA_SIZE];
ib_cm_msg_t msg;
@@ -69,8 +92,16 @@ typedef struct _ib_hca_transport
struct ibv_context *ib_ctx;
struct ibv_comp_channel *ib_cq;
ib_cq_handle_t ib_cq_empty;
+ DAPL_OS_LOCK ilock; /* idxr list */
+ void **cm_idxr;
int destroy;
int cm_state;
+ int cm_array_bits;
+ int cm_entry_bits;
+ int cm_idxr_cur;
+ int cm_last;
+ int cm_free;
+ int cm_cnt;
DAPL_OS_THREAD thread;
DAPL_OS_LOCK lock; /* connect list */
struct dapl_llist_entry *list;