]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
refresh
authorSean Hefty <sean.hefty@intel.com>
Mon, 20 Sep 2010 22:13:32 +0000 (15:13 -0700)
committerSean Hefty <sean.hefty@intel.com>
Mon, 20 Sep 2010 22:13:32 +0000 (15:13 -0700)
meta
patches/dapl-update
patches/refresh-temp [deleted file]

diff --git a/meta b/meta
index ebcda5cf60cafb5295b575911d3ba4d3e954e489..ad0f10c87bf421ad0de454e490791edb79626289 100644 (file)
--- a/meta
+++ b/meta
@@ -1,9 +1,8 @@
 Version: 1
-Previous: df9d1d0c05f7e01f7000bd049b9a7645cda6cb7b
-Head: 603ee54f7612509da2a0c60dc6d5484f8793cb0a
+Previous: 9f0618274e934a826800d235dfa6d8c28fc0f3ff
+Head: 2df1438b75e945d48a63fbda74079a77978f315d
 Applied:
-  dapl-update: ea1ec6a5dbdacfca15c8823ba41f9e3108a023b3
-  refresh-temp: 603ee54f7612509da2a0c60dc6d5484f8793cb0a
+  dapl-update: 2df1438b75e945d48a63fbda74079a77978f315d
 Unapplied:
   dapl-evd: ede541a6ba3d7d2a69f95b691f69eb9a315bb75d
   cma-priv-data: b88d4dfeaedcc085e5e588cf7aa1b0a2ae58316f
index 5620df6be9a673596b8c0b68e1f2a19eb4ae88ac..3524cec381b5837aa37f226af653c521a333708c 100644 (file)
@@ -1,5 +1,5 @@
 Bottom: e0a336baf5ecfc37b867ad87df4aa629ac448200
-Top:    e0a336baf5ecfc37b867ad87df4aa629ac448200
+Top:    62ea6b7cd0455394977f5f275edeb614bd8a602f
 Author: Sean Hefty <sean.hefty@intel.com>
 Date:   2010-09-20 15:12:26 -0700
 
@@ -8,4 +8,25957 @@ dapl: update to latest git tree
 
 ---
 
-
+diff --git a/trunk/ulp/dapl2/ChangeLog b/trunk/ulp/dapl2/ChangeLog
+index 62225bd..22b2c63 100644
+--- a/trunk/ulp/dapl2/ChangeLog
++++ b/trunk/ulp/dapl2/ChangeLog
+@@ -1,5079 +1,5079 @@
+-commit f85be199252d12d27c7b7814771a4ca83a43d0c8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Aug 9 14:25:09 2010 -0700\r
+-\r
+-    common: increase default logging to include warnings\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 59489448a7918ab2a1a4b9bcac7e4661cdd97a23\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Aug 9 14:19:50 2010 -0700\r
+-\r
+-    common: add more debug levels for cm logging\r
+-    \r
+-    DAPL_DBG_TYPE_CM_EST   = 0x8000,\r
+-    DAPL_DBG_TYPE_CM_WARN  = 0x10000\r
+-    \r
+-    Add level for connection establishment and events\r
+-    and for retries/timer events.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 70c509bca8409d55ad7c4a248f453956d163778b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Aug 2 09:51:30 2010 -0700\r
+-\r
+-    common: cleanup CR linkings after DTO error on EP\r
+-    \r
+-    Add cleanup to remove CR from SP and EP\r
+-    during DTO errors in dapli_evd_cqe_to_event.\r
+-    \r
+-    dapl_sp_remove_ep needs to remove cr_ptr\r
+-    reference from EP before freeing cr object.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 319430b3bbfb8692dd3d21a21633bfee74cf5b7c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Aug 2 09:49:23 2010 -0700\r
+-\r
+-    ucm: cleanup CM debug warning messages\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7118731a890e9188bb02dc7a5b21ffd832855e9e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jul 23 15:17:53 2010 -0700\r
+-\r
+-    scm, ucm: improperly handles pkey check/query in host order\r
+-    \r
+-    Convert consumer input to network order before verbs\r
+-    query pkey check.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit c5504925b8b98006f421d53475e8ecd55b76f9dd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jul 12 15:57:34 2010 -0700\r
+-\r
+-    The linux compatability header file _errno.h is moving out of verbs.h.\r
+-    Include _errno.h in the windows osd header files, similar to how\r
+-    errno.h is included in the linux osd header files.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 455e9d6d0aeb753a9ecb4a130b0b237e1ffd4146\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 30 12:03:41 2010 -0700\r
+-\r
+-    windows: update SOURCES files to link winverbs.lib, which is\r
+-    needed for common ofa providers.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit b441934f5e55582ef01a91c01da720334345a452\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jun 17 12:58:22 2010 -0700\r
+-\r
+-    Release 2.0.29\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 6c6a482b8ad33d134f0631019b249bd0fea71007\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jun 17 12:40:21 2010 -0700\r
+-\r
+-    scm, ucm: add pkey, pkey_index, sl override for QP's\r
+-    \r
+-    On a per open basis, add environment variables\r
+-    DAPL_IB_SL and DAPL_IB_PKEY and use on\r
+-    connection setup (QP modify) to override default\r
+-    values of 0 for SL and PKEY index. If pkey is\r
+-    provided then find the pkey index with\r
+-    ibv_query_pkey for dev_attr.max_pkeys.\r
+-    Will be used for RC and UD type QP's.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 876942781e9bf72302184f3534a2ddc4068550ac\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jun 10 11:40:45 2010 -0700\r
+-\r
+-    cma: remove dependency on rdma_cma_abi.h\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b34ea37650b5eefeedfc463345775ff568df259e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 2 14:13:05 2010 -0700\r
+-\r
+-    configure: need a false conditional for verbs attr.link_layer member check\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 977f11871d3d4e98f602f890ade1c31cf4169c9c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 2 10:05:03 2010 -0700\r
+-\r
+-    ucm: incorrectly freeing port on passive side after reject\r
+-    \r
+-    cm_release was incorrectly freeing a client port\r
+-    assuming it was the server listening port. Move\r
+-    the listening port cleanup to remove_conn_listner\r
+-    and only cleanup client ports in cm_release.\r
+-    \r
+-    Error Messages indicating problem:\r
+-    \r
+-      CM_REQ retry 1 [lid, port, qpn]: 9 ff9a 340085 -> 9 6fa 34004e Time(ms) 1999 > 1600\r
+-      DUPLICATE: op REQ st CM_CONNECTED [lid, port, qpn]: 9 6fa 0x0 <- 0x9 ff9a 0x340085\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7aedfb1e9dcb9e2841ebe3496bb9aae33c1f6a5b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 2 09:45:42 2010 -0700\r
+-\r
+-    ucm: modify debug CM output for consistency, all ports, qpn in hex\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 8e776ff0621cee1824be224b7a32f79e89b0ebc2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 24 16:44:25 2010 -0700\r
+-\r
+-    Release 2.0.28\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 8fdbd949ef464aa57b13743ab087ea72f035fbc3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 24 16:28:05 2010 -0700\r
+-\r
+-    config: add conditional check for new verbs port_attr.link_layer\r
+-    \r
+-    Check for link_layer type ETHERNET and set global for GID\r
+-    configuration on modify QP.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 1ce0875fb2ac6120cfee006b48a20a4ec38f599b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 24 10:30:28 2010 -0700\r
+-\r
+-    dat.conf: update manpage with latest provider information, add examples\r
+-    \r
+-    Add information regarding OpenFabrics provider choices\r
+-    and explain cma, scm, and ucm providers.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9c42d5872feb07f25f003e01263a3062ebc3bdbb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 19 16:38:53 2010 -0700\r
+-\r
+-    cma, scm: new provider entries for Mellanox RDMA over Ethernet device\r
+-    \r
+-    Add options for netdev eth2 and eth3 for cma and for device mlx4_0 port 1 and 2 for scm.\r
+-    \r
+-    ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" ""\r
+-    ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" ""\r
+-    ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" ""\r
+-    ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" ""\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit d947e05317fe7fef19c90f772ec8f458ff52b196\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 19 15:17:58 2010 -0700\r
+-\r
+-    dapltest: server info devicename is not large enough for dapl_name storage\r
+-    \r
+-    Server info device name is a 80 char array but the dapl device name\r
+-    that is copied is 256 bytes. Increase started_server.devicename definition.\r
+-    Chalk one up for windows SDK OACR (auto code review).\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit c7a7a886af194cf735ee1eb62d9e14967d51249a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 19 14:48:49 2010 -0700\r
+-\r
+-    windows: comp_channel.cpp is included by util.c in the openib_common.\r
+-    \r
+-    Remove it from device.c in individual providers to avoid\r
+-    duplicate definitions.\r
+-    \r
+-    Line endings were corrected to linux format from windows as part of\r
+-    the change.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit bcaa400778d14a977d5cd224056baa0cff06126d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 19 14:45:55 2010 -0700\r
+-\r
+-    windows: need to include linux directory to pick up _errno.h\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit c616a8549db461e39feed71f0f10228313d17b90\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 17 16:22:30 2010 -0700\r
+-\r
+-    scm: check for hca object before signaling thread\r
+-    \r
+-    There may not be an hca object attached to cm object\r
+-    when freeing during cleanup.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 1dbba72741da267f71903a9f2ec03628f3e8a47a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 17 16:15:21 2010 -0700\r
+-\r
+-    scm, cma: fini code can be called multiple times and hang via fork\r
+-    \r
+-    The providers should protect against forked child exits and\r
+-    not cleanup until the parent init actually exits. Otherwise,\r
+-    the child will hang trying to cleanup dapl thread. Modify to\r
+-    check process id for proper init to fini cleanup and limit\r
+-    cleanup to parent only.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b35cb1b16a9dda349dbb19bce9f9bd4afb7240a4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 14 16:20:52 2010 -0700\r
+-\r
+-    scm: add option to use other network devices with environment variable DAPL_SCM_NETDEV\r
+-    \r
+-    New environment variable can be used to set the netdev\r
+-    for sockets to use instead of the default network device\r
+-    returned using gethostname.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit cfdf8bb8951b1c19b8e42d58e4ec26070fdc078e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 14 10:27:50 2010 -0700\r
+-\r
+-    scm: cr_thread occasionally segv's when disconnecting all-to-all MPI static connections\r
+-    \r
+-    Note: no valid calltrace for segv on cr_thread because\r
+-    of state changing in switch statement from another\r
+-    thread, jumped unknown location.\r
+-    \r
+-    Program received signal SIGSEGV, Segmentation fault.\r
+-    [Switching to Thread 0x41a65940 (LWP 1328)]\r
+-    0x00002b2e7d9d5134 in ?? ()\r
+-    \r
+-    Add cm object locking on all state change/checking. When\r
+-    freeing CM object wakeup cr_thread to process\r
+-    state change to CM_FREE.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 4b04afc32940ac42fb2a9bc789a537b527d149fe\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu May 13 10:31:17 2010 -0700\r
+-\r
+-    scm: SOCKOPT ERR Connection timed out on large clusters\r
+-    \r
+-    Large scale all to all connections on +1000 cores\r
+-    the listen backlog is reached and SYN's are dropped\r
+-    which causes the connect to timeout. Retry connect\r
+-    on timeout errors.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 625369f991982f020c04156f312ecf2ecafd77b3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 10 12:46:17 2010 -0700\r
+-\r
+-    ucm: UD mode, active side cm object released to soon, the RTU could be lost.\r
+-    \r
+-    Will see following message with DAPL_DBG_TYPE set for Errors & Warnings (0x3):\r
+-    ucm_recv: NO MATCH op REP 0x120 65487 i0x60005e c0x60005e < 0xd2 19824 0x60006a\r
+-    \r
+-    The cm object was released on the active side after the connection\r
+-    was established, RTU sent. This is a problem if the RTU is lost\r
+-    and the remote side retries the REPLY. The RTU is never resent.\r
+-    Keep the cm object until the EP is destroyed.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 83eec7f19a7442fe568dea685cee7b02fef2f4d1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 10 12:35:51 2010 -0700\r
+-\r
+-    cma, ucm: cleanup issues with dat_ep_free on a connected EP without disconnecting.\r
+-    \r
+-    During EP free, disconnecting with ABRUPT close flag, the disconnect should wait\r
+-    for the DISC event to fire to allow the CM to be properly destroyed upon return.\r
+-    \r
+-    The cma must also release the lock when calling the blocking rdma_destroy_id given\r
+-    the callback thread could attempt to acquire the lock for reference counting.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit da83172db68d05f54b2c1c77b84ecf86dea0c693\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 28 15:37:27 2010 -0700\r
+-\r
+-    ucm: increase default UCM retry count for connect reply to 15\r
+-    \r
+-    On very large clusters UCM is timing out with retries at 10.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 5c710a197bb60268e99e8d1cd7fa26f89b366172\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 27 11:20:08 2010 -0700\r
+-\r
+-    scm: remove modify QP to ERR state during disconnect on UD type QP\r
+-    \r
+-    The disconnect on a UD type QP should not modify QP to error\r
+-    since this is a shared QP. The disconnect should be treated\r
+-    as a NOP on the UD type QP and only be transitioned during\r
+-    the QP destroy (dat_ep_free).\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 64c8009f7ba48c22a6829862447ab5f67c66ba55\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Apr 8 16:32:02 2010 -0700\r
+-\r
+-    windows: remove static paths from dapltest scripts\r
+-    \r
+-    signed-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit 84b78b0b586ee25c7ab78e2c5f7f19a3ce3f21ee\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Apr 8 09:38:57 2010 -0700\r
+-\r
+-    common: EP links to EVD, PZ incorrectly released before provider CM objects freed.\r
+-    \r
+-    unlink/clear references after ALL CM objects linked to EP are freed.\r
+-    Otherwise, event processing via CM objects could reference the handles\r
+-    still linked to EP. After CM objects are freed (blocking) these handles\r
+-    linked to EP are guaranteed not to refereence from underlying provider.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 297e149e7af631663ecc60472a3ee093a7f72059\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 7 11:12:21 2010 -0700\r
+-\r
+-    common: remove unnecessary lmr lkey hashing and duplicate lkey checking\r
+-    \r
+-    lmr lkey hashing is too restrictive given the returned lkey could be\r
+-    the same value for different regions on some rdma devices. Actually,\r
+-    this checking is really unecesssary and requires considerable overhead\r
+-    for hashing so just remove hashing of lmr lkey's. Let verbs device\r
+-    level do the checking and validation.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 96fba2ee7a0a1766f200c9486e62aad46d18bb09\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 29 12:20:34 2010 -0800\r
+-\r
+-    ibal: output completion code in deciaml & hex as intended\r
+-    \r
+-    sign-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit 753f7d35c814367f431deeb307e6decd933a8b5a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 15:02:44 2010 -0800\r
+-\r
+-    ucm: set timer during RTU_PENDING state change.\r
+-    \r
+-    The timer thread may pick up an unitialized timer\r
+-    value and timeout before the reply was sent.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9fc851021d91b282054cf28b4f83f7e5d376f228\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 14:47:58 2010 -0800\r
+-\r
+-    ucm: fix issues with new EP to CM linking changes\r
+-    \r
+-    Add EP locking around QP modify\r
+-    Remove release during disconnect event processing\r
+-    Add check in cm_free to check state and schedule thread if necessary.\r
+-    Add some additional debugging\r
+-    Add processing in disconnect_clean for conn_req timeout\r
+-    Remove extra CR's\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit a5da5e4dac52366a9fe9efeb9a128bd4511481e2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 14:18:06 2010 -0800\r
+-\r
+-    scm: add EP locking and cm checking to socket cm disconnect\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7f733cd1a9acd4b9b270a807673290362050053d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 09:44:44 2010 -0800\r
+-\r
+-    scm: new cm_ep linking broke UD mode over socket cm\r
+-    \r
+-    Add EP locking around modify_qp for EP state.\r
+-    Add new dapli_ep_check for debugging EP\r
+-    Cleanup extra CR's\r
+-    Change socket errno to dapl_socket_errno() abstraction\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit a528267020972e0c449f240ba72a0cc80a5d372e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 09:17:01 2010 -0800\r
+-\r
+-    openib common: add some debug prints to help isolate QP type issues\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit fdfdc439d091c878c74d23b9ac46a3320379199d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 09:15:12 2010 -0800\r
+-\r
+-    common: dapl_event_str function missing 2 IB extended events\r
+-    \r
+-    Add all IB extended events in event string print function\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 2bf3eb939e9a584ae0fe2de70f16cdcca8acf014\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 16 09:12:11 2010 -0800\r
+-\r
+-    common: dat_ep_connect should not set timer UD endpoints\r
+-    \r
+-    connect for UD type is simply AH resolution and doesn't\r
+-    need timed. The common code is not designed to handle\r
+-    multiple timed events on connect requests so just ignore\r
+-    timing UD AH requests.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 73ca06debe4735dfc11f44076a13dde079657b2e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 15 10:23:47 2010 -0800\r
+-\r
+-    ucm: fix error path during accept_usr reply failure\r
+-    \r
+-    if accept_usr fails when sending reply the EP was\r
+-    being linked to CM instead of properly unlinked.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 944ef4445faceeb90bb61d4e377274ad0fd6711f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 8 13:56:28 2010 -0800\r
+-\r
+-    ibal: add missing windows makefile\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 1d53e8eb90e6f74b41e7767e1c71851ff4ec73fd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 8 12:53:45 2010 -0800\r
+-\r
+-    ibal: changes for EP to CM linking and synchronization.\r
+-    \r
+-    Windows IBAL changes to allocate and manage CM objects\r
+-    and to link them to the EP. This will insure the CM\r
+-    IBAL objects and cm_id's are not destroy before EP.\r
+-    Remove windows only ibal_cm_handle in EP structure.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 4b939076aa32bb52957fcc6791e187c9433d4c24\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 24 12:00:07 2010 -0800\r
+-\r
+-    scm: add support for canceling conn request that times out.\r
+-    \r
+-    print warning message during timeout.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f38fc04d517ee6c0560b271298293c56cc619522\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 24 11:28:04 2010 -0800\r
+-\r
+-    scm, cma, ucm: consolidate dat event/provider event translation\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 41739dab38a4be8076ecd9e61b5e175cf91ab322\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 24 11:26:25 2010 -0800\r
+-\r
+-    common: missed linking changes from atomic to acquire/release\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7ff4f840bf1150fa2c2f541c93d810622ea9733b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 24 10:03:57 2010 -0800\r
+-\r
+-    common: add CM-EP linking to support mutiple CM's and proper protection during destruction\r
+-    \r
+-    Add linking for CM to EP, including reference counting, to insure syncronization\r
+-    during creation and destruction. A cm_list_head has been added to the EP object to\r
+-    support multiple CM objects (UD) per EP. If the CM object is linked to an EP it\r
+-    cannot be destroyed.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit c9fbd6e7a8131d4077039d5da716b618727d4009\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Feb 23 16:26:41 2010 -0800\r
+-\r
+-    Release 2.0.27-1\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 454c27b1f357c7c3070e459b25d12929f86304ca\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 22 09:42:17 2010 -0800\r
+-\r
+-    windows: add scm makefile\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 66ac48d5280bcf0453760c6e22909de6b8519b6d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 22 09:41:13 2010 -0800\r
+-\r
+-    Windows does not require rdma_cma_abi.h, move the include from common code and to OSD file.\r
+-    \r
+-    Signed-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit c05c41c31f01e1ddef91e92998ca66d258fafe3d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Feb 19 14:52:01 2010 -0800\r
+-\r
+-    Windows patch to fix IB_INVALID_HANDLE name collision\r
+-    \r
+-    signed-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit 712e7e5ba71f8a4344dfff481a9be870eefefe25\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 8 13:49:35 2010 -0800\r
+-\r
+-    scm: dat_ep_connect fails on 32bit servers\r
+-    \r
+-    memcpy for remote IA address uses incorrect sizeof for a pointer type.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 3040fa78d7d22c8f76c88dc77cedde09f016eb67\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Feb 5 11:51:16 2010 -0800\r
+-\r
+-    undefined symbol: dapls_print_cm_list\r
+-    \r
+-    call prototype should be dependent on DAPL_COUNTERS.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit cbeebe422b952d679f49429be8ba045a62d7f4ac\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Feb 5 11:39:21 2010 -0800\r
+-\r
+-    Cleanup CM object lock before freeing CM object memory\r
+-    \r
+-    Running windows application verifiier for uDAPL validation\r
+-    for all 3 providers. Cleanup memory lock leaks found\r
+-    by verifier.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 855a8e4aa83fa2e4f7847122415106f49286f4ca\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 3 16:21:30 2010 -0800\r
+-\r
+-    destroy verbs completion channels created via ia_open or ep_create.\r
+-    \r
+-    Completion channels are created with ia_open for CNO events and\r
+-    with ep_create in cases where DAT allows EP(qp) to be created with\r
+-    no EVD(cq) and IB doesn't. These completion channels need to be\r
+-    destroyed at close along with a CQ for the EP without CQ case.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 4da540591148e47dd912851cc7314776f2f7622e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 3 11:06:45 2010 -0800\r
+-\r
+-    Update Copyright file and include the 3 license files in distribution\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9011abd4b1470c65bfe81eef5a2f3a81060cec81\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Feb 2 14:43:03 2010 -0800\r
+-\r
+-    When copying private_data out of rdma_cm events, use the\r
+-    reported private_data_len for the size, and not IB maximums.\r
+-    This fixes a bug running over the librdmacm on windows, where\r
+-    DAPL accessed invalid memory.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 5da33bb3b9c230c08492f85d13caa330ce65906e\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Jan 28 10:19:20 2010 -0800\r
+-\r
+-    dapl/cma: fix referencing freed address\r
+-    \r
+-    DAPL uses a pointer to reference the local and remote addresses\r
+-    of an endpoint.  It expects that those addresses are located\r
+-    in memory that is always accessible.  Typically, for the local\r
+-    address, the pointer references the address stored with the DAPL\r
+-    HCA device.  However, for the cma provider, it changes this pointer\r
+-    to reference the address stored with the rdma_cm_id.\r
+-    \r
+-    This causes a problem when that endpoint is connected on the\r
+-    passive side of a connection.  When connect requests are given\r
+-    to DAPL, a new rdma_cm_id is associated with the request.  The\r
+-    DAPL code replaces the current rdma_cm_id associated with a\r
+-    user's endpoint with the new rdma_cm_id.  The old rdma_cm_id is\r
+-    then deleted.  But the endpoint's local address pointer still\r
+-    references the address stored with the old rdma_cm_id.  The\r
+-    result is that any reference to the address will access freed\r
+-    memory.\r
+-    \r
+-    Fix this by keeping the local address pointer always pointing\r
+-    to the address associated with the DAPL HCA device.  This is about\r
+-    the best that can be done given the DAPL interface design.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 66dbb5f20bf494eb3f5041655b478059165c5f1b\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Tue Jan 26 15:13:03 2010 -0800\r
+-\r
+-    dapl: move close device after async thread is done\r
+-    \r
+-    using it\r
+-    \r
+-    Before calling ibv_close_device, wait for the asynchronous\r
+-    processing thread to finish using the device.  This prevents\r
+-    a use after free error.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 560b235adc799fa710571ca63cbc3e4fa6374ff2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jan 11 09:03:10 2010 -0800\r
+-\r
+-    Release 2.0.26-1\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 73dfb32ace6aff2fdb21e54689342fd551822286\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Dec 22 14:00:33 2009 -0800\r
+-\r
+-    openib_common: add check for both gid and global routing in RTR\r
+-    \r
+-    check for valid gid pointer along with global route setting\r
+-    during transition to RTR. Add more GID information to\r
+-    debug print statement in qp modify call.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7aab18fd8ff3f201b0a4b6c76896667b29f103c4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Dec 4 12:31:22 2009 -0800\r
+-\r
+-    openib_common: remote memory read privilege set multi times\r
+-    \r
+-    duplicate setting of read privilege in dapls_convert_privileges\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 016e2c40b8ac2fe18993e9fb7122ecb9b439e5eb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Dec 4 12:25:30 2009 -0800\r
+-\r
+-    ucm, scm: DAPL_GLOBAL_ROUTING enabled causes segv\r
+-    \r
+-    socket cm and ud cm providers support QP modify with is_global\r
+-    set and GRH. New v2 providers didn't pass GID information\r
+-    in modify_qp RTR call and incorrectly byte swapped the already\r
+-    network order GID. Add debug print of GID during global modify.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7b0c596c7b4ad619f65da9f79dcbc4376e651dde\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 24 22:16:58 2009 -0800\r
+-\r
+-    Release 2.0.25-1\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 3197bffff478ad7ff5eff9220fa0528e42e6b56e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 24 22:15:46 2009 -0800\r
+-\r
+-    winof scm: initialize opt for NODELAY setsockopt\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 8559ec069329249592f367b5b8f61427cbad0a46\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 24 11:29:46 2009 -0800\r
+-\r
+-    Release 2.0.25\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 0983c66cbd9511128c1fa221470c4c983903e420\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 24 08:58:44 2009 -0800\r
+-\r
+-    winof cma: windows definition for EADDRNOTAVAIL missing\r
+-    \r
+-    Signed-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit 4fbbcfa1d7bf7a843b27e351d35f3ffbc2ac4db8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 24 08:54:26 2009 -0800\r
+-\r
+-    scm: client side setsockopt NODELAY fails if data arrives before setting\r
+-    \r
+-    Move setsockopt before connect to avoid race with data.\r
+-    Seems to fail on windows. Not seen on linux.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9dfa9a06d55101fed0773028ce7ab85330514c67\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Nov 18 09:52:40 2009 -0800\r
+-\r
+-    cma: setup_listener Cannot assign requested address\r
+-    \r
+-    Colliding with RDS port of 18634. rdma_cm can return\r
+-    either EADDRINUSE or EADDRNOTAVAIL if the bind fails.\r
+-    Add check for either and return proper DAT_CONN_QUAL_IN_USE.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 0698fb56d533a5225cbc3a5a4b8ab2e2d56b7502\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Nov 18 09:43:38 2009 -0800\r
+-\r
+-    common: seg fault in dapl_evd_wait with multi-thread application using CNO's.\r
+-    \r
+-    If we are dealing with event streams besides a CQ event stream,\r
+-    be conservative and set producer side locking.  Otherwise, no.\r
+-    Check for CNO is missing, CNO is not considered CQ event stream.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 4d26a280572a58248b0796e4d5ed01ea5d67be46\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Nov 18 09:37:48 2009 -0800\r
+-\r
+-    ucm: inbound DREQ/DREP handshake should transition QP.\r
+-    \r
+-    During release, when receiving a disconnect request from remote peer\r
+-    instead of a disconnect call from the client, the QP didn't get properly\r
+-    set in ERR state and didn't flush the queue during disconnect processing.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 87965cd15bbfa38b00ed2d77a4ea5a76f76cf4a3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Nov 2 08:24:53 2009 -0800\r
+-\r
+-    winof: Remove duplicate include of comp_channel.cpp from cm.c as it is included in opensm_ucb/device.c.\r
+-    \r
+-    Signed-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit 737fa288b72fad19a1fc3e762eb9f2c471ce6ddd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 30 13:19:21 2009 -0800\r
+-\r
+-    Release 2.0.24\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9fe7506ff9ddf1ae6297cfc6a9dd4d6a57e1939e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 30 12:57:22 2009 -0800\r
+-\r
+-    winof: Utilize WinOF version of inet_ntop() for Windows OSes which do not support inet_ntop().\r
+-    \r
+-    Signed-off-by: stan smith <stan.smith@intel.com>\r
+-\r
+-commit d56c645a2bf234e9e0cf215b112c2aa9d5e01945\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 30 07:17:26 2009 -0800\r
+-\r
+-    ucm: windows build issue with new CQ completion channel\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 2d2e7e1e185c08542ee31b0e77561a1eeb4bde6c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 30 06:35:33 2009 -0800\r
+-\r
+-    winof: add ucm provider to windows build\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 94b2206093607214e0a9709651460692e8196e1c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 30 06:32:56 2009 -0800\r
+-\r
+-    winof: add missing build files for ibal, scm\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 66b76d7a8035b9164b69781d7630a0c77ce1bb5a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 28 09:52:50 2009 -0800\r
+-\r
+-    scm: connection peer resets under heavy load, incorrect event on error\r
+-    \r
+-    Under heavy load, we get a peer reset from the remote stack. In this\r
+-    case retry the socket connection for this QP setup.\r
+-    \r
+-    Add debugging with PID's and socket ports to help isolate\r
+-    these types of socket scaling issues.\r
+-    \r
+-    Report correct UD event during error, check remote_ah creation.\r
+-    \r
+-    Fix dapl_poll return codes for single event type only.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f8108a9bda0200355107fdd6c43cb5885f47d648\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 28 09:47:37 2009 -0800\r
+-\r
+-    ucm: increase default reply and rtu timeout values.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9c13d0d01c78eeb5071e802fbb53811cdb377059\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 28 07:48:20 2009 -0800\r
+-\r
+-    ucm: change some debug message levels and add check for valid UD REPLY during retries.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 1c404bb3dcc0a45e21ef3aa973d59714413beae0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 27 10:37:45 2009 -0800\r
+-\r
+-    ucm: increase timers during subsequent retries\r
+-    \r
+-    check/process create_ah errors during connect phase\r
+-    cleanup some debug messaging.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit cd8c48586f53e846de4fbe10994b73ba457f6406\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Oct 19 10:38:36 2009 -0700\r
+-\r
+-    ucm, scm: address handles need destroyed when freeing Endpoints with UD QP's.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit ce19f5744c0dd9461c09d999b309e8f0e2242767\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 16 14:42:00 2009 -0700\r
+-\r
+-    openib_common: ignore pd free errors, clear pd_handle and return.\r
+-    \r
+-    some older adapters have some issues\r
+-    with pd free so just clear handle and return\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 81f5ac17d9039e2edcd8324f7d5ed5f66fcff9f2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 16 08:52:21 2009 -0700\r
+-\r
+-    ucm: using UD type QP's, ucm reports wrong reject event when user rejects AH resolution request.\r
+-    \r
+-    During rejects, both usr and ucm internal, the qp_type does not get initialized\r
+-    so the check for UD type QP messages fail on active side and the wrong\r
+-    event gets generated. Initialize saddr.ib information before sending reject\r
+-    back to active side.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f0214e5a7a81a68819d308cb921eb75f5246207d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 16 07:57:25 2009 -0700\r
+-\r
+-    ucm, scm, cma: Fix CNO support on DTO type EVD's\r
+-    \r
+-    EVD wait_object should be used for CNO processing\r
+-    and not the direct CQ event channels. Add proper\r
+-    checking for DTO type EVD's with CNO at wait\r
+-    and wakeup.\r
+-    \r
+-    UCM missing support for collective EVD's under a\r
+-    CNO. Add support to create common channel for\r
+-    collective EVD's during device open. Add support\r
+-    in cm_thread to check this channel. Also,\r
+-    during disconnect, move QP to error to properly\r
+-    flush queue instead of moving to reset and init.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 960950a7d9f5437dd831bd56ca2ad0c06cb4e324\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Oct 15 09:19:45 2009 -0700\r
+-\r
+-    ucm: fix lock init bug in ucm_cm_find\r
+-    \r
+-    the lock should be setup as pointer to lock\r
+-    not lock structure. Cleanup lock and list\r
+-    in cm_find function and cm_print function.\r
+-    \r
+-    Add debug aid by passing process id in\r
+-    msg resv area. cleanup cr references\r
+-    and change to cm for consistency.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f86fec772f2d82eaf60228d288b295e0b7b86c59\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 14 10:03:47 2009 -0700\r
+-\r
+-    ucm: fix build problem with latest windows ucm changes\r
+-    \r
+-    define dapls_thread_signal as inline\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 87b6c8ba92f3063a35d49bdb49d6cd0a5100a36c\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Oct 14 09:34:22 2009 -0700\r
+-\r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 9fdd8d74f2cba83e9cf513256933f5241495c1da\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Oct 14 09:34:18 2009 -0700\r
+-\r
+-    The HCA should not be closed until all resources have been released.\r
+-    This results in a hang on windows, since closing the device frees\r
+-    the event processing thread.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit f9833db469f2d686842bb1d52d1ea53b74fa72a8\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Oct 14 09:34:13 2009 -0700\r
+-\r
+-    Fix build warning when compiling on 32-bit systems.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit c80515bd4b1bd11a125dc17e3f7db44240ee1fff\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Oct 14 09:34:07 2009 -0700\r
+-\r
+-    Trying to deregister the same memory region twice leads to an\r
+-    application crash on windows.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 6aa2c0d901daa9cfca7e771c1df2ead074d230bd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 14 07:59:23 2009 -0700\r
+-\r
+-    dat: reduce debug message level when parsing for location of dat.conf\r
+-    \r
+-    Don't output failover to default /etc/dat.conf from\r
+-    sysconfdir at ERROR level. Reduce to DAT_OS_DBG_TYPE_SR.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e4038e078747201b57203f16ba793b7fc22c12f2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Oct 8 16:23:22 2009 -0700\r
+-\r
+-    ucm: update ucm provider for windows environment\r
+-    \r
+-    add dapls_thread_signal abstraction and a new\r
+-    cm_thread function specific for windows.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit d80ce42390eb57b9c4f816b4df063f90bd5699bc\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Oct 8 16:02:52 2009 -0700\r
+-\r
+-    ucm: add timer/retry CM logic to the ucm provider\r
+-    \r
+-    add reply, rtu and retry count options via\r
+-    environment variables. Times in msecs.\r
+-    DAPL_UCM_RETRY 10\r
+-    DAPL_UCM_REP_TIME 400\r
+-    DAPL_UCM_RTU_TIME 200\r
+-    \r
+-    Add RTU_PENDING and DISC_RECV states\r
+-    \r
+-    Add check timer code to the cm_thread\r
+-    and the option to the select abstaction\r
+-    to take timeout values in msecs.\r
+-    DREQ, REQ, and REPLY will all be timed\r
+-    and retried.\r
+-    \r
+-    Split out reply code and disconnect_final\r
+-    code to better facilitate retry timers.\r
+-    Add checking for duplicate messages.\r
+-    \r
+-    Added new UD extension events for errors.\r
+-    DAT_IB_UD_CONNECTION_REJECT_EVENT\r
+-    DAT_IB_UD_CONNECTION_ERROR_EVENT\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 1186bfc949f4bb7278c30c2c59b7fcb6d5142638\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 2 14:49:52 2009 -0700\r
+-\r
+-    Release 2.0.23\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit a5f1220cfd96983c9c89a595d80fab7ddcb1a954\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 2 14:48:15 2009 -0700\r
+-\r
+-    cma: cannot reuse the cm_id and qp for new connection, must reallocate a new one.\r
+-    \r
+-    When merging common code base the dapls_ib_reinit_ep mistakely\r
+-    modified QP to reset then init for all providers. Will\r
+-    not work for rdma_cm (cma provider) since the cm_id cannot\r
+-    be reused.  Add build check for _OPENIB_CMA_ to pull in correct\r
+-    free and reallocate method for reinit_ep.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 7b07435495de0938e59be064fe8642cfd739f1ac\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 2 13:50:12 2009 -0700\r
+-\r
+-    scm, cma: update DAPL cm protocol revision with latest address/port changes\r
+-    \r
+-    CM protocol changed, roll revision to 6.\r
+-    The socket cm could be competing with address space if\r
+-    application is using sockets above to exchange information\r
+-    like dapltest, and MPI consumers. Adjust port on listen\r
+-    and connect to reduce the chance of port collision with\r
+-    application above.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9cc1e76b672f7ff1231b4d113bd4dd1a016d1410\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 2 12:47:37 2009 -0700\r
+-\r
+-    ucm: modify IB address format to align better with sockaddr_in6\r
+-    \r
+-    Restructure the dcm_addr union to map the IB side\r
+-    closer to sockaddr6 and initialize family to\r
+-    AF_INET6 to insure callee allocates enough memory\r
+-    for ucm dat_ia_address type. Put qpn in flowinfo\r
+-    and gid in sin6_addr. Change the test suites\r
+-    to print address information based on AF_INET\r
+-    or AF_INET6 instead of using specific IB address\r
+-    union from the provider.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f50dbe6e82bd471845adf27829b2e07234a0a86a\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Sep 30 14:29:03 2009 -0700\r
+-\r
+-    Add definition for getpid similar to that used by the other dtest apps.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 51147412fad72c00115b595955760e80ff0be7d5\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Sep 30 14:28:57 2009 -0700\r
+-\r
+-    WinOF provides a common implementation of gettimeofday that should\r
+-    be used instead.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 732fc84cee036126282715ea157bdb619fc11ec7\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Wed Sep 30 14:27:50 2009 -0700\r
+-\r
+-    The completion manager was updated to provide an abstraction that\r
+-    better mimicked how fd's were used.  Update dapl to use this\r
+-    abstraction, rather than the older completion manager api.\r
+-    \r
+-    This helps minimize changes between linux and windows.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit fc1855b7738838d3865389405f017b87d223f743\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 30 14:26:47 2009 -0700\r
+-\r
+-    dtestcm: remove IB verb definitions\r
+-    \r
+-    Remove gid and qp_type references from test app.\r
+-    Print address infomation in sockaddr and\r
+-    ucm provider format with qpn and lid.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 36a885d4267be7b3c6c1086372d321121ae03dee\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 30 10:44:14 2009 -0700\r
+-\r
+-    dtest, dtestx: remove IB verb definitions\r
+-    \r
+-    remove gid and qp_type checking from test suite.\r
+-    Print address infomation in sockaddr and\r
+-    ucm provider format with qpn and lid.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 23445bbbd3a09f7f5e666a000d5c7c3b22dd95b3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 28 10:59:36 2009 -0700\r
+-\r
+-    scm: tighten up socket options to insure similiar behavior on Windows and Linux.\r
+-    \r
+-    Add IPPROTO_TCP to create socket. Specify device IP address\r
+-    when binding instead of INADDR_ANY and remove setsocketopt\r
+-    REUSEADDR on the listen socket to avoid any issues with\r
+-    portability. Don't want duplicate port bindings.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b31b64d60abe7c6c1a83484db97176d225076b30\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 28 10:46:26 2009 -0700\r
+-\r
+-    cma: improve serialization of destroy and event processing\r
+-    \r
+-    WinOF testing with slightly different scheduler and verbs\r
+-    showed some issues with cleanup. Add better protection around\r
+-    destroy and event processing thread.\r
+-    \r
+-    Remove destroy flag and add refs counting to conn objects\r
+-    to block destroy until all references are cleared. Add\r
+-    locking aroung ref counting and passive and active\r
+-    event processing.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit a4adf463695ba75beaa1fe79d514346bf5fe2cb5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 28 10:42:52 2009 -0700\r
+-\r
+-    scm: improve serialization of destroy and state changes\r
+-    \r
+-    WinOF testing with slightly different scheduler and verbs\r
+-    showed some issues with cleanup. Add better protection around\r
+-    destroy and move state change before socket send to insure\r
+-    correct state in multi-thread environment targeting the same\r
+-    device on send and recv.\r
+-    \r
+-    Change DCM_RTU_PENDING to DCM_REP_PENDING and\r
+-    and add static definition to local routines for better\r
+-    readability.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 29358ccc587db55fe5f5a1b14eed9e0e31f5f02c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Sep 17 08:56:06 2009 -0700\r
+-\r
+-    common: no cleanup/release code for timer thread\r
+-    \r
+-    dapl_set_timer() creates a thread to process timers for dat_ep_connect\r
+-    but provides no mechanism to destroy/exit during dapl library unload.\r
+-    Timers are initialized in library init code and should be released\r
+-    in the fini code. Add a dapl_timer_release call to the dapl_fini\r
+-    function to check state of timer thread and destroy before exiting.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e287ce12f5b0108ef83186aae305f25af8cdd02c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Sep 17 08:53:29 2009 -0700\r
+-\r
+-    scm, cma: dapli_thread doesn't always get teminated on library close.\r
+-    \r
+-    DAPL doesn't actually wait for the async processing thread to exit before\r
+-    allowing the library to close.  It will wait up to 10 seconds, which under\r
+-    heavy load isn't enough time.  Since the thread is created by an application\r
+-    level thread, it will continue to run as long as the application runs.  But\r
+-    if the application closes the library, then all library data and code is\r
+-    invalid, which can result in the thread running something that's not\r
+-    library code and accessing freed memory.\r
+-    \r
+-    With this change, I was able to run mpi ping-pong, 16 ranks on a single\r
+-    system (scm provider) without crashes 1300 times.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 5bffe521c6ad7a5ce10457a5d7b25814522a0cde\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 9 13:10:35 2009 -0700\r
+-\r
+-    ucm: tighten up locking with CM processing, state changes\r
+-    \r
+-    tighten up locking on CM processing and state changes\r
+-    and reduce the send completion threshold to 50 from 100\r
+-    to replenish the request message faster.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e38daa8448bc3b73c53e54ffc9ac47b9cfc2af89\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 9 09:44:03 2009 -0700\r
+-\r
+-    ucm: For UD type QP's, return CR p_data with CONN_EST event on passive side.\r
+-    \r
+-    Intel MPI uses the p_data provided with CONN_EST as a reference to the\r
+-    UD pair and remote rank. The ucm provider was overwriting the CR p_data\r
+-    with the ACCEPT p_data. Change to save CR p_data but also provide\r
+-    storage for user provided ACCEPT p_data in case the REPLY is lost\r
+-    and needs retransmitted.\r
+-    \r
+-    p_data size was provided to event processing in network order\r
+-    instead of host order.\r
+-    \r
+-    For new QP's create new address handles and do not use\r
+-    existing AH's created for the CM. Different PD's are\r
+-    associated with each.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 0bc6a0954bc1a1a61e1b1cbc5c280f69ed168453\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 8 09:14:46 2009 -0700\r
+-\r
+-    ucm: cleanup extra cr/lf\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 6e7df65a884b4e068135e64dcb3ec660f4c7ab14\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 8 09:11:37 2009 -0700\r
+-\r
+-    ucm: fix issues with UD QP's.\r
+-    \r
+-    private data size not in host order when processing\r
+-    connection events.\r
+-    \r
+-    ud extentions event should include original ia_addr\r
+-    and qpn used during connection and not the IB qpn.\r
+-    \r
+-    ucm QP service resource cleanup in wrong order.\r
+-    \r
+-    cleanup extra cr/lf device.c\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e7c3090945c13f80abb929643fc975465afeeb53\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Sep 3 10:45:56 2009 -0700\r
+-\r
+-    winof: Convert windows version of dapl and dat libaries to use private heaps.\r
+-    \r
+-    This allows for better support of memory registration caching by upper\r
+-    level libaries (MPI) that use SecureMemoryCacheCallback.\r
+-    \r
+-    It also makes it easier to debug heap corruption issues.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit bc3c8a34558880c8d09a03e3eb7c3f50d7762c67\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 2 14:01:51 2009 -0700\r
+-\r
+-    dtest, dtestx: modifications for UD QP testing with ucm provider.\r
+-    \r
+-    remote_addr is wrong for IP remote address.\r
+-    \r
+-    The dtestx requires the server connect back to the client\r
+-    for the UD test. With the ucm provider you need to provide\r
+-    the QPN and the LID which you cannot get until the dtest\r
+-    client starts. So, for now, don't support UD testing\r
+-    on UCM providers.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e4555143ca71ebe18d8c9f027e2e7a5282088a30\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 2 13:54:59 2009 -0700\r
+-\r
+-    scm, ucm: UD QP support was broken when porting to common openib code base.\r
+-    \r
+-    create remote_ah was moved out of modify_qp_state function but not\r
+-    included in the RTU and ACCEPT code for UD QP's. qp type check\r
+-    should be on daddr not saddr in ucm cm code.\r
+-    \r
+-    QP number must be converted to host order before supplying remote_ah,\r
+-    and qp number to consumer.\r
+-    \r
+-    Modify QP state to RTR for UD QP mask setting incorrect.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 375d368494bb2f9bb44c82073abc60e01ac28615\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 1 13:02:24 2009 -0700\r
+-\r
+-    cma: cleanup warning with unused local variable, ret, in disconnect\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 72d1c0c984919809ecd94b2e4ede31ec56668518\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 1 12:36:31 2009 -0700\r
+-\r
+-    cma: remove debug message after rdma_disconnect failure\r
+-    \r
+-    DAPL automatically calls rdma_disconnect() when a disconnect request is\r
+-    received.  If the user also calls disconnect, that calls rdma_disconnect() as\r
+-    well, but the connection has already been disconnected by DAPL and is no longer\r
+-    valid.  The result is that the user's call to rdma_disconnect() will fail.  Do\r
+-    not display an error message if this occurs.\r
+-    \r
+-    Locking could be added to prevent calling rdma_disconnect() multiple times, but\r
+-    since the librdmacm provides synchronization to trap this, we might as well take\r
+-    advantage of it.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 290c568030da6df398a4afb932b5d4f9bd585c26\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 1 12:27:43 2009 -0700\r
+-\r
+-    scm: socket errno check needs O/S dependent wrapper\r
+-    \r
+-    Intel MPI checks the uDAPL error code when calling dat_psp_create() to see if\r
+-    the port number that it provides is in use or not.  Convert winsock error codes\r
+-    to unix errno values.\r
+-    \r
+-    This fixes the following error reported by Intel MPI:\r
+-    'DAPL provider is not found and fallback device is not enabled'\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 03b6d1b58ae03058a509c54ffe27147cc44d1851\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 1 12:13:16 2009 -0700\r
+-\r
+-    dapltest: update script files for WinOF\r
+-    \r
+-    Cleanup 64-bit paths now that WinOF is always installed into '\Program Files\WinOF'.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e38585be89e9fa8f139002a3fe1a82eb86438f93\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Sep 1 12:10:21 2009 -0700\r
+-\r
+-    cma: conditional check for new rdma_cm definition.\r
+-    \r
+-    RDMA_CM_EVENT_TIMEWAIT_EXIT is new to OFED 1.4\r
+-    add conditional check so dapl can build and run\r
+-    against older OFED 1.3 stacks\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 83af586b77aa905b63de6dd6010cd60e91487a9e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Aug 20 09:13:43 2009 -0700\r
+-\r
+-    Release 2.0.22\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 48bc0dc95093ccbfe5e01cef4877c128e2caaf77\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Aug 20 09:12:47 2009 -0700\r
+-\r
+-    dapltest: add mdep processor yield and use with dapltest\r
+-    \r
+-    Be thread scheduler friendly and release the current thread thus allowing other threads to run.\r
+-    \r
+-    Signed off by Stan Smith stan.smith@intel.com\r
+-\r
+-commit e13f255a06b9d2a2ed4eec9a62f9fe105d0c26d7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Aug 18 10:15:15 2009 -0700\r
+-\r
+-    ucm: Add new provider using a DAPL based IB-UD cm mechanism for MPI implementations.\r
+-    \r
+-    New provider uses it's own CM protocol on top of IB-UD queue pairs.\r
+-    During device open, this provider creates a UD queue pair and\r
+-    returns local address information via dat_ia_query. This 24 byte\r
+-    opaque address must be exchange out-of-band before connecting to a\r
+-    server via dat_ep_connect. This provider is targeted for MPI\r
+-    implementations that already exchange address information\r
+-    during mpi_init phase.\r
+-    \r
+-    Future release may provide some ARP mechanism via multicast.\r
+-    \r
+-    dtest, dtestx, and dtestcm was modified to report the lid and qpn\r
+-    information on the server side so you can provide appropriate\r
+-    destination address information for the client test suite.\r
+-    \r
+-    dapltest will not work with this provider.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 38d224dd95896c7e60f0bc0ffa52b26ab78f489b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Aug 4 20:54:12 2009 -0700\r
+-\r
+-    Release 2.0.21\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit ed4999a26043c9c3c73c792b21d24ced1df1553c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Aug 4 20:49:09 2009 -0700\r
+-\r
+-    scm: Fix disconnect. QP's need to move to ERROR state in\r
+-    order to flush work requests and notify consumer. Moving to\r
+-    RESET removed all requests but did not notify consumer.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 512f1d7a480f06a1fa491d21870e560ad111c4d0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Aug 4 20:48:03 2009 -0700\r
+-\r
+-    modify dtest.c to cleanup CNO wait code and consolidate into\r
+-    collect_event() call. After waking up from CNO wait the\r
+-    consumer must check all EVD's. The EVD's under the CNO\r
+-    could be dropped if already triggered or could come in any order.\r
+-    DT_RetToString changed to DT_RetToStr and DT_EventToSTr\r
+-    changed to DT_EventToStr for consistency.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 024e36975d37a1556bf68145e1573f637d269bfc\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Aug 4 20:47:17 2009 -0700\r
+-\r
+-    CNO events, once triggered will not be returned during the cno wait.\r
+-    Check for triggered state before going to sleep in cno_wait. Reset\r
+-    triggered EVD reference after reporting.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 6d6c72a49158d10825929111d6b4df1c6d2bb589\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sun Aug 2 14:21:09 2009 -0700\r
+-\r
+-    CNO support broken in both CMA and SCM providers.\r
+-    \r
+-    CQ thread/callback mechanism was removed by mistake. Still\r
+-    need indirect DTO callbacks when CNO is attached to EVD's.\r
+-    \r
+-    Add CQ event channel to cma provider's thread and add\r
+-    to select for rdma_cm and async channels.\r
+-    \r
+-    For scm provider there is not easy way to add this channel\r
+-    to the select across sockets on windows. So, for portablity\r
+-    reasons 2 thread is started to process the ASYNC and\r
+-    CQ channels for events.\r
+-    \r
+-    Must disable EVD (evd_endabled=FALSE) during destroy\r
+-    to prevent EVD events firing for CNOs and re-arming CQ while\r
+-    CQ is being destroyed.\r
+-    \r
+-    Change dtest to check EVD after CNO timesout.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 6fe8bd1d8f44777211e816b72e0b2a6d22900207\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 30 08:02:30 2009 -0700\r
+-\r
+-    common osd: include winsock2.h for IPv6 definitions.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit bd26383900d18962aeeff54fa59922009091ecfc\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jul 29 08:02:15 2009 -0700\r
+-\r
+-    common osd: include w2tcpip.h for sockaddr_in6 definitions.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f25544f14554200a6714accef5f761b0269b5819\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Mon Jul 27 15:07:33 2009 -0700\r
+-\r
+-    DAPL introduced the concept of directly waiting on the CQ for\r
+-    events by adding a compile time flag and special handling in the common\r
+-    code.  Rather than using the compile time flag and modifying the\r
+-    common code, let the provider implement the best way to wait for\r
+-    CQ events.\r
+-    \r
+-    This simplifies the code and allows the common openib providers to\r
+-    optimize for Linux and Windows platforms independently, rather than\r
+-    assuming a specific implementation for signaling events.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 1548405a377d2bd17938df69419e9bcf3364d91a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 16 12:41:22 2009 -0700\r
+-\r
+-    dapltest: Implement a malloc() threshold for the completion reaping.\r
+-    \r
+-    change byte vector allocation to stack in functions:\r
+-      DT_handle_send_op, DT_handle_rdma_op & DT_handle_recv_op.\r
+-    \r
+-    When allocation size is under the threshold, use a stack local\r
+-    allocation instead of malloc/free.  Move redundant bzero() to\r
+-    be called only in the case of using local stack allocation as\r
+-    DT_Mdep_malloc() already does a bzero(). Consolidate error handling\r
+-    return and free()check to a single point by using goto.\r
+-    \r
+-    Signed-off-by: Stan Smith <stan.smith@intel.com>\r
+-\r
+-commit f6311ca7295230bf9efbcddc639fa8e1065b1f3d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 16 12:32:09 2009 -0700\r
+-\r
+-    scm: handle connected state when freeing CM objects\r
+-    \r
+-    The QP could be freed before being disconnected\r
+-    so the provider needs process disconnect before freeing\r
+-    the CM object. The disconnect clean will finish\r
+-    the destroy process during the disc callback.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 4387359106ce398b29847982883016f7fd48b372\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jul 8 12:49:43 2009 -0700\r
+-\r
+-    scm, dtest: changes for winof gettimeofday and FD_SETSIZE settings.\r
+-    \r
+-    scm changes to set FD_SETSIZE with expected value and\r
+-    prevent windows override.\r
+-    \r
+-    dtest: remove gettimeofday implementation for windows\r
+-    specific implemenation etc\user\gtod.c\r
+-    \r
+-    general EOL cleanup\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 3542a83d8a31f5ac68adf3aa44e3ebf1265068df\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jul 6 09:24:07 2009 -0700\r
+-\r
+-    scm: set TCP_NODELAY sockopt on the server side for sends.\r
+-    \r
+-    scm provider sends small messages from both server and client\r
+-    sides. Set NODELAY on both sides to avoid send delays either\r
+-    way.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9d591180392856935b9c3befbab2243dd8daf628\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 2 14:16:52 2009 -0700\r
+-\r
+-    windows: remove obsolete files in dapl/udapl source tree\r
+-    \r
+-    SOURCES,makefile,udapl.r,udapl_exports.src,udapl_sources.c\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 85c238ee0a41dd0a4a24b3d422f34674b0183161\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 2 14:11:20 2009 -0700\r
+-\r
+-    dtestcm: add UD type QP option to test\r
+-    \r
+-    Add -u for UD type QP's during connection setup.\r
+-    Will setup UD QPs and provide remote AH\r
+-    in connect establishment event. Measures\r
+-    setup/exchange rates.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 89a2211526e37b1db58fc0ea663b330bc19125c8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 2 14:07:36 2009 -0700\r
+-\r
+-    scm: destroy QP called before disconnect\r
+-    \r
+-    Handle the case where QP is destroyed before\r
+-    disconnect processing. Windows supports\r
+-    reinit_qp during a disconnect call by\r
+-    destroying the QP and recreating the\r
+-    QO instead of state change from reset\r
+-    to init. Call disconnect in destroy\r
+-    CM code to handle this unexpected state.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 6eb35b7d69a896c256b1031337d3353575cd07b4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jul 2 14:03:12 2009 -0700\r
+-\r
+-    cma: add support for rdma_cm TIME_WAIT event.\r
+-    \r
+-    Nothing to process, simply ack the event.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b6c56b3052ecd3e36c32092ee62ff0c724da5ad4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jul 1 07:58:32 2009 -0700\r
+-\r
+-    scm: remove old udapl_scm code replaced by openib_scm.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 5bbae42a56e1cca678d590ac4c841dd61e839d74\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jul 1 07:53:18 2009 -0700\r
+-\r
+-    winof: fix build issues after consolidating cma, scm code base.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 6bd1d931c4d0d4cbafac383f225140120aee4c51\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jul 1 07:51:59 2009 -0700\r
+-\r
+-    cma: lock held when exiting as a result of a rdma_create_event_channel failure.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b8a14ff1cc257defa2f74373d143600f5f471823\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Mon Jun 29 12:34:54 2009 -0700\r
+-\r
+-    windows: all dlist functions have been moved to the header file.\r
+-    remove references to dlist.c\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 1a081a0a467e4773a641e8edc876a7a4d7a30ca8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 29 12:13:48 2009 -0700\r
+-\r
+-    dtestcm windows: add build infrastructure for new dtestcm test suite\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit c37d7a25dca97011ea76e2a541f936d10ca658e0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 29 08:57:46 2009 -0700\r
+-\r
+-    openib_common: reorganize provider code base to share common mem, cq, qp, dto functions\r
+-    \r
+-    add new openib_common directory with cq, qp, util, dto, mem function calls\r
+-    and definitions. This basically leaves the unique CM and Device definitions\r
+-    and functions to the individual providers directory of openib_scm and openib_cma.\r
+-    \r
+-    modifications to dapl_cr_accept required. ep->cm_handle is allocated\r
+-    and managed entirely in provider so dapl common code should not update\r
+-    ep_handle->cm_handle from the cr->cm_handle automatically. The provider\r
+-    should determine which cm_handle is required for the accept.\r
+-    \r
+-    openib_cma defines _OPENIB_CMA_ and openib_scm defines _OPENIB_SCM_ for provider\r
+-    specific build needs in common code.\r
+-\r
+-commit 961a4083ffb646c070137abd33e9ba2ea9482685\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 26 14:45:34 2009 -0700\r
+-\r
+-    scm: fixes and optimizations for connection scaling\r
+-    \r
+-    Prioritize accepts on listen ports via FD_READ\r
+-    process the accepts ahead of other work to avoid\r
+-    socket half_connection (SYN_RECV) stalls.\r
+-    \r
+-    Fix dapl_poll to return DAPL_FD_ERROR on\r
+-    all event error types.\r
+-    \r
+-    Add new state for socket released, but CR\r
+-    not yet destroyed. This enables scm to release\r
+-    the socket resources immediately after exchanging\r
+-    all QP information. Also, add state to str call.\r
+-    \r
+-    Only add the CR reference to the EP if it is\r
+-    RC type. UD has multiple CR's per EP so when\r
+-    a UD EP disconnect_clean was called, from a\r
+-    timeout, it destroyed the wrong CR.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit a60a9e1fce5588cb23f41391b48acf04edd82499\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 26 14:31:19 2009 -0700\r
+-\r
+-    scm: double the default fd_set_size\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 17d5e1692db4ae1eb09aa919d5607f22851d7ec5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 26 14:28:30 2009 -0700\r
+-\r
+-    scm: EP reference in CR should be cleared during ep_destroy\r
+-    \r
+-    The EP reference in the CR should be set to null\r
+-    during the EP free call to insure no further\r
+-    reference back to a mem freed EP.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit ebb820364cec9d72285c005a0874e7d459a9ff7d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 26 14:23:35 2009 -0700\r
+-\r
+-    dtestx: fix conn establishment event checking\r
+-    \r
+-    not catching error cases on client side\r
+-    when checking for event number and UD type\r
+-    && should have been ||\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 747b793898042e3011fbad4b2d1285d2c040cb13\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 26 14:18:37 2009 -0700\r
+-\r
+-    dtestcm: new test to measure dapl connection rates.\r
+-    \r
+-    new test suite added to measure connection\r
+-    rates of providers. Used to compare cma, scm,\r
+-    and other providers under development.\r
+-    \r
+-    dtestcm USAGE\r
+-    \r
+-    s: server\r
+-    c: connections (default = 1000)\r
+-    b: burst rate of conn_reqs (default = 100)\r
+-    m: multi-listens (set to burst setting )\r
+-    v: verbose\r
+-    w: wait on event (default, polling)\r
+-    d: delay before accept\r
+-    h: hostname/address of server, specified on client\r
+-    P: provider name (default = OpenIB-v2-ib0)\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit d58fbc3a870a060ead882e1d15c6d245cdf39096\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 19 20:59:16 2009 -0700\r
+-\r
+-    Release 2.0.20\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit beebe0066b47d7bf476925ff280bad2a3db38324\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 19 20:52:51 2009 -0700\r
+-\r
+-    common,scm: add debug capabilities to print in-process CM lists\r
+-    \r
+-    Add a new debug bit DAPL_DBG_TYPE_CM_LIST.\r
+-    If set, the pending CM requests will be\r
+-    dumped when dat_print_counters is called.\r
+-    Only provided when built with -DDAPL_COUNTERS\r
+-    \r
+-    Add new dapl_cm_state_str() call for state\r
+-    to string conversion for debug prints.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b1c51f1e68993d9306e3ebd48bd3a1f0e9878fa3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jun 16 09:22:31 2009 -0700\r
+-\r
+-    scm: disconnect EP before cleaning up orphaned CR's during dat_ep_free\r
+-    \r
+-    There is the possibility of dat_ep_free being called\r
+-    with RC CR's still in connected state. Call disconnect\r
+-    on the CR before marking for destroy.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 531d223455a88c885d6c5f7b1d7e158c1079fbce\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 10 12:05:17 2009 -0700\r
+-\r
+-    dapltest: windows scripts updated\r
+-    \r
+-    Support added for provider specification and general simplification of internal workings.\r
+-    \r
+-    Signed-off-by: Stan Smith <stan.smith@intel.com>\r
+-\r
+-commit 049d1ea08643d4c4eff761741641d37bb3f01fc1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 10 09:18:09 2009 -0700\r
+-\r
+-    scm: private data is not handled properly via CR rejects.\r
+-    \r
+-    For both RC and UD connect requests, the private\r
+-    data is not being received on socket and passed\r
+-    back via the active side REJECT event.\r
+-    \r
+-    UD requires new extended reject event type of\r
+-    DAT_IB_UD_CONNECTION_REJECT_EVENT to distiquish\r
+-    between RC and UD type rejects.\r
+-    \r
+-    cr_thread exit/cleanup processing fixed to insure\r
+-    all items are off the list before exiting.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 3c26870e276a934e2009090e0fca8bdc36c1be67\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 10 09:09:56 2009 -0700\r
+-\r
+-    scm: cleanup orphaned UD CR's when destroying the EP\r
+-    \r
+-    UD CR objects are kept active because of direct private data references\r
+-    from CONN events. The cr->socket is closed and marked inactive but the\r
+-    object remains allocated and queued on the CR resource list. There can\r
+-    be multiple CR's associated with a given EP and there is no way to\r
+-    determine when consumer is finished with event until the dat_ep_free.\r
+-    Schedule destruction for all CR's associated with this EP during\r
+-    free call. cr_thread will complete cleanup with state of SCM_DESTROY.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 73abd3f58fa7b14241fad98912ef27c7b4fdb47e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 10 09:05:32 2009 -0700\r
+-\r
+-    scm: provider specific query for default UD MTU is wrong.\r
+-    \r
+-    Change the provider specific query DAT_IB_TRANSPORT_MTU\r
+-    to report 2048 for new default MTU size.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 27c0d7edc4c931b808a7c5a24bd5aa2625b48aa1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 10 10:06:59 2009 -0700\r
+-\r
+-    scm: update CM code to shutdown before closing socket\r
+-    \r
+-    data could be lost without calling shutdown on the socket\r
+-    before closing. Update to shutdown and then close. Add\r
+-    definition for SHUT_RW to SD_BOTH for windows.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-    ---\r
+-\r
+-commit 536ec3103c15c1fed4367326c9117660345e0eab\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jun 4 13:48:18 2009 -0700\r
+-\r
+-    dapltest: windows script dt-cli.bat updated\r
+-    \r
+-    scn should be scm\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e8991b8f0877b0e2e857717e1140c679e9266abe\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Jun 4 08:19:12 2009 -0700\r
+-\r
+-    dapl/windows cma provider: add support for network devices based on index\r
+-    \r
+-    The linux cma provider provides support for named network devices, such\r
+-    as 'ib0' or 'eth0'.  This allows the same dapl configuration file to\r
+-    be used easily across a cluster.\r
+-    \r
+-    To allow similar support on Windows, allow users to specify the device\r
+-    name 'rdma_devN' in the dapl.conf file.  The given index, N, is map to a\r
+-    corresponding IP address that is associated with an RDMA device.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 79fa3e7d241f740bc886dd075f24fcbc611306de\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jun 4 08:00:29 2009 -0700\r
+-\r
+-    openib: remove 1st gen provider, replaced with openib_cma and openib_scm\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 624039247cdc0db7aa040dfbb4dced00f2cf9006\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 29 08:21:10 2009 -0700\r
+-\r
+-    dapltest: update windows script files\r
+-    \r
+-    Enhancement to take DAPL provider name as cmd-line arguement.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit b93baa07b7bbaeb7a55fa817c354d0c94783d61f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu May 28 15:30:05 2009 -0700\r
+-\r
+-    dapltest: update windows batch files in sripts directory\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 2f185c6b5e464c4fc9e84ad3e90cc2b86aebf9aa\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 18 14:00:02 2009 -0700\r
+-\r
+-    windows_osd/linux_osd: new dapl_os_gettid macro to return thread id\r
+-    \r
+-    Change dapl_os_getpid inline to macro on windows and add dapl_os_gettid\r
+-    macros on linux and windows to return thread id.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 984303824cd0c3e248a789066cf665ced8e1ae5b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 18 13:53:59 2009 -0700\r
+-\r
+-    windows: missing build files for common and udapl sub-directories\r
+-    \r
+-    Add dapl/dapl_common_src.c and dapl/dapl_udapl_src.c\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 3be4ccf9681a975e74a5aa05e3f7912477f342a7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 18 09:06:19 2009 -0700\r
+-\r
+-    windows: add build files for openib_scm, remove /Wp64 build option.\r
+-    \r
+-    Add build files for windows socket cm and change build\r
+-    option on windows providers. The new Win7 WDK issues a\r
+-    depreciated compiler option warning for /Wp64\r
+-    (Enable 64-bit porting warnings)\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 163112cfeb6e409886b3cb7f85da7ce003300d5c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 18 08:50:35 2009 -0700\r
+-\r
+-    scm: multi-hca CM processing broken. Need cr thread wakeup mechanism per HCA.\r
+-    \r
+-    Currently there is only one pipe across all\r
+-    device opens. This results in some posted CR work\r
+-    getting delayed or not processed at all. Provide\r
+-    pipe for each device open and cr thread created\r
+-    and manage on a per device level.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit e6e799f623df6ef136ffc5388251d3f3a38c8a91\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 15 11:06:19 2009 -0700\r
+-\r
+-    dtest: add connection timers on client side\r
+-    \r
+-    Add timers for active connections and print\r
+-    results. Allow polling or wait on conn event.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit d656bbf619123deaed6e8985e52207e5415f359f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 15 09:48:38 2009 -0700\r
+-\r
+-    linux_osd: use pthread_self instead of getpid for debug messages\r
+-    \r
+-    getpid provides process ids which are not unique. Use unique thread\r
+-    id's in debug messages to help isolate issues across many device\r
+-    opens with multiple CM threads.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 92bb0d2933d3d1546e18f0479475f3daf5b92052\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 1 10:18:05 2009 -0700\r
+-\r
+-    windows ibal-scm: dapl/dirs file needs updated to remove ibal-scm\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 9c37d9d667fb7e8f21841bbec4a84b2c652fffe1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 29 23:13:36 2009 -0700\r
+-\r
+-    Release 2.0.19\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 29 14:33:28 2009 -0700\r
+-\r
+-    scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit\r
+-    \r
+-    mismatch of device attribute size restricts max_lmr_block_size to 32 bit\r
+-    value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes.\r
+-    \r
+-    Consumers should use max_lmr_virtual_address for actual max\r
+-    registration block size until attribute interface changes.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit f91f27eaaab28b13a631adf75b933b7be3afbc0f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 29 10:51:03 2009 -0700\r
+-\r
+-    scm: increase default MTU size from 1024 to 2048\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit 8d6846056f4c86b6a06346147df55d37c4ba9933\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 29 10:49:09 2009 -0700\r
+-\r
+-    openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge\r
+-    \r
+-    no need to rebuild scatter gather list given that DAT v2.0\r
+-    is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 29 08:39:37 2009 -0700\r
+-\r
+-    dtest: add flush EVD call after data transfer errors\r
+-    \r
+-    Flush and print entries on async, request, and receive\r
+-    queues after any data transfer error. Will help\r
+-    identify failing operation during operations\r
+-    without completion events requested.\r
+-    Fix -B0 so burst size of 0 works.\r
+-    \r
+-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+-\r
+-commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 22 13:16:19 2009 -0700\r
+-\r
+-    dtest/dapltest: Cleanup code with Lindent\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 21 15:51:24 2009 -0700\r
+-\r
+-    ibal-scm: remove, obsolete\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 67ddd6bfba46f1f7a61b772257132f1257d05c96\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 21 15:44:15 2009 -0700\r
+-\r
+-    scm, cma provider: Cleanup code with Lindent\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d0898091090ff19be7929fed0d14f1ca696d5e53\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 21 15:39:01 2009 -0700\r
+-\r
+-    udapl: Cleanup code with Lindent\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 21 15:31:20 2009 -0700\r
+-\r
+-    dapl common: Cleanup code with Lindent\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 21 12:52:29 2009 -0700\r
+-\r
+-    dat: Cleanup code with Lindent\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 20 12:28:08 2009 -0700\r
+-\r
+-    Release 2.0.18\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Apr 16 14:35:18 2009 -0700\r
+-\r
+-    dapltest: reset server listen ports to avoid collisions during long runs\r
+-    \r
+-    If server is running continuously the port number increments\r
+-    from base without reseting between tests. This will\r
+-    eventually cause collisions in port space.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit c27af8de0501d132b8152ec8546023cdba212de5\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Apr 16 10:21:51 2009 -0700\r
+-\r
+-    To avoid duplicating port numbers between different tests, the next port\r
+-    number to use must increment based on the number of endpoints per thread *\r
+-    the number of threads.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 3084310197c20aaa50abe82260fc835786f591f5\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Apr 16 10:21:45 2009 -0700\r
+-\r
+-    dapltest assumes that events across multiple endpoints occur in a specific\r
+-    order.  Since this is a false assumption, avoid this by directing events to\r
+-    per endpoint EVDs, rather than using shared EVDs.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Apr 16 10:21:41 2009 -0700\r
+-\r
+-    Synchronization is missing between removing items from an EVD and queuing\r
+-    them.  Since the removal thread is the user's, but the queuing thread is\r
+-    not, the synchronization must be provided by DAPL.  Hold the evd lock\r
+-    around any calls to dapls_rbuf_*.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit f5e86d28f803162ffdf94b41ec7435dec92f728d\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Apr 16 10:21:26 2009 -0700\r
+-\r
+-    Communication to the CR thread is done using an internal socket.  When a\r
+-    new connection request is ready for processing, an object is placed on\r
+-    the CR list, and data is written to the internal socket.  The write causes\r
+-    the CR thread to wake-up and process anything on its cr list.\r
+-    \r
+-    If multiple objects are placed on the CR list around the same time, then\r
+-    the CR thread will read in a single character, but process the entire list.\r
+-    This results in additional data being left on the internal socket.  When\r
+-    the CR does a select(), it will find more data to read, read the data, but\r
+-    not have any real work to do.  The result is that the thread spins in a\r
+-    loop checking for changes when none have occurred until all data on the\r
+-    internal socket has been read.\r
+-    \r
+-    Avoid this overhead by reading all data off the internal socket before\r
+-    processing the CR list.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Apr 16 10:21:13 2009 -0700\r
+-\r
+-    The dapl connect call takes as input an address (sockaddr) and a port number\r
+-    as separate input parameters.  It modifies the sockaddr address to set the\r
+-    port number before trying to connect.  This leads to a situation in\r
+-    dapltest with multiple threads that reference the same buffer for their\r
+-    address, but specify different port numbers, where the different threads\r
+-    end up trying to connect to the same remote port.\r
+-    \r
+-    To solve this, do not modify the caller's address buffer and instead use\r
+-    a local buffer.  This fixes an issue seen running multithreaded tests with\r
+-    dapltest.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 7947026ede478f08b4a7b8cb607f457765bf2afa\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Apr 16 10:21:03 2009 -0700\r
+-\r
+-    Windows socket calls should check return values against SOCKET_ERROR to\r
+-    determine if an error occurred.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 10 08:33:41 2009 -0700\r
+-\r
+-    Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST\r
+-    \r
+-    Fix rpmbuild problem with new cma osd include file.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit acb213adb3268e9bf6999e2bf040d4a71212b701\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 10 08:32:24 2009 -0700\r
+-\r
+-    dapl scm: reduce wait time for thread startup.\r
+-    \r
+-    thread startup wait reduce to 2ms to reduce open times.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 55459699fa9c0e5fb7e2b17822f0916412c64b35\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 10 08:31:22 2009 -0700\r
+-\r
+-    dapl-scm: getsockopt optlen needs initialized to size of optval\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d710c5327e05a40796341d16b45a2b098b03f588\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:17:32 2009 -0700\r
+-\r
+-    The connection request thread adds sockets to a select list unless\r
+-    the cr->socket is invalid and the cr request state is set to destroy.  If the\r
+-    cr->socket is invalid, but the cr->state is not destroy, then the cr->socket\r
+-    is added to an FD set for select/poll.  This results in select/poll\r
+-    returning an error when select is called.  As a result, the cr thread never\r
+-    actually blocks during this state.\r
+-    \r
+-    Fix this by only destroying a cr based on its state being set to destroy\r
+-    and skip adding cr->sockets to the FD set when they are invalid.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:08:16 2009 -0700\r
+-\r
+-    Make sure all locks are initialized properly and don't zero their memory\r
+-    once they are.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:08:13 2009 -0700\r
+-\r
+-    The lock functions are defined just a few lines beneath the prototypes\r
+-    as inline.  Remove the duplicate prototypes.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 9578c4aeb9878d98374e4b7abc02db182aef82c6\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:08:07 2009 -0700\r
+-\r
+-    Make sure all locks are initialized and don't zero out their memory once\r
+-    they are.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 97edcbb662b489303ef68c0da02831efaddeed91\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:08:03 2009 -0700\r
+-\r
+-    The IBAL library allocates a small number of threads for callbacks to the\r
+-    user.  If the user blocks all of the callback threads, no additional\r
+-    callbacks can be invoked.  The DAPL IBAL provider cancels listen requests\r
+-    from within an IBAL callback, then waits for a second callback to confirm\r
+-    that the listen has been canceled.  If there is a single IBAL callback\r
+-    thread, or multiple listens are canceled simultaneously, then the provider\r
+-    can deadlock waiting for a cancel callback that never occurs.\r
+-    \r
+-    This problem is seen when running dapltest with multiple threads.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:57 2009 -0700\r
+-\r
+-    We need to check the return value from select for errors before checking\r
+-    the FD sets.  An item may be in an FD set but select could have returned\r
+-    an error.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit a8a977becaeefe0d7f8e01e01631a11988d2d54e\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:53 2009 -0700\r
+-\r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:49 2009 -0700\r
+-\r
+-    Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ\r
+-    completion channels in the Windows version of the openib_scm provider.\r
+-    Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages\r
+-    instead of DAPL_DBG_TYPE_CM.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 73728763666a46df5789af93b50db53cdf64afd6\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:44 2009 -0700\r
+-\r
+-    The IBAL-SCM provider will run into an inifinite loop if the check for\r
+-    cr->socket > SCM_MAX_CONN - 1 fails.  The code continues back to the start\r
+-    of the while loop without moving to the next connection request entry\r
+-    in the list.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 9b1b396539926d36ffacfff04fbe7c081e436b45\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:40 2009 -0700\r
+-\r
+-    next_cr is set just before and inside the check\r
+-    if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY)\r
+-    Remove setting it inside the if statement.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:35 2009 -0700\r
+-\r
+-    Some errors on windows are more easily interpretted in hex than decimal.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 08ee072a1396ac2c28983878dbc6b02feb035787\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:32 2009 -0700\r
+-\r
+-    The WinOF HCA driver cannot handle transitioning from RTS -> RESET ->\r
+-    INIT -> ERROR.  Simply delete the QP and re-create it to reinitialize\r
+-    the endpoint until the bug is fixed.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:23 2009 -0700\r
+-\r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit a8582be0e1fc89e856f1d0b43a3c1b271295a352\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:07:18 2009 -0700\r
+-\r
+-    Convert the openib_cma provider to common code between linux and windows.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Apr 10 08:06:53 2009 -0700\r
+-\r
+-    Move from using pipes to sockets for internal communication.  This\r
+-    avoids issues with windows only supporting select() on sockets.\r
+-    \r
+-    Remove windows specific definition of dapl_dbg_log.\r
+-    \r
+-    Update to latest windows libibverbs implementation using completion\r
+-    channel abstraction to improve windows scalability and simplify\r
+-    porting where FD's are accessed directly in Linux.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit b3ad2ed97399a24a869841e17d1314e11c379aae\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 31 05:41:50 2009 -0800\r
+-\r
+-    Release 2.0.17\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 5d732929f8a90a490994e8e35a3666c3647ad4fe\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 31 05:22:11 2009 -0800\r
+-\r
+-    dapl: ia64 build problem on SuSE 11, atomic.h no longer exists.\r
+-    \r
+-    Add autotools check for SuSE 11 and include intrinsics.h\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 16 13:23:50 2009 -0800\r
+-\r
+-    Release 2.0.16\r
+-    \r
+-    Fix changelog year in spec file.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 16 13:15:22 2009 -0800\r
+-\r
+-    Release 2.0.16\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Mar 13 12:39:12 2009 -0800\r
+-\r
+-    uDAPL: scm provider, remove query gid/lid from connection setup phase\r
+-    \r
+-    move lid/gid queries from the connection setup phase\r
+-    and put them in the open call to avoid overhead\r
+-    of more fd's during connections. No need\r
+-    to query during connection setup since uDAPL\r
+-    binds to specific hca/ports via dat_ia_open.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 775394b73980a7bc0af018a33d2a5bb795469c78\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Mar 12 12:44:43 2009 -0800\r
+-\r
+-    Build: missing new linux/osd include file in EXTRA_DIST\r
+-    \r
+-    Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Mar 12 12:11:21 2009 -0800\r
+-\r
+-    Build: spec files missing Requires(post) statements for sed/coreutils\r
+-    \r
+-    needed for anaconda install\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Mar 4 10:04:13 2009 -0800\r
+-\r
+-    dapl scm: remove unecessary thread when using direct objects\r
+-    \r
+-    A thread is created for processing events on devices without\r
+-    direct event objecti support. Since all openfabrics devices support\r
+-    direct events there is no need to start a thread. Move this under\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 3 11:08:12 2009 -0800\r
+-\r
+-    dtestx: add missing F64u definition for windows\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d9e771da16ec2b360a222ceccbbca5d088e20ee5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 3 09:25:26 2009 -0800\r
+-\r
+-    uDAPL common: add 64 bit counters for IA, EP, and EVD's.\r
+-    \r
+-     -DDAPL_COUNTERS to build-in counters for cma and scm providers.\r
+-     New extension calls in dat_ib_extensions.h for counters\r
+-      dat_print_counters, dat_query_counters\r
+-     Counters for operations, async errors, and data\r
+-     Update dtestx (-p) with print and query counter examples\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Tue Feb 17 07:24:27 2009 -0800\r
+-\r
+-    Modify the openib_scm provider to support both OFED and WinOF releases.\r
+-    This takes advantage of having a libibverbs compatibility library.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e\r
+-Author: Stan Smith <stan.smith@intel.com>\r
+-Date:   Fri Jan 30 09:52:33 2009 -0800\r
+-\r
+-    Update the dapl.git tree with the latest SVN version of the\r
+-    ibal-scm provider.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 83543b6cca342e25fd6408454f1261ec6835a172\r
+-Author: Stan Smith <stan.smith@intel.com>\r
+-Date:   Fri Jan 30 09:52:25 2009 -0800\r
+-\r
+-    Merge SVN IBAL provider code back into the main git tree.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Jan 30 09:52:11 2009 -0800\r
+-\r
+-    Changes to dtest to support building on Windows.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 9f87610c4b37e4db4d74205c14028582a2f6a79e\r
+-Author: Stan Smith <stan.smith@intel.com>\r
+-Date:   Fri Jan 30 09:48:26 2009 -0800\r
+-\r
+-    Add return codes to various functions.\r
+-    Add script (batch file) for Windows testing.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 723067550265defdcfe6e00460a4f89f7a81fbf1\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Jan 30 09:46:40 2009 -0800\r
+-\r
+-    Merge OFED and WinOF trees for common dapl code.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jan 16 08:16:13 2009 -0800\r
+-\r
+-    dtest/dapltest: use $(top_builddir) for .la files during test builds\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Nov 26 07:12:30 2008 -0800\r
+-\r
+-    Release 2.0.15\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 5d5dec42717c963d1644ee3e716459dc5d58e930\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Oct 27 08:48:53 2008 -0800\r
+-\r
+-    dapltest: transaction test moves to cleanup stage before rdma_read processing is complete\r
+-    \r
+-    With multiple treads, the transaction server tread can move to cleanup\r
+-    stage and unregister memory before the remote client process has\r
+-    completed the rdma read. In lieu of a rewrite to add sync messages\r
+-    at the end of transaction test phase, just add a delay before cleanup.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 14 11:56:35 2008 -0700\r
+-\r
+-    Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf.\r
+-    Change SR to include sysconfdir. SR file access in the following order:\r
+-    \r
+-    - DAT_OVERRIDE\r
+-    - sysconfdir\r
+-    - /etc\r
+-    \r
+-    if DAT_OVERRIDE is set, assume administration override\r
+-    and do not failover to other locations. Add debug\r
+-    messages for each failure and retries.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Acked-by: Doug Ledford <dledford@redhat.com>\r
+-\r
+-commit c98d2169b839a73d76691acf510dd8976ddc850a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 3 08:00:56 2008 -0700\r
+-\r
+-    Release 2.0.14\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit c26d0bb065f3734f09058e1e6d26dde4a3738e55\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 3 05:40:04 2008 -0700\r
+-\r
+-    dat.conf: add ofa-v2-iwarp entry for iwarp devices\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d54c35c8a9ba33a464ca15f4a65b914688e5194d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Oct 3 05:30:10 2008 -0700\r
+-\r
+-    dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices\r
+-    \r
+-    iWarp spec allows only one iov on rdma reads\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 1 08:17:49 2008 -0700\r
+-\r
+-    dtest: reduce default IOV's during dat_ep_create for iWARP devices\r
+-    \r
+-    iWarp adapters tend to have less IOV resources then IB adapters.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Sep 26 12:43:13 2008 -0700\r
+-\r
+-    dtest: fix 32-bit build issues in dtest and dtestx examples.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 42a3a4edf30115a35d9d599b51f8756814e62368\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Sep 26 08:48:31 2008 -0700\r
+-\r
+-    Revert "Release 2.0.14"\r
+-    \r
+-    This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63.\r
+-    \r
+-    missed some fixes for package release.\r
+-\r
+-commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 24 12:13:37 2008 -0700\r
+-\r
+-    Release 2.0.14\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit c00d858da3113ce5463d408ab5e13e17cc9529e4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 24 08:33:32 2008 -0700\r
+-\r
+-    build: $(DESTDIR) prepend needed on install hooks for dat.conf\r
+-    \r
+-    All install directives that automake creates automatically\r
+-    have $(DESTDIR) prepended to them so that a make\r
+-    DESTDIR=<some_path> install will work. The hand written\r
+-    install hooks for dat.conf was missing DESTDIR.\r
+-    \r
+-    Signed-off-by: Doug Ledford <dledford@redhat.com>\r
+-\r
+-commit 860db3be4907c8ff290ce7c6b631b2117f5080bd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Sep 24 08:26:28 2008 -0700\r
+-\r
+-    dapl scm: UD shares EP's which requires serialization\r
+-    \r
+-    add locking around the modify_qp state changes to avoid\r
+-    unnecessary modify_qp calls during multiple resolve\r
+-    remote AH connection events on a single EP.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sat Sep 20 16:02:00 2008 -0700\r
+-\r
+-    dtestx: Add new options to test UD.\r
+-    \r
+-    - many to one/many EP remote AH resolution, data flow\r
+-    - bi-directional EP remote AH resolution, data flow\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sat Sep 20 15:58:59 2008 -0700\r
+-\r
+-    dapl: fixes for IB UD extensions in common code and socket cm provider.\r
+-    \r
+-     - Manage EP states base on attribute service type.\r
+-     - Allow multiple connections (remote_ah resolution)\r
+-       and accepts on UD type endpoints.\r
+-     - Supply private data on CR conn establishment\r
+-     - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sat Sep 20 15:49:40 2008 -0700\r
+-\r
+-    dapl: add provider specific attribute query option for IB UD MTU size\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 1 15:52:37 2008 -0700\r
+-\r
+-    Release 2.0.13\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit f37589927fabf0feb3a09c4c7c03e18df5749fef\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 1 12:24:49 2008 -0700\r
+-\r
+-    dapl build: add correct CFLAGS, set non-debug build by default for v2\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 1 12:22:19 2008 -0700\r
+-\r
+-    dapl providers: fix compiler warnings in cma and scm providers\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 1 12:20:08 2008 -0700\r
+-\r
+-    dat: fix compiler warnings in dat common code\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 1 12:18:48 2008 -0700\r
+-\r
+-    dapl: fix compiler warnings in common code\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 38a53ae75bce5059a84262fe1b40eacf92b22287\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Sep 1 12:16:58 2008 -0700\r
+-\r
+-    dtest/dapltest: fix compiler warnings\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 45900087764917b354411fdd2b3880473d553ab8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Aug 22 14:51:22 2008 -0700\r
+-\r
+-    dapl cma: debug message during query needs definition for inet_ntoa\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 99d46313a03af18771966cf86fcc934d179627b5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Aug 21 12:54:58 2008 -0700\r
+-\r
+-    Release 2.0.12\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Aug 20 18:51:00 2008 -0700\r
+-\r
+-    dapl scm: fix corner case that delivers duplicate disconnect events\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 96f6822b90fa880a6c6a64b1e183064a449f7237\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Aug 20 18:47:19 2008 -0700\r
+-\r
+-    dat: include stddef.h for NULL definition in dat_platform_specific.h\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Aug 20 18:27:08 2008 -0700\r
+-\r
+-    dapl: add debug messages during async and overflow events\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Aug 20 18:24:33 2008 -0700\r
+-\r
+-    dapltest: add check for duplicate disconnect events in transaction test\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 7e8986f2c6496851b724a007458881c3248ac998\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Aug 20 18:22:42 2008 -0700\r
+-\r
+-    dtestx: fix stack corruption problem with hostname strcpy\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Aug 14 09:42:57 2008 -0700\r
+-\r
+-    dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Aug 14 09:19:53 2008 -0700\r
+-\r
+-    dapl scm: change IB RC qp inline and timer defaults.\r
+-    \r
+-    rnr nak can be the result of any operation not just\r
+-    message send recevier not ready. Timer is much too\r
+-    large given this case.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 36088a92d87e833bae535fcea0c45417dec34e65\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Aug 14 09:12:38 2008 -0700\r
+-\r
+-    dapl scm: add mtu adjustments via environment, default = 1024.\r
+-    \r
+-    DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting\r
+-    is min of 1024 and active mtu on IB device.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Aug 13 14:17:40 2008 -0700\r
+-\r
+-    dapl scm: change connect and accept to non-blocking to avoid blocking user thread.\r
+-    \r
+-    The connect socket that is used to exchange QP information is now non-blocking\r
+-    and the data exchange is done via the cr thread. New state RTU_PENDING added.\r
+-    On the passive side there is a new state ACCEPT_DATA used to avoid read blocking\r
+-    on the user accept call.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jul 29 08:18:25 2008 -0700\r
+-\r
+-    dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sun Jul 20 13:20:45 2008 -0700\r
+-\r
+-    Release 2.0.11\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 0003bb7866af3ba73cc79c703b565a8012439bb1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sun Jul 20 13:17:22 2008 -0700\r
+-\r
+-    dtestx: add -d option to test new IB UD extension.\r
+-    \r
+-    modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sun Jul 20 13:13:09 2008 -0700\r
+-\r
+-    dapl scm: add support for UD extensions in Openfabrics socket cm provider\r
+-    \r
+-    add qp_type in connection information exchange\r
+-    add new post_send_ud call\r
+-    changes to connection manager to support qp types beyond RC.\r
+-    changes to connection events to use new extended event calls.\r
+-    exchange address handle information during connection phase.\r
+-    changes to modify_qp to handle both RC and UD types.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 927dac5b61e64868089acd49d468b98327e14a1a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sun Jul 20 13:07:34 2008 -0700\r
+-\r
+-    dapl: add support for UD extensions in common code.\r
+-    \r
+-    allow EP create for extended service types.\r
+-    extend connection event types to include UD AH resolution/exchange.\r
+-    add new extended connect and connect request upcalls for providers.\r
+-    - dapls_evd_post_cr_event_ext\r
+-    - dapls_evd_post_connection_event_ext\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit be3d6a53f3340294697706ce50a05faf151aacc7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Sun Jul 20 12:57:49 2008 -0700\r
+-\r
+-    dat: New definitions for IB unreliable datagram extension\r
+-    \r
+-    Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD\r
+-    Add IB extension call dat_ib_post_send_ud().\r
+-    Add address handle definition for UD calls.\r
+-    Add IB event definitions to provide remote AH via connect and connect requests\r
+-    Roll IB extension version to 2.0.2\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jul 18 07:46:20 2008 -0700\r
+-\r
+-    dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 25 08:02:11 2008 -0700\r
+-\r
+-    dapltest: manpage - rdma write example incorrect\r
+-    \r
+-    parameter for rdma write should be RW and not WR\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 68638bde71b529a142c13ac332cd44435cabc896\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 23 15:26:30 2008 -0700\r
+-\r
+-    dapl: remove needless terminating 0 in dto_op_str functions.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 23 10:52:46 2008 -0700\r
+-\r
+-    Release 2.0.10\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit d9b3c06ae98ac4d3b264384f6510137166d78cb0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 23 10:35:17 2008 -0700\r
+-\r
+-    remove reference to doc/dat.conf in makefile.am\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit b052d402e09ac78281a25af2c8fe902fa71f5c6f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jun 19 13:34:49 2008 -0700\r
+-\r
+-    dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free.\r
+-    \r
+-    Problem surfaced while running Intel MPI 3.1 and mpich2-test suite.\r
+-    dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint\r
+-    and destroy_cq and destroy_pd code was ignoring verbs errors.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit e466d8e330c45176c5f00efda79ad745bf3f71a4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 18 14:21:28 2008 -0700\r
+-\r
+-    dapl scm: add stdout logging for uname and gethostbyname errors during open.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 18 14:19:51 2008 -0700\r
+-\r
+-    dapl scm: support global routing and set mtu based on active_mtu\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit fc65a08727c59c304dad20337a8bff803f2302c0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 18 13:59:44 2008 -0700\r
+-\r
+-    dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters.\r
+-    \r
+-    Bring socket cm provider back to life with some changes:\r
+-    \r
+-    better threading support for exchanging QP information.\r
+-    Avoid blocking during connect to support dynamic connection\r
+-    model with MPI implementations.\r
+-    \r
+-    consumer control of ack timeout/retries.\r
+-    \r
+-    disconnect/reject capabilities via socket exchange.\r
+-    \r
+-    version support for wire protocol to insure compatibility\r
+-    with peer scm provider. Add gids to exchange.\r
+-    \r
+-    validated with Intel MPI on a 14,000+ core fabric using IB DDR.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 0855af175fec2f1bec8391ebae2a2cdff26a3359\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 11 10:43:24 2008 -0700\r
+-\r
+-    dapl: add opcode to string function to report opcode during failures.\r
+-    \r
+-    Need to use cookie opcode during failures in lieu of cqe opcode.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit ec6296e7f0a843c69231f8284ae780014fa26fbe\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 16 14:59:43 2008 -0700\r
+-\r
+-    dapl: remove unused iov buffer allocation on the endpoint\r
+-    \r
+-    provider's manage iov space on stack during posting.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 16 13:59:11 2008 -0700\r
+-\r
+-    dapl: endpoint pending request count is wrong\r
+-    \r
+-    The code assumes every cookie allocated during posting of\r
+-    requests gets completed. This incorrect assumption results in\r
+-    wrong pending count. Remove request_pending field and replace\r
+-    with direct call, dapl_cb_pending, to provide accurate\r
+-    data to consumer.\r
+-    \r
+-    Add debug print if consumer overruns request queue.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jun 2 12:40:45 2008 -0700\r
+-\r
+-    dapl extension: dapli_post_ext should always allocate cookie for requests.\r
+-    \r
+-    extension didn't allocate cookie if completion was suppressed which resulted\r
+-    segfault during provider post call. Provider's expect cookie for wr_id,\r
+-    even with surpressed completions, to handle events during errors.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue May 20 14:35:43 2008 -0700\r
+-\r
+-    Release 2.0.9\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue May 20 21:56:06 2008 -0700\r
+-\r
+-    dtest,dtestx,dapltest: fix build issues with Redhat EL5.1\r
+-    \r
+-    need include files/definitions for sleep, getpid, gettimeofday\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 8084ebf39729bac310447467b518df4248e9e2b6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue May 20 14:31:09 2008 -0700\r
+-\r
+-    dapl: Fix long delays with the cma provider open call when DNS is not configure on server.\r
+-    \r
+-    Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue May 20 14:30:05 2008 -0700\r
+-\r
+-    dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 30 14:48:21 2008 -0700\r
+-\r
+-    Release 2.0.8\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 30 13:51:41 2008 -0700\r
+-\r
+-    dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 30 13:25:53 2008 -0700\r
+-\r
+-    dat: udat_sr_parser ia_name will fail on comments, turn down debug message\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit b93b91d48186d100c48f1a479776d56476847607\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 29 16:15:44 2008 -0700\r
+-\r
+-    dat: cleanup error handling with static registry parsing of dat.conf\r
+-    \r
+-    change asserts to return codes, add log messages, and\r
+-    report errors via open instead of asserts during dat\r
+-    library load.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 28 10:14:20 2008 -0700\r
+-\r
+-    dapl: cma provider needs to support lower inline send default for iWARP\r
+-    \r
+-    IB and iWARP work best with different defaults. Add transport check\r
+-    and set default accordingly. 64 for iWARP, 200 for IB.\r
+-    \r
+-    DAPL_MAX_INLINE environment variable is still used to override.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit be32d7d5beeeceac5dbb1974d3217265dc4d5461\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 28 09:44:12 2008 -0700\r
+-\r
+-    dtestx: need to include string.h for memset/strcpy declarations\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit a192465714e7607529303a80d8f9a312e0c7aec6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 28 08:41:05 2008 -0700\r
+-\r
+-    dapl: add vendor_err with DTO error logging\r
+-    \r
+-    DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 6ac657a4e7e5e27254a024fca7fdead569043f9a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 25 15:12:34 2008 -0700\r
+-\r
+-    dapl: add check before destroying cm event channel in release\r
+-    \r
+-    library may be loaded and unloaded without calling open\r
+-    in which case the cm event channel is not created.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 22 12:55:13 2008 -0700\r
+-\r
+-    dapl: evd_alloc doesn't check for direct_object_create errors.\r
+-    \r
+-    Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc.\r
+-    When attempting to create large number of evd's that exceed\r
+-    open files limit the error was not propagated up causing\r
+-    a segfault. Note: there are 3 FD's required for each EVD\r
+-    2 for pipe, and one for cq event_channel.\r
+-    \r
+-    Change the error reporting to indicate correct return\r
+-    code and send to log with non-debug builds.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 14 13:10:13 2008 -0700\r
+-\r
+-    dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement.\r
+-    \r
+-    Change the packaging to update only the OFA provider contents in dat.conf. This allows other\r
+-    dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain\r
+-    syntax of this static configuration file.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit d32b27d991bc1314eea055ce3f55bb585b11aaac\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 11 11:37:48 2008 -0700\r
+-\r
+-    dapl openib_cma: fix hca query to use correct max_rd_atom values\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Apr 9 17:26:06 2008 -0700\r
+-\r
+-    dat: add logging by default during library load failures.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 1794e94754a1e58fcf214c2802e950124bbd1316\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 8 17:32:03 2008 -0700\r
+-\r
+-    dtest: add private data validation with connect and accept.\r
+-    \r
+-    Include code, with build option, to validate private data with\r
+-    consumer rejects.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 8 17:25:11 2008 -0700\r
+-\r
+-    dapl: add hooks in evd connection callback code to deliver private data with consumer reject.\r
+-    \r
+-    PEER rejects can include private data. The common code didn't support delivery\r
+-    via the connect event data structure. Add the necessary hooks in\r
+-    dapl_evd_connection_callback function and include checks in openib_cma\r
+-    provider to check and delivery properly. Also, fix the private data size\r
+-    check in dapls_ib_reject_connection function.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 7 15:47:57 2008 -0700\r
+-\r
+-    dapl: increase reject private data size to avoid odd byte offets.\r
+-    \r
+-    remove reject type checking on passive side since it will\r
+-    always be non-consumer from active side.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 353a1c8a00bb2a1380fd7a372973a5a70828da35\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 4 16:04:11 2008 -0800\r
+-\r
+-    dapl: update vendor information for OFA v2 provider.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit dbf1ea37f43caec61911dea06af801c2f906db0a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Apr 4 16:03:03 2008 -0800\r
+-\r
+-    dapl: add provider vendor revision data in private data with reject\r
+-    \r
+-    Add 1 byte header containing provider/vendor major revision\r
+-    to distinguish between consumer and non-consumer rejects.\r
+-    Validate size of consumer reject privated data.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 0f71b9be594739a1fba7d74929eacd42a8cee392\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Apr 3 17:06:27 2008 -0800\r
+-\r
+-    dapl: add support for logging errors in non-debug build.\r
+-    \r
+-    Add debug logging (stdout, syslog) for error cases during\r
+-    device open, cm, async, and dto operations. Default settings\r
+-    are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST.\r
+-    \r
+-    Change default configuration to build non-debug.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit bea882ad9b11ac7188628a939f5227e22c914169\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Apr 3 16:23:29 2008 -0800\r
+-\r
+-    dapl: add support for private data in CR reject.\r
+-    \r
+-    Private data support via dat_cr_reject was added to\r
+-    the v2 DAT specification but dapl was never extended\r
+-    to support at the provider level.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 1 11:02:37 2008 -0800\r
+-\r
+-    dapl: calculate private data size based on transport type and cma_hdr overhead\r
+-    \r
+-    Need to adjust CM private date size based on different transport types.\r
+-    Add hca_ptr to dapls_ib_private_data_size call for transport type\r
+-    validation via verbs device. Add definitions to include iWARP size\r
+-    of 512 and subtract 36 bytes for cma_hdr overhead.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Mar 26 17:58:17 2008 -0800\r
+-\r
+-    Remove improperly licensed GETOPT code from dtest source tree.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 88069fdd21f92923388dec7adbde0d1bc334e7c4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 18 15:04:34 2008 -0800\r
+-\r
+-    remove unnecessary assert from dapl_ep_free.\r
+-    \r
+-    dat_ep_free must handle the case where a consumer calls\r
+-    free in CONNECTED or DISCONNECT_PENDING states. After\r
+-    free calls disconnect, there may be a pending event,\r
+-    in which case the providers dapls_ib_qp_free will block\r
+-    accordingly and handle pending events.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit b3f020e5cba765077049a8cf61c4ce5009fa1031\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Fri Mar 14 14:31:40 2008 -0700\r
+-\r
+-    fix openib_scm compiler warning\r
+-    \r
+-    Cast to socklen_t since accept(2) expects an unsigned argument.\r
+-    \r
+-    Makes the openib_scm provider now build successfully when using\r
+-    make VERBS=<provider> (the -Werror flag was causing the build\r
+-    failure)\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 441996f05d3cc8b09c94c166ef736bc50c24de7e\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Fri Mar 14 14:31:34 2008 -0700\r
+-\r
+-    fix provider-specific compiler warnings\r
+-    \r
+-    Initialize ds_array_start_p otherwise the compiler would claim\r
+-    that this variable could be used with an uninitialized value.\r
+-    \r
+-    Makes the uDAPL providers now build successfully when using make\r
+-    VERBS=<provider> (the -Werror flag was causing the build failure)\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 11 09:25:07 2008 -0800\r
+-\r
+-    uDAPL: fix query to adjust max sge for default inline of 64 bytes\r
+-           and include missing max_rdma_write_iov ep_attr field\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit e2c6bf57f78dfebc21e168df01e5876202053e08\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Fri Mar 7 09:39:22 2008 -0800\r
+-\r
+-    uDAT: fix reuse of va_list in debugging mode\r
+-    \r
+-    Make sure we reinitialize the va_list since va_list is undefined\r
+-    if a function traverses the va_list with va_arg.\r
+-    \r
+-    This patch fixes the uDAT debugging case when both stdout and\r
+-    syslog output is wanted.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Mar 6 15:40:35 2008 -0800\r
+-\r
+-    Add hostname and process id to debug output to aid\r
+-    scale-up and out debug.\r
+-    \r
+-    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+-\r
+-commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Sat Feb 23 21:03:21 2008 -0800\r
+-\r
+-    fix reuse of va_list in debugging mode\r
+-    \r
+-    Make sure we reinitialize the va_list since va_list is undefined\r
+-    if a function traverses the va_list with va_arg.\r
+-    \r
+-    This patch fixes the debugging case when both stdout and syslog\r
+-    output is wanted.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit da80af8c76f220508407a2e171c8b28b43b35bf9\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 16:54:45 2008 -0800\r
+-\r
+-    Fix memory leak in provider specific post send/recv if there's\r
+-    more than DEFAULT_DS_ENTRIES iovecs.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit d78ee9f95fbe48f71eb247b01c598994edfa4d17\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 03:19:42 2008 -0800\r
+-\r
+-    Guarantee NUL termination if hostname gets truncated.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 03:19:37 2008 -0800\r
+-\r
+-    Make sure we don't leak the hash table if dapl_hca_alloc fails.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit e4ed56be6bd64684564169d89df7ca30faffdb53\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 03:19:32 2008 -0800\r
+-\r
+-    Fix memory leak.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 03:19:27 2008 -0800\r
+-\r
+-    Fix memory leak in error path.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit d971e799bb5385a8c847cf3f863f19854e95c1b2\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 03:19:22 2008 -0800\r
+-\r
+-    Fix memory leak\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit c21f2f455af7934675a58ff825bed6cf54d457c9\r
+-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-Date:   Tue Feb 19 03:19:17 2008 -0800\r
+-\r
+-    Fix memory leak.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit ee46aa47e2a4deeded347fe18bd6321db61c6594\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Feb 15 10:10:01 2008 -0800\r
+-\r
+-    Release 2.0.7\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit f0ca504bc2639cb7a48528d45e9026b54dab3e57\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Feb 14 09:46:56 2008 -0800\r
+-\r
+-    uDAT: Make sure we initialize the dictionary entry early enough so that\r
+-    we can base our cleanup decisions on that variable being\r
+-    initialized.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 6b11838043a6012668c7e1a22a869e9e84dc40d6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Feb 14 09:46:18 2008 -0800\r
+-\r
+-    uDAT: Make sure we stay within bounds when manipulating the ia_name.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Feb 14 09:44:56 2008 -0800\r
+-\r
+-    uDAT: Make sure we stay within bounds when manipulating the ia handle.\r
+-    Fix typo in comment.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit 7fe64f10874667062e067efb7ea8c3d385ae90b7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Feb 14 09:43:39 2008 -0800\r
+-\r
+-    uDAT: Zero-out memory otherwise we might base our cleanup decisions on\r
+-    uninitialized memory.\r
+-    \r
+-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+-\r
+-commit f510e7e8f5b72a6262a7f8b255926cf96c65b654\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 13 20:39:26 2008 -0800\r
+-\r
+-    Modify default configure options to match rpm spec file\r
+-     --enable-debug, --enable-ext-type=ib\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 75273f1a5c599777bb43add93f30563689fdbc10\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 11 15:43:03 2008 -0800\r
+-\r
+-    udapl OFA provider: set listen backlog to default cma backlog max.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 11 14:50:33 2008 -0800\r
+-\r
+-    The OFA dapl provider is checking for incorrect return code\r
+-    from rdma_bind_addr and rdma_listen calls. This causes an error\r
+-    to be returned back to the consumer instead of correctly\r
+-    incrementing the seed port and re-calling the OFA provider\r
+-    until a valid port is issued. The seed value (1000) is also\r
+-    incorrect and should start a non-privledged port (1024) to\r
+-    avoid EPERM errors when seeding the starting port value.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 4 16:16:10 2008 -0800\r
+-\r
+-    Release 2.0.6 - ChangeLog\r
+-\r
+-commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 4 16:14:02 2008 -0800\r
+-\r
+-    Release 2.0.6\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 8c5beb870048aca286f7396549771ccb075c5c1b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 4 16:12:47 2008 -0800\r
+-\r
+-    Fix OFED v2 package to build against and target /dat2/include directory.\r
+-    \r
+-    Prevous patch missed dat_osd.h, dapltest/dtest incorrect.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 4 13:00:45 2008 -0800\r
+-\r
+-    uDAT/DAPL: Fix package to build against and target /dat2/include directory.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 29 16:34:49 2008 -0800\r
+-\r
+-    Release 2.0.5 - ChangeLog updated\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 356cf91905d39ade06d76ab9ace6203cd7907d93\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 29 16:33:10 2008 -0800\r
+-\r
+-    libdat: rename libdat.so to libdat2.so to coexist with v1 devel\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d9a9f46ee220ec9c479756acc306ed68060a662f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jan 28 13:55:35 2008 -0800\r
+-\r
+-    Release 2.0.4 - README\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 533983cec914a7ecc6829934a56f867d7870e301\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jan 28 12:06:03 2008 -0800\r
+-\r
+-    Release 2.0.4 Changelog\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Jan 28 12:04:18 2008 -0800\r
+-\r
+-    Relase package 2.0.4\r
+-\r
+-commit 95935648f81ac5177ae7120b35e55483902b8c64\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jan 23 16:40:48 2008 -0800\r
+-\r
+-    dapltest does not include definitions for inet_ntoa.\r
+-    At load time the symbol was resolved but with the\r
+-    default definition of int, instead of char*, it caused\r
+-    segfault. Add correct include files in dapl_mdep_user.h\r
+-    for linux.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jan 23 14:46:30 2008 -0800\r
+-\r
+-    Add freeaddrinfo to deallocate getaddrinfo buffer.\r
+-    Cleanup a few printf messages.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jan 23 14:25:21 2008 -0800\r
+-\r
+-    Fix for uDAPL v2 using extended operation. After extension completion,\r
+-    the DTO cookie must be checked for type before deallocating to handle\r
+-    inbound immediate data in receive. The sample dtestx client will fail\r
+-    when running loopback if the rdma immediate is received from remote\r
+-    before the rdma immediate request completion fires.\r
+-    \r
+-    Bug causes following dtestx client error:\r
+-    dat_ib_post_rdma_write_immed\r
+-       returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jan 17 11:30:27 2008 -0800\r
+-\r
+-    WinOF: update dapltest,dtest directories for windows build\r
+-    WinOF: add README.windows\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 9bececbb32dd31d4a3528e8f000a773e5c593430\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jan 17 11:24:46 2008 -0800\r
+-\r
+-    WinOF: update dtestx for windows build\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Jan 17 11:23:21 2008 -0800\r
+-\r
+-    WinOF: add build enviroment, cleanup old makefiles\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 15 16:59:34 2008 -0800\r
+-\r
+-    WinOF: name collision with ibal verbs ib_cm_handle_t\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 7c5418a781c1dfdb37b09450b5df40363dce84b4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 15 16:06:10 2008 -0800\r
+-\r
+-    dtest: dat_evd_query for correct size\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 6de5e635c01e78bde6e153b727926da900677d52\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 15 16:03:27 2008 -0800\r
+-\r
+-    dapltest: WinOF support.\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-\r
+-commit c680e95b96e57bd8b69b1c73e95730854fcea028\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 15 14:54:57 2008 -0800\r
+-\r
+-    openib_cma: fix cleanup issues in destroy_cm_id\r
+-                add macros to convert SID and PORT\r
+-                fix init/responder settings in accept\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 15 14:49:54 2008 -0800\r
+-\r
+-    Modifications for WinOF build and endian support for RMR info\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jan 15 14:39:18 2008 -0800\r
+-\r
+-    WinOF: DAT_API changes, white space and tab cleanup\r
+-           IBAL provider code added\r
+-    \r
+-    Common code: initialize cookie pool buffer\r
+-                 add dapl extension DTO counter\r
+-                 add get_cqe_op_str debug call\r
+-                 remove excess dbg in evd_dequeue\r
+-                 add dbg assert to sp_search_cr\r
+-                 IBAL provider support _VENDOR_IBAL_\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 68f2ad0af3623dec27b1223aeaca6357348eef4b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jan 4 08:32:39 2008 -0800\r
+-\r
+-    Windows specific -\r
+-       IBAL support in evd_create\r
+-       Build IB extensions by default\r
+-    Common code -\r
+-       check return status, evd_free, evd_wait\r
+-       add dapl_event_str function\r
+-       definitions for dat_os_library_error, dat_os_ungetc\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d21f36406408245ac979f0b9594e7d1d0b9a3852\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jan 4 08:32:19 2008 -0800\r
+-\r
+-    Common code -\r
+-       Missing DAT_API defs\r
+-       casting to fix build issues\r
+-       bitmaps for extension debug\r
+-       DAPL_BAD_PTR macro\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 258678a381c6a0170020c48b0ba627e820abd3e7\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jan 4 08:31:59 2008 -0800\r
+-\r
+-    Common code -\r
+-       Add DAT_API definitions for dat_redirection.h, udat_redirection.h\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jan 4 08:31:27 2008 -0800\r
+-\r
+-    Windows specific -\r
+-       Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider\r
+-       Support for direct object on CQ\r
+-       INIT and FINI changes\r
+-       setup dat.conf default path, fix sr parsing\r
+-    Common code -\r
+-       Add Stan Smith as contributor\r
+-       O/S independent dat_os_library_error()\r
+-    \r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit b3ba3dc9743baf3bff243e8969edf3395d1118dd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Dec 11 14:44:24 2007 -0800\r
+-\r
+-    2/2 uDAPL changes to sync common code base with WinOF\r
+-     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )\r
+-     - cleanup platform specific definitions for windows\r
+-     - c++ support\r
+-     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE\r
+-\r
+-commit 92d7eef38877ad472a91e5e9f88e4e49657716bf\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Dec 11 14:43:05 2007 -0800\r
+-\r
+-    1/2 uDAT changes to sync common code base with WinOF\r
+-     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )\r
+-     - cleanup platform specific definitions for windows\r
+-     - c++ support\r
+-     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+-\r
+-commit 95764c6da28284d29071cf01d1a09bdcb967a971\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Dec 4 13:19:27 2007 -0800\r
+-\r
+-    - Fix size of evd request queue on creation\r
+-    - Add query and checking of DTO request queue\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6\r
+-Merge: 11a165a... abb4356...\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 27 13:31:32 2007 -0800\r
+-\r
+-    master_dat2.0_merge\r
+-\r
+-commit abb4356cd765d38cf5cff2dfbdb610b380f944a2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 20 12:10:39 2007 -0800\r
+-\r
+-    Release 2.0.3\r
+-\r
+-commit d2c66eb7363234c5a9fb82aa92df1c132e46477e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Nov 20 12:07:58 2007 -0800\r
+-\r
+-    - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices\r
+-    - Add missing ia_query for max_iov_segments_per_rdma_write\r
+-    - Cleanup CMA code no longer supported by rdma_cm\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 3a3519167bd65bd999424788f139b930b099b405\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Nov 19 15:26:44 2007 -0800\r
+-\r
+-    Change dapltest timers to use gettimeofday instead of get_cycles for better portability.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 11a165a1868b1748fe476e08fc40af620f961cd2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 31 10:58:51 2007 -0800\r
+-\r
+-    - DAT/DAPL Version 1.2.3 Release 1\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 31 10:55:48 2007 -0800\r
+-\r
+-    ChangeLog update\r
+-\r
+-commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Oct 31 10:55:05 2007 -0800\r
+-\r
+-    - DAT/DAPL Version 2.0.2 Release 1\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 43931378b9d4f5f721da828623f1e391f32f446b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 30 09:06:24 2007 -0800\r
+-\r
+-    - Add ChangeLog\r
+-    - update cma provider to report remote and local ports via dat_ep_query.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Oct 25 14:37:14 2007 -0700\r
+-\r
+-    Fix dapltest endian issue with mem_handle, mem_address.\r
+-    \r
+-    Signed-off-by: Shirley Ma <xma@us.ibm.com>\r
+-\r
+-commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Oct 25 14:36:12 2007 -0700\r
+-\r
+-    Fix dapltest endian issue with mem_handle, mem_address.\r
+-    \r
+-    Signed-off-by: Shirley Ma <xma@us.ibm.com>\r
+-\r
+-commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 16 14:23:17 2007 -0700\r
+-\r
+-     Fix dtest to build properly with extensions.\r
+-    \r
+-     Modify dat.h dat_event to include event_extension_data[8].\r
+-     Extend struct dat_event outside of extension build\r
+-     switch to enable non-extended applications to work\r
+-     with extended libraries. Otherwise, there is a potential\r
+-     for the event callee to write back too much event data\r
+-     and exceed callers non-extended event buffer.\r
+-    \r
+-     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d7134fb2bcad6f4f68410af997f8791edd788cfb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 16 14:10:52 2007 -0700\r
+-\r
+-        Use inet_ntoa instead of open coding it. IP addresses were being\r
+-        reversed on PowerPC.\r
+-    \r
+-        On PowerPC the timebase ticks at a different frequency to the CPU.\r
+-        dapltest currently assumes a 1:1 relationship, and gives bogus values\r
+-        when scaling timebase to real time.\r
+-    \r
+-        To fix this, look at the timebase field in /proc/cpuinfo instead. To\r
+-        keep things consistent with x86, scale that value to MHz.\r
+-    \r
+-        Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-\r
+-commit c6710c291a4f7c0845a4535767d41d66f092fabf\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 16 14:09:56 2007 -0700\r
+-\r
+-    Use inet_ntoa instead of open coding it. IP addresses were being\r
+-    reversed on PowerPC.\r
+-    \r
+-    On PowerPC the timebase ticks at a different frequency to the CPU.\r
+-    dapltest currently assumes a 1:1 relationship, and gives bogus values\r
+-    when scaling timebase to real time.\r
+-    \r
+-    To fix this, look at the timebase field in /proc/cpuinfo instead. To\r
+-    keep things consistent with x86, scale that value to MHz.\r
+-    \r
+-    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-\r
+-commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 16 14:02:36 2007 -0700\r
+-\r
+-     Minor clean-up of cr/lf\r
+-    \r
+-     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 33fd0628497911df11dea640aea4660e54989ed6\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 16:01:37 2007 -0700\r
+-\r
+-    Final changes for 2.0.1-1 package, OFED 1.3 ALPHA\r
+-    Fix build issue with SLES 10, gcc++ compiler\r
+-    \r
+-     Signed-off-by: Jimmy Hill <jimmy.hill@us.ibm.com>\r
+-     Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 14:50:02 2007 -0700\r
+-\r
+-    Final changes for package 1.2.2-1, OFED 1.3 ALPHA\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 52bc16939e87587f8208e775dd061f54196a9acb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 11:58:46 2007 -0700\r
+-\r
+-    Change v2 dat.conf provider names to associate with ib net devices\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit d22e62f989dd16d503d5430ffe6f55075139e057\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 11:43:34 2007 -0700\r
+-\r
+-    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
+-    than times().\r
+-    \r
+-    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-\r
+-commit a64eae5bd36598a5c93010e07869e95599aa8ceb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 11:41:40 2007 -0700\r
+-\r
+-    Change v2 dat.conf provider names to associate with ib net devices\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 11:35:21 2007 -0700\r
+-\r
+-    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
+-    than times().\r
+-    \r
+-    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-\r
+-commit 66bf23e3e53f370c92803f162144947f29ce06d8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 11:30:15 2007 -0700\r
+-\r
+-    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
+-    than times().\r
+-    \r
+-    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-\r
+-commit c220760bbb1f6357b6e187ff6c5e576dd74fd504\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Oct 2 10:39:09 2007 -0700\r
+-\r
+-    Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using\r
+-    the kernel atomic routines, code them explicitely like x86 does.\r
+-    \r
+-    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-\r
+-commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Sep 28 17:04:54 2007 -0700\r
+-\r
+-    Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 493e65b5b47f47e4824f775959fd98e56aeaccc4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Sep 28 17:03:41 2007 -0700\r
+-\r
+-    Clean up packaging, modify dat.conf for cma provider name change to ofa\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Sep 20 12:25:55 2007 -0700\r
+-\r
+-      Modifications to coexist with 2.0 libraries\r
+-         - fix RPM specfile, configure.in,  1.2.2 package\r
+-         - modify dat.conf\r
+-    \r
+-        Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Sep 20 10:55:19 2007 -0700\r
+-\r
+-    Modifications to coexist with 1.2 libraries\r
+-     - cleanup CR-LF in dtestx\r
+-     - fix RPM specfile, 2.0.1 package\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 230767742b8287490373c09d1bd346337b375b48\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 22 11:48:20 2007 -0700\r
+-\r
+-    Update copyright in specfile\r
+-\r
+-commit 5294cbe5e58f67d0a98862edea3684fff6e773bb\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jun 22 11:47:14 2007 -0700\r
+-\r
+-    Update Copyright in specfile\r
+-\r
+-commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 6 13:20:38 2007 -0700\r
+-\r
+-    Update specfile to reflect DAT/DAPL 1.2.1 release\r
+-\r
+-commit babb95eff1bcef88bed46e92c323193d8f039eff\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Jun 6 11:48:07 2007 -0700\r
+-\r
+-    More changes to the release notes\r
+-\r
+-commit 0f299bf1deb9198b2f008c3ffa717bef252b6097\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jun 5 15:56:17 2007 -0700\r
+-\r
+-    Update release notes\r
+-\r
+-commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Jun 5 15:52:18 2007 -0700\r
+-\r
+-    Add release notes updated for OFED 1.2 release\r
+-\r
+-commit f332badb80f0b1d88bf2d70dba0c90afc40f088f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu May 31 12:43:28 2007 -0700\r
+-\r
+-    Add provider specific interface to uDAPL for extensions support.\r
+-    Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events\r
+-    Remove unnecessary check on dats_set_ia_handle in dat_ia_openv\r
+-    Clean up specfile and some extra LF's\r
+-\r
+-commit 4d7e30586402149228a30bea3036466395577ec4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 16 12:56:39 2007 -0700\r
+-\r
+-    add iwarp extension include file\r
+-\r
+-commit d9963cc9984c06f147b92877945e847f657cd512\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 16 12:52:38 2007 -0700\r
+-\r
+-    clean up some CR's in include files\r
+-\r
+-commit 80f4e8c4be02bac5d472e1e6c4937079882a0388\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 9 16:21:16 2007 -0700\r
+-\r
+-    Take out references to specific 1.1 verbs definitions (ibv_comp_channel).\r
+-\r
+-commit 544fbb873d5320e9606f176c4b71bcba0e257d7d\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 9 12:51:53 2007 -0700\r
+-\r
+-    Bug Fixes:\r
+-      - 606: Return local and remote ports with dat_ep_query\r
+-      - 585: Add bonding example to dat.conf\r
+-\r
+-commit e64079f7b961aa9a672711f0e933a77f3999d302\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 7 15:54:59 2007 -0700\r
+-\r
+-    Update dapltest to use default device OpenIB-cma\r
+-    Fix dapltest manpage, example for performance test wrong\r
+-\r
+-commit 7cda2304a6880371ec2d9451a4f83a7a254bc474\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon May 7 12:49:18 2007 -0700\r
+-\r
+-    Fix issues with IB DTO extensions\r
+-     - debug print_cqe updated for latest IBV definitions\r
+-     - dapli_evd_cq_to_event modified to handle both post and receive extensions\r
+-     - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap\r
+-     - modify cookie DTO types to support extensions properly\r
+-\r
+-commit 82a6750d31cd432c7e09298fc98c0e7e74abd012\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri May 4 17:17:41 2007 -0700\r
+-\r
+-    Add new dapl functions for 2.0 (stubs for now)\r
+-    - dapl_ep_post_send_invalidate\r
+-    - dapl_ep_post_rdma_read_to_rmr\r
+-    - dapl_ia_ha\r
+-    - dapl_csp_create, query, free\r
+-    - dapl_cno_trigger\r
+-    - dapl_cno_fd_create\r
+-    - dapl_extensions\r
+-    \r
+-    Add new 2.0 parameters to existing API's\r
+-    - dapl_cr_reject\r
+-    - dapl_rmr_bind\r
+-\r
+-commit 8679aaf56c781715adc132a38a731e36194570f1\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu May 3 09:44:43 2007 -0700\r
+-\r
+-    update dtestx.c, default provider OpenIB-cma\r
+-\r
+-commit 527f6d19125e9eec7ecef03a8633626b0043a2f4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed May 2 17:27:44 2007 -0700\r
+-\r
+-    Added IB extensions and dtestx as an example program using\r
+-    rdma write with immediate and atomic operations\r
+-\r
+-commit 83ac961b505346708f12d59152146f3b04c8306f\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Apr 30 10:55:59 2007 -0700\r
+-\r
+-    Fixes atomic operation build problem with ia64 and RHEL5.\r
+-\r
+-commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Apr 26 17:29:37 2007 -0700\r
+-\r
+-    Update README and dapltest manpage\r
+-\r
+-commit 9a951d0a8713657da90568c0613eb48f5010cf1e\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 3 16:35:17 2007 -0700\r
+-\r
+-    Cleanup RPM specfile for the dapl package, move to 1.2-1 release.\r
+-\r
+-commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Apr 3 14:38:31 2007 -0700\r
+-\r
+-    Add support for multiple IB devices to dat.conf to support IPoIB HA failover.\r
+-\r
+-commit 5434b720b36de2f262a02ff9dfccd99953c09e59\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Mar 15 10:46:33 2007 -0800\r
+-\r
+-    Fix ia64 builds on SUSE\r
+-\r
+-commit b0f9eef1aa7f279802da233480cf6c495e16565b\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Mar 14 13:29:08 2007 -0800\r
+-\r
+-    DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider\r
+-\r
+-commit 61858b925f4c1a6f9edba6389a5bd601daf936e9\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Mar 14 11:08:19 2007 -0800\r
+-\r
+-    change DAT_VERSION major and minor numbers to 2.0\r
+-\r
+-commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Mar 14 10:43:56 2007 -0800\r
+-\r
+-    add provider support to dtest, set default to OpenIB-cma\r
+-\r
+-commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Tue Mar 13 16:20:20 2007 -0800\r
+-\r
+-    add provider option to dtest, set default to OpenIB-cma\r
+-\r
+-commit 76a43cace54567135bac7ae54e336c6595b65fd9\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Mar 9 13:09:14 2007 -0800\r
+-\r
+-    Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib\r
+-\r
+-commit 921687efed992e6ab72dfb731687b6816324a024\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Thu Mar 8 16:01:29 2007 -0800\r
+-\r
+-    Update the README\r
+-\r
+-commit 52ed210ae99b291f72441e71459006b5f2c851ce\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Mar 7 15:34:41 2007 -0800\r
+-\r
+-    - Fix bug 408, dapltest compilation failure on 32 bit arch\r
+-    - Update libdat.spec.in file to build uDAPL RPMs correctly\r
+-\r
+-commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Mar 5 14:15:49 2007 -0800\r
+-\r
+-    Fix build issues with dtest and dapltest. Define build tree path to dat/include.\r
+-\r
+-commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Feb 28 17:14:55 2007 -0800\r
+-\r
+-    Add dapltest headers to EXTRA_DIST\r
+-    Modify dtest to delay before accepting\r
+-    \r
+-    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-\r
+-commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Feb 26 13:54:15 2007 -0800\r
+-\r
+-    Adding dtest and dapltest to the build. Manual pages created.\r
+-\r
+-commit d245664e27148e54469268ad81f41b2a894a131a\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Fri Jan 19 16:21:30 2007 -0800\r
+-\r
+-    uDAPL changes to support exchanging and validation of the device responder_resources and the\r
+-    initiator_depth during connection establishment\r
+-\r
+-commit 2280f833090aa9f750d5be8f9b06e7e08e642da5\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Wed Dec 6 11:49:27 2006 -0800\r
+-\r
+-    Update cma provider to sync with rdma_ucm changes\r
+-\r
+-commit 89448545b415b6dff57e3314b020619f6b979ef8\r
+-Author: Arlin Davis <arlin.r.davis@intel.com>\r
+-Date:   Mon Dec 4 13:54:20 2006 -0800\r
+-\r
+-    Update autogen to create config directory\r
+-\r
+-commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Tue Nov 7 20:22:05 2006 +0000\r
+-\r
+-    r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL\r
+-    level.\r
+-    \r
+-    Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a\r
+-    recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified.\r
+-    \r
+-    Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support\r
+-    to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call\r
+-    when receiving the disconnect request to guarantee a disconnect reply and event on the remote side.\r
+-    The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing\r
+-    to DISCONNECTED in the event callback.\r
+-    \r
+-    Here are the new options (environment variables) with the default setting:\r
+-    \r
+-    DAPL_CM_ARP_TIMEOUT_MS   4000\r
+-    DAPL_CM_ARP_RETRY_COUNT  15\r
+-    DAPL_CM_ROUTE_TIMEOUT_MS  4000\r
+-    DAPL_CM_ROUTE_RETRY_COUNT 15\r
+-\r
+-commit c73aeb904504a0bc6cce0fb1248af9ba39521395\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Oct 12 22:41:33 2006 +0000\r
+-\r
+-    r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported.\r
+-\r
+-commit b1d94b26610f682cdd43bde2aecf5004e0865422\r
+-Author: Steve Wise <swise@opengridcomputing.com>\r
+-Date:   Tue Sep 12 18:15:39 2006 +0000\r
+-\r
+-    r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC\r
+-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 99a5dddd07d4c271ebb075b5b0f800101f850a56\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Sep 7 18:09:11 2006 +0000\r
+-\r
+-    r9346:\r
+-    inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider\r
+-\r
+-commit b53a87c856d9754313da9543a1dac5c6f1307085\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Wed Sep 6 20:36:09 2006 +0000\r
+-\r
+-    r9315:\r
+-    Fill out some unitialized fields in the ia_attr structure\r
+-    returned by dat_ia_query().\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: Robert Walsh <robert.walsh@qlogic.com>\r
+-\r
+-commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Fri Aug 11 20:44:23 2006 +0000\r
+-\r
+-    r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default.\r
+-\r
+-commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Wed Jul 19 17:15:06 2006 +0000\r
+-\r
+-    r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider\r
+-\r
+-commit 25fb8c376547de895a170194c09b2d72dfea789d\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Mon Jul 17 22:59:17 2006 +0000\r
+-\r
+-    r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues.\r
+-\r
+-commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af\r
+-Author: Anton Blanchard <anton@samba.org>\r
+-Date:   Mon Jul 17 21:26:03 2006 +0000\r
+-\r
+-    r8562: Fix some suspicious inline assembly:\r
+-    - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we\r
+-      shouldnt export them to userspace. Replace it with lwsync and isync.\r
+-    - The comment says its implemenenting cmpxchg64 but in fact its\r
+-      implementing cmpxchg32. Fix the comment.\r
+-    \r
+-    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 63759108a1376b6e45a4491551f71d8cafdcddc1\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Jul 12 14:56:26 2006 +0000\r
+-\r
+-    r8503: Fix IA64 build problems reported by John Partridge <johnip@sgi.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Jun 22 22:02:56 2006 +0000\r
+-\r
+-    r8182: Lower the reject debug message level so we don't see warnings\r
+-    when consumers reject.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit f14889bb0cd22e897148ea2f6931a6b4f23143b0\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Jun 22 21:13:37 2006 +0000\r
+-\r
+-    r8181: Added support for active side TIMED_OUT event from a provider.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Jun 22 20:58:06 2006 +0000\r
+-\r
+-    r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 893698c31a0d8e60227806d992485a44375840cb\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Jun 19 17:20:45 2006 +0000\r
+-\r
+-    r8112: Update for new rdma_create_id() function signature.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 53483d84b0d02c432d9435d2f8e840cab3ded320\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Wed Jun 14 16:17:39 2006 +0000\r
+-\r
+-    r8008: Set max rdma read per EP attributes\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Mon Jun 12 15:42:50 2006 +0000\r
+-\r
+-    r7931: Report the proper error and timeout events.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Mon Jun 12 14:51:14 2006 +0000\r
+-\r
+-    r7928: Socket CM fix to guard against using a loopback address\r
+-    as the local device address.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 152219cf83c61e459fdf3de03d4e83ddba045230\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Tue Jun 6 21:46:44 2006 +0000\r
+-\r
+-    r7755: Use the uCM set_option feature to adjust connect request timeout\r
+-    and retry values. Also, a fix to disallow any event after a disconnect\r
+-    event.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 3a0686a2624ed28c7ea37b650415801f1cedbd10\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed May 31 19:55:57 2006 +0000\r
+-\r
+-    r7608: Correct comment.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit eb760157c90f59183b424ac8e71474fe0b46094c\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu May 18 21:54:12 2006 +0000\r
+-\r
+-    r7347: Undo inadvertent change.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 27256222b42fecfac8a44b3f82fe2524ecc72de2\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu May 18 21:50:27 2006 +0000\r
+-\r
+-    r7346: Fix for uCMA provider to return the correct event as a result of\r
+-    rejects. Also, ran into a segv bug with dapl_ep_create when\r
+-    creating without a conn_evd.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit b1b6e16f3e41e123cd347bc78b01e3272076362b\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Fri May 12 19:50:19 2006 +0000\r
+-\r
+-    r7141: Update the uDAPL openib_cma provider to work with the new\r
+-    uCMA event channel interface.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 27f9f0c106662cc7b41bcb747495860a1b6c7133\r
+-Author: Steve Wise <swise@opengridcomputing.com>\r
+-Date:   Tue May 2 21:33:35 2006 +0000\r
+-\r
+-    r6873: Transaction test change to comply with the iWARP MPA protocol's\r
+-    "Connection Startup Rules".\r
+-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 060d09f974ffbe73672e17641b2f18d3821d31a7\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Fri Apr 28 13:44:17 2006 +0000\r
+-\r
+-    r6736: getaddrinfo() fix for debug builds and some additional debug messages for\r
+-    connect errors and rejects.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Apr 19 16:49:34 2006 +0000\r
+-\r
+-    r6520: Fix compilation warning.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 115fcc396164066326f9447d71af798a381d063f\r
+-Author: Steve Wise <swise@opengridcomputing.com>\r
+-Date:   Wed Apr 19 16:32:01 2006 +0000\r
+-\r
+-    r6518: Do not always generate an event for an abrupt disconnect.\r
+-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit f959bb786cd884bf4d2a5da4d299da6297d65293\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Apr 19 16:30:37 2006 +0000\r
+-\r
+-    r6517: Generate a disconnect event for providers that do not generate\r
+-    one automatically.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit bb467511cf6e217147817ba12bbe800aae97cab5\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Apr 19 16:25:33 2006 +0000\r
+-\r
+-    r6516: Fix compilation error.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 117a9856c269bf08b738a1923c92f5a1949f6cc1\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Apr 10 20:16:44 2006 +0000\r
+-\r
+-    r6392: Fix for RDMA cm id destruction and debug builds.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Apr 6 15:32:47 2006 +0000\r
+-\r
+-    r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct\r
+-    attribute.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 304f48370adcaa12463c1a7d99e513164b83810c\r
+-Author: Steve Wise <swise@opengridcomputing.com>\r
+-Date:   Thu Apr 6 15:16:10 2006 +0000\r
+-\r
+-    r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute\r
+-    max_rdma_read_iov based on the openib max_sge_rd device attribute.\r
+-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Apr 4 18:29:00 2006 +0000\r
+-\r
+-    r6221: Change the mechanism by which library init and fini functions are specified\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 5a0598b90ab021cb2115e3791cb38dcfc0347948\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Apr 3 17:29:55 2006 +0000\r
+-\r
+-    r6182: Remove unused variables.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit b8084c4edc21b5ac2191ec654a882b65bad0c77d\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Apr 3 15:29:30 2006 +0000\r
+-\r
+-    r6179: Fix dapltest compiler warnings.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit abdbec194670d72012d481b98b2e6f728e9c5b48\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Apr 3 14:08:48 2006 +0000\r
+-\r
+-    r6168: Fixed debug prints of 64-bit values and removed compile warnings.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 52de2a35e02ddeb15887d0d690b52a4e02812e57\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Mar 21 22:28:10 2006 +0000\r
+-\r
+-    r5939: Move libdat.spec to libdat.spec.in\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Fri Mar 17 22:02:18 2006 +0000\r
+-\r
+-    r5879: Add GNU Autotools support and an RPM spec file\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 9d00582b8be33add8d3e4173e8311b1a222b0b34\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Mar 16 22:40:18 2006 +0000\r
+-\r
+-    r5871: Fixes a corner case where a CMA event was not acknowledged during\r
+-    disconnect processing.\r
+-    \r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Mar 13 18:15:49 2006 +0000\r
+-\r
+-    r5789: Reduces some debug output in the async thread and fixes listen\r
+-    processing of EBUSY.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit afd558cbdada66e01aa553364b9a126da00dbe65\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Wed Mar 8 14:24:26 2006 +0000\r
+-\r
+-    r5684: Remove unused NO_EP_STATE.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Feb 28 15:41:03 2006 +0000\r
+-\r
+-    r5529: Fix to destroy QPs in all cases and close the HCA.\r
+-    \r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Jan 9 20:17:33 2006 +0000\r
+-\r
+-    r4855: Make use of dat_evd_wait the default.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 254bd0e349bafbd970d6475efcafd7e52f05415e\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Mon Jan 9 16:59:38 2006 +0000\r
+-\r
+-    r4852: Fix disconnect event processing and update dtest to validate.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit f69d737ee51f6b00a1e6cf8531695a61a322651b\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Fri Dec 16 02:03:05 2005 +0000\r
+-\r
+-    r4502: Query for rd_atomic values.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 86566b556920a51f1e538d245674058682012668\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Fri Dec 16 01:57:30 2005 +0000\r
+-\r
+-    r4501: Allow a network name, network address, or device name in the dat.conf file.\r
+-    Singed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f\r
+-Author: Roland Dreier <rolandd@cisco.com>\r
+-Date:   Wed Dec 14 20:44:36 2005 +0000\r
+-\r
+-    r4466: Change libibverbs API for listing all known devices from\r
+-    ibv_get_devices() to ibv_get_device_list(), and update all\r
+-    in-tree uses of this API.\r
+-    \r
+-    Signed-off-by: Roland Dreier <rolandd@cisco.com>\r
+-\r
+-commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Dec 5 16:37:46 2005 +0000\r
+-\r
+-    r4308: Fix a gcc 4.0 warning\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Thu Dec 1 15:03:10 2005 +0000\r
+-\r
+-    r4279: Added CMA API support.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Nov 10 21:39:34 2005 +0000\r
+-\r
+-    r4018: Fixed some problems with the free build openib_scm version and turned\r
+-    down some debugging and added some debug prints for uAT path records.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Oct 31 18:27:13 2005 +0000\r
+-\r
+-    r3917: Fix printing of debug statements.\r
+-    Signed off by: Aniruddha Bohra <bohra@cs.rutgers.edu>\r
+-    Signed off by: James Lentini <jlentini@netapp.com\r
+-\r
+-commit 4306debe3118948fca72a68ec20ef0d73b399fd1\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Oct 26 21:10:26 2005 +0000\r
+-\r
+-    r3882: uDAPL provider for OpenIB socket CM.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 42a64ec2ec1d8ec71492bfebba077b006684ce97\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Oct 13 20:45:22 2005 +0000\r
+-\r
+-    r3774: Fix the async error handling and callback mappings.\r
+-    Updated TODO list.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde\r
+-Author: Robert Walsh <rjwalsh@pathscale.com>\r
+-Date:   Fri Oct 7 21:15:00 2005 +0000\r
+-\r
+-    r3693: Update some more ignores.\r
+-\r
+-commit 303147143afa9aa72906246a9f1973e4172f75b8\r
+-Author: Todd Bowman <twbowman@gmail.com>\r
+-Date:   Thu Oct 6 21:13:32 2005 +0000\r
+-\r
+-    r3687: Add PPC64 support for udapl\r
+-    Signed-off-by: Todd Bowman <twbowman@gmail.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce\r
+-Author: Todd Bowman <twbowman@gmail.com>\r
+-Date:   Thu Oct 6 15:22:08 2005 +0000\r
+-\r
+-    r3683: Remove the dtest qualifier from the sdp range.\r
+-    Signed-off-by: Todd Bowman <twbowman@gmail.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 33fbf9c81ac29492394e419588d856533e7fffb8\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Oct 3 14:59:22 2005 +0000\r
+-\r
+-    r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Sep 29 18:13:25 2005 +0000\r
+-\r
+-    r3619: Makefile fix.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 634b199218b775a8ed071c1faea519c4cc4ee4e3\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Sep 28 21:50:13 2005 +0000\r
+-\r
+-    r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and\r
+-    adds support for SuSe.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 3a23c7135905666ff969b86dab3e90f90ac73008\r
+-Author: Robert Walsh <rjwalsh@pathscale.com>\r
+-Date:   Tue Sep 27 16:59:14 2005 +0000\r
+-\r
+-    r3567: Setup svn:ignore on a bunch of directories.\r
+-\r
+-commit d41ea62125636a58e8748871e372810c09865b0a\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Sep 22 21:24:38 2005 +0000\r
+-\r
+-    r3525: Improve dtest and measure RDMA reads\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 32258d13af6aaf76078ec6ba187d8129a0f70397\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Sep 21 19:54:07 2005 +0000\r
+-\r
+-    r3513: Temporary workaround for the RDMA read performance anomaly\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 990bdc4320809e0b989c90c24bef361c1bc91c7f\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Sep 20 17:00:37 2005 +0000\r
+-\r
+-    r3494: Moved dapl_evd_modify_cno.c to match SourceForge\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Sep 20 16:17:59 2005 +0000\r
+-\r
+-    r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per\r
+-    device basis, and add copyrights for kDAPL cm work that was\r
+-    used in uDAPL.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit c1d45137c2e26024142f24207344e3e48a577b83\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Thu Sep 15 21:43:21 2005 +0000\r
+-\r
+-    r3453: Bind communication identifiers to a device to support device removal.\r
+-    Export per HCA CM devices to userspace.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Wed Sep 14 17:44:44 2005 +0000\r
+-\r
+-    r3432: Request address resolution using ATS.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Sep 12 19:14:43 2005 +0000\r
+-\r
+-    r3378: Added DAPL documentation.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 8911b60eb16770d28907c14e45556444317dd276\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Sep 12 19:10:13 2005 +0000\r
+-\r
+-    r3377: Removed executable premission.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Fri Sep 9 21:51:58 2005 +0000\r
+-\r
+-    r3349: Update DAPL to match the verbs and CM event processing APIs.\r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a\r
+-Author: Arlin Davis <ardavis@ichips.intel.com>\r
+-Date:   Tue Sep 6 19:34:46 2005 +0000\r
+-\r
+-    r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread.\r
+-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Aug 29 15:07:44 2005 +0000\r
+-\r
+-    r3232: validate default settings so they don't exceed device maximums\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit ac5308b4aac7de79a356439dfec2312faf7705ae\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Mon Aug 29 14:15:23 2005 +0000\r
+-\r
+-    r3227: Support for ibv_query_port, device, and gid.\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7\r
+-Author: Sean Hefty <sean.hefty@intel.com>\r
+-Date:   Sun Aug 21 22:30:08 2005 +0000\r
+-\r
+-    r3143: - Add user specified context to all uCM events.  Users will not retrieve\r
+-      any events associated with the context after destroying the corresponding\r
+-      cm_id.\r
+-    - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM.\r
+-      This call may be used to set QP attributes properly before modifying the QP.\r
+-    - Fixes some error handling syncrhonization and cleanup issues.\r
+-    - Performs some minor code cleanup.\r
+-    - Replaces the ucm_simple test program with a userspace version of cmpost.\r
+-    - Updates DAPL to the new API.\r
+-    \r
+-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+-\r
+-commit ec0f86d7c55830c6dffded585c04754cc6ac2a83\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Aug 16 14:10:13 2005 +0000\r
+-\r
+-    r3107: Removed unused debug counter macros\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 49087ba27bd93769bb64d7ac5c454de1b94005bc\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Tue Aug 16 14:07:42 2005 +0000\r
+-\r
+-    r3106: Implemented debug counters\r
+-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+-    Signed-off by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 20:23:56 2005 +0000\r
+-\r
+-    r3072: Update from SourceForge DAPL: use the LMR context in calls to\r
+-    dapls_hash_remove()\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 878e524c5cc63a62802d28fdc215a2b69ceb1141\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 20:07:06 2005 +0000\r
+-\r
+-    r3071: Updates from SourceForge DAPL: EVD updates\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 19:57:40 2005 +0000\r
+-\r
+-    r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit f2801ae6caf010d660fe302970dabddc8948e1bf\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 19:46:39 2005 +0000\r
+-\r
+-    r3069: Updates from SourceForge DAPL: size EP IOV correctly\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit c87fd235eaf0b3a30e005422f7d347c406c14f2c\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 19:35:05 2005 +0000\r
+-\r
+-    r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and\r
+-    fixed the spelling of ib_hca_transport_t.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit a88bebc09a9655e462b3d32dfddec823024eab59\r
+-Author: James Lentin <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 19:24:56 2005 +0000\r
+-\r
+-    r3067: Update from SourceForge DAPL: use include guard\r
+-    Signed-off-by: James Lentin <jlentini@netapp.com>\r
+-\r
+-commit d2da08920de882a9a266f0606b81150c625fa003\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 19:21:56 2005 +0000\r
+-\r
+-    r3066: Update from SourceForge DAPL: optimization to dapl_ep_query\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 18:39:34 2005 +0000\r
+-\r
+-    r3065: Update from DAPL SourceForge: indicate which handle is invalid\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 6d8f34137776c32149251bdec493c017b399cd10\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 18:35:58 2005 +0000\r
+-\r
+-    r3064: Update from DAPL SourceForge: set ep param values.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 18:33:47 2005 +0000\r
+-\r
+-    r3063: Updates from DAPL SourceForge: QP state and connection event fix.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 3fc876339693c6f0eed5e57780e5342f301bd95c\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Thu Aug 11 18:23:33 2005 +0000\r
+-\r
+-    r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9\r
+-Author: Hal Rosenstock <halr@voltaire.com>\r
+-Date:   Fri Aug 5 17:59:38 2005 +0000\r
+-\r
+-    r2989: Fix dtest makefile\r
+-    Signed-off-by: Hal Rosenstock <halr@voltaire.com>\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Fri Aug 5 17:57:31 2005 +0000\r
+-\r
+-    r2988: Remove kernel directory.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 9c4e246a5baf43cadc6380e91fd5a6e319777278\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Fri Aug 5 17:56:56 2005 +0000\r
+-\r
+-    r2987: Remove kernel code directory.\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 26706cb0de471ba47279de0cb949ba5a41de82cc\r
+-Author: James Lentini <jlentini@netapp.com>\r
+-Date:   Fri Aug 5 16:41:12 2005 +0000\r
+-\r
+-    r2986: Add uDAPL to the trunk\r
+-    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+-\r
+-commit 76aa2de7fe38a8595d88669842450084cfa88316\r
+-Author: Roland Dreier <roland@topspin.com>\r
+-Date:   Thu Nov 4 17:54:50 2004 +0000\r
+-\r
+-    r1139: Copy roland-merge branch to trunk\r
+-\r
+-commit 3bd72a559dfe22685aae33599c99d021d2ae4aca\r
+-Author: Roland Dreier <roland@topspin.com>\r
+-Date:   Tue Jul 20 21:34:32 2004 +0000\r
+-\r
+-    r502: Move 2.6-only source away from trunk\r
+-\r
+-commit 4f05b6ed3fd1d14161664c677264846eeb51dba5\r
+-Author: Roland Dreier <roland@topspin.com>\r
+-Date:   Tue Jul 20 21:34:32 2004 +0000\r
+-\r
+-    r502: Move 2.6-only source away from trunk\r
+-\r
+-commit 6da8b951c069072a2afc6aba03a3dca2c44db022\r
+-Author: Roland Dreier <roland@topspin.com>\r
+-Date:   Tue Jul 20 01:41:16 2004 +0000\r
+-\r
+-    r497: Move 2.6-only tree to gen2\r
++commit f85be199252d12d27c7b7814771a4ca83a43d0c8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Aug 9 14:25:09 2010 -0700
++
++    common: increase default logging to include warnings
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 59489448a7918ab2a1a4b9bcac7e4661cdd97a23
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Aug 9 14:19:50 2010 -0700
++
++    common: add more debug levels for cm logging
++    
++    DAPL_DBG_TYPE_CM_EST   = 0x8000,
++    DAPL_DBG_TYPE_CM_WARN  = 0x10000
++    
++    Add level for connection establishment and events
++    and for retries/timer events.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 70c509bca8409d55ad7c4a248f453956d163778b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Aug 2 09:51:30 2010 -0700
++
++    common: cleanup CR linkings after DTO error on EP
++    
++    Add cleanup to remove CR from SP and EP
++    during DTO errors in dapli_evd_cqe_to_event.
++    
++    dapl_sp_remove_ep needs to remove cr_ptr
++    reference from EP before freeing cr object.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 319430b3bbfb8692dd3d21a21633bfee74cf5b7c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Aug 2 09:49:23 2010 -0700
++
++    ucm: cleanup CM debug warning messages
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7118731a890e9188bb02dc7a5b21ffd832855e9e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jul 23 15:17:53 2010 -0700
++
++    scm, ucm: improperly handles pkey check/query in host order
++    
++    Convert consumer input to network order before verbs
++    query pkey check.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit c5504925b8b98006f421d53475e8ecd55b76f9dd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jul 12 15:57:34 2010 -0700
++
++    The linux compatability header file _errno.h is moving out of verbs.h.
++    Include _errno.h in the windows osd header files, similar to how
++    errno.h is included in the linux osd header files.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 455e9d6d0aeb753a9ecb4a130b0b237e1ffd4146
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 30 12:03:41 2010 -0700
++
++    windows: update SOURCES files to link winverbs.lib, which is
++    needed for common ofa providers.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit b441934f5e55582ef01a91c01da720334345a452
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jun 17 12:58:22 2010 -0700
++
++    Release 2.0.29
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 6c6a482b8ad33d134f0631019b249bd0fea71007
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jun 17 12:40:21 2010 -0700
++
++    scm, ucm: add pkey, pkey_index, sl override for QP's
++    
++    On a per open basis, add environment variables
++    DAPL_IB_SL and DAPL_IB_PKEY and use on
++    connection setup (QP modify) to override default
++    values of 0 for SL and PKEY index. If pkey is
++    provided then find the pkey index with
++    ibv_query_pkey for dev_attr.max_pkeys.
++    Will be used for RC and UD type QP's.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 876942781e9bf72302184f3534a2ddc4068550ac
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jun 10 11:40:45 2010 -0700
++
++    cma: remove dependency on rdma_cma_abi.h
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b34ea37650b5eefeedfc463345775ff568df259e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 2 14:13:05 2010 -0700
++
++    configure: need a false conditional for verbs attr.link_layer member check
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 977f11871d3d4e98f602f890ade1c31cf4169c9c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 2 10:05:03 2010 -0700
++
++    ucm: incorrectly freeing port on passive side after reject
++    
++    cm_release was incorrectly freeing a client port
++    assuming it was the server listening port. Move
++    the listening port cleanup to remove_conn_listner
++    and only cleanup client ports in cm_release.
++    
++    Error Messages indicating problem:
++    
++      CM_REQ retry 1 [lid, port, qpn]: 9 ff9a 340085 -> 9 6fa 34004e Time(ms) 1999 > 1600
++      DUPLICATE: op REQ st CM_CONNECTED [lid, port, qpn]: 9 6fa 0x0 <- 0x9 ff9a 0x340085
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7aedfb1e9dcb9e2841ebe3496bb9aae33c1f6a5b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 2 09:45:42 2010 -0700
++
++    ucm: modify debug CM output for consistency, all ports, qpn in hex
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 8e776ff0621cee1824be224b7a32f79e89b0ebc2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 24 16:44:25 2010 -0700
++
++    Release 2.0.28
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 8fdbd949ef464aa57b13743ab087ea72f035fbc3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 24 16:28:05 2010 -0700
++
++    config: add conditional check for new verbs port_attr.link_layer
++    
++    Check for link_layer type ETHERNET and set global for GID
++    configuration on modify QP.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 1ce0875fb2ac6120cfee006b48a20a4ec38f599b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 24 10:30:28 2010 -0700
++
++    dat.conf: update manpage with latest provider information, add examples
++    
++    Add information regarding OpenFabrics provider choices
++    and explain cma, scm, and ucm providers.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9c42d5872feb07f25f003e01263a3062ebc3bdbb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 19 16:38:53 2010 -0700
++
++    cma, scm: new provider entries for Mellanox RDMA over Ethernet device
++    
++    Add options for netdev eth2 and eth3 for cma and for device mlx4_0 port 1 and 2 for scm.
++    
++    ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" ""
++    ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" ""
++    ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" ""
++    ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" ""
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit d947e05317fe7fef19c90f772ec8f458ff52b196
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 19 15:17:58 2010 -0700
++
++    dapltest: server info devicename is not large enough for dapl_name storage
++    
++    Server info device name is a 80 char array but the dapl device name
++    that is copied is 256 bytes. Increase started_server.devicename definition.
++    Chalk one up for windows SDK OACR (auto code review).
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit c7a7a886af194cf735ee1eb62d9e14967d51249a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 19 14:48:49 2010 -0700
++
++    windows: comp_channel.cpp is included by util.c in the openib_common.
++    
++    Remove it from device.c in individual providers to avoid
++    duplicate definitions.
++    
++    Line endings were corrected to linux format from windows as part of
++    the change.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit bcaa400778d14a977d5cd224056baa0cff06126d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 19 14:45:55 2010 -0700
++
++    windows: need to include linux directory to pick up _errno.h
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit c616a8549db461e39feed71f0f10228313d17b90
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 17 16:22:30 2010 -0700
++
++    scm: check for hca object before signaling thread
++    
++    There may not be an hca object attached to cm object
++    when freeing during cleanup.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 1dbba72741da267f71903a9f2ec03628f3e8a47a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 17 16:15:21 2010 -0700
++
++    scm, cma: fini code can be called multiple times and hang via fork
++    
++    The providers should protect against forked child exits and
++    not cleanup until the parent init actually exits. Otherwise,
++    the child will hang trying to cleanup dapl thread. Modify to
++    check process id for proper init to fini cleanup and limit
++    cleanup to parent only.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b35cb1b16a9dda349dbb19bce9f9bd4afb7240a4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 14 16:20:52 2010 -0700
++
++    scm: add option to use other network devices with environment variable DAPL_SCM_NETDEV
++    
++    New environment variable can be used to set the netdev
++    for sockets to use instead of the default network device
++    returned using gethostname.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit cfdf8bb8951b1c19b8e42d58e4ec26070fdc078e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 14 10:27:50 2010 -0700
++
++    scm: cr_thread occasionally segv's when disconnecting all-to-all MPI static connections
++    
++    Note: no valid calltrace for segv on cr_thread because
++    of state changing in switch statement from another
++    thread, jumped unknown location.
++    
++    Program received signal SIGSEGV, Segmentation fault.
++    [Switching to Thread 0x41a65940 (LWP 1328)]
++    0x00002b2e7d9d5134 in ?? ()
++    
++    Add cm object locking on all state change/checking. When
++    freeing CM object wakeup cr_thread to process
++    state change to CM_FREE.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 4b04afc32940ac42fb2a9bc789a537b527d149fe
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu May 13 10:31:17 2010 -0700
++
++    scm: SOCKOPT ERR Connection timed out on large clusters
++    
++    Large scale all to all connections on +1000 cores
++    the listen backlog is reached and SYN's are dropped
++    which causes the connect to timeout. Retry connect
++    on timeout errors.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 625369f991982f020c04156f312ecf2ecafd77b3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 10 12:46:17 2010 -0700
++
++    ucm: UD mode, active side cm object released to soon, the RTU could be lost.
++    
++    Will see following message with DAPL_DBG_TYPE set for Errors & Warnings (0x3):
++    ucm_recv: NO MATCH op REP 0x120 65487 i0x60005e c0x60005e < 0xd2 19824 0x60006a
++    
++    The cm object was released on the active side after the connection
++    was established, RTU sent. This is a problem if the RTU is lost
++    and the remote side retries the REPLY. The RTU is never resent.
++    Keep the cm object until the EP is destroyed.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 83eec7f19a7442fe568dea685cee7b02fef2f4d1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 10 12:35:51 2010 -0700
++
++    cma, ucm: cleanup issues with dat_ep_free on a connected EP without disconnecting.
++    
++    During EP free, disconnecting with ABRUPT close flag, the disconnect should wait
++    for the DISC event to fire to allow the CM to be properly destroyed upon return.
++    
++    The cma must also release the lock when calling the blocking rdma_destroy_id given
++    the callback thread could attempt to acquire the lock for reference counting.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit da83172db68d05f54b2c1c77b84ecf86dea0c693
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 28 15:37:27 2010 -0700
++
++    ucm: increase default UCM retry count for connect reply to 15
++    
++    On very large clusters UCM is timing out with retries at 10.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 5c710a197bb60268e99e8d1cd7fa26f89b366172
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 27 11:20:08 2010 -0700
++
++    scm: remove modify QP to ERR state during disconnect on UD type QP
++    
++    The disconnect on a UD type QP should not modify QP to error
++    since this is a shared QP. The disconnect should be treated
++    as a NOP on the UD type QP and only be transitioned during
++    the QP destroy (dat_ep_free).
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 64c8009f7ba48c22a6829862447ab5f67c66ba55
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Apr 8 16:32:02 2010 -0700
++
++    windows: remove static paths from dapltest scripts
++    
++    signed-off-by: stan smith <stan.smith@intel.com>
++
++commit 84b78b0b586ee25c7ab78e2c5f7f19a3ce3f21ee
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Apr 8 09:38:57 2010 -0700
++
++    common: EP links to EVD, PZ incorrectly released before provider CM objects freed.
++    
++    unlink/clear references after ALL CM objects linked to EP are freed.
++    Otherwise, event processing via CM objects could reference the handles
++    still linked to EP. After CM objects are freed (blocking) these handles
++    linked to EP are guaranteed not to refereence from underlying provider.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 297e149e7af631663ecc60472a3ee093a7f72059
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 7 11:12:21 2010 -0700
++
++    common: remove unnecessary lmr lkey hashing and duplicate lkey checking
++    
++    lmr lkey hashing is too restrictive given the returned lkey could be
++    the same value for different regions on some rdma devices. Actually,
++    this checking is really unecesssary and requires considerable overhead
++    for hashing so just remove hashing of lmr lkey's. Let verbs device
++    level do the checking and validation.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 96fba2ee7a0a1766f200c9486e62aad46d18bb09
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 29 12:20:34 2010 -0800
++
++    ibal: output completion code in deciaml & hex as intended
++    
++    sign-off-by: stan smith <stan.smith@intel.com>
++
++commit 753f7d35c814367f431deeb307e6decd933a8b5a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 15:02:44 2010 -0800
++
++    ucm: set timer during RTU_PENDING state change.
++    
++    The timer thread may pick up an unitialized timer
++    value and timeout before the reply was sent.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9fc851021d91b282054cf28b4f83f7e5d376f228
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 14:47:58 2010 -0800
++
++    ucm: fix issues with new EP to CM linking changes
++    
++    Add EP locking around QP modify
++    Remove release during disconnect event processing
++    Add check in cm_free to check state and schedule thread if necessary.
++    Add some additional debugging
++    Add processing in disconnect_clean for conn_req timeout
++    Remove extra CR's
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit a5da5e4dac52366a9fe9efeb9a128bd4511481e2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 14:18:06 2010 -0800
++
++    scm: add EP locking and cm checking to socket cm disconnect
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7f733cd1a9acd4b9b270a807673290362050053d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 09:44:44 2010 -0800
++
++    scm: new cm_ep linking broke UD mode over socket cm
++    
++    Add EP locking around modify_qp for EP state.
++    Add new dapli_ep_check for debugging EP
++    Cleanup extra CR's
++    Change socket errno to dapl_socket_errno() abstraction
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit a528267020972e0c449f240ba72a0cc80a5d372e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 09:17:01 2010 -0800
++
++    openib common: add some debug prints to help isolate QP type issues
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit fdfdc439d091c878c74d23b9ac46a3320379199d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 09:15:12 2010 -0800
++
++    common: dapl_event_str function missing 2 IB extended events
++    
++    Add all IB extended events in event string print function
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 2bf3eb939e9a584ae0fe2de70f16cdcca8acf014
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 16 09:12:11 2010 -0800
++
++    common: dat_ep_connect should not set timer UD endpoints
++    
++    connect for UD type is simply AH resolution and doesn't
++    need timed. The common code is not designed to handle
++    multiple timed events on connect requests so just ignore
++    timing UD AH requests.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 73ca06debe4735dfc11f44076a13dde079657b2e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 15 10:23:47 2010 -0800
++
++    ucm: fix error path during accept_usr reply failure
++    
++    if accept_usr fails when sending reply the EP was
++    being linked to CM instead of properly unlinked.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 944ef4445faceeb90bb61d4e377274ad0fd6711f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 8 13:56:28 2010 -0800
++
++    ibal: add missing windows makefile
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 1d53e8eb90e6f74b41e7767e1c71851ff4ec73fd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 8 12:53:45 2010 -0800
++
++    ibal: changes for EP to CM linking and synchronization.
++    
++    Windows IBAL changes to allocate and manage CM objects
++    and to link them to the EP. This will insure the CM
++    IBAL objects and cm_id's are not destroy before EP.
++    Remove windows only ibal_cm_handle in EP structure.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 4b939076aa32bb52957fcc6791e187c9433d4c24
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 24 12:00:07 2010 -0800
++
++    scm: add support for canceling conn request that times out.
++    
++    print warning message during timeout.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f38fc04d517ee6c0560b271298293c56cc619522
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 24 11:28:04 2010 -0800
++
++    scm, cma, ucm: consolidate dat event/provider event translation
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 41739dab38a4be8076ecd9e61b5e175cf91ab322
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 24 11:26:25 2010 -0800
++
++    common: missed linking changes from atomic to acquire/release
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7ff4f840bf1150fa2c2f541c93d810622ea9733b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 24 10:03:57 2010 -0800
++
++    common: add CM-EP linking to support mutiple CM's and proper protection during destruction
++    
++    Add linking for CM to EP, including reference counting, to insure syncronization
++    during creation and destruction. A cm_list_head has been added to the EP object to
++    support multiple CM objects (UD) per EP. If the CM object is linked to an EP it
++    cannot be destroyed.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit c9fbd6e7a8131d4077039d5da716b618727d4009
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Feb 23 16:26:41 2010 -0800
++
++    Release 2.0.27-1
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 454c27b1f357c7c3070e459b25d12929f86304ca
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 22 09:42:17 2010 -0800
++
++    windows: add scm makefile
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 66ac48d5280bcf0453760c6e22909de6b8519b6d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 22 09:41:13 2010 -0800
++
++    Windows does not require rdma_cma_abi.h, move the include from common code and to OSD file.
++    
++    Signed-off-by: stan smith <stan.smith@intel.com>
++
++commit c05c41c31f01e1ddef91e92998ca66d258fafe3d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Feb 19 14:52:01 2010 -0800
++
++    Windows patch to fix IB_INVALID_HANDLE name collision
++    
++    signed-off-by: stan smith <stan.smith@intel.com>
++
++commit 712e7e5ba71f8a4344dfff481a9be870eefefe25
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 8 13:49:35 2010 -0800
++
++    scm: dat_ep_connect fails on 32bit servers
++    
++    memcpy for remote IA address uses incorrect sizeof for a pointer type.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 3040fa78d7d22c8f76c88dc77cedde09f016eb67
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Feb 5 11:51:16 2010 -0800
++
++    undefined symbol: dapls_print_cm_list
++    
++    call prototype should be dependent on DAPL_COUNTERS.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit cbeebe422b952d679f49429be8ba045a62d7f4ac
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Feb 5 11:39:21 2010 -0800
++
++    Cleanup CM object lock before freeing CM object memory
++    
++    Running windows application verifiier for uDAPL validation
++    for all 3 providers. Cleanup memory lock leaks found
++    by verifier.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 855a8e4aa83fa2e4f7847122415106f49286f4ca
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 3 16:21:30 2010 -0800
++
++    destroy verbs completion channels created via ia_open or ep_create.
++    
++    Completion channels are created with ia_open for CNO events and
++    with ep_create in cases where DAT allows EP(qp) to be created with
++    no EVD(cq) and IB doesn't. These completion channels need to be
++    destroyed at close along with a CQ for the EP without CQ case.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 4da540591148e47dd912851cc7314776f2f7622e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 3 11:06:45 2010 -0800
++
++    Update Copyright file and include the 3 license files in distribution
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9011abd4b1470c65bfe81eef5a2f3a81060cec81
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Feb 2 14:43:03 2010 -0800
++
++    When copying private_data out of rdma_cm events, use the
++    reported private_data_len for the size, and not IB maximums.
++    This fixes a bug running over the librdmacm on windows, where
++    DAPL accessed invalid memory.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 5da33bb3b9c230c08492f85d13caa330ce65906e
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Jan 28 10:19:20 2010 -0800
++
++    dapl/cma: fix referencing freed address
++    
++    DAPL uses a pointer to reference the local and remote addresses
++    of an endpoint.  It expects that those addresses are located
++    in memory that is always accessible.  Typically, for the local
++    address, the pointer references the address stored with the DAPL
++    HCA device.  However, for the cma provider, it changes this pointer
++    to reference the address stored with the rdma_cm_id.
++    
++    This causes a problem when that endpoint is connected on the
++    passive side of a connection.  When connect requests are given
++    to DAPL, a new rdma_cm_id is associated with the request.  The
++    DAPL code replaces the current rdma_cm_id associated with a
++    user's endpoint with the new rdma_cm_id.  The old rdma_cm_id is
++    then deleted.  But the endpoint's local address pointer still
++    references the address stored with the old rdma_cm_id.  The
++    result is that any reference to the address will access freed
++    memory.
++    
++    Fix this by keeping the local address pointer always pointing
++    to the address associated with the DAPL HCA device.  This is about
++    the best that can be done given the DAPL interface design.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 66dbb5f20bf494eb3f5041655b478059165c5f1b
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Tue Jan 26 15:13:03 2010 -0800
++
++    dapl: move close device after async thread is done
++    
++    using it
++    
++    Before calling ibv_close_device, wait for the asynchronous
++    processing thread to finish using the device.  This prevents
++    a use after free error.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 560b235adc799fa710571ca63cbc3e4fa6374ff2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jan 11 09:03:10 2010 -0800
++
++    Release 2.0.26-1
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 73dfb32ace6aff2fdb21e54689342fd551822286
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Dec 22 14:00:33 2009 -0800
++
++    openib_common: add check for both gid and global routing in RTR
++    
++    check for valid gid pointer along with global route setting
++    during transition to RTR. Add more GID information to
++    debug print statement in qp modify call.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7aab18fd8ff3f201b0a4b6c76896667b29f103c4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Dec 4 12:31:22 2009 -0800
++
++    openib_common: remote memory read privilege set multi times
++    
++    duplicate setting of read privilege in dapls_convert_privileges
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 016e2c40b8ac2fe18993e9fb7122ecb9b439e5eb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Dec 4 12:25:30 2009 -0800
++
++    ucm, scm: DAPL_GLOBAL_ROUTING enabled causes segv
++    
++    socket cm and ud cm providers support QP modify with is_global
++    set and GRH. New v2 providers didn't pass GID information
++    in modify_qp RTR call and incorrectly byte swapped the already
++    network order GID. Add debug print of GID during global modify.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7b0c596c7b4ad619f65da9f79dcbc4376e651dde
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 24 22:16:58 2009 -0800
++
++    Release 2.0.25-1
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 3197bffff478ad7ff5eff9220fa0528e42e6b56e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 24 22:15:46 2009 -0800
++
++    winof scm: initialize opt for NODELAY setsockopt
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 8559ec069329249592f367b5b8f61427cbad0a46
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 24 11:29:46 2009 -0800
++
++    Release 2.0.25
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 0983c66cbd9511128c1fa221470c4c983903e420
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 24 08:58:44 2009 -0800
++
++    winof cma: windows definition for EADDRNOTAVAIL missing
++    
++    Signed-off-by: stan smith <stan.smith@intel.com>
++
++commit 4fbbcfa1d7bf7a843b27e351d35f3ffbc2ac4db8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 24 08:54:26 2009 -0800
++
++    scm: client side setsockopt NODELAY fails if data arrives before setting
++    
++    Move setsockopt before connect to avoid race with data.
++    Seems to fail on windows. Not seen on linux.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9dfa9a06d55101fed0773028ce7ab85330514c67
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Nov 18 09:52:40 2009 -0800
++
++    cma: setup_listener Cannot assign requested address
++    
++    Colliding with RDS port of 18634. rdma_cm can return
++    either EADDRINUSE or EADDRNOTAVAIL if the bind fails.
++    Add check for either and return proper DAT_CONN_QUAL_IN_USE.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 0698fb56d533a5225cbc3a5a4b8ab2e2d56b7502
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Nov 18 09:43:38 2009 -0800
++
++    common: seg fault in dapl_evd_wait with multi-thread application using CNO's.
++    
++    If we are dealing with event streams besides a CQ event stream,
++    be conservative and set producer side locking.  Otherwise, no.
++    Check for CNO is missing, CNO is not considered CQ event stream.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 4d26a280572a58248b0796e4d5ed01ea5d67be46
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Nov 18 09:37:48 2009 -0800
++
++    ucm: inbound DREQ/DREP handshake should transition QP.
++    
++    During release, when receiving a disconnect request from remote peer
++    instead of a disconnect call from the client, the QP didn't get properly
++    set in ERR state and didn't flush the queue during disconnect processing.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 87965cd15bbfa38b00ed2d77a4ea5a76f76cf4a3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Nov 2 08:24:53 2009 -0800
++
++    winof: Remove duplicate include of comp_channel.cpp from cm.c as it is included in opensm_ucb/device.c.
++    
++    Signed-off-by: stan smith <stan.smith@intel.com>
++
++commit 737fa288b72fad19a1fc3e762eb9f2c471ce6ddd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 30 13:19:21 2009 -0800
++
++    Release 2.0.24
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9fe7506ff9ddf1ae6297cfc6a9dd4d6a57e1939e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 30 12:57:22 2009 -0800
++
++    winof: Utilize WinOF version of inet_ntop() for Windows OSes which do not support inet_ntop().
++    
++    Signed-off-by: stan smith <stan.smith@intel.com>
++
++commit d56c645a2bf234e9e0cf215b112c2aa9d5e01945
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 30 07:17:26 2009 -0800
++
++    ucm: windows build issue with new CQ completion channel
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 2d2e7e1e185c08542ee31b0e77561a1eeb4bde6c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 30 06:35:33 2009 -0800
++
++    winof: add ucm provider to windows build
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 94b2206093607214e0a9709651460692e8196e1c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 30 06:32:56 2009 -0800
++
++    winof: add missing build files for ibal, scm
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 66b76d7a8035b9164b69781d7630a0c77ce1bb5a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 28 09:52:50 2009 -0800
++
++    scm: connection peer resets under heavy load, incorrect event on error
++    
++    Under heavy load, we get a peer reset from the remote stack. In this
++    case retry the socket connection for this QP setup.
++    
++    Add debugging with PID's and socket ports to help isolate
++    these types of socket scaling issues.
++    
++    Report correct UD event during error, check remote_ah creation.
++    
++    Fix dapl_poll return codes for single event type only.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f8108a9bda0200355107fdd6c43cb5885f47d648
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 28 09:47:37 2009 -0800
++
++    ucm: increase default reply and rtu timeout values.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9c13d0d01c78eeb5071e802fbb53811cdb377059
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 28 07:48:20 2009 -0800
++
++    ucm: change some debug message levels and add check for valid UD REPLY during retries.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 1c404bb3dcc0a45e21ef3aa973d59714413beae0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 27 10:37:45 2009 -0800
++
++    ucm: increase timers during subsequent retries
++    
++    check/process create_ah errors during connect phase
++    cleanup some debug messaging.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit cd8c48586f53e846de4fbe10994b73ba457f6406
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Oct 19 10:38:36 2009 -0700
++
++    ucm, scm: address handles need destroyed when freeing Endpoints with UD QP's.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit ce19f5744c0dd9461c09d999b309e8f0e2242767
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 16 14:42:00 2009 -0700
++
++    openib_common: ignore pd free errors, clear pd_handle and return.
++    
++    some older adapters have some issues
++    with pd free so just clear handle and return
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 81f5ac17d9039e2edcd8324f7d5ed5f66fcff9f2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 16 08:52:21 2009 -0700
++
++    ucm: using UD type QP's, ucm reports wrong reject event when user rejects AH resolution request.
++    
++    During rejects, both usr and ucm internal, the qp_type does not get initialized
++    so the check for UD type QP messages fail on active side and the wrong
++    event gets generated. Initialize saddr.ib information before sending reject
++    back to active side.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f0214e5a7a81a68819d308cb921eb75f5246207d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 16 07:57:25 2009 -0700
++
++    ucm, scm, cma: Fix CNO support on DTO type EVD's
++    
++    EVD wait_object should be used for CNO processing
++    and not the direct CQ event channels. Add proper
++    checking for DTO type EVD's with CNO at wait
++    and wakeup.
++    
++    UCM missing support for collective EVD's under a
++    CNO. Add support to create common channel for
++    collective EVD's during device open. Add support
++    in cm_thread to check this channel. Also,
++    during disconnect, move QP to error to properly
++    flush queue instead of moving to reset and init.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 960950a7d9f5437dd831bd56ca2ad0c06cb4e324
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Oct 15 09:19:45 2009 -0700
++
++    ucm: fix lock init bug in ucm_cm_find
++    
++    the lock should be setup as pointer to lock
++    not lock structure. Cleanup lock and list
++    in cm_find function and cm_print function.
++    
++    Add debug aid by passing process id in
++    msg resv area. cleanup cr references
++    and change to cm for consistency.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f86fec772f2d82eaf60228d288b295e0b7b86c59
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 14 10:03:47 2009 -0700
++
++    ucm: fix build problem with latest windows ucm changes
++    
++    define dapls_thread_signal as inline
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 87b6c8ba92f3063a35d49bdb49d6cd0a5100a36c
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Oct 14 09:34:22 2009 -0700
++
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 9fdd8d74f2cba83e9cf513256933f5241495c1da
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Oct 14 09:34:18 2009 -0700
++
++    The HCA should not be closed until all resources have been released.
++    This results in a hang on windows, since closing the device frees
++    the event processing thread.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit f9833db469f2d686842bb1d52d1ea53b74fa72a8
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Oct 14 09:34:13 2009 -0700
++
++    Fix build warning when compiling on 32-bit systems.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit c80515bd4b1bd11a125dc17e3f7db44240ee1fff
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Oct 14 09:34:07 2009 -0700
++
++    Trying to deregister the same memory region twice leads to an
++    application crash on windows.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 6aa2c0d901daa9cfca7e771c1df2ead074d230bd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 14 07:59:23 2009 -0700
++
++    dat: reduce debug message level when parsing for location of dat.conf
++    
++    Don't output failover to default /etc/dat.conf from
++    sysconfdir at ERROR level. Reduce to DAT_OS_DBG_TYPE_SR.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e4038e078747201b57203f16ba793b7fc22c12f2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Oct 8 16:23:22 2009 -0700
++
++    ucm: update ucm provider for windows environment
++    
++    add dapls_thread_signal abstraction and a new
++    cm_thread function specific for windows.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit d80ce42390eb57b9c4f816b4df063f90bd5699bc
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Oct 8 16:02:52 2009 -0700
++
++    ucm: add timer/retry CM logic to the ucm provider
++    
++    add reply, rtu and retry count options via
++    environment variables. Times in msecs.
++    DAPL_UCM_RETRY 10
++    DAPL_UCM_REP_TIME 400
++    DAPL_UCM_RTU_TIME 200
++    
++    Add RTU_PENDING and DISC_RECV states
++    
++    Add check timer code to the cm_thread
++    and the option to the select abstaction
++    to take timeout values in msecs.
++    DREQ, REQ, and REPLY will all be timed
++    and retried.
++    
++    Split out reply code and disconnect_final
++    code to better facilitate retry timers.
++    Add checking for duplicate messages.
++    
++    Added new UD extension events for errors.
++    DAT_IB_UD_CONNECTION_REJECT_EVENT
++    DAT_IB_UD_CONNECTION_ERROR_EVENT
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 1186bfc949f4bb7278c30c2c59b7fcb6d5142638
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 2 14:49:52 2009 -0700
++
++    Release 2.0.23
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit a5f1220cfd96983c9c89a595d80fab7ddcb1a954
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 2 14:48:15 2009 -0700
++
++    cma: cannot reuse the cm_id and qp for new connection, must reallocate a new one.
++    
++    When merging common code base the dapls_ib_reinit_ep mistakely
++    modified QP to reset then init for all providers. Will
++    not work for rdma_cm (cma provider) since the cm_id cannot
++    be reused.  Add build check for _OPENIB_CMA_ to pull in correct
++    free and reallocate method for reinit_ep.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 7b07435495de0938e59be064fe8642cfd739f1ac
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 2 13:50:12 2009 -0700
++
++    scm, cma: update DAPL cm protocol revision with latest address/port changes
++    
++    CM protocol changed, roll revision to 6.
++    The socket cm could be competing with address space if
++    application is using sockets above to exchange information
++    like dapltest, and MPI consumers. Adjust port on listen
++    and connect to reduce the chance of port collision with
++    application above.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9cc1e76b672f7ff1231b4d113bd4dd1a016d1410
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 2 12:47:37 2009 -0700
++
++    ucm: modify IB address format to align better with sockaddr_in6
++    
++    Restructure the dcm_addr union to map the IB side
++    closer to sockaddr6 and initialize family to
++    AF_INET6 to insure callee allocates enough memory
++    for ucm dat_ia_address type. Put qpn in flowinfo
++    and gid in sin6_addr. Change the test suites
++    to print address information based on AF_INET
++    or AF_INET6 instead of using specific IB address
++    union from the provider.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f50dbe6e82bd471845adf27829b2e07234a0a86a
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Sep 30 14:29:03 2009 -0700
++
++    Add definition for getpid similar to that used by the other dtest apps.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 51147412fad72c00115b595955760e80ff0be7d5
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Sep 30 14:28:57 2009 -0700
++
++    WinOF provides a common implementation of gettimeofday that should
++    be used instead.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 732fc84cee036126282715ea157bdb619fc11ec7
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Wed Sep 30 14:27:50 2009 -0700
++
++    The completion manager was updated to provide an abstraction that
++    better mimicked how fd's were used.  Update dapl to use this
++    abstraction, rather than the older completion manager api.
++    
++    This helps minimize changes between linux and windows.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit fc1855b7738838d3865389405f017b87d223f743
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 30 14:26:47 2009 -0700
++
++    dtestcm: remove IB verb definitions
++    
++    Remove gid and qp_type references from test app.
++    Print address infomation in sockaddr and
++    ucm provider format with qpn and lid.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 36a885d4267be7b3c6c1086372d321121ae03dee
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 30 10:44:14 2009 -0700
++
++    dtest, dtestx: remove IB verb definitions
++    
++    remove gid and qp_type checking from test suite.
++    Print address infomation in sockaddr and
++    ucm provider format with qpn and lid.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 23445bbbd3a09f7f5e666a000d5c7c3b22dd95b3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 28 10:59:36 2009 -0700
++
++    scm: tighten up socket options to insure similiar behavior on Windows and Linux.
++    
++    Add IPPROTO_TCP to create socket. Specify device IP address
++    when binding instead of INADDR_ANY and remove setsocketopt
++    REUSEADDR on the listen socket to avoid any issues with
++    portability. Don't want duplicate port bindings.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b31b64d60abe7c6c1a83484db97176d225076b30
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 28 10:46:26 2009 -0700
++
++    cma: improve serialization of destroy and event processing
++    
++    WinOF testing with slightly different scheduler and verbs
++    showed some issues with cleanup. Add better protection around
++    destroy and event processing thread.
++    
++    Remove destroy flag and add refs counting to conn objects
++    to block destroy until all references are cleared. Add
++    locking aroung ref counting and passive and active
++    event processing.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit a4adf463695ba75beaa1fe79d514346bf5fe2cb5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 28 10:42:52 2009 -0700
++
++    scm: improve serialization of destroy and state changes
++    
++    WinOF testing with slightly different scheduler and verbs
++    showed some issues with cleanup. Add better protection around
++    destroy and move state change before socket send to insure
++    correct state in multi-thread environment targeting the same
++    device on send and recv.
++    
++    Change DCM_RTU_PENDING to DCM_REP_PENDING and
++    and add static definition to local routines for better
++    readability.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 29358ccc587db55fe5f5a1b14eed9e0e31f5f02c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Sep 17 08:56:06 2009 -0700
++
++    common: no cleanup/release code for timer thread
++    
++    dapl_set_timer() creates a thread to process timers for dat_ep_connect
++    but provides no mechanism to destroy/exit during dapl library unload.
++    Timers are initialized in library init code and should be released
++    in the fini code. Add a dapl_timer_release call to the dapl_fini
++    function to check state of timer thread and destroy before exiting.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e287ce12f5b0108ef83186aae305f25af8cdd02c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Sep 17 08:53:29 2009 -0700
++
++    scm, cma: dapli_thread doesn't always get teminated on library close.
++    
++    DAPL doesn't actually wait for the async processing thread to exit before
++    allowing the library to close.  It will wait up to 10 seconds, which under
++    heavy load isn't enough time.  Since the thread is created by an application
++    level thread, it will continue to run as long as the application runs.  But
++    if the application closes the library, then all library data and code is
++    invalid, which can result in the thread running something that's not
++    library code and accessing freed memory.
++    
++    With this change, I was able to run mpi ping-pong, 16 ranks on a single
++    system (scm provider) without crashes 1300 times.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 5bffe521c6ad7a5ce10457a5d7b25814522a0cde
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 9 13:10:35 2009 -0700
++
++    ucm: tighten up locking with CM processing, state changes
++    
++    tighten up locking on CM processing and state changes
++    and reduce the send completion threshold to 50 from 100
++    to replenish the request message faster.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e38daa8448bc3b73c53e54ffc9ac47b9cfc2af89
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 9 09:44:03 2009 -0700
++
++    ucm: For UD type QP's, return CR p_data with CONN_EST event on passive side.
++    
++    Intel MPI uses the p_data provided with CONN_EST as a reference to the
++    UD pair and remote rank. The ucm provider was overwriting the CR p_data
++    with the ACCEPT p_data. Change to save CR p_data but also provide
++    storage for user provided ACCEPT p_data in case the REPLY is lost
++    and needs retransmitted.
++    
++    p_data size was provided to event processing in network order
++    instead of host order.
++    
++    For new QP's create new address handles and do not use
++    existing AH's created for the CM. Different PD's are
++    associated with each.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 0bc6a0954bc1a1a61e1b1cbc5c280f69ed168453
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 8 09:14:46 2009 -0700
++
++    ucm: cleanup extra cr/lf
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 6e7df65a884b4e068135e64dcb3ec660f4c7ab14
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 8 09:11:37 2009 -0700
++
++    ucm: fix issues with UD QP's.
++    
++    private data size not in host order when processing
++    connection events.
++    
++    ud extentions event should include original ia_addr
++    and qpn used during connection and not the IB qpn.
++    
++    ucm QP service resource cleanup in wrong order.
++    
++    cleanup extra cr/lf device.c
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e7c3090945c13f80abb929643fc975465afeeb53
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Sep 3 10:45:56 2009 -0700
++
++    winof: Convert windows version of dapl and dat libaries to use private heaps.
++    
++    This allows for better support of memory registration caching by upper
++    level libaries (MPI) that use SecureMemoryCacheCallback.
++    
++    It also makes it easier to debug heap corruption issues.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit bc3c8a34558880c8d09a03e3eb7c3f50d7762c67
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 2 14:01:51 2009 -0700
++
++    dtest, dtestx: modifications for UD QP testing with ucm provider.
++    
++    remote_addr is wrong for IP remote address.
++    
++    The dtestx requires the server connect back to the client
++    for the UD test. With the ucm provider you need to provide
++    the QPN and the LID which you cannot get until the dtest
++    client starts. So, for now, don't support UD testing
++    on UCM providers.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e4555143ca71ebe18d8c9f027e2e7a5282088a30
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 2 13:54:59 2009 -0700
++
++    scm, ucm: UD QP support was broken when porting to common openib code base.
++    
++    create remote_ah was moved out of modify_qp_state function but not
++    included in the RTU and ACCEPT code for UD QP's. qp type check
++    should be on daddr not saddr in ucm cm code.
++    
++    QP number must be converted to host order before supplying remote_ah,
++    and qp number to consumer.
++    
++    Modify QP state to RTR for UD QP mask setting incorrect.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 375d368494bb2f9bb44c82073abc60e01ac28615
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 1 13:02:24 2009 -0700
++
++    cma: cleanup warning with unused local variable, ret, in disconnect
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 72d1c0c984919809ecd94b2e4ede31ec56668518
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 1 12:36:31 2009 -0700
++
++    cma: remove debug message after rdma_disconnect failure
++    
++    DAPL automatically calls rdma_disconnect() when a disconnect request is
++    received.  If the user also calls disconnect, that calls rdma_disconnect() as
++    well, but the connection has already been disconnected by DAPL and is no longer
++    valid.  The result is that the user's call to rdma_disconnect() will fail.  Do
++    not display an error message if this occurs.
++    
++    Locking could be added to prevent calling rdma_disconnect() multiple times, but
++    since the librdmacm provides synchronization to trap this, we might as well take
++    advantage of it.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 290c568030da6df398a4afb932b5d4f9bd585c26
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 1 12:27:43 2009 -0700
++
++    scm: socket errno check needs O/S dependent wrapper
++    
++    Intel MPI checks the uDAPL error code when calling dat_psp_create() to see if
++    the port number that it provides is in use or not.  Convert winsock error codes
++    to unix errno values.
++    
++    This fixes the following error reported by Intel MPI:
++    'DAPL provider is not found and fallback device is not enabled'
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 03b6d1b58ae03058a509c54ffe27147cc44d1851
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 1 12:13:16 2009 -0700
++
++    dapltest: update script files for WinOF
++    
++    Cleanup 64-bit paths now that WinOF is always installed into '\Program Files\WinOF'.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e38585be89e9fa8f139002a3fe1a82eb86438f93
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Sep 1 12:10:21 2009 -0700
++
++    cma: conditional check for new rdma_cm definition.
++    
++    RDMA_CM_EVENT_TIMEWAIT_EXIT is new to OFED 1.4
++    add conditional check so dapl can build and run
++    against older OFED 1.3 stacks
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 83af586b77aa905b63de6dd6010cd60e91487a9e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Aug 20 09:13:43 2009 -0700
++
++    Release 2.0.22
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 48bc0dc95093ccbfe5e01cef4877c128e2caaf77
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Aug 20 09:12:47 2009 -0700
++
++    dapltest: add mdep processor yield and use with dapltest
++    
++    Be thread scheduler friendly and release the current thread thus allowing other threads to run.
++    
++    Signed off by Stan Smith stan.smith@intel.com
++
++commit e13f255a06b9d2a2ed4eec9a62f9fe105d0c26d7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Aug 18 10:15:15 2009 -0700
++
++    ucm: Add new provider using a DAPL based IB-UD cm mechanism for MPI implementations.
++    
++    New provider uses it's own CM protocol on top of IB-UD queue pairs.
++    During device open, this provider creates a UD queue pair and
++    returns local address information via dat_ia_query. This 24 byte
++    opaque address must be exchange out-of-band before connecting to a
++    server via dat_ep_connect. This provider is targeted for MPI
++    implementations that already exchange address information
++    during mpi_init phase.
++    
++    Future release may provide some ARP mechanism via multicast.
++    
++    dtest, dtestx, and dtestcm was modified to report the lid and qpn
++    information on the server side so you can provide appropriate
++    destination address information for the client test suite.
++    
++    dapltest will not work with this provider.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 38d224dd95896c7e60f0bc0ffa52b26ab78f489b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Aug 4 20:54:12 2009 -0700
++
++    Release 2.0.21
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit ed4999a26043c9c3c73c792b21d24ced1df1553c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Aug 4 20:49:09 2009 -0700
++
++    scm: Fix disconnect. QP's need to move to ERROR state in
++    order to flush work requests and notify consumer. Moving to
++    RESET removed all requests but did not notify consumer.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 512f1d7a480f06a1fa491d21870e560ad111c4d0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Aug 4 20:48:03 2009 -0700
++
++    modify dtest.c to cleanup CNO wait code and consolidate into
++    collect_event() call. After waking up from CNO wait the
++    consumer must check all EVD's. The EVD's under the CNO
++    could be dropped if already triggered or could come in any order.
++    DT_RetToString changed to DT_RetToStr and DT_EventToSTr
++    changed to DT_EventToStr for consistency.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 024e36975d37a1556bf68145e1573f637d269bfc
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Aug 4 20:47:17 2009 -0700
++
++    CNO events, once triggered will not be returned during the cno wait.
++    Check for triggered state before going to sleep in cno_wait. Reset
++    triggered EVD reference after reporting.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 6d6c72a49158d10825929111d6b4df1c6d2bb589
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sun Aug 2 14:21:09 2009 -0700
++
++    CNO support broken in both CMA and SCM providers.
++    
++    CQ thread/callback mechanism was removed by mistake. Still
++    need indirect DTO callbacks when CNO is attached to EVD's.
++    
++    Add CQ event channel to cma provider's thread and add
++    to select for rdma_cm and async channels.
++    
++    For scm provider there is not easy way to add this channel
++    to the select across sockets on windows. So, for portablity
++    reasons 2 thread is started to process the ASYNC and
++    CQ channels for events.
++    
++    Must disable EVD (evd_endabled=FALSE) during destroy
++    to prevent EVD events firing for CNOs and re-arming CQ while
++    CQ is being destroyed.
++    
++    Change dtest to check EVD after CNO timesout.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 6fe8bd1d8f44777211e816b72e0b2a6d22900207
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 30 08:02:30 2009 -0700
++
++    common osd: include winsock2.h for IPv6 definitions.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit bd26383900d18962aeeff54fa59922009091ecfc
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jul 29 08:02:15 2009 -0700
++
++    common osd: include w2tcpip.h for sockaddr_in6 definitions.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f25544f14554200a6714accef5f761b0269b5819
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Mon Jul 27 15:07:33 2009 -0700
++
++    DAPL introduced the concept of directly waiting on the CQ for
++    events by adding a compile time flag and special handling in the common
++    code.  Rather than using the compile time flag and modifying the
++    common code, let the provider implement the best way to wait for
++    CQ events.
++    
++    This simplifies the code and allows the common openib providers to
++    optimize for Linux and Windows platforms independently, rather than
++    assuming a specific implementation for signaling events.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 1548405a377d2bd17938df69419e9bcf3364d91a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 16 12:41:22 2009 -0700
++
++    dapltest: Implement a malloc() threshold for the completion reaping.
++    
++    change byte vector allocation to stack in functions:
++      DT_handle_send_op, DT_handle_rdma_op & DT_handle_recv_op.
++    
++    When allocation size is under the threshold, use a stack local
++    allocation instead of malloc/free.  Move redundant bzero() to
++    be called only in the case of using local stack allocation as
++    DT_Mdep_malloc() already does a bzero(). Consolidate error handling
++    return and free()check to a single point by using goto.
++    
++    Signed-off-by: Stan Smith <stan.smith@intel.com>
++
++commit f6311ca7295230bf9efbcddc639fa8e1065b1f3d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 16 12:32:09 2009 -0700
++
++    scm: handle connected state when freeing CM objects
++    
++    The QP could be freed before being disconnected
++    so the provider needs process disconnect before freeing
++    the CM object. The disconnect clean will finish
++    the destroy process during the disc callback.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 4387359106ce398b29847982883016f7fd48b372
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jul 8 12:49:43 2009 -0700
++
++    scm, dtest: changes for winof gettimeofday and FD_SETSIZE settings.
++    
++    scm changes to set FD_SETSIZE with expected value and
++    prevent windows override.
++    
++    dtest: remove gettimeofday implementation for windows
++    specific implemenation etc\user\gtod.c
++    
++    general EOL cleanup
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 3542a83d8a31f5ac68adf3aa44e3ebf1265068df
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jul 6 09:24:07 2009 -0700
++
++    scm: set TCP_NODELAY sockopt on the server side for sends.
++    
++    scm provider sends small messages from both server and client
++    sides. Set NODELAY on both sides to avoid send delays either
++    way.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9d591180392856935b9c3befbab2243dd8daf628
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 2 14:16:52 2009 -0700
++
++    windows: remove obsolete files in dapl/udapl source tree
++    
++    SOURCES,makefile,udapl.r,udapl_exports.src,udapl_sources.c
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 85c238ee0a41dd0a4a24b3d422f34674b0183161
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 2 14:11:20 2009 -0700
++
++    dtestcm: add UD type QP option to test
++    
++    Add -u for UD type QP's during connection setup.
++    Will setup UD QPs and provide remote AH
++    in connect establishment event. Measures
++    setup/exchange rates.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 89a2211526e37b1db58fc0ea663b330bc19125c8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 2 14:07:36 2009 -0700
++
++    scm: destroy QP called before disconnect
++    
++    Handle the case where QP is destroyed before
++    disconnect processing. Windows supports
++    reinit_qp during a disconnect call by
++    destroying the QP and recreating the
++    QO instead of state change from reset
++    to init. Call disconnect in destroy
++    CM code to handle this unexpected state.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 6eb35b7d69a896c256b1031337d3353575cd07b4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jul 2 14:03:12 2009 -0700
++
++    cma: add support for rdma_cm TIME_WAIT event.
++    
++    Nothing to process, simply ack the event.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b6c56b3052ecd3e36c32092ee62ff0c724da5ad4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jul 1 07:58:32 2009 -0700
++
++    scm: remove old udapl_scm code replaced by openib_scm.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 5bbae42a56e1cca678d590ac4c841dd61e839d74
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jul 1 07:53:18 2009 -0700
++
++    winof: fix build issues after consolidating cma, scm code base.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 6bd1d931c4d0d4cbafac383f225140120aee4c51
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jul 1 07:51:59 2009 -0700
++
++    cma: lock held when exiting as a result of a rdma_create_event_channel failure.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b8a14ff1cc257defa2f74373d143600f5f471823
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Mon Jun 29 12:34:54 2009 -0700
++
++    windows: all dlist functions have been moved to the header file.
++    remove references to dlist.c
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 1a081a0a467e4773a641e8edc876a7a4d7a30ca8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 29 12:13:48 2009 -0700
++
++    dtestcm windows: add build infrastructure for new dtestcm test suite
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit c37d7a25dca97011ea76e2a541f936d10ca658e0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 29 08:57:46 2009 -0700
++
++    openib_common: reorganize provider code base to share common mem, cq, qp, dto functions
++    
++    add new openib_common directory with cq, qp, util, dto, mem function calls
++    and definitions. This basically leaves the unique CM and Device definitions
++    and functions to the individual providers directory of openib_scm and openib_cma.
++    
++    modifications to dapl_cr_accept required. ep->cm_handle is allocated
++    and managed entirely in provider so dapl common code should not update
++    ep_handle->cm_handle from the cr->cm_handle automatically. The provider
++    should determine which cm_handle is required for the accept.
++    
++    openib_cma defines _OPENIB_CMA_ and openib_scm defines _OPENIB_SCM_ for provider
++    specific build needs in common code.
++
++commit 961a4083ffb646c070137abd33e9ba2ea9482685
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 26 14:45:34 2009 -0700
++
++    scm: fixes and optimizations for connection scaling
++    
++    Prioritize accepts on listen ports via FD_READ
++    process the accepts ahead of other work to avoid
++    socket half_connection (SYN_RECV) stalls.
++    
++    Fix dapl_poll to return DAPL_FD_ERROR on
++    all event error types.
++    
++    Add new state for socket released, but CR
++    not yet destroyed. This enables scm to release
++    the socket resources immediately after exchanging
++    all QP information. Also, add state to str call.
++    
++    Only add the CR reference to the EP if it is
++    RC type. UD has multiple CR's per EP so when
++    a UD EP disconnect_clean was called, from a
++    timeout, it destroyed the wrong CR.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit a60a9e1fce5588cb23f41391b48acf04edd82499
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 26 14:31:19 2009 -0700
++
++    scm: double the default fd_set_size
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 17d5e1692db4ae1eb09aa919d5607f22851d7ec5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 26 14:28:30 2009 -0700
++
++    scm: EP reference in CR should be cleared during ep_destroy
++    
++    The EP reference in the CR should be set to null
++    during the EP free call to insure no further
++    reference back to a mem freed EP.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit ebb820364cec9d72285c005a0874e7d459a9ff7d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 26 14:23:35 2009 -0700
++
++    dtestx: fix conn establishment event checking
++    
++    not catching error cases on client side
++    when checking for event number and UD type
++    && should have been ||
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 747b793898042e3011fbad4b2d1285d2c040cb13
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 26 14:18:37 2009 -0700
++
++    dtestcm: new test to measure dapl connection rates.
++    
++    new test suite added to measure connection
++    rates of providers. Used to compare cma, scm,
++    and other providers under development.
++    
++    dtestcm USAGE
++    
++    s: server
++    c: connections (default = 1000)
++    b: burst rate of conn_reqs (default = 100)
++    m: multi-listens (set to burst setting )
++    v: verbose
++    w: wait on event (default, polling)
++    d: delay before accept
++    h: hostname/address of server, specified on client
++    P: provider name (default = OpenIB-v2-ib0)
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit d58fbc3a870a060ead882e1d15c6d245cdf39096
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 19 20:59:16 2009 -0700
++
++    Release 2.0.20
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit beebe0066b47d7bf476925ff280bad2a3db38324
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 19 20:52:51 2009 -0700
++
++    common,scm: add debug capabilities to print in-process CM lists
++    
++    Add a new debug bit DAPL_DBG_TYPE_CM_LIST.
++    If set, the pending CM requests will be
++    dumped when dat_print_counters is called.
++    Only provided when built with -DDAPL_COUNTERS
++    
++    Add new dapl_cm_state_str() call for state
++    to string conversion for debug prints.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b1c51f1e68993d9306e3ebd48bd3a1f0e9878fa3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jun 16 09:22:31 2009 -0700
++
++    scm: disconnect EP before cleaning up orphaned CR's during dat_ep_free
++    
++    There is the possibility of dat_ep_free being called
++    with RC CR's still in connected state. Call disconnect
++    on the CR before marking for destroy.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 531d223455a88c885d6c5f7b1d7e158c1079fbce
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 10 12:05:17 2009 -0700
++
++    dapltest: windows scripts updated
++    
++    Support added for provider specification and general simplification of internal workings.
++    
++    Signed-off-by: Stan Smith <stan.smith@intel.com>
++
++commit 049d1ea08643d4c4eff761741641d37bb3f01fc1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 10 09:18:09 2009 -0700
++
++    scm: private data is not handled properly via CR rejects.
++    
++    For both RC and UD connect requests, the private
++    data is not being received on socket and passed
++    back via the active side REJECT event.
++    
++    UD requires new extended reject event type of
++    DAT_IB_UD_CONNECTION_REJECT_EVENT to distiquish
++    between RC and UD type rejects.
++    
++    cr_thread exit/cleanup processing fixed to insure
++    all items are off the list before exiting.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 3c26870e276a934e2009090e0fca8bdc36c1be67
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 10 09:09:56 2009 -0700
++
++    scm: cleanup orphaned UD CR's when destroying the EP
++    
++    UD CR objects are kept active because of direct private data references
++    from CONN events. The cr->socket is closed and marked inactive but the
++    object remains allocated and queued on the CR resource list. There can
++    be multiple CR's associated with a given EP and there is no way to
++    determine when consumer is finished with event until the dat_ep_free.
++    Schedule destruction for all CR's associated with this EP during
++    free call. cr_thread will complete cleanup with state of SCM_DESTROY.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 73abd3f58fa7b14241fad98912ef27c7b4fdb47e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 10 09:05:32 2009 -0700
++
++    scm: provider specific query for default UD MTU is wrong.
++    
++    Change the provider specific query DAT_IB_TRANSPORT_MTU
++    to report 2048 for new default MTU size.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 27c0d7edc4c931b808a7c5a24bd5aa2625b48aa1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 10 10:06:59 2009 -0700
++
++    scm: update CM code to shutdown before closing socket
++    
++    data could be lost without calling shutdown on the socket
++    before closing. Update to shutdown and then close. Add
++    definition for SHUT_RW to SD_BOTH for windows.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++    ---
++
++commit 536ec3103c15c1fed4367326c9117660345e0eab
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jun 4 13:48:18 2009 -0700
++
++    dapltest: windows script dt-cli.bat updated
++    
++    scn should be scm
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e8991b8f0877b0e2e857717e1140c679e9266abe
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Jun 4 08:19:12 2009 -0700
++
++    dapl/windows cma provider: add support for network devices based on index
++    
++    The linux cma provider provides support for named network devices, such
++    as 'ib0' or 'eth0'.  This allows the same dapl configuration file to
++    be used easily across a cluster.
++    
++    To allow similar support on Windows, allow users to specify the device
++    name 'rdma_devN' in the dapl.conf file.  The given index, N, is map to a
++    corresponding IP address that is associated with an RDMA device.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 79fa3e7d241f740bc886dd075f24fcbc611306de
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jun 4 08:00:29 2009 -0700
++
++    openib: remove 1st gen provider, replaced with openib_cma and openib_scm
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 624039247cdc0db7aa040dfbb4dced00f2cf9006
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 29 08:21:10 2009 -0700
++
++    dapltest: update windows script files
++    
++    Enhancement to take DAPL provider name as cmd-line arguement.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit b93baa07b7bbaeb7a55fa817c354d0c94783d61f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu May 28 15:30:05 2009 -0700
++
++    dapltest: update windows batch files in sripts directory
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 2f185c6b5e464c4fc9e84ad3e90cc2b86aebf9aa
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 18 14:00:02 2009 -0700
++
++    windows_osd/linux_osd: new dapl_os_gettid macro to return thread id
++    
++    Change dapl_os_getpid inline to macro on windows and add dapl_os_gettid
++    macros on linux and windows to return thread id.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 984303824cd0c3e248a789066cf665ced8e1ae5b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 18 13:53:59 2009 -0700
++
++    windows: missing build files for common and udapl sub-directories
++    
++    Add dapl/dapl_common_src.c and dapl/dapl_udapl_src.c
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 3be4ccf9681a975e74a5aa05e3f7912477f342a7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 18 09:06:19 2009 -0700
++
++    windows: add build files for openib_scm, remove /Wp64 build option.
++    
++    Add build files for windows socket cm and change build
++    option on windows providers. The new Win7 WDK issues a
++    depreciated compiler option warning for /Wp64
++    (Enable 64-bit porting warnings)
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 163112cfeb6e409886b3cb7f85da7ce003300d5c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 18 08:50:35 2009 -0700
++
++    scm: multi-hca CM processing broken. Need cr thread wakeup mechanism per HCA.
++    
++    Currently there is only one pipe across all
++    device opens. This results in some posted CR work
++    getting delayed or not processed at all. Provide
++    pipe for each device open and cr thread created
++    and manage on a per device level.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit e6e799f623df6ef136ffc5388251d3f3a38c8a91
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 15 11:06:19 2009 -0700
++
++    dtest: add connection timers on client side
++    
++    Add timers for active connections and print
++    results. Allow polling or wait on conn event.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit d656bbf619123deaed6e8985e52207e5415f359f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 15 09:48:38 2009 -0700
++
++    linux_osd: use pthread_self instead of getpid for debug messages
++    
++    getpid provides process ids which are not unique. Use unique thread
++    id's in debug messages to help isolate issues across many device
++    opens with multiple CM threads.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 92bb0d2933d3d1546e18f0479475f3daf5b92052
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 1 10:18:05 2009 -0700
++
++    windows ibal-scm: dapl/dirs file needs updated to remove ibal-scm
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 9c37d9d667fb7e8f21841bbec4a84b2c652fffe1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 29 23:13:36 2009 -0700
++
++    Release 2.0.19
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 29 14:33:28 2009 -0700
++
++    scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit
++    
++    mismatch of device attribute size restricts max_lmr_block_size to 32 bit
++    value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes.
++    
++    Consumers should use max_lmr_virtual_address for actual max
++    registration block size until attribute interface changes.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit f91f27eaaab28b13a631adf75b933b7be3afbc0f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 29 10:51:03 2009 -0700
++
++    scm: increase default MTU size from 1024 to 2048
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit 8d6846056f4c86b6a06346147df55d37c4ba9933
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 29 10:49:09 2009 -0700
++
++    openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge
++    
++    no need to rebuild scatter gather list given that DAT v2.0
++    is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 29 08:39:37 2009 -0700
++
++    dtest: add flush EVD call after data transfer errors
++    
++    Flush and print entries on async, request, and receive
++    queues after any data transfer error. Will help
++    identify failing operation during operations
++    without completion events requested.
++    Fix -B0 so burst size of 0 works.
++    
++    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
++
++commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 22 13:16:19 2009 -0700
++
++    dtest/dapltest: Cleanup code with Lindent
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 21 15:51:24 2009 -0700
++
++    ibal-scm: remove, obsolete
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 67ddd6bfba46f1f7a61b772257132f1257d05c96
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 21 15:44:15 2009 -0700
++
++    scm, cma provider: Cleanup code with Lindent
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d0898091090ff19be7929fed0d14f1ca696d5e53
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 21 15:39:01 2009 -0700
++
++    udapl: Cleanup code with Lindent
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 21 15:31:20 2009 -0700
++
++    dapl common: Cleanup code with Lindent
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 21 12:52:29 2009 -0700
++
++    dat: Cleanup code with Lindent
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 20 12:28:08 2009 -0700
++
++    Release 2.0.18
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Apr 16 14:35:18 2009 -0700
++
++    dapltest: reset server listen ports to avoid collisions during long runs
++    
++    If server is running continuously the port number increments
++    from base without reseting between tests. This will
++    eventually cause collisions in port space.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit c27af8de0501d132b8152ec8546023cdba212de5
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Apr 16 10:21:51 2009 -0700
++
++    To avoid duplicating port numbers between different tests, the next port
++    number to use must increment based on the number of endpoints per thread *
++    the number of threads.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 3084310197c20aaa50abe82260fc835786f591f5
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Apr 16 10:21:45 2009 -0700
++
++    dapltest assumes that events across multiple endpoints occur in a specific
++    order.  Since this is a false assumption, avoid this by directing events to
++    per endpoint EVDs, rather than using shared EVDs.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Apr 16 10:21:41 2009 -0700
++
++    Synchronization is missing between removing items from an EVD and queuing
++    them.  Since the removal thread is the user's, but the queuing thread is
++    not, the synchronization must be provided by DAPL.  Hold the evd lock
++    around any calls to dapls_rbuf_*.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit f5e86d28f803162ffdf94b41ec7435dec92f728d
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Apr 16 10:21:26 2009 -0700
++
++    Communication to the CR thread is done using an internal socket.  When a
++    new connection request is ready for processing, an object is placed on
++    the CR list, and data is written to the internal socket.  The write causes
++    the CR thread to wake-up and process anything on its cr list.
++    
++    If multiple objects are placed on the CR list around the same time, then
++    the CR thread will read in a single character, but process the entire list.
++    This results in additional data being left on the internal socket.  When
++    the CR does a select(), it will find more data to read, read the data, but
++    not have any real work to do.  The result is that the thread spins in a
++    loop checking for changes when none have occurred until all data on the
++    internal socket has been read.
++    
++    Avoid this overhead by reading all data off the internal socket before
++    processing the CR list.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Apr 16 10:21:13 2009 -0700
++
++    The dapl connect call takes as input an address (sockaddr) and a port number
++    as separate input parameters.  It modifies the sockaddr address to set the
++    port number before trying to connect.  This leads to a situation in
++    dapltest with multiple threads that reference the same buffer for their
++    address, but specify different port numbers, where the different threads
++    end up trying to connect to the same remote port.
++    
++    To solve this, do not modify the caller's address buffer and instead use
++    a local buffer.  This fixes an issue seen running multithreaded tests with
++    dapltest.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 7947026ede478f08b4a7b8cb607f457765bf2afa
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Apr 16 10:21:03 2009 -0700
++
++    Windows socket calls should check return values against SOCKET_ERROR to
++    determine if an error occurred.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 10 08:33:41 2009 -0700
++
++    Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST
++    
++    Fix rpmbuild problem with new cma osd include file.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit acb213adb3268e9bf6999e2bf040d4a71212b701
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 10 08:32:24 2009 -0700
++
++    dapl scm: reduce wait time for thread startup.
++    
++    thread startup wait reduce to 2ms to reduce open times.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 55459699fa9c0e5fb7e2b17822f0916412c64b35
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 10 08:31:22 2009 -0700
++
++    dapl-scm: getsockopt optlen needs initialized to size of optval
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d710c5327e05a40796341d16b45a2b098b03f588
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:17:32 2009 -0700
++
++    The connection request thread adds sockets to a select list unless
++    the cr->socket is invalid and the cr request state is set to destroy.  If the
++    cr->socket is invalid, but the cr->state is not destroy, then the cr->socket
++    is added to an FD set for select/poll.  This results in select/poll
++    returning an error when select is called.  As a result, the cr thread never
++    actually blocks during this state.
++    
++    Fix this by only destroying a cr based on its state being set to destroy
++    and skip adding cr->sockets to the FD set when they are invalid.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:08:16 2009 -0700
++
++    Make sure all locks are initialized properly and don't zero their memory
++    once they are.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:08:13 2009 -0700
++
++    The lock functions are defined just a few lines beneath the prototypes
++    as inline.  Remove the duplicate prototypes.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 9578c4aeb9878d98374e4b7abc02db182aef82c6
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:08:07 2009 -0700
++
++    Make sure all locks are initialized and don't zero out their memory once
++    they are.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 97edcbb662b489303ef68c0da02831efaddeed91
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:08:03 2009 -0700
++
++    The IBAL library allocates a small number of threads for callbacks to the
++    user.  If the user blocks all of the callback threads, no additional
++    callbacks can be invoked.  The DAPL IBAL provider cancels listen requests
++    from within an IBAL callback, then waits for a second callback to confirm
++    that the listen has been canceled.  If there is a single IBAL callback
++    thread, or multiple listens are canceled simultaneously, then the provider
++    can deadlock waiting for a cancel callback that never occurs.
++    
++    This problem is seen when running dapltest with multiple threads.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:57 2009 -0700
++
++    We need to check the return value from select for errors before checking
++    the FD sets.  An item may be in an FD set but select could have returned
++    an error.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit a8a977becaeefe0d7f8e01e01631a11988d2d54e
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:53 2009 -0700
++
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:49 2009 -0700
++
++    Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ
++    completion channels in the Windows version of the openib_scm provider.
++    Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages
++    instead of DAPL_DBG_TYPE_CM.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 73728763666a46df5789af93b50db53cdf64afd6
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:44 2009 -0700
++
++    The IBAL-SCM provider will run into an inifinite loop if the check for
++    cr->socket > SCM_MAX_CONN - 1 fails.  The code continues back to the start
++    of the while loop without moving to the next connection request entry
++    in the list.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 9b1b396539926d36ffacfff04fbe7c081e436b45
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:40 2009 -0700
++
++    next_cr is set just before and inside the check
++    if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY)
++    Remove setting it inside the if statement.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:35 2009 -0700
++
++    Some errors on windows are more easily interpretted in hex than decimal.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 08ee072a1396ac2c28983878dbc6b02feb035787
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:32 2009 -0700
++
++    The WinOF HCA driver cannot handle transitioning from RTS -> RESET ->
++    INIT -> ERROR.  Simply delete the QP and re-create it to reinitialize
++    the endpoint until the bug is fixed.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:23 2009 -0700
++
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit a8582be0e1fc89e856f1d0b43a3c1b271295a352
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:07:18 2009 -0700
++
++    Convert the openib_cma provider to common code between linux and windows.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Apr 10 08:06:53 2009 -0700
++
++    Move from using pipes to sockets for internal communication.  This
++    avoids issues with windows only supporting select() on sockets.
++    
++    Remove windows specific definition of dapl_dbg_log.
++    
++    Update to latest windows libibverbs implementation using completion
++    channel abstraction to improve windows scalability and simplify
++    porting where FD's are accessed directly in Linux.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit b3ad2ed97399a24a869841e17d1314e11c379aae
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 31 05:41:50 2009 -0800
++
++    Release 2.0.17
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 5d732929f8a90a490994e8e35a3666c3647ad4fe
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 31 05:22:11 2009 -0800
++
++    dapl: ia64 build problem on SuSE 11, atomic.h no longer exists.
++    
++    Add autotools check for SuSE 11 and include intrinsics.h
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 16 13:23:50 2009 -0800
++
++    Release 2.0.16
++    
++    Fix changelog year in spec file.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 16 13:15:22 2009 -0800
++
++    Release 2.0.16
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Mar 13 12:39:12 2009 -0800
++
++    uDAPL: scm provider, remove query gid/lid from connection setup phase
++    
++    move lid/gid queries from the connection setup phase
++    and put them in the open call to avoid overhead
++    of more fd's during connections. No need
++    to query during connection setup since uDAPL
++    binds to specific hca/ports via dat_ia_open.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 775394b73980a7bc0af018a33d2a5bb795469c78
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Mar 12 12:44:43 2009 -0800
++
++    Build: missing new linux/osd include file in EXTRA_DIST
++    
++    Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Mar 12 12:11:21 2009 -0800
++
++    Build: spec files missing Requires(post) statements for sed/coreutils
++    
++    needed for anaconda install
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Mar 4 10:04:13 2009 -0800
++
++    dapl scm: remove unecessary thread when using direct objects
++    
++    A thread is created for processing events on devices without
++    direct event objecti support. Since all openfabrics devices support
++    direct events there is no need to start a thread. Move this under
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 3 11:08:12 2009 -0800
++
++    dtestx: add missing F64u definition for windows
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d9e771da16ec2b360a222ceccbbca5d088e20ee5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 3 09:25:26 2009 -0800
++
++    uDAPL common: add 64 bit counters for IA, EP, and EVD's.
++    
++     -DDAPL_COUNTERS to build-in counters for cma and scm providers.
++     New extension calls in dat_ib_extensions.h for counters
++      dat_print_counters, dat_query_counters
++     Counters for operations, async errors, and data
++     Update dtestx (-p) with print and query counter examples
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Tue Feb 17 07:24:27 2009 -0800
++
++    Modify the openib_scm provider to support both OFED and WinOF releases.
++    This takes advantage of having a libibverbs compatibility library.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e
++Author: Stan Smith <stan.smith@intel.com>
++Date:   Fri Jan 30 09:52:33 2009 -0800
++
++    Update the dapl.git tree with the latest SVN version of the
++    ibal-scm provider.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 83543b6cca342e25fd6408454f1261ec6835a172
++Author: Stan Smith <stan.smith@intel.com>
++Date:   Fri Jan 30 09:52:25 2009 -0800
++
++    Merge SVN IBAL provider code back into the main git tree.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Jan 30 09:52:11 2009 -0800
++
++    Changes to dtest to support building on Windows.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 9f87610c4b37e4db4d74205c14028582a2f6a79e
++Author: Stan Smith <stan.smith@intel.com>
++Date:   Fri Jan 30 09:48:26 2009 -0800
++
++    Add return codes to various functions.
++    Add script (batch file) for Windows testing.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 723067550265defdcfe6e00460a4f89f7a81fbf1
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Jan 30 09:46:40 2009 -0800
++
++    Merge OFED and WinOF trees for common dapl code.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jan 16 08:16:13 2009 -0800
++
++    dtest/dapltest: use $(top_builddir) for .la files during test builds
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Nov 26 07:12:30 2008 -0800
++
++    Release 2.0.15
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 5d5dec42717c963d1644ee3e716459dc5d58e930
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Oct 27 08:48:53 2008 -0800
++
++    dapltest: transaction test moves to cleanup stage before rdma_read processing is complete
++    
++    With multiple treads, the transaction server tread can move to cleanup
++    stage and unregister memory before the remote client process has
++    completed the rdma read. In lieu of a rewrite to add sync messages
++    at the end of transaction test phase, just add a delay before cleanup.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 14 11:56:35 2008 -0700
++
++    Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf.
++    Change SR to include sysconfdir. SR file access in the following order:
++    
++    - DAT_OVERRIDE
++    - sysconfdir
++    - /etc
++    
++    if DAT_OVERRIDE is set, assume administration override
++    and do not failover to other locations. Add debug
++    messages for each failure and retries.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Acked-by: Doug Ledford <dledford@redhat.com>
++
++commit c98d2169b839a73d76691acf510dd8976ddc850a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 3 08:00:56 2008 -0700
++
++    Release 2.0.14
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit c26d0bb065f3734f09058e1e6d26dde4a3738e55
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 3 05:40:04 2008 -0700
++
++    dat.conf: add ofa-v2-iwarp entry for iwarp devices
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d54c35c8a9ba33a464ca15f4a65b914688e5194d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Oct 3 05:30:10 2008 -0700
++
++    dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices
++    
++    iWarp spec allows only one iov on rdma reads
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 1 08:17:49 2008 -0700
++
++    dtest: reduce default IOV's during dat_ep_create for iWARP devices
++    
++    iWarp adapters tend to have less IOV resources then IB adapters.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Sep 26 12:43:13 2008 -0700
++
++    dtest: fix 32-bit build issues in dtest and dtestx examples.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 42a3a4edf30115a35d9d599b51f8756814e62368
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Sep 26 08:48:31 2008 -0700
++
++    Revert "Release 2.0.14"
++    
++    This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63.
++    
++    missed some fixes for package release.
++
++commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 24 12:13:37 2008 -0700
++
++    Release 2.0.14
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit c00d858da3113ce5463d408ab5e13e17cc9529e4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 24 08:33:32 2008 -0700
++
++    build: $(DESTDIR) prepend needed on install hooks for dat.conf
++    
++    All install directives that automake creates automatically
++    have $(DESTDIR) prepended to them so that a make
++    DESTDIR=<some_path> install will work. The hand written
++    install hooks for dat.conf was missing DESTDIR.
++    
++    Signed-off-by: Doug Ledford <dledford@redhat.com>
++
++commit 860db3be4907c8ff290ce7c6b631b2117f5080bd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Sep 24 08:26:28 2008 -0700
++
++    dapl scm: UD shares EP's which requires serialization
++    
++    add locking around the modify_qp state changes to avoid
++    unnecessary modify_qp calls during multiple resolve
++    remote AH connection events on a single EP.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sat Sep 20 16:02:00 2008 -0700
++
++    dtestx: Add new options to test UD.
++    
++    - many to one/many EP remote AH resolution, data flow
++    - bi-directional EP remote AH resolution, data flow
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sat Sep 20 15:58:59 2008 -0700
++
++    dapl: fixes for IB UD extensions in common code and socket cm provider.
++    
++     - Manage EP states base on attribute service type.
++     - Allow multiple connections (remote_ah resolution)
++       and accepts on UD type endpoints.
++     - Supply private data on CR conn establishment
++     - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sat Sep 20 15:49:40 2008 -0700
++
++    dapl: add provider specific attribute query option for IB UD MTU size
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 1 15:52:37 2008 -0700
++
++    Release 2.0.13
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit f37589927fabf0feb3a09c4c7c03e18df5749fef
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 1 12:24:49 2008 -0700
++
++    dapl build: add correct CFLAGS, set non-debug build by default for v2
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 1 12:22:19 2008 -0700
++
++    dapl providers: fix compiler warnings in cma and scm providers
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 1 12:20:08 2008 -0700
++
++    dat: fix compiler warnings in dat common code
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 1 12:18:48 2008 -0700
++
++    dapl: fix compiler warnings in common code
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 38a53ae75bce5059a84262fe1b40eacf92b22287
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Sep 1 12:16:58 2008 -0700
++
++    dtest/dapltest: fix compiler warnings
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 45900087764917b354411fdd2b3880473d553ab8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Aug 22 14:51:22 2008 -0700
++
++    dapl cma: debug message during query needs definition for inet_ntoa
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 99d46313a03af18771966cf86fcc934d179627b5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Aug 21 12:54:58 2008 -0700
++
++    Release 2.0.12
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Aug 20 18:51:00 2008 -0700
++
++    dapl scm: fix corner case that delivers duplicate disconnect events
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 96f6822b90fa880a6c6a64b1e183064a449f7237
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Aug 20 18:47:19 2008 -0700
++
++    dat: include stddef.h for NULL definition in dat_platform_specific.h
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Aug 20 18:27:08 2008 -0700
++
++    dapl: add debug messages during async and overflow events
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Aug 20 18:24:33 2008 -0700
++
++    dapltest: add check for duplicate disconnect events in transaction test
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 7e8986f2c6496851b724a007458881c3248ac998
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Aug 20 18:22:42 2008 -0700
++
++    dtestx: fix stack corruption problem with hostname strcpy
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Aug 14 09:42:57 2008 -0700
++
++    dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Aug 14 09:19:53 2008 -0700
++
++    dapl scm: change IB RC qp inline and timer defaults.
++    
++    rnr nak can be the result of any operation not just
++    message send recevier not ready. Timer is much too
++    large given this case.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 36088a92d87e833bae535fcea0c45417dec34e65
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Aug 14 09:12:38 2008 -0700
++
++    dapl scm: add mtu adjustments via environment, default = 1024.
++    
++    DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting
++    is min of 1024 and active mtu on IB device.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Aug 13 14:17:40 2008 -0700
++
++    dapl scm: change connect and accept to non-blocking to avoid blocking user thread.
++    
++    The connect socket that is used to exchange QP information is now non-blocking
++    and the data exchange is done via the cr thread. New state RTU_PENDING added.
++    On the passive side there is a new state ACCEPT_DATA used to avoid read blocking
++    on the user accept call.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jul 29 08:18:25 2008 -0700
++
++    dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sun Jul 20 13:20:45 2008 -0700
++
++    Release 2.0.11
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 0003bb7866af3ba73cc79c703b565a8012439bb1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sun Jul 20 13:17:22 2008 -0700
++
++    dtestx: add -d option to test new IB UD extension.
++    
++    modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sun Jul 20 13:13:09 2008 -0700
++
++    dapl scm: add support for UD extensions in Openfabrics socket cm provider
++    
++    add qp_type in connection information exchange
++    add new post_send_ud call
++    changes to connection manager to support qp types beyond RC.
++    changes to connection events to use new extended event calls.
++    exchange address handle information during connection phase.
++    changes to modify_qp to handle both RC and UD types.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 927dac5b61e64868089acd49d468b98327e14a1a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sun Jul 20 13:07:34 2008 -0700
++
++    dapl: add support for UD extensions in common code.
++    
++    allow EP create for extended service types.
++    extend connection event types to include UD AH resolution/exchange.
++    add new extended connect and connect request upcalls for providers.
++    - dapls_evd_post_cr_event_ext
++    - dapls_evd_post_connection_event_ext
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit be3d6a53f3340294697706ce50a05faf151aacc7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Sun Jul 20 12:57:49 2008 -0700
++
++    dat: New definitions for IB unreliable datagram extension
++    
++    Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD
++    Add IB extension call dat_ib_post_send_ud().
++    Add address handle definition for UD calls.
++    Add IB event definitions to provide remote AH via connect and connect requests
++    Roll IB extension version to 2.0.2
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jul 18 07:46:20 2008 -0700
++
++    dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 25 08:02:11 2008 -0700
++
++    dapltest: manpage - rdma write example incorrect
++    
++    parameter for rdma write should be RW and not WR
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 68638bde71b529a142c13ac332cd44435cabc896
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 23 15:26:30 2008 -0700
++
++    dapl: remove needless terminating 0 in dto_op_str functions.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 23 10:52:46 2008 -0700
++
++    Release 2.0.10
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit d9b3c06ae98ac4d3b264384f6510137166d78cb0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 23 10:35:17 2008 -0700
++
++    remove reference to doc/dat.conf in makefile.am
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit b052d402e09ac78281a25af2c8fe902fa71f5c6f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jun 19 13:34:49 2008 -0700
++
++    dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free.
++    
++    Problem surfaced while running Intel MPI 3.1 and mpich2-test suite.
++    dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint
++    and destroy_cq and destroy_pd code was ignoring verbs errors.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit e466d8e330c45176c5f00efda79ad745bf3f71a4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 18 14:21:28 2008 -0700
++
++    dapl scm: add stdout logging for uname and gethostbyname errors during open.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 18 14:19:51 2008 -0700
++
++    dapl scm: support global routing and set mtu based on active_mtu
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit fc65a08727c59c304dad20337a8bff803f2302c0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 18 13:59:44 2008 -0700
++
++    dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters.
++    
++    Bring socket cm provider back to life with some changes:
++    
++    better threading support for exchanging QP information.
++    Avoid blocking during connect to support dynamic connection
++    model with MPI implementations.
++    
++    consumer control of ack timeout/retries.
++    
++    disconnect/reject capabilities via socket exchange.
++    
++    version support for wire protocol to insure compatibility
++    with peer scm provider. Add gids to exchange.
++    
++    validated with Intel MPI on a 14,000+ core fabric using IB DDR.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 0855af175fec2f1bec8391ebae2a2cdff26a3359
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 11 10:43:24 2008 -0700
++
++    dapl: add opcode to string function to report opcode during failures.
++    
++    Need to use cookie opcode during failures in lieu of cqe opcode.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit ec6296e7f0a843c69231f8284ae780014fa26fbe
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 16 14:59:43 2008 -0700
++
++    dapl: remove unused iov buffer allocation on the endpoint
++    
++    provider's manage iov space on stack during posting.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 16 13:59:11 2008 -0700
++
++    dapl: endpoint pending request count is wrong
++    
++    The code assumes every cookie allocated during posting of
++    requests gets completed. This incorrect assumption results in
++    wrong pending count. Remove request_pending field and replace
++    with direct call, dapl_cb_pending, to provide accurate
++    data to consumer.
++    
++    Add debug print if consumer overruns request queue.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jun 2 12:40:45 2008 -0700
++
++    dapl extension: dapli_post_ext should always allocate cookie for requests.
++    
++    extension didn't allocate cookie if completion was suppressed which resulted
++    segfault during provider post call. Provider's expect cookie for wr_id,
++    even with surpressed completions, to handle events during errors.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue May 20 14:35:43 2008 -0700
++
++    Release 2.0.9
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue May 20 21:56:06 2008 -0700
++
++    dtest,dtestx,dapltest: fix build issues with Redhat EL5.1
++    
++    need include files/definitions for sleep, getpid, gettimeofday
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 8084ebf39729bac310447467b518df4248e9e2b6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue May 20 14:31:09 2008 -0700
++
++    dapl: Fix long delays with the cma provider open call when DNS is not configure on server.
++    
++    Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue May 20 14:30:05 2008 -0700
++
++    dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 30 14:48:21 2008 -0700
++
++    Release 2.0.8
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 30 13:51:41 2008 -0700
++
++    dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 30 13:25:53 2008 -0700
++
++    dat: udat_sr_parser ia_name will fail on comments, turn down debug message
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit b93b91d48186d100c48f1a479776d56476847607
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 29 16:15:44 2008 -0700
++
++    dat: cleanup error handling with static registry parsing of dat.conf
++    
++    change asserts to return codes, add log messages, and
++    report errors via open instead of asserts during dat
++    library load.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 28 10:14:20 2008 -0700
++
++    dapl: cma provider needs to support lower inline send default for iWARP
++    
++    IB and iWARP work best with different defaults. Add transport check
++    and set default accordingly. 64 for iWARP, 200 for IB.
++    
++    DAPL_MAX_INLINE environment variable is still used to override.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit be32d7d5beeeceac5dbb1974d3217265dc4d5461
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 28 09:44:12 2008 -0700
++
++    dtestx: need to include string.h for memset/strcpy declarations
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit a192465714e7607529303a80d8f9a312e0c7aec6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 28 08:41:05 2008 -0700
++
++    dapl: add vendor_err with DTO error logging
++    
++    DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 6ac657a4e7e5e27254a024fca7fdead569043f9a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 25 15:12:34 2008 -0700
++
++    dapl: add check before destroying cm event channel in release
++    
++    library may be loaded and unloaded without calling open
++    in which case the cm event channel is not created.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 22 12:55:13 2008 -0700
++
++    dapl: evd_alloc doesn't check for direct_object_create errors.
++    
++    Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc.
++    When attempting to create large number of evd's that exceed
++    open files limit the error was not propagated up causing
++    a segfault. Note: there are 3 FD's required for each EVD
++    2 for pipe, and one for cq event_channel.
++    
++    Change the error reporting to indicate correct return
++    code and send to log with non-debug builds.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 14 13:10:13 2008 -0700
++
++    dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement.
++    
++    Change the packaging to update only the OFA provider contents in dat.conf. This allows other
++    dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain
++    syntax of this static configuration file.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit d32b27d991bc1314eea055ce3f55bb585b11aaac
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 11 11:37:48 2008 -0700
++
++    dapl openib_cma: fix hca query to use correct max_rd_atom values
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Apr 9 17:26:06 2008 -0700
++
++    dat: add logging by default during library load failures.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 1794e94754a1e58fcf214c2802e950124bbd1316
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 8 17:32:03 2008 -0700
++
++    dtest: add private data validation with connect and accept.
++    
++    Include code, with build option, to validate private data with
++    consumer rejects.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 8 17:25:11 2008 -0700
++
++    dapl: add hooks in evd connection callback code to deliver private data with consumer reject.
++    
++    PEER rejects can include private data. The common code didn't support delivery
++    via the connect event data structure. Add the necessary hooks in
++    dapl_evd_connection_callback function and include checks in openib_cma
++    provider to check and delivery properly. Also, fix the private data size
++    check in dapls_ib_reject_connection function.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 7 15:47:57 2008 -0700
++
++    dapl: increase reject private data size to avoid odd byte offets.
++    
++    remove reject type checking on passive side since it will
++    always be non-consumer from active side.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 353a1c8a00bb2a1380fd7a372973a5a70828da35
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 4 16:04:11 2008 -0800
++
++    dapl: update vendor information for OFA v2 provider.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit dbf1ea37f43caec61911dea06af801c2f906db0a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Apr 4 16:03:03 2008 -0800
++
++    dapl: add provider vendor revision data in private data with reject
++    
++    Add 1 byte header containing provider/vendor major revision
++    to distinguish between consumer and non-consumer rejects.
++    Validate size of consumer reject privated data.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 0f71b9be594739a1fba7d74929eacd42a8cee392
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Apr 3 17:06:27 2008 -0800
++
++    dapl: add support for logging errors in non-debug build.
++    
++    Add debug logging (stdout, syslog) for error cases during
++    device open, cm, async, and dto operations. Default settings
++    are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST.
++    
++    Change default configuration to build non-debug.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit bea882ad9b11ac7188628a939f5227e22c914169
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Apr 3 16:23:29 2008 -0800
++
++    dapl: add support for private data in CR reject.
++    
++    Private data support via dat_cr_reject was added to
++    the v2 DAT specification but dapl was never extended
++    to support at the provider level.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 1 11:02:37 2008 -0800
++
++    dapl: calculate private data size based on transport type and cma_hdr overhead
++    
++    Need to adjust CM private date size based on different transport types.
++    Add hca_ptr to dapls_ib_private_data_size call for transport type
++    validation via verbs device. Add definitions to include iWARP size
++    of 512 and subtract 36 bytes for cma_hdr overhead.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Mar 26 17:58:17 2008 -0800
++
++    Remove improperly licensed GETOPT code from dtest source tree.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 88069fdd21f92923388dec7adbde0d1bc334e7c4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 18 15:04:34 2008 -0800
++
++    remove unnecessary assert from dapl_ep_free.
++    
++    dat_ep_free must handle the case where a consumer calls
++    free in CONNECTED or DISCONNECT_PENDING states. After
++    free calls disconnect, there may be a pending event,
++    in which case the providers dapls_ib_qp_free will block
++    accordingly and handle pending events.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit b3f020e5cba765077049a8cf61c4ce5009fa1031
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Fri Mar 14 14:31:40 2008 -0700
++
++    fix openib_scm compiler warning
++    
++    Cast to socklen_t since accept(2) expects an unsigned argument.
++    
++    Makes the openib_scm provider now build successfully when using
++    make VERBS=<provider> (the -Werror flag was causing the build
++    failure)
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 441996f05d3cc8b09c94c166ef736bc50c24de7e
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Fri Mar 14 14:31:34 2008 -0700
++
++    fix provider-specific compiler warnings
++    
++    Initialize ds_array_start_p otherwise the compiler would claim
++    that this variable could be used with an uninitialized value.
++    
++    Makes the uDAPL providers now build successfully when using make
++    VERBS=<provider> (the -Werror flag was causing the build failure)
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 11 09:25:07 2008 -0800
++
++    uDAPL: fix query to adjust max sge for default inline of 64 bytes
++           and include missing max_rdma_write_iov ep_attr field
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit e2c6bf57f78dfebc21e168df01e5876202053e08
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Fri Mar 7 09:39:22 2008 -0800
++
++    uDAT: fix reuse of va_list in debugging mode
++    
++    Make sure we reinitialize the va_list since va_list is undefined
++    if a function traverses the va_list with va_arg.
++    
++    This patch fixes the uDAT debugging case when both stdout and
++    syslog output is wanted.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Mar 6 15:40:35 2008 -0800
++
++    Add hostname and process id to debug output to aid
++    scale-up and out debug.
++    
++    Signed-off by: Arlin Davis ardavis@ichips.intel.com
++
++commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Sat Feb 23 21:03:21 2008 -0800
++
++    fix reuse of va_list in debugging mode
++    
++    Make sure we reinitialize the va_list since va_list is undefined
++    if a function traverses the va_list with va_arg.
++    
++    This patch fixes the debugging case when both stdout and syslog
++    output is wanted.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit da80af8c76f220508407a2e171c8b28b43b35bf9
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 16:54:45 2008 -0800
++
++    Fix memory leak in provider specific post send/recv if there's
++    more than DEFAULT_DS_ENTRIES iovecs.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit d78ee9f95fbe48f71eb247b01c598994edfa4d17
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 03:19:42 2008 -0800
++
++    Guarantee NUL termination if hostname gets truncated.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 03:19:37 2008 -0800
++
++    Make sure we don't leak the hash table if dapl_hca_alloc fails.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit e4ed56be6bd64684564169d89df7ca30faffdb53
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 03:19:32 2008 -0800
++
++    Fix memory leak.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 03:19:27 2008 -0800
++
++    Fix memory leak in error path.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit d971e799bb5385a8c847cf3f863f19854e95c1b2
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 03:19:22 2008 -0800
++
++    Fix memory leak
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit c21f2f455af7934675a58ff825bed6cf54d457c9
++Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++Date:   Tue Feb 19 03:19:17 2008 -0800
++
++    Fix memory leak.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit ee46aa47e2a4deeded347fe18bd6321db61c6594
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Feb 15 10:10:01 2008 -0800
++
++    Release 2.0.7
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit f0ca504bc2639cb7a48528d45e9026b54dab3e57
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Feb 14 09:46:56 2008 -0800
++
++    uDAT: Make sure we initialize the dictionary entry early enough so that
++    we can base our cleanup decisions on that variable being
++    initialized.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 6b11838043a6012668c7e1a22a869e9e84dc40d6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Feb 14 09:46:18 2008 -0800
++
++    uDAT: Make sure we stay within bounds when manipulating the ia_name.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Feb 14 09:44:56 2008 -0800
++
++    uDAT: Make sure we stay within bounds when manipulating the ia handle.
++    Fix typo in comment.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit 7fe64f10874667062e067efb7ea8c3d385ae90b7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Feb 14 09:43:39 2008 -0800
++
++    uDAT: Zero-out memory otherwise we might base our cleanup decisions on
++    uninitialized memory.
++    
++    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
++
++commit f510e7e8f5b72a6262a7f8b255926cf96c65b654
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 13 20:39:26 2008 -0800
++
++    Modify default configure options to match rpm spec file
++     --enable-debug, --enable-ext-type=ib
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 75273f1a5c599777bb43add93f30563689fdbc10
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 11 15:43:03 2008 -0800
++
++    udapl OFA provider: set listen backlog to default cma backlog max.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 11 14:50:33 2008 -0800
++
++    The OFA dapl provider is checking for incorrect return code
++    from rdma_bind_addr and rdma_listen calls. This causes an error
++    to be returned back to the consumer instead of correctly
++    incrementing the seed port and re-calling the OFA provider
++    until a valid port is issued. The seed value (1000) is also
++    incorrect and should start a non-privledged port (1024) to
++    avoid EPERM errors when seeding the starting port value.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 4 16:16:10 2008 -0800
++
++    Release 2.0.6 - ChangeLog
++
++commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 4 16:14:02 2008 -0800
++
++    Release 2.0.6
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 8c5beb870048aca286f7396549771ccb075c5c1b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 4 16:12:47 2008 -0800
++
++    Fix OFED v2 package to build against and target /dat2/include directory.
++    
++    Prevous patch missed dat_osd.h, dapltest/dtest incorrect.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 4 13:00:45 2008 -0800
++
++    uDAT/DAPL: Fix package to build against and target /dat2/include directory.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 29 16:34:49 2008 -0800
++
++    Release 2.0.5 - ChangeLog updated
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 356cf91905d39ade06d76ab9ace6203cd7907d93
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 29 16:33:10 2008 -0800
++
++    libdat: rename libdat.so to libdat2.so to coexist with v1 devel
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d9a9f46ee220ec9c479756acc306ed68060a662f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jan 28 13:55:35 2008 -0800
++
++    Release 2.0.4 - README
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 533983cec914a7ecc6829934a56f867d7870e301
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jan 28 12:06:03 2008 -0800
++
++    Release 2.0.4 Changelog
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Jan 28 12:04:18 2008 -0800
++
++    Relase package 2.0.4
++
++commit 95935648f81ac5177ae7120b35e55483902b8c64
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jan 23 16:40:48 2008 -0800
++
++    dapltest does not include definitions for inet_ntoa.
++    At load time the symbol was resolved but with the
++    default definition of int, instead of char*, it caused
++    segfault. Add correct include files in dapl_mdep_user.h
++    for linux.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jan 23 14:46:30 2008 -0800
++
++    Add freeaddrinfo to deallocate getaddrinfo buffer.
++    Cleanup a few printf messages.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jan 23 14:25:21 2008 -0800
++
++    Fix for uDAPL v2 using extended operation. After extension completion,
++    the DTO cookie must be checked for type before deallocating to handle
++    inbound immediate data in receive. The sample dtestx client will fail
++    when running loopback if the rdma immediate is received from remote
++    before the rdma immediate request completion fires.
++    
++    Bug causes following dtestx client error:
++    dat_ib_post_rdma_write_immed
++       returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jan 17 11:30:27 2008 -0800
++
++    WinOF: update dapltest,dtest directories for windows build
++    WinOF: add README.windows
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 9bececbb32dd31d4a3528e8f000a773e5c593430
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jan 17 11:24:46 2008 -0800
++
++    WinOF: update dtestx for windows build
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Jan 17 11:23:21 2008 -0800
++
++    WinOF: add build enviroment, cleanup old makefiles
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 15 16:59:34 2008 -0800
++
++    WinOF: name collision with ibal verbs ib_cm_handle_t
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 7c5418a781c1dfdb37b09450b5df40363dce84b4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 15 16:06:10 2008 -0800
++
++    dtest: dat_evd_query for correct size
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 6de5e635c01e78bde6e153b727926da900677d52
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 15 16:03:27 2008 -0800
++
++    dapltest: WinOF support.
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++
++commit c680e95b96e57bd8b69b1c73e95730854fcea028
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 15 14:54:57 2008 -0800
++
++    openib_cma: fix cleanup issues in destroy_cm_id
++                add macros to convert SID and PORT
++                fix init/responder settings in accept
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 15 14:49:54 2008 -0800
++
++    Modifications for WinOF build and endian support for RMR info
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jan 15 14:39:18 2008 -0800
++
++    WinOF: DAT_API changes, white space and tab cleanup
++           IBAL provider code added
++    
++    Common code: initialize cookie pool buffer
++                 add dapl extension DTO counter
++                 add get_cqe_op_str debug call
++                 remove excess dbg in evd_dequeue
++                 add dbg assert to sp_search_cr
++                 IBAL provider support _VENDOR_IBAL_
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 68f2ad0af3623dec27b1223aeaca6357348eef4b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jan 4 08:32:39 2008 -0800
++
++    Windows specific -
++       IBAL support in evd_create
++       Build IB extensions by default
++    Common code -
++       check return status, evd_free, evd_wait
++       add dapl_event_str function
++       definitions for dat_os_library_error, dat_os_ungetc
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d21f36406408245ac979f0b9594e7d1d0b9a3852
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jan 4 08:32:19 2008 -0800
++
++    Common code -
++       Missing DAT_API defs
++       casting to fix build issues
++       bitmaps for extension debug
++       DAPL_BAD_PTR macro
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 258678a381c6a0170020c48b0ba627e820abd3e7
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jan 4 08:31:59 2008 -0800
++
++    Common code -
++       Add DAT_API definitions for dat_redirection.h, udat_redirection.h
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jan 4 08:31:27 2008 -0800
++
++    Windows specific -
++       Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider
++       Support for direct object on CQ
++       INIT and FINI changes
++       setup dat.conf default path, fix sr parsing
++    Common code -
++       Add Stan Smith as contributor
++       O/S independent dat_os_library_error()
++    
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit b3ba3dc9743baf3bff243e8969edf3395d1118dd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Dec 11 14:44:24 2007 -0800
++
++    2/2 uDAPL changes to sync common code base with WinOF
++     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )
++     - cleanup platform specific definitions for windows
++     - c++ support
++     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE
++
++commit 92d7eef38877ad472a91e5e9f88e4e49657716bf
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Dec 11 14:43:05 2007 -0800
++
++    1/2 uDAT changes to sync common code base with WinOF
++     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )
++     - cleanup platform specific definitions for windows
++     - c++ support
++     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: Stan Smith <stan.smith@intel.com>
++
++commit 95764c6da28284d29071cf01d1a09bdcb967a971
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Dec 4 13:19:27 2007 -0800
++
++    - Fix size of evd request queue on creation
++    - Add query and checking of DTO request queue
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6
++Merge: 11a165a... abb4356...
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 27 13:31:32 2007 -0800
++
++    master_dat2.0_merge
++
++commit abb4356cd765d38cf5cff2dfbdb610b380f944a2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 20 12:10:39 2007 -0800
++
++    Release 2.0.3
++
++commit d2c66eb7363234c5a9fb82aa92df1c132e46477e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Nov 20 12:07:58 2007 -0800
++
++    - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices
++    - Add missing ia_query for max_iov_segments_per_rdma_write
++    - Cleanup CMA code no longer supported by rdma_cm
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 3a3519167bd65bd999424788f139b930b099b405
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Nov 19 15:26:44 2007 -0800
++
++    Change dapltest timers to use gettimeofday instead of get_cycles for better portability.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 11a165a1868b1748fe476e08fc40af620f961cd2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 31 10:58:51 2007 -0800
++
++    - DAT/DAPL Version 1.2.3 Release 1
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 31 10:55:48 2007 -0800
++
++    ChangeLog update
++
++commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Oct 31 10:55:05 2007 -0800
++
++    - DAT/DAPL Version 2.0.2 Release 1
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 43931378b9d4f5f721da828623f1e391f32f446b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 30 09:06:24 2007 -0800
++
++    - Add ChangeLog
++    - update cma provider to report remote and local ports via dat_ep_query.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Oct 25 14:37:14 2007 -0700
++
++    Fix dapltest endian issue with mem_handle, mem_address.
++    
++    Signed-off-by: Shirley Ma <xma@us.ibm.com>
++
++commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Oct 25 14:36:12 2007 -0700
++
++    Fix dapltest endian issue with mem_handle, mem_address.
++    
++    Signed-off-by: Shirley Ma <xma@us.ibm.com>
++
++commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 16 14:23:17 2007 -0700
++
++     Fix dtest to build properly with extensions.
++    
++     Modify dat.h dat_event to include event_extension_data[8].
++     Extend struct dat_event outside of extension build
++     switch to enable non-extended applications to work
++     with extended libraries. Otherwise, there is a potential
++     for the event callee to write back too much event data
++     and exceed callers non-extended event buffer.
++    
++     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d7134fb2bcad6f4f68410af997f8791edd788cfb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 16 14:10:52 2007 -0700
++
++        Use inet_ntoa instead of open coding it. IP addresses were being
++        reversed on PowerPC.
++    
++        On PowerPC the timebase ticks at a different frequency to the CPU.
++        dapltest currently assumes a 1:1 relationship, and gives bogus values
++        when scaling timebase to real time.
++    
++        To fix this, look at the timebase field in /proc/cpuinfo instead. To
++        keep things consistent with x86, scale that value to MHz.
++    
++        Signed-off-by: Anton Blanchard <anton@samba.org>
++
++commit c6710c291a4f7c0845a4535767d41d66f092fabf
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 16 14:09:56 2007 -0700
++
++    Use inet_ntoa instead of open coding it. IP addresses were being
++    reversed on PowerPC.
++    
++    On PowerPC the timebase ticks at a different frequency to the CPU.
++    dapltest currently assumes a 1:1 relationship, and gives bogus values
++    when scaling timebase to real time.
++    
++    To fix this, look at the timebase field in /proc/cpuinfo instead. To
++    keep things consistent with x86, scale that value to MHz.
++    
++    Signed-off-by: Anton Blanchard <anton@samba.org>
++
++commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 16 14:02:36 2007 -0700
++
++     Minor clean-up of cr/lf
++    
++     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 33fd0628497911df11dea640aea4660e54989ed6
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 16:01:37 2007 -0700
++
++    Final changes for 2.0.1-1 package, OFED 1.3 ALPHA
++    Fix build issue with SLES 10, gcc++ compiler
++    
++     Signed-off-by: Jimmy Hill <jimmy.hill@us.ibm.com>
++     Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 14:50:02 2007 -0700
++
++    Final changes for package 1.2.2-1, OFED 1.3 ALPHA
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 52bc16939e87587f8208e775dd061f54196a9acb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 11:58:46 2007 -0700
++
++    Change v2 dat.conf provider names to associate with ib net devices
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit d22e62f989dd16d503d5430ffe6f55075139e057
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 11:43:34 2007 -0700
++
++    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
++    than times().
++    
++    Signed-off-by: Anton Blanchard <anton@samba.org>
++
++commit a64eae5bd36598a5c93010e07869e95599aa8ceb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 11:41:40 2007 -0700
++
++    Change v2 dat.conf provider names to associate with ib net devices
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 11:35:21 2007 -0700
++
++    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
++    than times().
++    
++    Signed-off-by: Anton Blanchard <anton@samba.org>
++
++commit 66bf23e3e53f370c92803f162144947f29ce06d8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 11:30:15 2007 -0700
++
++    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
++    than times().
++    
++    Signed-off-by: Anton Blanchard <anton@samba.org>
++
++commit c220760bbb1f6357b6e187ff6c5e576dd74fd504
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Oct 2 10:39:09 2007 -0700
++
++    Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using
++    the kernel atomic routines, code them explicitely like x86 does.
++    
++    Signed-off-by: Anton Blanchard <anton@samba.org>
++
++commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Sep 28 17:04:54 2007 -0700
++
++    Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 493e65b5b47f47e4824f775959fd98e56aeaccc4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Sep 28 17:03:41 2007 -0700
++
++    Clean up packaging, modify dat.conf for cma provider name change to ofa
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Sep 20 12:25:55 2007 -0700
++
++      Modifications to coexist with 2.0 libraries
++         - fix RPM specfile, configure.in,  1.2.2 package
++         - modify dat.conf
++    
++        Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Sep 20 10:55:19 2007 -0700
++
++    Modifications to coexist with 1.2 libraries
++     - cleanup CR-LF in dtestx
++     - fix RPM specfile, 2.0.1 package
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 230767742b8287490373c09d1bd346337b375b48
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 22 11:48:20 2007 -0700
++
++    Update copyright in specfile
++
++commit 5294cbe5e58f67d0a98862edea3684fff6e773bb
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jun 22 11:47:14 2007 -0700
++
++    Update Copyright in specfile
++
++commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 6 13:20:38 2007 -0700
++
++    Update specfile to reflect DAT/DAPL 1.2.1 release
++
++commit babb95eff1bcef88bed46e92c323193d8f039eff
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Jun 6 11:48:07 2007 -0700
++
++    More changes to the release notes
++
++commit 0f299bf1deb9198b2f008c3ffa717bef252b6097
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jun 5 15:56:17 2007 -0700
++
++    Update release notes
++
++commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Jun 5 15:52:18 2007 -0700
++
++    Add release notes updated for OFED 1.2 release
++
++commit f332badb80f0b1d88bf2d70dba0c90afc40f088f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu May 31 12:43:28 2007 -0700
++
++    Add provider specific interface to uDAPL for extensions support.
++    Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events
++    Remove unnecessary check on dats_set_ia_handle in dat_ia_openv
++    Clean up specfile and some extra LF's
++
++commit 4d7e30586402149228a30bea3036466395577ec4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 16 12:56:39 2007 -0700
++
++    add iwarp extension include file
++
++commit d9963cc9984c06f147b92877945e847f657cd512
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 16 12:52:38 2007 -0700
++
++    clean up some CR's in include files
++
++commit 80f4e8c4be02bac5d472e1e6c4937079882a0388
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 9 16:21:16 2007 -0700
++
++    Take out references to specific 1.1 verbs definitions (ibv_comp_channel).
++
++commit 544fbb873d5320e9606f176c4b71bcba0e257d7d
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 9 12:51:53 2007 -0700
++
++    Bug Fixes:
++      - 606: Return local and remote ports with dat_ep_query
++      - 585: Add bonding example to dat.conf
++
++commit e64079f7b961aa9a672711f0e933a77f3999d302
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 7 15:54:59 2007 -0700
++
++    Update dapltest to use default device OpenIB-cma
++    Fix dapltest manpage, example for performance test wrong
++
++commit 7cda2304a6880371ec2d9451a4f83a7a254bc474
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon May 7 12:49:18 2007 -0700
++
++    Fix issues with IB DTO extensions
++     - debug print_cqe updated for latest IBV definitions
++     - dapli_evd_cq_to_event modified to handle both post and receive extensions
++     - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap
++     - modify cookie DTO types to support extensions properly
++
++commit 82a6750d31cd432c7e09298fc98c0e7e74abd012
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri May 4 17:17:41 2007 -0700
++
++    Add new dapl functions for 2.0 (stubs for now)
++    - dapl_ep_post_send_invalidate
++    - dapl_ep_post_rdma_read_to_rmr
++    - dapl_ia_ha
++    - dapl_csp_create, query, free
++    - dapl_cno_trigger
++    - dapl_cno_fd_create
++    - dapl_extensions
++    
++    Add new 2.0 parameters to existing API's
++    - dapl_cr_reject
++    - dapl_rmr_bind
++
++commit 8679aaf56c781715adc132a38a731e36194570f1
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu May 3 09:44:43 2007 -0700
++
++    update dtestx.c, default provider OpenIB-cma
++
++commit 527f6d19125e9eec7ecef03a8633626b0043a2f4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed May 2 17:27:44 2007 -0700
++
++    Added IB extensions and dtestx as an example program using
++    rdma write with immediate and atomic operations
++
++commit 83ac961b505346708f12d59152146f3b04c8306f
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Apr 30 10:55:59 2007 -0700
++
++    Fixes atomic operation build problem with ia64 and RHEL5.
++
++commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Apr 26 17:29:37 2007 -0700
++
++    Update README and dapltest manpage
++
++commit 9a951d0a8713657da90568c0613eb48f5010cf1e
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 3 16:35:17 2007 -0700
++
++    Cleanup RPM specfile for the dapl package, move to 1.2-1 release.
++
++commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Apr 3 14:38:31 2007 -0700
++
++    Add support for multiple IB devices to dat.conf to support IPoIB HA failover.
++
++commit 5434b720b36de2f262a02ff9dfccd99953c09e59
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Mar 15 10:46:33 2007 -0800
++
++    Fix ia64 builds on SUSE
++
++commit b0f9eef1aa7f279802da233480cf6c495e16565b
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Mar 14 13:29:08 2007 -0800
++
++    DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider
++
++commit 61858b925f4c1a6f9edba6389a5bd601daf936e9
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Mar 14 11:08:19 2007 -0800
++
++    change DAT_VERSION major and minor numbers to 2.0
++
++commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Mar 14 10:43:56 2007 -0800
++
++    add provider support to dtest, set default to OpenIB-cma
++
++commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Tue Mar 13 16:20:20 2007 -0800
++
++    add provider option to dtest, set default to OpenIB-cma
++
++commit 76a43cace54567135bac7ae54e336c6595b65fd9
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Mar 9 13:09:14 2007 -0800
++
++    Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib
++
++commit 921687efed992e6ab72dfb731687b6816324a024
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Thu Mar 8 16:01:29 2007 -0800
++
++    Update the README
++
++commit 52ed210ae99b291f72441e71459006b5f2c851ce
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Mar 7 15:34:41 2007 -0800
++
++    - Fix bug 408, dapltest compilation failure on 32 bit arch
++    - Update libdat.spec.in file to build uDAPL RPMs correctly
++
++commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Mar 5 14:15:49 2007 -0800
++
++    Fix build issues with dtest and dapltest. Define build tree path to dat/include.
++
++commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Feb 28 17:14:55 2007 -0800
++
++    Add dapltest headers to EXTRA_DIST
++    Modify dtest to delay before accepting
++    
++    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++
++commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Feb 26 13:54:15 2007 -0800
++
++    Adding dtest and dapltest to the build. Manual pages created.
++
++commit d245664e27148e54469268ad81f41b2a894a131a
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Fri Jan 19 16:21:30 2007 -0800
++
++    uDAPL changes to support exchanging and validation of the device responder_resources and the
++    initiator_depth during connection establishment
++
++commit 2280f833090aa9f750d5be8f9b06e7e08e642da5
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Wed Dec 6 11:49:27 2006 -0800
++
++    Update cma provider to sync with rdma_ucm changes
++
++commit 89448545b415b6dff57e3314b020619f6b979ef8
++Author: Arlin Davis <arlin.r.davis@intel.com>
++Date:   Mon Dec 4 13:54:20 2006 -0800
++
++    Update autogen to create config directory
++
++commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Tue Nov 7 20:22:05 2006 +0000
++
++    r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL
++    level.
++    
++    Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a
++    recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified.
++    
++    Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support
++    to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call
++    when receiving the disconnect request to guarantee a disconnect reply and event on the remote side.
++    The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing
++    to DISCONNECTED in the event callback.
++    
++    Here are the new options (environment variables) with the default setting:
++    
++    DAPL_CM_ARP_TIMEOUT_MS   4000
++    DAPL_CM_ARP_RETRY_COUNT  15
++    DAPL_CM_ROUTE_TIMEOUT_MS  4000
++    DAPL_CM_ROUTE_RETRY_COUNT 15
++
++commit c73aeb904504a0bc6cce0fb1248af9ba39521395
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Oct 12 22:41:33 2006 +0000
++
++    r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported.
++
++commit b1d94b26610f682cdd43bde2aecf5004e0865422
++Author: Steve Wise <swise@opengridcomputing.com>
++Date:   Tue Sep 12 18:15:39 2006 +0000
++
++    r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC
++    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 99a5dddd07d4c271ebb075b5b0f800101f850a56
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Sep 7 18:09:11 2006 +0000
++
++    r9346:
++    inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider
++
++commit b53a87c856d9754313da9543a1dac5c6f1307085
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Wed Sep 6 20:36:09 2006 +0000
++
++    r9315:
++    Fill out some unitialized fields in the ia_attr structure
++    returned by dat_ia_query().
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: Robert Walsh <robert.walsh@qlogic.com>
++
++commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Fri Aug 11 20:44:23 2006 +0000
++
++    r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default.
++
++commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Wed Jul 19 17:15:06 2006 +0000
++
++    r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider
++
++commit 25fb8c376547de895a170194c09b2d72dfea789d
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Mon Jul 17 22:59:17 2006 +0000
++
++    r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues.
++
++commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af
++Author: Anton Blanchard <anton@samba.org>
++Date:   Mon Jul 17 21:26:03 2006 +0000
++
++    r8562: Fix some suspicious inline assembly:
++    - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we
++      shouldnt export them to userspace. Replace it with lwsync and isync.
++    - The comment says its implemenenting cmpxchg64 but in fact its
++      implementing cmpxchg32. Fix the comment.
++    
++    Signed-off-by: Anton Blanchard <anton@samba.org>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 63759108a1376b6e45a4491551f71d8cafdcddc1
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Jul 12 14:56:26 2006 +0000
++
++    r8503: Fix IA64 build problems reported by John Partridge <johnip@sgi.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Jun 22 22:02:56 2006 +0000
++
++    r8182: Lower the reject debug message level so we don't see warnings
++    when consumers reject.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit f14889bb0cd22e897148ea2f6931a6b4f23143b0
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Jun 22 21:13:37 2006 +0000
++
++    r8181: Added support for active side TIMED_OUT event from a provider.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Jun 22 20:58:06 2006 +0000
++
++    r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 893698c31a0d8e60227806d992485a44375840cb
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Jun 19 17:20:45 2006 +0000
++
++    r8112: Update for new rdma_create_id() function signature.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 53483d84b0d02c432d9435d2f8e840cab3ded320
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Wed Jun 14 16:17:39 2006 +0000
++
++    r8008: Set max rdma read per EP attributes
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Mon Jun 12 15:42:50 2006 +0000
++
++    r7931: Report the proper error and timeout events.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Mon Jun 12 14:51:14 2006 +0000
++
++    r7928: Socket CM fix to guard against using a loopback address
++    as the local device address.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 152219cf83c61e459fdf3de03d4e83ddba045230
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Tue Jun 6 21:46:44 2006 +0000
++
++    r7755: Use the uCM set_option feature to adjust connect request timeout
++    and retry values. Also, a fix to disallow any event after a disconnect
++    event.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 3a0686a2624ed28c7ea37b650415801f1cedbd10
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed May 31 19:55:57 2006 +0000
++
++    r7608: Correct comment.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit eb760157c90f59183b424ac8e71474fe0b46094c
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu May 18 21:54:12 2006 +0000
++
++    r7347: Undo inadvertent change.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 27256222b42fecfac8a44b3f82fe2524ecc72de2
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu May 18 21:50:27 2006 +0000
++
++    r7346: Fix for uCMA provider to return the correct event as a result of
++    rejects. Also, ran into a segv bug with dapl_ep_create when
++    creating without a conn_evd.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit b1b6e16f3e41e123cd347bc78b01e3272076362b
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Fri May 12 19:50:19 2006 +0000
++
++    r7141: Update the uDAPL openib_cma provider to work with the new
++    uCMA event channel interface.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 27f9f0c106662cc7b41bcb747495860a1b6c7133
++Author: Steve Wise <swise@opengridcomputing.com>
++Date:   Tue May 2 21:33:35 2006 +0000
++
++    r6873: Transaction test change to comply with the iWARP MPA protocol's
++    "Connection Startup Rules".
++    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 060d09f974ffbe73672e17641b2f18d3821d31a7
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Fri Apr 28 13:44:17 2006 +0000
++
++    r6736: getaddrinfo() fix for debug builds and some additional debug messages for
++    connect errors and rejects.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Apr 19 16:49:34 2006 +0000
++
++    r6520: Fix compilation warning.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 115fcc396164066326f9447d71af798a381d063f
++Author: Steve Wise <swise@opengridcomputing.com>
++Date:   Wed Apr 19 16:32:01 2006 +0000
++
++    r6518: Do not always generate an event for an abrupt disconnect.
++    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit f959bb786cd884bf4d2a5da4d299da6297d65293
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Apr 19 16:30:37 2006 +0000
++
++    r6517: Generate a disconnect event for providers that do not generate
++    one automatically.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit bb467511cf6e217147817ba12bbe800aae97cab5
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Apr 19 16:25:33 2006 +0000
++
++    r6516: Fix compilation error.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 117a9856c269bf08b738a1923c92f5a1949f6cc1
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Apr 10 20:16:44 2006 +0000
++
++    r6392: Fix for RDMA cm id destruction and debug builds.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Apr 6 15:32:47 2006 +0000
++
++    r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct
++    attribute.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 304f48370adcaa12463c1a7d99e513164b83810c
++Author: Steve Wise <swise@opengridcomputing.com>
++Date:   Thu Apr 6 15:16:10 2006 +0000
++
++    r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute
++    max_rdma_read_iov based on the openib max_sge_rd device attribute.
++    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Apr 4 18:29:00 2006 +0000
++
++    r6221: Change the mechanism by which library init and fini functions are specified
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 5a0598b90ab021cb2115e3791cb38dcfc0347948
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Apr 3 17:29:55 2006 +0000
++
++    r6182: Remove unused variables.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit b8084c4edc21b5ac2191ec654a882b65bad0c77d
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Apr 3 15:29:30 2006 +0000
++
++    r6179: Fix dapltest compiler warnings.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit abdbec194670d72012d481b98b2e6f728e9c5b48
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Apr 3 14:08:48 2006 +0000
++
++    r6168: Fixed debug prints of 64-bit values and removed compile warnings.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 52de2a35e02ddeb15887d0d690b52a4e02812e57
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Mar 21 22:28:10 2006 +0000
++
++    r5939: Move libdat.spec to libdat.spec.in
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Fri Mar 17 22:02:18 2006 +0000
++
++    r5879: Add GNU Autotools support and an RPM spec file
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 9d00582b8be33add8d3e4173e8311b1a222b0b34
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Mar 16 22:40:18 2006 +0000
++
++    r5871: Fixes a corner case where a CMA event was not acknowledged during
++    disconnect processing.
++    
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Mar 13 18:15:49 2006 +0000
++
++    r5789: Reduces some debug output in the async thread and fixes listen
++    processing of EBUSY.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit afd558cbdada66e01aa553364b9a126da00dbe65
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Wed Mar 8 14:24:26 2006 +0000
++
++    r5684: Remove unused NO_EP_STATE.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Feb 28 15:41:03 2006 +0000
++
++    r5529: Fix to destroy QPs in all cases and close the HCA.
++    
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Jan 9 20:17:33 2006 +0000
++
++    r4855: Make use of dat_evd_wait the default.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 254bd0e349bafbd970d6475efcafd7e52f05415e
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Mon Jan 9 16:59:38 2006 +0000
++
++    r4852: Fix disconnect event processing and update dtest to validate.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit f69d737ee51f6b00a1e6cf8531695a61a322651b
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Fri Dec 16 02:03:05 2005 +0000
++
++    r4502: Query for rd_atomic values.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 86566b556920a51f1e538d245674058682012668
++Author: James Lentini <jlentini@netapp.com>
++Date:   Fri Dec 16 01:57:30 2005 +0000
++
++    r4501: Allow a network name, network address, or device name in the dat.conf file.
++    Singed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f
++Author: Roland Dreier <rolandd@cisco.com>
++Date:   Wed Dec 14 20:44:36 2005 +0000
++
++    r4466: Change libibverbs API for listing all known devices from
++    ibv_get_devices() to ibv_get_device_list(), and update all
++    in-tree uses of this API.
++    
++    Signed-off-by: Roland Dreier <rolandd@cisco.com>
++
++commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Dec 5 16:37:46 2005 +0000
++
++    r4308: Fix a gcc 4.0 warning
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Thu Dec 1 15:03:10 2005 +0000
++
++    r4279: Added CMA API support.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Nov 10 21:39:34 2005 +0000
++
++    r4018: Fixed some problems with the free build openib_scm version and turned
++    down some debugging and added some debug prints for uAT path records.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Oct 31 18:27:13 2005 +0000
++
++    r3917: Fix printing of debug statements.
++    Signed off by: Aniruddha Bohra <bohra@cs.rutgers.edu>
++    Signed off by: James Lentini <jlentini@netapp.com
++
++commit 4306debe3118948fca72a68ec20ef0d73b399fd1
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Oct 26 21:10:26 2005 +0000
++
++    r3882: uDAPL provider for OpenIB socket CM.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit 42a64ec2ec1d8ec71492bfebba077b006684ce97
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Oct 13 20:45:22 2005 +0000
++
++    r3774: Fix the async error handling and callback mappings.
++    Updated TODO list.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde
++Author: Robert Walsh <rjwalsh@pathscale.com>
++Date:   Fri Oct 7 21:15:00 2005 +0000
++
++    r3693: Update some more ignores.
++
++commit 303147143afa9aa72906246a9f1973e4172f75b8
++Author: Todd Bowman <twbowman@gmail.com>
++Date:   Thu Oct 6 21:13:32 2005 +0000
++
++    r3687: Add PPC64 support for udapl
++    Signed-off-by: Todd Bowman <twbowman@gmail.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce
++Author: Todd Bowman <twbowman@gmail.com>
++Date:   Thu Oct 6 15:22:08 2005 +0000
++
++    r3683: Remove the dtest qualifier from the sdp range.
++    Signed-off-by: Todd Bowman <twbowman@gmail.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 33fbf9c81ac29492394e419588d856533e7fffb8
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Oct 3 14:59:22 2005 +0000
++
++    r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Sep 29 18:13:25 2005 +0000
++
++    r3619: Makefile fix.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 634b199218b775a8ed071c1faea519c4cc4ee4e3
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Sep 28 21:50:13 2005 +0000
++
++    r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and
++    adds support for SuSe.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit 3a23c7135905666ff969b86dab3e90f90ac73008
++Author: Robert Walsh <rjwalsh@pathscale.com>
++Date:   Tue Sep 27 16:59:14 2005 +0000
++
++    r3567: Setup svn:ignore on a bunch of directories.
++
++commit d41ea62125636a58e8748871e372810c09865b0a
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Sep 22 21:24:38 2005 +0000
++
++    r3525: Improve dtest and measure RDMA reads
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 32258d13af6aaf76078ec6ba187d8129a0f70397
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Sep 21 19:54:07 2005 +0000
++
++    r3513: Temporary workaround for the RDMA read performance anomaly
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit 990bdc4320809e0b989c90c24bef361c1bc91c7f
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Sep 20 17:00:37 2005 +0000
++
++    r3494: Moved dapl_evd_modify_cno.c to match SourceForge
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Sep 20 16:17:59 2005 +0000
++
++    r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per
++    device basis, and add copyrights for kDAPL cm work that was
++    used in uDAPL.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit c1d45137c2e26024142f24207344e3e48a577b83
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Thu Sep 15 21:43:21 2005 +0000
++
++    r3453: Bind communication identifiers to a device to support device removal.
++    Export per HCA CM devices to userspace.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8
++Author: James Lentini <jlentini@netapp.com>
++Date:   Wed Sep 14 17:44:44 2005 +0000
++
++    r3432: Request address resolution using ATS.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Sep 12 19:14:43 2005 +0000
++
++    r3378: Added DAPL documentation.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 8911b60eb16770d28907c14e45556444317dd276
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Sep 12 19:10:13 2005 +0000
++
++    r3377: Removed executable premission.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Fri Sep 9 21:51:58 2005 +0000
++
++    r3349: Update DAPL to match the verbs and CM event processing APIs.
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a
++Author: Arlin Davis <ardavis@ichips.intel.com>
++Date:   Tue Sep 6 19:34:46 2005 +0000
++
++    r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread.
++    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Aug 29 15:07:44 2005 +0000
++
++    r3232: validate default settings so they don't exceed device maximums
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit ac5308b4aac7de79a356439dfec2312faf7705ae
++Author: James Lentini <jlentini@netapp.com>
++Date:   Mon Aug 29 14:15:23 2005 +0000
++
++    r3227: Support for ibv_query_port, device, and gid.
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7
++Author: Sean Hefty <sean.hefty@intel.com>
++Date:   Sun Aug 21 22:30:08 2005 +0000
++
++    r3143: - Add user specified context to all uCM events.  Users will not retrieve
++      any events associated with the context after destroying the corresponding
++      cm_id.
++    - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM.
++      This call may be used to set QP attributes properly before modifying the QP.
++    - Fixes some error handling syncrhonization and cleanup issues.
++    - Performs some minor code cleanup.
++    - Replaces the ucm_simple test program with a userspace version of cmpost.
++    - Updates DAPL to the new API.
++    
++    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
++
++commit ec0f86d7c55830c6dffded585c04754cc6ac2a83
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Aug 16 14:10:13 2005 +0000
++
++    r3107: Removed unused debug counter macros
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 49087ba27bd93769bb64d7ac5c454de1b94005bc
++Author: James Lentini <jlentini@netapp.com>
++Date:   Tue Aug 16 14:07:42 2005 +0000
++
++    r3106: Implemented debug counters
++    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
++    Signed-off by: James Lentini <jlentini@netapp.com>
++
++commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 20:23:56 2005 +0000
++
++    r3072: Update from SourceForge DAPL: use the LMR context in calls to
++    dapls_hash_remove()
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 878e524c5cc63a62802d28fdc215a2b69ceb1141
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 20:07:06 2005 +0000
++
++    r3071: Updates from SourceForge DAPL: EVD updates
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 19:57:40 2005 +0000
++
++    r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit f2801ae6caf010d660fe302970dabddc8948e1bf
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 19:46:39 2005 +0000
++
++    r3069: Updates from SourceForge DAPL: size EP IOV correctly
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit c87fd235eaf0b3a30e005422f7d347c406c14f2c
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 19:35:05 2005 +0000
++
++    r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and
++    fixed the spelling of ib_hca_transport_t.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit a88bebc09a9655e462b3d32dfddec823024eab59
++Author: James Lentin <jlentini@netapp.com>
++Date:   Thu Aug 11 19:24:56 2005 +0000
++
++    r3067: Update from SourceForge DAPL: use include guard
++    Signed-off-by: James Lentin <jlentini@netapp.com>
++
++commit d2da08920de882a9a266f0606b81150c625fa003
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 19:21:56 2005 +0000
++
++    r3066: Update from SourceForge DAPL: optimization to dapl_ep_query
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 18:39:34 2005 +0000
++
++    r3065: Update from DAPL SourceForge: indicate which handle is invalid
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 6d8f34137776c32149251bdec493c017b399cd10
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 18:35:58 2005 +0000
++
++    r3064: Update from DAPL SourceForge: set ep param values.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 18:33:47 2005 +0000
++
++    r3063: Updates from DAPL SourceForge: QP state and connection event fix.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 3fc876339693c6f0eed5e57780e5342f301bd95c
++Author: James Lentini <jlentini@netapp.com>
++Date:   Thu Aug 11 18:23:33 2005 +0000
++
++    r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9
++Author: Hal Rosenstock <halr@voltaire.com>
++Date:   Fri Aug 5 17:59:38 2005 +0000
++
++    r2989: Fix dtest makefile
++    Signed-off-by: Hal Rosenstock <halr@voltaire.com>
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb
++Author: James Lentini <jlentini@netapp.com>
++Date:   Fri Aug 5 17:57:31 2005 +0000
++
++    r2988: Remove kernel directory.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 9c4e246a5baf43cadc6380e91fd5a6e319777278
++Author: James Lentini <jlentini@netapp.com>
++Date:   Fri Aug 5 17:56:56 2005 +0000
++
++    r2987: Remove kernel code directory.
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 26706cb0de471ba47279de0cb949ba5a41de82cc
++Author: James Lentini <jlentini@netapp.com>
++Date:   Fri Aug 5 16:41:12 2005 +0000
++
++    r2986: Add uDAPL to the trunk
++    Signed-off-by: James Lentini <jlentini@netapp.com>
++
++commit 76aa2de7fe38a8595d88669842450084cfa88316
++Author: Roland Dreier <roland@topspin.com>
++Date:   Thu Nov 4 17:54:50 2004 +0000
++
++    r1139: Copy roland-merge branch to trunk
++
++commit 3bd72a559dfe22685aae33599c99d021d2ae4aca
++Author: Roland Dreier <roland@topspin.com>
++Date:   Tue Jul 20 21:34:32 2004 +0000
++
++    r502: Move 2.6-only source away from trunk
++
++commit 4f05b6ed3fd1d14161664c677264846eeb51dba5
++Author: Roland Dreier <roland@topspin.com>
++Date:   Tue Jul 20 21:34:32 2004 +0000
++
++    r502: Move 2.6-only source away from trunk
++
++commit 6da8b951c069072a2afc6aba03a3dca2c44db022
++Author: Roland Dreier <roland@topspin.com>
++Date:   Tue Jul 20 01:41:16 2004 +0000
++
++    r497: Move 2.6-only tree to gen2
+diff --git a/trunk/ulp/dapl2/configure.in b/trunk/ulp/dapl2/configure.in
+index 3ac53f7..b67314c 100644
+--- a/trunk/ulp/dapl2/configure.in
++++ b/trunk/ulp/dapl2/configure.in
+@@ -1,104 +1,104 @@
+-dnl Process this file with autoconf to produce a configure script.\r
+-\r
+-AC_PREREQ(2.57)\r
+-AC_INIT(dapl, 2.0.30, linux-rdma@vger.kernel.org)\r
+-AC_CONFIG_SRCDIR([dat/udat/udat.c])\r
+-AC_CONFIG_AUX_DIR(config)\r
+-AM_CONFIG_HEADER(config.h)\r
+-AM_INIT_AUTOMAKE(dapl, 2.0.30)\r
+-\r
+-AM_PROG_LIBTOOL\r
+-\r
+-AC_ARG_ENABLE(libcheck, [  --disable-libcheck      do not test for presence of ib libraries],\r
+-[       if test x$enableval = xno ; then\r
+-                disable_libcheck=yes\r
+-        fi\r
+-])\r
+-\r
+-dnl Checks for programs\r
+-AC_PROG_CC\r
+-\r
+-dnl Checks for libraries\r
+-if test "$disable_libcheck" != "yes"\r
+-then\r
+-AC_CHECK_LIB(ibverbs, ibv_get_device_list, [],\r
+-    AC_MSG_ERROR([ibv_get_device_list() not found.  libdapl requires libibverbs.]))\r
+-\r
+-AC_CHECK_HEADER(infiniband/verbs.h, [],\r
+-    AC_MSG_ERROR([<infiniband/verbs.h> not found.  Is libibverbs installed?]))\r
+-\r
+-AC_CHECK_MEMBER(struct ibv_port_attr.link_layer, \r
+-    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "yes"), \r
+-    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no"), \r
+-    [#include <infiniband/verbs.h>])\r
+-else\r
+-    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no")\r
+-fi\r
+-\r
+-AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,\r
+-    if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then\r
+-        ac_cv_version_script=yes\r
+-    else\r
+-        ac_cv_version_script=no\r
+-    fi)\r
+-AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")\r
+-\r
+-dnl Support debug mode build - if enable-debug provided the DEBUG variable is set \r
+-AC_ARG_ENABLE(debug,\r
+-[  --enable-debug Turn on debug mode, default=off],\r
+-[case "${enableval}" in\r
+-  yes) debug=true ;;\r
+-  no)  debug=false ;;\r
+-  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;\r
+-esac],[debug=false])\r
+-AM_CONDITIONAL(DEBUG, test x$debug = xtrue)\r
+-\r
+-dnl Support ib_extension build - if enable-ext-type == ib \r
+-AC_ARG_ENABLE(ext-type,\r
+-[  --enable-ext-type Enable extensions support for library: ib, none, default=ib],\r
+- [ if   test "x$enableval" = "xib" ; then\r
+-      ext_type=ib\r
+-   elif test "x$enableval" = "xnone" ; then\r
+-      ext_type=none\r
+-   else\r
+-      echo\r
+-      echo "Error!"\r
+-      echo "Unknown extension type' type"\r
+-      exit -1\r
+-   fi\r
+- ],[ext_type=ib])\r
+-AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib")\r
+-\r
+-dnl Check for Redhat EL release 4\r
+-AC_CACHE_CHECK(Check for RHEL4 system, ac_cv_rhel4,\r
+-    if test -f /etc/redhat-release &&\r
+-       test -n "`grep -e "release 4" /etc/redhat-release`"; then\r
+-        ac_cv_rhel4=yes\r
+-    else\r
+-        ac_cv_rhel4=no\r
+-    fi)\r
+-AM_CONDITIONAL(OS_RHEL4, test "$ac_cv_rhel4" = "yes")\r
+-\r
+-dnl Check for Redhat EL release 5\r
+-AC_CACHE_CHECK(Check for RHEL5 system, ac_cv_rhel5,\r
+-    if test -f /etc/redhat-release &&\r
+-       test -n "`grep -e "release 5" /etc/redhat-release`"; then\r
+-        ac_cv_rhel5=yes\r
+-    else\r
+-        ac_cv_rhel5=no\r
+-    fi)\r
+-AM_CONDITIONAL(OS_RHEL5, test "$ac_cv_rhel5" = "yes")\r
+-\r
+-dnl Check for SuSE release 11\r
+-AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11,\r
+-    if test -f /etc/SuSE-release &&\r
+-       test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then\r
+-        ac_cv_suse11=yes\r
+-    else\r
+-        ac_cv_suse11=no\r
+-    fi)\r
+-AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes")\r
+-\r
+-AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec])\r
+-\r
+-AC_OUTPUT\r
++dnl Process this file with autoconf to produce a configure script.
++
++AC_PREREQ(2.57)
++AC_INIT(dapl, 2.0.30, linux-rdma@vger.kernel.org)
++AC_CONFIG_SRCDIR([dat/udat/udat.c])
++AC_CONFIG_AUX_DIR(config)
++AM_CONFIG_HEADER(config.h)
++AM_INIT_AUTOMAKE(dapl, 2.0.30)
++
++AM_PROG_LIBTOOL
++
++AC_ARG_ENABLE(libcheck, [  --disable-libcheck      do not test for presence of ib libraries],
++[       if test x$enableval = xno ; then
++                disable_libcheck=yes
++        fi
++])
++
++dnl Checks for programs
++AC_PROG_CC
++
++dnl Checks for libraries
++if test "$disable_libcheck" != "yes"
++then
++AC_CHECK_LIB(ibverbs, ibv_get_device_list, [],
++    AC_MSG_ERROR([ibv_get_device_list() not found.  libdapl requires libibverbs.]))
++
++AC_CHECK_HEADER(infiniband/verbs.h, [],
++    AC_MSG_ERROR([<infiniband/verbs.h> not found.  Is libibverbs installed?]))
++
++AC_CHECK_MEMBER(struct ibv_port_attr.link_layer, 
++    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "yes"), 
++    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no"), 
++    [#include <infiniband/verbs.h>])
++else
++    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no")
++fi
++
++AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,
++    if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then
++        ac_cv_version_script=yes
++    else
++        ac_cv_version_script=no
++    fi)
++AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")
++
++dnl Support debug mode build - if enable-debug provided the DEBUG variable is set 
++AC_ARG_ENABLE(debug,
++[  --enable-debug Turn on debug mode, default=off],
++[case "${enableval}" in
++  yes) debug=true ;;
++  no)  debug=false ;;
++  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
++esac],[debug=false])
++AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
++
++dnl Support ib_extension build - if enable-ext-type == ib 
++AC_ARG_ENABLE(ext-type,
++[  --enable-ext-type Enable extensions support for library: ib, none, default=ib],
++ [ if   test "x$enableval" = "xib" ; then
++      ext_type=ib
++   elif test "x$enableval" = "xnone" ; then
++      ext_type=none
++   else
++      echo
++      echo "Error!"
++      echo "Unknown extension type' type"
++      exit -1
++   fi
++ ],[ext_type=ib])
++AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib")
++
++dnl Check for Redhat EL release 4
++AC_CACHE_CHECK(Check for RHEL4 system, ac_cv_rhel4,
++    if test -f /etc/redhat-release &&
++       test -n "`grep -e "release 4" /etc/redhat-release`"; then
++        ac_cv_rhel4=yes
++    else
++        ac_cv_rhel4=no
++    fi)
++AM_CONDITIONAL(OS_RHEL4, test "$ac_cv_rhel4" = "yes")
++
++dnl Check for Redhat EL release 5
++AC_CACHE_CHECK(Check for RHEL5 system, ac_cv_rhel5,
++    if test -f /etc/redhat-release &&
++       test -n "`grep -e "release 5" /etc/redhat-release`"; then
++        ac_cv_rhel5=yes
++    else
++        ac_cv_rhel5=no
++    fi)
++AM_CONDITIONAL(OS_RHEL5, test "$ac_cv_rhel5" = "yes")
++
++dnl Check for SuSE release 11
++AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11,
++    if test -f /etc/SuSE-release &&
++       test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then
++        ac_cv_suse11=yes
++    else
++        ac_cv_suse11=no
++    fi)
++AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes")
++
++AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec])
++
++AC_OUTPUT
+diff --git a/trunk/ulp/dapl2/dapl.spec.in b/trunk/ulp/dapl2/dapl.spec.in
+index 8872660..7867726 100644
+--- a/trunk/ulp/dapl2/dapl.spec.in
++++ b/trunk/ulp/dapl2/dapl.spec.in
+@@ -1,238 +1,238 @@
+-# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
+-# Copyright (c) 2007, Intel Corporation. All rights reserved.\r
+-#\r
+-# This Software is licensed under one of the following licenses:\r
+-#\r
+-# 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+-#    in the file LICENSE.txt in the root directory. The license is also\r
+-#    available from the Open Source Initiative, see\r
+-#    http://www.opensource.org/licenses/cpl.php.\r
+-#\r
+-# 2) under the terms of the "The BSD License" a copy of which is in the file\r
+-#    LICENSE2.txt in the root directory. The license is also available from\r
+-#    the Open Source Initiative, see\r
+-#    http://www.opensource.org/licenses/bsd-license.php.\r
+-#\r
+-# 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
+-#    copy of which is in the file LICENSE3.txt in the root directory. The \r
+-#    license is also available from the Open Source Initiative, see\r
+-#    http://www.opensource.org/licenses/gpl-license.php.\r
+-#\r
+-# Licensee has the right to choose one of the above licenses.\r
+-#\r
+-# Redistributions of source code must retain the above copyright\r
+-# notice and one of the license notices.\r
+-#\r
+-# Redistributions in binary form must reproduce both the above copyright\r
+-# notice, one of the license notices in the documentation\r
+-# and/or other materials provided with the distribution.\r
+-#\r
+-#\r
+-# uDAT and uDAPL 2.0 Registry RPM SPEC file\r
+-#\r
+-# $Id: $\r
+-Name: dapl\r
+-Version: @VERSION@\r
+-Release: 1%{?dist}\r
+-Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs.\r
+-\r
+-Group: System Environment/Libraries\r
+-License: Dual GPL/BSD/CPL\r
+-Url: http://openfabrics.org/\r
+-Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz\r
+-BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)\r
+-Requires(post): /sbin/ldconfig\r
+-Requires(postun): /sbin/ldconfig\r
+-Requires(post): sed\r
+-Requires(post): coreutils\r
+-\r
+-%description\r
+-Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace\r
+-RDMA API that supports DAT 2.0 specification and IB transport extensions for\r
+-atomic operations and rdma write with immediate data.\r
+-\r
+-%package devel\r
+-Summary: Development files for the libdat and libdapl libraries\r
+-Group: System Environment/Libraries\r
+-\r
+-%description devel\r
+-Header files for libdat and libdapl library.\r
+-\r
+-%package devel-static\r
+-Summary: Static development files for libdat and libdapl library\r
+-Group: System Environment/Libraries\r
+- \r
+-%description devel-static\r
+-Static libraries for libdat and libdapl library.\r
+-\r
+-%package utils\r
+-Summary: Test suites for uDAPL library\r
+-Group: System Environment/Libraries\r
+-Requires: %{name} = %{version}-%{release}\r
+-\r
+-%description utils\r
+-Useful test suites to validate uDAPL library API's.\r
+-\r
+-%prep\r
+-%setup -q\r
+-\r
+-%build\r
+-%configure --enable-ext-type=ib \r
+-make %{?_smp_mflags}\r
+-\r
+-%install\r
+-rm -rf %{buildroot}\r
+-make DESTDIR=%{buildroot} install\r
+-# remove unpackaged files from the buildroot\r
+-rm -f %{buildroot}%{_libdir}/*.la\r
+-rm -f %{buildroot}%{_sysconfdir}/*.conf\r
+-\r
+-%clean\r
+-rm -rf %{buildroot}\r
+-\r
+-%post \r
+-/sbin/ldconfig\r
+-if [ -e %{_sysconfdir}/dat.conf ]; then\r
+-    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl\r
+-    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf\r
+-fi\r
+-echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mthca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-mthca0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth3 0" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
+-echo ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
+-\r
+-%postun \r
+-/sbin/ldconfig\r
+-if [ -e %{_sysconfdir}/dat.conf ]; then\r
+-    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl\r
+-    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf\r
+-fi\r
+-\r
+-%files\r
+-%defattr(-,root,root,-)\r
+-%{_libdir}/libda*.so.*\r
+-%doc AUTHORS README COPYING ChangeLog LICENSE.txt LICENSE2.txt LICENSE3.txt\r
+-\r
+-%files devel\r
+-%defattr(-,root,root,-)\r
+-%{_libdir}/*.so\r
+-%dir %{_includedir}/dat2\r
+-%{_includedir}/dat2/*\r
+-\r
+-%files devel-static\r
+-%defattr(-,root,root,-)\r
+-%{_libdir}/*.a\r
+-\r
+-%files utils\r
+-%defattr(-,root,root,-)\r
+-%{_bindir}/*\r
+-%{_mandir}/man1/*.1*\r
+-%{_mandir}/man5/*.5*\r
+-\r
+-%changelog\r
+-* Mon Aug 9 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.30\r
+-- DAT/DAPL Version 2.0.30 Release 1, OFED 1.5.2 RC4 \r
+-\r
+-* Thu Jun 17 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.29\r
+-- DAT/DAPL Version 2.0.29 Release 1, OFED 1.5.2 RC2 \r
+-\r
+-* Mon May 24 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.28\r
+-- DAT/DAPL Version 2.0.28 Release 1, OFED 1.5.2 RC1 \r
+-\r
+-* Tue Feb 23 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.27\r
+-- DAT/DAPL Version 2.0.27 Release 1, OFED 1.5.1  \r
+-\r
+-* Tue Jan 11 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.26\r
+-- DAT/DAPL Version 2.0.26 Release 1, OFED 1.5, OFED 1.5-RDMAoE  \r
+-\r
+-* Tue Nov 24 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.25\r
+-- DAT/DAPL Version 2.0.25 Release 1, OFED 1.5 RC3 \r
+-\r
+-* Fri Oct 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.24\r
+-- DAT/DAPL Version 2.0.24 Release 1, OFED 1.5 RC2 \r
+-\r
+-* Fri Oct 2 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.23\r
+-- DAT/DAPL Version 2.0.23 Release 1, OFED 1.5 RC1 \r
+-\r
+-* Wed Aug 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.22\r
+-- DAT/DAPL Version 2.0.22 Release 1, OFED 1.5 ALPHA new UCM provider \r
+-\r
+-* Wed Aug 5 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.21\r
+-- DAT/DAPL Version 2.0.21 Release 1, WinOF 2.1, OFED 1.4.1+  \r
+-\r
+-* Fri Jun 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.20\r
+-- DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes \r
+-\r
+-* Thu Apr 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.19\r
+-- DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final \r
+-\r
+-* Fri Apr 17 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.18\r
+-- DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA \r
+-\r
+-* Tue Mar 31 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.17\r
+-- DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA\r
+-\r
+-* Mon Mar 16 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.16\r
+-- DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 \r
+-\r
+-* Fri Nov 07 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.15\r
+-- DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA\r
+-\r
+-* Fri Oct 03 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.14\r
+-- DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3\r
+-\r
+-* Mon Sep 01 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.13\r
+-- DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1\r
+-\r
+-* Thu Aug 21 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.12\r
+-- DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta\r
+-\r
+-* Sun Jul 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.11\r
+-- DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider \r
+-\r
+-* Tue Jun 23 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.10\r
+-- DAT/DAPL Version 2.0.10 Release 1, socket CM provider \r
+-\r
+-* Tue May 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.9\r
+-- DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA  \r
+-\r
+-* Thu May 1 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.8\r
+-- DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1  \r
+-\r
+-* Thu Feb 14 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.7\r
+-- DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA \r
+-\r
+-* Mon Feb 04 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.6\r
+-- DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4\r
+-\r
+-* Tue Jan 29 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.5\r
+-- DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3\r
+-\r
+-* Thu Jan 17 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.4\r
+-- DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2\r
+-\r
+-* Tue Nov 20 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.3\r
+-- DAT/DAPL Version 2.0.3 Release 1\r
+-\r
+-* Tue Oct 30 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.2\r
+-- DAT/DAPL Version 2.0.2 Release 1\r
+-\r
+-* Tue Sep 18 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.1-1\r
+-- OFED 1.3-alpha, co-exist with DAT 1.2 library package.  \r
+-\r
+-* Wed Mar 7 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.0.pre\r
+-- Initial release of DAT 2.0 APIs, includes IB extensions \r
++# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
++# Copyright (c) 2007, Intel Corporation. All rights reserved.
++#
++# This Software is licensed under one of the following licenses:
++#
++# 1) under the terms of the "Common Public License 1.0" a copy of which is
++#    in the file LICENSE.txt in the root directory. The license is also
++#    available from the Open Source Initiative, see
++#    http://www.opensource.org/licenses/cpl.php.
++#
++# 2) under the terms of the "The BSD License" a copy of which is in the file
++#    LICENSE2.txt in the root directory. The license is also available from
++#    the Open Source Initiative, see
++#    http://www.opensource.org/licenses/bsd-license.php.
++#
++# 3) under the terms of the "GNU General Public License (GPL) Version 2" a 
++#    copy of which is in the file LICENSE3.txt in the root directory. The 
++#    license is also available from the Open Source Initiative, see
++#    http://www.opensource.org/licenses/gpl-license.php.
++#
++# Licensee has the right to choose one of the above licenses.
++#
++# Redistributions of source code must retain the above copyright
++# notice and one of the license notices.
++#
++# Redistributions in binary form must reproduce both the above copyright
++# notice, one of the license notices in the documentation
++# and/or other materials provided with the distribution.
++#
++#
++# uDAT and uDAPL 2.0 Registry RPM SPEC file
++#
++# $Id: $
++Name: dapl
++Version: @VERSION@
++Release: 1%{?dist}
++Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs.
++
++Group: System Environment/Libraries
++License: Dual GPL/BSD/CPL
++Url: http://openfabrics.org/
++Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz
++BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
++Requires(post): /sbin/ldconfig
++Requires(postun): /sbin/ldconfig
++Requires(post): sed
++Requires(post): coreutils
++
++%description
++Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace
++RDMA API that supports DAT 2.0 specification and IB transport extensions for
++atomic operations and rdma write with immediate data.
++
++%package devel
++Summary: Development files for the libdat and libdapl libraries
++Group: System Environment/Libraries
++
++%description devel
++Header files for libdat and libdapl library.
++
++%package devel-static
++Summary: Static development files for libdat and libdapl library
++Group: System Environment/Libraries
++ 
++%description devel-static
++Static libraries for libdat and libdapl library.
++
++%package utils
++Summary: Test suites for uDAPL library
++Group: System Environment/Libraries
++Requires: %{name} = %{version}-%{release}
++
++%description utils
++Useful test suites to validate uDAPL library API's.
++
++%prep
++%setup -q
++
++%build
++%configure --enable-ext-type=ib 
++make %{?_smp_mflags}
++
++%install
++rm -rf %{buildroot}
++make DESTDIR=%{buildroot} install
++# remove unpackaged files from the buildroot
++rm -f %{buildroot}%{_libdir}/*.la
++rm -f %{buildroot}%{_sysconfdir}/*.conf
++
++%clean
++rm -rf %{buildroot}
++
++%post 
++/sbin/ldconfig
++if [ -e %{_sysconfdir}/dat.conf ]; then
++    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl
++    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf
++fi
++echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mthca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-mthca0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth3 0" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
++echo ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
++
++%postun 
++/sbin/ldconfig
++if [ -e %{_sysconfdir}/dat.conf ]; then
++    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl
++    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf
++fi
++
++%files
++%defattr(-,root,root,-)
++%{_libdir}/libda*.so.*
++%doc AUTHORS README COPYING ChangeLog LICENSE.txt LICENSE2.txt LICENSE3.txt
++
++%files devel
++%defattr(-,root,root,-)
++%{_libdir}/*.so
++%dir %{_includedir}/dat2
++%{_includedir}/dat2/*
++
++%files devel-static
++%defattr(-,root,root,-)
++%{_libdir}/*.a
++
++%files utils
++%defattr(-,root,root,-)
++%{_bindir}/*
++%{_mandir}/man1/*.1*
++%{_mandir}/man5/*.5*
++
++%changelog
++* Mon Aug 9 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.30
++- DAT/DAPL Version 2.0.30 Release 1, OFED 1.5.2 RC4 
++
++* Thu Jun 17 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.29
++- DAT/DAPL Version 2.0.29 Release 1, OFED 1.5.2 RC2 
++
++* Mon May 24 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.28
++- DAT/DAPL Version 2.0.28 Release 1, OFED 1.5.2 RC1 
++
++* Tue Feb 23 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.27
++- DAT/DAPL Version 2.0.27 Release 1, OFED 1.5.1  
++
++* Tue Jan 11 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.26
++- DAT/DAPL Version 2.0.26 Release 1, OFED 1.5, OFED 1.5-RDMAoE  
++
++* Tue Nov 24 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.25
++- DAT/DAPL Version 2.0.25 Release 1, OFED 1.5 RC3 
++
++* Fri Oct 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.24
++- DAT/DAPL Version 2.0.24 Release 1, OFED 1.5 RC2 
++
++* Fri Oct 2 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.23
++- DAT/DAPL Version 2.0.23 Release 1, OFED 1.5 RC1 
++
++* Wed Aug 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.22
++- DAT/DAPL Version 2.0.22 Release 1, OFED 1.5 ALPHA new UCM provider 
++
++* Wed Aug 5 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.21
++- DAT/DAPL Version 2.0.21 Release 1, WinOF 2.1, OFED 1.4.1+  
++
++* Fri Jun 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.20
++- DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes 
++
++* Thu Apr 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.19
++- DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final 
++
++* Fri Apr 17 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.18
++- DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA 
++
++* Tue Mar 31 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.17
++- DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA
++
++* Mon Mar 16 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.16
++- DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 
++
++* Fri Nov 07 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.15
++- DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA
++
++* Fri Oct 03 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.14
++- DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3
++
++* Mon Sep 01 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.13
++- DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1
++
++* Thu Aug 21 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.12
++- DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta
++
++* Sun Jul 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.11
++- DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider 
++
++* Tue Jun 23 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.10
++- DAT/DAPL Version 2.0.10 Release 1, socket CM provider 
++
++* Tue May 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.9
++- DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA  
++
++* Thu May 1 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.8
++- DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1  
++
++* Thu Feb 14 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.7
++- DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA 
++
++* Mon Feb 04 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.6
++- DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4
++
++* Tue Jan 29 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.5
++- DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3
++
++* Thu Jan 17 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.4
++- DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2
++
++* Tue Nov 20 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.3
++- DAT/DAPL Version 2.0.3 Release 1
++
++* Tue Oct 30 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.2
++- DAT/DAPL Version 2.0.2 Release 1
++
++* Tue Sep 18 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.1-1
++- OFED 1.3-alpha, co-exist with DAT 1.2 library package.  
++
++* Wed Mar 7 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.0.pre
++- Initial release of DAT 2.0 APIs, includes IB extensions 
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c b/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c
+index 2215f29..cad9747 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c
+@@ -148,9 +148,6 @@ void dapl_cno_dealloc(IN DAPL_CNO * cno_ptr)
+ void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr)
+ {
+       DAT_RETURN dat_status;
+-#if defined(__KDAPL__)
+-      DAT_EVENT event;
+-#endif                                /* defined(__KDAPL__) */
+       dat_status = DAT_SUCCESS;
+@@ -167,20 +164,14 @@ void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr)
+       dapl_os_assert(cno_ptr->cno_state != DAPL_CNO_STATE_DEAD);
+       if (cno_ptr->cno_state == DAPL_CNO_STATE_UNTRIGGERED) {
+-#if !defined(__KDAPL__)
+               DAT_OS_WAIT_PROXY_AGENT agent;
+               /* Squirrel away wait agent, and delete link.  */
+               agent = cno_ptr->cno_wait_agent;
+-#endif                                /* !defined(__KDAPL__) */
+               /* Separate assignments for windows compiler.  */
+ #ifndef _WIN32
+-#if defined(__KDAPL__)
+-              cno_ptr->cno_upcall = DAT_UPCALL_NULL;
+-#else
+               cno_ptr->cno_wait_agent = DAT_OS_WAIT_PROXY_AGENT_NULL;
+-#endif                                /* defined(__KDAPL__) */
+ #else
+               cno_ptr->cno_wait_agent.instance_data = NULL;
+               cno_ptr->cno_wait_agent.proxy_agent_func = NULL;
+@@ -200,43 +191,12 @@ void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr)
+               dapl_os_unlock(&cno_ptr->header.lock);
+               /* Trigger the OS proxy wait agent, if one exists.  */
+-#if defined(__KDAPL__)
+-              dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr, &event);
+-              while (dat_status == DAT_SUCCESS) {
+-                      if (cno_ptr->cno_upcall.upcall_func !=
+-                          (DAT_UPCALL_FUNC) NULL) {
+-                              cno_ptr->cno_upcall.upcall_func(cno_ptr->
+-                                                              cno_upcall.
+-                                                              instance_data,
+-                                                              &event,
+-                                                              DAT_FALSE);
+-                      }
+-                      dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr,
+-                                                    &event);
+-              }
+-#else
+               if (agent.proxy_agent_func != (DAT_AGENT_FUNC) NULL) {
+                       agent.proxy_agent_func(agent.instance_data,
+                                              (DAT_EVD_HANDLE) evd_ptr);
+               }
+-#endif                                /* defined(__KDAPL__) */
+       } else {
+               dapl_os_unlock(&cno_ptr->header.lock);
+-#if defined(__KDAPL__)
+-              dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr, &event);
+-              while (dat_status == DAT_SUCCESS) {
+-                      if (cno_ptr->cno_upcall.upcall_func !=
+-                          (DAT_UPCALL_FUNC) NULL) {
+-                              cno_ptr->cno_upcall.upcall_func(cno_ptr->
+-                                                              cno_upcall.
+-                                                              instance_data,
+-                                                              &event,
+-                                                              DAT_FALSE);
+-                      }
+-                      dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr,
+-                                                    &event);
+-              }
+-#endif                                /* defined(__KDAPL__) */
+       }
+       return;
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
+index 0719c03..80afead 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
+@@ -1,408 +1,408 @@
+-/*\r
+- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
+- *\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-/**********************************************************************\r
+- *\r
+- * MODULE: dapl_ep_connect.c\r
+- *\r
+- * PURPOSE: Endpoint management\r
+- *\r
+- * $Id:$\r
+- **********************************************************************/\r
+-\r
+-#include "dapl.h"\r
+-#include "dapl_ep_util.h"\r
+-#include "dapl_adapter_util.h"\r
+-#include "dapl_evd_util.h"\r
+-#include "dapl_timer_util.h"\r
+-\r
+-/*\r
+- * dapl_ep_connect\r
+- *\r
+- * Request a connection be established between the local Endpoint\r
+- * and a remote Endpoint. This operation is used by the active/client\r
+- * side of a connection\r
+- *\r
+- * Input:\r
+- *    ep_handle\r
+- *    remote_ia_address\r
+- *    remote_conn_qual\r
+- *    timeout\r
+- *    private_data_size\r
+- *    privaet_data\r
+- *    qos\r
+- *    connect_flags\r
+- *\r
+- * Output:\r
+- *    None\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOUCRES\r
+- *    DAT_INVALID_PARAMETER\r
+- *    DAT_MODLE_NOT_SUPPORTED\r
+- */\r
+-DAT_RETURN DAT_API\r
+-dapl_ep_connect(IN DAT_EP_HANDLE ep_handle,\r
+-              IN DAT_IA_ADDRESS_PTR remote_ia_address,\r
+-              IN DAT_CONN_QUAL remote_conn_qual,\r
+-              IN DAT_TIMEOUT timeout,\r
+-              IN DAT_COUNT private_data_size,\r
+-              IN const DAT_PVOID private_data,\r
+-              IN DAT_QOS qos, IN DAT_CONNECT_FLAGS connect_flags)\r
+-{\r
+-      DAPL_EP *ep_ptr;\r
+-      DAPL_EP alloc_ep;\r
+-      DAT_RETURN dat_status;\r
+-      DAT_COUNT req_hdr_size;\r
+-      void *private_data_ptr;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM,\r
+-                   "dapl_ep_connect (%p, {%u.%u.%u.%u}, %X, %d, %d, %p, %x, %x)\n",\r
+-                   ep_handle,\r
+-                   remote_ia_address->sa_data[2],\r
+-                   remote_ia_address->sa_data[3],\r
+-                   remote_ia_address->sa_data[4],\r
+-                   remote_ia_address->sa_data[5],\r
+-                   remote_conn_qual,\r
+-                   timeout,\r
+-                   private_data_size, private_data, qos, connect_flags);\r
+-\r
+-      dat_status = DAT_SUCCESS;\r
+-      ep_ptr = (DAPL_EP *) ep_handle;\r
+-\r
+-      /*\r
+-       * Verify parameter & state. The connection handle must be good\r
+-       * at this point.\r
+-       */\r
+-      if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) {\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      if (DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)) {\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* Can't do a connection in 0 time, reject outright */\r
+-      if (timeout == 0) {\r
+-              dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);\r
+-              goto bail;\r
+-      }\r
+-      DAPL_CNTR(ep_ptr, DCNT_EP_CONNECT);\r
+-\r
+-      /*\r
+-       * If the endpoint needs a QP, associated the QP with it.\r
+-       * This needs to be done carefully, in order to:\r
+-       *  * Avoid allocating under a lock.\r
+-       *  * Not step on data structures being altered by\r
+-       *    routines with which we are racing.\r
+-       * So we:\r
+-       *  * Confirm that a new QP is needed and is not forbidden by the\r
+-       *    current state.\r
+-       *  * Allocate it into a separate EP.\r
+-       *  * Take the EP lock.\r
+-       *  * Reconfirm that the EP is in a state where it needs a QP.\r
+-       *  * Assign the QP and release the lock.\r
+-       */\r
+-      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+-              if (ep_ptr->param.pz_handle == NULL\r
+-                  || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ))\r
+-              {\r
+-                      dat_status =\r
+-                          DAT_ERROR(DAT_INVALID_STATE,\r
+-                                    DAT_INVALID_STATE_EP_NOTREADY);\r
+-                      goto bail;\r
+-              }\r
+-              alloc_ep = *ep_ptr;\r
+-\r
+-              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
+-                                             &alloc_ep, ep_ptr);\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      dat_status =\r
+-                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                                    DAT_RESOURCE_MEMORY);\r
+-                      goto bail;\r
+-              }\r
+-\r
+-              dapl_os_lock(&ep_ptr->header.lock);\r
+-              /*\r
+-               * PZ shouldn't have changed since we're only racing with\r
+-               * dapl_cr_accept()\r
+-               */\r
+-              if (ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED) {\r
+-                      /* Bail, cleaning up.  */\r
+-                      dapl_os_unlock(&ep_ptr->header.lock);\r
+-                      dat_status = dapls_ib_qp_free(ep_ptr->header.owner_ia,\r
+-                                                    &alloc_ep);\r
+-                      if (dat_status != DAT_SUCCESS) {\r
+-                              dapl_dbg_log(DAPL_DBG_TYPE_WARN,\r
+-                                           "ep_connect: ib_qp_free failed with %x\n",\r
+-                                           dat_status);\r
+-                      }\r
+-                      dat_status =\r
+-                          DAT_ERROR(DAT_INVALID_STATE,\r
+-                                    dapls_ep_state_subtype(ep_ptr));\r
+-                      goto bail;\r
+-              }\r
+-\r
+-              ep_ptr->qp_handle = alloc_ep.qp_handle;\r
+-              ep_ptr->qpn = alloc_ep.qpn;\r
+-              ep_ptr->qp_state = alloc_ep.qp_state;\r
+-\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-      }\r
+-\r
+-      /*\r
+-       * We do state checks and transitions under lock.\r
+-       * The only code we're racing against is dapl_cr_accept.\r
+-       */\r
+-      dapl_os_lock(&ep_ptr->header.lock);\r
+-\r
+-      /*\r
+-       * Verify the attributes of the EP handle before we connect it. Test\r
+-       * all of the handles to make sure they are currently valid.\r
+-       * Specifically:\r
+-       *   pz_handle              required\r
+-       *   recv_evd_handle        optional, but must be valid\r
+-       *   request_evd_handle     optional, but must be valid\r
+-       *   connect_evd_handle     required\r
+-       */\r
+-      if (ep_ptr->param.pz_handle == NULL\r
+-          || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)\r
+-          /* test connect handle */\r
+-          || ep_ptr->param.connect_evd_handle == NULL\r
+-          || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)\r
+-          || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)->\r
+-               evd_flags & DAT_EVD_CONNECTION_FLAG)\r
+-          /* test optional completion handles */\r
+-          || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL &&\r
+-              (DAPL_BAD_HANDLE\r
+-               (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD)))\r
+-          || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL\r
+-              &&\r
+-              (DAPL_BAD_HANDLE\r
+-               (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) {\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_NOTREADY);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* Check both the EP state and the QP state: if we don't have a QP\r
+-       *  we need to attach one now.\r
+-       */\r
+-      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+-              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
+-                                             ep_ptr, ep_ptr);\r
+-\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      dapl_os_unlock(&ep_ptr->header.lock);\r
+-                      dat_status =\r
+-                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                                    DAT_RESOURCE_TEP);\r
+-                      goto bail;\r
+-              }\r
+-      }\r
+-\r
+-      if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED &&\r
+-          ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INVALID_STATE,\r
+-                            dapls_ep_state_subtype(ep_ptr));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      if (qos != DAT_QOS_BEST_EFFORT ||\r
+-          connect_flags != DAT_CONNECT_DEFAULT_FLAG) {\r
+-              /*\r
+-               * At this point we only support one QOS level\r
+-               */\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              dat_status = DAT_ERROR(DAT_MODEL_NOT_SUPPORTED, 0);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /*\r
+-       * Verify the private data size doesn't exceed the max\r
+-       * req_hdr_size will evaluate to 0 unless IBHOSTS_NAMING is enabled.\r
+-       */\r
+-      req_hdr_size = (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE);\r
+-\r
+-      /* transition the state before requesting a connection to avoid\r
+-       * race conditions\r
+-       */\r
+-      ep_ptr->param.ep_state = DAT_EP_STATE_ACTIVE_CONNECTION_PENDING;\r
+-\r
+-      /*\r
+-       * At this point we're committed, and done with the endpoint\r
+-       * except for the connect, so we can drop the lock.\r
+-       */\r
+-      dapl_os_unlock(&ep_ptr->header.lock);\r
+-\r
+-#ifdef IBHOSTS_NAMING\r
+-      /*\r
+-       * Special case: put the remote HCA address into the private data\r
+-       * prefix. This is a spec violation as it introduces a protocol, but\r
+-       * some implementations may find it necessary for a time.\r
+-       * Copy the private data into the EP area so the data is contiguous.\r
+-       * If the provider needs to pad the buffer with NULLs, it happens at\r
+-       * the provider layer.\r
+-       */\r
+-      dapl_os_memcpy(&ep_ptr->hca_address,\r
+-                     &ep_ptr->header.owner_ia->hca_ptr->hca_address,\r
+-                     sizeof(DAT_SOCK_ADDR));\r
+-      dapl_os_memcpy(ep_ptr->private.private_data, private_data,\r
+-                     private_data_size);\r
+-      private_data_ptr = (void *)&ep_ptr->private.private_data;\r
+-#else\r
+-      private_data_ptr = private_data;\r
+-#endif                                /* IBHOSTS_NAMING */\r
+-\r
+-      /* Copy the connection qualifiers */\r
+-      dapl_os_memcpy(ep_ptr->param.remote_ia_address_ptr,\r
+-                     remote_ia_address, sizeof(DAT_SOCK_ADDR));\r
+-      ep_ptr->param.remote_port_qual = remote_conn_qual;\r
+-\r
+-      dat_status = dapls_ib_connect(ep_handle,\r
+-                                    remote_ia_address,\r
+-                                    remote_conn_qual,\r
+-                                    private_data_size + req_hdr_size,\r
+-                                    private_data_ptr);\r
+-\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED;\r
+-\r
+-              /*\r
+-               * Some implementations provide us with an error code that the\r
+-               * remote destination is unreachable, but DAT doesn't have a\r
+-               * synchronous error code to communicate this. So the provider\r
+-               * layer generates an INTERNAL_ERROR with a subtype; when\r
+-               * this happens, return SUCCESS and generate the event\r
+-               */\r
+-              if (dat_status == DAT_ERROR(DAT_INTERNAL_ERROR, 1)) {\r
+-                      dapls_evd_post_connection_event((DAPL_EVD *) ep_ptr->\r
+-                                                      param.\r
+-                                                      connect_evd_handle,\r
+-                                                      DAT_CONNECTION_EVENT_UNREACHABLE,\r
+-                                                      (DAT_HANDLE) ep_ptr, 0,\r
+-                                                      0);\r
+-                      dat_status = DAT_SUCCESS;\r
+-              }\r
+-      } else {\r
+-              /*\r
+-               * Acquire the lock and recheck the state of the EP; this\r
+-               * thread could have been descheduled after issuing the connect\r
+-               * request and the EP is now connected. Set up a timer if\r
+-               * necessary.\r
+-               */\r
+-              dapl_os_lock(&ep_ptr->header.lock);\r
+-              if (ep_ptr->param.ep_state ==\r
+-                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING\r
+-                  && timeout != DAT_TIMEOUT_INFINITE &&\r
+-                  ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
+-                      ep_ptr->cxn_timer =\r
+-                          (DAPL_OS_TIMER *)\r
+-                          dapl_os_alloc(sizeof(DAPL_OS_TIMER));\r
+-\r
+-                      dapls_timer_set(ep_ptr->cxn_timer,\r
+-                                      dapls_ep_timeout, ep_ptr, timeout);\r
+-\r
+-                      dapl_log(DAPL_DBG_TYPE_EP, " dapl_ep_connect timeout = %d us\n", timeout);\r
+-              }\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-      }\r
+-\r
+-      bail:\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,\r
+-                   "dapl_ep_connect () returns 0x%x\n", dat_status);\r
+-\r
+-      return dat_status;\r
+-}\r
+-\r
+-/*\r
+- * dapl_ep_common_connect\r
+- *\r
+- * DAPL Requirements Version 2.0, 6.6.x\r
+- *\r
+- * Requests that a connection be established\r
+- * between the local Endpoint and a remote Endpoint specified by the\r
+- * remote_ia_address. This operation is used by the active/client side\r
+- * Consumer of the Connection establishment model.\r
+- *\r
+- * EP must be properly configured for this operation. The EP Communicator\r
+- * must be specified. As part of the successful completion of this operation,\r
+- * the local Endpoint is bound to a local IA Address if it had these assigned\r
+- * before.\r
+- * \r
+- * The local IP Address, port and protocol are passed to the remote side of\r
+- * the requested connection and is available to the remote Consumer in the\r
+- * Connection Request of the DAT_CONNECTION_REQUEST_EVENT.\r
+- * \r
+- * The Consumer-provided private_data is passed to the remote side and is\r
+- * provided to the remote Consumer in the Connection Request. Consumers\r
+- * can encapsulate any local Endpoint attributes that remote Consumers\r
+- * need to know as part of an upper-level protocol.\r
+- *\r
+- * Input:\r
+- *    ep_handle\r
+- *    remote_ia_address\r
+- *    timeout\r
+- *    private_data_size\r
+- *    private_date pointer\r
+- *\r
+- * Output:\r
+- *    none\r
+- * \r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INVALID_PARAMETER\r
+- *    DAT_INVALID_HANDLE\r
+- *    DAT_INVALID_STATE\r
+- *    DAT_MODEL_NOT_SUPPORTED\r
+- */\r
+-DAT_RETURN DAT_API dapl_ep_common_connect(IN DAT_EP_HANDLE ep,        /* ep_handle            */\r
+-                                        IN DAT_IA_ADDRESS_PTR remote_addr,    /* remote_ia_address    */\r
+-                                        IN DAT_TIMEOUT timeout,       /* timeout              */\r
+-                                        IN DAT_COUNT pdata_size,      /* private_data_size    */\r
+-                                        IN const DAT_PVOID pdata)\r
+-{                             /* private_data         */\r
+-      return DAT_MODEL_NOT_SUPPORTED;\r
+-}\r
+-\r
+-/*\r
+- * Local variables:\r
+- *  c-indent-level: 4\r
+- *  c-basic-offset: 4\r
+- *  tab-width: 8\r
+- * End:\r
+- */\r
++/*
++ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
++ *
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++/**********************************************************************
++ *
++ * MODULE: dapl_ep_connect.c
++ *
++ * PURPOSE: Endpoint management
++ *
++ * $Id:$
++ **********************************************************************/
++
++#include "dapl.h"
++#include "dapl_ep_util.h"
++#include "dapl_adapter_util.h"
++#include "dapl_evd_util.h"
++#include "dapl_timer_util.h"
++
++/*
++ * dapl_ep_connect
++ *
++ * Request a connection be established between the local Endpoint
++ * and a remote Endpoint. This operation is used by the active/client
++ * side of a connection
++ *
++ * Input:
++ *    ep_handle
++ *    remote_ia_address
++ *    remote_conn_qual
++ *    timeout
++ *    private_data_size
++ *    privaet_data
++ *    qos
++ *    connect_flags
++ *
++ * Output:
++ *    None
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOUCRES
++ *    DAT_INVALID_PARAMETER
++ *    DAT_MODLE_NOT_SUPPORTED
++ */
++DAT_RETURN DAT_API
++dapl_ep_connect(IN DAT_EP_HANDLE ep_handle,
++              IN DAT_IA_ADDRESS_PTR remote_ia_address,
++              IN DAT_CONN_QUAL remote_conn_qual,
++              IN DAT_TIMEOUT timeout,
++              IN DAT_COUNT private_data_size,
++              IN const DAT_PVOID private_data,
++              IN DAT_QOS qos, IN DAT_CONNECT_FLAGS connect_flags)
++{
++      DAPL_EP *ep_ptr;
++      DAPL_EP alloc_ep;
++      DAT_RETURN dat_status;
++      DAT_COUNT req_hdr_size;
++      void *private_data_ptr;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM,
++                   "dapl_ep_connect (%p, {%u.%u.%u.%u}, %X, %d, %d, %p, %x, %x)\n",
++                   ep_handle,
++                   remote_ia_address->sa_data[2],
++                   remote_ia_address->sa_data[3],
++                   remote_ia_address->sa_data[4],
++                   remote_ia_address->sa_data[5],
++                   remote_conn_qual,
++                   timeout,
++                   private_data_size, private_data, qos, connect_flags);
++
++      dat_status = DAT_SUCCESS;
++      ep_ptr = (DAPL_EP *) ep_handle;
++
++      /*
++       * Verify parameter & state. The connection handle must be good
++       * at this point.
++       */
++      if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) {
++              dat_status =
++                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
++              goto bail;
++      }
++
++      if (DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)) {
++              dat_status =
++                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN);
++              goto bail;
++      }
++
++      /* Can't do a connection in 0 time, reject outright */
++      if (timeout == 0) {
++              dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
++              goto bail;
++      }
++      DAPL_CNTR(ep_ptr, DCNT_EP_CONNECT);
++
++      /*
++       * If the endpoint needs a QP, associated the QP with it.
++       * This needs to be done carefully, in order to:
++       *  * Avoid allocating under a lock.
++       *  * Not step on data structures being altered by
++       *    routines with which we are racing.
++       * So we:
++       *  * Confirm that a new QP is needed and is not forbidden by the
++       *    current state.
++       *  * Allocate it into a separate EP.
++       *  * Take the EP lock.
++       *  * Reconfirm that the EP is in a state where it needs a QP.
++       *  * Assign the QP and release the lock.
++       */
++      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
++              if (ep_ptr->param.pz_handle == NULL
++                  || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ))
++              {
++                      dat_status =
++                          DAT_ERROR(DAT_INVALID_STATE,
++                                    DAT_INVALID_STATE_EP_NOTREADY);
++                      goto bail;
++              }
++              alloc_ep = *ep_ptr;
++
++              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
++                                             &alloc_ep, ep_ptr);
++              if (dat_status != DAT_SUCCESS) {
++                      dat_status =
++                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
++                                    DAT_RESOURCE_MEMORY);
++                      goto bail;
++              }
++
++              dapl_os_lock(&ep_ptr->header.lock);
++              /*
++               * PZ shouldn't have changed since we're only racing with
++               * dapl_cr_accept()
++               */
++              if (ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED) {
++                      /* Bail, cleaning up.  */
++                      dapl_os_unlock(&ep_ptr->header.lock);
++                      dat_status = dapls_ib_qp_free(ep_ptr->header.owner_ia,
++                                                    &alloc_ep);
++                      if (dat_status != DAT_SUCCESS) {
++                              dapl_dbg_log(DAPL_DBG_TYPE_WARN,
++                                           "ep_connect: ib_qp_free failed with %x\n",
++                                           dat_status);
++                      }
++                      dat_status =
++                          DAT_ERROR(DAT_INVALID_STATE,
++                                    dapls_ep_state_subtype(ep_ptr));
++                      goto bail;
++              }
++
++              ep_ptr->qp_handle = alloc_ep.qp_handle;
++              ep_ptr->qpn = alloc_ep.qpn;
++              ep_ptr->qp_state = alloc_ep.qp_state;
++
++              dapl_os_unlock(&ep_ptr->header.lock);
++      }
++
++      /*
++       * We do state checks and transitions under lock.
++       * The only code we're racing against is dapl_cr_accept.
++       */
++      dapl_os_lock(&ep_ptr->header.lock);
++
++      /*
++       * Verify the attributes of the EP handle before we connect it. Test
++       * all of the handles to make sure they are currently valid.
++       * Specifically:
++       *   pz_handle              required
++       *   recv_evd_handle        optional, but must be valid
++       *   request_evd_handle     optional, but must be valid
++       *   connect_evd_handle     required
++       */
++      if (ep_ptr->param.pz_handle == NULL
++          || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)
++          /* test connect handle */
++          || ep_ptr->param.connect_evd_handle == NULL
++          || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)
++          || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)->
++               evd_flags & DAT_EVD_CONNECTION_FLAG)
++          /* test optional completion handles */
++          || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL &&
++              (DAPL_BAD_HANDLE
++               (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD)))
++          || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL
++              &&
++              (DAPL_BAD_HANDLE
++               (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) {
++              dapl_os_unlock(&ep_ptr->header.lock);
++              dat_status =
++                  DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_NOTREADY);
++              goto bail;
++      }
++
++      /* Check both the EP state and the QP state: if we don't have a QP
++       *  we need to attach one now.
++       */
++      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
++              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
++                                             ep_ptr, ep_ptr);
++
++              if (dat_status != DAT_SUCCESS) {
++                      dapl_os_unlock(&ep_ptr->header.lock);
++                      dat_status =
++                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
++                                    DAT_RESOURCE_TEP);
++                      goto bail;
++              }
++      }
++
++      if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED &&
++          ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
++              dapl_os_unlock(&ep_ptr->header.lock);
++              dat_status =
++                  DAT_ERROR(DAT_INVALID_STATE,
++                            dapls_ep_state_subtype(ep_ptr));
++              goto bail;
++      }
++
++      if (qos != DAT_QOS_BEST_EFFORT ||
++          connect_flags != DAT_CONNECT_DEFAULT_FLAG) {
++              /*
++               * At this point we only support one QOS level
++               */
++              dapl_os_unlock(&ep_ptr->header.lock);
++              dat_status = DAT_ERROR(DAT_MODEL_NOT_SUPPORTED, 0);
++              goto bail;
++      }
++
++      /*
++       * Verify the private data size doesn't exceed the max
++       * req_hdr_size will evaluate to 0 unless IBHOSTS_NAMING is enabled.
++       */
++      req_hdr_size = (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE);
++
++      /* transition the state before requesting a connection to avoid
++       * race conditions
++       */
++      ep_ptr->param.ep_state = DAT_EP_STATE_ACTIVE_CONNECTION_PENDING;
++
++      /*
++       * At this point we're committed, and done with the endpoint
++       * except for the connect, so we can drop the lock.
++       */
++      dapl_os_unlock(&ep_ptr->header.lock);
++
++#ifdef IBHOSTS_NAMING
++      /*
++       * Special case: put the remote HCA address into the private data
++       * prefix. This is a spec violation as it introduces a protocol, but
++       * some implementations may find it necessary for a time.
++       * Copy the private data into the EP area so the data is contiguous.
++       * If the provider needs to pad the buffer with NULLs, it happens at
++       * the provider layer.
++       */
++      dapl_os_memcpy(&ep_ptr->hca_address,
++                     &ep_ptr->header.owner_ia->hca_ptr->hca_address,
++                     sizeof(DAT_SOCK_ADDR));
++      dapl_os_memcpy(ep_ptr->private.private_data, private_data,
++                     private_data_size);
++      private_data_ptr = (void *)&ep_ptr->private.private_data;
++#else
++      private_data_ptr = private_data;
++#endif                                /* IBHOSTS_NAMING */
++
++      /* Copy the connection qualifiers */
++      dapl_os_memcpy(ep_ptr->param.remote_ia_address_ptr,
++                     remote_ia_address, sizeof(DAT_SOCK_ADDR));
++      ep_ptr->param.remote_port_qual = remote_conn_qual;
++
++      dat_status = dapls_ib_connect(ep_handle,
++                                    remote_ia_address,
++                                    remote_conn_qual,
++                                    private_data_size + req_hdr_size,
++                                    private_data_ptr);
++
++      if (dat_status != DAT_SUCCESS) {
++              ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED;
++
++              /*
++               * Some implementations provide us with an error code that the
++               * remote destination is unreachable, but DAT doesn't have a
++               * synchronous error code to communicate this. So the provider
++               * layer generates an INTERNAL_ERROR with a subtype; when
++               * this happens, return SUCCESS and generate the event
++               */
++              if (dat_status == DAT_ERROR(DAT_INTERNAL_ERROR, 1)) {
++                      dapls_evd_post_connection_event((DAPL_EVD *) ep_ptr->
++                                                      param.
++                                                      connect_evd_handle,
++                                                      DAT_CONNECTION_EVENT_UNREACHABLE,
++                                                      (DAT_HANDLE) ep_ptr, 0,
++                                                      0);
++                      dat_status = DAT_SUCCESS;
++              }
++      } else {
++              /*
++               * Acquire the lock and recheck the state of the EP; this
++               * thread could have been descheduled after issuing the connect
++               * request and the EP is now connected. Set up a timer if
++               * necessary.
++               */
++              dapl_os_lock(&ep_ptr->header.lock);
++              if (ep_ptr->param.ep_state ==
++                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING
++                  && timeout != DAT_TIMEOUT_INFINITE &&
++                  ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
++                      ep_ptr->cxn_timer =
++                          (DAPL_OS_TIMER *)
++                          dapl_os_alloc(sizeof(DAPL_OS_TIMER));
++
++                      dapls_timer_set(ep_ptr->cxn_timer,
++                                      dapls_ep_timeout, ep_ptr, timeout);
++
++                      dapl_log(DAPL_DBG_TYPE_EP, " dapl_ep_connect timeout = %d us\n", timeout);
++              }
++              dapl_os_unlock(&ep_ptr->header.lock);
++      }
++
++      bail:
++      dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,
++                   "dapl_ep_connect () returns 0x%x\n", dat_status);
++
++      return dat_status;
++}
++
++/*
++ * dapl_ep_common_connect
++ *
++ * DAPL Requirements Version 2.0, 6.6.x
++ *
++ * Requests that a connection be established
++ * between the local Endpoint and a remote Endpoint specified by the
++ * remote_ia_address. This operation is used by the active/client side
++ * Consumer of the Connection establishment model.
++ *
++ * EP must be properly configured for this operation. The EP Communicator
++ * must be specified. As part of the successful completion of this operation,
++ * the local Endpoint is bound to a local IA Address if it had these assigned
++ * before.
++ * 
++ * The local IP Address, port and protocol are passed to the remote side of
++ * the requested connection and is available to the remote Consumer in the
++ * Connection Request of the DAT_CONNECTION_REQUEST_EVENT.
++ * 
++ * The Consumer-provided private_data is passed to the remote side and is
++ * provided to the remote Consumer in the Connection Request. Consumers
++ * can encapsulate any local Endpoint attributes that remote Consumers
++ * need to know as part of an upper-level protocol.
++ *
++ * Input:
++ *    ep_handle
++ *    remote_ia_address
++ *    timeout
++ *    private_data_size
++ *    private_date pointer
++ *
++ * Output:
++ *    none
++ * 
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INVALID_PARAMETER
++ *    DAT_INVALID_HANDLE
++ *    DAT_INVALID_STATE
++ *    DAT_MODEL_NOT_SUPPORTED
++ */
++DAT_RETURN DAT_API dapl_ep_common_connect(IN DAT_EP_HANDLE ep,        /* ep_handle            */
++                                        IN DAT_IA_ADDRESS_PTR remote_addr,    /* remote_ia_address    */
++                                        IN DAT_TIMEOUT timeout,       /* timeout              */
++                                        IN DAT_COUNT pdata_size,      /* private_data_size    */
++                                        IN const DAT_PVOID pdata)
++{                             /* private_data         */
++      return DAT_MODEL_NOT_SUPPORTED;
++}
++
++/*
++ * Local variables:
++ *  c-indent-level: 4
++ *  c-basic-offset: 4
++ *  tab-width: 8
++ * End:
++ */
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c
+index 72da620..90748b0 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c
+@@ -165,6 +165,7 @@ dapl_ep_disconnect(IN DAT_EP_HANDLE ep_handle,
+       }
+       dapl_os_unlock(&ep_ptr->header.lock);
+       dat_status = dapls_ib_disconnect(ep_ptr, disconnect_flags);
++      dapls_ep_flush_cqs(ep_ptr);
+       bail:
+       dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c
+index 3bfc541..32d50cc 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c
+@@ -202,6 +202,8 @@ DAT_RETURN DAT_API dapl_ep_free(IN DAT_EP_HANDLE ep_handle)
+               }
+       }
++      dapls_ep_flush_cqs(ep_ptr);
++
+       /* Free the resource */
+       dapl_ep_dealloc(ep_ptr);
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
+index 9aff242..fc911a6 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
+@@ -606,6 +606,27 @@ void dapl_ep_unlink_cm(IN DAPL_EP *ep_ptr, IN dp_ib_cm_handle_t cm_ptr)
+       dapl_os_unlock(&ep_ptr->header.lock);
+ }
++static void dapli_ep_flush_evd(DAPL_EVD *evd_ptr)
++{
++      DAT_RETURN dat_status;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      dat_status = dapls_evd_copy_cq(evd_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++
++      if (dat_status == DAT_QUEUE_FULL)
++              dapls_evd_post_overflow_event(evd_ptr);
++}
++
++void dapls_ep_flush_cqs(DAPL_EP * ep_ptr)
++{
++      if (ep_ptr->param.request_evd_handle)
++              dapli_ep_flush_evd((DAPL_EVD *) ep_ptr->param.request_evd_handle);
++
++      if (ep_ptr->param.recv_evd_handle)
++              dapli_ep_flush_evd((DAPL_EVD *) ep_ptr->param.recv_evd_handle);
++}
++
+ /*
+  * Local variables:
+  *  c-indent-level: 4
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h
+index 31d0e23..37805d4 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h
++++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h
+@@ -101,5 +101,7 @@ STATIC _INLINE_ dp_ib_cm_handle_t dapl_get_cm_from_ep(IN DAPL_EP *ep_ptr)
+       return cm_ptr;
+ }
+- 
++
++extern void dapls_ep_flush_cqs(DAPL_EP * ep_ptr);
++
+ #endif /*  _DAPL_EP_UTIL_H_ */
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c
+index 4035008..237293b 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c
+@@ -1,1522 +1,1359 @@
+-/*\r
+- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
+- *\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    in the file LICENSE.txt in the root directory. The license is also\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is in the file\r
+- *    LICENSE2.txt in the root directory. The license is also available from\r
+- *    the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
+- *    copy of which is in the file LICENSE3.txt in the root directory. The \r
+- *    license is also available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-/**********************************************************************\r
+- *\r
+- * MODULE: dapl_evd_util.c\r
+- *\r
+- * PURPOSE: Manage EVD Info structure\r
+- *\r
+- * $Id: dapl_evd_util.c 1410 2006-07-19 17:12:02Z ardavis $\r
+- **********************************************************************/\r
+-\r
+-#include "dapl_evd_util.h"\r
+-#include "dapl_ia_util.h"\r
+-#include "dapl_cno_util.h"\r
+-#include "dapl_ring_buffer_util.h"\r
+-#include "dapl_adapter_util.h"\r
+-#include "dapl_cookie.h"\r
+-#include "dapl.h"\r
+-#include "dapl_cr_util.h"\r
+-#include "dapl_sp_util.h"\r
+-#include "dapl_ep_util.h"\r
+-\r
+-STATIC _INLINE_ void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe);\r
+-\r
+-DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen);\r
+-\r
+-char *dapl_event_str(IN DAT_EVENT_NUMBER event_num)\r
+-{\r
+-#if defined(DAPL_DBG)\r
+-      struct dat_event_str {\r
+-              char *str;\r
+-              DAT_EVENT_NUMBER num;\r
+-      };\r
+-      static struct dat_event_str events[] = {\r
+-              {"DAT_DTO_COMPLETION_EVENT", DAT_DTO_COMPLETION_EVENT},\r
+-              {"DAT_RMR_BIND_COMPLETION_EVENT",\r
+-               DAT_RMR_BIND_COMPLETION_EVENT},\r
+-              {"DAT_CONNECTION_REQUEST_EVENT", DAT_CONNECTION_REQUEST_EVENT},\r
+-              {"DAT_CONNECTION_EVENT_ESTABLISHED",\r
+-               DAT_CONNECTION_EVENT_ESTABLISHED},\r
+-              {"DAT_CONNECTION_EVENT_PEER_REJECTED",\r
+-               DAT_CONNECTION_EVENT_PEER_REJECTED},\r
+-              {"DAT_CONNECTION_EVENT_NON_PEER_REJECTED",\r
+-               DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+-              {"DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR",\r
+-               DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR},\r
+-              {"DAT_CONNECTION_EVENT_DISCONNECTED",\r
+-               DAT_CONNECTION_EVENT_DISCONNECTED},\r
+-              {"DAT_CONNECTION_EVENT_BROKEN", DAT_CONNECTION_EVENT_BROKEN},\r
+-              {"DAT_CONNECTION_EVENT_TIMED_OUT",\r
+-               DAT_CONNECTION_EVENT_TIMED_OUT},\r
+-              {"DAT_CONNECTION_EVENT_UNREACHABLE",\r
+-               DAT_CONNECTION_EVENT_UNREACHABLE},\r
+-              {"DAT_ASYNC_ERROR_EVD_OVERFLOW", DAT_ASYNC_ERROR_EVD_OVERFLOW},\r
+-              {"DAT_ASYNC_ERROR_IA_CATASTROPHIC",\r
+-               DAT_ASYNC_ERROR_IA_CATASTROPHIC},\r
+-              {"DAT_ASYNC_ERROR_EP_BROKEN", DAT_ASYNC_ERROR_EP_BROKEN},\r
+-              {"DAT_ASYNC_ERROR_TIMED_OUT", DAT_ASYNC_ERROR_TIMED_OUT},\r
+-              {"DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR",\r
+-               DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR},\r
+-              {"DAT_HA_DOWN_TO_1", DAT_HA_DOWN_TO_1},\r
+-              {"DAT_HA_UP_TO_MULTI_PATH", DAT_HA_UP_TO_MULTI_PATH},\r
+-              {"DAT_SOFTWARE_EVENT", DAT_SOFTWARE_EVENT},\r
+-#ifdef DAT_EXTENSIONS\r
+-              {"DAT_EXTENSION_EVENT", DAT_EXTENSION_EVENT},\r
+-              {"DAT_IB_EXTENSION_RANGE_BASE", DAT_IB_EXTENSION_RANGE_BASE},\r
+-              {"DAT_IB_UD_CONNECTION_REQUEST_EVENT",\r
+-               DAT_IB_EXTENSION_RANGE_BASE + 1},\r
+-              {"DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED",\r
+-               DAT_IB_EXTENSION_RANGE_BASE + 2},\r
+-              {"DAT_IB_UD_CONNECTION_REJECT_EVENT",\r
+-               DAT_IB_EXTENSION_RANGE_BASE + 3},\r
+-              {"DAT_IB_UD_CONNECTION_ERROR_EVENT",\r
+-               DAT_IB_EXTENSION_RANGE_BASE + 4},\r
+-              {"DAT_IW_EXTENSION_RANGE_BASE", DAT_IW_EXTENSION_RANGE_BASE},\r
+-#endif                                /* DAT_EXTENSIONS */\r
+-              {NULL, 0},\r
+-      };\r
+-      int i;\r
+-\r
+-      for (i = 0; events[i].str; i++) {\r
+-              if (events[i].num == event_num)\r
+-                      return events[i].str;\r
+-      }\r
+-      return "Unknown DAT event?";\r
+-#else\r
+-      static char str[16];\r
+-      sprintf(str, "%x", event_num);\r
+-      return str;\r
+-#endif\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_internal_create\r
+- *\r
+- * actually create the evd.  this is called after all parameter checking\r
+- * has been performed in dapl_ep_create.  it is also called from dapl_ia_open\r
+- * to create the default async evd.\r
+- *\r
+- * Input:\r
+- *    ia_ptr\r
+- *    cno_ptr\r
+- *    qlen\r
+- *    evd_flags\r
+- *\r
+- * Output:\r
+- *    evd_ptr_ptr\r
+- *\r
+- * Returns:\r
+- *    none\r
+- *\r
+- */\r
+-\r
+-DAT_RETURN\r
+-dapls_evd_internal_create(DAPL_IA * ia_ptr,\r
+-                        DAPL_CNO * cno_ptr,\r
+-                        DAT_COUNT min_qlen,\r
+-                        DAT_EVD_FLAGS evd_flags, DAPL_EVD ** evd_ptr_ptr)\r
+-{\r
+-      DAPL_EVD *evd_ptr;\r
+-      DAT_COUNT cq_len;\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      dat_status = DAT_SUCCESS;\r
+-      *evd_ptr_ptr = NULL;\r
+-      cq_len = min_qlen;\r
+-\r
+-      evd_ptr = dapls_evd_alloc(ia_ptr, cno_ptr, evd_flags, min_qlen);\r
+-      if (!evd_ptr) {\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /*\r
+-       * If we are dealing with event streams besides a CQ event stream,\r
+-       * be conservative and set producer side locking.  Otherwise, no.\r
+-       * Note: CNO is not considered CQ event stream.\r
+-       */\r
+-      evd_ptr->evd_producer_locking_needed =\r
+-          (!(evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) ||\r
+-           evd_ptr->cno_ptr);\r
+-\r
+-      /* Before we setup any callbacks, transition state to OPEN.  */\r
+-      evd_ptr->evd_state = DAPL_EVD_STATE_OPEN;\r
+-\r
+-      if (evd_flags & DAT_EVD_ASYNC_FLAG) {\r
+-              /*\r
+-               * There is no cq associate with async evd. Set it to invalid\r
+-               */\r
+-              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
+-\r
+-      } else if (0 != (evd_flags & ~(DAT_EVD_SOFTWARE_FLAG\r
+-                                     | DAT_EVD_CONNECTION_FLAG\r
+-                                     | DAT_EVD_CR_FLAG))) {\r
+-#if defined(_VENDOR_IBAL_)\r
+-              /* \r
+-               * The creation of CQ required a PD (PZ) associated with it and\r
+-               * we do not have a PD here; therefore, the work-around is that we\r
+-               * will postpone the creation of the cq till the creation of QP which\r
+-               * this cq will associate with.\r
+-               */\r
+-              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
+-#else\r
+-              dat_status = dapls_ib_cq_alloc(ia_ptr, evd_ptr, &cq_len);\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      goto bail;\r
+-              }\r
+-\r
+-              /* Now reset the cq_len in the attributes, it may have changed */\r
+-              evd_ptr->qlen = cq_len;\r
+-\r
+-              dat_status =\r
+-                  dapls_ib_setup_async_callback(ia_ptr,\r
+-                                                DAPL_ASYNC_CQ_COMPLETION,\r
+-                                                evd_ptr,\r
+-                                                (ib_async_handler_t)\r
+-                                                dapl_evd_dto_callback,\r
+-                                                evd_ptr);\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      goto bail;\r
+-              }\r
+-\r
+-              dat_status = dapls_set_cq_notify(ia_ptr, evd_ptr);\r
+-\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      goto bail;\r
+-              }\r
+-#endif                                /* _VENDOR_IBAL_ */\r
+-      }\r
+-\r
+-      /* We now have an accurate count of events, so allocate them into\r
+-       * the EVD\r
+-       */\r
+-      dat_status = dapli_evd_event_alloc(evd_ptr, cq_len);\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              goto bail;\r
+-      }\r
+-\r
+-      dapl_ia_link_evd(ia_ptr, evd_ptr);\r
+-      *evd_ptr_ptr = evd_ptr;\r
+-\r
+-      bail:\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              if (evd_ptr) {\r
+-                      dapls_evd_dealloc(evd_ptr);\r
+-              }\r
+-      }\r
+-\r
+-      return dat_status;\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_alloc\r
+- *\r
+- * alloc and initialize an EVD struct\r
+- *\r
+- * Input:\r
+- *    ia\r
+- *\r
+- * Output:\r
+- *    evd_ptr\r
+- *\r
+- * Returns:\r
+- *    none\r
+- *\r
+- */\r
+-DAPL_EVD *dapls_evd_alloc(IN DAPL_IA * ia_ptr,\r
+-                        IN DAPL_CNO * cno_ptr,\r
+-                        IN DAT_EVD_FLAGS evd_flags, IN DAT_COUNT qlen)\r
+-{\r
+-      DAPL_EVD *evd_ptr;\r
+-\r
+-      /* Allocate EVD */\r
+-      evd_ptr = (DAPL_EVD *) dapl_os_alloc(sizeof(DAPL_EVD));\r
+-      if (!evd_ptr) {\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* zero the structure */\r
+-      dapl_os_memzero(evd_ptr, sizeof(DAPL_EVD));\r
+-\r
+-#ifdef DAPL_COUNTERS\r
+-      /* Allocate counters */\r
+-      evd_ptr->cntrs =\r
+-          dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);\r
+-      if (evd_ptr->cntrs == NULL) {\r
+-              dapl_os_free(evd_ptr, sizeof(DAPL_EVD));\r
+-              return (NULL);\r
+-      }\r
+-      dapl_os_memzero(evd_ptr->cntrs,\r
+-                      sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);\r
+-#endif                                /* DAPL_COUNTERS */\r
+-\r
+-      /*\r
+-       * initialize the header\r
+-       */\r
+-      evd_ptr->header.provider = ia_ptr->header.provider;\r
+-      evd_ptr->header.magic = DAPL_MAGIC_EVD;\r
+-      evd_ptr->header.handle_type = DAT_HANDLE_TYPE_EVD;\r
+-      evd_ptr->header.owner_ia = ia_ptr;\r
+-      evd_ptr->header.user_context.as_64 = 0;\r
+-      evd_ptr->header.user_context.as_ptr = NULL;\r
+-      dapl_llist_init_entry(&evd_ptr->header.ia_list_entry);\r
+-      dapl_os_lock_init(&evd_ptr->header.lock);\r
+-\r
+-      /*\r
+-       * Initialize the body\r
+-       */\r
+-      evd_ptr->evd_state = DAPL_EVD_STATE_INITIAL;\r
+-      evd_ptr->evd_flags = evd_flags;\r
+-      evd_ptr->evd_enabled = DAT_TRUE;\r
+-      evd_ptr->evd_waitable = DAT_TRUE;\r
+-      evd_ptr->evd_producer_locking_needed = 1;       /* Conservative value.  */\r
+-      evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
+-      dapl_os_atomic_set(&evd_ptr->evd_ref_count, 0);\r
+-      evd_ptr->catastrophic_overflow = DAT_FALSE;\r
+-      evd_ptr->qlen = qlen;\r
+-      evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD;    /* FIXME: should be DAPL_EVD_STATE_INIT */\r
+-      dapl_os_wait_object_init(&evd_ptr->wait_object);\r
+-\r
+-      evd_ptr->cno_active_count = 0;\r
+-      if (cno_ptr != NULL) {\r
+-              /* Take a reference count on the CNO */\r
+-              dapl_os_atomic_inc(&cno_ptr->cno_ref_count);\r
+-      }\r
+-      evd_ptr->cno_ptr = cno_ptr;\r
+-\r
+-      bail:\r
+-      return evd_ptr;\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_event_alloc\r
+- *\r
+- * alloc events into an EVD.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    qlen\r
+- *\r
+- * Output:\r
+- *    NONE\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    ERROR\r
+- *\r
+- */\r
+-DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-      DAT_COUNT i;\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      dat_status = DAT_SUCCESS;\r
+-\r
+-      /* Allocate EVENTs */\r
+-      event_ptr =\r
+-          (DAT_EVENT *) dapl_os_alloc(evd_ptr->qlen * sizeof(DAT_EVENT));\r
+-      if (event_ptr == NULL) {\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);\r
+-              goto bail;\r
+-      }\r
+-      evd_ptr->events = event_ptr;\r
+-\r
+-      /* allocate free event queue */\r
+-      dat_status = dapls_rbuf_alloc(&evd_ptr->free_event_queue, qlen);\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* allocate pending event queue */\r
+-      dat_status = dapls_rbuf_alloc(&evd_ptr->pending_event_queue, qlen);\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* add events to free event queue */\r
+-      for (i = 0; i < evd_ptr->qlen; i++) {\r
+-              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)event_ptr);\r
+-              event_ptr++;\r
+-      }\r
+-\r
+-      evd_ptr->cq_notified = DAT_FALSE;\r
+-      evd_ptr->cq_notified_when = 0;\r
+-      evd_ptr->threshold = 0;\r
+-\r
+-      bail:\r
+-      return dat_status;\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_event_realloc\r
+- *\r
+- * realloc events into an EVD.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    qlen\r
+- *\r
+- * Output:\r
+- *    NONE\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    ERROR\r
+- *\r
+- */\r
+-DAT_RETURN dapls_evd_event_realloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)\r
+-{\r
+-      DAT_EVENT *events;\r
+-      DAT_COUNT old_qlen;\r
+-      DAT_COUNT i;\r
+-      intptr_t diff;\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      /* Allocate EVENTs */\r
+-      events = (DAT_EVENT *) dapl_os_realloc(evd_ptr->events,\r
+-                                             qlen * sizeof(DAT_EVENT));\r
+-      if (NULL == events) {\r
+-              dat_status =\r
+-                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      diff = events - evd_ptr->events;\r
+-      evd_ptr->events = events;\r
+-\r
+-      old_qlen = evd_ptr->qlen;\r
+-      evd_ptr->qlen = qlen;\r
+-\r
+-      /* reallocate free event queue */\r
+-      dat_status = dapls_rbuf_realloc(&evd_ptr->free_event_queue, qlen);\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              goto bail;\r
+-      }\r
+-      dapls_rbuf_adjust(&evd_ptr->free_event_queue, diff);\r
+-\r
+-      /* reallocate pending event queue */\r
+-      dat_status = dapls_rbuf_realloc(&evd_ptr->pending_event_queue, qlen);\r
+-      if (dat_status != DAT_SUCCESS) {\r
+-              goto bail;\r
+-      }\r
+-      dapls_rbuf_adjust(&evd_ptr->pending_event_queue, diff);\r
+-\r
+-      /*\r
+-       * add new events to free event queue. \r
+-       */\r
+-      for (i = old_qlen; i < qlen; i++) {\r
+-              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)&events[i]);\r
+-      }\r
+-\r
+-      bail:\r
+-      return dat_status;\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_dealloc\r
+- *\r
+- * Free the passed in EVD structure. If an error occurs, this function\r
+- * will clean up all of the internal data structures and report the\r
+- * error.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    status\r
+- *\r
+- */\r
+-DAT_RETURN dapls_evd_dealloc(IN DAPL_EVD * evd_ptr)\r
+-{\r
+-      DAT_RETURN dat_status;\r
+-      DAPL_IA *ia_ptr;\r
+-\r
+-      dat_status = DAT_SUCCESS;\r
+-\r
+-      dapl_os_assert(evd_ptr->header.magic == DAPL_MAGIC_EVD);\r
+-      dapl_os_assert(dapl_os_atomic_read(&evd_ptr->evd_ref_count) == 0);\r
+-\r
+-      /*\r
+-       * Destroy the CQ first, to keep any more callbacks from coming\r
+-       * up from it.\r
+-       */\r
+-      evd_ptr->evd_enabled = DAT_FALSE;\r
+-      if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {\r
+-              ia_ptr = evd_ptr->header.owner_ia;\r
+-\r
+-              dat_status = dapls_ib_cq_free(ia_ptr, evd_ptr);\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      goto bail;\r
+-              }\r
+-      }\r
+-\r
+-      /*\r
+-       * We should now be safe to invalidate the EVD; reset the\r
+-       * magic to prevent reuse.\r
+-       */\r
+-      evd_ptr->header.magic = DAPL_MAGIC_INVALID;\r
+-\r
+-      /* Release reference on the CNO if it exists */\r
+-      if (evd_ptr->cno_ptr != NULL) {\r
+-              dapl_os_atomic_dec(&evd_ptr->cno_ptr->cno_ref_count);\r
+-              evd_ptr->cno_ptr = NULL;\r
+-      }\r
+-\r
+-      /* If the ring buffer allocation failed, then the dapls_rbuf_destroy   */\r
+-      /* function will detect that the ring buffer's internal data (ex. base */\r
+-      /* pointer) are invalid and will handle the situation appropriately    */\r
+-      dapls_rbuf_destroy(&evd_ptr->free_event_queue);\r
+-      dapls_rbuf_destroy(&evd_ptr->pending_event_queue);\r
+-\r
+-      if (evd_ptr->events) {\r
+-              dapl_os_free(evd_ptr->events,\r
+-                           evd_ptr->qlen * sizeof(DAT_EVENT));\r
+-      }\r
+-\r
+-      dapl_os_wait_object_destroy(&evd_ptr->wait_object);\r
+-\r
+-#ifdef DAPL_COUNTERS\r
+-      dapl_os_free(evd_ptr->cntrs,\r
+-                   sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);\r
+-#endif                                /* DAPL_COUNTERS */\r
+-\r
+-      dapl_os_free(evd_ptr, sizeof(DAPL_EVD));\r
+-\r
+-      bail:\r
+-      return dat_status;\r
+-}\r
+-\r
+-STATIC _INLINE_ char *DAPL_GET_DTO_OP_STR(int op)\r
+-{\r
+-      static char *dto_ops[] = {\r
+-              "OP_SEND",\r
+-              "OP_RECEIVE",\r
+-              "OP_RDMA_WRITE",\r
+-              "OP_RDMA_READ"\r
+-      };\r
+-      return ((op < 0 || op > 3) ? "Invalid DTO OP?" : dto_ops[op]);\r
+-}\r
+-\r
+-#if !defined(DAPL_GET_CQE_OP_STR)\r
+-#define DAPL_GET_CQE_OP_STR(e) "Unknown CEQ OP String?"\r
+-#endif\r
+-#if !defined(DAPL_GET_CQE_VENDOR_ERR)\r
+-#define DAPL_GET_CQE_VENDOR_ERR(e) 0\r
+-#endif\r
+-\r
+-/*\r
+- * dapli_evd_eh_print_cqe\r
+- *\r
+- * Input:\r
+- *    cqe_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Prints out a CQE for debug purposes\r
+- *\r
+- */\r
+-\r
+-void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe_ptr)\r
+-{\r
+-#ifdef DAPL_DBG\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                   "\t dapl_evd_dto_callback : CQE \n");\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                   "\t\t work_req_id %lli\n", DAPL_GET_CQE_WRID(cqe_ptr));\r
+-      if (DAPL_GET_CQE_STATUS(cqe_ptr) == 0) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                           "\t\t op_type: %s\n",\r
+-                           DAPL_GET_CQE_OP_STR(cqe_ptr));\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                           "\t\t bytes_num %d\n",\r
+-                           DAPL_GET_CQE_BYTESNUM(cqe_ptr));\r
+-      }\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                   "\t\t status %d vendor_err 0x%x\n",\r
+-                   DAPL_GET_CQE_STATUS(cqe_ptr),\r
+-                   DAPL_GET_CQE_VENDOR_ERR(cqe_ptr));\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");\r
+-#endif\r
+-      return;\r
+-}\r
+-\r
+-/*\r
+- * Event posting code follows.\r
+- */\r
+-\r
+-/*\r
+- * These next two functions (dapli_evd_get_event and dapli_evd_post_event)\r
+- * are a pair.  They are always called together, from one of the functions\r
+- * at the end of this file (dapl_evd_post_*_event).\r
+- *\r
+- * Note that if producer side locking is enabled, the first one takes the\r
+- * EVD lock and the second releases it.\r
+- */\r
+-\r
+-/* dapli_evd_get_event\r
+- *\r
+- * Get an event struct from the evd.  The caller should fill in the event\r
+- * and call dapl_evd_post_event.\r
+- *\r
+- * If there are no events available, an overflow event is generated to the\r
+- * async EVD handler.\r
+- *\r
+- * If this EVD required producer locking, a successful return implies\r
+- * that the lock is held.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *\r
+- * Output:\r
+- *    event\r
+- *\r
+- */\r
+-\r
+-static DAT_EVENT *dapli_evd_get_event(DAPL_EVD * evd_ptr)\r
+-{\r
+-      DAT_EVENT *event;\r
+-\r
+-      if (evd_ptr->evd_producer_locking_needed) {\r
+-              dapl_os_lock(&evd_ptr->header.lock);\r
+-      }\r
+-\r
+-      event = (DAT_EVENT *) dapls_rbuf_remove(&evd_ptr->free_event_queue);\r
+-\r
+-      /* Release the lock if it was taken and the call failed.  */\r
+-      if (!event && evd_ptr->evd_producer_locking_needed) {\r
+-              dapl_os_unlock(&evd_ptr->header.lock);\r
+-      }\r
+-\r
+-      return event;\r
+-}\r
+-\r
+-/* dapli_evd_post_event\r
+- *\r
+- * Post the <event> to the evd.  If possible, invoke the evd's CNO.\r
+- * Otherwise post the event on the pending queue.\r
+- *\r
+- * If producer side locking is required, the EVD lock must be held upon\r
+- * entry to this function.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    event\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- */\r
+-\r
+-static void\r
+-dapli_evd_post_event(IN DAPL_EVD * evd_ptr, IN const DAT_EVENT * event_ptr)\r
+-{\r
+-      DAT_RETURN dat_status;\r
+-      DAPL_CNO *cno_to_trigger = NULL;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: %s evd %p state %d\n",\r
+-                   __FUNCTION__, dapl_event_str(event_ptr->event_number), \r
+-                   evd_ptr, evd_ptr->evd_state);\r
+-\r
+-      dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue,\r
+-                                  (void *)event_ptr);\r
+-      dapl_os_assert(dat_status == DAT_SUCCESS);\r
+-\r
+-      dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED\r
+-                     || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN);\r
+-\r
+-      if (evd_ptr->evd_state == DAPL_EVD_STATE_OPEN) {\r
+-              /* No waiter.  Arrange to trigger a CNO if it exists.  */\r
+-\r
+-              if (evd_ptr->evd_enabled) {\r
+-                      cno_to_trigger = evd_ptr->cno_ptr;\r
+-              }\r
+-              if (evd_ptr->evd_producer_locking_needed) {\r
+-                      dapl_os_unlock(&evd_ptr->header.lock);\r
+-              }\r
+-      } else {\r
+-              /*\r
+-               * We're in DAPL_EVD_STATE_WAITED.  Take the lock if\r
+-               * we don't have it, recheck, and signal.\r
+-               */\r
+-              if (!evd_ptr->evd_producer_locking_needed) {\r
+-                      dapl_os_lock(&evd_ptr->header.lock);\r
+-              }\r
+-\r
+-              if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED\r
+-                  && (dapls_rbuf_count(&evd_ptr->pending_event_queue)\r
+-                      >= evd_ptr->threshold)) {\r
+-                      dapl_os_unlock(&evd_ptr->header.lock);\r
+-\r
+-                      if (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) {\r
+-                              dapls_evd_dto_wakeup(evd_ptr);\r
+-                      } else {\r
+-                              dapl_os_wait_object_wakeup(&evd_ptr->wait_object);\r
+-                      }\r
+-\r
+-              } else {\r
+-                      dapl_os_unlock(&evd_ptr->header.lock);\r
+-              }\r
+-      }\r
+-\r
+-      if (cno_to_trigger != NULL) {\r
+-              dapl_internal_cno_trigger(cno_to_trigger, evd_ptr);\r
+-      }\r
+-}\r
+-\r
+-/* dapli_evd_post_event_nosignal\r
+- *\r
+- * Post the <event> to the evd.  Do not do any wakeup processing.\r
+- * This function should only be called if it is known that there are\r
+- * no waiters that it is appropriate to wakeup on this EVD.  An example\r
+- * of such a situation is during internal dat_evd_wait() processing.\r
+- *\r
+- * If producer side locking is required, the EVD lock must be held upon\r
+- * entry to this function.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    event\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- */\r
+-\r
+-static void\r
+-dapli_evd_post_event_nosignal(IN DAPL_EVD * evd_ptr,\r
+-                            IN const DAT_EVENT * event_ptr)\r
+-{\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: Called with event %s\n",\r
+-                   __FUNCTION__, dapl_event_str(event_ptr->event_number));\r
+-\r
+-      dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue,\r
+-                                  (void *)event_ptr);\r
+-      dapl_os_assert(dat_status == DAT_SUCCESS);\r
+-\r
+-      dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED\r
+-                     || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN);\r
+-\r
+-      if (evd_ptr->evd_producer_locking_needed) {\r
+-              dapl_os_unlock(&evd_ptr->header.lock);\r
+-      }\r
+-}\r
+-\r
+-/* dapli_evd_format_overflow_event\r
+- *\r
+- * format an overflow event for posting\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    event_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- */\r
+-static void\r
+-dapli_evd_format_overflow_event(IN DAPL_EVD * evd_ptr,\r
+-                              OUT DAT_EVENT * event_ptr)\r
+-{\r
+-      DAPL_IA *ia_ptr;\r
+-\r
+-      ia_ptr = evd_ptr->header.owner_ia;\r
+-\r
+-      event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
+-      event_ptr->event_number = DAT_ASYNC_ERROR_EVD_OVERFLOW;\r
+-      event_ptr->event_data.asynch_error_event_data.dat_handle =\r
+-          (DAT_HANDLE) ia_ptr;\r
+-}\r
+-\r
+-/* dapli_evd_post_overflow_event\r
+- *\r
+- * post an overflow event\r
+- *\r
+- * Input:\r
+- *    async_evd_ptr\r
+- *    evd_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- */\r
+-static void\r
+-dapli_evd_post_overflow_event(IN DAPL_EVD * async_evd_ptr,\r
+-                            IN DAPL_EVD * overflow_evd_ptr)\r
+-{\r
+-      DAT_EVENT *overflow_event;\r
+-\r
+-      /* The overflow_evd_ptr mght be the same as evd.\r
+-       * In that case we've got a catastrophic overflow.\r
+-       */\r
+-      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-               " WARNING: overflow event on EVD %p/n", overflow_evd_ptr);\r
+-\r
+-      if (async_evd_ptr == overflow_evd_ptr) {\r
+-              async_evd_ptr->catastrophic_overflow = DAT_TRUE;\r
+-              async_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD;\r
+-              return;\r
+-      }\r
+-\r
+-      overflow_event = dapli_evd_get_event(overflow_evd_ptr);\r
+-      if (!overflow_event) {\r
+-              /* this is not good */\r
+-              overflow_evd_ptr->catastrophic_overflow = DAT_TRUE;\r
+-              overflow_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD;\r
+-              return;\r
+-      }\r
+-      dapli_evd_format_overflow_event(overflow_evd_ptr, overflow_event);\r
+-      dapli_evd_post_event(overflow_evd_ptr, overflow_event);\r
+-\r
+-      return;\r
+-}\r
+-\r
+-static DAT_EVENT *dapli_evd_get_and_init_event(IN DAPL_EVD * evd_ptr,\r
+-                                             IN DAT_EVENT_NUMBER event_number)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-\r
+-      event_ptr = dapli_evd_get_event(evd_ptr);\r
+-      if (NULL == event_ptr) {\r
+-              dapli_evd_post_overflow_event(evd_ptr->header.owner_ia->\r
+-                                            async_error_evd, evd_ptr);\r
+-      } else {\r
+-              event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
+-              event_ptr->event_number = event_number;\r
+-      }\r
+-\r
+-      return event_ptr;\r
+-}\r
+-\r
+-DAT_RETURN\r
+-dapls_evd_post_cr_arrival_event(IN DAPL_EVD * evd_ptr,\r
+-                              IN DAT_EVENT_NUMBER event_number,\r
+-                              IN DAT_SP_HANDLE sp_handle,\r
+-                              DAT_IA_ADDRESS_PTR ia_address_ptr,\r
+-                              DAT_CONN_QUAL conn_qual,\r
+-                              DAT_CR_HANDLE cr_handle)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-\r
+-      if (event_ptr == NULL) {\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-      }\r
+-\r
+-      event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle;\r
+-      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr\r
+-          = ia_address_ptr;\r
+-      event_ptr->event_data.cr_arrival_event_data.conn_qual = conn_qual;\r
+-      event_ptr->event_data.cr_arrival_event_data.cr_handle = cr_handle;\r
+-\r
+-      dapli_evd_post_event(evd_ptr, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-DAT_RETURN\r
+-dapls_evd_post_connection_event(IN DAPL_EVD * evd_ptr,\r
+-                              IN DAT_EVENT_NUMBER event_number,\r
+-                              IN DAT_EP_HANDLE ep_handle,\r
+-                              IN DAT_COUNT private_data_size,\r
+-                              IN DAT_PVOID private_data)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-\r
+-      if (event_ptr == NULL) {\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-      }\r
+-\r
+-      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;\r
+-      event_ptr->event_data.connect_event_data.private_data_size\r
+-          = private_data_size;\r
+-      event_ptr->event_data.connect_event_data.private_data = private_data;\r
+-\r
+-      dapli_evd_post_event(evd_ptr, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-DAT_RETURN\r
+-dapls_evd_post_async_error_event(IN DAPL_EVD * evd_ptr,\r
+-                               IN DAT_EVENT_NUMBER event_number,\r
+-                               IN DAT_IA_HANDLE ia_handle)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-               " WARNING: async event - %s evd=%p/n",\r
+-               dapl_event_str(event_number), evd_ptr);\r
+-\r
+-      if (event_ptr == NULL) {\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-      }\r
+-\r
+-      event_ptr->event_data.asynch_error_event_data.dat_handle =\r
+-          (DAT_HANDLE) ia_handle;\r
+-\r
+-      dapli_evd_post_event(evd_ptr, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-DAT_RETURN\r
+-dapls_evd_post_software_event(IN DAPL_EVD * evd_ptr,\r
+-                            IN DAT_EVENT_NUMBER event_number,\r
+-                            IN DAT_PVOID pointer)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-\r
+-      if (event_ptr == NULL) {\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-      }\r
+-\r
+-      event_ptr->event_data.software_event_data.pointer = pointer;\r
+-\r
+-      dapli_evd_post_event(evd_ptr, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_post_generic_event\r
+- *\r
+- * Post a generic event type. Not used by all providers\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    event_number\r
+- *    data\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_evd_post_generic_event(IN DAPL_EVD * evd_ptr,\r
+-                           IN DAT_EVENT_NUMBER event_number,\r
+-                           IN DAT_EVENT_DATA * data)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-\r
+-      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-\r
+-      if (event_ptr == NULL) {\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-      }\r
+-\r
+-      event_ptr->event_data = *data;\r
+-\r
+-      dapli_evd_post_event(evd_ptr, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-DAT_RETURN\r
+-dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,\r
+-                          IN DAT_EVENT_NUMBER event_number,\r
+-                          IN dp_ib_cm_handle_t ib_cm_handle,\r
+-                          IN DAT_COUNT p_size,\r
+-                          IN DAT_PVOID p_data, IN DAT_PVOID ext_data)\r
+-{\r
+-      DAPL_CR *cr_ptr;\r
+-      DAPL_EP *ep_ptr;\r
+-      DAT_EVENT *event_ptr;\r
+-      DAT_SP_HANDLE sp_handle;\r
+-\r
+-      dapl_os_lock(&sp_ptr->header.lock);\r
+-      if (sp_ptr->listening == DAT_FALSE) {\r
+-              dapl_os_unlock(&sp_ptr->header.lock);\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                           "---> post_cr_event_ext: conn event on down SP\n");\r
+-              (void)dapls_ib_reject_connection(ib_cm_handle,\r
+-                                               DAT_CONNECTION_EVENT_UNREACHABLE,\r
+-                                               0, NULL);\r
+-              return DAT_CONN_QUAL_UNAVAILABLE;\r
+-      }\r
+-\r
+-      /*\r
+-       * RSP connections only allow a single connection. Close\r
+-       * it down NOW so we reject any further connections.\r
+-       */\r
+-      if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP)\r
+-              sp_ptr->listening = DAT_FALSE;\r
+-\r
+-      dapl_os_unlock(&sp_ptr->header.lock);\r
+-\r
+-      /* allocate new connect request */\r
+-      cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia);\r
+-      if (cr_ptr == NULL)\r
+-              return DAT_INSUFFICIENT_RESOURCES;\r
+-\r
+-      /* Set up the CR */\r
+-      cr_ptr->sp_ptr = sp_ptr;        /* maintain sp_ptr in case of reject */\r
+-      cr_ptr->param.remote_port_qual = 0;\r
+-      cr_ptr->ib_cm_handle = ib_cm_handle;\r
+-      cr_ptr->param.remote_ia_address_ptr =\r
+-          (DAT_IA_ADDRESS_PTR) & cr_ptr->remote_ia_address;\r
+-\r
+-      /*\r
+-       * Copy the remote address and private data out of the private_data\r
+-       */\r
+-      cr_ptr->param.private_data = cr_ptr->private_data;\r
+-      cr_ptr->param.private_data_size = p_size;\r
+-      if (p_size)\r
+-              dapl_os_memcpy(cr_ptr->private_data, p_data, p_size);\r
+-\r
+-      /* EP will be NULL unless RSP service point */\r
+-      ep_ptr = (DAPL_EP *) sp_ptr->ep_handle;\r
+-\r
+-      if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {\r
+-              DAPL_IA *ia_ptr;\r
+-              /*\r
+-               * Never true for RSP connections\r
+-               *\r
+-               * Create an EP for the user. If we can't allocate an\r
+-               * EP we are out of resources and need to tell the\r
+-               * requestor that we cant help them.\r
+-               */\r
+-              ia_ptr = sp_ptr->header.owner_ia;\r
+-              ep_ptr = dapl_ep_alloc(ia_ptr, NULL);\r
+-              if (ep_ptr == NULL) {\r
+-                      dapls_cr_free(cr_ptr);\r
+-                      /* Invoking function will call dapls_ib_cm_reject() */\r
+-                      return DAT_INSUFFICIENT_RESOURCES;\r
+-              }\r
+-              ep_ptr->param.ia_handle = ia_ptr;\r
+-              ep_ptr->param.local_ia_address_ptr =\r
+-                  (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address;\r
+-\r
+-              /* Link the EP onto the IA */\r
+-              dapl_ia_link_ep(ia_ptr, ep_ptr);\r
+-      }\r
+-\r
+-      cr_ptr->param.local_ep_handle = ep_ptr;\r
+-\r
+-      if (ep_ptr != NULL) {\r
+-              /* Assign valid EP fields: RSP and PSP_PROVIDER_FLAG only */\r
+-              if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {\r
+-                      ep_ptr->param.ep_state =\r
+-                          DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING;\r
+-              } else {\r
+-                      /* RSP */\r
+-                      dapl_os_assert(sp_ptr->header.handle_type ==\r
+-                                     DAT_HANDLE_TYPE_RSP);\r
+-                      ep_ptr->param.ep_state =\r
+-                          DAT_EP_STATE_PASSIVE_CONNECTION_PENDING;\r
+-              }\r
+-              dapl_ep_link_cm(ep_ptr, ib_cm_handle);\r
+-      }\r
+-\r
+-      /* link the CR onto the SP so we can pick it up later */\r
+-      dapl_sp_link_cr(sp_ptr, cr_ptr);\r
+-\r
+-      /* assign sp_ptr to union to avoid typecast errors from some compilers */\r
+-      sp_handle.psp_handle = (DAT_PSP_HANDLE) sp_ptr;\r
+-\r
+-      /* Post the event.  */\r
+-\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-      event_ptr = dapli_evd_get_and_init_event(sp_ptr->evd_handle,\r
+-                                               event_number);\r
+-      if (event_ptr == NULL)\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-\r
+-      event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle;\r
+-      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr =\r
+-          (DAT_IA_ADDRESS_PTR) & sp_ptr->header.owner_ia->hca_ptr->\r
+-          hca_address;\r
+-      event_ptr->event_data.cr_arrival_event_data.conn_qual =\r
+-          sp_ptr->conn_qual;\r
+-      event_ptr->event_data.cr_arrival_event_data.cr_handle =\r
+-          (DAT_HANDLE) cr_ptr;\r
+-\r
+-      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);\r
+-\r
+-      dapli_evd_post_event(sp_ptr->evd_handle, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-DAT_RETURN\r
+-dapls_evd_post_connection_event_ext(IN DAPL_EVD * evd_ptr,\r
+-                                  IN DAT_EVENT_NUMBER event_number,\r
+-                                  IN DAT_EP_HANDLE ep_handle,\r
+-                                  IN DAT_COUNT private_data_size,\r
+-                                  IN DAT_PVOID private_data,\r
+-                                  IN DAT_PVOID ext_data)\r
+-{\r
+-      DAT_EVENT *event_ptr;\r
+-      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
+-      /*\r
+-       * Note event lock may be held on successful return\r
+-       * to be released by dapli_evd_post_event(), if provider side locking\r
+-       * is needed.\r
+-       */\r
+-      if (event_ptr == NULL)\r
+-              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
+-                               DAT_RESOURCE_MEMORY);\r
+-\r
+-      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;\r
+-      event_ptr->event_data.connect_event_data.private_data_size\r
+-          = private_data_size;\r
+-      event_ptr->event_data.connect_event_data.private_data = private_data;\r
+-\r
+-      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);\r
+-\r
+-      dapli_evd_post_event(evd_ptr, event_ptr);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-#endif\r
+-\r
+-/*\r
+- * dapli_evd_cqe_to_event\r
+- *\r
+- * Convert a CQE into an event structure.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *    cqe_ptr\r
+- *\r
+- * Output:\r
+- *    event_ptr\r
+- *\r
+- * Returns:\r
+- *    none\r
+- *\r
+- */\r
+-static void\r
+-dapli_evd_cqe_to_event(IN DAPL_EVD * evd_ptr,\r
+-                     IN void *cqe_ptr, OUT DAT_EVENT * event_ptr)\r
+-{\r
+-      DAPL_EP *ep_ptr;\r
+-      DAPL_COOKIE *cookie;\r
+-      DAT_DTO_COMPLETION_STATUS dto_status;\r
+-      DAPL_COOKIE_BUFFER *buffer;\r
+-\r
+-      /*\r
+-       * All that can be relied on if the status is bad is the status\r
+-       * and WRID.\r
+-       */\r
+-      dto_status = dapls_ib_get_dto_status(cqe_ptr);\r
+-\r
+-      cookie = (DAPL_COOKIE *) (uintptr_t) DAPL_GET_CQE_WRID(cqe_ptr);\r
+-      dapl_os_assert((NULL != cookie));\r
+-\r
+-      ep_ptr = cookie->ep;\r
+-      dapl_os_assert((NULL != ep_ptr));\r
+-      if (ep_ptr->header.magic != DAPL_MAGIC_EP) {\r
+-              /* ep may have been freed, just return */\r
+-              return;\r
+-      }\r
+-\r
+-      dapls_io_trc_update_completion(ep_ptr, cookie, dto_status);\r
+-\r
+-      event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
+-\r
+-      switch (cookie->type) {\r
+-      case DAPL_COOKIE_TYPE_DTO:\r
+-              {\r
+-#ifdef DAT_EXTENSIONS\r
+-                      /* Extended via request post or message receive */\r
+-                      if ((cookie->val.dto.type == DAPL_DTO_TYPE_EXTENSION) ||\r
+-                          (cookie->val.dto.type == DAPL_DTO_TYPE_RECV &&\r
+-                           DAPL_GET_CQE_OPTYPE(cqe_ptr) != OP_RECEIVE)) {\r
+-                              dapls_cqe_to_event_extension(ep_ptr, cookie,\r
+-                                                           cqe_ptr,\r
+-                                                           event_ptr);\r
+-                              if (cookie->val.dto.type == DAPL_DTO_TYPE_RECV)\r
+-                                      dapls_cookie_dealloc(&ep_ptr->\r
+-                                                           recv_buffer,\r
+-                                                           cookie);\r
+-                              else\r
+-                                      dapls_cookie_dealloc(&ep_ptr->\r
+-                                                           req_buffer,\r
+-                                                           cookie);\r
+-                              break;\r
+-                      }\r
+-#endif\r
+-\r
+-                      if (DAPL_DTO_TYPE_RECV == cookie->val.dto.type)\r
+-                              buffer = &ep_ptr->recv_buffer;\r
+-                      else\r
+-                              buffer = &ep_ptr->req_buffer;\r
+-\r
+-                      event_ptr->event_number = DAT_DTO_COMPLETION_EVENT;\r
+-                      event_ptr->event_data.dto_completion_event_data.\r
+-                          ep_handle = cookie->ep;\r
+-                      event_ptr->event_data.dto_completion_event_data.\r
+-                          user_cookie = cookie->val.dto.cookie;\r
+-                      event_ptr->event_data.dto_completion_event_data.status =\r
+-                          dto_status;\r
+-\r
+-                      if (cookie->val.dto.type == DAPL_DTO_TYPE_SEND ||\r
+-                          cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE) {\r
+-                              /* Get size from DTO; CQE value may be off.  */\r
+-                              event_ptr->event_data.dto_completion_event_data.\r
+-                                  transfered_length = cookie->val.dto.size;\r
+-                      } else {\r
+-                              event_ptr->event_data.dto_completion_event_data.\r
+-                                  transfered_length =\r
+-                                  DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
+-                      }\r
+-\r
+-                      dapls_cookie_dealloc(buffer, cookie);\r
+-                      break;\r
+-              }\r
+-\r
+-      case DAPL_COOKIE_TYPE_RMR:\r
+-              {\r
+-                      event_ptr->event_number = DAT_RMR_BIND_COMPLETION_EVENT;\r
+-\r
+-                      event_ptr->event_data.rmr_completion_event_data.\r
+-                          rmr_handle = cookie->val.rmr.rmr;\r
+-                      event_ptr->event_data.rmr_completion_event_data.\r
+-                          user_cookie = cookie->val.rmr.cookie;\r
+-                      if (dto_status == DAT_DTO_SUCCESS) {\r
+-                              event_ptr->event_data.rmr_completion_event_data.\r
+-                                  status = DAT_RMR_BIND_SUCCESS;\r
+-                              dapl_os_assert((DAPL_GET_CQE_OPTYPE(cqe_ptr)) ==\r
+-                                             OP_BIND_MW);\r
+-                      } else {\r
+-                              dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,\r
+-                                           " MW bind completion ERROR: %d: op %#x ep: %p\n",\r
+-                                           dto_status,\r
+-                                           DAPL_GET_CQE_OPTYPE(cqe_ptr),\r
+-                                           ep_ptr);\r
+-                              event_ptr->event_data.rmr_completion_event_data.\r
+-                                  status = DAT_RMR_OPERATION_FAILED;\r
+-                              dapl_os_atomic_dec(&cookie->val.rmr.rmr->lmr->\r
+-                                                 lmr_ref_count);\r
+-                      }\r
+-\r
+-                      dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);\r
+-                      break;\r
+-              }\r
+-      default:\r
+-              {\r
+-                      dapl_os_assert(!"Invalid Operation type");\r
+-                      break;\r
+-              }\r
+-      }                       /* end switch */\r
+-\r
+-      /*\r
+-       * Most error DTO ops result in disconnecting the EP. See\r
+-       * IBTA Vol 1.1, Chapter 10,Table 68, for expected effect on\r
+-       * state.\r
+-       */\r
+-      if ((dto_status != DAT_DTO_SUCCESS) &&\r
+-          (dto_status != DAT_DTO_ERR_FLUSHED)) {\r
+-              DAPL_EVD *evd_ptr;\r
+-\r
+-              /*\r
+-               * If we are connected, generate disconnect and generate an\r
+-               * event. We may be racing with other disconnect ops, so we\r
+-               * need to check. We may also be racing CM connection events,\r
+-               * requiring us to check for connection pending states too.\r
+-               */\r
+-              dapl_os_lock(&ep_ptr->header.lock);\r
+-              if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED ||\r
+-                  ep_ptr->param.ep_state ==\r
+-                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING\r
+-                  || ep_ptr->param.ep_state ==\r
+-                  DAT_EP_STATE_PASSIVE_CONNECTION_PENDING\r
+-                  || ep_ptr->param.ep_state ==\r
+-                  DAT_EP_STATE_COMPLETION_PENDING)\r
+-              {\r
+-                      ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED;\r
+-                      dapl_os_unlock(&ep_ptr->header.lock);\r
+-                      dapls_io_trc_dump(ep_ptr, cqe_ptr, dto_status);\r
+-\r
+-                      /* Let the other side know we have disconnected */\r
+-                      (void)dapls_ib_disconnect(ep_ptr,\r
+-                                                DAT_CLOSE_ABRUPT_FLAG);\r
+-\r
+-                      /* ... and clean up the local side */\r
+-                      evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle;\r
+-                      dapl_sp_remove_ep (ep_ptr);\r
+-                      if (evd_ptr != NULL) {\r
+-                              dapls_evd_post_connection_event(evd_ptr,\r
+-                                                              DAT_CONNECTION_EVENT_BROKEN,\r
+-                                                              (DAT_HANDLE)\r
+-                                                              ep_ptr, 0, 0);\r
+-                      }\r
+-              } else {\r
+-                      dapl_os_unlock(&ep_ptr->header.lock);\r
+-              }\r
+-\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       "DTO completion ERR: status %d, op %s, vendor_err 0x%x - %s\n",\r
+-                       DAPL_GET_CQE_STATUS(cqe_ptr),\r
+-                       DAPL_GET_DTO_OP_STR(cookie->val.dto.type),\r
+-                       DAPL_GET_CQE_VENDOR_ERR(cqe_ptr),\r
+-                       inet_ntoa(((struct sockaddr_in *)&ep_ptr->\r
+-                                  remote_ia_address)->sin_addr));\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_copy_cq\r
+- *\r
+- * Copy all entries on a CQ associated with the EVD onto that EVD\r
+- * Up to caller to handle races, if any.  Note that no EVD waiters will\r
+- * be awoken by this copy.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *\r
+- * Output:\r
+- *    None\r
+- *\r
+- * Returns:\r
+- *    none\r
+- *\r
+- */\r
+-void dapls_evd_copy_cq(DAPL_EVD * evd_ptr)\r
+-{\r
+-      ib_work_completion_t cur_cqe;\r
+-      DAT_RETURN dat_status;\r
+-      DAT_EVENT *event;\r
+-\r
+-      if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) {\r
+-              /* Nothing to do if no CQ.  */\r
+-              return;\r
+-      }\r
+-\r
+-      while (1) {\r
+-              dat_status =\r
+-                  dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,\r
+-                                           evd_ptr, &cur_cqe);\r
+-\r
+-              if (dat_status != DAT_SUCCESS) {\r
+-                      break;\r
+-              }\r
+-\r
+-              /* For debugging.  */\r
+-              dapli_evd_eh_print_cqe(&cur_cqe);\r
+-\r
+-              /*\r
+-               * Can use DAT_DTO_COMPLETION_EVENT because dapli_evd_cqe_to_event\r
+-               * will overwrite.\r
+-               */\r
+-\r
+-              event =\r
+-                  dapli_evd_get_and_init_event(evd_ptr,\r
+-                                               DAT_DTO_COMPLETION_EVENT);\r
+-              if (event == NULL) {\r
+-                      /* We've already attempted the overflow post; return.  */\r
+-                      return;\r
+-              }\r
+-\r
+-              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);\r
+-\r
+-              dapli_evd_post_event_nosignal(evd_ptr, event);\r
+-      }\r
+-\r
+-      if (DAT_GET_TYPE(dat_status) != DAT_QUEUE_EMPTY) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+-                           "dapls_evd_copy_cq: dapls_ib_completion_poll returned 0x%x\n",\r
+-                           dat_status);\r
+-              dapl_os_assert(!"Bad return from dapls_ib_completion_poll");\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * dapls_evd_cq_poll_to_event\r
+- *\r
+- * Attempt to dequeue a single CQE from a CQ and turn it into\r
+- * an event.\r
+- *\r
+- * Input:\r
+- *    evd_ptr\r
+- *\r
+- * Output:\r
+- *    event\r
+- *\r
+- * Returns:\r
+- *    Status of operation\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_evd_cq_poll_to_event(IN DAPL_EVD * evd_ptr, OUT DAT_EVENT * event)\r
+-{\r
+-      DAT_RETURN dat_status;\r
+-      ib_work_completion_t cur_cqe;\r
+-\r
+-      dat_status = dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,\r
+-                                            evd_ptr, &cur_cqe);\r
+-      if (dat_status == DAT_SUCCESS) {\r
+-              /* For debugging.  */\r
+-              dapli_evd_eh_print_cqe(&cur_cqe);\r
+-\r
+-              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);\r
+-      }\r
+-\r
+-      return dat_status;\r
+-}\r
+-\r
+-#ifdef DAPL_DBG_IO_TRC\r
+-/*\r
+- * Update I/O completions in the I/O trace buffer. I/O is posted to\r
+- * the buffer, then we find it here using the cookie and mark it\r
+- * completed with the completion status\r
+- */\r
+-void\r
+-dapls_io_trc_update_completion(DAPL_EP * ep_ptr,\r
+-                             DAPL_COOKIE * cookie,\r
+-                             DAT_DTO_COMPLETION_STATUS dto_status)\r
+-{\r
+-      int i;\r
+-      static unsigned int c_cnt = 1;\r
+-\r
+-      for (i = 0; i < DBG_IO_TRC_QLEN; i++) {\r
+-              if (ep_ptr->ibt_base[i].cookie == cookie) {\r
+-                      ep_ptr->ibt_base[i].status = dto_status;\r
+-                      ep_ptr->ibt_base[i].done = c_cnt++;\r
+-              }\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * Dump the I/O trace buffers\r
+- */\r
+-void\r
+-dapls_io_trc_dump(DAPL_EP * ep_ptr,\r
+-                void *cqe_ptr, DAT_DTO_COMPLETION_STATUS dto_status)\r
+-{\r
+-      struct io_buf_track *ibt;\r
+-      int i;\r
+-      int cnt;\r
+-\r
+-      dapl_os_printf("DISCONNECTING: dto_status     = %x\n", dto_status);\r
+-      dapl_os_printf("               OpType        = %x\n",\r
+-                     DAPL_GET_CQE_OPTYPE(cqe_ptr));\r
+-      dapl_os_printf("               Bytes         = %x\n",\r
+-                     DAPL_GET_CQE_BYTESNUM(cqe_ptr));\r
+-      dapl_os_printf("               WRID (cookie) = %llx\n",\r
+-                     DAPL_GET_CQE_WRID(cqe_ptr));\r
+-\r
+-      if (ep_ptr->ibt_dumped == 0) {\r
+-\r
+-              dapl_os_printf("EP %p (qpn %d) I/O trace buffer\n",\r
+-                             ep_ptr, ep_ptr->qpn);\r
+-\r
+-              ep_ptr->ibt_dumped = 1;\r
+-              ibt =\r
+-                  (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->\r
+-                                                           ibt_queue);\r
+-              cnt = DBG_IO_TRC_QLEN;\r
+-              while (ibt != NULL && cnt > 0) {\r
+-                      dapl_os_printf\r
+-                          ("%2d. %3s (%2d, %d) OP: %x cookie %p wqe %p rmv_target_addr %llx rmv_rmr_context %x\n",\r
+-                           cnt, ibt->done == 0 ? "WRK" : "DON", ibt->status,\r
+-                           ibt->done, ibt->op_type, ibt->cookie, ibt->wqe,\r
+-                           ibt->remote_iov.target_address,\r
+-                           ibt->remote_iov.rmr_context);\r
+-                      for (i = 0; i < 3; i++) {\r
+-                              if (ibt->iov[i].segment_length != 0) {\r
+-                                      dapl_os_printf\r
+-                                          ("     (%4llx, %8x, %8llx)\n",\r
+-                                           ibt->iov[i].segment_length,\r
+-                                           ibt->iov[i].lmr_context,\r
+-                                           ibt->iov[i].virtual_address);\r
+-                              }\r
+-                      }\r
+-                      ibt =\r
+-                          (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->\r
+-                                                                   ibt_queue);\r
+-                      cnt--;\r
+-              }\r
+-      }\r
+-}\r
+-#endif                                /* DAPL_DBG_IO_TRC */\r
+-\r
+-/*\r
+- * Local variables:\r
+- *  c-indent-level: 4\r
+- *  c-basic-offset: 4\r
+- *  tab-width: 8\r
+- * End:\r
+- */\r
++/*
++ * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
++ *
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    in the file LICENSE.txt in the root directory. The license is also
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is in the file
++ *    LICENSE2.txt in the root directory. The license is also available from
++ *    the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a 
++ *    copy of which is in the file LICENSE3.txt in the root directory. The 
++ *    license is also available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++/**********************************************************************
++ *
++ * MODULE: dapl_evd_util.c
++ *
++ * PURPOSE: Manage EVD Info structure
++ *
++ * $Id: dapl_evd_util.c 1410 2006-07-19 17:12:02Z ardavis $
++ **********************************************************************/
++
++#include "dapl_evd_util.h"
++#include "dapl_ia_util.h"
++#include "dapl_cno_util.h"
++#include "dapl_ring_buffer_util.h"
++#include "dapl_adapter_util.h"
++#include "dapl_cookie.h"
++#include "dapl.h"
++#include "dapl_cr_util.h"
++#include "dapl_sp_util.h"
++#include "dapl_ep_util.h"
++
++STATIC _INLINE_ void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe);
++
++DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen);
++
++char *dapl_event_str(IN DAT_EVENT_NUMBER event_num)
++{
++#if defined(DAPL_DBG)
++      struct dat_event_str {
++              char *str;
++              DAT_EVENT_NUMBER num;
++      };
++      static struct dat_event_str events[] = {
++              {"DAT_DTO_COMPLETION_EVENT", DAT_DTO_COMPLETION_EVENT},
++              {"DAT_RMR_BIND_COMPLETION_EVENT",
++               DAT_RMR_BIND_COMPLETION_EVENT},
++              {"DAT_CONNECTION_REQUEST_EVENT", DAT_CONNECTION_REQUEST_EVENT},
++              {"DAT_CONNECTION_EVENT_ESTABLISHED",
++               DAT_CONNECTION_EVENT_ESTABLISHED},
++              {"DAT_CONNECTION_EVENT_PEER_REJECTED",
++               DAT_CONNECTION_EVENT_PEER_REJECTED},
++              {"DAT_CONNECTION_EVENT_NON_PEER_REJECTED",
++               DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
++              {"DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR",
++               DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR},
++              {"DAT_CONNECTION_EVENT_DISCONNECTED",
++               DAT_CONNECTION_EVENT_DISCONNECTED},
++              {"DAT_CONNECTION_EVENT_BROKEN", DAT_CONNECTION_EVENT_BROKEN},
++              {"DAT_CONNECTION_EVENT_TIMED_OUT",
++               DAT_CONNECTION_EVENT_TIMED_OUT},
++              {"DAT_CONNECTION_EVENT_UNREACHABLE",
++               DAT_CONNECTION_EVENT_UNREACHABLE},
++              {"DAT_ASYNC_ERROR_EVD_OVERFLOW", DAT_ASYNC_ERROR_EVD_OVERFLOW},
++              {"DAT_ASYNC_ERROR_IA_CATASTROPHIC",
++               DAT_ASYNC_ERROR_IA_CATASTROPHIC},
++              {"DAT_ASYNC_ERROR_EP_BROKEN", DAT_ASYNC_ERROR_EP_BROKEN},
++              {"DAT_ASYNC_ERROR_TIMED_OUT", DAT_ASYNC_ERROR_TIMED_OUT},
++              {"DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR",
++               DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR},
++              {"DAT_HA_DOWN_TO_1", DAT_HA_DOWN_TO_1},
++              {"DAT_HA_UP_TO_MULTI_PATH", DAT_HA_UP_TO_MULTI_PATH},
++              {"DAT_SOFTWARE_EVENT", DAT_SOFTWARE_EVENT},
++#ifdef DAT_EXTENSIONS
++              {"DAT_EXTENSION_EVENT", DAT_EXTENSION_EVENT},
++              {"DAT_IB_EXTENSION_RANGE_BASE", DAT_IB_EXTENSION_RANGE_BASE},
++              {"DAT_IB_UD_CONNECTION_REQUEST_EVENT",
++               DAT_IB_EXTENSION_RANGE_BASE + 1},
++              {"DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED",
++               DAT_IB_EXTENSION_RANGE_BASE + 2},
++              {"DAT_IB_UD_CONNECTION_REJECT_EVENT",
++               DAT_IB_EXTENSION_RANGE_BASE + 3},
++              {"DAT_IB_UD_CONNECTION_ERROR_EVENT",
++               DAT_IB_EXTENSION_RANGE_BASE + 4},
++              {"DAT_IW_EXTENSION_RANGE_BASE", DAT_IW_EXTENSION_RANGE_BASE},
++#endif                                /* DAT_EXTENSIONS */
++              {NULL, 0},
++      };
++      int i;
++
++      for (i = 0; events[i].str; i++) {
++              if (events[i].num == event_num)
++                      return events[i].str;
++      }
++      return "Unknown DAT event?";
++#else
++      static char str[16];
++      sprintf(str, "%x", event_num);
++      return str;
++#endif
++}
++
++/*
++ * dapls_evd_internal_create
++ *
++ * actually create the evd.  this is called after all parameter checking
++ * has been performed in dapl_ep_create.  it is also called from dapl_ia_open
++ * to create the default async evd.
++ *
++ * Input:
++ *    ia_ptr
++ *    cno_ptr
++ *    qlen
++ *    evd_flags
++ *
++ * Output:
++ *    evd_ptr_ptr
++ *
++ * Returns:
++ *    none
++ *
++ */
++
++DAT_RETURN
++dapls_evd_internal_create(DAPL_IA * ia_ptr,
++                        DAPL_CNO * cno_ptr,
++                        DAT_COUNT min_qlen,
++                        DAT_EVD_FLAGS evd_flags, DAPL_EVD ** evd_ptr_ptr)
++{
++      DAPL_EVD *evd_ptr;
++      DAT_COUNT cq_len;
++      DAT_RETURN dat_status;
++
++      dat_status = DAT_SUCCESS;
++      *evd_ptr_ptr = NULL;
++      cq_len = min_qlen;
++
++      evd_ptr = dapls_evd_alloc(ia_ptr, cno_ptr, evd_flags, min_qlen);
++      if (!evd_ptr) {
++              dat_status =
++                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++              goto bail;
++      }
++
++      /* Before we setup any callbacks, transition state to OPEN.  */
++      evd_ptr->evd_state = DAPL_EVD_STATE_OPEN;
++
++      if (evd_flags & DAT_EVD_ASYNC_FLAG) {
++              /*
++               * There is no cq associate with async evd. Set it to invalid
++               */
++              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
++
++      } else if (0 != (evd_flags & ~(DAT_EVD_SOFTWARE_FLAG
++                                     | DAT_EVD_CONNECTION_FLAG
++                                     | DAT_EVD_CR_FLAG))) {
++#if defined(_VENDOR_IBAL_)
++              /* 
++               * The creation of CQ required a PD (PZ) associated with it and
++               * we do not have a PD here; therefore, the work-around is that we
++               * will postpone the creation of the cq till the creation of QP which
++               * this cq will associate with.
++               */
++              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
++#else
++              dat_status = dapls_ib_cq_alloc(ia_ptr, evd_ptr, &cq_len);
++              if (dat_status != DAT_SUCCESS) {
++                      goto bail;
++              }
++
++              /* Now reset the cq_len in the attributes, it may have changed */
++              evd_ptr->qlen = cq_len;
++
++              dat_status =
++                  dapls_ib_setup_async_callback(ia_ptr,
++                                                DAPL_ASYNC_CQ_COMPLETION,
++                                                evd_ptr,
++                                                (ib_async_handler_t)
++                                                dapl_evd_dto_callback,
++                                                evd_ptr);
++              if (dat_status != DAT_SUCCESS) {
++                      goto bail;
++              }
++
++              dat_status = dapls_set_cq_notify(ia_ptr, evd_ptr);
++
++              if (dat_status != DAT_SUCCESS) {
++                      goto bail;
++              }
++#endif                                /* _VENDOR_IBAL_ */
++      }
++
++      /* We now have an accurate count of events, so allocate them into
++       * the EVD
++       */
++      dat_status = dapli_evd_event_alloc(evd_ptr, cq_len);
++      if (dat_status != DAT_SUCCESS) {
++              goto bail;
++      }
++
++      dapl_ia_link_evd(ia_ptr, evd_ptr);
++      *evd_ptr_ptr = evd_ptr;
++
++      bail:
++      if (dat_status != DAT_SUCCESS) {
++              if (evd_ptr) {
++                      dapls_evd_dealloc(evd_ptr);
++              }
++      }
++
++      return dat_status;
++}
++
++/*
++ * dapls_evd_alloc
++ *
++ * alloc and initialize an EVD struct
++ *
++ * Input:
++ *    ia
++ *
++ * Output:
++ *    evd_ptr
++ *
++ * Returns:
++ *    none
++ *
++ */
++DAPL_EVD *dapls_evd_alloc(IN DAPL_IA * ia_ptr,
++                        IN DAPL_CNO * cno_ptr,
++                        IN DAT_EVD_FLAGS evd_flags, IN DAT_COUNT qlen)
++{
++      DAPL_EVD *evd_ptr;
++
++      /* Allocate EVD */
++      evd_ptr = (DAPL_EVD *) dapl_os_alloc(sizeof(DAPL_EVD));
++      if (!evd_ptr) {
++              goto bail;
++      }
++
++      /* zero the structure */
++      dapl_os_memzero(evd_ptr, sizeof(DAPL_EVD));
++
++#ifdef DAPL_COUNTERS
++      /* Allocate counters */
++      evd_ptr->cntrs =
++          dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
++      if (evd_ptr->cntrs == NULL) {
++              dapl_os_free(evd_ptr, sizeof(DAPL_EVD));
++              return (NULL);
++      }
++      dapl_os_memzero(evd_ptr->cntrs,
++                      sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
++#endif                                /* DAPL_COUNTERS */
++
++      /*
++       * initialize the header
++       */
++      evd_ptr->header.provider = ia_ptr->header.provider;
++      evd_ptr->header.magic = DAPL_MAGIC_EVD;
++      evd_ptr->header.handle_type = DAT_HANDLE_TYPE_EVD;
++      evd_ptr->header.owner_ia = ia_ptr;
++      evd_ptr->header.user_context.as_64 = 0;
++      evd_ptr->header.user_context.as_ptr = NULL;
++      dapl_llist_init_entry(&evd_ptr->header.ia_list_entry);
++      dapl_os_lock_init(&evd_ptr->header.lock);
++
++      /*
++       * Initialize the body
++       */
++      evd_ptr->evd_state = DAPL_EVD_STATE_INITIAL;
++      evd_ptr->evd_flags = evd_flags;
++      evd_ptr->evd_enabled = DAT_TRUE;
++      evd_ptr->evd_waitable = DAT_TRUE;
++      evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
++      dapl_os_atomic_set(&evd_ptr->evd_ref_count, 0);
++      evd_ptr->catastrophic_overflow = DAT_FALSE;
++      evd_ptr->qlen = qlen;
++      evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD;    /* FIXME: should be DAPL_EVD_STATE_INIT */
++      dapl_os_wait_object_init(&evd_ptr->wait_object);
++
++      evd_ptr->cno_active_count = 0;
++      if (cno_ptr != NULL) {
++              /* Take a reference count on the CNO */
++              dapl_os_atomic_inc(&cno_ptr->cno_ref_count);
++      }
++      evd_ptr->cno_ptr = cno_ptr;
++
++      bail:
++      return evd_ptr;
++}
++
++/*
++ * dapls_evd_event_alloc
++ *
++ * alloc events into an EVD.
++ *
++ * Input:
++ *    evd_ptr
++ *    qlen
++ *
++ * Output:
++ *    NONE
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    ERROR
++ *
++ */
++DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)
++{
++      DAT_EVENT *event_ptr;
++      DAT_COUNT i;
++      DAT_RETURN dat_status;
++
++      dat_status = DAT_SUCCESS;
++
++      /* Allocate EVENTs */
++      event_ptr =
++          (DAT_EVENT *) dapl_os_alloc(evd_ptr->qlen * sizeof(DAT_EVENT));
++      if (event_ptr == NULL) {
++              dat_status =
++                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++              goto bail;
++      }
++      evd_ptr->events = event_ptr;
++
++      /* allocate free event queue */
++      dat_status = dapls_rbuf_alloc(&evd_ptr->free_event_queue, qlen);
++      if (dat_status != DAT_SUCCESS) {
++              goto bail;
++      }
++
++      /* allocate pending event queue */
++      dat_status = dapls_rbuf_alloc(&evd_ptr->pending_event_queue, qlen);
++      if (dat_status != DAT_SUCCESS) {
++              goto bail;
++      }
++
++      /* add events to free event queue */
++      for (i = 0; i < evd_ptr->qlen; i++) {
++              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)event_ptr);
++              event_ptr++;
++      }
++
++      evd_ptr->cq_notified = DAT_FALSE;
++      evd_ptr->cq_notified_when = 0;
++      evd_ptr->threshold = 0;
++
++      bail:
++      return dat_status;
++}
++
++/*
++ * dapls_evd_event_realloc
++ *
++ * realloc events into an EVD.
++ *
++ * Input:
++ *    evd_ptr
++ *    qlen
++ *
++ * Output:
++ *    NONE
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    ERROR
++ *
++ */
++DAT_RETURN dapls_evd_event_realloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)
++{
++      DAT_EVENT *events;
++      DAT_COUNT old_qlen;
++      DAT_COUNT i;
++      intptr_t diff;
++      DAT_RETURN dat_status;
++
++      /* Allocate EVENTs */
++      events = (DAT_EVENT *) dapl_os_realloc(evd_ptr->events,
++                                             qlen * sizeof(DAT_EVENT));
++      if (NULL == events) {
++              dat_status =
++                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++              goto bail;
++      }
++
++      diff = events - evd_ptr->events;
++      evd_ptr->events = events;
++
++      old_qlen = evd_ptr->qlen;
++      evd_ptr->qlen = qlen;
++
++      /* reallocate free event queue */
++      dat_status = dapls_rbuf_realloc(&evd_ptr->free_event_queue, qlen);
++      if (dat_status != DAT_SUCCESS) {
++              goto bail;
++      }
++      dapls_rbuf_adjust(&evd_ptr->free_event_queue, diff);
++
++      /* reallocate pending event queue */
++      dat_status = dapls_rbuf_realloc(&evd_ptr->pending_event_queue, qlen);
++      if (dat_status != DAT_SUCCESS) {
++              goto bail;
++      }
++      dapls_rbuf_adjust(&evd_ptr->pending_event_queue, diff);
++
++      /*
++       * add new events to free event queue. 
++       */
++      for (i = old_qlen; i < qlen; i++) {
++              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)&events[i]);
++      }
++
++      bail:
++      return dat_status;
++}
++
++/*
++ * dapls_evd_dealloc
++ *
++ * Free the passed in EVD structure. If an error occurs, this function
++ * will clean up all of the internal data structures and report the
++ * error.
++ *
++ * Input:
++ *    evd_ptr
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    status
++ *
++ */
++DAT_RETURN dapls_evd_dealloc(IN DAPL_EVD * evd_ptr)
++{
++      DAT_RETURN dat_status;
++      DAPL_IA *ia_ptr;
++
++      dat_status = DAT_SUCCESS;
++
++      dapl_os_assert(evd_ptr->header.magic == DAPL_MAGIC_EVD);
++      dapl_os_assert(dapl_os_atomic_read(&evd_ptr->evd_ref_count) == 0);
++
++      /*
++       * Destroy the CQ first, to keep any more callbacks from coming
++       * up from it.
++       */
++      evd_ptr->evd_enabled = DAT_FALSE;
++      if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {
++              ia_ptr = evd_ptr->header.owner_ia;
++
++              dat_status = dapls_ib_cq_free(ia_ptr, evd_ptr);
++              if (dat_status != DAT_SUCCESS) {
++                      goto bail;
++              }
++      }
++
++      /*
++       * We should now be safe to invalidate the EVD; reset the
++       * magic to prevent reuse.
++       */
++      evd_ptr->header.magic = DAPL_MAGIC_INVALID;
++
++      /* Release reference on the CNO if it exists */
++      if (evd_ptr->cno_ptr != NULL) {
++              dapl_os_atomic_dec(&evd_ptr->cno_ptr->cno_ref_count);
++              evd_ptr->cno_ptr = NULL;
++      }
++
++      /* If the ring buffer allocation failed, then the dapls_rbuf_destroy   */
++      /* function will detect that the ring buffer's internal data (ex. base */
++      /* pointer) are invalid and will handle the situation appropriately    */
++      dapls_rbuf_destroy(&evd_ptr->free_event_queue);
++      dapls_rbuf_destroy(&evd_ptr->pending_event_queue);
++
++      if (evd_ptr->events) {
++              dapl_os_free(evd_ptr->events,
++                           evd_ptr->qlen * sizeof(DAT_EVENT));
++      }
++
++      dapl_os_wait_object_destroy(&evd_ptr->wait_object);
++
++#ifdef DAPL_COUNTERS
++      dapl_os_free(evd_ptr->cntrs,
++                   sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
++#endif                                /* DAPL_COUNTERS */
++
++      dapl_os_free(evd_ptr, sizeof(DAPL_EVD));
++
++      bail:
++      return dat_status;
++}
++
++STATIC _INLINE_ char *DAPL_GET_DTO_OP_STR(int op)
++{
++      static char *dto_ops[] = {
++              "OP_SEND",
++              "OP_RECEIVE",
++              "OP_RDMA_WRITE",
++              "OP_RDMA_READ"
++      };
++      return ((op < 0 || op > 3) ? "Invalid DTO OP?" : dto_ops[op]);
++}
++
++#if !defined(DAPL_GET_CQE_OP_STR)
++#define DAPL_GET_CQE_OP_STR(e) "Unknown CEQ OP String?"
++#endif
++#if !defined(DAPL_GET_CQE_VENDOR_ERR)
++#define DAPL_GET_CQE_VENDOR_ERR(e) 0
++#endif
++
++/*
++ * dapli_evd_eh_print_cqe
++ *
++ * Input:
++ *    cqe_ptr
++ *
++ * Output:
++ *    none
++ *
++ * Prints out a CQE for debug purposes
++ *
++ */
++
++void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe_ptr)
++{
++#ifdef DAPL_DBG
++      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");
++      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                   "\t dapl_evd_dto_callback : CQE \n");
++      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                   "\t\t work_req_id %lli\n", DAPL_GET_CQE_WRID(cqe_ptr));
++      if (DAPL_GET_CQE_STATUS(cqe_ptr) == 0) {
++              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                           "\t\t op_type: %s\n",
++                           DAPL_GET_CQE_OP_STR(cqe_ptr));
++              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                           "\t\t bytes_num %d\n",
++                           DAPL_GET_CQE_BYTESNUM(cqe_ptr));
++      }
++      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                   "\t\t status %d vendor_err 0x%x\n",
++                   DAPL_GET_CQE_STATUS(cqe_ptr),
++                   DAPL_GET_CQE_VENDOR_ERR(cqe_ptr));
++      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");
++#endif
++      return;
++}
++
++/*
++ * Event posting code follows.
++ */
++
++
++/* dapli_evd_post_event
++ *
++ * Post the <event> to the evd.  If possible, invoke the evd's CNO.
++ * Otherwise post the event on the pending queue.
++ *
++ * Input:
++ *    evd_ptr
++ *    event
++ *
++ * Output:
++ *    none
++ *
++ */
++
++static void
++dapli_evd_post_event(IN DAPL_EVD * evd_ptr, IN const DAT_EVENT * event_ptr)
++{
++      DAT_RETURN dat_status;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: %s evd %p state %d\n",
++                   __FUNCTION__, dapl_event_str(event_ptr->event_number), 
++                   evd_ptr, evd_ptr->evd_state);
++
++      dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue,
++                                  (void *)event_ptr);
++      dapl_os_assert(dat_status == DAT_SUCCESS);
++
++      dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED
++                     || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN);
++
++      if (evd_ptr->evd_state == DAPL_EVD_STATE_OPEN) {
++              /* No waiter.  Arrange to trigger a CNO if it exists.  */
++              if (evd_ptr->evd_enabled && evd_ptr->cno_ptr)
++                      dapl_internal_cno_trigger(evd_ptr->cno_ptr, evd_ptr);
++      } else {
++              if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED
++                  && (dapls_rbuf_count(&evd_ptr->pending_event_queue)
++                      >= evd_ptr->threshold)) {
++
++                      if (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) {
++                              dapls_evd_dto_wakeup(evd_ptr);
++                      } else {
++                              dapl_os_wait_object_wakeup(&evd_ptr->wait_object);
++                      }
++              }
++      }
++}
++
++static DAT_EVENT *dapli_evd_get_and_init_event(IN DAPL_EVD * evd_ptr,
++                                             IN DAT_EVENT_NUMBER event_number)
++{
++      DAT_EVENT *event_ptr;
++
++      event_ptr = (DAT_EVENT *) dapls_rbuf_remove(&evd_ptr->free_event_queue);
++      if (event_ptr) {
++              event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;
++              event_ptr->event_number = event_number;
++      }
++
++      return event_ptr;
++}
++
++/* dapls_evd_post_overflow_event
++ *
++ * post an overflow event
++ *
++ * Input:
++ *    async_evd_ptr
++ *    evd_ptr
++ *
++ * Output:
++ *    none
++ *
++ */
++void
++dapls_evd_post_overflow_event(IN DAPL_EVD * evd_ptr)
++{
++      DAPL_EVD *async_evd_ptr = evd_ptr->header.owner_ia->async_error_evd;
++      DAT_EVENT *event_ptr;
++
++      dapl_log(DAPL_DBG_TYPE_WARN, " WARNING: overflow event on EVD %p/n", evd_ptr);
++
++      dapl_os_lock(&async_evd_ptr->header.lock);
++
++      /* The overflow evd_ptr mght be the same as the async evd.
++       * In that case we've got a catastrophic overflow.
++       */
++      if (async_evd_ptr == evd_ptr)
++              goto err;
++
++      event_ptr = dapli_evd_get_and_init_event(async_evd_ptr,
++                                               DAT_ASYNC_ERROR_EVD_OVERFLOW);
++      if (!event_ptr)
++              goto err;
++      
++      event_ptr->event_data.asynch_error_event_data.dat_handle =
++          (DAT_HANDLE) evd_ptr->header.owner_ia;
++
++      dapli_evd_post_event(async_evd_ptr, event_ptr);
++      dapl_os_unlock(&async_evd_ptr->header.lock);
++      return;
++
++err:
++      async_evd_ptr->catastrophic_overflow = DAT_TRUE;
++      async_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD;
++      dapl_os_unlock(&async_evd_ptr->header.lock);
++}
++
++DAT_RETURN
++dapls_evd_post_cr_arrival_event(IN DAPL_EVD * evd_ptr,
++                              IN DAT_EVENT_NUMBER event_number,
++                              IN DAT_SP_HANDLE sp_handle,
++                              DAT_IA_ADDRESS_PTR ia_address_ptr,
++                              DAT_CONN_QUAL conn_qual,
++                              DAT_CR_HANDLE cr_handle)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle;
++      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr
++          = ia_address_ptr;
++      event_ptr->event_data.cr_arrival_event_data.conn_qual = conn_qual;
++      event_ptr->event_data.cr_arrival_event_data.cr_handle = cr_handle;
++
++      dapli_evd_post_event(evd_ptr, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++
++DAT_RETURN
++dapls_evd_post_connection_event(IN DAPL_EVD * evd_ptr,
++                              IN DAT_EVENT_NUMBER event_number,
++                              IN DAT_EP_HANDLE ep_handle,
++                              IN DAT_COUNT private_data_size,
++                              IN DAT_PVOID private_data)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;
++      event_ptr->event_data.connect_event_data.private_data_size
++          = private_data_size;
++      event_ptr->event_data.connect_event_data.private_data = private_data;
++
++      dapli_evd_post_event(evd_ptr, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++
++DAT_RETURN
++dapls_evd_post_async_error_event(IN DAPL_EVD * evd_ptr,
++                               IN DAT_EVENT_NUMBER event_number,
++                               IN DAT_IA_HANDLE ia_handle)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_log(DAPL_DBG_TYPE_WARN,
++               " WARNING: async event - %s evd=%p/n",
++               dapl_event_str(event_number), evd_ptr);
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data.asynch_error_event_data.dat_handle =
++          (DAT_HANDLE) ia_handle;
++
++      dapli_evd_post_event(evd_ptr, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++
++DAT_RETURN
++dapls_evd_post_software_event(IN DAPL_EVD * evd_ptr,
++                            IN DAT_EVENT_NUMBER event_number,
++                            IN DAT_PVOID pointer)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data.software_event_data.pointer = pointer;
++
++      dapli_evd_post_event(evd_ptr, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++
++/*
++ * dapls_evd_post_generic_event
++ *
++ * Post a generic event type. Not used by all providers
++ *
++ * Input:
++ *    evd_ptr
++ *    event_number
++ *    data
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *
++ */
++DAT_RETURN
++dapls_evd_post_generic_event(IN DAPL_EVD * evd_ptr,
++                           IN DAT_EVENT_NUMBER event_number,
++                           IN DAT_EVENT_DATA * data)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data = *data;
++
++      dapli_evd_post_event(evd_ptr, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++
++#ifdef DAT_EXTENSIONS
++DAT_RETURN
++dapls_evd_do_post_cr_event_ext(IN DAPL_EVD * evd_ptr,
++                              IN DAT_EVENT_NUMBER event_number,
++                              IN DAPL_SP *sp_ptr,
++                              IN DAPL_CR *cr_ptr,
++                              IN DAT_PVOID ext_data)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data.cr_arrival_event_data.sp_handle.psp_handle =
++          (DAT_PSP_HANDLE) sp_ptr;
++      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr =
++          (DAT_IA_ADDRESS_PTR) &sp_ptr->header.owner_ia->hca_ptr->hca_address;
++      event_ptr->event_data.cr_arrival_event_data.conn_qual = sp_ptr->conn_qual;
++      event_ptr->event_data.cr_arrival_event_data.cr_handle = (DAT_CR_HANDLE) cr_ptr;
++
++      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);
++
++      dapli_evd_post_event(sp_ptr->evd_handle, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++
++DAT_RETURN
++dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,
++                          IN DAT_EVENT_NUMBER event_number,
++                          IN dp_ib_cm_handle_t ib_cm_handle,
++                          IN DAT_COUNT p_size,
++                          IN DAT_PVOID p_data, IN DAT_PVOID ext_data)
++{
++      DAPL_CR *cr_ptr;
++      DAPL_EP *ep_ptr;
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&sp_ptr->header.lock);
++      if (sp_ptr->listening == DAT_FALSE) {
++              dapl_os_unlock(&sp_ptr->header.lock);
++              dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                           "---> post_cr_event_ext: conn event on down SP\n");
++              (void)dapls_ib_reject_connection(ib_cm_handle,
++                                               DAT_CONNECTION_EVENT_UNREACHABLE,
++                                               0, NULL);
++              return DAT_CONN_QUAL_UNAVAILABLE;
++      }
++
++      /*
++       * RSP connections only allow a single connection. Close
++       * it down NOW so we reject any further connections.
++       */
++      if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP)
++              sp_ptr->listening = DAT_FALSE;
++
++      dapl_os_unlock(&sp_ptr->header.lock);
++
++      /* allocate new connect request */
++      cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia);
++      if (cr_ptr == NULL)
++              return DAT_INSUFFICIENT_RESOURCES;
++
++      /* Set up the CR */
++      cr_ptr->sp_ptr = sp_ptr;        /* maintain sp_ptr in case of reject */
++      cr_ptr->param.remote_port_qual = 0;
++      cr_ptr->ib_cm_handle = ib_cm_handle;
++      cr_ptr->param.remote_ia_address_ptr =
++          (DAT_IA_ADDRESS_PTR) & cr_ptr->remote_ia_address;
++
++      /*
++       * Copy the remote address and private data out of the private_data
++       */
++      cr_ptr->param.private_data = cr_ptr->private_data;
++      cr_ptr->param.private_data_size = p_size;
++      if (p_size)
++              dapl_os_memcpy(cr_ptr->private_data, p_data, p_size);
++
++      /* EP will be NULL unless RSP service point */
++      ep_ptr = (DAPL_EP *) sp_ptr->ep_handle;
++
++      if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {
++              DAPL_IA *ia_ptr;
++              /*
++               * Never true for RSP connections
++               *
++               * Create an EP for the user. If we can't allocate an
++               * EP we are out of resources and need to tell the
++               * requestor that we cant help them.
++               */
++              ia_ptr = sp_ptr->header.owner_ia;
++              ep_ptr = dapl_ep_alloc(ia_ptr, NULL);
++              if (ep_ptr == NULL) {
++                      dapls_cr_free(cr_ptr);
++                      /* Invoking function will call dapls_ib_cm_reject() */
++                      return DAT_INSUFFICIENT_RESOURCES;
++              }
++              ep_ptr->param.ia_handle = ia_ptr;
++              ep_ptr->param.local_ia_address_ptr =
++                  (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address;
++
++              /* Link the EP onto the IA */
++              dapl_ia_link_ep(ia_ptr, ep_ptr);
++      }
++
++      cr_ptr->param.local_ep_handle = ep_ptr;
++
++      if (ep_ptr != NULL) {
++              /* Assign valid EP fields: RSP and PSP_PROVIDER_FLAG only */
++              if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {
++                      ep_ptr->param.ep_state =
++                          DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING;
++              } else {
++                      /* RSP */
++                      dapl_os_assert(sp_ptr->header.handle_type ==
++                                     DAT_HANDLE_TYPE_RSP);
++                      ep_ptr->param.ep_state =
++                          DAT_EP_STATE_PASSIVE_CONNECTION_PENDING;
++              }
++              dapl_ep_link_cm(ep_ptr, ib_cm_handle);
++      }
++
++      /* link the CR onto the SP so we can pick it up later */
++      dapl_sp_link_cr(sp_ptr, cr_ptr);
++
++      return dapls_evd_do_post_cr_event_ext(sp_ptr->evd_handle, event_number,
++                                            sp_ptr, cr_ptr, ext_data);
++}
++
++DAT_RETURN
++dapls_evd_post_connection_event_ext(IN DAPL_EVD * evd_ptr,
++                                  IN DAT_EVENT_NUMBER event_number,
++                                  IN DAT_EP_HANDLE ep_handle,
++                                  IN DAT_COUNT private_data_size,
++                                  IN DAT_PVOID private_data,
++                                  IN DAT_PVOID ext_data)
++{
++      DAT_EVENT *event_ptr;
++
++      dapl_os_lock(&evd_ptr->header.lock);
++      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
++      if (event_ptr == NULL)
++              goto err;
++
++      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;
++      event_ptr->event_data.connect_event_data.private_data_size
++          = private_data_size;
++      event_ptr->event_data.connect_event_data.private_data = private_data;
++
++      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);
++
++      dapli_evd_post_event(evd_ptr, event_ptr);
++      dapl_os_unlock(&evd_ptr->header.lock);
++      return DAT_SUCCESS;
++
++err:
++      dapl_os_unlock(&evd_ptr->header.lock);
++      dapls_evd_post_overflow_event(evd_ptr);
++      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
++}
++#endif
++
++/*
++ * dapli_evd_cqe_to_event
++ *
++ * Convert a CQE into an event structure.
++ *
++ * Input:
++ *    evd_ptr
++ *    cqe_ptr
++ *
++ * Output:
++ *    event_ptr
++ *
++ * Returns:
++ *    none
++ *
++ */
++static void
++dapli_evd_cqe_to_event(IN DAPL_EVD * evd_ptr,
++                     IN void *cqe_ptr, OUT DAT_EVENT * event_ptr)
++{
++      DAPL_EP *ep_ptr;
++      DAPL_COOKIE *cookie;
++      DAT_DTO_COMPLETION_STATUS dto_status;
++      DAPL_COOKIE_BUFFER *buffer;
++
++      /*
++       * All that can be relied on if the status is bad is the status
++       * and WRID.
++       */
++      dto_status = dapls_ib_get_dto_status(cqe_ptr);
++
++      cookie = (DAPL_COOKIE *) (uintptr_t) DAPL_GET_CQE_WRID(cqe_ptr);
++      dapl_os_assert((NULL != cookie));
++
++      ep_ptr = cookie->ep;
++      dapl_os_assert((NULL != ep_ptr));
++
++      dapls_io_trc_update_completion(ep_ptr, cookie, dto_status);
++
++      event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;
++
++      switch (cookie->type) {
++      case DAPL_COOKIE_TYPE_DTO:
++              {
++#ifdef DAT_EXTENSIONS
++                      /* Extended via request post or message receive */
++                      if ((cookie->val.dto.type == DAPL_DTO_TYPE_EXTENSION) ||
++                          (cookie->val.dto.type == DAPL_DTO_TYPE_RECV &&
++                           DAPL_GET_CQE_OPTYPE(cqe_ptr) != OP_RECEIVE)) {
++                              dapls_cqe_to_event_extension(ep_ptr, cookie,
++                                                           cqe_ptr,
++                                                           event_ptr);
++                              if (cookie->val.dto.type == DAPL_DTO_TYPE_RECV)
++                                      dapls_cookie_dealloc(&ep_ptr->
++                                                           recv_buffer,
++                                                           cookie);
++                              else
++                                      dapls_cookie_dealloc(&ep_ptr->
++                                                           req_buffer,
++                                                           cookie);
++                              break;
++                      }
++#endif
++
++                      if (DAPL_DTO_TYPE_RECV == cookie->val.dto.type)
++                              buffer = &ep_ptr->recv_buffer;
++                      else
++                              buffer = &ep_ptr->req_buffer;
++
++                      event_ptr->event_number = DAT_DTO_COMPLETION_EVENT;
++                      event_ptr->event_data.dto_completion_event_data.
++                          ep_handle = cookie->ep;
++                      event_ptr->event_data.dto_completion_event_data.
++                          user_cookie = cookie->val.dto.cookie;
++                      event_ptr->event_data.dto_completion_event_data.status =
++                          dto_status;
++
++                      if (cookie->val.dto.type == DAPL_DTO_TYPE_SEND ||
++                          cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE) {
++                              /* Get size from DTO; CQE value may be off.  */
++                              event_ptr->event_data.dto_completion_event_data.
++                                  transfered_length = cookie->val.dto.size;
++                      } else {
++                              event_ptr->event_data.dto_completion_event_data.
++                                  transfered_length =
++                                  DAPL_GET_CQE_BYTESNUM(cqe_ptr);
++                      }
++
++                      dapls_cookie_dealloc(buffer, cookie);
++                      break;
++              }
++
++      case DAPL_COOKIE_TYPE_RMR:
++              {
++                      event_ptr->event_number = DAT_RMR_BIND_COMPLETION_EVENT;
++
++                      event_ptr->event_data.rmr_completion_event_data.
++                          rmr_handle = cookie->val.rmr.rmr;
++                      event_ptr->event_data.rmr_completion_event_data.
++                          user_cookie = cookie->val.rmr.cookie;
++                      if (dto_status == DAT_DTO_SUCCESS) {
++                              event_ptr->event_data.rmr_completion_event_data.
++                                  status = DAT_RMR_BIND_SUCCESS;
++                              dapl_os_assert((DAPL_GET_CQE_OPTYPE(cqe_ptr)) ==
++                                             OP_BIND_MW);
++                      } else {
++                              dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,
++                                           " MW bind completion ERROR: %d: op %#x ep: %p\n",
++                                           dto_status,
++                                           DAPL_GET_CQE_OPTYPE(cqe_ptr),
++                                           ep_ptr);
++                              event_ptr->event_data.rmr_completion_event_data.
++                                  status = DAT_RMR_OPERATION_FAILED;
++                              dapl_os_atomic_dec(&cookie->val.rmr.rmr->lmr->
++                                                 lmr_ref_count);
++                      }
++
++                      dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
++                      break;
++              }
++      default:
++              {
++                      dapl_os_assert(!"Invalid Operation type");
++                      break;
++              }
++      }                       /* end switch */
++
++      /*
++       * Most error DTO ops result in disconnecting the EP. See
++       * IBTA Vol 1.1, Chapter 10,Table 68, for expected effect on
++       * state.
++       */
++      if ((dto_status != DAT_DTO_SUCCESS) &&
++          (dto_status != DAT_DTO_ERR_FLUSHED)) {
++              DAPL_EVD *evd_ptr;
++
++              /*
++               * If we are connected, generate disconnect and generate an
++               * event. We may be racing with other disconnect ops, so we
++               * need to check. We may also be racing CM connection events,
++               * requiring us to check for connection pending states too.
++               */
++              dapl_os_lock(&ep_ptr->header.lock);
++              if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED ||
++                  ep_ptr->param.ep_state ==
++                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING
++                  || ep_ptr->param.ep_state ==
++                  DAT_EP_STATE_PASSIVE_CONNECTION_PENDING
++                  || ep_ptr->param.ep_state ==
++                  DAT_EP_STATE_COMPLETION_PENDING)
++              {
++                      ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED;
++                      dapl_os_unlock(&ep_ptr->header.lock);
++                      dapls_io_trc_dump(ep_ptr, cqe_ptr, dto_status);
++
++                      /* Let the other side know we have disconnected */
++                      (void)dapls_ib_disconnect(ep_ptr,
++                                                DAT_CLOSE_ABRUPT_FLAG);
++
++                      /* ... and clean up the local side */
++                      evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle;
++                      dapl_sp_remove_ep (ep_ptr);
++                      if (evd_ptr != NULL) {
++                              dapls_evd_post_connection_event(evd_ptr,
++                                                              DAT_CONNECTION_EVENT_BROKEN,
++                                                              (DAT_HANDLE)
++                                                              ep_ptr, 0, 0);
++                      }
++              } else {
++                      dapl_os_unlock(&ep_ptr->header.lock);
++              }
++
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       "DTO completion ERR: status %d, op %s, vendor_err 0x%x - %s\n",
++                       DAPL_GET_CQE_STATUS(cqe_ptr),
++                       DAPL_GET_DTO_OP_STR(cookie->val.dto.type),
++                       DAPL_GET_CQE_VENDOR_ERR(cqe_ptr),
++                       inet_ntoa(((struct sockaddr_in *)&ep_ptr->
++                                  remote_ia_address)->sin_addr));
++      }
++}
++
++/*
++ * dapls_evd_copy_cq
++ *
++ * Copy all entries on a CQ associated with the EVD onto that EVD
++ * Up to caller to handle races, if any.  Note that no EVD waiters will
++ * be awoken by this copy.
++ */
++DAT_RETURN dapls_evd_copy_cq(DAPL_EVD * evd_ptr)
++{
++      ib_work_completion_t cur_cqe;
++      DAT_RETURN dat_status;
++      DAT_EVENT *event;
++
++      if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) {
++              /* Nothing to do if no CQ.  */
++              return DAT_SUCCESS;
++      }
++
++      while (1) {
++              dat_status =
++                  dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,
++                                           evd_ptr, &cur_cqe);
++
++              if (dat_status != DAT_SUCCESS) {
++                      break;
++              }
++
++              /* For debugging.  */
++              dapli_evd_eh_print_cqe(&cur_cqe);
++
++              /*
++               * Can use DAT_DTO_COMPLETION_EVENT because dapli_evd_cqe_to_event
++               * will overwrite.
++               */
++              event = dapli_evd_get_and_init_event(evd_ptr, DAT_DTO_COMPLETION_EVENT);
++              if (event == NULL)
++                      return DAT_QUEUE_FULL;
++
++              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);
++
++              dapli_evd_post_event(evd_ptr, event);
++      }
++
++      if (DAT_GET_TYPE(dat_status) != DAT_QUEUE_EMPTY) {
++              dapl_dbg_log(DAPL_DBG_TYPE_EVD,
++                           "dapls_evd_copy_cq: dapls_ib_completion_poll returned 0x%x\n",
++                           dat_status);
++              dapl_os_assert(!"Bad return from dapls_ib_completion_poll");
++              return dat_status;
++      }
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_evd_cq_poll_to_event
++ *
++ * Attempt to dequeue a single CQE from a CQ and turn it into
++ * an event.
++ *
++ * Input:
++ *    evd_ptr
++ *
++ * Output:
++ *    event
++ *
++ * Returns:
++ *    Status of operation
++ *
++ */
++DAT_RETURN
++dapls_evd_cq_poll_to_event(IN DAPL_EVD * evd_ptr, OUT DAT_EVENT * event)
++{
++      DAT_RETURN dat_status;
++      ib_work_completion_t cur_cqe;
++
++      dat_status = dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,
++                                            evd_ptr, &cur_cqe);
++      if (dat_status == DAT_SUCCESS) {
++              /* For debugging.  */
++              dapli_evd_eh_print_cqe(&cur_cqe);
++
++              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);
++      }
++
++      return dat_status;
++}
++
++#ifdef DAPL_DBG_IO_TRC
++/*
++ * Update I/O completions in the I/O trace buffer. I/O is posted to
++ * the buffer, then we find it here using the cookie and mark it
++ * completed with the completion status
++ */
++void
++dapls_io_trc_update_completion(DAPL_EP * ep_ptr,
++                             DAPL_COOKIE * cookie,
++                             DAT_DTO_COMPLETION_STATUS dto_status)
++{
++      int i;
++      static unsigned int c_cnt = 1;
++
++      for (i = 0; i < DBG_IO_TRC_QLEN; i++) {
++              if (ep_ptr->ibt_base[i].cookie == cookie) {
++                      ep_ptr->ibt_base[i].status = dto_status;
++                      ep_ptr->ibt_base[i].done = c_cnt++;
++              }
++      }
++}
++
++/*
++ * Dump the I/O trace buffers
++ */
++void
++dapls_io_trc_dump(DAPL_EP * ep_ptr,
++                void *cqe_ptr, DAT_DTO_COMPLETION_STATUS dto_status)
++{
++      struct io_buf_track *ibt;
++      int i;
++      int cnt;
++
++      dapl_os_printf("DISCONNECTING: dto_status     = %x\n", dto_status);
++      dapl_os_printf("               OpType        = %x\n",
++                     DAPL_GET_CQE_OPTYPE(cqe_ptr));
++      dapl_os_printf("               Bytes         = %x\n",
++                     DAPL_GET_CQE_BYTESNUM(cqe_ptr));
++      dapl_os_printf("               WRID (cookie) = %llx\n",
++                     DAPL_GET_CQE_WRID(cqe_ptr));
++
++      if (ep_ptr->ibt_dumped == 0) {
++
++              dapl_os_printf("EP %p (qpn %d) I/O trace buffer\n",
++                             ep_ptr, ep_ptr->qpn);
++
++              ep_ptr->ibt_dumped = 1;
++              ibt =
++                  (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->
++                                                           ibt_queue);
++              cnt = DBG_IO_TRC_QLEN;
++              while (ibt != NULL && cnt > 0) {
++                      dapl_os_printf
++                          ("%2d. %3s (%2d, %d) OP: %x cookie %p wqe %p rmv_target_addr %llx rmv_rmr_context %x\n",
++                           cnt, ibt->done == 0 ? "WRK" : "DON", ibt->status,
++                           ibt->done, ibt->op_type, ibt->cookie, ibt->wqe,
++                           ibt->remote_iov.target_address,
++                           ibt->remote_iov.rmr_context);
++                      for (i = 0; i < 3; i++) {
++                              if (ibt->iov[i].segment_length != 0) {
++                                      dapl_os_printf
++                                          ("     (%4llx, %8x, %8llx)\n",
++                                           ibt->iov[i].segment_length,
++                                           ibt->iov[i].lmr_context,
++                                           ibt->iov[i].virtual_address);
++                              }
++                      }
++                      ibt =
++                          (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->
++                                                                   ibt_queue);
++                      cnt--;
++              }
++      }
++}
++#endif                                /* DAPL_DBG_IO_TRC */
++
++/*
++ * Local variables:
++ *  c-indent-level: 4
++ *  c-basic-offset: 4
++ *  tab-width: 8
++ * End:
++ */
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
+index e5a7c3f..65472d7 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
++++ b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
+@@ -165,11 +165,14 @@ extern void dapl_evd_qp_async_error_callback (
+     IN        ib_error_record_t *     cause_ptr,
+     IN        void *                  context);
+-extern void dapls_evd_copy_cq (
++extern DAT_RETURN dapls_evd_copy_cq (
+     DAPL_EVD                  *evd_ptr);
+ extern DAT_RETURN dapls_evd_cq_poll_to_event (
+     IN DAPL_EVD               *evd_ptr,
+     OUT DAT_EVENT             *event);
++extern void dapls_evd_post_overflow_event (
++    IN DAPL_EVD                       *evd_ptr);
++
+ #endif
+diff --git a/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c b/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c
+index ffc50de..fba3711 100644
+--- a/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c
++++ b/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c
+@@ -1,282 +1,282 @@
+-/*\r
+- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
+- *\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-/**********************************************************************\r
+- *\r
+- * MODULE: dapl_sp_util.c\r
+- *\r
+- * PURPOSE: Manage PSP Info structure\r
+- *\r
+- * $Id:$\r
+- **********************************************************************/\r
+-\r
+-#include "dapl.h"\r
+-#include "dapl_ep_util.h"\r
+-#include "dapl_sp_util.h"\r
+-#include "dapl_cr_util.h"\r
+-\r
+-/*\r
+- * Local definitions\r
+- */\r
+-\r
+-/*\r
+- * dapl_sp_alloc\r
+- *\r
+- * alloc and initialize a PSP INFO struct\r
+- *\r
+- * Input:\r
+- *    IA INFO struct ptr\r
+- *\r
+- * Output:\r
+- *    sp_ptr\r
+- *\r
+- * Returns:\r
+- *    NULL\r
+- *    pointer to sp info struct\r
+- *\r
+- */\r
+-DAPL_SP *dapls_sp_alloc(IN DAPL_IA * ia_ptr, IN DAT_BOOLEAN is_psp)\r
+-{\r
+-      DAPL_SP *sp_ptr;\r
+-\r
+-      /* Allocate EP */\r
+-      sp_ptr = (DAPL_SP *) dapl_os_alloc(sizeof(DAPL_SP));\r
+-      if (sp_ptr == NULL) {\r
+-              return (NULL);\r
+-      }\r
+-\r
+-      /* zero the structure */\r
+-      dapl_os_memzero(sp_ptr, sizeof(DAPL_SP));\r
+-\r
+-      /*\r
+-       * initialize the header\r
+-       */\r
+-      sp_ptr->header.provider = ia_ptr->header.provider;\r
+-      if (is_psp) {\r
+-              sp_ptr->header.magic = DAPL_MAGIC_PSP;\r
+-              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_PSP;\r
+-      } else {\r
+-              sp_ptr->header.magic = DAPL_MAGIC_RSP;\r
+-              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_RSP;\r
+-      }\r
+-      sp_ptr->header.owner_ia = ia_ptr;\r
+-      sp_ptr->header.user_context.as_64 = 0;\r
+-      sp_ptr->header.user_context.as_ptr = NULL;\r
+-      dapl_llist_init_entry(&sp_ptr->header.ia_list_entry);\r
+-      dapl_os_lock_init(&sp_ptr->header.lock);\r
+-\r
+-#if defined(_VENDOR_IBAL_)\r
+-      dapl_os_wait_object_init(&sp_ptr->wait_object);\r
+-#endif\r
+-      /*\r
+-       * Initialize the Body (set to NULL above)\r
+-       */\r
+-      dapl_llist_init_head(&sp_ptr->cr_list_head);\r
+-\r
+-      return (sp_ptr);\r
+-}\r
+-\r
+-/*\r
+- * dapl_sp_free\r
+- *\r
+- * Free the passed in PSP structure.\r
+- *\r
+- * Input:\r
+- *    entry point pointer\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    none\r
+- *\r
+- */\r
+-void dapls_sp_free_sp(IN DAPL_SP * sp_ptr)\r
+-{\r
+-      dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP ||\r
+-                     sp_ptr->header.magic == DAPL_MAGIC_RSP);\r
+-      dapl_os_assert(dapl_llist_is_empty(&sp_ptr->cr_list_head));\r
+-\r
+-#if defined(_VENDOR_IBAL_)\r
+-      dapl_os_wait_object_destroy(&sp_ptr->wait_object);\r
+-#endif\r
+-      dapl_os_lock(&sp_ptr->header.lock);\r
+-      sp_ptr->header.magic = DAPL_MAGIC_INVALID;      /* reset magic to prevent reuse */\r
+-      dapl_os_unlock(&sp_ptr->header.lock);\r
+-      dapl_os_free(sp_ptr, sizeof(DAPL_SP));\r
+-}\r
+-\r
+-/*\r
+- * dapl_cr_link_cr\r
+- *\r
+- * Add a cr to a PSP structure\r
+- *\r
+- * Input:\r
+- *    sp_ptr\r
+- *    cr_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    none\r
+- *\r
+- */\r
+-void dapl_sp_link_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)\r
+-{\r
+-      dapl_os_lock(&sp_ptr->header.lock);\r
+-      dapl_llist_add_tail(&sp_ptr->cr_list_head,\r
+-                          &cr_ptr->header.ia_list_entry, cr_ptr);\r
+-      sp_ptr->cr_list_count++;\r
+-      dapl_os_unlock(&sp_ptr->header.lock);\r
+-}\r
+-\r
+-/*\r
+- * dapl_sp_search_cr\r
+- *\r
+- * Search for a CR on the PSP cr_list with a matching cm_handle. When\r
+- * found, remove it from the list and update fields.\r
+- *\r
+- * Must be called with the sp_ptr lock taken.\r
+- *\r
+- * Input:\r
+- *    sp_ptr\r
+- *    ib_cm_handle\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    cr_ptr_fnd      Pointer to matching DAPL_CR\r
+- *\r
+- */\r
+-DAPL_CR *dapl_sp_search_cr(IN DAPL_SP * sp_ptr,\r
+-                         IN dp_ib_cm_handle_t ib_cm_handle)\r
+-{\r
+-      DAPL_CR *cr_ptr;\r
+-      DAPL_CR *cr_ptr_fnd;\r
+-\r
+-      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {\r
+-              return NULL;\r
+-      }\r
+-      cr_ptr_fnd = NULL;\r
+-      cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr->cr_list_head);\r
+-      dapl_os_assert(cr_ptr);\r
+-\r
+-      do {\r
+-              if (cr_ptr->ib_cm_handle == ib_cm_handle) {\r
+-                      cr_ptr_fnd = cr_ptr;\r
+-\r
+-                      break;\r
+-              }\r
+-              cr_ptr = cr_ptr->header.ia_list_entry.flink->data;\r
+-      } while ((void *)cr_ptr != (void *)sp_ptr->cr_list_head->data);\r
+-\r
+-      return cr_ptr_fnd;\r
+-}\r
+-\r
+-/*\r
+- * dapl_sp_remove_cr\r
+- *\r
+- * Remove the CR from the PSP. Done prior to freeing the CR resource.\r
+- *\r
+- * Must be called with the sp_ptr lock taken.\r
+- *\r
+- * Input:\r
+- *    sp_ptr\r
+- *    cr_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    void\r
+- *\r
+- */\r
+-void dapl_sp_remove_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)\r
+-{\r
+-      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "**dapl_sp_remove_cr: removing from empty queue! sp %p\n",\r
+-                           sp_ptr);\r
+-              return;\r
+-      }\r
+-\r
+-      dapl_llist_remove_entry(&sp_ptr->cr_list_head,\r
+-                              &cr_ptr->header.ia_list_entry);\r
+-      sp_ptr->cr_list_count--;\r
+-}\r
+-\r
+-/*\r
+- * dapl_sp_remove_ep\r
+- *\r
+- * Remove a CR from a PSP, given an EP.\r
+- *\r
+- *\r
+- * Input:\r
+- *    ep_ptr\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    void\r
+- *\r
+- */\r
+-void dapl_sp_remove_ep(IN DAPL_EP * ep_ptr)\r
+-{\r
+-      DAPL_SP *sp_ptr;\r
+-      DAPL_CR *cr_ptr;\r
+-\r
+-      cr_ptr = ep_ptr->cr_ptr;\r
+-\r
+-      if (cr_ptr != NULL) {\r
+-              sp_ptr = cr_ptr->sp_ptr;\r
+-\r
+-              dapl_os_lock(&sp_ptr->header.lock);\r
+-\r
+-              /* Remove the CR from the queue */\r
+-              dapl_sp_remove_cr(sp_ptr, cr_ptr);\r
+-\r
+-              dapl_os_unlock(&sp_ptr->header.lock);\r
+-\r
+-              ep_ptr->cr_ptr = NULL;\r
+-\r
+-              /* free memory outside of the lock */\r
+-              dapls_cr_free(cr_ptr);\r
+-\r
+-              return;\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * Local variables:\r
+- *  c-indent-level: 4\r
+- *  c-basic-offset: 4\r
+- *  tab-width: 8\r
+- * End:\r
+- */\r
++/*
++ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
++ *
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++/**********************************************************************
++ *
++ * MODULE: dapl_sp_util.c
++ *
++ * PURPOSE: Manage PSP Info structure
++ *
++ * $Id:$
++ **********************************************************************/
++
++#include "dapl.h"
++#include "dapl_ep_util.h"
++#include "dapl_sp_util.h"
++#include "dapl_cr_util.h"
++
++/*
++ * Local definitions
++ */
++
++/*
++ * dapl_sp_alloc
++ *
++ * alloc and initialize a PSP INFO struct
++ *
++ * Input:
++ *    IA INFO struct ptr
++ *
++ * Output:
++ *    sp_ptr
++ *
++ * Returns:
++ *    NULL
++ *    pointer to sp info struct
++ *
++ */
++DAPL_SP *dapls_sp_alloc(IN DAPL_IA * ia_ptr, IN DAT_BOOLEAN is_psp)
++{
++      DAPL_SP *sp_ptr;
++
++      /* Allocate EP */
++      sp_ptr = (DAPL_SP *) dapl_os_alloc(sizeof(DAPL_SP));
++      if (sp_ptr == NULL) {
++              return (NULL);
++      }
++
++      /* zero the structure */
++      dapl_os_memzero(sp_ptr, sizeof(DAPL_SP));
++
++      /*
++       * initialize the header
++       */
++      sp_ptr->header.provider = ia_ptr->header.provider;
++      if (is_psp) {
++              sp_ptr->header.magic = DAPL_MAGIC_PSP;
++              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_PSP;
++      } else {
++              sp_ptr->header.magic = DAPL_MAGIC_RSP;
++              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_RSP;
++      }
++      sp_ptr->header.owner_ia = ia_ptr;
++      sp_ptr->header.user_context.as_64 = 0;
++      sp_ptr->header.user_context.as_ptr = NULL;
++      dapl_llist_init_entry(&sp_ptr->header.ia_list_entry);
++      dapl_os_lock_init(&sp_ptr->header.lock);
++
++#if defined(_VENDOR_IBAL_)
++      dapl_os_wait_object_init(&sp_ptr->wait_object);
++#endif
++      /*
++       * Initialize the Body (set to NULL above)
++       */
++      dapl_llist_init_head(&sp_ptr->cr_list_head);
++
++      return (sp_ptr);
++}
++
++/*
++ * dapl_sp_free
++ *
++ * Free the passed in PSP structure.
++ *
++ * Input:
++ *    entry point pointer
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    none
++ *
++ */
++void dapls_sp_free_sp(IN DAPL_SP * sp_ptr)
++{
++      dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP ||
++                     sp_ptr->header.magic == DAPL_MAGIC_RSP);
++      dapl_os_assert(dapl_llist_is_empty(&sp_ptr->cr_list_head));
++
++#if defined(_VENDOR_IBAL_)
++      dapl_os_wait_object_destroy(&sp_ptr->wait_object);
++#endif
++      dapl_os_lock(&sp_ptr->header.lock);
++      sp_ptr->header.magic = DAPL_MAGIC_INVALID;      /* reset magic to prevent reuse */
++      dapl_os_unlock(&sp_ptr->header.lock);
++      dapl_os_free(sp_ptr, sizeof(DAPL_SP));
++}
++
++/*
++ * dapl_cr_link_cr
++ *
++ * Add a cr to a PSP structure
++ *
++ * Input:
++ *    sp_ptr
++ *    cr_ptr
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    none
++ *
++ */
++void dapl_sp_link_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)
++{
++      dapl_os_lock(&sp_ptr->header.lock);
++      dapl_llist_add_tail(&sp_ptr->cr_list_head,
++                          &cr_ptr->header.ia_list_entry, cr_ptr);
++      sp_ptr->cr_list_count++;
++      dapl_os_unlock(&sp_ptr->header.lock);
++}
++
++/*
++ * dapl_sp_search_cr
++ *
++ * Search for a CR on the PSP cr_list with a matching cm_handle. When
++ * found, remove it from the list and update fields.
++ *
++ * Must be called with the sp_ptr lock taken.
++ *
++ * Input:
++ *    sp_ptr
++ *    ib_cm_handle
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    cr_ptr_fnd      Pointer to matching DAPL_CR
++ *
++ */
++DAPL_CR *dapl_sp_search_cr(IN DAPL_SP * sp_ptr,
++                         IN dp_ib_cm_handle_t ib_cm_handle)
++{
++      DAPL_CR *cr_ptr;
++      DAPL_CR *cr_ptr_fnd;
++
++      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {
++              return NULL;
++      }
++      cr_ptr_fnd = NULL;
++      cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr->cr_list_head);
++      dapl_os_assert(cr_ptr);
++
++      do {
++              if (cr_ptr->ib_cm_handle == ib_cm_handle) {
++                      cr_ptr_fnd = cr_ptr;
++
++                      break;
++              }
++              cr_ptr = cr_ptr->header.ia_list_entry.flink->data;
++      } while ((void *)cr_ptr != (void *)sp_ptr->cr_list_head->data);
++
++      return cr_ptr_fnd;
++}
++
++/*
++ * dapl_sp_remove_cr
++ *
++ * Remove the CR from the PSP. Done prior to freeing the CR resource.
++ *
++ * Must be called with the sp_ptr lock taken.
++ *
++ * Input:
++ *    sp_ptr
++ *    cr_ptr
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    void
++ *
++ */
++void dapl_sp_remove_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)
++{
++      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "**dapl_sp_remove_cr: removing from empty queue! sp %p\n",
++                           sp_ptr);
++              return;
++      }
++
++      dapl_llist_remove_entry(&sp_ptr->cr_list_head,
++                              &cr_ptr->header.ia_list_entry);
++      sp_ptr->cr_list_count--;
++}
++
++/*
++ * dapl_sp_remove_ep
++ *
++ * Remove a CR from a PSP, given an EP.
++ *
++ *
++ * Input:
++ *    ep_ptr
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    void
++ *
++ */
++void dapl_sp_remove_ep(IN DAPL_EP * ep_ptr)
++{
++      DAPL_SP *sp_ptr;
++      DAPL_CR *cr_ptr;
++
++      cr_ptr = ep_ptr->cr_ptr;
++
++      if (cr_ptr != NULL) {
++              sp_ptr = cr_ptr->sp_ptr;
++
++              dapl_os_lock(&sp_ptr->header.lock);
++
++              /* Remove the CR from the queue */
++              dapl_sp_remove_cr(sp_ptr, cr_ptr);
++
++              dapl_os_unlock(&sp_ptr->header.lock);
++
++              ep_ptr->cr_ptr = NULL;
++
++              /* free memory outside of the lock */
++              dapls_cr_free(cr_ptr);
++
++              return;
++      }
++}
++
++/*
++ * Local variables:
++ *  c-indent-level: 4
++ *  c-basic-offset: 4
++ *  tab-width: 8
++ * End:
++ */
+diff --git a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c
+index f52f5da..e843829 100644
+--- a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c
++++ b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c
+@@ -318,23 +318,21 @@ dapls_ib_qp_free (
+         IN  DAPL_EP                *ep_ptr )
+ {
+-      ib_qp_handle_t          qp_handle;
+       UNREFERENCED_PARAMETER(ia_ptr);
+       dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsQF: free %p, state %s\n", 
+                       ep_ptr->qp_handle,
+                       ib_get_port_state_str(ep_ptr->qp_state));
+-      if (( ep_ptr->qp_handle != IB_INVALID_HANDLE ) &&
+-          ( ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED ))
++      dapl_os_lock(&ep_ptr->header.lock);
++      if (( ep_ptr->qp_handle != IB_INVALID_HANDLE ))
+       {
+-              qp_handle = ep_ptr->qp_handle;
+-              ep_ptr->qp_handle = IB_INVALID_HANDLE;
+-              ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED;
+-              ib_destroy_qp ( qp_handle, NULL /* callback */);
++              ib_destroy_qp ( ep_ptr->qp_handle, ib_sync_destroy );
+               dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsQF: freed QP %p\n",
+-                              qp_handle ); 
++                              ep_ptr->qp_handle ); 
++              ep_ptr->qp_handle = IB_INVALID_HANDLE;
+       }
++      dapl_os_unlock(&ep_ptr->header.lock);
+     return DAT_SUCCESS;
+ }
+diff --git a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c
+index 7f9b819..0852df2 100644
+--- a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c
++++ b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c
+@@ -913,14 +913,14 @@ DAT_RETURN dapls_ib_close_hca ( IN  DAPL_HCA  *p_hca )
+      */
+     REMOVE_REFERENCE (&p_ca->refs);
++    (void) ib_close_ca (p_ca->h_ca, ib_sync_destroy);
++
+     cl_spinlock_destroy (&p_ca->port_lock);
+     cl_spinlock_destroy (&p_ca->evd_cb_lock);
+     if (p_ca->p_ca_attr)
+         dapl_os_free (p_ca->p_ca_attr, sizeof (ib_ca_attr_t));
+-    (void) ib_close_ca (p_ca->h_ca, NULL /* close_callback */);
+-
+     p_hca->ib_hca_handle = IB_INVALID_HANDLE;
+     dapl_os_free (p_ca, sizeof (dapl_ibal_ca_t));
+diff --git a/trunk/ulp/dapl2/dapl/include/dapl.h b/trunk/ulp/dapl2/dapl/include/dapl.h
+index 8dab61e..a522f15 100644
+--- a/trunk/ulp/dapl2/dapl/include/dapl.h
++++ b/trunk/ulp/dapl2/dapl/include/dapl.h
+@@ -349,9 +349,6 @@ struct dapl_evd
+     DAT_BOOLEAN               evd_enabled; /* For attached CNO.  */
+     DAT_BOOLEAN               evd_waitable; /* EVD state.  */
+-    /* Derived from evd_flags; see dapls_evd_internal_create.  */
+-    DAT_BOOLEAN               evd_producer_locking_needed;
+-
+     /* Every EVD has a CQ unless it is a SOFTWARE_EVENT only EVD */
+     ib_cq_handle_t    ib_cq_handle;
+diff --git a/trunk/ulp/dapl2/dapl/include/dapl_debug.h b/trunk/ulp/dapl2/dapl/include/dapl_debug.h
+index b8281ab..6e332e6 100644
+--- a/trunk/ulp/dapl2/dapl/include/dapl_debug.h
++++ b/trunk/ulp/dapl2/dapl/include/dapl_debug.h
+@@ -1,116 +1,116 @@
+-/*\r
+- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
+- *\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-/**********************************************************************\r
+- *\r
+- * MODULE: dapl_debug.h\r
+- *\r
+- * PURPOSE: defines common deuggging flags & data for the DAPL reference\r
+- * implemenation\r
+- *\r
+- * Description:\r
+- *\r
+- *\r
+- * $Id:$\r
+- **********************************************************************/\r
+-\r
+-#ifndef _DAPL_DEBUG_H_\r
+-#define _DAPL_DEBUG_H_\r
+-\r
+-/*\r
+- * Debug level switches\r
+- *\r
+- * Use these bits to enable various tracing/debug options. Each bit\r
+- * represents debugging in a particular subsystem or area of the code.\r
+- *\r
+- * The ERR bit should always be on unless someone disables it for a\r
+- * reason: The ERR flag is used sparingly and will print useful\r
+- * information if it fires.\r
+- */\r
+-typedef enum\r
+-{\r
+-    DAPL_DBG_TYPE_ERR         = 0x0001,\r
+-    DAPL_DBG_TYPE_WARN                = 0x0002,\r
+-    DAPL_DBG_TYPE_EVD         = 0x0004,\r
+-    DAPL_DBG_TYPE_CM          = 0x0008,\r
+-    DAPL_DBG_TYPE_EP          = 0x0010,\r
+-    DAPL_DBG_TYPE_UTIL                = 0x0020,\r
+-    DAPL_DBG_TYPE_CALLBACK    = 0x0040,\r
+-    DAPL_DBG_TYPE_DTO_COMP_ERR        = 0x0080,\r
+-    DAPL_DBG_TYPE_API         = 0x0100,\r
+-    DAPL_DBG_TYPE_RTN         = 0x0200,\r
+-    DAPL_DBG_TYPE_EXCEPTION   = 0x0400,\r
+-    DAPL_DBG_TYPE_SRQ         = 0x0800,\r
+-    DAPL_DBG_TYPE_CNTR        = 0x1000,\r
+-    DAPL_DBG_TYPE_CM_LIST     = 0x2000,\r
+-    DAPL_DBG_TYPE_THREAD      = 0x4000,\r
+-    DAPL_DBG_TYPE_CM_EST      = 0x8000,\r
+-    DAPL_DBG_TYPE_CM_WARN     = 0x10000\r
+-\r
+-} DAPL_DBG_TYPE;\r
+-\r
+-typedef enum\r
+-{\r
+-    DAPL_DBG_DEST_STDOUT      = 0x0001,\r
+-    DAPL_DBG_DEST_SYSLOG      = 0x0002,\r
+-} DAPL_DBG_DEST;\r
+-\r
+-extern DAPL_DBG_TYPE  g_dapl_dbg_type;\r
+-extern DAPL_DBG_DEST  g_dapl_dbg_dest;\r
+-\r
+-extern void dapl_internal_dbg_log(DAPL_DBG_TYPE type,  const char *fmt,  ...);\r
+-\r
+-#define dapl_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log\r
+-\r
+-#if defined(DAPL_DBG)\r
+-#define dapl_dbg_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log\r
+-#else\r
+-#define dapl_dbg_log(...)\r
+-#endif\r
+-\r
+-#include <dat2/dat_ib_extensions.h>\r
+-\r
+-#ifdef DAPL_COUNTERS\r
+-\r
+-#define DAPL_CNTR(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr]++\r
+-#define DAPL_CNTR_DATA(h_ptr, cntr, data) ((DAT_UINT64*)h_ptr->cntrs)[cntr]+= data\r
+-\r
+-DAT_RETURN dapl_query_counter(DAT_HANDLE dh, \r
+-                            int counter, \r
+-                            void *p_cntrs_out,\r
+-                            int reset);\r
+-char *dapl_query_counter_name(DAT_HANDLE dh, int counter);\r
+-void dapl_print_counter(DAT_HANDLE dh, int counter, int reset);\r
+-\r
+-#else\r
+-\r
+-#define DAPL_CNTR(handle, cntr)\r
+-#define DAPL_CNTR_DATA(handle, cntr, data)\r
+-\r
+-#endif /* DAPL_COUNTERS */\r
+-\r
+-#endif /* _DAPL_DEBUG_H_ */\r
++/*
++ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
++ *
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++/**********************************************************************
++ *
++ * MODULE: dapl_debug.h
++ *
++ * PURPOSE: defines common deuggging flags & data for the DAPL reference
++ * implemenation
++ *
++ * Description:
++ *
++ *
++ * $Id:$
++ **********************************************************************/
++
++#ifndef _DAPL_DEBUG_H_
++#define _DAPL_DEBUG_H_
++
++/*
++ * Debug level switches
++ *
++ * Use these bits to enable various tracing/debug options. Each bit
++ * represents debugging in a particular subsystem or area of the code.
++ *
++ * The ERR bit should always be on unless someone disables it for a
++ * reason: The ERR flag is used sparingly and will print useful
++ * information if it fires.
++ */
++typedef enum
++{
++    DAPL_DBG_TYPE_ERR         = 0x0001,
++    DAPL_DBG_TYPE_WARN                = 0x0002,
++    DAPL_DBG_TYPE_EVD         = 0x0004,
++    DAPL_DBG_TYPE_CM          = 0x0008,
++    DAPL_DBG_TYPE_EP          = 0x0010,
++    DAPL_DBG_TYPE_UTIL                = 0x0020,
++    DAPL_DBG_TYPE_CALLBACK    = 0x0040,
++    DAPL_DBG_TYPE_DTO_COMP_ERR        = 0x0080,
++    DAPL_DBG_TYPE_API         = 0x0100,
++    DAPL_DBG_TYPE_RTN         = 0x0200,
++    DAPL_DBG_TYPE_EXCEPTION   = 0x0400,
++    DAPL_DBG_TYPE_SRQ         = 0x0800,
++    DAPL_DBG_TYPE_CNTR        = 0x1000,
++    DAPL_DBG_TYPE_CM_LIST     = 0x2000,
++    DAPL_DBG_TYPE_THREAD      = 0x4000,
++    DAPL_DBG_TYPE_CM_EST      = 0x8000,
++    DAPL_DBG_TYPE_CM_WARN     = 0x10000
++
++} DAPL_DBG_TYPE;
++
++typedef enum
++{
++    DAPL_DBG_DEST_STDOUT      = 0x0001,
++    DAPL_DBG_DEST_SYSLOG      = 0x0002,
++} DAPL_DBG_DEST;
++
++extern DAPL_DBG_TYPE  g_dapl_dbg_type;
++extern DAPL_DBG_DEST  g_dapl_dbg_dest;
++
++extern void dapl_internal_dbg_log(DAPL_DBG_TYPE type,  const char *fmt,  ...);
++
++#define dapl_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log
++
++#if defined(DAPL_DBG)
++#define dapl_dbg_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log
++#else
++#define dapl_dbg_log(...)
++#endif
++
++#include <dat2/dat_ib_extensions.h>
++
++#ifdef DAPL_COUNTERS
++
++#define DAPL_CNTR(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr]++
++#define DAPL_CNTR_DATA(h_ptr, cntr, data) ((DAT_UINT64*)h_ptr->cntrs)[cntr]+= data
++
++DAT_RETURN dapl_query_counter(DAT_HANDLE dh, 
++                            int counter, 
++                            void *p_cntrs_out,
++                            int reset);
++char *dapl_query_counter_name(DAT_HANDLE dh, int counter);
++void dapl_print_counter(DAT_HANDLE dh, int counter, int reset);
++
++#else
++
++#define DAPL_CNTR(handle, cntr)
++#define DAPL_CNTR_DATA(handle, cntr, data)
++
++#endif /* DAPL_COUNTERS */
++
++#endif /* _DAPL_DEBUG_H_ */
+diff --git a/trunk/ulp/dapl2/dapl/openib_cma/cm.c b/trunk/ulp/dapl2/dapl/openib_cma/cm.c
+index c941f74..9338d55 100644
+--- a/trunk/ulp/dapl2/dapl/openib_cma/cm.c
++++ b/trunk/ulp/dapl2/dapl/openib_cma/cm.c
+@@ -105,7 +105,7 @@ static void dapli_route_resolve(struct dapl_cm_id *conn)
+       int ret;
+ #ifdef DAPL_DBG
+       struct rdma_addr *ipaddr = &conn->cm_id->route.addr;
+-      struct rdma_ib_addr *ibaddr = &conn->cm_id->route.addr.addr.ibaddr;
++      struct ib_addr *ibaddr = &conn->cm_id->route.addr.addr.ibaddr;
+ #endif
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,
+diff --git a/trunk/ulp/dapl2/dapl/openib_common/util.c b/trunk/ulp/dapl2/dapl/openib_common/util.c
+index 2345da5..5076df8 100644
+--- a/trunk/ulp/dapl2/dapl/openib_common/util.c
++++ b/trunk/ulp/dapl2/dapl/openib_common/util.c
+@@ -1,724 +1,724 @@
+-/*\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-#include "dapl.h"\r
+-#include "dapl_adapter_util.h"\r
+-#include "dapl_ib_util.h"\r
+-#include "dapl_osd.h"\r
+-\r
+-#include <stdlib.h>\r
+-\r
+-int g_dapl_loopback_connection = 0;\r
+-\r
+-#if defined(_WIN64) || defined(_WIN32)\r
+-#include "..\..\..\..\..\etc\user\comp_channel.cpp"\r
+-#include <rdma\winverbs.h>\r
+-\r
+-int getipaddr_netdev(char *name, char *addr, int addr_len)\r
+-{\r
+-      IWVProvider *prov;\r
+-      WV_DEVICE_ADDRESS devaddr;\r
+-      struct addrinfo *res, *ai;\r
+-      HRESULT hr;\r
+-      int index;\r
+-\r
+-      if (strncmp(name, "rdma_dev", 8)) {\r
+-              return EINVAL;\r
+-      }\r
+-\r
+-      index = atoi(name + 8);\r
+-\r
+-      hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov);\r
+-      if (FAILED(hr)) {\r
+-              return hr;\r
+-      }\r
+-\r
+-      hr = getaddrinfo("..localmachine", NULL, NULL, &res);\r
+-      if (hr) {\r
+-              goto release;\r
+-      }\r
+-\r
+-      for (ai = res; ai; ai = ai->ai_next) {\r
+-              hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr);\r
+-              if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) {\r
+-                      memcpy(addr, ai->ai_addr, ai->ai_addrlen);\r
+-                      goto free;\r
+-              }\r
+-      }\r
+-      hr = ENODEV;\r
+-\r
+-free:\r
+-      freeaddrinfo(res);\r
+-release:\r
+-      prov->lpVtbl->Release(prov);\r
+-      return hr;\r
+-}\r
+-\r
+-#else                         // _WIN64 || WIN32\r
+-\r
+-/* Get IP address using network device name */\r
+-int getipaddr_netdev(char *name, char *addr, int addr_len)\r
+-{\r
+-      struct ifreq ifr;\r
+-      int skfd, ret, len;\r
+-\r
+-      /* Fill in the structure */\r
+-      snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);\r
+-      ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;\r
+-\r
+-      /* Create a socket fd */\r
+-      skfd = socket(PF_INET, SOCK_STREAM, 0);\r
+-      ret = ioctl(skfd, SIOCGIFADDR, &ifr);\r
+-      if (ret)\r
+-              goto bail;\r
+-\r
+-      switch (ifr.ifr_addr.sa_family) {\r
+-#ifdef        AF_INET6\r
+-      case AF_INET6:\r
+-              len = sizeof(struct sockaddr_in6);\r
+-              break;\r
+-#endif\r
+-      case AF_INET:\r
+-      default:\r
+-              len = sizeof(struct sockaddr);\r
+-              break;\r
+-      }\r
+-\r
+-      if (len <= addr_len)\r
+-              memcpy(addr, &ifr.ifr_addr, len);\r
+-      else\r
+-              ret = EINVAL;\r
+-\r
+-      bail:\r
+-      close(skfd);\r
+-      return ret;\r
+-}\r
+-#endif\r
+-\r
+-enum ibv_mtu dapl_ib_mtu(int mtu)\r
+-{\r
+-      switch (mtu) {\r
+-      case 256:\r
+-              return IBV_MTU_256;\r
+-      case 512:\r
+-              return IBV_MTU_512;\r
+-      case 1024:\r
+-              return IBV_MTU_1024;\r
+-      case 2048:\r
+-              return IBV_MTU_2048;\r
+-      case 4096:\r
+-              return IBV_MTU_4096;\r
+-      default:\r
+-              return IBV_MTU_1024;\r
+-      }\r
+-}\r
+-\r
+-char *dapl_ib_mtu_str(enum ibv_mtu mtu)\r
+-{\r
+-      switch (mtu) {\r
+-      case IBV_MTU_256:\r
+-              return "256";\r
+-      case IBV_MTU_512:\r
+-              return "512";\r
+-      case IBV_MTU_1024:\r
+-              return "1024";\r
+-      case IBV_MTU_2048:\r
+-              return "2048";\r
+-      case IBV_MTU_4096:\r
+-              return "4096";\r
+-      default:\r
+-              return "1024";\r
+-      }\r
+-}\r
+-\r
+-DAT_RETURN getlocalipaddr(char *addr, int addr_len)\r
+-{\r
+-      struct sockaddr_in *sin;\r
+-      struct addrinfo *res, hint, *ai;\r
+-      int ret;\r
+-      char hostname[256];\r
+-      char *netdev = getenv("DAPL_SCM_NETDEV");\r
+-\r
+-      /* use provided netdev instead of default hostname */\r
+-      if (netdev != NULL) {\r
+-              ret = getipaddr_netdev(netdev, addr, addr_len);\r
+-              if (ret) {                      \r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               " getlocalipaddr: DAPL_SCM_NETDEV provided %s"\r
+-                              " but not configured on system? ERR = %s\n",\r
+-                              netdev, strerror(ret));\r
+-                      return dapl_convert_errno(ret, "getlocalipaddr");\r
+-              } else \r
+-                      return DAT_SUCCESS;\r
+-      }\r
+-\r
+-      if (addr_len < sizeof(*sin)) {\r
+-              return DAT_INTERNAL_ERROR;\r
+-      }\r
+-\r
+-      ret = gethostname(hostname, 256);\r
+-      if (ret)\r
+-              return dapl_convert_errno(ret, "gethostname");\r
+-\r
+-      memset(&hint, 0, sizeof hint);\r
+-      hint.ai_flags = AI_PASSIVE;\r
+-      hint.ai_family = AF_INET;\r
+-      hint.ai_socktype = SOCK_STREAM;\r
+-      hint.ai_protocol = IPPROTO_TCP;\r
+-\r
+-      ret = getaddrinfo(hostname, NULL, &hint, &res);\r
+-      if (ret) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret));\r
+-              return DAT_INVALID_ADDRESS;\r
+-      }\r
+-\r
+-      ret = DAT_INVALID_ADDRESS;\r
+-      for (ai = res; ai; ai = ai->ai_next) {\r
+-              sin = (struct sockaddr_in *)ai->ai_addr;\r
+-              if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) {\r
+-                      *((struct sockaddr_in *)addr) = *sin;\r
+-                      ret = DAT_SUCCESS;\r
+-                      break;\r
+-              }\r
+-      }\r
+-\r
+-      freeaddrinfo(res);\r
+-      return ret;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_query_hca\r
+- *\r
+- * Query the hca attribute\r
+- *\r
+- * Input:\r
+- *    hca_handl               hca handle      \r
+- *    ia_attr                 attribute of the ia\r
+- *    ep_attr                 attribute of the ep\r
+- *    ip_addr                 ip address of DET NIC\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INVALID_HANDLE\r
+- */\r
+-\r
+-DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,\r
+-                            OUT DAT_IA_ATTR * ia_attr,\r
+-                            OUT DAT_EP_ATTR * ep_attr,\r
+-                            OUT DAT_SOCK_ADDR6 * ip_addr)\r
+-{\r
+-      struct ibv_device_attr dev_attr;\r
+-      struct ibv_port_attr port_attr;\r
+-\r
+-      if (hca_ptr->ib_hca_handle == NULL) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");\r
+-              return (DAT_INVALID_HANDLE);\r
+-      }\r
+-\r
+-      /* local IP address of device, set during ia_open */\r
+-      if (ip_addr != NULL)\r
+-              memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));\r
+-\r
+-      if (ia_attr == NULL && ep_attr == NULL)\r
+-              return DAT_SUCCESS;\r
+-\r
+-      /* query verbs for this device and port attributes */\r
+-      if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||\r
+-          ibv_query_port(hca_ptr->ib_hca_handle,\r
+-                         hca_ptr->port_num, &port_attr))\r
+-              return (dapl_convert_errno(errno, "ib_query_hca"));\r
+-\r
+-      if (ia_attr != NULL) {\r
+-              (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));\r
+-              ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';\r
+-              ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';\r
+-              ia_attr->ia_address_ptr =\r
+-                  (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;\r
+-\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+-                           " query_hca: %s %s \n",\r
+-                           ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+-                           inet_ntoa(((struct sockaddr_in *)\r
+-                                      &hca_ptr->hca_address)->sin_addr));\r
+-\r
+-              ia_attr->hardware_version_major = dev_attr.hw_ver;\r
+-              /* ia_attr->hardware_version_minor   = dev_attr.fw_ver; */\r
+-              ia_attr->max_eps = dev_attr.max_qp;\r
+-              ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;\r
+-              ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;\r
+-              ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;\r
+-              ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;\r
+-              ia_attr->max_rdma_read_per_ep_out =\r
+-                  dev_attr.max_qp_init_rd_atom;\r
+-              ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;\r
+-              ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;\r
+-              ia_attr->max_evds = dev_attr.max_cq;\r
+-              ia_attr->max_evd_qlen = dev_attr.max_cqe;\r
+-              ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;\r
+-              ia_attr->max_lmrs = dev_attr.max_mr;\r
+-              /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */\r
+-              ia_attr->max_lmr_block_size = \r
+-                  (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;\r
+-              ia_attr->max_rmrs = dev_attr.max_mw;\r
+-              ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;\r
+-              ia_attr->max_rmr_target_address = dev_attr.max_mr_size;\r
+-              ia_attr->max_pzs = dev_attr.max_pd;\r
+-              ia_attr->max_message_size = port_attr.max_msg_sz;\r
+-              ia_attr->max_rdma_size = port_attr.max_msg_sz;\r
+-              /* iWARP spec. - 1 sge for RDMA reads */\r
+-              if (hca_ptr->ib_hca_handle->device->transport_type\r
+-                  == IBV_TRANSPORT_IWARP)\r
+-                      ia_attr->max_iov_segments_per_rdma_read = 1;\r
+-              else\r
+-                      ia_attr->max_iov_segments_per_rdma_read =\r
+-                          dev_attr.max_sge;\r
+-              ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;\r
+-              ia_attr->num_transport_attr = 0;\r
+-              ia_attr->transport_attr = NULL;\r
+-              ia_attr->num_vendor_attr = 0;\r
+-              ia_attr->vendor_attr = NULL;\r
+-#ifdef DAT_EXTENSIONS\r
+-              ia_attr->extension_supported = DAT_EXTENSION_IB;\r
+-              ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;\r
+-#endif\r
+-              /* save key device attributes for CM exchange */\r
+-              hca_ptr->ib_trans.rd_atom_in  = dev_attr.max_qp_rd_atom;\r
+-              hca_ptr->ib_trans.rd_atom_out = dev_attr.max_qp_init_rd_atom;\r
+-              \r
+-              hca_ptr->ib_trans.mtu = DAPL_MIN(port_attr.active_mtu,\r
+-                                               hca_ptr->ib_trans.mtu);\r
+-              hca_ptr->ib_trans.ack_timer =\r
+-                  DAPL_MAX(dev_attr.local_ca_ack_delay,\r
+-                           hca_ptr->ib_trans.ack_timer);\r
+-\r
+-              /* set MTU in transport specific named attribute */\r
+-              hca_ptr->ib_trans.named_attr.name = "DAT_IB_TRANSPORT_MTU";\r
+-              hca_ptr->ib_trans.named_attr.value =\r
+-                  dapl_ib_mtu_str(hca_ptr->ib_trans.mtu);\r
+-\r
+-              if (hca_ptr->ib_hca_handle->device->transport_type != IBV_TRANSPORT_IB)\r
+-                      goto skip_ib;\r
+-\r
+-               /* set SL, PKEY values, defaults = 0 */\r
+-               hca_ptr->ib_trans.pkey_idx = 0;\r
+-               hca_ptr->ib_trans.pkey = htons(dapl_os_get_env_val("DAPL_IB_PKEY", 0));\r
+-               hca_ptr->ib_trans.sl = dapl_os_get_env_val("DAPL_IB_SL", 0);\r
+-\r
+-              /* index provided, get pkey; pkey provided, get index */\r
+-              if (hca_ptr->ib_trans.pkey) {\r
+-                      int i; uint16_t pkey = 0;\r
+-                      for (i=0; i < dev_attr.max_pkeys; i++) {\r
+-                              if (ibv_query_pkey(hca_ptr->ib_hca_handle,\r
+-                                                 hca_ptr->port_num,\r
+-                                                 i, &pkey)) {\r
+-                                      i = dev_attr.max_pkeys;\r
+-                                      break;\r
+-                              }\r
+-                              if (pkey == hca_ptr->ib_trans.pkey) {\r
+-                                      hca_ptr->ib_trans.pkey_idx = i;\r
+-                                      break;\r
+-                              }\r
+-                      }\r
+-                      if (i == dev_attr.max_pkeys) {\r
+-                              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                                       " ERR: new pkey(0x%x), query (%s)"\r
+-                                       " err or key !found, using default pkey_idx=0\n",\r
+-                                       ntohs(hca_ptr->ib_trans.pkey), strerror(errno));\r
+-                      }\r
+-              }\r
+-skip_ib:\r
+-\r
+-#ifdef DEFINE_ATTR_LINK_LAYER\r
+-#ifndef _OPENIB_CMA_\r
+-              if (port_attr.link_layer == IBV_LINK_LAYER_ETHERNET)\r
+-                      hca_ptr->ib_trans.global = 1;\r
+-\r
+-              dapl_log(DAPL_DBG_TYPE_UTIL,\r
+-                       " query_hca: port.link_layer = 0x%x\n", \r
+-                       port_attr.link_layer);\r
+-#endif\r
+-#endif\r
+-              dapl_log(DAPL_DBG_TYPE_UTIL,\r
+-                           " query_hca: (%x.%x) eps %d, sz %d evds %d,"\r
+-                           " sz %d mtu %d - pkey %x p_idx %d sl %d\n",\r
+-                           ia_attr->hardware_version_major,\r
+-                           ia_attr->hardware_version_minor,\r
+-                           ia_attr->max_eps, ia_attr->max_dto_per_ep,\r
+-                           ia_attr->max_evds, ia_attr->max_evd_qlen,\r
+-                           128 << hca_ptr->ib_trans.mtu,\r
+-                           ntohs(hca_ptr->ib_trans.pkey),\r
+-                           hca_ptr->ib_trans.pkey_idx,\r
+-                           hca_ptr->ib_trans.sl);\r
+-\r
+-              dapl_log(DAPL_DBG_TYPE_UTIL,\r
+-                           " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d"\r
+-                           " ack_time %d mr %u\n",\r
+-                           ia_attr->max_message_size, ia_attr->max_rdma_size,\r
+-                           ia_attr->max_iov_segments_per_dto,\r
+-                           ia_attr->max_lmrs, ia_attr->max_rmrs,\r
+-                           hca_ptr->ib_trans.ack_timer,\r
+-                           ia_attr->max_lmr_block_size);\r
+-      }\r
+-\r
+-      if (ep_attr != NULL) {\r
+-              (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));\r
+-              ep_attr->max_message_size = port_attr.max_msg_sz;\r
+-              ep_attr->max_rdma_size = port_attr.max_msg_sz;\r
+-              ep_attr->max_recv_dtos = dev_attr.max_qp_wr;\r
+-              ep_attr->max_request_dtos = dev_attr.max_qp_wr;\r
+-              ep_attr->max_recv_iov = dev_attr.max_sge;\r
+-              ep_attr->max_request_iov = dev_attr.max_sge;\r
+-              ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;\r
+-              ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;\r
+-              ep_attr->max_rdma_read_iov = dev_attr.max_sge;\r
+-              ep_attr->max_rdma_write_iov = dev_attr.max_sge;\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+-                           " query_hca: MAX msg %llu mtu %d qsz %d iov %d"\r
+-                           " rdma i%d,o%d\n",\r
+-                           ep_attr->max_message_size,\r
+-                           128 << hca_ptr->ib_trans.mtu,\r
+-                           ep_attr->max_recv_dtos, \r
+-                           ep_attr->max_recv_iov,\r
+-                           ep_attr->max_rdma_read_in,\r
+-                           ep_attr->max_rdma_read_out);\r
+-      }\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_setup_async_callback\r
+- *\r
+- * Set up an asynchronous callbacks of various kinds\r
+- *\r
+- * Input:\r
+- *    ia_handle               IA handle\r
+- *    handler_type            type of handler to set up\r
+- *    callback_handle         handle param for completion callbacks\r
+- *    callback                callback routine pointer\r
+- *    context                 argument for callback routine\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INVALID_PARAMETER\r
+- *\r
+- */\r
+-DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,\r
+-                                       IN DAPL_ASYNC_HANDLER_TYPE\r
+-                                       handler_type, IN DAPL_EVD * evd_ptr,\r
+-                                       IN ib_async_handler_t callback,\r
+-                                       IN void *context)\r
+-{\r
+-      ib_hca_transport_t *hca_ptr;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+-                   " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n",\r
+-                   ia_ptr, handler_type, evd_ptr, callback, context);\r
+-\r
+-      hca_ptr = &ia_ptr->hca_ptr->ib_trans;\r
+-      switch (handler_type) {\r
+-      case DAPL_ASYNC_UNAFILIATED:\r
+-              hca_ptr->async_unafiliated = (ib_async_handler_t) callback;\r
+-              hca_ptr->async_un_ctx = context;\r
+-              break;\r
+-      case DAPL_ASYNC_CQ_ERROR:\r
+-              hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;\r
+-              break;\r
+-      case DAPL_ASYNC_CQ_COMPLETION:\r
+-              hca_ptr->async_cq = (ib_async_dto_handler_t) callback;\r
+-              break;\r
+-      case DAPL_ASYNC_QP_ERROR:\r
+-              hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;\r
+-              break;\r
+-      default:\r
+-              break;\r
+-      }\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-void dapli_async_event_cb(struct _ib_hca_transport *hca)\r
+-{\r
+-      struct ibv_async_event event;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca);\r
+-\r
+-      if (hca->destroy)\r
+-              return;\r
+-\r
+-      if (!ibv_get_async_event(hca->ib_ctx, &event)) {\r
+-\r
+-              switch (event.event_type) {\r
+-              case IBV_EVENT_CQ_ERR:\r
+-              {\r
+-                      struct dapl_ep *evd_ptr =\r
+-                              event.element.cq->cq_context;\r
+-\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               "dapl async_event CQ (%p) ERR %d\n",\r
+-                               evd_ptr, event.event_type);\r
+-\r
+-                      /* report up if async callback still setup */\r
+-                      if (hca->async_cq_error)\r
+-                              hca->async_cq_error(hca->ib_ctx,\r
+-                                                  event.element.cq,\r
+-                                                  &event,\r
+-                                                  (void *)evd_ptr);\r
+-                      break;\r
+-              }\r
+-              case IBV_EVENT_COMM_EST:\r
+-              {\r
+-                      /* Received msgs on connected QP before RTU */\r
+-                      dapl_log(DAPL_DBG_TYPE_UTIL,\r
+-                               " async_event COMM_EST(%p) rdata beat RTU\n",\r
+-                               event.element.qp);\r
+-\r
+-                      break;\r
+-              }\r
+-              case IBV_EVENT_QP_FATAL:\r
+-              case IBV_EVENT_QP_REQ_ERR:\r
+-              case IBV_EVENT_QP_ACCESS_ERR:\r
+-              case IBV_EVENT_QP_LAST_WQE_REACHED:\r
+-              case IBV_EVENT_SRQ_ERR:\r
+-              case IBV_EVENT_SRQ_LIMIT_REACHED:\r
+-              case IBV_EVENT_SQ_DRAINED:\r
+-              {\r
+-                      struct dapl_ep *ep_ptr =\r
+-                              event.element.qp->qp_context;\r
+-\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               "dapl async_event QP (%p) ERR %d\n",\r
+-                               ep_ptr, event.event_type);\r
+-\r
+-                      /* report up if async callback still setup */\r
+-                      if (hca->async_qp_error)\r
+-                              hca->async_qp_error(hca->ib_ctx,\r
+-                                                  ep_ptr->qp_handle,\r
+-                                                  &event,\r
+-                                                  (void *)ep_ptr);\r
+-                      break;\r
+-              }\r
+-              case IBV_EVENT_PATH_MIG:\r
+-              case IBV_EVENT_PATH_MIG_ERR:\r
+-              case IBV_EVENT_DEVICE_FATAL:\r
+-              case IBV_EVENT_PORT_ACTIVE:\r
+-              case IBV_EVENT_PORT_ERR:\r
+-              case IBV_EVENT_LID_CHANGE:\r
+-              case IBV_EVENT_PKEY_CHANGE:\r
+-              case IBV_EVENT_SM_CHANGE:\r
+-              {\r
+-                      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                               "dapl async_event: DEV ERR %d\n",\r
+-                               event.event_type);\r
+-\r
+-                      /* report up if async callback still setup */\r
+-                      if (hca->async_unafiliated)\r
+-                              hca->async_unafiliated(hca->ib_ctx, \r
+-                                                     &event,  \r
+-                                                     hca->async_un_ctx);\r
+-                      break;\r
+-              }\r
+-              case IBV_EVENT_CLIENT_REREGISTER:\r
+-                      /* no need to report this event this time */\r
+-                      dapl_log(DAPL_DBG_TYPE_UTIL,\r
+-                               " async_event: IBV_CLIENT_REREGISTER\n");\r
+-                      break;\r
+-\r
+-              default:\r
+-                      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                               "dapl async_event: %d UNKNOWN\n",\r
+-                               event.event_type);\r
+-                      break;\r
+-\r
+-              }\r
+-              ibv_ack_async_event(&event);\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * dapls_set_provider_specific_attr\r
+- *\r
+- * Input:\r
+- *      attr_ptr        Pointer provider specific attributes\r
+- *\r
+- * Output:\r
+- *      none\r
+- *\r
+- * Returns:\r
+- *      void\r
+- */\r
+-DAT_NAMED_ATTR ib_attrs[] = {\r
+-      {\r
+-       "DAT_IB_TRANSPORT_MTU", "2048"}\r
+-      ,\r
+-#ifdef DAT_EXTENSIONS\r
+-      {\r
+-       "DAT_EXTENSION_INTERFACE", "TRUE"}\r
+-      ,\r
+-      {\r
+-       DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}\r
+-      ,\r
+-      {\r
+-       DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}\r
+-      ,\r
+-      {\r
+-       DAT_IB_ATTR_IMMED_DATA, "TRUE"}\r
+-      ,\r
+-#ifndef _OPENIB_CMA_\r
+-      {\r
+-       DAT_IB_ATTR_UD, "TRUE"}\r
+-      ,\r
+-#endif\r
+-#ifdef DAPL_COUNTERS\r
+-      {\r
+-       DAT_ATTR_COUNTERS, "TRUE"}\r
+-      ,\r
+-#endif                                /* DAPL_COUNTERS */\r
+-#endif\r
+-};\r
+-\r
+-#define SPEC_ATTR_SIZE( x )     (sizeof( x ) / sizeof( DAT_NAMED_ATTR))\r
+-\r
+-void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,\r
+-                                      IN DAT_PROVIDER_ATTR * attr_ptr)\r
+-{\r
+-      attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);\r
+-      attr_ptr->provider_specific_attr = ib_attrs;\r
+-\r
+-      /* set MTU to actual settings */\r
+-      ib_attrs[0].value = ia_ptr->hca_ptr->ib_trans.named_attr.value;\r
+-}\r
+-\r
+-/*\r
+- * Map all socket CM event codes to the DAT equivelent. Common to all providers\r
+- */\r
+-#define DAPL_IB_EVENT_CNT     13\r
+-\r
+-static struct ib_cm_event_map {\r
+-      const ib_cm_events_t ib_cm_event;\r
+-      DAT_EVENT_NUMBER dat_event_num;\r
+-} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {\r
+-/* 00 */ {IB_CME_CONNECTED, \r
+-        DAT_CONNECTION_EVENT_ESTABLISHED},\r
+-/* 01 */ {IB_CME_DISCONNECTED, \r
+-        DAT_CONNECTION_EVENT_DISCONNECTED},\r
+-/* 02 */ {IB_CME_DISCONNECTED_ON_LINK_DOWN,\r
+-        DAT_CONNECTION_EVENT_DISCONNECTED},\r
+-/* 03 */ {IB_CME_CONNECTION_REQUEST_PENDING, \r
+-        DAT_CONNECTION_REQUEST_EVENT},\r
+-/* 04 */ {IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,\r
+-        DAT_CONNECTION_REQUEST_EVENT},\r
+-/* 05 */ {IB_CME_CONNECTION_REQUEST_ACKED,\r
+-        DAT_CONNECTION_EVENT_ESTABLISHED},\r
+-/* 06 */ {IB_CME_DESTINATION_REJECT,\r
+-        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+-/* 07 */ {IB_CME_DESTINATION_REJECT_PRIVATE_DATA,\r
+-        DAT_CONNECTION_EVENT_PEER_REJECTED},\r
+-/* 08 */ {IB_CME_DESTINATION_UNREACHABLE, \r
+-        DAT_CONNECTION_EVENT_UNREACHABLE},\r
+-/* 09 */ {IB_CME_TOO_MANY_CONNECTION_REQUESTS,\r
+-        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+-/* 10 */ {IB_CME_BROKEN, \r
+-        DAT_CONNECTION_EVENT_BROKEN},\r
+-/* 11 */ {IB_CME_TIMEOUT, \r
+-        DAT_CONNECTION_EVENT_TIMED_OUT},\r
+-/* 12 */ {IB_CME_LOCAL_FAILURE,               /* always last */\r
+-        DAT_CONNECTION_EVENT_BROKEN}\r
+-};\r
+-\r
+-/*\r
+- * dapls_ib_get_cm_event\r
+- *\r
+- * Return a DAT connection event given a provider CM event.\r
+- *\r
+- * Input:\r
+- *    dat_event_num   DAT event we need an equivelent CM event for\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    ib_cm_event of translated DAPL value\r
+- */\r
+-DAT_EVENT_NUMBER\r
+-dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,\r
+-                     IN DAT_BOOLEAN active)\r
+-{\r
+-      DAT_EVENT_NUMBER dat_event_num;\r
+-      int i;\r
+-\r
+-      active = active;\r
+-\r
+-      if (ib_cm_event > IB_CME_LOCAL_FAILURE)\r
+-              return (DAT_EVENT_NUMBER) 0;\r
+-\r
+-      dat_event_num = 0;\r
+-      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
+-              if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {\r
+-                      dat_event_num = ib_cm_event_map[i].dat_event_num;\r
+-                      break;\r
+-              }\r
+-      }\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+-                   "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n",\r
+-                   active ? "active" : "passive", ib_cm_event, dat_event_num);\r
+-\r
+-      return dat_event_num;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_get_dat_event\r
+- *\r
+- * Return a DAT connection event given a provider CM event.\r
+- * \r
+- * Input:\r
+- *    ib_cm_event     event provided to the dapl callback routine\r
+- *    active          switch indicating active or passive connection\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_EVENT_NUMBER of translated provider value\r
+- */\r
+-ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)\r
+-{\r
+-      ib_cm_events_t ib_cm_event;\r
+-      int i;\r
+-\r
+-      ib_cm_event = 0;\r
+-      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
+-              if (dat_event_num == ib_cm_event_map[i].dat_event_num) {\r
+-                      ib_cm_event = ib_cm_event_map[i].ib_cm_event;\r
+-                      break;\r
+-              }\r
+-      }\r
+-      return ib_cm_event;\r
+-}\r
++/*
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++#include "dapl.h"
++#include "dapl_adapter_util.h"
++#include "dapl_ib_util.h"
++#include "dapl_osd.h"
++
++#include <stdlib.h>
++
++int g_dapl_loopback_connection = 0;
++
++#if defined(_WIN64) || defined(_WIN32)
++#include "..\..\..\..\..\etc\user\comp_channel.cpp"
++#include <rdma\winverbs.h>
++
++int getipaddr_netdev(char *name, char *addr, int addr_len)
++{
++      IWVProvider *prov;
++      WV_DEVICE_ADDRESS devaddr;
++      struct addrinfo *res, *ai;
++      HRESULT hr;
++      int index;
++
++      if (strncmp(name, "rdma_dev", 8)) {
++              return EINVAL;
++      }
++
++      index = atoi(name + 8);
++
++      hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov);
++      if (FAILED(hr)) {
++              return hr;
++      }
++
++      hr = getaddrinfo("..localmachine", NULL, NULL, &res);
++      if (hr) {
++              goto release;
++      }
++
++      for (ai = res; ai; ai = ai->ai_next) {
++              hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr);
++              if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) {
++                      memcpy(addr, ai->ai_addr, ai->ai_addrlen);
++                      goto free;
++              }
++      }
++      hr = ENODEV;
++
++free:
++      freeaddrinfo(res);
++release:
++      prov->lpVtbl->Release(prov);
++      return hr;
++}
++
++#else                         // _WIN64 || WIN32
++
++/* Get IP address using network device name */
++int getipaddr_netdev(char *name, char *addr, int addr_len)
++{
++      struct ifreq ifr;
++      int skfd, ret, len;
++
++      /* Fill in the structure */
++      snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);
++      ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;
++
++      /* Create a socket fd */
++      skfd = socket(PF_INET, SOCK_STREAM, 0);
++      ret = ioctl(skfd, SIOCGIFADDR, &ifr);
++      if (ret)
++              goto bail;
++
++      switch (ifr.ifr_addr.sa_family) {
++#ifdef        AF_INET6
++      case AF_INET6:
++              len = sizeof(struct sockaddr_in6);
++              break;
++#endif
++      case AF_INET:
++      default:
++              len = sizeof(struct sockaddr);
++              break;
++      }
++
++      if (len <= addr_len)
++              memcpy(addr, &ifr.ifr_addr, len);
++      else
++              ret = EINVAL;
++
++      bail:
++      close(skfd);
++      return ret;
++}
++#endif
++
++enum ibv_mtu dapl_ib_mtu(int mtu)
++{
++      switch (mtu) {
++      case 256:
++              return IBV_MTU_256;
++      case 512:
++              return IBV_MTU_512;
++      case 1024:
++              return IBV_MTU_1024;
++      case 2048:
++              return IBV_MTU_2048;
++      case 4096:
++              return IBV_MTU_4096;
++      default:
++              return IBV_MTU_1024;
++      }
++}
++
++char *dapl_ib_mtu_str(enum ibv_mtu mtu)
++{
++      switch (mtu) {
++      case IBV_MTU_256:
++              return "256";
++      case IBV_MTU_512:
++              return "512";
++      case IBV_MTU_1024:
++              return "1024";
++      case IBV_MTU_2048:
++              return "2048";
++      case IBV_MTU_4096:
++              return "4096";
++      default:
++              return "1024";
++      }
++}
++
++DAT_RETURN getlocalipaddr(char *addr, int addr_len)
++{
++      struct sockaddr_in *sin;
++      struct addrinfo *res, hint, *ai;
++      int ret;
++      char hostname[256];
++      char *netdev = getenv("DAPL_SCM_NETDEV");
++
++      /* use provided netdev instead of default hostname */
++      if (netdev != NULL) {
++              ret = getipaddr_netdev(netdev, addr, addr_len);
++              if (ret) {                      
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               " getlocalipaddr: DAPL_SCM_NETDEV provided %s"
++                              " but not configured on system? ERR = %s\n",
++                              netdev, strerror(ret));
++                      return dapl_convert_errno(ret, "getlocalipaddr");
++              } else 
++                      return DAT_SUCCESS;
++      }
++
++      if (addr_len < sizeof(*sin)) {
++              return DAT_INTERNAL_ERROR;
++      }
++
++      ret = gethostname(hostname, 256);
++      if (ret)
++              return dapl_convert_errno(ret, "gethostname");
++
++      memset(&hint, 0, sizeof hint);
++      hint.ai_flags = AI_PASSIVE;
++      hint.ai_family = AF_INET;
++      hint.ai_socktype = SOCK_STREAM;
++      hint.ai_protocol = IPPROTO_TCP;
++
++      ret = getaddrinfo(hostname, NULL, &hint, &res);
++      if (ret) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret));
++              return DAT_INVALID_ADDRESS;
++      }
++
++      ret = DAT_INVALID_ADDRESS;
++      for (ai = res; ai; ai = ai->ai_next) {
++              sin = (struct sockaddr_in *)ai->ai_addr;
++              if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) {
++                      *((struct sockaddr_in *)addr) = *sin;
++                      ret = DAT_SUCCESS;
++                      break;
++              }
++      }
++
++      freeaddrinfo(res);
++      return ret;
++}
++
++/*
++ * dapls_ib_query_hca
++ *
++ * Query the hca attribute
++ *
++ * Input:
++ *    hca_handl               hca handle      
++ *    ia_attr                 attribute of the ia
++ *    ep_attr                 attribute of the ep
++ *    ip_addr                 ip address of DET NIC
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INVALID_HANDLE
++ */
++
++DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,
++                            OUT DAT_IA_ATTR * ia_attr,
++                            OUT DAT_EP_ATTR * ep_attr,
++                            OUT DAT_SOCK_ADDR6 * ip_addr)
++{
++      struct ibv_device_attr dev_attr;
++      struct ibv_port_attr port_attr;
++
++      if (hca_ptr->ib_hca_handle == NULL) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");
++              return (DAT_INVALID_HANDLE);
++      }
++
++      /* local IP address of device, set during ia_open */
++      if (ip_addr != NULL)
++              memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));
++
++      if (ia_attr == NULL && ep_attr == NULL)
++              return DAT_SUCCESS;
++
++      /* query verbs for this device and port attributes */
++      if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||
++          ibv_query_port(hca_ptr->ib_hca_handle,
++                         hca_ptr->port_num, &port_attr))
++              return (dapl_convert_errno(errno, "ib_query_hca"));
++
++      if (ia_attr != NULL) {
++              (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));
++              ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
++              ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
++              ia_attr->ia_address_ptr =
++                  (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;
++
++              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
++                           " query_hca: %s %s \n",
++                           ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
++                           inet_ntoa(((struct sockaddr_in *)
++                                      &hca_ptr->hca_address)->sin_addr));
++
++              ia_attr->hardware_version_major = dev_attr.hw_ver;
++              /* ia_attr->hardware_version_minor   = dev_attr.fw_ver; */
++              ia_attr->max_eps = dev_attr.max_qp;
++              ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;
++              ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
++              ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
++              ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;
++              ia_attr->max_rdma_read_per_ep_out =
++                  dev_attr.max_qp_init_rd_atom;
++              ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;
++              ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;
++              ia_attr->max_evds = dev_attr.max_cq;
++              ia_attr->max_evd_qlen = dev_attr.max_cqe;
++              ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;
++              ia_attr->max_lmrs = dev_attr.max_mr;
++              /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */
++              ia_attr->max_lmr_block_size = 
++                  (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;
++              ia_attr->max_rmrs = dev_attr.max_mw;
++              ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;
++              ia_attr->max_rmr_target_address = dev_attr.max_mr_size;
++              ia_attr->max_pzs = dev_attr.max_pd;
++              ia_attr->max_message_size = port_attr.max_msg_sz;
++              ia_attr->max_rdma_size = port_attr.max_msg_sz;
++              /* iWARP spec. - 1 sge for RDMA reads */
++              if (hca_ptr->ib_hca_handle->device->transport_type
++                  == IBV_TRANSPORT_IWARP)
++                      ia_attr->max_iov_segments_per_rdma_read = 1;
++              else
++                      ia_attr->max_iov_segments_per_rdma_read =
++                          dev_attr.max_sge;
++              ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;
++              ia_attr->num_transport_attr = 0;
++              ia_attr->transport_attr = NULL;
++              ia_attr->num_vendor_attr = 0;
++              ia_attr->vendor_attr = NULL;
++#ifdef DAT_EXTENSIONS
++              ia_attr->extension_supported = DAT_EXTENSION_IB;
++              ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;
++#endif
++              /* save key device attributes for CM exchange */
++              hca_ptr->ib_trans.rd_atom_in  = dev_attr.max_qp_rd_atom;
++              hca_ptr->ib_trans.rd_atom_out = dev_attr.max_qp_init_rd_atom;
++              
++              hca_ptr->ib_trans.mtu = DAPL_MIN(port_attr.active_mtu,
++                                               hca_ptr->ib_trans.mtu);
++              hca_ptr->ib_trans.ack_timer =
++                  DAPL_MAX(dev_attr.local_ca_ack_delay,
++                           hca_ptr->ib_trans.ack_timer);
++
++              /* set MTU in transport specific named attribute */
++              hca_ptr->ib_trans.named_attr.name = "DAT_IB_TRANSPORT_MTU";
++              hca_ptr->ib_trans.named_attr.value =
++                  dapl_ib_mtu_str(hca_ptr->ib_trans.mtu);
++
++              if (hca_ptr->ib_hca_handle->device->transport_type != IBV_TRANSPORT_IB)
++                      goto skip_ib;
++
++               /* set SL, PKEY values, defaults = 0 */
++               hca_ptr->ib_trans.pkey_idx = 0;
++               hca_ptr->ib_trans.pkey = htons(dapl_os_get_env_val("DAPL_IB_PKEY", 0));
++               hca_ptr->ib_trans.sl = dapl_os_get_env_val("DAPL_IB_SL", 0);
++
++              /* index provided, get pkey; pkey provided, get index */
++              if (hca_ptr->ib_trans.pkey) {
++                      int i; uint16_t pkey = 0;
++                      for (i=0; i < dev_attr.max_pkeys; i++) {
++                              if (ibv_query_pkey(hca_ptr->ib_hca_handle,
++                                                 hca_ptr->port_num,
++                                                 i, &pkey)) {
++                                      i = dev_attr.max_pkeys;
++                                      break;
++                              }
++                              if (pkey == hca_ptr->ib_trans.pkey) {
++                                      hca_ptr->ib_trans.pkey_idx = i;
++                                      break;
++                              }
++                      }
++                      if (i == dev_attr.max_pkeys) {
++                              dapl_log(DAPL_DBG_TYPE_ERR,
++                                       " ERR: new pkey(0x%x), query (%s)"
++                                       " err or key !found, using default pkey_idx=0\n",
++                                       ntohs(hca_ptr->ib_trans.pkey), strerror(errno));
++                      }
++              }
++skip_ib:
++
++#ifdef DEFINE_ATTR_LINK_LAYER
++#ifndef _OPENIB_CMA_
++              if (port_attr.link_layer == IBV_LINK_LAYER_ETHERNET)
++                      hca_ptr->ib_trans.global = 1;
++
++              dapl_log(DAPL_DBG_TYPE_UTIL,
++                       " query_hca: port.link_layer = 0x%x\n", 
++                       port_attr.link_layer);
++#endif
++#endif
++              dapl_log(DAPL_DBG_TYPE_UTIL,
++                           " query_hca: (%x.%x) eps %d, sz %d evds %d,"
++                           " sz %d mtu %d - pkey %x p_idx %d sl %d\n",
++                           ia_attr->hardware_version_major,
++                           ia_attr->hardware_version_minor,
++                           ia_attr->max_eps, ia_attr->max_dto_per_ep,
++                           ia_attr->max_evds, ia_attr->max_evd_qlen,
++                           128 << hca_ptr->ib_trans.mtu,
++                           ntohs(hca_ptr->ib_trans.pkey),
++                           hca_ptr->ib_trans.pkey_idx,
++                           hca_ptr->ib_trans.sl);
++
++              dapl_log(DAPL_DBG_TYPE_UTIL,
++                           " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d"
++                           " ack_time %d mr %u\n",
++                           ia_attr->max_message_size, ia_attr->max_rdma_size,
++                           ia_attr->max_iov_segments_per_dto,
++                           ia_attr->max_lmrs, ia_attr->max_rmrs,
++                           hca_ptr->ib_trans.ack_timer,
++                           ia_attr->max_lmr_block_size);
++      }
++
++      if (ep_attr != NULL) {
++              (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));
++              ep_attr->max_message_size = port_attr.max_msg_sz;
++              ep_attr->max_rdma_size = port_attr.max_msg_sz;
++              ep_attr->max_recv_dtos = dev_attr.max_qp_wr;
++              ep_attr->max_request_dtos = dev_attr.max_qp_wr;
++              ep_attr->max_recv_iov = dev_attr.max_sge;
++              ep_attr->max_request_iov = dev_attr.max_sge;
++              ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
++              ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
++              ep_attr->max_rdma_read_iov = dev_attr.max_sge;
++              ep_attr->max_rdma_write_iov = dev_attr.max_sge;
++              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
++                           " query_hca: MAX msg %llu mtu %d qsz %d iov %d"
++                           " rdma i%d,o%d\n",
++                           ep_attr->max_message_size,
++                           128 << hca_ptr->ib_trans.mtu,
++                           ep_attr->max_recv_dtos, 
++                           ep_attr->max_recv_iov,
++                           ep_attr->max_rdma_read_in,
++                           ep_attr->max_rdma_read_out);
++      }
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_ib_setup_async_callback
++ *
++ * Set up an asynchronous callbacks of various kinds
++ *
++ * Input:
++ *    ia_handle               IA handle
++ *    handler_type            type of handler to set up
++ *    callback_handle         handle param for completion callbacks
++ *    callback                callback routine pointer
++ *    context                 argument for callback routine
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INVALID_PARAMETER
++ *
++ */
++DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,
++                                       IN DAPL_ASYNC_HANDLER_TYPE
++                                       handler_type, IN DAPL_EVD * evd_ptr,
++                                       IN ib_async_handler_t callback,
++                                       IN void *context)
++{
++      ib_hca_transport_t *hca_ptr;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
++                   " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n",
++                   ia_ptr, handler_type, evd_ptr, callback, context);
++
++      hca_ptr = &ia_ptr->hca_ptr->ib_trans;
++      switch (handler_type) {
++      case DAPL_ASYNC_UNAFILIATED:
++              hca_ptr->async_unafiliated = (ib_async_handler_t) callback;
++              hca_ptr->async_un_ctx = context;
++              break;
++      case DAPL_ASYNC_CQ_ERROR:
++              hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;
++              break;
++      case DAPL_ASYNC_CQ_COMPLETION:
++              hca_ptr->async_cq = (ib_async_dto_handler_t) callback;
++              break;
++      case DAPL_ASYNC_QP_ERROR:
++              hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;
++              break;
++      default:
++              break;
++      }
++      return DAT_SUCCESS;
++}
++
++void dapli_async_event_cb(struct _ib_hca_transport *hca)
++{
++      struct ibv_async_event event;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca);
++
++      if (hca->destroy)
++              return;
++
++      if (!ibv_get_async_event(hca->ib_ctx, &event)) {
++
++              switch (event.event_type) {
++              case IBV_EVENT_CQ_ERR:
++              {
++                      struct dapl_ep *evd_ptr =
++                              event.element.cq->cq_context;
++
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               "dapl async_event CQ (%p) ERR %d\n",
++                               evd_ptr, event.event_type);
++
++                      /* report up if async callback still setup */
++                      if (hca->async_cq_error)
++                              hca->async_cq_error(hca->ib_ctx,
++                                                  event.element.cq,
++                                                  &event,
++                                                  (void *)evd_ptr);
++                      break;
++              }
++              case IBV_EVENT_COMM_EST:
++              {
++                      /* Received msgs on connected QP before RTU */
++                      dapl_log(DAPL_DBG_TYPE_UTIL,
++                               " async_event COMM_EST(%p) rdata beat RTU\n",
++                               event.element.qp);
++
++                      break;
++              }
++              case IBV_EVENT_QP_FATAL:
++              case IBV_EVENT_QP_REQ_ERR:
++              case IBV_EVENT_QP_ACCESS_ERR:
++              case IBV_EVENT_QP_LAST_WQE_REACHED:
++              case IBV_EVENT_SRQ_ERR:
++              case IBV_EVENT_SRQ_LIMIT_REACHED:
++              case IBV_EVENT_SQ_DRAINED:
++              {
++                      struct dapl_ep *ep_ptr =
++                              event.element.qp->qp_context;
++
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               "dapl async_event QP (%p) ERR %d\n",
++                               ep_ptr, event.event_type);
++
++                      /* report up if async callback still setup */
++                      if (hca->async_qp_error)
++                              hca->async_qp_error(hca->ib_ctx,
++                                                  ep_ptr->qp_handle,
++                                                  &event,
++                                                  (void *)ep_ptr);
++                      break;
++              }
++              case IBV_EVENT_PATH_MIG:
++              case IBV_EVENT_PATH_MIG_ERR:
++              case IBV_EVENT_DEVICE_FATAL:
++              case IBV_EVENT_PORT_ACTIVE:
++              case IBV_EVENT_PORT_ERR:
++              case IBV_EVENT_LID_CHANGE:
++              case IBV_EVENT_PKEY_CHANGE:
++              case IBV_EVENT_SM_CHANGE:
++              {
++                      dapl_log(DAPL_DBG_TYPE_WARN,
++                               "dapl async_event: DEV ERR %d\n",
++                               event.event_type);
++
++                      /* report up if async callback still setup */
++                      if (hca->async_unafiliated)
++                              hca->async_unafiliated(hca->ib_ctx, 
++                                                     &event,  
++                                                     hca->async_un_ctx);
++                      break;
++              }
++              case IBV_EVENT_CLIENT_REREGISTER:
++                      /* no need to report this event this time */
++                      dapl_log(DAPL_DBG_TYPE_UTIL,
++                               " async_event: IBV_CLIENT_REREGISTER\n");
++                      break;
++
++              default:
++                      dapl_log(DAPL_DBG_TYPE_WARN,
++                               "dapl async_event: %d UNKNOWN\n",
++                               event.event_type);
++                      break;
++
++              }
++              ibv_ack_async_event(&event);
++      }
++}
++
++/*
++ * dapls_set_provider_specific_attr
++ *
++ * Input:
++ *      attr_ptr        Pointer provider specific attributes
++ *
++ * Output:
++ *      none
++ *
++ * Returns:
++ *      void
++ */
++DAT_NAMED_ATTR ib_attrs[] = {
++      {
++       "DAT_IB_TRANSPORT_MTU", "2048"}
++      ,
++#ifdef DAT_EXTENSIONS
++      {
++       "DAT_EXTENSION_INTERFACE", "TRUE"}
++      ,
++      {
++       DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}
++      ,
++      {
++       DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}
++      ,
++      {
++       DAT_IB_ATTR_IMMED_DATA, "TRUE"}
++      ,
++#ifndef _OPENIB_CMA_
++      {
++       DAT_IB_ATTR_UD, "TRUE"}
++      ,
++#endif
++#ifdef DAPL_COUNTERS
++      {
++       DAT_ATTR_COUNTERS, "TRUE"}
++      ,
++#endif                                /* DAPL_COUNTERS */
++#endif
++};
++
++#define SPEC_ATTR_SIZE( x )     (sizeof( x ) / sizeof( DAT_NAMED_ATTR))
++
++void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,
++                                      IN DAT_PROVIDER_ATTR * attr_ptr)
++{
++      attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);
++      attr_ptr->provider_specific_attr = ib_attrs;
++
++      /* set MTU to actual settings */
++      ib_attrs[0].value = ia_ptr->hca_ptr->ib_trans.named_attr.value;
++}
++
++/*
++ * Map all socket CM event codes to the DAT equivelent. Common to all providers
++ */
++#define DAPL_IB_EVENT_CNT     13
++
++static struct ib_cm_event_map {
++      const ib_cm_events_t ib_cm_event;
++      DAT_EVENT_NUMBER dat_event_num;
++} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {
++/* 00 */ {IB_CME_CONNECTED, 
++        DAT_CONNECTION_EVENT_ESTABLISHED},
++/* 01 */ {IB_CME_DISCONNECTED, 
++        DAT_CONNECTION_EVENT_DISCONNECTED},
++/* 02 */ {IB_CME_DISCONNECTED_ON_LINK_DOWN,
++        DAT_CONNECTION_EVENT_DISCONNECTED},
++/* 03 */ {IB_CME_CONNECTION_REQUEST_PENDING, 
++        DAT_CONNECTION_REQUEST_EVENT},
++/* 04 */ {IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
++        DAT_CONNECTION_REQUEST_EVENT},
++/* 05 */ {IB_CME_CONNECTION_REQUEST_ACKED,
++        DAT_CONNECTION_EVENT_ESTABLISHED},
++/* 06 */ {IB_CME_DESTINATION_REJECT,
++        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
++/* 07 */ {IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
++        DAT_CONNECTION_EVENT_PEER_REJECTED},
++/* 08 */ {IB_CME_DESTINATION_UNREACHABLE, 
++        DAT_CONNECTION_EVENT_UNREACHABLE},
++/* 09 */ {IB_CME_TOO_MANY_CONNECTION_REQUESTS,
++        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
++/* 10 */ {IB_CME_BROKEN, 
++        DAT_CONNECTION_EVENT_BROKEN},
++/* 11 */ {IB_CME_TIMEOUT, 
++        DAT_CONNECTION_EVENT_TIMED_OUT},
++/* 12 */ {IB_CME_LOCAL_FAILURE,               /* always last */
++        DAT_CONNECTION_EVENT_BROKEN}
++};
++
++/*
++ * dapls_ib_get_cm_event
++ *
++ * Return a DAT connection event given a provider CM event.
++ *
++ * Input:
++ *    dat_event_num   DAT event we need an equivelent CM event for
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    ib_cm_event of translated DAPL value
++ */
++DAT_EVENT_NUMBER
++dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,
++                     IN DAT_BOOLEAN active)
++{
++      DAT_EVENT_NUMBER dat_event_num;
++      int i;
++
++      active = active;
++
++      if (ib_cm_event > IB_CME_LOCAL_FAILURE)
++              return (DAT_EVENT_NUMBER) 0;
++
++      dat_event_num = 0;
++      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
++              if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {
++                      dat_event_num = ib_cm_event_map[i].dat_event_num;
++                      break;
++              }
++      }
++      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
++                   "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n",
++                   active ? "active" : "passive", ib_cm_event, dat_event_num);
++
++      return dat_event_num;
++}
++
++/*
++ * dapls_ib_get_dat_event
++ *
++ * Return a DAT connection event given a provider CM event.
++ * 
++ * Input:
++ *    ib_cm_event     event provided to the dapl callback routine
++ *    active          switch indicating active or passive connection
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_EVENT_NUMBER of translated provider value
++ */
++ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)
++{
++      ib_cm_events_t ib_cm_event;
++      int i;
++
++      ib_cm_event = 0;
++      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
++              if (dat_event_num == ib_cm_event_map[i].dat_event_num) {
++                      ib_cm_event = ib_cm_event_map[i].ib_cm_event;
++                      break;
++              }
++      }
++      return ib_cm_event;
++}
+diff --git a/trunk/ulp/dapl2/dapl/openib_scm/cm.c b/trunk/ulp/dapl2/dapl/openib_scm/cm.c
+index 24065ce..56d4c73 100644
+--- a/trunk/ulp/dapl2/dapl/openib_scm/cm.c
++++ b/trunk/ulp/dapl2/dapl/openib_scm/cm.c
+@@ -1,1927 +1,1927 @@
+-/*\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-/***************************************************************************\r
+- *\r
+- *   Module:           uDAPL\r
+- *\r
+- *   Filename:                 dapl_ib_cm.c\r
+- *\r
+- *   Author:           Arlin Davis\r
+- *\r
+- *   Created:          3/10/2005\r
+- *\r
+- *   Description: \r
+- *\r
+- *   The uDAPL openib provider - connection management\r
+- *\r
+- ****************************************************************************\r
+- *               Source Control System Information\r
+- *\r
+- *    $Id: $\r
+- *\r
+- *    Copyright (c) 2005 Intel Corporation.  All rights reserved.\r
+- *\r
+- **************************************************************************/\r
+-\r
+-#if defined(_WIN32)\r
+-#define FD_SETSIZE 1024\r
+-#define DAPL_FD_SETSIZE FD_SETSIZE\r
+-#endif\r
+-\r
+-#include "dapl.h"\r
+-#include "dapl_adapter_util.h"\r
+-#include "dapl_evd_util.h"\r
+-#include "dapl_cr_util.h"\r
+-#include "dapl_name_service.h"\r
+-#include "dapl_ib_util.h"\r
+-#include "dapl_ep_util.h"\r
+-#include "dapl_osd.h"\r
+-\r
+-/* forward declarations */\r
+-static DAT_RETURN\r
+-dapli_socket_connect(DAPL_EP * ep_ptr,\r
+-                   DAT_IA_ADDRESS_PTR r_addr,\r
+-                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data);\r
+-\r
+-#ifdef DAPL_DBG\r
+-/* Check for EP linking to IA and proper connect state */\r
+-void dapli_ep_check(DAPL_EP *ep)\r
+-{\r
+-      DAPL_IA *ia_ptr = ep->header.owner_ia;\r
+-      DAPL_EP *ep_ptr, *next_ep_ptr;\r
+-      int found = 0;\r
+-\r
+-      dapl_os_lock(&ia_ptr->header.lock);\r
+-      ep_ptr = (dapl_llist_is_empty (&ia_ptr->ep_list_head)\r
+-              ? NULL : dapl_llist_peek_head (&ia_ptr->ep_list_head));\r
+-\r
+-      while (ep_ptr != NULL) {\r
+-              next_ep_ptr = \r
+-                      dapl_llist_next_entry(&ia_ptr->ep_list_head,\r
+-                                            &ep_ptr->header.ia_list_entry);\r
+-              if (ep == ep_ptr) {\r
+-                      found++;\r
+-                      if ((ep->cr_ptr && ep->param.ep_state \r
+-                              != DAT_EP_STATE_COMPLETION_PENDING) ||\r
+-                          (!ep->cr_ptr && ep->param.ep_state \r
+-                              != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING))\r
+-                              goto err;\r
+-                      else \r
+-                              goto match;\r
+-              }\r
+-              ep_ptr = next_ep_ptr;\r
+-      }\r
+-err:\r
+-      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-               " dapli_ep_check ERR: %s %s ep=%p state=%d magic=0x%x\n", \r
+-               ep->cr_ptr ? "PASSIVE":"ACTIVE", \r
+-               found ? "WRONG_STATE":"NOT_FOUND" ,\r
+-               ep, ep->param.ep_state, ep->header.magic);\r
+-match:\r
+-      dapl_os_unlock(&ia_ptr->header.lock);\r
+-      return;\r
+-}\r
+-#else\r
+-#define dapli_ep_check(ep)\r
+-#endif\r
+-\r
+-#if defined(_WIN32) || defined(_WIN64)\r
+-enum DAPL_FD_EVENTS {\r
+-      DAPL_FD_READ = 0x1,\r
+-      DAPL_FD_WRITE = 0x2,\r
+-      DAPL_FD_ERROR = 0x4\r
+-};\r
+-\r
+-static int dapl_config_socket(DAPL_SOCKET s)\r
+-{\r
+-      unsigned long nonblocking = 1;\r
+-      int ret, opt = 1;\r
+-\r
+-      ret = ioctlsocket(s, FIONBIO, &nonblocking);\r
+-\r
+-      /* no delay for small packets */\r
+-      if (!ret)\r
+-              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, \r
+-                               (char *)&opt, sizeof(opt));\r
+-      return ret;\r
+-}\r
+-\r
+-static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,\r
+-                             int addrlen)\r
+-{\r
+-      int err;\r
+-\r
+-      err = connect(s, addr, addrlen);\r
+-      if (err == SOCKET_ERROR)\r
+-              err = WSAGetLastError();\r
+-      return (err == WSAEWOULDBLOCK) ? EAGAIN : err;\r
+-}\r
+-\r
+-struct dapl_fd_set {\r
+-      struct fd_set set[3];\r
+-};\r
+-\r
+-static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
+-{\r
+-      return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
+-}\r
+-\r
+-static void dapl_fd_zero(struct dapl_fd_set *set)\r
+-{\r
+-      FD_ZERO(&set->set[0]);\r
+-      FD_ZERO(&set->set[1]);\r
+-      FD_ZERO(&set->set[2]);\r
+-}\r
+-\r
+-static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
+-                     enum DAPL_FD_EVENTS event)\r
+-{\r
+-      FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);\r
+-      FD_SET(s, &set->set[2]);\r
+-      return 0;\r
+-}\r
+-\r
+-static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
+-{\r
+-      struct fd_set rw_fds;\r
+-      struct fd_set err_fds;\r
+-      struct timeval tv;\r
+-      int ret;\r
+-\r
+-      FD_ZERO(&rw_fds);\r
+-      FD_ZERO(&err_fds);\r
+-      FD_SET(s, &rw_fds);\r
+-      FD_SET(s, &err_fds);\r
+-\r
+-      tv.tv_sec = 0;\r
+-      tv.tv_usec = 0;\r
+-\r
+-      if (event == DAPL_FD_READ)\r
+-              ret = select(1, &rw_fds, NULL, &err_fds, &tv);\r
+-      else\r
+-              ret = select(1, NULL, &rw_fds, &err_fds, &tv);\r
+-\r
+-      if (ret == 0)\r
+-              return 0;\r
+-      else if (ret == SOCKET_ERROR)\r
+-              return DAPL_FD_ERROR;\r
+-      else if (FD_ISSET(s, &rw_fds))\r
+-              return event;\r
+-      else\r
+-              return DAPL_FD_ERROR;\r
+-}\r
+-\r
+-static int dapl_select(struct dapl_fd_set *set)\r
+-{\r
+-      int ret;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n");\r
+-      ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL);\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n");\r
+-\r
+-      if (ret == SOCKET_ERROR)\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
+-                           " dapl_select: error 0x%x\n", WSAGetLastError());\r
+-\r
+-      return ret;\r
+-}\r
+-\r
+-static int dapl_socket_errno(void)\r
+-{\r
+-      int err;\r
+-\r
+-      err = WSAGetLastError();\r
+-      switch (err) {\r
+-      case WSAEACCES:\r
+-      case WSAEADDRINUSE:\r
+-              return EADDRINUSE;\r
+-      case WSAECONNRESET:\r
+-              return ECONNRESET;\r
+-      default:\r
+-              return err;\r
+-      }\r
+-}\r
+-#else                         // _WIN32 || _WIN64\r
+-enum DAPL_FD_EVENTS {\r
+-      DAPL_FD_READ = POLLIN,\r
+-      DAPL_FD_WRITE = POLLOUT,\r
+-      DAPL_FD_ERROR = POLLERR\r
+-};\r
+-\r
+-static int dapl_config_socket(DAPL_SOCKET s)\r
+-{\r
+-      int ret, opt = 1;\r
+-\r
+-      /* non-blocking */\r
+-      ret = fcntl(s, F_GETFL);\r
+-      if (ret >= 0)\r
+-              ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);\r
+-\r
+-      /* no delay for small packets */\r
+-      if (!ret)\r
+-              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, \r
+-                               (char *)&opt, sizeof(opt));\r
+-      return ret;\r
+-}\r
+-\r
+-static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,\r
+-                             int addrlen)\r
+-{\r
+-      int ret;\r
+-\r
+-      ret = connect(s, addr, addrlen);\r
+-\r
+-      return (errno == EINPROGRESS) ? EAGAIN : ret;\r
+-}\r
+-\r
+-struct dapl_fd_set {\r
+-      int index;\r
+-      struct pollfd set[DAPL_FD_SETSIZE];\r
+-};\r
+-\r
+-static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
+-{\r
+-      return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
+-}\r
+-\r
+-static void dapl_fd_zero(struct dapl_fd_set *set)\r
+-{\r
+-      set->index = 0;\r
+-}\r
+-\r
+-static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
+-                     enum DAPL_FD_EVENTS event)\r
+-{\r
+-      if (set->index == DAPL_FD_SETSIZE - 1) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",\r
+-                       set->index + 1);\r
+-              return -1;\r
+-      }\r
+-\r
+-      set->set[set->index].fd = s;\r
+-      set->set[set->index].revents = 0;\r
+-      set->set[set->index++].events = event;\r
+-      return 0;\r
+-}\r
+-\r
+-static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
+-{\r
+-      struct pollfd fds;\r
+-      int ret;\r
+-\r
+-      fds.fd = s;\r
+-      fds.events = event;\r
+-      fds.revents = 0;\r
+-      ret = poll(&fds, 1, 0);\r
+-      dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",\r
+-               s, ret, fds.revents);\r
+-      if (ret == 0)\r
+-              return 0;\r
+-      else if (ret < 0 || (fds.revents & (POLLERR | POLLHUP | POLLNVAL))) \r
+-              return DAPL_FD_ERROR;\r
+-      else \r
+-              return event;\r
+-}\r
+-\r
+-static int dapl_select(struct dapl_fd_set *set)\r
+-{\r
+-      int ret;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index);\r
+-      ret = poll(set->set, set->index, -1);\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret);\r
+-      return ret;\r
+-}\r
+-\r
+-#define dapl_socket_errno() errno\r
+-#endif\r
+-\r
+-static void dapli_cm_thread_signal(dp_ib_cm_handle_t cm_ptr) \r
+-{\r
+-      if (cm_ptr->hca)\r
+-              send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0);\r
+-}\r
+-\r
+-static void dapli_cm_free(dp_ib_cm_handle_t cm_ptr) \r
+-{\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_FREE;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-      dapli_cm_thread_signal(cm_ptr);\r
+-}\r
+-\r
+-static void dapli_cm_dealloc(dp_ib_cm_handle_t cm_ptr) \r
+-{\r
+-      dapl_os_assert(!cm_ptr->ref_count);\r
+-      \r
+-      if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
+-              shutdown(cm_ptr->socket, SHUT_RDWR);\r
+-              closesocket(cm_ptr->socket);\r
+-      }\r
+-      if (cm_ptr->ah) \r
+-              ibv_destroy_ah(cm_ptr->ah);\r
+-      \r
+-      dapl_os_lock_destroy(&cm_ptr->lock);\r
+-      dapl_os_wait_object_destroy(&cm_ptr->event);\r
+-      dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
+-}\r
+-\r
+-void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->ref_count++;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-}\r
+-\r
+-void dapls_cm_release(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->ref_count--;\r
+-      if (cm_ptr->ref_count) {\r
+-                dapl_os_unlock(&cm_ptr->lock);\r
+-              return;\r
+-      }\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-      dapli_cm_dealloc(cm_ptr);\r
+-}\r
+-\r
+-static dp_ib_cm_handle_t dapli_cm_alloc(DAPL_EP *ep_ptr)\r
+-{\r
+-      dp_ib_cm_handle_t cm_ptr;\r
+-\r
+-      /* Allocate CM, init lock, and initialize */\r
+-      if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL)\r
+-              return NULL;\r
+-\r
+-      (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));\r
+-      if (dapl_os_lock_init(&cm_ptr->lock))\r
+-              goto bail;\r
+-\r
+-      if (dapl_os_wait_object_init(&cm_ptr->event)) {\r
+-              dapl_os_lock_destroy(&cm_ptr->lock);\r
+-              goto bail;\r
+-      }\r
+-      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->list_entry);\r
+-      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);\r
+-\r
+-      cm_ptr->msg.ver = htons(DCM_VER);\r
+-      cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+-      dapls_cm_acquire(cm_ptr);\r
+-              \r
+-      /* Link EP and CM */\r
+-      if (ep_ptr != NULL) {\r
+-              dapl_ep_link_cm(ep_ptr, cm_ptr); /* ref++ */\r
+-              cm_ptr->ep = ep_ptr;\r
+-              cm_ptr->hca = ((DAPL_IA *)ep_ptr->param.ia_handle)->hca_ptr;\r
+-      }\r
+-      return cm_ptr;\r
+-bail:\r
+-      dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
+-      return NULL;\r
+-}\r
+-\r
+-/* queue socket for processing CM work */\r
+-static void dapli_cm_queue(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      /* add to work queue for cr thread processing */\r
+-      dapl_os_lock(&cm_ptr->hca->ib_trans.lock);\r
+-      dapls_cm_acquire(cm_ptr);\r
+-      dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list,\r
+-                          (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry, cm_ptr);\r
+-      dapl_os_unlock(&cm_ptr->hca->ib_trans.lock);\r
+-      dapli_cm_thread_signal(cm_ptr);\r
+-}\r
+-\r
+-/* called with local LIST lock */\r
+-static void dapli_cm_dequeue(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      /* Remove from work queue, cr thread processing */\r
+-      dapl_llist_remove_entry(&cm_ptr->hca->ib_trans.list,\r
+-                              (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);\r
+-      dapls_cm_release(cm_ptr);\r
+-}\r
+-\r
+-/* BLOCKING: called from dapl_ep_free, EP link will be last ref */\r
+-void dapls_cm_free(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      dapl_log(DAPL_DBG_TYPE_CM,\r
+-               " cm_free: cm %p %s ep %p refs=%d\n", \r
+-               cm_ptr, dapl_cm_state_str(cm_ptr->state),\r
+-               cm_ptr->ep, cm_ptr->ref_count);\r
+-      \r
+-      /* free from internal workq, wait until EP is last ref */\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_FREE;\r
+-      while (cm_ptr->ref_count != 1) {\r
+-              dapli_cm_thread_signal(cm_ptr);\r
+-              dapl_os_unlock(&cm_ptr->lock);\r
+-              dapl_os_sleep_usec(10000);\r
+-              dapl_os_lock(&cm_ptr->lock);\r
+-      }\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      /* unlink, dequeue from EP. Final ref so release will destroy */\r
+-      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);\r
+-}\r
+-\r
+-/*\r
+- * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect\r
+- *                 or from ep_free. \r
+- */\r
+-DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      DAT_UINT32 disc_data = htonl(0xdead);\r
+-\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      if (cm_ptr->state != DCM_CONNECTED || \r
+-          cm_ptr->state == DCM_DISCONNECTED) {\r
+-              dapl_os_unlock(&cm_ptr->lock);\r
+-              return DAT_SUCCESS;\r
+-      }\r
+-      cm_ptr->state = DCM_DISCONNECTED;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-      \r
+-      /* send disc date, close socket, schedule destroy */\r
+-      send(cm_ptr->socket, (char *)&disc_data, sizeof(disc_data), 0);\r
+-\r
+-      /* disconnect events for RC's only */\r
+-      if (cm_ptr->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
+-              dapl_os_lock(&cm_ptr->ep->header.lock);\r
+-              dapls_modify_qp_state(cm_ptr->ep->qp_handle, IBV_QPS_ERR, 0,0,0);\r
+-              dapl_os_unlock(&cm_ptr->ep->header.lock);\r
+-              if (cm_ptr->ep->cr_ptr) {\r
+-                      dapls_cr_callback(cm_ptr,\r
+-                                        IB_CME_DISCONNECTED,\r
+-                                        NULL, 0, cm_ptr->sp);\r
+-              } else {\r
+-                      dapl_evd_connection_callback(cm_ptr,\r
+-                                                   IB_CME_DISCONNECTED,\r
+-                                                   NULL, 0, cm_ptr->ep);\r
+-              }\r
+-      }\r
+-      \r
+-      /* release from workq */\r
+-      dapli_cm_free(cm_ptr);\r
+-\r
+-      /* scheduled destroy via disconnect clean in callback */\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * ACTIVE: socket connected, send QP information to peer \r
+- */\r
+-static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)\r
+-{\r
+-      int len, exp;\r
+-      struct iovec iov[2];\r
+-      struct dapl_ep *ep_ptr = cm_ptr->ep;\r
+-\r
+-      if (err) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_PENDING: %s ERR %s -> %s %d - %s\n",\r
+-                       err == -1 ? "POLL" : "SOCKOPT",\r
+-                       err == -1 ? strerror(dapl_socket_errno()) : strerror(err), \r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                              &cm_ptr->addr)->sin_addr), \r
+-                       ntohs(((struct sockaddr_in *)\r
+-                              &cm_ptr->addr)->sin_port),\r
+-                       err == ETIMEDOUT ? "RETRYING...":"ABORTING");\r
+-\r
+-              /* retry a timeout */\r
+-              if (err == ETIMEDOUT) {\r
+-                      closesocket(cm_ptr->socket);\r
+-                      cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+-                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, \r
+-                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,\r
+-                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);\r
+-                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);\r
+-                      dapli_cm_free(cm_ptr);\r
+-                      return;\r
+-              }\r
+-\r
+-              goto bail;\r
+-      }\r
+-\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_REP_PENDING;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      /* send qp info and pdata to remote peer */\r
+-      exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
+-      iov[0].iov_base = (void *)&cm_ptr->msg;\r
+-      iov[0].iov_len = exp;\r
+-      if (cm_ptr->msg.p_size) {\r
+-              iov[1].iov_base = cm_ptr->msg.p_data;\r
+-              iov[1].iov_len = ntohs(cm_ptr->msg.p_size);\r
+-              len = writev(cm_ptr->socket, iov, 2);\r
+-      } else {\r
+-              len = writev(cm_ptr->socket, iov, 1);\r
+-      }\r
+-\r
+-      if (len != (exp + ntohs(cm_ptr->msg.p_size))) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_PENDING len ERR 0x%x %s, wcnt=%d(%d) -> %s\n",\r
+-                       err, strerror(err), len, \r
+-                       exp + ntohs(cm_ptr->msg.p_size), \r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                 ep_ptr->param.\r
+-                                 remote_ia_address_ptr)->sin_addr));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " CONN_PENDING: sending SRC lid=0x%x,"\r
+-                   " qpn=0x%x, psize=%d\n",\r
+-                   ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                   ntohl(cm_ptr->msg.saddr.ib.qpn), \r
+-                   ntohs(cm_ptr->msg.p_size));\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " CONN_PENDING: SRC GID subnet %016llx id %016llx\n",\r
+-                   (unsigned long long)\r
+-                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[0]),\r
+-                   (unsigned long long)\r
+-                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[8]));\r
+-      return;\r
+-\r
+-bail:\r
+-      /* mark CM object for cleanup */\r
+-      dapli_cm_free(cm_ptr);\r
+-      dapl_evd_connection_callback(NULL, IB_CME_LOCAL_FAILURE, NULL, 0, ep_ptr);\r
+-}\r
+-\r
+-/*\r
+- * ACTIVE: Create socket, connect, defer exchange QP information to CR thread\r
+- * to avoid blocking. \r
+- */\r
+-static DAT_RETURN\r
+-dapli_socket_connect(DAPL_EP * ep_ptr,\r
+-                   DAT_IA_ADDRESS_PTR r_addr,\r
+-                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data)\r
+-{\r
+-      dp_ib_cm_handle_t cm_ptr;\r
+-      int ret;\r
+-      socklen_t sl;\r
+-      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
+-      DAT_RETURN dat_ret = DAT_INSUFFICIENT_RESOURCES;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n",\r
+-                   r_qual, p_size);\r
+-\r
+-      cm_ptr = dapli_cm_alloc(ep_ptr);\r
+-      if (cm_ptr == NULL)\r
+-              return dat_ret;\r
+-\r
+-      /* create, connect, sockopt, and exchange QP information */\r
+-      if ((cm_ptr->socket =\r
+-           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " connect: socket create ERR 0x%x %s\n", \r
+-                       err, strerror(err));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      ret = dapl_config_socket(cm_ptr->socket);\r
+-      if (ret < 0) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " connect: config socket %d RET %d ERR 0x%x %s\n",\r
+-                       cm_ptr->socket, ret, \r
+-                       dapl_socket_errno(), strerror(dapl_socket_errno()));\r
+-              dat_ret = DAT_INTERNAL_ERROR;\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* save remote address */\r
+-      dapl_os_memcpy(&cm_ptr->addr, r_addr, sizeof(*r_addr));\r
+-\r
+-#ifdef DAPL_DBG\r
+-      /* DBG: Active PID [0], PASSIVE PID [2]*/\r
+-      *(uint16_t*)&cm_ptr->msg.resv[0] = htons((uint16_t)dapl_os_getpid()); \r
+-      *(uint16_t*)&cm_ptr->msg.resv[2] = ((struct sockaddr_in *)&cm_ptr->addr)->sin_port;\r
+-#endif\r
+-      ((struct sockaddr_in *)&cm_ptr->addr)->sin_port = htons(r_qual + 1000);\r
+-      ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&cm_ptr->addr,\r
+-                                sizeof(cm_ptr->addr));\r
+-      if (ret && ret != EAGAIN) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " connect: dapl_connect_socket RET %d ERR 0x%x %s\n",\r
+-                       ret, dapl_socket_errno(), \r
+-                       strerror(dapl_socket_errno()));\r
+-              dat_ret = DAT_INVALID_ADDRESS;\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* REQ: QP info in msg.saddr, IA address in msg.daddr, and pdata */\r
+-      cm_ptr->hca = ia_ptr->hca_ptr;\r
+-      cm_ptr->msg.op = ntohs(DCM_REQ);\r
+-      cm_ptr->msg.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);\r
+-      cm_ptr->msg.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;\r
+-      cm_ptr->msg.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;\r
+-      dapl_os_memcpy(&cm_ptr->msg.saddr.ib.gid[0], \r
+-                     &ia_ptr->hca_ptr->ib_trans.gid, 16);\r
+-      \r
+-      /* get local address information from socket */\r
+-      sl = sizeof(cm_ptr->msg.daddr.so);\r
+-      if (getsockname(cm_ptr->socket, (struct sockaddr *)&cm_ptr->msg.daddr.so, &sl)) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                      " connect getsockname ERROR: 0x%x %s -> %s r_qual %d\n",\r
+-                      err, strerror(err), \r
+-                      inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),\r
+-                      (unsigned int)r_qual);;\r
+-      }\r
+-\r
+-      if (p_size) {\r
+-              cm_ptr->msg.p_size = htons(p_size);\r
+-              dapl_os_memcpy(cm_ptr->msg.p_data, p_data, p_size);\r
+-      }\r
+-\r
+-      /* connected or pending, either way results via async event */\r
+-      if (ret == 0)\r
+-              dapli_socket_connected(cm_ptr, 0);\r
+-      else\r
+-              cm_ptr->state = DCM_CONN_PENDING;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: p_data=%p %p\n",\r
+-                   cm_ptr->msg.p_data, cm_ptr->msg.p_data);\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " connect: %s r_qual %d pending, p_sz=%d, %d %d ...\n",\r
+-                   inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), \r
+-                   (unsigned int)r_qual, ntohs(cm_ptr->msg.p_size),\r
+-                   cm_ptr->msg.p_data[0], cm_ptr->msg.p_data[1]);\r
+-\r
+-      /* queue up on work thread */\r
+-      dapli_cm_queue(cm_ptr);\r
+-      return DAT_SUCCESS;\r
+-bail:\r
+-      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-               " connect ERROR: -> %s r_qual %d\n",\r
+-               inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),\r
+-               (unsigned int)r_qual);\r
+-\r
+-      /* Never queued, destroy */\r
+-      dapls_cm_release(cm_ptr);\r
+-      return dat_ret;\r
+-}\r
+-\r
+-/*\r
+- * ACTIVE: exchange QP information, called from CR thread\r
+- */\r
+-static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      DAPL_EP *ep_ptr = cm_ptr->ep;\r
+-      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
+-      ib_cm_events_t event = IB_CME_LOCAL_FAILURE;\r
+-      socklen_t sl;\r
+-\r
+-      /* read DST information into cm_ptr, overwrite SRC info */\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n");\r
+-\r
+-      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0);\r
+-      if (len != exp || ntohs(cm_ptr->msg.ver) != DCM_VER) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                       " CONN_RTU read: sk %d ERR 0x%x, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n",\r
+-                       cm_ptr->socket, err, len, ntohs(cm_ptr->msg.ver),\r
+-                       inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr),\r
+-                       ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port),\r
+-                       ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port),\r
+-                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[0]),\r
+-                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[2]));\r
+-\r
+-              /* Retry; corner case where server tcp stack resets under load */\r
+-              if (err == ECONNRESET) {\r
+-                      closesocket(cm_ptr->socket);\r
+-                      cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+-                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, \r
+-                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,\r
+-                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);\r
+-                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);\r
+-                      dapli_cm_free(cm_ptr);\r
+-                      return;\r
+-              }\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* keep the QP, address info in network order */\r
+-      \r
+-      /* save remote address information, in msg.daddr */\r
+-      dapl_os_memcpy(&cm_ptr->addr,\r
+-                     &cm_ptr->msg.daddr.so,\r
+-                     sizeof(union dcm_addr));\r
+-\r
+-      /* save local address information from socket */\r
+-      sl = sizeof(cm_ptr->addr);\r
+-      getsockname(cm_ptr->socket,(struct sockaddr *)&cm_ptr->addr, &sl);\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " CONN_RTU: DST %s %d lid=0x%x,"\r
+-                   " qpn=0x%x, qp_type=%d, psize=%d\n",\r
+-                   inet_ntoa(((struct sockaddr_in *)\r
+-                              &cm_ptr->msg.daddr.so)->sin_addr),\r
+-                   ntohs(((struct sockaddr_in *)\r
+-                              &cm_ptr->msg.daddr.so)->sin_port),\r
+-                   ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                   ntohl(cm_ptr->msg.saddr.ib.qpn), \r
+-                   cm_ptr->msg.saddr.ib.qp_type, \r
+-                   ntohs(cm_ptr->msg.p_size));\r
+-\r
+-      /* validate private data size before reading */\r
+-      if (ntohs(cm_ptr->msg.p_size) > DCM_MAX_PDATA_SIZE) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_RTU read: psize (%d) wrong -> %s\n",\r
+-                       ntohs(cm_ptr->msg.p_size), \r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                 ep_ptr->param.\r
+-                                 remote_ia_address_ptr)->sin_addr));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* read private data into cm_handle if any present */\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP," CONN_RTU: read private data\n");\r
+-      exp = ntohs(cm_ptr->msg.p_size);\r
+-      if (exp) {\r
+-              len = recv(cm_ptr->socket, cm_ptr->msg.p_data, exp, 0);\r
+-              if (len != exp) {\r
+-                      int err = dapl_socket_errno();\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               " CONN_RTU read pdata: ERR 0x%x %s, rcnt=%d -> %s\n",\r
+-                               err, strerror(err), len,\r
+-                               inet_ntoa(((struct sockaddr_in *)\r
+-                                          ep_ptr->param.\r
+-                                          remote_ia_address_ptr)->sin_addr));\r
+-                      goto bail;\r
+-              }\r
+-      }\r
+-\r
+-      /* check for consumer or protocol stack reject */\r
+-      if (ntohs(cm_ptr->msg.op) == DCM_REP)\r
+-              event = IB_CME_CONNECTED;\r
+-      else if (ntohs(cm_ptr->msg.op) == DCM_REJ_USER) \r
+-              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;\r
+-      else  \r
+-              event = IB_CME_DESTINATION_REJECT;\r
+-      \r
+-      if (event != IB_CME_CONNECTED) {\r
+-              dapl_log(DAPL_DBG_TYPE_CM,\r
+-                       " CONN_RTU: reject from %s %x\n",\r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                  &cm_ptr->msg.daddr.so)->sin_addr),\r
+-                       ntohs(((struct sockaddr_in *)\r
+-                               &cm_ptr->msg.daddr.so)->sin_port));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* modify QP to RTR and then to RTS with remote info */\r
+-      dapl_os_lock(&ep_ptr->header.lock);\r
+-      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+-                                IBV_QPS_RTR, \r
+-                                cm_ptr->msg.saddr.ib.qpn,\r
+-                                cm_ptr->msg.saddr.ib.lid,\r
+-                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_RTU: QPS_RTR ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",\r
+-                       strerror(errno), ep_ptr->qp_handle->qp_type,\r
+-                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,\r
+-                       ntohl(cm_ptr->msg.saddr.ib.qpn), \r
+-                       ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                  &cm_ptr->msg.daddr.so)->sin_addr),\r
+-                       ntohs(((struct sockaddr_in *)\r
+-                               &cm_ptr->msg.daddr.so)->sin_port));\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              goto bail;\r
+-      }\r
+-      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+-                                IBV_QPS_RTS, \r
+-                                cm_ptr->msg.saddr.ib.qpn,\r
+-                                cm_ptr->msg.saddr.ib.lid,\r
+-                                NULL) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_RTU: QPS_RTS ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",\r
+-                       strerror(errno), ep_ptr->qp_handle->qp_type,\r
+-                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,\r
+-                       ntohl(cm_ptr->msg.saddr.ib.qpn), \r
+-                       ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                  &cm_ptr->msg.daddr.so)->sin_addr),\r
+-                       ntohs(((struct sockaddr_in *)\r
+-                               &cm_ptr->msg.daddr.so)->sin_port));\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              goto bail;\r
+-      }\r
+-      dapl_os_unlock(&ep_ptr->header.lock);\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n");\r
+-\r
+-      /* complete handshake after final QP state change, Just ver+op */\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_CONNECTED;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      cm_ptr->msg.op = ntohs(DCM_RTU);\r
+-      if (send(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0) == -1) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_RTU: write ERR = 0x%x %s\n", \r
+-                       err, strerror(err));\r
+-              goto bail;\r
+-      }\r
+-      /* post the event with private data */\r
+-      event = IB_CME_CONNECTED;\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-ud_bail:\r
+-      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
+-              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-              ib_pd_handle_t pd_handle = \r
+-                      ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle;\r
+-\r
+-              if (event == IB_CME_CONNECTED) {\r
+-                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,\r
+-                                                   ep_ptr->qp_handle,\r
+-                                                   cm_ptr->msg.saddr.ib.lid, \r
+-                                                   NULL);\r
+-                      if (cm_ptr->ah) {\r
+-                              /* post UD extended EVENT */\r
+-                              xevent.status = 0;\r
+-                              xevent.type = DAT_IB_UD_REMOTE_AH;\r
+-                              xevent.remote_ah.ah = cm_ptr->ah;\r
+-                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);\r
+-                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
+-                                              &ep_ptr->remote_ia_address,\r
+-                                              sizeof(union dcm_addr));\r
+-                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
+-\r
+-                              dapl_log(DAPL_DBG_TYPE_CM, \r
+-                                      " CONN_RTU: UD AH %p for lid 0x%x"\r
+-                                      " qpn 0x%x\n", \r
+-                                      cm_ptr->ah, \r
+-                                      ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                                      ntohl(cm_ptr->msg.saddr.ib.qpn));\r
+-      \r
+-                      } else \r
+-                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
+-                      \r
+-              } else if (event == IB_CME_LOCAL_FAILURE) {\r
+-                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
+-              } else  \r
+-                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;\r
+-\r
+-              dapls_evd_post_connection_event_ext(\r
+-                              (DAPL_EVD *) ep_ptr->param.connect_evd_handle,\r
+-                              event,\r
+-                              (DAT_EP_HANDLE) ep_ptr,\r
+-                              (DAT_COUNT) exp,\r
+-                              (DAT_PVOID *) cm_ptr->msg.p_data,\r
+-                              (DAT_PVOID *) &xevent);\r
+-\r
+-              /* cleanup and release from local list */\r
+-              dapli_cm_free(cm_ptr);\r
+-      \r
+-      } else\r
+-#endif\r
+-      {\r
+-              dapli_ep_check(cm_ptr->ep);\r
+-              dapl_evd_connection_callback(cm_ptr, event, cm_ptr->msg.p_data,\r
+-                                           DCM_MAX_PDATA_SIZE, ep_ptr);\r
+-      }\r
+-      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
+-               " SCM ACTIVE CONN: %x -> %s %x\n",\r
+-               ntohs(((struct sockaddr_in *) &cm_ptr->addr)->sin_port),\r
+-               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),\r
+-               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)-1000);\r
+-      return;\r
+-\r
+-bail:\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) \r
+-              goto ud_bail;\r
+-#endif\r
+-      /* close socket, and post error event */\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_REJECTED;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      dapl_evd_connection_callback(NULL, event, cm_ptr->msg.p_data,\r
+-                                   DCM_MAX_PDATA_SIZE, ep_ptr);\r
+-      dapli_cm_free(cm_ptr);\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: Create socket, listen, accept, exchange QP information \r
+- */\r
+-DAT_RETURN\r
+-dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr)\r
+-{\r
+-      struct sockaddr_in addr;\r
+-      ib_cm_srvc_handle_t cm_ptr = NULL;\r
+-      DAT_RETURN dat_status = DAT_SUCCESS;\r
+-      int opt = 1;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " setup listen(ia_ptr %p ServiceID %d sp_ptr %p)\n",\r
+-                   ia_ptr, serviceID, sp_ptr);\r
+-\r
+-      cm_ptr = dapli_cm_alloc(NULL);\r
+-      if (cm_ptr == NULL)\r
+-              return DAT_INSUFFICIENT_RESOURCES;\r
+-\r
+-      cm_ptr->sp = sp_ptr;\r
+-      cm_ptr->hca = ia_ptr->hca_ptr;\r
+-\r
+-      /* bind, listen, set sockopt, accept, exchange data */\r
+-      if ((cm_ptr->socket =\r
+-           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR, \r
+-                       " listen: socket create: ERR 0x%x %s\n",\r
+-                       err, strerror(err));\r
+-              dat_status = DAT_INSUFFICIENT_RESOURCES;\r
+-              goto bail;\r
+-      }\r
+-\r
+-      setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));\r
+-      addr.sin_port = htons(serviceID + 1000);\r
+-      addr.sin_family = AF_INET;\r
+-      addr.sin_addr = ((struct sockaddr_in *) &ia_ptr->hca_ptr->hca_address)->sin_addr;\r
+-\r
+-      if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)\r
+-          || (listen(cm_ptr->socket, 128) < 0)) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_CM,\r
+-                       " listen: ERROR 0x%x %s on port %d\n",\r
+-                       err, strerror(err), serviceID + 1000);\r
+-              if (err == EADDRINUSE)\r
+-                      dat_status = DAT_CONN_QUAL_IN_USE;\r
+-              else\r
+-                      dat_status = DAT_CONN_QUAL_UNAVAILABLE;\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* set cm_handle for this service point, save listen socket */\r
+-      sp_ptr->cm_srvc_handle = cm_ptr;\r
+-      dapl_os_memcpy(&cm_ptr->addr, &addr, sizeof(addr)); \r
+-\r
+-      /* queue up listen socket to process inbound CR's */\r
+-      cm_ptr->state = DCM_LISTEN;\r
+-      dapli_cm_queue(cm_ptr);\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " setup listen: port %d cr %p s_fd %d\n",\r
+-                   serviceID + 1000, cm_ptr, cm_ptr->socket);\r
+-\r
+-      return dat_status;\r
+-bail:\r
+-      /* Never queued, destroy here */\r
+-      dapls_cm_release(cm_ptr);\r
+-      return dat_status;\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: accept socket \r
+- */\r
+-static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)\r
+-{\r
+-      dp_ib_cm_handle_t acm_ptr;\r
+-      int ret, len, opt = 1;\r
+-      socklen_t sl;\r
+-\r
+-      /* \r
+-       * Accept all CR's on this port to avoid half-connection (SYN_RCV)\r
+-       * stalls with many to one connection storms\r
+-       */\r
+-      do {\r
+-              /* Allocate accept CM and initialize */\r
+-              if ((acm_ptr = dapli_cm_alloc(NULL)) == NULL)\r
+-                      return;\r
+-\r
+-              acm_ptr->sp = cm_ptr->sp;\r
+-              acm_ptr->hca = cm_ptr->hca;\r
+-\r
+-              len = sizeof(union dcm_addr);\r
+-              acm_ptr->socket = accept(cm_ptr->socket,\r
+-                                      (struct sockaddr *)\r
+-                                      &acm_ptr->msg.daddr.so,\r
+-                                      (socklen_t *) &len);\r
+-              if (acm_ptr->socket == DAPL_INVALID_SOCKET) {\r
+-                      int err = dapl_socket_errno();\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                              " ACCEPT: ERR 0x%x %s on FD %d l_cr %p\n",\r
+-                              err, strerror(err), cm_ptr->socket, cm_ptr);\r
+-                      dapls_cm_release(acm_ptr);\r
+-                      return;\r
+-              }\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_CM, " accepting from %s %x\n",\r
+-                           inet_ntoa(((struct sockaddr_in *)\r
+-                                      &acm_ptr->msg.daddr.so)->sin_addr),\r
+-                           ntohs(((struct sockaddr_in *)\r
+-                                      &acm_ptr->msg.daddr.so)->sin_port));\r
+-\r
+-              /* no delay for small packets */\r
+-              ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,\r
+-                         (char *)&opt, sizeof(opt));\r
+-              if (ret) {\r
+-                      int err = dapl_socket_errno();\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               " ACCEPT: NODELAY setsockopt:"\r
+-                               " RET %d ERR 0x%x %s\n",\r
+-                               ret, err, strerror(err));\r
+-              }\r
+-\r
+-              /* get local address information from socket */\r
+-              sl = sizeof(acm_ptr->addr);\r
+-              getsockname(acm_ptr->socket, (struct sockaddr *)&acm_ptr->addr, &sl);\r
+-              acm_ptr->state = DCM_ACCEPTING;\r
+-              dapli_cm_queue(acm_ptr);\r
+-      \r
+-      } while (dapl_poll(cm_ptr->socket, DAPL_FD_READ) == DAPL_FD_READ);\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: receive peer QP information, private data, post cr_event \r
+- */\r
+-static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)\r
+-{\r
+-      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
+-      void *p_data = NULL;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n");\r
+-\r
+-      /* read in DST QP info, IA address. check for private data */\r
+-      len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0);\r
+-      if (len != exp || ntohs(acm_ptr->msg.ver) != DCM_VER) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n",\r
+-                       err, strerror(err), len, ntohs(acm_ptr->msg.ver));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* keep the QP, address info in network order */\r
+-\r
+-      /* validate private data size before reading */\r
+-      exp = ntohs(acm_ptr->msg.p_size);\r
+-      if (exp > DCM_MAX_PDATA_SIZE) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                           " accept read: psize (%d) wrong\n",\r
+-                           acm_ptr->msg.p_size);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* read private data into cm_handle if any present */\r
+-      if (exp) {\r
+-              len = recv(acm_ptr->socket, acm_ptr->msg.p_data, exp, 0);\r
+-              if (len != exp) {\r
+-                      int err = dapl_socket_errno();\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               " accept read pdata: ERR 0x%x %s, rcnt=%d\n",\r
+-                               err, strerror(err), len);\r
+-                      goto bail;\r
+-              }\r
+-              p_data = acm_ptr->msg.p_data;\r
+-      }\r
+-      dapl_os_lock(&acm_ptr->lock);\r
+-      acm_ptr->state = DCM_ACCEPTING_DATA;\r
+-      dapl_os_unlock(&acm_ptr->lock);\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " ACCEPT: DST %s %x lid=0x%x, qpn=0x%x, psz=%d\n",\r
+-                   inet_ntoa(((struct sockaddr_in *)\r
+-                              &acm_ptr->msg.daddr.so)->sin_addr), \r
+-                   ntohs(((struct sockaddr_in *)\r
+-                           &acm_ptr->msg.daddr.so)->sin_port),\r
+-                   ntohs(acm_ptr->msg.saddr.ib.lid), \r
+-                   ntohl(acm_ptr->msg.saddr.ib.qpn), exp);\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (acm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
+-              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-\r
+-              /* post EVENT, modify_qp created ah */\r
+-              xevent.status = 0;\r
+-              xevent.type = DAT_IB_UD_CONNECT_REQUEST;\r
+-\r
+-              dapls_evd_post_cr_event_ext(acm_ptr->sp,\r
+-                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,\r
+-                                          acm_ptr,\r
+-                                          (DAT_COUNT) exp,\r
+-                                          (DAT_PVOID *) acm_ptr->msg.p_data,\r
+-                                          (DAT_PVOID *) &xevent);\r
+-      } else\r
+-#endif\r
+-              /* trigger CR event and return SUCCESS */\r
+-              dapls_cr_callback(acm_ptr,\r
+-                                IB_CME_CONNECTION_REQUEST_PENDING,\r
+-                                p_data, exp, acm_ptr->sp);\r
+-      return;\r
+-bail:\r
+-      /* mark for destroy, active will see socket close as rej */\r
+-      dapli_cm_free(acm_ptr);\r
+-      return;\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: consumer accept, send local QP information, private data, \r
+- * queue on work thread to receive RTU information to avoid blocking\r
+- * user thread. \r
+- */\r
+-static DAT_RETURN\r
+-dapli_socket_accept_usr(DAPL_EP * ep_ptr,\r
+-                      DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data)\r
+-{\r
+-      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
+-      dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;\r
+-      ib_cm_msg_t local;\r
+-      struct iovec iov[2];\r
+-      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
+-      DAT_RETURN ret = DAT_INTERNAL_ERROR;\r
+-      socklen_t sl;\r
+-\r
+-      if (p_size > DCM_MAX_PDATA_SIZE) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " accept_usr: psize(%d) too large\n", p_size);\r
+-              return DAT_LENGTH_ERROR;\r
+-      }\r
+-\r
+-      /* must have a accepted socket */\r
+-      if (cm_ptr->socket == DAPL_INVALID_SOCKET) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " accept_usr: cm socket invalid\n");\r
+-              goto bail;\r
+-      }\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " ACCEPT_USR: remote lid=0x%x"\r
+-                   " qpn=0x%x qp_type %d, psize=%d\n",\r
+-                   ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                   ntohl(cm_ptr->msg.saddr.ib.qpn), \r
+-                   cm_ptr->msg.saddr.ib.qp_type, \r
+-                   ntohs(cm_ptr->msg.p_size));\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD &&\r
+-          ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_USR: ERR remote QP is UD,"\r
+-                       ", but local QP is not\n");\r
+-              ret = (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);\r
+-              goto bail;\r
+-      }\r
+-#endif\r
+-\r
+-      /* modify QP to RTR and then to RTS with remote info already read */\r
+-      dapl_os_lock(&ep_ptr->header.lock);\r
+-      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+-                                IBV_QPS_RTR, \r
+-                                cm_ptr->msg.saddr.ib.qpn,\r
+-                                cm_ptr->msg.saddr.ib.lid,\r
+-                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_USR: QPS_RTR ERR %s -> %s\n",\r
+-                       strerror(errno), \r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                   &cm_ptr->msg.daddr.so)->sin_addr));\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              goto bail;\r
+-      }\r
+-      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+-                                IBV_QPS_RTS, \r
+-                                cm_ptr->msg.saddr.ib.qpn,\r
+-                                cm_ptr->msg.saddr.ib.lid,\r
+-                                NULL) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_USR: QPS_RTS ERR %s -> %s\n",\r
+-                       strerror(errno), \r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                   &cm_ptr->msg.daddr.so)->sin_addr));\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              goto bail;\r
+-      }\r
+-      dapl_os_unlock(&ep_ptr->header.lock);\r
+-\r
+-      /* save remote address information */\r
+-      dapl_os_memcpy(&ep_ptr->remote_ia_address,\r
+-                     &cm_ptr->msg.daddr.so,\r
+-                     sizeof(union dcm_addr));\r
+-\r
+-      /* send our QP info, IA address, pdata. Don't overwrite dst data */\r
+-      local.ver = htons(DCM_VER);\r
+-      local.op = htons(DCM_REP);\r
+-      local.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);\r
+-      local.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;\r
+-      local.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;\r
+-      dapl_os_memcpy(&local.saddr.ib.gid[0], \r
+-                     &ia_ptr->hca_ptr->ib_trans.gid, 16);\r
+-      \r
+-      /* Get local address information from socket */\r
+-      sl = sizeof(local.daddr.so);\r
+-      getsockname(cm_ptr->socket, (struct sockaddr *)&local.daddr.so, &sl);\r
+-\r
+-#ifdef DAPL_DBG\r
+-      /* DBG: Active PID [0], PASSIVE PID [2] */\r
+-      *(uint16_t*)&cm_ptr->msg.resv[2] = htons((uint16_t)dapl_os_getpid()); \r
+-      dapl_os_memcpy(local.resv, cm_ptr->msg.resv, 4); \r
+-#endif\r
+-      cm_ptr->hca = ia_ptr->hca_ptr;\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_ACCEPTED;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      /* Link CM to EP, already queued on work thread */\r
+-      dapl_ep_link_cm(ep_ptr, cm_ptr);\r
+-      cm_ptr->ep = ep_ptr;\r
+-\r
+-      local.p_size = htons(p_size);\r
+-      iov[0].iov_base = (void *)&local;\r
+-      iov[0].iov_len = exp;\r
+-      \r
+-      if (p_size) {\r
+-              iov[1].iov_base = p_data;\r
+-              iov[1].iov_len = p_size;\r
+-              len = writev(cm_ptr->socket, iov, 2);\r
+-      } else \r
+-              len = writev(cm_ptr->socket, iov, 1);\r
+-      \r
+-      if (len != (p_size + exp)) {\r
+-              int err = dapl_socket_errno();\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_USR: ERR 0x%x %s, wcnt=%d -> %s\n",\r
+-                       err, strerror(err), len, \r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                 &cm_ptr->msg.daddr.so)->sin_addr));\r
+-              dapl_ep_unlink_cm(ep_ptr, cm_ptr);\r
+-              cm_ptr->ep = NULL;\r
+-              goto bail;\r
+-      }\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " ACCEPT_USR: local lid=0x%x qpn=0x%x psz=%d\n",\r
+-                   ntohs(local.saddr.ib.lid),\r
+-                   ntohl(local.saddr.ib.qpn), ntohs(local.p_size));\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " ACCEPT_USR: local GID subnet %016llx id %016llx\n",\r
+-                   (unsigned long long)\r
+-                   htonll(*(uint64_t*)&local.saddr.ib.gid[0]),\r
+-                   (unsigned long long)\r
+-                   htonll(*(uint64_t*)&local.saddr.ib.gid[8]));\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");\r
+-\r
+-      return DAT_SUCCESS;\r
+-bail:\r
+-      /* schedule cleanup from workq */\r
+-      dapli_cm_free(cm_ptr);\r
+-      return ret;\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: read RTU from active peer, post CONN event\r
+- */\r
+-static void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)\r
+-{\r
+-      int len;\r
+-      ib_cm_events_t event = IB_CME_CONNECTED;\r
+-\r
+-      /* complete handshake after final QP state change, VER and OP */\r
+-      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0);\r
+-      if (len != 4 || ntohs(cm_ptr->msg.op) != DCM_RTU) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_RTU: rcv ERR, rcnt=%d op=%x <- %s\n",\r
+-                       len, ntohs(cm_ptr->msg.op),\r
+-                       inet_ntoa(((struct sockaddr_in *)\r
+-                                  &cm_ptr->msg.daddr.so)->sin_addr));\r
+-              event = IB_CME_DESTINATION_REJECT;\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* save state and reference to EP, queue for disc event */\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_CONNECTED;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      /* final data exchange if remote QP state is good to go */\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n");\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-ud_bail:\r
+-      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
+-              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-\r
+-              ib_pd_handle_t pd_handle = \r
+-                      ((DAPL_PZ *)cm_ptr->ep->param.pz_handle)->pd_handle;\r
+-              \r
+-              if (event == IB_CME_CONNECTED) {\r
+-                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,\r
+-                                              cm_ptr->ep->qp_handle,\r
+-                                              cm_ptr->msg.saddr.ib.lid, \r
+-                                              NULL);\r
+-                      if (cm_ptr->ah) { \r
+-                              /* post EVENT, modify_qp created ah */\r
+-                              xevent.status = 0;\r
+-                              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;\r
+-                              xevent.remote_ah.ah = cm_ptr->ah;\r
+-                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);\r
+-                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
+-                                      &cm_ptr->msg.daddr.so,\r
+-                                      sizeof(union dcm_addr));\r
+-                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
+-                      } else \r
+-                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
+-              } else \r
+-                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
+-\r
+-              dapl_log(DAPL_DBG_TYPE_CM, \r
+-                      " CONN_RTU: UD AH %p for lid 0x%x qpn 0x%x\n", \r
+-                      cm_ptr->ah, ntohs(cm_ptr->msg.saddr.ib.lid),\r
+-                      ntohl(cm_ptr->msg.saddr.ib.qpn));\r
+-\r
+-              dapls_evd_post_connection_event_ext(\r
+-                              (DAPL_EVD *) \r
+-                              cm_ptr->ep->param.connect_evd_handle,\r
+-                              event,\r
+-                              (DAT_EP_HANDLE) cm_ptr->ep,\r
+-                              (DAT_COUNT) ntohs(cm_ptr->msg.p_size),\r
+-                              (DAT_PVOID *) cm_ptr->msg.p_data,\r
+-                              (DAT_PVOID *) &xevent);\r
+-\r
+-                /* cleanup and release from local list, still on EP list */\r
+-              dapli_cm_free(cm_ptr);\r
+-                \r
+-      } else \r
+-#endif\r
+-      {\r
+-              dapli_ep_check(cm_ptr->ep);\r
+-              dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);\r
+-      }\r
+-      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
+-               " SCM PASSIVE CONN: %x <- %s %x\n",\r
+-               cm_ptr->sp->conn_qual,\r
+-               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),\r
+-               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port));\r
+-      return;\r
+-      \r
+-bail:\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) \r
+-              goto ud_bail;\r
+-#endif\r
+-      dapl_os_lock(&cm_ptr->lock);\r
+-      cm_ptr->state = DCM_REJECTED;\r
+-      dapl_os_unlock(&cm_ptr->lock);\r
+-\r
+-      dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);\r
+-      dapli_cm_free(cm_ptr);\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_connect\r
+- *\r
+- * Initiate a connection with the passive listener on another node\r
+- *\r
+- * Input:\r
+- *    ep_handle,\r
+- *    remote_ia_address,\r
+- *    remote_conn_qual,\r
+- *    prd_size                size of private data and structure\r
+- *    prd_prt                 pointer to private data structure\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INVALID_PARAMETER\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,\r
+-               IN DAT_IA_ADDRESS_PTR remote_ia_address,\r
+-               IN DAT_CONN_QUAL remote_conn_qual,\r
+-               IN DAT_COUNT private_data_size, IN void *private_data)\r
+-{\r
+-      DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle;\r
+-      \r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " connect(ep_handle %p ....)\n", ep_handle);\r
+-\r
+-      return (dapli_socket_connect(ep_ptr, remote_ia_address,\r
+-                                   remote_conn_qual,\r
+-                                   private_data_size, private_data));\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_disconnect\r
+- *\r
+- * Disconnect an EP\r
+- *\r
+- * Input:\r
+- *    ep_handle,\r
+- *    disconnect_flags\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)\r
+-{\r
+-      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);\r
+-\r
+-      dapl_os_lock(&ep_ptr->header.lock);\r
+-      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||\r
+-          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||\r
+-          cm_ptr == NULL) {\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              return DAT_SUCCESS;\r
+-      } \r
+-      dapl_os_unlock(&ep_ptr->header.lock);\r
+-      return (dapli_socket_disconnect(cm_ptr));\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_disconnect_clean\r
+- *\r
+- * Clean up outstanding connection data. This routine is invoked\r
+- * after the final disconnect callback has occurred. Only on the\r
+- * ACTIVE side of a connection. It is also called if dat_ep_connect\r
+- * times out using the consumer supplied timeout value.\r
+- *\r
+- * Input:\r
+- *    ep_ptr          DAPL_EP\r
+- *    active          Indicates active side of connection\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    void\r
+- *\r
+- */\r
+-void\r
+-dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,\r
+-                        IN DAT_BOOLEAN active,\r
+-                        IN const ib_cm_events_t ib_cm_event)\r
+-{\r
+-      if (ib_cm_event == IB_CME_TIMEOUT) {\r
+-              dp_ib_cm_handle_t cm_ptr;\r
+-\r
+-              if ((cm_ptr = dapl_get_cm_from_ep(ep_ptr)) == NULL)\r
+-                      return;\r
+-\r
+-              dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",\r
+-                      ep_ptr, cm_ptr, dapl_cm_state_str(cm_ptr->state));\r
+-              \r
+-              /* schedule release of socket and local resources */\r
+-              dapli_cm_free(cm_ptr);\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * dapl_ib_setup_conn_listener\r
+- *\r
+- * Have the CM set up a connection listener.\r
+- *\r
+- * Input:\r
+- *    ibm_hca_handle          HCA handle\r
+- *    qp_handle                       QP handle\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INTERNAL_ERROR\r
+- *    DAT_CONN_QUAL_UNAVAILBLE\r
+- *    DAT_CONN_QUAL_IN_USE\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,\r
+-                           IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)\r
+-{\r
+-      return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr));\r
+-}\r
+-\r
+-/*\r
+- * dapl_ib_remove_conn_listener\r
+- *\r
+- * Have the CM remove a connection listener.\r
+- *\r
+- * Input:\r
+- *    ia_handle               IA handle\r
+- *    ServiceID               IB Channel Service ID\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INVALID_STATE\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)\r
+-{\r
+-      ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle;\r
+-\r
+-      /* free cm_srvc_handle, release will cleanup */\r
+-      if (cm_ptr != NULL) {\r
+-              /* cr_thread will free */\r
+-              sp_ptr->cm_srvc_handle = NULL;\r
+-              dapli_cm_free(cm_ptr);\r
+-      }\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_accept_connection\r
+- *\r
+- * Perform necessary steps to accept a connection\r
+- *\r
+- * Input:\r
+- *    cr_handle\r
+- *    ep_handle\r
+- *    private_data_size\r
+- *    private_data\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INTERNAL_ERROR\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,\r
+-                         IN DAT_EP_HANDLE ep_handle,\r
+-                         IN DAT_COUNT p_size, IN const DAT_PVOID p_data)\r
+-{\r
+-      DAPL_CR *cr_ptr;\r
+-      DAPL_EP *ep_ptr;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n",\r
+-                   cr_handle, ep_handle, p_data, p_size);\r
+-\r
+-      cr_ptr = (DAPL_CR *) cr_handle;\r
+-      ep_ptr = (DAPL_EP *) ep_handle;\r
+-\r
+-      /* allocate and attach a QP if necessary */\r
+-      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+-              DAT_RETURN status;\r
+-              status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
+-                                         ep_ptr, ep_ptr);\r
+-              if (status != DAT_SUCCESS)\r
+-                      return status;\r
+-      }\r
+-      return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data));\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_reject_connection\r
+- *\r
+- * Reject a connection\r
+- *\r
+- * Input:\r
+- *    cr_handle\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INTERNAL_ERROR\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr,\r
+-                         IN int reason,\r
+-                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)\r
+-{\r
+-      struct iovec iov[2];\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " reject(cm %p reason %x, pdata %p, psize %d)\n",\r
+-                   cm_ptr, reason, pdata, psize);\r
+-\r
+-        if (psize > DCM_MAX_PDATA_SIZE)\r
+-                return DAT_LENGTH_ERROR;\r
+-\r
+-      /* write reject data to indicate reject */\r
+-      cm_ptr->msg.op = htons(DCM_REJ_USER);\r
+-      cm_ptr->msg.p_size = htons(psize);\r
+-      \r
+-      iov[0].iov_base = (void *)&cm_ptr->msg;\r
+-      iov[0].iov_len = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
+-      if (psize) {\r
+-              iov[1].iov_base = pdata;\r
+-              iov[1].iov_len = psize;\r
+-              writev(cm_ptr->socket, iov, 2);\r
+-      } else {\r
+-              writev(cm_ptr->socket, iov, 1);\r
+-      }\r
+-\r
+-      /* release and cleanup CM object */\r
+-      dapli_cm_free(cm_ptr);\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_cm_remote_addr\r
+- *\r
+- * Obtain the remote IP address given a connection\r
+- *\r
+- * Input:\r
+- *    cr_handle\r
+- *\r
+- * Output:\r
+- *    remote_ia_address: where to place the remote address\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INVALID_HANDLE\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,\r
+-                      OUT DAT_SOCK_ADDR6 * remote_ia_address)\r
+-{\r
+-      DAPL_HEADER *header;\r
+-      dp_ib_cm_handle_t conn;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",\r
+-                   dat_handle);\r
+-\r
+-      header = (DAPL_HEADER *) dat_handle;\r
+-\r
+-      if (header->magic == DAPL_MAGIC_EP)\r
+-              conn = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);\r
+-      else if (header->magic == DAPL_MAGIC_CR)\r
+-              conn = ((DAPL_CR *) dat_handle)->ib_cm_handle;\r
+-      else\r
+-              return DAT_INVALID_HANDLE;\r
+-\r
+-      dapl_os_memcpy(remote_ia_address,\r
+-                     &conn->msg.daddr.so, sizeof(DAT_SOCK_ADDR6));\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-int dapls_ib_private_data_size(\r
+-      IN DAPL_HCA *hca_ptr)\r
+-{\r
+-      return DCM_MAX_PDATA_SIZE;\r
+-}\r
+-\r
+-/* outbound/inbound CR processing thread to avoid blocking applications */\r
+-void cr_thread(void *arg)\r
+-{\r
+-      struct dapl_hca *hca_ptr = arg;\r
+-      dp_ib_cm_handle_t cr, next_cr;\r
+-      int opt, ret;\r
+-      socklen_t opt_len;\r
+-      char rbuf[2];\r
+-      struct dapl_fd_set *set;\r
+-      enum DAPL_FD_EVENTS event;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr);\r
+-      set = dapl_alloc_fd_set();\r
+-      if (!set)\r
+-              goto out;\r
+-\r
+-      dapl_os_lock(&hca_ptr->ib_trans.lock);\r
+-      hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;\r
+-\r
+-      while (1) {\r
+-              dapl_fd_zero(set);\r
+-              dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ);\r
+-\r
+-              if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))\r
+-                      next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list);\r
+-              else\r
+-                      next_cr = NULL;\r
+-\r
+-              while (next_cr) {\r
+-                      cr = next_cr;\r
+-                      next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,\r
+-                                                      (DAPL_LLIST_ENTRY *) \r
+-                                                      &cr->local_entry);\r
+-                      dapls_cm_acquire(cr); /* hold thread ref */\r
+-                      dapl_os_lock(&cr->lock);\r
+-                      if (cr->state == DCM_FREE || \r
+-                          hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {\r
+-                              dapl_log(DAPL_DBG_TYPE_CM, \r
+-                                       " CM FREE: %p ep=%p st=%s sck=%d refs=%d\n", \r
+-                                       cr, cr->ep, dapl_cm_state_str(cr->state), \r
+-                                       cr->socket, cr->ref_count);\r
+-\r
+-                              if (cr->socket != DAPL_INVALID_SOCKET) {\r
+-                                      shutdown(cr->socket, SHUT_RDWR);\r
+-                                      closesocket(cr->socket);\r
+-                                      cr->socket = DAPL_INVALID_SOCKET;\r
+-                              }\r
+-                              dapl_os_unlock(&cr->lock);\r
+-                              dapls_cm_release(cr); /* release alloc ref */\r
+-                              dapli_cm_dequeue(cr); /* release workq ref */\r
+-                              dapls_cm_release(cr); /* release thread ref */\r
+-                              continue;\r
+-                      }\r
+-\r
+-                      event = (cr->state == DCM_CONN_PENDING) ?\r
+-                                      DAPL_FD_WRITE : DAPL_FD_READ;\r
+-\r
+-                      if (dapl_fd_set(cr->socket, set, event)) {\r
+-                              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                                       " cr_thread: fd_set ERR st=%d fd %d"\r
+-                                       " -> %s\n", cr->state, cr->socket,\r
+-                                       inet_ntoa(((struct sockaddr_in *)\r
+-                                              &cr->msg.daddr.so)->sin_addr));\r
+-                              dapl_os_unlock(&cr->lock);\r
+-                              dapls_cm_release(cr); /* release ref */\r
+-                              continue;\r
+-                      }\r
+-                      dapl_os_unlock(&cr->lock);\r
+-                      dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
+-                      \r
+-                      ret = dapl_poll(cr->socket, event);\r
+-\r
+-                      dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
+-                                   " poll ret=0x%x %s sck=%d\n",\r
+-                                   ret, dapl_cm_state_str(cr->state), \r
+-                                   cr->socket);\r
+-\r
+-                      /* data on listen, qp exchange, and on disc req */\r
+-                      dapl_os_lock(&cr->lock);\r
+-                      if ((ret == DAPL_FD_READ) || \r
+-                          (cr->state != DCM_CONN_PENDING && ret == DAPL_FD_ERROR)) {\r
+-                              if (cr->socket != DAPL_INVALID_SOCKET) {\r
+-                                      switch (cr->state) {\r
+-                                      case DCM_LISTEN:\r
+-                                              dapl_os_unlock(&cr->lock);\r
+-                                              dapli_socket_accept(cr);\r
+-                                                break;\r
+-                                      case DCM_ACCEPTING:\r
+-                                              dapl_os_unlock(&cr->lock);\r
+-                                              dapli_socket_accept_data(cr);\r
+-                                              break;\r
+-                                      case DCM_ACCEPTED:\r
+-                                              dapl_os_unlock(&cr->lock);\r
+-                                              dapli_socket_accept_rtu(cr);\r
+-                                              break;\r
+-                                      case DCM_REP_PENDING:\r
+-                                              dapl_os_unlock(&cr->lock);\r
+-                                              dapli_socket_connect_rtu(cr);\r
+-                                              break;\r
+-                                      case DCM_CONNECTED:\r
+-                                              dapl_os_unlock(&cr->lock);\r
+-                                              dapli_socket_disconnect(cr);\r
+-                                              break;\r
+-                                      default:\r
+-                                              dapl_os_unlock(&cr->lock);\r
+-                                              break;\r
+-                                      }\r
+-                              } else \r
+-                                      dapl_os_unlock(&cr->lock);\r
+-\r
+-                      /* ASYNC connections, writable, readable, error; check status */\r
+-                      } else if (ret == DAPL_FD_WRITE ||\r
+-                                 (cr->state == DCM_CONN_PENDING && \r
+-                                  ret == DAPL_FD_ERROR)) {\r
+-                              \r
+-                              opt = 0;\r
+-                              opt_len = sizeof(opt);\r
+-                              ret = getsockopt(cr->socket, SOL_SOCKET,\r
+-                                               SO_ERROR, (char *)&opt,\r
+-                                               &opt_len);\r
+-                              dapl_os_unlock(&cr->lock);\r
+-                              if (!ret && !opt)\r
+-                                      dapli_socket_connected(cr, opt);\r
+-                              else\r
+-                                      dapli_socket_connected(cr, opt ? opt : dapl_socket_errno());\r
+-                      } else \r
+-                              dapl_os_unlock(&cr->lock);\r
+-\r
+-                      dapls_cm_release(cr); /* release ref */\r
+-                      dapl_os_lock(&hca_ptr->ib_trans.lock);\r
+-              }\r
+-\r
+-              /* set to exit and all resources destroyed */\r
+-              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&\r
+-                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))\r
+-                      break;\r
+-\r
+-              dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
+-              dapl_select(set);\r
+-\r
+-              /* if pipe used to wakeup, consume */\r
+-              while (dapl_poll(hca_ptr->ib_trans.scm[0], \r
+-                               DAPL_FD_READ) == DAPL_FD_READ) {\r
+-                      if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1)\r
+-                              dapl_log(DAPL_DBG_TYPE_THREAD,\r
+-                                       " cr_thread: read pipe error = %s\n",\r
+-                                       strerror(errno));\r
+-              }\r
+-              dapl_os_lock(&hca_ptr->ib_trans.lock);\r
+-              \r
+-              /* set to exit and all resources destroyed */\r
+-              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&\r
+-                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))\r
+-                      break;\r
+-      }\r
+-\r
+-      dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
+-      dapl_os_free(set, sizeof(struct dapl_fd_set));\r
+-out:\r
+-      hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " cr_thread(hca %p) exit\n", hca_ptr);\r
+-}\r
+-\r
+-\r
+-#ifdef DAPL_COUNTERS\r
+-/* Debug aid: List all Connections in process and state */\r
+-void dapls_print_cm_list(IN DAPL_IA *ia_ptr)\r
+-{\r
+-      /* Print in process CR's for this IA, if debug type set */\r
+-      int i = 0;\r
+-      dp_ib_cm_handle_t cr, next_cr;\r
+-\r
+-      dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock);\r
+-      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)\r
+-                               &ia_ptr->hca_ptr->ib_trans.list))\r
+-                               next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*)\r
+-                               &ia_ptr->hca_ptr->ib_trans.list);\r
+-      else\r
+-              next_cr = NULL;\r
+-\r
+-        printf("\n DAPL IA CONNECTIONS IN PROCESS:\n");\r
+-      while (next_cr) {\r
+-              cr = next_cr;\r
+-              next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*)\r
+-                               &ia_ptr->hca_ptr->ib_trans.list,\r
+-                              (DAPL_LLIST_ENTRY*)&cr->local_entry);\r
+-\r
+-              printf( "  CONN[%d]: sp %p ep %p sock %d %s %s %s %s %s %s PORT L-%x R-%x PID L-%x R-%x\n",\r
+-                      i, cr->sp, cr->ep, cr->socket,\r
+-                      cr->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
+-                      dapl_cm_state_str(cr->state), dapl_cm_op_str(ntohs(cr->msg.op)),\r
+-                      ntohs(cr->msg.op) == DCM_REQ ? /* local address */\r
+-                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr) :\r
+-                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr),\r
+-                      cr->sp ? "<-" : "->",\r
+-                              ntohs(cr->msg.op) == DCM_REQ ? /* remote address */\r
+-                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr) :\r
+-                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr),\r
+-\r
+-                      ntohs(cr->msg.op) == DCM_REQ ? /* local port */\r
+-                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port) :\r
+-                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port),\r
+-\r
+-                      ntohs(cr->msg.op) == DCM_REQ ? /* remote port */\r
+-                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port) :\r
+-                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port),\r
+-\r
+-                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[2]) : ntohs(*(uint16_t*)&cr->msg.resv[0]),\r
+-                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[0]) : ntohs(*(uint16_t*)&cr->msg.resv[2]));\r
+-\r
+-              i++;\r
+-      }\r
+-      printf("\n");\r
+-      dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock);\r
+-}\r
+-#endif\r
++/*
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++/***************************************************************************
++ *
++ *   Module:           uDAPL
++ *
++ *   Filename:                 dapl_ib_cm.c
++ *
++ *   Author:           Arlin Davis
++ *
++ *   Created:          3/10/2005
++ *
++ *   Description: 
++ *
++ *   The uDAPL openib provider - connection management
++ *
++ ****************************************************************************
++ *               Source Control System Information
++ *
++ *    $Id: $
++ *
++ *    Copyright (c) 2005 Intel Corporation.  All rights reserved.
++ *
++ **************************************************************************/
++
++#if defined(_WIN32)
++#define FD_SETSIZE 1024
++#define DAPL_FD_SETSIZE FD_SETSIZE
++#endif
++
++#include "dapl.h"
++#include "dapl_adapter_util.h"
++#include "dapl_evd_util.h"
++#include "dapl_cr_util.h"
++#include "dapl_name_service.h"
++#include "dapl_ib_util.h"
++#include "dapl_ep_util.h"
++#include "dapl_osd.h"
++
++/* forward declarations */
++static DAT_RETURN
++dapli_socket_connect(DAPL_EP * ep_ptr,
++                   DAT_IA_ADDRESS_PTR r_addr,
++                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data);
++
++#ifdef DAPL_DBG
++/* Check for EP linking to IA and proper connect state */
++void dapli_ep_check(DAPL_EP *ep)
++{
++      DAPL_IA *ia_ptr = ep->header.owner_ia;
++      DAPL_EP *ep_ptr, *next_ep_ptr;
++      int found = 0;
++
++      dapl_os_lock(&ia_ptr->header.lock);
++      ep_ptr = (dapl_llist_is_empty (&ia_ptr->ep_list_head)
++              ? NULL : dapl_llist_peek_head (&ia_ptr->ep_list_head));
++
++      while (ep_ptr != NULL) {
++              next_ep_ptr = 
++                      dapl_llist_next_entry(&ia_ptr->ep_list_head,
++                                            &ep_ptr->header.ia_list_entry);
++              if (ep == ep_ptr) {
++                      found++;
++                      if ((ep->cr_ptr && ep->param.ep_state 
++                              != DAT_EP_STATE_COMPLETION_PENDING) ||
++                          (!ep->cr_ptr && ep->param.ep_state 
++                              != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING))
++                              goto err;
++                      else 
++                              goto match;
++              }
++              ep_ptr = next_ep_ptr;
++      }
++err:
++      dapl_log(DAPL_DBG_TYPE_ERR,
++               " dapli_ep_check ERR: %s %s ep=%p state=%d magic=0x%x\n", 
++               ep->cr_ptr ? "PASSIVE":"ACTIVE", 
++               found ? "WRONG_STATE":"NOT_FOUND" ,
++               ep, ep->param.ep_state, ep->header.magic);
++match:
++      dapl_os_unlock(&ia_ptr->header.lock);
++      return;
++}
++#else
++#define dapli_ep_check(ep)
++#endif
++
++#if defined(_WIN32) || defined(_WIN64)
++enum DAPL_FD_EVENTS {
++      DAPL_FD_READ = 0x1,
++      DAPL_FD_WRITE = 0x2,
++      DAPL_FD_ERROR = 0x4
++};
++
++static int dapl_config_socket(DAPL_SOCKET s)
++{
++      unsigned long nonblocking = 1;
++      int ret, opt = 1;
++
++      ret = ioctlsocket(s, FIONBIO, &nonblocking);
++
++      /* no delay for small packets */
++      if (!ret)
++              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, 
++                               (char *)&opt, sizeof(opt));
++      return ret;
++}
++
++static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
++                             int addrlen)
++{
++      int err;
++
++      err = connect(s, addr, addrlen);
++      if (err == SOCKET_ERROR)
++              err = WSAGetLastError();
++      return (err == WSAEWOULDBLOCK) ? EAGAIN : err;
++}
++
++struct dapl_fd_set {
++      struct fd_set set[3];
++};
++
++static struct dapl_fd_set *dapl_alloc_fd_set(void)
++{
++      return dapl_os_alloc(sizeof(struct dapl_fd_set));
++}
++
++static void dapl_fd_zero(struct dapl_fd_set *set)
++{
++      FD_ZERO(&set->set[0]);
++      FD_ZERO(&set->set[1]);
++      FD_ZERO(&set->set[2]);
++}
++
++static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
++                     enum DAPL_FD_EVENTS event)
++{
++      FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);
++      FD_SET(s, &set->set[2]);
++      return 0;
++}
++
++static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
++{
++      struct fd_set rw_fds;
++      struct fd_set err_fds;
++      struct timeval tv;
++      int ret;
++
++      FD_ZERO(&rw_fds);
++      FD_ZERO(&err_fds);
++      FD_SET(s, &rw_fds);
++      FD_SET(s, &err_fds);
++
++      tv.tv_sec = 0;
++      tv.tv_usec = 0;
++
++      if (event == DAPL_FD_READ)
++              ret = select(1, &rw_fds, NULL, &err_fds, &tv);
++      else
++              ret = select(1, NULL, &rw_fds, &err_fds, &tv);
++
++      if (ret == 0)
++              return 0;
++      else if (ret == SOCKET_ERROR)
++              return DAPL_FD_ERROR;
++      else if (FD_ISSET(s, &rw_fds))
++              return event;
++      else
++              return DAPL_FD_ERROR;
++}
++
++static int dapl_select(struct dapl_fd_set *set)
++{
++      int ret;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n");
++      ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL);
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n");
++
++      if (ret == SOCKET_ERROR)
++              dapl_dbg_log(DAPL_DBG_TYPE_THREAD,
++                           " dapl_select: error 0x%x\n", WSAGetLastError());
++
++      return ret;
++}
++
++static int dapl_socket_errno(void)
++{
++      int err;
++
++      err = WSAGetLastError();
++      switch (err) {
++      case WSAEACCES:
++      case WSAEADDRINUSE:
++              return EADDRINUSE;
++      case WSAECONNRESET:
++              return ECONNRESET;
++      default:
++              return err;
++      }
++}
++#else                         // _WIN32 || _WIN64
++enum DAPL_FD_EVENTS {
++      DAPL_FD_READ = POLLIN,
++      DAPL_FD_WRITE = POLLOUT,
++      DAPL_FD_ERROR = POLLERR
++};
++
++static int dapl_config_socket(DAPL_SOCKET s)
++{
++      int ret, opt = 1;
++
++      /* non-blocking */
++      ret = fcntl(s, F_GETFL);
++      if (ret >= 0)
++              ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);
++
++      /* no delay for small packets */
++      if (!ret)
++              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, 
++                               (char *)&opt, sizeof(opt));
++      return ret;
++}
++
++static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
++                             int addrlen)
++{
++      int ret;
++
++      ret = connect(s, addr, addrlen);
++
++      return (errno == EINPROGRESS) ? EAGAIN : ret;
++}
++
++struct dapl_fd_set {
++      int index;
++      struct pollfd set[DAPL_FD_SETSIZE];
++};
++
++static struct dapl_fd_set *dapl_alloc_fd_set(void)
++{
++      return dapl_os_alloc(sizeof(struct dapl_fd_set));
++}
++
++static void dapl_fd_zero(struct dapl_fd_set *set)
++{
++      set->index = 0;
++}
++
++static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
++                     enum DAPL_FD_EVENTS event)
++{
++      if (set->index == DAPL_FD_SETSIZE - 1) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",
++                       set->index + 1);
++              return -1;
++      }
++
++      set->set[set->index].fd = s;
++      set->set[set->index].revents = 0;
++      set->set[set->index++].events = event;
++      return 0;
++}
++
++static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
++{
++      struct pollfd fds;
++      int ret;
++
++      fds.fd = s;
++      fds.events = event;
++      fds.revents = 0;
++      ret = poll(&fds, 1, 0);
++      dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",
++               s, ret, fds.revents);
++      if (ret == 0)
++              return 0;
++      else if (ret < 0 || (fds.revents & (POLLERR | POLLHUP | POLLNVAL))) 
++              return DAPL_FD_ERROR;
++      else 
++              return event;
++}
++
++static int dapl_select(struct dapl_fd_set *set)
++{
++      int ret;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index);
++      ret = poll(set->set, set->index, -1);
++      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret);
++      return ret;
++}
++
++#define dapl_socket_errno() errno
++#endif
++
++static void dapli_cm_thread_signal(dp_ib_cm_handle_t cm_ptr) 
++{
++      if (cm_ptr->hca)
++              send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0);
++}
++
++static void dapli_cm_free(dp_ib_cm_handle_t cm_ptr) 
++{
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_FREE;
++      dapl_os_unlock(&cm_ptr->lock);
++      dapli_cm_thread_signal(cm_ptr);
++}
++
++static void dapli_cm_dealloc(dp_ib_cm_handle_t cm_ptr) 
++{
++      dapl_os_assert(!cm_ptr->ref_count);
++      
++      if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
++              shutdown(cm_ptr->socket, SHUT_RDWR);
++              closesocket(cm_ptr->socket);
++      }
++      if (cm_ptr->ah) 
++              ibv_destroy_ah(cm_ptr->ah);
++      
++      dapl_os_lock_destroy(&cm_ptr->lock);
++      dapl_os_wait_object_destroy(&cm_ptr->event);
++      dapl_os_free(cm_ptr, sizeof(*cm_ptr));
++}
++
++void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr)
++{
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->ref_count++;
++      dapl_os_unlock(&cm_ptr->lock);
++}
++
++void dapls_cm_release(dp_ib_cm_handle_t cm_ptr)
++{
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->ref_count--;
++      if (cm_ptr->ref_count) {
++                dapl_os_unlock(&cm_ptr->lock);
++              return;
++      }
++      dapl_os_unlock(&cm_ptr->lock);
++      dapli_cm_dealloc(cm_ptr);
++}
++
++static dp_ib_cm_handle_t dapli_cm_alloc(DAPL_EP *ep_ptr)
++{
++      dp_ib_cm_handle_t cm_ptr;
++
++      /* Allocate CM, init lock, and initialize */
++      if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL)
++              return NULL;
++
++      (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));
++      if (dapl_os_lock_init(&cm_ptr->lock))
++              goto bail;
++
++      if (dapl_os_wait_object_init(&cm_ptr->event)) {
++              dapl_os_lock_destroy(&cm_ptr->lock);
++              goto bail;
++      }
++      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->list_entry);
++      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);
++
++      cm_ptr->msg.ver = htons(DCM_VER);
++      cm_ptr->socket = DAPL_INVALID_SOCKET;
++      dapls_cm_acquire(cm_ptr);
++              
++      /* Link EP and CM */
++      if (ep_ptr != NULL) {
++              dapl_ep_link_cm(ep_ptr, cm_ptr); /* ref++ */
++              cm_ptr->ep = ep_ptr;
++              cm_ptr->hca = ((DAPL_IA *)ep_ptr->param.ia_handle)->hca_ptr;
++      }
++      return cm_ptr;
++bail:
++      dapl_os_free(cm_ptr, sizeof(*cm_ptr));
++      return NULL;
++}
++
++/* queue socket for processing CM work */
++static void dapli_cm_queue(dp_ib_cm_handle_t cm_ptr)
++{
++      /* add to work queue for cr thread processing */
++      dapl_os_lock(&cm_ptr->hca->ib_trans.lock);
++      dapls_cm_acquire(cm_ptr);
++      dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list,
++                          (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry, cm_ptr);
++      dapl_os_unlock(&cm_ptr->hca->ib_trans.lock);
++      dapli_cm_thread_signal(cm_ptr);
++}
++
++/* called with local LIST lock */
++static void dapli_cm_dequeue(dp_ib_cm_handle_t cm_ptr)
++{
++      /* Remove from work queue, cr thread processing */
++      dapl_llist_remove_entry(&cm_ptr->hca->ib_trans.list,
++                              (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);
++      dapls_cm_release(cm_ptr);
++}
++
++/* BLOCKING: called from dapl_ep_free, EP link will be last ref */
++void dapls_cm_free(dp_ib_cm_handle_t cm_ptr)
++{
++      dapl_log(DAPL_DBG_TYPE_CM,
++               " cm_free: cm %p %s ep %p refs=%d\n", 
++               cm_ptr, dapl_cm_state_str(cm_ptr->state),
++               cm_ptr->ep, cm_ptr->ref_count);
++      
++      /* free from internal workq, wait until EP is last ref */
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_FREE;
++      while (cm_ptr->ref_count != 1) {
++              dapli_cm_thread_signal(cm_ptr);
++              dapl_os_unlock(&cm_ptr->lock);
++              dapl_os_sleep_usec(10000);
++              dapl_os_lock(&cm_ptr->lock);
++      }
++      dapl_os_unlock(&cm_ptr->lock);
++
++      /* unlink, dequeue from EP. Final ref so release will destroy */
++      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);
++}
++
++/*
++ * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect
++ *                 or from ep_free. 
++ */
++DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)
++{
++      DAT_UINT32 disc_data = htonl(0xdead);
++
++      dapl_os_lock(&cm_ptr->lock);
++      if (cm_ptr->state != DCM_CONNECTED || 
++          cm_ptr->state == DCM_DISCONNECTED) {
++              dapl_os_unlock(&cm_ptr->lock);
++              return DAT_SUCCESS;
++      }
++      cm_ptr->state = DCM_DISCONNECTED;
++      dapl_os_unlock(&cm_ptr->lock);
++      
++      /* send disc date, close socket, schedule destroy */
++      send(cm_ptr->socket, (char *)&disc_data, sizeof(disc_data), 0);
++
++      /* disconnect events for RC's only */
++      if (cm_ptr->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
++              dapl_os_lock(&cm_ptr->ep->header.lock);
++              dapls_modify_qp_state(cm_ptr->ep->qp_handle, IBV_QPS_ERR, 0,0,0);
++              dapl_os_unlock(&cm_ptr->ep->header.lock);
++              if (cm_ptr->ep->cr_ptr) {
++                      dapls_cr_callback(cm_ptr,
++                                        IB_CME_DISCONNECTED,
++                                        NULL, 0, cm_ptr->sp);
++              } else {
++                      dapl_evd_connection_callback(cm_ptr,
++                                                   IB_CME_DISCONNECTED,
++                                                   NULL, 0, cm_ptr->ep);
++              }
++      }
++      
++      /* release from workq */
++      dapli_cm_free(cm_ptr);
++
++      /* scheduled destroy via disconnect clean in callback */
++      return DAT_SUCCESS;
++}
++
++/*
++ * ACTIVE: socket connected, send QP information to peer 
++ */
++static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)
++{
++      int len, exp;
++      struct iovec iov[2];
++      struct dapl_ep *ep_ptr = cm_ptr->ep;
++
++      if (err) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_PENDING: %s ERR %s -> %s %d - %s\n",
++                       err == -1 ? "POLL" : "SOCKOPT",
++                       err == -1 ? strerror(dapl_socket_errno()) : strerror(err), 
++                       inet_ntoa(((struct sockaddr_in *)
++                              &cm_ptr->addr)->sin_addr), 
++                       ntohs(((struct sockaddr_in *)
++                              &cm_ptr->addr)->sin_port),
++                       err == ETIMEDOUT ? "RETRYING...":"ABORTING");
++
++              /* retry a timeout */
++              if (err == ETIMEDOUT) {
++                      closesocket(cm_ptr->socket);
++                      cm_ptr->socket = DAPL_INVALID_SOCKET;
++                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, 
++                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,
++                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);
++                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);
++                      dapli_cm_free(cm_ptr);
++                      return;
++              }
++
++              goto bail;
++      }
++
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_REP_PENDING;
++      dapl_os_unlock(&cm_ptr->lock);
++
++      /* send qp info and pdata to remote peer */
++      exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
++      iov[0].iov_base = (void *)&cm_ptr->msg;
++      iov[0].iov_len = exp;
++      if (cm_ptr->msg.p_size) {
++              iov[1].iov_base = cm_ptr->msg.p_data;
++              iov[1].iov_len = ntohs(cm_ptr->msg.p_size);
++              len = writev(cm_ptr->socket, iov, 2);
++      } else {
++              len = writev(cm_ptr->socket, iov, 1);
++      }
++
++      if (len != (exp + ntohs(cm_ptr->msg.p_size))) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_PENDING len ERR 0x%x %s, wcnt=%d(%d) -> %s\n",
++                       err, strerror(err), len, 
++                       exp + ntohs(cm_ptr->msg.p_size), 
++                       inet_ntoa(((struct sockaddr_in *)
++                                 ep_ptr->param.
++                                 remote_ia_address_ptr)->sin_addr));
++              goto bail;
++      }
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " CONN_PENDING: sending SRC lid=0x%x,"
++                   " qpn=0x%x, psize=%d\n",
++                   ntohs(cm_ptr->msg.saddr.ib.lid),
++                   ntohl(cm_ptr->msg.saddr.ib.qpn), 
++                   ntohs(cm_ptr->msg.p_size));
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " CONN_PENDING: SRC GID subnet %016llx id %016llx\n",
++                   (unsigned long long)
++                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[0]),
++                   (unsigned long long)
++                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[8]));
++      return;
++
++bail:
++      /* mark CM object for cleanup */
++      dapli_cm_free(cm_ptr);
++      dapl_evd_connection_callback(NULL, IB_CME_LOCAL_FAILURE, NULL, 0, ep_ptr);
++}
++
++/*
++ * ACTIVE: Create socket, connect, defer exchange QP information to CR thread
++ * to avoid blocking. 
++ */
++static DAT_RETURN
++dapli_socket_connect(DAPL_EP * ep_ptr,
++                   DAT_IA_ADDRESS_PTR r_addr,
++                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data)
++{
++      dp_ib_cm_handle_t cm_ptr;
++      int ret;
++      socklen_t sl;
++      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
++      DAT_RETURN dat_ret = DAT_INSUFFICIENT_RESOURCES;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n",
++                   r_qual, p_size);
++
++      cm_ptr = dapli_cm_alloc(ep_ptr);
++      if (cm_ptr == NULL)
++              return dat_ret;
++
++      /* create, connect, sockopt, and exchange QP information */
++      if ((cm_ptr->socket =
++           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " connect: socket create ERR 0x%x %s\n", 
++                       err, strerror(err));
++              goto bail;
++      }
++
++      ret = dapl_config_socket(cm_ptr->socket);
++      if (ret < 0) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " connect: config socket %d RET %d ERR 0x%x %s\n",
++                       cm_ptr->socket, ret, 
++                       dapl_socket_errno(), strerror(dapl_socket_errno()));
++              dat_ret = DAT_INTERNAL_ERROR;
++              goto bail;
++      }
++
++      /* save remote address */
++      dapl_os_memcpy(&cm_ptr->addr, r_addr, sizeof(*r_addr));
++
++#ifdef DAPL_DBG
++      /* DBG: Active PID [0], PASSIVE PID [2]*/
++      *(uint16_t*)&cm_ptr->msg.resv[0] = htons((uint16_t)dapl_os_getpid()); 
++      *(uint16_t*)&cm_ptr->msg.resv[2] = ((struct sockaddr_in *)&cm_ptr->addr)->sin_port;
++#endif
++      ((struct sockaddr_in *)&cm_ptr->addr)->sin_port = htons(r_qual + 1000);
++      ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&cm_ptr->addr,
++                                sizeof(cm_ptr->addr));
++      if (ret && ret != EAGAIN) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " connect: dapl_connect_socket RET %d ERR 0x%x %s\n",
++                       ret, dapl_socket_errno(), 
++                       strerror(dapl_socket_errno()));
++              dat_ret = DAT_INVALID_ADDRESS;
++              goto bail;
++      }
++
++      /* REQ: QP info in msg.saddr, IA address in msg.daddr, and pdata */
++      cm_ptr->hca = ia_ptr->hca_ptr;
++      cm_ptr->msg.op = ntohs(DCM_REQ);
++      cm_ptr->msg.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);
++      cm_ptr->msg.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;
++      cm_ptr->msg.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;
++      dapl_os_memcpy(&cm_ptr->msg.saddr.ib.gid[0], 
++                     &ia_ptr->hca_ptr->ib_trans.gid, 16);
++      
++      /* get local address information from socket */
++      sl = sizeof(cm_ptr->msg.daddr.so);
++      if (getsockname(cm_ptr->socket, (struct sockaddr *)&cm_ptr->msg.daddr.so, &sl)) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                      " connect getsockname ERROR: 0x%x %s -> %s r_qual %d\n",
++                      err, strerror(err), 
++                      inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
++                      (unsigned int)r_qual);;
++      }
++
++      if (p_size) {
++              cm_ptr->msg.p_size = htons(p_size);
++              dapl_os_memcpy(cm_ptr->msg.p_data, p_data, p_size);
++      }
++
++      /* connected or pending, either way results via async event */
++      if (ret == 0)
++              dapli_socket_connected(cm_ptr, 0);
++      else
++              cm_ptr->state = DCM_CONN_PENDING;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: p_data=%p %p\n",
++                   cm_ptr->msg.p_data, cm_ptr->msg.p_data);
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " connect: %s r_qual %d pending, p_sz=%d, %d %d ...\n",
++                   inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), 
++                   (unsigned int)r_qual, ntohs(cm_ptr->msg.p_size),
++                   cm_ptr->msg.p_data[0], cm_ptr->msg.p_data[1]);
++
++      /* queue up on work thread */
++      dapli_cm_queue(cm_ptr);
++      return DAT_SUCCESS;
++bail:
++      dapl_log(DAPL_DBG_TYPE_ERR,
++               " connect ERROR: -> %s r_qual %d\n",
++               inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
++               (unsigned int)r_qual);
++
++      /* Never queued, destroy */
++      dapls_cm_release(cm_ptr);
++      return dat_ret;
++}
++
++/*
++ * ACTIVE: exchange QP information, called from CR thread
++ */
++static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)
++{
++      DAPL_EP *ep_ptr = cm_ptr->ep;
++      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
++      ib_cm_events_t event = IB_CME_LOCAL_FAILURE;
++      socklen_t sl;
++
++      /* read DST information into cm_ptr, overwrite SRC info */
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n");
++
++      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0);
++      if (len != exp || ntohs(cm_ptr->msg.ver) != DCM_VER) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_WARN,
++                       " CONN_RTU read: sk %d ERR 0x%x, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n",
++                       cm_ptr->socket, err, len, ntohs(cm_ptr->msg.ver),
++                       inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr),
++                       ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port),
++                       ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port),
++                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[0]),
++                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[2]));
++
++              /* Retry; corner case where server tcp stack resets under load */
++              if (err == ECONNRESET) {
++                      closesocket(cm_ptr->socket);
++                      cm_ptr->socket = DAPL_INVALID_SOCKET;
++                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, 
++                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,
++                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);
++                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);
++                      dapli_cm_free(cm_ptr);
++                      return;
++              }
++              goto bail;
++      }
++
++      /* keep the QP, address info in network order */
++      
++      /* save remote address information, in msg.daddr */
++      dapl_os_memcpy(&cm_ptr->addr,
++                     &cm_ptr->msg.daddr.so,
++                     sizeof(union dcm_addr));
++
++      /* save local address information from socket */
++      sl = sizeof(cm_ptr->addr);
++      getsockname(cm_ptr->socket,(struct sockaddr *)&cm_ptr->addr, &sl);
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " CONN_RTU: DST %s %d lid=0x%x,"
++                   " qpn=0x%x, qp_type=%d, psize=%d\n",
++                   inet_ntoa(((struct sockaddr_in *)
++                              &cm_ptr->msg.daddr.so)->sin_addr),
++                   ntohs(((struct sockaddr_in *)
++                              &cm_ptr->msg.daddr.so)->sin_port),
++                   ntohs(cm_ptr->msg.saddr.ib.lid),
++                   ntohl(cm_ptr->msg.saddr.ib.qpn), 
++                   cm_ptr->msg.saddr.ib.qp_type, 
++                   ntohs(cm_ptr->msg.p_size));
++
++      /* validate private data size before reading */
++      if (ntohs(cm_ptr->msg.p_size) > DCM_MAX_PDATA_SIZE) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_RTU read: psize (%d) wrong -> %s\n",
++                       ntohs(cm_ptr->msg.p_size), 
++                       inet_ntoa(((struct sockaddr_in *)
++                                 ep_ptr->param.
++                                 remote_ia_address_ptr)->sin_addr));
++              goto bail;
++      }
++
++      /* read private data into cm_handle if any present */
++      dapl_dbg_log(DAPL_DBG_TYPE_EP," CONN_RTU: read private data\n");
++      exp = ntohs(cm_ptr->msg.p_size);
++      if (exp) {
++              len = recv(cm_ptr->socket, cm_ptr->msg.p_data, exp, 0);
++              if (len != exp) {
++                      int err = dapl_socket_errno();
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               " CONN_RTU read pdata: ERR 0x%x %s, rcnt=%d -> %s\n",
++                               err, strerror(err), len,
++                               inet_ntoa(((struct sockaddr_in *)
++                                          ep_ptr->param.
++                                          remote_ia_address_ptr)->sin_addr));
++                      goto bail;
++              }
++      }
++
++      /* check for consumer or protocol stack reject */
++      if (ntohs(cm_ptr->msg.op) == DCM_REP)
++              event = IB_CME_CONNECTED;
++      else if (ntohs(cm_ptr->msg.op) == DCM_REJ_USER) 
++              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
++      else  
++              event = IB_CME_DESTINATION_REJECT;
++      
++      if (event != IB_CME_CONNECTED) {
++              dapl_log(DAPL_DBG_TYPE_CM,
++                       " CONN_RTU: reject from %s %x\n",
++                       inet_ntoa(((struct sockaddr_in *)
++                                  &cm_ptr->msg.daddr.so)->sin_addr),
++                       ntohs(((struct sockaddr_in *)
++                               &cm_ptr->msg.daddr.so)->sin_port));
++              goto bail;
++      }
++
++      /* modify QP to RTR and then to RTS with remote info */
++      dapl_os_lock(&ep_ptr->header.lock);
++      if (dapls_modify_qp_state(ep_ptr->qp_handle,
++                                IBV_QPS_RTR, 
++                                cm_ptr->msg.saddr.ib.qpn,
++                                cm_ptr->msg.saddr.ib.lid,
++                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_RTU: QPS_RTR ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",
++                       strerror(errno), ep_ptr->qp_handle->qp_type,
++                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,
++                       ntohl(cm_ptr->msg.saddr.ib.qpn), 
++                       ntohs(cm_ptr->msg.saddr.ib.lid),
++                       inet_ntoa(((struct sockaddr_in *)
++                                  &cm_ptr->msg.daddr.so)->sin_addr),
++                       ntohs(((struct sockaddr_in *)
++                               &cm_ptr->msg.daddr.so)->sin_port));
++              dapl_os_unlock(&ep_ptr->header.lock);
++              goto bail;
++      }
++      if (dapls_modify_qp_state(ep_ptr->qp_handle,
++                                IBV_QPS_RTS, 
++                                cm_ptr->msg.saddr.ib.qpn,
++                                cm_ptr->msg.saddr.ib.lid,
++                                NULL) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_RTU: QPS_RTS ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",
++                       strerror(errno), ep_ptr->qp_handle->qp_type,
++                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,
++                       ntohl(cm_ptr->msg.saddr.ib.qpn), 
++                       ntohs(cm_ptr->msg.saddr.ib.lid),
++                       inet_ntoa(((struct sockaddr_in *)
++                                  &cm_ptr->msg.daddr.so)->sin_addr),
++                       ntohs(((struct sockaddr_in *)
++                               &cm_ptr->msg.daddr.so)->sin_port));
++              dapl_os_unlock(&ep_ptr->header.lock);
++              goto bail;
++      }
++      dapl_os_unlock(&ep_ptr->header.lock);
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n");
++
++      /* complete handshake after final QP state change, Just ver+op */
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_CONNECTED;
++      dapl_os_unlock(&cm_ptr->lock);
++
++      cm_ptr->msg.op = ntohs(DCM_RTU);
++      if (send(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0) == -1) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_RTU: write ERR = 0x%x %s\n", 
++                       err, strerror(err));
++              goto bail;
++      }
++      /* post the event with private data */
++      event = IB_CME_CONNECTED;
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");
++
++#ifdef DAT_EXTENSIONS
++ud_bail:
++      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {
++              DAT_IB_EXTENSION_EVENT_DATA xevent;
++              ib_pd_handle_t pd_handle = 
++                      ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle;
++
++              if (event == IB_CME_CONNECTED) {
++                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,
++                                                   ep_ptr->qp_handle,
++                                                   cm_ptr->msg.saddr.ib.lid, 
++                                                   NULL);
++                      if (cm_ptr->ah) {
++                              /* post UD extended EVENT */
++                              xevent.status = 0;
++                              xevent.type = DAT_IB_UD_REMOTE_AH;
++                              xevent.remote_ah.ah = cm_ptr->ah;
++                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);
++                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
++                                              &ep_ptr->remote_ia_address,
++                                              sizeof(union dcm_addr));
++                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;
++
++                              dapl_log(DAPL_DBG_TYPE_CM, 
++                                      " CONN_RTU: UD AH %p for lid 0x%x"
++                                      " qpn 0x%x\n", 
++                                      cm_ptr->ah, 
++                                      ntohs(cm_ptr->msg.saddr.ib.lid),
++                                      ntohl(cm_ptr->msg.saddr.ib.qpn));
++      
++                      } else 
++                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
++                      
++              } else if (event == IB_CME_LOCAL_FAILURE) {
++                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
++              } else  
++                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;
++
++              dapls_evd_post_connection_event_ext(
++                              (DAPL_EVD *) ep_ptr->param.connect_evd_handle,
++                              event,
++                              (DAT_EP_HANDLE) ep_ptr,
++                              (DAT_COUNT) exp,
++                              (DAT_PVOID *) cm_ptr->msg.p_data,
++                              (DAT_PVOID *) &xevent);
++
++              /* cleanup and release from local list */
++              dapli_cm_free(cm_ptr);
++      
++      } else
++#endif
++      {
++              dapli_ep_check(cm_ptr->ep);
++              dapl_evd_connection_callback(cm_ptr, event, cm_ptr->msg.p_data,
++                                           DCM_MAX_PDATA_SIZE, ep_ptr);
++      }
++      dapl_log(DAPL_DBG_TYPE_CM_EST,
++               " SCM ACTIVE CONN: %x -> %s %x\n",
++               ntohs(((struct sockaddr_in *) &cm_ptr->addr)->sin_port),
++               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),
++               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)-1000);
++      return;
++
++bail:
++
++#ifdef DAT_EXTENSIONS
++      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) 
++              goto ud_bail;
++#endif
++      /* close socket, and post error event */
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_REJECTED;
++      dapl_os_unlock(&cm_ptr->lock);
++
++      dapl_evd_connection_callback(NULL, event, cm_ptr->msg.p_data,
++                                   DCM_MAX_PDATA_SIZE, ep_ptr);
++      dapli_cm_free(cm_ptr);
++}
++
++/*
++ * PASSIVE: Create socket, listen, accept, exchange QP information 
++ */
++DAT_RETURN
++dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr)
++{
++      struct sockaddr_in addr;
++      ib_cm_srvc_handle_t cm_ptr = NULL;
++      DAT_RETURN dat_status = DAT_SUCCESS;
++      int opt = 1;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " setup listen(ia_ptr %p ServiceID %d sp_ptr %p)\n",
++                   ia_ptr, serviceID, sp_ptr);
++
++      cm_ptr = dapli_cm_alloc(NULL);
++      if (cm_ptr == NULL)
++              return DAT_INSUFFICIENT_RESOURCES;
++
++      cm_ptr->sp = sp_ptr;
++      cm_ptr->hca = ia_ptr->hca_ptr;
++
++      /* bind, listen, set sockopt, accept, exchange data */
++      if ((cm_ptr->socket =
++           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR, 
++                       " listen: socket create: ERR 0x%x %s\n",
++                       err, strerror(err));
++              dat_status = DAT_INSUFFICIENT_RESOURCES;
++              goto bail;
++      }
++
++      setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));
++      addr.sin_port = htons(serviceID + 1000);
++      addr.sin_family = AF_INET;
++      addr.sin_addr = ((struct sockaddr_in *) &ia_ptr->hca_ptr->hca_address)->sin_addr;
++
++      if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)
++          || (listen(cm_ptr->socket, 128) < 0)) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_CM,
++                       " listen: ERROR 0x%x %s on port %d\n",
++                       err, strerror(err), serviceID + 1000);
++              if (err == EADDRINUSE)
++                      dat_status = DAT_CONN_QUAL_IN_USE;
++              else
++                      dat_status = DAT_CONN_QUAL_UNAVAILABLE;
++              goto bail;
++      }
++
++      /* set cm_handle for this service point, save listen socket */
++      sp_ptr->cm_srvc_handle = cm_ptr;
++      dapl_os_memcpy(&cm_ptr->addr, &addr, sizeof(addr)); 
++
++      /* queue up listen socket to process inbound CR's */
++      cm_ptr->state = DCM_LISTEN;
++      dapli_cm_queue(cm_ptr);
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " setup listen: port %d cr %p s_fd %d\n",
++                   serviceID + 1000, cm_ptr, cm_ptr->socket);
++
++      return dat_status;
++bail:
++      /* Never queued, destroy here */
++      dapls_cm_release(cm_ptr);
++      return dat_status;
++}
++
++/*
++ * PASSIVE: accept socket 
++ */
++static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)
++{
++      dp_ib_cm_handle_t acm_ptr;
++      int ret, len, opt = 1;
++      socklen_t sl;
++
++      /* 
++       * Accept all CR's on this port to avoid half-connection (SYN_RCV)
++       * stalls with many to one connection storms
++       */
++      do {
++              /* Allocate accept CM and initialize */
++              if ((acm_ptr = dapli_cm_alloc(NULL)) == NULL)
++                      return;
++
++              acm_ptr->sp = cm_ptr->sp;
++              acm_ptr->hca = cm_ptr->hca;
++
++              len = sizeof(union dcm_addr);
++              acm_ptr->socket = accept(cm_ptr->socket,
++                                      (struct sockaddr *)
++                                      &acm_ptr->msg.daddr.so,
++                                      (socklen_t *) &len);
++              if (acm_ptr->socket == DAPL_INVALID_SOCKET) {
++                      int err = dapl_socket_errno();
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                              " ACCEPT: ERR 0x%x %s on FD %d l_cr %p\n",
++                              err, strerror(err), cm_ptr->socket, cm_ptr);
++                      dapls_cm_release(acm_ptr);
++                      return;
++              }
++              dapl_dbg_log(DAPL_DBG_TYPE_CM, " accepting from %s %x\n",
++                           inet_ntoa(((struct sockaddr_in *)
++                                      &acm_ptr->msg.daddr.so)->sin_addr),
++                           ntohs(((struct sockaddr_in *)
++                                      &acm_ptr->msg.daddr.so)->sin_port));
++
++              /* no delay for small packets */
++              ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,
++                         (char *)&opt, sizeof(opt));
++              if (ret) {
++                      int err = dapl_socket_errno();
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               " ACCEPT: NODELAY setsockopt:"
++                               " RET %d ERR 0x%x %s\n",
++                               ret, err, strerror(err));
++              }
++
++              /* get local address information from socket */
++              sl = sizeof(acm_ptr->addr);
++              getsockname(acm_ptr->socket, (struct sockaddr *)&acm_ptr->addr, &sl);
++              acm_ptr->state = DCM_ACCEPTING;
++              dapli_cm_queue(acm_ptr);
++      
++      } while (dapl_poll(cm_ptr->socket, DAPL_FD_READ) == DAPL_FD_READ);
++}
++
++/*
++ * PASSIVE: receive peer QP information, private data, post cr_event 
++ */
++static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)
++{
++      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
++      void *p_data = NULL;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n");
++
++      /* read in DST QP info, IA address. check for private data */
++      len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0);
++      if (len != exp || ntohs(acm_ptr->msg.ver) != DCM_VER) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n",
++                       err, strerror(err), len, ntohs(acm_ptr->msg.ver));
++              goto bail;
++      }
++
++      /* keep the QP, address info in network order */
++
++      /* validate private data size before reading */
++      exp = ntohs(acm_ptr->msg.p_size);
++      if (exp > DCM_MAX_PDATA_SIZE) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                           " accept read: psize (%d) wrong\n",
++                           acm_ptr->msg.p_size);
++              goto bail;
++      }
++
++      /* read private data into cm_handle if any present */
++      if (exp) {
++              len = recv(acm_ptr->socket, acm_ptr->msg.p_data, exp, 0);
++              if (len != exp) {
++                      int err = dapl_socket_errno();
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               " accept read pdata: ERR 0x%x %s, rcnt=%d\n",
++                               err, strerror(err), len);
++                      goto bail;
++              }
++              p_data = acm_ptr->msg.p_data;
++      }
++      dapl_os_lock(&acm_ptr->lock);
++      acm_ptr->state = DCM_ACCEPTING_DATA;
++      dapl_os_unlock(&acm_ptr->lock);
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " ACCEPT: DST %s %x lid=0x%x, qpn=0x%x, psz=%d\n",
++                   inet_ntoa(((struct sockaddr_in *)
++                              &acm_ptr->msg.daddr.so)->sin_addr), 
++                   ntohs(((struct sockaddr_in *)
++                           &acm_ptr->msg.daddr.so)->sin_port),
++                   ntohs(acm_ptr->msg.saddr.ib.lid), 
++                   ntohl(acm_ptr->msg.saddr.ib.qpn), exp);
++
++#ifdef DAT_EXTENSIONS
++      if (acm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {
++              DAT_IB_EXTENSION_EVENT_DATA xevent;
++
++              /* post EVENT, modify_qp created ah */
++              xevent.status = 0;
++              xevent.type = DAT_IB_UD_CONNECT_REQUEST;
++
++              dapls_evd_post_cr_event_ext(acm_ptr->sp,
++                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,
++                                          acm_ptr,
++                                          (DAT_COUNT) exp,
++                                          (DAT_PVOID *) acm_ptr->msg.p_data,
++                                          (DAT_PVOID *) &xevent);
++      } else
++#endif
++              /* trigger CR event and return SUCCESS */
++              dapls_cr_callback(acm_ptr,
++                                IB_CME_CONNECTION_REQUEST_PENDING,
++                                p_data, exp, acm_ptr->sp);
++      return;
++bail:
++      /* mark for destroy, active will see socket close as rej */
++      dapli_cm_free(acm_ptr);
++      return;
++}
++
++/*
++ * PASSIVE: consumer accept, send local QP information, private data, 
++ * queue on work thread to receive RTU information to avoid blocking
++ * user thread. 
++ */
++static DAT_RETURN
++dapli_socket_accept_usr(DAPL_EP * ep_ptr,
++                      DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data)
++{
++      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
++      dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;
++      ib_cm_msg_t local;
++      struct iovec iov[2];
++      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
++      DAT_RETURN ret = DAT_INTERNAL_ERROR;
++      socklen_t sl;
++
++      if (p_size > DCM_MAX_PDATA_SIZE) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " accept_usr: psize(%d) too large\n", p_size);
++              return DAT_LENGTH_ERROR;
++      }
++
++      /* must have a accepted socket */
++      if (cm_ptr->socket == DAPL_INVALID_SOCKET) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " accept_usr: cm socket invalid\n");
++              goto bail;
++      }
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " ACCEPT_USR: remote lid=0x%x"
++                   " qpn=0x%x qp_type %d, psize=%d\n",
++                   ntohs(cm_ptr->msg.saddr.ib.lid),
++                   ntohl(cm_ptr->msg.saddr.ib.qpn), 
++                   cm_ptr->msg.saddr.ib.qp_type, 
++                   ntohs(cm_ptr->msg.p_size));
++
++#ifdef DAT_EXTENSIONS
++      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD &&
++          ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_USR: ERR remote QP is UD,"
++                       ", but local QP is not\n");
++              ret = (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);
++              goto bail;
++      }
++#endif
++
++      /* modify QP to RTR and then to RTS with remote info already read */
++      dapl_os_lock(&ep_ptr->header.lock);
++      if (dapls_modify_qp_state(ep_ptr->qp_handle,
++                                IBV_QPS_RTR, 
++                                cm_ptr->msg.saddr.ib.qpn,
++                                cm_ptr->msg.saddr.ib.lid,
++                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_USR: QPS_RTR ERR %s -> %s\n",
++                       strerror(errno), 
++                       inet_ntoa(((struct sockaddr_in *)
++                                   &cm_ptr->msg.daddr.so)->sin_addr));
++              dapl_os_unlock(&ep_ptr->header.lock);
++              goto bail;
++      }
++      if (dapls_modify_qp_state(ep_ptr->qp_handle,
++                                IBV_QPS_RTS, 
++                                cm_ptr->msg.saddr.ib.qpn,
++                                cm_ptr->msg.saddr.ib.lid,
++                                NULL) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_USR: QPS_RTS ERR %s -> %s\n",
++                       strerror(errno), 
++                       inet_ntoa(((struct sockaddr_in *)
++                                   &cm_ptr->msg.daddr.so)->sin_addr));
++              dapl_os_unlock(&ep_ptr->header.lock);
++              goto bail;
++      }
++      dapl_os_unlock(&ep_ptr->header.lock);
++
++      /* save remote address information */
++      dapl_os_memcpy(&ep_ptr->remote_ia_address,
++                     &cm_ptr->msg.daddr.so,
++                     sizeof(union dcm_addr));
++
++      /* send our QP info, IA address, pdata. Don't overwrite dst data */
++      local.ver = htons(DCM_VER);
++      local.op = htons(DCM_REP);
++      local.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);
++      local.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;
++      local.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;
++      dapl_os_memcpy(&local.saddr.ib.gid[0], 
++                     &ia_ptr->hca_ptr->ib_trans.gid, 16);
++      
++      /* Get local address information from socket */
++      sl = sizeof(local.daddr.so);
++      getsockname(cm_ptr->socket, (struct sockaddr *)&local.daddr.so, &sl);
++
++#ifdef DAPL_DBG
++      /* DBG: Active PID [0], PASSIVE PID [2] */
++      *(uint16_t*)&cm_ptr->msg.resv[2] = htons((uint16_t)dapl_os_getpid()); 
++      dapl_os_memcpy(local.resv, cm_ptr->msg.resv, 4); 
++#endif
++      cm_ptr->hca = ia_ptr->hca_ptr;
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_ACCEPTED;
++      dapl_os_unlock(&cm_ptr->lock);
++
++      /* Link CM to EP, already queued on work thread */
++      dapl_ep_link_cm(ep_ptr, cm_ptr);
++      cm_ptr->ep = ep_ptr;
++
++      local.p_size = htons(p_size);
++      iov[0].iov_base = (void *)&local;
++      iov[0].iov_len = exp;
++      
++      if (p_size) {
++              iov[1].iov_base = p_data;
++              iov[1].iov_len = p_size;
++              len = writev(cm_ptr->socket, iov, 2);
++      } else 
++              len = writev(cm_ptr->socket, iov, 1);
++      
++      if (len != (p_size + exp)) {
++              int err = dapl_socket_errno();
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_USR: ERR 0x%x %s, wcnt=%d -> %s\n",
++                       err, strerror(err), len, 
++                       inet_ntoa(((struct sockaddr_in *)
++                                 &cm_ptr->msg.daddr.so)->sin_addr));
++              dapl_ep_unlink_cm(ep_ptr, cm_ptr);
++              cm_ptr->ep = NULL;
++              goto bail;
++      }
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " ACCEPT_USR: local lid=0x%x qpn=0x%x psz=%d\n",
++                   ntohs(local.saddr.ib.lid),
++                   ntohl(local.saddr.ib.qpn), ntohs(local.p_size));
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " ACCEPT_USR: local GID subnet %016llx id %016llx\n",
++                   (unsigned long long)
++                   htonll(*(uint64_t*)&local.saddr.ib.gid[0]),
++                   (unsigned long long)
++                   htonll(*(uint64_t*)&local.saddr.ib.gid[8]));
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");
++
++      return DAT_SUCCESS;
++bail:
++      /* schedule cleanup from workq */
++      dapli_cm_free(cm_ptr);
++      return ret;
++}
++
++/*
++ * PASSIVE: read RTU from active peer, post CONN event
++ */
++static void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)
++{
++      int len;
++      ib_cm_events_t event = IB_CME_CONNECTED;
++
++      /* complete handshake after final QP state change, VER and OP */
++      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0);
++      if (len != 4 || ntohs(cm_ptr->msg.op) != DCM_RTU) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_RTU: rcv ERR, rcnt=%d op=%x <- %s\n",
++                       len, ntohs(cm_ptr->msg.op),
++                       inet_ntoa(((struct sockaddr_in *)
++                                  &cm_ptr->msg.daddr.so)->sin_addr));
++              event = IB_CME_DESTINATION_REJECT;
++              goto bail;
++      }
++
++      /* save state and reference to EP, queue for disc event */
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_CONNECTED;
++      dapl_os_unlock(&cm_ptr->lock);
++
++      /* final data exchange if remote QP state is good to go */
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n");
++
++#ifdef DAT_EXTENSIONS
++ud_bail:
++      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {
++              DAT_IB_EXTENSION_EVENT_DATA xevent;
++
++              ib_pd_handle_t pd_handle = 
++                      ((DAPL_PZ *)cm_ptr->ep->param.pz_handle)->pd_handle;
++              
++              if (event == IB_CME_CONNECTED) {
++                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,
++                                              cm_ptr->ep->qp_handle,
++                                              cm_ptr->msg.saddr.ib.lid, 
++                                              NULL);
++                      if (cm_ptr->ah) { 
++                              /* post EVENT, modify_qp created ah */
++                              xevent.status = 0;
++                              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;
++                              xevent.remote_ah.ah = cm_ptr->ah;
++                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);
++                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
++                                      &cm_ptr->msg.daddr.so,
++                                      sizeof(union dcm_addr));
++                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;
++                      } else 
++                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
++              } else 
++                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
++
++              dapl_log(DAPL_DBG_TYPE_CM, 
++                      " CONN_RTU: UD AH %p for lid 0x%x qpn 0x%x\n", 
++                      cm_ptr->ah, ntohs(cm_ptr->msg.saddr.ib.lid),
++                      ntohl(cm_ptr->msg.saddr.ib.qpn));
++
++              dapls_evd_post_connection_event_ext(
++                              (DAPL_EVD *) 
++                              cm_ptr->ep->param.connect_evd_handle,
++                              event,
++                              (DAT_EP_HANDLE) cm_ptr->ep,
++                              (DAT_COUNT) ntohs(cm_ptr->msg.p_size),
++                              (DAT_PVOID *) cm_ptr->msg.p_data,
++                              (DAT_PVOID *) &xevent);
++
++                /* cleanup and release from local list, still on EP list */
++              dapli_cm_free(cm_ptr);
++                
++      } else 
++#endif
++      {
++              dapli_ep_check(cm_ptr->ep);
++              dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
++      }
++      dapl_log(DAPL_DBG_TYPE_CM_EST,
++               " SCM PASSIVE CONN: %x <- %s %x\n",
++               cm_ptr->sp->conn_qual,
++               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),
++               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port));
++      return;
++      
++bail:
++#ifdef DAT_EXTENSIONS
++      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) 
++              goto ud_bail;
++#endif
++      dapl_os_lock(&cm_ptr->lock);
++      cm_ptr->state = DCM_REJECTED;
++      dapl_os_unlock(&cm_ptr->lock);
++
++      dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
++      dapli_cm_free(cm_ptr);
++}
++
++/*
++ * dapls_ib_connect
++ *
++ * Initiate a connection with the passive listener on another node
++ *
++ * Input:
++ *    ep_handle,
++ *    remote_ia_address,
++ *    remote_conn_qual,
++ *    prd_size                size of private data and structure
++ *    prd_prt                 pointer to private data structure
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INVALID_PARAMETER
++ *
++ */
++DAT_RETURN
++dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
++               IN DAT_IA_ADDRESS_PTR remote_ia_address,
++               IN DAT_CONN_QUAL remote_conn_qual,
++               IN DAT_COUNT private_data_size, IN void *private_data)
++{
++      DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle;
++      
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " connect(ep_handle %p ....)\n", ep_handle);
++
++      return (dapli_socket_connect(ep_ptr, remote_ia_address,
++                                   remote_conn_qual,
++                                   private_data_size, private_data));
++}
++
++/*
++ * dapls_ib_disconnect
++ *
++ * Disconnect an EP
++ *
++ * Input:
++ *    ep_handle,
++ *    disconnect_flags
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ */
++DAT_RETURN
++dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)
++{
++      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);
++
++      dapl_os_lock(&ep_ptr->header.lock);
++      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||
++          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||
++          cm_ptr == NULL) {
++              dapl_os_unlock(&ep_ptr->header.lock);
++              return DAT_SUCCESS;
++      } 
++      dapl_os_unlock(&ep_ptr->header.lock);
++      return (dapli_socket_disconnect(cm_ptr));
++}
++
++/*
++ * dapls_ib_disconnect_clean
++ *
++ * Clean up outstanding connection data. This routine is invoked
++ * after the final disconnect callback has occurred. Only on the
++ * ACTIVE side of a connection. It is also called if dat_ep_connect
++ * times out using the consumer supplied timeout value.
++ *
++ * Input:
++ *    ep_ptr          DAPL_EP
++ *    active          Indicates active side of connection
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    void
++ *
++ */
++void
++dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,
++                        IN DAT_BOOLEAN active,
++                        IN const ib_cm_events_t ib_cm_event)
++{
++      if (ib_cm_event == IB_CME_TIMEOUT) {
++              dp_ib_cm_handle_t cm_ptr;
++
++              if ((cm_ptr = dapl_get_cm_from_ep(ep_ptr)) == NULL)
++                      return;
++
++              dapl_log(DAPL_DBG_TYPE_WARN,
++                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",
++                      ep_ptr, cm_ptr, dapl_cm_state_str(cm_ptr->state));
++              
++              /* schedule release of socket and local resources */
++              dapli_cm_free(cm_ptr);
++      }
++}
++
++/*
++ * dapl_ib_setup_conn_listener
++ *
++ * Have the CM set up a connection listener.
++ *
++ * Input:
++ *    ibm_hca_handle          HCA handle
++ *    qp_handle                       QP handle
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INTERNAL_ERROR
++ *    DAT_CONN_QUAL_UNAVAILBLE
++ *    DAT_CONN_QUAL_IN_USE
++ *
++ */
++DAT_RETURN
++dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,
++                           IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)
++{
++      return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr));
++}
++
++/*
++ * dapl_ib_remove_conn_listener
++ *
++ * Have the CM remove a connection listener.
++ *
++ * Input:
++ *    ia_handle               IA handle
++ *    ServiceID               IB Channel Service ID
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INVALID_STATE
++ *
++ */
++DAT_RETURN
++dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)
++{
++      ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle;
++
++      /* free cm_srvc_handle, release will cleanup */
++      if (cm_ptr != NULL) {
++              /* cr_thread will free */
++              sp_ptr->cm_srvc_handle = NULL;
++              dapli_cm_free(cm_ptr);
++      }
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_ib_accept_connection
++ *
++ * Perform necessary steps to accept a connection
++ *
++ * Input:
++ *    cr_handle
++ *    ep_handle
++ *    private_data_size
++ *    private_data
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INTERNAL_ERROR
++ *
++ */
++DAT_RETURN
++dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
++                         IN DAT_EP_HANDLE ep_handle,
++                         IN DAT_COUNT p_size, IN const DAT_PVOID p_data)
++{
++      DAPL_CR *cr_ptr;
++      DAPL_EP *ep_ptr;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n",
++                   cr_handle, ep_handle, p_data, p_size);
++
++      cr_ptr = (DAPL_CR *) cr_handle;
++      ep_ptr = (DAPL_EP *) ep_handle;
++
++      /* allocate and attach a QP if necessary */
++      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
++              DAT_RETURN status;
++              status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
++                                         ep_ptr, ep_ptr);
++              if (status != DAT_SUCCESS)
++                      return status;
++      }
++      return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data));
++}
++
++/*
++ * dapls_ib_reject_connection
++ *
++ * Reject a connection
++ *
++ * Input:
++ *    cr_handle
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INTERNAL_ERROR
++ *
++ */
++DAT_RETURN
++dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr,
++                         IN int reason,
++                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)
++{
++      struct iovec iov[2];
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " reject(cm %p reason %x, pdata %p, psize %d)\n",
++                   cm_ptr, reason, pdata, psize);
++
++        if (psize > DCM_MAX_PDATA_SIZE)
++                return DAT_LENGTH_ERROR;
++
++      /* write reject data to indicate reject */
++      cm_ptr->msg.op = htons(DCM_REJ_USER);
++      cm_ptr->msg.p_size = htons(psize);
++      
++      iov[0].iov_base = (void *)&cm_ptr->msg;
++      iov[0].iov_len = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
++      if (psize) {
++              iov[1].iov_base = pdata;
++              iov[1].iov_len = psize;
++              writev(cm_ptr->socket, iov, 2);
++      } else {
++              writev(cm_ptr->socket, iov, 1);
++      }
++
++      /* release and cleanup CM object */
++      dapli_cm_free(cm_ptr);
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_ib_cm_remote_addr
++ *
++ * Obtain the remote IP address given a connection
++ *
++ * Input:
++ *    cr_handle
++ *
++ * Output:
++ *    remote_ia_address: where to place the remote address
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INVALID_HANDLE
++ *
++ */
++DAT_RETURN
++dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,
++                      OUT DAT_SOCK_ADDR6 * remote_ia_address)
++{
++      DAPL_HEADER *header;
++      dp_ib_cm_handle_t conn;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",
++                   dat_handle);
++
++      header = (DAPL_HEADER *) dat_handle;
++
++      if (header->magic == DAPL_MAGIC_EP)
++              conn = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);
++      else if (header->magic == DAPL_MAGIC_CR)
++              conn = ((DAPL_CR *) dat_handle)->ib_cm_handle;
++      else
++              return DAT_INVALID_HANDLE;
++
++      dapl_os_memcpy(remote_ia_address,
++                     &conn->msg.daddr.so, sizeof(DAT_SOCK_ADDR6));
++
++      return DAT_SUCCESS;
++}
++
++int dapls_ib_private_data_size(
++      IN DAPL_HCA *hca_ptr)
++{
++      return DCM_MAX_PDATA_SIZE;
++}
++
++/* outbound/inbound CR processing thread to avoid blocking applications */
++void cr_thread(void *arg)
++{
++      struct dapl_hca *hca_ptr = arg;
++      dp_ib_cm_handle_t cr, next_cr;
++      int opt, ret;
++      socklen_t opt_len;
++      char rbuf[2];
++      struct dapl_fd_set *set;
++      enum DAPL_FD_EVENTS event;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr);
++      set = dapl_alloc_fd_set();
++      if (!set)
++              goto out;
++
++      dapl_os_lock(&hca_ptr->ib_trans.lock);
++      hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;
++
++      while (1) {
++              dapl_fd_zero(set);
++              dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ);
++
++              if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))
++                      next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list);
++              else
++                      next_cr = NULL;
++
++              while (next_cr) {
++                      cr = next_cr;
++                      next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,
++                                                      (DAPL_LLIST_ENTRY *) 
++                                                      &cr->local_entry);
++                      dapls_cm_acquire(cr); /* hold thread ref */
++                      dapl_os_lock(&cr->lock);
++                      if (cr->state == DCM_FREE || 
++                          hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {
++                              dapl_log(DAPL_DBG_TYPE_CM, 
++                                       " CM FREE: %p ep=%p st=%s sck=%d refs=%d\n", 
++                                       cr, cr->ep, dapl_cm_state_str(cr->state), 
++                                       cr->socket, cr->ref_count);
++
++                              if (cr->socket != DAPL_INVALID_SOCKET) {
++                                      shutdown(cr->socket, SHUT_RDWR);
++                                      closesocket(cr->socket);
++                                      cr->socket = DAPL_INVALID_SOCKET;
++                              }
++                              dapl_os_unlock(&cr->lock);
++                              dapls_cm_release(cr); /* release alloc ref */
++                              dapli_cm_dequeue(cr); /* release workq ref */
++                              dapls_cm_release(cr); /* release thread ref */
++                              continue;
++                      }
++
++                      event = (cr->state == DCM_CONN_PENDING) ?
++                                      DAPL_FD_WRITE : DAPL_FD_READ;
++
++                      if (dapl_fd_set(cr->socket, set, event)) {
++                              dapl_log(DAPL_DBG_TYPE_ERR,
++                                       " cr_thread: fd_set ERR st=%d fd %d"
++                                       " -> %s\n", cr->state, cr->socket,
++                                       inet_ntoa(((struct sockaddr_in *)
++                                              &cr->msg.daddr.so)->sin_addr));
++                              dapl_os_unlock(&cr->lock);
++                              dapls_cm_release(cr); /* release ref */
++                              continue;
++                      }
++                      dapl_os_unlock(&cr->lock);
++                      dapl_os_unlock(&hca_ptr->ib_trans.lock);
++                      
++                      ret = dapl_poll(cr->socket, event);
++
++                      dapl_dbg_log(DAPL_DBG_TYPE_THREAD,
++                                   " poll ret=0x%x %s sck=%d\n",
++                                   ret, dapl_cm_state_str(cr->state), 
++                                   cr->socket);
++
++                      /* data on listen, qp exchange, and on disc req */
++                      dapl_os_lock(&cr->lock);
++                      if ((ret == DAPL_FD_READ) || 
++                          (cr->state != DCM_CONN_PENDING && ret == DAPL_FD_ERROR)) {
++                              if (cr->socket != DAPL_INVALID_SOCKET) {
++                                      switch (cr->state) {
++                                      case DCM_LISTEN:
++                                              dapl_os_unlock(&cr->lock);
++                                              dapli_socket_accept(cr);
++                                                break;
++                                      case DCM_ACCEPTING:
++                                              dapl_os_unlock(&cr->lock);
++                                              dapli_socket_accept_data(cr);
++                                              break;
++                                      case DCM_ACCEPTED:
++                                              dapl_os_unlock(&cr->lock);
++                                              dapli_socket_accept_rtu(cr);
++                                              break;
++                                      case DCM_REP_PENDING:
++                                              dapl_os_unlock(&cr->lock);
++                                              dapli_socket_connect_rtu(cr);
++                                              break;
++                                      case DCM_CONNECTED:
++                                              dapl_os_unlock(&cr->lock);
++                                              dapli_socket_disconnect(cr);
++                                              break;
++                                      default:
++                                              dapl_os_unlock(&cr->lock);
++                                              break;
++                                      }
++                              } else 
++                                      dapl_os_unlock(&cr->lock);
++
++                      /* ASYNC connections, writable, readable, error; check status */
++                      } else if (ret == DAPL_FD_WRITE ||
++                                 (cr->state == DCM_CONN_PENDING && 
++                                  ret == DAPL_FD_ERROR)) {
++                              
++                              opt = 0;
++                              opt_len = sizeof(opt);
++                              ret = getsockopt(cr->socket, SOL_SOCKET,
++                                               SO_ERROR, (char *)&opt,
++                                               &opt_len);
++                              dapl_os_unlock(&cr->lock);
++                              if (!ret && !opt)
++                                      dapli_socket_connected(cr, opt);
++                              else
++                                      dapli_socket_connected(cr, opt ? opt : dapl_socket_errno());
++                      } else 
++                              dapl_os_unlock(&cr->lock);
++
++                      dapls_cm_release(cr); /* release ref */
++                      dapl_os_lock(&hca_ptr->ib_trans.lock);
++              }
++
++              /* set to exit and all resources destroyed */
++              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&
++                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))
++                      break;
++
++              dapl_os_unlock(&hca_ptr->ib_trans.lock);
++              dapl_select(set);
++
++              /* if pipe used to wakeup, consume */
++              while (dapl_poll(hca_ptr->ib_trans.scm[0], 
++                               DAPL_FD_READ) == DAPL_FD_READ) {
++                      if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1)
++                              dapl_log(DAPL_DBG_TYPE_THREAD,
++                                       " cr_thread: read pipe error = %s\n",
++                                       strerror(errno));
++              }
++              dapl_os_lock(&hca_ptr->ib_trans.lock);
++              
++              /* set to exit and all resources destroyed */
++              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&
++                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))
++                      break;
++      }
++
++      dapl_os_unlock(&hca_ptr->ib_trans.lock);
++      dapl_os_free(set, sizeof(struct dapl_fd_set));
++out:
++      hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;
++      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " cr_thread(hca %p) exit\n", hca_ptr);
++}
++
++
++#ifdef DAPL_COUNTERS
++/* Debug aid: List all Connections in process and state */
++void dapls_print_cm_list(IN DAPL_IA *ia_ptr)
++{
++      /* Print in process CR's for this IA, if debug type set */
++      int i = 0;
++      dp_ib_cm_handle_t cr, next_cr;
++
++      dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock);
++      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)
++                               &ia_ptr->hca_ptr->ib_trans.list))
++                               next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*)
++                               &ia_ptr->hca_ptr->ib_trans.list);
++      else
++              next_cr = NULL;
++
++        printf("\n DAPL IA CONNECTIONS IN PROCESS:\n");
++      while (next_cr) {
++              cr = next_cr;
++              next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*)
++                               &ia_ptr->hca_ptr->ib_trans.list,
++                              (DAPL_LLIST_ENTRY*)&cr->local_entry);
++
++              printf( "  CONN[%d]: sp %p ep %p sock %d %s %s %s %s %s %s PORT L-%x R-%x PID L-%x R-%x\n",
++                      i, cr->sp, cr->ep, cr->socket,
++                      cr->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",
++                      dapl_cm_state_str(cr->state), dapl_cm_op_str(ntohs(cr->msg.op)),
++                      ntohs(cr->msg.op) == DCM_REQ ? /* local address */
++                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr) :
++                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr),
++                      cr->sp ? "<-" : "->",
++                              ntohs(cr->msg.op) == DCM_REQ ? /* remote address */
++                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr) :
++                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr),
++
++                      ntohs(cr->msg.op) == DCM_REQ ? /* local port */
++                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port) :
++                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port),
++
++                      ntohs(cr->msg.op) == DCM_REQ ? /* remote port */
++                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port) :
++                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port),
++
++                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[2]) : ntohs(*(uint16_t*)&cr->msg.resv[0]),
++                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[0]) : ntohs(*(uint16_t*)&cr->msg.resv[2]));
++
++              i++;
++      }
++      printf("\n");
++      dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock);
++}
++#endif
+diff --git a/trunk/ulp/dapl2/dapl/openib_ucm/cm.c b/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
+index c5c125a..be15c0f 100644
+--- a/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
++++ b/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
+@@ -1,2166 +1,2166 @@
+-/*\r
+- * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
+- *\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-#include "dapl.h"\r
+-#include "dapl_adapter_util.h"\r
+-#include "dapl_evd_util.h"\r
+-#include "dapl_cr_util.h"\r
+-#include "dapl_name_service.h"\r
+-#include "dapl_ib_util.h"\r
+-#include "dapl_ep_util.h"\r
+-#include "dapl_osd.h"\r
+-\r
+-\r
+-#if defined(_WIN32)\r
+-#include <rdma\winverbs.h>\r
+-#else                         // _WIN32\r
+-enum DAPL_FD_EVENTS {\r
+-      DAPL_FD_READ = POLLIN,\r
+-      DAPL_FD_WRITE = POLLOUT,\r
+-      DAPL_FD_ERROR = POLLERR\r
+-};\r
+-\r
+-struct dapl_fd_set {\r
+-      int index;\r
+-      struct pollfd set[DAPL_FD_SETSIZE];\r
+-};\r
+-\r
+-static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
+-{\r
+-      return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
+-}\r
+-\r
+-static void dapl_fd_zero(struct dapl_fd_set *set)\r
+-{\r
+-      set->index = 0;\r
+-}\r
+-\r
+-static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
+-                     enum DAPL_FD_EVENTS event)\r
+-{\r
+-      if (set->index == DAPL_FD_SETSIZE - 1) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",\r
+-                       set->index + 1);\r
+-              return -1;\r
+-      }\r
+-\r
+-      set->set[set->index].fd = s;\r
+-      set->set[set->index].revents = 0;\r
+-      set->set[set->index++].events = event;\r
+-      return 0;\r
+-}\r
+-\r
+-static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
+-{\r
+-      struct pollfd fds;\r
+-      int ret;\r
+-\r
+-      fds.fd = s;\r
+-      fds.events = event;\r
+-      fds.revents = 0;\r
+-      ret = poll(&fds, 1, 0);\r
+-      dapl_log(DAPL_DBG_TYPE_CM, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",\r
+-               s, ret, fds.revents);\r
+-      if (ret == 0)\r
+-              return 0;\r
+-      else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) \r
+-              return DAPL_FD_ERROR;\r
+-      else \r
+-              return fds.revents;\r
+-}\r
+-\r
+-static int dapl_select(struct dapl_fd_set *set, int time_ms)\r
+-{\r
+-      int ret;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep, fds=%d\n",\r
+-                   set->index);\r
+-      ret = poll(set->set, set->index, time_ms);\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup, ret=0x%x\n", ret);\r
+-      return ret;\r
+-}\r
+-#endif\r
+-\r
+-/* forward declarations */\r
+-static int ucm_reply(dp_ib_cm_handle_t cm);\r
+-static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg);\r
+-static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);\r
+-static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);\r
+-static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size);\r
+-static void ucm_disconnect_final(dp_ib_cm_handle_t cm);\r
+-DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm);\r
+-DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm);\r
+-\r
+-#define UCM_SND_BURST 50      \r
+-\r
+-/* Service ids - port space */\r
+-static uint16_t ucm_get_port(ib_hca_transport_t *tp, uint16_t port)\r
+-{\r
+-      int i = 0;\r
+-      \r
+-      dapl_os_lock(&tp->plock);\r
+-      /* get specific ID */\r
+-      if (port) {\r
+-              if (tp->sid[port] == 0) {\r
+-                      tp->sid[port] = 1;\r
+-                      i = port;\r
+-              }\r
+-              goto done;\r
+-      } \r
+-      \r
+-      /* get any free ID */\r
+-      for (i = 0xffff; i > 0; i--) {\r
+-              if (tp->sid[i] == 0) {\r
+-                      tp->sid[i] = 1;\r
+-                      break;\r
+-              }\r
+-      }\r
+-done:\r
+-      dapl_os_unlock(&tp->plock);\r
+-      return i;\r
+-}\r
+-\r
+-static void ucm_free_port(ib_hca_transport_t *tp, uint16_t port)\r
+-{\r
+-      dapl_os_lock(&tp->plock);\r
+-      tp->sid[port] = 0;\r
+-      dapl_os_unlock(&tp->plock);\r
+-}\r
+-\r
+-static void ucm_check_timers(dp_ib_cm_handle_t cm, int *timer)\r
+-{\r
+-      DAPL_OS_TIMEVAL time;\r
+-\r
+-        dapl_os_lock(&cm->lock);\r
+-      dapl_os_get_time(&time); \r
+-      switch (cm->state) {\r
+-      case DCM_REP_PENDING: \r
+-              *timer = cm->hca->ib_trans.cm_timer; \r
+-              /* wait longer each retry */\r
+-              if ((time - cm->timer)/1000 > \r
+-                  (cm->hca->ib_trans.rep_time << cm->retries)) {\r
+-                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
+-                               " CM_REQ retry %p %d [lid, port, qpn]:"\r
+-                               " %x %x %x -> %x %x %x Time(ms) %llu > %d\n", \r
+-                               cm, cm->retries+1, ntohs(cm->msg.saddr.ib.lid), \r
+-                               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), \r
+-                               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),\r
+-                               ntohl(cm->msg.dqpn), (time - cm->timer)/1000, \r
+-                               cm->hca->ib_trans.rep_time << cm->retries);\r
+-                      cm->retries++;\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      dapli_cm_connect(cm->ep, cm);\r
+-                      return;\r
+-              }\r
+-              break;\r
+-      case DCM_RTU_PENDING: \r
+-              *timer = cm->hca->ib_trans.cm_timer;  \r
+-              if ((time - cm->timer)/1000 > \r
+-                  (cm->hca->ib_trans.rtu_time << cm->retries)) {\r
+-                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
+-                               " CM_REPLY retry %d [lid, port, qpn]:"\r
+-                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", \r
+-                               cm->retries+1,\r
+-                               ntohs(cm->msg.saddr.ib.lid), \r
+-                               ntohs(cm->msg.sport),\r
+-                               ntohl(cm->msg.saddr.ib.qpn), \r
+-                               ntohs(cm->msg.daddr.ib.lid), \r
+-                               ntohs(cm->msg.dport),\r
+-                               ntohl(cm->msg.daddr.ib.qpn),  \r
+-                               ntohl(*(DAT_UINT32*)cm->msg.resv),\r
+-                               ntohl(*(DAT_UINT32*)cm->msg.resv), \r
+-                               (time - cm->timer)/1000, \r
+-                               cm->hca->ib_trans.rtu_time << cm->retries);\r
+-                      cm->retries++;\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      ucm_reply(cm);\r
+-                      return;\r
+-              }\r
+-              break;\r
+-      case DCM_DISC_PENDING: \r
+-              *timer = cm->hca->ib_trans.cm_timer; \r
+-              /* wait longer each retry */\r
+-              if ((time - cm->timer)/1000 > \r
+-                  (cm->hca->ib_trans.rtu_time << cm->retries)) {\r
+-                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
+-                               " CM_DREQ retry %d [lid, port, qpn]:"\r
+-                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", \r
+-                               cm->retries+1,\r
+-                               ntohs(cm->msg.saddr.ib.lid), \r
+-                               ntohs(cm->msg.sport),\r
+-                               ntohl(cm->msg.saddr.ib.qpn), \r
+-                               ntohs(cm->msg.daddr.ib.lid), \r
+-                               ntohs(cm->msg.dport),\r
+-                               ntohl(cm->msg.dqpn), \r
+-                               ntohl(*(DAT_UINT32*)cm->msg.resv),\r
+-                               ntohl(*(DAT_UINT32*)cm->msg.resv), \r
+-                               (time - cm->timer)/1000, \r
+-                               cm->hca->ib_trans.rtu_time << cm->retries);\r
+-                      cm->retries++;\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      dapli_cm_disconnect(cm);\r
+-                        return;\r
+-              }\r
+-              break;\r
+-      default:\r
+-              break;\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-}\r
+-\r
+-/* SEND CM MESSAGE PROCESSING */\r
+-\r
+-/* Get CM UD message from send queue, called with s_lock held */\r
+-static ib_cm_msg_t *ucm_get_smsg(ib_hca_transport_t *tp)\r
+-{\r
+-      ib_cm_msg_t *msg = NULL; \r
+-      int ret, polled = 0, hd = tp->s_hd;\r
+-\r
+-      hd++;\r
+-retry:\r
+-      if (hd == tp->qpe)\r
+-              hd = 0;\r
+-\r
+-      if (hd == tp->s_tl)\r
+-              msg = NULL;\r
+-      else {\r
+-              msg = &tp->sbuf[hd];\r
+-              tp->s_hd = hd; /* new hd */\r
+-      }\r
+-\r
+-      /* if empty, process some completions */\r
+-      if ((msg == NULL) && (!polled)) {\r
+-              struct ibv_wc wc;\r
+-\r
+-              /* process completions, based on UCM_SND_BURST */\r
+-              ret = ibv_poll_cq(tp->scq, 1, &wc);\r
+-              if (ret < 0) {\r
+-                      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                              " get_smsg: cq %p %s\n", \r
+-                              tp->scq, strerror(errno));\r
+-              }\r
+-              /* free up completed sends, update tail */\r
+-              if (ret > 0) {\r
+-                      tp->s_tl = (int)wc.wr_id;\r
+-                      dapl_log(DAPL_DBG_TYPE_CM,\r
+-                              " get_smsg: wr_cmp (%d) s_tl=%d\n", \r
+-                              wc.status, tp->s_tl);\r
+-              }\r
+-              polled++;\r
+-              goto retry;\r
+-      }\r
+-      return msg;\r
+-}\r
+-\r
+-/* RECEIVE CM MESSAGE PROCESSING */\r
+-\r
+-static int ucm_post_rmsg(ib_hca_transport_t *tp, ib_cm_msg_t *msg)\r
+-{     \r
+-      struct ibv_recv_wr recv_wr, *recv_err;\r
+-      struct ibv_sge sge;\r
+-        \r
+-      recv_wr.next = NULL;\r
+-      recv_wr.sg_list = &sge;\r
+-      recv_wr.num_sge = 1;\r
+-      recv_wr.wr_id = (uint64_t)(uintptr_t) msg;\r
+-      sge.length = sizeof(ib_cm_msg_t) + sizeof(struct ibv_grh);\r
+-      sge.lkey = tp->mr_rbuf->lkey;\r
+-      sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh));\r
+-      \r
+-      return (ibv_post_recv(tp->qp, &recv_wr, &recv_err));\r
+-}\r
+-\r
+-static int ucm_reject(ib_hca_transport_t *tp, ib_cm_msg_t *msg)\r
+-{\r
+-      ib_cm_msg_t     smsg;\r
+-\r
+-      /* setup op, rearrange the src, dst cm and addr info */\r
+-      (void)dapl_os_memzero(&smsg, sizeof(smsg));\r
+-      smsg.ver = htons(DCM_VER);\r
+-      smsg.op = htons(DCM_REJ_CM);\r
+-      smsg.dport = msg->sport;\r
+-      smsg.dqpn = msg->sqpn;\r
+-      smsg.sport = msg->dport; \r
+-      smsg.sqpn = msg->dqpn;\r
+-\r
+-      dapl_os_memcpy(&smsg.daddr, &msg->saddr, sizeof(union dcm_addr));\r
+-      \r
+-      /* no dst_addr IB info in REQ, init lid, gid, get type from saddr */\r
+-      smsg.saddr.ib.lid = tp->addr.ib.lid; \r
+-      smsg.saddr.ib.qp_type = msg->saddr.ib.qp_type;\r
+-      dapl_os_memcpy(&smsg.saddr.ib.gid[0],\r
+-                     &tp->addr.ib.gid, 16); \r
+-\r
+-      dapl_os_memcpy(&smsg.saddr, &msg->daddr, sizeof(union dcm_addr));\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
+-                   " CM reject -> LID %x, QPN %x PORT %x\n", \r
+-                   ntohs(smsg.daddr.ib.lid),\r
+-                   ntohl(smsg.dqpn), ntohs(smsg.dport));\r
+-\r
+-      return (ucm_send(tp, &smsg, NULL, 0));\r
+-}\r
+-\r
+-static void ucm_process_recv(ib_hca_transport_t *tp, \r
+-                           ib_cm_msg_t *msg, \r
+-                           dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_os_lock(&cm->lock);\r
+-      switch (cm->state) {\r
+-      case DCM_LISTEN: /* passive */\r
+-              dapl_os_unlock(&cm->lock);\r
+-              ucm_accept(cm, msg);\r
+-              break;\r
+-      case DCM_RTU_PENDING: /* passive */\r
+-              dapl_os_unlock(&cm->lock);\r
+-              ucm_accept_rtu(cm, msg);\r
+-              break;\r
+-      case DCM_REP_PENDING: /* active */\r
+-              dapl_os_unlock(&cm->lock);\r
+-              ucm_connect_rtu(cm, msg);\r
+-              break;\r
+-      case DCM_CONNECTED: /* active and passive */\r
+-              /* DREQ, change state and process */\r
+-              if (ntohs(msg->op) == DCM_DREQ) {\r
+-                      cm->state = DCM_DISC_RECV;\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      dapli_cm_disconnect(cm);\r
+-                      break;\r
+-              } \r
+-              /* active: RTU was dropped, resend */\r
+-              if (ntohs(msg->op) == DCM_REP) {\r
+-                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
+-                              " RESEND RTU: op %s st %s [lid, port, qpn]:"\r
+-                              " %x %x %x -> %x %x %x\n", \r
+-                              dapl_cm_op_str(ntohs(msg->op)), \r
+-                              dapl_cm_state_str(cm->state),\r
+-                              ntohs(msg->saddr.ib.lid), \r
+-                              ntohs(msg->sport),\r
+-                              ntohl(msg->saddr.ib.qpn), \r
+-                              ntohs(msg->daddr.ib.lid), \r
+-                              ntohs(msg->dport),\r
+-                              ntohl(msg->daddr.ib.qpn));  \r
+-\r
+-                      cm->msg.op = htons(DCM_RTU);\r
+-                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0);                \r
+-              }\r
+-              dapl_os_unlock(&cm->lock);\r
+-              break;\r
+-      case DCM_DISC_PENDING: /* active and passive */\r
+-              /* DREQ or DREP, finalize */\r
+-              dapl_os_unlock(&cm->lock);\r
+-              ucm_disconnect_final(cm);\r
+-              break;\r
+-      case DCM_DISCONNECTED:\r
+-      case DCM_FREE:\r
+-              /* DREQ dropped, resend */\r
+-              if (ntohs(msg->op) == DCM_DREQ) {\r
+-                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
+-                              " RESEND DREP: op %s st %s [lid, port, qpn]:"\r
+-                              " %x %x %x -> %x %x %x\n", \r
+-                              dapl_cm_op_str(ntohs(msg->op)), \r
+-                              dapl_cm_state_str(cm->state),\r
+-                              ntohs(msg->saddr.ib.lid), \r
+-                              ntohs(msg->sport),\r
+-                              ntohl(msg->saddr.ib.qpn), \r
+-                              ntohs(msg->daddr.ib.lid), \r
+-                              ntohs(msg->dport),\r
+-                              ntohl(msg->daddr.ib.qpn));  \r
+-                      cm->msg.op = htons(DCM_DREP);\r
+-                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); \r
+-                      \r
+-              } else if (ntohs(msg->op) != DCM_DREP){\r
+-                      /* DREP ok to ignore, any other print warning */\r
+-                      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                              " ucm_recv: UNEXPECTED MSG on cm %p"\r
+-                              " <- op %s, st %s spsp %x sqpn %x\n", \r
+-                              cm, dapl_cm_op_str(ntohs(msg->op)),\r
+-                              dapl_cm_state_str(cm->state),\r
+-                              ntohs(msg->sport), ntohl(msg->sqpn));\r
+-              }\r
+-              dapl_os_unlock(&cm->lock);\r
+-              break;\r
+-      default:\r
+-              dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                              " ucm_recv: UNKNOWN state"\r
+-                              " <- op %s, %s spsp %x sqpn %x\n", \r
+-                              dapl_cm_op_str(ntohs(msg->op)), \r
+-                              dapl_cm_state_str(cm->state), \r
+-                              ntohs(msg->sport), ntohl(msg->sqpn));\r
+-              dapl_os_unlock(&cm->lock);\r
+-              break;\r
+-      }\r
+-}\r
+-\r
+-/* Find matching CM object for this receive message, return CM reference, timer */\r
+-dp_ib_cm_handle_t ucm_cm_find(ib_hca_transport_t *tp, ib_cm_msg_t *msg)\r
+-{\r
+-      dp_ib_cm_handle_t cm, next, found = NULL;\r
+-      struct dapl_llist_entry **list;\r
+-      DAPL_OS_LOCK *lock;\r
+-      int listenq = 0;\r
+-\r
+-      /* conn list first, duplicate requests for DCM_REQ */\r
+-      list = &tp->list;\r
+-      lock = &tp->lock;\r
+-\r
+-retry_listenq:\r
+-      dapl_os_lock(lock);\r
+-        if (!dapl_llist_is_empty(list))\r
+-              next = dapl_llist_peek_head(list);\r
+-      else\r
+-              next = NULL;\r
+-\r
+-      while (next) {\r
+-              cm = next;\r
+-              next = dapl_llist_next_entry(list,\r
+-                                           (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-              if (cm->state == DCM_DESTROY || cm->state == DCM_FREE)\r
+-                      continue;\r
+-              \r
+-              /* CM sPORT + QPN, match is good enough for listenq */\r
+-              if (listenq && \r
+-                  cm->msg.sport == msg->dport && \r
+-                  cm->msg.sqpn == msg->dqpn) {\r
+-                      found = cm;\r
+-                      break;\r
+-              }        \r
+-              /* connectq, check src and dst, check duplicate conn_reqs */\r
+-              if (!listenq && \r
+-                  cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn && \r
+-                  cm->msg.dport == msg->sport && cm->msg.dqpn == msg->sqpn && \r
+-                  cm->msg.daddr.ib.lid == msg->saddr.ib.lid) {\r
+-                      if (ntohs(msg->op) != DCM_REQ) {\r
+-                              found = cm;\r
+-                              break; \r
+-                      } else {\r
+-                              /* duplicate; bail and throw away */\r
+-                              dapl_os_unlock(lock);\r
+-                              dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
+-                                       " DUPLICATE: cm %p op %s st %s [lid, port, qpn]:"\r
+-                                       " %x %x %x <- %x %x %x\n", cm,\r
+-                                       dapl_cm_op_str(ntohs(msg->op)), \r
+-                                       dapl_cm_state_str(cm->state),\r
+-                                       ntohs(msg->daddr.ib.lid), \r
+-                                       ntohs(msg->dport),\r
+-                                       ntohl(msg->daddr.ib.qpn), \r
+-                                       ntohs(msg->saddr.ib.lid), \r
+-                                       ntohs(msg->sport),\r
+-                                       ntohl(msg->saddr.ib.qpn));  \r
+-\r
+-                              return NULL;\r
+-                      }\r
+-              }\r
+-      }\r
+-      dapl_os_unlock(lock);\r
+-\r
+-      /* no duplicate request on connq, check listenq for new request */\r
+-      if (ntohs(msg->op) == DCM_REQ && !listenq && !found) {\r
+-              listenq = 1;\r
+-              list = &tp->llist;\r
+-              lock = &tp->llock;\r
+-              goto retry_listenq;\r
+-      }\r
+-\r
+-      /* not match on listenq for valid request, send reject */\r
+-      if (ntohs(msg->op) == DCM_REQ && !found) {\r
+-              dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                      " ucm_recv: NO LISTENER for %s %x %x i%x c%x"\r
+-                      " < %x %x %x, sending reject\n", \r
+-                      dapl_cm_op_str(ntohs(msg->op)), \r
+-                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), \r
+-                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),\r
+-                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), \r
+-                      ntohl(msg->saddr.ib.qpn));\r
+-\r
+-              ucm_reject(tp, msg);\r
+-      }\r
+-\r
+-      if (!found) {\r
+-              dapl_log(DAPL_DBG_TYPE_CM,\r
+-                      " ucm_recv: NO MATCH op %s %x %x i%x c%x"\r
+-                      " < %x %x %x\n", \r
+-                      dapl_cm_op_str(ntohs(msg->op)), \r
+-                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), \r
+-                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),\r
+-                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), \r
+-                      ntohl(msg->saddr.ib.qpn));\r
+-      }\r
+-\r
+-      return found;\r
+-}\r
+-\r
+-/* Get rmsgs from CM completion queue, 10 at a time */\r
+-static void ucm_recv(ib_hca_transport_t *tp)\r
+-{\r
+-      struct ibv_wc wc[10];\r
+-      ib_cm_msg_t *msg;\r
+-      dp_ib_cm_handle_t cm;\r
+-      int i, ret, notify = 0;\r
+-      struct ibv_cq *ibv_cq = NULL;\r
+-      DAPL_HCA *hca;\r
+-\r
+-      /* POLLIN on channel FD */\r
+-      ret = ibv_get_cq_event(tp->rch, &ibv_cq, (void *)&hca);\r
+-      if (ret == 0) {\r
+-              ibv_ack_cq_events(ibv_cq, 1);\r
+-      }\r
+-retry:        \r
+-      ret = ibv_poll_cq(tp->rcq, 10, wc);\r
+-      if (ret <= 0) {\r
+-              if (!ret && !notify) {\r
+-                      ibv_req_notify_cq(tp->rcq, 0);\r
+-                      notify = 1;\r
+-                      goto retry;\r
+-              }\r
+-              return;\r
+-      } else \r
+-              notify = 0;\r
+-      \r
+-      for (i = 0; i < ret; i++) {\r
+-              msg = (ib_cm_msg_t*) (uintptr_t) wc[i].wr_id;\r
+-\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
+-                           " ucm_recv: wc status=%d, ln=%d id=%p sqp=%x\n", \r
+-                           wc[i].status, wc[i].byte_len, \r
+-                           (void*)wc[i].wr_id, wc[i].src_qp);\r
+-\r
+-              /* validate CM message, version */\r
+-              if (ntohs(msg->ver) != DCM_VER) {\r
+-                      dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                               " ucm_recv: UNKNOWN msg %p, ver %d\n", \r
+-                               msg, msg->ver);\r
+-                      ucm_post_rmsg(tp, msg);\r
+-                      continue;\r
+-              }\r
+-              if (!(cm = ucm_cm_find(tp, msg))) {\r
+-                      ucm_post_rmsg(tp, msg);\r
+-                      continue;\r
+-              }\r
+-              \r
+-              /* match, process it */\r
+-              ucm_process_recv(tp, msg, cm);\r
+-              ucm_post_rmsg(tp, msg);\r
+-      }\r
+-      \r
+-      /* finished this batch of WC's, poll and rearm */\r
+-      goto retry;\r
+-}\r
+-\r
+-/* ACTIVE/PASSIVE: build and send CM message out of CM object */\r
+-static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size)\r
+-{\r
+-      ib_cm_msg_t *smsg = NULL;\r
+-      struct ibv_send_wr wr, *bad_wr;\r
+-      struct ibv_sge sge;\r
+-      int len, ret = -1;\r
+-      uint16_t dlid = ntohs(msg->daddr.ib.lid);\r
+-\r
+-      /* Get message from send queue, copy data, and send */\r
+-      dapl_os_lock(&tp->slock);\r
+-      if ((smsg = ucm_get_smsg(tp)) == NULL)\r
+-              goto bail;\r
+-\r
+-      len = (sizeof(*msg) - DCM_MAX_PDATA_SIZE);\r
+-      dapl_os_memcpy(smsg, msg, len);\r
+-      if (p_size) {\r
+-              smsg->p_size = ntohs(p_size);\r
+-              dapl_os_memcpy(&smsg->p_data, p_data, p_size);\r
+-      }\r
+-\r
+-      wr.next = NULL;\r
+-        wr.sg_list = &sge;\r
+-        wr.num_sge = 1;\r
+-        wr.opcode = IBV_WR_SEND;\r
+-        wr.wr_id = (unsigned long)tp->s_hd;\r
+-      wr.send_flags = (wr.wr_id % UCM_SND_BURST) ? 0 : IBV_SEND_SIGNALED;\r
+-      if (len <= tp->max_inline_send)\r
+-              wr.send_flags |= IBV_SEND_INLINE; \r
+-\r
+-        sge.length = len + p_size;\r
+-        sge.lkey = tp->mr_sbuf->lkey;\r
+-        sge.addr = (uintptr_t)smsg;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
+-              " ucm_send: op %s ln %d lid %x c_qpn %x rport %s\n", \r
+-              dapl_cm_op_str(ntohs(smsg->op)), \r
+-              sge.length, htons(smsg->daddr.ib.lid), \r
+-              htonl(smsg->dqpn), htons(smsg->dport));\r
+-\r
+-      /* empty slot, then create AH */\r
+-      if (!tp->ah[dlid]) {\r
+-              tp->ah[dlid] =  \r
+-                      dapls_create_ah(tp->hca, tp->pd, tp->qp, \r
+-                                      htons(dlid), NULL);\r
+-              if (!tp->ah[dlid])\r
+-                      goto bail;\r
+-      }\r
+-              \r
+-      wr.wr.ud.ah = tp->ah[dlid];\r
+-      wr.wr.ud.remote_qpn = ntohl(smsg->dqpn);\r
+-      wr.wr.ud.remote_qkey = DAT_UD_QKEY;\r
+-\r
+-      ret = ibv_post_send(tp->qp, &wr, &bad_wr);\r
+-bail:\r
+-      dapl_os_unlock(&tp->slock);     \r
+-      return ret;\r
+-}\r
+-\r
+-/* ACTIVE/PASSIVE: CM objects */\r
+-static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) {\r
+-\r
+-      dapl_os_assert(!cm->ref_count);\r
+-      dapl_os_lock_destroy(&cm->lock);\r
+-      dapl_os_wait_object_destroy(&cm->event);\r
+-      dapl_os_free(cm, sizeof(*cm));\r
+-}\r
+-\r
+-void dapls_cm_acquire(dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_os_lock(&cm->lock);\r
+-      cm->ref_count++;\r
+-      dapl_os_unlock(&cm->lock);\r
+-}\r
+-\r
+-void dapls_cm_release(dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_os_lock(&cm->lock);\r
+-      cm->ref_count--;\r
+-      if (cm->ref_count) {\r
+-                dapl_os_unlock(&cm->lock);\r
+-              return;\r
+-      }\r
+-      /* client, release local conn id port */\r
+-      if (!cm->sp && cm->msg.sport)\r
+-              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));\r
+-\r
+-      /* clean up any UD address handles */\r
+-      if (cm->ah) {\r
+-              ibv_destroy_ah(cm->ah);\r
+-              cm->ah = NULL;\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-      dapli_cm_dealloc(cm);\r
+-}\r
+-\r
+-dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)\r
+-{\r
+-      dp_ib_cm_handle_t cm;\r
+-\r
+-      /* Allocate CM, init lock, and initialize */\r
+-      if ((cm = dapl_os_alloc(sizeof(*cm))) == NULL)\r
+-              return NULL;\r
+-\r
+-      (void)dapl_os_memzero(cm, sizeof(*cm));\r
+-      if (dapl_os_lock_init(&cm->lock))\r
+-              goto bail;\r
+-      \r
+-      if (dapl_os_wait_object_init(&cm->event)) {\r
+-              dapl_os_lock_destroy(&cm->lock);\r
+-              goto bail;\r
+-      }\r
+-      dapls_cm_acquire(cm);\r
+-\r
+-      cm->msg.ver = htons(DCM_VER);\r
+-      *(DAT_UINT32*)cm->msg.resv = htonl(dapl_os_getpid()); /* exchange PID for debugging */\r
+-      \r
+-      /* ACTIVE: init source address QP info from local EP */\r
+-      if (ep) {\r
+-              DAPL_HCA *hca = ep->header.owner_ia->hca_ptr;\r
+-\r
+-              cm->msg.sport = htons(ucm_get_port(&hca->ib_trans, 0));\r
+-              if (!cm->msg.sport) {\r
+-                      dapl_os_wait_object_destroy(&cm->event);\r
+-                      dapl_os_lock_destroy(&cm->lock);\r
+-                      goto bail;\r
+-              }\r
+-              /* link CM object to EP */\r
+-              dapl_ep_link_cm(ep, cm);\r
+-              cm->hca = hca;\r
+-              cm->ep = ep;\r
+-\r
+-              /* IB info in network order */\r
+-              cm->msg.sqpn = htonl(hca->ib_trans.qp->qp_num); /* ucm */\r
+-              cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num); /* ep */\r
+-              cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;\r
+-                cm->msg.saddr.ib.lid = hca->ib_trans.addr.ib.lid; \r
+-              dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], \r
+-                             &hca->ib_trans.addr.ib.gid, 16);\r
+-        }\r
+-      return cm;\r
+-bail:\r
+-      dapl_os_free(cm, sizeof(*cm));\r
+-      return NULL;\r
+-}\r
+-\r
+-/* schedule destruction of CM object */\r
+-void dapli_cm_free(dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_log(DAPL_DBG_TYPE_CM,\r
+-               " dapli_cm_free: cm %p %s ep %p refs=%d\n", \r
+-               cm, dapl_cm_state_str(cm->state),\r
+-               cm->ep, cm->ref_count);\r
+-\r
+-      dapl_os_lock(&cm->lock);\r
+-      cm->state = DCM_FREE;\r
+-      dapls_thread_signal(&cm->hca->ib_trans.signal);\r
+-      dapl_os_unlock(&cm->lock);\r
+-}\r
+-\r
+-/* Blocking, ONLY called from dat_ep_free */\r
+-void dapls_cm_free(dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_log(DAPL_DBG_TYPE_CM,\r
+-               " dapl_cm_free: cm %p %s ep %p refs=%d\n", \r
+-               cm, dapl_cm_state_str(cm->state),\r
+-               cm->ep, cm->ref_count);\r
+-      \r
+-      /* free from internal workq, wait until EP is last ref */\r
+-      dapl_os_lock(&cm->lock);\r
+-      if (cm->state != DCM_FREE) \r
+-              cm->state = DCM_FREE;\r
+-      \r
+-      while (cm->ref_count != 1) {\r
+-              dapl_os_unlock(&cm->lock);\r
+-              dapls_thread_signal(&cm->hca->ib_trans.signal);\r
+-              dapl_os_sleep_usec(10000);\r
+-              dapl_os_lock(&cm->lock);\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      /* unlink, dequeue from EP. Final ref so release will destroy */\r
+-      dapl_ep_unlink_cm(cm->ep, cm);\r
+-}\r
+-\r
+-/* ACTIVE/PASSIVE: queue up connection object on CM list */\r
+-static void dapli_queue_conn(dp_ib_cm_handle_t cm)\r
+-{\r
+-      /* add to work queue, list, for cm thread processing */\r
+-      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-      dapl_os_lock(&cm->hca->ib_trans.lock);\r
+-      dapls_cm_acquire(cm);\r
+-      dapl_llist_add_tail(&cm->hca->ib_trans.list,\r
+-                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);\r
+-      dapl_os_unlock(&cm->hca->ib_trans.lock);\r
+-      dapls_thread_signal(&cm->hca->ib_trans.signal);\r
+-}\r
+-\r
+-/* PASSIVE: queue up listen object on listen list */\r
+-static void dapli_queue_listen(dp_ib_cm_handle_t cm)\r
+-{\r
+-      /* add to work queue, llist, for cm thread processing */\r
+-      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-      dapl_os_lock(&cm->hca->ib_trans.llock);\r
+-      dapls_cm_acquire(cm);\r
+-      dapl_llist_add_tail(&cm->hca->ib_trans.llist,\r
+-                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);\r
+-      dapl_os_unlock(&cm->hca->ib_trans.llock);\r
+-}\r
+-\r
+-static void dapli_dequeue_listen(dp_ib_cm_handle_t cm) \r
+-{\r
+-      DAPL_HCA *hca = cm->hca;\r
+-\r
+-      dapl_os_lock(&hca->ib_trans.llock);\r
+-      dapl_llist_remove_entry(&hca->ib_trans.llist, \r
+-                              (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-      dapls_cm_release(cm);\r
+-      dapl_os_unlock(&hca->ib_trans.llock);\r
+-}\r
+-\r
+-/* called with local LIST and CM object lock */\r
+-static void dapli_cm_dequeue(dp_ib_cm_handle_t cm)\r
+-{\r
+-      /* Remove from work queue, cr thread processing */\r
+-      dapl_llist_remove_entry(&cm->hca->ib_trans.list,\r
+-                              (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-      dapls_cm_release(cm);\r
+-}\r
+-\r
+-static void ucm_disconnect_final(dp_ib_cm_handle_t cm) \r
+-{\r
+-      /* no EP attachment or not RC, nothing to process */\r
+-      if (cm->ep == NULL ||\r
+-          cm->ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) \r
+-              return;\r
+-\r
+-      dapl_os_lock(&cm->lock);\r
+-      if (cm->state == DCM_DISCONNECTED) {\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return;\r
+-      }\r
+-              \r
+-      cm->state = DCM_DISCONNECTED;\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      if (cm->sp) \r
+-              dapls_cr_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->sp);\r
+-      else\r
+-              dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep);\r
+-\r
+-}\r
+-\r
+-/*\r
+- * called from consumer thread via ep_disconnect/ep_free or \r
+- * from cm_thread when receiving DREQ\r
+- */\r
+-DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm)\r
+-{\r
+-      int finalize = 1;\r
+-      int wakeup = 0;\r
+-\r
+-      dapl_os_lock(&cm->lock);\r
+-      switch (cm->state) {\r
+-      case DCM_CONNECTED:\r
+-              /* CONSUMER: move to err state to flush, if not UD */\r
+-              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) \r
+-                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);\r
+-\r
+-              /* send DREQ, event after DREP or DREQ timeout */\r
+-              cm->state = DCM_DISC_PENDING;\r
+-              cm->msg.op = htons(DCM_DREQ);\r
+-              finalize = 0; /* wait for DREP, wakeup timer after DREQ sent */\r
+-              wakeup = 1;\r
+-              break;\r
+-      case DCM_DISC_PENDING:\r
+-              /* DREQ timeout, resend until retries exhausted */\r
+-              cm->msg.op = htons(DCM_DREQ);\r
+-              if (cm->retries >= cm->hca->ib_trans.retries) {\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR, \r
+-                              " CM_DREQ: RETRIES EXHAUSTED:"\r
+-                              " %x %x %x -> %x %x %x\n",\r
+-                              htons(cm->msg.saddr.ib.lid), \r
+-                              htonl(cm->msg.saddr.ib.qpn), \r
+-                              htons(cm->msg.sport), \r
+-                              htons(cm->msg.daddr.ib.lid), \r
+-                              htonl(cm->msg.dqpn), \r
+-                              htons(cm->msg.dport));\r
+-                      finalize = 1;\r
+-              }\r
+-              break;\r
+-      case DCM_DISC_RECV:\r
+-              /* CM_THREAD: move to err state to flush, if not UD */\r
+-              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) \r
+-                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);\r
+-\r
+-              /* DREQ received, send DREP and schedule event, finalize */\r
+-              cm->msg.op = htons(DCM_DREP);\r
+-              break;\r
+-      case DCM_DISCONNECTED:\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return DAT_SUCCESS;\r
+-      default:\r
+-              dapl_log(DAPL_DBG_TYPE_WARN, \r
+-                      "  disconnect UNKNOWN state: ep %p cm %p %s %s"\r
+-                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",\r
+-                      cm->ep, cm,\r
+-                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
+-                      dapl_cm_state_str(cm->state),\r
+-                      ntohs(cm->msg.saddr.ib.lid),\r
+-                      ntohs(cm->msg.sport),\r
+-                      ntohl(cm->msg.saddr.ib.qpn),    \r
+-                      cm->sp ? "<-" : "->",\r
+-                      ntohs(cm->msg.daddr.ib.lid),\r
+-                      ntohs(cm->msg.dport),\r
+-                      ntohl(cm->msg.daddr.ib.qpn),\r
+-                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), \r
+-                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); \r
+-\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return DAT_SUCCESS;\r
+-      }\r
+-      \r
+-      dapl_os_get_time(&cm->timer); /* reply expected */\r
+-      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); \r
+-      dapl_os_unlock(&cm->lock);\r
+-      \r
+-      if (wakeup)\r
+-              dapls_thread_signal(&cm->hca->ib_trans.signal);\r
+-\r
+-      if (finalize) \r
+-              ucm_disconnect_final(cm);\r
+-      \r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * ACTIVE: get remote CM SID server info from r_addr. \r
+- *         send, or resend CM msg via UD CM QP \r
+- */\r
+-DAT_RETURN\r
+-dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_log(DAPL_DBG_TYPE_EP, \r
+-               " connect: lid %x i_qpn %x lport %x p_sz=%d -> "\r
+-               " lid %x c_qpn %x rport %x\n",\r
+-               htons(cm->msg.saddr.ib.lid), htonl(cm->msg.saddr.ib.qpn),\r
+-               htons(cm->msg.sport), htons(cm->msg.p_size),\r
+-               htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn),\r
+-               htons(cm->msg.dport));\r
+-\r
+-      dapl_os_lock(&cm->lock);\r
+-      if (cm->state != DCM_REP_PENDING) {\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return DAT_INVALID_STATE;\r
+-      }\r
+-      \r
+-      if (cm->retries == cm->hca->ib_trans.retries) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR, \r
+-                      " CM_REQ: RETRIES EXHAUSTED:"\r
+-                       " 0x%x %x 0x%x -> 0x%x %x 0x%x\n",\r
+-                       htons(cm->msg.saddr.ib.lid), \r
+-                       htonl(cm->msg.saddr.ib.qpn), \r
+-                       htons(cm->msg.sport), \r
+-                       htons(cm->msg.daddr.ib.lid), \r
+-                       htonl(cm->msg.dqpn), \r
+-                       htons(cm->msg.dport));\r
+-\r
+-              dapl_os_unlock(&cm->lock);\r
+-\r
+-#ifdef DAPL_COUNTERS\r
+-              /* called from check_timers in cm_thread, cm lock held */\r
+-              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {\r
+-                      dapl_os_unlock(&cm->hca->ib_trans.lock);\r
+-                      dapls_print_cm_list(ep->header.owner_ia);\r
+-                      dapl_os_lock(&cm->hca->ib_trans.lock);\r
+-              }\r
+-#endif\r
+-              dapl_evd_connection_callback(cm, \r
+-                                           IB_CME_DESTINATION_UNREACHABLE,\r
+-                                           NULL, 0, ep);\r
+-              \r
+-              return DAT_ERROR(DAT_INVALID_ADDRESS, \r
+-                               DAT_INVALID_ADDRESS_UNREACHABLE);\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      cm->msg.op = htons(DCM_REQ);\r
+-      dapl_os_get_time(&cm->timer); /* reply expected */\r
+-      if (ucm_send(&cm->hca->ib_trans, &cm->msg, \r
+-                   &cm->msg.p_data, ntohs(cm->msg.p_size)))           \r
+-              goto bail;\r
+-\r
+-      /* first time through, link EP and CM, put on work queue */\r
+-      if (!cm->retries) {\r
+-              dapli_queue_conn(cm);\r
+-      }\r
+-      return DAT_SUCCESS;\r
+-\r
+-bail:\r
+-      dapl_log(DAPL_DBG_TYPE_WARN, \r
+-               " connect: ERR %s -> cm_lid %x cm_qpn %x r_psp %x p_sz=%d\n",\r
+-               strerror(errno), htons(cm->msg.daddr.ib.lid), \r
+-               htonl(cm->msg.dqpn), htons(cm->msg.dport), \r
+-               htonl(cm->msg.p_size));\r
+-\r
+-      dapli_cm_free(cm);\r
+-      return DAT_INSUFFICIENT_RESOURCES;\r
+-}\r
+-\r
+-/*\r
+- * ACTIVE: exchange QP information, called from CR thread\r
+- */\r
+-static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)\r
+-{\r
+-      DAPL_EP *ep = cm->ep;\r
+-      ib_cm_events_t event = IB_CME_CONNECTED;\r
+-\r
+-      dapl_os_lock(&cm->lock);\r
+-      if (cm->state != DCM_REP_PENDING) {\r
+-              dapl_log(DAPL_DBG_TYPE_WARN, \r
+-                       " CONN_RTU: UNEXPECTED state:"\r
+-                       " op %s, st %s <- lid %x sqpn %x sport %x\n", \r
+-                       dapl_cm_op_str(ntohs(msg->op)), \r
+-                       dapl_cm_state_str(cm->state), \r
+-                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), \r
+-                       ntohs(msg->sport));\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return;\r
+-      }\r
+-\r
+-      /* save remote address information to EP and CM */\r
+-      dapl_os_memcpy(&ep->remote_ia_address,\r
+-                     &msg->saddr, sizeof(union dcm_addr));\r
+-      dapl_os_memcpy(&cm->msg.daddr, \r
+-                     &msg->saddr, sizeof(union dcm_addr));\r
+-\r
+-      /* validate private data size, and copy if necessary */\r
+-      if (msg->p_size) {\r
+-              if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {\r
+-                      dapl_log(DAPL_DBG_TYPE_WARN, \r
+-                               " CONN_RTU: invalid p_size %d:"\r
+-                               " st %s <- lid %x sqpn %x spsp %x\n", \r
+-                               ntohs(msg->p_size), \r
+-                               dapl_cm_state_str(cm->state), \r
+-                               ntohs(msg->saddr.ib.lid), \r
+-                               ntohl(msg->saddr.ib.qpn), \r
+-                               ntohs(msg->sport));\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      goto bail;\r
+-              }\r
+-              dapl_os_memcpy(cm->msg.p_data, \r
+-                             msg->p_data, ntohs(msg->p_size));\r
+-      }\r
+-              \r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " CONN_RTU: DST lid=%x,"\r
+-                   " iqp=%x, qp_type=%d, port=%x psize=%d\n",\r
+-                   ntohs(cm->msg.daddr.ib.lid),\r
+-                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type,\r
+-                   ntohs(msg->sport), ntohs(msg->p_size));\r
+-\r
+-      if (ntohs(msg->op) == DCM_REP)\r
+-              event = IB_CME_CONNECTED;\r
+-      else if (ntohs(msg->op) == DCM_REJ_USER) \r
+-              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;\r
+-      else  \r
+-              event = IB_CME_DESTINATION_REJECT;\r
+-      \r
+-      if (event != IB_CME_CONNECTED) {\r
+-              dapl_log(DAPL_DBG_TYPE_CM, \r
+-                       " ACTIVE: CM_REQ REJECTED:"\r
+-                       " cm %p op %s, st %s dlid %x iqp %x port %x <-"\r
+-                       " slid %x iqp %x port %x\n", cm,\r
+-                       dapl_cm_op_str(ntohs(msg->op)), \r
+-                       dapl_cm_state_str(cm->state), \r
+-                       ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn), \r
+-                       ntohs(msg->dport), ntohs(msg->saddr.ib.lid), \r
+-                       ntohl(msg->saddr.ib.qpn), ntohs(msg->sport));\r
+-\r
+-              cm->state = DCM_REJECTED;\r
+-              dapl_os_unlock(&cm->lock);\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-              if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) \r
+-                      goto ud_bail;\r
+-              else\r
+-#endif\r
+-              goto bail;\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      /* modify QP to RTR and then to RTS with remote info */\r
+-      dapl_os_lock(&cm->ep->header.lock);\r
+-      if (dapls_modify_qp_state(cm->ep->qp_handle,\r
+-                                IBV_QPS_RTR, \r
+-                                cm->msg.daddr.ib.qpn,\r
+-                                cm->msg.daddr.ib.lid,\r
+-                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_RTU: QPS_RTR ERR %s <- lid %x iqp %x\n",\r
+-                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
+-                       ntohl(cm->msg.daddr.ib.qpn));\r
+-              dapl_os_unlock(&cm->ep->header.lock);\r
+-              event = IB_CME_LOCAL_FAILURE;\r
+-              goto bail;\r
+-      }\r
+-      if (dapls_modify_qp_state(cm->ep->qp_handle,\r
+-                                IBV_QPS_RTS, \r
+-                                cm->msg.daddr.ib.qpn,\r
+-                                cm->msg.daddr.ib.lid,\r
+-                                NULL) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " CONN_RTU: QPS_RTS ERR %s <- lid %x iqp %x\n",\r
+-                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
+-                       ntohl(cm->msg.daddr.ib.qpn));\r
+-              dapl_os_unlock(&cm->ep->header.lock);\r
+-              event = IB_CME_LOCAL_FAILURE;\r
+-              goto bail;\r
+-      }\r
+-      dapl_os_unlock(&cm->ep->header.lock);\r
+-      \r
+-      /* Send RTU, no private data */\r
+-      cm->msg.op = htons(DCM_RTU);\r
+-      \r
+-      dapl_os_lock(&cm->lock);\r
+-      cm->state = DCM_CONNECTED;\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      if (ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0))            \r
+-              goto bail;\r
+-\r
+-      /* init cm_handle and post the event with private data */\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-ud_bail:\r
+-      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) {\r
+-              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);\r
+-              \r
+-              /* post EVENT, modify_qp, AH already created, ucm msg */\r
+-              xevent.status = 0;\r
+-              xevent.type = DAT_IB_UD_REMOTE_AH;\r
+-              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);\r
+-              xevent.remote_ah.ah = dapls_create_ah(cm->hca, \r
+-                                                    cm->ep->qp_handle->pd, \r
+-                                                    cm->ep->qp_handle, \r
+-                                                    htons(lid), \r
+-                                                    NULL);\r
+-              if (xevent.remote_ah.ah == NULL) {\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               " active UD RTU: ERR create_ah"\r
+-                               " for qpn 0x%x lid 0x%x\n",\r
+-                               xevent.remote_ah.qpn, lid);\r
+-                      event = IB_CME_LOCAL_FAILURE;\r
+-                      goto bail;\r
+-              }\r
+-              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */\r
+-\r
+-              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
+-                             &cm->msg.daddr,\r
+-                             sizeof(union dcm_addr));\r
+-\r
+-              /* remote ia_addr reference includes ucm qpn, not IB qpn */\r
+-              ((union dcm_addr*)\r
+-                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;\r
+-\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                           " ACTIVE: UD xevent ah %p qpn %x lid %x\n",\r
+-                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                           " ACTIVE: UD xevent ia_addr qp_type %d"\r
+-                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",\r
+-                           ((union dcm_addr*)\r
+-                              &xevent.remote_ah.ia_addr)->ib.qp_type,\r
+-                           ntohs(((union dcm_addr*)\r
+-                              &xevent.remote_ah.ia_addr)->ib.lid),\r
+-                           ntohl(((union dcm_addr*)\r
+-                              &xevent.remote_ah.ia_addr)->ib.qpn),\r
+-                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),\r
+-                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));\r
+-\r
+-              if (event == IB_CME_CONNECTED)\r
+-                      event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
+-              else {\r
+-                      xevent.type = DAT_IB_UD_CONNECT_REJECT;\r
+-                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;\r
+-              }\r
+-\r
+-              dapls_evd_post_connection_event_ext(\r
+-                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,\r
+-                              event,\r
+-                              (DAT_EP_HANDLE)ep,\r
+-                              (DAT_COUNT)ntohs(cm->msg.p_size),\r
+-                              (DAT_PVOID *)cm->msg.p_data,\r
+-                              (DAT_PVOID *)&xevent);\r
+-      } else\r
+-#endif\r
+-      {\r
+-              dapl_evd_connection_callback(cm,\r
+-                                           IB_CME_CONNECTED,\r
+-                                           cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);\r
+-      }\r
+-      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
+-               " UCM_ACTIVE_CONN %d [lid port qpn] %x %x %x -> %x %x %x\n",\r
+-               cm->retries, ntohs(cm->msg.saddr.ib.lid),\r
+-               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),\r
+-               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),\r
+-               ntohl(cm->msg.dqpn));\r
+-      return;\r
+-bail:\r
+-      dapl_evd_connection_callback(NULL, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);\r
+-      dapli_cm_free(cm);\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: Accept on listen CM PSP.\r
+- *          create new CM object for this CR, \r
+- *        receive peer QP information, private data, \r
+- *        and post cr_event \r
+- */\r
+-static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg)\r
+-{\r
+-      dp_ib_cm_handle_t acm;\r
+-\r
+-      /* Allocate accept CM and setup passive references */\r
+-      if ((acm = dapls_ib_cm_create(NULL)) == NULL) {\r
+-              dapl_log(DAPL_DBG_TYPE_WARN, " accept: ERR cm_create\n");\r
+-              return;\r
+-      }\r
+-\r
+-      /* dest CM info from CR msg, source CM info from listen */\r
+-      acm->sp = cm->sp;\r
+-      acm->hca = cm->hca;\r
+-      acm->msg.op = msg->op;\r
+-      acm->msg.dport = msg->sport;\r
+-      acm->msg.dqpn = msg->sqpn;\r
+-      acm->msg.sport = cm->msg.sport; \r
+-      acm->msg.sqpn = cm->msg.sqpn;\r
+-      acm->msg.p_size = msg->p_size;\r
+-\r
+-      /* CR saddr is CM daddr info, need EP for local saddr */\r
+-      dapl_os_memcpy(&acm->msg.daddr, &msg->saddr, sizeof(union dcm_addr));\r
+-      \r
+-      dapl_log(DAPL_DBG_TYPE_CM,\r
+-               " accept: DST port=%x lid=%x, iqp=%x, psize=%d\n",\r
+-               ntohs(acm->msg.dport), ntohs(acm->msg.daddr.ib.lid), \r
+-               htonl(acm->msg.daddr.ib.qpn), htons(acm->msg.p_size));\r
+-\r
+-      /* validate private data size before reading */\r
+-      if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {\r
+-              dapl_log(DAPL_DBG_TYPE_WARN, " accept: psize (%d) wrong\n",\r
+-                       ntohs(msg->p_size));\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* read private data into cm_handle if any present */\r
+-      if (msg->p_size) \r
+-              dapl_os_memcpy(acm->msg.p_data, \r
+-                             msg->p_data, ntohs(msg->p_size));\r
+-              \r
+-      acm->state = DCM_ACCEPTING;\r
+-      dapli_queue_conn(acm);\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (acm->msg.daddr.ib.qp_type == IBV_QPT_UD) {\r
+-              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-\r
+-              /* post EVENT, modify_qp created ah */\r
+-              xevent.status = 0;\r
+-              xevent.type = DAT_IB_UD_CONNECT_REQUEST;\r
+-\r
+-              dapls_evd_post_cr_event_ext(acm->sp,\r
+-                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,\r
+-                                          acm,\r
+-                                          (DAT_COUNT)ntohs(acm->msg.p_size),\r
+-                                          (DAT_PVOID *)acm->msg.p_data,\r
+-                                          (DAT_PVOID *)&xevent);\r
+-      } else\r
+-#endif\r
+-              /* trigger CR event and return SUCCESS */\r
+-              dapls_cr_callback(acm,\r
+-                                IB_CME_CONNECTION_REQUEST_PENDING,\r
+-                                acm->msg.p_data, ntohs(msg->p_size), acm->sp);\r
+-      return;\r
+-\r
+-bail:\r
+-      /* schedule work thread cleanup */\r
+-      dapli_cm_free(acm);\r
+-      return;\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: read RTU from active peer, post CONN event\r
+- */\r
+-static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)\r
+-{\r
+-      dapl_os_lock(&cm->lock);\r
+-      if ((ntohs(msg->op) != DCM_RTU) || (cm->state != DCM_RTU_PENDING)) {\r
+-              dapl_log(DAPL_DBG_TYPE_WARN, \r
+-                       " accept_rtu: UNEXPECTED op, state:"\r
+-                       " op %s, st %s <- lid %x iqp %x sport %x\n", \r
+-                       dapl_cm_op_str(ntohs(msg->op)), \r
+-                       dapl_cm_state_str(cm->state), \r
+-                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), \r
+-                       ntohs(msg->sport));\r
+-              dapl_os_unlock(&cm->lock);\r
+-              goto bail;\r
+-      }\r
+-      cm->state = DCM_CONNECTED;\r
+-      dapl_os_unlock(&cm->lock);\r
+-      \r
+-      /* final data exchange if remote QP state is good to go */\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: connected!\n");\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
+-              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);\r
+-              \r
+-              /* post EVENT, modify_qp, AH already created, ucm msg */\r
+-              xevent.status = 0;\r
+-              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;\r
+-              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);\r
+-              xevent.remote_ah.ah = dapls_create_ah(cm->hca, \r
+-                                                    cm->ep->qp_handle->pd, \r
+-                                                    cm->ep->qp_handle, \r
+-                                                    htons(lid), \r
+-                                                    NULL);\r
+-              if (xevent.remote_ah.ah == NULL) {\r
+-                      dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                               " passive UD RTU: ERR create_ah"\r
+-                               " for qpn 0x%x lid 0x%x\n",\r
+-                               xevent.remote_ah.qpn, lid);\r
+-                      goto bail;\r
+-              }\r
+-              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */\r
+-              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
+-                             &cm->msg.daddr,\r
+-                              sizeof(union dcm_addr));\r
+-\r
+-              /* remote ia_addr reference includes ucm qpn, not IB qpn */\r
+-              ((union dcm_addr*)\r
+-                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;\r
+-\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                           " PASSIVE: UD xevent ah %p qpn %x lid %x\n",\r
+-                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                           " PASSIVE: UD xevent ia_addr qp_type %d"\r
+-                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",\r
+-                           ((union dcm_addr*)\r
+-                              &xevent.remote_ah.ia_addr)->ib.qp_type,\r
+-                           ntohs(((union dcm_addr*)\r
+-                              &xevent.remote_ah.ia_addr)->ib.lid),\r
+-                           ntohl(((union dcm_addr*)\r
+-                              &xevent.remote_ah.ia_addr)->ib.qpn),\r
+-                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),\r
+-                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));\r
+-\r
+-              dapls_evd_post_connection_event_ext(\r
+-                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,\r
+-                              DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,\r
+-                              (DAT_EP_HANDLE)cm->ep,\r
+-                              (DAT_COUNT)ntohs(cm->msg.p_size),\r
+-                              (DAT_PVOID *)cm->msg.p_data,\r
+-                              (DAT_PVOID *)&xevent);\r
+-      } else {\r
+-#endif\r
+-              dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp);\r
+-      }\r
+-      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
+-               " UCM_PASSIVE_CONN %d [lid port qpn] %x %x %x <- %x %x %x\n",\r
+-               cm->retries, ntohs(cm->msg.saddr.ib.lid),\r
+-               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),\r
+-               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),\r
+-               ntohl(cm->msg.dqpn));\r
+-      return;\r
+-bail:\r
+-      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp);\r
+-      dapli_cm_free(cm);\r
+-}\r
+-\r
+-/*\r
+- * PASSIVE: user accepted, send reply message with pdata\r
+- */\r
+-static int ucm_reply(dp_ib_cm_handle_t cm)\r
+-{\r
+-      dapl_os_lock(&cm->lock);\r
+-      if (cm->state != DCM_RTU_PENDING) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR, \r
+-                       " CM_REPLY: wrong state %s",\r
+-                       dapl_cm_state_str(cm->state));\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return -1;\r
+-      }\r
+-\r
+-      if (cm->retries == cm->hca->ib_trans.retries) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR, \r
+-                      " CM_REPLY: RETRIES EXHAUSTED (lid port qpn)"\r
+-                       " %x %x %x -> %x %x %x\n",\r
+-                       htons(cm->msg.saddr.ib.lid), \r
+-                       htons(cm->msg.sport), \r
+-                       htonl(cm->msg.saddr.ib.qpn), \r
+-                       htons(cm->msg.daddr.ib.lid), \r
+-                       htons(cm->msg.dport), \r
+-                       htonl(cm->msg.daddr.ib.qpn));\r
+-                      \r
+-              dapl_os_unlock(&cm->lock);\r
+-#ifdef DAPL_COUNTERS\r
+-              /* called from check_timers in cm_thread, cm lock held */\r
+-              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {\r
+-                      dapl_os_unlock(&cm->hca->ib_trans.lock);\r
+-                      dapls_print_cm_list(dapl_llist_peek_head(&cm->hca->ia_list_head));\r
+-                      dapl_os_lock(&cm->hca->ib_trans.lock);\r
+-              }\r
+-#endif\r
+-#ifdef DAT_EXTENSIONS\r
+-              if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
+-                      DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+-                                      \r
+-                      /* post REJECT event with CONN_REQ p_data */\r
+-                      xevent.status = 0;\r
+-                      xevent.type = DAT_IB_UD_CONNECT_ERROR;\r
+-                                      \r
+-                      dapls_evd_post_connection_event_ext(\r
+-                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,\r
+-                              DAT_IB_UD_CONNECTION_ERROR_EVENT,\r
+-                              (DAT_EP_HANDLE)cm->ep,\r
+-                              (DAT_COUNT)ntohs(cm->msg.p_size),\r
+-                              (DAT_PVOID *)cm->msg.p_data,\r
+-                              (DAT_PVOID *)&xevent);\r
+-              } else \r
+-#endif\r
+-                      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, \r
+-                                        NULL, 0, cm->sp);\r
+-              return -1;\r
+-      }\r
+-      dapl_os_get_time(&cm->timer); /* RTU expected */\r
+-      dapl_os_unlock(&cm->lock);\r
+-      if (ucm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size))             \r
+-              return -1;\r
+-\r
+-      return 0;\r
+-}\r
+-\r
+-\r
+-/*\r
+- * PASSIVE: consumer accept, send local QP information, private data, \r
+- * queue on work thread to receive RTU information to avoid blocking\r
+- * user thread. \r
+- */\r
+-DAT_RETURN\r
+-dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)\r
+-{\r
+-      DAPL_IA *ia = ep->header.owner_ia;\r
+-      dp_ib_cm_handle_t cm = cr->ib_cm_handle;\r
+-\r
+-      if (p_size > DCM_MAX_PDATA_SIZE)\r
+-              return DAT_LENGTH_ERROR;\r
+-\r
+-      dapl_os_lock(&cm->lock);\r
+-      if (cm->state != DCM_ACCEPTING) {\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return DAT_INVALID_STATE;\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " ACCEPT_USR: remote lid=%x"\r
+-                   " iqp=%x qp_type %d, psize=%d\n",\r
+-                   ntohs(cm->msg.daddr.ib.lid),\r
+-                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type, \r
+-                   p_size);\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+-                   " ACCEPT_USR: remote GID subnet %016llx id %016llx\n",\r
+-                   (unsigned long long)\r
+-                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),\r
+-                   (unsigned long long)\r
+-                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));\r
+-\r
+-#ifdef DAT_EXTENSIONS\r
+-      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD &&\r
+-          ep->qp_handle->qp_type != IBV_QPT_UD) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                           " ACCEPT_USR: ERR remote QP is UD,"\r
+-                           ", but local QP is not\n");\r
+-              return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);\r
+-      }\r
+-#endif\r
+-\r
+-      /* modify QP to RTR and then to RTS with remote info already read */\r
+-      dapl_os_lock(&ep->header.lock);\r
+-      if (dapls_modify_qp_state(ep->qp_handle,\r
+-                                IBV_QPS_RTR, \r
+-                                cm->msg.daddr.ib.qpn,\r
+-                                cm->msg.daddr.ib.lid,\r
+-                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_USR: QPS_RTR ERR %s -> lid %x qpn %x\n",\r
+-                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
+-                       ntohl(cm->msg.daddr.ib.qpn));\r
+-              dapl_os_unlock(&ep->header.lock);\r
+-              goto bail;\r
+-      }\r
+-      if (dapls_modify_qp_state(ep->qp_handle,\r
+-                                IBV_QPS_RTS, \r
+-                                cm->msg.daddr.ib.qpn,\r
+-                                cm->msg.daddr.ib.lid,\r
+-                                NULL) != DAT_SUCCESS) {\r
+-              dapl_log(DAPL_DBG_TYPE_ERR,\r
+-                       " ACCEPT_USR: QPS_RTS ERR %s -> lid %x qpn %x\n",\r
+-                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
+-                       ntohl(cm->msg.daddr.ib.qpn));\r
+-              dapl_os_unlock(&ep->header.lock);\r
+-              goto bail;\r
+-      }\r
+-      dapl_os_unlock(&ep->header.lock);\r
+-\r
+-      /* save remote address information */\r
+-      dapl_os_memcpy(&ep->remote_ia_address,\r
+-                     &cm->msg.saddr, sizeof(union dcm_addr));\r
+-\r
+-      /* setup local QP info and type from EP, copy pdata, for reply */\r
+-      cm->msg.op = htons(DCM_REP);\r
+-      cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num);\r
+-      cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;\r
+-      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; \r
+-      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],\r
+-                     &cm->hca->ib_trans.addr.ib.gid, 16); \r
+-\r
+-      /* \r
+-       * UD: deliver p_data with REQ and EST event, keep REQ p_data in \r
+-       * cm->msg.p_data and save REPLY accept data in cm->p_data for retries \r
+-       */\r
+-      cm->p_size = p_size;\r
+-      dapl_os_memcpy(&cm->p_data, p_data, p_size);\r
+-\r
+-      /* save state and setup valid reference to EP, HCA */\r
+-      dapl_ep_link_cm(ep, cm);\r
+-      cm->ep = ep;\r
+-      cm->hca = ia->hca_ptr;\r
+-      \r
+-      dapl_os_lock(&cm->lock);\r
+-      dapl_os_get_time(&cm->timer); /* RTU expected */\r
+-      cm->state = DCM_RTU_PENDING;\r
+-      dapl_os_unlock(&cm->lock);\r
+-\r
+-      if (ucm_reply(cm)) {\r
+-              dapl_ep_unlink_cm(ep, cm);\r
+-              goto bail;\r
+-      }\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: accepted!\n");\r
+-      dapls_thread_signal(&cm->hca->ib_trans.signal);\r
+-      return DAT_SUCCESS;\r
+-bail:\r
+-      dapli_cm_free(cm);\r
+-      return DAT_INTERNAL_ERROR;\r
+-}\r
+-\r
+-\r
+-/*\r
+- * dapls_ib_connect\r
+- *\r
+- * Initiate a connection with the passive listener on another node\r
+- *\r
+- * Input:\r
+- *    ep_handle,\r
+- *    remote_ia_address,\r
+- *    remote_conn_qual,\r
+- *    prd_size                size of private data and structure\r
+- *    prd_prt                 pointer to private data structure\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INVALID_PARAMETER\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,\r
+-               IN DAT_IA_ADDRESS_PTR r_addr,\r
+-               IN DAT_CONN_QUAL r_psp,\r
+-               IN DAT_COUNT p_size, IN void *p_data)\r
+-{\r
+-      DAPL_EP *ep = (DAPL_EP *)ep_handle;\r
+-      dp_ib_cm_handle_t cm;\r
+-      \r
+-      /* create CM object, initialize SRC info from EP */\r
+-      cm = dapls_ib_cm_create(ep);\r
+-      if (cm == NULL)\r
+-              return DAT_INSUFFICIENT_RESOURCES;\r
+-\r
+-      /* remote hca and port: lid, gid, network order */\r
+-      dapl_os_memcpy(&cm->msg.daddr, r_addr, sizeof(union dcm_addr));\r
+-\r
+-      /* remote uCM information, comes from consumer provider r_addr */\r
+-      cm->msg.dport = htons((uint16_t)r_psp);\r
+-      cm->msg.dqpn = cm->msg.daddr.ib.qpn;\r
+-      cm->msg.daddr.ib.qpn = 0; /* don't have a remote qpn until reply */\r
+-      \r
+-      if (p_size) {\r
+-              cm->msg.p_size = htons(p_size);\r
+-              dapl_os_memcpy(&cm->msg.p_data, p_data, p_size);\r
+-      }\r
+-      \r
+-      cm->state = DCM_REP_PENDING;\r
+-\r
+-      /* build connect request, send to remote CM based on r_addr info */\r
+-      return (dapli_cm_connect(ep, cm));\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_disconnect\r
+- *\r
+- * Disconnect an EP\r
+- *\r
+- * Input:\r
+- *    ep_handle,\r
+- *    disconnect_flags\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags)\r
+-{\r
+-      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);\r
+-\r
+-      dapl_os_lock(&ep_ptr->header.lock);\r
+-      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||\r
+-          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||\r
+-          cm_ptr == NULL) {\r
+-              dapl_os_unlock(&ep_ptr->header.lock);\r
+-              return DAT_SUCCESS;\r
+-      } \r
+-      dapl_os_unlock(&ep_ptr->header.lock);\r
+-      \r
+-      dapli_cm_disconnect(cm_ptr);\r
+-\r
+-        /* ABRUPT close, wait for callback and DISCONNECTED state */\r
+-        if (close_flags == DAT_CLOSE_ABRUPT_FLAG) {\r
+-                dapl_os_lock(&ep_ptr->header.lock);\r
+-                while (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) {\r
+-                        dapl_os_unlock(&ep_ptr->header.lock);\r
+-                        dapl_os_sleep_usec(10000);\r
+-                        dapl_os_lock(&ep_ptr->header.lock);\r
+-                }\r
+-                dapl_os_unlock(&ep_ptr->header.lock);\r
+-        }\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_disconnect_clean\r
+- *\r
+- * Clean up outstanding connection data. This routine is invoked\r
+- * after the final disconnect callback has occurred. Only on the\r
+- * ACTIVE side of a connection. It is also called if dat_ep_connect\r
+- * times out using the consumer supplied timeout value.\r
+- *\r
+- * Input:\r
+- *    ep_ptr          DAPL_EP\r
+- *    active          Indicates active side of connection\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    void\r
+- *\r
+- */\r
+-void\r
+-dapls_ib_disconnect_clean(IN DAPL_EP *ep,\r
+-                        IN DAT_BOOLEAN active,\r
+-                        IN const ib_cm_events_t ib_cm_event)\r
+-{\r
+-      if (ib_cm_event == IB_CME_TIMEOUT) {\r
+-              dp_ib_cm_handle_t cm_ptr;\r
+-\r
+-              if ((cm_ptr = dapl_get_cm_from_ep(ep)) == NULL)\r
+-                      return;\r
+-\r
+-              dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",\r
+-                      ep, cm_ptr, dapl_cm_state_str(cm_ptr->state));\r
+-              \r
+-              /* schedule release of socket and local resources */\r
+-              dapli_cm_free(cm_ptr);\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- * dapl_ib_setup_conn_listener\r
+- *\r
+- * Have the CM set up a connection listener.\r
+- *\r
+- * Input:\r
+- *    ibm_hca_handle          HCA handle\r
+- *    qp_handle                       QP handle\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INTERNAL_ERROR\r
+- *    DAT_CONN_QUAL_UNAVAILBLE\r
+- *    DAT_CONN_QUAL_IN_USE\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_setup_conn_listener(IN DAPL_IA *ia, \r
+-                           IN DAT_UINT64 sid, \r
+-                           IN DAPL_SP *sp)\r
+-{\r
+-      ib_cm_srvc_handle_t cm = NULL;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " listen(ia %p ServiceID %x sp %p)\n",\r
+-                   ia, sid, sp);\r
+-\r
+-      /* reserve local port, then allocate CM object */\r
+-      if (!ucm_get_port(&ia->hca_ptr->ib_trans, (uint16_t)sid)) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_WARN,\r
+-                           " listen: ERROR %s on conn_qual %x\n",\r
+-                           strerror(errno), sid);\r
+-              return DAT_CONN_QUAL_IN_USE;\r
+-      }\r
+-\r
+-      /* cm_create will setup saddr for listen server */\r
+-      if ((cm = dapls_ib_cm_create(NULL)) == NULL)\r
+-              return DAT_INSUFFICIENT_RESOURCES;\r
+-\r
+-      /* LISTEN: init DST address and QP info to local CM server info */\r
+-      cm->sp = sp;\r
+-      cm->hca = ia->hca_ptr;\r
+-      cm->msg.sport = htons((uint16_t)sid);\r
+-      cm->msg.sqpn = htonl(ia->hca_ptr->ib_trans.qp->qp_num);\r
+-      cm->msg.saddr.ib.qp_type = IBV_QPT_UD;\r
+-        cm->msg.saddr.ib.lid = ia->hca_ptr->ib_trans.addr.ib.lid; \r
+-      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],\r
+-                     &cm->hca->ib_trans.addr.ib.gid, 16); \r
+-      \r
+-      /* save cm_handle reference in service point */\r
+-      sp->cm_srvc_handle = cm;\r
+-\r
+-      /* queue up listen socket to process inbound CR's */\r
+-      cm->state = DCM_LISTEN;\r
+-      dapli_queue_listen(cm);\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-\r
+-/*\r
+- * dapl_ib_remove_conn_listener\r
+- *\r
+- * Have the CM remove a connection listener.\r
+- *\r
+- * Input:\r
+- *    ia_handle               IA handle\r
+- *    ServiceID               IB Channel Service ID\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INVALID_STATE\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_remove_conn_listener(IN DAPL_IA *ia, IN DAPL_SP *sp)\r
+-{\r
+-      ib_cm_srvc_handle_t cm = sp->cm_srvc_handle;\r
+-\r
+-      /* free cm_srvc_handle and port, and mark CM for cleanup */\r
+-      if (cm) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " remove_listener(ia %p sp %p cm %p psp=%x)\n",\r
+-                   ia, sp, cm, ntohs(cm->msg.dport));\r
+-\r
+-              sp->cm_srvc_handle = NULL;\r
+-              dapli_dequeue_listen(cm);  \r
+-              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));\r
+-              dapls_cm_release(cm);  /* last ref, dealloc */\r
+-      }\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_accept_connection\r
+- *\r
+- * Perform necessary steps to accept a connection\r
+- *\r
+- * Input:\r
+- *    cr_handle\r
+- *    ep_handle\r
+- *    private_data_size\r
+- *    private_data\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INSUFFICIENT_RESOURCES\r
+- *    DAT_INTERNAL_ERROR\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,\r
+-                         IN DAT_EP_HANDLE ep_handle,\r
+-                         IN DAT_COUNT p_size, \r
+-                         IN const DAT_PVOID p_data)\r
+-{\r
+-      DAPL_CR *cr = (DAPL_CR *)cr_handle;\r
+-      DAPL_EP *ep = (DAPL_EP *)ep_handle;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " accept_connection(cr %p ep %p prd %p,%d)\n",\r
+-                   cr, ep, p_data, p_size);\r
+-\r
+-      /* allocate and attach a QP if necessary */\r
+-      if (ep->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+-              DAT_RETURN status;\r
+-              status = dapls_ib_qp_alloc(ep->header.owner_ia,\r
+-                                         ep, ep);\r
+-              if (status != DAT_SUCCESS)\r
+-                      return status;\r
+-      }\r
+-      return (dapli_accept_usr(ep, cr, p_size, p_data));\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_reject_connection\r
+- *\r
+- * Reject a connection\r
+- *\r
+- * Input:\r
+- *    cr_handle\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INTERNAL_ERROR\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm,\r
+-                         IN int reason,\r
+-                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)\r
+-{\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   " reject(cm %p reason %x, pdata %p, psize %d)\n",\r
+-                   cm, reason, pdata, psize);\r
+-\r
+-        if (psize > DCM_MAX_PDATA_SIZE)\r
+-                return DAT_LENGTH_ERROR;\r
+-\r
+-      /* cr_thread will destroy CR, update saddr lid, gid, qp_type info */\r
+-      dapl_os_lock(&cm->lock);\r
+-      dapl_log(DAPL_DBG_TYPE_CM, \r
+-               " PASSIVE: REJECTING CM_REQ:"\r
+-               " cm %p op %s, st %s slid %x iqp %x port %x ->"\r
+-               " dlid %x iqp %x port %x\n", cm,\r
+-               dapl_cm_op_str(ntohs(cm->msg.op)), \r
+-               dapl_cm_state_str(cm->state), \r
+-               ntohs(cm->hca->ib_trans.addr.ib.lid), \r
+-               ntohl(cm->msg.saddr.ib.qpn), \r
+-               ntohs(cm->msg.sport), ntohs(cm->msg.daddr.ib.lid), \r
+-               ntohl(cm->msg.daddr.ib.qpn), ntohs(cm->msg.dport));\r
+-\r
+-      cm->state = DCM_REJECTED;\r
+-      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; \r
+-      cm->msg.saddr.ib.qp_type = cm->msg.daddr.ib.qp_type;\r
+-      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],\r
+-                     &cm->hca->ib_trans.addr.ib.gid, 16); \r
+-      cm->msg.op = htons(DCM_REJ_USER);\r
+-      \r
+-      if (ucm_send(&cm->hca->ib_trans, &cm->msg, pdata, psize)) {\r
+-              dapl_log(DAPL_DBG_TYPE_WARN,\r
+-                       " cm_reject: send ERR: %s\n", strerror(errno));\r
+-              dapl_os_unlock(&cm->lock);\r
+-              return DAT_INTERNAL_ERROR;\r
+-      }\r
+-      dapl_os_unlock(&cm->lock);\r
+-      dapli_cm_free(cm);\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-/*\r
+- * dapls_ib_cm_remote_addr\r
+- *\r
+- * Obtain the remote IP address given a connection\r
+- *\r
+- * Input:\r
+- *    cr_handle\r
+- *\r
+- * Output:\r
+- *    remote_ia_address: where to place the remote address\r
+- *\r
+- * Returns:\r
+- *    DAT_SUCCESS\r
+- *    DAT_INVALID_HANDLE\r
+- *\r
+- */\r
+-DAT_RETURN\r
+-dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,\r
+-                      OUT DAT_SOCK_ADDR6 * remote_ia_address)\r
+-{\r
+-      DAPL_HEADER *header;\r
+-      dp_ib_cm_handle_t cm;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+-                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",\r
+-                   dat_handle);\r
+-\r
+-      header = (DAPL_HEADER *) dat_handle;\r
+-\r
+-      if (header->magic == DAPL_MAGIC_EP)\r
+-              cm = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);\r
+-      else if (header->magic == DAPL_MAGIC_CR)\r
+-              cm = ((DAPL_CR *) dat_handle)->ib_cm_handle;\r
+-      else\r
+-              return DAT_INVALID_HANDLE;\r
+-\r
+-      dapl_os_memcpy(remote_ia_address,\r
+-                     &cm->msg.daddr, sizeof(DAT_SOCK_ADDR6));\r
+-\r
+-      return DAT_SUCCESS;\r
+-}\r
+-\r
+-int dapls_ib_private_data_size(\r
+-      IN DAPL_HCA *hca_ptr)\r
+-{\r
+-      return DCM_MAX_PDATA_SIZE;\r
+-}\r
+-\r
+-#if defined(_WIN32) || defined(_WIN64)\r
+-\r
+-void cm_thread(void *arg)\r
+-{\r
+-      struct dapl_hca *hca = arg;\r
+-      dp_ib_cm_handle_t cm, next;\r
+-      DWORD time_ms;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);\r
+-      dapl_os_lock(&hca->ib_trans.lock);\r
+-      for (hca->ib_trans.cm_state = IB_THREAD_RUN;\r
+-           hca->ib_trans.cm_state == IB_THREAD_RUN ||\r
+-           !dapl_llist_is_empty(&hca->ib_trans.list);\r
+-           dapl_os_lock(&hca->ib_trans.lock)) {\r
+-\r
+-              time_ms = INFINITE;\r
+-              CompSetZero(&hca->ib_trans.signal.set);\r
+-              CompSetAdd(&hca->ib_hca_handle->channel, &hca->ib_trans.signal.set);\r
+-              CompSetAdd(&hca->ib_trans.rch->comp_channel, &hca->ib_trans.signal.set);\r
+-              CompSetAdd(&hca->ib_trans.ib_cq->comp_channel, &hca->ib_trans.signal.set);\r
+-\r
+-              next = dapl_llist_is_empty(&hca->ib_trans.list) ? NULL :\r
+-                      dapl_llist_peek_head(&hca->ib_trans.list);\r
+-\r
+-              while (next) {\r
+-                      cm = next;\r
+-                      next = dapl_llist_next_entry(&hca->ib_trans.list,\r
+-                                                   (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-                      dapls_cm_acquire(cm); /* hold thread ref */\r
+-                      dapl_os_lock(&cm->lock);\r
+-                      if (cm->state == DCM_FREE || \r
+-                          hca->ib_trans.cm_state != IB_THREAD_RUN) {\r
+-                              dapl_os_unlock(&cm->lock);\r
+-                              dapl_log(DAPL_DBG_TYPE_CM, \r
+-                                       " CM FREE: %p ep=%p st=%s refs=%d\n", \r
+-                                       cm, cm->ep, dapl_cm_state_str(cm->state), \r
+-                                       cm->ref_count);\r
+-\r
+-                              dapls_cm_release(cm); /* release alloc ref */\r
+-                              dapli_cm_dequeue(cm); /* release workq ref */\r
+-                              dapls_cm_release(cm); /* release thread ref */\r
+-                              continue;\r
+-                      }\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      ucm_check_timers(cm, &time_ms);\r
+-                      dapls_cm_release(cm); /* release thread ref */\r
+-              }\r
+-\r
+-              dapl_os_unlock(&hca->ib_trans.lock);\r
+-\r
+-              hca->ib_hca_handle->channel.Milliseconds = time_ms;\r
+-              hca->ib_trans.rch->comp_channel.Milliseconds = time_ms;\r
+-              hca->ib_trans.ib_cq->comp_channel.Milliseconds = time_ms;\r
+-              CompSetPoll(&hca->ib_trans.signal.set, time_ms);\r
+-\r
+-              hca->ib_hca_handle->channel.Milliseconds = 0;\r
+-              hca->ib_trans.rch->comp_channel.Milliseconds = 0;\r
+-              hca->ib_trans.ib_cq->comp_channel.Milliseconds = 0;\r
+-\r
+-              ucm_recv(&hca->ib_trans);\r
+-              ucm_async_event(hca);\r
+-              dapli_cq_event_cb(&hca->ib_trans);\r
+-      }\r
+-\r
+-      dapl_os_unlock(&hca->ib_trans.lock);\r
+-      hca->ib_trans.cm_state = IB_THREAD_EXIT;\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);\r
+-}\r
+-\r
+-#else                         // _WIN32 || _WIN64\r
+-\r
+-void cm_thread(void *arg)\r
+-{\r
+-      struct dapl_hca *hca = arg;\r
+-      dp_ib_cm_handle_t cm, next;\r
+-      struct dapl_fd_set *set;\r
+-      char rbuf[2];\r
+-      int time_ms;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);\r
+-      set = dapl_alloc_fd_set();\r
+-      if (!set)\r
+-              goto out;\r
+-\r
+-      dapl_os_lock(&hca->ib_trans.lock);\r
+-      hca->ib_trans.cm_state = IB_THREAD_RUN;\r
+-\r
+-      while (1) {\r
+-              time_ms = -1; /* reset to blocking */\r
+-              dapl_fd_zero(set);\r
+-              dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ);    \r
+-              dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ);\r
+-              dapl_fd_set(hca->ib_trans.rch->fd, set, DAPL_FD_READ);\r
+-              dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ);\r
+-              \r
+-              if (!dapl_llist_is_empty(&hca->ib_trans.list))\r
+-                      next = dapl_llist_peek_head(&hca->ib_trans.list);\r
+-              else\r
+-                      next = NULL;\r
+-\r
+-              while (next) {\r
+-                      cm = next;\r
+-                      next = dapl_llist_next_entry(\r
+-                                      &hca->ib_trans.list,\r
+-                                      (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
+-                      dapls_cm_acquire(cm); /* hold thread ref */\r
+-                      dapl_os_lock(&cm->lock);\r
+-                      if (cm->state == DCM_FREE || \r
+-                          hca->ib_trans.cm_state != IB_THREAD_RUN) {\r
+-                              dapl_os_unlock(&cm->lock);\r
+-                              dapl_log(DAPL_DBG_TYPE_CM, \r
+-                                       " CM FREE: %p ep=%p st=%s refs=%d\n", \r
+-                                       cm, cm->ep, dapl_cm_state_str(cm->state), \r
+-                                       cm->ref_count);\r
+-\r
+-                              dapls_cm_release(cm); /* release alloc ref */\r
+-                              dapli_cm_dequeue(cm); /* release workq ref */\r
+-                              dapls_cm_release(cm); /* release thread ref */\r
+-                              continue;\r
+-                      }\r
+-                      dapl_os_unlock(&cm->lock);\r
+-                      ucm_check_timers(cm, &time_ms);\r
+-                      dapls_cm_release(cm); /* release thread ref */\r
+-              }\r
+-\r
+-              /* set to exit and all resources destroyed */\r
+-              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&\r
+-                  (dapl_llist_is_empty(&hca->ib_trans.list)))\r
+-                      break;\r
+-\r
+-              dapl_os_unlock(&hca->ib_trans.lock);\r
+-              dapl_select(set, time_ms);\r
+-\r
+-              /* Process events: CM, ASYNC, NOTIFY THREAD */\r
+-              if (dapl_poll(hca->ib_trans.rch->fd, \r
+-                            DAPL_FD_READ) == DAPL_FD_READ) {\r
+-                      ucm_recv(&hca->ib_trans);\r
+-              }\r
+-              if (dapl_poll(hca->ib_hca_handle->async_fd, \r
+-                            DAPL_FD_READ) == DAPL_FD_READ) {\r
+-                      ucm_async_event(hca);\r
+-              }\r
+-              if (dapl_poll(hca->ib_trans.ib_cq->fd, \r
+-                            DAPL_FD_READ) == DAPL_FD_READ) {\r
+-                      dapli_cq_event_cb(&hca->ib_trans);\r
+-              }\r
+-              while (dapl_poll(hca->ib_trans.signal.scm[0], \r
+-                               DAPL_FD_READ) == DAPL_FD_READ) {\r
+-                      recv(hca->ib_trans.signal.scm[0], rbuf, 2, 0);\r
+-              }\r
+-              dapl_os_lock(&hca->ib_trans.lock);\r
+-              \r
+-              /* set to exit and all resources destroyed */\r
+-              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&\r
+-                  (dapl_llist_is_empty(&hca->ib_trans.list)))\r
+-                      break;\r
+-      }\r
+-\r
+-      dapl_os_unlock(&hca->ib_trans.lock);\r
+-      free(set);\r
+-out:\r
+-      hca->ib_trans.cm_state = IB_THREAD_EXIT;\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);\r
+-}\r
+-#endif\r
+-\r
+-#ifdef DAPL_COUNTERS\r
+-static char _ctr_host_[128];\r
+-/* Debug aid: List all Connections in process and state */\r
+-void dapls_print_cm_list(IN DAPL_IA *ia_ptr)\r
+-{\r
+-      /* Print in process CM's for this IA, if debug type set */\r
+-      int i = 0;\r
+-      dp_ib_cm_handle_t cm, next_cm;\r
+-      struct dapl_llist_entry **list;\r
+-      DAPL_OS_LOCK *lock;\r
+-      \r
+-      /* LISTEN LIST */\r
+-      list = &ia_ptr->hca_ptr->ib_trans.llist;\r
+-      lock = &ia_ptr->hca_ptr->ib_trans.llock;\r
+-\r
+-      dapl_os_lock(lock);\r
+-      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))\r
+-              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);\r
+-      else\r
+-              next_cm = NULL;\r
+-\r
+-      gethostname(_ctr_host_, sizeof(_ctr_host_));\r
+-      printf("\n [%s:%x] DAPL IA LISTEN/CONNECTIONS IN PROCESS:\n", \r
+-              _ctr_host_ , dapl_os_getpid());\r
+-\r
+-      while (next_cm) {\r
+-              cm = next_cm;\r
+-              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,\r
+-                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);\r
+-\r
+-              printf( "  LISTEN[%d]: sp %p %s uCM_QP: %x %x %x l_pid %x (%x)\n",\r
+-                      i, cm->sp, dapl_cm_state_str(cm->state),\r
+-                      ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport),\r
+-                      ntohl(cm->msg.sqpn), ntohl(*(DAT_UINT32*)cm->msg.resv), \r
+-                      ntohl(*(DAT_UINT32*)cm->msg.resv)); \r
+-              i++;\r
+-      }\r
+-      dapl_os_unlock(lock);\r
+-\r
+-      /* CONNECTION LIST */\r
+-      list = &ia_ptr->hca_ptr->ib_trans.list;\r
+-      lock = &ia_ptr->hca_ptr->ib_trans.lock;\r
+-\r
+-      dapl_os_lock(lock);\r
+-      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))\r
+-              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);\r
+-      else\r
+-              next_cm = NULL;\r
+-\r
+-        while (next_cm) {\r
+-              cm = next_cm;\r
+-              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,\r
+-                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);\r
+-\r
+-              printf( "  CONN[%d]: ep %p cm %p %s %s"\r
+-                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",\r
+-                      i, cm->ep, cm,\r
+-                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
+-                      dapl_cm_state_str(cm->state),\r
+-                      ntohs(cm->msg.saddr.ib.lid),\r
+-                      ntohs(cm->msg.sport),\r
+-                      ntohl(cm->msg.saddr.ib.qpn),    \r
+-                      cm->sp ? "<-" : "->",\r
+-                      ntohs(cm->msg.daddr.ib.lid),\r
+-                      ntohs(cm->msg.dport),\r
+-                      ntohl(cm->msg.daddr.ib.qpn),\r
+-                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), \r
+-                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); \r
+-              i++;\r
+-      }\r
+-      printf("\n");\r
+-      dapl_os_unlock(lock);\r
+-}\r
+-#endif\r
++/*
++ * Copyright (c) 2009 Intel Corporation.  All rights reserved.
++ *
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++#include "dapl.h"
++#include "dapl_adapter_util.h"
++#include "dapl_evd_util.h"
++#include "dapl_cr_util.h"
++#include "dapl_name_service.h"
++#include "dapl_ib_util.h"
++#include "dapl_ep_util.h"
++#include "dapl_osd.h"
++
++
++#if defined(_WIN32)
++#include <rdma\winverbs.h>
++#else                         // _WIN32
++enum DAPL_FD_EVENTS {
++      DAPL_FD_READ = POLLIN,
++      DAPL_FD_WRITE = POLLOUT,
++      DAPL_FD_ERROR = POLLERR
++};
++
++struct dapl_fd_set {
++      int index;
++      struct pollfd set[DAPL_FD_SETSIZE];
++};
++
++static struct dapl_fd_set *dapl_alloc_fd_set(void)
++{
++      return dapl_os_alloc(sizeof(struct dapl_fd_set));
++}
++
++static void dapl_fd_zero(struct dapl_fd_set *set)
++{
++      set->index = 0;
++}
++
++static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
++                     enum DAPL_FD_EVENTS event)
++{
++      if (set->index == DAPL_FD_SETSIZE - 1) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",
++                       set->index + 1);
++              return -1;
++      }
++
++      set->set[set->index].fd = s;
++      set->set[set->index].revents = 0;
++      set->set[set->index++].events = event;
++      return 0;
++}
++
++static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
++{
++      struct pollfd fds;
++      int ret;
++
++      fds.fd = s;
++      fds.events = event;
++      fds.revents = 0;
++      ret = poll(&fds, 1, 0);
++      dapl_log(DAPL_DBG_TYPE_CM, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",
++               s, ret, fds.revents);
++      if (ret == 0)
++              return 0;
++      else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) 
++              return DAPL_FD_ERROR;
++      else 
++              return fds.revents;
++}
++
++static int dapl_select(struct dapl_fd_set *set, int time_ms)
++{
++      int ret;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep, fds=%d\n",
++                   set->index);
++      ret = poll(set->set, set->index, time_ms);
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup, ret=0x%x\n", ret);
++      return ret;
++}
++#endif
++
++/* forward declarations */
++static int ucm_reply(dp_ib_cm_handle_t cm);
++static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg);
++static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);
++static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);
++static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size);
++static void ucm_disconnect_final(dp_ib_cm_handle_t cm);
++DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm);
++DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm);
++
++#define UCM_SND_BURST 50      
++
++/* Service ids - port space */
++static uint16_t ucm_get_port(ib_hca_transport_t *tp, uint16_t port)
++{
++      int i = 0;
++      
++      dapl_os_lock(&tp->plock);
++      /* get specific ID */
++      if (port) {
++              if (tp->sid[port] == 0) {
++                      tp->sid[port] = 1;
++                      i = port;
++              }
++              goto done;
++      } 
++      
++      /* get any free ID */
++      for (i = 0xffff; i > 0; i--) {
++              if (tp->sid[i] == 0) {
++                      tp->sid[i] = 1;
++                      break;
++              }
++      }
++done:
++      dapl_os_unlock(&tp->plock);
++      return i;
++}
++
++static void ucm_free_port(ib_hca_transport_t *tp, uint16_t port)
++{
++      dapl_os_lock(&tp->plock);
++      tp->sid[port] = 0;
++      dapl_os_unlock(&tp->plock);
++}
++
++static void ucm_check_timers(dp_ib_cm_handle_t cm, int *timer)
++{
++      DAPL_OS_TIMEVAL time;
++
++        dapl_os_lock(&cm->lock);
++      dapl_os_get_time(&time); 
++      switch (cm->state) {
++      case DCM_REP_PENDING: 
++              *timer = cm->hca->ib_trans.cm_timer; 
++              /* wait longer each retry */
++              if ((time - cm->timer)/1000 > 
++                  (cm->hca->ib_trans.rep_time << cm->retries)) {
++                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
++                               " CM_REQ retry %p %d [lid, port, qpn]:"
++                               " %x %x %x -> %x %x %x Time(ms) %llu > %d\n", 
++                               cm, cm->retries+1, ntohs(cm->msg.saddr.ib.lid), 
++                               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), 
++                               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),
++                               ntohl(cm->msg.dqpn), (time - cm->timer)/1000, 
++                               cm->hca->ib_trans.rep_time << cm->retries);
++                      cm->retries++;
++                      dapl_os_unlock(&cm->lock);
++                      dapli_cm_connect(cm->ep, cm);
++                      return;
++              }
++              break;
++      case DCM_RTU_PENDING: 
++              *timer = cm->hca->ib_trans.cm_timer;  
++              if ((time - cm->timer)/1000 > 
++                  (cm->hca->ib_trans.rtu_time << cm->retries)) {
++                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
++                               " CM_REPLY retry %d [lid, port, qpn]:"
++                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", 
++                               cm->retries+1,
++                               ntohs(cm->msg.saddr.ib.lid), 
++                               ntohs(cm->msg.sport),
++                               ntohl(cm->msg.saddr.ib.qpn), 
++                               ntohs(cm->msg.daddr.ib.lid), 
++                               ntohs(cm->msg.dport),
++                               ntohl(cm->msg.daddr.ib.qpn),  
++                               ntohl(*(DAT_UINT32*)cm->msg.resv),
++                               ntohl(*(DAT_UINT32*)cm->msg.resv), 
++                               (time - cm->timer)/1000, 
++                               cm->hca->ib_trans.rtu_time << cm->retries);
++                      cm->retries++;
++                      dapl_os_unlock(&cm->lock);
++                      ucm_reply(cm);
++                      return;
++              }
++              break;
++      case DCM_DISC_PENDING: 
++              *timer = cm->hca->ib_trans.cm_timer; 
++              /* wait longer each retry */
++              if ((time - cm->timer)/1000 > 
++                  (cm->hca->ib_trans.rtu_time << cm->retries)) {
++                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
++                               " CM_DREQ retry %d [lid, port, qpn]:"
++                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", 
++                               cm->retries+1,
++                               ntohs(cm->msg.saddr.ib.lid), 
++                               ntohs(cm->msg.sport),
++                               ntohl(cm->msg.saddr.ib.qpn), 
++                               ntohs(cm->msg.daddr.ib.lid), 
++                               ntohs(cm->msg.dport),
++                               ntohl(cm->msg.dqpn), 
++                               ntohl(*(DAT_UINT32*)cm->msg.resv),
++                               ntohl(*(DAT_UINT32*)cm->msg.resv), 
++                               (time - cm->timer)/1000, 
++                               cm->hca->ib_trans.rtu_time << cm->retries);
++                      cm->retries++;
++                      dapl_os_unlock(&cm->lock);
++                      dapli_cm_disconnect(cm);
++                        return;
++              }
++              break;
++      default:
++              break;
++      }
++      dapl_os_unlock(&cm->lock);
++}
++
++/* SEND CM MESSAGE PROCESSING */
++
++/* Get CM UD message from send queue, called with s_lock held */
++static ib_cm_msg_t *ucm_get_smsg(ib_hca_transport_t *tp)
++{
++      ib_cm_msg_t *msg = NULL; 
++      int ret, polled = 0, hd = tp->s_hd;
++
++      hd++;
++retry:
++      if (hd == tp->qpe)
++              hd = 0;
++
++      if (hd == tp->s_tl)
++              msg = NULL;
++      else {
++              msg = &tp->sbuf[hd];
++              tp->s_hd = hd; /* new hd */
++      }
++
++      /* if empty, process some completions */
++      if ((msg == NULL) && (!polled)) {
++              struct ibv_wc wc;
++
++              /* process completions, based on UCM_SND_BURST */
++              ret = ibv_poll_cq(tp->scq, 1, &wc);
++              if (ret < 0) {
++                      dapl_log(DAPL_DBG_TYPE_WARN,
++                              " get_smsg: cq %p %s\n", 
++                              tp->scq, strerror(errno));
++              }
++              /* free up completed sends, update tail */
++              if (ret > 0) {
++                      tp->s_tl = (int)wc.wr_id;
++                      dapl_log(DAPL_DBG_TYPE_CM,
++                              " get_smsg: wr_cmp (%d) s_tl=%d\n", 
++                              wc.status, tp->s_tl);
++              }
++              polled++;
++              goto retry;
++      }
++      return msg;
++}
++
++/* RECEIVE CM MESSAGE PROCESSING */
++
++static int ucm_post_rmsg(ib_hca_transport_t *tp, ib_cm_msg_t *msg)
++{     
++      struct ibv_recv_wr recv_wr, *recv_err;
++      struct ibv_sge sge;
++        
++      recv_wr.next = NULL;
++      recv_wr.sg_list = &sge;
++      recv_wr.num_sge = 1;
++      recv_wr.wr_id = (uint64_t)(uintptr_t) msg;
++      sge.length = sizeof(ib_cm_msg_t) + sizeof(struct ibv_grh);
++      sge.lkey = tp->mr_rbuf->lkey;
++      sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh));
++      
++      return (ibv_post_recv(tp->qp, &recv_wr, &recv_err));
++}
++
++static int ucm_reject(ib_hca_transport_t *tp, ib_cm_msg_t *msg)
++{
++      ib_cm_msg_t     smsg;
++
++      /* setup op, rearrange the src, dst cm and addr info */
++      (void)dapl_os_memzero(&smsg, sizeof(smsg));
++      smsg.ver = htons(DCM_VER);
++      smsg.op = htons(DCM_REJ_CM);
++      smsg.dport = msg->sport;
++      smsg.dqpn = msg->sqpn;
++      smsg.sport = msg->dport; 
++      smsg.sqpn = msg->dqpn;
++
++      dapl_os_memcpy(&smsg.daddr, &msg->saddr, sizeof(union dcm_addr));
++      
++      /* no dst_addr IB info in REQ, init lid, gid, get type from saddr */
++      smsg.saddr.ib.lid = tp->addr.ib.lid; 
++      smsg.saddr.ib.qp_type = msg->saddr.ib.qp_type;
++      dapl_os_memcpy(&smsg.saddr.ib.gid[0],
++                     &tp->addr.ib.gid, 16); 
++
++      dapl_os_memcpy(&smsg.saddr, &msg->daddr, sizeof(union dcm_addr));
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, 
++                   " CM reject -> LID %x, QPN %x PORT %x\n", 
++                   ntohs(smsg.daddr.ib.lid),
++                   ntohl(smsg.dqpn), ntohs(smsg.dport));
++
++      return (ucm_send(tp, &smsg, NULL, 0));
++}
++
++static void ucm_process_recv(ib_hca_transport_t *tp, 
++                           ib_cm_msg_t *msg, 
++                           dp_ib_cm_handle_t cm)
++{
++      dapl_os_lock(&cm->lock);
++      switch (cm->state) {
++      case DCM_LISTEN: /* passive */
++              dapl_os_unlock(&cm->lock);
++              ucm_accept(cm, msg);
++              break;
++      case DCM_RTU_PENDING: /* passive */
++              dapl_os_unlock(&cm->lock);
++              ucm_accept_rtu(cm, msg);
++              break;
++      case DCM_REP_PENDING: /* active */
++              dapl_os_unlock(&cm->lock);
++              ucm_connect_rtu(cm, msg);
++              break;
++      case DCM_CONNECTED: /* active and passive */
++              /* DREQ, change state and process */
++              if (ntohs(msg->op) == DCM_DREQ) {
++                      cm->state = DCM_DISC_RECV;
++                      dapl_os_unlock(&cm->lock);
++                      dapli_cm_disconnect(cm);
++                      break;
++              } 
++              /* active: RTU was dropped, resend */
++              if (ntohs(msg->op) == DCM_REP) {
++                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
++                              " RESEND RTU: op %s st %s [lid, port, qpn]:"
++                              " %x %x %x -> %x %x %x\n", 
++                              dapl_cm_op_str(ntohs(msg->op)), 
++                              dapl_cm_state_str(cm->state),
++                              ntohs(msg->saddr.ib.lid), 
++                              ntohs(msg->sport),
++                              ntohl(msg->saddr.ib.qpn), 
++                              ntohs(msg->daddr.ib.lid), 
++                              ntohs(msg->dport),
++                              ntohl(msg->daddr.ib.qpn));  
++
++                      cm->msg.op = htons(DCM_RTU);
++                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0);                
++              }
++              dapl_os_unlock(&cm->lock);
++              break;
++      case DCM_DISC_PENDING: /* active and passive */
++              /* DREQ or DREP, finalize */
++              dapl_os_unlock(&cm->lock);
++              ucm_disconnect_final(cm);
++              break;
++      case DCM_DISCONNECTED:
++      case DCM_FREE:
++              /* DREQ dropped, resend */
++              if (ntohs(msg->op) == DCM_DREQ) {
++                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
++                              " RESEND DREP: op %s st %s [lid, port, qpn]:"
++                              " %x %x %x -> %x %x %x\n", 
++                              dapl_cm_op_str(ntohs(msg->op)), 
++                              dapl_cm_state_str(cm->state),
++                              ntohs(msg->saddr.ib.lid), 
++                              ntohs(msg->sport),
++                              ntohl(msg->saddr.ib.qpn), 
++                              ntohs(msg->daddr.ib.lid), 
++                              ntohs(msg->dport),
++                              ntohl(msg->daddr.ib.qpn));  
++                      cm->msg.op = htons(DCM_DREP);
++                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); 
++                      
++              } else if (ntohs(msg->op) != DCM_DREP){
++                      /* DREP ok to ignore, any other print warning */
++                      dapl_log(DAPL_DBG_TYPE_WARN,
++                              " ucm_recv: UNEXPECTED MSG on cm %p"
++                              " <- op %s, st %s spsp %x sqpn %x\n", 
++                              cm, dapl_cm_op_str(ntohs(msg->op)),
++                              dapl_cm_state_str(cm->state),
++                              ntohs(msg->sport), ntohl(msg->sqpn));
++              }
++              dapl_os_unlock(&cm->lock);
++              break;
++      default:
++              dapl_log(DAPL_DBG_TYPE_WARN,
++                              " ucm_recv: UNKNOWN state"
++                              " <- op %s, %s spsp %x sqpn %x\n", 
++                              dapl_cm_op_str(ntohs(msg->op)), 
++                              dapl_cm_state_str(cm->state), 
++                              ntohs(msg->sport), ntohl(msg->sqpn));
++              dapl_os_unlock(&cm->lock);
++              break;
++      }
++}
++
++/* Find matching CM object for this receive message, return CM reference, timer */
++dp_ib_cm_handle_t ucm_cm_find(ib_hca_transport_t *tp, ib_cm_msg_t *msg)
++{
++      dp_ib_cm_handle_t cm, next, found = NULL;
++      struct dapl_llist_entry **list;
++      DAPL_OS_LOCK *lock;
++      int listenq = 0;
++
++      /* conn list first, duplicate requests for DCM_REQ */
++      list = &tp->list;
++      lock = &tp->lock;
++
++retry_listenq:
++      dapl_os_lock(lock);
++        if (!dapl_llist_is_empty(list))
++              next = dapl_llist_peek_head(list);
++      else
++              next = NULL;
++
++      while (next) {
++              cm = next;
++              next = dapl_llist_next_entry(list,
++                                           (DAPL_LLIST_ENTRY *)&cm->local_entry);
++              if (cm->state == DCM_DESTROY || cm->state == DCM_FREE)
++                      continue;
++              
++              /* CM sPORT + QPN, match is good enough for listenq */
++              if (listenq && 
++                  cm->msg.sport == msg->dport && 
++                  cm->msg.sqpn == msg->dqpn) {
++                      found = cm;
++                      break;
++              }        
++              /* connectq, check src and dst, check duplicate conn_reqs */
++              if (!listenq && 
++                  cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn && 
++                  cm->msg.dport == msg->sport && cm->msg.dqpn == msg->sqpn && 
++                  cm->msg.daddr.ib.lid == msg->saddr.ib.lid) {
++                      if (ntohs(msg->op) != DCM_REQ) {
++                              found = cm;
++                              break; 
++                      } else {
++                              /* duplicate; bail and throw away */
++                              dapl_os_unlock(lock);
++                              dapl_log(DAPL_DBG_TYPE_CM_WARN,
++                                       " DUPLICATE: cm %p op %s st %s [lid, port, qpn]:"
++                                       " %x %x %x <- %x %x %x\n", cm,
++                                       dapl_cm_op_str(ntohs(msg->op)), 
++                                       dapl_cm_state_str(cm->state),
++                                       ntohs(msg->daddr.ib.lid), 
++                                       ntohs(msg->dport),
++                                       ntohl(msg->daddr.ib.qpn), 
++                                       ntohs(msg->saddr.ib.lid), 
++                                       ntohs(msg->sport),
++                                       ntohl(msg->saddr.ib.qpn));  
++
++                              return NULL;
++                      }
++              }
++      }
++      dapl_os_unlock(lock);
++
++      /* no duplicate request on connq, check listenq for new request */
++      if (ntohs(msg->op) == DCM_REQ && !listenq && !found) {
++              listenq = 1;
++              list = &tp->llist;
++              lock = &tp->llock;
++              goto retry_listenq;
++      }
++
++      /* not match on listenq for valid request, send reject */
++      if (ntohs(msg->op) == DCM_REQ && !found) {
++              dapl_log(DAPL_DBG_TYPE_WARN,
++                      " ucm_recv: NO LISTENER for %s %x %x i%x c%x"
++                      " < %x %x %x, sending reject\n", 
++                      dapl_cm_op_str(ntohs(msg->op)), 
++                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), 
++                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),
++                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), 
++                      ntohl(msg->saddr.ib.qpn));
++
++              ucm_reject(tp, msg);
++      }
++
++      if (!found) {
++              dapl_log(DAPL_DBG_TYPE_CM,
++                      " ucm_recv: NO MATCH op %s %x %x i%x c%x"
++                      " < %x %x %x\n", 
++                      dapl_cm_op_str(ntohs(msg->op)), 
++                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), 
++                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),
++                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), 
++                      ntohl(msg->saddr.ib.qpn));
++      }
++
++      return found;
++}
++
++/* Get rmsgs from CM completion queue, 10 at a time */
++static void ucm_recv(ib_hca_transport_t *tp)
++{
++      struct ibv_wc wc[10];
++      ib_cm_msg_t *msg;
++      dp_ib_cm_handle_t cm;
++      int i, ret, notify = 0;
++      struct ibv_cq *ibv_cq = NULL;
++      DAPL_HCA *hca;
++
++      /* POLLIN on channel FD */
++      ret = ibv_get_cq_event(tp->rch, &ibv_cq, (void *)&hca);
++      if (ret == 0) {
++              ibv_ack_cq_events(ibv_cq, 1);
++      }
++retry:        
++      ret = ibv_poll_cq(tp->rcq, 10, wc);
++      if (ret <= 0) {
++              if (!ret && !notify) {
++                      ibv_req_notify_cq(tp->rcq, 0);
++                      notify = 1;
++                      goto retry;
++              }
++              return;
++      } else 
++              notify = 0;
++      
++      for (i = 0; i < ret; i++) {
++              msg = (ib_cm_msg_t*) (uintptr_t) wc[i].wr_id;
++
++              dapl_dbg_log(DAPL_DBG_TYPE_CM, 
++                           " ucm_recv: wc status=%d, ln=%d id=%p sqp=%x\n", 
++                           wc[i].status, wc[i].byte_len, 
++                           (void*)wc[i].wr_id, wc[i].src_qp);
++
++              /* validate CM message, version */
++              if (ntohs(msg->ver) != DCM_VER) {
++                      dapl_log(DAPL_DBG_TYPE_WARN,
++                               " ucm_recv: UNKNOWN msg %p, ver %d\n", 
++                               msg, msg->ver);
++                      ucm_post_rmsg(tp, msg);
++                      continue;
++              }
++              if (!(cm = ucm_cm_find(tp, msg))) {
++                      ucm_post_rmsg(tp, msg);
++                      continue;
++              }
++              
++              /* match, process it */
++              ucm_process_recv(tp, msg, cm);
++              ucm_post_rmsg(tp, msg);
++      }
++      
++      /* finished this batch of WC's, poll and rearm */
++      goto retry;
++}
++
++/* ACTIVE/PASSIVE: build and send CM message out of CM object */
++static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size)
++{
++      ib_cm_msg_t *smsg = NULL;
++      struct ibv_send_wr wr, *bad_wr;
++      struct ibv_sge sge;
++      int len, ret = -1;
++      uint16_t dlid = ntohs(msg->daddr.ib.lid);
++
++      /* Get message from send queue, copy data, and send */
++      dapl_os_lock(&tp->slock);
++      if ((smsg = ucm_get_smsg(tp)) == NULL)
++              goto bail;
++
++      len = (sizeof(*msg) - DCM_MAX_PDATA_SIZE);
++      dapl_os_memcpy(smsg, msg, len);
++      if (p_size) {
++              smsg->p_size = ntohs(p_size);
++              dapl_os_memcpy(&smsg->p_data, p_data, p_size);
++      }
++
++      wr.next = NULL;
++        wr.sg_list = &sge;
++        wr.num_sge = 1;
++        wr.opcode = IBV_WR_SEND;
++        wr.wr_id = (unsigned long)tp->s_hd;
++      wr.send_flags = (wr.wr_id % UCM_SND_BURST) ? 0 : IBV_SEND_SIGNALED;
++      if (len <= tp->max_inline_send)
++              wr.send_flags |= IBV_SEND_INLINE; 
++
++        sge.length = len + p_size;
++        sge.lkey = tp->mr_sbuf->lkey;
++        sge.addr = (uintptr_t)smsg;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, 
++              " ucm_send: op %s ln %d lid %x c_qpn %x rport %s\n", 
++              dapl_cm_op_str(ntohs(smsg->op)), 
++              sge.length, htons(smsg->daddr.ib.lid), 
++              htonl(smsg->dqpn), htons(smsg->dport));
++
++      /* empty slot, then create AH */
++      if (!tp->ah[dlid]) {
++              tp->ah[dlid] =  
++                      dapls_create_ah(tp->hca, tp->pd, tp->qp, 
++                                      htons(dlid), NULL);
++              if (!tp->ah[dlid])
++                      goto bail;
++      }
++              
++      wr.wr.ud.ah = tp->ah[dlid];
++      wr.wr.ud.remote_qpn = ntohl(smsg->dqpn);
++      wr.wr.ud.remote_qkey = DAT_UD_QKEY;
++
++      ret = ibv_post_send(tp->qp, &wr, &bad_wr);
++bail:
++      dapl_os_unlock(&tp->slock);     
++      return ret;
++}
++
++/* ACTIVE/PASSIVE: CM objects */
++static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) {
++
++      dapl_os_assert(!cm->ref_count);
++      dapl_os_lock_destroy(&cm->lock);
++      dapl_os_wait_object_destroy(&cm->event);
++      dapl_os_free(cm, sizeof(*cm));
++}
++
++void dapls_cm_acquire(dp_ib_cm_handle_t cm)
++{
++      dapl_os_lock(&cm->lock);
++      cm->ref_count++;
++      dapl_os_unlock(&cm->lock);
++}
++
++void dapls_cm_release(dp_ib_cm_handle_t cm)
++{
++      dapl_os_lock(&cm->lock);
++      cm->ref_count--;
++      if (cm->ref_count) {
++                dapl_os_unlock(&cm->lock);
++              return;
++      }
++      /* client, release local conn id port */
++      if (!cm->sp && cm->msg.sport)
++              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));
++
++      /* clean up any UD address handles */
++      if (cm->ah) {
++              ibv_destroy_ah(cm->ah);
++              cm->ah = NULL;
++      }
++      dapl_os_unlock(&cm->lock);
++      dapli_cm_dealloc(cm);
++}
++
++dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)
++{
++      dp_ib_cm_handle_t cm;
++
++      /* Allocate CM, init lock, and initialize */
++      if ((cm = dapl_os_alloc(sizeof(*cm))) == NULL)
++              return NULL;
++
++      (void)dapl_os_memzero(cm, sizeof(*cm));
++      if (dapl_os_lock_init(&cm->lock))
++              goto bail;
++      
++      if (dapl_os_wait_object_init(&cm->event)) {
++              dapl_os_lock_destroy(&cm->lock);
++              goto bail;
++      }
++      dapls_cm_acquire(cm);
++
++      cm->msg.ver = htons(DCM_VER);
++      *(DAT_UINT32*)cm->msg.resv = htonl(dapl_os_getpid()); /* exchange PID for debugging */
++      
++      /* ACTIVE: init source address QP info from local EP */
++      if (ep) {
++              DAPL_HCA *hca = ep->header.owner_ia->hca_ptr;
++
++              cm->msg.sport = htons(ucm_get_port(&hca->ib_trans, 0));
++              if (!cm->msg.sport) {
++                      dapl_os_wait_object_destroy(&cm->event);
++                      dapl_os_lock_destroy(&cm->lock);
++                      goto bail;
++              }
++              /* link CM object to EP */
++              dapl_ep_link_cm(ep, cm);
++              cm->hca = hca;
++              cm->ep = ep;
++
++              /* IB info in network order */
++              cm->msg.sqpn = htonl(hca->ib_trans.qp->qp_num); /* ucm */
++              cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num); /* ep */
++              cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;
++                cm->msg.saddr.ib.lid = hca->ib_trans.addr.ib.lid; 
++              dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], 
++                             &hca->ib_trans.addr.ib.gid, 16);
++        }
++      return cm;
++bail:
++      dapl_os_free(cm, sizeof(*cm));
++      return NULL;
++}
++
++/* schedule destruction of CM object */
++void dapli_cm_free(dp_ib_cm_handle_t cm)
++{
++      dapl_log(DAPL_DBG_TYPE_CM,
++               " dapli_cm_free: cm %p %s ep %p refs=%d\n", 
++               cm, dapl_cm_state_str(cm->state),
++               cm->ep, cm->ref_count);
++
++      dapl_os_lock(&cm->lock);
++      cm->state = DCM_FREE;
++      dapls_thread_signal(&cm->hca->ib_trans.signal);
++      dapl_os_unlock(&cm->lock);
++}
++
++/* Blocking, ONLY called from dat_ep_free */
++void dapls_cm_free(dp_ib_cm_handle_t cm)
++{
++      dapl_log(DAPL_DBG_TYPE_CM,
++               " dapl_cm_free: cm %p %s ep %p refs=%d\n", 
++               cm, dapl_cm_state_str(cm->state),
++               cm->ep, cm->ref_count);
++      
++      /* free from internal workq, wait until EP is last ref */
++      dapl_os_lock(&cm->lock);
++      if (cm->state != DCM_FREE) 
++              cm->state = DCM_FREE;
++      
++      while (cm->ref_count != 1) {
++              dapl_os_unlock(&cm->lock);
++              dapls_thread_signal(&cm->hca->ib_trans.signal);
++              dapl_os_sleep_usec(10000);
++              dapl_os_lock(&cm->lock);
++      }
++      dapl_os_unlock(&cm->lock);
++
++      /* unlink, dequeue from EP. Final ref so release will destroy */
++      dapl_ep_unlink_cm(cm->ep, cm);
++}
++
++/* ACTIVE/PASSIVE: queue up connection object on CM list */
++static void dapli_queue_conn(dp_ib_cm_handle_t cm)
++{
++      /* add to work queue, list, for cm thread processing */
++      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);
++      dapl_os_lock(&cm->hca->ib_trans.lock);
++      dapls_cm_acquire(cm);
++      dapl_llist_add_tail(&cm->hca->ib_trans.list,
++                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);
++      dapl_os_unlock(&cm->hca->ib_trans.lock);
++      dapls_thread_signal(&cm->hca->ib_trans.signal);
++}
++
++/* PASSIVE: queue up listen object on listen list */
++static void dapli_queue_listen(dp_ib_cm_handle_t cm)
++{
++      /* add to work queue, llist, for cm thread processing */
++      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);
++      dapl_os_lock(&cm->hca->ib_trans.llock);
++      dapls_cm_acquire(cm);
++      dapl_llist_add_tail(&cm->hca->ib_trans.llist,
++                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);
++      dapl_os_unlock(&cm->hca->ib_trans.llock);
++}
++
++static void dapli_dequeue_listen(dp_ib_cm_handle_t cm) 
++{
++      DAPL_HCA *hca = cm->hca;
++
++      dapl_os_lock(&hca->ib_trans.llock);
++      dapl_llist_remove_entry(&hca->ib_trans.llist, 
++                              (DAPL_LLIST_ENTRY *)&cm->local_entry);
++      dapls_cm_release(cm);
++      dapl_os_unlock(&hca->ib_trans.llock);
++}
++
++/* called with local LIST and CM object lock */
++static void dapli_cm_dequeue(dp_ib_cm_handle_t cm)
++{
++      /* Remove from work queue, cr thread processing */
++      dapl_llist_remove_entry(&cm->hca->ib_trans.list,
++                              (DAPL_LLIST_ENTRY *)&cm->local_entry);
++      dapls_cm_release(cm);
++}
++
++static void ucm_disconnect_final(dp_ib_cm_handle_t cm) 
++{
++      /* no EP attachment or not RC, nothing to process */
++      if (cm->ep == NULL ||
++          cm->ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) 
++              return;
++
++      dapl_os_lock(&cm->lock);
++      if (cm->state == DCM_DISCONNECTED) {
++              dapl_os_unlock(&cm->lock);
++              return;
++      }
++              
++      cm->state = DCM_DISCONNECTED;
++      dapl_os_unlock(&cm->lock);
++
++      if (cm->sp) 
++              dapls_cr_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->sp);
++      else
++              dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep);
++
++}
++
++/*
++ * called from consumer thread via ep_disconnect/ep_free or 
++ * from cm_thread when receiving DREQ
++ */
++DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm)
++{
++      int finalize = 1;
++      int wakeup = 0;
++
++      dapl_os_lock(&cm->lock);
++      switch (cm->state) {
++      case DCM_CONNECTED:
++              /* CONSUMER: move to err state to flush, if not UD */
++              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) 
++                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);
++
++              /* send DREQ, event after DREP or DREQ timeout */
++              cm->state = DCM_DISC_PENDING;
++              cm->msg.op = htons(DCM_DREQ);
++              finalize = 0; /* wait for DREP, wakeup timer after DREQ sent */
++              wakeup = 1;
++              break;
++      case DCM_DISC_PENDING:
++              /* DREQ timeout, resend until retries exhausted */
++              cm->msg.op = htons(DCM_DREQ);
++              if (cm->retries >= cm->hca->ib_trans.retries) {
++                      dapl_log(DAPL_DBG_TYPE_ERR, 
++                              " CM_DREQ: RETRIES EXHAUSTED:"
++                              " %x %x %x -> %x %x %x\n",
++                              htons(cm->msg.saddr.ib.lid), 
++                              htonl(cm->msg.saddr.ib.qpn), 
++                              htons(cm->msg.sport), 
++                              htons(cm->msg.daddr.ib.lid), 
++                              htonl(cm->msg.dqpn), 
++                              htons(cm->msg.dport));
++                      finalize = 1;
++              }
++              break;
++      case DCM_DISC_RECV:
++              /* CM_THREAD: move to err state to flush, if not UD */
++              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) 
++                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);
++
++              /* DREQ received, send DREP and schedule event, finalize */
++              cm->msg.op = htons(DCM_DREP);
++              break;
++      case DCM_DISCONNECTED:
++              dapl_os_unlock(&cm->lock);
++              return DAT_SUCCESS;
++      default:
++              dapl_log(DAPL_DBG_TYPE_WARN, 
++                      "  disconnect UNKNOWN state: ep %p cm %p %s %s"
++                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",
++                      cm->ep, cm,
++                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",
++                      dapl_cm_state_str(cm->state),
++                      ntohs(cm->msg.saddr.ib.lid),
++                      ntohs(cm->msg.sport),
++                      ntohl(cm->msg.saddr.ib.qpn),    
++                      cm->sp ? "<-" : "->",
++                      ntohs(cm->msg.daddr.ib.lid),
++                      ntohs(cm->msg.dport),
++                      ntohl(cm->msg.daddr.ib.qpn),
++                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), 
++                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); 
++
++              dapl_os_unlock(&cm->lock);
++              return DAT_SUCCESS;
++      }
++      
++      dapl_os_get_time(&cm->timer); /* reply expected */
++      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); 
++      dapl_os_unlock(&cm->lock);
++      
++      if (wakeup)
++              dapls_thread_signal(&cm->hca->ib_trans.signal);
++
++      if (finalize) 
++              ucm_disconnect_final(cm);
++      
++      return DAT_SUCCESS;
++}
++
++/*
++ * ACTIVE: get remote CM SID server info from r_addr. 
++ *         send, or resend CM msg via UD CM QP 
++ */
++DAT_RETURN
++dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm)
++{
++      dapl_log(DAPL_DBG_TYPE_EP, 
++               " connect: lid %x i_qpn %x lport %x p_sz=%d -> "
++               " lid %x c_qpn %x rport %x\n",
++               htons(cm->msg.saddr.ib.lid), htonl(cm->msg.saddr.ib.qpn),
++               htons(cm->msg.sport), htons(cm->msg.p_size),
++               htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn),
++               htons(cm->msg.dport));
++
++      dapl_os_lock(&cm->lock);
++      if (cm->state != DCM_REP_PENDING) {
++              dapl_os_unlock(&cm->lock);
++              return DAT_INVALID_STATE;
++      }
++      
++      if (cm->retries == cm->hca->ib_trans.retries) {
++              dapl_log(DAPL_DBG_TYPE_ERR, 
++                      " CM_REQ: RETRIES EXHAUSTED:"
++                       " 0x%x %x 0x%x -> 0x%x %x 0x%x\n",
++                       htons(cm->msg.saddr.ib.lid), 
++                       htonl(cm->msg.saddr.ib.qpn), 
++                       htons(cm->msg.sport), 
++                       htons(cm->msg.daddr.ib.lid), 
++                       htonl(cm->msg.dqpn), 
++                       htons(cm->msg.dport));
++
++              dapl_os_unlock(&cm->lock);
++
++#ifdef DAPL_COUNTERS
++              /* called from check_timers in cm_thread, cm lock held */
++              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {
++                      dapl_os_unlock(&cm->hca->ib_trans.lock);
++                      dapls_print_cm_list(ep->header.owner_ia);
++                      dapl_os_lock(&cm->hca->ib_trans.lock);
++              }
++#endif
++              dapl_evd_connection_callback(cm, 
++                                           IB_CME_DESTINATION_UNREACHABLE,
++                                           NULL, 0, ep);
++              
++              return DAT_ERROR(DAT_INVALID_ADDRESS, 
++                               DAT_INVALID_ADDRESS_UNREACHABLE);
++      }
++      dapl_os_unlock(&cm->lock);
++
++      cm->msg.op = htons(DCM_REQ);
++      dapl_os_get_time(&cm->timer); /* reply expected */
++      if (ucm_send(&cm->hca->ib_trans, &cm->msg, 
++                   &cm->msg.p_data, ntohs(cm->msg.p_size)))           
++              goto bail;
++
++      /* first time through, link EP and CM, put on work queue */
++      if (!cm->retries) {
++              dapli_queue_conn(cm);
++      }
++      return DAT_SUCCESS;
++
++bail:
++      dapl_log(DAPL_DBG_TYPE_WARN, 
++               " connect: ERR %s -> cm_lid %x cm_qpn %x r_psp %x p_sz=%d\n",
++               strerror(errno), htons(cm->msg.daddr.ib.lid), 
++               htonl(cm->msg.dqpn), htons(cm->msg.dport), 
++               htonl(cm->msg.p_size));
++
++      dapli_cm_free(cm);
++      return DAT_INSUFFICIENT_RESOURCES;
++}
++
++/*
++ * ACTIVE: exchange QP information, called from CR thread
++ */
++static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)
++{
++      DAPL_EP *ep = cm->ep;
++      ib_cm_events_t event = IB_CME_CONNECTED;
++
++      dapl_os_lock(&cm->lock);
++      if (cm->state != DCM_REP_PENDING) {
++              dapl_log(DAPL_DBG_TYPE_WARN, 
++                       " CONN_RTU: UNEXPECTED state:"
++                       " op %s, st %s <- lid %x sqpn %x sport %x\n", 
++                       dapl_cm_op_str(ntohs(msg->op)), 
++                       dapl_cm_state_str(cm->state), 
++                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), 
++                       ntohs(msg->sport));
++              dapl_os_unlock(&cm->lock);
++              return;
++      }
++
++      /* save remote address information to EP and CM */
++      dapl_os_memcpy(&ep->remote_ia_address,
++                     &msg->saddr, sizeof(union dcm_addr));
++      dapl_os_memcpy(&cm->msg.daddr, 
++                     &msg->saddr, sizeof(union dcm_addr));
++
++      /* validate private data size, and copy if necessary */
++      if (msg->p_size) {
++              if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {
++                      dapl_log(DAPL_DBG_TYPE_WARN, 
++                               " CONN_RTU: invalid p_size %d:"
++                               " st %s <- lid %x sqpn %x spsp %x\n", 
++                               ntohs(msg->p_size), 
++                               dapl_cm_state_str(cm->state), 
++                               ntohs(msg->saddr.ib.lid), 
++                               ntohl(msg->saddr.ib.qpn), 
++                               ntohs(msg->sport));
++                      dapl_os_unlock(&cm->lock);
++                      goto bail;
++              }
++              dapl_os_memcpy(cm->msg.p_data, 
++                             msg->p_data, ntohs(msg->p_size));
++      }
++              
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " CONN_RTU: DST lid=%x,"
++                   " iqp=%x, qp_type=%d, port=%x psize=%d\n",
++                   ntohs(cm->msg.daddr.ib.lid),
++                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type,
++                   ntohs(msg->sport), ntohs(msg->p_size));
++
++      if (ntohs(msg->op) == DCM_REP)
++              event = IB_CME_CONNECTED;
++      else if (ntohs(msg->op) == DCM_REJ_USER) 
++              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
++      else  
++              event = IB_CME_DESTINATION_REJECT;
++      
++      if (event != IB_CME_CONNECTED) {
++              dapl_log(DAPL_DBG_TYPE_CM, 
++                       " ACTIVE: CM_REQ REJECTED:"
++                       " cm %p op %s, st %s dlid %x iqp %x port %x <-"
++                       " slid %x iqp %x port %x\n", cm,
++                       dapl_cm_op_str(ntohs(msg->op)), 
++                       dapl_cm_state_str(cm->state), 
++                       ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn), 
++                       ntohs(msg->dport), ntohs(msg->saddr.ib.lid), 
++                       ntohl(msg->saddr.ib.qpn), ntohs(msg->sport));
++
++              cm->state = DCM_REJECTED;
++              dapl_os_unlock(&cm->lock);
++
++#ifdef DAT_EXTENSIONS
++              if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) 
++                      goto ud_bail;
++              else
++#endif
++              goto bail;
++      }
++      dapl_os_unlock(&cm->lock);
++
++      /* modify QP to RTR and then to RTS with remote info */
++      dapl_os_lock(&cm->ep->header.lock);
++      if (dapls_modify_qp_state(cm->ep->qp_handle,
++                                IBV_QPS_RTR, 
++                                cm->msg.daddr.ib.qpn,
++                                cm->msg.daddr.ib.lid,
++                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_RTU: QPS_RTR ERR %s <- lid %x iqp %x\n",
++                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
++                       ntohl(cm->msg.daddr.ib.qpn));
++              dapl_os_unlock(&cm->ep->header.lock);
++              event = IB_CME_LOCAL_FAILURE;
++              goto bail;
++      }
++      if (dapls_modify_qp_state(cm->ep->qp_handle,
++                                IBV_QPS_RTS, 
++                                cm->msg.daddr.ib.qpn,
++                                cm->msg.daddr.ib.lid,
++                                NULL) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " CONN_RTU: QPS_RTS ERR %s <- lid %x iqp %x\n",
++                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
++                       ntohl(cm->msg.daddr.ib.qpn));
++              dapl_os_unlock(&cm->ep->header.lock);
++              event = IB_CME_LOCAL_FAILURE;
++              goto bail;
++      }
++      dapl_os_unlock(&cm->ep->header.lock);
++      
++      /* Send RTU, no private data */
++      cm->msg.op = htons(DCM_RTU);
++      
++      dapl_os_lock(&cm->lock);
++      cm->state = DCM_CONNECTED;
++      dapl_os_unlock(&cm->lock);
++
++      if (ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0))            
++              goto bail;
++
++      /* init cm_handle and post the event with private data */
++      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");
++
++#ifdef DAT_EXTENSIONS
++ud_bail:
++      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) {
++              DAT_IB_EXTENSION_EVENT_DATA xevent;
++              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);
++              
++              /* post EVENT, modify_qp, AH already created, ucm msg */
++              xevent.status = 0;
++              xevent.type = DAT_IB_UD_REMOTE_AH;
++              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);
++              xevent.remote_ah.ah = dapls_create_ah(cm->hca, 
++                                                    cm->ep->qp_handle->pd, 
++                                                    cm->ep->qp_handle, 
++                                                    htons(lid), 
++                                                    NULL);
++              if (xevent.remote_ah.ah == NULL) {
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               " active UD RTU: ERR create_ah"
++                               " for qpn 0x%x lid 0x%x\n",
++                               xevent.remote_ah.qpn, lid);
++                      event = IB_CME_LOCAL_FAILURE;
++                      goto bail;
++              }
++              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */
++
++              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
++                             &cm->msg.daddr,
++                             sizeof(union dcm_addr));
++
++              /* remote ia_addr reference includes ucm qpn, not IB qpn */
++              ((union dcm_addr*)
++                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;
++
++              dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                           " ACTIVE: UD xevent ah %p qpn %x lid %x\n",
++                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);
++              dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                           " ACTIVE: UD xevent ia_addr qp_type %d"
++                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",
++                           ((union dcm_addr*)
++                              &xevent.remote_ah.ia_addr)->ib.qp_type,
++                           ntohs(((union dcm_addr*)
++                              &xevent.remote_ah.ia_addr)->ib.lid),
++                           ntohl(((union dcm_addr*)
++                              &xevent.remote_ah.ia_addr)->ib.qpn),
++                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),
++                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));
++
++              if (event == IB_CME_CONNECTED)
++                      event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;
++              else {
++                      xevent.type = DAT_IB_UD_CONNECT_REJECT;
++                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;
++              }
++
++              dapls_evd_post_connection_event_ext(
++                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,
++                              event,
++                              (DAT_EP_HANDLE)ep,
++                              (DAT_COUNT)ntohs(cm->msg.p_size),
++                              (DAT_PVOID *)cm->msg.p_data,
++                              (DAT_PVOID *)&xevent);
++      } else
++#endif
++      {
++              dapl_evd_connection_callback(cm,
++                                           IB_CME_CONNECTED,
++                                           cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);
++      }
++      dapl_log(DAPL_DBG_TYPE_CM_EST,
++               " UCM_ACTIVE_CONN %d [lid port qpn] %x %x %x -> %x %x %x\n",
++               cm->retries, ntohs(cm->msg.saddr.ib.lid),
++               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),
++               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),
++               ntohl(cm->msg.dqpn));
++      return;
++bail:
++      dapl_evd_connection_callback(NULL, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);
++      dapli_cm_free(cm);
++}
++
++/*
++ * PASSIVE: Accept on listen CM PSP.
++ *          create new CM object for this CR, 
++ *        receive peer QP information, private data, 
++ *        and post cr_event 
++ */
++static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg)
++{
++      dp_ib_cm_handle_t acm;
++
++      /* Allocate accept CM and setup passive references */
++      if ((acm = dapls_ib_cm_create(NULL)) == NULL) {
++              dapl_log(DAPL_DBG_TYPE_WARN, " accept: ERR cm_create\n");
++              return;
++      }
++
++      /* dest CM info from CR msg, source CM info from listen */
++      acm->sp = cm->sp;
++      acm->hca = cm->hca;
++      acm->msg.op = msg->op;
++      acm->msg.dport = msg->sport;
++      acm->msg.dqpn = msg->sqpn;
++      acm->msg.sport = cm->msg.sport; 
++      acm->msg.sqpn = cm->msg.sqpn;
++      acm->msg.p_size = msg->p_size;
++
++      /* CR saddr is CM daddr info, need EP for local saddr */
++      dapl_os_memcpy(&acm->msg.daddr, &msg->saddr, sizeof(union dcm_addr));
++      
++      dapl_log(DAPL_DBG_TYPE_CM,
++               " accept: DST port=%x lid=%x, iqp=%x, psize=%d\n",
++               ntohs(acm->msg.dport), ntohs(acm->msg.daddr.ib.lid), 
++               htonl(acm->msg.daddr.ib.qpn), htons(acm->msg.p_size));
++
++      /* validate private data size before reading */
++      if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {
++              dapl_log(DAPL_DBG_TYPE_WARN, " accept: psize (%d) wrong\n",
++                       ntohs(msg->p_size));
++              goto bail;
++      }
++
++      /* read private data into cm_handle if any present */
++      if (msg->p_size) 
++              dapl_os_memcpy(acm->msg.p_data, 
++                             msg->p_data, ntohs(msg->p_size));
++              
++      acm->state = DCM_ACCEPTING;
++      dapli_queue_conn(acm);
++
++#ifdef DAT_EXTENSIONS
++      if (acm->msg.daddr.ib.qp_type == IBV_QPT_UD) {
++              DAT_IB_EXTENSION_EVENT_DATA xevent;
++
++              /* post EVENT, modify_qp created ah */
++              xevent.status = 0;
++              xevent.type = DAT_IB_UD_CONNECT_REQUEST;
++
++              dapls_evd_post_cr_event_ext(acm->sp,
++                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,
++                                          acm,
++                                          (DAT_COUNT)ntohs(acm->msg.p_size),
++                                          (DAT_PVOID *)acm->msg.p_data,
++                                          (DAT_PVOID *)&xevent);
++      } else
++#endif
++              /* trigger CR event and return SUCCESS */
++              dapls_cr_callback(acm,
++                                IB_CME_CONNECTION_REQUEST_PENDING,
++                                acm->msg.p_data, ntohs(msg->p_size), acm->sp);
++      return;
++
++bail:
++      /* schedule work thread cleanup */
++      dapli_cm_free(acm);
++      return;
++}
++
++/*
++ * PASSIVE: read RTU from active peer, post CONN event
++ */
++static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)
++{
++      dapl_os_lock(&cm->lock);
++      if ((ntohs(msg->op) != DCM_RTU) || (cm->state != DCM_RTU_PENDING)) {
++              dapl_log(DAPL_DBG_TYPE_WARN, 
++                       " accept_rtu: UNEXPECTED op, state:"
++                       " op %s, st %s <- lid %x iqp %x sport %x\n", 
++                       dapl_cm_op_str(ntohs(msg->op)), 
++                       dapl_cm_state_str(cm->state), 
++                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), 
++                       ntohs(msg->sport));
++              dapl_os_unlock(&cm->lock);
++              goto bail;
++      }
++      cm->state = DCM_CONNECTED;
++      dapl_os_unlock(&cm->lock);
++      
++      /* final data exchange if remote QP state is good to go */
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: connected!\n");
++
++#ifdef DAT_EXTENSIONS
++      if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {
++              DAT_IB_EXTENSION_EVENT_DATA xevent;
++              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);
++              
++              /* post EVENT, modify_qp, AH already created, ucm msg */
++              xevent.status = 0;
++              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;
++              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);
++              xevent.remote_ah.ah = dapls_create_ah(cm->hca, 
++                                                    cm->ep->qp_handle->pd, 
++                                                    cm->ep->qp_handle, 
++                                                    htons(lid), 
++                                                    NULL);
++              if (xevent.remote_ah.ah == NULL) {
++                      dapl_log(DAPL_DBG_TYPE_ERR,
++                               " passive UD RTU: ERR create_ah"
++                               " for qpn 0x%x lid 0x%x\n",
++                               xevent.remote_ah.qpn, lid);
++                      goto bail;
++              }
++              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */
++              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
++                             &cm->msg.daddr,
++                              sizeof(union dcm_addr));
++
++              /* remote ia_addr reference includes ucm qpn, not IB qpn */
++              ((union dcm_addr*)
++                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;
++
++              dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                           " PASSIVE: UD xevent ah %p qpn %x lid %x\n",
++                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);
++              dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                           " PASSIVE: UD xevent ia_addr qp_type %d"
++                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",
++                           ((union dcm_addr*)
++                              &xevent.remote_ah.ia_addr)->ib.qp_type,
++                           ntohs(((union dcm_addr*)
++                              &xevent.remote_ah.ia_addr)->ib.lid),
++                           ntohl(((union dcm_addr*)
++                              &xevent.remote_ah.ia_addr)->ib.qpn),
++                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),
++                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));
++
++              dapls_evd_post_connection_event_ext(
++                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,
++                              DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,
++                              (DAT_EP_HANDLE)cm->ep,
++                              (DAT_COUNT)ntohs(cm->msg.p_size),
++                              (DAT_PVOID *)cm->msg.p_data,
++                              (DAT_PVOID *)&xevent);
++      } else {
++#endif
++              dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp);
++      }
++      dapl_log(DAPL_DBG_TYPE_CM_EST,
++               " UCM_PASSIVE_CONN %d [lid port qpn] %x %x %x <- %x %x %x\n",
++               cm->retries, ntohs(cm->msg.saddr.ib.lid),
++               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),
++               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),
++               ntohl(cm->msg.dqpn));
++      return;
++bail:
++      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp);
++      dapli_cm_free(cm);
++}
++
++/*
++ * PASSIVE: user accepted, send reply message with pdata
++ */
++static int ucm_reply(dp_ib_cm_handle_t cm)
++{
++      dapl_os_lock(&cm->lock);
++      if (cm->state != DCM_RTU_PENDING) {
++              dapl_log(DAPL_DBG_TYPE_ERR, 
++                       " CM_REPLY: wrong state %s",
++                       dapl_cm_state_str(cm->state));
++              dapl_os_unlock(&cm->lock);
++              return -1;
++      }
++
++      if (cm->retries == cm->hca->ib_trans.retries) {
++              dapl_log(DAPL_DBG_TYPE_ERR, 
++                      " CM_REPLY: RETRIES EXHAUSTED (lid port qpn)"
++                       " %x %x %x -> %x %x %x\n",
++                       htons(cm->msg.saddr.ib.lid), 
++                       htons(cm->msg.sport), 
++                       htonl(cm->msg.saddr.ib.qpn), 
++                       htons(cm->msg.daddr.ib.lid), 
++                       htons(cm->msg.dport), 
++                       htonl(cm->msg.daddr.ib.qpn));
++                      
++              dapl_os_unlock(&cm->lock);
++#ifdef DAPL_COUNTERS
++              /* called from check_timers in cm_thread, cm lock held */
++              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {
++                      dapl_os_unlock(&cm->hca->ib_trans.lock);
++                      dapls_print_cm_list(dapl_llist_peek_head(&cm->hca->ia_list_head));
++                      dapl_os_lock(&cm->hca->ib_trans.lock);
++              }
++#endif
++#ifdef DAT_EXTENSIONS
++              if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {
++                      DAT_IB_EXTENSION_EVENT_DATA xevent;
++                                      
++                      /* post REJECT event with CONN_REQ p_data */
++                      xevent.status = 0;
++                      xevent.type = DAT_IB_UD_CONNECT_ERROR;
++                                      
++                      dapls_evd_post_connection_event_ext(
++                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,
++                              DAT_IB_UD_CONNECTION_ERROR_EVENT,
++                              (DAT_EP_HANDLE)cm->ep,
++                              (DAT_COUNT)ntohs(cm->msg.p_size),
++                              (DAT_PVOID *)cm->msg.p_data,
++                              (DAT_PVOID *)&xevent);
++              } else 
++#endif
++                      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, 
++                                        NULL, 0, cm->sp);
++              return -1;
++      }
++      dapl_os_get_time(&cm->timer); /* RTU expected */
++      dapl_os_unlock(&cm->lock);
++      if (ucm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size))             
++              return -1;
++
++      return 0;
++}
++
++
++/*
++ * PASSIVE: consumer accept, send local QP information, private data, 
++ * queue on work thread to receive RTU information to avoid blocking
++ * user thread. 
++ */
++DAT_RETURN
++dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)
++{
++      DAPL_IA *ia = ep->header.owner_ia;
++      dp_ib_cm_handle_t cm = cr->ib_cm_handle;
++
++      if (p_size > DCM_MAX_PDATA_SIZE)
++              return DAT_LENGTH_ERROR;
++
++      dapl_os_lock(&cm->lock);
++      if (cm->state != DCM_ACCEPTING) {
++              dapl_os_unlock(&cm->lock);
++              return DAT_INVALID_STATE;
++      }
++      dapl_os_unlock(&cm->lock);
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " ACCEPT_USR: remote lid=%x"
++                   " iqp=%x qp_type %d, psize=%d\n",
++                   ntohs(cm->msg.daddr.ib.lid),
++                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type, 
++                   p_size);
++
++      dapl_dbg_log(DAPL_DBG_TYPE_CM,
++                   " ACCEPT_USR: remote GID subnet %016llx id %016llx\n",
++                   (unsigned long long)
++                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),
++                   (unsigned long long)
++                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));
++
++#ifdef DAT_EXTENSIONS
++      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD &&
++          ep->qp_handle->qp_type != IBV_QPT_UD) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                           " ACCEPT_USR: ERR remote QP is UD,"
++                           ", but local QP is not\n");
++              return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);
++      }
++#endif
++
++      /* modify QP to RTR and then to RTS with remote info already read */
++      dapl_os_lock(&ep->header.lock);
++      if (dapls_modify_qp_state(ep->qp_handle,
++                                IBV_QPS_RTR, 
++                                cm->msg.daddr.ib.qpn,
++                                cm->msg.daddr.ib.lid,
++                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_USR: QPS_RTR ERR %s -> lid %x qpn %x\n",
++                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
++                       ntohl(cm->msg.daddr.ib.qpn));
++              dapl_os_unlock(&ep->header.lock);
++              goto bail;
++      }
++      if (dapls_modify_qp_state(ep->qp_handle,
++                                IBV_QPS_RTS, 
++                                cm->msg.daddr.ib.qpn,
++                                cm->msg.daddr.ib.lid,
++                                NULL) != DAT_SUCCESS) {
++              dapl_log(DAPL_DBG_TYPE_ERR,
++                       " ACCEPT_USR: QPS_RTS ERR %s -> lid %x qpn %x\n",
++                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
++                       ntohl(cm->msg.daddr.ib.qpn));
++              dapl_os_unlock(&ep->header.lock);
++              goto bail;
++      }
++      dapl_os_unlock(&ep->header.lock);
++
++      /* save remote address information */
++      dapl_os_memcpy(&ep->remote_ia_address,
++                     &cm->msg.saddr, sizeof(union dcm_addr));
++
++      /* setup local QP info and type from EP, copy pdata, for reply */
++      cm->msg.op = htons(DCM_REP);
++      cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num);
++      cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;
++      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; 
++      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
++                     &cm->hca->ib_trans.addr.ib.gid, 16); 
++
++      /* 
++       * UD: deliver p_data with REQ and EST event, keep REQ p_data in 
++       * cm->msg.p_data and save REPLY accept data in cm->p_data for retries 
++       */
++      cm->p_size = p_size;
++      dapl_os_memcpy(&cm->p_data, p_data, p_size);
++
++      /* save state and setup valid reference to EP, HCA */
++      dapl_ep_link_cm(ep, cm);
++      cm->ep = ep;
++      cm->hca = ia->hca_ptr;
++      
++      dapl_os_lock(&cm->lock);
++      dapl_os_get_time(&cm->timer); /* RTU expected */
++      cm->state = DCM_RTU_PENDING;
++      dapl_os_unlock(&cm->lock);
++
++      if (ucm_reply(cm)) {
++              dapl_ep_unlink_cm(ep, cm);
++              goto bail;
++      }
++      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: accepted!\n");
++      dapls_thread_signal(&cm->hca->ib_trans.signal);
++      return DAT_SUCCESS;
++bail:
++      dapli_cm_free(cm);
++      return DAT_INTERNAL_ERROR;
++}
++
++
++/*
++ * dapls_ib_connect
++ *
++ * Initiate a connection with the passive listener on another node
++ *
++ * Input:
++ *    ep_handle,
++ *    remote_ia_address,
++ *    remote_conn_qual,
++ *    prd_size                size of private data and structure
++ *    prd_prt                 pointer to private data structure
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INVALID_PARAMETER
++ *
++ */
++DAT_RETURN
++dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
++               IN DAT_IA_ADDRESS_PTR r_addr,
++               IN DAT_CONN_QUAL r_psp,
++               IN DAT_COUNT p_size, IN void *p_data)
++{
++      DAPL_EP *ep = (DAPL_EP *)ep_handle;
++      dp_ib_cm_handle_t cm;
++      
++      /* create CM object, initialize SRC info from EP */
++      cm = dapls_ib_cm_create(ep);
++      if (cm == NULL)
++              return DAT_INSUFFICIENT_RESOURCES;
++
++      /* remote hca and port: lid, gid, network order */
++      dapl_os_memcpy(&cm->msg.daddr, r_addr, sizeof(union dcm_addr));
++
++      /* remote uCM information, comes from consumer provider r_addr */
++      cm->msg.dport = htons((uint16_t)r_psp);
++      cm->msg.dqpn = cm->msg.daddr.ib.qpn;
++      cm->msg.daddr.ib.qpn = 0; /* don't have a remote qpn until reply */
++      
++      if (p_size) {
++              cm->msg.p_size = htons(p_size);
++              dapl_os_memcpy(&cm->msg.p_data, p_data, p_size);
++      }
++      
++      cm->state = DCM_REP_PENDING;
++
++      /* build connect request, send to remote CM based on r_addr info */
++      return (dapli_cm_connect(ep, cm));
++}
++
++/*
++ * dapls_ib_disconnect
++ *
++ * Disconnect an EP
++ *
++ * Input:
++ *    ep_handle,
++ *    disconnect_flags
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ */
++DAT_RETURN
++dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags)
++{
++      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);
++
++      dapl_os_lock(&ep_ptr->header.lock);
++      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||
++          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||
++          cm_ptr == NULL) {
++              dapl_os_unlock(&ep_ptr->header.lock);
++              return DAT_SUCCESS;
++      } 
++      dapl_os_unlock(&ep_ptr->header.lock);
++      
++      dapli_cm_disconnect(cm_ptr);
++
++        /* ABRUPT close, wait for callback and DISCONNECTED state */
++        if (close_flags == DAT_CLOSE_ABRUPT_FLAG) {
++                dapl_os_lock(&ep_ptr->header.lock);
++                while (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) {
++                        dapl_os_unlock(&ep_ptr->header.lock);
++                        dapl_os_sleep_usec(10000);
++                        dapl_os_lock(&ep_ptr->header.lock);
++                }
++                dapl_os_unlock(&ep_ptr->header.lock);
++        }
++
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_ib_disconnect_clean
++ *
++ * Clean up outstanding connection data. This routine is invoked
++ * after the final disconnect callback has occurred. Only on the
++ * ACTIVE side of a connection. It is also called if dat_ep_connect
++ * times out using the consumer supplied timeout value.
++ *
++ * Input:
++ *    ep_ptr          DAPL_EP
++ *    active          Indicates active side of connection
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    void
++ *
++ */
++void
++dapls_ib_disconnect_clean(IN DAPL_EP *ep,
++                        IN DAT_BOOLEAN active,
++                        IN const ib_cm_events_t ib_cm_event)
++{
++      if (ib_cm_event == IB_CME_TIMEOUT) {
++              dp_ib_cm_handle_t cm_ptr;
++
++              if ((cm_ptr = dapl_get_cm_from_ep(ep)) == NULL)
++                      return;
++
++              dapl_log(DAPL_DBG_TYPE_WARN,
++                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",
++                      ep, cm_ptr, dapl_cm_state_str(cm_ptr->state));
++              
++              /* schedule release of socket and local resources */
++              dapli_cm_free(cm_ptr);
++      }
++}
++
++/*
++ * dapl_ib_setup_conn_listener
++ *
++ * Have the CM set up a connection listener.
++ *
++ * Input:
++ *    ibm_hca_handle          HCA handle
++ *    qp_handle                       QP handle
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INTERNAL_ERROR
++ *    DAT_CONN_QUAL_UNAVAILBLE
++ *    DAT_CONN_QUAL_IN_USE
++ *
++ */
++DAT_RETURN
++dapls_ib_setup_conn_listener(IN DAPL_IA *ia, 
++                           IN DAT_UINT64 sid, 
++                           IN DAPL_SP *sp)
++{
++      ib_cm_srvc_handle_t cm = NULL;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " listen(ia %p ServiceID %x sp %p)\n",
++                   ia, sid, sp);
++
++      /* reserve local port, then allocate CM object */
++      if (!ucm_get_port(&ia->hca_ptr->ib_trans, (uint16_t)sid)) {
++              dapl_dbg_log(DAPL_DBG_TYPE_WARN,
++                           " listen: ERROR %s on conn_qual %x\n",
++                           strerror(errno), sid);
++              return DAT_CONN_QUAL_IN_USE;
++      }
++
++      /* cm_create will setup saddr for listen server */
++      if ((cm = dapls_ib_cm_create(NULL)) == NULL)
++              return DAT_INSUFFICIENT_RESOURCES;
++
++      /* LISTEN: init DST address and QP info to local CM server info */
++      cm->sp = sp;
++      cm->hca = ia->hca_ptr;
++      cm->msg.sport = htons((uint16_t)sid);
++      cm->msg.sqpn = htonl(ia->hca_ptr->ib_trans.qp->qp_num);
++      cm->msg.saddr.ib.qp_type = IBV_QPT_UD;
++        cm->msg.saddr.ib.lid = ia->hca_ptr->ib_trans.addr.ib.lid; 
++      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
++                     &cm->hca->ib_trans.addr.ib.gid, 16); 
++      
++      /* save cm_handle reference in service point */
++      sp->cm_srvc_handle = cm;
++
++      /* queue up listen socket to process inbound CR's */
++      cm->state = DCM_LISTEN;
++      dapli_queue_listen(cm);
++
++      return DAT_SUCCESS;
++}
++
++
++/*
++ * dapl_ib_remove_conn_listener
++ *
++ * Have the CM remove a connection listener.
++ *
++ * Input:
++ *    ia_handle               IA handle
++ *    ServiceID               IB Channel Service ID
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INVALID_STATE
++ *
++ */
++DAT_RETURN
++dapls_ib_remove_conn_listener(IN DAPL_IA *ia, IN DAPL_SP *sp)
++{
++      ib_cm_srvc_handle_t cm = sp->cm_srvc_handle;
++
++      /* free cm_srvc_handle and port, and mark CM for cleanup */
++      if (cm) {
++              dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " remove_listener(ia %p sp %p cm %p psp=%x)\n",
++                   ia, sp, cm, ntohs(cm->msg.dport));
++
++              sp->cm_srvc_handle = NULL;
++              dapli_dequeue_listen(cm);  
++              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));
++              dapls_cm_release(cm);  /* last ref, dealloc */
++      }
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_ib_accept_connection
++ *
++ * Perform necessary steps to accept a connection
++ *
++ * Input:
++ *    cr_handle
++ *    ep_handle
++ *    private_data_size
++ *    private_data
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INSUFFICIENT_RESOURCES
++ *    DAT_INTERNAL_ERROR
++ *
++ */
++DAT_RETURN
++dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
++                         IN DAT_EP_HANDLE ep_handle,
++                         IN DAT_COUNT p_size, 
++                         IN const DAT_PVOID p_data)
++{
++      DAPL_CR *cr = (DAPL_CR *)cr_handle;
++      DAPL_EP *ep = (DAPL_EP *)ep_handle;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " accept_connection(cr %p ep %p prd %p,%d)\n",
++                   cr, ep, p_data, p_size);
++
++      /* allocate and attach a QP if necessary */
++      if (ep->qp_state == DAPL_QP_STATE_UNATTACHED) {
++              DAT_RETURN status;
++              status = dapls_ib_qp_alloc(ep->header.owner_ia,
++                                         ep, ep);
++              if (status != DAT_SUCCESS)
++                      return status;
++      }
++      return (dapli_accept_usr(ep, cr, p_size, p_data));
++}
++
++/*
++ * dapls_ib_reject_connection
++ *
++ * Reject a connection
++ *
++ * Input:
++ *    cr_handle
++ *
++ * Output:
++ *    none
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INTERNAL_ERROR
++ *
++ */
++DAT_RETURN
++dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm,
++                         IN int reason,
++                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)
++{
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   " reject(cm %p reason %x, pdata %p, psize %d)\n",
++                   cm, reason, pdata, psize);
++
++        if (psize > DCM_MAX_PDATA_SIZE)
++                return DAT_LENGTH_ERROR;
++
++      /* cr_thread will destroy CR, update saddr lid, gid, qp_type info */
++      dapl_os_lock(&cm->lock);
++      dapl_log(DAPL_DBG_TYPE_CM, 
++               " PASSIVE: REJECTING CM_REQ:"
++               " cm %p op %s, st %s slid %x iqp %x port %x ->"
++               " dlid %x iqp %x port %x\n", cm,
++               dapl_cm_op_str(ntohs(cm->msg.op)), 
++               dapl_cm_state_str(cm->state), 
++               ntohs(cm->hca->ib_trans.addr.ib.lid), 
++               ntohl(cm->msg.saddr.ib.qpn), 
++               ntohs(cm->msg.sport), ntohs(cm->msg.daddr.ib.lid), 
++               ntohl(cm->msg.daddr.ib.qpn), ntohs(cm->msg.dport));
++
++      cm->state = DCM_REJECTED;
++      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; 
++      cm->msg.saddr.ib.qp_type = cm->msg.daddr.ib.qp_type;
++      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
++                     &cm->hca->ib_trans.addr.ib.gid, 16); 
++      cm->msg.op = htons(DCM_REJ_USER);
++      
++      if (ucm_send(&cm->hca->ib_trans, &cm->msg, pdata, psize)) {
++              dapl_log(DAPL_DBG_TYPE_WARN,
++                       " cm_reject: send ERR: %s\n", strerror(errno));
++              dapl_os_unlock(&cm->lock);
++              return DAT_INTERNAL_ERROR;
++      }
++      dapl_os_unlock(&cm->lock);
++      dapli_cm_free(cm);
++      return DAT_SUCCESS;
++}
++
++/*
++ * dapls_ib_cm_remote_addr
++ *
++ * Obtain the remote IP address given a connection
++ *
++ * Input:
++ *    cr_handle
++ *
++ * Output:
++ *    remote_ia_address: where to place the remote address
++ *
++ * Returns:
++ *    DAT_SUCCESS
++ *    DAT_INVALID_HANDLE
++ *
++ */
++DAT_RETURN
++dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,
++                      OUT DAT_SOCK_ADDR6 * remote_ia_address)
++{
++      DAPL_HEADER *header;
++      dp_ib_cm_handle_t cm;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_EP,
++                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",
++                   dat_handle);
++
++      header = (DAPL_HEADER *) dat_handle;
++
++      if (header->magic == DAPL_MAGIC_EP)
++              cm = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);
++      else if (header->magic == DAPL_MAGIC_CR)
++              cm = ((DAPL_CR *) dat_handle)->ib_cm_handle;
++      else
++              return DAT_INVALID_HANDLE;
++
++      dapl_os_memcpy(remote_ia_address,
++                     &cm->msg.daddr, sizeof(DAT_SOCK_ADDR6));
++
++      return DAT_SUCCESS;
++}
++
++int dapls_ib_private_data_size(
++      IN DAPL_HCA *hca_ptr)
++{
++      return DCM_MAX_PDATA_SIZE;
++}
++
++#if defined(_WIN32) || defined(_WIN64)
++
++void cm_thread(void *arg)
++{
++      struct dapl_hca *hca = arg;
++      dp_ib_cm_handle_t cm, next;
++      DWORD time_ms;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);
++      dapl_os_lock(&hca->ib_trans.lock);
++      for (hca->ib_trans.cm_state = IB_THREAD_RUN;
++           hca->ib_trans.cm_state == IB_THREAD_RUN ||
++           !dapl_llist_is_empty(&hca->ib_trans.list);
++           dapl_os_lock(&hca->ib_trans.lock)) {
++
++              time_ms = INFINITE;
++              CompSetZero(&hca->ib_trans.signal.set);
++              CompSetAdd(&hca->ib_hca_handle->channel, &hca->ib_trans.signal.set);
++              CompSetAdd(&hca->ib_trans.rch->comp_channel, &hca->ib_trans.signal.set);
++              CompSetAdd(&hca->ib_trans.ib_cq->comp_channel, &hca->ib_trans.signal.set);
++
++              next = dapl_llist_is_empty(&hca->ib_trans.list) ? NULL :
++                      dapl_llist_peek_head(&hca->ib_trans.list);
++
++              while (next) {
++                      cm = next;
++                      next = dapl_llist_next_entry(&hca->ib_trans.list,
++                                                   (DAPL_LLIST_ENTRY *)&cm->local_entry);
++                      dapls_cm_acquire(cm); /* hold thread ref */
++                      dapl_os_lock(&cm->lock);
++                      if (cm->state == DCM_FREE || 
++                          hca->ib_trans.cm_state != IB_THREAD_RUN) {
++                              dapl_os_unlock(&cm->lock);
++                              dapl_log(DAPL_DBG_TYPE_CM, 
++                                       " CM FREE: %p ep=%p st=%s refs=%d\n", 
++                                       cm, cm->ep, dapl_cm_state_str(cm->state), 
++                                       cm->ref_count);
++
++                              dapls_cm_release(cm); /* release alloc ref */
++                              dapli_cm_dequeue(cm); /* release workq ref */
++                              dapls_cm_release(cm); /* release thread ref */
++                              continue;
++                      }
++                      dapl_os_unlock(&cm->lock);
++                      ucm_check_timers(cm, &time_ms);
++                      dapls_cm_release(cm); /* release thread ref */
++              }
++
++              dapl_os_unlock(&hca->ib_trans.lock);
++
++              hca->ib_hca_handle->channel.Milliseconds = time_ms;
++              hca->ib_trans.rch->comp_channel.Milliseconds = time_ms;
++              hca->ib_trans.ib_cq->comp_channel.Milliseconds = time_ms;
++              CompSetPoll(&hca->ib_trans.signal.set, time_ms);
++
++              hca->ib_hca_handle->channel.Milliseconds = 0;
++              hca->ib_trans.rch->comp_channel.Milliseconds = 0;
++              hca->ib_trans.ib_cq->comp_channel.Milliseconds = 0;
++
++              ucm_recv(&hca->ib_trans);
++              ucm_async_event(hca);
++              dapli_cq_event_cb(&hca->ib_trans);
++      }
++
++      dapl_os_unlock(&hca->ib_trans.lock);
++      hca->ib_trans.cm_state = IB_THREAD_EXIT;
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);
++}
++
++#else                         // _WIN32 || _WIN64
++
++void cm_thread(void *arg)
++{
++      struct dapl_hca *hca = arg;
++      dp_ib_cm_handle_t cm, next;
++      struct dapl_fd_set *set;
++      char rbuf[2];
++      int time_ms;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);
++      set = dapl_alloc_fd_set();
++      if (!set)
++              goto out;
++
++      dapl_os_lock(&hca->ib_trans.lock);
++      hca->ib_trans.cm_state = IB_THREAD_RUN;
++
++      while (1) {
++              time_ms = -1; /* reset to blocking */
++              dapl_fd_zero(set);
++              dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ);    
++              dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ);
++              dapl_fd_set(hca->ib_trans.rch->fd, set, DAPL_FD_READ);
++              dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ);
++              
++              if (!dapl_llist_is_empty(&hca->ib_trans.list))
++                      next = dapl_llist_peek_head(&hca->ib_trans.list);
++              else
++                      next = NULL;
++
++              while (next) {
++                      cm = next;
++                      next = dapl_llist_next_entry(
++                                      &hca->ib_trans.list,
++                                      (DAPL_LLIST_ENTRY *)&cm->local_entry);
++                      dapls_cm_acquire(cm); /* hold thread ref */
++                      dapl_os_lock(&cm->lock);
++                      if (cm->state == DCM_FREE || 
++                          hca->ib_trans.cm_state != IB_THREAD_RUN) {
++                              dapl_os_unlock(&cm->lock);
++                              dapl_log(DAPL_DBG_TYPE_CM, 
++                                       " CM FREE: %p ep=%p st=%s refs=%d\n", 
++                                       cm, cm->ep, dapl_cm_state_str(cm->state), 
++                                       cm->ref_count);
++
++                              dapls_cm_release(cm); /* release alloc ref */
++                              dapli_cm_dequeue(cm); /* release workq ref */
++                              dapls_cm_release(cm); /* release thread ref */
++                              continue;
++                      }
++                      dapl_os_unlock(&cm->lock);
++                      ucm_check_timers(cm, &time_ms);
++                      dapls_cm_release(cm); /* release thread ref */
++              }
++
++              /* set to exit and all resources destroyed */
++              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&
++                  (dapl_llist_is_empty(&hca->ib_trans.list)))
++                      break;
++
++              dapl_os_unlock(&hca->ib_trans.lock);
++              dapl_select(set, time_ms);
++
++              /* Process events: CM, ASYNC, NOTIFY THREAD */
++              if (dapl_poll(hca->ib_trans.rch->fd, 
++                            DAPL_FD_READ) == DAPL_FD_READ) {
++                      ucm_recv(&hca->ib_trans);
++              }
++              if (dapl_poll(hca->ib_hca_handle->async_fd, 
++                            DAPL_FD_READ) == DAPL_FD_READ) {
++                      ucm_async_event(hca);
++              }
++              if (dapl_poll(hca->ib_trans.ib_cq->fd, 
++                            DAPL_FD_READ) == DAPL_FD_READ) {
++                      dapli_cq_event_cb(&hca->ib_trans);
++              }
++              while (dapl_poll(hca->ib_trans.signal.scm[0], 
++                               DAPL_FD_READ) == DAPL_FD_READ) {
++                      recv(hca->ib_trans.signal.scm[0], rbuf, 2, 0);
++              }
++              dapl_os_lock(&hca->ib_trans.lock);
++              
++              /* set to exit and all resources destroyed */
++              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&
++                  (dapl_llist_is_empty(&hca->ib_trans.list)))
++                      break;
++      }
++
++      dapl_os_unlock(&hca->ib_trans.lock);
++      free(set);
++out:
++      hca->ib_trans.cm_state = IB_THREAD_EXIT;
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);
++}
++#endif
++
++#ifdef DAPL_COUNTERS
++static char _ctr_host_[128];
++/* Debug aid: List all Connections in process and state */
++void dapls_print_cm_list(IN DAPL_IA *ia_ptr)
++{
++      /* Print in process CM's for this IA, if debug type set */
++      int i = 0;
++      dp_ib_cm_handle_t cm, next_cm;
++      struct dapl_llist_entry **list;
++      DAPL_OS_LOCK *lock;
++      
++      /* LISTEN LIST */
++      list = &ia_ptr->hca_ptr->ib_trans.llist;
++      lock = &ia_ptr->hca_ptr->ib_trans.llock;
++
++      dapl_os_lock(lock);
++      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))
++              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);
++      else
++              next_cm = NULL;
++
++      gethostname(_ctr_host_, sizeof(_ctr_host_));
++      printf("\n [%s:%x] DAPL IA LISTEN/CONNECTIONS IN PROCESS:\n", 
++              _ctr_host_ , dapl_os_getpid());
++
++      while (next_cm) {
++              cm = next_cm;
++              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,
++                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);
++
++              printf( "  LISTEN[%d]: sp %p %s uCM_QP: %x %x %x l_pid %x (%x)\n",
++                      i, cm->sp, dapl_cm_state_str(cm->state),
++                      ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport),
++                      ntohl(cm->msg.sqpn), ntohl(*(DAT_UINT32*)cm->msg.resv), 
++                      ntohl(*(DAT_UINT32*)cm->msg.resv)); 
++              i++;
++      }
++      dapl_os_unlock(lock);
++
++      /* CONNECTION LIST */
++      list = &ia_ptr->hca_ptr->ib_trans.list;
++      lock = &ia_ptr->hca_ptr->ib_trans.lock;
++
++      dapl_os_lock(lock);
++      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))
++              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);
++      else
++              next_cm = NULL;
++
++        while (next_cm) {
++              cm = next_cm;
++              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,
++                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);
++
++              printf( "  CONN[%d]: ep %p cm %p %s %s"
++                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",
++                      i, cm->ep, cm,
++                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",
++                      dapl_cm_state_str(cm->state),
++                      ntohs(cm->msg.saddr.ib.lid),
++                      ntohs(cm->msg.sport),
++                      ntohl(cm->msg.saddr.ib.qpn),    
++                      cm->sp ? "<-" : "->",
++                      ntohs(cm->msg.daddr.ib.lid),
++                      ntohs(cm->msg.dport),
++                      ntohl(cm->msg.daddr.ib.qpn),
++                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), 
++                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); 
++              i++;
++      }
++      printf("\n");
++      dapl_os_unlock(lock);
++}
++#endif
+diff --git a/trunk/ulp/dapl2/dapl/openib_ucm/device.c b/trunk/ulp/dapl2/dapl/openib_ucm/device.c
+index 1959c76..b7d9efd 100644
+--- a/trunk/ulp/dapl2/dapl/openib_ucm/device.c
++++ b/trunk/ulp/dapl2/dapl/openib_ucm/device.c
+@@ -581,8 +581,6 @@ void ucm_async_event(struct dapl_hca *hca)
+       struct ibv_async_event event;
+       struct _ib_hca_transport *tp = &hca->ib_trans;
+-      dapl_log(DAPL_DBG_TYPE_WARN, " async_event(%p)\n", hca);
+-
+       if (!ibv_get_async_event(hca->ib_hca_handle, &event)) {
+               switch (event.event_type) {
+diff --git a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c
+index 718e433..36b632a 100644
+--- a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c
++++ b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c
+@@ -71,7 +71,6 @@ DAT_RETURN DAT_API dapl_evd_set_unwaitable(IN DAT_EVD_HANDLE evd_handle)
+       }
+       dapl_os_lock(&evd_ptr->header.lock);
+       evd_ptr->evd_waitable = DAT_FALSE;
+-      dapl_os_unlock(&evd_ptr->header.lock);
+       /*
+        * If this evd is waiting, wake it up. There is an obvious race
+@@ -85,6 +84,7 @@ DAT_RETURN DAT_API dapl_evd_set_unwaitable(IN DAT_EVD_HANDLE evd_handle)
+               else
+                       dapl_os_wait_object_wakeup(&evd_ptr->wait_object);
+       }
++      dapl_os_unlock(&evd_ptr->header.lock);
+       bail:
+       return dat_status;
+ }
+diff --git a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c
+index 79afb0d..33cec50 100644
+--- a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c
++++ b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c
+@@ -168,14 +168,12 @@ DAT_RETURN DAT_API dapl_evd_wait(IN DAT_EVD_HANDLE evd_handle,
+                * return right away if the ib_cq_handle associate with these evd
+                * equal to IB_INVALID_HANDLE
+                */
+-              dapl_os_unlock(&evd_ptr->header.lock);
+-              dapls_evd_copy_cq(evd_ptr);
+-              dapl_os_lock(&evd_ptr->header.lock);
++              dat_status = dapls_evd_copy_cq(evd_ptr);
++              if (dat_status == DAT_QUEUE_FULL)
++                      goto bail;
+-              if (dapls_rbuf_count(&evd_ptr->pending_event_queue) >=
+-                  threshold) {
++              if (dapls_rbuf_count(&evd_ptr->pending_event_queue) >= threshold)
+                       break;
+-              }
+               /*
+                * Do not enable the completion notification if this evd is not 
+@@ -266,6 +264,8 @@ DAT_RETURN DAT_API dapl_evd_wait(IN DAT_EVD_HANDLE evd_handle,
+       if (dat_status) {
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
+                            "dapl_evd_wait () returns 0x%x\n", dat_status);
++              if (dat_status == DAT_QUEUE_FULL)
++                      dapls_evd_post_overflow_event(evd_ptr);
+       }
+       return dat_status;
+ }
+diff --git a/trunk/ulp/dapl2/dapl/udapl/dapl_init.c b/trunk/ulp/dapl2/dapl/udapl/dapl_init.c
+index 605ab80..07e5b31 100644
+--- a/trunk/ulp/dapl2/dapl/udapl/dapl_init.c
++++ b/trunk/ulp/dapl2/dapl/udapl/dapl_init.c
+@@ -1,307 +1,307 @@
+-/*\r
+- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
+- *\r
+- * This Software is licensed under one of the following licenses:\r
+- *\r
+- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/cpl.php.\r
+- *\r
+- * 2) under the terms of the "The BSD License" a copy of which is\r
+- *    available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/bsd-license.php.\r
+- *\r
+- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+- *    copy of which is available from the Open Source Initiative, see\r
+- *    http://www.opensource.org/licenses/gpl-license.php.\r
+- *\r
+- * Licensee has the right to choose one of the above licenses.\r
+- *\r
+- * Redistributions of source code must retain the above copyright\r
+- * notice and one of the license notices.\r
+- *\r
+- * Redistributions in binary form must reproduce both the above copyright\r
+- * notice, one of the license notices in the documentation\r
+- * and/or other materials provided with the distribution.\r
+- */\r
+-\r
+-/**********************************************************************\r
+- * \r
+- * MODULE: dapl_init.c\r
+- *\r
+- * PURPOSE: Interface Adapter management\r
+- * Description: Interfaces in this file are completely described in\r
+- *            the DAPL 1.1 API, Chapter 6, section 2\r
+- *\r
+- * $Id:$\r
+- **********************************************************************/\r
+-\r
+-#include "dapl.h"\r
+-#include <dat2/dat_registry.h>        /* Provider API function prototypes */\r
+-#include "dapl_hca_util.h"\r
+-#include "dapl_init.h"\r
+-#include "dapl_provider.h"\r
+-#include "dapl_mr_util.h"\r
+-#include "dapl_osd.h"\r
+-#include "dapl_adapter_util.h"\r
+-#include "dapl_name_service.h"\r
+-#include "dapl_timer_util.h"\r
+-#include "dapl_vendor.h"\r
+-\r
+-/*\r
+- * dapl_init\r
+- *\r
+- * initialize this provider\r
+- * includes initialization of all global variables\r
+- * as well as registering all supported IAs with the dat registry\r
+- *\r
+- * This function needs to be called once when the provider is loaded.\r
+- *\r
+- * Input:\r
+- *    none\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Return Values:\r
+- */\r
+-void dapl_init(void)\r
+-{\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      /* set up debug type */\r
+-      g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE",\r
+-                                            DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN);\r
+-      /* set up debug destination */\r
+-      g_dapl_dbg_dest = dapl_os_get_env_val("DAPL_DBG_DEST",\r
+-                                            DAPL_DBG_DEST_STDOUT);\r
+-\r
+-      /* open log file on first logging call if necessary */\r
+-      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)\r
+-              openlog("libdapl", LOG_ODELAY | LOG_PID | LOG_CONS, LOG_USER);\r
+-\r
+-      dapl_log(DAPL_DBG_TYPE_UTIL, "dapl_init: dbg_type=0x%x,dbg_dest=0x%x\n",\r
+-               g_dapl_dbg_type, g_dapl_dbg_dest);\r
+-\r
+-      /* See if the user is on a loopback setup */\r
+-      g_dapl_loopback_connection = dapl_os_get_env_bool("DAPL_LOOPBACK");\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n",\r
+-                   g_dapl_loopback_connection ? "" : "NOT");\r
+-\r
+-      /* initialize verbs library */\r
+-      dapls_ib_init();\r
+-\r
+-      /* initialize the timer */\r
+-      dapls_timer_init();\r
+-\r
+-      /* Set up name services */\r
+-      dat_status = dapls_ns_init();\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dapls_ns_init failed %d\n", dat_status);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      /* initialize the provider list */\r
+-      dat_status = dapl_provider_list_create();\r
+-\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dapl_provider_list_create failed %d\n",\r
+-                           dat_status);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      return;\r
+-\r
+-      bail:\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n");\r
+-      return;\r
+-}\r
+-\r
+-/*\r
+- * dapl_fini\r
+- *\r
+- * finalize this provider\r
+- * includes freeing of all global variables\r
+- * as well as deregistering all supported IAs from the dat registry\r
+- *\r
+- * This function needs to be called once when the provider is loaded.\r
+- *\r
+- * Input:\r
+- *    none\r
+- *\r
+- * Output:\r
+- *    none\r
+- *\r
+- * Return Values:\r
+- */\r
+-void dapl_fini(void)\r
+-{\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: ENTER (dapl_fini)\n");\r
+-\r
+-      dat_status = dapl_provider_list_destroy();\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dapl_provider_list_destroy failed %d\n",\r
+-                           dat_status);\r
+-      }\r
+-\r
+-      dapls_ib_release();\r
+-      dapls_timer_release();\r
+-\r
+-      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Exit (dapl_fini)\n");\r
+-\r
+-      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)\r
+-              closelog();\r
+-\r
+-      return;\r
+-}\r
+-\r
+-/*\r
+- *\r
+- * This function is called by the registry to initialize a provider\r
+- *\r
+- * The instance data string is expected to have the following form:\r
+- *\r
+- * <hca name> <port number>\r
+- *\r
+- */\r
+-void DAT_API\r
+-DAT_PROVIDER_INIT_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info,\r
+-                          IN const char *instance_data)\r
+-{\r
+-      DAT_PROVIDER *provider;\r
+-      DAPL_HCA *hca_ptr;\r
+-      DAT_RETURN dat_status;\r
+-      char *data;\r
+-      char *name;\r
+-      char *port;\r
+-      unsigned int len;\r
+-      unsigned int i;\r
+-\r
+-      data = NULL;\r
+-      provider = NULL;\r
+-      hca_ptr = NULL;\r
+-\r
+-#if defined(_WIN32) || defined(_WIN64)\r
+-      /* initialize DAPL library here as when called from DLL context in DLLmain()\r
+-       * the IB (ibal) call hangs.\r
+-       */\r
+-      dapl_init();\r
+-#endif\r
+-\r
+-      dat_status =\r
+-          dapl_provider_list_insert(provider_info->ia_name, &provider);\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dat_provider_list_insert failed: %x\n",\r
+-                           dat_status);\r
+-              goto bail;\r
+-      }\r
+-\r
+-      data = dapl_os_strdup(instance_data);\r
+-      if (NULL == data) {\r
+-              goto bail;\r
+-      }\r
+-\r
+-      len = dapl_os_strlen(data);\r
+-\r
+-      for (i = 0; i < len; i++) {\r
+-              if (' ' == data[i]) {\r
+-                      data[i] = '\0';\r
+-                      break;\r
+-              }\r
+-      }\r
+-\r
+-      /* if the instance data did not have a valid format */\r
+-      if (i == len) {\r
+-              goto bail;\r
+-      }\r
+-\r
+-      name = data;\r
+-      port = data + (i + 1);\r
+-\r
+-      hca_ptr = dapl_hca_alloc(name, port);\r
+-      if (NULL == hca_ptr) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "%s() dapl_hca_alloc failed?\n");\r
+-              goto bail;\r
+-      }\r
+-\r
+-      provider->extension = hca_ptr;\r
+-      dat_status = dat_registry_add_provider(provider, provider_info);\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dat_registry_add_provider failed: %x\n",\r
+-                           dat_status);\r
+-      }\r
+-\r
+-      bail:\r
+-      if (NULL != data) {\r
+-              dapl_os_free(data, len + 1);\r
+-      }\r
+-\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              if (NULL != provider) {\r
+-                      (void)dapl_provider_list_remove(provider_info->ia_name);\r
+-              }\r
+-\r
+-              if (NULL != hca_ptr) {\r
+-                      dapl_hca_free(hca_ptr);\r
+-              }\r
+-      }\r
+-}\r
+-\r
+-/*\r
+- *\r
+- * This function is called by the registry to de-initialize a provider\r
+- *\r
+- */\r
+-void DAT_API\r
+-DAT_PROVIDER_FINI_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info)\r
+-{\r
+-      DAT_PROVIDER *provider;\r
+-      DAT_RETURN dat_status;\r
+-\r
+-      dat_status =\r
+-          dapl_provider_list_search(provider_info->ia_name, &provider);\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dat_registry_add_provider failed: %x\n",\r
+-                           dat_status);\r
+-              return;\r
+-      }\r
+-\r
+-      dat_status = dat_registry_remove_provider(provider, provider_info);\r
+-      if (DAT_SUCCESS != dat_status) {\r
+-              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+-                           "dat_registry_add_provider failed: %x\n",\r
+-                           dat_status);\r
+-      }\r
+-\r
+-      /*\r
+-       * free HCA memory\r
+-       */\r
+-      dapl_hca_free(provider->extension);\r
+-\r
+-      (void)dapl_provider_list_remove(provider_info->ia_name);\r
+-\r
+-#if defined(_WIN32) || defined(_WIN64)\r
+-      /* cleanup DAPL library - relocated here from OSD DLL context as the IBAL\r
+-       * calls hung in the DLL context?\r
+-       */\r
+-      dapl_fini();\r
+-#endif\r
+-}\r
+-\r
+-/*\r
+- * Local variables:\r
+- *  c-indent-level: 4\r
+- *  c-basic-offset: 4\r
+- *  tab-width: 8\r
+- * End:\r
+- */\r
++/*
++ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
++ *
++ * This Software is licensed under one of the following licenses:
++ *
++ * 1) under the terms of the "Common Public License 1.0" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/cpl.php.
++ *
++ * 2) under the terms of the "The BSD License" a copy of which is
++ *    available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/bsd-license.php.
++ *
++ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
++ *    copy of which is available from the Open Source Initiative, see
++ *    http://www.opensource.org/licenses/gpl-license.php.
++ *
++ * Licensee has the right to choose one of the above licenses.
++ *
++ * Redistributions of source code must retain the above copyright
++ * notice and one of the license notices.
++ *
++ * Redistributions in binary form must reproduce both the above copyright
++ * notice, one of the license notices in the documentation
++ * and/or other materials provided with the distribution.
++ */
++
++/**********************************************************************
++ * 
++ * MODULE: dapl_init.c
++ *
++ * PURPOSE: Interface Adapter management
++ * Description: Interfaces in this file are completely described in
++ *            the DAPL 1.1 API, Chapter 6, section 2
++ *
++ * $Id:$
++ **********************************************************************/
++
++#include "dapl.h"
++#include <dat2/dat_registry.h>        /* Provider API function prototypes */
++#include "dapl_hca_util.h"
++#include "dapl_init.h"
++#include "dapl_provider.h"
++#include "dapl_mr_util.h"
++#include "dapl_osd.h"
++#include "dapl_adapter_util.h"
++#include "dapl_name_service.h"
++#include "dapl_timer_util.h"
++#include "dapl_vendor.h"
++
++/*
++ * dapl_init
++ *
++ * initialize this provider
++ * includes initialization of all global variables
++ * as well as registering all supported IAs with the dat registry
++ *
++ * This function needs to be called once when the provider is loaded.
++ *
++ * Input:
++ *    none
++ *
++ * Output:
++ *    none
++ *
++ * Return Values:
++ */
++void dapl_init(void)
++{
++      DAT_RETURN dat_status;
++
++      /* set up debug type */
++      g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE",
++                                            DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN);
++      /* set up debug destination */
++      g_dapl_dbg_dest = dapl_os_get_env_val("DAPL_DBG_DEST",
++                                            DAPL_DBG_DEST_STDOUT);
++
++      /* open log file on first logging call if necessary */
++      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)
++              openlog("libdapl", LOG_ODELAY | LOG_PID | LOG_CONS, LOG_USER);
++
++      dapl_log(DAPL_DBG_TYPE_UTIL, "dapl_init: dbg_type=0x%x,dbg_dest=0x%x\n",
++               g_dapl_dbg_type, g_dapl_dbg_dest);
++
++      /* See if the user is on a loopback setup */
++      g_dapl_loopback_connection = dapl_os_get_env_bool("DAPL_LOOPBACK");
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n",
++                   g_dapl_loopback_connection ? "" : "NOT");
++
++      /* initialize verbs library */
++      dapls_ib_init();
++
++      /* initialize the timer */
++      dapls_timer_init();
++
++      /* Set up name services */
++      dat_status = dapls_ns_init();
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dapls_ns_init failed %d\n", dat_status);
++              goto bail;
++      }
++
++      /* initialize the provider list */
++      dat_status = dapl_provider_list_create();
++
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dapl_provider_list_create failed %d\n",
++                           dat_status);
++              goto bail;
++      }
++
++      return;
++
++      bail:
++      dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n");
++      return;
++}
++
++/*
++ * dapl_fini
++ *
++ * finalize this provider
++ * includes freeing of all global variables
++ * as well as deregistering all supported IAs from the dat registry
++ *
++ * This function needs to be called once when the provider is loaded.
++ *
++ * Input:
++ *    none
++ *
++ * Output:
++ *    none
++ *
++ * Return Values:
++ */
++void dapl_fini(void)
++{
++      DAT_RETURN dat_status;
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: ENTER (dapl_fini)\n");
++
++      dat_status = dapl_provider_list_destroy();
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dapl_provider_list_destroy failed %d\n",
++                           dat_status);
++      }
++
++      dapls_ib_release();
++      dapls_timer_release();
++
++      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Exit (dapl_fini)\n");
++
++      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)
++              closelog();
++
++      return;
++}
++
++/*
++ *
++ * This function is called by the registry to initialize a provider
++ *
++ * The instance data string is expected to have the following form:
++ *
++ * <hca name> <port number>
++ *
++ */
++void DAT_API
++DAT_PROVIDER_INIT_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info,
++                          IN const char *instance_data)
++{
++      DAT_PROVIDER *provider;
++      DAPL_HCA *hca_ptr;
++      DAT_RETURN dat_status;
++      char *data;
++      char *name;
++      char *port;
++      unsigned int len;
++      unsigned int i;
++
++      data = NULL;
++      provider = NULL;
++      hca_ptr = NULL;
++
++#if defined(_WIN32) || defined(_WIN64)
++      /* initialize DAPL library here as when called from DLL context in DLLmain()
++       * the IB (ibal) call hangs.
++       */
++      dapl_init();
++#endif
++
++      dat_status =
++          dapl_provider_list_insert(provider_info->ia_name, &provider);
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dat_provider_list_insert failed: %x\n",
++                           dat_status);
++              goto bail;
++      }
++
++      data = dapl_os_strdup(instance_data);
++      if (NULL == data) {
++              goto bail;
++      }
++
++      len = dapl_os_strlen(data);
++
++      for (i = 0; i < len; i++) {
++              if (' ' == data[i]) {
++                      data[i] = '\0';
++                      break;
++              }
++      }
++
++      /* if the instance data did not have a valid format */
++      if (i == len) {
++              goto bail;
++      }
++
++      name = data;
++      port = data + (i + 1);
++
++      hca_ptr = dapl_hca_alloc(name, port);
++      if (NULL == hca_ptr) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "%s() dapl_hca_alloc failed?\n");
++              goto bail;
++      }
++
++      provider->extension = hca_ptr;
++      dat_status = dat_registry_add_provider(provider, provider_info);
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dat_registry_add_provider failed: %x\n",
++                           dat_status);
++      }
++
++      bail:
++      if (NULL != data) {
++              dapl_os_free(data, len + 1);
++      }
++
++      if (DAT_SUCCESS != dat_status) {
++              if (NULL != provider) {
++                      (void)dapl_provider_list_remove(provider_info->ia_name);
++              }
++
++              if (NULL != hca_ptr) {
++                      dapl_hca_free(hca_ptr);
++              }
++      }
++}
++
++/*
++ *
++ * This function is called by the registry to de-initialize a provider
++ *
++ */
++void DAT_API
++DAT_PROVIDER_FINI_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info)
++{
++      DAT_PROVIDER *provider;
++      DAT_RETURN dat_status;
++
++      dat_status =
++          dapl_provider_list_search(provider_info->ia_name, &provider);
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dat_registry_add_provider failed: %x\n",
++                           dat_status);
++              return;
++      }
++
++      dat_status = dat_registry_remove_provider(provider, provider_info);
++      if (DAT_SUCCESS != dat_status) {
++              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
++                           "dat_registry_add_provider failed: %x\n",
++                           dat_status);
++      }
++
++      /*
++       * free HCA memory
++       */
++      dapl_hca_free(provider->extension);
++
++      (void)dapl_provider_list_remove(provider_info->ia_name);
++
++#if defined(_WIN32) || defined(_WIN64)
++      /* cleanup DAPL library - relocated here from OSD DLL context as the IBAL
++       * calls hung in the DLL context?
++       */
++      dapl_fini();
++#endif
++}
++
++/*
++ * Local variables:
++ *  c-indent-level: 4
++ *  c-basic-offset: 4
++ *  tab-width: 8
++ * End:
++ */
diff --git a/patches/refresh-temp b/patches/refresh-temp
deleted file mode 100644 (file)
index 882028b..0000000
+++ /dev/null
@@ -1,25963 +0,0 @@
-Bottom: e0a336baf5ecfc37b867ad87df4aa629ac448200
-Top:    62ea6b7cd0455394977f5f275edeb614bd8a602f
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   2010-09-20 15:13:27 -0700
-
-Refresh of dapl-update
-
----
-
-diff --git a/trunk/ulp/dapl2/ChangeLog b/trunk/ulp/dapl2/ChangeLog
-index 62225bd..22b2c63 100644
---- a/trunk/ulp/dapl2/ChangeLog
-+++ b/trunk/ulp/dapl2/ChangeLog
-@@ -1,5079 +1,5079 @@
--commit f85be199252d12d27c7b7814771a4ca83a43d0c8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Aug 9 14:25:09 2010 -0700\r
--\r
--    common: increase default logging to include warnings\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 59489448a7918ab2a1a4b9bcac7e4661cdd97a23\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Aug 9 14:19:50 2010 -0700\r
--\r
--    common: add more debug levels for cm logging\r
--    \r
--    DAPL_DBG_TYPE_CM_EST   = 0x8000,\r
--    DAPL_DBG_TYPE_CM_WARN  = 0x10000\r
--    \r
--    Add level for connection establishment and events\r
--    and for retries/timer events.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 70c509bca8409d55ad7c4a248f453956d163778b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Aug 2 09:51:30 2010 -0700\r
--\r
--    common: cleanup CR linkings after DTO error on EP\r
--    \r
--    Add cleanup to remove CR from SP and EP\r
--    during DTO errors in dapli_evd_cqe_to_event.\r
--    \r
--    dapl_sp_remove_ep needs to remove cr_ptr\r
--    reference from EP before freeing cr object.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 319430b3bbfb8692dd3d21a21633bfee74cf5b7c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Aug 2 09:49:23 2010 -0700\r
--\r
--    ucm: cleanup CM debug warning messages\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7118731a890e9188bb02dc7a5b21ffd832855e9e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jul 23 15:17:53 2010 -0700\r
--\r
--    scm, ucm: improperly handles pkey check/query in host order\r
--    \r
--    Convert consumer input to network order before verbs\r
--    query pkey check.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit c5504925b8b98006f421d53475e8ecd55b76f9dd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jul 12 15:57:34 2010 -0700\r
--\r
--    The linux compatability header file _errno.h is moving out of verbs.h.\r
--    Include _errno.h in the windows osd header files, similar to how\r
--    errno.h is included in the linux osd header files.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 455e9d6d0aeb753a9ecb4a130b0b237e1ffd4146\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 30 12:03:41 2010 -0700\r
--\r
--    windows: update SOURCES files to link winverbs.lib, which is\r
--    needed for common ofa providers.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit b441934f5e55582ef01a91c01da720334345a452\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jun 17 12:58:22 2010 -0700\r
--\r
--    Release 2.0.29\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 6c6a482b8ad33d134f0631019b249bd0fea71007\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jun 17 12:40:21 2010 -0700\r
--\r
--    scm, ucm: add pkey, pkey_index, sl override for QP's\r
--    \r
--    On a per open basis, add environment variables\r
--    DAPL_IB_SL and DAPL_IB_PKEY and use on\r
--    connection setup (QP modify) to override default\r
--    values of 0 for SL and PKEY index. If pkey is\r
--    provided then find the pkey index with\r
--    ibv_query_pkey for dev_attr.max_pkeys.\r
--    Will be used for RC and UD type QP's.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 876942781e9bf72302184f3534a2ddc4068550ac\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jun 10 11:40:45 2010 -0700\r
--\r
--    cma: remove dependency on rdma_cma_abi.h\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b34ea37650b5eefeedfc463345775ff568df259e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 2 14:13:05 2010 -0700\r
--\r
--    configure: need a false conditional for verbs attr.link_layer member check\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 977f11871d3d4e98f602f890ade1c31cf4169c9c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 2 10:05:03 2010 -0700\r
--\r
--    ucm: incorrectly freeing port on passive side after reject\r
--    \r
--    cm_release was incorrectly freeing a client port\r
--    assuming it was the server listening port. Move\r
--    the listening port cleanup to remove_conn_listner\r
--    and only cleanup client ports in cm_release.\r
--    \r
--    Error Messages indicating problem:\r
--    \r
--      CM_REQ retry 1 [lid, port, qpn]: 9 ff9a 340085 -> 9 6fa 34004e Time(ms) 1999 > 1600\r
--      DUPLICATE: op REQ st CM_CONNECTED [lid, port, qpn]: 9 6fa 0x0 <- 0x9 ff9a 0x340085\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7aedfb1e9dcb9e2841ebe3496bb9aae33c1f6a5b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 2 09:45:42 2010 -0700\r
--\r
--    ucm: modify debug CM output for consistency, all ports, qpn in hex\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 8e776ff0621cee1824be224b7a32f79e89b0ebc2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 24 16:44:25 2010 -0700\r
--\r
--    Release 2.0.28\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 8fdbd949ef464aa57b13743ab087ea72f035fbc3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 24 16:28:05 2010 -0700\r
--\r
--    config: add conditional check for new verbs port_attr.link_layer\r
--    \r
--    Check for link_layer type ETHERNET and set global for GID\r
--    configuration on modify QP.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 1ce0875fb2ac6120cfee006b48a20a4ec38f599b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 24 10:30:28 2010 -0700\r
--\r
--    dat.conf: update manpage with latest provider information, add examples\r
--    \r
--    Add information regarding OpenFabrics provider choices\r
--    and explain cma, scm, and ucm providers.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9c42d5872feb07f25f003e01263a3062ebc3bdbb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 19 16:38:53 2010 -0700\r
--\r
--    cma, scm: new provider entries for Mellanox RDMA over Ethernet device\r
--    \r
--    Add options for netdev eth2 and eth3 for cma and for device mlx4_0 port 1 and 2 for scm.\r
--    \r
--    ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" ""\r
--    ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" ""\r
--    ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" ""\r
--    ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" ""\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit d947e05317fe7fef19c90f772ec8f458ff52b196\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 19 15:17:58 2010 -0700\r
--\r
--    dapltest: server info devicename is not large enough for dapl_name storage\r
--    \r
--    Server info device name is a 80 char array but the dapl device name\r
--    that is copied is 256 bytes. Increase started_server.devicename definition.\r
--    Chalk one up for windows SDK OACR (auto code review).\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit c7a7a886af194cf735ee1eb62d9e14967d51249a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 19 14:48:49 2010 -0700\r
--\r
--    windows: comp_channel.cpp is included by util.c in the openib_common.\r
--    \r
--    Remove it from device.c in individual providers to avoid\r
--    duplicate definitions.\r
--    \r
--    Line endings were corrected to linux format from windows as part of\r
--    the change.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit bcaa400778d14a977d5cd224056baa0cff06126d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 19 14:45:55 2010 -0700\r
--\r
--    windows: need to include linux directory to pick up _errno.h\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit c616a8549db461e39feed71f0f10228313d17b90\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 17 16:22:30 2010 -0700\r
--\r
--    scm: check for hca object before signaling thread\r
--    \r
--    There may not be an hca object attached to cm object\r
--    when freeing during cleanup.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 1dbba72741da267f71903a9f2ec03628f3e8a47a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 17 16:15:21 2010 -0700\r
--\r
--    scm, cma: fini code can be called multiple times and hang via fork\r
--    \r
--    The providers should protect against forked child exits and\r
--    not cleanup until the parent init actually exits. Otherwise,\r
--    the child will hang trying to cleanup dapl thread. Modify to\r
--    check process id for proper init to fini cleanup and limit\r
--    cleanup to parent only.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b35cb1b16a9dda349dbb19bce9f9bd4afb7240a4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 14 16:20:52 2010 -0700\r
--\r
--    scm: add option to use other network devices with environment variable DAPL_SCM_NETDEV\r
--    \r
--    New environment variable can be used to set the netdev\r
--    for sockets to use instead of the default network device\r
--    returned using gethostname.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit cfdf8bb8951b1c19b8e42d58e4ec26070fdc078e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 14 10:27:50 2010 -0700\r
--\r
--    scm: cr_thread occasionally segv's when disconnecting all-to-all MPI static connections\r
--    \r
--    Note: no valid calltrace for segv on cr_thread because\r
--    of state changing in switch statement from another\r
--    thread, jumped unknown location.\r
--    \r
--    Program received signal SIGSEGV, Segmentation fault.\r
--    [Switching to Thread 0x41a65940 (LWP 1328)]\r
--    0x00002b2e7d9d5134 in ?? ()\r
--    \r
--    Add cm object locking on all state change/checking. When\r
--    freeing CM object wakeup cr_thread to process\r
--    state change to CM_FREE.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 4b04afc32940ac42fb2a9bc789a537b527d149fe\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu May 13 10:31:17 2010 -0700\r
--\r
--    scm: SOCKOPT ERR Connection timed out on large clusters\r
--    \r
--    Large scale all to all connections on +1000 cores\r
--    the listen backlog is reached and SYN's are dropped\r
--    which causes the connect to timeout. Retry connect\r
--    on timeout errors.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 625369f991982f020c04156f312ecf2ecafd77b3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 10 12:46:17 2010 -0700\r
--\r
--    ucm: UD mode, active side cm object released to soon, the RTU could be lost.\r
--    \r
--    Will see following message with DAPL_DBG_TYPE set for Errors & Warnings (0x3):\r
--    ucm_recv: NO MATCH op REP 0x120 65487 i0x60005e c0x60005e < 0xd2 19824 0x60006a\r
--    \r
--    The cm object was released on the active side after the connection\r
--    was established, RTU sent. This is a problem if the RTU is lost\r
--    and the remote side retries the REPLY. The RTU is never resent.\r
--    Keep the cm object until the EP is destroyed.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 83eec7f19a7442fe568dea685cee7b02fef2f4d1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 10 12:35:51 2010 -0700\r
--\r
--    cma, ucm: cleanup issues with dat_ep_free on a connected EP without disconnecting.\r
--    \r
--    During EP free, disconnecting with ABRUPT close flag, the disconnect should wait\r
--    for the DISC event to fire to allow the CM to be properly destroyed upon return.\r
--    \r
--    The cma must also release the lock when calling the blocking rdma_destroy_id given\r
--    the callback thread could attempt to acquire the lock for reference counting.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit da83172db68d05f54b2c1c77b84ecf86dea0c693\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 28 15:37:27 2010 -0700\r
--\r
--    ucm: increase default UCM retry count for connect reply to 15\r
--    \r
--    On very large clusters UCM is timing out with retries at 10.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 5c710a197bb60268e99e8d1cd7fa26f89b366172\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 27 11:20:08 2010 -0700\r
--\r
--    scm: remove modify QP to ERR state during disconnect on UD type QP\r
--    \r
--    The disconnect on a UD type QP should not modify QP to error\r
--    since this is a shared QP. The disconnect should be treated\r
--    as a NOP on the UD type QP and only be transitioned during\r
--    the QP destroy (dat_ep_free).\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 64c8009f7ba48c22a6829862447ab5f67c66ba55\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Apr 8 16:32:02 2010 -0700\r
--\r
--    windows: remove static paths from dapltest scripts\r
--    \r
--    signed-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit 84b78b0b586ee25c7ab78e2c5f7f19a3ce3f21ee\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Apr 8 09:38:57 2010 -0700\r
--\r
--    common: EP links to EVD, PZ incorrectly released before provider CM objects freed.\r
--    \r
--    unlink/clear references after ALL CM objects linked to EP are freed.\r
--    Otherwise, event processing via CM objects could reference the handles\r
--    still linked to EP. After CM objects are freed (blocking) these handles\r
--    linked to EP are guaranteed not to refereence from underlying provider.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 297e149e7af631663ecc60472a3ee093a7f72059\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 7 11:12:21 2010 -0700\r
--\r
--    common: remove unnecessary lmr lkey hashing and duplicate lkey checking\r
--    \r
--    lmr lkey hashing is too restrictive given the returned lkey could be\r
--    the same value for different regions on some rdma devices. Actually,\r
--    this checking is really unecesssary and requires considerable overhead\r
--    for hashing so just remove hashing of lmr lkey's. Let verbs device\r
--    level do the checking and validation.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 96fba2ee7a0a1766f200c9486e62aad46d18bb09\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 29 12:20:34 2010 -0800\r
--\r
--    ibal: output completion code in deciaml & hex as intended\r
--    \r
--    sign-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit 753f7d35c814367f431deeb307e6decd933a8b5a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 15:02:44 2010 -0800\r
--\r
--    ucm: set timer during RTU_PENDING state change.\r
--    \r
--    The timer thread may pick up an unitialized timer\r
--    value and timeout before the reply was sent.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9fc851021d91b282054cf28b4f83f7e5d376f228\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 14:47:58 2010 -0800\r
--\r
--    ucm: fix issues with new EP to CM linking changes\r
--    \r
--    Add EP locking around QP modify\r
--    Remove release during disconnect event processing\r
--    Add check in cm_free to check state and schedule thread if necessary.\r
--    Add some additional debugging\r
--    Add processing in disconnect_clean for conn_req timeout\r
--    Remove extra CR's\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit a5da5e4dac52366a9fe9efeb9a128bd4511481e2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 14:18:06 2010 -0800\r
--\r
--    scm: add EP locking and cm checking to socket cm disconnect\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7f733cd1a9acd4b9b270a807673290362050053d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 09:44:44 2010 -0800\r
--\r
--    scm: new cm_ep linking broke UD mode over socket cm\r
--    \r
--    Add EP locking around modify_qp for EP state.\r
--    Add new dapli_ep_check for debugging EP\r
--    Cleanup extra CR's\r
--    Change socket errno to dapl_socket_errno() abstraction\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit a528267020972e0c449f240ba72a0cc80a5d372e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 09:17:01 2010 -0800\r
--\r
--    openib common: add some debug prints to help isolate QP type issues\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit fdfdc439d091c878c74d23b9ac46a3320379199d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 09:15:12 2010 -0800\r
--\r
--    common: dapl_event_str function missing 2 IB extended events\r
--    \r
--    Add all IB extended events in event string print function\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 2bf3eb939e9a584ae0fe2de70f16cdcca8acf014\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 16 09:12:11 2010 -0800\r
--\r
--    common: dat_ep_connect should not set timer UD endpoints\r
--    \r
--    connect for UD type is simply AH resolution and doesn't\r
--    need timed. The common code is not designed to handle\r
--    multiple timed events on connect requests so just ignore\r
--    timing UD AH requests.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 73ca06debe4735dfc11f44076a13dde079657b2e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 15 10:23:47 2010 -0800\r
--\r
--    ucm: fix error path during accept_usr reply failure\r
--    \r
--    if accept_usr fails when sending reply the EP was\r
--    being linked to CM instead of properly unlinked.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 944ef4445faceeb90bb61d4e377274ad0fd6711f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 8 13:56:28 2010 -0800\r
--\r
--    ibal: add missing windows makefile\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 1d53e8eb90e6f74b41e7767e1c71851ff4ec73fd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 8 12:53:45 2010 -0800\r
--\r
--    ibal: changes for EP to CM linking and synchronization.\r
--    \r
--    Windows IBAL changes to allocate and manage CM objects\r
--    and to link them to the EP. This will insure the CM\r
--    IBAL objects and cm_id's are not destroy before EP.\r
--    Remove windows only ibal_cm_handle in EP structure.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 4b939076aa32bb52957fcc6791e187c9433d4c24\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 24 12:00:07 2010 -0800\r
--\r
--    scm: add support for canceling conn request that times out.\r
--    \r
--    print warning message during timeout.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f38fc04d517ee6c0560b271298293c56cc619522\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 24 11:28:04 2010 -0800\r
--\r
--    scm, cma, ucm: consolidate dat event/provider event translation\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 41739dab38a4be8076ecd9e61b5e175cf91ab322\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 24 11:26:25 2010 -0800\r
--\r
--    common: missed linking changes from atomic to acquire/release\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7ff4f840bf1150fa2c2f541c93d810622ea9733b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 24 10:03:57 2010 -0800\r
--\r
--    common: add CM-EP linking to support mutiple CM's and proper protection during destruction\r
--    \r
--    Add linking for CM to EP, including reference counting, to insure syncronization\r
--    during creation and destruction. A cm_list_head has been added to the EP object to\r
--    support multiple CM objects (UD) per EP. If the CM object is linked to an EP it\r
--    cannot be destroyed.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit c9fbd6e7a8131d4077039d5da716b618727d4009\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Feb 23 16:26:41 2010 -0800\r
--\r
--    Release 2.0.27-1\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 454c27b1f357c7c3070e459b25d12929f86304ca\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 22 09:42:17 2010 -0800\r
--\r
--    windows: add scm makefile\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 66ac48d5280bcf0453760c6e22909de6b8519b6d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 22 09:41:13 2010 -0800\r
--\r
--    Windows does not require rdma_cma_abi.h, move the include from common code and to OSD file.\r
--    \r
--    Signed-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit c05c41c31f01e1ddef91e92998ca66d258fafe3d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Feb 19 14:52:01 2010 -0800\r
--\r
--    Windows patch to fix IB_INVALID_HANDLE name collision\r
--    \r
--    signed-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit 712e7e5ba71f8a4344dfff481a9be870eefefe25\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 8 13:49:35 2010 -0800\r
--\r
--    scm: dat_ep_connect fails on 32bit servers\r
--    \r
--    memcpy for remote IA address uses incorrect sizeof for a pointer type.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 3040fa78d7d22c8f76c88dc77cedde09f016eb67\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Feb 5 11:51:16 2010 -0800\r
--\r
--    undefined symbol: dapls_print_cm_list\r
--    \r
--    call prototype should be dependent on DAPL_COUNTERS.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit cbeebe422b952d679f49429be8ba045a62d7f4ac\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Feb 5 11:39:21 2010 -0800\r
--\r
--    Cleanup CM object lock before freeing CM object memory\r
--    \r
--    Running windows application verifiier for uDAPL validation\r
--    for all 3 providers. Cleanup memory lock leaks found\r
--    by verifier.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 855a8e4aa83fa2e4f7847122415106f49286f4ca\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 3 16:21:30 2010 -0800\r
--\r
--    destroy verbs completion channels created via ia_open or ep_create.\r
--    \r
--    Completion channels are created with ia_open for CNO events and\r
--    with ep_create in cases where DAT allows EP(qp) to be created with\r
--    no EVD(cq) and IB doesn't. These completion channels need to be\r
--    destroyed at close along with a CQ for the EP without CQ case.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 4da540591148e47dd912851cc7314776f2f7622e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 3 11:06:45 2010 -0800\r
--\r
--    Update Copyright file and include the 3 license files in distribution\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9011abd4b1470c65bfe81eef5a2f3a81060cec81\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Feb 2 14:43:03 2010 -0800\r
--\r
--    When copying private_data out of rdma_cm events, use the\r
--    reported private_data_len for the size, and not IB maximums.\r
--    This fixes a bug running over the librdmacm on windows, where\r
--    DAPL accessed invalid memory.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 5da33bb3b9c230c08492f85d13caa330ce65906e\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Jan 28 10:19:20 2010 -0800\r
--\r
--    dapl/cma: fix referencing freed address\r
--    \r
--    DAPL uses a pointer to reference the local and remote addresses\r
--    of an endpoint.  It expects that those addresses are located\r
--    in memory that is always accessible.  Typically, for the local\r
--    address, the pointer references the address stored with the DAPL\r
--    HCA device.  However, for the cma provider, it changes this pointer\r
--    to reference the address stored with the rdma_cm_id.\r
--    \r
--    This causes a problem when that endpoint is connected on the\r
--    passive side of a connection.  When connect requests are given\r
--    to DAPL, a new rdma_cm_id is associated with the request.  The\r
--    DAPL code replaces the current rdma_cm_id associated with a\r
--    user's endpoint with the new rdma_cm_id.  The old rdma_cm_id is\r
--    then deleted.  But the endpoint's local address pointer still\r
--    references the address stored with the old rdma_cm_id.  The\r
--    result is that any reference to the address will access freed\r
--    memory.\r
--    \r
--    Fix this by keeping the local address pointer always pointing\r
--    to the address associated with the DAPL HCA device.  This is about\r
--    the best that can be done given the DAPL interface design.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 66dbb5f20bf494eb3f5041655b478059165c5f1b\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Tue Jan 26 15:13:03 2010 -0800\r
--\r
--    dapl: move close device after async thread is done\r
--    \r
--    using it\r
--    \r
--    Before calling ibv_close_device, wait for the asynchronous\r
--    processing thread to finish using the device.  This prevents\r
--    a use after free error.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 560b235adc799fa710571ca63cbc3e4fa6374ff2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jan 11 09:03:10 2010 -0800\r
--\r
--    Release 2.0.26-1\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 73dfb32ace6aff2fdb21e54689342fd551822286\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Dec 22 14:00:33 2009 -0800\r
--\r
--    openib_common: add check for both gid and global routing in RTR\r
--    \r
--    check for valid gid pointer along with global route setting\r
--    during transition to RTR. Add more GID information to\r
--    debug print statement in qp modify call.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7aab18fd8ff3f201b0a4b6c76896667b29f103c4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Dec 4 12:31:22 2009 -0800\r
--\r
--    openib_common: remote memory read privilege set multi times\r
--    \r
--    duplicate setting of read privilege in dapls_convert_privileges\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 016e2c40b8ac2fe18993e9fb7122ecb9b439e5eb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Dec 4 12:25:30 2009 -0800\r
--\r
--    ucm, scm: DAPL_GLOBAL_ROUTING enabled causes segv\r
--    \r
--    socket cm and ud cm providers support QP modify with is_global\r
--    set and GRH. New v2 providers didn't pass GID information\r
--    in modify_qp RTR call and incorrectly byte swapped the already\r
--    network order GID. Add debug print of GID during global modify.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7b0c596c7b4ad619f65da9f79dcbc4376e651dde\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 24 22:16:58 2009 -0800\r
--\r
--    Release 2.0.25-1\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 3197bffff478ad7ff5eff9220fa0528e42e6b56e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 24 22:15:46 2009 -0800\r
--\r
--    winof scm: initialize opt for NODELAY setsockopt\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 8559ec069329249592f367b5b8f61427cbad0a46\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 24 11:29:46 2009 -0800\r
--\r
--    Release 2.0.25\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 0983c66cbd9511128c1fa221470c4c983903e420\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 24 08:58:44 2009 -0800\r
--\r
--    winof cma: windows definition for EADDRNOTAVAIL missing\r
--    \r
--    Signed-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit 4fbbcfa1d7bf7a843b27e351d35f3ffbc2ac4db8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 24 08:54:26 2009 -0800\r
--\r
--    scm: client side setsockopt NODELAY fails if data arrives before setting\r
--    \r
--    Move setsockopt before connect to avoid race with data.\r
--    Seems to fail on windows. Not seen on linux.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9dfa9a06d55101fed0773028ce7ab85330514c67\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Nov 18 09:52:40 2009 -0800\r
--\r
--    cma: setup_listener Cannot assign requested address\r
--    \r
--    Colliding with RDS port of 18634. rdma_cm can return\r
--    either EADDRINUSE or EADDRNOTAVAIL if the bind fails.\r
--    Add check for either and return proper DAT_CONN_QUAL_IN_USE.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 0698fb56d533a5225cbc3a5a4b8ab2e2d56b7502\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Nov 18 09:43:38 2009 -0800\r
--\r
--    common: seg fault in dapl_evd_wait with multi-thread application using CNO's.\r
--    \r
--    If we are dealing with event streams besides a CQ event stream,\r
--    be conservative and set producer side locking.  Otherwise, no.\r
--    Check for CNO is missing, CNO is not considered CQ event stream.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 4d26a280572a58248b0796e4d5ed01ea5d67be46\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Nov 18 09:37:48 2009 -0800\r
--\r
--    ucm: inbound DREQ/DREP handshake should transition QP.\r
--    \r
--    During release, when receiving a disconnect request from remote peer\r
--    instead of a disconnect call from the client, the QP didn't get properly\r
--    set in ERR state and didn't flush the queue during disconnect processing.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 87965cd15bbfa38b00ed2d77a4ea5a76f76cf4a3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Nov 2 08:24:53 2009 -0800\r
--\r
--    winof: Remove duplicate include of comp_channel.cpp from cm.c as it is included in opensm_ucb/device.c.\r
--    \r
--    Signed-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit 737fa288b72fad19a1fc3e762eb9f2c471ce6ddd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 30 13:19:21 2009 -0800\r
--\r
--    Release 2.0.24\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9fe7506ff9ddf1ae6297cfc6a9dd4d6a57e1939e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 30 12:57:22 2009 -0800\r
--\r
--    winof: Utilize WinOF version of inet_ntop() for Windows OSes which do not support inet_ntop().\r
--    \r
--    Signed-off-by: stan smith <stan.smith@intel.com>\r
--\r
--commit d56c645a2bf234e9e0cf215b112c2aa9d5e01945\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 30 07:17:26 2009 -0800\r
--\r
--    ucm: windows build issue with new CQ completion channel\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 2d2e7e1e185c08542ee31b0e77561a1eeb4bde6c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 30 06:35:33 2009 -0800\r
--\r
--    winof: add ucm provider to windows build\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 94b2206093607214e0a9709651460692e8196e1c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 30 06:32:56 2009 -0800\r
--\r
--    winof: add missing build files for ibal, scm\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 66b76d7a8035b9164b69781d7630a0c77ce1bb5a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 28 09:52:50 2009 -0800\r
--\r
--    scm: connection peer resets under heavy load, incorrect event on error\r
--    \r
--    Under heavy load, we get a peer reset from the remote stack. In this\r
--    case retry the socket connection for this QP setup.\r
--    \r
--    Add debugging with PID's and socket ports to help isolate\r
--    these types of socket scaling issues.\r
--    \r
--    Report correct UD event during error, check remote_ah creation.\r
--    \r
--    Fix dapl_poll return codes for single event type only.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f8108a9bda0200355107fdd6c43cb5885f47d648\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 28 09:47:37 2009 -0800\r
--\r
--    ucm: increase default reply and rtu timeout values.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9c13d0d01c78eeb5071e802fbb53811cdb377059\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 28 07:48:20 2009 -0800\r
--\r
--    ucm: change some debug message levels and add check for valid UD REPLY during retries.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 1c404bb3dcc0a45e21ef3aa973d59714413beae0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 27 10:37:45 2009 -0800\r
--\r
--    ucm: increase timers during subsequent retries\r
--    \r
--    check/process create_ah errors during connect phase\r
--    cleanup some debug messaging.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit cd8c48586f53e846de4fbe10994b73ba457f6406\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Oct 19 10:38:36 2009 -0700\r
--\r
--    ucm, scm: address handles need destroyed when freeing Endpoints with UD QP's.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit ce19f5744c0dd9461c09d999b309e8f0e2242767\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 16 14:42:00 2009 -0700\r
--\r
--    openib_common: ignore pd free errors, clear pd_handle and return.\r
--    \r
--    some older adapters have some issues\r
--    with pd free so just clear handle and return\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 81f5ac17d9039e2edcd8324f7d5ed5f66fcff9f2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 16 08:52:21 2009 -0700\r
--\r
--    ucm: using UD type QP's, ucm reports wrong reject event when user rejects AH resolution request.\r
--    \r
--    During rejects, both usr and ucm internal, the qp_type does not get initialized\r
--    so the check for UD type QP messages fail on active side and the wrong\r
--    event gets generated. Initialize saddr.ib information before sending reject\r
--    back to active side.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f0214e5a7a81a68819d308cb921eb75f5246207d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 16 07:57:25 2009 -0700\r
--\r
--    ucm, scm, cma: Fix CNO support on DTO type EVD's\r
--    \r
--    EVD wait_object should be used for CNO processing\r
--    and not the direct CQ event channels. Add proper\r
--    checking for DTO type EVD's with CNO at wait\r
--    and wakeup.\r
--    \r
--    UCM missing support for collective EVD's under a\r
--    CNO. Add support to create common channel for\r
--    collective EVD's during device open. Add support\r
--    in cm_thread to check this channel. Also,\r
--    during disconnect, move QP to error to properly\r
--    flush queue instead of moving to reset and init.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 960950a7d9f5437dd831bd56ca2ad0c06cb4e324\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Oct 15 09:19:45 2009 -0700\r
--\r
--    ucm: fix lock init bug in ucm_cm_find\r
--    \r
--    the lock should be setup as pointer to lock\r
--    not lock structure. Cleanup lock and list\r
--    in cm_find function and cm_print function.\r
--    \r
--    Add debug aid by passing process id in\r
--    msg resv area. cleanup cr references\r
--    and change to cm for consistency.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f86fec772f2d82eaf60228d288b295e0b7b86c59\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 14 10:03:47 2009 -0700\r
--\r
--    ucm: fix build problem with latest windows ucm changes\r
--    \r
--    define dapls_thread_signal as inline\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 87b6c8ba92f3063a35d49bdb49d6cd0a5100a36c\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Oct 14 09:34:22 2009 -0700\r
--\r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 9fdd8d74f2cba83e9cf513256933f5241495c1da\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Oct 14 09:34:18 2009 -0700\r
--\r
--    The HCA should not be closed until all resources have been released.\r
--    This results in a hang on windows, since closing the device frees\r
--    the event processing thread.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit f9833db469f2d686842bb1d52d1ea53b74fa72a8\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Oct 14 09:34:13 2009 -0700\r
--\r
--    Fix build warning when compiling on 32-bit systems.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit c80515bd4b1bd11a125dc17e3f7db44240ee1fff\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Oct 14 09:34:07 2009 -0700\r
--\r
--    Trying to deregister the same memory region twice leads to an\r
--    application crash on windows.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 6aa2c0d901daa9cfca7e771c1df2ead074d230bd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 14 07:59:23 2009 -0700\r
--\r
--    dat: reduce debug message level when parsing for location of dat.conf\r
--    \r
--    Don't output failover to default /etc/dat.conf from\r
--    sysconfdir at ERROR level. Reduce to DAT_OS_DBG_TYPE_SR.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e4038e078747201b57203f16ba793b7fc22c12f2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Oct 8 16:23:22 2009 -0700\r
--\r
--    ucm: update ucm provider for windows environment\r
--    \r
--    add dapls_thread_signal abstraction and a new\r
--    cm_thread function specific for windows.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit d80ce42390eb57b9c4f816b4df063f90bd5699bc\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Oct 8 16:02:52 2009 -0700\r
--\r
--    ucm: add timer/retry CM logic to the ucm provider\r
--    \r
--    add reply, rtu and retry count options via\r
--    environment variables. Times in msecs.\r
--    DAPL_UCM_RETRY 10\r
--    DAPL_UCM_REP_TIME 400\r
--    DAPL_UCM_RTU_TIME 200\r
--    \r
--    Add RTU_PENDING and DISC_RECV states\r
--    \r
--    Add check timer code to the cm_thread\r
--    and the option to the select abstaction\r
--    to take timeout values in msecs.\r
--    DREQ, REQ, and REPLY will all be timed\r
--    and retried.\r
--    \r
--    Split out reply code and disconnect_final\r
--    code to better facilitate retry timers.\r
--    Add checking for duplicate messages.\r
--    \r
--    Added new UD extension events for errors.\r
--    DAT_IB_UD_CONNECTION_REJECT_EVENT\r
--    DAT_IB_UD_CONNECTION_ERROR_EVENT\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 1186bfc949f4bb7278c30c2c59b7fcb6d5142638\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 2 14:49:52 2009 -0700\r
--\r
--    Release 2.0.23\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit a5f1220cfd96983c9c89a595d80fab7ddcb1a954\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 2 14:48:15 2009 -0700\r
--\r
--    cma: cannot reuse the cm_id and qp for new connection, must reallocate a new one.\r
--    \r
--    When merging common code base the dapls_ib_reinit_ep mistakely\r
--    modified QP to reset then init for all providers. Will\r
--    not work for rdma_cm (cma provider) since the cm_id cannot\r
--    be reused.  Add build check for _OPENIB_CMA_ to pull in correct\r
--    free and reallocate method for reinit_ep.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 7b07435495de0938e59be064fe8642cfd739f1ac\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 2 13:50:12 2009 -0700\r
--\r
--    scm, cma: update DAPL cm protocol revision with latest address/port changes\r
--    \r
--    CM protocol changed, roll revision to 6.\r
--    The socket cm could be competing with address space if\r
--    application is using sockets above to exchange information\r
--    like dapltest, and MPI consumers. Adjust port on listen\r
--    and connect to reduce the chance of port collision with\r
--    application above.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9cc1e76b672f7ff1231b4d113bd4dd1a016d1410\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 2 12:47:37 2009 -0700\r
--\r
--    ucm: modify IB address format to align better with sockaddr_in6\r
--    \r
--    Restructure the dcm_addr union to map the IB side\r
--    closer to sockaddr6 and initialize family to\r
--    AF_INET6 to insure callee allocates enough memory\r
--    for ucm dat_ia_address type. Put qpn in flowinfo\r
--    and gid in sin6_addr. Change the test suites\r
--    to print address information based on AF_INET\r
--    or AF_INET6 instead of using specific IB address\r
--    union from the provider.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f50dbe6e82bd471845adf27829b2e07234a0a86a\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Sep 30 14:29:03 2009 -0700\r
--\r
--    Add definition for getpid similar to that used by the other dtest apps.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 51147412fad72c00115b595955760e80ff0be7d5\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Sep 30 14:28:57 2009 -0700\r
--\r
--    WinOF provides a common implementation of gettimeofday that should\r
--    be used instead.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 732fc84cee036126282715ea157bdb619fc11ec7\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Wed Sep 30 14:27:50 2009 -0700\r
--\r
--    The completion manager was updated to provide an abstraction that\r
--    better mimicked how fd's were used.  Update dapl to use this\r
--    abstraction, rather than the older completion manager api.\r
--    \r
--    This helps minimize changes between linux and windows.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit fc1855b7738838d3865389405f017b87d223f743\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 30 14:26:47 2009 -0700\r
--\r
--    dtestcm: remove IB verb definitions\r
--    \r
--    Remove gid and qp_type references from test app.\r
--    Print address infomation in sockaddr and\r
--    ucm provider format with qpn and lid.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 36a885d4267be7b3c6c1086372d321121ae03dee\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 30 10:44:14 2009 -0700\r
--\r
--    dtest, dtestx: remove IB verb definitions\r
--    \r
--    remove gid and qp_type checking from test suite.\r
--    Print address infomation in sockaddr and\r
--    ucm provider format with qpn and lid.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 23445bbbd3a09f7f5e666a000d5c7c3b22dd95b3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 28 10:59:36 2009 -0700\r
--\r
--    scm: tighten up socket options to insure similiar behavior on Windows and Linux.\r
--    \r
--    Add IPPROTO_TCP to create socket. Specify device IP address\r
--    when binding instead of INADDR_ANY and remove setsocketopt\r
--    REUSEADDR on the listen socket to avoid any issues with\r
--    portability. Don't want duplicate port bindings.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b31b64d60abe7c6c1a83484db97176d225076b30\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 28 10:46:26 2009 -0700\r
--\r
--    cma: improve serialization of destroy and event processing\r
--    \r
--    WinOF testing with slightly different scheduler and verbs\r
--    showed some issues with cleanup. Add better protection around\r
--    destroy and event processing thread.\r
--    \r
--    Remove destroy flag and add refs counting to conn objects\r
--    to block destroy until all references are cleared. Add\r
--    locking aroung ref counting and passive and active\r
--    event processing.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit a4adf463695ba75beaa1fe79d514346bf5fe2cb5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 28 10:42:52 2009 -0700\r
--\r
--    scm: improve serialization of destroy and state changes\r
--    \r
--    WinOF testing with slightly different scheduler and verbs\r
--    showed some issues with cleanup. Add better protection around\r
--    destroy and move state change before socket send to insure\r
--    correct state in multi-thread environment targeting the same\r
--    device on send and recv.\r
--    \r
--    Change DCM_RTU_PENDING to DCM_REP_PENDING and\r
--    and add static definition to local routines for better\r
--    readability.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 29358ccc587db55fe5f5a1b14eed9e0e31f5f02c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Sep 17 08:56:06 2009 -0700\r
--\r
--    common: no cleanup/release code for timer thread\r
--    \r
--    dapl_set_timer() creates a thread to process timers for dat_ep_connect\r
--    but provides no mechanism to destroy/exit during dapl library unload.\r
--    Timers are initialized in library init code and should be released\r
--    in the fini code. Add a dapl_timer_release call to the dapl_fini\r
--    function to check state of timer thread and destroy before exiting.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e287ce12f5b0108ef83186aae305f25af8cdd02c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Sep 17 08:53:29 2009 -0700\r
--\r
--    scm, cma: dapli_thread doesn't always get teminated on library close.\r
--    \r
--    DAPL doesn't actually wait for the async processing thread to exit before\r
--    allowing the library to close.  It will wait up to 10 seconds, which under\r
--    heavy load isn't enough time.  Since the thread is created by an application\r
--    level thread, it will continue to run as long as the application runs.  But\r
--    if the application closes the library, then all library data and code is\r
--    invalid, which can result in the thread running something that's not\r
--    library code and accessing freed memory.\r
--    \r
--    With this change, I was able to run mpi ping-pong, 16 ranks on a single\r
--    system (scm provider) without crashes 1300 times.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 5bffe521c6ad7a5ce10457a5d7b25814522a0cde\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 9 13:10:35 2009 -0700\r
--\r
--    ucm: tighten up locking with CM processing, state changes\r
--    \r
--    tighten up locking on CM processing and state changes\r
--    and reduce the send completion threshold to 50 from 100\r
--    to replenish the request message faster.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e38daa8448bc3b73c53e54ffc9ac47b9cfc2af89\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 9 09:44:03 2009 -0700\r
--\r
--    ucm: For UD type QP's, return CR p_data with CONN_EST event on passive side.\r
--    \r
--    Intel MPI uses the p_data provided with CONN_EST as a reference to the\r
--    UD pair and remote rank. The ucm provider was overwriting the CR p_data\r
--    with the ACCEPT p_data. Change to save CR p_data but also provide\r
--    storage for user provided ACCEPT p_data in case the REPLY is lost\r
--    and needs retransmitted.\r
--    \r
--    p_data size was provided to event processing in network order\r
--    instead of host order.\r
--    \r
--    For new QP's create new address handles and do not use\r
--    existing AH's created for the CM. Different PD's are\r
--    associated with each.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 0bc6a0954bc1a1a61e1b1cbc5c280f69ed168453\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 8 09:14:46 2009 -0700\r
--\r
--    ucm: cleanup extra cr/lf\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 6e7df65a884b4e068135e64dcb3ec660f4c7ab14\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 8 09:11:37 2009 -0700\r
--\r
--    ucm: fix issues with UD QP's.\r
--    \r
--    private data size not in host order when processing\r
--    connection events.\r
--    \r
--    ud extentions event should include original ia_addr\r
--    and qpn used during connection and not the IB qpn.\r
--    \r
--    ucm QP service resource cleanup in wrong order.\r
--    \r
--    cleanup extra cr/lf device.c\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e7c3090945c13f80abb929643fc975465afeeb53\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Sep 3 10:45:56 2009 -0700\r
--\r
--    winof: Convert windows version of dapl and dat libaries to use private heaps.\r
--    \r
--    This allows for better support of memory registration caching by upper\r
--    level libaries (MPI) that use SecureMemoryCacheCallback.\r
--    \r
--    It also makes it easier to debug heap corruption issues.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit bc3c8a34558880c8d09a03e3eb7c3f50d7762c67\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 2 14:01:51 2009 -0700\r
--\r
--    dtest, dtestx: modifications for UD QP testing with ucm provider.\r
--    \r
--    remote_addr is wrong for IP remote address.\r
--    \r
--    The dtestx requires the server connect back to the client\r
--    for the UD test. With the ucm provider you need to provide\r
--    the QPN and the LID which you cannot get until the dtest\r
--    client starts. So, for now, don't support UD testing\r
--    on UCM providers.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e4555143ca71ebe18d8c9f027e2e7a5282088a30\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 2 13:54:59 2009 -0700\r
--\r
--    scm, ucm: UD QP support was broken when porting to common openib code base.\r
--    \r
--    create remote_ah was moved out of modify_qp_state function but not\r
--    included in the RTU and ACCEPT code for UD QP's. qp type check\r
--    should be on daddr not saddr in ucm cm code.\r
--    \r
--    QP number must be converted to host order before supplying remote_ah,\r
--    and qp number to consumer.\r
--    \r
--    Modify QP state to RTR for UD QP mask setting incorrect.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 375d368494bb2f9bb44c82073abc60e01ac28615\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 1 13:02:24 2009 -0700\r
--\r
--    cma: cleanup warning with unused local variable, ret, in disconnect\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 72d1c0c984919809ecd94b2e4ede31ec56668518\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 1 12:36:31 2009 -0700\r
--\r
--    cma: remove debug message after rdma_disconnect failure\r
--    \r
--    DAPL automatically calls rdma_disconnect() when a disconnect request is\r
--    received.  If the user also calls disconnect, that calls rdma_disconnect() as\r
--    well, but the connection has already been disconnected by DAPL and is no longer\r
--    valid.  The result is that the user's call to rdma_disconnect() will fail.  Do\r
--    not display an error message if this occurs.\r
--    \r
--    Locking could be added to prevent calling rdma_disconnect() multiple times, but\r
--    since the librdmacm provides synchronization to trap this, we might as well take\r
--    advantage of it.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 290c568030da6df398a4afb932b5d4f9bd585c26\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 1 12:27:43 2009 -0700\r
--\r
--    scm: socket errno check needs O/S dependent wrapper\r
--    \r
--    Intel MPI checks the uDAPL error code when calling dat_psp_create() to see if\r
--    the port number that it provides is in use or not.  Convert winsock error codes\r
--    to unix errno values.\r
--    \r
--    This fixes the following error reported by Intel MPI:\r
--    'DAPL provider is not found and fallback device is not enabled'\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 03b6d1b58ae03058a509c54ffe27147cc44d1851\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 1 12:13:16 2009 -0700\r
--\r
--    dapltest: update script files for WinOF\r
--    \r
--    Cleanup 64-bit paths now that WinOF is always installed into '\Program Files\WinOF'.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e38585be89e9fa8f139002a3fe1a82eb86438f93\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Sep 1 12:10:21 2009 -0700\r
--\r
--    cma: conditional check for new rdma_cm definition.\r
--    \r
--    RDMA_CM_EVENT_TIMEWAIT_EXIT is new to OFED 1.4\r
--    add conditional check so dapl can build and run\r
--    against older OFED 1.3 stacks\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 83af586b77aa905b63de6dd6010cd60e91487a9e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Aug 20 09:13:43 2009 -0700\r
--\r
--    Release 2.0.22\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 48bc0dc95093ccbfe5e01cef4877c128e2caaf77\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Aug 20 09:12:47 2009 -0700\r
--\r
--    dapltest: add mdep processor yield and use with dapltest\r
--    \r
--    Be thread scheduler friendly and release the current thread thus allowing other threads to run.\r
--    \r
--    Signed off by Stan Smith stan.smith@intel.com\r
--\r
--commit e13f255a06b9d2a2ed4eec9a62f9fe105d0c26d7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Aug 18 10:15:15 2009 -0700\r
--\r
--    ucm: Add new provider using a DAPL based IB-UD cm mechanism for MPI implementations.\r
--    \r
--    New provider uses it's own CM protocol on top of IB-UD queue pairs.\r
--    During device open, this provider creates a UD queue pair and\r
--    returns local address information via dat_ia_query. This 24 byte\r
--    opaque address must be exchange out-of-band before connecting to a\r
--    server via dat_ep_connect. This provider is targeted for MPI\r
--    implementations that already exchange address information\r
--    during mpi_init phase.\r
--    \r
--    Future release may provide some ARP mechanism via multicast.\r
--    \r
--    dtest, dtestx, and dtestcm was modified to report the lid and qpn\r
--    information on the server side so you can provide appropriate\r
--    destination address information for the client test suite.\r
--    \r
--    dapltest will not work with this provider.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 38d224dd95896c7e60f0bc0ffa52b26ab78f489b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Aug 4 20:54:12 2009 -0700\r
--\r
--    Release 2.0.21\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit ed4999a26043c9c3c73c792b21d24ced1df1553c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Aug 4 20:49:09 2009 -0700\r
--\r
--    scm: Fix disconnect. QP's need to move to ERROR state in\r
--    order to flush work requests and notify consumer. Moving to\r
--    RESET removed all requests but did not notify consumer.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 512f1d7a480f06a1fa491d21870e560ad111c4d0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Aug 4 20:48:03 2009 -0700\r
--\r
--    modify dtest.c to cleanup CNO wait code and consolidate into\r
--    collect_event() call. After waking up from CNO wait the\r
--    consumer must check all EVD's. The EVD's under the CNO\r
--    could be dropped if already triggered or could come in any order.\r
--    DT_RetToString changed to DT_RetToStr and DT_EventToSTr\r
--    changed to DT_EventToStr for consistency.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 024e36975d37a1556bf68145e1573f637d269bfc\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Aug 4 20:47:17 2009 -0700\r
--\r
--    CNO events, once triggered will not be returned during the cno wait.\r
--    Check for triggered state before going to sleep in cno_wait. Reset\r
--    triggered EVD reference after reporting.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 6d6c72a49158d10825929111d6b4df1c6d2bb589\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sun Aug 2 14:21:09 2009 -0700\r
--\r
--    CNO support broken in both CMA and SCM providers.\r
--    \r
--    CQ thread/callback mechanism was removed by mistake. Still\r
--    need indirect DTO callbacks when CNO is attached to EVD's.\r
--    \r
--    Add CQ event channel to cma provider's thread and add\r
--    to select for rdma_cm and async channels.\r
--    \r
--    For scm provider there is not easy way to add this channel\r
--    to the select across sockets on windows. So, for portablity\r
--    reasons 2 thread is started to process the ASYNC and\r
--    CQ channels for events.\r
--    \r
--    Must disable EVD (evd_endabled=FALSE) during destroy\r
--    to prevent EVD events firing for CNOs and re-arming CQ while\r
--    CQ is being destroyed.\r
--    \r
--    Change dtest to check EVD after CNO timesout.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 6fe8bd1d8f44777211e816b72e0b2a6d22900207\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 30 08:02:30 2009 -0700\r
--\r
--    common osd: include winsock2.h for IPv6 definitions.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit bd26383900d18962aeeff54fa59922009091ecfc\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jul 29 08:02:15 2009 -0700\r
--\r
--    common osd: include w2tcpip.h for sockaddr_in6 definitions.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f25544f14554200a6714accef5f761b0269b5819\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Mon Jul 27 15:07:33 2009 -0700\r
--\r
--    DAPL introduced the concept of directly waiting on the CQ for\r
--    events by adding a compile time flag and special handling in the common\r
--    code.  Rather than using the compile time flag and modifying the\r
--    common code, let the provider implement the best way to wait for\r
--    CQ events.\r
--    \r
--    This simplifies the code and allows the common openib providers to\r
--    optimize for Linux and Windows platforms independently, rather than\r
--    assuming a specific implementation for signaling events.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 1548405a377d2bd17938df69419e9bcf3364d91a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 16 12:41:22 2009 -0700\r
--\r
--    dapltest: Implement a malloc() threshold for the completion reaping.\r
--    \r
--    change byte vector allocation to stack in functions:\r
--      DT_handle_send_op, DT_handle_rdma_op & DT_handle_recv_op.\r
--    \r
--    When allocation size is under the threshold, use a stack local\r
--    allocation instead of malloc/free.  Move redundant bzero() to\r
--    be called only in the case of using local stack allocation as\r
--    DT_Mdep_malloc() already does a bzero(). Consolidate error handling\r
--    return and free()check to a single point by using goto.\r
--    \r
--    Signed-off-by: Stan Smith <stan.smith@intel.com>\r
--\r
--commit f6311ca7295230bf9efbcddc639fa8e1065b1f3d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 16 12:32:09 2009 -0700\r
--\r
--    scm: handle connected state when freeing CM objects\r
--    \r
--    The QP could be freed before being disconnected\r
--    so the provider needs process disconnect before freeing\r
--    the CM object. The disconnect clean will finish\r
--    the destroy process during the disc callback.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 4387359106ce398b29847982883016f7fd48b372\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jul 8 12:49:43 2009 -0700\r
--\r
--    scm, dtest: changes for winof gettimeofday and FD_SETSIZE settings.\r
--    \r
--    scm changes to set FD_SETSIZE with expected value and\r
--    prevent windows override.\r
--    \r
--    dtest: remove gettimeofday implementation for windows\r
--    specific implemenation etc\user\gtod.c\r
--    \r
--    general EOL cleanup\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 3542a83d8a31f5ac68adf3aa44e3ebf1265068df\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jul 6 09:24:07 2009 -0700\r
--\r
--    scm: set TCP_NODELAY sockopt on the server side for sends.\r
--    \r
--    scm provider sends small messages from both server and client\r
--    sides. Set NODELAY on both sides to avoid send delays either\r
--    way.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9d591180392856935b9c3befbab2243dd8daf628\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 2 14:16:52 2009 -0700\r
--\r
--    windows: remove obsolete files in dapl/udapl source tree\r
--    \r
--    SOURCES,makefile,udapl.r,udapl_exports.src,udapl_sources.c\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 85c238ee0a41dd0a4a24b3d422f34674b0183161\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 2 14:11:20 2009 -0700\r
--\r
--    dtestcm: add UD type QP option to test\r
--    \r
--    Add -u for UD type QP's during connection setup.\r
--    Will setup UD QPs and provide remote AH\r
--    in connect establishment event. Measures\r
--    setup/exchange rates.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 89a2211526e37b1db58fc0ea663b330bc19125c8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 2 14:07:36 2009 -0700\r
--\r
--    scm: destroy QP called before disconnect\r
--    \r
--    Handle the case where QP is destroyed before\r
--    disconnect processing. Windows supports\r
--    reinit_qp during a disconnect call by\r
--    destroying the QP and recreating the\r
--    QO instead of state change from reset\r
--    to init. Call disconnect in destroy\r
--    CM code to handle this unexpected state.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 6eb35b7d69a896c256b1031337d3353575cd07b4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jul 2 14:03:12 2009 -0700\r
--\r
--    cma: add support for rdma_cm TIME_WAIT event.\r
--    \r
--    Nothing to process, simply ack the event.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b6c56b3052ecd3e36c32092ee62ff0c724da5ad4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jul 1 07:58:32 2009 -0700\r
--\r
--    scm: remove old udapl_scm code replaced by openib_scm.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 5bbae42a56e1cca678d590ac4c841dd61e839d74\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jul 1 07:53:18 2009 -0700\r
--\r
--    winof: fix build issues after consolidating cma, scm code base.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 6bd1d931c4d0d4cbafac383f225140120aee4c51\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jul 1 07:51:59 2009 -0700\r
--\r
--    cma: lock held when exiting as a result of a rdma_create_event_channel failure.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b8a14ff1cc257defa2f74373d143600f5f471823\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Mon Jun 29 12:34:54 2009 -0700\r
--\r
--    windows: all dlist functions have been moved to the header file.\r
--    remove references to dlist.c\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 1a081a0a467e4773a641e8edc876a7a4d7a30ca8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 29 12:13:48 2009 -0700\r
--\r
--    dtestcm windows: add build infrastructure for new dtestcm test suite\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit c37d7a25dca97011ea76e2a541f936d10ca658e0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 29 08:57:46 2009 -0700\r
--\r
--    openib_common: reorganize provider code base to share common mem, cq, qp, dto functions\r
--    \r
--    add new openib_common directory with cq, qp, util, dto, mem function calls\r
--    and definitions. This basically leaves the unique CM and Device definitions\r
--    and functions to the individual providers directory of openib_scm and openib_cma.\r
--    \r
--    modifications to dapl_cr_accept required. ep->cm_handle is allocated\r
--    and managed entirely in provider so dapl common code should not update\r
--    ep_handle->cm_handle from the cr->cm_handle automatically. The provider\r
--    should determine which cm_handle is required for the accept.\r
--    \r
--    openib_cma defines _OPENIB_CMA_ and openib_scm defines _OPENIB_SCM_ for provider\r
--    specific build needs in common code.\r
--\r
--commit 961a4083ffb646c070137abd33e9ba2ea9482685\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 26 14:45:34 2009 -0700\r
--\r
--    scm: fixes and optimizations for connection scaling\r
--    \r
--    Prioritize accepts on listen ports via FD_READ\r
--    process the accepts ahead of other work to avoid\r
--    socket half_connection (SYN_RECV) stalls.\r
--    \r
--    Fix dapl_poll to return DAPL_FD_ERROR on\r
--    all event error types.\r
--    \r
--    Add new state for socket released, but CR\r
--    not yet destroyed. This enables scm to release\r
--    the socket resources immediately after exchanging\r
--    all QP information. Also, add state to str call.\r
--    \r
--    Only add the CR reference to the EP if it is\r
--    RC type. UD has multiple CR's per EP so when\r
--    a UD EP disconnect_clean was called, from a\r
--    timeout, it destroyed the wrong CR.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit a60a9e1fce5588cb23f41391b48acf04edd82499\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 26 14:31:19 2009 -0700\r
--\r
--    scm: double the default fd_set_size\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 17d5e1692db4ae1eb09aa919d5607f22851d7ec5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 26 14:28:30 2009 -0700\r
--\r
--    scm: EP reference in CR should be cleared during ep_destroy\r
--    \r
--    The EP reference in the CR should be set to null\r
--    during the EP free call to insure no further\r
--    reference back to a mem freed EP.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit ebb820364cec9d72285c005a0874e7d459a9ff7d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 26 14:23:35 2009 -0700\r
--\r
--    dtestx: fix conn establishment event checking\r
--    \r
--    not catching error cases on client side\r
--    when checking for event number and UD type\r
--    && should have been ||\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 747b793898042e3011fbad4b2d1285d2c040cb13\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 26 14:18:37 2009 -0700\r
--\r
--    dtestcm: new test to measure dapl connection rates.\r
--    \r
--    new test suite added to measure connection\r
--    rates of providers. Used to compare cma, scm,\r
--    and other providers under development.\r
--    \r
--    dtestcm USAGE\r
--    \r
--    s: server\r
--    c: connections (default = 1000)\r
--    b: burst rate of conn_reqs (default = 100)\r
--    m: multi-listens (set to burst setting )\r
--    v: verbose\r
--    w: wait on event (default, polling)\r
--    d: delay before accept\r
--    h: hostname/address of server, specified on client\r
--    P: provider name (default = OpenIB-v2-ib0)\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit d58fbc3a870a060ead882e1d15c6d245cdf39096\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 19 20:59:16 2009 -0700\r
--\r
--    Release 2.0.20\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit beebe0066b47d7bf476925ff280bad2a3db38324\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 19 20:52:51 2009 -0700\r
--\r
--    common,scm: add debug capabilities to print in-process CM lists\r
--    \r
--    Add a new debug bit DAPL_DBG_TYPE_CM_LIST.\r
--    If set, the pending CM requests will be\r
--    dumped when dat_print_counters is called.\r
--    Only provided when built with -DDAPL_COUNTERS\r
--    \r
--    Add new dapl_cm_state_str() call for state\r
--    to string conversion for debug prints.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b1c51f1e68993d9306e3ebd48bd3a1f0e9878fa3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jun 16 09:22:31 2009 -0700\r
--\r
--    scm: disconnect EP before cleaning up orphaned CR's during dat_ep_free\r
--    \r
--    There is the possibility of dat_ep_free being called\r
--    with RC CR's still in connected state. Call disconnect\r
--    on the CR before marking for destroy.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 531d223455a88c885d6c5f7b1d7e158c1079fbce\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 10 12:05:17 2009 -0700\r
--\r
--    dapltest: windows scripts updated\r
--    \r
--    Support added for provider specification and general simplification of internal workings.\r
--    \r
--    Signed-off-by: Stan Smith <stan.smith@intel.com>\r
--\r
--commit 049d1ea08643d4c4eff761741641d37bb3f01fc1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 10 09:18:09 2009 -0700\r
--\r
--    scm: private data is not handled properly via CR rejects.\r
--    \r
--    For both RC and UD connect requests, the private\r
--    data is not being received on socket and passed\r
--    back via the active side REJECT event.\r
--    \r
--    UD requires new extended reject event type of\r
--    DAT_IB_UD_CONNECTION_REJECT_EVENT to distiquish\r
--    between RC and UD type rejects.\r
--    \r
--    cr_thread exit/cleanup processing fixed to insure\r
--    all items are off the list before exiting.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 3c26870e276a934e2009090e0fca8bdc36c1be67\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 10 09:09:56 2009 -0700\r
--\r
--    scm: cleanup orphaned UD CR's when destroying the EP\r
--    \r
--    UD CR objects are kept active because of direct private data references\r
--    from CONN events. The cr->socket is closed and marked inactive but the\r
--    object remains allocated and queued on the CR resource list. There can\r
--    be multiple CR's associated with a given EP and there is no way to\r
--    determine when consumer is finished with event until the dat_ep_free.\r
--    Schedule destruction for all CR's associated with this EP during\r
--    free call. cr_thread will complete cleanup with state of SCM_DESTROY.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 73abd3f58fa7b14241fad98912ef27c7b4fdb47e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 10 09:05:32 2009 -0700\r
--\r
--    scm: provider specific query for default UD MTU is wrong.\r
--    \r
--    Change the provider specific query DAT_IB_TRANSPORT_MTU\r
--    to report 2048 for new default MTU size.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 27c0d7edc4c931b808a7c5a24bd5aa2625b48aa1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 10 10:06:59 2009 -0700\r
--\r
--    scm: update CM code to shutdown before closing socket\r
--    \r
--    data could be lost without calling shutdown on the socket\r
--    before closing. Update to shutdown and then close. Add\r
--    definition for SHUT_RW to SD_BOTH for windows.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--    ---\r
--\r
--commit 536ec3103c15c1fed4367326c9117660345e0eab\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jun 4 13:48:18 2009 -0700\r
--\r
--    dapltest: windows script dt-cli.bat updated\r
--    \r
--    scn should be scm\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e8991b8f0877b0e2e857717e1140c679e9266abe\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Jun 4 08:19:12 2009 -0700\r
--\r
--    dapl/windows cma provider: add support for network devices based on index\r
--    \r
--    The linux cma provider provides support for named network devices, such\r
--    as 'ib0' or 'eth0'.  This allows the same dapl configuration file to\r
--    be used easily across a cluster.\r
--    \r
--    To allow similar support on Windows, allow users to specify the device\r
--    name 'rdma_devN' in the dapl.conf file.  The given index, N, is map to a\r
--    corresponding IP address that is associated with an RDMA device.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 79fa3e7d241f740bc886dd075f24fcbc611306de\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jun 4 08:00:29 2009 -0700\r
--\r
--    openib: remove 1st gen provider, replaced with openib_cma and openib_scm\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 624039247cdc0db7aa040dfbb4dced00f2cf9006\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 29 08:21:10 2009 -0700\r
--\r
--    dapltest: update windows script files\r
--    \r
--    Enhancement to take DAPL provider name as cmd-line arguement.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit b93baa07b7bbaeb7a55fa817c354d0c94783d61f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu May 28 15:30:05 2009 -0700\r
--\r
--    dapltest: update windows batch files in sripts directory\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 2f185c6b5e464c4fc9e84ad3e90cc2b86aebf9aa\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 18 14:00:02 2009 -0700\r
--\r
--    windows_osd/linux_osd: new dapl_os_gettid macro to return thread id\r
--    \r
--    Change dapl_os_getpid inline to macro on windows and add dapl_os_gettid\r
--    macros on linux and windows to return thread id.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 984303824cd0c3e248a789066cf665ced8e1ae5b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 18 13:53:59 2009 -0700\r
--\r
--    windows: missing build files for common and udapl sub-directories\r
--    \r
--    Add dapl/dapl_common_src.c and dapl/dapl_udapl_src.c\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 3be4ccf9681a975e74a5aa05e3f7912477f342a7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 18 09:06:19 2009 -0700\r
--\r
--    windows: add build files for openib_scm, remove /Wp64 build option.\r
--    \r
--    Add build files for windows socket cm and change build\r
--    option on windows providers. The new Win7 WDK issues a\r
--    depreciated compiler option warning for /Wp64\r
--    (Enable 64-bit porting warnings)\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 163112cfeb6e409886b3cb7f85da7ce003300d5c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 18 08:50:35 2009 -0700\r
--\r
--    scm: multi-hca CM processing broken. Need cr thread wakeup mechanism per HCA.\r
--    \r
--    Currently there is only one pipe across all\r
--    device opens. This results in some posted CR work\r
--    getting delayed or not processed at all. Provide\r
--    pipe for each device open and cr thread created\r
--    and manage on a per device level.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit e6e799f623df6ef136ffc5388251d3f3a38c8a91\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 15 11:06:19 2009 -0700\r
--\r
--    dtest: add connection timers on client side\r
--    \r
--    Add timers for active connections and print\r
--    results. Allow polling or wait on conn event.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit d656bbf619123deaed6e8985e52207e5415f359f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 15 09:48:38 2009 -0700\r
--\r
--    linux_osd: use pthread_self instead of getpid for debug messages\r
--    \r
--    getpid provides process ids which are not unique. Use unique thread\r
--    id's in debug messages to help isolate issues across many device\r
--    opens with multiple CM threads.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 92bb0d2933d3d1546e18f0479475f3daf5b92052\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 1 10:18:05 2009 -0700\r
--\r
--    windows ibal-scm: dapl/dirs file needs updated to remove ibal-scm\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 9c37d9d667fb7e8f21841bbec4a84b2c652fffe1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 29 23:13:36 2009 -0700\r
--\r
--    Release 2.0.19\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 29 14:33:28 2009 -0700\r
--\r
--    scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit\r
--    \r
--    mismatch of device attribute size restricts max_lmr_block_size to 32 bit\r
--    value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes.\r
--    \r
--    Consumers should use max_lmr_virtual_address for actual max\r
--    registration block size until attribute interface changes.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit f91f27eaaab28b13a631adf75b933b7be3afbc0f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 29 10:51:03 2009 -0700\r
--\r
--    scm: increase default MTU size from 1024 to 2048\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit 8d6846056f4c86b6a06346147df55d37c4ba9933\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 29 10:49:09 2009 -0700\r
--\r
--    openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge\r
--    \r
--    no need to rebuild scatter gather list given that DAT v2.0\r
--    is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 29 08:39:37 2009 -0700\r
--\r
--    dtest: add flush EVD call after data transfer errors\r
--    \r
--    Flush and print entries on async, request, and receive\r
--    queues after any data transfer error. Will help\r
--    identify failing operation during operations\r
--    without completion events requested.\r
--    Fix -B0 so burst size of 0 works.\r
--    \r
--    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
--\r
--commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 22 13:16:19 2009 -0700\r
--\r
--    dtest/dapltest: Cleanup code with Lindent\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 21 15:51:24 2009 -0700\r
--\r
--    ibal-scm: remove, obsolete\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 67ddd6bfba46f1f7a61b772257132f1257d05c96\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 21 15:44:15 2009 -0700\r
--\r
--    scm, cma provider: Cleanup code with Lindent\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d0898091090ff19be7929fed0d14f1ca696d5e53\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 21 15:39:01 2009 -0700\r
--\r
--    udapl: Cleanup code with Lindent\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 21 15:31:20 2009 -0700\r
--\r
--    dapl common: Cleanup code with Lindent\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 21 12:52:29 2009 -0700\r
--\r
--    dat: Cleanup code with Lindent\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 20 12:28:08 2009 -0700\r
--\r
--    Release 2.0.18\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Apr 16 14:35:18 2009 -0700\r
--\r
--    dapltest: reset server listen ports to avoid collisions during long runs\r
--    \r
--    If server is running continuously the port number increments\r
--    from base without reseting between tests. This will\r
--    eventually cause collisions in port space.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit c27af8de0501d132b8152ec8546023cdba212de5\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Apr 16 10:21:51 2009 -0700\r
--\r
--    To avoid duplicating port numbers between different tests, the next port\r
--    number to use must increment based on the number of endpoints per thread *\r
--    the number of threads.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 3084310197c20aaa50abe82260fc835786f591f5\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Apr 16 10:21:45 2009 -0700\r
--\r
--    dapltest assumes that events across multiple endpoints occur in a specific\r
--    order.  Since this is a false assumption, avoid this by directing events to\r
--    per endpoint EVDs, rather than using shared EVDs.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Apr 16 10:21:41 2009 -0700\r
--\r
--    Synchronization is missing between removing items from an EVD and queuing\r
--    them.  Since the removal thread is the user's, but the queuing thread is\r
--    not, the synchronization must be provided by DAPL.  Hold the evd lock\r
--    around any calls to dapls_rbuf_*.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit f5e86d28f803162ffdf94b41ec7435dec92f728d\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Apr 16 10:21:26 2009 -0700\r
--\r
--    Communication to the CR thread is done using an internal socket.  When a\r
--    new connection request is ready for processing, an object is placed on\r
--    the CR list, and data is written to the internal socket.  The write causes\r
--    the CR thread to wake-up and process anything on its cr list.\r
--    \r
--    If multiple objects are placed on the CR list around the same time, then\r
--    the CR thread will read in a single character, but process the entire list.\r
--    This results in additional data being left on the internal socket.  When\r
--    the CR does a select(), it will find more data to read, read the data, but\r
--    not have any real work to do.  The result is that the thread spins in a\r
--    loop checking for changes when none have occurred until all data on the\r
--    internal socket has been read.\r
--    \r
--    Avoid this overhead by reading all data off the internal socket before\r
--    processing the CR list.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Apr 16 10:21:13 2009 -0700\r
--\r
--    The dapl connect call takes as input an address (sockaddr) and a port number\r
--    as separate input parameters.  It modifies the sockaddr address to set the\r
--    port number before trying to connect.  This leads to a situation in\r
--    dapltest with multiple threads that reference the same buffer for their\r
--    address, but specify different port numbers, where the different threads\r
--    end up trying to connect to the same remote port.\r
--    \r
--    To solve this, do not modify the caller's address buffer and instead use\r
--    a local buffer.  This fixes an issue seen running multithreaded tests with\r
--    dapltest.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 7947026ede478f08b4a7b8cb607f457765bf2afa\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Apr 16 10:21:03 2009 -0700\r
--\r
--    Windows socket calls should check return values against SOCKET_ERROR to\r
--    determine if an error occurred.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 10 08:33:41 2009 -0700\r
--\r
--    Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST\r
--    \r
--    Fix rpmbuild problem with new cma osd include file.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit acb213adb3268e9bf6999e2bf040d4a71212b701\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 10 08:32:24 2009 -0700\r
--\r
--    dapl scm: reduce wait time for thread startup.\r
--    \r
--    thread startup wait reduce to 2ms to reduce open times.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 55459699fa9c0e5fb7e2b17822f0916412c64b35\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 10 08:31:22 2009 -0700\r
--\r
--    dapl-scm: getsockopt optlen needs initialized to size of optval\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d710c5327e05a40796341d16b45a2b098b03f588\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:17:32 2009 -0700\r
--\r
--    The connection request thread adds sockets to a select list unless\r
--    the cr->socket is invalid and the cr request state is set to destroy.  If the\r
--    cr->socket is invalid, but the cr->state is not destroy, then the cr->socket\r
--    is added to an FD set for select/poll.  This results in select/poll\r
--    returning an error when select is called.  As a result, the cr thread never\r
--    actually blocks during this state.\r
--    \r
--    Fix this by only destroying a cr based on its state being set to destroy\r
--    and skip adding cr->sockets to the FD set when they are invalid.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:08:16 2009 -0700\r
--\r
--    Make sure all locks are initialized properly and don't zero their memory\r
--    once they are.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:08:13 2009 -0700\r
--\r
--    The lock functions are defined just a few lines beneath the prototypes\r
--    as inline.  Remove the duplicate prototypes.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 9578c4aeb9878d98374e4b7abc02db182aef82c6\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:08:07 2009 -0700\r
--\r
--    Make sure all locks are initialized and don't zero out their memory once\r
--    they are.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 97edcbb662b489303ef68c0da02831efaddeed91\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:08:03 2009 -0700\r
--\r
--    The IBAL library allocates a small number of threads for callbacks to the\r
--    user.  If the user blocks all of the callback threads, no additional\r
--    callbacks can be invoked.  The DAPL IBAL provider cancels listen requests\r
--    from within an IBAL callback, then waits for a second callback to confirm\r
--    that the listen has been canceled.  If there is a single IBAL callback\r
--    thread, or multiple listens are canceled simultaneously, then the provider\r
--    can deadlock waiting for a cancel callback that never occurs.\r
--    \r
--    This problem is seen when running dapltest with multiple threads.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:57 2009 -0700\r
--\r
--    We need to check the return value from select for errors before checking\r
--    the FD sets.  An item may be in an FD set but select could have returned\r
--    an error.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit a8a977becaeefe0d7f8e01e01631a11988d2d54e\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:53 2009 -0700\r
--\r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:49 2009 -0700\r
--\r
--    Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ\r
--    completion channels in the Windows version of the openib_scm provider.\r
--    Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages\r
--    instead of DAPL_DBG_TYPE_CM.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 73728763666a46df5789af93b50db53cdf64afd6\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:44 2009 -0700\r
--\r
--    The IBAL-SCM provider will run into an inifinite loop if the check for\r
--    cr->socket > SCM_MAX_CONN - 1 fails.  The code continues back to the start\r
--    of the while loop without moving to the next connection request entry\r
--    in the list.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 9b1b396539926d36ffacfff04fbe7c081e436b45\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:40 2009 -0700\r
--\r
--    next_cr is set just before and inside the check\r
--    if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY)\r
--    Remove setting it inside the if statement.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:35 2009 -0700\r
--\r
--    Some errors on windows are more easily interpretted in hex than decimal.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 08ee072a1396ac2c28983878dbc6b02feb035787\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:32 2009 -0700\r
--\r
--    The WinOF HCA driver cannot handle transitioning from RTS -> RESET ->\r
--    INIT -> ERROR.  Simply delete the QP and re-create it to reinitialize\r
--    the endpoint until the bug is fixed.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:23 2009 -0700\r
--\r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit a8582be0e1fc89e856f1d0b43a3c1b271295a352\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:07:18 2009 -0700\r
--\r
--    Convert the openib_cma provider to common code between linux and windows.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Apr 10 08:06:53 2009 -0700\r
--\r
--    Move from using pipes to sockets for internal communication.  This\r
--    avoids issues with windows only supporting select() on sockets.\r
--    \r
--    Remove windows specific definition of dapl_dbg_log.\r
--    \r
--    Update to latest windows libibverbs implementation using completion\r
--    channel abstraction to improve windows scalability and simplify\r
--    porting where FD's are accessed directly in Linux.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit b3ad2ed97399a24a869841e17d1314e11c379aae\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 31 05:41:50 2009 -0800\r
--\r
--    Release 2.0.17\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 5d732929f8a90a490994e8e35a3666c3647ad4fe\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 31 05:22:11 2009 -0800\r
--\r
--    dapl: ia64 build problem on SuSE 11, atomic.h no longer exists.\r
--    \r
--    Add autotools check for SuSE 11 and include intrinsics.h\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 16 13:23:50 2009 -0800\r
--\r
--    Release 2.0.16\r
--    \r
--    Fix changelog year in spec file.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 16 13:15:22 2009 -0800\r
--\r
--    Release 2.0.16\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Mar 13 12:39:12 2009 -0800\r
--\r
--    uDAPL: scm provider, remove query gid/lid from connection setup phase\r
--    \r
--    move lid/gid queries from the connection setup phase\r
--    and put them in the open call to avoid overhead\r
--    of more fd's during connections. No need\r
--    to query during connection setup since uDAPL\r
--    binds to specific hca/ports via dat_ia_open.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 775394b73980a7bc0af018a33d2a5bb795469c78\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Mar 12 12:44:43 2009 -0800\r
--\r
--    Build: missing new linux/osd include file in EXTRA_DIST\r
--    \r
--    Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Mar 12 12:11:21 2009 -0800\r
--\r
--    Build: spec files missing Requires(post) statements for sed/coreutils\r
--    \r
--    needed for anaconda install\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Mar 4 10:04:13 2009 -0800\r
--\r
--    dapl scm: remove unecessary thread when using direct objects\r
--    \r
--    A thread is created for processing events on devices without\r
--    direct event objecti support. Since all openfabrics devices support\r
--    direct events there is no need to start a thread. Move this under\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 3 11:08:12 2009 -0800\r
--\r
--    dtestx: add missing F64u definition for windows\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d9e771da16ec2b360a222ceccbbca5d088e20ee5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 3 09:25:26 2009 -0800\r
--\r
--    uDAPL common: add 64 bit counters for IA, EP, and EVD's.\r
--    \r
--     -DDAPL_COUNTERS to build-in counters for cma and scm providers.\r
--     New extension calls in dat_ib_extensions.h for counters\r
--      dat_print_counters, dat_query_counters\r
--     Counters for operations, async errors, and data\r
--     Update dtestx (-p) with print and query counter examples\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Tue Feb 17 07:24:27 2009 -0800\r
--\r
--    Modify the openib_scm provider to support both OFED and WinOF releases.\r
--    This takes advantage of having a libibverbs compatibility library.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e\r
--Author: Stan Smith <stan.smith@intel.com>\r
--Date:   Fri Jan 30 09:52:33 2009 -0800\r
--\r
--    Update the dapl.git tree with the latest SVN version of the\r
--    ibal-scm provider.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 83543b6cca342e25fd6408454f1261ec6835a172\r
--Author: Stan Smith <stan.smith@intel.com>\r
--Date:   Fri Jan 30 09:52:25 2009 -0800\r
--\r
--    Merge SVN IBAL provider code back into the main git tree.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Jan 30 09:52:11 2009 -0800\r
--\r
--    Changes to dtest to support building on Windows.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 9f87610c4b37e4db4d74205c14028582a2f6a79e\r
--Author: Stan Smith <stan.smith@intel.com>\r
--Date:   Fri Jan 30 09:48:26 2009 -0800\r
--\r
--    Add return codes to various functions.\r
--    Add script (batch file) for Windows testing.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 723067550265defdcfe6e00460a4f89f7a81fbf1\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Jan 30 09:46:40 2009 -0800\r
--\r
--    Merge OFED and WinOF trees for common dapl code.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jan 16 08:16:13 2009 -0800\r
--\r
--    dtest/dapltest: use $(top_builddir) for .la files during test builds\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Nov 26 07:12:30 2008 -0800\r
--\r
--    Release 2.0.15\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 5d5dec42717c963d1644ee3e716459dc5d58e930\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Oct 27 08:48:53 2008 -0800\r
--\r
--    dapltest: transaction test moves to cleanup stage before rdma_read processing is complete\r
--    \r
--    With multiple treads, the transaction server tread can move to cleanup\r
--    stage and unregister memory before the remote client process has\r
--    completed the rdma read. In lieu of a rewrite to add sync messages\r
--    at the end of transaction test phase, just add a delay before cleanup.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 14 11:56:35 2008 -0700\r
--\r
--    Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf.\r
--    Change SR to include sysconfdir. SR file access in the following order:\r
--    \r
--    - DAT_OVERRIDE\r
--    - sysconfdir\r
--    - /etc\r
--    \r
--    if DAT_OVERRIDE is set, assume administration override\r
--    and do not failover to other locations. Add debug\r
--    messages for each failure and retries.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Acked-by: Doug Ledford <dledford@redhat.com>\r
--\r
--commit c98d2169b839a73d76691acf510dd8976ddc850a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 3 08:00:56 2008 -0700\r
--\r
--    Release 2.0.14\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit c26d0bb065f3734f09058e1e6d26dde4a3738e55\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 3 05:40:04 2008 -0700\r
--\r
--    dat.conf: add ofa-v2-iwarp entry for iwarp devices\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d54c35c8a9ba33a464ca15f4a65b914688e5194d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Oct 3 05:30:10 2008 -0700\r
--\r
--    dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices\r
--    \r
--    iWarp spec allows only one iov on rdma reads\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 1 08:17:49 2008 -0700\r
--\r
--    dtest: reduce default IOV's during dat_ep_create for iWARP devices\r
--    \r
--    iWarp adapters tend to have less IOV resources then IB adapters.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Sep 26 12:43:13 2008 -0700\r
--\r
--    dtest: fix 32-bit build issues in dtest and dtestx examples.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 42a3a4edf30115a35d9d599b51f8756814e62368\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Sep 26 08:48:31 2008 -0700\r
--\r
--    Revert "Release 2.0.14"\r
--    \r
--    This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63.\r
--    \r
--    missed some fixes for package release.\r
--\r
--commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 24 12:13:37 2008 -0700\r
--\r
--    Release 2.0.14\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit c00d858da3113ce5463d408ab5e13e17cc9529e4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 24 08:33:32 2008 -0700\r
--\r
--    build: $(DESTDIR) prepend needed on install hooks for dat.conf\r
--    \r
--    All install directives that automake creates automatically\r
--    have $(DESTDIR) prepended to them so that a make\r
--    DESTDIR=<some_path> install will work. The hand written\r
--    install hooks for dat.conf was missing DESTDIR.\r
--    \r
--    Signed-off-by: Doug Ledford <dledford@redhat.com>\r
--\r
--commit 860db3be4907c8ff290ce7c6b631b2117f5080bd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Sep 24 08:26:28 2008 -0700\r
--\r
--    dapl scm: UD shares EP's which requires serialization\r
--    \r
--    add locking around the modify_qp state changes to avoid\r
--    unnecessary modify_qp calls during multiple resolve\r
--    remote AH connection events on a single EP.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sat Sep 20 16:02:00 2008 -0700\r
--\r
--    dtestx: Add new options to test UD.\r
--    \r
--    - many to one/many EP remote AH resolution, data flow\r
--    - bi-directional EP remote AH resolution, data flow\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sat Sep 20 15:58:59 2008 -0700\r
--\r
--    dapl: fixes for IB UD extensions in common code and socket cm provider.\r
--    \r
--     - Manage EP states base on attribute service type.\r
--     - Allow multiple connections (remote_ah resolution)\r
--       and accepts on UD type endpoints.\r
--     - Supply private data on CR conn establishment\r
--     - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sat Sep 20 15:49:40 2008 -0700\r
--\r
--    dapl: add provider specific attribute query option for IB UD MTU size\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 1 15:52:37 2008 -0700\r
--\r
--    Release 2.0.13\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit f37589927fabf0feb3a09c4c7c03e18df5749fef\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 1 12:24:49 2008 -0700\r
--\r
--    dapl build: add correct CFLAGS, set non-debug build by default for v2\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 1 12:22:19 2008 -0700\r
--\r
--    dapl providers: fix compiler warnings in cma and scm providers\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 1 12:20:08 2008 -0700\r
--\r
--    dat: fix compiler warnings in dat common code\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 1 12:18:48 2008 -0700\r
--\r
--    dapl: fix compiler warnings in common code\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 38a53ae75bce5059a84262fe1b40eacf92b22287\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Sep 1 12:16:58 2008 -0700\r
--\r
--    dtest/dapltest: fix compiler warnings\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 45900087764917b354411fdd2b3880473d553ab8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Aug 22 14:51:22 2008 -0700\r
--\r
--    dapl cma: debug message during query needs definition for inet_ntoa\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 99d46313a03af18771966cf86fcc934d179627b5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Aug 21 12:54:58 2008 -0700\r
--\r
--    Release 2.0.12\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Aug 20 18:51:00 2008 -0700\r
--\r
--    dapl scm: fix corner case that delivers duplicate disconnect events\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 96f6822b90fa880a6c6a64b1e183064a449f7237\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Aug 20 18:47:19 2008 -0700\r
--\r
--    dat: include stddef.h for NULL definition in dat_platform_specific.h\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Aug 20 18:27:08 2008 -0700\r
--\r
--    dapl: add debug messages during async and overflow events\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Aug 20 18:24:33 2008 -0700\r
--\r
--    dapltest: add check for duplicate disconnect events in transaction test\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 7e8986f2c6496851b724a007458881c3248ac998\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Aug 20 18:22:42 2008 -0700\r
--\r
--    dtestx: fix stack corruption problem with hostname strcpy\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Aug 14 09:42:57 2008 -0700\r
--\r
--    dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Aug 14 09:19:53 2008 -0700\r
--\r
--    dapl scm: change IB RC qp inline and timer defaults.\r
--    \r
--    rnr nak can be the result of any operation not just\r
--    message send recevier not ready. Timer is much too\r
--    large given this case.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 36088a92d87e833bae535fcea0c45417dec34e65\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Aug 14 09:12:38 2008 -0700\r
--\r
--    dapl scm: add mtu adjustments via environment, default = 1024.\r
--    \r
--    DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting\r
--    is min of 1024 and active mtu on IB device.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Aug 13 14:17:40 2008 -0700\r
--\r
--    dapl scm: change connect and accept to non-blocking to avoid blocking user thread.\r
--    \r
--    The connect socket that is used to exchange QP information is now non-blocking\r
--    and the data exchange is done via the cr thread. New state RTU_PENDING added.\r
--    On the passive side there is a new state ACCEPT_DATA used to avoid read blocking\r
--    on the user accept call.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jul 29 08:18:25 2008 -0700\r
--\r
--    dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sun Jul 20 13:20:45 2008 -0700\r
--\r
--    Release 2.0.11\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 0003bb7866af3ba73cc79c703b565a8012439bb1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sun Jul 20 13:17:22 2008 -0700\r
--\r
--    dtestx: add -d option to test new IB UD extension.\r
--    \r
--    modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sun Jul 20 13:13:09 2008 -0700\r
--\r
--    dapl scm: add support for UD extensions in Openfabrics socket cm provider\r
--    \r
--    add qp_type in connection information exchange\r
--    add new post_send_ud call\r
--    changes to connection manager to support qp types beyond RC.\r
--    changes to connection events to use new extended event calls.\r
--    exchange address handle information during connection phase.\r
--    changes to modify_qp to handle both RC and UD types.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 927dac5b61e64868089acd49d468b98327e14a1a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sun Jul 20 13:07:34 2008 -0700\r
--\r
--    dapl: add support for UD extensions in common code.\r
--    \r
--    allow EP create for extended service types.\r
--    extend connection event types to include UD AH resolution/exchange.\r
--    add new extended connect and connect request upcalls for providers.\r
--    - dapls_evd_post_cr_event_ext\r
--    - dapls_evd_post_connection_event_ext\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit be3d6a53f3340294697706ce50a05faf151aacc7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Sun Jul 20 12:57:49 2008 -0700\r
--\r
--    dat: New definitions for IB unreliable datagram extension\r
--    \r
--    Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD\r
--    Add IB extension call dat_ib_post_send_ud().\r
--    Add address handle definition for UD calls.\r
--    Add IB event definitions to provide remote AH via connect and connect requests\r
--    Roll IB extension version to 2.0.2\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jul 18 07:46:20 2008 -0700\r
--\r
--    dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 25 08:02:11 2008 -0700\r
--\r
--    dapltest: manpage - rdma write example incorrect\r
--    \r
--    parameter for rdma write should be RW and not WR\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 68638bde71b529a142c13ac332cd44435cabc896\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 23 15:26:30 2008 -0700\r
--\r
--    dapl: remove needless terminating 0 in dto_op_str functions.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 23 10:52:46 2008 -0700\r
--\r
--    Release 2.0.10\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit d9b3c06ae98ac4d3b264384f6510137166d78cb0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 23 10:35:17 2008 -0700\r
--\r
--    remove reference to doc/dat.conf in makefile.am\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit b052d402e09ac78281a25af2c8fe902fa71f5c6f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jun 19 13:34:49 2008 -0700\r
--\r
--    dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free.\r
--    \r
--    Problem surfaced while running Intel MPI 3.1 and mpich2-test suite.\r
--    dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint\r
--    and destroy_cq and destroy_pd code was ignoring verbs errors.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit e466d8e330c45176c5f00efda79ad745bf3f71a4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 18 14:21:28 2008 -0700\r
--\r
--    dapl scm: add stdout logging for uname and gethostbyname errors during open.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 18 14:19:51 2008 -0700\r
--\r
--    dapl scm: support global routing and set mtu based on active_mtu\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit fc65a08727c59c304dad20337a8bff803f2302c0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 18 13:59:44 2008 -0700\r
--\r
--    dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters.\r
--    \r
--    Bring socket cm provider back to life with some changes:\r
--    \r
--    better threading support for exchanging QP information.\r
--    Avoid blocking during connect to support dynamic connection\r
--    model with MPI implementations.\r
--    \r
--    consumer control of ack timeout/retries.\r
--    \r
--    disconnect/reject capabilities via socket exchange.\r
--    \r
--    version support for wire protocol to insure compatibility\r
--    with peer scm provider. Add gids to exchange.\r
--    \r
--    validated with Intel MPI on a 14,000+ core fabric using IB DDR.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 0855af175fec2f1bec8391ebae2a2cdff26a3359\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 11 10:43:24 2008 -0700\r
--\r
--    dapl: add opcode to string function to report opcode during failures.\r
--    \r
--    Need to use cookie opcode during failures in lieu of cqe opcode.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit ec6296e7f0a843c69231f8284ae780014fa26fbe\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 16 14:59:43 2008 -0700\r
--\r
--    dapl: remove unused iov buffer allocation on the endpoint\r
--    \r
--    provider's manage iov space on stack during posting.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 16 13:59:11 2008 -0700\r
--\r
--    dapl: endpoint pending request count is wrong\r
--    \r
--    The code assumes every cookie allocated during posting of\r
--    requests gets completed. This incorrect assumption results in\r
--    wrong pending count. Remove request_pending field and replace\r
--    with direct call, dapl_cb_pending, to provide accurate\r
--    data to consumer.\r
--    \r
--    Add debug print if consumer overruns request queue.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jun 2 12:40:45 2008 -0700\r
--\r
--    dapl extension: dapli_post_ext should always allocate cookie for requests.\r
--    \r
--    extension didn't allocate cookie if completion was suppressed which resulted\r
--    segfault during provider post call. Provider's expect cookie for wr_id,\r
--    even with surpressed completions, to handle events during errors.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue May 20 14:35:43 2008 -0700\r
--\r
--    Release 2.0.9\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue May 20 21:56:06 2008 -0700\r
--\r
--    dtest,dtestx,dapltest: fix build issues with Redhat EL5.1\r
--    \r
--    need include files/definitions for sleep, getpid, gettimeofday\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 8084ebf39729bac310447467b518df4248e9e2b6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue May 20 14:31:09 2008 -0700\r
--\r
--    dapl: Fix long delays with the cma provider open call when DNS is not configure on server.\r
--    \r
--    Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue May 20 14:30:05 2008 -0700\r
--\r
--    dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 30 14:48:21 2008 -0700\r
--\r
--    Release 2.0.8\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 30 13:51:41 2008 -0700\r
--\r
--    dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 30 13:25:53 2008 -0700\r
--\r
--    dat: udat_sr_parser ia_name will fail on comments, turn down debug message\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit b93b91d48186d100c48f1a479776d56476847607\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 29 16:15:44 2008 -0700\r
--\r
--    dat: cleanup error handling with static registry parsing of dat.conf\r
--    \r
--    change asserts to return codes, add log messages, and\r
--    report errors via open instead of asserts during dat\r
--    library load.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 28 10:14:20 2008 -0700\r
--\r
--    dapl: cma provider needs to support lower inline send default for iWARP\r
--    \r
--    IB and iWARP work best with different defaults. Add transport check\r
--    and set default accordingly. 64 for iWARP, 200 for IB.\r
--    \r
--    DAPL_MAX_INLINE environment variable is still used to override.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit be32d7d5beeeceac5dbb1974d3217265dc4d5461\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 28 09:44:12 2008 -0700\r
--\r
--    dtestx: need to include string.h for memset/strcpy declarations\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit a192465714e7607529303a80d8f9a312e0c7aec6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 28 08:41:05 2008 -0700\r
--\r
--    dapl: add vendor_err with DTO error logging\r
--    \r
--    DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 6ac657a4e7e5e27254a024fca7fdead569043f9a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 25 15:12:34 2008 -0700\r
--\r
--    dapl: add check before destroying cm event channel in release\r
--    \r
--    library may be loaded and unloaded without calling open\r
--    in which case the cm event channel is not created.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 22 12:55:13 2008 -0700\r
--\r
--    dapl: evd_alloc doesn't check for direct_object_create errors.\r
--    \r
--    Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc.\r
--    When attempting to create large number of evd's that exceed\r
--    open files limit the error was not propagated up causing\r
--    a segfault. Note: there are 3 FD's required for each EVD\r
--    2 for pipe, and one for cq event_channel.\r
--    \r
--    Change the error reporting to indicate correct return\r
--    code and send to log with non-debug builds.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 14 13:10:13 2008 -0700\r
--\r
--    dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement.\r
--    \r
--    Change the packaging to update only the OFA provider contents in dat.conf. This allows other\r
--    dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain\r
--    syntax of this static configuration file.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit d32b27d991bc1314eea055ce3f55bb585b11aaac\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 11 11:37:48 2008 -0700\r
--\r
--    dapl openib_cma: fix hca query to use correct max_rd_atom values\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Apr 9 17:26:06 2008 -0700\r
--\r
--    dat: add logging by default during library load failures.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 1794e94754a1e58fcf214c2802e950124bbd1316\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 8 17:32:03 2008 -0700\r
--\r
--    dtest: add private data validation with connect and accept.\r
--    \r
--    Include code, with build option, to validate private data with\r
--    consumer rejects.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 8 17:25:11 2008 -0700\r
--\r
--    dapl: add hooks in evd connection callback code to deliver private data with consumer reject.\r
--    \r
--    PEER rejects can include private data. The common code didn't support delivery\r
--    via the connect event data structure. Add the necessary hooks in\r
--    dapl_evd_connection_callback function and include checks in openib_cma\r
--    provider to check and delivery properly. Also, fix the private data size\r
--    check in dapls_ib_reject_connection function.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 7 15:47:57 2008 -0700\r
--\r
--    dapl: increase reject private data size to avoid odd byte offets.\r
--    \r
--    remove reject type checking on passive side since it will\r
--    always be non-consumer from active side.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 353a1c8a00bb2a1380fd7a372973a5a70828da35\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 4 16:04:11 2008 -0800\r
--\r
--    dapl: update vendor information for OFA v2 provider.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit dbf1ea37f43caec61911dea06af801c2f906db0a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Apr 4 16:03:03 2008 -0800\r
--\r
--    dapl: add provider vendor revision data in private data with reject\r
--    \r
--    Add 1 byte header containing provider/vendor major revision\r
--    to distinguish between consumer and non-consumer rejects.\r
--    Validate size of consumer reject privated data.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 0f71b9be594739a1fba7d74929eacd42a8cee392\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Apr 3 17:06:27 2008 -0800\r
--\r
--    dapl: add support for logging errors in non-debug build.\r
--    \r
--    Add debug logging (stdout, syslog) for error cases during\r
--    device open, cm, async, and dto operations. Default settings\r
--    are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST.\r
--    \r
--    Change default configuration to build non-debug.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit bea882ad9b11ac7188628a939f5227e22c914169\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Apr 3 16:23:29 2008 -0800\r
--\r
--    dapl: add support for private data in CR reject.\r
--    \r
--    Private data support via dat_cr_reject was added to\r
--    the v2 DAT specification but dapl was never extended\r
--    to support at the provider level.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 1 11:02:37 2008 -0800\r
--\r
--    dapl: calculate private data size based on transport type and cma_hdr overhead\r
--    \r
--    Need to adjust CM private date size based on different transport types.\r
--    Add hca_ptr to dapls_ib_private_data_size call for transport type\r
--    validation via verbs device. Add definitions to include iWARP size\r
--    of 512 and subtract 36 bytes for cma_hdr overhead.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Mar 26 17:58:17 2008 -0800\r
--\r
--    Remove improperly licensed GETOPT code from dtest source tree.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 88069fdd21f92923388dec7adbde0d1bc334e7c4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 18 15:04:34 2008 -0800\r
--\r
--    remove unnecessary assert from dapl_ep_free.\r
--    \r
--    dat_ep_free must handle the case where a consumer calls\r
--    free in CONNECTED or DISCONNECT_PENDING states. After\r
--    free calls disconnect, there may be a pending event,\r
--    in which case the providers dapls_ib_qp_free will block\r
--    accordingly and handle pending events.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit b3f020e5cba765077049a8cf61c4ce5009fa1031\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Fri Mar 14 14:31:40 2008 -0700\r
--\r
--    fix openib_scm compiler warning\r
--    \r
--    Cast to socklen_t since accept(2) expects an unsigned argument.\r
--    \r
--    Makes the openib_scm provider now build successfully when using\r
--    make VERBS=<provider> (the -Werror flag was causing the build\r
--    failure)\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 441996f05d3cc8b09c94c166ef736bc50c24de7e\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Fri Mar 14 14:31:34 2008 -0700\r
--\r
--    fix provider-specific compiler warnings\r
--    \r
--    Initialize ds_array_start_p otherwise the compiler would claim\r
--    that this variable could be used with an uninitialized value.\r
--    \r
--    Makes the uDAPL providers now build successfully when using make\r
--    VERBS=<provider> (the -Werror flag was causing the build failure)\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 11 09:25:07 2008 -0800\r
--\r
--    uDAPL: fix query to adjust max sge for default inline of 64 bytes\r
--           and include missing max_rdma_write_iov ep_attr field\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit e2c6bf57f78dfebc21e168df01e5876202053e08\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Fri Mar 7 09:39:22 2008 -0800\r
--\r
--    uDAT: fix reuse of va_list in debugging mode\r
--    \r
--    Make sure we reinitialize the va_list since va_list is undefined\r
--    if a function traverses the va_list with va_arg.\r
--    \r
--    This patch fixes the uDAT debugging case when both stdout and\r
--    syslog output is wanted.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Mar 6 15:40:35 2008 -0800\r
--\r
--    Add hostname and process id to debug output to aid\r
--    scale-up and out debug.\r
--    \r
--    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
--\r
--commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Sat Feb 23 21:03:21 2008 -0800\r
--\r
--    fix reuse of va_list in debugging mode\r
--    \r
--    Make sure we reinitialize the va_list since va_list is undefined\r
--    if a function traverses the va_list with va_arg.\r
--    \r
--    This patch fixes the debugging case when both stdout and syslog\r
--    output is wanted.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit da80af8c76f220508407a2e171c8b28b43b35bf9\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 16:54:45 2008 -0800\r
--\r
--    Fix memory leak in provider specific post send/recv if there's\r
--    more than DEFAULT_DS_ENTRIES iovecs.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit d78ee9f95fbe48f71eb247b01c598994edfa4d17\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 03:19:42 2008 -0800\r
--\r
--    Guarantee NUL termination if hostname gets truncated.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 03:19:37 2008 -0800\r
--\r
--    Make sure we don't leak the hash table if dapl_hca_alloc fails.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit e4ed56be6bd64684564169d89df7ca30faffdb53\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 03:19:32 2008 -0800\r
--\r
--    Fix memory leak.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 03:19:27 2008 -0800\r
--\r
--    Fix memory leak in error path.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit d971e799bb5385a8c847cf3f863f19854e95c1b2\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 03:19:22 2008 -0800\r
--\r
--    Fix memory leak\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit c21f2f455af7934675a58ff825bed6cf54d457c9\r
--Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--Date:   Tue Feb 19 03:19:17 2008 -0800\r
--\r
--    Fix memory leak.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit ee46aa47e2a4deeded347fe18bd6321db61c6594\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Feb 15 10:10:01 2008 -0800\r
--\r
--    Release 2.0.7\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit f0ca504bc2639cb7a48528d45e9026b54dab3e57\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Feb 14 09:46:56 2008 -0800\r
--\r
--    uDAT: Make sure we initialize the dictionary entry early enough so that\r
--    we can base our cleanup decisions on that variable being\r
--    initialized.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 6b11838043a6012668c7e1a22a869e9e84dc40d6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Feb 14 09:46:18 2008 -0800\r
--\r
--    uDAT: Make sure we stay within bounds when manipulating the ia_name.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Feb 14 09:44:56 2008 -0800\r
--\r
--    uDAT: Make sure we stay within bounds when manipulating the ia handle.\r
--    Fix typo in comment.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit 7fe64f10874667062e067efb7ea8c3d385ae90b7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Feb 14 09:43:39 2008 -0800\r
--\r
--    uDAT: Zero-out memory otherwise we might base our cleanup decisions on\r
--    uninitialized memory.\r
--    \r
--    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
--\r
--commit f510e7e8f5b72a6262a7f8b255926cf96c65b654\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 13 20:39:26 2008 -0800\r
--\r
--    Modify default configure options to match rpm spec file\r
--     --enable-debug, --enable-ext-type=ib\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 75273f1a5c599777bb43add93f30563689fdbc10\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 11 15:43:03 2008 -0800\r
--\r
--    udapl OFA provider: set listen backlog to default cma backlog max.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 11 14:50:33 2008 -0800\r
--\r
--    The OFA dapl provider is checking for incorrect return code\r
--    from rdma_bind_addr and rdma_listen calls. This causes an error\r
--    to be returned back to the consumer instead of correctly\r
--    incrementing the seed port and re-calling the OFA provider\r
--    until a valid port is issued. The seed value (1000) is also\r
--    incorrect and should start a non-privledged port (1024) to\r
--    avoid EPERM errors when seeding the starting port value.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 4 16:16:10 2008 -0800\r
--\r
--    Release 2.0.6 - ChangeLog\r
--\r
--commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 4 16:14:02 2008 -0800\r
--\r
--    Release 2.0.6\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 8c5beb870048aca286f7396549771ccb075c5c1b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 4 16:12:47 2008 -0800\r
--\r
--    Fix OFED v2 package to build against and target /dat2/include directory.\r
--    \r
--    Prevous patch missed dat_osd.h, dapltest/dtest incorrect.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 4 13:00:45 2008 -0800\r
--\r
--    uDAT/DAPL: Fix package to build against and target /dat2/include directory.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 29 16:34:49 2008 -0800\r
--\r
--    Release 2.0.5 - ChangeLog updated\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 356cf91905d39ade06d76ab9ace6203cd7907d93\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 29 16:33:10 2008 -0800\r
--\r
--    libdat: rename libdat.so to libdat2.so to coexist with v1 devel\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d9a9f46ee220ec9c479756acc306ed68060a662f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jan 28 13:55:35 2008 -0800\r
--\r
--    Release 2.0.4 - README\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 533983cec914a7ecc6829934a56f867d7870e301\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jan 28 12:06:03 2008 -0800\r
--\r
--    Release 2.0.4 Changelog\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Jan 28 12:04:18 2008 -0800\r
--\r
--    Relase package 2.0.4\r
--\r
--commit 95935648f81ac5177ae7120b35e55483902b8c64\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jan 23 16:40:48 2008 -0800\r
--\r
--    dapltest does not include definitions for inet_ntoa.\r
--    At load time the symbol was resolved but with the\r
--    default definition of int, instead of char*, it caused\r
--    segfault. Add correct include files in dapl_mdep_user.h\r
--    for linux.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jan 23 14:46:30 2008 -0800\r
--\r
--    Add freeaddrinfo to deallocate getaddrinfo buffer.\r
--    Cleanup a few printf messages.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jan 23 14:25:21 2008 -0800\r
--\r
--    Fix for uDAPL v2 using extended operation. After extension completion,\r
--    the DTO cookie must be checked for type before deallocating to handle\r
--    inbound immediate data in receive. The sample dtestx client will fail\r
--    when running loopback if the rdma immediate is received from remote\r
--    before the rdma immediate request completion fires.\r
--    \r
--    Bug causes following dtestx client error:\r
--    dat_ib_post_rdma_write_immed\r
--       returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jan 17 11:30:27 2008 -0800\r
--\r
--    WinOF: update dapltest,dtest directories for windows build\r
--    WinOF: add README.windows\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 9bececbb32dd31d4a3528e8f000a773e5c593430\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jan 17 11:24:46 2008 -0800\r
--\r
--    WinOF: update dtestx for windows build\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Jan 17 11:23:21 2008 -0800\r
--\r
--    WinOF: add build enviroment, cleanup old makefiles\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 15 16:59:34 2008 -0800\r
--\r
--    WinOF: name collision with ibal verbs ib_cm_handle_t\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 7c5418a781c1dfdb37b09450b5df40363dce84b4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 15 16:06:10 2008 -0800\r
--\r
--    dtest: dat_evd_query for correct size\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 6de5e635c01e78bde6e153b727926da900677d52\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 15 16:03:27 2008 -0800\r
--\r
--    dapltest: WinOF support.\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--\r
--commit c680e95b96e57bd8b69b1c73e95730854fcea028\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 15 14:54:57 2008 -0800\r
--\r
--    openib_cma: fix cleanup issues in destroy_cm_id\r
--                add macros to convert SID and PORT\r
--                fix init/responder settings in accept\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 15 14:49:54 2008 -0800\r
--\r
--    Modifications for WinOF build and endian support for RMR info\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jan 15 14:39:18 2008 -0800\r
--\r
--    WinOF: DAT_API changes, white space and tab cleanup\r
--           IBAL provider code added\r
--    \r
--    Common code: initialize cookie pool buffer\r
--                 add dapl extension DTO counter\r
--                 add get_cqe_op_str debug call\r
--                 remove excess dbg in evd_dequeue\r
--                 add dbg assert to sp_search_cr\r
--                 IBAL provider support _VENDOR_IBAL_\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 68f2ad0af3623dec27b1223aeaca6357348eef4b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jan 4 08:32:39 2008 -0800\r
--\r
--    Windows specific -\r
--       IBAL support in evd_create\r
--       Build IB extensions by default\r
--    Common code -\r
--       check return status, evd_free, evd_wait\r
--       add dapl_event_str function\r
--       definitions for dat_os_library_error, dat_os_ungetc\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d21f36406408245ac979f0b9594e7d1d0b9a3852\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jan 4 08:32:19 2008 -0800\r
--\r
--    Common code -\r
--       Missing DAT_API defs\r
--       casting to fix build issues\r
--       bitmaps for extension debug\r
--       DAPL_BAD_PTR macro\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 258678a381c6a0170020c48b0ba627e820abd3e7\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jan 4 08:31:59 2008 -0800\r
--\r
--    Common code -\r
--       Add DAT_API definitions for dat_redirection.h, udat_redirection.h\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jan 4 08:31:27 2008 -0800\r
--\r
--    Windows specific -\r
--       Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider\r
--       Support for direct object on CQ\r
--       INIT and FINI changes\r
--       setup dat.conf default path, fix sr parsing\r
--    Common code -\r
--       Add Stan Smith as contributor\r
--       O/S independent dat_os_library_error()\r
--    \r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit b3ba3dc9743baf3bff243e8969edf3395d1118dd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Dec 11 14:44:24 2007 -0800\r
--\r
--    2/2 uDAPL changes to sync common code base with WinOF\r
--     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )\r
--     - cleanup platform specific definitions for windows\r
--     - c++ support\r
--     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE\r
--\r
--commit 92d7eef38877ad472a91e5e9f88e4e49657716bf\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Dec 11 14:43:05 2007 -0800\r
--\r
--    1/2 uDAT changes to sync common code base with WinOF\r
--     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )\r
--     - cleanup platform specific definitions for windows\r
--     - c++ support\r
--     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: Stan Smith <stan.smith@intel.com>\r
--\r
--commit 95764c6da28284d29071cf01d1a09bdcb967a971\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Dec 4 13:19:27 2007 -0800\r
--\r
--    - Fix size of evd request queue on creation\r
--    - Add query and checking of DTO request queue\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6\r
--Merge: 11a165a... abb4356...\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 27 13:31:32 2007 -0800\r
--\r
--    master_dat2.0_merge\r
--\r
--commit abb4356cd765d38cf5cff2dfbdb610b380f944a2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 20 12:10:39 2007 -0800\r
--\r
--    Release 2.0.3\r
--\r
--commit d2c66eb7363234c5a9fb82aa92df1c132e46477e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Nov 20 12:07:58 2007 -0800\r
--\r
--    - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices\r
--    - Add missing ia_query for max_iov_segments_per_rdma_write\r
--    - Cleanup CMA code no longer supported by rdma_cm\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 3a3519167bd65bd999424788f139b930b099b405\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Nov 19 15:26:44 2007 -0800\r
--\r
--    Change dapltest timers to use gettimeofday instead of get_cycles for better portability.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 11a165a1868b1748fe476e08fc40af620f961cd2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 31 10:58:51 2007 -0800\r
--\r
--    - DAT/DAPL Version 1.2.3 Release 1\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 31 10:55:48 2007 -0800\r
--\r
--    ChangeLog update\r
--\r
--commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Oct 31 10:55:05 2007 -0800\r
--\r
--    - DAT/DAPL Version 2.0.2 Release 1\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 43931378b9d4f5f721da828623f1e391f32f446b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 30 09:06:24 2007 -0800\r
--\r
--    - Add ChangeLog\r
--    - update cma provider to report remote and local ports via dat_ep_query.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Oct 25 14:37:14 2007 -0700\r
--\r
--    Fix dapltest endian issue with mem_handle, mem_address.\r
--    \r
--    Signed-off-by: Shirley Ma <xma@us.ibm.com>\r
--\r
--commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Oct 25 14:36:12 2007 -0700\r
--\r
--    Fix dapltest endian issue with mem_handle, mem_address.\r
--    \r
--    Signed-off-by: Shirley Ma <xma@us.ibm.com>\r
--\r
--commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 16 14:23:17 2007 -0700\r
--\r
--     Fix dtest to build properly with extensions.\r
--    \r
--     Modify dat.h dat_event to include event_extension_data[8].\r
--     Extend struct dat_event outside of extension build\r
--     switch to enable non-extended applications to work\r
--     with extended libraries. Otherwise, there is a potential\r
--     for the event callee to write back too much event data\r
--     and exceed callers non-extended event buffer.\r
--    \r
--     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d7134fb2bcad6f4f68410af997f8791edd788cfb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 16 14:10:52 2007 -0700\r
--\r
--        Use inet_ntoa instead of open coding it. IP addresses were being\r
--        reversed on PowerPC.\r
--    \r
--        On PowerPC the timebase ticks at a different frequency to the CPU.\r
--        dapltest currently assumes a 1:1 relationship, and gives bogus values\r
--        when scaling timebase to real time.\r
--    \r
--        To fix this, look at the timebase field in /proc/cpuinfo instead. To\r
--        keep things consistent with x86, scale that value to MHz.\r
--    \r
--        Signed-off-by: Anton Blanchard <anton@samba.org>\r
--\r
--commit c6710c291a4f7c0845a4535767d41d66f092fabf\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 16 14:09:56 2007 -0700\r
--\r
--    Use inet_ntoa instead of open coding it. IP addresses were being\r
--    reversed on PowerPC.\r
--    \r
--    On PowerPC the timebase ticks at a different frequency to the CPU.\r
--    dapltest currently assumes a 1:1 relationship, and gives bogus values\r
--    when scaling timebase to real time.\r
--    \r
--    To fix this, look at the timebase field in /proc/cpuinfo instead. To\r
--    keep things consistent with x86, scale that value to MHz.\r
--    \r
--    Signed-off-by: Anton Blanchard <anton@samba.org>\r
--\r
--commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 16 14:02:36 2007 -0700\r
--\r
--     Minor clean-up of cr/lf\r
--    \r
--     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 33fd0628497911df11dea640aea4660e54989ed6\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 16:01:37 2007 -0700\r
--\r
--    Final changes for 2.0.1-1 package, OFED 1.3 ALPHA\r
--    Fix build issue with SLES 10, gcc++ compiler\r
--    \r
--     Signed-off-by: Jimmy Hill <jimmy.hill@us.ibm.com>\r
--     Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 14:50:02 2007 -0700\r
--\r
--    Final changes for package 1.2.2-1, OFED 1.3 ALPHA\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 52bc16939e87587f8208e775dd061f54196a9acb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 11:58:46 2007 -0700\r
--\r
--    Change v2 dat.conf provider names to associate with ib net devices\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit d22e62f989dd16d503d5430ffe6f55075139e057\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 11:43:34 2007 -0700\r
--\r
--    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
--    than times().\r
--    \r
--    Signed-off-by: Anton Blanchard <anton@samba.org>\r
--\r
--commit a64eae5bd36598a5c93010e07869e95599aa8ceb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 11:41:40 2007 -0700\r
--\r
--    Change v2 dat.conf provider names to associate with ib net devices\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 11:35:21 2007 -0700\r
--\r
--    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
--    than times().\r
--    \r
--    Signed-off-by: Anton Blanchard <anton@samba.org>\r
--\r
--commit 66bf23e3e53f370c92803f162144947f29ce06d8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 11:30:15 2007 -0700\r
--\r
--    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
--    than times().\r
--    \r
--    Signed-off-by: Anton Blanchard <anton@samba.org>\r
--\r
--commit c220760bbb1f6357b6e187ff6c5e576dd74fd504\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Oct 2 10:39:09 2007 -0700\r
--\r
--    Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using\r
--    the kernel atomic routines, code them explicitely like x86 does.\r
--    \r
--    Signed-off-by: Anton Blanchard <anton@samba.org>\r
--\r
--commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Sep 28 17:04:54 2007 -0700\r
--\r
--    Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 493e65b5b47f47e4824f775959fd98e56aeaccc4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Sep 28 17:03:41 2007 -0700\r
--\r
--    Clean up packaging, modify dat.conf for cma provider name change to ofa\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Sep 20 12:25:55 2007 -0700\r
--\r
--      Modifications to coexist with 2.0 libraries\r
--         - fix RPM specfile, configure.in,  1.2.2 package\r
--         - modify dat.conf\r
--    \r
--        Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Sep 20 10:55:19 2007 -0700\r
--\r
--    Modifications to coexist with 1.2 libraries\r
--     - cleanup CR-LF in dtestx\r
--     - fix RPM specfile, 2.0.1 package\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 230767742b8287490373c09d1bd346337b375b48\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 22 11:48:20 2007 -0700\r
--\r
--    Update copyright in specfile\r
--\r
--commit 5294cbe5e58f67d0a98862edea3684fff6e773bb\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jun 22 11:47:14 2007 -0700\r
--\r
--    Update Copyright in specfile\r
--\r
--commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 6 13:20:38 2007 -0700\r
--\r
--    Update specfile to reflect DAT/DAPL 1.2.1 release\r
--\r
--commit babb95eff1bcef88bed46e92c323193d8f039eff\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Jun 6 11:48:07 2007 -0700\r
--\r
--    More changes to the release notes\r
--\r
--commit 0f299bf1deb9198b2f008c3ffa717bef252b6097\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jun 5 15:56:17 2007 -0700\r
--\r
--    Update release notes\r
--\r
--commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Jun 5 15:52:18 2007 -0700\r
--\r
--    Add release notes updated for OFED 1.2 release\r
--\r
--commit f332badb80f0b1d88bf2d70dba0c90afc40f088f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu May 31 12:43:28 2007 -0700\r
--\r
--    Add provider specific interface to uDAPL for extensions support.\r
--    Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events\r
--    Remove unnecessary check on dats_set_ia_handle in dat_ia_openv\r
--    Clean up specfile and some extra LF's\r
--\r
--commit 4d7e30586402149228a30bea3036466395577ec4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 16 12:56:39 2007 -0700\r
--\r
--    add iwarp extension include file\r
--\r
--commit d9963cc9984c06f147b92877945e847f657cd512\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 16 12:52:38 2007 -0700\r
--\r
--    clean up some CR's in include files\r
--\r
--commit 80f4e8c4be02bac5d472e1e6c4937079882a0388\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 9 16:21:16 2007 -0700\r
--\r
--    Take out references to specific 1.1 verbs definitions (ibv_comp_channel).\r
--\r
--commit 544fbb873d5320e9606f176c4b71bcba0e257d7d\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 9 12:51:53 2007 -0700\r
--\r
--    Bug Fixes:\r
--      - 606: Return local and remote ports with dat_ep_query\r
--      - 585: Add bonding example to dat.conf\r
--\r
--commit e64079f7b961aa9a672711f0e933a77f3999d302\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 7 15:54:59 2007 -0700\r
--\r
--    Update dapltest to use default device OpenIB-cma\r
--    Fix dapltest manpage, example for performance test wrong\r
--\r
--commit 7cda2304a6880371ec2d9451a4f83a7a254bc474\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon May 7 12:49:18 2007 -0700\r
--\r
--    Fix issues with IB DTO extensions\r
--     - debug print_cqe updated for latest IBV definitions\r
--     - dapli_evd_cq_to_event modified to handle both post and receive extensions\r
--     - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap\r
--     - modify cookie DTO types to support extensions properly\r
--\r
--commit 82a6750d31cd432c7e09298fc98c0e7e74abd012\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri May 4 17:17:41 2007 -0700\r
--\r
--    Add new dapl functions for 2.0 (stubs for now)\r
--    - dapl_ep_post_send_invalidate\r
--    - dapl_ep_post_rdma_read_to_rmr\r
--    - dapl_ia_ha\r
--    - dapl_csp_create, query, free\r
--    - dapl_cno_trigger\r
--    - dapl_cno_fd_create\r
--    - dapl_extensions\r
--    \r
--    Add new 2.0 parameters to existing API's\r
--    - dapl_cr_reject\r
--    - dapl_rmr_bind\r
--\r
--commit 8679aaf56c781715adc132a38a731e36194570f1\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu May 3 09:44:43 2007 -0700\r
--\r
--    update dtestx.c, default provider OpenIB-cma\r
--\r
--commit 527f6d19125e9eec7ecef03a8633626b0043a2f4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed May 2 17:27:44 2007 -0700\r
--\r
--    Added IB extensions and dtestx as an example program using\r
--    rdma write with immediate and atomic operations\r
--\r
--commit 83ac961b505346708f12d59152146f3b04c8306f\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Apr 30 10:55:59 2007 -0700\r
--\r
--    Fixes atomic operation build problem with ia64 and RHEL5.\r
--\r
--commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Apr 26 17:29:37 2007 -0700\r
--\r
--    Update README and dapltest manpage\r
--\r
--commit 9a951d0a8713657da90568c0613eb48f5010cf1e\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 3 16:35:17 2007 -0700\r
--\r
--    Cleanup RPM specfile for the dapl package, move to 1.2-1 release.\r
--\r
--commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Apr 3 14:38:31 2007 -0700\r
--\r
--    Add support for multiple IB devices to dat.conf to support IPoIB HA failover.\r
--\r
--commit 5434b720b36de2f262a02ff9dfccd99953c09e59\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Mar 15 10:46:33 2007 -0800\r
--\r
--    Fix ia64 builds on SUSE\r
--\r
--commit b0f9eef1aa7f279802da233480cf6c495e16565b\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Mar 14 13:29:08 2007 -0800\r
--\r
--    DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider\r
--\r
--commit 61858b925f4c1a6f9edba6389a5bd601daf936e9\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Mar 14 11:08:19 2007 -0800\r
--\r
--    change DAT_VERSION major and minor numbers to 2.0\r
--\r
--commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Mar 14 10:43:56 2007 -0800\r
--\r
--    add provider support to dtest, set default to OpenIB-cma\r
--\r
--commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Tue Mar 13 16:20:20 2007 -0800\r
--\r
--    add provider option to dtest, set default to OpenIB-cma\r
--\r
--commit 76a43cace54567135bac7ae54e336c6595b65fd9\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Mar 9 13:09:14 2007 -0800\r
--\r
--    Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib\r
--\r
--commit 921687efed992e6ab72dfb731687b6816324a024\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Thu Mar 8 16:01:29 2007 -0800\r
--\r
--    Update the README\r
--\r
--commit 52ed210ae99b291f72441e71459006b5f2c851ce\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Mar 7 15:34:41 2007 -0800\r
--\r
--    - Fix bug 408, dapltest compilation failure on 32 bit arch\r
--    - Update libdat.spec.in file to build uDAPL RPMs correctly\r
--\r
--commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Mar 5 14:15:49 2007 -0800\r
--\r
--    Fix build issues with dtest and dapltest. Define build tree path to dat/include.\r
--\r
--commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Feb 28 17:14:55 2007 -0800\r
--\r
--    Add dapltest headers to EXTRA_DIST\r
--    Modify dtest to delay before accepting\r
--    \r
--    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--\r
--commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Feb 26 13:54:15 2007 -0800\r
--\r
--    Adding dtest and dapltest to the build. Manual pages created.\r
--\r
--commit d245664e27148e54469268ad81f41b2a894a131a\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Fri Jan 19 16:21:30 2007 -0800\r
--\r
--    uDAPL changes to support exchanging and validation of the device responder_resources and the\r
--    initiator_depth during connection establishment\r
--\r
--commit 2280f833090aa9f750d5be8f9b06e7e08e642da5\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Wed Dec 6 11:49:27 2006 -0800\r
--\r
--    Update cma provider to sync with rdma_ucm changes\r
--\r
--commit 89448545b415b6dff57e3314b020619f6b979ef8\r
--Author: Arlin Davis <arlin.r.davis@intel.com>\r
--Date:   Mon Dec 4 13:54:20 2006 -0800\r
--\r
--    Update autogen to create config directory\r
--\r
--commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Tue Nov 7 20:22:05 2006 +0000\r
--\r
--    r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL\r
--    level.\r
--    \r
--    Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a\r
--    recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified.\r
--    \r
--    Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support\r
--    to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call\r
--    when receiving the disconnect request to guarantee a disconnect reply and event on the remote side.\r
--    The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing\r
--    to DISCONNECTED in the event callback.\r
--    \r
--    Here are the new options (environment variables) with the default setting:\r
--    \r
--    DAPL_CM_ARP_TIMEOUT_MS   4000\r
--    DAPL_CM_ARP_RETRY_COUNT  15\r
--    DAPL_CM_ROUTE_TIMEOUT_MS  4000\r
--    DAPL_CM_ROUTE_RETRY_COUNT 15\r
--\r
--commit c73aeb904504a0bc6cce0fb1248af9ba39521395\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Oct 12 22:41:33 2006 +0000\r
--\r
--    r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported.\r
--\r
--commit b1d94b26610f682cdd43bde2aecf5004e0865422\r
--Author: Steve Wise <swise@opengridcomputing.com>\r
--Date:   Tue Sep 12 18:15:39 2006 +0000\r
--\r
--    r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC\r
--    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 99a5dddd07d4c271ebb075b5b0f800101f850a56\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Sep 7 18:09:11 2006 +0000\r
--\r
--    r9346:\r
--    inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider\r
--\r
--commit b53a87c856d9754313da9543a1dac5c6f1307085\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Wed Sep 6 20:36:09 2006 +0000\r
--\r
--    r9315:\r
--    Fill out some unitialized fields in the ia_attr structure\r
--    returned by dat_ia_query().\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: Robert Walsh <robert.walsh@qlogic.com>\r
--\r
--commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Fri Aug 11 20:44:23 2006 +0000\r
--\r
--    r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default.\r
--\r
--commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Wed Jul 19 17:15:06 2006 +0000\r
--\r
--    r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider\r
--\r
--commit 25fb8c376547de895a170194c09b2d72dfea789d\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Mon Jul 17 22:59:17 2006 +0000\r
--\r
--    r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues.\r
--\r
--commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af\r
--Author: Anton Blanchard <anton@samba.org>\r
--Date:   Mon Jul 17 21:26:03 2006 +0000\r
--\r
--    r8562: Fix some suspicious inline assembly:\r
--    - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we\r
--      shouldnt export them to userspace. Replace it with lwsync and isync.\r
--    - The comment says its implemenenting cmpxchg64 but in fact its\r
--      implementing cmpxchg32. Fix the comment.\r
--    \r
--    Signed-off-by: Anton Blanchard <anton@samba.org>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 63759108a1376b6e45a4491551f71d8cafdcddc1\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Jul 12 14:56:26 2006 +0000\r
--\r
--    r8503: Fix IA64 build problems reported by John Partridge <johnip@sgi.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Jun 22 22:02:56 2006 +0000\r
--\r
--    r8182: Lower the reject debug message level so we don't see warnings\r
--    when consumers reject.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit f14889bb0cd22e897148ea2f6931a6b4f23143b0\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Jun 22 21:13:37 2006 +0000\r
--\r
--    r8181: Added support for active side TIMED_OUT event from a provider.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Jun 22 20:58:06 2006 +0000\r
--\r
--    r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 893698c31a0d8e60227806d992485a44375840cb\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Jun 19 17:20:45 2006 +0000\r
--\r
--    r8112: Update for new rdma_create_id() function signature.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 53483d84b0d02c432d9435d2f8e840cab3ded320\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Wed Jun 14 16:17:39 2006 +0000\r
--\r
--    r8008: Set max rdma read per EP attributes\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Mon Jun 12 15:42:50 2006 +0000\r
--\r
--    r7931: Report the proper error and timeout events.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Mon Jun 12 14:51:14 2006 +0000\r
--\r
--    r7928: Socket CM fix to guard against using a loopback address\r
--    as the local device address.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 152219cf83c61e459fdf3de03d4e83ddba045230\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Tue Jun 6 21:46:44 2006 +0000\r
--\r
--    r7755: Use the uCM set_option feature to adjust connect request timeout\r
--    and retry values. Also, a fix to disallow any event after a disconnect\r
--    event.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 3a0686a2624ed28c7ea37b650415801f1cedbd10\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed May 31 19:55:57 2006 +0000\r
--\r
--    r7608: Correct comment.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit eb760157c90f59183b424ac8e71474fe0b46094c\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu May 18 21:54:12 2006 +0000\r
--\r
--    r7347: Undo inadvertent change.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 27256222b42fecfac8a44b3f82fe2524ecc72de2\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu May 18 21:50:27 2006 +0000\r
--\r
--    r7346: Fix for uCMA provider to return the correct event as a result of\r
--    rejects. Also, ran into a segv bug with dapl_ep_create when\r
--    creating without a conn_evd.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit b1b6e16f3e41e123cd347bc78b01e3272076362b\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Fri May 12 19:50:19 2006 +0000\r
--\r
--    r7141: Update the uDAPL openib_cma provider to work with the new\r
--    uCMA event channel interface.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 27f9f0c106662cc7b41bcb747495860a1b6c7133\r
--Author: Steve Wise <swise@opengridcomputing.com>\r
--Date:   Tue May 2 21:33:35 2006 +0000\r
--\r
--    r6873: Transaction test change to comply with the iWARP MPA protocol's\r
--    "Connection Startup Rules".\r
--    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 060d09f974ffbe73672e17641b2f18d3821d31a7\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Fri Apr 28 13:44:17 2006 +0000\r
--\r
--    r6736: getaddrinfo() fix for debug builds and some additional debug messages for\r
--    connect errors and rejects.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Apr 19 16:49:34 2006 +0000\r
--\r
--    r6520: Fix compilation warning.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 115fcc396164066326f9447d71af798a381d063f\r
--Author: Steve Wise <swise@opengridcomputing.com>\r
--Date:   Wed Apr 19 16:32:01 2006 +0000\r
--\r
--    r6518: Do not always generate an event for an abrupt disconnect.\r
--    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit f959bb786cd884bf4d2a5da4d299da6297d65293\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Apr 19 16:30:37 2006 +0000\r
--\r
--    r6517: Generate a disconnect event for providers that do not generate\r
--    one automatically.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit bb467511cf6e217147817ba12bbe800aae97cab5\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Apr 19 16:25:33 2006 +0000\r
--\r
--    r6516: Fix compilation error.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 117a9856c269bf08b738a1923c92f5a1949f6cc1\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Apr 10 20:16:44 2006 +0000\r
--\r
--    r6392: Fix for RDMA cm id destruction and debug builds.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Apr 6 15:32:47 2006 +0000\r
--\r
--    r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct\r
--    attribute.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 304f48370adcaa12463c1a7d99e513164b83810c\r
--Author: Steve Wise <swise@opengridcomputing.com>\r
--Date:   Thu Apr 6 15:16:10 2006 +0000\r
--\r
--    r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute\r
--    max_rdma_read_iov based on the openib max_sge_rd device attribute.\r
--    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Apr 4 18:29:00 2006 +0000\r
--\r
--    r6221: Change the mechanism by which library init and fini functions are specified\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 5a0598b90ab021cb2115e3791cb38dcfc0347948\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Apr 3 17:29:55 2006 +0000\r
--\r
--    r6182: Remove unused variables.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit b8084c4edc21b5ac2191ec654a882b65bad0c77d\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Apr 3 15:29:30 2006 +0000\r
--\r
--    r6179: Fix dapltest compiler warnings.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit abdbec194670d72012d481b98b2e6f728e9c5b48\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Apr 3 14:08:48 2006 +0000\r
--\r
--    r6168: Fixed debug prints of 64-bit values and removed compile warnings.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 52de2a35e02ddeb15887d0d690b52a4e02812e57\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Mar 21 22:28:10 2006 +0000\r
--\r
--    r5939: Move libdat.spec to libdat.spec.in\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Fri Mar 17 22:02:18 2006 +0000\r
--\r
--    r5879: Add GNU Autotools support and an RPM spec file\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 9d00582b8be33add8d3e4173e8311b1a222b0b34\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Mar 16 22:40:18 2006 +0000\r
--\r
--    r5871: Fixes a corner case where a CMA event was not acknowledged during\r
--    disconnect processing.\r
--    \r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Mar 13 18:15:49 2006 +0000\r
--\r
--    r5789: Reduces some debug output in the async thread and fixes listen\r
--    processing of EBUSY.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit afd558cbdada66e01aa553364b9a126da00dbe65\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Wed Mar 8 14:24:26 2006 +0000\r
--\r
--    r5684: Remove unused NO_EP_STATE.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Feb 28 15:41:03 2006 +0000\r
--\r
--    r5529: Fix to destroy QPs in all cases and close the HCA.\r
--    \r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Jan 9 20:17:33 2006 +0000\r
--\r
--    r4855: Make use of dat_evd_wait the default.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 254bd0e349bafbd970d6475efcafd7e52f05415e\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Mon Jan 9 16:59:38 2006 +0000\r
--\r
--    r4852: Fix disconnect event processing and update dtest to validate.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit f69d737ee51f6b00a1e6cf8531695a61a322651b\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Fri Dec 16 02:03:05 2005 +0000\r
--\r
--    r4502: Query for rd_atomic values.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 86566b556920a51f1e538d245674058682012668\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Fri Dec 16 01:57:30 2005 +0000\r
--\r
--    r4501: Allow a network name, network address, or device name in the dat.conf file.\r
--    Singed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f\r
--Author: Roland Dreier <rolandd@cisco.com>\r
--Date:   Wed Dec 14 20:44:36 2005 +0000\r
--\r
--    r4466: Change libibverbs API for listing all known devices from\r
--    ibv_get_devices() to ibv_get_device_list(), and update all\r
--    in-tree uses of this API.\r
--    \r
--    Signed-off-by: Roland Dreier <rolandd@cisco.com>\r
--\r
--commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Dec 5 16:37:46 2005 +0000\r
--\r
--    r4308: Fix a gcc 4.0 warning\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Thu Dec 1 15:03:10 2005 +0000\r
--\r
--    r4279: Added CMA API support.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Nov 10 21:39:34 2005 +0000\r
--\r
--    r4018: Fixed some problems with the free build openib_scm version and turned\r
--    down some debugging and added some debug prints for uAT path records.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Oct 31 18:27:13 2005 +0000\r
--\r
--    r3917: Fix printing of debug statements.\r
--    Signed off by: Aniruddha Bohra <bohra@cs.rutgers.edu>\r
--    Signed off by: James Lentini <jlentini@netapp.com\r
--\r
--commit 4306debe3118948fca72a68ec20ef0d73b399fd1\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Oct 26 21:10:26 2005 +0000\r
--\r
--    r3882: uDAPL provider for OpenIB socket CM.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 42a64ec2ec1d8ec71492bfebba077b006684ce97\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Oct 13 20:45:22 2005 +0000\r
--\r
--    r3774: Fix the async error handling and callback mappings.\r
--    Updated TODO list.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde\r
--Author: Robert Walsh <rjwalsh@pathscale.com>\r
--Date:   Fri Oct 7 21:15:00 2005 +0000\r
--\r
--    r3693: Update some more ignores.\r
--\r
--commit 303147143afa9aa72906246a9f1973e4172f75b8\r
--Author: Todd Bowman <twbowman@gmail.com>\r
--Date:   Thu Oct 6 21:13:32 2005 +0000\r
--\r
--    r3687: Add PPC64 support for udapl\r
--    Signed-off-by: Todd Bowman <twbowman@gmail.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce\r
--Author: Todd Bowman <twbowman@gmail.com>\r
--Date:   Thu Oct 6 15:22:08 2005 +0000\r
--\r
--    r3683: Remove the dtest qualifier from the sdp range.\r
--    Signed-off-by: Todd Bowman <twbowman@gmail.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 33fbf9c81ac29492394e419588d856533e7fffb8\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Oct 3 14:59:22 2005 +0000\r
--\r
--    r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Sep 29 18:13:25 2005 +0000\r
--\r
--    r3619: Makefile fix.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 634b199218b775a8ed071c1faea519c4cc4ee4e3\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Sep 28 21:50:13 2005 +0000\r
--\r
--    r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and\r
--    adds support for SuSe.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 3a23c7135905666ff969b86dab3e90f90ac73008\r
--Author: Robert Walsh <rjwalsh@pathscale.com>\r
--Date:   Tue Sep 27 16:59:14 2005 +0000\r
--\r
--    r3567: Setup svn:ignore on a bunch of directories.\r
--\r
--commit d41ea62125636a58e8748871e372810c09865b0a\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Sep 22 21:24:38 2005 +0000\r
--\r
--    r3525: Improve dtest and measure RDMA reads\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 32258d13af6aaf76078ec6ba187d8129a0f70397\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Sep 21 19:54:07 2005 +0000\r
--\r
--    r3513: Temporary workaround for the RDMA read performance anomaly\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 990bdc4320809e0b989c90c24bef361c1bc91c7f\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Sep 20 17:00:37 2005 +0000\r
--\r
--    r3494: Moved dapl_evd_modify_cno.c to match SourceForge\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Sep 20 16:17:59 2005 +0000\r
--\r
--    r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per\r
--    device basis, and add copyrights for kDAPL cm work that was\r
--    used in uDAPL.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit c1d45137c2e26024142f24207344e3e48a577b83\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Thu Sep 15 21:43:21 2005 +0000\r
--\r
--    r3453: Bind communication identifiers to a device to support device removal.\r
--    Export per HCA CM devices to userspace.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Wed Sep 14 17:44:44 2005 +0000\r
--\r
--    r3432: Request address resolution using ATS.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Sep 12 19:14:43 2005 +0000\r
--\r
--    r3378: Added DAPL documentation.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 8911b60eb16770d28907c14e45556444317dd276\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Sep 12 19:10:13 2005 +0000\r
--\r
--    r3377: Removed executable premission.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Fri Sep 9 21:51:58 2005 +0000\r
--\r
--    r3349: Update DAPL to match the verbs and CM event processing APIs.\r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a\r
--Author: Arlin Davis <ardavis@ichips.intel.com>\r
--Date:   Tue Sep 6 19:34:46 2005 +0000\r
--\r
--    r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread.\r
--    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Aug 29 15:07:44 2005 +0000\r
--\r
--    r3232: validate default settings so they don't exceed device maximums\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit ac5308b4aac7de79a356439dfec2312faf7705ae\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Mon Aug 29 14:15:23 2005 +0000\r
--\r
--    r3227: Support for ibv_query_port, device, and gid.\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7\r
--Author: Sean Hefty <sean.hefty@intel.com>\r
--Date:   Sun Aug 21 22:30:08 2005 +0000\r
--\r
--    r3143: - Add user specified context to all uCM events.  Users will not retrieve\r
--      any events associated with the context after destroying the corresponding\r
--      cm_id.\r
--    - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM.\r
--      This call may be used to set QP attributes properly before modifying the QP.\r
--    - Fixes some error handling syncrhonization and cleanup issues.\r
--    - Performs some minor code cleanup.\r
--    - Replaces the ucm_simple test program with a userspace version of cmpost.\r
--    - Updates DAPL to the new API.\r
--    \r
--    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
--\r
--commit ec0f86d7c55830c6dffded585c04754cc6ac2a83\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Aug 16 14:10:13 2005 +0000\r
--\r
--    r3107: Removed unused debug counter macros\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 49087ba27bd93769bb64d7ac5c454de1b94005bc\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Tue Aug 16 14:07:42 2005 +0000\r
--\r
--    r3106: Implemented debug counters\r
--    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
--    Signed-off by: James Lentini <jlentini@netapp.com>\r
--\r
--commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 20:23:56 2005 +0000\r
--\r
--    r3072: Update from SourceForge DAPL: use the LMR context in calls to\r
--    dapls_hash_remove()\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 878e524c5cc63a62802d28fdc215a2b69ceb1141\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 20:07:06 2005 +0000\r
--\r
--    r3071: Updates from SourceForge DAPL: EVD updates\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 19:57:40 2005 +0000\r
--\r
--    r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit f2801ae6caf010d660fe302970dabddc8948e1bf\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 19:46:39 2005 +0000\r
--\r
--    r3069: Updates from SourceForge DAPL: size EP IOV correctly\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit c87fd235eaf0b3a30e005422f7d347c406c14f2c\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 19:35:05 2005 +0000\r
--\r
--    r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and\r
--    fixed the spelling of ib_hca_transport_t.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit a88bebc09a9655e462b3d32dfddec823024eab59\r
--Author: James Lentin <jlentini@netapp.com>\r
--Date:   Thu Aug 11 19:24:56 2005 +0000\r
--\r
--    r3067: Update from SourceForge DAPL: use include guard\r
--    Signed-off-by: James Lentin <jlentini@netapp.com>\r
--\r
--commit d2da08920de882a9a266f0606b81150c625fa003\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 19:21:56 2005 +0000\r
--\r
--    r3066: Update from SourceForge DAPL: optimization to dapl_ep_query\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 18:39:34 2005 +0000\r
--\r
--    r3065: Update from DAPL SourceForge: indicate which handle is invalid\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 6d8f34137776c32149251bdec493c017b399cd10\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 18:35:58 2005 +0000\r
--\r
--    r3064: Update from DAPL SourceForge: set ep param values.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 18:33:47 2005 +0000\r
--\r
--    r3063: Updates from DAPL SourceForge: QP state and connection event fix.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 3fc876339693c6f0eed5e57780e5342f301bd95c\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Thu Aug 11 18:23:33 2005 +0000\r
--\r
--    r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9\r
--Author: Hal Rosenstock <halr@voltaire.com>\r
--Date:   Fri Aug 5 17:59:38 2005 +0000\r
--\r
--    r2989: Fix dtest makefile\r
--    Signed-off-by: Hal Rosenstock <halr@voltaire.com>\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Fri Aug 5 17:57:31 2005 +0000\r
--\r
--    r2988: Remove kernel directory.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 9c4e246a5baf43cadc6380e91fd5a6e319777278\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Fri Aug 5 17:56:56 2005 +0000\r
--\r
--    r2987: Remove kernel code directory.\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 26706cb0de471ba47279de0cb949ba5a41de82cc\r
--Author: James Lentini <jlentini@netapp.com>\r
--Date:   Fri Aug 5 16:41:12 2005 +0000\r
--\r
--    r2986: Add uDAPL to the trunk\r
--    Signed-off-by: James Lentini <jlentini@netapp.com>\r
--\r
--commit 76aa2de7fe38a8595d88669842450084cfa88316\r
--Author: Roland Dreier <roland@topspin.com>\r
--Date:   Thu Nov 4 17:54:50 2004 +0000\r
--\r
--    r1139: Copy roland-merge branch to trunk\r
--\r
--commit 3bd72a559dfe22685aae33599c99d021d2ae4aca\r
--Author: Roland Dreier <roland@topspin.com>\r
--Date:   Tue Jul 20 21:34:32 2004 +0000\r
--\r
--    r502: Move 2.6-only source away from trunk\r
--\r
--commit 4f05b6ed3fd1d14161664c677264846eeb51dba5\r
--Author: Roland Dreier <roland@topspin.com>\r
--Date:   Tue Jul 20 21:34:32 2004 +0000\r
--\r
--    r502: Move 2.6-only source away from trunk\r
--\r
--commit 6da8b951c069072a2afc6aba03a3dca2c44db022\r
--Author: Roland Dreier <roland@topspin.com>\r
--Date:   Tue Jul 20 01:41:16 2004 +0000\r
--\r
--    r497: Move 2.6-only tree to gen2\r
-+commit f85be199252d12d27c7b7814771a4ca83a43d0c8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Aug 9 14:25:09 2010 -0700
-+
-+    common: increase default logging to include warnings
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 59489448a7918ab2a1a4b9bcac7e4661cdd97a23
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Aug 9 14:19:50 2010 -0700
-+
-+    common: add more debug levels for cm logging
-+    
-+    DAPL_DBG_TYPE_CM_EST   = 0x8000,
-+    DAPL_DBG_TYPE_CM_WARN  = 0x10000
-+    
-+    Add level for connection establishment and events
-+    and for retries/timer events.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 70c509bca8409d55ad7c4a248f453956d163778b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Aug 2 09:51:30 2010 -0700
-+
-+    common: cleanup CR linkings after DTO error on EP
-+    
-+    Add cleanup to remove CR from SP and EP
-+    during DTO errors in dapli_evd_cqe_to_event.
-+    
-+    dapl_sp_remove_ep needs to remove cr_ptr
-+    reference from EP before freeing cr object.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 319430b3bbfb8692dd3d21a21633bfee74cf5b7c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Aug 2 09:49:23 2010 -0700
-+
-+    ucm: cleanup CM debug warning messages
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7118731a890e9188bb02dc7a5b21ffd832855e9e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jul 23 15:17:53 2010 -0700
-+
-+    scm, ucm: improperly handles pkey check/query in host order
-+    
-+    Convert consumer input to network order before verbs
-+    query pkey check.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit c5504925b8b98006f421d53475e8ecd55b76f9dd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jul 12 15:57:34 2010 -0700
-+
-+    The linux compatability header file _errno.h is moving out of verbs.h.
-+    Include _errno.h in the windows osd header files, similar to how
-+    errno.h is included in the linux osd header files.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 455e9d6d0aeb753a9ecb4a130b0b237e1ffd4146
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 30 12:03:41 2010 -0700
-+
-+    windows: update SOURCES files to link winverbs.lib, which is
-+    needed for common ofa providers.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit b441934f5e55582ef01a91c01da720334345a452
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jun 17 12:58:22 2010 -0700
-+
-+    Release 2.0.29
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 6c6a482b8ad33d134f0631019b249bd0fea71007
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jun 17 12:40:21 2010 -0700
-+
-+    scm, ucm: add pkey, pkey_index, sl override for QP's
-+    
-+    On a per open basis, add environment variables
-+    DAPL_IB_SL and DAPL_IB_PKEY and use on
-+    connection setup (QP modify) to override default
-+    values of 0 for SL and PKEY index. If pkey is
-+    provided then find the pkey index with
-+    ibv_query_pkey for dev_attr.max_pkeys.
-+    Will be used for RC and UD type QP's.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 876942781e9bf72302184f3534a2ddc4068550ac
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jun 10 11:40:45 2010 -0700
-+
-+    cma: remove dependency on rdma_cma_abi.h
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b34ea37650b5eefeedfc463345775ff568df259e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 2 14:13:05 2010 -0700
-+
-+    configure: need a false conditional for verbs attr.link_layer member check
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 977f11871d3d4e98f602f890ade1c31cf4169c9c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 2 10:05:03 2010 -0700
-+
-+    ucm: incorrectly freeing port on passive side after reject
-+    
-+    cm_release was incorrectly freeing a client port
-+    assuming it was the server listening port. Move
-+    the listening port cleanup to remove_conn_listner
-+    and only cleanup client ports in cm_release.
-+    
-+    Error Messages indicating problem:
-+    
-+      CM_REQ retry 1 [lid, port, qpn]: 9 ff9a 340085 -> 9 6fa 34004e Time(ms) 1999 > 1600
-+      DUPLICATE: op REQ st CM_CONNECTED [lid, port, qpn]: 9 6fa 0x0 <- 0x9 ff9a 0x340085
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7aedfb1e9dcb9e2841ebe3496bb9aae33c1f6a5b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 2 09:45:42 2010 -0700
-+
-+    ucm: modify debug CM output for consistency, all ports, qpn in hex
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 8e776ff0621cee1824be224b7a32f79e89b0ebc2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 24 16:44:25 2010 -0700
-+
-+    Release 2.0.28
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 8fdbd949ef464aa57b13743ab087ea72f035fbc3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 24 16:28:05 2010 -0700
-+
-+    config: add conditional check for new verbs port_attr.link_layer
-+    
-+    Check for link_layer type ETHERNET and set global for GID
-+    configuration on modify QP.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 1ce0875fb2ac6120cfee006b48a20a4ec38f599b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 24 10:30:28 2010 -0700
-+
-+    dat.conf: update manpage with latest provider information, add examples
-+    
-+    Add information regarding OpenFabrics provider choices
-+    and explain cma, scm, and ucm providers.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9c42d5872feb07f25f003e01263a3062ebc3bdbb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 19 16:38:53 2010 -0700
-+
-+    cma, scm: new provider entries for Mellanox RDMA over Ethernet device
-+    
-+    Add options for netdev eth2 and eth3 for cma and for device mlx4_0 port 1 and 2 for scm.
-+    
-+    ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" ""
-+    ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" ""
-+    ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" ""
-+    ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" ""
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit d947e05317fe7fef19c90f772ec8f458ff52b196
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 19 15:17:58 2010 -0700
-+
-+    dapltest: server info devicename is not large enough for dapl_name storage
-+    
-+    Server info device name is a 80 char array but the dapl device name
-+    that is copied is 256 bytes. Increase started_server.devicename definition.
-+    Chalk one up for windows SDK OACR (auto code review).
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit c7a7a886af194cf735ee1eb62d9e14967d51249a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 19 14:48:49 2010 -0700
-+
-+    windows: comp_channel.cpp is included by util.c in the openib_common.
-+    
-+    Remove it from device.c in individual providers to avoid
-+    duplicate definitions.
-+    
-+    Line endings were corrected to linux format from windows as part of
-+    the change.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit bcaa400778d14a977d5cd224056baa0cff06126d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 19 14:45:55 2010 -0700
-+
-+    windows: need to include linux directory to pick up _errno.h
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit c616a8549db461e39feed71f0f10228313d17b90
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 17 16:22:30 2010 -0700
-+
-+    scm: check for hca object before signaling thread
-+    
-+    There may not be an hca object attached to cm object
-+    when freeing during cleanup.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 1dbba72741da267f71903a9f2ec03628f3e8a47a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 17 16:15:21 2010 -0700
-+
-+    scm, cma: fini code can be called multiple times and hang via fork
-+    
-+    The providers should protect against forked child exits and
-+    not cleanup until the parent init actually exits. Otherwise,
-+    the child will hang trying to cleanup dapl thread. Modify to
-+    check process id for proper init to fini cleanup and limit
-+    cleanup to parent only.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b35cb1b16a9dda349dbb19bce9f9bd4afb7240a4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 14 16:20:52 2010 -0700
-+
-+    scm: add option to use other network devices with environment variable DAPL_SCM_NETDEV
-+    
-+    New environment variable can be used to set the netdev
-+    for sockets to use instead of the default network device
-+    returned using gethostname.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit cfdf8bb8951b1c19b8e42d58e4ec26070fdc078e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 14 10:27:50 2010 -0700
-+
-+    scm: cr_thread occasionally segv's when disconnecting all-to-all MPI static connections
-+    
-+    Note: no valid calltrace for segv on cr_thread because
-+    of state changing in switch statement from another
-+    thread, jumped unknown location.
-+    
-+    Program received signal SIGSEGV, Segmentation fault.
-+    [Switching to Thread 0x41a65940 (LWP 1328)]
-+    0x00002b2e7d9d5134 in ?? ()
-+    
-+    Add cm object locking on all state change/checking. When
-+    freeing CM object wakeup cr_thread to process
-+    state change to CM_FREE.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 4b04afc32940ac42fb2a9bc789a537b527d149fe
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu May 13 10:31:17 2010 -0700
-+
-+    scm: SOCKOPT ERR Connection timed out on large clusters
-+    
-+    Large scale all to all connections on +1000 cores
-+    the listen backlog is reached and SYN's are dropped
-+    which causes the connect to timeout. Retry connect
-+    on timeout errors.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 625369f991982f020c04156f312ecf2ecafd77b3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 10 12:46:17 2010 -0700
-+
-+    ucm: UD mode, active side cm object released to soon, the RTU could be lost.
-+    
-+    Will see following message with DAPL_DBG_TYPE set for Errors & Warnings (0x3):
-+    ucm_recv: NO MATCH op REP 0x120 65487 i0x60005e c0x60005e < 0xd2 19824 0x60006a
-+    
-+    The cm object was released on the active side after the connection
-+    was established, RTU sent. This is a problem if the RTU is lost
-+    and the remote side retries the REPLY. The RTU is never resent.
-+    Keep the cm object until the EP is destroyed.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 83eec7f19a7442fe568dea685cee7b02fef2f4d1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 10 12:35:51 2010 -0700
-+
-+    cma, ucm: cleanup issues with dat_ep_free on a connected EP without disconnecting.
-+    
-+    During EP free, disconnecting with ABRUPT close flag, the disconnect should wait
-+    for the DISC event to fire to allow the CM to be properly destroyed upon return.
-+    
-+    The cma must also release the lock when calling the blocking rdma_destroy_id given
-+    the callback thread could attempt to acquire the lock for reference counting.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit da83172db68d05f54b2c1c77b84ecf86dea0c693
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 28 15:37:27 2010 -0700
-+
-+    ucm: increase default UCM retry count for connect reply to 15
-+    
-+    On very large clusters UCM is timing out with retries at 10.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 5c710a197bb60268e99e8d1cd7fa26f89b366172
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 27 11:20:08 2010 -0700
-+
-+    scm: remove modify QP to ERR state during disconnect on UD type QP
-+    
-+    The disconnect on a UD type QP should not modify QP to error
-+    since this is a shared QP. The disconnect should be treated
-+    as a NOP on the UD type QP and only be transitioned during
-+    the QP destroy (dat_ep_free).
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 64c8009f7ba48c22a6829862447ab5f67c66ba55
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Apr 8 16:32:02 2010 -0700
-+
-+    windows: remove static paths from dapltest scripts
-+    
-+    signed-off-by: stan smith <stan.smith@intel.com>
-+
-+commit 84b78b0b586ee25c7ab78e2c5f7f19a3ce3f21ee
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Apr 8 09:38:57 2010 -0700
-+
-+    common: EP links to EVD, PZ incorrectly released before provider CM objects freed.
-+    
-+    unlink/clear references after ALL CM objects linked to EP are freed.
-+    Otherwise, event processing via CM objects could reference the handles
-+    still linked to EP. After CM objects are freed (blocking) these handles
-+    linked to EP are guaranteed not to refereence from underlying provider.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 297e149e7af631663ecc60472a3ee093a7f72059
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 7 11:12:21 2010 -0700
-+
-+    common: remove unnecessary lmr lkey hashing and duplicate lkey checking
-+    
-+    lmr lkey hashing is too restrictive given the returned lkey could be
-+    the same value for different regions on some rdma devices. Actually,
-+    this checking is really unecesssary and requires considerable overhead
-+    for hashing so just remove hashing of lmr lkey's. Let verbs device
-+    level do the checking and validation.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 96fba2ee7a0a1766f200c9486e62aad46d18bb09
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 29 12:20:34 2010 -0800
-+
-+    ibal: output completion code in deciaml & hex as intended
-+    
-+    sign-off-by: stan smith <stan.smith@intel.com>
-+
-+commit 753f7d35c814367f431deeb307e6decd933a8b5a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 15:02:44 2010 -0800
-+
-+    ucm: set timer during RTU_PENDING state change.
-+    
-+    The timer thread may pick up an unitialized timer
-+    value and timeout before the reply was sent.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9fc851021d91b282054cf28b4f83f7e5d376f228
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 14:47:58 2010 -0800
-+
-+    ucm: fix issues with new EP to CM linking changes
-+    
-+    Add EP locking around QP modify
-+    Remove release during disconnect event processing
-+    Add check in cm_free to check state and schedule thread if necessary.
-+    Add some additional debugging
-+    Add processing in disconnect_clean for conn_req timeout
-+    Remove extra CR's
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit a5da5e4dac52366a9fe9efeb9a128bd4511481e2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 14:18:06 2010 -0800
-+
-+    scm: add EP locking and cm checking to socket cm disconnect
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7f733cd1a9acd4b9b270a807673290362050053d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 09:44:44 2010 -0800
-+
-+    scm: new cm_ep linking broke UD mode over socket cm
-+    
-+    Add EP locking around modify_qp for EP state.
-+    Add new dapli_ep_check for debugging EP
-+    Cleanup extra CR's
-+    Change socket errno to dapl_socket_errno() abstraction
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit a528267020972e0c449f240ba72a0cc80a5d372e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 09:17:01 2010 -0800
-+
-+    openib common: add some debug prints to help isolate QP type issues
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit fdfdc439d091c878c74d23b9ac46a3320379199d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 09:15:12 2010 -0800
-+
-+    common: dapl_event_str function missing 2 IB extended events
-+    
-+    Add all IB extended events in event string print function
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 2bf3eb939e9a584ae0fe2de70f16cdcca8acf014
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 16 09:12:11 2010 -0800
-+
-+    common: dat_ep_connect should not set timer UD endpoints
-+    
-+    connect for UD type is simply AH resolution and doesn't
-+    need timed. The common code is not designed to handle
-+    multiple timed events on connect requests so just ignore
-+    timing UD AH requests.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 73ca06debe4735dfc11f44076a13dde079657b2e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 15 10:23:47 2010 -0800
-+
-+    ucm: fix error path during accept_usr reply failure
-+    
-+    if accept_usr fails when sending reply the EP was
-+    being linked to CM instead of properly unlinked.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 944ef4445faceeb90bb61d4e377274ad0fd6711f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 8 13:56:28 2010 -0800
-+
-+    ibal: add missing windows makefile
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 1d53e8eb90e6f74b41e7767e1c71851ff4ec73fd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 8 12:53:45 2010 -0800
-+
-+    ibal: changes for EP to CM linking and synchronization.
-+    
-+    Windows IBAL changes to allocate and manage CM objects
-+    and to link them to the EP. This will insure the CM
-+    IBAL objects and cm_id's are not destroy before EP.
-+    Remove windows only ibal_cm_handle in EP structure.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 4b939076aa32bb52957fcc6791e187c9433d4c24
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 24 12:00:07 2010 -0800
-+
-+    scm: add support for canceling conn request that times out.
-+    
-+    print warning message during timeout.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f38fc04d517ee6c0560b271298293c56cc619522
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 24 11:28:04 2010 -0800
-+
-+    scm, cma, ucm: consolidate dat event/provider event translation
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 41739dab38a4be8076ecd9e61b5e175cf91ab322
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 24 11:26:25 2010 -0800
-+
-+    common: missed linking changes from atomic to acquire/release
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7ff4f840bf1150fa2c2f541c93d810622ea9733b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 24 10:03:57 2010 -0800
-+
-+    common: add CM-EP linking to support mutiple CM's and proper protection during destruction
-+    
-+    Add linking for CM to EP, including reference counting, to insure syncronization
-+    during creation and destruction. A cm_list_head has been added to the EP object to
-+    support multiple CM objects (UD) per EP. If the CM object is linked to an EP it
-+    cannot be destroyed.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit c9fbd6e7a8131d4077039d5da716b618727d4009
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Feb 23 16:26:41 2010 -0800
-+
-+    Release 2.0.27-1
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 454c27b1f357c7c3070e459b25d12929f86304ca
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 22 09:42:17 2010 -0800
-+
-+    windows: add scm makefile
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 66ac48d5280bcf0453760c6e22909de6b8519b6d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 22 09:41:13 2010 -0800
-+
-+    Windows does not require rdma_cma_abi.h, move the include from common code and to OSD file.
-+    
-+    Signed-off-by: stan smith <stan.smith@intel.com>
-+
-+commit c05c41c31f01e1ddef91e92998ca66d258fafe3d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Feb 19 14:52:01 2010 -0800
-+
-+    Windows patch to fix IB_INVALID_HANDLE name collision
-+    
-+    signed-off-by: stan smith <stan.smith@intel.com>
-+
-+commit 712e7e5ba71f8a4344dfff481a9be870eefefe25
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 8 13:49:35 2010 -0800
-+
-+    scm: dat_ep_connect fails on 32bit servers
-+    
-+    memcpy for remote IA address uses incorrect sizeof for a pointer type.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 3040fa78d7d22c8f76c88dc77cedde09f016eb67
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Feb 5 11:51:16 2010 -0800
-+
-+    undefined symbol: dapls_print_cm_list
-+    
-+    call prototype should be dependent on DAPL_COUNTERS.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit cbeebe422b952d679f49429be8ba045a62d7f4ac
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Feb 5 11:39:21 2010 -0800
-+
-+    Cleanup CM object lock before freeing CM object memory
-+    
-+    Running windows application verifiier for uDAPL validation
-+    for all 3 providers. Cleanup memory lock leaks found
-+    by verifier.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 855a8e4aa83fa2e4f7847122415106f49286f4ca
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 3 16:21:30 2010 -0800
-+
-+    destroy verbs completion channels created via ia_open or ep_create.
-+    
-+    Completion channels are created with ia_open for CNO events and
-+    with ep_create in cases where DAT allows EP(qp) to be created with
-+    no EVD(cq) and IB doesn't. These completion channels need to be
-+    destroyed at close along with a CQ for the EP without CQ case.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 4da540591148e47dd912851cc7314776f2f7622e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 3 11:06:45 2010 -0800
-+
-+    Update Copyright file and include the 3 license files in distribution
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9011abd4b1470c65bfe81eef5a2f3a81060cec81
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Feb 2 14:43:03 2010 -0800
-+
-+    When copying private_data out of rdma_cm events, use the
-+    reported private_data_len for the size, and not IB maximums.
-+    This fixes a bug running over the librdmacm on windows, where
-+    DAPL accessed invalid memory.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 5da33bb3b9c230c08492f85d13caa330ce65906e
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Jan 28 10:19:20 2010 -0800
-+
-+    dapl/cma: fix referencing freed address
-+    
-+    DAPL uses a pointer to reference the local and remote addresses
-+    of an endpoint.  It expects that those addresses are located
-+    in memory that is always accessible.  Typically, for the local
-+    address, the pointer references the address stored with the DAPL
-+    HCA device.  However, for the cma provider, it changes this pointer
-+    to reference the address stored with the rdma_cm_id.
-+    
-+    This causes a problem when that endpoint is connected on the
-+    passive side of a connection.  When connect requests are given
-+    to DAPL, a new rdma_cm_id is associated with the request.  The
-+    DAPL code replaces the current rdma_cm_id associated with a
-+    user's endpoint with the new rdma_cm_id.  The old rdma_cm_id is
-+    then deleted.  But the endpoint's local address pointer still
-+    references the address stored with the old rdma_cm_id.  The
-+    result is that any reference to the address will access freed
-+    memory.
-+    
-+    Fix this by keeping the local address pointer always pointing
-+    to the address associated with the DAPL HCA device.  This is about
-+    the best that can be done given the DAPL interface design.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 66dbb5f20bf494eb3f5041655b478059165c5f1b
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Tue Jan 26 15:13:03 2010 -0800
-+
-+    dapl: move close device after async thread is done
-+    
-+    using it
-+    
-+    Before calling ibv_close_device, wait for the asynchronous
-+    processing thread to finish using the device.  This prevents
-+    a use after free error.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 560b235adc799fa710571ca63cbc3e4fa6374ff2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jan 11 09:03:10 2010 -0800
-+
-+    Release 2.0.26-1
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 73dfb32ace6aff2fdb21e54689342fd551822286
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Dec 22 14:00:33 2009 -0800
-+
-+    openib_common: add check for both gid and global routing in RTR
-+    
-+    check for valid gid pointer along with global route setting
-+    during transition to RTR. Add more GID information to
-+    debug print statement in qp modify call.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7aab18fd8ff3f201b0a4b6c76896667b29f103c4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Dec 4 12:31:22 2009 -0800
-+
-+    openib_common: remote memory read privilege set multi times
-+    
-+    duplicate setting of read privilege in dapls_convert_privileges
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 016e2c40b8ac2fe18993e9fb7122ecb9b439e5eb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Dec 4 12:25:30 2009 -0800
-+
-+    ucm, scm: DAPL_GLOBAL_ROUTING enabled causes segv
-+    
-+    socket cm and ud cm providers support QP modify with is_global
-+    set and GRH. New v2 providers didn't pass GID information
-+    in modify_qp RTR call and incorrectly byte swapped the already
-+    network order GID. Add debug print of GID during global modify.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7b0c596c7b4ad619f65da9f79dcbc4376e651dde
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 24 22:16:58 2009 -0800
-+
-+    Release 2.0.25-1
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 3197bffff478ad7ff5eff9220fa0528e42e6b56e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 24 22:15:46 2009 -0800
-+
-+    winof scm: initialize opt for NODELAY setsockopt
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 8559ec069329249592f367b5b8f61427cbad0a46
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 24 11:29:46 2009 -0800
-+
-+    Release 2.0.25
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 0983c66cbd9511128c1fa221470c4c983903e420
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 24 08:58:44 2009 -0800
-+
-+    winof cma: windows definition for EADDRNOTAVAIL missing
-+    
-+    Signed-off-by: stan smith <stan.smith@intel.com>
-+
-+commit 4fbbcfa1d7bf7a843b27e351d35f3ffbc2ac4db8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 24 08:54:26 2009 -0800
-+
-+    scm: client side setsockopt NODELAY fails if data arrives before setting
-+    
-+    Move setsockopt before connect to avoid race with data.
-+    Seems to fail on windows. Not seen on linux.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9dfa9a06d55101fed0773028ce7ab85330514c67
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Nov 18 09:52:40 2009 -0800
-+
-+    cma: setup_listener Cannot assign requested address
-+    
-+    Colliding with RDS port of 18634. rdma_cm can return
-+    either EADDRINUSE or EADDRNOTAVAIL if the bind fails.
-+    Add check for either and return proper DAT_CONN_QUAL_IN_USE.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 0698fb56d533a5225cbc3a5a4b8ab2e2d56b7502
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Nov 18 09:43:38 2009 -0800
-+
-+    common: seg fault in dapl_evd_wait with multi-thread application using CNO's.
-+    
-+    If we are dealing with event streams besides a CQ event stream,
-+    be conservative and set producer side locking.  Otherwise, no.
-+    Check for CNO is missing, CNO is not considered CQ event stream.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 4d26a280572a58248b0796e4d5ed01ea5d67be46
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Nov 18 09:37:48 2009 -0800
-+
-+    ucm: inbound DREQ/DREP handshake should transition QP.
-+    
-+    During release, when receiving a disconnect request from remote peer
-+    instead of a disconnect call from the client, the QP didn't get properly
-+    set in ERR state and didn't flush the queue during disconnect processing.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 87965cd15bbfa38b00ed2d77a4ea5a76f76cf4a3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Nov 2 08:24:53 2009 -0800
-+
-+    winof: Remove duplicate include of comp_channel.cpp from cm.c as it is included in opensm_ucb/device.c.
-+    
-+    Signed-off-by: stan smith <stan.smith@intel.com>
-+
-+commit 737fa288b72fad19a1fc3e762eb9f2c471ce6ddd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 30 13:19:21 2009 -0800
-+
-+    Release 2.0.24
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9fe7506ff9ddf1ae6297cfc6a9dd4d6a57e1939e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 30 12:57:22 2009 -0800
-+
-+    winof: Utilize WinOF version of inet_ntop() for Windows OSes which do not support inet_ntop().
-+    
-+    Signed-off-by: stan smith <stan.smith@intel.com>
-+
-+commit d56c645a2bf234e9e0cf215b112c2aa9d5e01945
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 30 07:17:26 2009 -0800
-+
-+    ucm: windows build issue with new CQ completion channel
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 2d2e7e1e185c08542ee31b0e77561a1eeb4bde6c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 30 06:35:33 2009 -0800
-+
-+    winof: add ucm provider to windows build
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 94b2206093607214e0a9709651460692e8196e1c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 30 06:32:56 2009 -0800
-+
-+    winof: add missing build files for ibal, scm
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 66b76d7a8035b9164b69781d7630a0c77ce1bb5a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 28 09:52:50 2009 -0800
-+
-+    scm: connection peer resets under heavy load, incorrect event on error
-+    
-+    Under heavy load, we get a peer reset from the remote stack. In this
-+    case retry the socket connection for this QP setup.
-+    
-+    Add debugging with PID's and socket ports to help isolate
-+    these types of socket scaling issues.
-+    
-+    Report correct UD event during error, check remote_ah creation.
-+    
-+    Fix dapl_poll return codes for single event type only.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f8108a9bda0200355107fdd6c43cb5885f47d648
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 28 09:47:37 2009 -0800
-+
-+    ucm: increase default reply and rtu timeout values.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9c13d0d01c78eeb5071e802fbb53811cdb377059
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 28 07:48:20 2009 -0800
-+
-+    ucm: change some debug message levels and add check for valid UD REPLY during retries.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 1c404bb3dcc0a45e21ef3aa973d59714413beae0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 27 10:37:45 2009 -0800
-+
-+    ucm: increase timers during subsequent retries
-+    
-+    check/process create_ah errors during connect phase
-+    cleanup some debug messaging.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit cd8c48586f53e846de4fbe10994b73ba457f6406
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Oct 19 10:38:36 2009 -0700
-+
-+    ucm, scm: address handles need destroyed when freeing Endpoints with UD QP's.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit ce19f5744c0dd9461c09d999b309e8f0e2242767
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 16 14:42:00 2009 -0700
-+
-+    openib_common: ignore pd free errors, clear pd_handle and return.
-+    
-+    some older adapters have some issues
-+    with pd free so just clear handle and return
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 81f5ac17d9039e2edcd8324f7d5ed5f66fcff9f2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 16 08:52:21 2009 -0700
-+
-+    ucm: using UD type QP's, ucm reports wrong reject event when user rejects AH resolution request.
-+    
-+    During rejects, both usr and ucm internal, the qp_type does not get initialized
-+    so the check for UD type QP messages fail on active side and the wrong
-+    event gets generated. Initialize saddr.ib information before sending reject
-+    back to active side.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f0214e5a7a81a68819d308cb921eb75f5246207d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 16 07:57:25 2009 -0700
-+
-+    ucm, scm, cma: Fix CNO support on DTO type EVD's
-+    
-+    EVD wait_object should be used for CNO processing
-+    and not the direct CQ event channels. Add proper
-+    checking for DTO type EVD's with CNO at wait
-+    and wakeup.
-+    
-+    UCM missing support for collective EVD's under a
-+    CNO. Add support to create common channel for
-+    collective EVD's during device open. Add support
-+    in cm_thread to check this channel. Also,
-+    during disconnect, move QP to error to properly
-+    flush queue instead of moving to reset and init.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 960950a7d9f5437dd831bd56ca2ad0c06cb4e324
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Oct 15 09:19:45 2009 -0700
-+
-+    ucm: fix lock init bug in ucm_cm_find
-+    
-+    the lock should be setup as pointer to lock
-+    not lock structure. Cleanup lock and list
-+    in cm_find function and cm_print function.
-+    
-+    Add debug aid by passing process id in
-+    msg resv area. cleanup cr references
-+    and change to cm for consistency.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f86fec772f2d82eaf60228d288b295e0b7b86c59
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 14 10:03:47 2009 -0700
-+
-+    ucm: fix build problem with latest windows ucm changes
-+    
-+    define dapls_thread_signal as inline
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 87b6c8ba92f3063a35d49bdb49d6cd0a5100a36c
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Oct 14 09:34:22 2009 -0700
-+
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 9fdd8d74f2cba83e9cf513256933f5241495c1da
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Oct 14 09:34:18 2009 -0700
-+
-+    The HCA should not be closed until all resources have been released.
-+    This results in a hang on windows, since closing the device frees
-+    the event processing thread.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit f9833db469f2d686842bb1d52d1ea53b74fa72a8
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Oct 14 09:34:13 2009 -0700
-+
-+    Fix build warning when compiling on 32-bit systems.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit c80515bd4b1bd11a125dc17e3f7db44240ee1fff
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Oct 14 09:34:07 2009 -0700
-+
-+    Trying to deregister the same memory region twice leads to an
-+    application crash on windows.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 6aa2c0d901daa9cfca7e771c1df2ead074d230bd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 14 07:59:23 2009 -0700
-+
-+    dat: reduce debug message level when parsing for location of dat.conf
-+    
-+    Don't output failover to default /etc/dat.conf from
-+    sysconfdir at ERROR level. Reduce to DAT_OS_DBG_TYPE_SR.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e4038e078747201b57203f16ba793b7fc22c12f2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Oct 8 16:23:22 2009 -0700
-+
-+    ucm: update ucm provider for windows environment
-+    
-+    add dapls_thread_signal abstraction and a new
-+    cm_thread function specific for windows.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit d80ce42390eb57b9c4f816b4df063f90bd5699bc
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Oct 8 16:02:52 2009 -0700
-+
-+    ucm: add timer/retry CM logic to the ucm provider
-+    
-+    add reply, rtu and retry count options via
-+    environment variables. Times in msecs.
-+    DAPL_UCM_RETRY 10
-+    DAPL_UCM_REP_TIME 400
-+    DAPL_UCM_RTU_TIME 200
-+    
-+    Add RTU_PENDING and DISC_RECV states
-+    
-+    Add check timer code to the cm_thread
-+    and the option to the select abstaction
-+    to take timeout values in msecs.
-+    DREQ, REQ, and REPLY will all be timed
-+    and retried.
-+    
-+    Split out reply code and disconnect_final
-+    code to better facilitate retry timers.
-+    Add checking for duplicate messages.
-+    
-+    Added new UD extension events for errors.
-+    DAT_IB_UD_CONNECTION_REJECT_EVENT
-+    DAT_IB_UD_CONNECTION_ERROR_EVENT
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 1186bfc949f4bb7278c30c2c59b7fcb6d5142638
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 2 14:49:52 2009 -0700
-+
-+    Release 2.0.23
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit a5f1220cfd96983c9c89a595d80fab7ddcb1a954
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 2 14:48:15 2009 -0700
-+
-+    cma: cannot reuse the cm_id and qp for new connection, must reallocate a new one.
-+    
-+    When merging common code base the dapls_ib_reinit_ep mistakely
-+    modified QP to reset then init for all providers. Will
-+    not work for rdma_cm (cma provider) since the cm_id cannot
-+    be reused.  Add build check for _OPENIB_CMA_ to pull in correct
-+    free and reallocate method for reinit_ep.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 7b07435495de0938e59be064fe8642cfd739f1ac
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 2 13:50:12 2009 -0700
-+
-+    scm, cma: update DAPL cm protocol revision with latest address/port changes
-+    
-+    CM protocol changed, roll revision to 6.
-+    The socket cm could be competing with address space if
-+    application is using sockets above to exchange information
-+    like dapltest, and MPI consumers. Adjust port on listen
-+    and connect to reduce the chance of port collision with
-+    application above.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9cc1e76b672f7ff1231b4d113bd4dd1a016d1410
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 2 12:47:37 2009 -0700
-+
-+    ucm: modify IB address format to align better with sockaddr_in6
-+    
-+    Restructure the dcm_addr union to map the IB side
-+    closer to sockaddr6 and initialize family to
-+    AF_INET6 to insure callee allocates enough memory
-+    for ucm dat_ia_address type. Put qpn in flowinfo
-+    and gid in sin6_addr. Change the test suites
-+    to print address information based on AF_INET
-+    or AF_INET6 instead of using specific IB address
-+    union from the provider.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f50dbe6e82bd471845adf27829b2e07234a0a86a
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Sep 30 14:29:03 2009 -0700
-+
-+    Add definition for getpid similar to that used by the other dtest apps.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 51147412fad72c00115b595955760e80ff0be7d5
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Sep 30 14:28:57 2009 -0700
-+
-+    WinOF provides a common implementation of gettimeofday that should
-+    be used instead.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 732fc84cee036126282715ea157bdb619fc11ec7
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Wed Sep 30 14:27:50 2009 -0700
-+
-+    The completion manager was updated to provide an abstraction that
-+    better mimicked how fd's were used.  Update dapl to use this
-+    abstraction, rather than the older completion manager api.
-+    
-+    This helps minimize changes between linux and windows.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit fc1855b7738838d3865389405f017b87d223f743
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 30 14:26:47 2009 -0700
-+
-+    dtestcm: remove IB verb definitions
-+    
-+    Remove gid and qp_type references from test app.
-+    Print address infomation in sockaddr and
-+    ucm provider format with qpn and lid.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 36a885d4267be7b3c6c1086372d321121ae03dee
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 30 10:44:14 2009 -0700
-+
-+    dtest, dtestx: remove IB verb definitions
-+    
-+    remove gid and qp_type checking from test suite.
-+    Print address infomation in sockaddr and
-+    ucm provider format with qpn and lid.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 23445bbbd3a09f7f5e666a000d5c7c3b22dd95b3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 28 10:59:36 2009 -0700
-+
-+    scm: tighten up socket options to insure similiar behavior on Windows and Linux.
-+    
-+    Add IPPROTO_TCP to create socket. Specify device IP address
-+    when binding instead of INADDR_ANY and remove setsocketopt
-+    REUSEADDR on the listen socket to avoid any issues with
-+    portability. Don't want duplicate port bindings.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b31b64d60abe7c6c1a83484db97176d225076b30
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 28 10:46:26 2009 -0700
-+
-+    cma: improve serialization of destroy and event processing
-+    
-+    WinOF testing with slightly different scheduler and verbs
-+    showed some issues with cleanup. Add better protection around
-+    destroy and event processing thread.
-+    
-+    Remove destroy flag and add refs counting to conn objects
-+    to block destroy until all references are cleared. Add
-+    locking aroung ref counting and passive and active
-+    event processing.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit a4adf463695ba75beaa1fe79d514346bf5fe2cb5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 28 10:42:52 2009 -0700
-+
-+    scm: improve serialization of destroy and state changes
-+    
-+    WinOF testing with slightly different scheduler and verbs
-+    showed some issues with cleanup. Add better protection around
-+    destroy and move state change before socket send to insure
-+    correct state in multi-thread environment targeting the same
-+    device on send and recv.
-+    
-+    Change DCM_RTU_PENDING to DCM_REP_PENDING and
-+    and add static definition to local routines for better
-+    readability.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 29358ccc587db55fe5f5a1b14eed9e0e31f5f02c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Sep 17 08:56:06 2009 -0700
-+
-+    common: no cleanup/release code for timer thread
-+    
-+    dapl_set_timer() creates a thread to process timers for dat_ep_connect
-+    but provides no mechanism to destroy/exit during dapl library unload.
-+    Timers are initialized in library init code and should be released
-+    in the fini code. Add a dapl_timer_release call to the dapl_fini
-+    function to check state of timer thread and destroy before exiting.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e287ce12f5b0108ef83186aae305f25af8cdd02c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Sep 17 08:53:29 2009 -0700
-+
-+    scm, cma: dapli_thread doesn't always get teminated on library close.
-+    
-+    DAPL doesn't actually wait for the async processing thread to exit before
-+    allowing the library to close.  It will wait up to 10 seconds, which under
-+    heavy load isn't enough time.  Since the thread is created by an application
-+    level thread, it will continue to run as long as the application runs.  But
-+    if the application closes the library, then all library data and code is
-+    invalid, which can result in the thread running something that's not
-+    library code and accessing freed memory.
-+    
-+    With this change, I was able to run mpi ping-pong, 16 ranks on a single
-+    system (scm provider) without crashes 1300 times.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 5bffe521c6ad7a5ce10457a5d7b25814522a0cde
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 9 13:10:35 2009 -0700
-+
-+    ucm: tighten up locking with CM processing, state changes
-+    
-+    tighten up locking on CM processing and state changes
-+    and reduce the send completion threshold to 50 from 100
-+    to replenish the request message faster.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e38daa8448bc3b73c53e54ffc9ac47b9cfc2af89
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 9 09:44:03 2009 -0700
-+
-+    ucm: For UD type QP's, return CR p_data with CONN_EST event on passive side.
-+    
-+    Intel MPI uses the p_data provided with CONN_EST as a reference to the
-+    UD pair and remote rank. The ucm provider was overwriting the CR p_data
-+    with the ACCEPT p_data. Change to save CR p_data but also provide
-+    storage for user provided ACCEPT p_data in case the REPLY is lost
-+    and needs retransmitted.
-+    
-+    p_data size was provided to event processing in network order
-+    instead of host order.
-+    
-+    For new QP's create new address handles and do not use
-+    existing AH's created for the CM. Different PD's are
-+    associated with each.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 0bc6a0954bc1a1a61e1b1cbc5c280f69ed168453
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 8 09:14:46 2009 -0700
-+
-+    ucm: cleanup extra cr/lf
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 6e7df65a884b4e068135e64dcb3ec660f4c7ab14
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 8 09:11:37 2009 -0700
-+
-+    ucm: fix issues with UD QP's.
-+    
-+    private data size not in host order when processing
-+    connection events.
-+    
-+    ud extentions event should include original ia_addr
-+    and qpn used during connection and not the IB qpn.
-+    
-+    ucm QP service resource cleanup in wrong order.
-+    
-+    cleanup extra cr/lf device.c
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e7c3090945c13f80abb929643fc975465afeeb53
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Sep 3 10:45:56 2009 -0700
-+
-+    winof: Convert windows version of dapl and dat libaries to use private heaps.
-+    
-+    This allows for better support of memory registration caching by upper
-+    level libaries (MPI) that use SecureMemoryCacheCallback.
-+    
-+    It also makes it easier to debug heap corruption issues.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit bc3c8a34558880c8d09a03e3eb7c3f50d7762c67
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 2 14:01:51 2009 -0700
-+
-+    dtest, dtestx: modifications for UD QP testing with ucm provider.
-+    
-+    remote_addr is wrong for IP remote address.
-+    
-+    The dtestx requires the server connect back to the client
-+    for the UD test. With the ucm provider you need to provide
-+    the QPN and the LID which you cannot get until the dtest
-+    client starts. So, for now, don't support UD testing
-+    on UCM providers.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e4555143ca71ebe18d8c9f027e2e7a5282088a30
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 2 13:54:59 2009 -0700
-+
-+    scm, ucm: UD QP support was broken when porting to common openib code base.
-+    
-+    create remote_ah was moved out of modify_qp_state function but not
-+    included in the RTU and ACCEPT code for UD QP's. qp type check
-+    should be on daddr not saddr in ucm cm code.
-+    
-+    QP number must be converted to host order before supplying remote_ah,
-+    and qp number to consumer.
-+    
-+    Modify QP state to RTR for UD QP mask setting incorrect.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 375d368494bb2f9bb44c82073abc60e01ac28615
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 1 13:02:24 2009 -0700
-+
-+    cma: cleanup warning with unused local variable, ret, in disconnect
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 72d1c0c984919809ecd94b2e4ede31ec56668518
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 1 12:36:31 2009 -0700
-+
-+    cma: remove debug message after rdma_disconnect failure
-+    
-+    DAPL automatically calls rdma_disconnect() when a disconnect request is
-+    received.  If the user also calls disconnect, that calls rdma_disconnect() as
-+    well, but the connection has already been disconnected by DAPL and is no longer
-+    valid.  The result is that the user's call to rdma_disconnect() will fail.  Do
-+    not display an error message if this occurs.
-+    
-+    Locking could be added to prevent calling rdma_disconnect() multiple times, but
-+    since the librdmacm provides synchronization to trap this, we might as well take
-+    advantage of it.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 290c568030da6df398a4afb932b5d4f9bd585c26
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 1 12:27:43 2009 -0700
-+
-+    scm: socket errno check needs O/S dependent wrapper
-+    
-+    Intel MPI checks the uDAPL error code when calling dat_psp_create() to see if
-+    the port number that it provides is in use or not.  Convert winsock error codes
-+    to unix errno values.
-+    
-+    This fixes the following error reported by Intel MPI:
-+    'DAPL provider is not found and fallback device is not enabled'
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 03b6d1b58ae03058a509c54ffe27147cc44d1851
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 1 12:13:16 2009 -0700
-+
-+    dapltest: update script files for WinOF
-+    
-+    Cleanup 64-bit paths now that WinOF is always installed into '\Program Files\WinOF'.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e38585be89e9fa8f139002a3fe1a82eb86438f93
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Sep 1 12:10:21 2009 -0700
-+
-+    cma: conditional check for new rdma_cm definition.
-+    
-+    RDMA_CM_EVENT_TIMEWAIT_EXIT is new to OFED 1.4
-+    add conditional check so dapl can build and run
-+    against older OFED 1.3 stacks
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 83af586b77aa905b63de6dd6010cd60e91487a9e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Aug 20 09:13:43 2009 -0700
-+
-+    Release 2.0.22
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 48bc0dc95093ccbfe5e01cef4877c128e2caaf77
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Aug 20 09:12:47 2009 -0700
-+
-+    dapltest: add mdep processor yield and use with dapltest
-+    
-+    Be thread scheduler friendly and release the current thread thus allowing other threads to run.
-+    
-+    Signed off by Stan Smith stan.smith@intel.com
-+
-+commit e13f255a06b9d2a2ed4eec9a62f9fe105d0c26d7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Aug 18 10:15:15 2009 -0700
-+
-+    ucm: Add new provider using a DAPL based IB-UD cm mechanism for MPI implementations.
-+    
-+    New provider uses it's own CM protocol on top of IB-UD queue pairs.
-+    During device open, this provider creates a UD queue pair and
-+    returns local address information via dat_ia_query. This 24 byte
-+    opaque address must be exchange out-of-band before connecting to a
-+    server via dat_ep_connect. This provider is targeted for MPI
-+    implementations that already exchange address information
-+    during mpi_init phase.
-+    
-+    Future release may provide some ARP mechanism via multicast.
-+    
-+    dtest, dtestx, and dtestcm was modified to report the lid and qpn
-+    information on the server side so you can provide appropriate
-+    destination address information for the client test suite.
-+    
-+    dapltest will not work with this provider.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 38d224dd95896c7e60f0bc0ffa52b26ab78f489b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Aug 4 20:54:12 2009 -0700
-+
-+    Release 2.0.21
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit ed4999a26043c9c3c73c792b21d24ced1df1553c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Aug 4 20:49:09 2009 -0700
-+
-+    scm: Fix disconnect. QP's need to move to ERROR state in
-+    order to flush work requests and notify consumer. Moving to
-+    RESET removed all requests but did not notify consumer.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 512f1d7a480f06a1fa491d21870e560ad111c4d0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Aug 4 20:48:03 2009 -0700
-+
-+    modify dtest.c to cleanup CNO wait code and consolidate into
-+    collect_event() call. After waking up from CNO wait the
-+    consumer must check all EVD's. The EVD's under the CNO
-+    could be dropped if already triggered or could come in any order.
-+    DT_RetToString changed to DT_RetToStr and DT_EventToSTr
-+    changed to DT_EventToStr for consistency.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 024e36975d37a1556bf68145e1573f637d269bfc
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Aug 4 20:47:17 2009 -0700
-+
-+    CNO events, once triggered will not be returned during the cno wait.
-+    Check for triggered state before going to sleep in cno_wait. Reset
-+    triggered EVD reference after reporting.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 6d6c72a49158d10825929111d6b4df1c6d2bb589
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sun Aug 2 14:21:09 2009 -0700
-+
-+    CNO support broken in both CMA and SCM providers.
-+    
-+    CQ thread/callback mechanism was removed by mistake. Still
-+    need indirect DTO callbacks when CNO is attached to EVD's.
-+    
-+    Add CQ event channel to cma provider's thread and add
-+    to select for rdma_cm and async channels.
-+    
-+    For scm provider there is not easy way to add this channel
-+    to the select across sockets on windows. So, for portablity
-+    reasons 2 thread is started to process the ASYNC and
-+    CQ channels for events.
-+    
-+    Must disable EVD (evd_endabled=FALSE) during destroy
-+    to prevent EVD events firing for CNOs and re-arming CQ while
-+    CQ is being destroyed.
-+    
-+    Change dtest to check EVD after CNO timesout.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 6fe8bd1d8f44777211e816b72e0b2a6d22900207
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 30 08:02:30 2009 -0700
-+
-+    common osd: include winsock2.h for IPv6 definitions.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit bd26383900d18962aeeff54fa59922009091ecfc
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jul 29 08:02:15 2009 -0700
-+
-+    common osd: include w2tcpip.h for sockaddr_in6 definitions.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f25544f14554200a6714accef5f761b0269b5819
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Mon Jul 27 15:07:33 2009 -0700
-+
-+    DAPL introduced the concept of directly waiting on the CQ for
-+    events by adding a compile time flag and special handling in the common
-+    code.  Rather than using the compile time flag and modifying the
-+    common code, let the provider implement the best way to wait for
-+    CQ events.
-+    
-+    This simplifies the code and allows the common openib providers to
-+    optimize for Linux and Windows platforms independently, rather than
-+    assuming a specific implementation for signaling events.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 1548405a377d2bd17938df69419e9bcf3364d91a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 16 12:41:22 2009 -0700
-+
-+    dapltest: Implement a malloc() threshold for the completion reaping.
-+    
-+    change byte vector allocation to stack in functions:
-+      DT_handle_send_op, DT_handle_rdma_op & DT_handle_recv_op.
-+    
-+    When allocation size is under the threshold, use a stack local
-+    allocation instead of malloc/free.  Move redundant bzero() to
-+    be called only in the case of using local stack allocation as
-+    DT_Mdep_malloc() already does a bzero(). Consolidate error handling
-+    return and free()check to a single point by using goto.
-+    
-+    Signed-off-by: Stan Smith <stan.smith@intel.com>
-+
-+commit f6311ca7295230bf9efbcddc639fa8e1065b1f3d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 16 12:32:09 2009 -0700
-+
-+    scm: handle connected state when freeing CM objects
-+    
-+    The QP could be freed before being disconnected
-+    so the provider needs process disconnect before freeing
-+    the CM object. The disconnect clean will finish
-+    the destroy process during the disc callback.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 4387359106ce398b29847982883016f7fd48b372
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jul 8 12:49:43 2009 -0700
-+
-+    scm, dtest: changes for winof gettimeofday and FD_SETSIZE settings.
-+    
-+    scm changes to set FD_SETSIZE with expected value and
-+    prevent windows override.
-+    
-+    dtest: remove gettimeofday implementation for windows
-+    specific implemenation etc\user\gtod.c
-+    
-+    general EOL cleanup
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 3542a83d8a31f5ac68adf3aa44e3ebf1265068df
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jul 6 09:24:07 2009 -0700
-+
-+    scm: set TCP_NODELAY sockopt on the server side for sends.
-+    
-+    scm provider sends small messages from both server and client
-+    sides. Set NODELAY on both sides to avoid send delays either
-+    way.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9d591180392856935b9c3befbab2243dd8daf628
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 2 14:16:52 2009 -0700
-+
-+    windows: remove obsolete files in dapl/udapl source tree
-+    
-+    SOURCES,makefile,udapl.r,udapl_exports.src,udapl_sources.c
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 85c238ee0a41dd0a4a24b3d422f34674b0183161
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 2 14:11:20 2009 -0700
-+
-+    dtestcm: add UD type QP option to test
-+    
-+    Add -u for UD type QP's during connection setup.
-+    Will setup UD QPs and provide remote AH
-+    in connect establishment event. Measures
-+    setup/exchange rates.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 89a2211526e37b1db58fc0ea663b330bc19125c8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 2 14:07:36 2009 -0700
-+
-+    scm: destroy QP called before disconnect
-+    
-+    Handle the case where QP is destroyed before
-+    disconnect processing. Windows supports
-+    reinit_qp during a disconnect call by
-+    destroying the QP and recreating the
-+    QO instead of state change from reset
-+    to init. Call disconnect in destroy
-+    CM code to handle this unexpected state.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 6eb35b7d69a896c256b1031337d3353575cd07b4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jul 2 14:03:12 2009 -0700
-+
-+    cma: add support for rdma_cm TIME_WAIT event.
-+    
-+    Nothing to process, simply ack the event.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b6c56b3052ecd3e36c32092ee62ff0c724da5ad4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jul 1 07:58:32 2009 -0700
-+
-+    scm: remove old udapl_scm code replaced by openib_scm.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 5bbae42a56e1cca678d590ac4c841dd61e839d74
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jul 1 07:53:18 2009 -0700
-+
-+    winof: fix build issues after consolidating cma, scm code base.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 6bd1d931c4d0d4cbafac383f225140120aee4c51
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jul 1 07:51:59 2009 -0700
-+
-+    cma: lock held when exiting as a result of a rdma_create_event_channel failure.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b8a14ff1cc257defa2f74373d143600f5f471823
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Mon Jun 29 12:34:54 2009 -0700
-+
-+    windows: all dlist functions have been moved to the header file.
-+    remove references to dlist.c
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 1a081a0a467e4773a641e8edc876a7a4d7a30ca8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 29 12:13:48 2009 -0700
-+
-+    dtestcm windows: add build infrastructure for new dtestcm test suite
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit c37d7a25dca97011ea76e2a541f936d10ca658e0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 29 08:57:46 2009 -0700
-+
-+    openib_common: reorganize provider code base to share common mem, cq, qp, dto functions
-+    
-+    add new openib_common directory with cq, qp, util, dto, mem function calls
-+    and definitions. This basically leaves the unique CM and Device definitions
-+    and functions to the individual providers directory of openib_scm and openib_cma.
-+    
-+    modifications to dapl_cr_accept required. ep->cm_handle is allocated
-+    and managed entirely in provider so dapl common code should not update
-+    ep_handle->cm_handle from the cr->cm_handle automatically. The provider
-+    should determine which cm_handle is required for the accept.
-+    
-+    openib_cma defines _OPENIB_CMA_ and openib_scm defines _OPENIB_SCM_ for provider
-+    specific build needs in common code.
-+
-+commit 961a4083ffb646c070137abd33e9ba2ea9482685
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 26 14:45:34 2009 -0700
-+
-+    scm: fixes and optimizations for connection scaling
-+    
-+    Prioritize accepts on listen ports via FD_READ
-+    process the accepts ahead of other work to avoid
-+    socket half_connection (SYN_RECV) stalls.
-+    
-+    Fix dapl_poll to return DAPL_FD_ERROR on
-+    all event error types.
-+    
-+    Add new state for socket released, but CR
-+    not yet destroyed. This enables scm to release
-+    the socket resources immediately after exchanging
-+    all QP information. Also, add state to str call.
-+    
-+    Only add the CR reference to the EP if it is
-+    RC type. UD has multiple CR's per EP so when
-+    a UD EP disconnect_clean was called, from a
-+    timeout, it destroyed the wrong CR.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit a60a9e1fce5588cb23f41391b48acf04edd82499
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 26 14:31:19 2009 -0700
-+
-+    scm: double the default fd_set_size
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 17d5e1692db4ae1eb09aa919d5607f22851d7ec5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 26 14:28:30 2009 -0700
-+
-+    scm: EP reference in CR should be cleared during ep_destroy
-+    
-+    The EP reference in the CR should be set to null
-+    during the EP free call to insure no further
-+    reference back to a mem freed EP.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit ebb820364cec9d72285c005a0874e7d459a9ff7d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 26 14:23:35 2009 -0700
-+
-+    dtestx: fix conn establishment event checking
-+    
-+    not catching error cases on client side
-+    when checking for event number and UD type
-+    && should have been ||
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 747b793898042e3011fbad4b2d1285d2c040cb13
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 26 14:18:37 2009 -0700
-+
-+    dtestcm: new test to measure dapl connection rates.
-+    
-+    new test suite added to measure connection
-+    rates of providers. Used to compare cma, scm,
-+    and other providers under development.
-+    
-+    dtestcm USAGE
-+    
-+    s: server
-+    c: connections (default = 1000)
-+    b: burst rate of conn_reqs (default = 100)
-+    m: multi-listens (set to burst setting )
-+    v: verbose
-+    w: wait on event (default, polling)
-+    d: delay before accept
-+    h: hostname/address of server, specified on client
-+    P: provider name (default = OpenIB-v2-ib0)
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit d58fbc3a870a060ead882e1d15c6d245cdf39096
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 19 20:59:16 2009 -0700
-+
-+    Release 2.0.20
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit beebe0066b47d7bf476925ff280bad2a3db38324
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 19 20:52:51 2009 -0700
-+
-+    common,scm: add debug capabilities to print in-process CM lists
-+    
-+    Add a new debug bit DAPL_DBG_TYPE_CM_LIST.
-+    If set, the pending CM requests will be
-+    dumped when dat_print_counters is called.
-+    Only provided when built with -DDAPL_COUNTERS
-+    
-+    Add new dapl_cm_state_str() call for state
-+    to string conversion for debug prints.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b1c51f1e68993d9306e3ebd48bd3a1f0e9878fa3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jun 16 09:22:31 2009 -0700
-+
-+    scm: disconnect EP before cleaning up orphaned CR's during dat_ep_free
-+    
-+    There is the possibility of dat_ep_free being called
-+    with RC CR's still in connected state. Call disconnect
-+    on the CR before marking for destroy.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 531d223455a88c885d6c5f7b1d7e158c1079fbce
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 10 12:05:17 2009 -0700
-+
-+    dapltest: windows scripts updated
-+    
-+    Support added for provider specification and general simplification of internal workings.
-+    
-+    Signed-off-by: Stan Smith <stan.smith@intel.com>
-+
-+commit 049d1ea08643d4c4eff761741641d37bb3f01fc1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 10 09:18:09 2009 -0700
-+
-+    scm: private data is not handled properly via CR rejects.
-+    
-+    For both RC and UD connect requests, the private
-+    data is not being received on socket and passed
-+    back via the active side REJECT event.
-+    
-+    UD requires new extended reject event type of
-+    DAT_IB_UD_CONNECTION_REJECT_EVENT to distiquish
-+    between RC and UD type rejects.
-+    
-+    cr_thread exit/cleanup processing fixed to insure
-+    all items are off the list before exiting.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 3c26870e276a934e2009090e0fca8bdc36c1be67
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 10 09:09:56 2009 -0700
-+
-+    scm: cleanup orphaned UD CR's when destroying the EP
-+    
-+    UD CR objects are kept active because of direct private data references
-+    from CONN events. The cr->socket is closed and marked inactive but the
-+    object remains allocated and queued on the CR resource list. There can
-+    be multiple CR's associated with a given EP and there is no way to
-+    determine when consumer is finished with event until the dat_ep_free.
-+    Schedule destruction for all CR's associated with this EP during
-+    free call. cr_thread will complete cleanup with state of SCM_DESTROY.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 73abd3f58fa7b14241fad98912ef27c7b4fdb47e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 10 09:05:32 2009 -0700
-+
-+    scm: provider specific query for default UD MTU is wrong.
-+    
-+    Change the provider specific query DAT_IB_TRANSPORT_MTU
-+    to report 2048 for new default MTU size.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 27c0d7edc4c931b808a7c5a24bd5aa2625b48aa1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 10 10:06:59 2009 -0700
-+
-+    scm: update CM code to shutdown before closing socket
-+    
-+    data could be lost without calling shutdown on the socket
-+    before closing. Update to shutdown and then close. Add
-+    definition for SHUT_RW to SD_BOTH for windows.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+    ---
-+
-+commit 536ec3103c15c1fed4367326c9117660345e0eab
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jun 4 13:48:18 2009 -0700
-+
-+    dapltest: windows script dt-cli.bat updated
-+    
-+    scn should be scm
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e8991b8f0877b0e2e857717e1140c679e9266abe
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Jun 4 08:19:12 2009 -0700
-+
-+    dapl/windows cma provider: add support for network devices based on index
-+    
-+    The linux cma provider provides support for named network devices, such
-+    as 'ib0' or 'eth0'.  This allows the same dapl configuration file to
-+    be used easily across a cluster.
-+    
-+    To allow similar support on Windows, allow users to specify the device
-+    name 'rdma_devN' in the dapl.conf file.  The given index, N, is map to a
-+    corresponding IP address that is associated with an RDMA device.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 79fa3e7d241f740bc886dd075f24fcbc611306de
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jun 4 08:00:29 2009 -0700
-+
-+    openib: remove 1st gen provider, replaced with openib_cma and openib_scm
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 624039247cdc0db7aa040dfbb4dced00f2cf9006
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 29 08:21:10 2009 -0700
-+
-+    dapltest: update windows script files
-+    
-+    Enhancement to take DAPL provider name as cmd-line arguement.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit b93baa07b7bbaeb7a55fa817c354d0c94783d61f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu May 28 15:30:05 2009 -0700
-+
-+    dapltest: update windows batch files in sripts directory
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 2f185c6b5e464c4fc9e84ad3e90cc2b86aebf9aa
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 18 14:00:02 2009 -0700
-+
-+    windows_osd/linux_osd: new dapl_os_gettid macro to return thread id
-+    
-+    Change dapl_os_getpid inline to macro on windows and add dapl_os_gettid
-+    macros on linux and windows to return thread id.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 984303824cd0c3e248a789066cf665ced8e1ae5b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 18 13:53:59 2009 -0700
-+
-+    windows: missing build files for common and udapl sub-directories
-+    
-+    Add dapl/dapl_common_src.c and dapl/dapl_udapl_src.c
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 3be4ccf9681a975e74a5aa05e3f7912477f342a7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 18 09:06:19 2009 -0700
-+
-+    windows: add build files for openib_scm, remove /Wp64 build option.
-+    
-+    Add build files for windows socket cm and change build
-+    option on windows providers. The new Win7 WDK issues a
-+    depreciated compiler option warning for /Wp64
-+    (Enable 64-bit porting warnings)
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 163112cfeb6e409886b3cb7f85da7ce003300d5c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 18 08:50:35 2009 -0700
-+
-+    scm: multi-hca CM processing broken. Need cr thread wakeup mechanism per HCA.
-+    
-+    Currently there is only one pipe across all
-+    device opens. This results in some posted CR work
-+    getting delayed or not processed at all. Provide
-+    pipe for each device open and cr thread created
-+    and manage on a per device level.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit e6e799f623df6ef136ffc5388251d3f3a38c8a91
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 15 11:06:19 2009 -0700
-+
-+    dtest: add connection timers on client side
-+    
-+    Add timers for active connections and print
-+    results. Allow polling or wait on conn event.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit d656bbf619123deaed6e8985e52207e5415f359f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 15 09:48:38 2009 -0700
-+
-+    linux_osd: use pthread_self instead of getpid for debug messages
-+    
-+    getpid provides process ids which are not unique. Use unique thread
-+    id's in debug messages to help isolate issues across many device
-+    opens with multiple CM threads.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 92bb0d2933d3d1546e18f0479475f3daf5b92052
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 1 10:18:05 2009 -0700
-+
-+    windows ibal-scm: dapl/dirs file needs updated to remove ibal-scm
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 9c37d9d667fb7e8f21841bbec4a84b2c652fffe1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 29 23:13:36 2009 -0700
-+
-+    Release 2.0.19
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 29 14:33:28 2009 -0700
-+
-+    scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit
-+    
-+    mismatch of device attribute size restricts max_lmr_block_size to 32 bit
-+    value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes.
-+    
-+    Consumers should use max_lmr_virtual_address for actual max
-+    registration block size until attribute interface changes.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit f91f27eaaab28b13a631adf75b933b7be3afbc0f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 29 10:51:03 2009 -0700
-+
-+    scm: increase default MTU size from 1024 to 2048
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit 8d6846056f4c86b6a06346147df55d37c4ba9933
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 29 10:49:09 2009 -0700
-+
-+    openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge
-+    
-+    no need to rebuild scatter gather list given that DAT v2.0
-+    is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 29 08:39:37 2009 -0700
-+
-+    dtest: add flush EVD call after data transfer errors
-+    
-+    Flush and print entries on async, request, and receive
-+    queues after any data transfer error. Will help
-+    identify failing operation during operations
-+    without completion events requested.
-+    Fix -B0 so burst size of 0 works.
-+    
-+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-+
-+commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 22 13:16:19 2009 -0700
-+
-+    dtest/dapltest: Cleanup code with Lindent
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 21 15:51:24 2009 -0700
-+
-+    ibal-scm: remove, obsolete
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 67ddd6bfba46f1f7a61b772257132f1257d05c96
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 21 15:44:15 2009 -0700
-+
-+    scm, cma provider: Cleanup code with Lindent
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d0898091090ff19be7929fed0d14f1ca696d5e53
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 21 15:39:01 2009 -0700
-+
-+    udapl: Cleanup code with Lindent
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 21 15:31:20 2009 -0700
-+
-+    dapl common: Cleanup code with Lindent
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 21 12:52:29 2009 -0700
-+
-+    dat: Cleanup code with Lindent
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 20 12:28:08 2009 -0700
-+
-+    Release 2.0.18
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Apr 16 14:35:18 2009 -0700
-+
-+    dapltest: reset server listen ports to avoid collisions during long runs
-+    
-+    If server is running continuously the port number increments
-+    from base without reseting between tests. This will
-+    eventually cause collisions in port space.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit c27af8de0501d132b8152ec8546023cdba212de5
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Apr 16 10:21:51 2009 -0700
-+
-+    To avoid duplicating port numbers between different tests, the next port
-+    number to use must increment based on the number of endpoints per thread *
-+    the number of threads.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 3084310197c20aaa50abe82260fc835786f591f5
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Apr 16 10:21:45 2009 -0700
-+
-+    dapltest assumes that events across multiple endpoints occur in a specific
-+    order.  Since this is a false assumption, avoid this by directing events to
-+    per endpoint EVDs, rather than using shared EVDs.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Apr 16 10:21:41 2009 -0700
-+
-+    Synchronization is missing between removing items from an EVD and queuing
-+    them.  Since the removal thread is the user's, but the queuing thread is
-+    not, the synchronization must be provided by DAPL.  Hold the evd lock
-+    around any calls to dapls_rbuf_*.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit f5e86d28f803162ffdf94b41ec7435dec92f728d
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Apr 16 10:21:26 2009 -0700
-+
-+    Communication to the CR thread is done using an internal socket.  When a
-+    new connection request is ready for processing, an object is placed on
-+    the CR list, and data is written to the internal socket.  The write causes
-+    the CR thread to wake-up and process anything on its cr list.
-+    
-+    If multiple objects are placed on the CR list around the same time, then
-+    the CR thread will read in a single character, but process the entire list.
-+    This results in additional data being left on the internal socket.  When
-+    the CR does a select(), it will find more data to read, read the data, but
-+    not have any real work to do.  The result is that the thread spins in a
-+    loop checking for changes when none have occurred until all data on the
-+    internal socket has been read.
-+    
-+    Avoid this overhead by reading all data off the internal socket before
-+    processing the CR list.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Apr 16 10:21:13 2009 -0700
-+
-+    The dapl connect call takes as input an address (sockaddr) and a port number
-+    as separate input parameters.  It modifies the sockaddr address to set the
-+    port number before trying to connect.  This leads to a situation in
-+    dapltest with multiple threads that reference the same buffer for their
-+    address, but specify different port numbers, where the different threads
-+    end up trying to connect to the same remote port.
-+    
-+    To solve this, do not modify the caller's address buffer and instead use
-+    a local buffer.  This fixes an issue seen running multithreaded tests with
-+    dapltest.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 7947026ede478f08b4a7b8cb607f457765bf2afa
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Apr 16 10:21:03 2009 -0700
-+
-+    Windows socket calls should check return values against SOCKET_ERROR to
-+    determine if an error occurred.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 10 08:33:41 2009 -0700
-+
-+    Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST
-+    
-+    Fix rpmbuild problem with new cma osd include file.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit acb213adb3268e9bf6999e2bf040d4a71212b701
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 10 08:32:24 2009 -0700
-+
-+    dapl scm: reduce wait time for thread startup.
-+    
-+    thread startup wait reduce to 2ms to reduce open times.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 55459699fa9c0e5fb7e2b17822f0916412c64b35
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 10 08:31:22 2009 -0700
-+
-+    dapl-scm: getsockopt optlen needs initialized to size of optval
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d710c5327e05a40796341d16b45a2b098b03f588
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:17:32 2009 -0700
-+
-+    The connection request thread adds sockets to a select list unless
-+    the cr->socket is invalid and the cr request state is set to destroy.  If the
-+    cr->socket is invalid, but the cr->state is not destroy, then the cr->socket
-+    is added to an FD set for select/poll.  This results in select/poll
-+    returning an error when select is called.  As a result, the cr thread never
-+    actually blocks during this state.
-+    
-+    Fix this by only destroying a cr based on its state being set to destroy
-+    and skip adding cr->sockets to the FD set when they are invalid.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:08:16 2009 -0700
-+
-+    Make sure all locks are initialized properly and don't zero their memory
-+    once they are.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:08:13 2009 -0700
-+
-+    The lock functions are defined just a few lines beneath the prototypes
-+    as inline.  Remove the duplicate prototypes.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 9578c4aeb9878d98374e4b7abc02db182aef82c6
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:08:07 2009 -0700
-+
-+    Make sure all locks are initialized and don't zero out their memory once
-+    they are.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 97edcbb662b489303ef68c0da02831efaddeed91
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:08:03 2009 -0700
-+
-+    The IBAL library allocates a small number of threads for callbacks to the
-+    user.  If the user blocks all of the callback threads, no additional
-+    callbacks can be invoked.  The DAPL IBAL provider cancels listen requests
-+    from within an IBAL callback, then waits for a second callback to confirm
-+    that the listen has been canceled.  If there is a single IBAL callback
-+    thread, or multiple listens are canceled simultaneously, then the provider
-+    can deadlock waiting for a cancel callback that never occurs.
-+    
-+    This problem is seen when running dapltest with multiple threads.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:57 2009 -0700
-+
-+    We need to check the return value from select for errors before checking
-+    the FD sets.  An item may be in an FD set but select could have returned
-+    an error.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit a8a977becaeefe0d7f8e01e01631a11988d2d54e
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:53 2009 -0700
-+
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:49 2009 -0700
-+
-+    Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ
-+    completion channels in the Windows version of the openib_scm provider.
-+    Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages
-+    instead of DAPL_DBG_TYPE_CM.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 73728763666a46df5789af93b50db53cdf64afd6
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:44 2009 -0700
-+
-+    The IBAL-SCM provider will run into an inifinite loop if the check for
-+    cr->socket > SCM_MAX_CONN - 1 fails.  The code continues back to the start
-+    of the while loop without moving to the next connection request entry
-+    in the list.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 9b1b396539926d36ffacfff04fbe7c081e436b45
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:40 2009 -0700
-+
-+    next_cr is set just before and inside the check
-+    if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY)
-+    Remove setting it inside the if statement.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:35 2009 -0700
-+
-+    Some errors on windows are more easily interpretted in hex than decimal.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 08ee072a1396ac2c28983878dbc6b02feb035787
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:32 2009 -0700
-+
-+    The WinOF HCA driver cannot handle transitioning from RTS -> RESET ->
-+    INIT -> ERROR.  Simply delete the QP and re-create it to reinitialize
-+    the endpoint until the bug is fixed.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:23 2009 -0700
-+
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit a8582be0e1fc89e856f1d0b43a3c1b271295a352
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:07:18 2009 -0700
-+
-+    Convert the openib_cma provider to common code between linux and windows.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Apr 10 08:06:53 2009 -0700
-+
-+    Move from using pipes to sockets for internal communication.  This
-+    avoids issues with windows only supporting select() on sockets.
-+    
-+    Remove windows specific definition of dapl_dbg_log.
-+    
-+    Update to latest windows libibverbs implementation using completion
-+    channel abstraction to improve windows scalability and simplify
-+    porting where FD's are accessed directly in Linux.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit b3ad2ed97399a24a869841e17d1314e11c379aae
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 31 05:41:50 2009 -0800
-+
-+    Release 2.0.17
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 5d732929f8a90a490994e8e35a3666c3647ad4fe
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 31 05:22:11 2009 -0800
-+
-+    dapl: ia64 build problem on SuSE 11, atomic.h no longer exists.
-+    
-+    Add autotools check for SuSE 11 and include intrinsics.h
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 16 13:23:50 2009 -0800
-+
-+    Release 2.0.16
-+    
-+    Fix changelog year in spec file.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 16 13:15:22 2009 -0800
-+
-+    Release 2.0.16
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Mar 13 12:39:12 2009 -0800
-+
-+    uDAPL: scm provider, remove query gid/lid from connection setup phase
-+    
-+    move lid/gid queries from the connection setup phase
-+    and put them in the open call to avoid overhead
-+    of more fd's during connections. No need
-+    to query during connection setup since uDAPL
-+    binds to specific hca/ports via dat_ia_open.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 775394b73980a7bc0af018a33d2a5bb795469c78
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Mar 12 12:44:43 2009 -0800
-+
-+    Build: missing new linux/osd include file in EXTRA_DIST
-+    
-+    Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Mar 12 12:11:21 2009 -0800
-+
-+    Build: spec files missing Requires(post) statements for sed/coreutils
-+    
-+    needed for anaconda install
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Mar 4 10:04:13 2009 -0800
-+
-+    dapl scm: remove unecessary thread when using direct objects
-+    
-+    A thread is created for processing events on devices without
-+    direct event objecti support. Since all openfabrics devices support
-+    direct events there is no need to start a thread. Move this under
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 3 11:08:12 2009 -0800
-+
-+    dtestx: add missing F64u definition for windows
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d9e771da16ec2b360a222ceccbbca5d088e20ee5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 3 09:25:26 2009 -0800
-+
-+    uDAPL common: add 64 bit counters for IA, EP, and EVD's.
-+    
-+     -DDAPL_COUNTERS to build-in counters for cma and scm providers.
-+     New extension calls in dat_ib_extensions.h for counters
-+      dat_print_counters, dat_query_counters
-+     Counters for operations, async errors, and data
-+     Update dtestx (-p) with print and query counter examples
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Tue Feb 17 07:24:27 2009 -0800
-+
-+    Modify the openib_scm provider to support both OFED and WinOF releases.
-+    This takes advantage of having a libibverbs compatibility library.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e
-+Author: Stan Smith <stan.smith@intel.com>
-+Date:   Fri Jan 30 09:52:33 2009 -0800
-+
-+    Update the dapl.git tree with the latest SVN version of the
-+    ibal-scm provider.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 83543b6cca342e25fd6408454f1261ec6835a172
-+Author: Stan Smith <stan.smith@intel.com>
-+Date:   Fri Jan 30 09:52:25 2009 -0800
-+
-+    Merge SVN IBAL provider code back into the main git tree.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Jan 30 09:52:11 2009 -0800
-+
-+    Changes to dtest to support building on Windows.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 9f87610c4b37e4db4d74205c14028582a2f6a79e
-+Author: Stan Smith <stan.smith@intel.com>
-+Date:   Fri Jan 30 09:48:26 2009 -0800
-+
-+    Add return codes to various functions.
-+    Add script (batch file) for Windows testing.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 723067550265defdcfe6e00460a4f89f7a81fbf1
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Jan 30 09:46:40 2009 -0800
-+
-+    Merge OFED and WinOF trees for common dapl code.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jan 16 08:16:13 2009 -0800
-+
-+    dtest/dapltest: use $(top_builddir) for .la files during test builds
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Nov 26 07:12:30 2008 -0800
-+
-+    Release 2.0.15
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 5d5dec42717c963d1644ee3e716459dc5d58e930
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Oct 27 08:48:53 2008 -0800
-+
-+    dapltest: transaction test moves to cleanup stage before rdma_read processing is complete
-+    
-+    With multiple treads, the transaction server tread can move to cleanup
-+    stage and unregister memory before the remote client process has
-+    completed the rdma read. In lieu of a rewrite to add sync messages
-+    at the end of transaction test phase, just add a delay before cleanup.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 14 11:56:35 2008 -0700
-+
-+    Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf.
-+    Change SR to include sysconfdir. SR file access in the following order:
-+    
-+    - DAT_OVERRIDE
-+    - sysconfdir
-+    - /etc
-+    
-+    if DAT_OVERRIDE is set, assume administration override
-+    and do not failover to other locations. Add debug
-+    messages for each failure and retries.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Acked-by: Doug Ledford <dledford@redhat.com>
-+
-+commit c98d2169b839a73d76691acf510dd8976ddc850a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 3 08:00:56 2008 -0700
-+
-+    Release 2.0.14
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit c26d0bb065f3734f09058e1e6d26dde4a3738e55
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 3 05:40:04 2008 -0700
-+
-+    dat.conf: add ofa-v2-iwarp entry for iwarp devices
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d54c35c8a9ba33a464ca15f4a65b914688e5194d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Oct 3 05:30:10 2008 -0700
-+
-+    dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices
-+    
-+    iWarp spec allows only one iov on rdma reads
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 1 08:17:49 2008 -0700
-+
-+    dtest: reduce default IOV's during dat_ep_create for iWARP devices
-+    
-+    iWarp adapters tend to have less IOV resources then IB adapters.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Sep 26 12:43:13 2008 -0700
-+
-+    dtest: fix 32-bit build issues in dtest and dtestx examples.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 42a3a4edf30115a35d9d599b51f8756814e62368
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Sep 26 08:48:31 2008 -0700
-+
-+    Revert "Release 2.0.14"
-+    
-+    This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63.
-+    
-+    missed some fixes for package release.
-+
-+commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 24 12:13:37 2008 -0700
-+
-+    Release 2.0.14
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit c00d858da3113ce5463d408ab5e13e17cc9529e4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 24 08:33:32 2008 -0700
-+
-+    build: $(DESTDIR) prepend needed on install hooks for dat.conf
-+    
-+    All install directives that automake creates automatically
-+    have $(DESTDIR) prepended to them so that a make
-+    DESTDIR=<some_path> install will work. The hand written
-+    install hooks for dat.conf was missing DESTDIR.
-+    
-+    Signed-off-by: Doug Ledford <dledford@redhat.com>
-+
-+commit 860db3be4907c8ff290ce7c6b631b2117f5080bd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Sep 24 08:26:28 2008 -0700
-+
-+    dapl scm: UD shares EP's which requires serialization
-+    
-+    add locking around the modify_qp state changes to avoid
-+    unnecessary modify_qp calls during multiple resolve
-+    remote AH connection events on a single EP.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sat Sep 20 16:02:00 2008 -0700
-+
-+    dtestx: Add new options to test UD.
-+    
-+    - many to one/many EP remote AH resolution, data flow
-+    - bi-directional EP remote AH resolution, data flow
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sat Sep 20 15:58:59 2008 -0700
-+
-+    dapl: fixes for IB UD extensions in common code and socket cm provider.
-+    
-+     - Manage EP states base on attribute service type.
-+     - Allow multiple connections (remote_ah resolution)
-+       and accepts on UD type endpoints.
-+     - Supply private data on CR conn establishment
-+     - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sat Sep 20 15:49:40 2008 -0700
-+
-+    dapl: add provider specific attribute query option for IB UD MTU size
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 1 15:52:37 2008 -0700
-+
-+    Release 2.0.13
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit f37589927fabf0feb3a09c4c7c03e18df5749fef
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 1 12:24:49 2008 -0700
-+
-+    dapl build: add correct CFLAGS, set non-debug build by default for v2
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 1 12:22:19 2008 -0700
-+
-+    dapl providers: fix compiler warnings in cma and scm providers
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 1 12:20:08 2008 -0700
-+
-+    dat: fix compiler warnings in dat common code
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 1 12:18:48 2008 -0700
-+
-+    dapl: fix compiler warnings in common code
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 38a53ae75bce5059a84262fe1b40eacf92b22287
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Sep 1 12:16:58 2008 -0700
-+
-+    dtest/dapltest: fix compiler warnings
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 45900087764917b354411fdd2b3880473d553ab8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Aug 22 14:51:22 2008 -0700
-+
-+    dapl cma: debug message during query needs definition for inet_ntoa
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 99d46313a03af18771966cf86fcc934d179627b5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Aug 21 12:54:58 2008 -0700
-+
-+    Release 2.0.12
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Aug 20 18:51:00 2008 -0700
-+
-+    dapl scm: fix corner case that delivers duplicate disconnect events
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 96f6822b90fa880a6c6a64b1e183064a449f7237
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Aug 20 18:47:19 2008 -0700
-+
-+    dat: include stddef.h for NULL definition in dat_platform_specific.h
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Aug 20 18:27:08 2008 -0700
-+
-+    dapl: add debug messages during async and overflow events
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Aug 20 18:24:33 2008 -0700
-+
-+    dapltest: add check for duplicate disconnect events in transaction test
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 7e8986f2c6496851b724a007458881c3248ac998
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Aug 20 18:22:42 2008 -0700
-+
-+    dtestx: fix stack corruption problem with hostname strcpy
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Aug 14 09:42:57 2008 -0700
-+
-+    dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Aug 14 09:19:53 2008 -0700
-+
-+    dapl scm: change IB RC qp inline and timer defaults.
-+    
-+    rnr nak can be the result of any operation not just
-+    message send recevier not ready. Timer is much too
-+    large given this case.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 36088a92d87e833bae535fcea0c45417dec34e65
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Aug 14 09:12:38 2008 -0700
-+
-+    dapl scm: add mtu adjustments via environment, default = 1024.
-+    
-+    DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting
-+    is min of 1024 and active mtu on IB device.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Aug 13 14:17:40 2008 -0700
-+
-+    dapl scm: change connect and accept to non-blocking to avoid blocking user thread.
-+    
-+    The connect socket that is used to exchange QP information is now non-blocking
-+    and the data exchange is done via the cr thread. New state RTU_PENDING added.
-+    On the passive side there is a new state ACCEPT_DATA used to avoid read blocking
-+    on the user accept call.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jul 29 08:18:25 2008 -0700
-+
-+    dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sun Jul 20 13:20:45 2008 -0700
-+
-+    Release 2.0.11
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 0003bb7866af3ba73cc79c703b565a8012439bb1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sun Jul 20 13:17:22 2008 -0700
-+
-+    dtestx: add -d option to test new IB UD extension.
-+    
-+    modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sun Jul 20 13:13:09 2008 -0700
-+
-+    dapl scm: add support for UD extensions in Openfabrics socket cm provider
-+    
-+    add qp_type in connection information exchange
-+    add new post_send_ud call
-+    changes to connection manager to support qp types beyond RC.
-+    changes to connection events to use new extended event calls.
-+    exchange address handle information during connection phase.
-+    changes to modify_qp to handle both RC and UD types.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 927dac5b61e64868089acd49d468b98327e14a1a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sun Jul 20 13:07:34 2008 -0700
-+
-+    dapl: add support for UD extensions in common code.
-+    
-+    allow EP create for extended service types.
-+    extend connection event types to include UD AH resolution/exchange.
-+    add new extended connect and connect request upcalls for providers.
-+    - dapls_evd_post_cr_event_ext
-+    - dapls_evd_post_connection_event_ext
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit be3d6a53f3340294697706ce50a05faf151aacc7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Sun Jul 20 12:57:49 2008 -0700
-+
-+    dat: New definitions for IB unreliable datagram extension
-+    
-+    Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD
-+    Add IB extension call dat_ib_post_send_ud().
-+    Add address handle definition for UD calls.
-+    Add IB event definitions to provide remote AH via connect and connect requests
-+    Roll IB extension version to 2.0.2
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jul 18 07:46:20 2008 -0700
-+
-+    dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 25 08:02:11 2008 -0700
-+
-+    dapltest: manpage - rdma write example incorrect
-+    
-+    parameter for rdma write should be RW and not WR
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 68638bde71b529a142c13ac332cd44435cabc896
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 23 15:26:30 2008 -0700
-+
-+    dapl: remove needless terminating 0 in dto_op_str functions.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 23 10:52:46 2008 -0700
-+
-+    Release 2.0.10
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit d9b3c06ae98ac4d3b264384f6510137166d78cb0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 23 10:35:17 2008 -0700
-+
-+    remove reference to doc/dat.conf in makefile.am
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit b052d402e09ac78281a25af2c8fe902fa71f5c6f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jun 19 13:34:49 2008 -0700
-+
-+    dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free.
-+    
-+    Problem surfaced while running Intel MPI 3.1 and mpich2-test suite.
-+    dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint
-+    and destroy_cq and destroy_pd code was ignoring verbs errors.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit e466d8e330c45176c5f00efda79ad745bf3f71a4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 18 14:21:28 2008 -0700
-+
-+    dapl scm: add stdout logging for uname and gethostbyname errors during open.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 18 14:19:51 2008 -0700
-+
-+    dapl scm: support global routing and set mtu based on active_mtu
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit fc65a08727c59c304dad20337a8bff803f2302c0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 18 13:59:44 2008 -0700
-+
-+    dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters.
-+    
-+    Bring socket cm provider back to life with some changes:
-+    
-+    better threading support for exchanging QP information.
-+    Avoid blocking during connect to support dynamic connection
-+    model with MPI implementations.
-+    
-+    consumer control of ack timeout/retries.
-+    
-+    disconnect/reject capabilities via socket exchange.
-+    
-+    version support for wire protocol to insure compatibility
-+    with peer scm provider. Add gids to exchange.
-+    
-+    validated with Intel MPI on a 14,000+ core fabric using IB DDR.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 0855af175fec2f1bec8391ebae2a2cdff26a3359
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 11 10:43:24 2008 -0700
-+
-+    dapl: add opcode to string function to report opcode during failures.
-+    
-+    Need to use cookie opcode during failures in lieu of cqe opcode.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit ec6296e7f0a843c69231f8284ae780014fa26fbe
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 16 14:59:43 2008 -0700
-+
-+    dapl: remove unused iov buffer allocation on the endpoint
-+    
-+    provider's manage iov space on stack during posting.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 16 13:59:11 2008 -0700
-+
-+    dapl: endpoint pending request count is wrong
-+    
-+    The code assumes every cookie allocated during posting of
-+    requests gets completed. This incorrect assumption results in
-+    wrong pending count. Remove request_pending field and replace
-+    with direct call, dapl_cb_pending, to provide accurate
-+    data to consumer.
-+    
-+    Add debug print if consumer overruns request queue.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jun 2 12:40:45 2008 -0700
-+
-+    dapl extension: dapli_post_ext should always allocate cookie for requests.
-+    
-+    extension didn't allocate cookie if completion was suppressed which resulted
-+    segfault during provider post call. Provider's expect cookie for wr_id,
-+    even with surpressed completions, to handle events during errors.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue May 20 14:35:43 2008 -0700
-+
-+    Release 2.0.9
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue May 20 21:56:06 2008 -0700
-+
-+    dtest,dtestx,dapltest: fix build issues with Redhat EL5.1
-+    
-+    need include files/definitions for sleep, getpid, gettimeofday
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 8084ebf39729bac310447467b518df4248e9e2b6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue May 20 14:31:09 2008 -0700
-+
-+    dapl: Fix long delays with the cma provider open call when DNS is not configure on server.
-+    
-+    Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue May 20 14:30:05 2008 -0700
-+
-+    dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 30 14:48:21 2008 -0700
-+
-+    Release 2.0.8
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 30 13:51:41 2008 -0700
-+
-+    dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 30 13:25:53 2008 -0700
-+
-+    dat: udat_sr_parser ia_name will fail on comments, turn down debug message
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit b93b91d48186d100c48f1a479776d56476847607
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 29 16:15:44 2008 -0700
-+
-+    dat: cleanup error handling with static registry parsing of dat.conf
-+    
-+    change asserts to return codes, add log messages, and
-+    report errors via open instead of asserts during dat
-+    library load.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 28 10:14:20 2008 -0700
-+
-+    dapl: cma provider needs to support lower inline send default for iWARP
-+    
-+    IB and iWARP work best with different defaults. Add transport check
-+    and set default accordingly. 64 for iWARP, 200 for IB.
-+    
-+    DAPL_MAX_INLINE environment variable is still used to override.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit be32d7d5beeeceac5dbb1974d3217265dc4d5461
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 28 09:44:12 2008 -0700
-+
-+    dtestx: need to include string.h for memset/strcpy declarations
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit a192465714e7607529303a80d8f9a312e0c7aec6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 28 08:41:05 2008 -0700
-+
-+    dapl: add vendor_err with DTO error logging
-+    
-+    DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 6ac657a4e7e5e27254a024fca7fdead569043f9a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 25 15:12:34 2008 -0700
-+
-+    dapl: add check before destroying cm event channel in release
-+    
-+    library may be loaded and unloaded without calling open
-+    in which case the cm event channel is not created.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 22 12:55:13 2008 -0700
-+
-+    dapl: evd_alloc doesn't check for direct_object_create errors.
-+    
-+    Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc.
-+    When attempting to create large number of evd's that exceed
-+    open files limit the error was not propagated up causing
-+    a segfault. Note: there are 3 FD's required for each EVD
-+    2 for pipe, and one for cq event_channel.
-+    
-+    Change the error reporting to indicate correct return
-+    code and send to log with non-debug builds.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 14 13:10:13 2008 -0700
-+
-+    dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement.
-+    
-+    Change the packaging to update only the OFA provider contents in dat.conf. This allows other
-+    dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain
-+    syntax of this static configuration file.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit d32b27d991bc1314eea055ce3f55bb585b11aaac
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 11 11:37:48 2008 -0700
-+
-+    dapl openib_cma: fix hca query to use correct max_rd_atom values
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Apr 9 17:26:06 2008 -0700
-+
-+    dat: add logging by default during library load failures.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 1794e94754a1e58fcf214c2802e950124bbd1316
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 8 17:32:03 2008 -0700
-+
-+    dtest: add private data validation with connect and accept.
-+    
-+    Include code, with build option, to validate private data with
-+    consumer rejects.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 8 17:25:11 2008 -0700
-+
-+    dapl: add hooks in evd connection callback code to deliver private data with consumer reject.
-+    
-+    PEER rejects can include private data. The common code didn't support delivery
-+    via the connect event data structure. Add the necessary hooks in
-+    dapl_evd_connection_callback function and include checks in openib_cma
-+    provider to check and delivery properly. Also, fix the private data size
-+    check in dapls_ib_reject_connection function.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 7 15:47:57 2008 -0700
-+
-+    dapl: increase reject private data size to avoid odd byte offets.
-+    
-+    remove reject type checking on passive side since it will
-+    always be non-consumer from active side.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 353a1c8a00bb2a1380fd7a372973a5a70828da35
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 4 16:04:11 2008 -0800
-+
-+    dapl: update vendor information for OFA v2 provider.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit dbf1ea37f43caec61911dea06af801c2f906db0a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Apr 4 16:03:03 2008 -0800
-+
-+    dapl: add provider vendor revision data in private data with reject
-+    
-+    Add 1 byte header containing provider/vendor major revision
-+    to distinguish between consumer and non-consumer rejects.
-+    Validate size of consumer reject privated data.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 0f71b9be594739a1fba7d74929eacd42a8cee392
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Apr 3 17:06:27 2008 -0800
-+
-+    dapl: add support for logging errors in non-debug build.
-+    
-+    Add debug logging (stdout, syslog) for error cases during
-+    device open, cm, async, and dto operations. Default settings
-+    are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST.
-+    
-+    Change default configuration to build non-debug.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit bea882ad9b11ac7188628a939f5227e22c914169
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Apr 3 16:23:29 2008 -0800
-+
-+    dapl: add support for private data in CR reject.
-+    
-+    Private data support via dat_cr_reject was added to
-+    the v2 DAT specification but dapl was never extended
-+    to support at the provider level.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 1 11:02:37 2008 -0800
-+
-+    dapl: calculate private data size based on transport type and cma_hdr overhead
-+    
-+    Need to adjust CM private date size based on different transport types.
-+    Add hca_ptr to dapls_ib_private_data_size call for transport type
-+    validation via verbs device. Add definitions to include iWARP size
-+    of 512 and subtract 36 bytes for cma_hdr overhead.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Mar 26 17:58:17 2008 -0800
-+
-+    Remove improperly licensed GETOPT code from dtest source tree.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 88069fdd21f92923388dec7adbde0d1bc334e7c4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 18 15:04:34 2008 -0800
-+
-+    remove unnecessary assert from dapl_ep_free.
-+    
-+    dat_ep_free must handle the case where a consumer calls
-+    free in CONNECTED or DISCONNECT_PENDING states. After
-+    free calls disconnect, there may be a pending event,
-+    in which case the providers dapls_ib_qp_free will block
-+    accordingly and handle pending events.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit b3f020e5cba765077049a8cf61c4ce5009fa1031
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Fri Mar 14 14:31:40 2008 -0700
-+
-+    fix openib_scm compiler warning
-+    
-+    Cast to socklen_t since accept(2) expects an unsigned argument.
-+    
-+    Makes the openib_scm provider now build successfully when using
-+    make VERBS=<provider> (the -Werror flag was causing the build
-+    failure)
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 441996f05d3cc8b09c94c166ef736bc50c24de7e
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Fri Mar 14 14:31:34 2008 -0700
-+
-+    fix provider-specific compiler warnings
-+    
-+    Initialize ds_array_start_p otherwise the compiler would claim
-+    that this variable could be used with an uninitialized value.
-+    
-+    Makes the uDAPL providers now build successfully when using make
-+    VERBS=<provider> (the -Werror flag was causing the build failure)
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 11 09:25:07 2008 -0800
-+
-+    uDAPL: fix query to adjust max sge for default inline of 64 bytes
-+           and include missing max_rdma_write_iov ep_attr field
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit e2c6bf57f78dfebc21e168df01e5876202053e08
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Fri Mar 7 09:39:22 2008 -0800
-+
-+    uDAT: fix reuse of va_list in debugging mode
-+    
-+    Make sure we reinitialize the va_list since va_list is undefined
-+    if a function traverses the va_list with va_arg.
-+    
-+    This patch fixes the uDAT debugging case when both stdout and
-+    syslog output is wanted.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Mar 6 15:40:35 2008 -0800
-+
-+    Add hostname and process id to debug output to aid
-+    scale-up and out debug.
-+    
-+    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-+
-+commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Sat Feb 23 21:03:21 2008 -0800
-+
-+    fix reuse of va_list in debugging mode
-+    
-+    Make sure we reinitialize the va_list since va_list is undefined
-+    if a function traverses the va_list with va_arg.
-+    
-+    This patch fixes the debugging case when both stdout and syslog
-+    output is wanted.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit da80af8c76f220508407a2e171c8b28b43b35bf9
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 16:54:45 2008 -0800
-+
-+    Fix memory leak in provider specific post send/recv if there's
-+    more than DEFAULT_DS_ENTRIES iovecs.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit d78ee9f95fbe48f71eb247b01c598994edfa4d17
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 03:19:42 2008 -0800
-+
-+    Guarantee NUL termination if hostname gets truncated.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 03:19:37 2008 -0800
-+
-+    Make sure we don't leak the hash table if dapl_hca_alloc fails.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit e4ed56be6bd64684564169d89df7ca30faffdb53
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 03:19:32 2008 -0800
-+
-+    Fix memory leak.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 03:19:27 2008 -0800
-+
-+    Fix memory leak in error path.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit d971e799bb5385a8c847cf3f863f19854e95c1b2
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 03:19:22 2008 -0800
-+
-+    Fix memory leak
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit c21f2f455af7934675a58ff825bed6cf54d457c9
-+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+Date:   Tue Feb 19 03:19:17 2008 -0800
-+
-+    Fix memory leak.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit ee46aa47e2a4deeded347fe18bd6321db61c6594
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Feb 15 10:10:01 2008 -0800
-+
-+    Release 2.0.7
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit f0ca504bc2639cb7a48528d45e9026b54dab3e57
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Feb 14 09:46:56 2008 -0800
-+
-+    uDAT: Make sure we initialize the dictionary entry early enough so that
-+    we can base our cleanup decisions on that variable being
-+    initialized.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 6b11838043a6012668c7e1a22a869e9e84dc40d6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Feb 14 09:46:18 2008 -0800
-+
-+    uDAT: Make sure we stay within bounds when manipulating the ia_name.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Feb 14 09:44:56 2008 -0800
-+
-+    uDAT: Make sure we stay within bounds when manipulating the ia handle.
-+    Fix typo in comment.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit 7fe64f10874667062e067efb7ea8c3d385ae90b7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Feb 14 09:43:39 2008 -0800
-+
-+    uDAT: Zero-out memory otherwise we might base our cleanup decisions on
-+    uninitialized memory.
-+    
-+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-+
-+commit f510e7e8f5b72a6262a7f8b255926cf96c65b654
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 13 20:39:26 2008 -0800
-+
-+    Modify default configure options to match rpm spec file
-+     --enable-debug, --enable-ext-type=ib
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 75273f1a5c599777bb43add93f30563689fdbc10
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 11 15:43:03 2008 -0800
-+
-+    udapl OFA provider: set listen backlog to default cma backlog max.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 11 14:50:33 2008 -0800
-+
-+    The OFA dapl provider is checking for incorrect return code
-+    from rdma_bind_addr and rdma_listen calls. This causes an error
-+    to be returned back to the consumer instead of correctly
-+    incrementing the seed port and re-calling the OFA provider
-+    until a valid port is issued. The seed value (1000) is also
-+    incorrect and should start a non-privledged port (1024) to
-+    avoid EPERM errors when seeding the starting port value.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 4 16:16:10 2008 -0800
-+
-+    Release 2.0.6 - ChangeLog
-+
-+commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 4 16:14:02 2008 -0800
-+
-+    Release 2.0.6
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 8c5beb870048aca286f7396549771ccb075c5c1b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 4 16:12:47 2008 -0800
-+
-+    Fix OFED v2 package to build against and target /dat2/include directory.
-+    
-+    Prevous patch missed dat_osd.h, dapltest/dtest incorrect.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 4 13:00:45 2008 -0800
-+
-+    uDAT/DAPL: Fix package to build against and target /dat2/include directory.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 29 16:34:49 2008 -0800
-+
-+    Release 2.0.5 - ChangeLog updated
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 356cf91905d39ade06d76ab9ace6203cd7907d93
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 29 16:33:10 2008 -0800
-+
-+    libdat: rename libdat.so to libdat2.so to coexist with v1 devel
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d9a9f46ee220ec9c479756acc306ed68060a662f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jan 28 13:55:35 2008 -0800
-+
-+    Release 2.0.4 - README
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 533983cec914a7ecc6829934a56f867d7870e301
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jan 28 12:06:03 2008 -0800
-+
-+    Release 2.0.4 Changelog
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Jan 28 12:04:18 2008 -0800
-+
-+    Relase package 2.0.4
-+
-+commit 95935648f81ac5177ae7120b35e55483902b8c64
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jan 23 16:40:48 2008 -0800
-+
-+    dapltest does not include definitions for inet_ntoa.
-+    At load time the symbol was resolved but with the
-+    default definition of int, instead of char*, it caused
-+    segfault. Add correct include files in dapl_mdep_user.h
-+    for linux.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jan 23 14:46:30 2008 -0800
-+
-+    Add freeaddrinfo to deallocate getaddrinfo buffer.
-+    Cleanup a few printf messages.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jan 23 14:25:21 2008 -0800
-+
-+    Fix for uDAPL v2 using extended operation. After extension completion,
-+    the DTO cookie must be checked for type before deallocating to handle
-+    inbound immediate data in receive. The sample dtestx client will fail
-+    when running loopback if the rdma immediate is received from remote
-+    before the rdma immediate request completion fires.
-+    
-+    Bug causes following dtestx client error:
-+    dat_ib_post_rdma_write_immed
-+       returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jan 17 11:30:27 2008 -0800
-+
-+    WinOF: update dapltest,dtest directories for windows build
-+    WinOF: add README.windows
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 9bececbb32dd31d4a3528e8f000a773e5c593430
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jan 17 11:24:46 2008 -0800
-+
-+    WinOF: update dtestx for windows build
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Jan 17 11:23:21 2008 -0800
-+
-+    WinOF: add build enviroment, cleanup old makefiles
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 15 16:59:34 2008 -0800
-+
-+    WinOF: name collision with ibal verbs ib_cm_handle_t
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 7c5418a781c1dfdb37b09450b5df40363dce84b4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 15 16:06:10 2008 -0800
-+
-+    dtest: dat_evd_query for correct size
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 6de5e635c01e78bde6e153b727926da900677d52
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 15 16:03:27 2008 -0800
-+
-+    dapltest: WinOF support.
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+
-+commit c680e95b96e57bd8b69b1c73e95730854fcea028
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 15 14:54:57 2008 -0800
-+
-+    openib_cma: fix cleanup issues in destroy_cm_id
-+                add macros to convert SID and PORT
-+                fix init/responder settings in accept
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 15 14:49:54 2008 -0800
-+
-+    Modifications for WinOF build and endian support for RMR info
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jan 15 14:39:18 2008 -0800
-+
-+    WinOF: DAT_API changes, white space and tab cleanup
-+           IBAL provider code added
-+    
-+    Common code: initialize cookie pool buffer
-+                 add dapl extension DTO counter
-+                 add get_cqe_op_str debug call
-+                 remove excess dbg in evd_dequeue
-+                 add dbg assert to sp_search_cr
-+                 IBAL provider support _VENDOR_IBAL_
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 68f2ad0af3623dec27b1223aeaca6357348eef4b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jan 4 08:32:39 2008 -0800
-+
-+    Windows specific -
-+       IBAL support in evd_create
-+       Build IB extensions by default
-+    Common code -
-+       check return status, evd_free, evd_wait
-+       add dapl_event_str function
-+       definitions for dat_os_library_error, dat_os_ungetc
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d21f36406408245ac979f0b9594e7d1d0b9a3852
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jan 4 08:32:19 2008 -0800
-+
-+    Common code -
-+       Missing DAT_API defs
-+       casting to fix build issues
-+       bitmaps for extension debug
-+       DAPL_BAD_PTR macro
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 258678a381c6a0170020c48b0ba627e820abd3e7
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jan 4 08:31:59 2008 -0800
-+
-+    Common code -
-+       Add DAT_API definitions for dat_redirection.h, udat_redirection.h
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jan 4 08:31:27 2008 -0800
-+
-+    Windows specific -
-+       Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider
-+       Support for direct object on CQ
-+       INIT and FINI changes
-+       setup dat.conf default path, fix sr parsing
-+    Common code -
-+       Add Stan Smith as contributor
-+       O/S independent dat_os_library_error()
-+    
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit b3ba3dc9743baf3bff243e8969edf3395d1118dd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Dec 11 14:44:24 2007 -0800
-+
-+    2/2 uDAPL changes to sync common code base with WinOF
-+     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )
-+     - cleanup platform specific definitions for windows
-+     - c++ support
-+     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE
-+
-+commit 92d7eef38877ad472a91e5e9f88e4e49657716bf
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Dec 11 14:43:05 2007 -0800
-+
-+    1/2 uDAT changes to sync common code base with WinOF
-+     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )
-+     - cleanup platform specific definitions for windows
-+     - c++ support
-+     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: Stan Smith <stan.smith@intel.com>
-+
-+commit 95764c6da28284d29071cf01d1a09bdcb967a971
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Dec 4 13:19:27 2007 -0800
-+
-+    - Fix size of evd request queue on creation
-+    - Add query and checking of DTO request queue
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6
-+Merge: 11a165a... abb4356...
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 27 13:31:32 2007 -0800
-+
-+    master_dat2.0_merge
-+
-+commit abb4356cd765d38cf5cff2dfbdb610b380f944a2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 20 12:10:39 2007 -0800
-+
-+    Release 2.0.3
-+
-+commit d2c66eb7363234c5a9fb82aa92df1c132e46477e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Nov 20 12:07:58 2007 -0800
-+
-+    - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices
-+    - Add missing ia_query for max_iov_segments_per_rdma_write
-+    - Cleanup CMA code no longer supported by rdma_cm
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 3a3519167bd65bd999424788f139b930b099b405
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Nov 19 15:26:44 2007 -0800
-+
-+    Change dapltest timers to use gettimeofday instead of get_cycles for better portability.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 11a165a1868b1748fe476e08fc40af620f961cd2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 31 10:58:51 2007 -0800
-+
-+    - DAT/DAPL Version 1.2.3 Release 1
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 31 10:55:48 2007 -0800
-+
-+    ChangeLog update
-+
-+commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Oct 31 10:55:05 2007 -0800
-+
-+    - DAT/DAPL Version 2.0.2 Release 1
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 43931378b9d4f5f721da828623f1e391f32f446b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 30 09:06:24 2007 -0800
-+
-+    - Add ChangeLog
-+    - update cma provider to report remote and local ports via dat_ep_query.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Oct 25 14:37:14 2007 -0700
-+
-+    Fix dapltest endian issue with mem_handle, mem_address.
-+    
-+    Signed-off-by: Shirley Ma <xma@us.ibm.com>
-+
-+commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Oct 25 14:36:12 2007 -0700
-+
-+    Fix dapltest endian issue with mem_handle, mem_address.
-+    
-+    Signed-off-by: Shirley Ma <xma@us.ibm.com>
-+
-+commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 16 14:23:17 2007 -0700
-+
-+     Fix dtest to build properly with extensions.
-+    
-+     Modify dat.h dat_event to include event_extension_data[8].
-+     Extend struct dat_event outside of extension build
-+     switch to enable non-extended applications to work
-+     with extended libraries. Otherwise, there is a potential
-+     for the event callee to write back too much event data
-+     and exceed callers non-extended event buffer.
-+    
-+     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d7134fb2bcad6f4f68410af997f8791edd788cfb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 16 14:10:52 2007 -0700
-+
-+        Use inet_ntoa instead of open coding it. IP addresses were being
-+        reversed on PowerPC.
-+    
-+        On PowerPC the timebase ticks at a different frequency to the CPU.
-+        dapltest currently assumes a 1:1 relationship, and gives bogus values
-+        when scaling timebase to real time.
-+    
-+        To fix this, look at the timebase field in /proc/cpuinfo instead. To
-+        keep things consistent with x86, scale that value to MHz.
-+    
-+        Signed-off-by: Anton Blanchard <anton@samba.org>
-+
-+commit c6710c291a4f7c0845a4535767d41d66f092fabf
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 16 14:09:56 2007 -0700
-+
-+    Use inet_ntoa instead of open coding it. IP addresses were being
-+    reversed on PowerPC.
-+    
-+    On PowerPC the timebase ticks at a different frequency to the CPU.
-+    dapltest currently assumes a 1:1 relationship, and gives bogus values
-+    when scaling timebase to real time.
-+    
-+    To fix this, look at the timebase field in /proc/cpuinfo instead. To
-+    keep things consistent with x86, scale that value to MHz.
-+    
-+    Signed-off-by: Anton Blanchard <anton@samba.org>
-+
-+commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 16 14:02:36 2007 -0700
-+
-+     Minor clean-up of cr/lf
-+    
-+     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 33fd0628497911df11dea640aea4660e54989ed6
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 16:01:37 2007 -0700
-+
-+    Final changes for 2.0.1-1 package, OFED 1.3 ALPHA
-+    Fix build issue with SLES 10, gcc++ compiler
-+    
-+     Signed-off-by: Jimmy Hill <jimmy.hill@us.ibm.com>
-+     Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 14:50:02 2007 -0700
-+
-+    Final changes for package 1.2.2-1, OFED 1.3 ALPHA
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 52bc16939e87587f8208e775dd061f54196a9acb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 11:58:46 2007 -0700
-+
-+    Change v2 dat.conf provider names to associate with ib net devices
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit d22e62f989dd16d503d5430ffe6f55075139e057
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 11:43:34 2007 -0700
-+
-+    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
-+    than times().
-+    
-+    Signed-off-by: Anton Blanchard <anton@samba.org>
-+
-+commit a64eae5bd36598a5c93010e07869e95599aa8ceb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 11:41:40 2007 -0700
-+
-+    Change v2 dat.conf provider names to associate with ib net devices
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 11:35:21 2007 -0700
-+
-+    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
-+    than times().
-+    
-+    Signed-off-by: Anton Blanchard <anton@samba.org>
-+
-+commit 66bf23e3e53f370c92803f162144947f29ce06d8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 11:30:15 2007 -0700
-+
-+    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
-+    than times().
-+    
-+    Signed-off-by: Anton Blanchard <anton@samba.org>
-+
-+commit c220760bbb1f6357b6e187ff6c5e576dd74fd504
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Oct 2 10:39:09 2007 -0700
-+
-+    Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using
-+    the kernel atomic routines, code them explicitely like x86 does.
-+    
-+    Signed-off-by: Anton Blanchard <anton@samba.org>
-+
-+commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Sep 28 17:04:54 2007 -0700
-+
-+    Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 493e65b5b47f47e4824f775959fd98e56aeaccc4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Sep 28 17:03:41 2007 -0700
-+
-+    Clean up packaging, modify dat.conf for cma provider name change to ofa
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Sep 20 12:25:55 2007 -0700
-+
-+      Modifications to coexist with 2.0 libraries
-+         - fix RPM specfile, configure.in,  1.2.2 package
-+         - modify dat.conf
-+    
-+        Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Sep 20 10:55:19 2007 -0700
-+
-+    Modifications to coexist with 1.2 libraries
-+     - cleanup CR-LF in dtestx
-+     - fix RPM specfile, 2.0.1 package
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 230767742b8287490373c09d1bd346337b375b48
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 22 11:48:20 2007 -0700
-+
-+    Update copyright in specfile
-+
-+commit 5294cbe5e58f67d0a98862edea3684fff6e773bb
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jun 22 11:47:14 2007 -0700
-+
-+    Update Copyright in specfile
-+
-+commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 6 13:20:38 2007 -0700
-+
-+    Update specfile to reflect DAT/DAPL 1.2.1 release
-+
-+commit babb95eff1bcef88bed46e92c323193d8f039eff
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Jun 6 11:48:07 2007 -0700
-+
-+    More changes to the release notes
-+
-+commit 0f299bf1deb9198b2f008c3ffa717bef252b6097
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jun 5 15:56:17 2007 -0700
-+
-+    Update release notes
-+
-+commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Jun 5 15:52:18 2007 -0700
-+
-+    Add release notes updated for OFED 1.2 release
-+
-+commit f332badb80f0b1d88bf2d70dba0c90afc40f088f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu May 31 12:43:28 2007 -0700
-+
-+    Add provider specific interface to uDAPL for extensions support.
-+    Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events
-+    Remove unnecessary check on dats_set_ia_handle in dat_ia_openv
-+    Clean up specfile and some extra LF's
-+
-+commit 4d7e30586402149228a30bea3036466395577ec4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 16 12:56:39 2007 -0700
-+
-+    add iwarp extension include file
-+
-+commit d9963cc9984c06f147b92877945e847f657cd512
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 16 12:52:38 2007 -0700
-+
-+    clean up some CR's in include files
-+
-+commit 80f4e8c4be02bac5d472e1e6c4937079882a0388
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 9 16:21:16 2007 -0700
-+
-+    Take out references to specific 1.1 verbs definitions (ibv_comp_channel).
-+
-+commit 544fbb873d5320e9606f176c4b71bcba0e257d7d
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 9 12:51:53 2007 -0700
-+
-+    Bug Fixes:
-+      - 606: Return local and remote ports with dat_ep_query
-+      - 585: Add bonding example to dat.conf
-+
-+commit e64079f7b961aa9a672711f0e933a77f3999d302
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 7 15:54:59 2007 -0700
-+
-+    Update dapltest to use default device OpenIB-cma
-+    Fix dapltest manpage, example for performance test wrong
-+
-+commit 7cda2304a6880371ec2d9451a4f83a7a254bc474
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon May 7 12:49:18 2007 -0700
-+
-+    Fix issues with IB DTO extensions
-+     - debug print_cqe updated for latest IBV definitions
-+     - dapli_evd_cq_to_event modified to handle both post and receive extensions
-+     - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap
-+     - modify cookie DTO types to support extensions properly
-+
-+commit 82a6750d31cd432c7e09298fc98c0e7e74abd012
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri May 4 17:17:41 2007 -0700
-+
-+    Add new dapl functions for 2.0 (stubs for now)
-+    - dapl_ep_post_send_invalidate
-+    - dapl_ep_post_rdma_read_to_rmr
-+    - dapl_ia_ha
-+    - dapl_csp_create, query, free
-+    - dapl_cno_trigger
-+    - dapl_cno_fd_create
-+    - dapl_extensions
-+    
-+    Add new 2.0 parameters to existing API's
-+    - dapl_cr_reject
-+    - dapl_rmr_bind
-+
-+commit 8679aaf56c781715adc132a38a731e36194570f1
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu May 3 09:44:43 2007 -0700
-+
-+    update dtestx.c, default provider OpenIB-cma
-+
-+commit 527f6d19125e9eec7ecef03a8633626b0043a2f4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed May 2 17:27:44 2007 -0700
-+
-+    Added IB extensions and dtestx as an example program using
-+    rdma write with immediate and atomic operations
-+
-+commit 83ac961b505346708f12d59152146f3b04c8306f
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Apr 30 10:55:59 2007 -0700
-+
-+    Fixes atomic operation build problem with ia64 and RHEL5.
-+
-+commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Apr 26 17:29:37 2007 -0700
-+
-+    Update README and dapltest manpage
-+
-+commit 9a951d0a8713657da90568c0613eb48f5010cf1e
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 3 16:35:17 2007 -0700
-+
-+    Cleanup RPM specfile for the dapl package, move to 1.2-1 release.
-+
-+commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Apr 3 14:38:31 2007 -0700
-+
-+    Add support for multiple IB devices to dat.conf to support IPoIB HA failover.
-+
-+commit 5434b720b36de2f262a02ff9dfccd99953c09e59
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Mar 15 10:46:33 2007 -0800
-+
-+    Fix ia64 builds on SUSE
-+
-+commit b0f9eef1aa7f279802da233480cf6c495e16565b
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Mar 14 13:29:08 2007 -0800
-+
-+    DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider
-+
-+commit 61858b925f4c1a6f9edba6389a5bd601daf936e9
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Mar 14 11:08:19 2007 -0800
-+
-+    change DAT_VERSION major and minor numbers to 2.0
-+
-+commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Mar 14 10:43:56 2007 -0800
-+
-+    add provider support to dtest, set default to OpenIB-cma
-+
-+commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Tue Mar 13 16:20:20 2007 -0800
-+
-+    add provider option to dtest, set default to OpenIB-cma
-+
-+commit 76a43cace54567135bac7ae54e336c6595b65fd9
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Mar 9 13:09:14 2007 -0800
-+
-+    Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib
-+
-+commit 921687efed992e6ab72dfb731687b6816324a024
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Thu Mar 8 16:01:29 2007 -0800
-+
-+    Update the README
-+
-+commit 52ed210ae99b291f72441e71459006b5f2c851ce
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Mar 7 15:34:41 2007 -0800
-+
-+    - Fix bug 408, dapltest compilation failure on 32 bit arch
-+    - Update libdat.spec.in file to build uDAPL RPMs correctly
-+
-+commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Mar 5 14:15:49 2007 -0800
-+
-+    Fix build issues with dtest and dapltest. Define build tree path to dat/include.
-+
-+commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Feb 28 17:14:55 2007 -0800
-+
-+    Add dapltest headers to EXTRA_DIST
-+    Modify dtest to delay before accepting
-+    
-+    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+
-+commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Feb 26 13:54:15 2007 -0800
-+
-+    Adding dtest and dapltest to the build. Manual pages created.
-+
-+commit d245664e27148e54469268ad81f41b2a894a131a
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Fri Jan 19 16:21:30 2007 -0800
-+
-+    uDAPL changes to support exchanging and validation of the device responder_resources and the
-+    initiator_depth during connection establishment
-+
-+commit 2280f833090aa9f750d5be8f9b06e7e08e642da5
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Wed Dec 6 11:49:27 2006 -0800
-+
-+    Update cma provider to sync with rdma_ucm changes
-+
-+commit 89448545b415b6dff57e3314b020619f6b979ef8
-+Author: Arlin Davis <arlin.r.davis@intel.com>
-+Date:   Mon Dec 4 13:54:20 2006 -0800
-+
-+    Update autogen to create config directory
-+
-+commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Tue Nov 7 20:22:05 2006 +0000
-+
-+    r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL
-+    level.
-+    
-+    Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a
-+    recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified.
-+    
-+    Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support
-+    to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call
-+    when receiving the disconnect request to guarantee a disconnect reply and event on the remote side.
-+    The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing
-+    to DISCONNECTED in the event callback.
-+    
-+    Here are the new options (environment variables) with the default setting:
-+    
-+    DAPL_CM_ARP_TIMEOUT_MS   4000
-+    DAPL_CM_ARP_RETRY_COUNT  15
-+    DAPL_CM_ROUTE_TIMEOUT_MS  4000
-+    DAPL_CM_ROUTE_RETRY_COUNT 15
-+
-+commit c73aeb904504a0bc6cce0fb1248af9ba39521395
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Oct 12 22:41:33 2006 +0000
-+
-+    r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported.
-+
-+commit b1d94b26610f682cdd43bde2aecf5004e0865422
-+Author: Steve Wise <swise@opengridcomputing.com>
-+Date:   Tue Sep 12 18:15:39 2006 +0000
-+
-+    r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC
-+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 99a5dddd07d4c271ebb075b5b0f800101f850a56
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Sep 7 18:09:11 2006 +0000
-+
-+    r9346:
-+    inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider
-+
-+commit b53a87c856d9754313da9543a1dac5c6f1307085
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Wed Sep 6 20:36:09 2006 +0000
-+
-+    r9315:
-+    Fill out some unitialized fields in the ia_attr structure
-+    returned by dat_ia_query().
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: Robert Walsh <robert.walsh@qlogic.com>
-+
-+commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Fri Aug 11 20:44:23 2006 +0000
-+
-+    r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default.
-+
-+commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Wed Jul 19 17:15:06 2006 +0000
-+
-+    r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider
-+
-+commit 25fb8c376547de895a170194c09b2d72dfea789d
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Mon Jul 17 22:59:17 2006 +0000
-+
-+    r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues.
-+
-+commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af
-+Author: Anton Blanchard <anton@samba.org>
-+Date:   Mon Jul 17 21:26:03 2006 +0000
-+
-+    r8562: Fix some suspicious inline assembly:
-+    - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we
-+      shouldnt export them to userspace. Replace it with lwsync and isync.
-+    - The comment says its implemenenting cmpxchg64 but in fact its
-+      implementing cmpxchg32. Fix the comment.
-+    
-+    Signed-off-by: Anton Blanchard <anton@samba.org>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 63759108a1376b6e45a4491551f71d8cafdcddc1
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Jul 12 14:56:26 2006 +0000
-+
-+    r8503: Fix IA64 build problems reported by John Partridge <johnip@sgi.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Jun 22 22:02:56 2006 +0000
-+
-+    r8182: Lower the reject debug message level so we don't see warnings
-+    when consumers reject.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit f14889bb0cd22e897148ea2f6931a6b4f23143b0
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Jun 22 21:13:37 2006 +0000
-+
-+    r8181: Added support for active side TIMED_OUT event from a provider.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Jun 22 20:58:06 2006 +0000
-+
-+    r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 893698c31a0d8e60227806d992485a44375840cb
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Jun 19 17:20:45 2006 +0000
-+
-+    r8112: Update for new rdma_create_id() function signature.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 53483d84b0d02c432d9435d2f8e840cab3ded320
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Wed Jun 14 16:17:39 2006 +0000
-+
-+    r8008: Set max rdma read per EP attributes
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Mon Jun 12 15:42:50 2006 +0000
-+
-+    r7931: Report the proper error and timeout events.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Mon Jun 12 14:51:14 2006 +0000
-+
-+    r7928: Socket CM fix to guard against using a loopback address
-+    as the local device address.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 152219cf83c61e459fdf3de03d4e83ddba045230
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Tue Jun 6 21:46:44 2006 +0000
-+
-+    r7755: Use the uCM set_option feature to adjust connect request timeout
-+    and retry values. Also, a fix to disallow any event after a disconnect
-+    event.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 3a0686a2624ed28c7ea37b650415801f1cedbd10
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed May 31 19:55:57 2006 +0000
-+
-+    r7608: Correct comment.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit eb760157c90f59183b424ac8e71474fe0b46094c
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu May 18 21:54:12 2006 +0000
-+
-+    r7347: Undo inadvertent change.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 27256222b42fecfac8a44b3f82fe2524ecc72de2
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu May 18 21:50:27 2006 +0000
-+
-+    r7346: Fix for uCMA provider to return the correct event as a result of
-+    rejects. Also, ran into a segv bug with dapl_ep_create when
-+    creating without a conn_evd.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit b1b6e16f3e41e123cd347bc78b01e3272076362b
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Fri May 12 19:50:19 2006 +0000
-+
-+    r7141: Update the uDAPL openib_cma provider to work with the new
-+    uCMA event channel interface.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 27f9f0c106662cc7b41bcb747495860a1b6c7133
-+Author: Steve Wise <swise@opengridcomputing.com>
-+Date:   Tue May 2 21:33:35 2006 +0000
-+
-+    r6873: Transaction test change to comply with the iWARP MPA protocol's
-+    "Connection Startup Rules".
-+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 060d09f974ffbe73672e17641b2f18d3821d31a7
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Fri Apr 28 13:44:17 2006 +0000
-+
-+    r6736: getaddrinfo() fix for debug builds and some additional debug messages for
-+    connect errors and rejects.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Apr 19 16:49:34 2006 +0000
-+
-+    r6520: Fix compilation warning.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 115fcc396164066326f9447d71af798a381d063f
-+Author: Steve Wise <swise@opengridcomputing.com>
-+Date:   Wed Apr 19 16:32:01 2006 +0000
-+
-+    r6518: Do not always generate an event for an abrupt disconnect.
-+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit f959bb786cd884bf4d2a5da4d299da6297d65293
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Apr 19 16:30:37 2006 +0000
-+
-+    r6517: Generate a disconnect event for providers that do not generate
-+    one automatically.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit bb467511cf6e217147817ba12bbe800aae97cab5
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Apr 19 16:25:33 2006 +0000
-+
-+    r6516: Fix compilation error.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 117a9856c269bf08b738a1923c92f5a1949f6cc1
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Apr 10 20:16:44 2006 +0000
-+
-+    r6392: Fix for RDMA cm id destruction and debug builds.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Apr 6 15:32:47 2006 +0000
-+
-+    r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct
-+    attribute.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 304f48370adcaa12463c1a7d99e513164b83810c
-+Author: Steve Wise <swise@opengridcomputing.com>
-+Date:   Thu Apr 6 15:16:10 2006 +0000
-+
-+    r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute
-+    max_rdma_read_iov based on the openib max_sge_rd device attribute.
-+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Apr 4 18:29:00 2006 +0000
-+
-+    r6221: Change the mechanism by which library init and fini functions are specified
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 5a0598b90ab021cb2115e3791cb38dcfc0347948
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Apr 3 17:29:55 2006 +0000
-+
-+    r6182: Remove unused variables.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit b8084c4edc21b5ac2191ec654a882b65bad0c77d
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Apr 3 15:29:30 2006 +0000
-+
-+    r6179: Fix dapltest compiler warnings.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit abdbec194670d72012d481b98b2e6f728e9c5b48
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Apr 3 14:08:48 2006 +0000
-+
-+    r6168: Fixed debug prints of 64-bit values and removed compile warnings.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 52de2a35e02ddeb15887d0d690b52a4e02812e57
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Mar 21 22:28:10 2006 +0000
-+
-+    r5939: Move libdat.spec to libdat.spec.in
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Fri Mar 17 22:02:18 2006 +0000
-+
-+    r5879: Add GNU Autotools support and an RPM spec file
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 9d00582b8be33add8d3e4173e8311b1a222b0b34
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Mar 16 22:40:18 2006 +0000
-+
-+    r5871: Fixes a corner case where a CMA event was not acknowledged during
-+    disconnect processing.
-+    
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Mar 13 18:15:49 2006 +0000
-+
-+    r5789: Reduces some debug output in the async thread and fixes listen
-+    processing of EBUSY.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit afd558cbdada66e01aa553364b9a126da00dbe65
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Wed Mar 8 14:24:26 2006 +0000
-+
-+    r5684: Remove unused NO_EP_STATE.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Feb 28 15:41:03 2006 +0000
-+
-+    r5529: Fix to destroy QPs in all cases and close the HCA.
-+    
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Jan 9 20:17:33 2006 +0000
-+
-+    r4855: Make use of dat_evd_wait the default.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 254bd0e349bafbd970d6475efcafd7e52f05415e
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Mon Jan 9 16:59:38 2006 +0000
-+
-+    r4852: Fix disconnect event processing and update dtest to validate.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit f69d737ee51f6b00a1e6cf8531695a61a322651b
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Fri Dec 16 02:03:05 2005 +0000
-+
-+    r4502: Query for rd_atomic values.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 86566b556920a51f1e538d245674058682012668
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Fri Dec 16 01:57:30 2005 +0000
-+
-+    r4501: Allow a network name, network address, or device name in the dat.conf file.
-+    Singed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f
-+Author: Roland Dreier <rolandd@cisco.com>
-+Date:   Wed Dec 14 20:44:36 2005 +0000
-+
-+    r4466: Change libibverbs API for listing all known devices from
-+    ibv_get_devices() to ibv_get_device_list(), and update all
-+    in-tree uses of this API.
-+    
-+    Signed-off-by: Roland Dreier <rolandd@cisco.com>
-+
-+commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Dec 5 16:37:46 2005 +0000
-+
-+    r4308: Fix a gcc 4.0 warning
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Thu Dec 1 15:03:10 2005 +0000
-+
-+    r4279: Added CMA API support.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Nov 10 21:39:34 2005 +0000
-+
-+    r4018: Fixed some problems with the free build openib_scm version and turned
-+    down some debugging and added some debug prints for uAT path records.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Oct 31 18:27:13 2005 +0000
-+
-+    r3917: Fix printing of debug statements.
-+    Signed off by: Aniruddha Bohra <bohra@cs.rutgers.edu>
-+    Signed off by: James Lentini <jlentini@netapp.com
-+
-+commit 4306debe3118948fca72a68ec20ef0d73b399fd1
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Oct 26 21:10:26 2005 +0000
-+
-+    r3882: uDAPL provider for OpenIB socket CM.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit 42a64ec2ec1d8ec71492bfebba077b006684ce97
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Oct 13 20:45:22 2005 +0000
-+
-+    r3774: Fix the async error handling and callback mappings.
-+    Updated TODO list.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde
-+Author: Robert Walsh <rjwalsh@pathscale.com>
-+Date:   Fri Oct 7 21:15:00 2005 +0000
-+
-+    r3693: Update some more ignores.
-+
-+commit 303147143afa9aa72906246a9f1973e4172f75b8
-+Author: Todd Bowman <twbowman@gmail.com>
-+Date:   Thu Oct 6 21:13:32 2005 +0000
-+
-+    r3687: Add PPC64 support for udapl
-+    Signed-off-by: Todd Bowman <twbowman@gmail.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce
-+Author: Todd Bowman <twbowman@gmail.com>
-+Date:   Thu Oct 6 15:22:08 2005 +0000
-+
-+    r3683: Remove the dtest qualifier from the sdp range.
-+    Signed-off-by: Todd Bowman <twbowman@gmail.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 33fbf9c81ac29492394e419588d856533e7fffb8
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Oct 3 14:59:22 2005 +0000
-+
-+    r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Sep 29 18:13:25 2005 +0000
-+
-+    r3619: Makefile fix.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 634b199218b775a8ed071c1faea519c4cc4ee4e3
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Sep 28 21:50:13 2005 +0000
-+
-+    r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and
-+    adds support for SuSe.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit 3a23c7135905666ff969b86dab3e90f90ac73008
-+Author: Robert Walsh <rjwalsh@pathscale.com>
-+Date:   Tue Sep 27 16:59:14 2005 +0000
-+
-+    r3567: Setup svn:ignore on a bunch of directories.
-+
-+commit d41ea62125636a58e8748871e372810c09865b0a
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Sep 22 21:24:38 2005 +0000
-+
-+    r3525: Improve dtest and measure RDMA reads
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 32258d13af6aaf76078ec6ba187d8129a0f70397
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Sep 21 19:54:07 2005 +0000
-+
-+    r3513: Temporary workaround for the RDMA read performance anomaly
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit 990bdc4320809e0b989c90c24bef361c1bc91c7f
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Sep 20 17:00:37 2005 +0000
-+
-+    r3494: Moved dapl_evd_modify_cno.c to match SourceForge
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Sep 20 16:17:59 2005 +0000
-+
-+    r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per
-+    device basis, and add copyrights for kDAPL cm work that was
-+    used in uDAPL.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit c1d45137c2e26024142f24207344e3e48a577b83
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Thu Sep 15 21:43:21 2005 +0000
-+
-+    r3453: Bind communication identifiers to a device to support device removal.
-+    Export per HCA CM devices to userspace.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Wed Sep 14 17:44:44 2005 +0000
-+
-+    r3432: Request address resolution using ATS.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Sep 12 19:14:43 2005 +0000
-+
-+    r3378: Added DAPL documentation.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 8911b60eb16770d28907c14e45556444317dd276
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Sep 12 19:10:13 2005 +0000
-+
-+    r3377: Removed executable premission.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Fri Sep 9 21:51:58 2005 +0000
-+
-+    r3349: Update DAPL to match the verbs and CM event processing APIs.
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a
-+Author: Arlin Davis <ardavis@ichips.intel.com>
-+Date:   Tue Sep 6 19:34:46 2005 +0000
-+
-+    r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread.
-+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Aug 29 15:07:44 2005 +0000
-+
-+    r3232: validate default settings so they don't exceed device maximums
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit ac5308b4aac7de79a356439dfec2312faf7705ae
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Mon Aug 29 14:15:23 2005 +0000
-+
-+    r3227: Support for ibv_query_port, device, and gid.
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7
-+Author: Sean Hefty <sean.hefty@intel.com>
-+Date:   Sun Aug 21 22:30:08 2005 +0000
-+
-+    r3143: - Add user specified context to all uCM events.  Users will not retrieve
-+      any events associated with the context after destroying the corresponding
-+      cm_id.
-+    - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM.
-+      This call may be used to set QP attributes properly before modifying the QP.
-+    - Fixes some error handling syncrhonization and cleanup issues.
-+    - Performs some minor code cleanup.
-+    - Replaces the ucm_simple test program with a userspace version of cmpost.
-+    - Updates DAPL to the new API.
-+    
-+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-+
-+commit ec0f86d7c55830c6dffded585c04754cc6ac2a83
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Aug 16 14:10:13 2005 +0000
-+
-+    r3107: Removed unused debug counter macros
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 49087ba27bd93769bb64d7ac5c454de1b94005bc
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Tue Aug 16 14:07:42 2005 +0000
-+
-+    r3106: Implemented debug counters
-+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-+    Signed-off by: James Lentini <jlentini@netapp.com>
-+
-+commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 20:23:56 2005 +0000
-+
-+    r3072: Update from SourceForge DAPL: use the LMR context in calls to
-+    dapls_hash_remove()
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 878e524c5cc63a62802d28fdc215a2b69ceb1141
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 20:07:06 2005 +0000
-+
-+    r3071: Updates from SourceForge DAPL: EVD updates
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 19:57:40 2005 +0000
-+
-+    r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit f2801ae6caf010d660fe302970dabddc8948e1bf
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 19:46:39 2005 +0000
-+
-+    r3069: Updates from SourceForge DAPL: size EP IOV correctly
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit c87fd235eaf0b3a30e005422f7d347c406c14f2c
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 19:35:05 2005 +0000
-+
-+    r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and
-+    fixed the spelling of ib_hca_transport_t.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit a88bebc09a9655e462b3d32dfddec823024eab59
-+Author: James Lentin <jlentini@netapp.com>
-+Date:   Thu Aug 11 19:24:56 2005 +0000
-+
-+    r3067: Update from SourceForge DAPL: use include guard
-+    Signed-off-by: James Lentin <jlentini@netapp.com>
-+
-+commit d2da08920de882a9a266f0606b81150c625fa003
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 19:21:56 2005 +0000
-+
-+    r3066: Update from SourceForge DAPL: optimization to dapl_ep_query
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 18:39:34 2005 +0000
-+
-+    r3065: Update from DAPL SourceForge: indicate which handle is invalid
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 6d8f34137776c32149251bdec493c017b399cd10
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 18:35:58 2005 +0000
-+
-+    r3064: Update from DAPL SourceForge: set ep param values.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 18:33:47 2005 +0000
-+
-+    r3063: Updates from DAPL SourceForge: QP state and connection event fix.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 3fc876339693c6f0eed5e57780e5342f301bd95c
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Thu Aug 11 18:23:33 2005 +0000
-+
-+    r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9
-+Author: Hal Rosenstock <halr@voltaire.com>
-+Date:   Fri Aug 5 17:59:38 2005 +0000
-+
-+    r2989: Fix dtest makefile
-+    Signed-off-by: Hal Rosenstock <halr@voltaire.com>
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Fri Aug 5 17:57:31 2005 +0000
-+
-+    r2988: Remove kernel directory.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 9c4e246a5baf43cadc6380e91fd5a6e319777278
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Fri Aug 5 17:56:56 2005 +0000
-+
-+    r2987: Remove kernel code directory.
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 26706cb0de471ba47279de0cb949ba5a41de82cc
-+Author: James Lentini <jlentini@netapp.com>
-+Date:   Fri Aug 5 16:41:12 2005 +0000
-+
-+    r2986: Add uDAPL to the trunk
-+    Signed-off-by: James Lentini <jlentini@netapp.com>
-+
-+commit 76aa2de7fe38a8595d88669842450084cfa88316
-+Author: Roland Dreier <roland@topspin.com>
-+Date:   Thu Nov 4 17:54:50 2004 +0000
-+
-+    r1139: Copy roland-merge branch to trunk
-+
-+commit 3bd72a559dfe22685aae33599c99d021d2ae4aca
-+Author: Roland Dreier <roland@topspin.com>
-+Date:   Tue Jul 20 21:34:32 2004 +0000
-+
-+    r502: Move 2.6-only source away from trunk
-+
-+commit 4f05b6ed3fd1d14161664c677264846eeb51dba5
-+Author: Roland Dreier <roland@topspin.com>
-+Date:   Tue Jul 20 21:34:32 2004 +0000
-+
-+    r502: Move 2.6-only source away from trunk
-+
-+commit 6da8b951c069072a2afc6aba03a3dca2c44db022
-+Author: Roland Dreier <roland@topspin.com>
-+Date:   Tue Jul 20 01:41:16 2004 +0000
-+
-+    r497: Move 2.6-only tree to gen2
-diff --git a/trunk/ulp/dapl2/configure.in b/trunk/ulp/dapl2/configure.in
-index 3ac53f7..b67314c 100644
---- a/trunk/ulp/dapl2/configure.in
-+++ b/trunk/ulp/dapl2/configure.in
-@@ -1,104 +1,104 @@
--dnl Process this file with autoconf to produce a configure script.\r
--\r
--AC_PREREQ(2.57)\r
--AC_INIT(dapl, 2.0.30, linux-rdma@vger.kernel.org)\r
--AC_CONFIG_SRCDIR([dat/udat/udat.c])\r
--AC_CONFIG_AUX_DIR(config)\r
--AM_CONFIG_HEADER(config.h)\r
--AM_INIT_AUTOMAKE(dapl, 2.0.30)\r
--\r
--AM_PROG_LIBTOOL\r
--\r
--AC_ARG_ENABLE(libcheck, [  --disable-libcheck      do not test for presence of ib libraries],\r
--[       if test x$enableval = xno ; then\r
--                disable_libcheck=yes\r
--        fi\r
--])\r
--\r
--dnl Checks for programs\r
--AC_PROG_CC\r
--\r
--dnl Checks for libraries\r
--if test "$disable_libcheck" != "yes"\r
--then\r
--AC_CHECK_LIB(ibverbs, ibv_get_device_list, [],\r
--    AC_MSG_ERROR([ibv_get_device_list() not found.  libdapl requires libibverbs.]))\r
--\r
--AC_CHECK_HEADER(infiniband/verbs.h, [],\r
--    AC_MSG_ERROR([<infiniband/verbs.h> not found.  Is libibverbs installed?]))\r
--\r
--AC_CHECK_MEMBER(struct ibv_port_attr.link_layer, \r
--    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "yes"), \r
--    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no"), \r
--    [#include <infiniband/verbs.h>])\r
--else\r
--    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no")\r
--fi\r
--\r
--AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,\r
--    if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then\r
--        ac_cv_version_script=yes\r
--    else\r
--        ac_cv_version_script=no\r
--    fi)\r
--AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")\r
--\r
--dnl Support debug mode build - if enable-debug provided the DEBUG variable is set \r
--AC_ARG_ENABLE(debug,\r
--[  --enable-debug Turn on debug mode, default=off],\r
--[case "${enableval}" in\r
--  yes) debug=true ;;\r
--  no)  debug=false ;;\r
--  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;\r
--esac],[debug=false])\r
--AM_CONDITIONAL(DEBUG, test x$debug = xtrue)\r
--\r
--dnl Support ib_extension build - if enable-ext-type == ib \r
--AC_ARG_ENABLE(ext-type,\r
--[  --enable-ext-type Enable extensions support for library: ib, none, default=ib],\r
-- [ if   test "x$enableval" = "xib" ; then\r
--      ext_type=ib\r
--   elif test "x$enableval" = "xnone" ; then\r
--      ext_type=none\r
--   else\r
--      echo\r
--      echo "Error!"\r
--      echo "Unknown extension type' type"\r
--      exit -1\r
--   fi\r
-- ],[ext_type=ib])\r
--AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib")\r
--\r
--dnl Check for Redhat EL release 4\r
--AC_CACHE_CHECK(Check for RHEL4 system, ac_cv_rhel4,\r
--    if test -f /etc/redhat-release &&\r
--       test -n "`grep -e "release 4" /etc/redhat-release`"; then\r
--        ac_cv_rhel4=yes\r
--    else\r
--        ac_cv_rhel4=no\r
--    fi)\r
--AM_CONDITIONAL(OS_RHEL4, test "$ac_cv_rhel4" = "yes")\r
--\r
--dnl Check for Redhat EL release 5\r
--AC_CACHE_CHECK(Check for RHEL5 system, ac_cv_rhel5,\r
--    if test -f /etc/redhat-release &&\r
--       test -n "`grep -e "release 5" /etc/redhat-release`"; then\r
--        ac_cv_rhel5=yes\r
--    else\r
--        ac_cv_rhel5=no\r
--    fi)\r
--AM_CONDITIONAL(OS_RHEL5, test "$ac_cv_rhel5" = "yes")\r
--\r
--dnl Check for SuSE release 11\r
--AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11,\r
--    if test -f /etc/SuSE-release &&\r
--       test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then\r
--        ac_cv_suse11=yes\r
--    else\r
--        ac_cv_suse11=no\r
--    fi)\r
--AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes")\r
--\r
--AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec])\r
--\r
--AC_OUTPUT\r
-+dnl Process this file with autoconf to produce a configure script.
-+
-+AC_PREREQ(2.57)
-+AC_INIT(dapl, 2.0.30, linux-rdma@vger.kernel.org)
-+AC_CONFIG_SRCDIR([dat/udat/udat.c])
-+AC_CONFIG_AUX_DIR(config)
-+AM_CONFIG_HEADER(config.h)
-+AM_INIT_AUTOMAKE(dapl, 2.0.30)
-+
-+AM_PROG_LIBTOOL
-+
-+AC_ARG_ENABLE(libcheck, [  --disable-libcheck      do not test for presence of ib libraries],
-+[       if test x$enableval = xno ; then
-+                disable_libcheck=yes
-+        fi
-+])
-+
-+dnl Checks for programs
-+AC_PROG_CC
-+
-+dnl Checks for libraries
-+if test "$disable_libcheck" != "yes"
-+then
-+AC_CHECK_LIB(ibverbs, ibv_get_device_list, [],
-+    AC_MSG_ERROR([ibv_get_device_list() not found.  libdapl requires libibverbs.]))
-+
-+AC_CHECK_HEADER(infiniband/verbs.h, [],
-+    AC_MSG_ERROR([<infiniband/verbs.h> not found.  Is libibverbs installed?]))
-+
-+AC_CHECK_MEMBER(struct ibv_port_attr.link_layer, 
-+    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "yes"), 
-+    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no"), 
-+    [#include <infiniband/verbs.h>])
-+else
-+    AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no")
-+fi
-+
-+AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,
-+    if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then
-+        ac_cv_version_script=yes
-+    else
-+        ac_cv_version_script=no
-+    fi)
-+AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")
-+
-+dnl Support debug mode build - if enable-debug provided the DEBUG variable is set 
-+AC_ARG_ENABLE(debug,
-+[  --enable-debug Turn on debug mode, default=off],
-+[case "${enableval}" in
-+  yes) debug=true ;;
-+  no)  debug=false ;;
-+  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
-+esac],[debug=false])
-+AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
-+
-+dnl Support ib_extension build - if enable-ext-type == ib 
-+AC_ARG_ENABLE(ext-type,
-+[  --enable-ext-type Enable extensions support for library: ib, none, default=ib],
-+ [ if   test "x$enableval" = "xib" ; then
-+      ext_type=ib
-+   elif test "x$enableval" = "xnone" ; then
-+      ext_type=none
-+   else
-+      echo
-+      echo "Error!"
-+      echo "Unknown extension type' type"
-+      exit -1
-+   fi
-+ ],[ext_type=ib])
-+AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib")
-+
-+dnl Check for Redhat EL release 4
-+AC_CACHE_CHECK(Check for RHEL4 system, ac_cv_rhel4,
-+    if test -f /etc/redhat-release &&
-+       test -n "`grep -e "release 4" /etc/redhat-release`"; then
-+        ac_cv_rhel4=yes
-+    else
-+        ac_cv_rhel4=no
-+    fi)
-+AM_CONDITIONAL(OS_RHEL4, test "$ac_cv_rhel4" = "yes")
-+
-+dnl Check for Redhat EL release 5
-+AC_CACHE_CHECK(Check for RHEL5 system, ac_cv_rhel5,
-+    if test -f /etc/redhat-release &&
-+       test -n "`grep -e "release 5" /etc/redhat-release`"; then
-+        ac_cv_rhel5=yes
-+    else
-+        ac_cv_rhel5=no
-+    fi)
-+AM_CONDITIONAL(OS_RHEL5, test "$ac_cv_rhel5" = "yes")
-+
-+dnl Check for SuSE release 11
-+AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11,
-+    if test -f /etc/SuSE-release &&
-+       test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then
-+        ac_cv_suse11=yes
-+    else
-+        ac_cv_suse11=no
-+    fi)
-+AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes")
-+
-+AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec])
-+
-+AC_OUTPUT
-diff --git a/trunk/ulp/dapl2/dapl.spec.in b/trunk/ulp/dapl2/dapl.spec.in
-index 8872660..7867726 100644
---- a/trunk/ulp/dapl2/dapl.spec.in
-+++ b/trunk/ulp/dapl2/dapl.spec.in
-@@ -1,238 +1,238 @@
--# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
--# Copyright (c) 2007, Intel Corporation. All rights reserved.\r
--#\r
--# This Software is licensed under one of the following licenses:\r
--#\r
--# 1) under the terms of the "Common Public License 1.0" a copy of which is\r
--#    in the file LICENSE.txt in the root directory. The license is also\r
--#    available from the Open Source Initiative, see\r
--#    http://www.opensource.org/licenses/cpl.php.\r
--#\r
--# 2) under the terms of the "The BSD License" a copy of which is in the file\r
--#    LICENSE2.txt in the root directory. The license is also available from\r
--#    the Open Source Initiative, see\r
--#    http://www.opensource.org/licenses/bsd-license.php.\r
--#\r
--# 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
--#    copy of which is in the file LICENSE3.txt in the root directory. The \r
--#    license is also available from the Open Source Initiative, see\r
--#    http://www.opensource.org/licenses/gpl-license.php.\r
--#\r
--# Licensee has the right to choose one of the above licenses.\r
--#\r
--# Redistributions of source code must retain the above copyright\r
--# notice and one of the license notices.\r
--#\r
--# Redistributions in binary form must reproduce both the above copyright\r
--# notice, one of the license notices in the documentation\r
--# and/or other materials provided with the distribution.\r
--#\r
--#\r
--# uDAT and uDAPL 2.0 Registry RPM SPEC file\r
--#\r
--# $Id: $\r
--Name: dapl\r
--Version: @VERSION@\r
--Release: 1%{?dist}\r
--Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs.\r
--\r
--Group: System Environment/Libraries\r
--License: Dual GPL/BSD/CPL\r
--Url: http://openfabrics.org/\r
--Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz\r
--BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)\r
--Requires(post): /sbin/ldconfig\r
--Requires(postun): /sbin/ldconfig\r
--Requires(post): sed\r
--Requires(post): coreutils\r
--\r
--%description\r
--Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace\r
--RDMA API that supports DAT 2.0 specification and IB transport extensions for\r
--atomic operations and rdma write with immediate data.\r
--\r
--%package devel\r
--Summary: Development files for the libdat and libdapl libraries\r
--Group: System Environment/Libraries\r
--\r
--%description devel\r
--Header files for libdat and libdapl library.\r
--\r
--%package devel-static\r
--Summary: Static development files for libdat and libdapl library\r
--Group: System Environment/Libraries\r
-- \r
--%description devel-static\r
--Static libraries for libdat and libdapl library.\r
--\r
--%package utils\r
--Summary: Test suites for uDAPL library\r
--Group: System Environment/Libraries\r
--Requires: %{name} = %{version}-%{release}\r
--\r
--%description utils\r
--Useful test suites to validate uDAPL library API's.\r
--\r
--%prep\r
--%setup -q\r
--\r
--%build\r
--%configure --enable-ext-type=ib \r
--make %{?_smp_mflags}\r
--\r
--%install\r
--rm -rf %{buildroot}\r
--make DESTDIR=%{buildroot} install\r
--# remove unpackaged files from the buildroot\r
--rm -f %{buildroot}%{_libdir}/*.la\r
--rm -f %{buildroot}%{_sysconfdir}/*.conf\r
--\r
--%clean\r
--rm -rf %{buildroot}\r
--\r
--%post \r
--/sbin/ldconfig\r
--if [ -e %{_sysconfdir}/dat.conf ]; then\r
--    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl\r
--    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf\r
--fi\r
--echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mthca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-mthca0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth3 0" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
--echo ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
--\r
--%postun \r
--/sbin/ldconfig\r
--if [ -e %{_sysconfdir}/dat.conf ]; then\r
--    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl\r
--    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf\r
--fi\r
--\r
--%files\r
--%defattr(-,root,root,-)\r
--%{_libdir}/libda*.so.*\r
--%doc AUTHORS README COPYING ChangeLog LICENSE.txt LICENSE2.txt LICENSE3.txt\r
--\r
--%files devel\r
--%defattr(-,root,root,-)\r
--%{_libdir}/*.so\r
--%dir %{_includedir}/dat2\r
--%{_includedir}/dat2/*\r
--\r
--%files devel-static\r
--%defattr(-,root,root,-)\r
--%{_libdir}/*.a\r
--\r
--%files utils\r
--%defattr(-,root,root,-)\r
--%{_bindir}/*\r
--%{_mandir}/man1/*.1*\r
--%{_mandir}/man5/*.5*\r
--\r
--%changelog\r
--* Mon Aug 9 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.30\r
--- DAT/DAPL Version 2.0.30 Release 1, OFED 1.5.2 RC4 \r
--\r
--* Thu Jun 17 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.29\r
--- DAT/DAPL Version 2.0.29 Release 1, OFED 1.5.2 RC2 \r
--\r
--* Mon May 24 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.28\r
--- DAT/DAPL Version 2.0.28 Release 1, OFED 1.5.2 RC1 \r
--\r
--* Tue Feb 23 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.27\r
--- DAT/DAPL Version 2.0.27 Release 1, OFED 1.5.1  \r
--\r
--* Tue Jan 11 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.26\r
--- DAT/DAPL Version 2.0.26 Release 1, OFED 1.5, OFED 1.5-RDMAoE  \r
--\r
--* Tue Nov 24 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.25\r
--- DAT/DAPL Version 2.0.25 Release 1, OFED 1.5 RC3 \r
--\r
--* Fri Oct 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.24\r
--- DAT/DAPL Version 2.0.24 Release 1, OFED 1.5 RC2 \r
--\r
--* Fri Oct 2 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.23\r
--- DAT/DAPL Version 2.0.23 Release 1, OFED 1.5 RC1 \r
--\r
--* Wed Aug 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.22\r
--- DAT/DAPL Version 2.0.22 Release 1, OFED 1.5 ALPHA new UCM provider \r
--\r
--* Wed Aug 5 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.21\r
--- DAT/DAPL Version 2.0.21 Release 1, WinOF 2.1, OFED 1.4.1+  \r
--\r
--* Fri Jun 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.20\r
--- DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes \r
--\r
--* Thu Apr 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.19\r
--- DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final \r
--\r
--* Fri Apr 17 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.18\r
--- DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA \r
--\r
--* Tue Mar 31 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.17\r
--- DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA\r
--\r
--* Mon Mar 16 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.16\r
--- DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 \r
--\r
--* Fri Nov 07 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.15\r
--- DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA\r
--\r
--* Fri Oct 03 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.14\r
--- DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3\r
--\r
--* Mon Sep 01 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.13\r
--- DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1\r
--\r
--* Thu Aug 21 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.12\r
--- DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta\r
--\r
--* Sun Jul 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.11\r
--- DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider \r
--\r
--* Tue Jun 23 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.10\r
--- DAT/DAPL Version 2.0.10 Release 1, socket CM provider \r
--\r
--* Tue May 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.9\r
--- DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA  \r
--\r
--* Thu May 1 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.8\r
--- DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1  \r
--\r
--* Thu Feb 14 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.7\r
--- DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA \r
--\r
--* Mon Feb 04 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.6\r
--- DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4\r
--\r
--* Tue Jan 29 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.5\r
--- DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3\r
--\r
--* Thu Jan 17 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.4\r
--- DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2\r
--\r
--* Tue Nov 20 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.3\r
--- DAT/DAPL Version 2.0.3 Release 1\r
--\r
--* Tue Oct 30 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.2\r
--- DAT/DAPL Version 2.0.2 Release 1\r
--\r
--* Tue Sep 18 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.1-1\r
--- OFED 1.3-alpha, co-exist with DAT 1.2 library package.  \r
--\r
--* Wed Mar 7 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.0.pre\r
--- Initial release of DAT 2.0 APIs, includes IB extensions \r
-+# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
-+# Copyright (c) 2007, Intel Corporation. All rights reserved.
-+#
-+# This Software is licensed under one of the following licenses:
-+#
-+# 1) under the terms of the "Common Public License 1.0" a copy of which is
-+#    in the file LICENSE.txt in the root directory. The license is also
-+#    available from the Open Source Initiative, see
-+#    http://www.opensource.org/licenses/cpl.php.
-+#
-+# 2) under the terms of the "The BSD License" a copy of which is in the file
-+#    LICENSE2.txt in the root directory. The license is also available from
-+#    the Open Source Initiative, see
-+#    http://www.opensource.org/licenses/bsd-license.php.
-+#
-+# 3) under the terms of the "GNU General Public License (GPL) Version 2" a 
-+#    copy of which is in the file LICENSE3.txt in the root directory. The 
-+#    license is also available from the Open Source Initiative, see
-+#    http://www.opensource.org/licenses/gpl-license.php.
-+#
-+# Licensee has the right to choose one of the above licenses.
-+#
-+# Redistributions of source code must retain the above copyright
-+# notice and one of the license notices.
-+#
-+# Redistributions in binary form must reproduce both the above copyright
-+# notice, one of the license notices in the documentation
-+# and/or other materials provided with the distribution.
-+#
-+#
-+# uDAT and uDAPL 2.0 Registry RPM SPEC file
-+#
-+# $Id: $
-+Name: dapl
-+Version: @VERSION@
-+Release: 1%{?dist}
-+Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs.
-+
-+Group: System Environment/Libraries
-+License: Dual GPL/BSD/CPL
-+Url: http://openfabrics.org/
-+Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz
-+BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
-+Requires(post): /sbin/ldconfig
-+Requires(postun): /sbin/ldconfig
-+Requires(post): sed
-+Requires(post): coreutils
-+
-+%description
-+Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace
-+RDMA API that supports DAT 2.0 specification and IB transport extensions for
-+atomic operations and rdma write with immediate data.
-+
-+%package devel
-+Summary: Development files for the libdat and libdapl libraries
-+Group: System Environment/Libraries
-+
-+%description devel
-+Header files for libdat and libdapl library.
-+
-+%package devel-static
-+Summary: Static development files for libdat and libdapl library
-+Group: System Environment/Libraries
-+ 
-+%description devel-static
-+Static libraries for libdat and libdapl library.
-+
-+%package utils
-+Summary: Test suites for uDAPL library
-+Group: System Environment/Libraries
-+Requires: %{name} = %{version}-%{release}
-+
-+%description utils
-+Useful test suites to validate uDAPL library API's.
-+
-+%prep
-+%setup -q
-+
-+%build
-+%configure --enable-ext-type=ib 
-+make %{?_smp_mflags}
-+
-+%install
-+rm -rf %{buildroot}
-+make DESTDIR=%{buildroot} install
-+# remove unpackaged files from the buildroot
-+rm -f %{buildroot}%{_libdir}/*.la
-+rm -f %{buildroot}%{_sysconfdir}/*.conf
-+
-+%clean
-+rm -rf %{buildroot}
-+
-+%post 
-+/sbin/ldconfig
-+if [ -e %{_sysconfdir}/dat.conf ]; then
-+    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl
-+    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf
-+fi
-+echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mthca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-mthca0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth3 0" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
-+echo ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
-+
-+%postun 
-+/sbin/ldconfig
-+if [ -e %{_sysconfdir}/dat.conf ]; then
-+    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl
-+    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf
-+fi
-+
-+%files
-+%defattr(-,root,root,-)
-+%{_libdir}/libda*.so.*
-+%doc AUTHORS README COPYING ChangeLog LICENSE.txt LICENSE2.txt LICENSE3.txt
-+
-+%files devel
-+%defattr(-,root,root,-)
-+%{_libdir}/*.so
-+%dir %{_includedir}/dat2
-+%{_includedir}/dat2/*
-+
-+%files devel-static
-+%defattr(-,root,root,-)
-+%{_libdir}/*.a
-+
-+%files utils
-+%defattr(-,root,root,-)
-+%{_bindir}/*
-+%{_mandir}/man1/*.1*
-+%{_mandir}/man5/*.5*
-+
-+%changelog
-+* Mon Aug 9 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.30
-+- DAT/DAPL Version 2.0.30 Release 1, OFED 1.5.2 RC4 
-+
-+* Thu Jun 17 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.29
-+- DAT/DAPL Version 2.0.29 Release 1, OFED 1.5.2 RC2 
-+
-+* Mon May 24 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.28
-+- DAT/DAPL Version 2.0.28 Release 1, OFED 1.5.2 RC1 
-+
-+* Tue Feb 23 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.27
-+- DAT/DAPL Version 2.0.27 Release 1, OFED 1.5.1  
-+
-+* Tue Jan 11 2010 Arlin Davis <ardavis@ichips.intel.com> - 2.0.26
-+- DAT/DAPL Version 2.0.26 Release 1, OFED 1.5, OFED 1.5-RDMAoE  
-+
-+* Tue Nov 24 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.25
-+- DAT/DAPL Version 2.0.25 Release 1, OFED 1.5 RC3 
-+
-+* Fri Oct 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.24
-+- DAT/DAPL Version 2.0.24 Release 1, OFED 1.5 RC2 
-+
-+* Fri Oct 2 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.23
-+- DAT/DAPL Version 2.0.23 Release 1, OFED 1.5 RC1 
-+
-+* Wed Aug 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.22
-+- DAT/DAPL Version 2.0.22 Release 1, OFED 1.5 ALPHA new UCM provider 
-+
-+* Wed Aug 5 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.21
-+- DAT/DAPL Version 2.0.21 Release 1, WinOF 2.1, OFED 1.4.1+  
-+
-+* Fri Jun 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.20
-+- DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes 
-+
-+* Thu Apr 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.19
-+- DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final 
-+
-+* Fri Apr 17 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.18
-+- DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA 
-+
-+* Tue Mar 31 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.17
-+- DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA
-+
-+* Mon Mar 16 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.16
-+- DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 
-+
-+* Fri Nov 07 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.15
-+- DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA
-+
-+* Fri Oct 03 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.14
-+- DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3
-+
-+* Mon Sep 01 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.13
-+- DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1
-+
-+* Thu Aug 21 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.12
-+- DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta
-+
-+* Sun Jul 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.11
-+- DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider 
-+
-+* Tue Jun 23 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.10
-+- DAT/DAPL Version 2.0.10 Release 1, socket CM provider 
-+
-+* Tue May 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.9
-+- DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA  
-+
-+* Thu May 1 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.8
-+- DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1  
-+
-+* Thu Feb 14 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.7
-+- DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA 
-+
-+* Mon Feb 04 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.6
-+- DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4
-+
-+* Tue Jan 29 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.5
-+- DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3
-+
-+* Thu Jan 17 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.4
-+- DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2
-+
-+* Tue Nov 20 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.3
-+- DAT/DAPL Version 2.0.3 Release 1
-+
-+* Tue Oct 30 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.2
-+- DAT/DAPL Version 2.0.2 Release 1
-+
-+* Tue Sep 18 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.1-1
-+- OFED 1.3-alpha, co-exist with DAT 1.2 library package.  
-+
-+* Wed Mar 7 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.0.pre
-+- Initial release of DAT 2.0 APIs, includes IB extensions 
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c b/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c
-index 2215f29..cad9747 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_cno_util.c
-@@ -148,9 +148,6 @@ void dapl_cno_dealloc(IN DAPL_CNO * cno_ptr)
- void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr)
- {
-       DAT_RETURN dat_status;
--#if defined(__KDAPL__)
--      DAT_EVENT event;
--#endif                                /* defined(__KDAPL__) */
-       dat_status = DAT_SUCCESS;
-@@ -167,20 +164,14 @@ void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr)
-       dapl_os_assert(cno_ptr->cno_state != DAPL_CNO_STATE_DEAD);
-       if (cno_ptr->cno_state == DAPL_CNO_STATE_UNTRIGGERED) {
--#if !defined(__KDAPL__)
-               DAT_OS_WAIT_PROXY_AGENT agent;
-               /* Squirrel away wait agent, and delete link.  */
-               agent = cno_ptr->cno_wait_agent;
--#endif                                /* !defined(__KDAPL__) */
-               /* Separate assignments for windows compiler.  */
- #ifndef _WIN32
--#if defined(__KDAPL__)
--              cno_ptr->cno_upcall = DAT_UPCALL_NULL;
--#else
-               cno_ptr->cno_wait_agent = DAT_OS_WAIT_PROXY_AGENT_NULL;
--#endif                                /* defined(__KDAPL__) */
- #else
-               cno_ptr->cno_wait_agent.instance_data = NULL;
-               cno_ptr->cno_wait_agent.proxy_agent_func = NULL;
-@@ -200,43 +191,12 @@ void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr)
-               dapl_os_unlock(&cno_ptr->header.lock);
-               /* Trigger the OS proxy wait agent, if one exists.  */
--#if defined(__KDAPL__)
--              dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr, &event);
--              while (dat_status == DAT_SUCCESS) {
--                      if (cno_ptr->cno_upcall.upcall_func !=
--                          (DAT_UPCALL_FUNC) NULL) {
--                              cno_ptr->cno_upcall.upcall_func(cno_ptr->
--                                                              cno_upcall.
--                                                              instance_data,
--                                                              &event,
--                                                              DAT_FALSE);
--                      }
--                      dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr,
--                                                    &event);
--              }
--#else
-               if (agent.proxy_agent_func != (DAT_AGENT_FUNC) NULL) {
-                       agent.proxy_agent_func(agent.instance_data,
-                                              (DAT_EVD_HANDLE) evd_ptr);
-               }
--#endif                                /* defined(__KDAPL__) */
-       } else {
-               dapl_os_unlock(&cno_ptr->header.lock);
--#if defined(__KDAPL__)
--              dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr, &event);
--              while (dat_status == DAT_SUCCESS) {
--                      if (cno_ptr->cno_upcall.upcall_func !=
--                          (DAT_UPCALL_FUNC) NULL) {
--                              cno_ptr->cno_upcall.upcall_func(cno_ptr->
--                                                              cno_upcall.
--                                                              instance_data,
--                                                              &event,
--                                                              DAT_FALSE);
--                      }
--                      dat_status = dapl_evd_dequeue((DAT_EVD_HANDLE) evd_ptr,
--                                                    &event);
--              }
--#endif                                /* defined(__KDAPL__) */
-       }
-       return;
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
-index 0719c03..80afead 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
-@@ -1,408 +1,408 @@
--/*\r
-- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
-- *\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--/**********************************************************************\r
-- *\r
-- * MODULE: dapl_ep_connect.c\r
-- *\r
-- * PURPOSE: Endpoint management\r
-- *\r
-- * $Id:$\r
-- **********************************************************************/\r
--\r
--#include "dapl.h"\r
--#include "dapl_ep_util.h"\r
--#include "dapl_adapter_util.h"\r
--#include "dapl_evd_util.h"\r
--#include "dapl_timer_util.h"\r
--\r
--/*\r
-- * dapl_ep_connect\r
-- *\r
-- * Request a connection be established between the local Endpoint\r
-- * and a remote Endpoint. This operation is used by the active/client\r
-- * side of a connection\r
-- *\r
-- * Input:\r
-- *    ep_handle\r
-- *    remote_ia_address\r
-- *    remote_conn_qual\r
-- *    timeout\r
-- *    private_data_size\r
-- *    privaet_data\r
-- *    qos\r
-- *    connect_flags\r
-- *\r
-- * Output:\r
-- *    None\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOUCRES\r
-- *    DAT_INVALID_PARAMETER\r
-- *    DAT_MODLE_NOT_SUPPORTED\r
-- */\r
--DAT_RETURN DAT_API\r
--dapl_ep_connect(IN DAT_EP_HANDLE ep_handle,\r
--              IN DAT_IA_ADDRESS_PTR remote_ia_address,\r
--              IN DAT_CONN_QUAL remote_conn_qual,\r
--              IN DAT_TIMEOUT timeout,\r
--              IN DAT_COUNT private_data_size,\r
--              IN const DAT_PVOID private_data,\r
--              IN DAT_QOS qos, IN DAT_CONNECT_FLAGS connect_flags)\r
--{\r
--      DAPL_EP *ep_ptr;\r
--      DAPL_EP alloc_ep;\r
--      DAT_RETURN dat_status;\r
--      DAT_COUNT req_hdr_size;\r
--      void *private_data_ptr;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM,\r
--                   "dapl_ep_connect (%p, {%u.%u.%u.%u}, %X, %d, %d, %p, %x, %x)\n",\r
--                   ep_handle,\r
--                   remote_ia_address->sa_data[2],\r
--                   remote_ia_address->sa_data[3],\r
--                   remote_ia_address->sa_data[4],\r
--                   remote_ia_address->sa_data[5],\r
--                   remote_conn_qual,\r
--                   timeout,\r
--                   private_data_size, private_data, qos, connect_flags);\r
--\r
--      dat_status = DAT_SUCCESS;\r
--      ep_ptr = (DAPL_EP *) ep_handle;\r
--\r
--      /*\r
--       * Verify parameter & state. The connection handle must be good\r
--       * at this point.\r
--       */\r
--      if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) {\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);\r
--              goto bail;\r
--      }\r
--\r
--      if (DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)) {\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN);\r
--              goto bail;\r
--      }\r
--\r
--      /* Can't do a connection in 0 time, reject outright */\r
--      if (timeout == 0) {\r
--              dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);\r
--              goto bail;\r
--      }\r
--      DAPL_CNTR(ep_ptr, DCNT_EP_CONNECT);\r
--\r
--      /*\r
--       * If the endpoint needs a QP, associated the QP with it.\r
--       * This needs to be done carefully, in order to:\r
--       *  * Avoid allocating under a lock.\r
--       *  * Not step on data structures being altered by\r
--       *    routines with which we are racing.\r
--       * So we:\r
--       *  * Confirm that a new QP is needed and is not forbidden by the\r
--       *    current state.\r
--       *  * Allocate it into a separate EP.\r
--       *  * Take the EP lock.\r
--       *  * Reconfirm that the EP is in a state where it needs a QP.\r
--       *  * Assign the QP and release the lock.\r
--       */\r
--      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
--              if (ep_ptr->param.pz_handle == NULL\r
--                  || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ))\r
--              {\r
--                      dat_status =\r
--                          DAT_ERROR(DAT_INVALID_STATE,\r
--                                    DAT_INVALID_STATE_EP_NOTREADY);\r
--                      goto bail;\r
--              }\r
--              alloc_ep = *ep_ptr;\r
--\r
--              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
--                                             &alloc_ep, ep_ptr);\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      dat_status =\r
--                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                                    DAT_RESOURCE_MEMORY);\r
--                      goto bail;\r
--              }\r
--\r
--              dapl_os_lock(&ep_ptr->header.lock);\r
--              /*\r
--               * PZ shouldn't have changed since we're only racing with\r
--               * dapl_cr_accept()\r
--               */\r
--              if (ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED) {\r
--                      /* Bail, cleaning up.  */\r
--                      dapl_os_unlock(&ep_ptr->header.lock);\r
--                      dat_status = dapls_ib_qp_free(ep_ptr->header.owner_ia,\r
--                                                    &alloc_ep);\r
--                      if (dat_status != DAT_SUCCESS) {\r
--                              dapl_dbg_log(DAPL_DBG_TYPE_WARN,\r
--                                           "ep_connect: ib_qp_free failed with %x\n",\r
--                                           dat_status);\r
--                      }\r
--                      dat_status =\r
--                          DAT_ERROR(DAT_INVALID_STATE,\r
--                                    dapls_ep_state_subtype(ep_ptr));\r
--                      goto bail;\r
--              }\r
--\r
--              ep_ptr->qp_handle = alloc_ep.qp_handle;\r
--              ep_ptr->qpn = alloc_ep.qpn;\r
--              ep_ptr->qp_state = alloc_ep.qp_state;\r
--\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--      }\r
--\r
--      /*\r
--       * We do state checks and transitions under lock.\r
--       * The only code we're racing against is dapl_cr_accept.\r
--       */\r
--      dapl_os_lock(&ep_ptr->header.lock);\r
--\r
--      /*\r
--       * Verify the attributes of the EP handle before we connect it. Test\r
--       * all of the handles to make sure they are currently valid.\r
--       * Specifically:\r
--       *   pz_handle              required\r
--       *   recv_evd_handle        optional, but must be valid\r
--       *   request_evd_handle     optional, but must be valid\r
--       *   connect_evd_handle     required\r
--       */\r
--      if (ep_ptr->param.pz_handle == NULL\r
--          || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)\r
--          /* test connect handle */\r
--          || ep_ptr->param.connect_evd_handle == NULL\r
--          || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)\r
--          || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)->\r
--               evd_flags & DAT_EVD_CONNECTION_FLAG)\r
--          /* test optional completion handles */\r
--          || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL &&\r
--              (DAPL_BAD_HANDLE\r
--               (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD)))\r
--          || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL\r
--              &&\r
--              (DAPL_BAD_HANDLE\r
--               (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) {\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_NOTREADY);\r
--              goto bail;\r
--      }\r
--\r
--      /* Check both the EP state and the QP state: if we don't have a QP\r
--       *  we need to attach one now.\r
--       */\r
--      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
--              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
--                                             ep_ptr, ep_ptr);\r
--\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      dapl_os_unlock(&ep_ptr->header.lock);\r
--                      dat_status =\r
--                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                                    DAT_RESOURCE_TEP);\r
--                      goto bail;\r
--              }\r
--      }\r
--\r
--      if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED &&\r
--          ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INVALID_STATE,\r
--                            dapls_ep_state_subtype(ep_ptr));\r
--              goto bail;\r
--      }\r
--\r
--      if (qos != DAT_QOS_BEST_EFFORT ||\r
--          connect_flags != DAT_CONNECT_DEFAULT_FLAG) {\r
--              /*\r
--               * At this point we only support one QOS level\r
--               */\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              dat_status = DAT_ERROR(DAT_MODEL_NOT_SUPPORTED, 0);\r
--              goto bail;\r
--      }\r
--\r
--      /*\r
--       * Verify the private data size doesn't exceed the max\r
--       * req_hdr_size will evaluate to 0 unless IBHOSTS_NAMING is enabled.\r
--       */\r
--      req_hdr_size = (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE);\r
--\r
--      /* transition the state before requesting a connection to avoid\r
--       * race conditions\r
--       */\r
--      ep_ptr->param.ep_state = DAT_EP_STATE_ACTIVE_CONNECTION_PENDING;\r
--\r
--      /*\r
--       * At this point we're committed, and done with the endpoint\r
--       * except for the connect, so we can drop the lock.\r
--       */\r
--      dapl_os_unlock(&ep_ptr->header.lock);\r
--\r
--#ifdef IBHOSTS_NAMING\r
--      /*\r
--       * Special case: put the remote HCA address into the private data\r
--       * prefix. This is a spec violation as it introduces a protocol, but\r
--       * some implementations may find it necessary for a time.\r
--       * Copy the private data into the EP area so the data is contiguous.\r
--       * If the provider needs to pad the buffer with NULLs, it happens at\r
--       * the provider layer.\r
--       */\r
--      dapl_os_memcpy(&ep_ptr->hca_address,\r
--                     &ep_ptr->header.owner_ia->hca_ptr->hca_address,\r
--                     sizeof(DAT_SOCK_ADDR));\r
--      dapl_os_memcpy(ep_ptr->private.private_data, private_data,\r
--                     private_data_size);\r
--      private_data_ptr = (void *)&ep_ptr->private.private_data;\r
--#else\r
--      private_data_ptr = private_data;\r
--#endif                                /* IBHOSTS_NAMING */\r
--\r
--      /* Copy the connection qualifiers */\r
--      dapl_os_memcpy(ep_ptr->param.remote_ia_address_ptr,\r
--                     remote_ia_address, sizeof(DAT_SOCK_ADDR));\r
--      ep_ptr->param.remote_port_qual = remote_conn_qual;\r
--\r
--      dat_status = dapls_ib_connect(ep_handle,\r
--                                    remote_ia_address,\r
--                                    remote_conn_qual,\r
--                                    private_data_size + req_hdr_size,\r
--                                    private_data_ptr);\r
--\r
--      if (dat_status != DAT_SUCCESS) {\r
--              ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED;\r
--\r
--              /*\r
--               * Some implementations provide us with an error code that the\r
--               * remote destination is unreachable, but DAT doesn't have a\r
--               * synchronous error code to communicate this. So the provider\r
--               * layer generates an INTERNAL_ERROR with a subtype; when\r
--               * this happens, return SUCCESS and generate the event\r
--               */\r
--              if (dat_status == DAT_ERROR(DAT_INTERNAL_ERROR, 1)) {\r
--                      dapls_evd_post_connection_event((DAPL_EVD *) ep_ptr->\r
--                                                      param.\r
--                                                      connect_evd_handle,\r
--                                                      DAT_CONNECTION_EVENT_UNREACHABLE,\r
--                                                      (DAT_HANDLE) ep_ptr, 0,\r
--                                                      0);\r
--                      dat_status = DAT_SUCCESS;\r
--              }\r
--      } else {\r
--              /*\r
--               * Acquire the lock and recheck the state of the EP; this\r
--               * thread could have been descheduled after issuing the connect\r
--               * request and the EP is now connected. Set up a timer if\r
--               * necessary.\r
--               */\r
--              dapl_os_lock(&ep_ptr->header.lock);\r
--              if (ep_ptr->param.ep_state ==\r
--                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING\r
--                  && timeout != DAT_TIMEOUT_INFINITE &&\r
--                  ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
--                      ep_ptr->cxn_timer =\r
--                          (DAPL_OS_TIMER *)\r
--                          dapl_os_alloc(sizeof(DAPL_OS_TIMER));\r
--\r
--                      dapls_timer_set(ep_ptr->cxn_timer,\r
--                                      dapls_ep_timeout, ep_ptr, timeout);\r
--\r
--                      dapl_log(DAPL_DBG_TYPE_EP, " dapl_ep_connect timeout = %d us\n", timeout);\r
--              }\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--      }\r
--\r
--      bail:\r
--      dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,\r
--                   "dapl_ep_connect () returns 0x%x\n", dat_status);\r
--\r
--      return dat_status;\r
--}\r
--\r
--/*\r
-- * dapl_ep_common_connect\r
-- *\r
-- * DAPL Requirements Version 2.0, 6.6.x\r
-- *\r
-- * Requests that a connection be established\r
-- * between the local Endpoint and a remote Endpoint specified by the\r
-- * remote_ia_address. This operation is used by the active/client side\r
-- * Consumer of the Connection establishment model.\r
-- *\r
-- * EP must be properly configured for this operation. The EP Communicator\r
-- * must be specified. As part of the successful completion of this operation,\r
-- * the local Endpoint is bound to a local IA Address if it had these assigned\r
-- * before.\r
-- * \r
-- * The local IP Address, port and protocol are passed to the remote side of\r
-- * the requested connection and is available to the remote Consumer in the\r
-- * Connection Request of the DAT_CONNECTION_REQUEST_EVENT.\r
-- * \r
-- * The Consumer-provided private_data is passed to the remote side and is\r
-- * provided to the remote Consumer in the Connection Request. Consumers\r
-- * can encapsulate any local Endpoint attributes that remote Consumers\r
-- * need to know as part of an upper-level protocol.\r
-- *\r
-- * Input:\r
-- *    ep_handle\r
-- *    remote_ia_address\r
-- *    timeout\r
-- *    private_data_size\r
-- *    private_date pointer\r
-- *\r
-- * Output:\r
-- *    none\r
-- * \r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INVALID_PARAMETER\r
-- *    DAT_INVALID_HANDLE\r
-- *    DAT_INVALID_STATE\r
-- *    DAT_MODEL_NOT_SUPPORTED\r
-- */\r
--DAT_RETURN DAT_API dapl_ep_common_connect(IN DAT_EP_HANDLE ep,        /* ep_handle            */\r
--                                        IN DAT_IA_ADDRESS_PTR remote_addr,    /* remote_ia_address    */\r
--                                        IN DAT_TIMEOUT timeout,       /* timeout              */\r
--                                        IN DAT_COUNT pdata_size,      /* private_data_size    */\r
--                                        IN const DAT_PVOID pdata)\r
--{                             /* private_data         */\r
--      return DAT_MODEL_NOT_SUPPORTED;\r
--}\r
--\r
--/*\r
-- * Local variables:\r
-- *  c-indent-level: 4\r
-- *  c-basic-offset: 4\r
-- *  tab-width: 8\r
-- * End:\r
-- */\r
-+/*
-+ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
-+ *
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+/**********************************************************************
-+ *
-+ * MODULE: dapl_ep_connect.c
-+ *
-+ * PURPOSE: Endpoint management
-+ *
-+ * $Id:$
-+ **********************************************************************/
-+
-+#include "dapl.h"
-+#include "dapl_ep_util.h"
-+#include "dapl_adapter_util.h"
-+#include "dapl_evd_util.h"
-+#include "dapl_timer_util.h"
-+
-+/*
-+ * dapl_ep_connect
-+ *
-+ * Request a connection be established between the local Endpoint
-+ * and a remote Endpoint. This operation is used by the active/client
-+ * side of a connection
-+ *
-+ * Input:
-+ *    ep_handle
-+ *    remote_ia_address
-+ *    remote_conn_qual
-+ *    timeout
-+ *    private_data_size
-+ *    privaet_data
-+ *    qos
-+ *    connect_flags
-+ *
-+ * Output:
-+ *    None
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOUCRES
-+ *    DAT_INVALID_PARAMETER
-+ *    DAT_MODLE_NOT_SUPPORTED
-+ */
-+DAT_RETURN DAT_API
-+dapl_ep_connect(IN DAT_EP_HANDLE ep_handle,
-+              IN DAT_IA_ADDRESS_PTR remote_ia_address,
-+              IN DAT_CONN_QUAL remote_conn_qual,
-+              IN DAT_TIMEOUT timeout,
-+              IN DAT_COUNT private_data_size,
-+              IN const DAT_PVOID private_data,
-+              IN DAT_QOS qos, IN DAT_CONNECT_FLAGS connect_flags)
-+{
-+      DAPL_EP *ep_ptr;
-+      DAPL_EP alloc_ep;
-+      DAT_RETURN dat_status;
-+      DAT_COUNT req_hdr_size;
-+      void *private_data_ptr;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM,
-+                   "dapl_ep_connect (%p, {%u.%u.%u.%u}, %X, %d, %d, %p, %x, %x)\n",
-+                   ep_handle,
-+                   remote_ia_address->sa_data[2],
-+                   remote_ia_address->sa_data[3],
-+                   remote_ia_address->sa_data[4],
-+                   remote_ia_address->sa_data[5],
-+                   remote_conn_qual,
-+                   timeout,
-+                   private_data_size, private_data, qos, connect_flags);
-+
-+      dat_status = DAT_SUCCESS;
-+      ep_ptr = (DAPL_EP *) ep_handle;
-+
-+      /*
-+       * Verify parameter & state. The connection handle must be good
-+       * at this point.
-+       */
-+      if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) {
-+              dat_status =
-+                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
-+              goto bail;
-+      }
-+
-+      if (DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)) {
-+              dat_status =
-+                  DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN);
-+              goto bail;
-+      }
-+
-+      /* Can't do a connection in 0 time, reject outright */
-+      if (timeout == 0) {
-+              dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
-+              goto bail;
-+      }
-+      DAPL_CNTR(ep_ptr, DCNT_EP_CONNECT);
-+
-+      /*
-+       * If the endpoint needs a QP, associated the QP with it.
-+       * This needs to be done carefully, in order to:
-+       *  * Avoid allocating under a lock.
-+       *  * Not step on data structures being altered by
-+       *    routines with which we are racing.
-+       * So we:
-+       *  * Confirm that a new QP is needed and is not forbidden by the
-+       *    current state.
-+       *  * Allocate it into a separate EP.
-+       *  * Take the EP lock.
-+       *  * Reconfirm that the EP is in a state where it needs a QP.
-+       *  * Assign the QP and release the lock.
-+       */
-+      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
-+              if (ep_ptr->param.pz_handle == NULL
-+                  || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ))
-+              {
-+                      dat_status =
-+                          DAT_ERROR(DAT_INVALID_STATE,
-+                                    DAT_INVALID_STATE_EP_NOTREADY);
-+                      goto bail;
-+              }
-+              alloc_ep = *ep_ptr;
-+
-+              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
-+                                             &alloc_ep, ep_ptr);
-+              if (dat_status != DAT_SUCCESS) {
-+                      dat_status =
-+                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
-+                                    DAT_RESOURCE_MEMORY);
-+                      goto bail;
-+              }
-+
-+              dapl_os_lock(&ep_ptr->header.lock);
-+              /*
-+               * PZ shouldn't have changed since we're only racing with
-+               * dapl_cr_accept()
-+               */
-+              if (ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED) {
-+                      /* Bail, cleaning up.  */
-+                      dapl_os_unlock(&ep_ptr->header.lock);
-+                      dat_status = dapls_ib_qp_free(ep_ptr->header.owner_ia,
-+                                                    &alloc_ep);
-+                      if (dat_status != DAT_SUCCESS) {
-+                              dapl_dbg_log(DAPL_DBG_TYPE_WARN,
-+                                           "ep_connect: ib_qp_free failed with %x\n",
-+                                           dat_status);
-+                      }
-+                      dat_status =
-+                          DAT_ERROR(DAT_INVALID_STATE,
-+                                    dapls_ep_state_subtype(ep_ptr));
-+                      goto bail;
-+              }
-+
-+              ep_ptr->qp_handle = alloc_ep.qp_handle;
-+              ep_ptr->qpn = alloc_ep.qpn;
-+              ep_ptr->qp_state = alloc_ep.qp_state;
-+
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+      }
-+
-+      /*
-+       * We do state checks and transitions under lock.
-+       * The only code we're racing against is dapl_cr_accept.
-+       */
-+      dapl_os_lock(&ep_ptr->header.lock);
-+
-+      /*
-+       * Verify the attributes of the EP handle before we connect it. Test
-+       * all of the handles to make sure they are currently valid.
-+       * Specifically:
-+       *   pz_handle              required
-+       *   recv_evd_handle        optional, but must be valid
-+       *   request_evd_handle     optional, but must be valid
-+       *   connect_evd_handle     required
-+       */
-+      if (ep_ptr->param.pz_handle == NULL
-+          || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)
-+          /* test connect handle */
-+          || ep_ptr->param.connect_evd_handle == NULL
-+          || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)
-+          || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)->
-+               evd_flags & DAT_EVD_CONNECTION_FLAG)
-+          /* test optional completion handles */
-+          || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL &&
-+              (DAPL_BAD_HANDLE
-+               (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD)))
-+          || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL
-+              &&
-+              (DAPL_BAD_HANDLE
-+               (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) {
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              dat_status =
-+                  DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_NOTREADY);
-+              goto bail;
-+      }
-+
-+      /* Check both the EP state and the QP state: if we don't have a QP
-+       *  we need to attach one now.
-+       */
-+      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
-+              dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
-+                                             ep_ptr, ep_ptr);
-+
-+              if (dat_status != DAT_SUCCESS) {
-+                      dapl_os_unlock(&ep_ptr->header.lock);
-+                      dat_status =
-+                          DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
-+                                    DAT_RESOURCE_TEP);
-+                      goto bail;
-+              }
-+      }
-+
-+      if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED &&
-+          ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              dat_status =
-+                  DAT_ERROR(DAT_INVALID_STATE,
-+                            dapls_ep_state_subtype(ep_ptr));
-+              goto bail;
-+      }
-+
-+      if (qos != DAT_QOS_BEST_EFFORT ||
-+          connect_flags != DAT_CONNECT_DEFAULT_FLAG) {
-+              /*
-+               * At this point we only support one QOS level
-+               */
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              dat_status = DAT_ERROR(DAT_MODEL_NOT_SUPPORTED, 0);
-+              goto bail;
-+      }
-+
-+      /*
-+       * Verify the private data size doesn't exceed the max
-+       * req_hdr_size will evaluate to 0 unless IBHOSTS_NAMING is enabled.
-+       */
-+      req_hdr_size = (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE);
-+
-+      /* transition the state before requesting a connection to avoid
-+       * race conditions
-+       */
-+      ep_ptr->param.ep_state = DAT_EP_STATE_ACTIVE_CONNECTION_PENDING;
-+
-+      /*
-+       * At this point we're committed, and done with the endpoint
-+       * except for the connect, so we can drop the lock.
-+       */
-+      dapl_os_unlock(&ep_ptr->header.lock);
-+
-+#ifdef IBHOSTS_NAMING
-+      /*
-+       * Special case: put the remote HCA address into the private data
-+       * prefix. This is a spec violation as it introduces a protocol, but
-+       * some implementations may find it necessary for a time.
-+       * Copy the private data into the EP area so the data is contiguous.
-+       * If the provider needs to pad the buffer with NULLs, it happens at
-+       * the provider layer.
-+       */
-+      dapl_os_memcpy(&ep_ptr->hca_address,
-+                     &ep_ptr->header.owner_ia->hca_ptr->hca_address,
-+                     sizeof(DAT_SOCK_ADDR));
-+      dapl_os_memcpy(ep_ptr->private.private_data, private_data,
-+                     private_data_size);
-+      private_data_ptr = (void *)&ep_ptr->private.private_data;
-+#else
-+      private_data_ptr = private_data;
-+#endif                                /* IBHOSTS_NAMING */
-+
-+      /* Copy the connection qualifiers */
-+      dapl_os_memcpy(ep_ptr->param.remote_ia_address_ptr,
-+                     remote_ia_address, sizeof(DAT_SOCK_ADDR));
-+      ep_ptr->param.remote_port_qual = remote_conn_qual;
-+
-+      dat_status = dapls_ib_connect(ep_handle,
-+                                    remote_ia_address,
-+                                    remote_conn_qual,
-+                                    private_data_size + req_hdr_size,
-+                                    private_data_ptr);
-+
-+      if (dat_status != DAT_SUCCESS) {
-+              ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED;
-+
-+              /*
-+               * Some implementations provide us with an error code that the
-+               * remote destination is unreachable, but DAT doesn't have a
-+               * synchronous error code to communicate this. So the provider
-+               * layer generates an INTERNAL_ERROR with a subtype; when
-+               * this happens, return SUCCESS and generate the event
-+               */
-+              if (dat_status == DAT_ERROR(DAT_INTERNAL_ERROR, 1)) {
-+                      dapls_evd_post_connection_event((DAPL_EVD *) ep_ptr->
-+                                                      param.
-+                                                      connect_evd_handle,
-+                                                      DAT_CONNECTION_EVENT_UNREACHABLE,
-+                                                      (DAT_HANDLE) ep_ptr, 0,
-+                                                      0);
-+                      dat_status = DAT_SUCCESS;
-+              }
-+      } else {
-+              /*
-+               * Acquire the lock and recheck the state of the EP; this
-+               * thread could have been descheduled after issuing the connect
-+               * request and the EP is now connected. Set up a timer if
-+               * necessary.
-+               */
-+              dapl_os_lock(&ep_ptr->header.lock);
-+              if (ep_ptr->param.ep_state ==
-+                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING
-+                  && timeout != DAT_TIMEOUT_INFINITE &&
-+                  ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
-+                      ep_ptr->cxn_timer =
-+                          (DAPL_OS_TIMER *)
-+                          dapl_os_alloc(sizeof(DAPL_OS_TIMER));
-+
-+                      dapls_timer_set(ep_ptr->cxn_timer,
-+                                      dapls_ep_timeout, ep_ptr, timeout);
-+
-+                      dapl_log(DAPL_DBG_TYPE_EP, " dapl_ep_connect timeout = %d us\n", timeout);
-+              }
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+      }
-+
-+      bail:
-+      dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,
-+                   "dapl_ep_connect () returns 0x%x\n", dat_status);
-+
-+      return dat_status;
-+}
-+
-+/*
-+ * dapl_ep_common_connect
-+ *
-+ * DAPL Requirements Version 2.0, 6.6.x
-+ *
-+ * Requests that a connection be established
-+ * between the local Endpoint and a remote Endpoint specified by the
-+ * remote_ia_address. This operation is used by the active/client side
-+ * Consumer of the Connection establishment model.
-+ *
-+ * EP must be properly configured for this operation. The EP Communicator
-+ * must be specified. As part of the successful completion of this operation,
-+ * the local Endpoint is bound to a local IA Address if it had these assigned
-+ * before.
-+ * 
-+ * The local IP Address, port and protocol are passed to the remote side of
-+ * the requested connection and is available to the remote Consumer in the
-+ * Connection Request of the DAT_CONNECTION_REQUEST_EVENT.
-+ * 
-+ * The Consumer-provided private_data is passed to the remote side and is
-+ * provided to the remote Consumer in the Connection Request. Consumers
-+ * can encapsulate any local Endpoint attributes that remote Consumers
-+ * need to know as part of an upper-level protocol.
-+ *
-+ * Input:
-+ *    ep_handle
-+ *    remote_ia_address
-+ *    timeout
-+ *    private_data_size
-+ *    private_date pointer
-+ *
-+ * Output:
-+ *    none
-+ * 
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INVALID_PARAMETER
-+ *    DAT_INVALID_HANDLE
-+ *    DAT_INVALID_STATE
-+ *    DAT_MODEL_NOT_SUPPORTED
-+ */
-+DAT_RETURN DAT_API dapl_ep_common_connect(IN DAT_EP_HANDLE ep,        /* ep_handle            */
-+                                        IN DAT_IA_ADDRESS_PTR remote_addr,    /* remote_ia_address    */
-+                                        IN DAT_TIMEOUT timeout,       /* timeout              */
-+                                        IN DAT_COUNT pdata_size,      /* private_data_size    */
-+                                        IN const DAT_PVOID pdata)
-+{                             /* private_data         */
-+      return DAT_MODEL_NOT_SUPPORTED;
-+}
-+
-+/*
-+ * Local variables:
-+ *  c-indent-level: 4
-+ *  c-basic-offset: 4
-+ *  tab-width: 8
-+ * End:
-+ */
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c
-index 72da620..90748b0 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_disconnect.c
-@@ -165,6 +165,7 @@ dapl_ep_disconnect(IN DAT_EP_HANDLE ep_handle,
-       }
-       dapl_os_unlock(&ep_ptr->header.lock);
-       dat_status = dapls_ib_disconnect(ep_ptr, disconnect_flags);
-+      dapls_ep_flush_cqs(ep_ptr);
-       bail:
-       dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM,
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c
-index 3bfc541..32d50cc 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_free.c
-@@ -202,6 +202,8 @@ DAT_RETURN DAT_API dapl_ep_free(IN DAT_EP_HANDLE ep_handle)
-               }
-       }
-+      dapls_ep_flush_cqs(ep_ptr);
-+
-       /* Free the resource */
-       dapl_ep_dealloc(ep_ptr);
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
-index 9aff242..fc911a6 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
-@@ -606,6 +606,27 @@ void dapl_ep_unlink_cm(IN DAPL_EP *ep_ptr, IN dp_ib_cm_handle_t cm_ptr)
-       dapl_os_unlock(&ep_ptr->header.lock);
- }
-+static void dapli_ep_flush_evd(DAPL_EVD *evd_ptr)
-+{
-+      DAT_RETURN dat_status;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      dat_status = dapls_evd_copy_cq(evd_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+
-+      if (dat_status == DAT_QUEUE_FULL)
-+              dapls_evd_post_overflow_event(evd_ptr);
-+}
-+
-+void dapls_ep_flush_cqs(DAPL_EP * ep_ptr)
-+{
-+      if (ep_ptr->param.request_evd_handle)
-+              dapli_ep_flush_evd((DAPL_EVD *) ep_ptr->param.request_evd_handle);
-+
-+      if (ep_ptr->param.recv_evd_handle)
-+              dapli_ep_flush_evd((DAPL_EVD *) ep_ptr->param.recv_evd_handle);
-+}
-+
- /*
-  * Local variables:
-  *  c-indent-level: 4
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h
-index 31d0e23..37805d4 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.h
-@@ -101,5 +101,7 @@ STATIC _INLINE_ dp_ib_cm_handle_t dapl_get_cm_from_ep(IN DAPL_EP *ep_ptr)
-       return cm_ptr;
- }
-- 
-+
-+extern void dapls_ep_flush_cqs(DAPL_EP * ep_ptr);
-+
- #endif /*  _DAPL_EP_UTIL_H_ */
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c
-index 4035008..237293b 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.c
-@@ -1,1522 +1,1359 @@
--/*\r
-- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
-- *\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    in the file LICENSE.txt in the root directory. The license is also\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is in the file\r
-- *    LICENSE2.txt in the root directory. The license is also available from\r
-- *    the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
-- *    copy of which is in the file LICENSE3.txt in the root directory. The \r
-- *    license is also available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--/**********************************************************************\r
-- *\r
-- * MODULE: dapl_evd_util.c\r
-- *\r
-- * PURPOSE: Manage EVD Info structure\r
-- *\r
-- * $Id: dapl_evd_util.c 1410 2006-07-19 17:12:02Z ardavis $\r
-- **********************************************************************/\r
--\r
--#include "dapl_evd_util.h"\r
--#include "dapl_ia_util.h"\r
--#include "dapl_cno_util.h"\r
--#include "dapl_ring_buffer_util.h"\r
--#include "dapl_adapter_util.h"\r
--#include "dapl_cookie.h"\r
--#include "dapl.h"\r
--#include "dapl_cr_util.h"\r
--#include "dapl_sp_util.h"\r
--#include "dapl_ep_util.h"\r
--\r
--STATIC _INLINE_ void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe);\r
--\r
--DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen);\r
--\r
--char *dapl_event_str(IN DAT_EVENT_NUMBER event_num)\r
--{\r
--#if defined(DAPL_DBG)\r
--      struct dat_event_str {\r
--              char *str;\r
--              DAT_EVENT_NUMBER num;\r
--      };\r
--      static struct dat_event_str events[] = {\r
--              {"DAT_DTO_COMPLETION_EVENT", DAT_DTO_COMPLETION_EVENT},\r
--              {"DAT_RMR_BIND_COMPLETION_EVENT",\r
--               DAT_RMR_BIND_COMPLETION_EVENT},\r
--              {"DAT_CONNECTION_REQUEST_EVENT", DAT_CONNECTION_REQUEST_EVENT},\r
--              {"DAT_CONNECTION_EVENT_ESTABLISHED",\r
--               DAT_CONNECTION_EVENT_ESTABLISHED},\r
--              {"DAT_CONNECTION_EVENT_PEER_REJECTED",\r
--               DAT_CONNECTION_EVENT_PEER_REJECTED},\r
--              {"DAT_CONNECTION_EVENT_NON_PEER_REJECTED",\r
--               DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
--              {"DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR",\r
--               DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR},\r
--              {"DAT_CONNECTION_EVENT_DISCONNECTED",\r
--               DAT_CONNECTION_EVENT_DISCONNECTED},\r
--              {"DAT_CONNECTION_EVENT_BROKEN", DAT_CONNECTION_EVENT_BROKEN},\r
--              {"DAT_CONNECTION_EVENT_TIMED_OUT",\r
--               DAT_CONNECTION_EVENT_TIMED_OUT},\r
--              {"DAT_CONNECTION_EVENT_UNREACHABLE",\r
--               DAT_CONNECTION_EVENT_UNREACHABLE},\r
--              {"DAT_ASYNC_ERROR_EVD_OVERFLOW", DAT_ASYNC_ERROR_EVD_OVERFLOW},\r
--              {"DAT_ASYNC_ERROR_IA_CATASTROPHIC",\r
--               DAT_ASYNC_ERROR_IA_CATASTROPHIC},\r
--              {"DAT_ASYNC_ERROR_EP_BROKEN", DAT_ASYNC_ERROR_EP_BROKEN},\r
--              {"DAT_ASYNC_ERROR_TIMED_OUT", DAT_ASYNC_ERROR_TIMED_OUT},\r
--              {"DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR",\r
--               DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR},\r
--              {"DAT_HA_DOWN_TO_1", DAT_HA_DOWN_TO_1},\r
--              {"DAT_HA_UP_TO_MULTI_PATH", DAT_HA_UP_TO_MULTI_PATH},\r
--              {"DAT_SOFTWARE_EVENT", DAT_SOFTWARE_EVENT},\r
--#ifdef DAT_EXTENSIONS\r
--              {"DAT_EXTENSION_EVENT", DAT_EXTENSION_EVENT},\r
--              {"DAT_IB_EXTENSION_RANGE_BASE", DAT_IB_EXTENSION_RANGE_BASE},\r
--              {"DAT_IB_UD_CONNECTION_REQUEST_EVENT",\r
--               DAT_IB_EXTENSION_RANGE_BASE + 1},\r
--              {"DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED",\r
--               DAT_IB_EXTENSION_RANGE_BASE + 2},\r
--              {"DAT_IB_UD_CONNECTION_REJECT_EVENT",\r
--               DAT_IB_EXTENSION_RANGE_BASE + 3},\r
--              {"DAT_IB_UD_CONNECTION_ERROR_EVENT",\r
--               DAT_IB_EXTENSION_RANGE_BASE + 4},\r
--              {"DAT_IW_EXTENSION_RANGE_BASE", DAT_IW_EXTENSION_RANGE_BASE},\r
--#endif                                /* DAT_EXTENSIONS */\r
--              {NULL, 0},\r
--      };\r
--      int i;\r
--\r
--      for (i = 0; events[i].str; i++) {\r
--              if (events[i].num == event_num)\r
--                      return events[i].str;\r
--      }\r
--      return "Unknown DAT event?";\r
--#else\r
--      static char str[16];\r
--      sprintf(str, "%x", event_num);\r
--      return str;\r
--#endif\r
--}\r
--\r
--/*\r
-- * dapls_evd_internal_create\r
-- *\r
-- * actually create the evd.  this is called after all parameter checking\r
-- * has been performed in dapl_ep_create.  it is also called from dapl_ia_open\r
-- * to create the default async evd.\r
-- *\r
-- * Input:\r
-- *    ia_ptr\r
-- *    cno_ptr\r
-- *    qlen\r
-- *    evd_flags\r
-- *\r
-- * Output:\r
-- *    evd_ptr_ptr\r
-- *\r
-- * Returns:\r
-- *    none\r
-- *\r
-- */\r
--\r
--DAT_RETURN\r
--dapls_evd_internal_create(DAPL_IA * ia_ptr,\r
--                        DAPL_CNO * cno_ptr,\r
--                        DAT_COUNT min_qlen,\r
--                        DAT_EVD_FLAGS evd_flags, DAPL_EVD ** evd_ptr_ptr)\r
--{\r
--      DAPL_EVD *evd_ptr;\r
--      DAT_COUNT cq_len;\r
--      DAT_RETURN dat_status;\r
--\r
--      dat_status = DAT_SUCCESS;\r
--      *evd_ptr_ptr = NULL;\r
--      cq_len = min_qlen;\r
--\r
--      evd_ptr = dapls_evd_alloc(ia_ptr, cno_ptr, evd_flags, min_qlen);\r
--      if (!evd_ptr) {\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);\r
--              goto bail;\r
--      }\r
--\r
--      /*\r
--       * If we are dealing with event streams besides a CQ event stream,\r
--       * be conservative and set producer side locking.  Otherwise, no.\r
--       * Note: CNO is not considered CQ event stream.\r
--       */\r
--      evd_ptr->evd_producer_locking_needed =\r
--          (!(evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) ||\r
--           evd_ptr->cno_ptr);\r
--\r
--      /* Before we setup any callbacks, transition state to OPEN.  */\r
--      evd_ptr->evd_state = DAPL_EVD_STATE_OPEN;\r
--\r
--      if (evd_flags & DAT_EVD_ASYNC_FLAG) {\r
--              /*\r
--               * There is no cq associate with async evd. Set it to invalid\r
--               */\r
--              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
--\r
--      } else if (0 != (evd_flags & ~(DAT_EVD_SOFTWARE_FLAG\r
--                                     | DAT_EVD_CONNECTION_FLAG\r
--                                     | DAT_EVD_CR_FLAG))) {\r
--#if defined(_VENDOR_IBAL_)\r
--              /* \r
--               * The creation of CQ required a PD (PZ) associated with it and\r
--               * we do not have a PD here; therefore, the work-around is that we\r
--               * will postpone the creation of the cq till the creation of QP which\r
--               * this cq will associate with.\r
--               */\r
--              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
--#else\r
--              dat_status = dapls_ib_cq_alloc(ia_ptr, evd_ptr, &cq_len);\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      goto bail;\r
--              }\r
--\r
--              /* Now reset the cq_len in the attributes, it may have changed */\r
--              evd_ptr->qlen = cq_len;\r
--\r
--              dat_status =\r
--                  dapls_ib_setup_async_callback(ia_ptr,\r
--                                                DAPL_ASYNC_CQ_COMPLETION,\r
--                                                evd_ptr,\r
--                                                (ib_async_handler_t)\r
--                                                dapl_evd_dto_callback,\r
--                                                evd_ptr);\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      goto bail;\r
--              }\r
--\r
--              dat_status = dapls_set_cq_notify(ia_ptr, evd_ptr);\r
--\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      goto bail;\r
--              }\r
--#endif                                /* _VENDOR_IBAL_ */\r
--      }\r
--\r
--      /* We now have an accurate count of events, so allocate them into\r
--       * the EVD\r
--       */\r
--      dat_status = dapli_evd_event_alloc(evd_ptr, cq_len);\r
--      if (dat_status != DAT_SUCCESS) {\r
--              goto bail;\r
--      }\r
--\r
--      dapl_ia_link_evd(ia_ptr, evd_ptr);\r
--      *evd_ptr_ptr = evd_ptr;\r
--\r
--      bail:\r
--      if (dat_status != DAT_SUCCESS) {\r
--              if (evd_ptr) {\r
--                      dapls_evd_dealloc(evd_ptr);\r
--              }\r
--      }\r
--\r
--      return dat_status;\r
--}\r
--\r
--/*\r
-- * dapls_evd_alloc\r
-- *\r
-- * alloc and initialize an EVD struct\r
-- *\r
-- * Input:\r
-- *    ia\r
-- *\r
-- * Output:\r
-- *    evd_ptr\r
-- *\r
-- * Returns:\r
-- *    none\r
-- *\r
-- */\r
--DAPL_EVD *dapls_evd_alloc(IN DAPL_IA * ia_ptr,\r
--                        IN DAPL_CNO * cno_ptr,\r
--                        IN DAT_EVD_FLAGS evd_flags, IN DAT_COUNT qlen)\r
--{\r
--      DAPL_EVD *evd_ptr;\r
--\r
--      /* Allocate EVD */\r
--      evd_ptr = (DAPL_EVD *) dapl_os_alloc(sizeof(DAPL_EVD));\r
--      if (!evd_ptr) {\r
--              goto bail;\r
--      }\r
--\r
--      /* zero the structure */\r
--      dapl_os_memzero(evd_ptr, sizeof(DAPL_EVD));\r
--\r
--#ifdef DAPL_COUNTERS\r
--      /* Allocate counters */\r
--      evd_ptr->cntrs =\r
--          dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);\r
--      if (evd_ptr->cntrs == NULL) {\r
--              dapl_os_free(evd_ptr, sizeof(DAPL_EVD));\r
--              return (NULL);\r
--      }\r
--      dapl_os_memzero(evd_ptr->cntrs,\r
--                      sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);\r
--#endif                                /* DAPL_COUNTERS */\r
--\r
--      /*\r
--       * initialize the header\r
--       */\r
--      evd_ptr->header.provider = ia_ptr->header.provider;\r
--      evd_ptr->header.magic = DAPL_MAGIC_EVD;\r
--      evd_ptr->header.handle_type = DAT_HANDLE_TYPE_EVD;\r
--      evd_ptr->header.owner_ia = ia_ptr;\r
--      evd_ptr->header.user_context.as_64 = 0;\r
--      evd_ptr->header.user_context.as_ptr = NULL;\r
--      dapl_llist_init_entry(&evd_ptr->header.ia_list_entry);\r
--      dapl_os_lock_init(&evd_ptr->header.lock);\r
--\r
--      /*\r
--       * Initialize the body\r
--       */\r
--      evd_ptr->evd_state = DAPL_EVD_STATE_INITIAL;\r
--      evd_ptr->evd_flags = evd_flags;\r
--      evd_ptr->evd_enabled = DAT_TRUE;\r
--      evd_ptr->evd_waitable = DAT_TRUE;\r
--      evd_ptr->evd_producer_locking_needed = 1;       /* Conservative value.  */\r
--      evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
--      dapl_os_atomic_set(&evd_ptr->evd_ref_count, 0);\r
--      evd_ptr->catastrophic_overflow = DAT_FALSE;\r
--      evd_ptr->qlen = qlen;\r
--      evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD;    /* FIXME: should be DAPL_EVD_STATE_INIT */\r
--      dapl_os_wait_object_init(&evd_ptr->wait_object);\r
--\r
--      evd_ptr->cno_active_count = 0;\r
--      if (cno_ptr != NULL) {\r
--              /* Take a reference count on the CNO */\r
--              dapl_os_atomic_inc(&cno_ptr->cno_ref_count);\r
--      }\r
--      evd_ptr->cno_ptr = cno_ptr;\r
--\r
--      bail:\r
--      return evd_ptr;\r
--}\r
--\r
--/*\r
-- * dapls_evd_event_alloc\r
-- *\r
-- * alloc events into an EVD.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    qlen\r
-- *\r
-- * Output:\r
-- *    NONE\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    ERROR\r
-- *\r
-- */\r
--DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--      DAT_COUNT i;\r
--      DAT_RETURN dat_status;\r
--\r
--      dat_status = DAT_SUCCESS;\r
--\r
--      /* Allocate EVENTs */\r
--      event_ptr =\r
--          (DAT_EVENT *) dapl_os_alloc(evd_ptr->qlen * sizeof(DAT_EVENT));\r
--      if (event_ptr == NULL) {\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);\r
--              goto bail;\r
--      }\r
--      evd_ptr->events = event_ptr;\r
--\r
--      /* allocate free event queue */\r
--      dat_status = dapls_rbuf_alloc(&evd_ptr->free_event_queue, qlen);\r
--      if (dat_status != DAT_SUCCESS) {\r
--              goto bail;\r
--      }\r
--\r
--      /* allocate pending event queue */\r
--      dat_status = dapls_rbuf_alloc(&evd_ptr->pending_event_queue, qlen);\r
--      if (dat_status != DAT_SUCCESS) {\r
--              goto bail;\r
--      }\r
--\r
--      /* add events to free event queue */\r
--      for (i = 0; i < evd_ptr->qlen; i++) {\r
--              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)event_ptr);\r
--              event_ptr++;\r
--      }\r
--\r
--      evd_ptr->cq_notified = DAT_FALSE;\r
--      evd_ptr->cq_notified_when = 0;\r
--      evd_ptr->threshold = 0;\r
--\r
--      bail:\r
--      return dat_status;\r
--}\r
--\r
--/*\r
-- * dapls_evd_event_realloc\r
-- *\r
-- * realloc events into an EVD.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    qlen\r
-- *\r
-- * Output:\r
-- *    NONE\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    ERROR\r
-- *\r
-- */\r
--DAT_RETURN dapls_evd_event_realloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)\r
--{\r
--      DAT_EVENT *events;\r
--      DAT_COUNT old_qlen;\r
--      DAT_COUNT i;\r
--      intptr_t diff;\r
--      DAT_RETURN dat_status;\r
--\r
--      /* Allocate EVENTs */\r
--      events = (DAT_EVENT *) dapl_os_realloc(evd_ptr->events,\r
--                                             qlen * sizeof(DAT_EVENT));\r
--      if (NULL == events) {\r
--              dat_status =\r
--                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);\r
--              goto bail;\r
--      }\r
--\r
--      diff = events - evd_ptr->events;\r
--      evd_ptr->events = events;\r
--\r
--      old_qlen = evd_ptr->qlen;\r
--      evd_ptr->qlen = qlen;\r
--\r
--      /* reallocate free event queue */\r
--      dat_status = dapls_rbuf_realloc(&evd_ptr->free_event_queue, qlen);\r
--      if (dat_status != DAT_SUCCESS) {\r
--              goto bail;\r
--      }\r
--      dapls_rbuf_adjust(&evd_ptr->free_event_queue, diff);\r
--\r
--      /* reallocate pending event queue */\r
--      dat_status = dapls_rbuf_realloc(&evd_ptr->pending_event_queue, qlen);\r
--      if (dat_status != DAT_SUCCESS) {\r
--              goto bail;\r
--      }\r
--      dapls_rbuf_adjust(&evd_ptr->pending_event_queue, diff);\r
--\r
--      /*\r
--       * add new events to free event queue. \r
--       */\r
--      for (i = old_qlen; i < qlen; i++) {\r
--              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)&events[i]);\r
--      }\r
--\r
--      bail:\r
--      return dat_status;\r
--}\r
--\r
--/*\r
-- * dapls_evd_dealloc\r
-- *\r
-- * Free the passed in EVD structure. If an error occurs, this function\r
-- * will clean up all of the internal data structures and report the\r
-- * error.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    status\r
-- *\r
-- */\r
--DAT_RETURN dapls_evd_dealloc(IN DAPL_EVD * evd_ptr)\r
--{\r
--      DAT_RETURN dat_status;\r
--      DAPL_IA *ia_ptr;\r
--\r
--      dat_status = DAT_SUCCESS;\r
--\r
--      dapl_os_assert(evd_ptr->header.magic == DAPL_MAGIC_EVD);\r
--      dapl_os_assert(dapl_os_atomic_read(&evd_ptr->evd_ref_count) == 0);\r
--\r
--      /*\r
--       * Destroy the CQ first, to keep any more callbacks from coming\r
--       * up from it.\r
--       */\r
--      evd_ptr->evd_enabled = DAT_FALSE;\r
--      if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {\r
--              ia_ptr = evd_ptr->header.owner_ia;\r
--\r
--              dat_status = dapls_ib_cq_free(ia_ptr, evd_ptr);\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      goto bail;\r
--              }\r
--      }\r
--\r
--      /*\r
--       * We should now be safe to invalidate the EVD; reset the\r
--       * magic to prevent reuse.\r
--       */\r
--      evd_ptr->header.magic = DAPL_MAGIC_INVALID;\r
--\r
--      /* Release reference on the CNO if it exists */\r
--      if (evd_ptr->cno_ptr != NULL) {\r
--              dapl_os_atomic_dec(&evd_ptr->cno_ptr->cno_ref_count);\r
--              evd_ptr->cno_ptr = NULL;\r
--      }\r
--\r
--      /* If the ring buffer allocation failed, then the dapls_rbuf_destroy   */\r
--      /* function will detect that the ring buffer's internal data (ex. base */\r
--      /* pointer) are invalid and will handle the situation appropriately    */\r
--      dapls_rbuf_destroy(&evd_ptr->free_event_queue);\r
--      dapls_rbuf_destroy(&evd_ptr->pending_event_queue);\r
--\r
--      if (evd_ptr->events) {\r
--              dapl_os_free(evd_ptr->events,\r
--                           evd_ptr->qlen * sizeof(DAT_EVENT));\r
--      }\r
--\r
--      dapl_os_wait_object_destroy(&evd_ptr->wait_object);\r
--\r
--#ifdef DAPL_COUNTERS\r
--      dapl_os_free(evd_ptr->cntrs,\r
--                   sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);\r
--#endif                                /* DAPL_COUNTERS */\r
--\r
--      dapl_os_free(evd_ptr, sizeof(DAPL_EVD));\r
--\r
--      bail:\r
--      return dat_status;\r
--}\r
--\r
--STATIC _INLINE_ char *DAPL_GET_DTO_OP_STR(int op)\r
--{\r
--      static char *dto_ops[] = {\r
--              "OP_SEND",\r
--              "OP_RECEIVE",\r
--              "OP_RDMA_WRITE",\r
--              "OP_RDMA_READ"\r
--      };\r
--      return ((op < 0 || op > 3) ? "Invalid DTO OP?" : dto_ops[op]);\r
--}\r
--\r
--#if !defined(DAPL_GET_CQE_OP_STR)\r
--#define DAPL_GET_CQE_OP_STR(e) "Unknown CEQ OP String?"\r
--#endif\r
--#if !defined(DAPL_GET_CQE_VENDOR_ERR)\r
--#define DAPL_GET_CQE_VENDOR_ERR(e) 0\r
--#endif\r
--\r
--/*\r
-- * dapli_evd_eh_print_cqe\r
-- *\r
-- * Input:\r
-- *    cqe_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Prints out a CQE for debug purposes\r
-- *\r
-- */\r
--\r
--void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe_ptr)\r
--{\r
--#ifdef DAPL_DBG\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                   "\t dapl_evd_dto_callback : CQE \n");\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                   "\t\t work_req_id %lli\n", DAPL_GET_CQE_WRID(cqe_ptr));\r
--      if (DAPL_GET_CQE_STATUS(cqe_ptr) == 0) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                           "\t\t op_type: %s\n",\r
--                           DAPL_GET_CQE_OP_STR(cqe_ptr));\r
--              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                           "\t\t bytes_num %d\n",\r
--                           DAPL_GET_CQE_BYTESNUM(cqe_ptr));\r
--      }\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                   "\t\t status %d vendor_err 0x%x\n",\r
--                   DAPL_GET_CQE_STATUS(cqe_ptr),\r
--                   DAPL_GET_CQE_VENDOR_ERR(cqe_ptr));\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");\r
--#endif\r
--      return;\r
--}\r
--\r
--/*\r
-- * Event posting code follows.\r
-- */\r
--\r
--/*\r
-- * These next two functions (dapli_evd_get_event and dapli_evd_post_event)\r
-- * are a pair.  They are always called together, from one of the functions\r
-- * at the end of this file (dapl_evd_post_*_event).\r
-- *\r
-- * Note that if producer side locking is enabled, the first one takes the\r
-- * EVD lock and the second releases it.\r
-- */\r
--\r
--/* dapli_evd_get_event\r
-- *\r
-- * Get an event struct from the evd.  The caller should fill in the event\r
-- * and call dapl_evd_post_event.\r
-- *\r
-- * If there are no events available, an overflow event is generated to the\r
-- * async EVD handler.\r
-- *\r
-- * If this EVD required producer locking, a successful return implies\r
-- * that the lock is held.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *\r
-- * Output:\r
-- *    event\r
-- *\r
-- */\r
--\r
--static DAT_EVENT *dapli_evd_get_event(DAPL_EVD * evd_ptr)\r
--{\r
--      DAT_EVENT *event;\r
--\r
--      if (evd_ptr->evd_producer_locking_needed) {\r
--              dapl_os_lock(&evd_ptr->header.lock);\r
--      }\r
--\r
--      event = (DAT_EVENT *) dapls_rbuf_remove(&evd_ptr->free_event_queue);\r
--\r
--      /* Release the lock if it was taken and the call failed.  */\r
--      if (!event && evd_ptr->evd_producer_locking_needed) {\r
--              dapl_os_unlock(&evd_ptr->header.lock);\r
--      }\r
--\r
--      return event;\r
--}\r
--\r
--/* dapli_evd_post_event\r
-- *\r
-- * Post the <event> to the evd.  If possible, invoke the evd's CNO.\r
-- * Otherwise post the event on the pending queue.\r
-- *\r
-- * If producer side locking is required, the EVD lock must be held upon\r
-- * entry to this function.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    event\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- */\r
--\r
--static void\r
--dapli_evd_post_event(IN DAPL_EVD * evd_ptr, IN const DAT_EVENT * event_ptr)\r
--{\r
--      DAT_RETURN dat_status;\r
--      DAPL_CNO *cno_to_trigger = NULL;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: %s evd %p state %d\n",\r
--                   __FUNCTION__, dapl_event_str(event_ptr->event_number), \r
--                   evd_ptr, evd_ptr->evd_state);\r
--\r
--      dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue,\r
--                                  (void *)event_ptr);\r
--      dapl_os_assert(dat_status == DAT_SUCCESS);\r
--\r
--      dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED\r
--                     || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN);\r
--\r
--      if (evd_ptr->evd_state == DAPL_EVD_STATE_OPEN) {\r
--              /* No waiter.  Arrange to trigger a CNO if it exists.  */\r
--\r
--              if (evd_ptr->evd_enabled) {\r
--                      cno_to_trigger = evd_ptr->cno_ptr;\r
--              }\r
--              if (evd_ptr->evd_producer_locking_needed) {\r
--                      dapl_os_unlock(&evd_ptr->header.lock);\r
--              }\r
--      } else {\r
--              /*\r
--               * We're in DAPL_EVD_STATE_WAITED.  Take the lock if\r
--               * we don't have it, recheck, and signal.\r
--               */\r
--              if (!evd_ptr->evd_producer_locking_needed) {\r
--                      dapl_os_lock(&evd_ptr->header.lock);\r
--              }\r
--\r
--              if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED\r
--                  && (dapls_rbuf_count(&evd_ptr->pending_event_queue)\r
--                      >= evd_ptr->threshold)) {\r
--                      dapl_os_unlock(&evd_ptr->header.lock);\r
--\r
--                      if (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) {\r
--                              dapls_evd_dto_wakeup(evd_ptr);\r
--                      } else {\r
--                              dapl_os_wait_object_wakeup(&evd_ptr->wait_object);\r
--                      }\r
--\r
--              } else {\r
--                      dapl_os_unlock(&evd_ptr->header.lock);\r
--              }\r
--      }\r
--\r
--      if (cno_to_trigger != NULL) {\r
--              dapl_internal_cno_trigger(cno_to_trigger, evd_ptr);\r
--      }\r
--}\r
--\r
--/* dapli_evd_post_event_nosignal\r
-- *\r
-- * Post the <event> to the evd.  Do not do any wakeup processing.\r
-- * This function should only be called if it is known that there are\r
-- * no waiters that it is appropriate to wakeup on this EVD.  An example\r
-- * of such a situation is during internal dat_evd_wait() processing.\r
-- *\r
-- * If producer side locking is required, the EVD lock must be held upon\r
-- * entry to this function.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    event\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- */\r
--\r
--static void\r
--dapli_evd_post_event_nosignal(IN DAPL_EVD * evd_ptr,\r
--                            IN const DAT_EVENT * event_ptr)\r
--{\r
--      DAT_RETURN dat_status;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: Called with event %s\n",\r
--                   __FUNCTION__, dapl_event_str(event_ptr->event_number));\r
--\r
--      dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue,\r
--                                  (void *)event_ptr);\r
--      dapl_os_assert(dat_status == DAT_SUCCESS);\r
--\r
--      dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED\r
--                     || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN);\r
--\r
--      if (evd_ptr->evd_producer_locking_needed) {\r
--              dapl_os_unlock(&evd_ptr->header.lock);\r
--      }\r
--}\r
--\r
--/* dapli_evd_format_overflow_event\r
-- *\r
-- * format an overflow event for posting\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    event_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- */\r
--static void\r
--dapli_evd_format_overflow_event(IN DAPL_EVD * evd_ptr,\r
--                              OUT DAT_EVENT * event_ptr)\r
--{\r
--      DAPL_IA *ia_ptr;\r
--\r
--      ia_ptr = evd_ptr->header.owner_ia;\r
--\r
--      event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
--      event_ptr->event_number = DAT_ASYNC_ERROR_EVD_OVERFLOW;\r
--      event_ptr->event_data.asynch_error_event_data.dat_handle =\r
--          (DAT_HANDLE) ia_ptr;\r
--}\r
--\r
--/* dapli_evd_post_overflow_event\r
-- *\r
-- * post an overflow event\r
-- *\r
-- * Input:\r
-- *    async_evd_ptr\r
-- *    evd_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- */\r
--static void\r
--dapli_evd_post_overflow_event(IN DAPL_EVD * async_evd_ptr,\r
--                            IN DAPL_EVD * overflow_evd_ptr)\r
--{\r
--      DAT_EVENT *overflow_event;\r
--\r
--      /* The overflow_evd_ptr mght be the same as evd.\r
--       * In that case we've got a catastrophic overflow.\r
--       */\r
--      dapl_log(DAPL_DBG_TYPE_WARN,\r
--               " WARNING: overflow event on EVD %p/n", overflow_evd_ptr);\r
--\r
--      if (async_evd_ptr == overflow_evd_ptr) {\r
--              async_evd_ptr->catastrophic_overflow = DAT_TRUE;\r
--              async_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD;\r
--              return;\r
--      }\r
--\r
--      overflow_event = dapli_evd_get_event(overflow_evd_ptr);\r
--      if (!overflow_event) {\r
--              /* this is not good */\r
--              overflow_evd_ptr->catastrophic_overflow = DAT_TRUE;\r
--              overflow_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD;\r
--              return;\r
--      }\r
--      dapli_evd_format_overflow_event(overflow_evd_ptr, overflow_event);\r
--      dapli_evd_post_event(overflow_evd_ptr, overflow_event);\r
--\r
--      return;\r
--}\r
--\r
--static DAT_EVENT *dapli_evd_get_and_init_event(IN DAPL_EVD * evd_ptr,\r
--                                             IN DAT_EVENT_NUMBER event_number)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--\r
--      event_ptr = dapli_evd_get_event(evd_ptr);\r
--      if (NULL == event_ptr) {\r
--              dapli_evd_post_overflow_event(evd_ptr->header.owner_ia->\r
--                                            async_error_evd, evd_ptr);\r
--      } else {\r
--              event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
--              event_ptr->event_number = event_number;\r
--      }\r
--\r
--      return event_ptr;\r
--}\r
--\r
--DAT_RETURN\r
--dapls_evd_post_cr_arrival_event(IN DAPL_EVD * evd_ptr,\r
--                              IN DAT_EVENT_NUMBER event_number,\r
--                              IN DAT_SP_HANDLE sp_handle,\r
--                              DAT_IA_ADDRESS_PTR ia_address_ptr,\r
--                              DAT_CONN_QUAL conn_qual,\r
--                              DAT_CR_HANDLE cr_handle)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--\r
--      if (event_ptr == NULL) {\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--      }\r
--\r
--      event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle;\r
--      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr\r
--          = ia_address_ptr;\r
--      event_ptr->event_data.cr_arrival_event_data.conn_qual = conn_qual;\r
--      event_ptr->event_data.cr_arrival_event_data.cr_handle = cr_handle;\r
--\r
--      dapli_evd_post_event(evd_ptr, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--DAT_RETURN\r
--dapls_evd_post_connection_event(IN DAPL_EVD * evd_ptr,\r
--                              IN DAT_EVENT_NUMBER event_number,\r
--                              IN DAT_EP_HANDLE ep_handle,\r
--                              IN DAT_COUNT private_data_size,\r
--                              IN DAT_PVOID private_data)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--\r
--      if (event_ptr == NULL) {\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--      }\r
--\r
--      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;\r
--      event_ptr->event_data.connect_event_data.private_data_size\r
--          = private_data_size;\r
--      event_ptr->event_data.connect_event_data.private_data = private_data;\r
--\r
--      dapli_evd_post_event(evd_ptr, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--DAT_RETURN\r
--dapls_evd_post_async_error_event(IN DAPL_EVD * evd_ptr,\r
--                               IN DAT_EVENT_NUMBER event_number,\r
--                               IN DAT_IA_HANDLE ia_handle)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--      dapl_log(DAPL_DBG_TYPE_WARN,\r
--               " WARNING: async event - %s evd=%p/n",\r
--               dapl_event_str(event_number), evd_ptr);\r
--\r
--      if (event_ptr == NULL) {\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--      }\r
--\r
--      event_ptr->event_data.asynch_error_event_data.dat_handle =\r
--          (DAT_HANDLE) ia_handle;\r
--\r
--      dapli_evd_post_event(evd_ptr, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--DAT_RETURN\r
--dapls_evd_post_software_event(IN DAPL_EVD * evd_ptr,\r
--                            IN DAT_EVENT_NUMBER event_number,\r
--                            IN DAT_PVOID pointer)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--\r
--      if (event_ptr == NULL) {\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--      }\r
--\r
--      event_ptr->event_data.software_event_data.pointer = pointer;\r
--\r
--      dapli_evd_post_event(evd_ptr, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_evd_post_generic_event\r
-- *\r
-- * Post a generic event type. Not used by all providers\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    event_number\r
-- *    data\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_evd_post_generic_event(IN DAPL_EVD * evd_ptr,\r
--                           IN DAT_EVENT_NUMBER event_number,\r
--                           IN DAT_EVENT_DATA * data)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--\r
--      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--\r
--      if (event_ptr == NULL) {\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--      }\r
--\r
--      event_ptr->event_data = *data;\r
--\r
--      dapli_evd_post_event(evd_ptr, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--#ifdef DAT_EXTENSIONS\r
--DAT_RETURN\r
--dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,\r
--                          IN DAT_EVENT_NUMBER event_number,\r
--                          IN dp_ib_cm_handle_t ib_cm_handle,\r
--                          IN DAT_COUNT p_size,\r
--                          IN DAT_PVOID p_data, IN DAT_PVOID ext_data)\r
--{\r
--      DAPL_CR *cr_ptr;\r
--      DAPL_EP *ep_ptr;\r
--      DAT_EVENT *event_ptr;\r
--      DAT_SP_HANDLE sp_handle;\r
--\r
--      dapl_os_lock(&sp_ptr->header.lock);\r
--      if (sp_ptr->listening == DAT_FALSE) {\r
--              dapl_os_unlock(&sp_ptr->header.lock);\r
--              dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                           "---> post_cr_event_ext: conn event on down SP\n");\r
--              (void)dapls_ib_reject_connection(ib_cm_handle,\r
--                                               DAT_CONNECTION_EVENT_UNREACHABLE,\r
--                                               0, NULL);\r
--              return DAT_CONN_QUAL_UNAVAILABLE;\r
--      }\r
--\r
--      /*\r
--       * RSP connections only allow a single connection. Close\r
--       * it down NOW so we reject any further connections.\r
--       */\r
--      if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP)\r
--              sp_ptr->listening = DAT_FALSE;\r
--\r
--      dapl_os_unlock(&sp_ptr->header.lock);\r
--\r
--      /* allocate new connect request */\r
--      cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia);\r
--      if (cr_ptr == NULL)\r
--              return DAT_INSUFFICIENT_RESOURCES;\r
--\r
--      /* Set up the CR */\r
--      cr_ptr->sp_ptr = sp_ptr;        /* maintain sp_ptr in case of reject */\r
--      cr_ptr->param.remote_port_qual = 0;\r
--      cr_ptr->ib_cm_handle = ib_cm_handle;\r
--      cr_ptr->param.remote_ia_address_ptr =\r
--          (DAT_IA_ADDRESS_PTR) & cr_ptr->remote_ia_address;\r
--\r
--      /*\r
--       * Copy the remote address and private data out of the private_data\r
--       */\r
--      cr_ptr->param.private_data = cr_ptr->private_data;\r
--      cr_ptr->param.private_data_size = p_size;\r
--      if (p_size)\r
--              dapl_os_memcpy(cr_ptr->private_data, p_data, p_size);\r
--\r
--      /* EP will be NULL unless RSP service point */\r
--      ep_ptr = (DAPL_EP *) sp_ptr->ep_handle;\r
--\r
--      if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {\r
--              DAPL_IA *ia_ptr;\r
--              /*\r
--               * Never true for RSP connections\r
--               *\r
--               * Create an EP for the user. If we can't allocate an\r
--               * EP we are out of resources and need to tell the\r
--               * requestor that we cant help them.\r
--               */\r
--              ia_ptr = sp_ptr->header.owner_ia;\r
--              ep_ptr = dapl_ep_alloc(ia_ptr, NULL);\r
--              if (ep_ptr == NULL) {\r
--                      dapls_cr_free(cr_ptr);\r
--                      /* Invoking function will call dapls_ib_cm_reject() */\r
--                      return DAT_INSUFFICIENT_RESOURCES;\r
--              }\r
--              ep_ptr->param.ia_handle = ia_ptr;\r
--              ep_ptr->param.local_ia_address_ptr =\r
--                  (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address;\r
--\r
--              /* Link the EP onto the IA */\r
--              dapl_ia_link_ep(ia_ptr, ep_ptr);\r
--      }\r
--\r
--      cr_ptr->param.local_ep_handle = ep_ptr;\r
--\r
--      if (ep_ptr != NULL) {\r
--              /* Assign valid EP fields: RSP and PSP_PROVIDER_FLAG only */\r
--              if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {\r
--                      ep_ptr->param.ep_state =\r
--                          DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING;\r
--              } else {\r
--                      /* RSP */\r
--                      dapl_os_assert(sp_ptr->header.handle_type ==\r
--                                     DAT_HANDLE_TYPE_RSP);\r
--                      ep_ptr->param.ep_state =\r
--                          DAT_EP_STATE_PASSIVE_CONNECTION_PENDING;\r
--              }\r
--              dapl_ep_link_cm(ep_ptr, ib_cm_handle);\r
--      }\r
--\r
--      /* link the CR onto the SP so we can pick it up later */\r
--      dapl_sp_link_cr(sp_ptr, cr_ptr);\r
--\r
--      /* assign sp_ptr to union to avoid typecast errors from some compilers */\r
--      sp_handle.psp_handle = (DAT_PSP_HANDLE) sp_ptr;\r
--\r
--      /* Post the event.  */\r
--\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--      event_ptr = dapli_evd_get_and_init_event(sp_ptr->evd_handle,\r
--                                               event_number);\r
--      if (event_ptr == NULL)\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--\r
--      event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle;\r
--      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr =\r
--          (DAT_IA_ADDRESS_PTR) & sp_ptr->header.owner_ia->hca_ptr->\r
--          hca_address;\r
--      event_ptr->event_data.cr_arrival_event_data.conn_qual =\r
--          sp_ptr->conn_qual;\r
--      event_ptr->event_data.cr_arrival_event_data.cr_handle =\r
--          (DAT_HANDLE) cr_ptr;\r
--\r
--      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);\r
--\r
--      dapli_evd_post_event(sp_ptr->evd_handle, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--DAT_RETURN\r
--dapls_evd_post_connection_event_ext(IN DAPL_EVD * evd_ptr,\r
--                                  IN DAT_EVENT_NUMBER event_number,\r
--                                  IN DAT_EP_HANDLE ep_handle,\r
--                                  IN DAT_COUNT private_data_size,\r
--                                  IN DAT_PVOID private_data,\r
--                                  IN DAT_PVOID ext_data)\r
--{\r
--      DAT_EVENT *event_ptr;\r
--      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);\r
--      /*\r
--       * Note event lock may be held on successful return\r
--       * to be released by dapli_evd_post_event(), if provider side locking\r
--       * is needed.\r
--       */\r
--      if (event_ptr == NULL)\r
--              return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,\r
--                               DAT_RESOURCE_MEMORY);\r
--\r
--      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;\r
--      event_ptr->event_data.connect_event_data.private_data_size\r
--          = private_data_size;\r
--      event_ptr->event_data.connect_event_data.private_data = private_data;\r
--\r
--      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);\r
--\r
--      dapli_evd_post_event(evd_ptr, event_ptr);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--#endif\r
--\r
--/*\r
-- * dapli_evd_cqe_to_event\r
-- *\r
-- * Convert a CQE into an event structure.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *    cqe_ptr\r
-- *\r
-- * Output:\r
-- *    event_ptr\r
-- *\r
-- * Returns:\r
-- *    none\r
-- *\r
-- */\r
--static void\r
--dapli_evd_cqe_to_event(IN DAPL_EVD * evd_ptr,\r
--                     IN void *cqe_ptr, OUT DAT_EVENT * event_ptr)\r
--{\r
--      DAPL_EP *ep_ptr;\r
--      DAPL_COOKIE *cookie;\r
--      DAT_DTO_COMPLETION_STATUS dto_status;\r
--      DAPL_COOKIE_BUFFER *buffer;\r
--\r
--      /*\r
--       * All that can be relied on if the status is bad is the status\r
--       * and WRID.\r
--       */\r
--      dto_status = dapls_ib_get_dto_status(cqe_ptr);\r
--\r
--      cookie = (DAPL_COOKIE *) (uintptr_t) DAPL_GET_CQE_WRID(cqe_ptr);\r
--      dapl_os_assert((NULL != cookie));\r
--\r
--      ep_ptr = cookie->ep;\r
--      dapl_os_assert((NULL != ep_ptr));\r
--      if (ep_ptr->header.magic != DAPL_MAGIC_EP) {\r
--              /* ep may have been freed, just return */\r
--              return;\r
--      }\r
--\r
--      dapls_io_trc_update_completion(ep_ptr, cookie, dto_status);\r
--\r
--      event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
--\r
--      switch (cookie->type) {\r
--      case DAPL_COOKIE_TYPE_DTO:\r
--              {\r
--#ifdef DAT_EXTENSIONS\r
--                      /* Extended via request post or message receive */\r
--                      if ((cookie->val.dto.type == DAPL_DTO_TYPE_EXTENSION) ||\r
--                          (cookie->val.dto.type == DAPL_DTO_TYPE_RECV &&\r
--                           DAPL_GET_CQE_OPTYPE(cqe_ptr) != OP_RECEIVE)) {\r
--                              dapls_cqe_to_event_extension(ep_ptr, cookie,\r
--                                                           cqe_ptr,\r
--                                                           event_ptr);\r
--                              if (cookie->val.dto.type == DAPL_DTO_TYPE_RECV)\r
--                                      dapls_cookie_dealloc(&ep_ptr->\r
--                                                           recv_buffer,\r
--                                                           cookie);\r
--                              else\r
--                                      dapls_cookie_dealloc(&ep_ptr->\r
--                                                           req_buffer,\r
--                                                           cookie);\r
--                              break;\r
--                      }\r
--#endif\r
--\r
--                      if (DAPL_DTO_TYPE_RECV == cookie->val.dto.type)\r
--                              buffer = &ep_ptr->recv_buffer;\r
--                      else\r
--                              buffer = &ep_ptr->req_buffer;\r
--\r
--                      event_ptr->event_number = DAT_DTO_COMPLETION_EVENT;\r
--                      event_ptr->event_data.dto_completion_event_data.\r
--                          ep_handle = cookie->ep;\r
--                      event_ptr->event_data.dto_completion_event_data.\r
--                          user_cookie = cookie->val.dto.cookie;\r
--                      event_ptr->event_data.dto_completion_event_data.status =\r
--                          dto_status;\r
--\r
--                      if (cookie->val.dto.type == DAPL_DTO_TYPE_SEND ||\r
--                          cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE) {\r
--                              /* Get size from DTO; CQE value may be off.  */\r
--                              event_ptr->event_data.dto_completion_event_data.\r
--                                  transfered_length = cookie->val.dto.size;\r
--                      } else {\r
--                              event_ptr->event_data.dto_completion_event_data.\r
--                                  transfered_length =\r
--                                  DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
--                      }\r
--\r
--                      dapls_cookie_dealloc(buffer, cookie);\r
--                      break;\r
--              }\r
--\r
--      case DAPL_COOKIE_TYPE_RMR:\r
--              {\r
--                      event_ptr->event_number = DAT_RMR_BIND_COMPLETION_EVENT;\r
--\r
--                      event_ptr->event_data.rmr_completion_event_data.\r
--                          rmr_handle = cookie->val.rmr.rmr;\r
--                      event_ptr->event_data.rmr_completion_event_data.\r
--                          user_cookie = cookie->val.rmr.cookie;\r
--                      if (dto_status == DAT_DTO_SUCCESS) {\r
--                              event_ptr->event_data.rmr_completion_event_data.\r
--                                  status = DAT_RMR_BIND_SUCCESS;\r
--                              dapl_os_assert((DAPL_GET_CQE_OPTYPE(cqe_ptr)) ==\r
--                                             OP_BIND_MW);\r
--                      } else {\r
--                              dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,\r
--                                           " MW bind completion ERROR: %d: op %#x ep: %p\n",\r
--                                           dto_status,\r
--                                           DAPL_GET_CQE_OPTYPE(cqe_ptr),\r
--                                           ep_ptr);\r
--                              event_ptr->event_data.rmr_completion_event_data.\r
--                                  status = DAT_RMR_OPERATION_FAILED;\r
--                              dapl_os_atomic_dec(&cookie->val.rmr.rmr->lmr->\r
--                                                 lmr_ref_count);\r
--                      }\r
--\r
--                      dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);\r
--                      break;\r
--              }\r
--      default:\r
--              {\r
--                      dapl_os_assert(!"Invalid Operation type");\r
--                      break;\r
--              }\r
--      }                       /* end switch */\r
--\r
--      /*\r
--       * Most error DTO ops result in disconnecting the EP. See\r
--       * IBTA Vol 1.1, Chapter 10,Table 68, for expected effect on\r
--       * state.\r
--       */\r
--      if ((dto_status != DAT_DTO_SUCCESS) &&\r
--          (dto_status != DAT_DTO_ERR_FLUSHED)) {\r
--              DAPL_EVD *evd_ptr;\r
--\r
--              /*\r
--               * If we are connected, generate disconnect and generate an\r
--               * event. We may be racing with other disconnect ops, so we\r
--               * need to check. We may also be racing CM connection events,\r
--               * requiring us to check for connection pending states too.\r
--               */\r
--              dapl_os_lock(&ep_ptr->header.lock);\r
--              if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED ||\r
--                  ep_ptr->param.ep_state ==\r
--                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING\r
--                  || ep_ptr->param.ep_state ==\r
--                  DAT_EP_STATE_PASSIVE_CONNECTION_PENDING\r
--                  || ep_ptr->param.ep_state ==\r
--                  DAT_EP_STATE_COMPLETION_PENDING)\r
--              {\r
--                      ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED;\r
--                      dapl_os_unlock(&ep_ptr->header.lock);\r
--                      dapls_io_trc_dump(ep_ptr, cqe_ptr, dto_status);\r
--\r
--                      /* Let the other side know we have disconnected */\r
--                      (void)dapls_ib_disconnect(ep_ptr,\r
--                                                DAT_CLOSE_ABRUPT_FLAG);\r
--\r
--                      /* ... and clean up the local side */\r
--                      evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle;\r
--                      dapl_sp_remove_ep (ep_ptr);\r
--                      if (evd_ptr != NULL) {\r
--                              dapls_evd_post_connection_event(evd_ptr,\r
--                                                              DAT_CONNECTION_EVENT_BROKEN,\r
--                                                              (DAT_HANDLE)\r
--                                                              ep_ptr, 0, 0);\r
--                      }\r
--              } else {\r
--                      dapl_os_unlock(&ep_ptr->header.lock);\r
--              }\r
--\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       "DTO completion ERR: status %d, op %s, vendor_err 0x%x - %s\n",\r
--                       DAPL_GET_CQE_STATUS(cqe_ptr),\r
--                       DAPL_GET_DTO_OP_STR(cookie->val.dto.type),\r
--                       DAPL_GET_CQE_VENDOR_ERR(cqe_ptr),\r
--                       inet_ntoa(((struct sockaddr_in *)&ep_ptr->\r
--                                  remote_ia_address)->sin_addr));\r
--      }\r
--}\r
--\r
--/*\r
-- * dapls_evd_copy_cq\r
-- *\r
-- * Copy all entries on a CQ associated with the EVD onto that EVD\r
-- * Up to caller to handle races, if any.  Note that no EVD waiters will\r
-- * be awoken by this copy.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *\r
-- * Output:\r
-- *    None\r
-- *\r
-- * Returns:\r
-- *    none\r
-- *\r
-- */\r
--void dapls_evd_copy_cq(DAPL_EVD * evd_ptr)\r
--{\r
--      ib_work_completion_t cur_cqe;\r
--      DAT_RETURN dat_status;\r
--      DAT_EVENT *event;\r
--\r
--      if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) {\r
--              /* Nothing to do if no CQ.  */\r
--              return;\r
--      }\r
--\r
--      while (1) {\r
--              dat_status =\r
--                  dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,\r
--                                           evd_ptr, &cur_cqe);\r
--\r
--              if (dat_status != DAT_SUCCESS) {\r
--                      break;\r
--              }\r
--\r
--              /* For debugging.  */\r
--              dapli_evd_eh_print_cqe(&cur_cqe);\r
--\r
--              /*\r
--               * Can use DAT_DTO_COMPLETION_EVENT because dapli_evd_cqe_to_event\r
--               * will overwrite.\r
--               */\r
--\r
--              event =\r
--                  dapli_evd_get_and_init_event(evd_ptr,\r
--                                               DAT_DTO_COMPLETION_EVENT);\r
--              if (event == NULL) {\r
--                      /* We've already attempted the overflow post; return.  */\r
--                      return;\r
--              }\r
--\r
--              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);\r
--\r
--              dapli_evd_post_event_nosignal(evd_ptr, event);\r
--      }\r
--\r
--      if (DAT_GET_TYPE(dat_status) != DAT_QUEUE_EMPTY) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
--                           "dapls_evd_copy_cq: dapls_ib_completion_poll returned 0x%x\n",\r
--                           dat_status);\r
--              dapl_os_assert(!"Bad return from dapls_ib_completion_poll");\r
--      }\r
--}\r
--\r
--/*\r
-- * dapls_evd_cq_poll_to_event\r
-- *\r
-- * Attempt to dequeue a single CQE from a CQ and turn it into\r
-- * an event.\r
-- *\r
-- * Input:\r
-- *    evd_ptr\r
-- *\r
-- * Output:\r
-- *    event\r
-- *\r
-- * Returns:\r
-- *    Status of operation\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_evd_cq_poll_to_event(IN DAPL_EVD * evd_ptr, OUT DAT_EVENT * event)\r
--{\r
--      DAT_RETURN dat_status;\r
--      ib_work_completion_t cur_cqe;\r
--\r
--      dat_status = dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,\r
--                                            evd_ptr, &cur_cqe);\r
--      if (dat_status == DAT_SUCCESS) {\r
--              /* For debugging.  */\r
--              dapli_evd_eh_print_cqe(&cur_cqe);\r
--\r
--              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);\r
--      }\r
--\r
--      return dat_status;\r
--}\r
--\r
--#ifdef DAPL_DBG_IO_TRC\r
--/*\r
-- * Update I/O completions in the I/O trace buffer. I/O is posted to\r
-- * the buffer, then we find it here using the cookie and mark it\r
-- * completed with the completion status\r
-- */\r
--void\r
--dapls_io_trc_update_completion(DAPL_EP * ep_ptr,\r
--                             DAPL_COOKIE * cookie,\r
--                             DAT_DTO_COMPLETION_STATUS dto_status)\r
--{\r
--      int i;\r
--      static unsigned int c_cnt = 1;\r
--\r
--      for (i = 0; i < DBG_IO_TRC_QLEN; i++) {\r
--              if (ep_ptr->ibt_base[i].cookie == cookie) {\r
--                      ep_ptr->ibt_base[i].status = dto_status;\r
--                      ep_ptr->ibt_base[i].done = c_cnt++;\r
--              }\r
--      }\r
--}\r
--\r
--/*\r
-- * Dump the I/O trace buffers\r
-- */\r
--void\r
--dapls_io_trc_dump(DAPL_EP * ep_ptr,\r
--                void *cqe_ptr, DAT_DTO_COMPLETION_STATUS dto_status)\r
--{\r
--      struct io_buf_track *ibt;\r
--      int i;\r
--      int cnt;\r
--\r
--      dapl_os_printf("DISCONNECTING: dto_status     = %x\n", dto_status);\r
--      dapl_os_printf("               OpType        = %x\n",\r
--                     DAPL_GET_CQE_OPTYPE(cqe_ptr));\r
--      dapl_os_printf("               Bytes         = %x\n",\r
--                     DAPL_GET_CQE_BYTESNUM(cqe_ptr));\r
--      dapl_os_printf("               WRID (cookie) = %llx\n",\r
--                     DAPL_GET_CQE_WRID(cqe_ptr));\r
--\r
--      if (ep_ptr->ibt_dumped == 0) {\r
--\r
--              dapl_os_printf("EP %p (qpn %d) I/O trace buffer\n",\r
--                             ep_ptr, ep_ptr->qpn);\r
--\r
--              ep_ptr->ibt_dumped = 1;\r
--              ibt =\r
--                  (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->\r
--                                                           ibt_queue);\r
--              cnt = DBG_IO_TRC_QLEN;\r
--              while (ibt != NULL && cnt > 0) {\r
--                      dapl_os_printf\r
--                          ("%2d. %3s (%2d, %d) OP: %x cookie %p wqe %p rmv_target_addr %llx rmv_rmr_context %x\n",\r
--                           cnt, ibt->done == 0 ? "WRK" : "DON", ibt->status,\r
--                           ibt->done, ibt->op_type, ibt->cookie, ibt->wqe,\r
--                           ibt->remote_iov.target_address,\r
--                           ibt->remote_iov.rmr_context);\r
--                      for (i = 0; i < 3; i++) {\r
--                              if (ibt->iov[i].segment_length != 0) {\r
--                                      dapl_os_printf\r
--                                          ("     (%4llx, %8x, %8llx)\n",\r
--                                           ibt->iov[i].segment_length,\r
--                                           ibt->iov[i].lmr_context,\r
--                                           ibt->iov[i].virtual_address);\r
--                              }\r
--                      }\r
--                      ibt =\r
--                          (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->\r
--                                                                   ibt_queue);\r
--                      cnt--;\r
--              }\r
--      }\r
--}\r
--#endif                                /* DAPL_DBG_IO_TRC */\r
--\r
--/*\r
-- * Local variables:\r
-- *  c-indent-level: 4\r
-- *  c-basic-offset: 4\r
-- *  tab-width: 8\r
-- * End:\r
-- */\r
-+/*
-+ * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
-+ *
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    in the file LICENSE.txt in the root directory. The license is also
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is in the file
-+ *    LICENSE2.txt in the root directory. The license is also available from
-+ *    the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a 
-+ *    copy of which is in the file LICENSE3.txt in the root directory. The 
-+ *    license is also available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+/**********************************************************************
-+ *
-+ * MODULE: dapl_evd_util.c
-+ *
-+ * PURPOSE: Manage EVD Info structure
-+ *
-+ * $Id: dapl_evd_util.c 1410 2006-07-19 17:12:02Z ardavis $
-+ **********************************************************************/
-+
-+#include "dapl_evd_util.h"
-+#include "dapl_ia_util.h"
-+#include "dapl_cno_util.h"
-+#include "dapl_ring_buffer_util.h"
-+#include "dapl_adapter_util.h"
-+#include "dapl_cookie.h"
-+#include "dapl.h"
-+#include "dapl_cr_util.h"
-+#include "dapl_sp_util.h"
-+#include "dapl_ep_util.h"
-+
-+STATIC _INLINE_ void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe);
-+
-+DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen);
-+
-+char *dapl_event_str(IN DAT_EVENT_NUMBER event_num)
-+{
-+#if defined(DAPL_DBG)
-+      struct dat_event_str {
-+              char *str;
-+              DAT_EVENT_NUMBER num;
-+      };
-+      static struct dat_event_str events[] = {
-+              {"DAT_DTO_COMPLETION_EVENT", DAT_DTO_COMPLETION_EVENT},
-+              {"DAT_RMR_BIND_COMPLETION_EVENT",
-+               DAT_RMR_BIND_COMPLETION_EVENT},
-+              {"DAT_CONNECTION_REQUEST_EVENT", DAT_CONNECTION_REQUEST_EVENT},
-+              {"DAT_CONNECTION_EVENT_ESTABLISHED",
-+               DAT_CONNECTION_EVENT_ESTABLISHED},
-+              {"DAT_CONNECTION_EVENT_PEER_REJECTED",
-+               DAT_CONNECTION_EVENT_PEER_REJECTED},
-+              {"DAT_CONNECTION_EVENT_NON_PEER_REJECTED",
-+               DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-+              {"DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR",
-+               DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR},
-+              {"DAT_CONNECTION_EVENT_DISCONNECTED",
-+               DAT_CONNECTION_EVENT_DISCONNECTED},
-+              {"DAT_CONNECTION_EVENT_BROKEN", DAT_CONNECTION_EVENT_BROKEN},
-+              {"DAT_CONNECTION_EVENT_TIMED_OUT",
-+               DAT_CONNECTION_EVENT_TIMED_OUT},
-+              {"DAT_CONNECTION_EVENT_UNREACHABLE",
-+               DAT_CONNECTION_EVENT_UNREACHABLE},
-+              {"DAT_ASYNC_ERROR_EVD_OVERFLOW", DAT_ASYNC_ERROR_EVD_OVERFLOW},
-+              {"DAT_ASYNC_ERROR_IA_CATASTROPHIC",
-+               DAT_ASYNC_ERROR_IA_CATASTROPHIC},
-+              {"DAT_ASYNC_ERROR_EP_BROKEN", DAT_ASYNC_ERROR_EP_BROKEN},
-+              {"DAT_ASYNC_ERROR_TIMED_OUT", DAT_ASYNC_ERROR_TIMED_OUT},
-+              {"DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR",
-+               DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR},
-+              {"DAT_HA_DOWN_TO_1", DAT_HA_DOWN_TO_1},
-+              {"DAT_HA_UP_TO_MULTI_PATH", DAT_HA_UP_TO_MULTI_PATH},
-+              {"DAT_SOFTWARE_EVENT", DAT_SOFTWARE_EVENT},
-+#ifdef DAT_EXTENSIONS
-+              {"DAT_EXTENSION_EVENT", DAT_EXTENSION_EVENT},
-+              {"DAT_IB_EXTENSION_RANGE_BASE", DAT_IB_EXTENSION_RANGE_BASE},
-+              {"DAT_IB_UD_CONNECTION_REQUEST_EVENT",
-+               DAT_IB_EXTENSION_RANGE_BASE + 1},
-+              {"DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED",
-+               DAT_IB_EXTENSION_RANGE_BASE + 2},
-+              {"DAT_IB_UD_CONNECTION_REJECT_EVENT",
-+               DAT_IB_EXTENSION_RANGE_BASE + 3},
-+              {"DAT_IB_UD_CONNECTION_ERROR_EVENT",
-+               DAT_IB_EXTENSION_RANGE_BASE + 4},
-+              {"DAT_IW_EXTENSION_RANGE_BASE", DAT_IW_EXTENSION_RANGE_BASE},
-+#endif                                /* DAT_EXTENSIONS */
-+              {NULL, 0},
-+      };
-+      int i;
-+
-+      for (i = 0; events[i].str; i++) {
-+              if (events[i].num == event_num)
-+                      return events[i].str;
-+      }
-+      return "Unknown DAT event?";
-+#else
-+      static char str[16];
-+      sprintf(str, "%x", event_num);
-+      return str;
-+#endif
-+}
-+
-+/*
-+ * dapls_evd_internal_create
-+ *
-+ * actually create the evd.  this is called after all parameter checking
-+ * has been performed in dapl_ep_create.  it is also called from dapl_ia_open
-+ * to create the default async evd.
-+ *
-+ * Input:
-+ *    ia_ptr
-+ *    cno_ptr
-+ *    qlen
-+ *    evd_flags
-+ *
-+ * Output:
-+ *    evd_ptr_ptr
-+ *
-+ * Returns:
-+ *    none
-+ *
-+ */
-+
-+DAT_RETURN
-+dapls_evd_internal_create(DAPL_IA * ia_ptr,
-+                        DAPL_CNO * cno_ptr,
-+                        DAT_COUNT min_qlen,
-+                        DAT_EVD_FLAGS evd_flags, DAPL_EVD ** evd_ptr_ptr)
-+{
-+      DAPL_EVD *evd_ptr;
-+      DAT_COUNT cq_len;
-+      DAT_RETURN dat_status;
-+
-+      dat_status = DAT_SUCCESS;
-+      *evd_ptr_ptr = NULL;
-+      cq_len = min_qlen;
-+
-+      evd_ptr = dapls_evd_alloc(ia_ptr, cno_ptr, evd_flags, min_qlen);
-+      if (!evd_ptr) {
-+              dat_status =
-+                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+              goto bail;
-+      }
-+
-+      /* Before we setup any callbacks, transition state to OPEN.  */
-+      evd_ptr->evd_state = DAPL_EVD_STATE_OPEN;
-+
-+      if (evd_flags & DAT_EVD_ASYNC_FLAG) {
-+              /*
-+               * There is no cq associate with async evd. Set it to invalid
-+               */
-+              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
-+
-+      } else if (0 != (evd_flags & ~(DAT_EVD_SOFTWARE_FLAG
-+                                     | DAT_EVD_CONNECTION_FLAG
-+                                     | DAT_EVD_CR_FLAG))) {
-+#if defined(_VENDOR_IBAL_)
-+              /* 
-+               * The creation of CQ required a PD (PZ) associated with it and
-+               * we do not have a PD here; therefore, the work-around is that we
-+               * will postpone the creation of the cq till the creation of QP which
-+               * this cq will associate with.
-+               */
-+              evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
-+#else
-+              dat_status = dapls_ib_cq_alloc(ia_ptr, evd_ptr, &cq_len);
-+              if (dat_status != DAT_SUCCESS) {
-+                      goto bail;
-+              }
-+
-+              /* Now reset the cq_len in the attributes, it may have changed */
-+              evd_ptr->qlen = cq_len;
-+
-+              dat_status =
-+                  dapls_ib_setup_async_callback(ia_ptr,
-+                                                DAPL_ASYNC_CQ_COMPLETION,
-+                                                evd_ptr,
-+                                                (ib_async_handler_t)
-+                                                dapl_evd_dto_callback,
-+                                                evd_ptr);
-+              if (dat_status != DAT_SUCCESS) {
-+                      goto bail;
-+              }
-+
-+              dat_status = dapls_set_cq_notify(ia_ptr, evd_ptr);
-+
-+              if (dat_status != DAT_SUCCESS) {
-+                      goto bail;
-+              }
-+#endif                                /* _VENDOR_IBAL_ */
-+      }
-+
-+      /* We now have an accurate count of events, so allocate them into
-+       * the EVD
-+       */
-+      dat_status = dapli_evd_event_alloc(evd_ptr, cq_len);
-+      if (dat_status != DAT_SUCCESS) {
-+              goto bail;
-+      }
-+
-+      dapl_ia_link_evd(ia_ptr, evd_ptr);
-+      *evd_ptr_ptr = evd_ptr;
-+
-+      bail:
-+      if (dat_status != DAT_SUCCESS) {
-+              if (evd_ptr) {
-+                      dapls_evd_dealloc(evd_ptr);
-+              }
-+      }
-+
-+      return dat_status;
-+}
-+
-+/*
-+ * dapls_evd_alloc
-+ *
-+ * alloc and initialize an EVD struct
-+ *
-+ * Input:
-+ *    ia
-+ *
-+ * Output:
-+ *    evd_ptr
-+ *
-+ * Returns:
-+ *    none
-+ *
-+ */
-+DAPL_EVD *dapls_evd_alloc(IN DAPL_IA * ia_ptr,
-+                        IN DAPL_CNO * cno_ptr,
-+                        IN DAT_EVD_FLAGS evd_flags, IN DAT_COUNT qlen)
-+{
-+      DAPL_EVD *evd_ptr;
-+
-+      /* Allocate EVD */
-+      evd_ptr = (DAPL_EVD *) dapl_os_alloc(sizeof(DAPL_EVD));
-+      if (!evd_ptr) {
-+              goto bail;
-+      }
-+
-+      /* zero the structure */
-+      dapl_os_memzero(evd_ptr, sizeof(DAPL_EVD));
-+
-+#ifdef DAPL_COUNTERS
-+      /* Allocate counters */
-+      evd_ptr->cntrs =
-+          dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
-+      if (evd_ptr->cntrs == NULL) {
-+              dapl_os_free(evd_ptr, sizeof(DAPL_EVD));
-+              return (NULL);
-+      }
-+      dapl_os_memzero(evd_ptr->cntrs,
-+                      sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
-+#endif                                /* DAPL_COUNTERS */
-+
-+      /*
-+       * initialize the header
-+       */
-+      evd_ptr->header.provider = ia_ptr->header.provider;
-+      evd_ptr->header.magic = DAPL_MAGIC_EVD;
-+      evd_ptr->header.handle_type = DAT_HANDLE_TYPE_EVD;
-+      evd_ptr->header.owner_ia = ia_ptr;
-+      evd_ptr->header.user_context.as_64 = 0;
-+      evd_ptr->header.user_context.as_ptr = NULL;
-+      dapl_llist_init_entry(&evd_ptr->header.ia_list_entry);
-+      dapl_os_lock_init(&evd_ptr->header.lock);
-+
-+      /*
-+       * Initialize the body
-+       */
-+      evd_ptr->evd_state = DAPL_EVD_STATE_INITIAL;
-+      evd_ptr->evd_flags = evd_flags;
-+      evd_ptr->evd_enabled = DAT_TRUE;
-+      evd_ptr->evd_waitable = DAT_TRUE;
-+      evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
-+      dapl_os_atomic_set(&evd_ptr->evd_ref_count, 0);
-+      evd_ptr->catastrophic_overflow = DAT_FALSE;
-+      evd_ptr->qlen = qlen;
-+      evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD;    /* FIXME: should be DAPL_EVD_STATE_INIT */
-+      dapl_os_wait_object_init(&evd_ptr->wait_object);
-+
-+      evd_ptr->cno_active_count = 0;
-+      if (cno_ptr != NULL) {
-+              /* Take a reference count on the CNO */
-+              dapl_os_atomic_inc(&cno_ptr->cno_ref_count);
-+      }
-+      evd_ptr->cno_ptr = cno_ptr;
-+
-+      bail:
-+      return evd_ptr;
-+}
-+
-+/*
-+ * dapls_evd_event_alloc
-+ *
-+ * alloc events into an EVD.
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *    qlen
-+ *
-+ * Output:
-+ *    NONE
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    ERROR
-+ *
-+ */
-+DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)
-+{
-+      DAT_EVENT *event_ptr;
-+      DAT_COUNT i;
-+      DAT_RETURN dat_status;
-+
-+      dat_status = DAT_SUCCESS;
-+
-+      /* Allocate EVENTs */
-+      event_ptr =
-+          (DAT_EVENT *) dapl_os_alloc(evd_ptr->qlen * sizeof(DAT_EVENT));
-+      if (event_ptr == NULL) {
-+              dat_status =
-+                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+              goto bail;
-+      }
-+      evd_ptr->events = event_ptr;
-+
-+      /* allocate free event queue */
-+      dat_status = dapls_rbuf_alloc(&evd_ptr->free_event_queue, qlen);
-+      if (dat_status != DAT_SUCCESS) {
-+              goto bail;
-+      }
-+
-+      /* allocate pending event queue */
-+      dat_status = dapls_rbuf_alloc(&evd_ptr->pending_event_queue, qlen);
-+      if (dat_status != DAT_SUCCESS) {
-+              goto bail;
-+      }
-+
-+      /* add events to free event queue */
-+      for (i = 0; i < evd_ptr->qlen; i++) {
-+              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)event_ptr);
-+              event_ptr++;
-+      }
-+
-+      evd_ptr->cq_notified = DAT_FALSE;
-+      evd_ptr->cq_notified_when = 0;
-+      evd_ptr->threshold = 0;
-+
-+      bail:
-+      return dat_status;
-+}
-+
-+/*
-+ * dapls_evd_event_realloc
-+ *
-+ * realloc events into an EVD.
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *    qlen
-+ *
-+ * Output:
-+ *    NONE
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    ERROR
-+ *
-+ */
-+DAT_RETURN dapls_evd_event_realloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen)
-+{
-+      DAT_EVENT *events;
-+      DAT_COUNT old_qlen;
-+      DAT_COUNT i;
-+      intptr_t diff;
-+      DAT_RETURN dat_status;
-+
-+      /* Allocate EVENTs */
-+      events = (DAT_EVENT *) dapl_os_realloc(evd_ptr->events,
-+                                             qlen * sizeof(DAT_EVENT));
-+      if (NULL == events) {
-+              dat_status =
-+                  DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+              goto bail;
-+      }
-+
-+      diff = events - evd_ptr->events;
-+      evd_ptr->events = events;
-+
-+      old_qlen = evd_ptr->qlen;
-+      evd_ptr->qlen = qlen;
-+
-+      /* reallocate free event queue */
-+      dat_status = dapls_rbuf_realloc(&evd_ptr->free_event_queue, qlen);
-+      if (dat_status != DAT_SUCCESS) {
-+              goto bail;
-+      }
-+      dapls_rbuf_adjust(&evd_ptr->free_event_queue, diff);
-+
-+      /* reallocate pending event queue */
-+      dat_status = dapls_rbuf_realloc(&evd_ptr->pending_event_queue, qlen);
-+      if (dat_status != DAT_SUCCESS) {
-+              goto bail;
-+      }
-+      dapls_rbuf_adjust(&evd_ptr->pending_event_queue, diff);
-+
-+      /*
-+       * add new events to free event queue. 
-+       */
-+      for (i = old_qlen; i < qlen; i++) {
-+              dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)&events[i]);
-+      }
-+
-+      bail:
-+      return dat_status;
-+}
-+
-+/*
-+ * dapls_evd_dealloc
-+ *
-+ * Free the passed in EVD structure. If an error occurs, this function
-+ * will clean up all of the internal data structures and report the
-+ * error.
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    status
-+ *
-+ */
-+DAT_RETURN dapls_evd_dealloc(IN DAPL_EVD * evd_ptr)
-+{
-+      DAT_RETURN dat_status;
-+      DAPL_IA *ia_ptr;
-+
-+      dat_status = DAT_SUCCESS;
-+
-+      dapl_os_assert(evd_ptr->header.magic == DAPL_MAGIC_EVD);
-+      dapl_os_assert(dapl_os_atomic_read(&evd_ptr->evd_ref_count) == 0);
-+
-+      /*
-+       * Destroy the CQ first, to keep any more callbacks from coming
-+       * up from it.
-+       */
-+      evd_ptr->evd_enabled = DAT_FALSE;
-+      if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {
-+              ia_ptr = evd_ptr->header.owner_ia;
-+
-+              dat_status = dapls_ib_cq_free(ia_ptr, evd_ptr);
-+              if (dat_status != DAT_SUCCESS) {
-+                      goto bail;
-+              }
-+      }
-+
-+      /*
-+       * We should now be safe to invalidate the EVD; reset the
-+       * magic to prevent reuse.
-+       */
-+      evd_ptr->header.magic = DAPL_MAGIC_INVALID;
-+
-+      /* Release reference on the CNO if it exists */
-+      if (evd_ptr->cno_ptr != NULL) {
-+              dapl_os_atomic_dec(&evd_ptr->cno_ptr->cno_ref_count);
-+              evd_ptr->cno_ptr = NULL;
-+      }
-+
-+      /* If the ring buffer allocation failed, then the dapls_rbuf_destroy   */
-+      /* function will detect that the ring buffer's internal data (ex. base */
-+      /* pointer) are invalid and will handle the situation appropriately    */
-+      dapls_rbuf_destroy(&evd_ptr->free_event_queue);
-+      dapls_rbuf_destroy(&evd_ptr->pending_event_queue);
-+
-+      if (evd_ptr->events) {
-+              dapl_os_free(evd_ptr->events,
-+                           evd_ptr->qlen * sizeof(DAT_EVENT));
-+      }
-+
-+      dapl_os_wait_object_destroy(&evd_ptr->wait_object);
-+
-+#ifdef DAPL_COUNTERS
-+      dapl_os_free(evd_ptr->cntrs,
-+                   sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
-+#endif                                /* DAPL_COUNTERS */
-+
-+      dapl_os_free(evd_ptr, sizeof(DAPL_EVD));
-+
-+      bail:
-+      return dat_status;
-+}
-+
-+STATIC _INLINE_ char *DAPL_GET_DTO_OP_STR(int op)
-+{
-+      static char *dto_ops[] = {
-+              "OP_SEND",
-+              "OP_RECEIVE",
-+              "OP_RDMA_WRITE",
-+              "OP_RDMA_READ"
-+      };
-+      return ((op < 0 || op > 3) ? "Invalid DTO OP?" : dto_ops[op]);
-+}
-+
-+#if !defined(DAPL_GET_CQE_OP_STR)
-+#define DAPL_GET_CQE_OP_STR(e) "Unknown CEQ OP String?"
-+#endif
-+#if !defined(DAPL_GET_CQE_VENDOR_ERR)
-+#define DAPL_GET_CQE_VENDOR_ERR(e) 0
-+#endif
-+
-+/*
-+ * dapli_evd_eh_print_cqe
-+ *
-+ * Input:
-+ *    cqe_ptr
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Prints out a CQE for debug purposes
-+ *
-+ */
-+
-+void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe_ptr)
-+{
-+#ifdef DAPL_DBG
-+      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");
-+      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                   "\t dapl_evd_dto_callback : CQE \n");
-+      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                   "\t\t work_req_id %lli\n", DAPL_GET_CQE_WRID(cqe_ptr));
-+      if (DAPL_GET_CQE_STATUS(cqe_ptr) == 0) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                           "\t\t op_type: %s\n",
-+                           DAPL_GET_CQE_OP_STR(cqe_ptr));
-+              dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                           "\t\t bytes_num %d\n",
-+                           DAPL_GET_CQE_BYTESNUM(cqe_ptr));
-+      }
-+      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                   "\t\t status %d vendor_err 0x%x\n",
-+                   DAPL_GET_CQE_STATUS(cqe_ptr),
-+                   DAPL_GET_CQE_VENDOR_ERR(cqe_ptr));
-+      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                   "\t >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<\n");
-+#endif
-+      return;
-+}
-+
-+/*
-+ * Event posting code follows.
-+ */
-+
-+
-+/* dapli_evd_post_event
-+ *
-+ * Post the <event> to the evd.  If possible, invoke the evd's CNO.
-+ * Otherwise post the event on the pending queue.
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *    event
-+ *
-+ * Output:
-+ *    none
-+ *
-+ */
-+
-+static void
-+dapli_evd_post_event(IN DAPL_EVD * evd_ptr, IN const DAT_EVENT * event_ptr)
-+{
-+      DAT_RETURN dat_status;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: %s evd %p state %d\n",
-+                   __FUNCTION__, dapl_event_str(event_ptr->event_number), 
-+                   evd_ptr, evd_ptr->evd_state);
-+
-+      dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue,
-+                                  (void *)event_ptr);
-+      dapl_os_assert(dat_status == DAT_SUCCESS);
-+
-+      dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED
-+                     || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN);
-+
-+      if (evd_ptr->evd_state == DAPL_EVD_STATE_OPEN) {
-+              /* No waiter.  Arrange to trigger a CNO if it exists.  */
-+              if (evd_ptr->evd_enabled && evd_ptr->cno_ptr)
-+                      dapl_internal_cno_trigger(evd_ptr->cno_ptr, evd_ptr);
-+      } else {
-+              if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED
-+                  && (dapls_rbuf_count(&evd_ptr->pending_event_queue)
-+                      >= evd_ptr->threshold)) {
-+
-+                      if (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) {
-+                              dapls_evd_dto_wakeup(evd_ptr);
-+                      } else {
-+                              dapl_os_wait_object_wakeup(&evd_ptr->wait_object);
-+                      }
-+              }
-+      }
-+}
-+
-+static DAT_EVENT *dapli_evd_get_and_init_event(IN DAPL_EVD * evd_ptr,
-+                                             IN DAT_EVENT_NUMBER event_number)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      event_ptr = (DAT_EVENT *) dapls_rbuf_remove(&evd_ptr->free_event_queue);
-+      if (event_ptr) {
-+              event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;
-+              event_ptr->event_number = event_number;
-+      }
-+
-+      return event_ptr;
-+}
-+
-+/* dapls_evd_post_overflow_event
-+ *
-+ * post an overflow event
-+ *
-+ * Input:
-+ *    async_evd_ptr
-+ *    evd_ptr
-+ *
-+ * Output:
-+ *    none
-+ *
-+ */
-+void
-+dapls_evd_post_overflow_event(IN DAPL_EVD * evd_ptr)
-+{
-+      DAPL_EVD *async_evd_ptr = evd_ptr->header.owner_ia->async_error_evd;
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_log(DAPL_DBG_TYPE_WARN, " WARNING: overflow event on EVD %p/n", evd_ptr);
-+
-+      dapl_os_lock(&async_evd_ptr->header.lock);
-+
-+      /* The overflow evd_ptr mght be the same as the async evd.
-+       * In that case we've got a catastrophic overflow.
-+       */
-+      if (async_evd_ptr == evd_ptr)
-+              goto err;
-+
-+      event_ptr = dapli_evd_get_and_init_event(async_evd_ptr,
-+                                               DAT_ASYNC_ERROR_EVD_OVERFLOW);
-+      if (!event_ptr)
-+              goto err;
-+      
-+      event_ptr->event_data.asynch_error_event_data.dat_handle =
-+          (DAT_HANDLE) evd_ptr->header.owner_ia;
-+
-+      dapli_evd_post_event(async_evd_ptr, event_ptr);
-+      dapl_os_unlock(&async_evd_ptr->header.lock);
-+      return;
-+
-+err:
-+      async_evd_ptr->catastrophic_overflow = DAT_TRUE;
-+      async_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD;
-+      dapl_os_unlock(&async_evd_ptr->header.lock);
-+}
-+
-+DAT_RETURN
-+dapls_evd_post_cr_arrival_event(IN DAPL_EVD * evd_ptr,
-+                              IN DAT_EVENT_NUMBER event_number,
-+                              IN DAT_SP_HANDLE sp_handle,
-+                              DAT_IA_ADDRESS_PTR ia_address_ptr,
-+                              DAT_CONN_QUAL conn_qual,
-+                              DAT_CR_HANDLE cr_handle)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle;
-+      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr
-+          = ia_address_ptr;
-+      event_ptr->event_data.cr_arrival_event_data.conn_qual = conn_qual;
-+      event_ptr->event_data.cr_arrival_event_data.cr_handle = cr_handle;
-+
-+      dapli_evd_post_event(evd_ptr, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+
-+DAT_RETURN
-+dapls_evd_post_connection_event(IN DAPL_EVD * evd_ptr,
-+                              IN DAT_EVENT_NUMBER event_number,
-+                              IN DAT_EP_HANDLE ep_handle,
-+                              IN DAT_COUNT private_data_size,
-+                              IN DAT_PVOID private_data)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;
-+      event_ptr->event_data.connect_event_data.private_data_size
-+          = private_data_size;
-+      event_ptr->event_data.connect_event_data.private_data = private_data;
-+
-+      dapli_evd_post_event(evd_ptr, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+
-+DAT_RETURN
-+dapls_evd_post_async_error_event(IN DAPL_EVD * evd_ptr,
-+                               IN DAT_EVENT_NUMBER event_number,
-+                               IN DAT_IA_HANDLE ia_handle)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_log(DAPL_DBG_TYPE_WARN,
-+               " WARNING: async event - %s evd=%p/n",
-+               dapl_event_str(event_number), evd_ptr);
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data.asynch_error_event_data.dat_handle =
-+          (DAT_HANDLE) ia_handle;
-+
-+      dapli_evd_post_event(evd_ptr, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+
-+DAT_RETURN
-+dapls_evd_post_software_event(IN DAPL_EVD * evd_ptr,
-+                            IN DAT_EVENT_NUMBER event_number,
-+                            IN DAT_PVOID pointer)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data.software_event_data.pointer = pointer;
-+
-+      dapli_evd_post_event(evd_ptr, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+
-+/*
-+ * dapls_evd_post_generic_event
-+ *
-+ * Post a generic event type. Not used by all providers
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *    event_number
-+ *    data
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *
-+ */
-+DAT_RETURN
-+dapls_evd_post_generic_event(IN DAPL_EVD * evd_ptr,
-+                           IN DAT_EVENT_NUMBER event_number,
-+                           IN DAT_EVENT_DATA * data)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data = *data;
-+
-+      dapli_evd_post_event(evd_ptr, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+
-+#ifdef DAT_EXTENSIONS
-+DAT_RETURN
-+dapls_evd_do_post_cr_event_ext(IN DAPL_EVD * evd_ptr,
-+                              IN DAT_EVENT_NUMBER event_number,
-+                              IN DAPL_SP *sp_ptr,
-+                              IN DAPL_CR *cr_ptr,
-+                              IN DAT_PVOID ext_data)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data.cr_arrival_event_data.sp_handle.psp_handle =
-+          (DAT_PSP_HANDLE) sp_ptr;
-+      event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr =
-+          (DAT_IA_ADDRESS_PTR) &sp_ptr->header.owner_ia->hca_ptr->hca_address;
-+      event_ptr->event_data.cr_arrival_event_data.conn_qual = sp_ptr->conn_qual;
-+      event_ptr->event_data.cr_arrival_event_data.cr_handle = (DAT_CR_HANDLE) cr_ptr;
-+
-+      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);
-+
-+      dapli_evd_post_event(sp_ptr->evd_handle, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+
-+DAT_RETURN
-+dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,
-+                          IN DAT_EVENT_NUMBER event_number,
-+                          IN dp_ib_cm_handle_t ib_cm_handle,
-+                          IN DAT_COUNT p_size,
-+                          IN DAT_PVOID p_data, IN DAT_PVOID ext_data)
-+{
-+      DAPL_CR *cr_ptr;
-+      DAPL_EP *ep_ptr;
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&sp_ptr->header.lock);
-+      if (sp_ptr->listening == DAT_FALSE) {
-+              dapl_os_unlock(&sp_ptr->header.lock);
-+              dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                           "---> post_cr_event_ext: conn event on down SP\n");
-+              (void)dapls_ib_reject_connection(ib_cm_handle,
-+                                               DAT_CONNECTION_EVENT_UNREACHABLE,
-+                                               0, NULL);
-+              return DAT_CONN_QUAL_UNAVAILABLE;
-+      }
-+
-+      /*
-+       * RSP connections only allow a single connection. Close
-+       * it down NOW so we reject any further connections.
-+       */
-+      if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP)
-+              sp_ptr->listening = DAT_FALSE;
-+
-+      dapl_os_unlock(&sp_ptr->header.lock);
-+
-+      /* allocate new connect request */
-+      cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia);
-+      if (cr_ptr == NULL)
-+              return DAT_INSUFFICIENT_RESOURCES;
-+
-+      /* Set up the CR */
-+      cr_ptr->sp_ptr = sp_ptr;        /* maintain sp_ptr in case of reject */
-+      cr_ptr->param.remote_port_qual = 0;
-+      cr_ptr->ib_cm_handle = ib_cm_handle;
-+      cr_ptr->param.remote_ia_address_ptr =
-+          (DAT_IA_ADDRESS_PTR) & cr_ptr->remote_ia_address;
-+
-+      /*
-+       * Copy the remote address and private data out of the private_data
-+       */
-+      cr_ptr->param.private_data = cr_ptr->private_data;
-+      cr_ptr->param.private_data_size = p_size;
-+      if (p_size)
-+              dapl_os_memcpy(cr_ptr->private_data, p_data, p_size);
-+
-+      /* EP will be NULL unless RSP service point */
-+      ep_ptr = (DAPL_EP *) sp_ptr->ep_handle;
-+
-+      if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {
-+              DAPL_IA *ia_ptr;
-+              /*
-+               * Never true for RSP connections
-+               *
-+               * Create an EP for the user. If we can't allocate an
-+               * EP we are out of resources and need to tell the
-+               * requestor that we cant help them.
-+               */
-+              ia_ptr = sp_ptr->header.owner_ia;
-+              ep_ptr = dapl_ep_alloc(ia_ptr, NULL);
-+              if (ep_ptr == NULL) {
-+                      dapls_cr_free(cr_ptr);
-+                      /* Invoking function will call dapls_ib_cm_reject() */
-+                      return DAT_INSUFFICIENT_RESOURCES;
-+              }
-+              ep_ptr->param.ia_handle = ia_ptr;
-+              ep_ptr->param.local_ia_address_ptr =
-+                  (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address;
-+
-+              /* Link the EP onto the IA */
-+              dapl_ia_link_ep(ia_ptr, ep_ptr);
-+      }
-+
-+      cr_ptr->param.local_ep_handle = ep_ptr;
-+
-+      if (ep_ptr != NULL) {
-+              /* Assign valid EP fields: RSP and PSP_PROVIDER_FLAG only */
-+              if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) {
-+                      ep_ptr->param.ep_state =
-+                          DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING;
-+              } else {
-+                      /* RSP */
-+                      dapl_os_assert(sp_ptr->header.handle_type ==
-+                                     DAT_HANDLE_TYPE_RSP);
-+                      ep_ptr->param.ep_state =
-+                          DAT_EP_STATE_PASSIVE_CONNECTION_PENDING;
-+              }
-+              dapl_ep_link_cm(ep_ptr, ib_cm_handle);
-+      }
-+
-+      /* link the CR onto the SP so we can pick it up later */
-+      dapl_sp_link_cr(sp_ptr, cr_ptr);
-+
-+      return dapls_evd_do_post_cr_event_ext(sp_ptr->evd_handle, event_number,
-+                                            sp_ptr, cr_ptr, ext_data);
-+}
-+
-+DAT_RETURN
-+dapls_evd_post_connection_event_ext(IN DAPL_EVD * evd_ptr,
-+                                  IN DAT_EVENT_NUMBER event_number,
-+                                  IN DAT_EP_HANDLE ep_handle,
-+                                  IN DAT_COUNT private_data_size,
-+                                  IN DAT_PVOID private_data,
-+                                  IN DAT_PVOID ext_data)
-+{
-+      DAT_EVENT *event_ptr;
-+
-+      dapl_os_lock(&evd_ptr->header.lock);
-+      event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number);
-+      if (event_ptr == NULL)
-+              goto err;
-+
-+      event_ptr->event_data.connect_event_data.ep_handle = ep_handle;
-+      event_ptr->event_data.connect_event_data.private_data_size
-+          = private_data_size;
-+      event_ptr->event_data.connect_event_data.private_data = private_data;
-+
-+      dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64);
-+
-+      dapli_evd_post_event(evd_ptr, event_ptr);
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      return DAT_SUCCESS;
-+
-+err:
-+      dapl_os_unlock(&evd_ptr->header.lock);
-+      dapls_evd_post_overflow_event(evd_ptr);
-+      return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-+}
-+#endif
-+
-+/*
-+ * dapli_evd_cqe_to_event
-+ *
-+ * Convert a CQE into an event structure.
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *    cqe_ptr
-+ *
-+ * Output:
-+ *    event_ptr
-+ *
-+ * Returns:
-+ *    none
-+ *
-+ */
-+static void
-+dapli_evd_cqe_to_event(IN DAPL_EVD * evd_ptr,
-+                     IN void *cqe_ptr, OUT DAT_EVENT * event_ptr)
-+{
-+      DAPL_EP *ep_ptr;
-+      DAPL_COOKIE *cookie;
-+      DAT_DTO_COMPLETION_STATUS dto_status;
-+      DAPL_COOKIE_BUFFER *buffer;
-+
-+      /*
-+       * All that can be relied on if the status is bad is the status
-+       * and WRID.
-+       */
-+      dto_status = dapls_ib_get_dto_status(cqe_ptr);
-+
-+      cookie = (DAPL_COOKIE *) (uintptr_t) DAPL_GET_CQE_WRID(cqe_ptr);
-+      dapl_os_assert((NULL != cookie));
-+
-+      ep_ptr = cookie->ep;
-+      dapl_os_assert((NULL != ep_ptr));
-+
-+      dapls_io_trc_update_completion(ep_ptr, cookie, dto_status);
-+
-+      event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr;
-+
-+      switch (cookie->type) {
-+      case DAPL_COOKIE_TYPE_DTO:
-+              {
-+#ifdef DAT_EXTENSIONS
-+                      /* Extended via request post or message receive */
-+                      if ((cookie->val.dto.type == DAPL_DTO_TYPE_EXTENSION) ||
-+                          (cookie->val.dto.type == DAPL_DTO_TYPE_RECV &&
-+                           DAPL_GET_CQE_OPTYPE(cqe_ptr) != OP_RECEIVE)) {
-+                              dapls_cqe_to_event_extension(ep_ptr, cookie,
-+                                                           cqe_ptr,
-+                                                           event_ptr);
-+                              if (cookie->val.dto.type == DAPL_DTO_TYPE_RECV)
-+                                      dapls_cookie_dealloc(&ep_ptr->
-+                                                           recv_buffer,
-+                                                           cookie);
-+                              else
-+                                      dapls_cookie_dealloc(&ep_ptr->
-+                                                           req_buffer,
-+                                                           cookie);
-+                              break;
-+                      }
-+#endif
-+
-+                      if (DAPL_DTO_TYPE_RECV == cookie->val.dto.type)
-+                              buffer = &ep_ptr->recv_buffer;
-+                      else
-+                              buffer = &ep_ptr->req_buffer;
-+
-+                      event_ptr->event_number = DAT_DTO_COMPLETION_EVENT;
-+                      event_ptr->event_data.dto_completion_event_data.
-+                          ep_handle = cookie->ep;
-+                      event_ptr->event_data.dto_completion_event_data.
-+                          user_cookie = cookie->val.dto.cookie;
-+                      event_ptr->event_data.dto_completion_event_data.status =
-+                          dto_status;
-+
-+                      if (cookie->val.dto.type == DAPL_DTO_TYPE_SEND ||
-+                          cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE) {
-+                              /* Get size from DTO; CQE value may be off.  */
-+                              event_ptr->event_data.dto_completion_event_data.
-+                                  transfered_length = cookie->val.dto.size;
-+                      } else {
-+                              event_ptr->event_data.dto_completion_event_data.
-+                                  transfered_length =
-+                                  DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-+                      }
-+
-+                      dapls_cookie_dealloc(buffer, cookie);
-+                      break;
-+              }
-+
-+      case DAPL_COOKIE_TYPE_RMR:
-+              {
-+                      event_ptr->event_number = DAT_RMR_BIND_COMPLETION_EVENT;
-+
-+                      event_ptr->event_data.rmr_completion_event_data.
-+                          rmr_handle = cookie->val.rmr.rmr;
-+                      event_ptr->event_data.rmr_completion_event_data.
-+                          user_cookie = cookie->val.rmr.cookie;
-+                      if (dto_status == DAT_DTO_SUCCESS) {
-+                              event_ptr->event_data.rmr_completion_event_data.
-+                                  status = DAT_RMR_BIND_SUCCESS;
-+                              dapl_os_assert((DAPL_GET_CQE_OPTYPE(cqe_ptr)) ==
-+                                             OP_BIND_MW);
-+                      } else {
-+                              dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,
-+                                           " MW bind completion ERROR: %d: op %#x ep: %p\n",
-+                                           dto_status,
-+                                           DAPL_GET_CQE_OPTYPE(cqe_ptr),
-+                                           ep_ptr);
-+                              event_ptr->event_data.rmr_completion_event_data.
-+                                  status = DAT_RMR_OPERATION_FAILED;
-+                              dapl_os_atomic_dec(&cookie->val.rmr.rmr->lmr->
-+                                                 lmr_ref_count);
-+                      }
-+
-+                      dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
-+                      break;
-+              }
-+      default:
-+              {
-+                      dapl_os_assert(!"Invalid Operation type");
-+                      break;
-+              }
-+      }                       /* end switch */
-+
-+      /*
-+       * Most error DTO ops result in disconnecting the EP. See
-+       * IBTA Vol 1.1, Chapter 10,Table 68, for expected effect on
-+       * state.
-+       */
-+      if ((dto_status != DAT_DTO_SUCCESS) &&
-+          (dto_status != DAT_DTO_ERR_FLUSHED)) {
-+              DAPL_EVD *evd_ptr;
-+
-+              /*
-+               * If we are connected, generate disconnect and generate an
-+               * event. We may be racing with other disconnect ops, so we
-+               * need to check. We may also be racing CM connection events,
-+               * requiring us to check for connection pending states too.
-+               */
-+              dapl_os_lock(&ep_ptr->header.lock);
-+              if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED ||
-+                  ep_ptr->param.ep_state ==
-+                  DAT_EP_STATE_ACTIVE_CONNECTION_PENDING
-+                  || ep_ptr->param.ep_state ==
-+                  DAT_EP_STATE_PASSIVE_CONNECTION_PENDING
-+                  || ep_ptr->param.ep_state ==
-+                  DAT_EP_STATE_COMPLETION_PENDING)
-+              {
-+                      ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED;
-+                      dapl_os_unlock(&ep_ptr->header.lock);
-+                      dapls_io_trc_dump(ep_ptr, cqe_ptr, dto_status);
-+
-+                      /* Let the other side know we have disconnected */
-+                      (void)dapls_ib_disconnect(ep_ptr,
-+                                                DAT_CLOSE_ABRUPT_FLAG);
-+
-+                      /* ... and clean up the local side */
-+                      evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle;
-+                      dapl_sp_remove_ep (ep_ptr);
-+                      if (evd_ptr != NULL) {
-+                              dapls_evd_post_connection_event(evd_ptr,
-+                                                              DAT_CONNECTION_EVENT_BROKEN,
-+                                                              (DAT_HANDLE)
-+                                                              ep_ptr, 0, 0);
-+                      }
-+              } else {
-+                      dapl_os_unlock(&ep_ptr->header.lock);
-+              }
-+
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       "DTO completion ERR: status %d, op %s, vendor_err 0x%x - %s\n",
-+                       DAPL_GET_CQE_STATUS(cqe_ptr),
-+                       DAPL_GET_DTO_OP_STR(cookie->val.dto.type),
-+                       DAPL_GET_CQE_VENDOR_ERR(cqe_ptr),
-+                       inet_ntoa(((struct sockaddr_in *)&ep_ptr->
-+                                  remote_ia_address)->sin_addr));
-+      }
-+}
-+
-+/*
-+ * dapls_evd_copy_cq
-+ *
-+ * Copy all entries on a CQ associated with the EVD onto that EVD
-+ * Up to caller to handle races, if any.  Note that no EVD waiters will
-+ * be awoken by this copy.
-+ */
-+DAT_RETURN dapls_evd_copy_cq(DAPL_EVD * evd_ptr)
-+{
-+      ib_work_completion_t cur_cqe;
-+      DAT_RETURN dat_status;
-+      DAT_EVENT *event;
-+
-+      if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) {
-+              /* Nothing to do if no CQ.  */
-+              return DAT_SUCCESS;
-+      }
-+
-+      while (1) {
-+              dat_status =
-+                  dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,
-+                                           evd_ptr, &cur_cqe);
-+
-+              if (dat_status != DAT_SUCCESS) {
-+                      break;
-+              }
-+
-+              /* For debugging.  */
-+              dapli_evd_eh_print_cqe(&cur_cqe);
-+
-+              /*
-+               * Can use DAT_DTO_COMPLETION_EVENT because dapli_evd_cqe_to_event
-+               * will overwrite.
-+               */
-+              event = dapli_evd_get_and_init_event(evd_ptr, DAT_DTO_COMPLETION_EVENT);
-+              if (event == NULL)
-+                      return DAT_QUEUE_FULL;
-+
-+              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);
-+
-+              dapli_evd_post_event(evd_ptr, event);
-+      }
-+
-+      if (DAT_GET_TYPE(dat_status) != DAT_QUEUE_EMPTY) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-+                           "dapls_evd_copy_cq: dapls_ib_completion_poll returned 0x%x\n",
-+                           dat_status);
-+              dapl_os_assert(!"Bad return from dapls_ib_completion_poll");
-+              return dat_status;
-+      }
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_evd_cq_poll_to_event
-+ *
-+ * Attempt to dequeue a single CQE from a CQ and turn it into
-+ * an event.
-+ *
-+ * Input:
-+ *    evd_ptr
-+ *
-+ * Output:
-+ *    event
-+ *
-+ * Returns:
-+ *    Status of operation
-+ *
-+ */
-+DAT_RETURN
-+dapls_evd_cq_poll_to_event(IN DAPL_EVD * evd_ptr, OUT DAT_EVENT * event)
-+{
-+      DAT_RETURN dat_status;
-+      ib_work_completion_t cur_cqe;
-+
-+      dat_status = dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr,
-+                                            evd_ptr, &cur_cqe);
-+      if (dat_status == DAT_SUCCESS) {
-+              /* For debugging.  */
-+              dapli_evd_eh_print_cqe(&cur_cqe);
-+
-+              dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event);
-+      }
-+
-+      return dat_status;
-+}
-+
-+#ifdef DAPL_DBG_IO_TRC
-+/*
-+ * Update I/O completions in the I/O trace buffer. I/O is posted to
-+ * the buffer, then we find it here using the cookie and mark it
-+ * completed with the completion status
-+ */
-+void
-+dapls_io_trc_update_completion(DAPL_EP * ep_ptr,
-+                             DAPL_COOKIE * cookie,
-+                             DAT_DTO_COMPLETION_STATUS dto_status)
-+{
-+      int i;
-+      static unsigned int c_cnt = 1;
-+
-+      for (i = 0; i < DBG_IO_TRC_QLEN; i++) {
-+              if (ep_ptr->ibt_base[i].cookie == cookie) {
-+                      ep_ptr->ibt_base[i].status = dto_status;
-+                      ep_ptr->ibt_base[i].done = c_cnt++;
-+              }
-+      }
-+}
-+
-+/*
-+ * Dump the I/O trace buffers
-+ */
-+void
-+dapls_io_trc_dump(DAPL_EP * ep_ptr,
-+                void *cqe_ptr, DAT_DTO_COMPLETION_STATUS dto_status)
-+{
-+      struct io_buf_track *ibt;
-+      int i;
-+      int cnt;
-+
-+      dapl_os_printf("DISCONNECTING: dto_status     = %x\n", dto_status);
-+      dapl_os_printf("               OpType        = %x\n",
-+                     DAPL_GET_CQE_OPTYPE(cqe_ptr));
-+      dapl_os_printf("               Bytes         = %x\n",
-+                     DAPL_GET_CQE_BYTESNUM(cqe_ptr));
-+      dapl_os_printf("               WRID (cookie) = %llx\n",
-+                     DAPL_GET_CQE_WRID(cqe_ptr));
-+
-+      if (ep_ptr->ibt_dumped == 0) {
-+
-+              dapl_os_printf("EP %p (qpn %d) I/O trace buffer\n",
-+                             ep_ptr, ep_ptr->qpn);
-+
-+              ep_ptr->ibt_dumped = 1;
-+              ibt =
-+                  (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->
-+                                                           ibt_queue);
-+              cnt = DBG_IO_TRC_QLEN;
-+              while (ibt != NULL && cnt > 0) {
-+                      dapl_os_printf
-+                          ("%2d. %3s (%2d, %d) OP: %x cookie %p wqe %p rmv_target_addr %llx rmv_rmr_context %x\n",
-+                           cnt, ibt->done == 0 ? "WRK" : "DON", ibt->status,
-+                           ibt->done, ibt->op_type, ibt->cookie, ibt->wqe,
-+                           ibt->remote_iov.target_address,
-+                           ibt->remote_iov.rmr_context);
-+                      for (i = 0; i < 3; i++) {
-+                              if (ibt->iov[i].segment_length != 0) {
-+                                      dapl_os_printf
-+                                          ("     (%4llx, %8x, %8llx)\n",
-+                                           ibt->iov[i].segment_length,
-+                                           ibt->iov[i].lmr_context,
-+                                           ibt->iov[i].virtual_address);
-+                              }
-+                      }
-+                      ibt =
-+                          (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr->
-+                                                                   ibt_queue);
-+                      cnt--;
-+              }
-+      }
-+}
-+#endif                                /* DAPL_DBG_IO_TRC */
-+
-+/*
-+ * Local variables:
-+ *  c-indent-level: 4
-+ *  c-basic-offset: 4
-+ *  tab-width: 8
-+ * End:
-+ */
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
-index e5a7c3f..65472d7 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
-@@ -165,11 +165,14 @@ extern void dapl_evd_qp_async_error_callback (
-     IN        ib_error_record_t *     cause_ptr,
-     IN        void *                  context);
--extern void dapls_evd_copy_cq (
-+extern DAT_RETURN dapls_evd_copy_cq (
-     DAPL_EVD                  *evd_ptr);
- extern DAT_RETURN dapls_evd_cq_poll_to_event (
-     IN DAPL_EVD               *evd_ptr,
-     OUT DAT_EVENT             *event);
-+extern void dapls_evd_post_overflow_event (
-+    IN DAPL_EVD                       *evd_ptr);
-+
- #endif
-diff --git a/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c b/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c
-index ffc50de..fba3711 100644
---- a/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c
-+++ b/trunk/ulp/dapl2/dapl/common/dapl_sp_util.c
-@@ -1,282 +1,282 @@
--/*\r
-- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
-- *\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--/**********************************************************************\r
-- *\r
-- * MODULE: dapl_sp_util.c\r
-- *\r
-- * PURPOSE: Manage PSP Info structure\r
-- *\r
-- * $Id:$\r
-- **********************************************************************/\r
--\r
--#include "dapl.h"\r
--#include "dapl_ep_util.h"\r
--#include "dapl_sp_util.h"\r
--#include "dapl_cr_util.h"\r
--\r
--/*\r
-- * Local definitions\r
-- */\r
--\r
--/*\r
-- * dapl_sp_alloc\r
-- *\r
-- * alloc and initialize a PSP INFO struct\r
-- *\r
-- * Input:\r
-- *    IA INFO struct ptr\r
-- *\r
-- * Output:\r
-- *    sp_ptr\r
-- *\r
-- * Returns:\r
-- *    NULL\r
-- *    pointer to sp info struct\r
-- *\r
-- */\r
--DAPL_SP *dapls_sp_alloc(IN DAPL_IA * ia_ptr, IN DAT_BOOLEAN is_psp)\r
--{\r
--      DAPL_SP *sp_ptr;\r
--\r
--      /* Allocate EP */\r
--      sp_ptr = (DAPL_SP *) dapl_os_alloc(sizeof(DAPL_SP));\r
--      if (sp_ptr == NULL) {\r
--              return (NULL);\r
--      }\r
--\r
--      /* zero the structure */\r
--      dapl_os_memzero(sp_ptr, sizeof(DAPL_SP));\r
--\r
--      /*\r
--       * initialize the header\r
--       */\r
--      sp_ptr->header.provider = ia_ptr->header.provider;\r
--      if (is_psp) {\r
--              sp_ptr->header.magic = DAPL_MAGIC_PSP;\r
--              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_PSP;\r
--      } else {\r
--              sp_ptr->header.magic = DAPL_MAGIC_RSP;\r
--              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_RSP;\r
--      }\r
--      sp_ptr->header.owner_ia = ia_ptr;\r
--      sp_ptr->header.user_context.as_64 = 0;\r
--      sp_ptr->header.user_context.as_ptr = NULL;\r
--      dapl_llist_init_entry(&sp_ptr->header.ia_list_entry);\r
--      dapl_os_lock_init(&sp_ptr->header.lock);\r
--\r
--#if defined(_VENDOR_IBAL_)\r
--      dapl_os_wait_object_init(&sp_ptr->wait_object);\r
--#endif\r
--      /*\r
--       * Initialize the Body (set to NULL above)\r
--       */\r
--      dapl_llist_init_head(&sp_ptr->cr_list_head);\r
--\r
--      return (sp_ptr);\r
--}\r
--\r
--/*\r
-- * dapl_sp_free\r
-- *\r
-- * Free the passed in PSP structure.\r
-- *\r
-- * Input:\r
-- *    entry point pointer\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    none\r
-- *\r
-- */\r
--void dapls_sp_free_sp(IN DAPL_SP * sp_ptr)\r
--{\r
--      dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP ||\r
--                     sp_ptr->header.magic == DAPL_MAGIC_RSP);\r
--      dapl_os_assert(dapl_llist_is_empty(&sp_ptr->cr_list_head));\r
--\r
--#if defined(_VENDOR_IBAL_)\r
--      dapl_os_wait_object_destroy(&sp_ptr->wait_object);\r
--#endif\r
--      dapl_os_lock(&sp_ptr->header.lock);\r
--      sp_ptr->header.magic = DAPL_MAGIC_INVALID;      /* reset magic to prevent reuse */\r
--      dapl_os_unlock(&sp_ptr->header.lock);\r
--      dapl_os_free(sp_ptr, sizeof(DAPL_SP));\r
--}\r
--\r
--/*\r
-- * dapl_cr_link_cr\r
-- *\r
-- * Add a cr to a PSP structure\r
-- *\r
-- * Input:\r
-- *    sp_ptr\r
-- *    cr_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    none\r
-- *\r
-- */\r
--void dapl_sp_link_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)\r
--{\r
--      dapl_os_lock(&sp_ptr->header.lock);\r
--      dapl_llist_add_tail(&sp_ptr->cr_list_head,\r
--                          &cr_ptr->header.ia_list_entry, cr_ptr);\r
--      sp_ptr->cr_list_count++;\r
--      dapl_os_unlock(&sp_ptr->header.lock);\r
--}\r
--\r
--/*\r
-- * dapl_sp_search_cr\r
-- *\r
-- * Search for a CR on the PSP cr_list with a matching cm_handle. When\r
-- * found, remove it from the list and update fields.\r
-- *\r
-- * Must be called with the sp_ptr lock taken.\r
-- *\r
-- * Input:\r
-- *    sp_ptr\r
-- *    ib_cm_handle\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    cr_ptr_fnd      Pointer to matching DAPL_CR\r
-- *\r
-- */\r
--DAPL_CR *dapl_sp_search_cr(IN DAPL_SP * sp_ptr,\r
--                         IN dp_ib_cm_handle_t ib_cm_handle)\r
--{\r
--      DAPL_CR *cr_ptr;\r
--      DAPL_CR *cr_ptr_fnd;\r
--\r
--      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {\r
--              return NULL;\r
--      }\r
--      cr_ptr_fnd = NULL;\r
--      cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr->cr_list_head);\r
--      dapl_os_assert(cr_ptr);\r
--\r
--      do {\r
--              if (cr_ptr->ib_cm_handle == ib_cm_handle) {\r
--                      cr_ptr_fnd = cr_ptr;\r
--\r
--                      break;\r
--              }\r
--              cr_ptr = cr_ptr->header.ia_list_entry.flink->data;\r
--      } while ((void *)cr_ptr != (void *)sp_ptr->cr_list_head->data);\r
--\r
--      return cr_ptr_fnd;\r
--}\r
--\r
--/*\r
-- * dapl_sp_remove_cr\r
-- *\r
-- * Remove the CR from the PSP. Done prior to freeing the CR resource.\r
-- *\r
-- * Must be called with the sp_ptr lock taken.\r
-- *\r
-- * Input:\r
-- *    sp_ptr\r
-- *    cr_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    void\r
-- *\r
-- */\r
--void dapl_sp_remove_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)\r
--{\r
--      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "**dapl_sp_remove_cr: removing from empty queue! sp %p\n",\r
--                           sp_ptr);\r
--              return;\r
--      }\r
--\r
--      dapl_llist_remove_entry(&sp_ptr->cr_list_head,\r
--                              &cr_ptr->header.ia_list_entry);\r
--      sp_ptr->cr_list_count--;\r
--}\r
--\r
--/*\r
-- * dapl_sp_remove_ep\r
-- *\r
-- * Remove a CR from a PSP, given an EP.\r
-- *\r
-- *\r
-- * Input:\r
-- *    ep_ptr\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    void\r
-- *\r
-- */\r
--void dapl_sp_remove_ep(IN DAPL_EP * ep_ptr)\r
--{\r
--      DAPL_SP *sp_ptr;\r
--      DAPL_CR *cr_ptr;\r
--\r
--      cr_ptr = ep_ptr->cr_ptr;\r
--\r
--      if (cr_ptr != NULL) {\r
--              sp_ptr = cr_ptr->sp_ptr;\r
--\r
--              dapl_os_lock(&sp_ptr->header.lock);\r
--\r
--              /* Remove the CR from the queue */\r
--              dapl_sp_remove_cr(sp_ptr, cr_ptr);\r
--\r
--              dapl_os_unlock(&sp_ptr->header.lock);\r
--\r
--              ep_ptr->cr_ptr = NULL;\r
--\r
--              /* free memory outside of the lock */\r
--              dapls_cr_free(cr_ptr);\r
--\r
--              return;\r
--      }\r
--}\r
--\r
--/*\r
-- * Local variables:\r
-- *  c-indent-level: 4\r
-- *  c-basic-offset: 4\r
-- *  tab-width: 8\r
-- * End:\r
-- */\r
-+/*
-+ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
-+ *
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+/**********************************************************************
-+ *
-+ * MODULE: dapl_sp_util.c
-+ *
-+ * PURPOSE: Manage PSP Info structure
-+ *
-+ * $Id:$
-+ **********************************************************************/
-+
-+#include "dapl.h"
-+#include "dapl_ep_util.h"
-+#include "dapl_sp_util.h"
-+#include "dapl_cr_util.h"
-+
-+/*
-+ * Local definitions
-+ */
-+
-+/*
-+ * dapl_sp_alloc
-+ *
-+ * alloc and initialize a PSP INFO struct
-+ *
-+ * Input:
-+ *    IA INFO struct ptr
-+ *
-+ * Output:
-+ *    sp_ptr
-+ *
-+ * Returns:
-+ *    NULL
-+ *    pointer to sp info struct
-+ *
-+ */
-+DAPL_SP *dapls_sp_alloc(IN DAPL_IA * ia_ptr, IN DAT_BOOLEAN is_psp)
-+{
-+      DAPL_SP *sp_ptr;
-+
-+      /* Allocate EP */
-+      sp_ptr = (DAPL_SP *) dapl_os_alloc(sizeof(DAPL_SP));
-+      if (sp_ptr == NULL) {
-+              return (NULL);
-+      }
-+
-+      /* zero the structure */
-+      dapl_os_memzero(sp_ptr, sizeof(DAPL_SP));
-+
-+      /*
-+       * initialize the header
-+       */
-+      sp_ptr->header.provider = ia_ptr->header.provider;
-+      if (is_psp) {
-+              sp_ptr->header.magic = DAPL_MAGIC_PSP;
-+              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_PSP;
-+      } else {
-+              sp_ptr->header.magic = DAPL_MAGIC_RSP;
-+              sp_ptr->header.handle_type = DAT_HANDLE_TYPE_RSP;
-+      }
-+      sp_ptr->header.owner_ia = ia_ptr;
-+      sp_ptr->header.user_context.as_64 = 0;
-+      sp_ptr->header.user_context.as_ptr = NULL;
-+      dapl_llist_init_entry(&sp_ptr->header.ia_list_entry);
-+      dapl_os_lock_init(&sp_ptr->header.lock);
-+
-+#if defined(_VENDOR_IBAL_)
-+      dapl_os_wait_object_init(&sp_ptr->wait_object);
-+#endif
-+      /*
-+       * Initialize the Body (set to NULL above)
-+       */
-+      dapl_llist_init_head(&sp_ptr->cr_list_head);
-+
-+      return (sp_ptr);
-+}
-+
-+/*
-+ * dapl_sp_free
-+ *
-+ * Free the passed in PSP structure.
-+ *
-+ * Input:
-+ *    entry point pointer
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    none
-+ *
-+ */
-+void dapls_sp_free_sp(IN DAPL_SP * sp_ptr)
-+{
-+      dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP ||
-+                     sp_ptr->header.magic == DAPL_MAGIC_RSP);
-+      dapl_os_assert(dapl_llist_is_empty(&sp_ptr->cr_list_head));
-+
-+#if defined(_VENDOR_IBAL_)
-+      dapl_os_wait_object_destroy(&sp_ptr->wait_object);
-+#endif
-+      dapl_os_lock(&sp_ptr->header.lock);
-+      sp_ptr->header.magic = DAPL_MAGIC_INVALID;      /* reset magic to prevent reuse */
-+      dapl_os_unlock(&sp_ptr->header.lock);
-+      dapl_os_free(sp_ptr, sizeof(DAPL_SP));
-+}
-+
-+/*
-+ * dapl_cr_link_cr
-+ *
-+ * Add a cr to a PSP structure
-+ *
-+ * Input:
-+ *    sp_ptr
-+ *    cr_ptr
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    none
-+ *
-+ */
-+void dapl_sp_link_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)
-+{
-+      dapl_os_lock(&sp_ptr->header.lock);
-+      dapl_llist_add_tail(&sp_ptr->cr_list_head,
-+                          &cr_ptr->header.ia_list_entry, cr_ptr);
-+      sp_ptr->cr_list_count++;
-+      dapl_os_unlock(&sp_ptr->header.lock);
-+}
-+
-+/*
-+ * dapl_sp_search_cr
-+ *
-+ * Search for a CR on the PSP cr_list with a matching cm_handle. When
-+ * found, remove it from the list and update fields.
-+ *
-+ * Must be called with the sp_ptr lock taken.
-+ *
-+ * Input:
-+ *    sp_ptr
-+ *    ib_cm_handle
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    cr_ptr_fnd      Pointer to matching DAPL_CR
-+ *
-+ */
-+DAPL_CR *dapl_sp_search_cr(IN DAPL_SP * sp_ptr,
-+                         IN dp_ib_cm_handle_t ib_cm_handle)
-+{
-+      DAPL_CR *cr_ptr;
-+      DAPL_CR *cr_ptr_fnd;
-+
-+      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {
-+              return NULL;
-+      }
-+      cr_ptr_fnd = NULL;
-+      cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr->cr_list_head);
-+      dapl_os_assert(cr_ptr);
-+
-+      do {
-+              if (cr_ptr->ib_cm_handle == ib_cm_handle) {
-+                      cr_ptr_fnd = cr_ptr;
-+
-+                      break;
-+              }
-+              cr_ptr = cr_ptr->header.ia_list_entry.flink->data;
-+      } while ((void *)cr_ptr != (void *)sp_ptr->cr_list_head->data);
-+
-+      return cr_ptr_fnd;
-+}
-+
-+/*
-+ * dapl_sp_remove_cr
-+ *
-+ * Remove the CR from the PSP. Done prior to freeing the CR resource.
-+ *
-+ * Must be called with the sp_ptr lock taken.
-+ *
-+ * Input:
-+ *    sp_ptr
-+ *    cr_ptr
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    void
-+ *
-+ */
-+void dapl_sp_remove_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr)
-+{
-+      if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "**dapl_sp_remove_cr: removing from empty queue! sp %p\n",
-+                           sp_ptr);
-+              return;
-+      }
-+
-+      dapl_llist_remove_entry(&sp_ptr->cr_list_head,
-+                              &cr_ptr->header.ia_list_entry);
-+      sp_ptr->cr_list_count--;
-+}
-+
-+/*
-+ * dapl_sp_remove_ep
-+ *
-+ * Remove a CR from a PSP, given an EP.
-+ *
-+ *
-+ * Input:
-+ *    ep_ptr
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    void
-+ *
-+ */
-+void dapl_sp_remove_ep(IN DAPL_EP * ep_ptr)
-+{
-+      DAPL_SP *sp_ptr;
-+      DAPL_CR *cr_ptr;
-+
-+      cr_ptr = ep_ptr->cr_ptr;
-+
-+      if (cr_ptr != NULL) {
-+              sp_ptr = cr_ptr->sp_ptr;
-+
-+              dapl_os_lock(&sp_ptr->header.lock);
-+
-+              /* Remove the CR from the queue */
-+              dapl_sp_remove_cr(sp_ptr, cr_ptr);
-+
-+              dapl_os_unlock(&sp_ptr->header.lock);
-+
-+              ep_ptr->cr_ptr = NULL;
-+
-+              /* free memory outside of the lock */
-+              dapls_cr_free(cr_ptr);
-+
-+              return;
-+      }
-+}
-+
-+/*
-+ * Local variables:
-+ *  c-indent-level: 4
-+ *  c-basic-offset: 4
-+ *  tab-width: 8
-+ * End:
-+ */
-diff --git a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c
-index f52f5da..e843829 100644
---- a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c
-+++ b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_qp.c
-@@ -318,23 +318,21 @@ dapls_ib_qp_free (
-         IN  DAPL_EP                *ep_ptr )
- {
--      ib_qp_handle_t          qp_handle;
-       UNREFERENCED_PARAMETER(ia_ptr);
-       dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsQF: free %p, state %s\n", 
-                       ep_ptr->qp_handle,
-                       ib_get_port_state_str(ep_ptr->qp_state));
--      if (( ep_ptr->qp_handle != IB_INVALID_HANDLE ) &&
--          ( ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED ))
-+      dapl_os_lock(&ep_ptr->header.lock);
-+      if (( ep_ptr->qp_handle != IB_INVALID_HANDLE ))
-       {
--              qp_handle = ep_ptr->qp_handle;
--              ep_ptr->qp_handle = IB_INVALID_HANDLE;
--              ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED;
--              ib_destroy_qp ( qp_handle, NULL /* callback */);
-+              ib_destroy_qp ( ep_ptr->qp_handle, ib_sync_destroy );
-               dapl_dbg_log (DAPL_DBG_TYPE_EP, "--> DsQF: freed QP %p\n",
--                              qp_handle ); 
-+                              ep_ptr->qp_handle ); 
-+              ep_ptr->qp_handle = IB_INVALID_HANDLE;
-       }
-+      dapl_os_unlock(&ep_ptr->header.lock);
-     return DAT_SUCCESS;
- }
-diff --git a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c
-index 7f9b819..0852df2 100644
---- a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c
-+++ b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_util.c
-@@ -913,14 +913,14 @@ DAT_RETURN dapls_ib_close_hca ( IN  DAPL_HCA  *p_hca )
-      */
-     REMOVE_REFERENCE (&p_ca->refs);
-+    (void) ib_close_ca (p_ca->h_ca, ib_sync_destroy);
-+
-     cl_spinlock_destroy (&p_ca->port_lock);
-     cl_spinlock_destroy (&p_ca->evd_cb_lock);
-     if (p_ca->p_ca_attr)
-         dapl_os_free (p_ca->p_ca_attr, sizeof (ib_ca_attr_t));
--    (void) ib_close_ca (p_ca->h_ca, NULL /* close_callback */);
--
-     p_hca->ib_hca_handle = IB_INVALID_HANDLE;
-     dapl_os_free (p_ca, sizeof (dapl_ibal_ca_t));
-diff --git a/trunk/ulp/dapl2/dapl/include/dapl.h b/trunk/ulp/dapl2/dapl/include/dapl.h
-index 8dab61e..a522f15 100644
---- a/trunk/ulp/dapl2/dapl/include/dapl.h
-+++ b/trunk/ulp/dapl2/dapl/include/dapl.h
-@@ -349,9 +349,6 @@ struct dapl_evd
-     DAT_BOOLEAN               evd_enabled; /* For attached CNO.  */
-     DAT_BOOLEAN               evd_waitable; /* EVD state.  */
--    /* Derived from evd_flags; see dapls_evd_internal_create.  */
--    DAT_BOOLEAN               evd_producer_locking_needed;
--
-     /* Every EVD has a CQ unless it is a SOFTWARE_EVENT only EVD */
-     ib_cq_handle_t    ib_cq_handle;
-diff --git a/trunk/ulp/dapl2/dapl/include/dapl_debug.h b/trunk/ulp/dapl2/dapl/include/dapl_debug.h
-index b8281ab..6e332e6 100644
---- a/trunk/ulp/dapl2/dapl/include/dapl_debug.h
-+++ b/trunk/ulp/dapl2/dapl/include/dapl_debug.h
-@@ -1,116 +1,116 @@
--/*\r
-- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
-- *\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--/**********************************************************************\r
-- *\r
-- * MODULE: dapl_debug.h\r
-- *\r
-- * PURPOSE: defines common deuggging flags & data for the DAPL reference\r
-- * implemenation\r
-- *\r
-- * Description:\r
-- *\r
-- *\r
-- * $Id:$\r
-- **********************************************************************/\r
--\r
--#ifndef _DAPL_DEBUG_H_\r
--#define _DAPL_DEBUG_H_\r
--\r
--/*\r
-- * Debug level switches\r
-- *\r
-- * Use these bits to enable various tracing/debug options. Each bit\r
-- * represents debugging in a particular subsystem or area of the code.\r
-- *\r
-- * The ERR bit should always be on unless someone disables it for a\r
-- * reason: The ERR flag is used sparingly and will print useful\r
-- * information if it fires.\r
-- */\r
--typedef enum\r
--{\r
--    DAPL_DBG_TYPE_ERR         = 0x0001,\r
--    DAPL_DBG_TYPE_WARN                = 0x0002,\r
--    DAPL_DBG_TYPE_EVD         = 0x0004,\r
--    DAPL_DBG_TYPE_CM          = 0x0008,\r
--    DAPL_DBG_TYPE_EP          = 0x0010,\r
--    DAPL_DBG_TYPE_UTIL                = 0x0020,\r
--    DAPL_DBG_TYPE_CALLBACK    = 0x0040,\r
--    DAPL_DBG_TYPE_DTO_COMP_ERR        = 0x0080,\r
--    DAPL_DBG_TYPE_API         = 0x0100,\r
--    DAPL_DBG_TYPE_RTN         = 0x0200,\r
--    DAPL_DBG_TYPE_EXCEPTION   = 0x0400,\r
--    DAPL_DBG_TYPE_SRQ         = 0x0800,\r
--    DAPL_DBG_TYPE_CNTR        = 0x1000,\r
--    DAPL_DBG_TYPE_CM_LIST     = 0x2000,\r
--    DAPL_DBG_TYPE_THREAD      = 0x4000,\r
--    DAPL_DBG_TYPE_CM_EST      = 0x8000,\r
--    DAPL_DBG_TYPE_CM_WARN     = 0x10000\r
--\r
--} DAPL_DBG_TYPE;\r
--\r
--typedef enum\r
--{\r
--    DAPL_DBG_DEST_STDOUT      = 0x0001,\r
--    DAPL_DBG_DEST_SYSLOG      = 0x0002,\r
--} DAPL_DBG_DEST;\r
--\r
--extern DAPL_DBG_TYPE  g_dapl_dbg_type;\r
--extern DAPL_DBG_DEST  g_dapl_dbg_dest;\r
--\r
--extern void dapl_internal_dbg_log(DAPL_DBG_TYPE type,  const char *fmt,  ...);\r
--\r
--#define dapl_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log\r
--\r
--#if defined(DAPL_DBG)\r
--#define dapl_dbg_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log\r
--#else\r
--#define dapl_dbg_log(...)\r
--#endif\r
--\r
--#include <dat2/dat_ib_extensions.h>\r
--\r
--#ifdef DAPL_COUNTERS\r
--\r
--#define DAPL_CNTR(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr]++\r
--#define DAPL_CNTR_DATA(h_ptr, cntr, data) ((DAT_UINT64*)h_ptr->cntrs)[cntr]+= data\r
--\r
--DAT_RETURN dapl_query_counter(DAT_HANDLE dh, \r
--                            int counter, \r
--                            void *p_cntrs_out,\r
--                            int reset);\r
--char *dapl_query_counter_name(DAT_HANDLE dh, int counter);\r
--void dapl_print_counter(DAT_HANDLE dh, int counter, int reset);\r
--\r
--#else\r
--\r
--#define DAPL_CNTR(handle, cntr)\r
--#define DAPL_CNTR_DATA(handle, cntr, data)\r
--\r
--#endif /* DAPL_COUNTERS */\r
--\r
--#endif /* _DAPL_DEBUG_H_ */\r
-+/*
-+ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
-+ *
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+/**********************************************************************
-+ *
-+ * MODULE: dapl_debug.h
-+ *
-+ * PURPOSE: defines common deuggging flags & data for the DAPL reference
-+ * implemenation
-+ *
-+ * Description:
-+ *
-+ *
-+ * $Id:$
-+ **********************************************************************/
-+
-+#ifndef _DAPL_DEBUG_H_
-+#define _DAPL_DEBUG_H_
-+
-+/*
-+ * Debug level switches
-+ *
-+ * Use these bits to enable various tracing/debug options. Each bit
-+ * represents debugging in a particular subsystem or area of the code.
-+ *
-+ * The ERR bit should always be on unless someone disables it for a
-+ * reason: The ERR flag is used sparingly and will print useful
-+ * information if it fires.
-+ */
-+typedef enum
-+{
-+    DAPL_DBG_TYPE_ERR         = 0x0001,
-+    DAPL_DBG_TYPE_WARN                = 0x0002,
-+    DAPL_DBG_TYPE_EVD         = 0x0004,
-+    DAPL_DBG_TYPE_CM          = 0x0008,
-+    DAPL_DBG_TYPE_EP          = 0x0010,
-+    DAPL_DBG_TYPE_UTIL                = 0x0020,
-+    DAPL_DBG_TYPE_CALLBACK    = 0x0040,
-+    DAPL_DBG_TYPE_DTO_COMP_ERR        = 0x0080,
-+    DAPL_DBG_TYPE_API         = 0x0100,
-+    DAPL_DBG_TYPE_RTN         = 0x0200,
-+    DAPL_DBG_TYPE_EXCEPTION   = 0x0400,
-+    DAPL_DBG_TYPE_SRQ         = 0x0800,
-+    DAPL_DBG_TYPE_CNTR        = 0x1000,
-+    DAPL_DBG_TYPE_CM_LIST     = 0x2000,
-+    DAPL_DBG_TYPE_THREAD      = 0x4000,
-+    DAPL_DBG_TYPE_CM_EST      = 0x8000,
-+    DAPL_DBG_TYPE_CM_WARN     = 0x10000
-+
-+} DAPL_DBG_TYPE;
-+
-+typedef enum
-+{
-+    DAPL_DBG_DEST_STDOUT      = 0x0001,
-+    DAPL_DBG_DEST_SYSLOG      = 0x0002,
-+} DAPL_DBG_DEST;
-+
-+extern DAPL_DBG_TYPE  g_dapl_dbg_type;
-+extern DAPL_DBG_DEST  g_dapl_dbg_dest;
-+
-+extern void dapl_internal_dbg_log(DAPL_DBG_TYPE type,  const char *fmt,  ...);
-+
-+#define dapl_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log
-+
-+#if defined(DAPL_DBG)
-+#define dapl_dbg_log g_dapl_dbg_type==0 ? (void) 1 : dapl_internal_dbg_log
-+#else
-+#define dapl_dbg_log(...)
-+#endif
-+
-+#include <dat2/dat_ib_extensions.h>
-+
-+#ifdef DAPL_COUNTERS
-+
-+#define DAPL_CNTR(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr]++
-+#define DAPL_CNTR_DATA(h_ptr, cntr, data) ((DAT_UINT64*)h_ptr->cntrs)[cntr]+= data
-+
-+DAT_RETURN dapl_query_counter(DAT_HANDLE dh, 
-+                            int counter, 
-+                            void *p_cntrs_out,
-+                            int reset);
-+char *dapl_query_counter_name(DAT_HANDLE dh, int counter);
-+void dapl_print_counter(DAT_HANDLE dh, int counter, int reset);
-+
-+#else
-+
-+#define DAPL_CNTR(handle, cntr)
-+#define DAPL_CNTR_DATA(handle, cntr, data)
-+
-+#endif /* DAPL_COUNTERS */
-+
-+#endif /* _DAPL_DEBUG_H_ */
-diff --git a/trunk/ulp/dapl2/dapl/openib_cma/cm.c b/trunk/ulp/dapl2/dapl/openib_cma/cm.c
-index c941f74..9338d55 100644
---- a/trunk/ulp/dapl2/dapl/openib_cma/cm.c
-+++ b/trunk/ulp/dapl2/dapl/openib_cma/cm.c
-@@ -105,7 +105,7 @@ static void dapli_route_resolve(struct dapl_cm_id *conn)
-       int ret;
- #ifdef DAPL_DBG
-       struct rdma_addr *ipaddr = &conn->cm_id->route.addr;
--      struct rdma_ib_addr *ibaddr = &conn->cm_id->route.addr.addr.ibaddr;
-+      struct ib_addr *ibaddr = &conn->cm_id->route.addr.addr.ibaddr;
- #endif
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-diff --git a/trunk/ulp/dapl2/dapl/openib_common/util.c b/trunk/ulp/dapl2/dapl/openib_common/util.c
-index 2345da5..5076df8 100644
---- a/trunk/ulp/dapl2/dapl/openib_common/util.c
-+++ b/trunk/ulp/dapl2/dapl/openib_common/util.c
-@@ -1,724 +1,724 @@
--/*\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--#include "dapl.h"\r
--#include "dapl_adapter_util.h"\r
--#include "dapl_ib_util.h"\r
--#include "dapl_osd.h"\r
--\r
--#include <stdlib.h>\r
--\r
--int g_dapl_loopback_connection = 0;\r
--\r
--#if defined(_WIN64) || defined(_WIN32)\r
--#include "..\..\..\..\..\etc\user\comp_channel.cpp"\r
--#include <rdma\winverbs.h>\r
--\r
--int getipaddr_netdev(char *name, char *addr, int addr_len)\r
--{\r
--      IWVProvider *prov;\r
--      WV_DEVICE_ADDRESS devaddr;\r
--      struct addrinfo *res, *ai;\r
--      HRESULT hr;\r
--      int index;\r
--\r
--      if (strncmp(name, "rdma_dev", 8)) {\r
--              return EINVAL;\r
--      }\r
--\r
--      index = atoi(name + 8);\r
--\r
--      hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov);\r
--      if (FAILED(hr)) {\r
--              return hr;\r
--      }\r
--\r
--      hr = getaddrinfo("..localmachine", NULL, NULL, &res);\r
--      if (hr) {\r
--              goto release;\r
--      }\r
--\r
--      for (ai = res; ai; ai = ai->ai_next) {\r
--              hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr);\r
--              if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) {\r
--                      memcpy(addr, ai->ai_addr, ai->ai_addrlen);\r
--                      goto free;\r
--              }\r
--      }\r
--      hr = ENODEV;\r
--\r
--free:\r
--      freeaddrinfo(res);\r
--release:\r
--      prov->lpVtbl->Release(prov);\r
--      return hr;\r
--}\r
--\r
--#else                         // _WIN64 || WIN32\r
--\r
--/* Get IP address using network device name */\r
--int getipaddr_netdev(char *name, char *addr, int addr_len)\r
--{\r
--      struct ifreq ifr;\r
--      int skfd, ret, len;\r
--\r
--      /* Fill in the structure */\r
--      snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);\r
--      ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;\r
--\r
--      /* Create a socket fd */\r
--      skfd = socket(PF_INET, SOCK_STREAM, 0);\r
--      ret = ioctl(skfd, SIOCGIFADDR, &ifr);\r
--      if (ret)\r
--              goto bail;\r
--\r
--      switch (ifr.ifr_addr.sa_family) {\r
--#ifdef        AF_INET6\r
--      case AF_INET6:\r
--              len = sizeof(struct sockaddr_in6);\r
--              break;\r
--#endif\r
--      case AF_INET:\r
--      default:\r
--              len = sizeof(struct sockaddr);\r
--              break;\r
--      }\r
--\r
--      if (len <= addr_len)\r
--              memcpy(addr, &ifr.ifr_addr, len);\r
--      else\r
--              ret = EINVAL;\r
--\r
--      bail:\r
--      close(skfd);\r
--      return ret;\r
--}\r
--#endif\r
--\r
--enum ibv_mtu dapl_ib_mtu(int mtu)\r
--{\r
--      switch (mtu) {\r
--      case 256:\r
--              return IBV_MTU_256;\r
--      case 512:\r
--              return IBV_MTU_512;\r
--      case 1024:\r
--              return IBV_MTU_1024;\r
--      case 2048:\r
--              return IBV_MTU_2048;\r
--      case 4096:\r
--              return IBV_MTU_4096;\r
--      default:\r
--              return IBV_MTU_1024;\r
--      }\r
--}\r
--\r
--char *dapl_ib_mtu_str(enum ibv_mtu mtu)\r
--{\r
--      switch (mtu) {\r
--      case IBV_MTU_256:\r
--              return "256";\r
--      case IBV_MTU_512:\r
--              return "512";\r
--      case IBV_MTU_1024:\r
--              return "1024";\r
--      case IBV_MTU_2048:\r
--              return "2048";\r
--      case IBV_MTU_4096:\r
--              return "4096";\r
--      default:\r
--              return "1024";\r
--      }\r
--}\r
--\r
--DAT_RETURN getlocalipaddr(char *addr, int addr_len)\r
--{\r
--      struct sockaddr_in *sin;\r
--      struct addrinfo *res, hint, *ai;\r
--      int ret;\r
--      char hostname[256];\r
--      char *netdev = getenv("DAPL_SCM_NETDEV");\r
--\r
--      /* use provided netdev instead of default hostname */\r
--      if (netdev != NULL) {\r
--              ret = getipaddr_netdev(netdev, addr, addr_len);\r
--              if (ret) {                      \r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               " getlocalipaddr: DAPL_SCM_NETDEV provided %s"\r
--                              " but not configured on system? ERR = %s\n",\r
--                              netdev, strerror(ret));\r
--                      return dapl_convert_errno(ret, "getlocalipaddr");\r
--              } else \r
--                      return DAT_SUCCESS;\r
--      }\r
--\r
--      if (addr_len < sizeof(*sin)) {\r
--              return DAT_INTERNAL_ERROR;\r
--      }\r
--\r
--      ret = gethostname(hostname, 256);\r
--      if (ret)\r
--              return dapl_convert_errno(ret, "gethostname");\r
--\r
--      memset(&hint, 0, sizeof hint);\r
--      hint.ai_flags = AI_PASSIVE;\r
--      hint.ai_family = AF_INET;\r
--      hint.ai_socktype = SOCK_STREAM;\r
--      hint.ai_protocol = IPPROTO_TCP;\r
--\r
--      ret = getaddrinfo(hostname, NULL, &hint, &res);\r
--      if (ret) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret));\r
--              return DAT_INVALID_ADDRESS;\r
--      }\r
--\r
--      ret = DAT_INVALID_ADDRESS;\r
--      for (ai = res; ai; ai = ai->ai_next) {\r
--              sin = (struct sockaddr_in *)ai->ai_addr;\r
--              if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) {\r
--                      *((struct sockaddr_in *)addr) = *sin;\r
--                      ret = DAT_SUCCESS;\r
--                      break;\r
--              }\r
--      }\r
--\r
--      freeaddrinfo(res);\r
--      return ret;\r
--}\r
--\r
--/*\r
-- * dapls_ib_query_hca\r
-- *\r
-- * Query the hca attribute\r
-- *\r
-- * Input:\r
-- *    hca_handl               hca handle      \r
-- *    ia_attr                 attribute of the ia\r
-- *    ep_attr                 attribute of the ep\r
-- *    ip_addr                 ip address of DET NIC\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INVALID_HANDLE\r
-- */\r
--\r
--DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,\r
--                            OUT DAT_IA_ATTR * ia_attr,\r
--                            OUT DAT_EP_ATTR * ep_attr,\r
--                            OUT DAT_SOCK_ADDR6 * ip_addr)\r
--{\r
--      struct ibv_device_attr dev_attr;\r
--      struct ibv_port_attr port_attr;\r
--\r
--      if (hca_ptr->ib_hca_handle == NULL) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");\r
--              return (DAT_INVALID_HANDLE);\r
--      }\r
--\r
--      /* local IP address of device, set during ia_open */\r
--      if (ip_addr != NULL)\r
--              memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));\r
--\r
--      if (ia_attr == NULL && ep_attr == NULL)\r
--              return DAT_SUCCESS;\r
--\r
--      /* query verbs for this device and port attributes */\r
--      if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||\r
--          ibv_query_port(hca_ptr->ib_hca_handle,\r
--                         hca_ptr->port_num, &port_attr))\r
--              return (dapl_convert_errno(errno, "ib_query_hca"));\r
--\r
--      if (ia_attr != NULL) {\r
--              (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));\r
--              ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';\r
--              ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';\r
--              ia_attr->ia_address_ptr =\r
--                  (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;\r
--\r
--              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
--                           " query_hca: %s %s \n",\r
--                           ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
--                           inet_ntoa(((struct sockaddr_in *)\r
--                                      &hca_ptr->hca_address)->sin_addr));\r
--\r
--              ia_attr->hardware_version_major = dev_attr.hw_ver;\r
--              /* ia_attr->hardware_version_minor   = dev_attr.fw_ver; */\r
--              ia_attr->max_eps = dev_attr.max_qp;\r
--              ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;\r
--              ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;\r
--              ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;\r
--              ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;\r
--              ia_attr->max_rdma_read_per_ep_out =\r
--                  dev_attr.max_qp_init_rd_atom;\r
--              ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;\r
--              ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;\r
--              ia_attr->max_evds = dev_attr.max_cq;\r
--              ia_attr->max_evd_qlen = dev_attr.max_cqe;\r
--              ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;\r
--              ia_attr->max_lmrs = dev_attr.max_mr;\r
--              /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */\r
--              ia_attr->max_lmr_block_size = \r
--                  (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;\r
--              ia_attr->max_rmrs = dev_attr.max_mw;\r
--              ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;\r
--              ia_attr->max_rmr_target_address = dev_attr.max_mr_size;\r
--              ia_attr->max_pzs = dev_attr.max_pd;\r
--              ia_attr->max_message_size = port_attr.max_msg_sz;\r
--              ia_attr->max_rdma_size = port_attr.max_msg_sz;\r
--              /* iWARP spec. - 1 sge for RDMA reads */\r
--              if (hca_ptr->ib_hca_handle->device->transport_type\r
--                  == IBV_TRANSPORT_IWARP)\r
--                      ia_attr->max_iov_segments_per_rdma_read = 1;\r
--              else\r
--                      ia_attr->max_iov_segments_per_rdma_read =\r
--                          dev_attr.max_sge;\r
--              ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;\r
--              ia_attr->num_transport_attr = 0;\r
--              ia_attr->transport_attr = NULL;\r
--              ia_attr->num_vendor_attr = 0;\r
--              ia_attr->vendor_attr = NULL;\r
--#ifdef DAT_EXTENSIONS\r
--              ia_attr->extension_supported = DAT_EXTENSION_IB;\r
--              ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;\r
--#endif\r
--              /* save key device attributes for CM exchange */\r
--              hca_ptr->ib_trans.rd_atom_in  = dev_attr.max_qp_rd_atom;\r
--              hca_ptr->ib_trans.rd_atom_out = dev_attr.max_qp_init_rd_atom;\r
--              \r
--              hca_ptr->ib_trans.mtu = DAPL_MIN(port_attr.active_mtu,\r
--                                               hca_ptr->ib_trans.mtu);\r
--              hca_ptr->ib_trans.ack_timer =\r
--                  DAPL_MAX(dev_attr.local_ca_ack_delay,\r
--                           hca_ptr->ib_trans.ack_timer);\r
--\r
--              /* set MTU in transport specific named attribute */\r
--              hca_ptr->ib_trans.named_attr.name = "DAT_IB_TRANSPORT_MTU";\r
--              hca_ptr->ib_trans.named_attr.value =\r
--                  dapl_ib_mtu_str(hca_ptr->ib_trans.mtu);\r
--\r
--              if (hca_ptr->ib_hca_handle->device->transport_type != IBV_TRANSPORT_IB)\r
--                      goto skip_ib;\r
--\r
--               /* set SL, PKEY values, defaults = 0 */\r
--               hca_ptr->ib_trans.pkey_idx = 0;\r
--               hca_ptr->ib_trans.pkey = htons(dapl_os_get_env_val("DAPL_IB_PKEY", 0));\r
--               hca_ptr->ib_trans.sl = dapl_os_get_env_val("DAPL_IB_SL", 0);\r
--\r
--              /* index provided, get pkey; pkey provided, get index */\r
--              if (hca_ptr->ib_trans.pkey) {\r
--                      int i; uint16_t pkey = 0;\r
--                      for (i=0; i < dev_attr.max_pkeys; i++) {\r
--                              if (ibv_query_pkey(hca_ptr->ib_hca_handle,\r
--                                                 hca_ptr->port_num,\r
--                                                 i, &pkey)) {\r
--                                      i = dev_attr.max_pkeys;\r
--                                      break;\r
--                              }\r
--                              if (pkey == hca_ptr->ib_trans.pkey) {\r
--                                      hca_ptr->ib_trans.pkey_idx = i;\r
--                                      break;\r
--                              }\r
--                      }\r
--                      if (i == dev_attr.max_pkeys) {\r
--                              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                                       " ERR: new pkey(0x%x), query (%s)"\r
--                                       " err or key !found, using default pkey_idx=0\n",\r
--                                       ntohs(hca_ptr->ib_trans.pkey), strerror(errno));\r
--                      }\r
--              }\r
--skip_ib:\r
--\r
--#ifdef DEFINE_ATTR_LINK_LAYER\r
--#ifndef _OPENIB_CMA_\r
--              if (port_attr.link_layer == IBV_LINK_LAYER_ETHERNET)\r
--                      hca_ptr->ib_trans.global = 1;\r
--\r
--              dapl_log(DAPL_DBG_TYPE_UTIL,\r
--                       " query_hca: port.link_layer = 0x%x\n", \r
--                       port_attr.link_layer);\r
--#endif\r
--#endif\r
--              dapl_log(DAPL_DBG_TYPE_UTIL,\r
--                           " query_hca: (%x.%x) eps %d, sz %d evds %d,"\r
--                           " sz %d mtu %d - pkey %x p_idx %d sl %d\n",\r
--                           ia_attr->hardware_version_major,\r
--                           ia_attr->hardware_version_minor,\r
--                           ia_attr->max_eps, ia_attr->max_dto_per_ep,\r
--                           ia_attr->max_evds, ia_attr->max_evd_qlen,\r
--                           128 << hca_ptr->ib_trans.mtu,\r
--                           ntohs(hca_ptr->ib_trans.pkey),\r
--                           hca_ptr->ib_trans.pkey_idx,\r
--                           hca_ptr->ib_trans.sl);\r
--\r
--              dapl_log(DAPL_DBG_TYPE_UTIL,\r
--                           " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d"\r
--                           " ack_time %d mr %u\n",\r
--                           ia_attr->max_message_size, ia_attr->max_rdma_size,\r
--                           ia_attr->max_iov_segments_per_dto,\r
--                           ia_attr->max_lmrs, ia_attr->max_rmrs,\r
--                           hca_ptr->ib_trans.ack_timer,\r
--                           ia_attr->max_lmr_block_size);\r
--      }\r
--\r
--      if (ep_attr != NULL) {\r
--              (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));\r
--              ep_attr->max_message_size = port_attr.max_msg_sz;\r
--              ep_attr->max_rdma_size = port_attr.max_msg_sz;\r
--              ep_attr->max_recv_dtos = dev_attr.max_qp_wr;\r
--              ep_attr->max_request_dtos = dev_attr.max_qp_wr;\r
--              ep_attr->max_recv_iov = dev_attr.max_sge;\r
--              ep_attr->max_request_iov = dev_attr.max_sge;\r
--              ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;\r
--              ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;\r
--              ep_attr->max_rdma_read_iov = dev_attr.max_sge;\r
--              ep_attr->max_rdma_write_iov = dev_attr.max_sge;\r
--              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
--                           " query_hca: MAX msg %llu mtu %d qsz %d iov %d"\r
--                           " rdma i%d,o%d\n",\r
--                           ep_attr->max_message_size,\r
--                           128 << hca_ptr->ib_trans.mtu,\r
--                           ep_attr->max_recv_dtos, \r
--                           ep_attr->max_recv_iov,\r
--                           ep_attr->max_rdma_read_in,\r
--                           ep_attr->max_rdma_read_out);\r
--      }\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_ib_setup_async_callback\r
-- *\r
-- * Set up an asynchronous callbacks of various kinds\r
-- *\r
-- * Input:\r
-- *    ia_handle               IA handle\r
-- *    handler_type            type of handler to set up\r
-- *    callback_handle         handle param for completion callbacks\r
-- *    callback                callback routine pointer\r
-- *    context                 argument for callback routine\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INVALID_PARAMETER\r
-- *\r
-- */\r
--DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,\r
--                                       IN DAPL_ASYNC_HANDLER_TYPE\r
--                                       handler_type, IN DAPL_EVD * evd_ptr,\r
--                                       IN ib_async_handler_t callback,\r
--                                       IN void *context)\r
--{\r
--      ib_hca_transport_t *hca_ptr;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
--                   " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n",\r
--                   ia_ptr, handler_type, evd_ptr, callback, context);\r
--\r
--      hca_ptr = &ia_ptr->hca_ptr->ib_trans;\r
--      switch (handler_type) {\r
--      case DAPL_ASYNC_UNAFILIATED:\r
--              hca_ptr->async_unafiliated = (ib_async_handler_t) callback;\r
--              hca_ptr->async_un_ctx = context;\r
--              break;\r
--      case DAPL_ASYNC_CQ_ERROR:\r
--              hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;\r
--              break;\r
--      case DAPL_ASYNC_CQ_COMPLETION:\r
--              hca_ptr->async_cq = (ib_async_dto_handler_t) callback;\r
--              break;\r
--      case DAPL_ASYNC_QP_ERROR:\r
--              hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;\r
--              break;\r
--      default:\r
--              break;\r
--      }\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--void dapli_async_event_cb(struct _ib_hca_transport *hca)\r
--{\r
--      struct ibv_async_event event;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca);\r
--\r
--      if (hca->destroy)\r
--              return;\r
--\r
--      if (!ibv_get_async_event(hca->ib_ctx, &event)) {\r
--\r
--              switch (event.event_type) {\r
--              case IBV_EVENT_CQ_ERR:\r
--              {\r
--                      struct dapl_ep *evd_ptr =\r
--                              event.element.cq->cq_context;\r
--\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               "dapl async_event CQ (%p) ERR %d\n",\r
--                               evd_ptr, event.event_type);\r
--\r
--                      /* report up if async callback still setup */\r
--                      if (hca->async_cq_error)\r
--                              hca->async_cq_error(hca->ib_ctx,\r
--                                                  event.element.cq,\r
--                                                  &event,\r
--                                                  (void *)evd_ptr);\r
--                      break;\r
--              }\r
--              case IBV_EVENT_COMM_EST:\r
--              {\r
--                      /* Received msgs on connected QP before RTU */\r
--                      dapl_log(DAPL_DBG_TYPE_UTIL,\r
--                               " async_event COMM_EST(%p) rdata beat RTU\n",\r
--                               event.element.qp);\r
--\r
--                      break;\r
--              }\r
--              case IBV_EVENT_QP_FATAL:\r
--              case IBV_EVENT_QP_REQ_ERR:\r
--              case IBV_EVENT_QP_ACCESS_ERR:\r
--              case IBV_EVENT_QP_LAST_WQE_REACHED:\r
--              case IBV_EVENT_SRQ_ERR:\r
--              case IBV_EVENT_SRQ_LIMIT_REACHED:\r
--              case IBV_EVENT_SQ_DRAINED:\r
--              {\r
--                      struct dapl_ep *ep_ptr =\r
--                              event.element.qp->qp_context;\r
--\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               "dapl async_event QP (%p) ERR %d\n",\r
--                               ep_ptr, event.event_type);\r
--\r
--                      /* report up if async callback still setup */\r
--                      if (hca->async_qp_error)\r
--                              hca->async_qp_error(hca->ib_ctx,\r
--                                                  ep_ptr->qp_handle,\r
--                                                  &event,\r
--                                                  (void *)ep_ptr);\r
--                      break;\r
--              }\r
--              case IBV_EVENT_PATH_MIG:\r
--              case IBV_EVENT_PATH_MIG_ERR:\r
--              case IBV_EVENT_DEVICE_FATAL:\r
--              case IBV_EVENT_PORT_ACTIVE:\r
--              case IBV_EVENT_PORT_ERR:\r
--              case IBV_EVENT_LID_CHANGE:\r
--              case IBV_EVENT_PKEY_CHANGE:\r
--              case IBV_EVENT_SM_CHANGE:\r
--              {\r
--                      dapl_log(DAPL_DBG_TYPE_WARN,\r
--                               "dapl async_event: DEV ERR %d\n",\r
--                               event.event_type);\r
--\r
--                      /* report up if async callback still setup */\r
--                      if (hca->async_unafiliated)\r
--                              hca->async_unafiliated(hca->ib_ctx, \r
--                                                     &event,  \r
--                                                     hca->async_un_ctx);\r
--                      break;\r
--              }\r
--              case IBV_EVENT_CLIENT_REREGISTER:\r
--                      /* no need to report this event this time */\r
--                      dapl_log(DAPL_DBG_TYPE_UTIL,\r
--                               " async_event: IBV_CLIENT_REREGISTER\n");\r
--                      break;\r
--\r
--              default:\r
--                      dapl_log(DAPL_DBG_TYPE_WARN,\r
--                               "dapl async_event: %d UNKNOWN\n",\r
--                               event.event_type);\r
--                      break;\r
--\r
--              }\r
--              ibv_ack_async_event(&event);\r
--      }\r
--}\r
--\r
--/*\r
-- * dapls_set_provider_specific_attr\r
-- *\r
-- * Input:\r
-- *      attr_ptr        Pointer provider specific attributes\r
-- *\r
-- * Output:\r
-- *      none\r
-- *\r
-- * Returns:\r
-- *      void\r
-- */\r
--DAT_NAMED_ATTR ib_attrs[] = {\r
--      {\r
--       "DAT_IB_TRANSPORT_MTU", "2048"}\r
--      ,\r
--#ifdef DAT_EXTENSIONS\r
--      {\r
--       "DAT_EXTENSION_INTERFACE", "TRUE"}\r
--      ,\r
--      {\r
--       DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}\r
--      ,\r
--      {\r
--       DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}\r
--      ,\r
--      {\r
--       DAT_IB_ATTR_IMMED_DATA, "TRUE"}\r
--      ,\r
--#ifndef _OPENIB_CMA_\r
--      {\r
--       DAT_IB_ATTR_UD, "TRUE"}\r
--      ,\r
--#endif\r
--#ifdef DAPL_COUNTERS\r
--      {\r
--       DAT_ATTR_COUNTERS, "TRUE"}\r
--      ,\r
--#endif                                /* DAPL_COUNTERS */\r
--#endif\r
--};\r
--\r
--#define SPEC_ATTR_SIZE( x )     (sizeof( x ) / sizeof( DAT_NAMED_ATTR))\r
--\r
--void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,\r
--                                      IN DAT_PROVIDER_ATTR * attr_ptr)\r
--{\r
--      attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);\r
--      attr_ptr->provider_specific_attr = ib_attrs;\r
--\r
--      /* set MTU to actual settings */\r
--      ib_attrs[0].value = ia_ptr->hca_ptr->ib_trans.named_attr.value;\r
--}\r
--\r
--/*\r
-- * Map all socket CM event codes to the DAT equivelent. Common to all providers\r
-- */\r
--#define DAPL_IB_EVENT_CNT     13\r
--\r
--static struct ib_cm_event_map {\r
--      const ib_cm_events_t ib_cm_event;\r
--      DAT_EVENT_NUMBER dat_event_num;\r
--} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {\r
--/* 00 */ {IB_CME_CONNECTED, \r
--        DAT_CONNECTION_EVENT_ESTABLISHED},\r
--/* 01 */ {IB_CME_DISCONNECTED, \r
--        DAT_CONNECTION_EVENT_DISCONNECTED},\r
--/* 02 */ {IB_CME_DISCONNECTED_ON_LINK_DOWN,\r
--        DAT_CONNECTION_EVENT_DISCONNECTED},\r
--/* 03 */ {IB_CME_CONNECTION_REQUEST_PENDING, \r
--        DAT_CONNECTION_REQUEST_EVENT},\r
--/* 04 */ {IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,\r
--        DAT_CONNECTION_REQUEST_EVENT},\r
--/* 05 */ {IB_CME_CONNECTION_REQUEST_ACKED,\r
--        DAT_CONNECTION_EVENT_ESTABLISHED},\r
--/* 06 */ {IB_CME_DESTINATION_REJECT,\r
--        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
--/* 07 */ {IB_CME_DESTINATION_REJECT_PRIVATE_DATA,\r
--        DAT_CONNECTION_EVENT_PEER_REJECTED},\r
--/* 08 */ {IB_CME_DESTINATION_UNREACHABLE, \r
--        DAT_CONNECTION_EVENT_UNREACHABLE},\r
--/* 09 */ {IB_CME_TOO_MANY_CONNECTION_REQUESTS,\r
--        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
--/* 10 */ {IB_CME_BROKEN, \r
--        DAT_CONNECTION_EVENT_BROKEN},\r
--/* 11 */ {IB_CME_TIMEOUT, \r
--        DAT_CONNECTION_EVENT_TIMED_OUT},\r
--/* 12 */ {IB_CME_LOCAL_FAILURE,               /* always last */\r
--        DAT_CONNECTION_EVENT_BROKEN}\r
--};\r
--\r
--/*\r
-- * dapls_ib_get_cm_event\r
-- *\r
-- * Return a DAT connection event given a provider CM event.\r
-- *\r
-- * Input:\r
-- *    dat_event_num   DAT event we need an equivelent CM event for\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    ib_cm_event of translated DAPL value\r
-- */\r
--DAT_EVENT_NUMBER\r
--dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,\r
--                     IN DAT_BOOLEAN active)\r
--{\r
--      DAT_EVENT_NUMBER dat_event_num;\r
--      int i;\r
--\r
--      active = active;\r
--\r
--      if (ib_cm_event > IB_CME_LOCAL_FAILURE)\r
--              return (DAT_EVENT_NUMBER) 0;\r
--\r
--      dat_event_num = 0;\r
--      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
--              if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {\r
--                      dat_event_num = ib_cm_event_map[i].dat_event_num;\r
--                      break;\r
--              }\r
--      }\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
--                   "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n",\r
--                   active ? "active" : "passive", ib_cm_event, dat_event_num);\r
--\r
--      return dat_event_num;\r
--}\r
--\r
--/*\r
-- * dapls_ib_get_dat_event\r
-- *\r
-- * Return a DAT connection event given a provider CM event.\r
-- * \r
-- * Input:\r
-- *    ib_cm_event     event provided to the dapl callback routine\r
-- *    active          switch indicating active or passive connection\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_EVENT_NUMBER of translated provider value\r
-- */\r
--ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)\r
--{\r
--      ib_cm_events_t ib_cm_event;\r
--      int i;\r
--\r
--      ib_cm_event = 0;\r
--      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
--              if (dat_event_num == ib_cm_event_map[i].dat_event_num) {\r
--                      ib_cm_event = ib_cm_event_map[i].ib_cm_event;\r
--                      break;\r
--              }\r
--      }\r
--      return ib_cm_event;\r
--}\r
-+/*
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+#include "dapl.h"
-+#include "dapl_adapter_util.h"
-+#include "dapl_ib_util.h"
-+#include "dapl_osd.h"
-+
-+#include <stdlib.h>
-+
-+int g_dapl_loopback_connection = 0;
-+
-+#if defined(_WIN64) || defined(_WIN32)
-+#include "..\..\..\..\..\etc\user\comp_channel.cpp"
-+#include <rdma\winverbs.h>
-+
-+int getipaddr_netdev(char *name, char *addr, int addr_len)
-+{
-+      IWVProvider *prov;
-+      WV_DEVICE_ADDRESS devaddr;
-+      struct addrinfo *res, *ai;
-+      HRESULT hr;
-+      int index;
-+
-+      if (strncmp(name, "rdma_dev", 8)) {
-+              return EINVAL;
-+      }
-+
-+      index = atoi(name + 8);
-+
-+      hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov);
-+      if (FAILED(hr)) {
-+              return hr;
-+      }
-+
-+      hr = getaddrinfo("..localmachine", NULL, NULL, &res);
-+      if (hr) {
-+              goto release;
-+      }
-+
-+      for (ai = res; ai; ai = ai->ai_next) {
-+              hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr);
-+              if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) {
-+                      memcpy(addr, ai->ai_addr, ai->ai_addrlen);
-+                      goto free;
-+              }
-+      }
-+      hr = ENODEV;
-+
-+free:
-+      freeaddrinfo(res);
-+release:
-+      prov->lpVtbl->Release(prov);
-+      return hr;
-+}
-+
-+#else                         // _WIN64 || WIN32
-+
-+/* Get IP address using network device name */
-+int getipaddr_netdev(char *name, char *addr, int addr_len)
-+{
-+      struct ifreq ifr;
-+      int skfd, ret, len;
-+
-+      /* Fill in the structure */
-+      snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);
-+      ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;
-+
-+      /* Create a socket fd */
-+      skfd = socket(PF_INET, SOCK_STREAM, 0);
-+      ret = ioctl(skfd, SIOCGIFADDR, &ifr);
-+      if (ret)
-+              goto bail;
-+
-+      switch (ifr.ifr_addr.sa_family) {
-+#ifdef        AF_INET6
-+      case AF_INET6:
-+              len = sizeof(struct sockaddr_in6);
-+              break;
-+#endif
-+      case AF_INET:
-+      default:
-+              len = sizeof(struct sockaddr);
-+              break;
-+      }
-+
-+      if (len <= addr_len)
-+              memcpy(addr, &ifr.ifr_addr, len);
-+      else
-+              ret = EINVAL;
-+
-+      bail:
-+      close(skfd);
-+      return ret;
-+}
-+#endif
-+
-+enum ibv_mtu dapl_ib_mtu(int mtu)
-+{
-+      switch (mtu) {
-+      case 256:
-+              return IBV_MTU_256;
-+      case 512:
-+              return IBV_MTU_512;
-+      case 1024:
-+              return IBV_MTU_1024;
-+      case 2048:
-+              return IBV_MTU_2048;
-+      case 4096:
-+              return IBV_MTU_4096;
-+      default:
-+              return IBV_MTU_1024;
-+      }
-+}
-+
-+char *dapl_ib_mtu_str(enum ibv_mtu mtu)
-+{
-+      switch (mtu) {
-+      case IBV_MTU_256:
-+              return "256";
-+      case IBV_MTU_512:
-+              return "512";
-+      case IBV_MTU_1024:
-+              return "1024";
-+      case IBV_MTU_2048:
-+              return "2048";
-+      case IBV_MTU_4096:
-+              return "4096";
-+      default:
-+              return "1024";
-+      }
-+}
-+
-+DAT_RETURN getlocalipaddr(char *addr, int addr_len)
-+{
-+      struct sockaddr_in *sin;
-+      struct addrinfo *res, hint, *ai;
-+      int ret;
-+      char hostname[256];
-+      char *netdev = getenv("DAPL_SCM_NETDEV");
-+
-+      /* use provided netdev instead of default hostname */
-+      if (netdev != NULL) {
-+              ret = getipaddr_netdev(netdev, addr, addr_len);
-+              if (ret) {                      
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               " getlocalipaddr: DAPL_SCM_NETDEV provided %s"
-+                              " but not configured on system? ERR = %s\n",
-+                              netdev, strerror(ret));
-+                      return dapl_convert_errno(ret, "getlocalipaddr");
-+              } else 
-+                      return DAT_SUCCESS;
-+      }
-+
-+      if (addr_len < sizeof(*sin)) {
-+              return DAT_INTERNAL_ERROR;
-+      }
-+
-+      ret = gethostname(hostname, 256);
-+      if (ret)
-+              return dapl_convert_errno(ret, "gethostname");
-+
-+      memset(&hint, 0, sizeof hint);
-+      hint.ai_flags = AI_PASSIVE;
-+      hint.ai_family = AF_INET;
-+      hint.ai_socktype = SOCK_STREAM;
-+      hint.ai_protocol = IPPROTO_TCP;
-+
-+      ret = getaddrinfo(hostname, NULL, &hint, &res);
-+      if (ret) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret));
-+              return DAT_INVALID_ADDRESS;
-+      }
-+
-+      ret = DAT_INVALID_ADDRESS;
-+      for (ai = res; ai; ai = ai->ai_next) {
-+              sin = (struct sockaddr_in *)ai->ai_addr;
-+              if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) {
-+                      *((struct sockaddr_in *)addr) = *sin;
-+                      ret = DAT_SUCCESS;
-+                      break;
-+              }
-+      }
-+
-+      freeaddrinfo(res);
-+      return ret;
-+}
-+
-+/*
-+ * dapls_ib_query_hca
-+ *
-+ * Query the hca attribute
-+ *
-+ * Input:
-+ *    hca_handl               hca handle      
-+ *    ia_attr                 attribute of the ia
-+ *    ep_attr                 attribute of the ep
-+ *    ip_addr                 ip address of DET NIC
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INVALID_HANDLE
-+ */
-+
-+DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,
-+                            OUT DAT_IA_ATTR * ia_attr,
-+                            OUT DAT_EP_ATTR * ep_attr,
-+                            OUT DAT_SOCK_ADDR6 * ip_addr)
-+{
-+      struct ibv_device_attr dev_attr;
-+      struct ibv_port_attr port_attr;
-+
-+      if (hca_ptr->ib_hca_handle == NULL) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");
-+              return (DAT_INVALID_HANDLE);
-+      }
-+
-+      /* local IP address of device, set during ia_open */
-+      if (ip_addr != NULL)
-+              memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));
-+
-+      if (ia_attr == NULL && ep_attr == NULL)
-+              return DAT_SUCCESS;
-+
-+      /* query verbs for this device and port attributes */
-+      if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||
-+          ibv_query_port(hca_ptr->ib_hca_handle,
-+                         hca_ptr->port_num, &port_attr))
-+              return (dapl_convert_errno(errno, "ib_query_hca"));
-+
-+      if (ia_attr != NULL) {
-+              (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));
-+              ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
-+              ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
-+              ia_attr->ia_address_ptr =
-+                  (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;
-+
-+              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-+                           " query_hca: %s %s \n",
-+                           ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-+                           inet_ntoa(((struct sockaddr_in *)
-+                                      &hca_ptr->hca_address)->sin_addr));
-+
-+              ia_attr->hardware_version_major = dev_attr.hw_ver;
-+              /* ia_attr->hardware_version_minor   = dev_attr.fw_ver; */
-+              ia_attr->max_eps = dev_attr.max_qp;
-+              ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;
-+              ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
-+              ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
-+              ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;
-+              ia_attr->max_rdma_read_per_ep_out =
-+                  dev_attr.max_qp_init_rd_atom;
-+              ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;
-+              ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;
-+              ia_attr->max_evds = dev_attr.max_cq;
-+              ia_attr->max_evd_qlen = dev_attr.max_cqe;
-+              ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;
-+              ia_attr->max_lmrs = dev_attr.max_mr;
-+              /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */
-+              ia_attr->max_lmr_block_size = 
-+                  (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;
-+              ia_attr->max_rmrs = dev_attr.max_mw;
-+              ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;
-+              ia_attr->max_rmr_target_address = dev_attr.max_mr_size;
-+              ia_attr->max_pzs = dev_attr.max_pd;
-+              ia_attr->max_message_size = port_attr.max_msg_sz;
-+              ia_attr->max_rdma_size = port_attr.max_msg_sz;
-+              /* iWARP spec. - 1 sge for RDMA reads */
-+              if (hca_ptr->ib_hca_handle->device->transport_type
-+                  == IBV_TRANSPORT_IWARP)
-+                      ia_attr->max_iov_segments_per_rdma_read = 1;
-+              else
-+                      ia_attr->max_iov_segments_per_rdma_read =
-+                          dev_attr.max_sge;
-+              ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;
-+              ia_attr->num_transport_attr = 0;
-+              ia_attr->transport_attr = NULL;
-+              ia_attr->num_vendor_attr = 0;
-+              ia_attr->vendor_attr = NULL;
-+#ifdef DAT_EXTENSIONS
-+              ia_attr->extension_supported = DAT_EXTENSION_IB;
-+              ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;
-+#endif
-+              /* save key device attributes for CM exchange */
-+              hca_ptr->ib_trans.rd_atom_in  = dev_attr.max_qp_rd_atom;
-+              hca_ptr->ib_trans.rd_atom_out = dev_attr.max_qp_init_rd_atom;
-+              
-+              hca_ptr->ib_trans.mtu = DAPL_MIN(port_attr.active_mtu,
-+                                               hca_ptr->ib_trans.mtu);
-+              hca_ptr->ib_trans.ack_timer =
-+                  DAPL_MAX(dev_attr.local_ca_ack_delay,
-+                           hca_ptr->ib_trans.ack_timer);
-+
-+              /* set MTU in transport specific named attribute */
-+              hca_ptr->ib_trans.named_attr.name = "DAT_IB_TRANSPORT_MTU";
-+              hca_ptr->ib_trans.named_attr.value =
-+                  dapl_ib_mtu_str(hca_ptr->ib_trans.mtu);
-+
-+              if (hca_ptr->ib_hca_handle->device->transport_type != IBV_TRANSPORT_IB)
-+                      goto skip_ib;
-+
-+               /* set SL, PKEY values, defaults = 0 */
-+               hca_ptr->ib_trans.pkey_idx = 0;
-+               hca_ptr->ib_trans.pkey = htons(dapl_os_get_env_val("DAPL_IB_PKEY", 0));
-+               hca_ptr->ib_trans.sl = dapl_os_get_env_val("DAPL_IB_SL", 0);
-+
-+              /* index provided, get pkey; pkey provided, get index */
-+              if (hca_ptr->ib_trans.pkey) {
-+                      int i; uint16_t pkey = 0;
-+                      for (i=0; i < dev_attr.max_pkeys; i++) {
-+                              if (ibv_query_pkey(hca_ptr->ib_hca_handle,
-+                                                 hca_ptr->port_num,
-+                                                 i, &pkey)) {
-+                                      i = dev_attr.max_pkeys;
-+                                      break;
-+                              }
-+                              if (pkey == hca_ptr->ib_trans.pkey) {
-+                                      hca_ptr->ib_trans.pkey_idx = i;
-+                                      break;
-+                              }
-+                      }
-+                      if (i == dev_attr.max_pkeys) {
-+                              dapl_log(DAPL_DBG_TYPE_ERR,
-+                                       " ERR: new pkey(0x%x), query (%s)"
-+                                       " err or key !found, using default pkey_idx=0\n",
-+                                       ntohs(hca_ptr->ib_trans.pkey), strerror(errno));
-+                      }
-+              }
-+skip_ib:
-+
-+#ifdef DEFINE_ATTR_LINK_LAYER
-+#ifndef _OPENIB_CMA_
-+              if (port_attr.link_layer == IBV_LINK_LAYER_ETHERNET)
-+                      hca_ptr->ib_trans.global = 1;
-+
-+              dapl_log(DAPL_DBG_TYPE_UTIL,
-+                       " query_hca: port.link_layer = 0x%x\n", 
-+                       port_attr.link_layer);
-+#endif
-+#endif
-+              dapl_log(DAPL_DBG_TYPE_UTIL,
-+                           " query_hca: (%x.%x) eps %d, sz %d evds %d,"
-+                           " sz %d mtu %d - pkey %x p_idx %d sl %d\n",
-+                           ia_attr->hardware_version_major,
-+                           ia_attr->hardware_version_minor,
-+                           ia_attr->max_eps, ia_attr->max_dto_per_ep,
-+                           ia_attr->max_evds, ia_attr->max_evd_qlen,
-+                           128 << hca_ptr->ib_trans.mtu,
-+                           ntohs(hca_ptr->ib_trans.pkey),
-+                           hca_ptr->ib_trans.pkey_idx,
-+                           hca_ptr->ib_trans.sl);
-+
-+              dapl_log(DAPL_DBG_TYPE_UTIL,
-+                           " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d"
-+                           " ack_time %d mr %u\n",
-+                           ia_attr->max_message_size, ia_attr->max_rdma_size,
-+                           ia_attr->max_iov_segments_per_dto,
-+                           ia_attr->max_lmrs, ia_attr->max_rmrs,
-+                           hca_ptr->ib_trans.ack_timer,
-+                           ia_attr->max_lmr_block_size);
-+      }
-+
-+      if (ep_attr != NULL) {
-+              (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));
-+              ep_attr->max_message_size = port_attr.max_msg_sz;
-+              ep_attr->max_rdma_size = port_attr.max_msg_sz;
-+              ep_attr->max_recv_dtos = dev_attr.max_qp_wr;
-+              ep_attr->max_request_dtos = dev_attr.max_qp_wr;
-+              ep_attr->max_recv_iov = dev_attr.max_sge;
-+              ep_attr->max_request_iov = dev_attr.max_sge;
-+              ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
-+              ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
-+              ep_attr->max_rdma_read_iov = dev_attr.max_sge;
-+              ep_attr->max_rdma_write_iov = dev_attr.max_sge;
-+              dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-+                           " query_hca: MAX msg %llu mtu %d qsz %d iov %d"
-+                           " rdma i%d,o%d\n",
-+                           ep_attr->max_message_size,
-+                           128 << hca_ptr->ib_trans.mtu,
-+                           ep_attr->max_recv_dtos, 
-+                           ep_attr->max_recv_iov,
-+                           ep_attr->max_rdma_read_in,
-+                           ep_attr->max_rdma_read_out);
-+      }
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_ib_setup_async_callback
-+ *
-+ * Set up an asynchronous callbacks of various kinds
-+ *
-+ * Input:
-+ *    ia_handle               IA handle
-+ *    handler_type            type of handler to set up
-+ *    callback_handle         handle param for completion callbacks
-+ *    callback                callback routine pointer
-+ *    context                 argument for callback routine
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INVALID_PARAMETER
-+ *
-+ */
-+DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,
-+                                       IN DAPL_ASYNC_HANDLER_TYPE
-+                                       handler_type, IN DAPL_EVD * evd_ptr,
-+                                       IN ib_async_handler_t callback,
-+                                       IN void *context)
-+{
-+      ib_hca_transport_t *hca_ptr;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-+                   " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n",
-+                   ia_ptr, handler_type, evd_ptr, callback, context);
-+
-+      hca_ptr = &ia_ptr->hca_ptr->ib_trans;
-+      switch (handler_type) {
-+      case DAPL_ASYNC_UNAFILIATED:
-+              hca_ptr->async_unafiliated = (ib_async_handler_t) callback;
-+              hca_ptr->async_un_ctx = context;
-+              break;
-+      case DAPL_ASYNC_CQ_ERROR:
-+              hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;
-+              break;
-+      case DAPL_ASYNC_CQ_COMPLETION:
-+              hca_ptr->async_cq = (ib_async_dto_handler_t) callback;
-+              break;
-+      case DAPL_ASYNC_QP_ERROR:
-+              hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;
-+              break;
-+      default:
-+              break;
-+      }
-+      return DAT_SUCCESS;
-+}
-+
-+void dapli_async_event_cb(struct _ib_hca_transport *hca)
-+{
-+      struct ibv_async_event event;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca);
-+
-+      if (hca->destroy)
-+              return;
-+
-+      if (!ibv_get_async_event(hca->ib_ctx, &event)) {
-+
-+              switch (event.event_type) {
-+              case IBV_EVENT_CQ_ERR:
-+              {
-+                      struct dapl_ep *evd_ptr =
-+                              event.element.cq->cq_context;
-+
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               "dapl async_event CQ (%p) ERR %d\n",
-+                               evd_ptr, event.event_type);
-+
-+                      /* report up if async callback still setup */
-+                      if (hca->async_cq_error)
-+                              hca->async_cq_error(hca->ib_ctx,
-+                                                  event.element.cq,
-+                                                  &event,
-+                                                  (void *)evd_ptr);
-+                      break;
-+              }
-+              case IBV_EVENT_COMM_EST:
-+              {
-+                      /* Received msgs on connected QP before RTU */
-+                      dapl_log(DAPL_DBG_TYPE_UTIL,
-+                               " async_event COMM_EST(%p) rdata beat RTU\n",
-+                               event.element.qp);
-+
-+                      break;
-+              }
-+              case IBV_EVENT_QP_FATAL:
-+              case IBV_EVENT_QP_REQ_ERR:
-+              case IBV_EVENT_QP_ACCESS_ERR:
-+              case IBV_EVENT_QP_LAST_WQE_REACHED:
-+              case IBV_EVENT_SRQ_ERR:
-+              case IBV_EVENT_SRQ_LIMIT_REACHED:
-+              case IBV_EVENT_SQ_DRAINED:
-+              {
-+                      struct dapl_ep *ep_ptr =
-+                              event.element.qp->qp_context;
-+
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               "dapl async_event QP (%p) ERR %d\n",
-+                               ep_ptr, event.event_type);
-+
-+                      /* report up if async callback still setup */
-+                      if (hca->async_qp_error)
-+                              hca->async_qp_error(hca->ib_ctx,
-+                                                  ep_ptr->qp_handle,
-+                                                  &event,
-+                                                  (void *)ep_ptr);
-+                      break;
-+              }
-+              case IBV_EVENT_PATH_MIG:
-+              case IBV_EVENT_PATH_MIG_ERR:
-+              case IBV_EVENT_DEVICE_FATAL:
-+              case IBV_EVENT_PORT_ACTIVE:
-+              case IBV_EVENT_PORT_ERR:
-+              case IBV_EVENT_LID_CHANGE:
-+              case IBV_EVENT_PKEY_CHANGE:
-+              case IBV_EVENT_SM_CHANGE:
-+              {
-+                      dapl_log(DAPL_DBG_TYPE_WARN,
-+                               "dapl async_event: DEV ERR %d\n",
-+                               event.event_type);
-+
-+                      /* report up if async callback still setup */
-+                      if (hca->async_unafiliated)
-+                              hca->async_unafiliated(hca->ib_ctx, 
-+                                                     &event,  
-+                                                     hca->async_un_ctx);
-+                      break;
-+              }
-+              case IBV_EVENT_CLIENT_REREGISTER:
-+                      /* no need to report this event this time */
-+                      dapl_log(DAPL_DBG_TYPE_UTIL,
-+                               " async_event: IBV_CLIENT_REREGISTER\n");
-+                      break;
-+
-+              default:
-+                      dapl_log(DAPL_DBG_TYPE_WARN,
-+                               "dapl async_event: %d UNKNOWN\n",
-+                               event.event_type);
-+                      break;
-+
-+              }
-+              ibv_ack_async_event(&event);
-+      }
-+}
-+
-+/*
-+ * dapls_set_provider_specific_attr
-+ *
-+ * Input:
-+ *      attr_ptr        Pointer provider specific attributes
-+ *
-+ * Output:
-+ *      none
-+ *
-+ * Returns:
-+ *      void
-+ */
-+DAT_NAMED_ATTR ib_attrs[] = {
-+      {
-+       "DAT_IB_TRANSPORT_MTU", "2048"}
-+      ,
-+#ifdef DAT_EXTENSIONS
-+      {
-+       "DAT_EXTENSION_INTERFACE", "TRUE"}
-+      ,
-+      {
-+       DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}
-+      ,
-+      {
-+       DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}
-+      ,
-+      {
-+       DAT_IB_ATTR_IMMED_DATA, "TRUE"}
-+      ,
-+#ifndef _OPENIB_CMA_
-+      {
-+       DAT_IB_ATTR_UD, "TRUE"}
-+      ,
-+#endif
-+#ifdef DAPL_COUNTERS
-+      {
-+       DAT_ATTR_COUNTERS, "TRUE"}
-+      ,
-+#endif                                /* DAPL_COUNTERS */
-+#endif
-+};
-+
-+#define SPEC_ATTR_SIZE( x )     (sizeof( x ) / sizeof( DAT_NAMED_ATTR))
-+
-+void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,
-+                                      IN DAT_PROVIDER_ATTR * attr_ptr)
-+{
-+      attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);
-+      attr_ptr->provider_specific_attr = ib_attrs;
-+
-+      /* set MTU to actual settings */
-+      ib_attrs[0].value = ia_ptr->hca_ptr->ib_trans.named_attr.value;
-+}
-+
-+/*
-+ * Map all socket CM event codes to the DAT equivelent. Common to all providers
-+ */
-+#define DAPL_IB_EVENT_CNT     13
-+
-+static struct ib_cm_event_map {
-+      const ib_cm_events_t ib_cm_event;
-+      DAT_EVENT_NUMBER dat_event_num;
-+} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {
-+/* 00 */ {IB_CME_CONNECTED, 
-+        DAT_CONNECTION_EVENT_ESTABLISHED},
-+/* 01 */ {IB_CME_DISCONNECTED, 
-+        DAT_CONNECTION_EVENT_DISCONNECTED},
-+/* 02 */ {IB_CME_DISCONNECTED_ON_LINK_DOWN,
-+        DAT_CONNECTION_EVENT_DISCONNECTED},
-+/* 03 */ {IB_CME_CONNECTION_REQUEST_PENDING, 
-+        DAT_CONNECTION_REQUEST_EVENT},
-+/* 04 */ {IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
-+        DAT_CONNECTION_REQUEST_EVENT},
-+/* 05 */ {IB_CME_CONNECTION_REQUEST_ACKED,
-+        DAT_CONNECTION_EVENT_ESTABLISHED},
-+/* 06 */ {IB_CME_DESTINATION_REJECT,
-+        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-+/* 07 */ {IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
-+        DAT_CONNECTION_EVENT_PEER_REJECTED},
-+/* 08 */ {IB_CME_DESTINATION_UNREACHABLE, 
-+        DAT_CONNECTION_EVENT_UNREACHABLE},
-+/* 09 */ {IB_CME_TOO_MANY_CONNECTION_REQUESTS,
-+        DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-+/* 10 */ {IB_CME_BROKEN, 
-+        DAT_CONNECTION_EVENT_BROKEN},
-+/* 11 */ {IB_CME_TIMEOUT, 
-+        DAT_CONNECTION_EVENT_TIMED_OUT},
-+/* 12 */ {IB_CME_LOCAL_FAILURE,               /* always last */
-+        DAT_CONNECTION_EVENT_BROKEN}
-+};
-+
-+/*
-+ * dapls_ib_get_cm_event
-+ *
-+ * Return a DAT connection event given a provider CM event.
-+ *
-+ * Input:
-+ *    dat_event_num   DAT event we need an equivelent CM event for
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    ib_cm_event of translated DAPL value
-+ */
-+DAT_EVENT_NUMBER
-+dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,
-+                     IN DAT_BOOLEAN active)
-+{
-+      DAT_EVENT_NUMBER dat_event_num;
-+      int i;
-+
-+      active = active;
-+
-+      if (ib_cm_event > IB_CME_LOCAL_FAILURE)
-+              return (DAT_EVENT_NUMBER) 0;
-+
-+      dat_event_num = 0;
-+      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
-+              if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {
-+                      dat_event_num = ib_cm_event_map[i].dat_event_num;
-+                      break;
-+              }
-+      }
-+      dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-+                   "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n",
-+                   active ? "active" : "passive", ib_cm_event, dat_event_num);
-+
-+      return dat_event_num;
-+}
-+
-+/*
-+ * dapls_ib_get_dat_event
-+ *
-+ * Return a DAT connection event given a provider CM event.
-+ * 
-+ * Input:
-+ *    ib_cm_event     event provided to the dapl callback routine
-+ *    active          switch indicating active or passive connection
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_EVENT_NUMBER of translated provider value
-+ */
-+ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)
-+{
-+      ib_cm_events_t ib_cm_event;
-+      int i;
-+
-+      ib_cm_event = 0;
-+      for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
-+              if (dat_event_num == ib_cm_event_map[i].dat_event_num) {
-+                      ib_cm_event = ib_cm_event_map[i].ib_cm_event;
-+                      break;
-+              }
-+      }
-+      return ib_cm_event;
-+}
-diff --git a/trunk/ulp/dapl2/dapl/openib_scm/cm.c b/trunk/ulp/dapl2/dapl/openib_scm/cm.c
-index 24065ce..56d4c73 100644
---- a/trunk/ulp/dapl2/dapl/openib_scm/cm.c
-+++ b/trunk/ulp/dapl2/dapl/openib_scm/cm.c
-@@ -1,1927 +1,1927 @@
--/*\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--/***************************************************************************\r
-- *\r
-- *   Module:           uDAPL\r
-- *\r
-- *   Filename:                 dapl_ib_cm.c\r
-- *\r
-- *   Author:           Arlin Davis\r
-- *\r
-- *   Created:          3/10/2005\r
-- *\r
-- *   Description: \r
-- *\r
-- *   The uDAPL openib provider - connection management\r
-- *\r
-- ****************************************************************************\r
-- *               Source Control System Information\r
-- *\r
-- *    $Id: $\r
-- *\r
-- *    Copyright (c) 2005 Intel Corporation.  All rights reserved.\r
-- *\r
-- **************************************************************************/\r
--\r
--#if defined(_WIN32)\r
--#define FD_SETSIZE 1024\r
--#define DAPL_FD_SETSIZE FD_SETSIZE\r
--#endif\r
--\r
--#include "dapl.h"\r
--#include "dapl_adapter_util.h"\r
--#include "dapl_evd_util.h"\r
--#include "dapl_cr_util.h"\r
--#include "dapl_name_service.h"\r
--#include "dapl_ib_util.h"\r
--#include "dapl_ep_util.h"\r
--#include "dapl_osd.h"\r
--\r
--/* forward declarations */\r
--static DAT_RETURN\r
--dapli_socket_connect(DAPL_EP * ep_ptr,\r
--                   DAT_IA_ADDRESS_PTR r_addr,\r
--                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data);\r
--\r
--#ifdef DAPL_DBG\r
--/* Check for EP linking to IA and proper connect state */\r
--void dapli_ep_check(DAPL_EP *ep)\r
--{\r
--      DAPL_IA *ia_ptr = ep->header.owner_ia;\r
--      DAPL_EP *ep_ptr, *next_ep_ptr;\r
--      int found = 0;\r
--\r
--      dapl_os_lock(&ia_ptr->header.lock);\r
--      ep_ptr = (dapl_llist_is_empty (&ia_ptr->ep_list_head)\r
--              ? NULL : dapl_llist_peek_head (&ia_ptr->ep_list_head));\r
--\r
--      while (ep_ptr != NULL) {\r
--              next_ep_ptr = \r
--                      dapl_llist_next_entry(&ia_ptr->ep_list_head,\r
--                                            &ep_ptr->header.ia_list_entry);\r
--              if (ep == ep_ptr) {\r
--                      found++;\r
--                      if ((ep->cr_ptr && ep->param.ep_state \r
--                              != DAT_EP_STATE_COMPLETION_PENDING) ||\r
--                          (!ep->cr_ptr && ep->param.ep_state \r
--                              != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING))\r
--                              goto err;\r
--                      else \r
--                              goto match;\r
--              }\r
--              ep_ptr = next_ep_ptr;\r
--      }\r
--err:\r
--      dapl_log(DAPL_DBG_TYPE_ERR,\r
--               " dapli_ep_check ERR: %s %s ep=%p state=%d magic=0x%x\n", \r
--               ep->cr_ptr ? "PASSIVE":"ACTIVE", \r
--               found ? "WRONG_STATE":"NOT_FOUND" ,\r
--               ep, ep->param.ep_state, ep->header.magic);\r
--match:\r
--      dapl_os_unlock(&ia_ptr->header.lock);\r
--      return;\r
--}\r
--#else\r
--#define dapli_ep_check(ep)\r
--#endif\r
--\r
--#if defined(_WIN32) || defined(_WIN64)\r
--enum DAPL_FD_EVENTS {\r
--      DAPL_FD_READ = 0x1,\r
--      DAPL_FD_WRITE = 0x2,\r
--      DAPL_FD_ERROR = 0x4\r
--};\r
--\r
--static int dapl_config_socket(DAPL_SOCKET s)\r
--{\r
--      unsigned long nonblocking = 1;\r
--      int ret, opt = 1;\r
--\r
--      ret = ioctlsocket(s, FIONBIO, &nonblocking);\r
--\r
--      /* no delay for small packets */\r
--      if (!ret)\r
--              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, \r
--                               (char *)&opt, sizeof(opt));\r
--      return ret;\r
--}\r
--\r
--static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,\r
--                             int addrlen)\r
--{\r
--      int err;\r
--\r
--      err = connect(s, addr, addrlen);\r
--      if (err == SOCKET_ERROR)\r
--              err = WSAGetLastError();\r
--      return (err == WSAEWOULDBLOCK) ? EAGAIN : err;\r
--}\r
--\r
--struct dapl_fd_set {\r
--      struct fd_set set[3];\r
--};\r
--\r
--static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
--{\r
--      return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
--}\r
--\r
--static void dapl_fd_zero(struct dapl_fd_set *set)\r
--{\r
--      FD_ZERO(&set->set[0]);\r
--      FD_ZERO(&set->set[1]);\r
--      FD_ZERO(&set->set[2]);\r
--}\r
--\r
--static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
--                     enum DAPL_FD_EVENTS event)\r
--{\r
--      FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);\r
--      FD_SET(s, &set->set[2]);\r
--      return 0;\r
--}\r
--\r
--static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
--{\r
--      struct fd_set rw_fds;\r
--      struct fd_set err_fds;\r
--      struct timeval tv;\r
--      int ret;\r
--\r
--      FD_ZERO(&rw_fds);\r
--      FD_ZERO(&err_fds);\r
--      FD_SET(s, &rw_fds);\r
--      FD_SET(s, &err_fds);\r
--\r
--      tv.tv_sec = 0;\r
--      tv.tv_usec = 0;\r
--\r
--      if (event == DAPL_FD_READ)\r
--              ret = select(1, &rw_fds, NULL, &err_fds, &tv);\r
--      else\r
--              ret = select(1, NULL, &rw_fds, &err_fds, &tv);\r
--\r
--      if (ret == 0)\r
--              return 0;\r
--      else if (ret == SOCKET_ERROR)\r
--              return DAPL_FD_ERROR;\r
--      else if (FD_ISSET(s, &rw_fds))\r
--              return event;\r
--      else\r
--              return DAPL_FD_ERROR;\r
--}\r
--\r
--static int dapl_select(struct dapl_fd_set *set)\r
--{\r
--      int ret;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n");\r
--      ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL);\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n");\r
--\r
--      if (ret == SOCKET_ERROR)\r
--              dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
--                           " dapl_select: error 0x%x\n", WSAGetLastError());\r
--\r
--      return ret;\r
--}\r
--\r
--static int dapl_socket_errno(void)\r
--{\r
--      int err;\r
--\r
--      err = WSAGetLastError();\r
--      switch (err) {\r
--      case WSAEACCES:\r
--      case WSAEADDRINUSE:\r
--              return EADDRINUSE;\r
--      case WSAECONNRESET:\r
--              return ECONNRESET;\r
--      default:\r
--              return err;\r
--      }\r
--}\r
--#else                         // _WIN32 || _WIN64\r
--enum DAPL_FD_EVENTS {\r
--      DAPL_FD_READ = POLLIN,\r
--      DAPL_FD_WRITE = POLLOUT,\r
--      DAPL_FD_ERROR = POLLERR\r
--};\r
--\r
--static int dapl_config_socket(DAPL_SOCKET s)\r
--{\r
--      int ret, opt = 1;\r
--\r
--      /* non-blocking */\r
--      ret = fcntl(s, F_GETFL);\r
--      if (ret >= 0)\r
--              ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);\r
--\r
--      /* no delay for small packets */\r
--      if (!ret)\r
--              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, \r
--                               (char *)&opt, sizeof(opt));\r
--      return ret;\r
--}\r
--\r
--static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,\r
--                             int addrlen)\r
--{\r
--      int ret;\r
--\r
--      ret = connect(s, addr, addrlen);\r
--\r
--      return (errno == EINPROGRESS) ? EAGAIN : ret;\r
--}\r
--\r
--struct dapl_fd_set {\r
--      int index;\r
--      struct pollfd set[DAPL_FD_SETSIZE];\r
--};\r
--\r
--static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
--{\r
--      return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
--}\r
--\r
--static void dapl_fd_zero(struct dapl_fd_set *set)\r
--{\r
--      set->index = 0;\r
--}\r
--\r
--static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
--                     enum DAPL_FD_EVENTS event)\r
--{\r
--      if (set->index == DAPL_FD_SETSIZE - 1) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",\r
--                       set->index + 1);\r
--              return -1;\r
--      }\r
--\r
--      set->set[set->index].fd = s;\r
--      set->set[set->index].revents = 0;\r
--      set->set[set->index++].events = event;\r
--      return 0;\r
--}\r
--\r
--static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
--{\r
--      struct pollfd fds;\r
--      int ret;\r
--\r
--      fds.fd = s;\r
--      fds.events = event;\r
--      fds.revents = 0;\r
--      ret = poll(&fds, 1, 0);\r
--      dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",\r
--               s, ret, fds.revents);\r
--      if (ret == 0)\r
--              return 0;\r
--      else if (ret < 0 || (fds.revents & (POLLERR | POLLHUP | POLLNVAL))) \r
--              return DAPL_FD_ERROR;\r
--      else \r
--              return event;\r
--}\r
--\r
--static int dapl_select(struct dapl_fd_set *set)\r
--{\r
--      int ret;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index);\r
--      ret = poll(set->set, set->index, -1);\r
--      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret);\r
--      return ret;\r
--}\r
--\r
--#define dapl_socket_errno() errno\r
--#endif\r
--\r
--static void dapli_cm_thread_signal(dp_ib_cm_handle_t cm_ptr) \r
--{\r
--      if (cm_ptr->hca)\r
--              send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0);\r
--}\r
--\r
--static void dapli_cm_free(dp_ib_cm_handle_t cm_ptr) \r
--{\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_FREE;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--      dapli_cm_thread_signal(cm_ptr);\r
--}\r
--\r
--static void dapli_cm_dealloc(dp_ib_cm_handle_t cm_ptr) \r
--{\r
--      dapl_os_assert(!cm_ptr->ref_count);\r
--      \r
--      if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
--              shutdown(cm_ptr->socket, SHUT_RDWR);\r
--              closesocket(cm_ptr->socket);\r
--      }\r
--      if (cm_ptr->ah) \r
--              ibv_destroy_ah(cm_ptr->ah);\r
--      \r
--      dapl_os_lock_destroy(&cm_ptr->lock);\r
--      dapl_os_wait_object_destroy(&cm_ptr->event);\r
--      dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
--}\r
--\r
--void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->ref_count++;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--}\r
--\r
--void dapls_cm_release(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->ref_count--;\r
--      if (cm_ptr->ref_count) {\r
--                dapl_os_unlock(&cm_ptr->lock);\r
--              return;\r
--      }\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--      dapli_cm_dealloc(cm_ptr);\r
--}\r
--\r
--static dp_ib_cm_handle_t dapli_cm_alloc(DAPL_EP *ep_ptr)\r
--{\r
--      dp_ib_cm_handle_t cm_ptr;\r
--\r
--      /* Allocate CM, init lock, and initialize */\r
--      if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL)\r
--              return NULL;\r
--\r
--      (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));\r
--      if (dapl_os_lock_init(&cm_ptr->lock))\r
--              goto bail;\r
--\r
--      if (dapl_os_wait_object_init(&cm_ptr->event)) {\r
--              dapl_os_lock_destroy(&cm_ptr->lock);\r
--              goto bail;\r
--      }\r
--      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->list_entry);\r
--      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);\r
--\r
--      cm_ptr->msg.ver = htons(DCM_VER);\r
--      cm_ptr->socket = DAPL_INVALID_SOCKET;\r
--      dapls_cm_acquire(cm_ptr);\r
--              \r
--      /* Link EP and CM */\r
--      if (ep_ptr != NULL) {\r
--              dapl_ep_link_cm(ep_ptr, cm_ptr); /* ref++ */\r
--              cm_ptr->ep = ep_ptr;\r
--              cm_ptr->hca = ((DAPL_IA *)ep_ptr->param.ia_handle)->hca_ptr;\r
--      }\r
--      return cm_ptr;\r
--bail:\r
--      dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
--      return NULL;\r
--}\r
--\r
--/* queue socket for processing CM work */\r
--static void dapli_cm_queue(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      /* add to work queue for cr thread processing */\r
--      dapl_os_lock(&cm_ptr->hca->ib_trans.lock);\r
--      dapls_cm_acquire(cm_ptr);\r
--      dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list,\r
--                          (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry, cm_ptr);\r
--      dapl_os_unlock(&cm_ptr->hca->ib_trans.lock);\r
--      dapli_cm_thread_signal(cm_ptr);\r
--}\r
--\r
--/* called with local LIST lock */\r
--static void dapli_cm_dequeue(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      /* Remove from work queue, cr thread processing */\r
--      dapl_llist_remove_entry(&cm_ptr->hca->ib_trans.list,\r
--                              (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);\r
--      dapls_cm_release(cm_ptr);\r
--}\r
--\r
--/* BLOCKING: called from dapl_ep_free, EP link will be last ref */\r
--void dapls_cm_free(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      dapl_log(DAPL_DBG_TYPE_CM,\r
--               " cm_free: cm %p %s ep %p refs=%d\n", \r
--               cm_ptr, dapl_cm_state_str(cm_ptr->state),\r
--               cm_ptr->ep, cm_ptr->ref_count);\r
--      \r
--      /* free from internal workq, wait until EP is last ref */\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_FREE;\r
--      while (cm_ptr->ref_count != 1) {\r
--              dapli_cm_thread_signal(cm_ptr);\r
--              dapl_os_unlock(&cm_ptr->lock);\r
--              dapl_os_sleep_usec(10000);\r
--              dapl_os_lock(&cm_ptr->lock);\r
--      }\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      /* unlink, dequeue from EP. Final ref so release will destroy */\r
--      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);\r
--}\r
--\r
--/*\r
-- * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect\r
-- *                 or from ep_free. \r
-- */\r
--DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      DAT_UINT32 disc_data = htonl(0xdead);\r
--\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      if (cm_ptr->state != DCM_CONNECTED || \r
--          cm_ptr->state == DCM_DISCONNECTED) {\r
--              dapl_os_unlock(&cm_ptr->lock);\r
--              return DAT_SUCCESS;\r
--      }\r
--      cm_ptr->state = DCM_DISCONNECTED;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--      \r
--      /* send disc date, close socket, schedule destroy */\r
--      send(cm_ptr->socket, (char *)&disc_data, sizeof(disc_data), 0);\r
--\r
--      /* disconnect events for RC's only */\r
--      if (cm_ptr->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
--              dapl_os_lock(&cm_ptr->ep->header.lock);\r
--              dapls_modify_qp_state(cm_ptr->ep->qp_handle, IBV_QPS_ERR, 0,0,0);\r
--              dapl_os_unlock(&cm_ptr->ep->header.lock);\r
--              if (cm_ptr->ep->cr_ptr) {\r
--                      dapls_cr_callback(cm_ptr,\r
--                                        IB_CME_DISCONNECTED,\r
--                                        NULL, 0, cm_ptr->sp);\r
--              } else {\r
--                      dapl_evd_connection_callback(cm_ptr,\r
--                                                   IB_CME_DISCONNECTED,\r
--                                                   NULL, 0, cm_ptr->ep);\r
--              }\r
--      }\r
--      \r
--      /* release from workq */\r
--      dapli_cm_free(cm_ptr);\r
--\r
--      /* scheduled destroy via disconnect clean in callback */\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * ACTIVE: socket connected, send QP information to peer \r
-- */\r
--static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)\r
--{\r
--      int len, exp;\r
--      struct iovec iov[2];\r
--      struct dapl_ep *ep_ptr = cm_ptr->ep;\r
--\r
--      if (err) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_PENDING: %s ERR %s -> %s %d - %s\n",\r
--                       err == -1 ? "POLL" : "SOCKOPT",\r
--                       err == -1 ? strerror(dapl_socket_errno()) : strerror(err), \r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                              &cm_ptr->addr)->sin_addr), \r
--                       ntohs(((struct sockaddr_in *)\r
--                              &cm_ptr->addr)->sin_port),\r
--                       err == ETIMEDOUT ? "RETRYING...":"ABORTING");\r
--\r
--              /* retry a timeout */\r
--              if (err == ETIMEDOUT) {\r
--                      closesocket(cm_ptr->socket);\r
--                      cm_ptr->socket = DAPL_INVALID_SOCKET;\r
--                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, \r
--                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,\r
--                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);\r
--                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);\r
--                      dapli_cm_free(cm_ptr);\r
--                      return;\r
--              }\r
--\r
--              goto bail;\r
--      }\r
--\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_REP_PENDING;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      /* send qp info and pdata to remote peer */\r
--      exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
--      iov[0].iov_base = (void *)&cm_ptr->msg;\r
--      iov[0].iov_len = exp;\r
--      if (cm_ptr->msg.p_size) {\r
--              iov[1].iov_base = cm_ptr->msg.p_data;\r
--              iov[1].iov_len = ntohs(cm_ptr->msg.p_size);\r
--              len = writev(cm_ptr->socket, iov, 2);\r
--      } else {\r
--              len = writev(cm_ptr->socket, iov, 1);\r
--      }\r
--\r
--      if (len != (exp + ntohs(cm_ptr->msg.p_size))) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_PENDING len ERR 0x%x %s, wcnt=%d(%d) -> %s\n",\r
--                       err, strerror(err), len, \r
--                       exp + ntohs(cm_ptr->msg.p_size), \r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                 ep_ptr->param.\r
--                                 remote_ia_address_ptr)->sin_addr));\r
--              goto bail;\r
--      }\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " CONN_PENDING: sending SRC lid=0x%x,"\r
--                   " qpn=0x%x, psize=%d\n",\r
--                   ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                   ntohl(cm_ptr->msg.saddr.ib.qpn), \r
--                   ntohs(cm_ptr->msg.p_size));\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " CONN_PENDING: SRC GID subnet %016llx id %016llx\n",\r
--                   (unsigned long long)\r
--                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[0]),\r
--                   (unsigned long long)\r
--                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[8]));\r
--      return;\r
--\r
--bail:\r
--      /* mark CM object for cleanup */\r
--      dapli_cm_free(cm_ptr);\r
--      dapl_evd_connection_callback(NULL, IB_CME_LOCAL_FAILURE, NULL, 0, ep_ptr);\r
--}\r
--\r
--/*\r
-- * ACTIVE: Create socket, connect, defer exchange QP information to CR thread\r
-- * to avoid blocking. \r
-- */\r
--static DAT_RETURN\r
--dapli_socket_connect(DAPL_EP * ep_ptr,\r
--                   DAT_IA_ADDRESS_PTR r_addr,\r
--                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data)\r
--{\r
--      dp_ib_cm_handle_t cm_ptr;\r
--      int ret;\r
--      socklen_t sl;\r
--      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
--      DAT_RETURN dat_ret = DAT_INSUFFICIENT_RESOURCES;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n",\r
--                   r_qual, p_size);\r
--\r
--      cm_ptr = dapli_cm_alloc(ep_ptr);\r
--      if (cm_ptr == NULL)\r
--              return dat_ret;\r
--\r
--      /* create, connect, sockopt, and exchange QP information */\r
--      if ((cm_ptr->socket =\r
--           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " connect: socket create ERR 0x%x %s\n", \r
--                       err, strerror(err));\r
--              goto bail;\r
--      }\r
--\r
--      ret = dapl_config_socket(cm_ptr->socket);\r
--      if (ret < 0) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " connect: config socket %d RET %d ERR 0x%x %s\n",\r
--                       cm_ptr->socket, ret, \r
--                       dapl_socket_errno(), strerror(dapl_socket_errno()));\r
--              dat_ret = DAT_INTERNAL_ERROR;\r
--              goto bail;\r
--      }\r
--\r
--      /* save remote address */\r
--      dapl_os_memcpy(&cm_ptr->addr, r_addr, sizeof(*r_addr));\r
--\r
--#ifdef DAPL_DBG\r
--      /* DBG: Active PID [0], PASSIVE PID [2]*/\r
--      *(uint16_t*)&cm_ptr->msg.resv[0] = htons((uint16_t)dapl_os_getpid()); \r
--      *(uint16_t*)&cm_ptr->msg.resv[2] = ((struct sockaddr_in *)&cm_ptr->addr)->sin_port;\r
--#endif\r
--      ((struct sockaddr_in *)&cm_ptr->addr)->sin_port = htons(r_qual + 1000);\r
--      ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&cm_ptr->addr,\r
--                                sizeof(cm_ptr->addr));\r
--      if (ret && ret != EAGAIN) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " connect: dapl_connect_socket RET %d ERR 0x%x %s\n",\r
--                       ret, dapl_socket_errno(), \r
--                       strerror(dapl_socket_errno()));\r
--              dat_ret = DAT_INVALID_ADDRESS;\r
--              goto bail;\r
--      }\r
--\r
--      /* REQ: QP info in msg.saddr, IA address in msg.daddr, and pdata */\r
--      cm_ptr->hca = ia_ptr->hca_ptr;\r
--      cm_ptr->msg.op = ntohs(DCM_REQ);\r
--      cm_ptr->msg.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);\r
--      cm_ptr->msg.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;\r
--      cm_ptr->msg.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;\r
--      dapl_os_memcpy(&cm_ptr->msg.saddr.ib.gid[0], \r
--                     &ia_ptr->hca_ptr->ib_trans.gid, 16);\r
--      \r
--      /* get local address information from socket */\r
--      sl = sizeof(cm_ptr->msg.daddr.so);\r
--      if (getsockname(cm_ptr->socket, (struct sockaddr *)&cm_ptr->msg.daddr.so, &sl)) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                      " connect getsockname ERROR: 0x%x %s -> %s r_qual %d\n",\r
--                      err, strerror(err), \r
--                      inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),\r
--                      (unsigned int)r_qual);;\r
--      }\r
--\r
--      if (p_size) {\r
--              cm_ptr->msg.p_size = htons(p_size);\r
--              dapl_os_memcpy(cm_ptr->msg.p_data, p_data, p_size);\r
--      }\r
--\r
--      /* connected or pending, either way results via async event */\r
--      if (ret == 0)\r
--              dapli_socket_connected(cm_ptr, 0);\r
--      else\r
--              cm_ptr->state = DCM_CONN_PENDING;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: p_data=%p %p\n",\r
--                   cm_ptr->msg.p_data, cm_ptr->msg.p_data);\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " connect: %s r_qual %d pending, p_sz=%d, %d %d ...\n",\r
--                   inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), \r
--                   (unsigned int)r_qual, ntohs(cm_ptr->msg.p_size),\r
--                   cm_ptr->msg.p_data[0], cm_ptr->msg.p_data[1]);\r
--\r
--      /* queue up on work thread */\r
--      dapli_cm_queue(cm_ptr);\r
--      return DAT_SUCCESS;\r
--bail:\r
--      dapl_log(DAPL_DBG_TYPE_ERR,\r
--               " connect ERROR: -> %s r_qual %d\n",\r
--               inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),\r
--               (unsigned int)r_qual);\r
--\r
--      /* Never queued, destroy */\r
--      dapls_cm_release(cm_ptr);\r
--      return dat_ret;\r
--}\r
--\r
--/*\r
-- * ACTIVE: exchange QP information, called from CR thread\r
-- */\r
--static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      DAPL_EP *ep_ptr = cm_ptr->ep;\r
--      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
--      ib_cm_events_t event = IB_CME_LOCAL_FAILURE;\r
--      socklen_t sl;\r
--\r
--      /* read DST information into cm_ptr, overwrite SRC info */\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n");\r
--\r
--      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0);\r
--      if (len != exp || ntohs(cm_ptr->msg.ver) != DCM_VER) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_WARN,\r
--                       " CONN_RTU read: sk %d ERR 0x%x, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n",\r
--                       cm_ptr->socket, err, len, ntohs(cm_ptr->msg.ver),\r
--                       inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr),\r
--                       ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port),\r
--                       ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port),\r
--                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[0]),\r
--                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[2]));\r
--\r
--              /* Retry; corner case where server tcp stack resets under load */\r
--              if (err == ECONNRESET) {\r
--                      closesocket(cm_ptr->socket);\r
--                      cm_ptr->socket = DAPL_INVALID_SOCKET;\r
--                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, \r
--                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,\r
--                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);\r
--                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);\r
--                      dapli_cm_free(cm_ptr);\r
--                      return;\r
--              }\r
--              goto bail;\r
--      }\r
--\r
--      /* keep the QP, address info in network order */\r
--      \r
--      /* save remote address information, in msg.daddr */\r
--      dapl_os_memcpy(&cm_ptr->addr,\r
--                     &cm_ptr->msg.daddr.so,\r
--                     sizeof(union dcm_addr));\r
--\r
--      /* save local address information from socket */\r
--      sl = sizeof(cm_ptr->addr);\r
--      getsockname(cm_ptr->socket,(struct sockaddr *)&cm_ptr->addr, &sl);\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " CONN_RTU: DST %s %d lid=0x%x,"\r
--                   " qpn=0x%x, qp_type=%d, psize=%d\n",\r
--                   inet_ntoa(((struct sockaddr_in *)\r
--                              &cm_ptr->msg.daddr.so)->sin_addr),\r
--                   ntohs(((struct sockaddr_in *)\r
--                              &cm_ptr->msg.daddr.so)->sin_port),\r
--                   ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                   ntohl(cm_ptr->msg.saddr.ib.qpn), \r
--                   cm_ptr->msg.saddr.ib.qp_type, \r
--                   ntohs(cm_ptr->msg.p_size));\r
--\r
--      /* validate private data size before reading */\r
--      if (ntohs(cm_ptr->msg.p_size) > DCM_MAX_PDATA_SIZE) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_RTU read: psize (%d) wrong -> %s\n",\r
--                       ntohs(cm_ptr->msg.p_size), \r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                 ep_ptr->param.\r
--                                 remote_ia_address_ptr)->sin_addr));\r
--              goto bail;\r
--      }\r
--\r
--      /* read private data into cm_handle if any present */\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP," CONN_RTU: read private data\n");\r
--      exp = ntohs(cm_ptr->msg.p_size);\r
--      if (exp) {\r
--              len = recv(cm_ptr->socket, cm_ptr->msg.p_data, exp, 0);\r
--              if (len != exp) {\r
--                      int err = dapl_socket_errno();\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               " CONN_RTU read pdata: ERR 0x%x %s, rcnt=%d -> %s\n",\r
--                               err, strerror(err), len,\r
--                               inet_ntoa(((struct sockaddr_in *)\r
--                                          ep_ptr->param.\r
--                                          remote_ia_address_ptr)->sin_addr));\r
--                      goto bail;\r
--              }\r
--      }\r
--\r
--      /* check for consumer or protocol stack reject */\r
--      if (ntohs(cm_ptr->msg.op) == DCM_REP)\r
--              event = IB_CME_CONNECTED;\r
--      else if (ntohs(cm_ptr->msg.op) == DCM_REJ_USER) \r
--              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;\r
--      else  \r
--              event = IB_CME_DESTINATION_REJECT;\r
--      \r
--      if (event != IB_CME_CONNECTED) {\r
--              dapl_log(DAPL_DBG_TYPE_CM,\r
--                       " CONN_RTU: reject from %s %x\n",\r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                  &cm_ptr->msg.daddr.so)->sin_addr),\r
--                       ntohs(((struct sockaddr_in *)\r
--                               &cm_ptr->msg.daddr.so)->sin_port));\r
--              goto bail;\r
--      }\r
--\r
--      /* modify QP to RTR and then to RTS with remote info */\r
--      dapl_os_lock(&ep_ptr->header.lock);\r
--      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
--                                IBV_QPS_RTR, \r
--                                cm_ptr->msg.saddr.ib.qpn,\r
--                                cm_ptr->msg.saddr.ib.lid,\r
--                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_RTU: QPS_RTR ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",\r
--                       strerror(errno), ep_ptr->qp_handle->qp_type,\r
--                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,\r
--                       ntohl(cm_ptr->msg.saddr.ib.qpn), \r
--                       ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                  &cm_ptr->msg.daddr.so)->sin_addr),\r
--                       ntohs(((struct sockaddr_in *)\r
--                               &cm_ptr->msg.daddr.so)->sin_port));\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              goto bail;\r
--      }\r
--      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
--                                IBV_QPS_RTS, \r
--                                cm_ptr->msg.saddr.ib.qpn,\r
--                                cm_ptr->msg.saddr.ib.lid,\r
--                                NULL) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_RTU: QPS_RTS ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",\r
--                       strerror(errno), ep_ptr->qp_handle->qp_type,\r
--                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,\r
--                       ntohl(cm_ptr->msg.saddr.ib.qpn), \r
--                       ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                  &cm_ptr->msg.daddr.so)->sin_addr),\r
--                       ntohs(((struct sockaddr_in *)\r
--                               &cm_ptr->msg.daddr.so)->sin_port));\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              goto bail;\r
--      }\r
--      dapl_os_unlock(&ep_ptr->header.lock);\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n");\r
--\r
--      /* complete handshake after final QP state change, Just ver+op */\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_CONNECTED;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      cm_ptr->msg.op = ntohs(DCM_RTU);\r
--      if (send(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0) == -1) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_RTU: write ERR = 0x%x %s\n", \r
--                       err, strerror(err));\r
--              goto bail;\r
--      }\r
--      /* post the event with private data */\r
--      event = IB_CME_CONNECTED;\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");\r
--\r
--#ifdef DAT_EXTENSIONS\r
--ud_bail:\r
--      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
--              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--              ib_pd_handle_t pd_handle = \r
--                      ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle;\r
--\r
--              if (event == IB_CME_CONNECTED) {\r
--                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,\r
--                                                   ep_ptr->qp_handle,\r
--                                                   cm_ptr->msg.saddr.ib.lid, \r
--                                                   NULL);\r
--                      if (cm_ptr->ah) {\r
--                              /* post UD extended EVENT */\r
--                              xevent.status = 0;\r
--                              xevent.type = DAT_IB_UD_REMOTE_AH;\r
--                              xevent.remote_ah.ah = cm_ptr->ah;\r
--                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);\r
--                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
--                                              &ep_ptr->remote_ia_address,\r
--                                              sizeof(union dcm_addr));\r
--                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
--\r
--                              dapl_log(DAPL_DBG_TYPE_CM, \r
--                                      " CONN_RTU: UD AH %p for lid 0x%x"\r
--                                      " qpn 0x%x\n", \r
--                                      cm_ptr->ah, \r
--                                      ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                                      ntohl(cm_ptr->msg.saddr.ib.qpn));\r
--      \r
--                      } else \r
--                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
--                      \r
--              } else if (event == IB_CME_LOCAL_FAILURE) {\r
--                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
--              } else  \r
--                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;\r
--\r
--              dapls_evd_post_connection_event_ext(\r
--                              (DAPL_EVD *) ep_ptr->param.connect_evd_handle,\r
--                              event,\r
--                              (DAT_EP_HANDLE) ep_ptr,\r
--                              (DAT_COUNT) exp,\r
--                              (DAT_PVOID *) cm_ptr->msg.p_data,\r
--                              (DAT_PVOID *) &xevent);\r
--\r
--              /* cleanup and release from local list */\r
--              dapli_cm_free(cm_ptr);\r
--      \r
--      } else\r
--#endif\r
--      {\r
--              dapli_ep_check(cm_ptr->ep);\r
--              dapl_evd_connection_callback(cm_ptr, event, cm_ptr->msg.p_data,\r
--                                           DCM_MAX_PDATA_SIZE, ep_ptr);\r
--      }\r
--      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
--               " SCM ACTIVE CONN: %x -> %s %x\n",\r
--               ntohs(((struct sockaddr_in *) &cm_ptr->addr)->sin_port),\r
--               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),\r
--               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)-1000);\r
--      return;\r
--\r
--bail:\r
--\r
--#ifdef DAT_EXTENSIONS\r
--      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) \r
--              goto ud_bail;\r
--#endif\r
--      /* close socket, and post error event */\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_REJECTED;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      dapl_evd_connection_callback(NULL, event, cm_ptr->msg.p_data,\r
--                                   DCM_MAX_PDATA_SIZE, ep_ptr);\r
--      dapli_cm_free(cm_ptr);\r
--}\r
--\r
--/*\r
-- * PASSIVE: Create socket, listen, accept, exchange QP information \r
-- */\r
--DAT_RETURN\r
--dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr)\r
--{\r
--      struct sockaddr_in addr;\r
--      ib_cm_srvc_handle_t cm_ptr = NULL;\r
--      DAT_RETURN dat_status = DAT_SUCCESS;\r
--      int opt = 1;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " setup listen(ia_ptr %p ServiceID %d sp_ptr %p)\n",\r
--                   ia_ptr, serviceID, sp_ptr);\r
--\r
--      cm_ptr = dapli_cm_alloc(NULL);\r
--      if (cm_ptr == NULL)\r
--              return DAT_INSUFFICIENT_RESOURCES;\r
--\r
--      cm_ptr->sp = sp_ptr;\r
--      cm_ptr->hca = ia_ptr->hca_ptr;\r
--\r
--      /* bind, listen, set sockopt, accept, exchange data */\r
--      if ((cm_ptr->socket =\r
--           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR, \r
--                       " listen: socket create: ERR 0x%x %s\n",\r
--                       err, strerror(err));\r
--              dat_status = DAT_INSUFFICIENT_RESOURCES;\r
--              goto bail;\r
--      }\r
--\r
--      setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));\r
--      addr.sin_port = htons(serviceID + 1000);\r
--      addr.sin_family = AF_INET;\r
--      addr.sin_addr = ((struct sockaddr_in *) &ia_ptr->hca_ptr->hca_address)->sin_addr;\r
--\r
--      if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)\r
--          || (listen(cm_ptr->socket, 128) < 0)) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_CM,\r
--                       " listen: ERROR 0x%x %s on port %d\n",\r
--                       err, strerror(err), serviceID + 1000);\r
--              if (err == EADDRINUSE)\r
--                      dat_status = DAT_CONN_QUAL_IN_USE;\r
--              else\r
--                      dat_status = DAT_CONN_QUAL_UNAVAILABLE;\r
--              goto bail;\r
--      }\r
--\r
--      /* set cm_handle for this service point, save listen socket */\r
--      sp_ptr->cm_srvc_handle = cm_ptr;\r
--      dapl_os_memcpy(&cm_ptr->addr, &addr, sizeof(addr)); \r
--\r
--      /* queue up listen socket to process inbound CR's */\r
--      cm_ptr->state = DCM_LISTEN;\r
--      dapli_cm_queue(cm_ptr);\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " setup listen: port %d cr %p s_fd %d\n",\r
--                   serviceID + 1000, cm_ptr, cm_ptr->socket);\r
--\r
--      return dat_status;\r
--bail:\r
--      /* Never queued, destroy here */\r
--      dapls_cm_release(cm_ptr);\r
--      return dat_status;\r
--}\r
--\r
--/*\r
-- * PASSIVE: accept socket \r
-- */\r
--static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)\r
--{\r
--      dp_ib_cm_handle_t acm_ptr;\r
--      int ret, len, opt = 1;\r
--      socklen_t sl;\r
--\r
--      /* \r
--       * Accept all CR's on this port to avoid half-connection (SYN_RCV)\r
--       * stalls with many to one connection storms\r
--       */\r
--      do {\r
--              /* Allocate accept CM and initialize */\r
--              if ((acm_ptr = dapli_cm_alloc(NULL)) == NULL)\r
--                      return;\r
--\r
--              acm_ptr->sp = cm_ptr->sp;\r
--              acm_ptr->hca = cm_ptr->hca;\r
--\r
--              len = sizeof(union dcm_addr);\r
--              acm_ptr->socket = accept(cm_ptr->socket,\r
--                                      (struct sockaddr *)\r
--                                      &acm_ptr->msg.daddr.so,\r
--                                      (socklen_t *) &len);\r
--              if (acm_ptr->socket == DAPL_INVALID_SOCKET) {\r
--                      int err = dapl_socket_errno();\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                              " ACCEPT: ERR 0x%x %s on FD %d l_cr %p\n",\r
--                              err, strerror(err), cm_ptr->socket, cm_ptr);\r
--                      dapls_cm_release(acm_ptr);\r
--                      return;\r
--              }\r
--              dapl_dbg_log(DAPL_DBG_TYPE_CM, " accepting from %s %x\n",\r
--                           inet_ntoa(((struct sockaddr_in *)\r
--                                      &acm_ptr->msg.daddr.so)->sin_addr),\r
--                           ntohs(((struct sockaddr_in *)\r
--                                      &acm_ptr->msg.daddr.so)->sin_port));\r
--\r
--              /* no delay for small packets */\r
--              ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,\r
--                         (char *)&opt, sizeof(opt));\r
--              if (ret) {\r
--                      int err = dapl_socket_errno();\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               " ACCEPT: NODELAY setsockopt:"\r
--                               " RET %d ERR 0x%x %s\n",\r
--                               ret, err, strerror(err));\r
--              }\r
--\r
--              /* get local address information from socket */\r
--              sl = sizeof(acm_ptr->addr);\r
--              getsockname(acm_ptr->socket, (struct sockaddr *)&acm_ptr->addr, &sl);\r
--              acm_ptr->state = DCM_ACCEPTING;\r
--              dapli_cm_queue(acm_ptr);\r
--      \r
--      } while (dapl_poll(cm_ptr->socket, DAPL_FD_READ) == DAPL_FD_READ);\r
--}\r
--\r
--/*\r
-- * PASSIVE: receive peer QP information, private data, post cr_event \r
-- */\r
--static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)\r
--{\r
--      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
--      void *p_data = NULL;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n");\r
--\r
--      /* read in DST QP info, IA address. check for private data */\r
--      len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0);\r
--      if (len != exp || ntohs(acm_ptr->msg.ver) != DCM_VER) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n",\r
--                       err, strerror(err), len, ntohs(acm_ptr->msg.ver));\r
--              goto bail;\r
--      }\r
--\r
--      /* keep the QP, address info in network order */\r
--\r
--      /* validate private data size before reading */\r
--      exp = ntohs(acm_ptr->msg.p_size);\r
--      if (exp > DCM_MAX_PDATA_SIZE) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                           " accept read: psize (%d) wrong\n",\r
--                           acm_ptr->msg.p_size);\r
--              goto bail;\r
--      }\r
--\r
--      /* read private data into cm_handle if any present */\r
--      if (exp) {\r
--              len = recv(acm_ptr->socket, acm_ptr->msg.p_data, exp, 0);\r
--              if (len != exp) {\r
--                      int err = dapl_socket_errno();\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               " accept read pdata: ERR 0x%x %s, rcnt=%d\n",\r
--                               err, strerror(err), len);\r
--                      goto bail;\r
--              }\r
--              p_data = acm_ptr->msg.p_data;\r
--      }\r
--      dapl_os_lock(&acm_ptr->lock);\r
--      acm_ptr->state = DCM_ACCEPTING_DATA;\r
--      dapl_os_unlock(&acm_ptr->lock);\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " ACCEPT: DST %s %x lid=0x%x, qpn=0x%x, psz=%d\n",\r
--                   inet_ntoa(((struct sockaddr_in *)\r
--                              &acm_ptr->msg.daddr.so)->sin_addr), \r
--                   ntohs(((struct sockaddr_in *)\r
--                           &acm_ptr->msg.daddr.so)->sin_port),\r
--                   ntohs(acm_ptr->msg.saddr.ib.lid), \r
--                   ntohl(acm_ptr->msg.saddr.ib.qpn), exp);\r
--\r
--#ifdef DAT_EXTENSIONS\r
--      if (acm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
--              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--\r
--              /* post EVENT, modify_qp created ah */\r
--              xevent.status = 0;\r
--              xevent.type = DAT_IB_UD_CONNECT_REQUEST;\r
--\r
--              dapls_evd_post_cr_event_ext(acm_ptr->sp,\r
--                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,\r
--                                          acm_ptr,\r
--                                          (DAT_COUNT) exp,\r
--                                          (DAT_PVOID *) acm_ptr->msg.p_data,\r
--                                          (DAT_PVOID *) &xevent);\r
--      } else\r
--#endif\r
--              /* trigger CR event and return SUCCESS */\r
--              dapls_cr_callback(acm_ptr,\r
--                                IB_CME_CONNECTION_REQUEST_PENDING,\r
--                                p_data, exp, acm_ptr->sp);\r
--      return;\r
--bail:\r
--      /* mark for destroy, active will see socket close as rej */\r
--      dapli_cm_free(acm_ptr);\r
--      return;\r
--}\r
--\r
--/*\r
-- * PASSIVE: consumer accept, send local QP information, private data, \r
-- * queue on work thread to receive RTU information to avoid blocking\r
-- * user thread. \r
-- */\r
--static DAT_RETURN\r
--dapli_socket_accept_usr(DAPL_EP * ep_ptr,\r
--                      DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data)\r
--{\r
--      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
--      dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;\r
--      ib_cm_msg_t local;\r
--      struct iovec iov[2];\r
--      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
--      DAT_RETURN ret = DAT_INTERNAL_ERROR;\r
--      socklen_t sl;\r
--\r
--      if (p_size > DCM_MAX_PDATA_SIZE) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " accept_usr: psize(%d) too large\n", p_size);\r
--              return DAT_LENGTH_ERROR;\r
--      }\r
--\r
--      /* must have a accepted socket */\r
--      if (cm_ptr->socket == DAPL_INVALID_SOCKET) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " accept_usr: cm socket invalid\n");\r
--              goto bail;\r
--      }\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " ACCEPT_USR: remote lid=0x%x"\r
--                   " qpn=0x%x qp_type %d, psize=%d\n",\r
--                   ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                   ntohl(cm_ptr->msg.saddr.ib.qpn), \r
--                   cm_ptr->msg.saddr.ib.qp_type, \r
--                   ntohs(cm_ptr->msg.p_size));\r
--\r
--#ifdef DAT_EXTENSIONS\r
--      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD &&\r
--          ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_USR: ERR remote QP is UD,"\r
--                       ", but local QP is not\n");\r
--              ret = (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);\r
--              goto bail;\r
--      }\r
--#endif\r
--\r
--      /* modify QP to RTR and then to RTS with remote info already read */\r
--      dapl_os_lock(&ep_ptr->header.lock);\r
--      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
--                                IBV_QPS_RTR, \r
--                                cm_ptr->msg.saddr.ib.qpn,\r
--                                cm_ptr->msg.saddr.ib.lid,\r
--                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_USR: QPS_RTR ERR %s -> %s\n",\r
--                       strerror(errno), \r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                   &cm_ptr->msg.daddr.so)->sin_addr));\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              goto bail;\r
--      }\r
--      if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
--                                IBV_QPS_RTS, \r
--                                cm_ptr->msg.saddr.ib.qpn,\r
--                                cm_ptr->msg.saddr.ib.lid,\r
--                                NULL) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_USR: QPS_RTS ERR %s -> %s\n",\r
--                       strerror(errno), \r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                   &cm_ptr->msg.daddr.so)->sin_addr));\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              goto bail;\r
--      }\r
--      dapl_os_unlock(&ep_ptr->header.lock);\r
--\r
--      /* save remote address information */\r
--      dapl_os_memcpy(&ep_ptr->remote_ia_address,\r
--                     &cm_ptr->msg.daddr.so,\r
--                     sizeof(union dcm_addr));\r
--\r
--      /* send our QP info, IA address, pdata. Don't overwrite dst data */\r
--      local.ver = htons(DCM_VER);\r
--      local.op = htons(DCM_REP);\r
--      local.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);\r
--      local.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;\r
--      local.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;\r
--      dapl_os_memcpy(&local.saddr.ib.gid[0], \r
--                     &ia_ptr->hca_ptr->ib_trans.gid, 16);\r
--      \r
--      /* Get local address information from socket */\r
--      sl = sizeof(local.daddr.so);\r
--      getsockname(cm_ptr->socket, (struct sockaddr *)&local.daddr.so, &sl);\r
--\r
--#ifdef DAPL_DBG\r
--      /* DBG: Active PID [0], PASSIVE PID [2] */\r
--      *(uint16_t*)&cm_ptr->msg.resv[2] = htons((uint16_t)dapl_os_getpid()); \r
--      dapl_os_memcpy(local.resv, cm_ptr->msg.resv, 4); \r
--#endif\r
--      cm_ptr->hca = ia_ptr->hca_ptr;\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_ACCEPTED;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      /* Link CM to EP, already queued on work thread */\r
--      dapl_ep_link_cm(ep_ptr, cm_ptr);\r
--      cm_ptr->ep = ep_ptr;\r
--\r
--      local.p_size = htons(p_size);\r
--      iov[0].iov_base = (void *)&local;\r
--      iov[0].iov_len = exp;\r
--      \r
--      if (p_size) {\r
--              iov[1].iov_base = p_data;\r
--              iov[1].iov_len = p_size;\r
--              len = writev(cm_ptr->socket, iov, 2);\r
--      } else \r
--              len = writev(cm_ptr->socket, iov, 1);\r
--      \r
--      if (len != (p_size + exp)) {\r
--              int err = dapl_socket_errno();\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_USR: ERR 0x%x %s, wcnt=%d -> %s\n",\r
--                       err, strerror(err), len, \r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                 &cm_ptr->msg.daddr.so)->sin_addr));\r
--              dapl_ep_unlink_cm(ep_ptr, cm_ptr);\r
--              cm_ptr->ep = NULL;\r
--              goto bail;\r
--      }\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " ACCEPT_USR: local lid=0x%x qpn=0x%x psz=%d\n",\r
--                   ntohs(local.saddr.ib.lid),\r
--                   ntohl(local.saddr.ib.qpn), ntohs(local.p_size));\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " ACCEPT_USR: local GID subnet %016llx id %016llx\n",\r
--                   (unsigned long long)\r
--                   htonll(*(uint64_t*)&local.saddr.ib.gid[0]),\r
--                   (unsigned long long)\r
--                   htonll(*(uint64_t*)&local.saddr.ib.gid[8]));\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");\r
--\r
--      return DAT_SUCCESS;\r
--bail:\r
--      /* schedule cleanup from workq */\r
--      dapli_cm_free(cm_ptr);\r
--      return ret;\r
--}\r
--\r
--/*\r
-- * PASSIVE: read RTU from active peer, post CONN event\r
-- */\r
--static void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)\r
--{\r
--      int len;\r
--      ib_cm_events_t event = IB_CME_CONNECTED;\r
--\r
--      /* complete handshake after final QP state change, VER and OP */\r
--      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0);\r
--      if (len != 4 || ntohs(cm_ptr->msg.op) != DCM_RTU) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_RTU: rcv ERR, rcnt=%d op=%x <- %s\n",\r
--                       len, ntohs(cm_ptr->msg.op),\r
--                       inet_ntoa(((struct sockaddr_in *)\r
--                                  &cm_ptr->msg.daddr.so)->sin_addr));\r
--              event = IB_CME_DESTINATION_REJECT;\r
--              goto bail;\r
--      }\r
--\r
--      /* save state and reference to EP, queue for disc event */\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_CONNECTED;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      /* final data exchange if remote QP state is good to go */\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n");\r
--\r
--#ifdef DAT_EXTENSIONS\r
--ud_bail:\r
--      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
--              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--\r
--              ib_pd_handle_t pd_handle = \r
--                      ((DAPL_PZ *)cm_ptr->ep->param.pz_handle)->pd_handle;\r
--              \r
--              if (event == IB_CME_CONNECTED) {\r
--                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,\r
--                                              cm_ptr->ep->qp_handle,\r
--                                              cm_ptr->msg.saddr.ib.lid, \r
--                                              NULL);\r
--                      if (cm_ptr->ah) { \r
--                              /* post EVENT, modify_qp created ah */\r
--                              xevent.status = 0;\r
--                              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;\r
--                              xevent.remote_ah.ah = cm_ptr->ah;\r
--                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);\r
--                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
--                                      &cm_ptr->msg.daddr.so,\r
--                                      sizeof(union dcm_addr));\r
--                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
--                      } else \r
--                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
--              } else \r
--                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;\r
--\r
--              dapl_log(DAPL_DBG_TYPE_CM, \r
--                      " CONN_RTU: UD AH %p for lid 0x%x qpn 0x%x\n", \r
--                      cm_ptr->ah, ntohs(cm_ptr->msg.saddr.ib.lid),\r
--                      ntohl(cm_ptr->msg.saddr.ib.qpn));\r
--\r
--              dapls_evd_post_connection_event_ext(\r
--                              (DAPL_EVD *) \r
--                              cm_ptr->ep->param.connect_evd_handle,\r
--                              event,\r
--                              (DAT_EP_HANDLE) cm_ptr->ep,\r
--                              (DAT_COUNT) ntohs(cm_ptr->msg.p_size),\r
--                              (DAT_PVOID *) cm_ptr->msg.p_data,\r
--                              (DAT_PVOID *) &xevent);\r
--\r
--                /* cleanup and release from local list, still on EP list */\r
--              dapli_cm_free(cm_ptr);\r
--                \r
--      } else \r
--#endif\r
--      {\r
--              dapli_ep_check(cm_ptr->ep);\r
--              dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);\r
--      }\r
--      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
--               " SCM PASSIVE CONN: %x <- %s %x\n",\r
--               cm_ptr->sp->conn_qual,\r
--               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),\r
--               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port));\r
--      return;\r
--      \r
--bail:\r
--#ifdef DAT_EXTENSIONS\r
--      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) \r
--              goto ud_bail;\r
--#endif\r
--      dapl_os_lock(&cm_ptr->lock);\r
--      cm_ptr->state = DCM_REJECTED;\r
--      dapl_os_unlock(&cm_ptr->lock);\r
--\r
--      dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);\r
--      dapli_cm_free(cm_ptr);\r
--}\r
--\r
--/*\r
-- * dapls_ib_connect\r
-- *\r
-- * Initiate a connection with the passive listener on another node\r
-- *\r
-- * Input:\r
-- *    ep_handle,\r
-- *    remote_ia_address,\r
-- *    remote_conn_qual,\r
-- *    prd_size                size of private data and structure\r
-- *    prd_prt                 pointer to private data structure\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INVALID_PARAMETER\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,\r
--               IN DAT_IA_ADDRESS_PTR remote_ia_address,\r
--               IN DAT_CONN_QUAL remote_conn_qual,\r
--               IN DAT_COUNT private_data_size, IN void *private_data)\r
--{\r
--      DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle;\r
--      \r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " connect(ep_handle %p ....)\n", ep_handle);\r
--\r
--      return (dapli_socket_connect(ep_ptr, remote_ia_address,\r
--                                   remote_conn_qual,\r
--                                   private_data_size, private_data));\r
--}\r
--\r
--/*\r
-- * dapls_ib_disconnect\r
-- *\r
-- * Disconnect an EP\r
-- *\r
-- * Input:\r
-- *    ep_handle,\r
-- *    disconnect_flags\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- */\r
--DAT_RETURN\r
--dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)\r
--{\r
--      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);\r
--\r
--      dapl_os_lock(&ep_ptr->header.lock);\r
--      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||\r
--          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||\r
--          cm_ptr == NULL) {\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              return DAT_SUCCESS;\r
--      } \r
--      dapl_os_unlock(&ep_ptr->header.lock);\r
--      return (dapli_socket_disconnect(cm_ptr));\r
--}\r
--\r
--/*\r
-- * dapls_ib_disconnect_clean\r
-- *\r
-- * Clean up outstanding connection data. This routine is invoked\r
-- * after the final disconnect callback has occurred. Only on the\r
-- * ACTIVE side of a connection. It is also called if dat_ep_connect\r
-- * times out using the consumer supplied timeout value.\r
-- *\r
-- * Input:\r
-- *    ep_ptr          DAPL_EP\r
-- *    active          Indicates active side of connection\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    void\r
-- *\r
-- */\r
--void\r
--dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,\r
--                        IN DAT_BOOLEAN active,\r
--                        IN const ib_cm_events_t ib_cm_event)\r
--{\r
--      if (ib_cm_event == IB_CME_TIMEOUT) {\r
--              dp_ib_cm_handle_t cm_ptr;\r
--\r
--              if ((cm_ptr = dapl_get_cm_from_ep(ep_ptr)) == NULL)\r
--                      return;\r
--\r
--              dapl_log(DAPL_DBG_TYPE_WARN,\r
--                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",\r
--                      ep_ptr, cm_ptr, dapl_cm_state_str(cm_ptr->state));\r
--              \r
--              /* schedule release of socket and local resources */\r
--              dapli_cm_free(cm_ptr);\r
--      }\r
--}\r
--\r
--/*\r
-- * dapl_ib_setup_conn_listener\r
-- *\r
-- * Have the CM set up a connection listener.\r
-- *\r
-- * Input:\r
-- *    ibm_hca_handle          HCA handle\r
-- *    qp_handle                       QP handle\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INTERNAL_ERROR\r
-- *    DAT_CONN_QUAL_UNAVAILBLE\r
-- *    DAT_CONN_QUAL_IN_USE\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,\r
--                           IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)\r
--{\r
--      return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr));\r
--}\r
--\r
--/*\r
-- * dapl_ib_remove_conn_listener\r
-- *\r
-- * Have the CM remove a connection listener.\r
-- *\r
-- * Input:\r
-- *    ia_handle               IA handle\r
-- *    ServiceID               IB Channel Service ID\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INVALID_STATE\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)\r
--{\r
--      ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle;\r
--\r
--      /* free cm_srvc_handle, release will cleanup */\r
--      if (cm_ptr != NULL) {\r
--              /* cr_thread will free */\r
--              sp_ptr->cm_srvc_handle = NULL;\r
--              dapli_cm_free(cm_ptr);\r
--      }\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_ib_accept_connection\r
-- *\r
-- * Perform necessary steps to accept a connection\r
-- *\r
-- * Input:\r
-- *    cr_handle\r
-- *    ep_handle\r
-- *    private_data_size\r
-- *    private_data\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INTERNAL_ERROR\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,\r
--                         IN DAT_EP_HANDLE ep_handle,\r
--                         IN DAT_COUNT p_size, IN const DAT_PVOID p_data)\r
--{\r
--      DAPL_CR *cr_ptr;\r
--      DAPL_EP *ep_ptr;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n",\r
--                   cr_handle, ep_handle, p_data, p_size);\r
--\r
--      cr_ptr = (DAPL_CR *) cr_handle;\r
--      ep_ptr = (DAPL_EP *) ep_handle;\r
--\r
--      /* allocate and attach a QP if necessary */\r
--      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
--              DAT_RETURN status;\r
--              status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
--                                         ep_ptr, ep_ptr);\r
--              if (status != DAT_SUCCESS)\r
--                      return status;\r
--      }\r
--      return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data));\r
--}\r
--\r
--/*\r
-- * dapls_ib_reject_connection\r
-- *\r
-- * Reject a connection\r
-- *\r
-- * Input:\r
-- *    cr_handle\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INTERNAL_ERROR\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr,\r
--                         IN int reason,\r
--                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)\r
--{\r
--      struct iovec iov[2];\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " reject(cm %p reason %x, pdata %p, psize %d)\n",\r
--                   cm_ptr, reason, pdata, psize);\r
--\r
--        if (psize > DCM_MAX_PDATA_SIZE)\r
--                return DAT_LENGTH_ERROR;\r
--\r
--      /* write reject data to indicate reject */\r
--      cm_ptr->msg.op = htons(DCM_REJ_USER);\r
--      cm_ptr->msg.p_size = htons(psize);\r
--      \r
--      iov[0].iov_base = (void *)&cm_ptr->msg;\r
--      iov[0].iov_len = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;\r
--      if (psize) {\r
--              iov[1].iov_base = pdata;\r
--              iov[1].iov_len = psize;\r
--              writev(cm_ptr->socket, iov, 2);\r
--      } else {\r
--              writev(cm_ptr->socket, iov, 1);\r
--      }\r
--\r
--      /* release and cleanup CM object */\r
--      dapli_cm_free(cm_ptr);\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_ib_cm_remote_addr\r
-- *\r
-- * Obtain the remote IP address given a connection\r
-- *\r
-- * Input:\r
-- *    cr_handle\r
-- *\r
-- * Output:\r
-- *    remote_ia_address: where to place the remote address\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INVALID_HANDLE\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,\r
--                      OUT DAT_SOCK_ADDR6 * remote_ia_address)\r
--{\r
--      DAPL_HEADER *header;\r
--      dp_ib_cm_handle_t conn;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",\r
--                   dat_handle);\r
--\r
--      header = (DAPL_HEADER *) dat_handle;\r
--\r
--      if (header->magic == DAPL_MAGIC_EP)\r
--              conn = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);\r
--      else if (header->magic == DAPL_MAGIC_CR)\r
--              conn = ((DAPL_CR *) dat_handle)->ib_cm_handle;\r
--      else\r
--              return DAT_INVALID_HANDLE;\r
--\r
--      dapl_os_memcpy(remote_ia_address,\r
--                     &conn->msg.daddr.so, sizeof(DAT_SOCK_ADDR6));\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--int dapls_ib_private_data_size(\r
--      IN DAPL_HCA *hca_ptr)\r
--{\r
--      return DCM_MAX_PDATA_SIZE;\r
--}\r
--\r
--/* outbound/inbound CR processing thread to avoid blocking applications */\r
--void cr_thread(void *arg)\r
--{\r
--      struct dapl_hca *hca_ptr = arg;\r
--      dp_ib_cm_handle_t cr, next_cr;\r
--      int opt, ret;\r
--      socklen_t opt_len;\r
--      char rbuf[2];\r
--      struct dapl_fd_set *set;\r
--      enum DAPL_FD_EVENTS event;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr);\r
--      set = dapl_alloc_fd_set();\r
--      if (!set)\r
--              goto out;\r
--\r
--      dapl_os_lock(&hca_ptr->ib_trans.lock);\r
--      hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;\r
--\r
--      while (1) {\r
--              dapl_fd_zero(set);\r
--              dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ);\r
--\r
--              if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))\r
--                      next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list);\r
--              else\r
--                      next_cr = NULL;\r
--\r
--              while (next_cr) {\r
--                      cr = next_cr;\r
--                      next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,\r
--                                                      (DAPL_LLIST_ENTRY *) \r
--                                                      &cr->local_entry);\r
--                      dapls_cm_acquire(cr); /* hold thread ref */\r
--                      dapl_os_lock(&cr->lock);\r
--                      if (cr->state == DCM_FREE || \r
--                          hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {\r
--                              dapl_log(DAPL_DBG_TYPE_CM, \r
--                                       " CM FREE: %p ep=%p st=%s sck=%d refs=%d\n", \r
--                                       cr, cr->ep, dapl_cm_state_str(cr->state), \r
--                                       cr->socket, cr->ref_count);\r
--\r
--                              if (cr->socket != DAPL_INVALID_SOCKET) {\r
--                                      shutdown(cr->socket, SHUT_RDWR);\r
--                                      closesocket(cr->socket);\r
--                                      cr->socket = DAPL_INVALID_SOCKET;\r
--                              }\r
--                              dapl_os_unlock(&cr->lock);\r
--                              dapls_cm_release(cr); /* release alloc ref */\r
--                              dapli_cm_dequeue(cr); /* release workq ref */\r
--                              dapls_cm_release(cr); /* release thread ref */\r
--                              continue;\r
--                      }\r
--\r
--                      event = (cr->state == DCM_CONN_PENDING) ?\r
--                                      DAPL_FD_WRITE : DAPL_FD_READ;\r
--\r
--                      if (dapl_fd_set(cr->socket, set, event)) {\r
--                              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                                       " cr_thread: fd_set ERR st=%d fd %d"\r
--                                       " -> %s\n", cr->state, cr->socket,\r
--                                       inet_ntoa(((struct sockaddr_in *)\r
--                                              &cr->msg.daddr.so)->sin_addr));\r
--                              dapl_os_unlock(&cr->lock);\r
--                              dapls_cm_release(cr); /* release ref */\r
--                              continue;\r
--                      }\r
--                      dapl_os_unlock(&cr->lock);\r
--                      dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
--                      \r
--                      ret = dapl_poll(cr->socket, event);\r
--\r
--                      dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
--                                   " poll ret=0x%x %s sck=%d\n",\r
--                                   ret, dapl_cm_state_str(cr->state), \r
--                                   cr->socket);\r
--\r
--                      /* data on listen, qp exchange, and on disc req */\r
--                      dapl_os_lock(&cr->lock);\r
--                      if ((ret == DAPL_FD_READ) || \r
--                          (cr->state != DCM_CONN_PENDING && ret == DAPL_FD_ERROR)) {\r
--                              if (cr->socket != DAPL_INVALID_SOCKET) {\r
--                                      switch (cr->state) {\r
--                                      case DCM_LISTEN:\r
--                                              dapl_os_unlock(&cr->lock);\r
--                                              dapli_socket_accept(cr);\r
--                                                break;\r
--                                      case DCM_ACCEPTING:\r
--                                              dapl_os_unlock(&cr->lock);\r
--                                              dapli_socket_accept_data(cr);\r
--                                              break;\r
--                                      case DCM_ACCEPTED:\r
--                                              dapl_os_unlock(&cr->lock);\r
--                                              dapli_socket_accept_rtu(cr);\r
--                                              break;\r
--                                      case DCM_REP_PENDING:\r
--                                              dapl_os_unlock(&cr->lock);\r
--                                              dapli_socket_connect_rtu(cr);\r
--                                              break;\r
--                                      case DCM_CONNECTED:\r
--                                              dapl_os_unlock(&cr->lock);\r
--                                              dapli_socket_disconnect(cr);\r
--                                              break;\r
--                                      default:\r
--                                              dapl_os_unlock(&cr->lock);\r
--                                              break;\r
--                                      }\r
--                              } else \r
--                                      dapl_os_unlock(&cr->lock);\r
--\r
--                      /* ASYNC connections, writable, readable, error; check status */\r
--                      } else if (ret == DAPL_FD_WRITE ||\r
--                                 (cr->state == DCM_CONN_PENDING && \r
--                                  ret == DAPL_FD_ERROR)) {\r
--                              \r
--                              opt = 0;\r
--                              opt_len = sizeof(opt);\r
--                              ret = getsockopt(cr->socket, SOL_SOCKET,\r
--                                               SO_ERROR, (char *)&opt,\r
--                                               &opt_len);\r
--                              dapl_os_unlock(&cr->lock);\r
--                              if (!ret && !opt)\r
--                                      dapli_socket_connected(cr, opt);\r
--                              else\r
--                                      dapli_socket_connected(cr, opt ? opt : dapl_socket_errno());\r
--                      } else \r
--                              dapl_os_unlock(&cr->lock);\r
--\r
--                      dapls_cm_release(cr); /* release ref */\r
--                      dapl_os_lock(&hca_ptr->ib_trans.lock);\r
--              }\r
--\r
--              /* set to exit and all resources destroyed */\r
--              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&\r
--                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))\r
--                      break;\r
--\r
--              dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
--              dapl_select(set);\r
--\r
--              /* if pipe used to wakeup, consume */\r
--              while (dapl_poll(hca_ptr->ib_trans.scm[0], \r
--                               DAPL_FD_READ) == DAPL_FD_READ) {\r
--                      if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1)\r
--                              dapl_log(DAPL_DBG_TYPE_THREAD,\r
--                                       " cr_thread: read pipe error = %s\n",\r
--                                       strerror(errno));\r
--              }\r
--              dapl_os_lock(&hca_ptr->ib_trans.lock);\r
--              \r
--              /* set to exit and all resources destroyed */\r
--              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&\r
--                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))\r
--                      break;\r
--      }\r
--\r
--      dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
--      dapl_os_free(set, sizeof(struct dapl_fd_set));\r
--out:\r
--      hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;\r
--      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " cr_thread(hca %p) exit\n", hca_ptr);\r
--}\r
--\r
--\r
--#ifdef DAPL_COUNTERS\r
--/* Debug aid: List all Connections in process and state */\r
--void dapls_print_cm_list(IN DAPL_IA *ia_ptr)\r
--{\r
--      /* Print in process CR's for this IA, if debug type set */\r
--      int i = 0;\r
--      dp_ib_cm_handle_t cr, next_cr;\r
--\r
--      dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock);\r
--      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)\r
--                               &ia_ptr->hca_ptr->ib_trans.list))\r
--                               next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*)\r
--                               &ia_ptr->hca_ptr->ib_trans.list);\r
--      else\r
--              next_cr = NULL;\r
--\r
--        printf("\n DAPL IA CONNECTIONS IN PROCESS:\n");\r
--      while (next_cr) {\r
--              cr = next_cr;\r
--              next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*)\r
--                               &ia_ptr->hca_ptr->ib_trans.list,\r
--                              (DAPL_LLIST_ENTRY*)&cr->local_entry);\r
--\r
--              printf( "  CONN[%d]: sp %p ep %p sock %d %s %s %s %s %s %s PORT L-%x R-%x PID L-%x R-%x\n",\r
--                      i, cr->sp, cr->ep, cr->socket,\r
--                      cr->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
--                      dapl_cm_state_str(cr->state), dapl_cm_op_str(ntohs(cr->msg.op)),\r
--                      ntohs(cr->msg.op) == DCM_REQ ? /* local address */\r
--                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr) :\r
--                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr),\r
--                      cr->sp ? "<-" : "->",\r
--                              ntohs(cr->msg.op) == DCM_REQ ? /* remote address */\r
--                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr) :\r
--                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr),\r
--\r
--                      ntohs(cr->msg.op) == DCM_REQ ? /* local port */\r
--                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port) :\r
--                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port),\r
--\r
--                      ntohs(cr->msg.op) == DCM_REQ ? /* remote port */\r
--                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port) :\r
--                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port),\r
--\r
--                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[2]) : ntohs(*(uint16_t*)&cr->msg.resv[0]),\r
--                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[0]) : ntohs(*(uint16_t*)&cr->msg.resv[2]));\r
--\r
--              i++;\r
--      }\r
--      printf("\n");\r
--      dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock);\r
--}\r
--#endif\r
-+/*
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+/***************************************************************************
-+ *
-+ *   Module:           uDAPL
-+ *
-+ *   Filename:                 dapl_ib_cm.c
-+ *
-+ *   Author:           Arlin Davis
-+ *
-+ *   Created:          3/10/2005
-+ *
-+ *   Description: 
-+ *
-+ *   The uDAPL openib provider - connection management
-+ *
-+ ****************************************************************************
-+ *               Source Control System Information
-+ *
-+ *    $Id: $
-+ *
-+ *    Copyright (c) 2005 Intel Corporation.  All rights reserved.
-+ *
-+ **************************************************************************/
-+
-+#if defined(_WIN32)
-+#define FD_SETSIZE 1024
-+#define DAPL_FD_SETSIZE FD_SETSIZE
-+#endif
-+
-+#include "dapl.h"
-+#include "dapl_adapter_util.h"
-+#include "dapl_evd_util.h"
-+#include "dapl_cr_util.h"
-+#include "dapl_name_service.h"
-+#include "dapl_ib_util.h"
-+#include "dapl_ep_util.h"
-+#include "dapl_osd.h"
-+
-+/* forward declarations */
-+static DAT_RETURN
-+dapli_socket_connect(DAPL_EP * ep_ptr,
-+                   DAT_IA_ADDRESS_PTR r_addr,
-+                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data);
-+
-+#ifdef DAPL_DBG
-+/* Check for EP linking to IA and proper connect state */
-+void dapli_ep_check(DAPL_EP *ep)
-+{
-+      DAPL_IA *ia_ptr = ep->header.owner_ia;
-+      DAPL_EP *ep_ptr, *next_ep_ptr;
-+      int found = 0;
-+
-+      dapl_os_lock(&ia_ptr->header.lock);
-+      ep_ptr = (dapl_llist_is_empty (&ia_ptr->ep_list_head)
-+              ? NULL : dapl_llist_peek_head (&ia_ptr->ep_list_head));
-+
-+      while (ep_ptr != NULL) {
-+              next_ep_ptr = 
-+                      dapl_llist_next_entry(&ia_ptr->ep_list_head,
-+                                            &ep_ptr->header.ia_list_entry);
-+              if (ep == ep_ptr) {
-+                      found++;
-+                      if ((ep->cr_ptr && ep->param.ep_state 
-+                              != DAT_EP_STATE_COMPLETION_PENDING) ||
-+                          (!ep->cr_ptr && ep->param.ep_state 
-+                              != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING))
-+                              goto err;
-+                      else 
-+                              goto match;
-+              }
-+              ep_ptr = next_ep_ptr;
-+      }
-+err:
-+      dapl_log(DAPL_DBG_TYPE_ERR,
-+               " dapli_ep_check ERR: %s %s ep=%p state=%d magic=0x%x\n", 
-+               ep->cr_ptr ? "PASSIVE":"ACTIVE", 
-+               found ? "WRONG_STATE":"NOT_FOUND" ,
-+               ep, ep->param.ep_state, ep->header.magic);
-+match:
-+      dapl_os_unlock(&ia_ptr->header.lock);
-+      return;
-+}
-+#else
-+#define dapli_ep_check(ep)
-+#endif
-+
-+#if defined(_WIN32) || defined(_WIN64)
-+enum DAPL_FD_EVENTS {
-+      DAPL_FD_READ = 0x1,
-+      DAPL_FD_WRITE = 0x2,
-+      DAPL_FD_ERROR = 0x4
-+};
-+
-+static int dapl_config_socket(DAPL_SOCKET s)
-+{
-+      unsigned long nonblocking = 1;
-+      int ret, opt = 1;
-+
-+      ret = ioctlsocket(s, FIONBIO, &nonblocking);
-+
-+      /* no delay for small packets */
-+      if (!ret)
-+              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, 
-+                               (char *)&opt, sizeof(opt));
-+      return ret;
-+}
-+
-+static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
-+                             int addrlen)
-+{
-+      int err;
-+
-+      err = connect(s, addr, addrlen);
-+      if (err == SOCKET_ERROR)
-+              err = WSAGetLastError();
-+      return (err == WSAEWOULDBLOCK) ? EAGAIN : err;
-+}
-+
-+struct dapl_fd_set {
-+      struct fd_set set[3];
-+};
-+
-+static struct dapl_fd_set *dapl_alloc_fd_set(void)
-+{
-+      return dapl_os_alloc(sizeof(struct dapl_fd_set));
-+}
-+
-+static void dapl_fd_zero(struct dapl_fd_set *set)
-+{
-+      FD_ZERO(&set->set[0]);
-+      FD_ZERO(&set->set[1]);
-+      FD_ZERO(&set->set[2]);
-+}
-+
-+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
-+                     enum DAPL_FD_EVENTS event)
-+{
-+      FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);
-+      FD_SET(s, &set->set[2]);
-+      return 0;
-+}
-+
-+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
-+{
-+      struct fd_set rw_fds;
-+      struct fd_set err_fds;
-+      struct timeval tv;
-+      int ret;
-+
-+      FD_ZERO(&rw_fds);
-+      FD_ZERO(&err_fds);
-+      FD_SET(s, &rw_fds);
-+      FD_SET(s, &err_fds);
-+
-+      tv.tv_sec = 0;
-+      tv.tv_usec = 0;
-+
-+      if (event == DAPL_FD_READ)
-+              ret = select(1, &rw_fds, NULL, &err_fds, &tv);
-+      else
-+              ret = select(1, NULL, &rw_fds, &err_fds, &tv);
-+
-+      if (ret == 0)
-+              return 0;
-+      else if (ret == SOCKET_ERROR)
-+              return DAPL_FD_ERROR;
-+      else if (FD_ISSET(s, &rw_fds))
-+              return event;
-+      else
-+              return DAPL_FD_ERROR;
-+}
-+
-+static int dapl_select(struct dapl_fd_set *set)
-+{
-+      int ret;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n");
-+      ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL);
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n");
-+
-+      if (ret == SOCKET_ERROR)
-+              dapl_dbg_log(DAPL_DBG_TYPE_THREAD,
-+                           " dapl_select: error 0x%x\n", WSAGetLastError());
-+
-+      return ret;
-+}
-+
-+static int dapl_socket_errno(void)
-+{
-+      int err;
-+
-+      err = WSAGetLastError();
-+      switch (err) {
-+      case WSAEACCES:
-+      case WSAEADDRINUSE:
-+              return EADDRINUSE;
-+      case WSAECONNRESET:
-+              return ECONNRESET;
-+      default:
-+              return err;
-+      }
-+}
-+#else                         // _WIN32 || _WIN64
-+enum DAPL_FD_EVENTS {
-+      DAPL_FD_READ = POLLIN,
-+      DAPL_FD_WRITE = POLLOUT,
-+      DAPL_FD_ERROR = POLLERR
-+};
-+
-+static int dapl_config_socket(DAPL_SOCKET s)
-+{
-+      int ret, opt = 1;
-+
-+      /* non-blocking */
-+      ret = fcntl(s, F_GETFL);
-+      if (ret >= 0)
-+              ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);
-+
-+      /* no delay for small packets */
-+      if (!ret)
-+              ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, 
-+                               (char *)&opt, sizeof(opt));
-+      return ret;
-+}
-+
-+static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
-+                             int addrlen)
-+{
-+      int ret;
-+
-+      ret = connect(s, addr, addrlen);
-+
-+      return (errno == EINPROGRESS) ? EAGAIN : ret;
-+}
-+
-+struct dapl_fd_set {
-+      int index;
-+      struct pollfd set[DAPL_FD_SETSIZE];
-+};
-+
-+static struct dapl_fd_set *dapl_alloc_fd_set(void)
-+{
-+      return dapl_os_alloc(sizeof(struct dapl_fd_set));
-+}
-+
-+static void dapl_fd_zero(struct dapl_fd_set *set)
-+{
-+      set->index = 0;
-+}
-+
-+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
-+                     enum DAPL_FD_EVENTS event)
-+{
-+      if (set->index == DAPL_FD_SETSIZE - 1) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",
-+                       set->index + 1);
-+              return -1;
-+      }
-+
-+      set->set[set->index].fd = s;
-+      set->set[set->index].revents = 0;
-+      set->set[set->index++].events = event;
-+      return 0;
-+}
-+
-+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
-+{
-+      struct pollfd fds;
-+      int ret;
-+
-+      fds.fd = s;
-+      fds.events = event;
-+      fds.revents = 0;
-+      ret = poll(&fds, 1, 0);
-+      dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",
-+               s, ret, fds.revents);
-+      if (ret == 0)
-+              return 0;
-+      else if (ret < 0 || (fds.revents & (POLLERR | POLLHUP | POLLNVAL))) 
-+              return DAPL_FD_ERROR;
-+      else 
-+              return event;
-+}
-+
-+static int dapl_select(struct dapl_fd_set *set)
-+{
-+      int ret;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index);
-+      ret = poll(set->set, set->index, -1);
-+      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret);
-+      return ret;
-+}
-+
-+#define dapl_socket_errno() errno
-+#endif
-+
-+static void dapli_cm_thread_signal(dp_ib_cm_handle_t cm_ptr) 
-+{
-+      if (cm_ptr->hca)
-+              send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0);
-+}
-+
-+static void dapli_cm_free(dp_ib_cm_handle_t cm_ptr) 
-+{
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_FREE;
-+      dapl_os_unlock(&cm_ptr->lock);
-+      dapli_cm_thread_signal(cm_ptr);
-+}
-+
-+static void dapli_cm_dealloc(dp_ib_cm_handle_t cm_ptr) 
-+{
-+      dapl_os_assert(!cm_ptr->ref_count);
-+      
-+      if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
-+              shutdown(cm_ptr->socket, SHUT_RDWR);
-+              closesocket(cm_ptr->socket);
-+      }
-+      if (cm_ptr->ah) 
-+              ibv_destroy_ah(cm_ptr->ah);
-+      
-+      dapl_os_lock_destroy(&cm_ptr->lock);
-+      dapl_os_wait_object_destroy(&cm_ptr->event);
-+      dapl_os_free(cm_ptr, sizeof(*cm_ptr));
-+}
-+
-+void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr)
-+{
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->ref_count++;
-+      dapl_os_unlock(&cm_ptr->lock);
-+}
-+
-+void dapls_cm_release(dp_ib_cm_handle_t cm_ptr)
-+{
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->ref_count--;
-+      if (cm_ptr->ref_count) {
-+                dapl_os_unlock(&cm_ptr->lock);
-+              return;
-+      }
-+      dapl_os_unlock(&cm_ptr->lock);
-+      dapli_cm_dealloc(cm_ptr);
-+}
-+
-+static dp_ib_cm_handle_t dapli_cm_alloc(DAPL_EP *ep_ptr)
-+{
-+      dp_ib_cm_handle_t cm_ptr;
-+
-+      /* Allocate CM, init lock, and initialize */
-+      if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL)
-+              return NULL;
-+
-+      (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));
-+      if (dapl_os_lock_init(&cm_ptr->lock))
-+              goto bail;
-+
-+      if (dapl_os_wait_object_init(&cm_ptr->event)) {
-+              dapl_os_lock_destroy(&cm_ptr->lock);
-+              goto bail;
-+      }
-+      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->list_entry);
-+      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);
-+
-+      cm_ptr->msg.ver = htons(DCM_VER);
-+      cm_ptr->socket = DAPL_INVALID_SOCKET;
-+      dapls_cm_acquire(cm_ptr);
-+              
-+      /* Link EP and CM */
-+      if (ep_ptr != NULL) {
-+              dapl_ep_link_cm(ep_ptr, cm_ptr); /* ref++ */
-+              cm_ptr->ep = ep_ptr;
-+              cm_ptr->hca = ((DAPL_IA *)ep_ptr->param.ia_handle)->hca_ptr;
-+      }
-+      return cm_ptr;
-+bail:
-+      dapl_os_free(cm_ptr, sizeof(*cm_ptr));
-+      return NULL;
-+}
-+
-+/* queue socket for processing CM work */
-+static void dapli_cm_queue(dp_ib_cm_handle_t cm_ptr)
-+{
-+      /* add to work queue for cr thread processing */
-+      dapl_os_lock(&cm_ptr->hca->ib_trans.lock);
-+      dapls_cm_acquire(cm_ptr);
-+      dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list,
-+                          (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry, cm_ptr);
-+      dapl_os_unlock(&cm_ptr->hca->ib_trans.lock);
-+      dapli_cm_thread_signal(cm_ptr);
-+}
-+
-+/* called with local LIST lock */
-+static void dapli_cm_dequeue(dp_ib_cm_handle_t cm_ptr)
-+{
-+      /* Remove from work queue, cr thread processing */
-+      dapl_llist_remove_entry(&cm_ptr->hca->ib_trans.list,
-+                              (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry);
-+      dapls_cm_release(cm_ptr);
-+}
-+
-+/* BLOCKING: called from dapl_ep_free, EP link will be last ref */
-+void dapls_cm_free(dp_ib_cm_handle_t cm_ptr)
-+{
-+      dapl_log(DAPL_DBG_TYPE_CM,
-+               " cm_free: cm %p %s ep %p refs=%d\n", 
-+               cm_ptr, dapl_cm_state_str(cm_ptr->state),
-+               cm_ptr->ep, cm_ptr->ref_count);
-+      
-+      /* free from internal workq, wait until EP is last ref */
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_FREE;
-+      while (cm_ptr->ref_count != 1) {
-+              dapli_cm_thread_signal(cm_ptr);
-+              dapl_os_unlock(&cm_ptr->lock);
-+              dapl_os_sleep_usec(10000);
-+              dapl_os_lock(&cm_ptr->lock);
-+      }
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      /* unlink, dequeue from EP. Final ref so release will destroy */
-+      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);
-+}
-+
-+/*
-+ * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect
-+ *                 or from ep_free. 
-+ */
-+DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)
-+{
-+      DAT_UINT32 disc_data = htonl(0xdead);
-+
-+      dapl_os_lock(&cm_ptr->lock);
-+      if (cm_ptr->state != DCM_CONNECTED || 
-+          cm_ptr->state == DCM_DISCONNECTED) {
-+              dapl_os_unlock(&cm_ptr->lock);
-+              return DAT_SUCCESS;
-+      }
-+      cm_ptr->state = DCM_DISCONNECTED;
-+      dapl_os_unlock(&cm_ptr->lock);
-+      
-+      /* send disc date, close socket, schedule destroy */
-+      send(cm_ptr->socket, (char *)&disc_data, sizeof(disc_data), 0);
-+
-+      /* disconnect events for RC's only */
-+      if (cm_ptr->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
-+              dapl_os_lock(&cm_ptr->ep->header.lock);
-+              dapls_modify_qp_state(cm_ptr->ep->qp_handle, IBV_QPS_ERR, 0,0,0);
-+              dapl_os_unlock(&cm_ptr->ep->header.lock);
-+              if (cm_ptr->ep->cr_ptr) {
-+                      dapls_cr_callback(cm_ptr,
-+                                        IB_CME_DISCONNECTED,
-+                                        NULL, 0, cm_ptr->sp);
-+              } else {
-+                      dapl_evd_connection_callback(cm_ptr,
-+                                                   IB_CME_DISCONNECTED,
-+                                                   NULL, 0, cm_ptr->ep);
-+              }
-+      }
-+      
-+      /* release from workq */
-+      dapli_cm_free(cm_ptr);
-+
-+      /* scheduled destroy via disconnect clean in callback */
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * ACTIVE: socket connected, send QP information to peer 
-+ */
-+static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)
-+{
-+      int len, exp;
-+      struct iovec iov[2];
-+      struct dapl_ep *ep_ptr = cm_ptr->ep;
-+
-+      if (err) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_PENDING: %s ERR %s -> %s %d - %s\n",
-+                       err == -1 ? "POLL" : "SOCKOPT",
-+                       err == -1 ? strerror(dapl_socket_errno()) : strerror(err), 
-+                       inet_ntoa(((struct sockaddr_in *)
-+                              &cm_ptr->addr)->sin_addr), 
-+                       ntohs(((struct sockaddr_in *)
-+                              &cm_ptr->addr)->sin_port),
-+                       err == ETIMEDOUT ? "RETRYING...":"ABORTING");
-+
-+              /* retry a timeout */
-+              if (err == ETIMEDOUT) {
-+                      closesocket(cm_ptr->socket);
-+                      cm_ptr->socket = DAPL_INVALID_SOCKET;
-+                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, 
-+                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,
-+                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);
-+                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);
-+                      dapli_cm_free(cm_ptr);
-+                      return;
-+              }
-+
-+              goto bail;
-+      }
-+
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_REP_PENDING;
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      /* send qp info and pdata to remote peer */
-+      exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
-+      iov[0].iov_base = (void *)&cm_ptr->msg;
-+      iov[0].iov_len = exp;
-+      if (cm_ptr->msg.p_size) {
-+              iov[1].iov_base = cm_ptr->msg.p_data;
-+              iov[1].iov_len = ntohs(cm_ptr->msg.p_size);
-+              len = writev(cm_ptr->socket, iov, 2);
-+      } else {
-+              len = writev(cm_ptr->socket, iov, 1);
-+      }
-+
-+      if (len != (exp + ntohs(cm_ptr->msg.p_size))) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_PENDING len ERR 0x%x %s, wcnt=%d(%d) -> %s\n",
-+                       err, strerror(err), len, 
-+                       exp + ntohs(cm_ptr->msg.p_size), 
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                 ep_ptr->param.
-+                                 remote_ia_address_ptr)->sin_addr));
-+              goto bail;
-+      }
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " CONN_PENDING: sending SRC lid=0x%x,"
-+                   " qpn=0x%x, psize=%d\n",
-+                   ntohs(cm_ptr->msg.saddr.ib.lid),
-+                   ntohl(cm_ptr->msg.saddr.ib.qpn), 
-+                   ntohs(cm_ptr->msg.p_size));
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " CONN_PENDING: SRC GID subnet %016llx id %016llx\n",
-+                   (unsigned long long)
-+                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[0]),
-+                   (unsigned long long)
-+                   htonll(*(uint64_t*)&cm_ptr->msg.saddr.ib.gid[8]));
-+      return;
-+
-+bail:
-+      /* mark CM object for cleanup */
-+      dapli_cm_free(cm_ptr);
-+      dapl_evd_connection_callback(NULL, IB_CME_LOCAL_FAILURE, NULL, 0, ep_ptr);
-+}
-+
-+/*
-+ * ACTIVE: Create socket, connect, defer exchange QP information to CR thread
-+ * to avoid blocking. 
-+ */
-+static DAT_RETURN
-+dapli_socket_connect(DAPL_EP * ep_ptr,
-+                   DAT_IA_ADDRESS_PTR r_addr,
-+                   DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data)
-+{
-+      dp_ib_cm_handle_t cm_ptr;
-+      int ret;
-+      socklen_t sl;
-+      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
-+      DAT_RETURN dat_ret = DAT_INSUFFICIENT_RESOURCES;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n",
-+                   r_qual, p_size);
-+
-+      cm_ptr = dapli_cm_alloc(ep_ptr);
-+      if (cm_ptr == NULL)
-+              return dat_ret;
-+
-+      /* create, connect, sockopt, and exchange QP information */
-+      if ((cm_ptr->socket =
-+           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " connect: socket create ERR 0x%x %s\n", 
-+                       err, strerror(err));
-+              goto bail;
-+      }
-+
-+      ret = dapl_config_socket(cm_ptr->socket);
-+      if (ret < 0) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " connect: config socket %d RET %d ERR 0x%x %s\n",
-+                       cm_ptr->socket, ret, 
-+                       dapl_socket_errno(), strerror(dapl_socket_errno()));
-+              dat_ret = DAT_INTERNAL_ERROR;
-+              goto bail;
-+      }
-+
-+      /* save remote address */
-+      dapl_os_memcpy(&cm_ptr->addr, r_addr, sizeof(*r_addr));
-+
-+#ifdef DAPL_DBG
-+      /* DBG: Active PID [0], PASSIVE PID [2]*/
-+      *(uint16_t*)&cm_ptr->msg.resv[0] = htons((uint16_t)dapl_os_getpid()); 
-+      *(uint16_t*)&cm_ptr->msg.resv[2] = ((struct sockaddr_in *)&cm_ptr->addr)->sin_port;
-+#endif
-+      ((struct sockaddr_in *)&cm_ptr->addr)->sin_port = htons(r_qual + 1000);
-+      ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&cm_ptr->addr,
-+                                sizeof(cm_ptr->addr));
-+      if (ret && ret != EAGAIN) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " connect: dapl_connect_socket RET %d ERR 0x%x %s\n",
-+                       ret, dapl_socket_errno(), 
-+                       strerror(dapl_socket_errno()));
-+              dat_ret = DAT_INVALID_ADDRESS;
-+              goto bail;
-+      }
-+
-+      /* REQ: QP info in msg.saddr, IA address in msg.daddr, and pdata */
-+      cm_ptr->hca = ia_ptr->hca_ptr;
-+      cm_ptr->msg.op = ntohs(DCM_REQ);
-+      cm_ptr->msg.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);
-+      cm_ptr->msg.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;
-+      cm_ptr->msg.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;
-+      dapl_os_memcpy(&cm_ptr->msg.saddr.ib.gid[0], 
-+                     &ia_ptr->hca_ptr->ib_trans.gid, 16);
-+      
-+      /* get local address information from socket */
-+      sl = sizeof(cm_ptr->msg.daddr.so);
-+      if (getsockname(cm_ptr->socket, (struct sockaddr *)&cm_ptr->msg.daddr.so, &sl)) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                      " connect getsockname ERROR: 0x%x %s -> %s r_qual %d\n",
-+                      err, strerror(err), 
-+                      inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
-+                      (unsigned int)r_qual);;
-+      }
-+
-+      if (p_size) {
-+              cm_ptr->msg.p_size = htons(p_size);
-+              dapl_os_memcpy(cm_ptr->msg.p_data, p_data, p_size);
-+      }
-+
-+      /* connected or pending, either way results via async event */
-+      if (ret == 0)
-+              dapli_socket_connected(cm_ptr, 0);
-+      else
-+              cm_ptr->state = DCM_CONN_PENDING;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: p_data=%p %p\n",
-+                   cm_ptr->msg.p_data, cm_ptr->msg.p_data);
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " connect: %s r_qual %d pending, p_sz=%d, %d %d ...\n",
-+                   inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), 
-+                   (unsigned int)r_qual, ntohs(cm_ptr->msg.p_size),
-+                   cm_ptr->msg.p_data[0], cm_ptr->msg.p_data[1]);
-+
-+      /* queue up on work thread */
-+      dapli_cm_queue(cm_ptr);
-+      return DAT_SUCCESS;
-+bail:
-+      dapl_log(DAPL_DBG_TYPE_ERR,
-+               " connect ERROR: -> %s r_qual %d\n",
-+               inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
-+               (unsigned int)r_qual);
-+
-+      /* Never queued, destroy */
-+      dapls_cm_release(cm_ptr);
-+      return dat_ret;
-+}
-+
-+/*
-+ * ACTIVE: exchange QP information, called from CR thread
-+ */
-+static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)
-+{
-+      DAPL_EP *ep_ptr = cm_ptr->ep;
-+      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
-+      ib_cm_events_t event = IB_CME_LOCAL_FAILURE;
-+      socklen_t sl;
-+
-+      /* read DST information into cm_ptr, overwrite SRC info */
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n");
-+
-+      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0);
-+      if (len != exp || ntohs(cm_ptr->msg.ver) != DCM_VER) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_WARN,
-+                       " CONN_RTU read: sk %d ERR 0x%x, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n",
-+                       cm_ptr->socket, err, len, ntohs(cm_ptr->msg.ver),
-+                       inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr),
-+                       ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port),
-+                       ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port),
-+                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[0]),
-+                       ntohs(*(uint16_t*)&cm_ptr->msg.resv[2]));
-+
-+              /* Retry; corner case where server tcp stack resets under load */
-+              if (err == ECONNRESET) {
-+                      closesocket(cm_ptr->socket);
-+                      cm_ptr->socket = DAPL_INVALID_SOCKET;
-+                      dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, 
-+                                           ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000,
-+                                           ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data);
-+                      dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr);
-+                      dapli_cm_free(cm_ptr);
-+                      return;
-+              }
-+              goto bail;
-+      }
-+
-+      /* keep the QP, address info in network order */
-+      
-+      /* save remote address information, in msg.daddr */
-+      dapl_os_memcpy(&cm_ptr->addr,
-+                     &cm_ptr->msg.daddr.so,
-+                     sizeof(union dcm_addr));
-+
-+      /* save local address information from socket */
-+      sl = sizeof(cm_ptr->addr);
-+      getsockname(cm_ptr->socket,(struct sockaddr *)&cm_ptr->addr, &sl);
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " CONN_RTU: DST %s %d lid=0x%x,"
-+                   " qpn=0x%x, qp_type=%d, psize=%d\n",
-+                   inet_ntoa(((struct sockaddr_in *)
-+                              &cm_ptr->msg.daddr.so)->sin_addr),
-+                   ntohs(((struct sockaddr_in *)
-+                              &cm_ptr->msg.daddr.so)->sin_port),
-+                   ntohs(cm_ptr->msg.saddr.ib.lid),
-+                   ntohl(cm_ptr->msg.saddr.ib.qpn), 
-+                   cm_ptr->msg.saddr.ib.qp_type, 
-+                   ntohs(cm_ptr->msg.p_size));
-+
-+      /* validate private data size before reading */
-+      if (ntohs(cm_ptr->msg.p_size) > DCM_MAX_PDATA_SIZE) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_RTU read: psize (%d) wrong -> %s\n",
-+                       ntohs(cm_ptr->msg.p_size), 
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                 ep_ptr->param.
-+                                 remote_ia_address_ptr)->sin_addr));
-+              goto bail;
-+      }
-+
-+      /* read private data into cm_handle if any present */
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP," CONN_RTU: read private data\n");
-+      exp = ntohs(cm_ptr->msg.p_size);
-+      if (exp) {
-+              len = recv(cm_ptr->socket, cm_ptr->msg.p_data, exp, 0);
-+              if (len != exp) {
-+                      int err = dapl_socket_errno();
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               " CONN_RTU read pdata: ERR 0x%x %s, rcnt=%d -> %s\n",
-+                               err, strerror(err), len,
-+                               inet_ntoa(((struct sockaddr_in *)
-+                                          ep_ptr->param.
-+                                          remote_ia_address_ptr)->sin_addr));
-+                      goto bail;
-+              }
-+      }
-+
-+      /* check for consumer or protocol stack reject */
-+      if (ntohs(cm_ptr->msg.op) == DCM_REP)
-+              event = IB_CME_CONNECTED;
-+      else if (ntohs(cm_ptr->msg.op) == DCM_REJ_USER) 
-+              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
-+      else  
-+              event = IB_CME_DESTINATION_REJECT;
-+      
-+      if (event != IB_CME_CONNECTED) {
-+              dapl_log(DAPL_DBG_TYPE_CM,
-+                       " CONN_RTU: reject from %s %x\n",
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                  &cm_ptr->msg.daddr.so)->sin_addr),
-+                       ntohs(((struct sockaddr_in *)
-+                               &cm_ptr->msg.daddr.so)->sin_port));
-+              goto bail;
-+      }
-+
-+      /* modify QP to RTR and then to RTS with remote info */
-+      dapl_os_lock(&ep_ptr->header.lock);
-+      if (dapls_modify_qp_state(ep_ptr->qp_handle,
-+                                IBV_QPS_RTR, 
-+                                cm_ptr->msg.saddr.ib.qpn,
-+                                cm_ptr->msg.saddr.ib.lid,
-+                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_RTU: QPS_RTR ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",
-+                       strerror(errno), ep_ptr->qp_handle->qp_type,
-+                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,
-+                       ntohl(cm_ptr->msg.saddr.ib.qpn), 
-+                       ntohs(cm_ptr->msg.saddr.ib.lid),
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                  &cm_ptr->msg.daddr.so)->sin_addr),
-+                       ntohs(((struct sockaddr_in *)
-+                               &cm_ptr->msg.daddr.so)->sin_port));
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              goto bail;
-+      }
-+      if (dapls_modify_qp_state(ep_ptr->qp_handle,
-+                                IBV_QPS_RTS, 
-+                                cm_ptr->msg.saddr.ib.qpn,
-+                                cm_ptr->msg.saddr.ib.lid,
-+                                NULL) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_RTU: QPS_RTS ERR %s (%d,%d,%x,%x,%x) -> %s %x\n",
-+                       strerror(errno), ep_ptr->qp_handle->qp_type,
-+                       ep_ptr->qp_state, ep_ptr->qp_handle->qp_num,
-+                       ntohl(cm_ptr->msg.saddr.ib.qpn), 
-+                       ntohs(cm_ptr->msg.saddr.ib.lid),
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                  &cm_ptr->msg.daddr.so)->sin_addr),
-+                       ntohs(((struct sockaddr_in *)
-+                               &cm_ptr->msg.daddr.so)->sin_port));
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              goto bail;
-+      }
-+      dapl_os_unlock(&ep_ptr->header.lock);
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n");
-+
-+      /* complete handshake after final QP state change, Just ver+op */
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_CONNECTED;
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      cm_ptr->msg.op = ntohs(DCM_RTU);
-+      if (send(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0) == -1) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_RTU: write ERR = 0x%x %s\n", 
-+                       err, strerror(err));
-+              goto bail;
-+      }
-+      /* post the event with private data */
-+      event = IB_CME_CONNECTED;
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");
-+
-+#ifdef DAT_EXTENSIONS
-+ud_bail:
-+      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {
-+              DAT_IB_EXTENSION_EVENT_DATA xevent;
-+              ib_pd_handle_t pd_handle = 
-+                      ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle;
-+
-+              if (event == IB_CME_CONNECTED) {
-+                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,
-+                                                   ep_ptr->qp_handle,
-+                                                   cm_ptr->msg.saddr.ib.lid, 
-+                                                   NULL);
-+                      if (cm_ptr->ah) {
-+                              /* post UD extended EVENT */
-+                              xevent.status = 0;
-+                              xevent.type = DAT_IB_UD_REMOTE_AH;
-+                              xevent.remote_ah.ah = cm_ptr->ah;
-+                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);
-+                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
-+                                              &ep_ptr->remote_ia_address,
-+                                              sizeof(union dcm_addr));
-+                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;
-+
-+                              dapl_log(DAPL_DBG_TYPE_CM, 
-+                                      " CONN_RTU: UD AH %p for lid 0x%x"
-+                                      " qpn 0x%x\n", 
-+                                      cm_ptr->ah, 
-+                                      ntohs(cm_ptr->msg.saddr.ib.lid),
-+                                      ntohl(cm_ptr->msg.saddr.ib.qpn));
-+      
-+                      } else 
-+                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
-+                      
-+              } else if (event == IB_CME_LOCAL_FAILURE) {
-+                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
-+              } else  
-+                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;
-+
-+              dapls_evd_post_connection_event_ext(
-+                              (DAPL_EVD *) ep_ptr->param.connect_evd_handle,
-+                              event,
-+                              (DAT_EP_HANDLE) ep_ptr,
-+                              (DAT_COUNT) exp,
-+                              (DAT_PVOID *) cm_ptr->msg.p_data,
-+                              (DAT_PVOID *) &xevent);
-+
-+              /* cleanup and release from local list */
-+              dapli_cm_free(cm_ptr);
-+      
-+      } else
-+#endif
-+      {
-+              dapli_ep_check(cm_ptr->ep);
-+              dapl_evd_connection_callback(cm_ptr, event, cm_ptr->msg.p_data,
-+                                           DCM_MAX_PDATA_SIZE, ep_ptr);
-+      }
-+      dapl_log(DAPL_DBG_TYPE_CM_EST,
-+               " SCM ACTIVE CONN: %x -> %s %x\n",
-+               ntohs(((struct sockaddr_in *) &cm_ptr->addr)->sin_port),
-+               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),
-+               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)-1000);
-+      return;
-+
-+bail:
-+
-+#ifdef DAT_EXTENSIONS
-+      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) 
-+              goto ud_bail;
-+#endif
-+      /* close socket, and post error event */
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_REJECTED;
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      dapl_evd_connection_callback(NULL, event, cm_ptr->msg.p_data,
-+                                   DCM_MAX_PDATA_SIZE, ep_ptr);
-+      dapli_cm_free(cm_ptr);
-+}
-+
-+/*
-+ * PASSIVE: Create socket, listen, accept, exchange QP information 
-+ */
-+DAT_RETURN
-+dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr)
-+{
-+      struct sockaddr_in addr;
-+      ib_cm_srvc_handle_t cm_ptr = NULL;
-+      DAT_RETURN dat_status = DAT_SUCCESS;
-+      int opt = 1;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " setup listen(ia_ptr %p ServiceID %d sp_ptr %p)\n",
-+                   ia_ptr, serviceID, sp_ptr);
-+
-+      cm_ptr = dapli_cm_alloc(NULL);
-+      if (cm_ptr == NULL)
-+              return DAT_INSUFFICIENT_RESOURCES;
-+
-+      cm_ptr->sp = sp_ptr;
-+      cm_ptr->hca = ia_ptr->hca_ptr;
-+
-+      /* bind, listen, set sockopt, accept, exchange data */
-+      if ((cm_ptr->socket =
-+           socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR, 
-+                       " listen: socket create: ERR 0x%x %s\n",
-+                       err, strerror(err));
-+              dat_status = DAT_INSUFFICIENT_RESOURCES;
-+              goto bail;
-+      }
-+
-+      setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));
-+      addr.sin_port = htons(serviceID + 1000);
-+      addr.sin_family = AF_INET;
-+      addr.sin_addr = ((struct sockaddr_in *) &ia_ptr->hca_ptr->hca_address)->sin_addr;
-+
-+      if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)
-+          || (listen(cm_ptr->socket, 128) < 0)) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_CM,
-+                       " listen: ERROR 0x%x %s on port %d\n",
-+                       err, strerror(err), serviceID + 1000);
-+              if (err == EADDRINUSE)
-+                      dat_status = DAT_CONN_QUAL_IN_USE;
-+              else
-+                      dat_status = DAT_CONN_QUAL_UNAVAILABLE;
-+              goto bail;
-+      }
-+
-+      /* set cm_handle for this service point, save listen socket */
-+      sp_ptr->cm_srvc_handle = cm_ptr;
-+      dapl_os_memcpy(&cm_ptr->addr, &addr, sizeof(addr)); 
-+
-+      /* queue up listen socket to process inbound CR's */
-+      cm_ptr->state = DCM_LISTEN;
-+      dapli_cm_queue(cm_ptr);
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " setup listen: port %d cr %p s_fd %d\n",
-+                   serviceID + 1000, cm_ptr, cm_ptr->socket);
-+
-+      return dat_status;
-+bail:
-+      /* Never queued, destroy here */
-+      dapls_cm_release(cm_ptr);
-+      return dat_status;
-+}
-+
-+/*
-+ * PASSIVE: accept socket 
-+ */
-+static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)
-+{
-+      dp_ib_cm_handle_t acm_ptr;
-+      int ret, len, opt = 1;
-+      socklen_t sl;
-+
-+      /* 
-+       * Accept all CR's on this port to avoid half-connection (SYN_RCV)
-+       * stalls with many to one connection storms
-+       */
-+      do {
-+              /* Allocate accept CM and initialize */
-+              if ((acm_ptr = dapli_cm_alloc(NULL)) == NULL)
-+                      return;
-+
-+              acm_ptr->sp = cm_ptr->sp;
-+              acm_ptr->hca = cm_ptr->hca;
-+
-+              len = sizeof(union dcm_addr);
-+              acm_ptr->socket = accept(cm_ptr->socket,
-+                                      (struct sockaddr *)
-+                                      &acm_ptr->msg.daddr.so,
-+                                      (socklen_t *) &len);
-+              if (acm_ptr->socket == DAPL_INVALID_SOCKET) {
-+                      int err = dapl_socket_errno();
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                              " ACCEPT: ERR 0x%x %s on FD %d l_cr %p\n",
-+                              err, strerror(err), cm_ptr->socket, cm_ptr);
-+                      dapls_cm_release(acm_ptr);
-+                      return;
-+              }
-+              dapl_dbg_log(DAPL_DBG_TYPE_CM, " accepting from %s %x\n",
-+                           inet_ntoa(((struct sockaddr_in *)
-+                                      &acm_ptr->msg.daddr.so)->sin_addr),
-+                           ntohs(((struct sockaddr_in *)
-+                                      &acm_ptr->msg.daddr.so)->sin_port));
-+
-+              /* no delay for small packets */
-+              ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,
-+                         (char *)&opt, sizeof(opt));
-+              if (ret) {
-+                      int err = dapl_socket_errno();
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               " ACCEPT: NODELAY setsockopt:"
-+                               " RET %d ERR 0x%x %s\n",
-+                               ret, err, strerror(err));
-+              }
-+
-+              /* get local address information from socket */
-+              sl = sizeof(acm_ptr->addr);
-+              getsockname(acm_ptr->socket, (struct sockaddr *)&acm_ptr->addr, &sl);
-+              acm_ptr->state = DCM_ACCEPTING;
-+              dapli_cm_queue(acm_ptr);
-+      
-+      } while (dapl_poll(cm_ptr->socket, DAPL_FD_READ) == DAPL_FD_READ);
-+}
-+
-+/*
-+ * PASSIVE: receive peer QP information, private data, post cr_event 
-+ */
-+static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)
-+{
-+      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
-+      void *p_data = NULL;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n");
-+
-+      /* read in DST QP info, IA address. check for private data */
-+      len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0);
-+      if (len != exp || ntohs(acm_ptr->msg.ver) != DCM_VER) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n",
-+                       err, strerror(err), len, ntohs(acm_ptr->msg.ver));
-+              goto bail;
-+      }
-+
-+      /* keep the QP, address info in network order */
-+
-+      /* validate private data size before reading */
-+      exp = ntohs(acm_ptr->msg.p_size);
-+      if (exp > DCM_MAX_PDATA_SIZE) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                           " accept read: psize (%d) wrong\n",
-+                           acm_ptr->msg.p_size);
-+              goto bail;
-+      }
-+
-+      /* read private data into cm_handle if any present */
-+      if (exp) {
-+              len = recv(acm_ptr->socket, acm_ptr->msg.p_data, exp, 0);
-+              if (len != exp) {
-+                      int err = dapl_socket_errno();
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               " accept read pdata: ERR 0x%x %s, rcnt=%d\n",
-+                               err, strerror(err), len);
-+                      goto bail;
-+              }
-+              p_data = acm_ptr->msg.p_data;
-+      }
-+      dapl_os_lock(&acm_ptr->lock);
-+      acm_ptr->state = DCM_ACCEPTING_DATA;
-+      dapl_os_unlock(&acm_ptr->lock);
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " ACCEPT: DST %s %x lid=0x%x, qpn=0x%x, psz=%d\n",
-+                   inet_ntoa(((struct sockaddr_in *)
-+                              &acm_ptr->msg.daddr.so)->sin_addr), 
-+                   ntohs(((struct sockaddr_in *)
-+                           &acm_ptr->msg.daddr.so)->sin_port),
-+                   ntohs(acm_ptr->msg.saddr.ib.lid), 
-+                   ntohl(acm_ptr->msg.saddr.ib.qpn), exp);
-+
-+#ifdef DAT_EXTENSIONS
-+      if (acm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {
-+              DAT_IB_EXTENSION_EVENT_DATA xevent;
-+
-+              /* post EVENT, modify_qp created ah */
-+              xevent.status = 0;
-+              xevent.type = DAT_IB_UD_CONNECT_REQUEST;
-+
-+              dapls_evd_post_cr_event_ext(acm_ptr->sp,
-+                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,
-+                                          acm_ptr,
-+                                          (DAT_COUNT) exp,
-+                                          (DAT_PVOID *) acm_ptr->msg.p_data,
-+                                          (DAT_PVOID *) &xevent);
-+      } else
-+#endif
-+              /* trigger CR event and return SUCCESS */
-+              dapls_cr_callback(acm_ptr,
-+                                IB_CME_CONNECTION_REQUEST_PENDING,
-+                                p_data, exp, acm_ptr->sp);
-+      return;
-+bail:
-+      /* mark for destroy, active will see socket close as rej */
-+      dapli_cm_free(acm_ptr);
-+      return;
-+}
-+
-+/*
-+ * PASSIVE: consumer accept, send local QP information, private data, 
-+ * queue on work thread to receive RTU information to avoid blocking
-+ * user thread. 
-+ */
-+static DAT_RETURN
-+dapli_socket_accept_usr(DAPL_EP * ep_ptr,
-+                      DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data)
-+{
-+      DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
-+      dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;
-+      ib_cm_msg_t local;
-+      struct iovec iov[2];
-+      int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
-+      DAT_RETURN ret = DAT_INTERNAL_ERROR;
-+      socklen_t sl;
-+
-+      if (p_size > DCM_MAX_PDATA_SIZE) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " accept_usr: psize(%d) too large\n", p_size);
-+              return DAT_LENGTH_ERROR;
-+      }
-+
-+      /* must have a accepted socket */
-+      if (cm_ptr->socket == DAPL_INVALID_SOCKET) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " accept_usr: cm socket invalid\n");
-+              goto bail;
-+      }
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " ACCEPT_USR: remote lid=0x%x"
-+                   " qpn=0x%x qp_type %d, psize=%d\n",
-+                   ntohs(cm_ptr->msg.saddr.ib.lid),
-+                   ntohl(cm_ptr->msg.saddr.ib.qpn), 
-+                   cm_ptr->msg.saddr.ib.qp_type, 
-+                   ntohs(cm_ptr->msg.p_size));
-+
-+#ifdef DAT_EXTENSIONS
-+      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD &&
-+          ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_USR: ERR remote QP is UD,"
-+                       ", but local QP is not\n");
-+              ret = (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);
-+              goto bail;
-+      }
-+#endif
-+
-+      /* modify QP to RTR and then to RTS with remote info already read */
-+      dapl_os_lock(&ep_ptr->header.lock);
-+      if (dapls_modify_qp_state(ep_ptr->qp_handle,
-+                                IBV_QPS_RTR, 
-+                                cm_ptr->msg.saddr.ib.qpn,
-+                                cm_ptr->msg.saddr.ib.lid,
-+                                (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_USR: QPS_RTR ERR %s -> %s\n",
-+                       strerror(errno), 
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                   &cm_ptr->msg.daddr.so)->sin_addr));
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              goto bail;
-+      }
-+      if (dapls_modify_qp_state(ep_ptr->qp_handle,
-+                                IBV_QPS_RTS, 
-+                                cm_ptr->msg.saddr.ib.qpn,
-+                                cm_ptr->msg.saddr.ib.lid,
-+                                NULL) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_USR: QPS_RTS ERR %s -> %s\n",
-+                       strerror(errno), 
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                   &cm_ptr->msg.daddr.so)->sin_addr));
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              goto bail;
-+      }
-+      dapl_os_unlock(&ep_ptr->header.lock);
-+
-+      /* save remote address information */
-+      dapl_os_memcpy(&ep_ptr->remote_ia_address,
-+                     &cm_ptr->msg.daddr.so,
-+                     sizeof(union dcm_addr));
-+
-+      /* send our QP info, IA address, pdata. Don't overwrite dst data */
-+      local.ver = htons(DCM_VER);
-+      local.op = htons(DCM_REP);
-+      local.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp_num);
-+      local.saddr.ib.qp_type = ep_ptr->qp_handle->qp_type;
-+      local.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid;
-+      dapl_os_memcpy(&local.saddr.ib.gid[0], 
-+                     &ia_ptr->hca_ptr->ib_trans.gid, 16);
-+      
-+      /* Get local address information from socket */
-+      sl = sizeof(local.daddr.so);
-+      getsockname(cm_ptr->socket, (struct sockaddr *)&local.daddr.so, &sl);
-+
-+#ifdef DAPL_DBG
-+      /* DBG: Active PID [0], PASSIVE PID [2] */
-+      *(uint16_t*)&cm_ptr->msg.resv[2] = htons((uint16_t)dapl_os_getpid()); 
-+      dapl_os_memcpy(local.resv, cm_ptr->msg.resv, 4); 
-+#endif
-+      cm_ptr->hca = ia_ptr->hca_ptr;
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_ACCEPTED;
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      /* Link CM to EP, already queued on work thread */
-+      dapl_ep_link_cm(ep_ptr, cm_ptr);
-+      cm_ptr->ep = ep_ptr;
-+
-+      local.p_size = htons(p_size);
-+      iov[0].iov_base = (void *)&local;
-+      iov[0].iov_len = exp;
-+      
-+      if (p_size) {
-+              iov[1].iov_base = p_data;
-+              iov[1].iov_len = p_size;
-+              len = writev(cm_ptr->socket, iov, 2);
-+      } else 
-+              len = writev(cm_ptr->socket, iov, 1);
-+      
-+      if (len != (p_size + exp)) {
-+              int err = dapl_socket_errno();
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_USR: ERR 0x%x %s, wcnt=%d -> %s\n",
-+                       err, strerror(err), len, 
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                 &cm_ptr->msg.daddr.so)->sin_addr));
-+              dapl_ep_unlink_cm(ep_ptr, cm_ptr);
-+              cm_ptr->ep = NULL;
-+              goto bail;
-+      }
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " ACCEPT_USR: local lid=0x%x qpn=0x%x psz=%d\n",
-+                   ntohs(local.saddr.ib.lid),
-+                   ntohl(local.saddr.ib.qpn), ntohs(local.p_size));
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " ACCEPT_USR: local GID subnet %016llx id %016llx\n",
-+                   (unsigned long long)
-+                   htonll(*(uint64_t*)&local.saddr.ib.gid[0]),
-+                   (unsigned long long)
-+                   htonll(*(uint64_t*)&local.saddr.ib.gid[8]));
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");
-+
-+      return DAT_SUCCESS;
-+bail:
-+      /* schedule cleanup from workq */
-+      dapli_cm_free(cm_ptr);
-+      return ret;
-+}
-+
-+/*
-+ * PASSIVE: read RTU from active peer, post CONN event
-+ */
-+static void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)
-+{
-+      int len;
-+      ib_cm_events_t event = IB_CME_CONNECTED;
-+
-+      /* complete handshake after final QP state change, VER and OP */
-+      len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0);
-+      if (len != 4 || ntohs(cm_ptr->msg.op) != DCM_RTU) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_RTU: rcv ERR, rcnt=%d op=%x <- %s\n",
-+                       len, ntohs(cm_ptr->msg.op),
-+                       inet_ntoa(((struct sockaddr_in *)
-+                                  &cm_ptr->msg.daddr.so)->sin_addr));
-+              event = IB_CME_DESTINATION_REJECT;
-+              goto bail;
-+      }
-+
-+      /* save state and reference to EP, queue for disc event */
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_CONNECTED;
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      /* final data exchange if remote QP state is good to go */
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n");
-+
-+#ifdef DAT_EXTENSIONS
-+ud_bail:
-+      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) {
-+              DAT_IB_EXTENSION_EVENT_DATA xevent;
-+
-+              ib_pd_handle_t pd_handle = 
-+                      ((DAPL_PZ *)cm_ptr->ep->param.pz_handle)->pd_handle;
-+              
-+              if (event == IB_CME_CONNECTED) {
-+                      cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle,
-+                                              cm_ptr->ep->qp_handle,
-+                                              cm_ptr->msg.saddr.ib.lid, 
-+                                              NULL);
-+                      if (cm_ptr->ah) { 
-+                              /* post EVENT, modify_qp created ah */
-+                              xevent.status = 0;
-+                              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;
-+                              xevent.remote_ah.ah = cm_ptr->ah;
-+                              xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn);
-+                              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
-+                                      &cm_ptr->msg.daddr.so,
-+                                      sizeof(union dcm_addr));
-+                              event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;
-+                      } else 
-+                              event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
-+              } else 
-+                      event = DAT_IB_UD_CONNECTION_ERROR_EVENT;
-+
-+              dapl_log(DAPL_DBG_TYPE_CM, 
-+                      " CONN_RTU: UD AH %p for lid 0x%x qpn 0x%x\n", 
-+                      cm_ptr->ah, ntohs(cm_ptr->msg.saddr.ib.lid),
-+                      ntohl(cm_ptr->msg.saddr.ib.qpn));
-+
-+              dapls_evd_post_connection_event_ext(
-+                              (DAPL_EVD *) 
-+                              cm_ptr->ep->param.connect_evd_handle,
-+                              event,
-+                              (DAT_EP_HANDLE) cm_ptr->ep,
-+                              (DAT_COUNT) ntohs(cm_ptr->msg.p_size),
-+                              (DAT_PVOID *) cm_ptr->msg.p_data,
-+                              (DAT_PVOID *) &xevent);
-+
-+                /* cleanup and release from local list, still on EP list */
-+              dapli_cm_free(cm_ptr);
-+                
-+      } else 
-+#endif
-+      {
-+              dapli_ep_check(cm_ptr->ep);
-+              dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
-+      }
-+      dapl_log(DAPL_DBG_TYPE_CM_EST,
-+               " SCM PASSIVE CONN: %x <- %s %x\n",
-+               cm_ptr->sp->conn_qual,
-+               inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr),
-+               ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port));
-+      return;
-+      
-+bail:
-+#ifdef DAT_EXTENSIONS
-+      if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) 
-+              goto ud_bail;
-+#endif
-+      dapl_os_lock(&cm_ptr->lock);
-+      cm_ptr->state = DCM_REJECTED;
-+      dapl_os_unlock(&cm_ptr->lock);
-+
-+      dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
-+      dapli_cm_free(cm_ptr);
-+}
-+
-+/*
-+ * dapls_ib_connect
-+ *
-+ * Initiate a connection with the passive listener on another node
-+ *
-+ * Input:
-+ *    ep_handle,
-+ *    remote_ia_address,
-+ *    remote_conn_qual,
-+ *    prd_size                size of private data and structure
-+ *    prd_prt                 pointer to private data structure
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INVALID_PARAMETER
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
-+               IN DAT_IA_ADDRESS_PTR remote_ia_address,
-+               IN DAT_CONN_QUAL remote_conn_qual,
-+               IN DAT_COUNT private_data_size, IN void *private_data)
-+{
-+      DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle;
-+      
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " connect(ep_handle %p ....)\n", ep_handle);
-+
-+      return (dapli_socket_connect(ep_ptr, remote_ia_address,
-+                                   remote_conn_qual,
-+                                   private_data_size, private_data));
-+}
-+
-+/*
-+ * dapls_ib_disconnect
-+ *
-+ * Disconnect an EP
-+ *
-+ * Input:
-+ *    ep_handle,
-+ *    disconnect_flags
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ */
-+DAT_RETURN
-+dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)
-+{
-+      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);
-+
-+      dapl_os_lock(&ep_ptr->header.lock);
-+      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||
-+          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||
-+          cm_ptr == NULL) {
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              return DAT_SUCCESS;
-+      } 
-+      dapl_os_unlock(&ep_ptr->header.lock);
-+      return (dapli_socket_disconnect(cm_ptr));
-+}
-+
-+/*
-+ * dapls_ib_disconnect_clean
-+ *
-+ * Clean up outstanding connection data. This routine is invoked
-+ * after the final disconnect callback has occurred. Only on the
-+ * ACTIVE side of a connection. It is also called if dat_ep_connect
-+ * times out using the consumer supplied timeout value.
-+ *
-+ * Input:
-+ *    ep_ptr          DAPL_EP
-+ *    active          Indicates active side of connection
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    void
-+ *
-+ */
-+void
-+dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,
-+                        IN DAT_BOOLEAN active,
-+                        IN const ib_cm_events_t ib_cm_event)
-+{
-+      if (ib_cm_event == IB_CME_TIMEOUT) {
-+              dp_ib_cm_handle_t cm_ptr;
-+
-+              if ((cm_ptr = dapl_get_cm_from_ep(ep_ptr)) == NULL)
-+                      return;
-+
-+              dapl_log(DAPL_DBG_TYPE_WARN,
-+                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",
-+                      ep_ptr, cm_ptr, dapl_cm_state_str(cm_ptr->state));
-+              
-+              /* schedule release of socket and local resources */
-+              dapli_cm_free(cm_ptr);
-+      }
-+}
-+
-+/*
-+ * dapl_ib_setup_conn_listener
-+ *
-+ * Have the CM set up a connection listener.
-+ *
-+ * Input:
-+ *    ibm_hca_handle          HCA handle
-+ *    qp_handle                       QP handle
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INTERNAL_ERROR
-+ *    DAT_CONN_QUAL_UNAVAILBLE
-+ *    DAT_CONN_QUAL_IN_USE
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,
-+                           IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)
-+{
-+      return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr));
-+}
-+
-+/*
-+ * dapl_ib_remove_conn_listener
-+ *
-+ * Have the CM remove a connection listener.
-+ *
-+ * Input:
-+ *    ia_handle               IA handle
-+ *    ServiceID               IB Channel Service ID
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INVALID_STATE
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)
-+{
-+      ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle;
-+
-+      /* free cm_srvc_handle, release will cleanup */
-+      if (cm_ptr != NULL) {
-+              /* cr_thread will free */
-+              sp_ptr->cm_srvc_handle = NULL;
-+              dapli_cm_free(cm_ptr);
-+      }
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_ib_accept_connection
-+ *
-+ * Perform necessary steps to accept a connection
-+ *
-+ * Input:
-+ *    cr_handle
-+ *    ep_handle
-+ *    private_data_size
-+ *    private_data
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INTERNAL_ERROR
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
-+                         IN DAT_EP_HANDLE ep_handle,
-+                         IN DAT_COUNT p_size, IN const DAT_PVOID p_data)
-+{
-+      DAPL_CR *cr_ptr;
-+      DAPL_EP *ep_ptr;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n",
-+                   cr_handle, ep_handle, p_data, p_size);
-+
-+      cr_ptr = (DAPL_CR *) cr_handle;
-+      ep_ptr = (DAPL_EP *) ep_handle;
-+
-+      /* allocate and attach a QP if necessary */
-+      if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
-+              DAT_RETURN status;
-+              status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
-+                                         ep_ptr, ep_ptr);
-+              if (status != DAT_SUCCESS)
-+                      return status;
-+      }
-+      return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data));
-+}
-+
-+/*
-+ * dapls_ib_reject_connection
-+ *
-+ * Reject a connection
-+ *
-+ * Input:
-+ *    cr_handle
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INTERNAL_ERROR
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr,
-+                         IN int reason,
-+                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)
-+{
-+      struct iovec iov[2];
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " reject(cm %p reason %x, pdata %p, psize %d)\n",
-+                   cm_ptr, reason, pdata, psize);
-+
-+        if (psize > DCM_MAX_PDATA_SIZE)
-+                return DAT_LENGTH_ERROR;
-+
-+      /* write reject data to indicate reject */
-+      cm_ptr->msg.op = htons(DCM_REJ_USER);
-+      cm_ptr->msg.p_size = htons(psize);
-+      
-+      iov[0].iov_base = (void *)&cm_ptr->msg;
-+      iov[0].iov_len = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE;
-+      if (psize) {
-+              iov[1].iov_base = pdata;
-+              iov[1].iov_len = psize;
-+              writev(cm_ptr->socket, iov, 2);
-+      } else {
-+              writev(cm_ptr->socket, iov, 1);
-+      }
-+
-+      /* release and cleanup CM object */
-+      dapli_cm_free(cm_ptr);
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_ib_cm_remote_addr
-+ *
-+ * Obtain the remote IP address given a connection
-+ *
-+ * Input:
-+ *    cr_handle
-+ *
-+ * Output:
-+ *    remote_ia_address: where to place the remote address
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INVALID_HANDLE
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,
-+                      OUT DAT_SOCK_ADDR6 * remote_ia_address)
-+{
-+      DAPL_HEADER *header;
-+      dp_ib_cm_handle_t conn;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",
-+                   dat_handle);
-+
-+      header = (DAPL_HEADER *) dat_handle;
-+
-+      if (header->magic == DAPL_MAGIC_EP)
-+              conn = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);
-+      else if (header->magic == DAPL_MAGIC_CR)
-+              conn = ((DAPL_CR *) dat_handle)->ib_cm_handle;
-+      else
-+              return DAT_INVALID_HANDLE;
-+
-+      dapl_os_memcpy(remote_ia_address,
-+                     &conn->msg.daddr.so, sizeof(DAT_SOCK_ADDR6));
-+
-+      return DAT_SUCCESS;
-+}
-+
-+int dapls_ib_private_data_size(
-+      IN DAPL_HCA *hca_ptr)
-+{
-+      return DCM_MAX_PDATA_SIZE;
-+}
-+
-+/* outbound/inbound CR processing thread to avoid blocking applications */
-+void cr_thread(void *arg)
-+{
-+      struct dapl_hca *hca_ptr = arg;
-+      dp_ib_cm_handle_t cr, next_cr;
-+      int opt, ret;
-+      socklen_t opt_len;
-+      char rbuf[2];
-+      struct dapl_fd_set *set;
-+      enum DAPL_FD_EVENTS event;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr);
-+      set = dapl_alloc_fd_set();
-+      if (!set)
-+              goto out;
-+
-+      dapl_os_lock(&hca_ptr->ib_trans.lock);
-+      hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;
-+
-+      while (1) {
-+              dapl_fd_zero(set);
-+              dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ);
-+
-+              if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))
-+                      next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list);
-+              else
-+                      next_cr = NULL;
-+
-+              while (next_cr) {
-+                      cr = next_cr;
-+                      next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,
-+                                                      (DAPL_LLIST_ENTRY *) 
-+                                                      &cr->local_entry);
-+                      dapls_cm_acquire(cr); /* hold thread ref */
-+                      dapl_os_lock(&cr->lock);
-+                      if (cr->state == DCM_FREE || 
-+                          hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {
-+                              dapl_log(DAPL_DBG_TYPE_CM, 
-+                                       " CM FREE: %p ep=%p st=%s sck=%d refs=%d\n", 
-+                                       cr, cr->ep, dapl_cm_state_str(cr->state), 
-+                                       cr->socket, cr->ref_count);
-+
-+                              if (cr->socket != DAPL_INVALID_SOCKET) {
-+                                      shutdown(cr->socket, SHUT_RDWR);
-+                                      closesocket(cr->socket);
-+                                      cr->socket = DAPL_INVALID_SOCKET;
-+                              }
-+                              dapl_os_unlock(&cr->lock);
-+                              dapls_cm_release(cr); /* release alloc ref */
-+                              dapli_cm_dequeue(cr); /* release workq ref */
-+                              dapls_cm_release(cr); /* release thread ref */
-+                              continue;
-+                      }
-+
-+                      event = (cr->state == DCM_CONN_PENDING) ?
-+                                      DAPL_FD_WRITE : DAPL_FD_READ;
-+
-+                      if (dapl_fd_set(cr->socket, set, event)) {
-+                              dapl_log(DAPL_DBG_TYPE_ERR,
-+                                       " cr_thread: fd_set ERR st=%d fd %d"
-+                                       " -> %s\n", cr->state, cr->socket,
-+                                       inet_ntoa(((struct sockaddr_in *)
-+                                              &cr->msg.daddr.so)->sin_addr));
-+                              dapl_os_unlock(&cr->lock);
-+                              dapls_cm_release(cr); /* release ref */
-+                              continue;
-+                      }
-+                      dapl_os_unlock(&cr->lock);
-+                      dapl_os_unlock(&hca_ptr->ib_trans.lock);
-+                      
-+                      ret = dapl_poll(cr->socket, event);
-+
-+                      dapl_dbg_log(DAPL_DBG_TYPE_THREAD,
-+                                   " poll ret=0x%x %s sck=%d\n",
-+                                   ret, dapl_cm_state_str(cr->state), 
-+                                   cr->socket);
-+
-+                      /* data on listen, qp exchange, and on disc req */
-+                      dapl_os_lock(&cr->lock);
-+                      if ((ret == DAPL_FD_READ) || 
-+                          (cr->state != DCM_CONN_PENDING && ret == DAPL_FD_ERROR)) {
-+                              if (cr->socket != DAPL_INVALID_SOCKET) {
-+                                      switch (cr->state) {
-+                                      case DCM_LISTEN:
-+                                              dapl_os_unlock(&cr->lock);
-+                                              dapli_socket_accept(cr);
-+                                                break;
-+                                      case DCM_ACCEPTING:
-+                                              dapl_os_unlock(&cr->lock);
-+                                              dapli_socket_accept_data(cr);
-+                                              break;
-+                                      case DCM_ACCEPTED:
-+                                              dapl_os_unlock(&cr->lock);
-+                                              dapli_socket_accept_rtu(cr);
-+                                              break;
-+                                      case DCM_REP_PENDING:
-+                                              dapl_os_unlock(&cr->lock);
-+                                              dapli_socket_connect_rtu(cr);
-+                                              break;
-+                                      case DCM_CONNECTED:
-+                                              dapl_os_unlock(&cr->lock);
-+                                              dapli_socket_disconnect(cr);
-+                                              break;
-+                                      default:
-+                                              dapl_os_unlock(&cr->lock);
-+                                              break;
-+                                      }
-+                              } else 
-+                                      dapl_os_unlock(&cr->lock);
-+
-+                      /* ASYNC connections, writable, readable, error; check status */
-+                      } else if (ret == DAPL_FD_WRITE ||
-+                                 (cr->state == DCM_CONN_PENDING && 
-+                                  ret == DAPL_FD_ERROR)) {
-+                              
-+                              opt = 0;
-+                              opt_len = sizeof(opt);
-+                              ret = getsockopt(cr->socket, SOL_SOCKET,
-+                                               SO_ERROR, (char *)&opt,
-+                                               &opt_len);
-+                              dapl_os_unlock(&cr->lock);
-+                              if (!ret && !opt)
-+                                      dapli_socket_connected(cr, opt);
-+                              else
-+                                      dapli_socket_connected(cr, opt ? opt : dapl_socket_errno());
-+                      } else 
-+                              dapl_os_unlock(&cr->lock);
-+
-+                      dapls_cm_release(cr); /* release ref */
-+                      dapl_os_lock(&hca_ptr->ib_trans.lock);
-+              }
-+
-+              /* set to exit and all resources destroyed */
-+              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&
-+                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))
-+                      break;
-+
-+              dapl_os_unlock(&hca_ptr->ib_trans.lock);
-+              dapl_select(set);
-+
-+              /* if pipe used to wakeup, consume */
-+              while (dapl_poll(hca_ptr->ib_trans.scm[0], 
-+                               DAPL_FD_READ) == DAPL_FD_READ) {
-+                      if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1)
-+                              dapl_log(DAPL_DBG_TYPE_THREAD,
-+                                       " cr_thread: read pipe error = %s\n",
-+                                       strerror(errno));
-+              }
-+              dapl_os_lock(&hca_ptr->ib_trans.lock);
-+              
-+              /* set to exit and all resources destroyed */
-+              if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&
-+                  (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))
-+                      break;
-+      }
-+
-+      dapl_os_unlock(&hca_ptr->ib_trans.lock);
-+      dapl_os_free(set, sizeof(struct dapl_fd_set));
-+out:
-+      hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;
-+      dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " cr_thread(hca %p) exit\n", hca_ptr);
-+}
-+
-+
-+#ifdef DAPL_COUNTERS
-+/* Debug aid: List all Connections in process and state */
-+void dapls_print_cm_list(IN DAPL_IA *ia_ptr)
-+{
-+      /* Print in process CR's for this IA, if debug type set */
-+      int i = 0;
-+      dp_ib_cm_handle_t cr, next_cr;
-+
-+      dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock);
-+      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)
-+                               &ia_ptr->hca_ptr->ib_trans.list))
-+                               next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*)
-+                               &ia_ptr->hca_ptr->ib_trans.list);
-+      else
-+              next_cr = NULL;
-+
-+        printf("\n DAPL IA CONNECTIONS IN PROCESS:\n");
-+      while (next_cr) {
-+              cr = next_cr;
-+              next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*)
-+                               &ia_ptr->hca_ptr->ib_trans.list,
-+                              (DAPL_LLIST_ENTRY*)&cr->local_entry);
-+
-+              printf( "  CONN[%d]: sp %p ep %p sock %d %s %s %s %s %s %s PORT L-%x R-%x PID L-%x R-%x\n",
-+                      i, cr->sp, cr->ep, cr->socket,
-+                      cr->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",
-+                      dapl_cm_state_str(cr->state), dapl_cm_op_str(ntohs(cr->msg.op)),
-+                      ntohs(cr->msg.op) == DCM_REQ ? /* local address */
-+                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr) :
-+                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr),
-+                      cr->sp ? "<-" : "->",
-+                              ntohs(cr->msg.op) == DCM_REQ ? /* remote address */
-+                              inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr) :
-+                              inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr),
-+
-+                      ntohs(cr->msg.op) == DCM_REQ ? /* local port */
-+                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port) :
-+                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port),
-+
-+                      ntohs(cr->msg.op) == DCM_REQ ? /* remote port */
-+                              ntohs(((struct sockaddr_in *)&cr->addr)->sin_port) :
-+                              ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port),
-+
-+                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[2]) : ntohs(*(uint16_t*)&cr->msg.resv[0]),
-+                      cr->sp ? ntohs(*(uint16_t*)&cr->msg.resv[0]) : ntohs(*(uint16_t*)&cr->msg.resv[2]));
-+
-+              i++;
-+      }
-+      printf("\n");
-+      dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock);
-+}
-+#endif
-diff --git a/trunk/ulp/dapl2/dapl/openib_ucm/cm.c b/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
-index c5c125a..be15c0f 100644
---- a/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
-+++ b/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
-@@ -1,2166 +1,2166 @@
--/*\r
-- * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
-- *\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--#include "dapl.h"\r
--#include "dapl_adapter_util.h"\r
--#include "dapl_evd_util.h"\r
--#include "dapl_cr_util.h"\r
--#include "dapl_name_service.h"\r
--#include "dapl_ib_util.h"\r
--#include "dapl_ep_util.h"\r
--#include "dapl_osd.h"\r
--\r
--\r
--#if defined(_WIN32)\r
--#include <rdma\winverbs.h>\r
--#else                         // _WIN32\r
--enum DAPL_FD_EVENTS {\r
--      DAPL_FD_READ = POLLIN,\r
--      DAPL_FD_WRITE = POLLOUT,\r
--      DAPL_FD_ERROR = POLLERR\r
--};\r
--\r
--struct dapl_fd_set {\r
--      int index;\r
--      struct pollfd set[DAPL_FD_SETSIZE];\r
--};\r
--\r
--static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
--{\r
--      return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
--}\r
--\r
--static void dapl_fd_zero(struct dapl_fd_set *set)\r
--{\r
--      set->index = 0;\r
--}\r
--\r
--static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
--                     enum DAPL_FD_EVENTS event)\r
--{\r
--      if (set->index == DAPL_FD_SETSIZE - 1) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",\r
--                       set->index + 1);\r
--              return -1;\r
--      }\r
--\r
--      set->set[set->index].fd = s;\r
--      set->set[set->index].revents = 0;\r
--      set->set[set->index++].events = event;\r
--      return 0;\r
--}\r
--\r
--static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
--{\r
--      struct pollfd fds;\r
--      int ret;\r
--\r
--      fds.fd = s;\r
--      fds.events = event;\r
--      fds.revents = 0;\r
--      ret = poll(&fds, 1, 0);\r
--      dapl_log(DAPL_DBG_TYPE_CM, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",\r
--               s, ret, fds.revents);\r
--      if (ret == 0)\r
--              return 0;\r
--      else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) \r
--              return DAPL_FD_ERROR;\r
--      else \r
--              return fds.revents;\r
--}\r
--\r
--static int dapl_select(struct dapl_fd_set *set, int time_ms)\r
--{\r
--      int ret;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep, fds=%d\n",\r
--                   set->index);\r
--      ret = poll(set->set, set->index, time_ms);\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup, ret=0x%x\n", ret);\r
--      return ret;\r
--}\r
--#endif\r
--\r
--/* forward declarations */\r
--static int ucm_reply(dp_ib_cm_handle_t cm);\r
--static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg);\r
--static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);\r
--static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);\r
--static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size);\r
--static void ucm_disconnect_final(dp_ib_cm_handle_t cm);\r
--DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm);\r
--DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm);\r
--\r
--#define UCM_SND_BURST 50      \r
--\r
--/* Service ids - port space */\r
--static uint16_t ucm_get_port(ib_hca_transport_t *tp, uint16_t port)\r
--{\r
--      int i = 0;\r
--      \r
--      dapl_os_lock(&tp->plock);\r
--      /* get specific ID */\r
--      if (port) {\r
--              if (tp->sid[port] == 0) {\r
--                      tp->sid[port] = 1;\r
--                      i = port;\r
--              }\r
--              goto done;\r
--      } \r
--      \r
--      /* get any free ID */\r
--      for (i = 0xffff; i > 0; i--) {\r
--              if (tp->sid[i] == 0) {\r
--                      tp->sid[i] = 1;\r
--                      break;\r
--              }\r
--      }\r
--done:\r
--      dapl_os_unlock(&tp->plock);\r
--      return i;\r
--}\r
--\r
--static void ucm_free_port(ib_hca_transport_t *tp, uint16_t port)\r
--{\r
--      dapl_os_lock(&tp->plock);\r
--      tp->sid[port] = 0;\r
--      dapl_os_unlock(&tp->plock);\r
--}\r
--\r
--static void ucm_check_timers(dp_ib_cm_handle_t cm, int *timer)\r
--{\r
--      DAPL_OS_TIMEVAL time;\r
--\r
--        dapl_os_lock(&cm->lock);\r
--      dapl_os_get_time(&time); \r
--      switch (cm->state) {\r
--      case DCM_REP_PENDING: \r
--              *timer = cm->hca->ib_trans.cm_timer; \r
--              /* wait longer each retry */\r
--              if ((time - cm->timer)/1000 > \r
--                  (cm->hca->ib_trans.rep_time << cm->retries)) {\r
--                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
--                               " CM_REQ retry %p %d [lid, port, qpn]:"\r
--                               " %x %x %x -> %x %x %x Time(ms) %llu > %d\n", \r
--                               cm, cm->retries+1, ntohs(cm->msg.saddr.ib.lid), \r
--                               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), \r
--                               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),\r
--                               ntohl(cm->msg.dqpn), (time - cm->timer)/1000, \r
--                               cm->hca->ib_trans.rep_time << cm->retries);\r
--                      cm->retries++;\r
--                      dapl_os_unlock(&cm->lock);\r
--                      dapli_cm_connect(cm->ep, cm);\r
--                      return;\r
--              }\r
--              break;\r
--      case DCM_RTU_PENDING: \r
--              *timer = cm->hca->ib_trans.cm_timer;  \r
--              if ((time - cm->timer)/1000 > \r
--                  (cm->hca->ib_trans.rtu_time << cm->retries)) {\r
--                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
--                               " CM_REPLY retry %d [lid, port, qpn]:"\r
--                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", \r
--                               cm->retries+1,\r
--                               ntohs(cm->msg.saddr.ib.lid), \r
--                               ntohs(cm->msg.sport),\r
--                               ntohl(cm->msg.saddr.ib.qpn), \r
--                               ntohs(cm->msg.daddr.ib.lid), \r
--                               ntohs(cm->msg.dport),\r
--                               ntohl(cm->msg.daddr.ib.qpn),  \r
--                               ntohl(*(DAT_UINT32*)cm->msg.resv),\r
--                               ntohl(*(DAT_UINT32*)cm->msg.resv), \r
--                               (time - cm->timer)/1000, \r
--                               cm->hca->ib_trans.rtu_time << cm->retries);\r
--                      cm->retries++;\r
--                      dapl_os_unlock(&cm->lock);\r
--                      ucm_reply(cm);\r
--                      return;\r
--              }\r
--              break;\r
--      case DCM_DISC_PENDING: \r
--              *timer = cm->hca->ib_trans.cm_timer; \r
--              /* wait longer each retry */\r
--              if ((time - cm->timer)/1000 > \r
--                  (cm->hca->ib_trans.rtu_time << cm->retries)) {\r
--                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
--                               " CM_DREQ retry %d [lid, port, qpn]:"\r
--                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", \r
--                               cm->retries+1,\r
--                               ntohs(cm->msg.saddr.ib.lid), \r
--                               ntohs(cm->msg.sport),\r
--                               ntohl(cm->msg.saddr.ib.qpn), \r
--                               ntohs(cm->msg.daddr.ib.lid), \r
--                               ntohs(cm->msg.dport),\r
--                               ntohl(cm->msg.dqpn), \r
--                               ntohl(*(DAT_UINT32*)cm->msg.resv),\r
--                               ntohl(*(DAT_UINT32*)cm->msg.resv), \r
--                               (time - cm->timer)/1000, \r
--                               cm->hca->ib_trans.rtu_time << cm->retries);\r
--                      cm->retries++;\r
--                      dapl_os_unlock(&cm->lock);\r
--                      dapli_cm_disconnect(cm);\r
--                        return;\r
--              }\r
--              break;\r
--      default:\r
--              break;\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--}\r
--\r
--/* SEND CM MESSAGE PROCESSING */\r
--\r
--/* Get CM UD message from send queue, called with s_lock held */\r
--static ib_cm_msg_t *ucm_get_smsg(ib_hca_transport_t *tp)\r
--{\r
--      ib_cm_msg_t *msg = NULL; \r
--      int ret, polled = 0, hd = tp->s_hd;\r
--\r
--      hd++;\r
--retry:\r
--      if (hd == tp->qpe)\r
--              hd = 0;\r
--\r
--      if (hd == tp->s_tl)\r
--              msg = NULL;\r
--      else {\r
--              msg = &tp->sbuf[hd];\r
--              tp->s_hd = hd; /* new hd */\r
--      }\r
--\r
--      /* if empty, process some completions */\r
--      if ((msg == NULL) && (!polled)) {\r
--              struct ibv_wc wc;\r
--\r
--              /* process completions, based on UCM_SND_BURST */\r
--              ret = ibv_poll_cq(tp->scq, 1, &wc);\r
--              if (ret < 0) {\r
--                      dapl_log(DAPL_DBG_TYPE_WARN,\r
--                              " get_smsg: cq %p %s\n", \r
--                              tp->scq, strerror(errno));\r
--              }\r
--              /* free up completed sends, update tail */\r
--              if (ret > 0) {\r
--                      tp->s_tl = (int)wc.wr_id;\r
--                      dapl_log(DAPL_DBG_TYPE_CM,\r
--                              " get_smsg: wr_cmp (%d) s_tl=%d\n", \r
--                              wc.status, tp->s_tl);\r
--              }\r
--              polled++;\r
--              goto retry;\r
--      }\r
--      return msg;\r
--}\r
--\r
--/* RECEIVE CM MESSAGE PROCESSING */\r
--\r
--static int ucm_post_rmsg(ib_hca_transport_t *tp, ib_cm_msg_t *msg)\r
--{     \r
--      struct ibv_recv_wr recv_wr, *recv_err;\r
--      struct ibv_sge sge;\r
--        \r
--      recv_wr.next = NULL;\r
--      recv_wr.sg_list = &sge;\r
--      recv_wr.num_sge = 1;\r
--      recv_wr.wr_id = (uint64_t)(uintptr_t) msg;\r
--      sge.length = sizeof(ib_cm_msg_t) + sizeof(struct ibv_grh);\r
--      sge.lkey = tp->mr_rbuf->lkey;\r
--      sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh));\r
--      \r
--      return (ibv_post_recv(tp->qp, &recv_wr, &recv_err));\r
--}\r
--\r
--static int ucm_reject(ib_hca_transport_t *tp, ib_cm_msg_t *msg)\r
--{\r
--      ib_cm_msg_t     smsg;\r
--\r
--      /* setup op, rearrange the src, dst cm and addr info */\r
--      (void)dapl_os_memzero(&smsg, sizeof(smsg));\r
--      smsg.ver = htons(DCM_VER);\r
--      smsg.op = htons(DCM_REJ_CM);\r
--      smsg.dport = msg->sport;\r
--      smsg.dqpn = msg->sqpn;\r
--      smsg.sport = msg->dport; \r
--      smsg.sqpn = msg->dqpn;\r
--\r
--      dapl_os_memcpy(&smsg.daddr, &msg->saddr, sizeof(union dcm_addr));\r
--      \r
--      /* no dst_addr IB info in REQ, init lid, gid, get type from saddr */\r
--      smsg.saddr.ib.lid = tp->addr.ib.lid; \r
--      smsg.saddr.ib.qp_type = msg->saddr.ib.qp_type;\r
--      dapl_os_memcpy(&smsg.saddr.ib.gid[0],\r
--                     &tp->addr.ib.gid, 16); \r
--\r
--      dapl_os_memcpy(&smsg.saddr, &msg->daddr, sizeof(union dcm_addr));\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
--                   " CM reject -> LID %x, QPN %x PORT %x\n", \r
--                   ntohs(smsg.daddr.ib.lid),\r
--                   ntohl(smsg.dqpn), ntohs(smsg.dport));\r
--\r
--      return (ucm_send(tp, &smsg, NULL, 0));\r
--}\r
--\r
--static void ucm_process_recv(ib_hca_transport_t *tp, \r
--                           ib_cm_msg_t *msg, \r
--                           dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_os_lock(&cm->lock);\r
--      switch (cm->state) {\r
--      case DCM_LISTEN: /* passive */\r
--              dapl_os_unlock(&cm->lock);\r
--              ucm_accept(cm, msg);\r
--              break;\r
--      case DCM_RTU_PENDING: /* passive */\r
--              dapl_os_unlock(&cm->lock);\r
--              ucm_accept_rtu(cm, msg);\r
--              break;\r
--      case DCM_REP_PENDING: /* active */\r
--              dapl_os_unlock(&cm->lock);\r
--              ucm_connect_rtu(cm, msg);\r
--              break;\r
--      case DCM_CONNECTED: /* active and passive */\r
--              /* DREQ, change state and process */\r
--              if (ntohs(msg->op) == DCM_DREQ) {\r
--                      cm->state = DCM_DISC_RECV;\r
--                      dapl_os_unlock(&cm->lock);\r
--                      dapli_cm_disconnect(cm);\r
--                      break;\r
--              } \r
--              /* active: RTU was dropped, resend */\r
--              if (ntohs(msg->op) == DCM_REP) {\r
--                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
--                              " RESEND RTU: op %s st %s [lid, port, qpn]:"\r
--                              " %x %x %x -> %x %x %x\n", \r
--                              dapl_cm_op_str(ntohs(msg->op)), \r
--                              dapl_cm_state_str(cm->state),\r
--                              ntohs(msg->saddr.ib.lid), \r
--                              ntohs(msg->sport),\r
--                              ntohl(msg->saddr.ib.qpn), \r
--                              ntohs(msg->daddr.ib.lid), \r
--                              ntohs(msg->dport),\r
--                              ntohl(msg->daddr.ib.qpn));  \r
--\r
--                      cm->msg.op = htons(DCM_RTU);\r
--                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0);                \r
--              }\r
--              dapl_os_unlock(&cm->lock);\r
--              break;\r
--      case DCM_DISC_PENDING: /* active and passive */\r
--              /* DREQ or DREP, finalize */\r
--              dapl_os_unlock(&cm->lock);\r
--              ucm_disconnect_final(cm);\r
--              break;\r
--      case DCM_DISCONNECTED:\r
--      case DCM_FREE:\r
--              /* DREQ dropped, resend */\r
--              if (ntohs(msg->op) == DCM_DREQ) {\r
--                      dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
--                              " RESEND DREP: op %s st %s [lid, port, qpn]:"\r
--                              " %x %x %x -> %x %x %x\n", \r
--                              dapl_cm_op_str(ntohs(msg->op)), \r
--                              dapl_cm_state_str(cm->state),\r
--                              ntohs(msg->saddr.ib.lid), \r
--                              ntohs(msg->sport),\r
--                              ntohl(msg->saddr.ib.qpn), \r
--                              ntohs(msg->daddr.ib.lid), \r
--                              ntohs(msg->dport),\r
--                              ntohl(msg->daddr.ib.qpn));  \r
--                      cm->msg.op = htons(DCM_DREP);\r
--                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); \r
--                      \r
--              } else if (ntohs(msg->op) != DCM_DREP){\r
--                      /* DREP ok to ignore, any other print warning */\r
--                      dapl_log(DAPL_DBG_TYPE_WARN,\r
--                              " ucm_recv: UNEXPECTED MSG on cm %p"\r
--                              " <- op %s, st %s spsp %x sqpn %x\n", \r
--                              cm, dapl_cm_op_str(ntohs(msg->op)),\r
--                              dapl_cm_state_str(cm->state),\r
--                              ntohs(msg->sport), ntohl(msg->sqpn));\r
--              }\r
--              dapl_os_unlock(&cm->lock);\r
--              break;\r
--      default:\r
--              dapl_log(DAPL_DBG_TYPE_WARN,\r
--                              " ucm_recv: UNKNOWN state"\r
--                              " <- op %s, %s spsp %x sqpn %x\n", \r
--                              dapl_cm_op_str(ntohs(msg->op)), \r
--                              dapl_cm_state_str(cm->state), \r
--                              ntohs(msg->sport), ntohl(msg->sqpn));\r
--              dapl_os_unlock(&cm->lock);\r
--              break;\r
--      }\r
--}\r
--\r
--/* Find matching CM object for this receive message, return CM reference, timer */\r
--dp_ib_cm_handle_t ucm_cm_find(ib_hca_transport_t *tp, ib_cm_msg_t *msg)\r
--{\r
--      dp_ib_cm_handle_t cm, next, found = NULL;\r
--      struct dapl_llist_entry **list;\r
--      DAPL_OS_LOCK *lock;\r
--      int listenq = 0;\r
--\r
--      /* conn list first, duplicate requests for DCM_REQ */\r
--      list = &tp->list;\r
--      lock = &tp->lock;\r
--\r
--retry_listenq:\r
--      dapl_os_lock(lock);\r
--        if (!dapl_llist_is_empty(list))\r
--              next = dapl_llist_peek_head(list);\r
--      else\r
--              next = NULL;\r
--\r
--      while (next) {\r
--              cm = next;\r
--              next = dapl_llist_next_entry(list,\r
--                                           (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--              if (cm->state == DCM_DESTROY || cm->state == DCM_FREE)\r
--                      continue;\r
--              \r
--              /* CM sPORT + QPN, match is good enough for listenq */\r
--              if (listenq && \r
--                  cm->msg.sport == msg->dport && \r
--                  cm->msg.sqpn == msg->dqpn) {\r
--                      found = cm;\r
--                      break;\r
--              }        \r
--              /* connectq, check src and dst, check duplicate conn_reqs */\r
--              if (!listenq && \r
--                  cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn && \r
--                  cm->msg.dport == msg->sport && cm->msg.dqpn == msg->sqpn && \r
--                  cm->msg.daddr.ib.lid == msg->saddr.ib.lid) {\r
--                      if (ntohs(msg->op) != DCM_REQ) {\r
--                              found = cm;\r
--                              break; \r
--                      } else {\r
--                              /* duplicate; bail and throw away */\r
--                              dapl_os_unlock(lock);\r
--                              dapl_log(DAPL_DBG_TYPE_CM_WARN,\r
--                                       " DUPLICATE: cm %p op %s st %s [lid, port, qpn]:"\r
--                                       " %x %x %x <- %x %x %x\n", cm,\r
--                                       dapl_cm_op_str(ntohs(msg->op)), \r
--                                       dapl_cm_state_str(cm->state),\r
--                                       ntohs(msg->daddr.ib.lid), \r
--                                       ntohs(msg->dport),\r
--                                       ntohl(msg->daddr.ib.qpn), \r
--                                       ntohs(msg->saddr.ib.lid), \r
--                                       ntohs(msg->sport),\r
--                                       ntohl(msg->saddr.ib.qpn));  \r
--\r
--                              return NULL;\r
--                      }\r
--              }\r
--      }\r
--      dapl_os_unlock(lock);\r
--\r
--      /* no duplicate request on connq, check listenq for new request */\r
--      if (ntohs(msg->op) == DCM_REQ && !listenq && !found) {\r
--              listenq = 1;\r
--              list = &tp->llist;\r
--              lock = &tp->llock;\r
--              goto retry_listenq;\r
--      }\r
--\r
--      /* not match on listenq for valid request, send reject */\r
--      if (ntohs(msg->op) == DCM_REQ && !found) {\r
--              dapl_log(DAPL_DBG_TYPE_WARN,\r
--                      " ucm_recv: NO LISTENER for %s %x %x i%x c%x"\r
--                      " < %x %x %x, sending reject\n", \r
--                      dapl_cm_op_str(ntohs(msg->op)), \r
--                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), \r
--                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),\r
--                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), \r
--                      ntohl(msg->saddr.ib.qpn));\r
--\r
--              ucm_reject(tp, msg);\r
--      }\r
--\r
--      if (!found) {\r
--              dapl_log(DAPL_DBG_TYPE_CM,\r
--                      " ucm_recv: NO MATCH op %s %x %x i%x c%x"\r
--                      " < %x %x %x\n", \r
--                      dapl_cm_op_str(ntohs(msg->op)), \r
--                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), \r
--                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),\r
--                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), \r
--                      ntohl(msg->saddr.ib.qpn));\r
--      }\r
--\r
--      return found;\r
--}\r
--\r
--/* Get rmsgs from CM completion queue, 10 at a time */\r
--static void ucm_recv(ib_hca_transport_t *tp)\r
--{\r
--      struct ibv_wc wc[10];\r
--      ib_cm_msg_t *msg;\r
--      dp_ib_cm_handle_t cm;\r
--      int i, ret, notify = 0;\r
--      struct ibv_cq *ibv_cq = NULL;\r
--      DAPL_HCA *hca;\r
--\r
--      /* POLLIN on channel FD */\r
--      ret = ibv_get_cq_event(tp->rch, &ibv_cq, (void *)&hca);\r
--      if (ret == 0) {\r
--              ibv_ack_cq_events(ibv_cq, 1);\r
--      }\r
--retry:        \r
--      ret = ibv_poll_cq(tp->rcq, 10, wc);\r
--      if (ret <= 0) {\r
--              if (!ret && !notify) {\r
--                      ibv_req_notify_cq(tp->rcq, 0);\r
--                      notify = 1;\r
--                      goto retry;\r
--              }\r
--              return;\r
--      } else \r
--              notify = 0;\r
--      \r
--      for (i = 0; i < ret; i++) {\r
--              msg = (ib_cm_msg_t*) (uintptr_t) wc[i].wr_id;\r
--\r
--              dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
--                           " ucm_recv: wc status=%d, ln=%d id=%p sqp=%x\n", \r
--                           wc[i].status, wc[i].byte_len, \r
--                           (void*)wc[i].wr_id, wc[i].src_qp);\r
--\r
--              /* validate CM message, version */\r
--              if (ntohs(msg->ver) != DCM_VER) {\r
--                      dapl_log(DAPL_DBG_TYPE_WARN,\r
--                               " ucm_recv: UNKNOWN msg %p, ver %d\n", \r
--                               msg, msg->ver);\r
--                      ucm_post_rmsg(tp, msg);\r
--                      continue;\r
--              }\r
--              if (!(cm = ucm_cm_find(tp, msg))) {\r
--                      ucm_post_rmsg(tp, msg);\r
--                      continue;\r
--              }\r
--              \r
--              /* match, process it */\r
--              ucm_process_recv(tp, msg, cm);\r
--              ucm_post_rmsg(tp, msg);\r
--      }\r
--      \r
--      /* finished this batch of WC's, poll and rearm */\r
--      goto retry;\r
--}\r
--\r
--/* ACTIVE/PASSIVE: build and send CM message out of CM object */\r
--static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size)\r
--{\r
--      ib_cm_msg_t *smsg = NULL;\r
--      struct ibv_send_wr wr, *bad_wr;\r
--      struct ibv_sge sge;\r
--      int len, ret = -1;\r
--      uint16_t dlid = ntohs(msg->daddr.ib.lid);\r
--\r
--      /* Get message from send queue, copy data, and send */\r
--      dapl_os_lock(&tp->slock);\r
--      if ((smsg = ucm_get_smsg(tp)) == NULL)\r
--              goto bail;\r
--\r
--      len = (sizeof(*msg) - DCM_MAX_PDATA_SIZE);\r
--      dapl_os_memcpy(smsg, msg, len);\r
--      if (p_size) {\r
--              smsg->p_size = ntohs(p_size);\r
--              dapl_os_memcpy(&smsg->p_data, p_data, p_size);\r
--      }\r
--\r
--      wr.next = NULL;\r
--        wr.sg_list = &sge;\r
--        wr.num_sge = 1;\r
--        wr.opcode = IBV_WR_SEND;\r
--        wr.wr_id = (unsigned long)tp->s_hd;\r
--      wr.send_flags = (wr.wr_id % UCM_SND_BURST) ? 0 : IBV_SEND_SIGNALED;\r
--      if (len <= tp->max_inline_send)\r
--              wr.send_flags |= IBV_SEND_INLINE; \r
--\r
--        sge.length = len + p_size;\r
--        sge.lkey = tp->mr_sbuf->lkey;\r
--        sge.addr = (uintptr_t)smsg;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
--              " ucm_send: op %s ln %d lid %x c_qpn %x rport %s\n", \r
--              dapl_cm_op_str(ntohs(smsg->op)), \r
--              sge.length, htons(smsg->daddr.ib.lid), \r
--              htonl(smsg->dqpn), htons(smsg->dport));\r
--\r
--      /* empty slot, then create AH */\r
--      if (!tp->ah[dlid]) {\r
--              tp->ah[dlid] =  \r
--                      dapls_create_ah(tp->hca, tp->pd, tp->qp, \r
--                                      htons(dlid), NULL);\r
--              if (!tp->ah[dlid])\r
--                      goto bail;\r
--      }\r
--              \r
--      wr.wr.ud.ah = tp->ah[dlid];\r
--      wr.wr.ud.remote_qpn = ntohl(smsg->dqpn);\r
--      wr.wr.ud.remote_qkey = DAT_UD_QKEY;\r
--\r
--      ret = ibv_post_send(tp->qp, &wr, &bad_wr);\r
--bail:\r
--      dapl_os_unlock(&tp->slock);     \r
--      return ret;\r
--}\r
--\r
--/* ACTIVE/PASSIVE: CM objects */\r
--static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) {\r
--\r
--      dapl_os_assert(!cm->ref_count);\r
--      dapl_os_lock_destroy(&cm->lock);\r
--      dapl_os_wait_object_destroy(&cm->event);\r
--      dapl_os_free(cm, sizeof(*cm));\r
--}\r
--\r
--void dapls_cm_acquire(dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_os_lock(&cm->lock);\r
--      cm->ref_count++;\r
--      dapl_os_unlock(&cm->lock);\r
--}\r
--\r
--void dapls_cm_release(dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_os_lock(&cm->lock);\r
--      cm->ref_count--;\r
--      if (cm->ref_count) {\r
--                dapl_os_unlock(&cm->lock);\r
--              return;\r
--      }\r
--      /* client, release local conn id port */\r
--      if (!cm->sp && cm->msg.sport)\r
--              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));\r
--\r
--      /* clean up any UD address handles */\r
--      if (cm->ah) {\r
--              ibv_destroy_ah(cm->ah);\r
--              cm->ah = NULL;\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--      dapli_cm_dealloc(cm);\r
--}\r
--\r
--dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)\r
--{\r
--      dp_ib_cm_handle_t cm;\r
--\r
--      /* Allocate CM, init lock, and initialize */\r
--      if ((cm = dapl_os_alloc(sizeof(*cm))) == NULL)\r
--              return NULL;\r
--\r
--      (void)dapl_os_memzero(cm, sizeof(*cm));\r
--      if (dapl_os_lock_init(&cm->lock))\r
--              goto bail;\r
--      \r
--      if (dapl_os_wait_object_init(&cm->event)) {\r
--              dapl_os_lock_destroy(&cm->lock);\r
--              goto bail;\r
--      }\r
--      dapls_cm_acquire(cm);\r
--\r
--      cm->msg.ver = htons(DCM_VER);\r
--      *(DAT_UINT32*)cm->msg.resv = htonl(dapl_os_getpid()); /* exchange PID for debugging */\r
--      \r
--      /* ACTIVE: init source address QP info from local EP */\r
--      if (ep) {\r
--              DAPL_HCA *hca = ep->header.owner_ia->hca_ptr;\r
--\r
--              cm->msg.sport = htons(ucm_get_port(&hca->ib_trans, 0));\r
--              if (!cm->msg.sport) {\r
--                      dapl_os_wait_object_destroy(&cm->event);\r
--                      dapl_os_lock_destroy(&cm->lock);\r
--                      goto bail;\r
--              }\r
--              /* link CM object to EP */\r
--              dapl_ep_link_cm(ep, cm);\r
--              cm->hca = hca;\r
--              cm->ep = ep;\r
--\r
--              /* IB info in network order */\r
--              cm->msg.sqpn = htonl(hca->ib_trans.qp->qp_num); /* ucm */\r
--              cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num); /* ep */\r
--              cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;\r
--                cm->msg.saddr.ib.lid = hca->ib_trans.addr.ib.lid; \r
--              dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], \r
--                             &hca->ib_trans.addr.ib.gid, 16);\r
--        }\r
--      return cm;\r
--bail:\r
--      dapl_os_free(cm, sizeof(*cm));\r
--      return NULL;\r
--}\r
--\r
--/* schedule destruction of CM object */\r
--void dapli_cm_free(dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_log(DAPL_DBG_TYPE_CM,\r
--               " dapli_cm_free: cm %p %s ep %p refs=%d\n", \r
--               cm, dapl_cm_state_str(cm->state),\r
--               cm->ep, cm->ref_count);\r
--\r
--      dapl_os_lock(&cm->lock);\r
--      cm->state = DCM_FREE;\r
--      dapls_thread_signal(&cm->hca->ib_trans.signal);\r
--      dapl_os_unlock(&cm->lock);\r
--}\r
--\r
--/* Blocking, ONLY called from dat_ep_free */\r
--void dapls_cm_free(dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_log(DAPL_DBG_TYPE_CM,\r
--               " dapl_cm_free: cm %p %s ep %p refs=%d\n", \r
--               cm, dapl_cm_state_str(cm->state),\r
--               cm->ep, cm->ref_count);\r
--      \r
--      /* free from internal workq, wait until EP is last ref */\r
--      dapl_os_lock(&cm->lock);\r
--      if (cm->state != DCM_FREE) \r
--              cm->state = DCM_FREE;\r
--      \r
--      while (cm->ref_count != 1) {\r
--              dapl_os_unlock(&cm->lock);\r
--              dapls_thread_signal(&cm->hca->ib_trans.signal);\r
--              dapl_os_sleep_usec(10000);\r
--              dapl_os_lock(&cm->lock);\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      /* unlink, dequeue from EP. Final ref so release will destroy */\r
--      dapl_ep_unlink_cm(cm->ep, cm);\r
--}\r
--\r
--/* ACTIVE/PASSIVE: queue up connection object on CM list */\r
--static void dapli_queue_conn(dp_ib_cm_handle_t cm)\r
--{\r
--      /* add to work queue, list, for cm thread processing */\r
--      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--      dapl_os_lock(&cm->hca->ib_trans.lock);\r
--      dapls_cm_acquire(cm);\r
--      dapl_llist_add_tail(&cm->hca->ib_trans.list,\r
--                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);\r
--      dapl_os_unlock(&cm->hca->ib_trans.lock);\r
--      dapls_thread_signal(&cm->hca->ib_trans.signal);\r
--}\r
--\r
--/* PASSIVE: queue up listen object on listen list */\r
--static void dapli_queue_listen(dp_ib_cm_handle_t cm)\r
--{\r
--      /* add to work queue, llist, for cm thread processing */\r
--      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--      dapl_os_lock(&cm->hca->ib_trans.llock);\r
--      dapls_cm_acquire(cm);\r
--      dapl_llist_add_tail(&cm->hca->ib_trans.llist,\r
--                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);\r
--      dapl_os_unlock(&cm->hca->ib_trans.llock);\r
--}\r
--\r
--static void dapli_dequeue_listen(dp_ib_cm_handle_t cm) \r
--{\r
--      DAPL_HCA *hca = cm->hca;\r
--\r
--      dapl_os_lock(&hca->ib_trans.llock);\r
--      dapl_llist_remove_entry(&hca->ib_trans.llist, \r
--                              (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--      dapls_cm_release(cm);\r
--      dapl_os_unlock(&hca->ib_trans.llock);\r
--}\r
--\r
--/* called with local LIST and CM object lock */\r
--static void dapli_cm_dequeue(dp_ib_cm_handle_t cm)\r
--{\r
--      /* Remove from work queue, cr thread processing */\r
--      dapl_llist_remove_entry(&cm->hca->ib_trans.list,\r
--                              (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--      dapls_cm_release(cm);\r
--}\r
--\r
--static void ucm_disconnect_final(dp_ib_cm_handle_t cm) \r
--{\r
--      /* no EP attachment or not RC, nothing to process */\r
--      if (cm->ep == NULL ||\r
--          cm->ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) \r
--              return;\r
--\r
--      dapl_os_lock(&cm->lock);\r
--      if (cm->state == DCM_DISCONNECTED) {\r
--              dapl_os_unlock(&cm->lock);\r
--              return;\r
--      }\r
--              \r
--      cm->state = DCM_DISCONNECTED;\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      if (cm->sp) \r
--              dapls_cr_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->sp);\r
--      else\r
--              dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep);\r
--\r
--}\r
--\r
--/*\r
-- * called from consumer thread via ep_disconnect/ep_free or \r
-- * from cm_thread when receiving DREQ\r
-- */\r
--DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm)\r
--{\r
--      int finalize = 1;\r
--      int wakeup = 0;\r
--\r
--      dapl_os_lock(&cm->lock);\r
--      switch (cm->state) {\r
--      case DCM_CONNECTED:\r
--              /* CONSUMER: move to err state to flush, if not UD */\r
--              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) \r
--                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);\r
--\r
--              /* send DREQ, event after DREP or DREQ timeout */\r
--              cm->state = DCM_DISC_PENDING;\r
--              cm->msg.op = htons(DCM_DREQ);\r
--              finalize = 0; /* wait for DREP, wakeup timer after DREQ sent */\r
--              wakeup = 1;\r
--              break;\r
--      case DCM_DISC_PENDING:\r
--              /* DREQ timeout, resend until retries exhausted */\r
--              cm->msg.op = htons(DCM_DREQ);\r
--              if (cm->retries >= cm->hca->ib_trans.retries) {\r
--                      dapl_log(DAPL_DBG_TYPE_ERR, \r
--                              " CM_DREQ: RETRIES EXHAUSTED:"\r
--                              " %x %x %x -> %x %x %x\n",\r
--                              htons(cm->msg.saddr.ib.lid), \r
--                              htonl(cm->msg.saddr.ib.qpn), \r
--                              htons(cm->msg.sport), \r
--                              htons(cm->msg.daddr.ib.lid), \r
--                              htonl(cm->msg.dqpn), \r
--                              htons(cm->msg.dport));\r
--                      finalize = 1;\r
--              }\r
--              break;\r
--      case DCM_DISC_RECV:\r
--              /* CM_THREAD: move to err state to flush, if not UD */\r
--              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) \r
--                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);\r
--\r
--              /* DREQ received, send DREP and schedule event, finalize */\r
--              cm->msg.op = htons(DCM_DREP);\r
--              break;\r
--      case DCM_DISCONNECTED:\r
--              dapl_os_unlock(&cm->lock);\r
--              return DAT_SUCCESS;\r
--      default:\r
--              dapl_log(DAPL_DBG_TYPE_WARN, \r
--                      "  disconnect UNKNOWN state: ep %p cm %p %s %s"\r
--                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",\r
--                      cm->ep, cm,\r
--                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
--                      dapl_cm_state_str(cm->state),\r
--                      ntohs(cm->msg.saddr.ib.lid),\r
--                      ntohs(cm->msg.sport),\r
--                      ntohl(cm->msg.saddr.ib.qpn),    \r
--                      cm->sp ? "<-" : "->",\r
--                      ntohs(cm->msg.daddr.ib.lid),\r
--                      ntohs(cm->msg.dport),\r
--                      ntohl(cm->msg.daddr.ib.qpn),\r
--                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), \r
--                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); \r
--\r
--              dapl_os_unlock(&cm->lock);\r
--              return DAT_SUCCESS;\r
--      }\r
--      \r
--      dapl_os_get_time(&cm->timer); /* reply expected */\r
--      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); \r
--      dapl_os_unlock(&cm->lock);\r
--      \r
--      if (wakeup)\r
--              dapls_thread_signal(&cm->hca->ib_trans.signal);\r
--\r
--      if (finalize) \r
--              ucm_disconnect_final(cm);\r
--      \r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * ACTIVE: get remote CM SID server info from r_addr. \r
-- *         send, or resend CM msg via UD CM QP \r
-- */\r
--DAT_RETURN\r
--dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_log(DAPL_DBG_TYPE_EP, \r
--               " connect: lid %x i_qpn %x lport %x p_sz=%d -> "\r
--               " lid %x c_qpn %x rport %x\n",\r
--               htons(cm->msg.saddr.ib.lid), htonl(cm->msg.saddr.ib.qpn),\r
--               htons(cm->msg.sport), htons(cm->msg.p_size),\r
--               htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn),\r
--               htons(cm->msg.dport));\r
--\r
--      dapl_os_lock(&cm->lock);\r
--      if (cm->state != DCM_REP_PENDING) {\r
--              dapl_os_unlock(&cm->lock);\r
--              return DAT_INVALID_STATE;\r
--      }\r
--      \r
--      if (cm->retries == cm->hca->ib_trans.retries) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR, \r
--                      " CM_REQ: RETRIES EXHAUSTED:"\r
--                       " 0x%x %x 0x%x -> 0x%x %x 0x%x\n",\r
--                       htons(cm->msg.saddr.ib.lid), \r
--                       htonl(cm->msg.saddr.ib.qpn), \r
--                       htons(cm->msg.sport), \r
--                       htons(cm->msg.daddr.ib.lid), \r
--                       htonl(cm->msg.dqpn), \r
--                       htons(cm->msg.dport));\r
--\r
--              dapl_os_unlock(&cm->lock);\r
--\r
--#ifdef DAPL_COUNTERS\r
--              /* called from check_timers in cm_thread, cm lock held */\r
--              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {\r
--                      dapl_os_unlock(&cm->hca->ib_trans.lock);\r
--                      dapls_print_cm_list(ep->header.owner_ia);\r
--                      dapl_os_lock(&cm->hca->ib_trans.lock);\r
--              }\r
--#endif\r
--              dapl_evd_connection_callback(cm, \r
--                                           IB_CME_DESTINATION_UNREACHABLE,\r
--                                           NULL, 0, ep);\r
--              \r
--              return DAT_ERROR(DAT_INVALID_ADDRESS, \r
--                               DAT_INVALID_ADDRESS_UNREACHABLE);\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      cm->msg.op = htons(DCM_REQ);\r
--      dapl_os_get_time(&cm->timer); /* reply expected */\r
--      if (ucm_send(&cm->hca->ib_trans, &cm->msg, \r
--                   &cm->msg.p_data, ntohs(cm->msg.p_size)))           \r
--              goto bail;\r
--\r
--      /* first time through, link EP and CM, put on work queue */\r
--      if (!cm->retries) {\r
--              dapli_queue_conn(cm);\r
--      }\r
--      return DAT_SUCCESS;\r
--\r
--bail:\r
--      dapl_log(DAPL_DBG_TYPE_WARN, \r
--               " connect: ERR %s -> cm_lid %x cm_qpn %x r_psp %x p_sz=%d\n",\r
--               strerror(errno), htons(cm->msg.daddr.ib.lid), \r
--               htonl(cm->msg.dqpn), htons(cm->msg.dport), \r
--               htonl(cm->msg.p_size));\r
--\r
--      dapli_cm_free(cm);\r
--      return DAT_INSUFFICIENT_RESOURCES;\r
--}\r
--\r
--/*\r
-- * ACTIVE: exchange QP information, called from CR thread\r
-- */\r
--static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)\r
--{\r
--      DAPL_EP *ep = cm->ep;\r
--      ib_cm_events_t event = IB_CME_CONNECTED;\r
--\r
--      dapl_os_lock(&cm->lock);\r
--      if (cm->state != DCM_REP_PENDING) {\r
--              dapl_log(DAPL_DBG_TYPE_WARN, \r
--                       " CONN_RTU: UNEXPECTED state:"\r
--                       " op %s, st %s <- lid %x sqpn %x sport %x\n", \r
--                       dapl_cm_op_str(ntohs(msg->op)), \r
--                       dapl_cm_state_str(cm->state), \r
--                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), \r
--                       ntohs(msg->sport));\r
--              dapl_os_unlock(&cm->lock);\r
--              return;\r
--      }\r
--\r
--      /* save remote address information to EP and CM */\r
--      dapl_os_memcpy(&ep->remote_ia_address,\r
--                     &msg->saddr, sizeof(union dcm_addr));\r
--      dapl_os_memcpy(&cm->msg.daddr, \r
--                     &msg->saddr, sizeof(union dcm_addr));\r
--\r
--      /* validate private data size, and copy if necessary */\r
--      if (msg->p_size) {\r
--              if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {\r
--                      dapl_log(DAPL_DBG_TYPE_WARN, \r
--                               " CONN_RTU: invalid p_size %d:"\r
--                               " st %s <- lid %x sqpn %x spsp %x\n", \r
--                               ntohs(msg->p_size), \r
--                               dapl_cm_state_str(cm->state), \r
--                               ntohs(msg->saddr.ib.lid), \r
--                               ntohl(msg->saddr.ib.qpn), \r
--                               ntohs(msg->sport));\r
--                      dapl_os_unlock(&cm->lock);\r
--                      goto bail;\r
--              }\r
--              dapl_os_memcpy(cm->msg.p_data, \r
--                             msg->p_data, ntohs(msg->p_size));\r
--      }\r
--              \r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " CONN_RTU: DST lid=%x,"\r
--                   " iqp=%x, qp_type=%d, port=%x psize=%d\n",\r
--                   ntohs(cm->msg.daddr.ib.lid),\r
--                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type,\r
--                   ntohs(msg->sport), ntohs(msg->p_size));\r
--\r
--      if (ntohs(msg->op) == DCM_REP)\r
--              event = IB_CME_CONNECTED;\r
--      else if (ntohs(msg->op) == DCM_REJ_USER) \r
--              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;\r
--      else  \r
--              event = IB_CME_DESTINATION_REJECT;\r
--      \r
--      if (event != IB_CME_CONNECTED) {\r
--              dapl_log(DAPL_DBG_TYPE_CM, \r
--                       " ACTIVE: CM_REQ REJECTED:"\r
--                       " cm %p op %s, st %s dlid %x iqp %x port %x <-"\r
--                       " slid %x iqp %x port %x\n", cm,\r
--                       dapl_cm_op_str(ntohs(msg->op)), \r
--                       dapl_cm_state_str(cm->state), \r
--                       ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn), \r
--                       ntohs(msg->dport), ntohs(msg->saddr.ib.lid), \r
--                       ntohl(msg->saddr.ib.qpn), ntohs(msg->sport));\r
--\r
--              cm->state = DCM_REJECTED;\r
--              dapl_os_unlock(&cm->lock);\r
--\r
--#ifdef DAT_EXTENSIONS\r
--              if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) \r
--                      goto ud_bail;\r
--              else\r
--#endif\r
--              goto bail;\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      /* modify QP to RTR and then to RTS with remote info */\r
--      dapl_os_lock(&cm->ep->header.lock);\r
--      if (dapls_modify_qp_state(cm->ep->qp_handle,\r
--                                IBV_QPS_RTR, \r
--                                cm->msg.daddr.ib.qpn,\r
--                                cm->msg.daddr.ib.lid,\r
--                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_RTU: QPS_RTR ERR %s <- lid %x iqp %x\n",\r
--                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
--                       ntohl(cm->msg.daddr.ib.qpn));\r
--              dapl_os_unlock(&cm->ep->header.lock);\r
--              event = IB_CME_LOCAL_FAILURE;\r
--              goto bail;\r
--      }\r
--      if (dapls_modify_qp_state(cm->ep->qp_handle,\r
--                                IBV_QPS_RTS, \r
--                                cm->msg.daddr.ib.qpn,\r
--                                cm->msg.daddr.ib.lid,\r
--                                NULL) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " CONN_RTU: QPS_RTS ERR %s <- lid %x iqp %x\n",\r
--                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
--                       ntohl(cm->msg.daddr.ib.qpn));\r
--              dapl_os_unlock(&cm->ep->header.lock);\r
--              event = IB_CME_LOCAL_FAILURE;\r
--              goto bail;\r
--      }\r
--      dapl_os_unlock(&cm->ep->header.lock);\r
--      \r
--      /* Send RTU, no private data */\r
--      cm->msg.op = htons(DCM_RTU);\r
--      \r
--      dapl_os_lock(&cm->lock);\r
--      cm->state = DCM_CONNECTED;\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      if (ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0))            \r
--              goto bail;\r
--\r
--      /* init cm_handle and post the event with private data */\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");\r
--\r
--#ifdef DAT_EXTENSIONS\r
--ud_bail:\r
--      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) {\r
--              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);\r
--              \r
--              /* post EVENT, modify_qp, AH already created, ucm msg */\r
--              xevent.status = 0;\r
--              xevent.type = DAT_IB_UD_REMOTE_AH;\r
--              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);\r
--              xevent.remote_ah.ah = dapls_create_ah(cm->hca, \r
--                                                    cm->ep->qp_handle->pd, \r
--                                                    cm->ep->qp_handle, \r
--                                                    htons(lid), \r
--                                                    NULL);\r
--              if (xevent.remote_ah.ah == NULL) {\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               " active UD RTU: ERR create_ah"\r
--                               " for qpn 0x%x lid 0x%x\n",\r
--                               xevent.remote_ah.qpn, lid);\r
--                      event = IB_CME_LOCAL_FAILURE;\r
--                      goto bail;\r
--              }\r
--              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */\r
--\r
--              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
--                             &cm->msg.daddr,\r
--                             sizeof(union dcm_addr));\r
--\r
--              /* remote ia_addr reference includes ucm qpn, not IB qpn */\r
--              ((union dcm_addr*)\r
--                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;\r
--\r
--              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                           " ACTIVE: UD xevent ah %p qpn %x lid %x\n",\r
--                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);\r
--              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                           " ACTIVE: UD xevent ia_addr qp_type %d"\r
--                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",\r
--                           ((union dcm_addr*)\r
--                              &xevent.remote_ah.ia_addr)->ib.qp_type,\r
--                           ntohs(((union dcm_addr*)\r
--                              &xevent.remote_ah.ia_addr)->ib.lid),\r
--                           ntohl(((union dcm_addr*)\r
--                              &xevent.remote_ah.ia_addr)->ib.qpn),\r
--                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),\r
--                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));\r
--\r
--              if (event == IB_CME_CONNECTED)\r
--                      event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
--              else {\r
--                      xevent.type = DAT_IB_UD_CONNECT_REJECT;\r
--                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;\r
--              }\r
--\r
--              dapls_evd_post_connection_event_ext(\r
--                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,\r
--                              event,\r
--                              (DAT_EP_HANDLE)ep,\r
--                              (DAT_COUNT)ntohs(cm->msg.p_size),\r
--                              (DAT_PVOID *)cm->msg.p_data,\r
--                              (DAT_PVOID *)&xevent);\r
--      } else\r
--#endif\r
--      {\r
--              dapl_evd_connection_callback(cm,\r
--                                           IB_CME_CONNECTED,\r
--                                           cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);\r
--      }\r
--      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
--               " UCM_ACTIVE_CONN %d [lid port qpn] %x %x %x -> %x %x %x\n",\r
--               cm->retries, ntohs(cm->msg.saddr.ib.lid),\r
--               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),\r
--               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),\r
--               ntohl(cm->msg.dqpn));\r
--      return;\r
--bail:\r
--      dapl_evd_connection_callback(NULL, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);\r
--      dapli_cm_free(cm);\r
--}\r
--\r
--/*\r
-- * PASSIVE: Accept on listen CM PSP.\r
-- *          create new CM object for this CR, \r
-- *        receive peer QP information, private data, \r
-- *        and post cr_event \r
-- */\r
--static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg)\r
--{\r
--      dp_ib_cm_handle_t acm;\r
--\r
--      /* Allocate accept CM and setup passive references */\r
--      if ((acm = dapls_ib_cm_create(NULL)) == NULL) {\r
--              dapl_log(DAPL_DBG_TYPE_WARN, " accept: ERR cm_create\n");\r
--              return;\r
--      }\r
--\r
--      /* dest CM info from CR msg, source CM info from listen */\r
--      acm->sp = cm->sp;\r
--      acm->hca = cm->hca;\r
--      acm->msg.op = msg->op;\r
--      acm->msg.dport = msg->sport;\r
--      acm->msg.dqpn = msg->sqpn;\r
--      acm->msg.sport = cm->msg.sport; \r
--      acm->msg.sqpn = cm->msg.sqpn;\r
--      acm->msg.p_size = msg->p_size;\r
--\r
--      /* CR saddr is CM daddr info, need EP for local saddr */\r
--      dapl_os_memcpy(&acm->msg.daddr, &msg->saddr, sizeof(union dcm_addr));\r
--      \r
--      dapl_log(DAPL_DBG_TYPE_CM,\r
--               " accept: DST port=%x lid=%x, iqp=%x, psize=%d\n",\r
--               ntohs(acm->msg.dport), ntohs(acm->msg.daddr.ib.lid), \r
--               htonl(acm->msg.daddr.ib.qpn), htons(acm->msg.p_size));\r
--\r
--      /* validate private data size before reading */\r
--      if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {\r
--              dapl_log(DAPL_DBG_TYPE_WARN, " accept: psize (%d) wrong\n",\r
--                       ntohs(msg->p_size));\r
--              goto bail;\r
--      }\r
--\r
--      /* read private data into cm_handle if any present */\r
--      if (msg->p_size) \r
--              dapl_os_memcpy(acm->msg.p_data, \r
--                             msg->p_data, ntohs(msg->p_size));\r
--              \r
--      acm->state = DCM_ACCEPTING;\r
--      dapli_queue_conn(acm);\r
--\r
--#ifdef DAT_EXTENSIONS\r
--      if (acm->msg.daddr.ib.qp_type == IBV_QPT_UD) {\r
--              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--\r
--              /* post EVENT, modify_qp created ah */\r
--              xevent.status = 0;\r
--              xevent.type = DAT_IB_UD_CONNECT_REQUEST;\r
--\r
--              dapls_evd_post_cr_event_ext(acm->sp,\r
--                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,\r
--                                          acm,\r
--                                          (DAT_COUNT)ntohs(acm->msg.p_size),\r
--                                          (DAT_PVOID *)acm->msg.p_data,\r
--                                          (DAT_PVOID *)&xevent);\r
--      } else\r
--#endif\r
--              /* trigger CR event and return SUCCESS */\r
--              dapls_cr_callback(acm,\r
--                                IB_CME_CONNECTION_REQUEST_PENDING,\r
--                                acm->msg.p_data, ntohs(msg->p_size), acm->sp);\r
--      return;\r
--\r
--bail:\r
--      /* schedule work thread cleanup */\r
--      dapli_cm_free(acm);\r
--      return;\r
--}\r
--\r
--/*\r
-- * PASSIVE: read RTU from active peer, post CONN event\r
-- */\r
--static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)\r
--{\r
--      dapl_os_lock(&cm->lock);\r
--      if ((ntohs(msg->op) != DCM_RTU) || (cm->state != DCM_RTU_PENDING)) {\r
--              dapl_log(DAPL_DBG_TYPE_WARN, \r
--                       " accept_rtu: UNEXPECTED op, state:"\r
--                       " op %s, st %s <- lid %x iqp %x sport %x\n", \r
--                       dapl_cm_op_str(ntohs(msg->op)), \r
--                       dapl_cm_state_str(cm->state), \r
--                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), \r
--                       ntohs(msg->sport));\r
--              dapl_os_unlock(&cm->lock);\r
--              goto bail;\r
--      }\r
--      cm->state = DCM_CONNECTED;\r
--      dapl_os_unlock(&cm->lock);\r
--      \r
--      /* final data exchange if remote QP state is good to go */\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: connected!\n");\r
--\r
--#ifdef DAT_EXTENSIONS\r
--      if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
--              DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);\r
--              \r
--              /* post EVENT, modify_qp, AH already created, ucm msg */\r
--              xevent.status = 0;\r
--              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;\r
--              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);\r
--              xevent.remote_ah.ah = dapls_create_ah(cm->hca, \r
--                                                    cm->ep->qp_handle->pd, \r
--                                                    cm->ep->qp_handle, \r
--                                                    htons(lid), \r
--                                                    NULL);\r
--              if (xevent.remote_ah.ah == NULL) {\r
--                      dapl_log(DAPL_DBG_TYPE_ERR,\r
--                               " passive UD RTU: ERR create_ah"\r
--                               " for qpn 0x%x lid 0x%x\n",\r
--                               xevent.remote_ah.qpn, lid);\r
--                      goto bail;\r
--              }\r
--              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */\r
--              dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
--                             &cm->msg.daddr,\r
--                              sizeof(union dcm_addr));\r
--\r
--              /* remote ia_addr reference includes ucm qpn, not IB qpn */\r
--              ((union dcm_addr*)\r
--                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;\r
--\r
--              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                           " PASSIVE: UD xevent ah %p qpn %x lid %x\n",\r
--                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);\r
--              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                           " PASSIVE: UD xevent ia_addr qp_type %d"\r
--                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",\r
--                           ((union dcm_addr*)\r
--                              &xevent.remote_ah.ia_addr)->ib.qp_type,\r
--                           ntohs(((union dcm_addr*)\r
--                              &xevent.remote_ah.ia_addr)->ib.lid),\r
--                           ntohl(((union dcm_addr*)\r
--                              &xevent.remote_ah.ia_addr)->ib.qpn),\r
--                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),\r
--                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));\r
--\r
--              dapls_evd_post_connection_event_ext(\r
--                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,\r
--                              DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,\r
--                              (DAT_EP_HANDLE)cm->ep,\r
--                              (DAT_COUNT)ntohs(cm->msg.p_size),\r
--                              (DAT_PVOID *)cm->msg.p_data,\r
--                              (DAT_PVOID *)&xevent);\r
--      } else {\r
--#endif\r
--              dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp);\r
--      }\r
--      dapl_log(DAPL_DBG_TYPE_CM_EST,\r
--               " UCM_PASSIVE_CONN %d [lid port qpn] %x %x %x <- %x %x %x\n",\r
--               cm->retries, ntohs(cm->msg.saddr.ib.lid),\r
--               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),\r
--               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),\r
--               ntohl(cm->msg.dqpn));\r
--      return;\r
--bail:\r
--      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp);\r
--      dapli_cm_free(cm);\r
--}\r
--\r
--/*\r
-- * PASSIVE: user accepted, send reply message with pdata\r
-- */\r
--static int ucm_reply(dp_ib_cm_handle_t cm)\r
--{\r
--      dapl_os_lock(&cm->lock);\r
--      if (cm->state != DCM_RTU_PENDING) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR, \r
--                       " CM_REPLY: wrong state %s",\r
--                       dapl_cm_state_str(cm->state));\r
--              dapl_os_unlock(&cm->lock);\r
--              return -1;\r
--      }\r
--\r
--      if (cm->retries == cm->hca->ib_trans.retries) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR, \r
--                      " CM_REPLY: RETRIES EXHAUSTED (lid port qpn)"\r
--                       " %x %x %x -> %x %x %x\n",\r
--                       htons(cm->msg.saddr.ib.lid), \r
--                       htons(cm->msg.sport), \r
--                       htonl(cm->msg.saddr.ib.qpn), \r
--                       htons(cm->msg.daddr.ib.lid), \r
--                       htons(cm->msg.dport), \r
--                       htonl(cm->msg.daddr.ib.qpn));\r
--                      \r
--              dapl_os_unlock(&cm->lock);\r
--#ifdef DAPL_COUNTERS\r
--              /* called from check_timers in cm_thread, cm lock held */\r
--              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {\r
--                      dapl_os_unlock(&cm->hca->ib_trans.lock);\r
--                      dapls_print_cm_list(dapl_llist_peek_head(&cm->hca->ia_list_head));\r
--                      dapl_os_lock(&cm->hca->ib_trans.lock);\r
--              }\r
--#endif\r
--#ifdef DAT_EXTENSIONS\r
--              if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {\r
--                      DAT_IB_EXTENSION_EVENT_DATA xevent;\r
--                                      \r
--                      /* post REJECT event with CONN_REQ p_data */\r
--                      xevent.status = 0;\r
--                      xevent.type = DAT_IB_UD_CONNECT_ERROR;\r
--                                      \r
--                      dapls_evd_post_connection_event_ext(\r
--                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,\r
--                              DAT_IB_UD_CONNECTION_ERROR_EVENT,\r
--                              (DAT_EP_HANDLE)cm->ep,\r
--                              (DAT_COUNT)ntohs(cm->msg.p_size),\r
--                              (DAT_PVOID *)cm->msg.p_data,\r
--                              (DAT_PVOID *)&xevent);\r
--              } else \r
--#endif\r
--                      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, \r
--                                        NULL, 0, cm->sp);\r
--              return -1;\r
--      }\r
--      dapl_os_get_time(&cm->timer); /* RTU expected */\r
--      dapl_os_unlock(&cm->lock);\r
--      if (ucm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size))             \r
--              return -1;\r
--\r
--      return 0;\r
--}\r
--\r
--\r
--/*\r
-- * PASSIVE: consumer accept, send local QP information, private data, \r
-- * queue on work thread to receive RTU information to avoid blocking\r
-- * user thread. \r
-- */\r
--DAT_RETURN\r
--dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)\r
--{\r
--      DAPL_IA *ia = ep->header.owner_ia;\r
--      dp_ib_cm_handle_t cm = cr->ib_cm_handle;\r
--\r
--      if (p_size > DCM_MAX_PDATA_SIZE)\r
--              return DAT_LENGTH_ERROR;\r
--\r
--      dapl_os_lock(&cm->lock);\r
--      if (cm->state != DCM_ACCEPTING) {\r
--              dapl_os_unlock(&cm->lock);\r
--              return DAT_INVALID_STATE;\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " ACCEPT_USR: remote lid=%x"\r
--                   " iqp=%x qp_type %d, psize=%d\n",\r
--                   ntohs(cm->msg.daddr.ib.lid),\r
--                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type, \r
--                   p_size);\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
--                   " ACCEPT_USR: remote GID subnet %016llx id %016llx\n",\r
--                   (unsigned long long)\r
--                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),\r
--                   (unsigned long long)\r
--                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));\r
--\r
--#ifdef DAT_EXTENSIONS\r
--      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD &&\r
--          ep->qp_handle->qp_type != IBV_QPT_UD) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                           " ACCEPT_USR: ERR remote QP is UD,"\r
--                           ", but local QP is not\n");\r
--              return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);\r
--      }\r
--#endif\r
--\r
--      /* modify QP to RTR and then to RTS with remote info already read */\r
--      dapl_os_lock(&ep->header.lock);\r
--      if (dapls_modify_qp_state(ep->qp_handle,\r
--                                IBV_QPS_RTR, \r
--                                cm->msg.daddr.ib.qpn,\r
--                                cm->msg.daddr.ib.lid,\r
--                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_USR: QPS_RTR ERR %s -> lid %x qpn %x\n",\r
--                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
--                       ntohl(cm->msg.daddr.ib.qpn));\r
--              dapl_os_unlock(&ep->header.lock);\r
--              goto bail;\r
--      }\r
--      if (dapls_modify_qp_state(ep->qp_handle,\r
--                                IBV_QPS_RTS, \r
--                                cm->msg.daddr.ib.qpn,\r
--                                cm->msg.daddr.ib.lid,\r
--                                NULL) != DAT_SUCCESS) {\r
--              dapl_log(DAPL_DBG_TYPE_ERR,\r
--                       " ACCEPT_USR: QPS_RTS ERR %s -> lid %x qpn %x\n",\r
--                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),\r
--                       ntohl(cm->msg.daddr.ib.qpn));\r
--              dapl_os_unlock(&ep->header.lock);\r
--              goto bail;\r
--      }\r
--      dapl_os_unlock(&ep->header.lock);\r
--\r
--      /* save remote address information */\r
--      dapl_os_memcpy(&ep->remote_ia_address,\r
--                     &cm->msg.saddr, sizeof(union dcm_addr));\r
--\r
--      /* setup local QP info and type from EP, copy pdata, for reply */\r
--      cm->msg.op = htons(DCM_REP);\r
--      cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num);\r
--      cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;\r
--      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; \r
--      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],\r
--                     &cm->hca->ib_trans.addr.ib.gid, 16); \r
--\r
--      /* \r
--       * UD: deliver p_data with REQ and EST event, keep REQ p_data in \r
--       * cm->msg.p_data and save REPLY accept data in cm->p_data for retries \r
--       */\r
--      cm->p_size = p_size;\r
--      dapl_os_memcpy(&cm->p_data, p_data, p_size);\r
--\r
--      /* save state and setup valid reference to EP, HCA */\r
--      dapl_ep_link_cm(ep, cm);\r
--      cm->ep = ep;\r
--      cm->hca = ia->hca_ptr;\r
--      \r
--      dapl_os_lock(&cm->lock);\r
--      dapl_os_get_time(&cm->timer); /* RTU expected */\r
--      cm->state = DCM_RTU_PENDING;\r
--      dapl_os_unlock(&cm->lock);\r
--\r
--      if (ucm_reply(cm)) {\r
--              dapl_ep_unlink_cm(ep, cm);\r
--              goto bail;\r
--      }\r
--      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: accepted!\n");\r
--      dapls_thread_signal(&cm->hca->ib_trans.signal);\r
--      return DAT_SUCCESS;\r
--bail:\r
--      dapli_cm_free(cm);\r
--      return DAT_INTERNAL_ERROR;\r
--}\r
--\r
--\r
--/*\r
-- * dapls_ib_connect\r
-- *\r
-- * Initiate a connection with the passive listener on another node\r
-- *\r
-- * Input:\r
-- *    ep_handle,\r
-- *    remote_ia_address,\r
-- *    remote_conn_qual,\r
-- *    prd_size                size of private data and structure\r
-- *    prd_prt                 pointer to private data structure\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INVALID_PARAMETER\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,\r
--               IN DAT_IA_ADDRESS_PTR r_addr,\r
--               IN DAT_CONN_QUAL r_psp,\r
--               IN DAT_COUNT p_size, IN void *p_data)\r
--{\r
--      DAPL_EP *ep = (DAPL_EP *)ep_handle;\r
--      dp_ib_cm_handle_t cm;\r
--      \r
--      /* create CM object, initialize SRC info from EP */\r
--      cm = dapls_ib_cm_create(ep);\r
--      if (cm == NULL)\r
--              return DAT_INSUFFICIENT_RESOURCES;\r
--\r
--      /* remote hca and port: lid, gid, network order */\r
--      dapl_os_memcpy(&cm->msg.daddr, r_addr, sizeof(union dcm_addr));\r
--\r
--      /* remote uCM information, comes from consumer provider r_addr */\r
--      cm->msg.dport = htons((uint16_t)r_psp);\r
--      cm->msg.dqpn = cm->msg.daddr.ib.qpn;\r
--      cm->msg.daddr.ib.qpn = 0; /* don't have a remote qpn until reply */\r
--      \r
--      if (p_size) {\r
--              cm->msg.p_size = htons(p_size);\r
--              dapl_os_memcpy(&cm->msg.p_data, p_data, p_size);\r
--      }\r
--      \r
--      cm->state = DCM_REP_PENDING;\r
--\r
--      /* build connect request, send to remote CM based on r_addr info */\r
--      return (dapli_cm_connect(ep, cm));\r
--}\r
--\r
--/*\r
-- * dapls_ib_disconnect\r
-- *\r
-- * Disconnect an EP\r
-- *\r
-- * Input:\r
-- *    ep_handle,\r
-- *    disconnect_flags\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- */\r
--DAT_RETURN\r
--dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags)\r
--{\r
--      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);\r
--\r
--      dapl_os_lock(&ep_ptr->header.lock);\r
--      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||\r
--          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||\r
--          cm_ptr == NULL) {\r
--              dapl_os_unlock(&ep_ptr->header.lock);\r
--              return DAT_SUCCESS;\r
--      } \r
--      dapl_os_unlock(&ep_ptr->header.lock);\r
--      \r
--      dapli_cm_disconnect(cm_ptr);\r
--\r
--        /* ABRUPT close, wait for callback and DISCONNECTED state */\r
--        if (close_flags == DAT_CLOSE_ABRUPT_FLAG) {\r
--                dapl_os_lock(&ep_ptr->header.lock);\r
--                while (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) {\r
--                        dapl_os_unlock(&ep_ptr->header.lock);\r
--                        dapl_os_sleep_usec(10000);\r
--                        dapl_os_lock(&ep_ptr->header.lock);\r
--                }\r
--                dapl_os_unlock(&ep_ptr->header.lock);\r
--        }\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_ib_disconnect_clean\r
-- *\r
-- * Clean up outstanding connection data. This routine is invoked\r
-- * after the final disconnect callback has occurred. Only on the\r
-- * ACTIVE side of a connection. It is also called if dat_ep_connect\r
-- * times out using the consumer supplied timeout value.\r
-- *\r
-- * Input:\r
-- *    ep_ptr          DAPL_EP\r
-- *    active          Indicates active side of connection\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    void\r
-- *\r
-- */\r
--void\r
--dapls_ib_disconnect_clean(IN DAPL_EP *ep,\r
--                        IN DAT_BOOLEAN active,\r
--                        IN const ib_cm_events_t ib_cm_event)\r
--{\r
--      if (ib_cm_event == IB_CME_TIMEOUT) {\r
--              dp_ib_cm_handle_t cm_ptr;\r
--\r
--              if ((cm_ptr = dapl_get_cm_from_ep(ep)) == NULL)\r
--                      return;\r
--\r
--              dapl_log(DAPL_DBG_TYPE_WARN,\r
--                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",\r
--                      ep, cm_ptr, dapl_cm_state_str(cm_ptr->state));\r
--              \r
--              /* schedule release of socket and local resources */\r
--              dapli_cm_free(cm_ptr);\r
--      }\r
--}\r
--\r
--/*\r
-- * dapl_ib_setup_conn_listener\r
-- *\r
-- * Have the CM set up a connection listener.\r
-- *\r
-- * Input:\r
-- *    ibm_hca_handle          HCA handle\r
-- *    qp_handle                       QP handle\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INTERNAL_ERROR\r
-- *    DAT_CONN_QUAL_UNAVAILBLE\r
-- *    DAT_CONN_QUAL_IN_USE\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_setup_conn_listener(IN DAPL_IA *ia, \r
--                           IN DAT_UINT64 sid, \r
--                           IN DAPL_SP *sp)\r
--{\r
--      ib_cm_srvc_handle_t cm = NULL;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " listen(ia %p ServiceID %x sp %p)\n",\r
--                   ia, sid, sp);\r
--\r
--      /* reserve local port, then allocate CM object */\r
--      if (!ucm_get_port(&ia->hca_ptr->ib_trans, (uint16_t)sid)) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_WARN,\r
--                           " listen: ERROR %s on conn_qual %x\n",\r
--                           strerror(errno), sid);\r
--              return DAT_CONN_QUAL_IN_USE;\r
--      }\r
--\r
--      /* cm_create will setup saddr for listen server */\r
--      if ((cm = dapls_ib_cm_create(NULL)) == NULL)\r
--              return DAT_INSUFFICIENT_RESOURCES;\r
--\r
--      /* LISTEN: init DST address and QP info to local CM server info */\r
--      cm->sp = sp;\r
--      cm->hca = ia->hca_ptr;\r
--      cm->msg.sport = htons((uint16_t)sid);\r
--      cm->msg.sqpn = htonl(ia->hca_ptr->ib_trans.qp->qp_num);\r
--      cm->msg.saddr.ib.qp_type = IBV_QPT_UD;\r
--        cm->msg.saddr.ib.lid = ia->hca_ptr->ib_trans.addr.ib.lid; \r
--      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],\r
--                     &cm->hca->ib_trans.addr.ib.gid, 16); \r
--      \r
--      /* save cm_handle reference in service point */\r
--      sp->cm_srvc_handle = cm;\r
--\r
--      /* queue up listen socket to process inbound CR's */\r
--      cm->state = DCM_LISTEN;\r
--      dapli_queue_listen(cm);\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--\r
--/*\r
-- * dapl_ib_remove_conn_listener\r
-- *\r
-- * Have the CM remove a connection listener.\r
-- *\r
-- * Input:\r
-- *    ia_handle               IA handle\r
-- *    ServiceID               IB Channel Service ID\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INVALID_STATE\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_remove_conn_listener(IN DAPL_IA *ia, IN DAPL_SP *sp)\r
--{\r
--      ib_cm_srvc_handle_t cm = sp->cm_srvc_handle;\r
--\r
--      /* free cm_srvc_handle and port, and mark CM for cleanup */\r
--      if (cm) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " remove_listener(ia %p sp %p cm %p psp=%x)\n",\r
--                   ia, sp, cm, ntohs(cm->msg.dport));\r
--\r
--              sp->cm_srvc_handle = NULL;\r
--              dapli_dequeue_listen(cm);  \r
--              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));\r
--              dapls_cm_release(cm);  /* last ref, dealloc */\r
--      }\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_ib_accept_connection\r
-- *\r
-- * Perform necessary steps to accept a connection\r
-- *\r
-- * Input:\r
-- *    cr_handle\r
-- *    ep_handle\r
-- *    private_data_size\r
-- *    private_data\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INSUFFICIENT_RESOURCES\r
-- *    DAT_INTERNAL_ERROR\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,\r
--                         IN DAT_EP_HANDLE ep_handle,\r
--                         IN DAT_COUNT p_size, \r
--                         IN const DAT_PVOID p_data)\r
--{\r
--      DAPL_CR *cr = (DAPL_CR *)cr_handle;\r
--      DAPL_EP *ep = (DAPL_EP *)ep_handle;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " accept_connection(cr %p ep %p prd %p,%d)\n",\r
--                   cr, ep, p_data, p_size);\r
--\r
--      /* allocate and attach a QP if necessary */\r
--      if (ep->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
--              DAT_RETURN status;\r
--              status = dapls_ib_qp_alloc(ep->header.owner_ia,\r
--                                         ep, ep);\r
--              if (status != DAT_SUCCESS)\r
--                      return status;\r
--      }\r
--      return (dapli_accept_usr(ep, cr, p_size, p_data));\r
--}\r
--\r
--/*\r
-- * dapls_ib_reject_connection\r
-- *\r
-- * Reject a connection\r
-- *\r
-- * Input:\r
-- *    cr_handle\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INTERNAL_ERROR\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm,\r
--                         IN int reason,\r
--                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)\r
--{\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   " reject(cm %p reason %x, pdata %p, psize %d)\n",\r
--                   cm, reason, pdata, psize);\r
--\r
--        if (psize > DCM_MAX_PDATA_SIZE)\r
--                return DAT_LENGTH_ERROR;\r
--\r
--      /* cr_thread will destroy CR, update saddr lid, gid, qp_type info */\r
--      dapl_os_lock(&cm->lock);\r
--      dapl_log(DAPL_DBG_TYPE_CM, \r
--               " PASSIVE: REJECTING CM_REQ:"\r
--               " cm %p op %s, st %s slid %x iqp %x port %x ->"\r
--               " dlid %x iqp %x port %x\n", cm,\r
--               dapl_cm_op_str(ntohs(cm->msg.op)), \r
--               dapl_cm_state_str(cm->state), \r
--               ntohs(cm->hca->ib_trans.addr.ib.lid), \r
--               ntohl(cm->msg.saddr.ib.qpn), \r
--               ntohs(cm->msg.sport), ntohs(cm->msg.daddr.ib.lid), \r
--               ntohl(cm->msg.daddr.ib.qpn), ntohs(cm->msg.dport));\r
--\r
--      cm->state = DCM_REJECTED;\r
--      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; \r
--      cm->msg.saddr.ib.qp_type = cm->msg.daddr.ib.qp_type;\r
--      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],\r
--                     &cm->hca->ib_trans.addr.ib.gid, 16); \r
--      cm->msg.op = htons(DCM_REJ_USER);\r
--      \r
--      if (ucm_send(&cm->hca->ib_trans, &cm->msg, pdata, psize)) {\r
--              dapl_log(DAPL_DBG_TYPE_WARN,\r
--                       " cm_reject: send ERR: %s\n", strerror(errno));\r
--              dapl_os_unlock(&cm->lock);\r
--              return DAT_INTERNAL_ERROR;\r
--      }\r
--      dapl_os_unlock(&cm->lock);\r
--      dapli_cm_free(cm);\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--/*\r
-- * dapls_ib_cm_remote_addr\r
-- *\r
-- * Obtain the remote IP address given a connection\r
-- *\r
-- * Input:\r
-- *    cr_handle\r
-- *\r
-- * Output:\r
-- *    remote_ia_address: where to place the remote address\r
-- *\r
-- * Returns:\r
-- *    DAT_SUCCESS\r
-- *    DAT_INVALID_HANDLE\r
-- *\r
-- */\r
--DAT_RETURN\r
--dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,\r
--                      OUT DAT_SOCK_ADDR6 * remote_ia_address)\r
--{\r
--      DAPL_HEADER *header;\r
--      dp_ib_cm_handle_t cm;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
--                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",\r
--                   dat_handle);\r
--\r
--      header = (DAPL_HEADER *) dat_handle;\r
--\r
--      if (header->magic == DAPL_MAGIC_EP)\r
--              cm = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);\r
--      else if (header->magic == DAPL_MAGIC_CR)\r
--              cm = ((DAPL_CR *) dat_handle)->ib_cm_handle;\r
--      else\r
--              return DAT_INVALID_HANDLE;\r
--\r
--      dapl_os_memcpy(remote_ia_address,\r
--                     &cm->msg.daddr, sizeof(DAT_SOCK_ADDR6));\r
--\r
--      return DAT_SUCCESS;\r
--}\r
--\r
--int dapls_ib_private_data_size(\r
--      IN DAPL_HCA *hca_ptr)\r
--{\r
--      return DCM_MAX_PDATA_SIZE;\r
--}\r
--\r
--#if defined(_WIN32) || defined(_WIN64)\r
--\r
--void cm_thread(void *arg)\r
--{\r
--      struct dapl_hca *hca = arg;\r
--      dp_ib_cm_handle_t cm, next;\r
--      DWORD time_ms;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);\r
--      dapl_os_lock(&hca->ib_trans.lock);\r
--      for (hca->ib_trans.cm_state = IB_THREAD_RUN;\r
--           hca->ib_trans.cm_state == IB_THREAD_RUN ||\r
--           !dapl_llist_is_empty(&hca->ib_trans.list);\r
--           dapl_os_lock(&hca->ib_trans.lock)) {\r
--\r
--              time_ms = INFINITE;\r
--              CompSetZero(&hca->ib_trans.signal.set);\r
--              CompSetAdd(&hca->ib_hca_handle->channel, &hca->ib_trans.signal.set);\r
--              CompSetAdd(&hca->ib_trans.rch->comp_channel, &hca->ib_trans.signal.set);\r
--              CompSetAdd(&hca->ib_trans.ib_cq->comp_channel, &hca->ib_trans.signal.set);\r
--\r
--              next = dapl_llist_is_empty(&hca->ib_trans.list) ? NULL :\r
--                      dapl_llist_peek_head(&hca->ib_trans.list);\r
--\r
--              while (next) {\r
--                      cm = next;\r
--                      next = dapl_llist_next_entry(&hca->ib_trans.list,\r
--                                                   (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--                      dapls_cm_acquire(cm); /* hold thread ref */\r
--                      dapl_os_lock(&cm->lock);\r
--                      if (cm->state == DCM_FREE || \r
--                          hca->ib_trans.cm_state != IB_THREAD_RUN) {\r
--                              dapl_os_unlock(&cm->lock);\r
--                              dapl_log(DAPL_DBG_TYPE_CM, \r
--                                       " CM FREE: %p ep=%p st=%s refs=%d\n", \r
--                                       cm, cm->ep, dapl_cm_state_str(cm->state), \r
--                                       cm->ref_count);\r
--\r
--                              dapls_cm_release(cm); /* release alloc ref */\r
--                              dapli_cm_dequeue(cm); /* release workq ref */\r
--                              dapls_cm_release(cm); /* release thread ref */\r
--                              continue;\r
--                      }\r
--                      dapl_os_unlock(&cm->lock);\r
--                      ucm_check_timers(cm, &time_ms);\r
--                      dapls_cm_release(cm); /* release thread ref */\r
--              }\r
--\r
--              dapl_os_unlock(&hca->ib_trans.lock);\r
--\r
--              hca->ib_hca_handle->channel.Milliseconds = time_ms;\r
--              hca->ib_trans.rch->comp_channel.Milliseconds = time_ms;\r
--              hca->ib_trans.ib_cq->comp_channel.Milliseconds = time_ms;\r
--              CompSetPoll(&hca->ib_trans.signal.set, time_ms);\r
--\r
--              hca->ib_hca_handle->channel.Milliseconds = 0;\r
--              hca->ib_trans.rch->comp_channel.Milliseconds = 0;\r
--              hca->ib_trans.ib_cq->comp_channel.Milliseconds = 0;\r
--\r
--              ucm_recv(&hca->ib_trans);\r
--              ucm_async_event(hca);\r
--              dapli_cq_event_cb(&hca->ib_trans);\r
--      }\r
--\r
--      dapl_os_unlock(&hca->ib_trans.lock);\r
--      hca->ib_trans.cm_state = IB_THREAD_EXIT;\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);\r
--}\r
--\r
--#else                         // _WIN32 || _WIN64\r
--\r
--void cm_thread(void *arg)\r
--{\r
--      struct dapl_hca *hca = arg;\r
--      dp_ib_cm_handle_t cm, next;\r
--      struct dapl_fd_set *set;\r
--      char rbuf[2];\r
--      int time_ms;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);\r
--      set = dapl_alloc_fd_set();\r
--      if (!set)\r
--              goto out;\r
--\r
--      dapl_os_lock(&hca->ib_trans.lock);\r
--      hca->ib_trans.cm_state = IB_THREAD_RUN;\r
--\r
--      while (1) {\r
--              time_ms = -1; /* reset to blocking */\r
--              dapl_fd_zero(set);\r
--              dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ);    \r
--              dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ);\r
--              dapl_fd_set(hca->ib_trans.rch->fd, set, DAPL_FD_READ);\r
--              dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ);\r
--              \r
--              if (!dapl_llist_is_empty(&hca->ib_trans.list))\r
--                      next = dapl_llist_peek_head(&hca->ib_trans.list);\r
--              else\r
--                      next = NULL;\r
--\r
--              while (next) {\r
--                      cm = next;\r
--                      next = dapl_llist_next_entry(\r
--                                      &hca->ib_trans.list,\r
--                                      (DAPL_LLIST_ENTRY *)&cm->local_entry);\r
--                      dapls_cm_acquire(cm); /* hold thread ref */\r
--                      dapl_os_lock(&cm->lock);\r
--                      if (cm->state == DCM_FREE || \r
--                          hca->ib_trans.cm_state != IB_THREAD_RUN) {\r
--                              dapl_os_unlock(&cm->lock);\r
--                              dapl_log(DAPL_DBG_TYPE_CM, \r
--                                       " CM FREE: %p ep=%p st=%s refs=%d\n", \r
--                                       cm, cm->ep, dapl_cm_state_str(cm->state), \r
--                                       cm->ref_count);\r
--\r
--                              dapls_cm_release(cm); /* release alloc ref */\r
--                              dapli_cm_dequeue(cm); /* release workq ref */\r
--                              dapls_cm_release(cm); /* release thread ref */\r
--                              continue;\r
--                      }\r
--                      dapl_os_unlock(&cm->lock);\r
--                      ucm_check_timers(cm, &time_ms);\r
--                      dapls_cm_release(cm); /* release thread ref */\r
--              }\r
--\r
--              /* set to exit and all resources destroyed */\r
--              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&\r
--                  (dapl_llist_is_empty(&hca->ib_trans.list)))\r
--                      break;\r
--\r
--              dapl_os_unlock(&hca->ib_trans.lock);\r
--              dapl_select(set, time_ms);\r
--\r
--              /* Process events: CM, ASYNC, NOTIFY THREAD */\r
--              if (dapl_poll(hca->ib_trans.rch->fd, \r
--                            DAPL_FD_READ) == DAPL_FD_READ) {\r
--                      ucm_recv(&hca->ib_trans);\r
--              }\r
--              if (dapl_poll(hca->ib_hca_handle->async_fd, \r
--                            DAPL_FD_READ) == DAPL_FD_READ) {\r
--                      ucm_async_event(hca);\r
--              }\r
--              if (dapl_poll(hca->ib_trans.ib_cq->fd, \r
--                            DAPL_FD_READ) == DAPL_FD_READ) {\r
--                      dapli_cq_event_cb(&hca->ib_trans);\r
--              }\r
--              while (dapl_poll(hca->ib_trans.signal.scm[0], \r
--                               DAPL_FD_READ) == DAPL_FD_READ) {\r
--                      recv(hca->ib_trans.signal.scm[0], rbuf, 2, 0);\r
--              }\r
--              dapl_os_lock(&hca->ib_trans.lock);\r
--              \r
--              /* set to exit and all resources destroyed */\r
--              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&\r
--                  (dapl_llist_is_empty(&hca->ib_trans.list)))\r
--                      break;\r
--      }\r
--\r
--      dapl_os_unlock(&hca->ib_trans.lock);\r
--      free(set);\r
--out:\r
--      hca->ib_trans.cm_state = IB_THREAD_EXIT;\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);\r
--}\r
--#endif\r
--\r
--#ifdef DAPL_COUNTERS\r
--static char _ctr_host_[128];\r
--/* Debug aid: List all Connections in process and state */\r
--void dapls_print_cm_list(IN DAPL_IA *ia_ptr)\r
--{\r
--      /* Print in process CM's for this IA, if debug type set */\r
--      int i = 0;\r
--      dp_ib_cm_handle_t cm, next_cm;\r
--      struct dapl_llist_entry **list;\r
--      DAPL_OS_LOCK *lock;\r
--      \r
--      /* LISTEN LIST */\r
--      list = &ia_ptr->hca_ptr->ib_trans.llist;\r
--      lock = &ia_ptr->hca_ptr->ib_trans.llock;\r
--\r
--      dapl_os_lock(lock);\r
--      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))\r
--              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);\r
--      else\r
--              next_cm = NULL;\r
--\r
--      gethostname(_ctr_host_, sizeof(_ctr_host_));\r
--      printf("\n [%s:%x] DAPL IA LISTEN/CONNECTIONS IN PROCESS:\n", \r
--              _ctr_host_ , dapl_os_getpid());\r
--\r
--      while (next_cm) {\r
--              cm = next_cm;\r
--              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,\r
--                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);\r
--\r
--              printf( "  LISTEN[%d]: sp %p %s uCM_QP: %x %x %x l_pid %x (%x)\n",\r
--                      i, cm->sp, dapl_cm_state_str(cm->state),\r
--                      ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport),\r
--                      ntohl(cm->msg.sqpn), ntohl(*(DAT_UINT32*)cm->msg.resv), \r
--                      ntohl(*(DAT_UINT32*)cm->msg.resv)); \r
--              i++;\r
--      }\r
--      dapl_os_unlock(lock);\r
--\r
--      /* CONNECTION LIST */\r
--      list = &ia_ptr->hca_ptr->ib_trans.list;\r
--      lock = &ia_ptr->hca_ptr->ib_trans.lock;\r
--\r
--      dapl_os_lock(lock);\r
--      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))\r
--              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);\r
--      else\r
--              next_cm = NULL;\r
--\r
--        while (next_cm) {\r
--              cm = next_cm;\r
--              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,\r
--                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);\r
--\r
--              printf( "  CONN[%d]: ep %p cm %p %s %s"\r
--                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",\r
--                      i, cm->ep, cm,\r
--                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
--                      dapl_cm_state_str(cm->state),\r
--                      ntohs(cm->msg.saddr.ib.lid),\r
--                      ntohs(cm->msg.sport),\r
--                      ntohl(cm->msg.saddr.ib.qpn),    \r
--                      cm->sp ? "<-" : "->",\r
--                      ntohs(cm->msg.daddr.ib.lid),\r
--                      ntohs(cm->msg.dport),\r
--                      ntohl(cm->msg.daddr.ib.qpn),\r
--                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), \r
--                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); \r
--              i++;\r
--      }\r
--      printf("\n");\r
--      dapl_os_unlock(lock);\r
--}\r
--#endif\r
-+/*
-+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.
-+ *
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+#include "dapl.h"
-+#include "dapl_adapter_util.h"
-+#include "dapl_evd_util.h"
-+#include "dapl_cr_util.h"
-+#include "dapl_name_service.h"
-+#include "dapl_ib_util.h"
-+#include "dapl_ep_util.h"
-+#include "dapl_osd.h"
-+
-+
-+#if defined(_WIN32)
-+#include <rdma\winverbs.h>
-+#else                         // _WIN32
-+enum DAPL_FD_EVENTS {
-+      DAPL_FD_READ = POLLIN,
-+      DAPL_FD_WRITE = POLLOUT,
-+      DAPL_FD_ERROR = POLLERR
-+};
-+
-+struct dapl_fd_set {
-+      int index;
-+      struct pollfd set[DAPL_FD_SETSIZE];
-+};
-+
-+static struct dapl_fd_set *dapl_alloc_fd_set(void)
-+{
-+      return dapl_os_alloc(sizeof(struct dapl_fd_set));
-+}
-+
-+static void dapl_fd_zero(struct dapl_fd_set *set)
-+{
-+      set->index = 0;
-+}
-+
-+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
-+                     enum DAPL_FD_EVENTS event)
-+{
-+      if (set->index == DAPL_FD_SETSIZE - 1) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",
-+                       set->index + 1);
-+              return -1;
-+      }
-+
-+      set->set[set->index].fd = s;
-+      set->set[set->index].revents = 0;
-+      set->set[set->index++].events = event;
-+      return 0;
-+}
-+
-+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
-+{
-+      struct pollfd fds;
-+      int ret;
-+
-+      fds.fd = s;
-+      fds.events = event;
-+      fds.revents = 0;
-+      ret = poll(&fds, 1, 0);
-+      dapl_log(DAPL_DBG_TYPE_CM, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",
-+               s, ret, fds.revents);
-+      if (ret == 0)
-+              return 0;
-+      else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) 
-+              return DAPL_FD_ERROR;
-+      else 
-+              return fds.revents;
-+}
-+
-+static int dapl_select(struct dapl_fd_set *set, int time_ms)
-+{
-+      int ret;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep, fds=%d\n",
-+                   set->index);
-+      ret = poll(set->set, set->index, time_ms);
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup, ret=0x%x\n", ret);
-+      return ret;
-+}
-+#endif
-+
-+/* forward declarations */
-+static int ucm_reply(dp_ib_cm_handle_t cm);
-+static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg);
-+static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);
-+static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg);
-+static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size);
-+static void ucm_disconnect_final(dp_ib_cm_handle_t cm);
-+DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm);
-+DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm);
-+
-+#define UCM_SND_BURST 50      
-+
-+/* Service ids - port space */
-+static uint16_t ucm_get_port(ib_hca_transport_t *tp, uint16_t port)
-+{
-+      int i = 0;
-+      
-+      dapl_os_lock(&tp->plock);
-+      /* get specific ID */
-+      if (port) {
-+              if (tp->sid[port] == 0) {
-+                      tp->sid[port] = 1;
-+                      i = port;
-+              }
-+              goto done;
-+      } 
-+      
-+      /* get any free ID */
-+      for (i = 0xffff; i > 0; i--) {
-+              if (tp->sid[i] == 0) {
-+                      tp->sid[i] = 1;
-+                      break;
-+              }
-+      }
-+done:
-+      dapl_os_unlock(&tp->plock);
-+      return i;
-+}
-+
-+static void ucm_free_port(ib_hca_transport_t *tp, uint16_t port)
-+{
-+      dapl_os_lock(&tp->plock);
-+      tp->sid[port] = 0;
-+      dapl_os_unlock(&tp->plock);
-+}
-+
-+static void ucm_check_timers(dp_ib_cm_handle_t cm, int *timer)
-+{
-+      DAPL_OS_TIMEVAL time;
-+
-+        dapl_os_lock(&cm->lock);
-+      dapl_os_get_time(&time); 
-+      switch (cm->state) {
-+      case DCM_REP_PENDING: 
-+              *timer = cm->hca->ib_trans.cm_timer; 
-+              /* wait longer each retry */
-+              if ((time - cm->timer)/1000 > 
-+                  (cm->hca->ib_trans.rep_time << cm->retries)) {
-+                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
-+                               " CM_REQ retry %p %d [lid, port, qpn]:"
-+                               " %x %x %x -> %x %x %x Time(ms) %llu > %d\n", 
-+                               cm, cm->retries+1, ntohs(cm->msg.saddr.ib.lid), 
-+                               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), 
-+                               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),
-+                               ntohl(cm->msg.dqpn), (time - cm->timer)/1000, 
-+                               cm->hca->ib_trans.rep_time << cm->retries);
-+                      cm->retries++;
-+                      dapl_os_unlock(&cm->lock);
-+                      dapli_cm_connect(cm->ep, cm);
-+                      return;
-+              }
-+              break;
-+      case DCM_RTU_PENDING: 
-+              *timer = cm->hca->ib_trans.cm_timer;  
-+              if ((time - cm->timer)/1000 > 
-+                  (cm->hca->ib_trans.rtu_time << cm->retries)) {
-+                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
-+                               " CM_REPLY retry %d [lid, port, qpn]:"
-+                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", 
-+                               cm->retries+1,
-+                               ntohs(cm->msg.saddr.ib.lid), 
-+                               ntohs(cm->msg.sport),
-+                               ntohl(cm->msg.saddr.ib.qpn), 
-+                               ntohs(cm->msg.daddr.ib.lid), 
-+                               ntohs(cm->msg.dport),
-+                               ntohl(cm->msg.daddr.ib.qpn),  
-+                               ntohl(*(DAT_UINT32*)cm->msg.resv),
-+                               ntohl(*(DAT_UINT32*)cm->msg.resv), 
-+                               (time - cm->timer)/1000, 
-+                               cm->hca->ib_trans.rtu_time << cm->retries);
-+                      cm->retries++;
-+                      dapl_os_unlock(&cm->lock);
-+                      ucm_reply(cm);
-+                      return;
-+              }
-+              break;
-+      case DCM_DISC_PENDING: 
-+              *timer = cm->hca->ib_trans.cm_timer; 
-+              /* wait longer each retry */
-+              if ((time - cm->timer)/1000 > 
-+                  (cm->hca->ib_trans.rtu_time << cm->retries)) {
-+                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
-+                               " CM_DREQ retry %d [lid, port, qpn]:"
-+                               " %x %x %x -> %x %x %x r_pid %x (%x) Time(ms) %llu > %d\n", 
-+                               cm->retries+1,
-+                               ntohs(cm->msg.saddr.ib.lid), 
-+                               ntohs(cm->msg.sport),
-+                               ntohl(cm->msg.saddr.ib.qpn), 
-+                               ntohs(cm->msg.daddr.ib.lid), 
-+                               ntohs(cm->msg.dport),
-+                               ntohl(cm->msg.dqpn), 
-+                               ntohl(*(DAT_UINT32*)cm->msg.resv),
-+                               ntohl(*(DAT_UINT32*)cm->msg.resv), 
-+                               (time - cm->timer)/1000, 
-+                               cm->hca->ib_trans.rtu_time << cm->retries);
-+                      cm->retries++;
-+                      dapl_os_unlock(&cm->lock);
-+                      dapli_cm_disconnect(cm);
-+                        return;
-+              }
-+              break;
-+      default:
-+              break;
-+      }
-+      dapl_os_unlock(&cm->lock);
-+}
-+
-+/* SEND CM MESSAGE PROCESSING */
-+
-+/* Get CM UD message from send queue, called with s_lock held */
-+static ib_cm_msg_t *ucm_get_smsg(ib_hca_transport_t *tp)
-+{
-+      ib_cm_msg_t *msg = NULL; 
-+      int ret, polled = 0, hd = tp->s_hd;
-+
-+      hd++;
-+retry:
-+      if (hd == tp->qpe)
-+              hd = 0;
-+
-+      if (hd == tp->s_tl)
-+              msg = NULL;
-+      else {
-+              msg = &tp->sbuf[hd];
-+              tp->s_hd = hd; /* new hd */
-+      }
-+
-+      /* if empty, process some completions */
-+      if ((msg == NULL) && (!polled)) {
-+              struct ibv_wc wc;
-+
-+              /* process completions, based on UCM_SND_BURST */
-+              ret = ibv_poll_cq(tp->scq, 1, &wc);
-+              if (ret < 0) {
-+                      dapl_log(DAPL_DBG_TYPE_WARN,
-+                              " get_smsg: cq %p %s\n", 
-+                              tp->scq, strerror(errno));
-+              }
-+              /* free up completed sends, update tail */
-+              if (ret > 0) {
-+                      tp->s_tl = (int)wc.wr_id;
-+                      dapl_log(DAPL_DBG_TYPE_CM,
-+                              " get_smsg: wr_cmp (%d) s_tl=%d\n", 
-+                              wc.status, tp->s_tl);
-+              }
-+              polled++;
-+              goto retry;
-+      }
-+      return msg;
-+}
-+
-+/* RECEIVE CM MESSAGE PROCESSING */
-+
-+static int ucm_post_rmsg(ib_hca_transport_t *tp, ib_cm_msg_t *msg)
-+{     
-+      struct ibv_recv_wr recv_wr, *recv_err;
-+      struct ibv_sge sge;
-+        
-+      recv_wr.next = NULL;
-+      recv_wr.sg_list = &sge;
-+      recv_wr.num_sge = 1;
-+      recv_wr.wr_id = (uint64_t)(uintptr_t) msg;
-+      sge.length = sizeof(ib_cm_msg_t) + sizeof(struct ibv_grh);
-+      sge.lkey = tp->mr_rbuf->lkey;
-+      sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh));
-+      
-+      return (ibv_post_recv(tp->qp, &recv_wr, &recv_err));
-+}
-+
-+static int ucm_reject(ib_hca_transport_t *tp, ib_cm_msg_t *msg)
-+{
-+      ib_cm_msg_t     smsg;
-+
-+      /* setup op, rearrange the src, dst cm and addr info */
-+      (void)dapl_os_memzero(&smsg, sizeof(smsg));
-+      smsg.ver = htons(DCM_VER);
-+      smsg.op = htons(DCM_REJ_CM);
-+      smsg.dport = msg->sport;
-+      smsg.dqpn = msg->sqpn;
-+      smsg.sport = msg->dport; 
-+      smsg.sqpn = msg->dqpn;
-+
-+      dapl_os_memcpy(&smsg.daddr, &msg->saddr, sizeof(union dcm_addr));
-+      
-+      /* no dst_addr IB info in REQ, init lid, gid, get type from saddr */
-+      smsg.saddr.ib.lid = tp->addr.ib.lid; 
-+      smsg.saddr.ib.qp_type = msg->saddr.ib.qp_type;
-+      dapl_os_memcpy(&smsg.saddr.ib.gid[0],
-+                     &tp->addr.ib.gid, 16); 
-+
-+      dapl_os_memcpy(&smsg.saddr, &msg->daddr, sizeof(union dcm_addr));
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, 
-+                   " CM reject -> LID %x, QPN %x PORT %x\n", 
-+                   ntohs(smsg.daddr.ib.lid),
-+                   ntohl(smsg.dqpn), ntohs(smsg.dport));
-+
-+      return (ucm_send(tp, &smsg, NULL, 0));
-+}
-+
-+static void ucm_process_recv(ib_hca_transport_t *tp, 
-+                           ib_cm_msg_t *msg, 
-+                           dp_ib_cm_handle_t cm)
-+{
-+      dapl_os_lock(&cm->lock);
-+      switch (cm->state) {
-+      case DCM_LISTEN: /* passive */
-+              dapl_os_unlock(&cm->lock);
-+              ucm_accept(cm, msg);
-+              break;
-+      case DCM_RTU_PENDING: /* passive */
-+              dapl_os_unlock(&cm->lock);
-+              ucm_accept_rtu(cm, msg);
-+              break;
-+      case DCM_REP_PENDING: /* active */
-+              dapl_os_unlock(&cm->lock);
-+              ucm_connect_rtu(cm, msg);
-+              break;
-+      case DCM_CONNECTED: /* active and passive */
-+              /* DREQ, change state and process */
-+              if (ntohs(msg->op) == DCM_DREQ) {
-+                      cm->state = DCM_DISC_RECV;
-+                      dapl_os_unlock(&cm->lock);
-+                      dapli_cm_disconnect(cm);
-+                      break;
-+              } 
-+              /* active: RTU was dropped, resend */
-+              if (ntohs(msg->op) == DCM_REP) {
-+                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
-+                              " RESEND RTU: op %s st %s [lid, port, qpn]:"
-+                              " %x %x %x -> %x %x %x\n", 
-+                              dapl_cm_op_str(ntohs(msg->op)), 
-+                              dapl_cm_state_str(cm->state),
-+                              ntohs(msg->saddr.ib.lid), 
-+                              ntohs(msg->sport),
-+                              ntohl(msg->saddr.ib.qpn), 
-+                              ntohs(msg->daddr.ib.lid), 
-+                              ntohs(msg->dport),
-+                              ntohl(msg->daddr.ib.qpn));  
-+
-+                      cm->msg.op = htons(DCM_RTU);
-+                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0);                
-+              }
-+              dapl_os_unlock(&cm->lock);
-+              break;
-+      case DCM_DISC_PENDING: /* active and passive */
-+              /* DREQ or DREP, finalize */
-+              dapl_os_unlock(&cm->lock);
-+              ucm_disconnect_final(cm);
-+              break;
-+      case DCM_DISCONNECTED:
-+      case DCM_FREE:
-+              /* DREQ dropped, resend */
-+              if (ntohs(msg->op) == DCM_DREQ) {
-+                      dapl_log(DAPL_DBG_TYPE_CM_WARN,
-+                              " RESEND DREP: op %s st %s [lid, port, qpn]:"
-+                              " %x %x %x -> %x %x %x\n", 
-+                              dapl_cm_op_str(ntohs(msg->op)), 
-+                              dapl_cm_state_str(cm->state),
-+                              ntohs(msg->saddr.ib.lid), 
-+                              ntohs(msg->sport),
-+                              ntohl(msg->saddr.ib.qpn), 
-+                              ntohs(msg->daddr.ib.lid), 
-+                              ntohs(msg->dport),
-+                              ntohl(msg->daddr.ib.qpn));  
-+                      cm->msg.op = htons(DCM_DREP);
-+                      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); 
-+                      
-+              } else if (ntohs(msg->op) != DCM_DREP){
-+                      /* DREP ok to ignore, any other print warning */
-+                      dapl_log(DAPL_DBG_TYPE_WARN,
-+                              " ucm_recv: UNEXPECTED MSG on cm %p"
-+                              " <- op %s, st %s spsp %x sqpn %x\n", 
-+                              cm, dapl_cm_op_str(ntohs(msg->op)),
-+                              dapl_cm_state_str(cm->state),
-+                              ntohs(msg->sport), ntohl(msg->sqpn));
-+              }
-+              dapl_os_unlock(&cm->lock);
-+              break;
-+      default:
-+              dapl_log(DAPL_DBG_TYPE_WARN,
-+                              " ucm_recv: UNKNOWN state"
-+                              " <- op %s, %s spsp %x sqpn %x\n", 
-+                              dapl_cm_op_str(ntohs(msg->op)), 
-+                              dapl_cm_state_str(cm->state), 
-+                              ntohs(msg->sport), ntohl(msg->sqpn));
-+              dapl_os_unlock(&cm->lock);
-+              break;
-+      }
-+}
-+
-+/* Find matching CM object for this receive message, return CM reference, timer */
-+dp_ib_cm_handle_t ucm_cm_find(ib_hca_transport_t *tp, ib_cm_msg_t *msg)
-+{
-+      dp_ib_cm_handle_t cm, next, found = NULL;
-+      struct dapl_llist_entry **list;
-+      DAPL_OS_LOCK *lock;
-+      int listenq = 0;
-+
-+      /* conn list first, duplicate requests for DCM_REQ */
-+      list = &tp->list;
-+      lock = &tp->lock;
-+
-+retry_listenq:
-+      dapl_os_lock(lock);
-+        if (!dapl_llist_is_empty(list))
-+              next = dapl_llist_peek_head(list);
-+      else
-+              next = NULL;
-+
-+      while (next) {
-+              cm = next;
-+              next = dapl_llist_next_entry(list,
-+                                           (DAPL_LLIST_ENTRY *)&cm->local_entry);
-+              if (cm->state == DCM_DESTROY || cm->state == DCM_FREE)
-+                      continue;
-+              
-+              /* CM sPORT + QPN, match is good enough for listenq */
-+              if (listenq && 
-+                  cm->msg.sport == msg->dport && 
-+                  cm->msg.sqpn == msg->dqpn) {
-+                      found = cm;
-+                      break;
-+              }        
-+              /* connectq, check src and dst, check duplicate conn_reqs */
-+              if (!listenq && 
-+                  cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn && 
-+                  cm->msg.dport == msg->sport && cm->msg.dqpn == msg->sqpn && 
-+                  cm->msg.daddr.ib.lid == msg->saddr.ib.lid) {
-+                      if (ntohs(msg->op) != DCM_REQ) {
-+                              found = cm;
-+                              break; 
-+                      } else {
-+                              /* duplicate; bail and throw away */
-+                              dapl_os_unlock(lock);
-+                              dapl_log(DAPL_DBG_TYPE_CM_WARN,
-+                                       " DUPLICATE: cm %p op %s st %s [lid, port, qpn]:"
-+                                       " %x %x %x <- %x %x %x\n", cm,
-+                                       dapl_cm_op_str(ntohs(msg->op)), 
-+                                       dapl_cm_state_str(cm->state),
-+                                       ntohs(msg->daddr.ib.lid), 
-+                                       ntohs(msg->dport),
-+                                       ntohl(msg->daddr.ib.qpn), 
-+                                       ntohs(msg->saddr.ib.lid), 
-+                                       ntohs(msg->sport),
-+                                       ntohl(msg->saddr.ib.qpn));  
-+
-+                              return NULL;
-+                      }
-+              }
-+      }
-+      dapl_os_unlock(lock);
-+
-+      /* no duplicate request on connq, check listenq for new request */
-+      if (ntohs(msg->op) == DCM_REQ && !listenq && !found) {
-+              listenq = 1;
-+              list = &tp->llist;
-+              lock = &tp->llock;
-+              goto retry_listenq;
-+      }
-+
-+      /* not match on listenq for valid request, send reject */
-+      if (ntohs(msg->op) == DCM_REQ && !found) {
-+              dapl_log(DAPL_DBG_TYPE_WARN,
-+                      " ucm_recv: NO LISTENER for %s %x %x i%x c%x"
-+                      " < %x %x %x, sending reject\n", 
-+                      dapl_cm_op_str(ntohs(msg->op)), 
-+                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), 
-+                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),
-+                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), 
-+                      ntohl(msg->saddr.ib.qpn));
-+
-+              ucm_reject(tp, msg);
-+      }
-+
-+      if (!found) {
-+              dapl_log(DAPL_DBG_TYPE_CM,
-+                      " ucm_recv: NO MATCH op %s %x %x i%x c%x"
-+                      " < %x %x %x\n", 
-+                      dapl_cm_op_str(ntohs(msg->op)), 
-+                      ntohs(msg->daddr.ib.lid), ntohs(msg->dport), 
-+                      ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn),
-+                      ntohs(msg->saddr.ib.lid), ntohs(msg->sport), 
-+                      ntohl(msg->saddr.ib.qpn));
-+      }
-+
-+      return found;
-+}
-+
-+/* Get rmsgs from CM completion queue, 10 at a time */
-+static void ucm_recv(ib_hca_transport_t *tp)
-+{
-+      struct ibv_wc wc[10];
-+      ib_cm_msg_t *msg;
-+      dp_ib_cm_handle_t cm;
-+      int i, ret, notify = 0;
-+      struct ibv_cq *ibv_cq = NULL;
-+      DAPL_HCA *hca;
-+
-+      /* POLLIN on channel FD */
-+      ret = ibv_get_cq_event(tp->rch, &ibv_cq, (void *)&hca);
-+      if (ret == 0) {
-+              ibv_ack_cq_events(ibv_cq, 1);
-+      }
-+retry:        
-+      ret = ibv_poll_cq(tp->rcq, 10, wc);
-+      if (ret <= 0) {
-+              if (!ret && !notify) {
-+                      ibv_req_notify_cq(tp->rcq, 0);
-+                      notify = 1;
-+                      goto retry;
-+              }
-+              return;
-+      } else 
-+              notify = 0;
-+      
-+      for (i = 0; i < ret; i++) {
-+              msg = (ib_cm_msg_t*) (uintptr_t) wc[i].wr_id;
-+
-+              dapl_dbg_log(DAPL_DBG_TYPE_CM, 
-+                           " ucm_recv: wc status=%d, ln=%d id=%p sqp=%x\n", 
-+                           wc[i].status, wc[i].byte_len, 
-+                           (void*)wc[i].wr_id, wc[i].src_qp);
-+
-+              /* validate CM message, version */
-+              if (ntohs(msg->ver) != DCM_VER) {
-+                      dapl_log(DAPL_DBG_TYPE_WARN,
-+                               " ucm_recv: UNKNOWN msg %p, ver %d\n", 
-+                               msg, msg->ver);
-+                      ucm_post_rmsg(tp, msg);
-+                      continue;
-+              }
-+              if (!(cm = ucm_cm_find(tp, msg))) {
-+                      ucm_post_rmsg(tp, msg);
-+                      continue;
-+              }
-+              
-+              /* match, process it */
-+              ucm_process_recv(tp, msg, cm);
-+              ucm_post_rmsg(tp, msg);
-+      }
-+      
-+      /* finished this batch of WC's, poll and rearm */
-+      goto retry;
-+}
-+
-+/* ACTIVE/PASSIVE: build and send CM message out of CM object */
-+static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size)
-+{
-+      ib_cm_msg_t *smsg = NULL;
-+      struct ibv_send_wr wr, *bad_wr;
-+      struct ibv_sge sge;
-+      int len, ret = -1;
-+      uint16_t dlid = ntohs(msg->daddr.ib.lid);
-+
-+      /* Get message from send queue, copy data, and send */
-+      dapl_os_lock(&tp->slock);
-+      if ((smsg = ucm_get_smsg(tp)) == NULL)
-+              goto bail;
-+
-+      len = (sizeof(*msg) - DCM_MAX_PDATA_SIZE);
-+      dapl_os_memcpy(smsg, msg, len);
-+      if (p_size) {
-+              smsg->p_size = ntohs(p_size);
-+              dapl_os_memcpy(&smsg->p_data, p_data, p_size);
-+      }
-+
-+      wr.next = NULL;
-+        wr.sg_list = &sge;
-+        wr.num_sge = 1;
-+        wr.opcode = IBV_WR_SEND;
-+        wr.wr_id = (unsigned long)tp->s_hd;
-+      wr.send_flags = (wr.wr_id % UCM_SND_BURST) ? 0 : IBV_SEND_SIGNALED;
-+      if (len <= tp->max_inline_send)
-+              wr.send_flags |= IBV_SEND_INLINE; 
-+
-+        sge.length = len + p_size;
-+        sge.lkey = tp->mr_sbuf->lkey;
-+        sge.addr = (uintptr_t)smsg;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, 
-+              " ucm_send: op %s ln %d lid %x c_qpn %x rport %s\n", 
-+              dapl_cm_op_str(ntohs(smsg->op)), 
-+              sge.length, htons(smsg->daddr.ib.lid), 
-+              htonl(smsg->dqpn), htons(smsg->dport));
-+
-+      /* empty slot, then create AH */
-+      if (!tp->ah[dlid]) {
-+              tp->ah[dlid] =  
-+                      dapls_create_ah(tp->hca, tp->pd, tp->qp, 
-+                                      htons(dlid), NULL);
-+              if (!tp->ah[dlid])
-+                      goto bail;
-+      }
-+              
-+      wr.wr.ud.ah = tp->ah[dlid];
-+      wr.wr.ud.remote_qpn = ntohl(smsg->dqpn);
-+      wr.wr.ud.remote_qkey = DAT_UD_QKEY;
-+
-+      ret = ibv_post_send(tp->qp, &wr, &bad_wr);
-+bail:
-+      dapl_os_unlock(&tp->slock);     
-+      return ret;
-+}
-+
-+/* ACTIVE/PASSIVE: CM objects */
-+static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) {
-+
-+      dapl_os_assert(!cm->ref_count);
-+      dapl_os_lock_destroy(&cm->lock);
-+      dapl_os_wait_object_destroy(&cm->event);
-+      dapl_os_free(cm, sizeof(*cm));
-+}
-+
-+void dapls_cm_acquire(dp_ib_cm_handle_t cm)
-+{
-+      dapl_os_lock(&cm->lock);
-+      cm->ref_count++;
-+      dapl_os_unlock(&cm->lock);
-+}
-+
-+void dapls_cm_release(dp_ib_cm_handle_t cm)
-+{
-+      dapl_os_lock(&cm->lock);
-+      cm->ref_count--;
-+      if (cm->ref_count) {
-+                dapl_os_unlock(&cm->lock);
-+              return;
-+      }
-+      /* client, release local conn id port */
-+      if (!cm->sp && cm->msg.sport)
-+              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));
-+
-+      /* clean up any UD address handles */
-+      if (cm->ah) {
-+              ibv_destroy_ah(cm->ah);
-+              cm->ah = NULL;
-+      }
-+      dapl_os_unlock(&cm->lock);
-+      dapli_cm_dealloc(cm);
-+}
-+
-+dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)
-+{
-+      dp_ib_cm_handle_t cm;
-+
-+      /* Allocate CM, init lock, and initialize */
-+      if ((cm = dapl_os_alloc(sizeof(*cm))) == NULL)
-+              return NULL;
-+
-+      (void)dapl_os_memzero(cm, sizeof(*cm));
-+      if (dapl_os_lock_init(&cm->lock))
-+              goto bail;
-+      
-+      if (dapl_os_wait_object_init(&cm->event)) {
-+              dapl_os_lock_destroy(&cm->lock);
-+              goto bail;
-+      }
-+      dapls_cm_acquire(cm);
-+
-+      cm->msg.ver = htons(DCM_VER);
-+      *(DAT_UINT32*)cm->msg.resv = htonl(dapl_os_getpid()); /* exchange PID for debugging */
-+      
-+      /* ACTIVE: init source address QP info from local EP */
-+      if (ep) {
-+              DAPL_HCA *hca = ep->header.owner_ia->hca_ptr;
-+
-+              cm->msg.sport = htons(ucm_get_port(&hca->ib_trans, 0));
-+              if (!cm->msg.sport) {
-+                      dapl_os_wait_object_destroy(&cm->event);
-+                      dapl_os_lock_destroy(&cm->lock);
-+                      goto bail;
-+              }
-+              /* link CM object to EP */
-+              dapl_ep_link_cm(ep, cm);
-+              cm->hca = hca;
-+              cm->ep = ep;
-+
-+              /* IB info in network order */
-+              cm->msg.sqpn = htonl(hca->ib_trans.qp->qp_num); /* ucm */
-+              cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num); /* ep */
-+              cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;
-+                cm->msg.saddr.ib.lid = hca->ib_trans.addr.ib.lid; 
-+              dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], 
-+                             &hca->ib_trans.addr.ib.gid, 16);
-+        }
-+      return cm;
-+bail:
-+      dapl_os_free(cm, sizeof(*cm));
-+      return NULL;
-+}
-+
-+/* schedule destruction of CM object */
-+void dapli_cm_free(dp_ib_cm_handle_t cm)
-+{
-+      dapl_log(DAPL_DBG_TYPE_CM,
-+               " dapli_cm_free: cm %p %s ep %p refs=%d\n", 
-+               cm, dapl_cm_state_str(cm->state),
-+               cm->ep, cm->ref_count);
-+
-+      dapl_os_lock(&cm->lock);
-+      cm->state = DCM_FREE;
-+      dapls_thread_signal(&cm->hca->ib_trans.signal);
-+      dapl_os_unlock(&cm->lock);
-+}
-+
-+/* Blocking, ONLY called from dat_ep_free */
-+void dapls_cm_free(dp_ib_cm_handle_t cm)
-+{
-+      dapl_log(DAPL_DBG_TYPE_CM,
-+               " dapl_cm_free: cm %p %s ep %p refs=%d\n", 
-+               cm, dapl_cm_state_str(cm->state),
-+               cm->ep, cm->ref_count);
-+      
-+      /* free from internal workq, wait until EP is last ref */
-+      dapl_os_lock(&cm->lock);
-+      if (cm->state != DCM_FREE) 
-+              cm->state = DCM_FREE;
-+      
-+      while (cm->ref_count != 1) {
-+              dapl_os_unlock(&cm->lock);
-+              dapls_thread_signal(&cm->hca->ib_trans.signal);
-+              dapl_os_sleep_usec(10000);
-+              dapl_os_lock(&cm->lock);
-+      }
-+      dapl_os_unlock(&cm->lock);
-+
-+      /* unlink, dequeue from EP. Final ref so release will destroy */
-+      dapl_ep_unlink_cm(cm->ep, cm);
-+}
-+
-+/* ACTIVE/PASSIVE: queue up connection object on CM list */
-+static void dapli_queue_conn(dp_ib_cm_handle_t cm)
-+{
-+      /* add to work queue, list, for cm thread processing */
-+      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);
-+      dapl_os_lock(&cm->hca->ib_trans.lock);
-+      dapls_cm_acquire(cm);
-+      dapl_llist_add_tail(&cm->hca->ib_trans.list,
-+                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);
-+      dapl_os_unlock(&cm->hca->ib_trans.lock);
-+      dapls_thread_signal(&cm->hca->ib_trans.signal);
-+}
-+
-+/* PASSIVE: queue up listen object on listen list */
-+static void dapli_queue_listen(dp_ib_cm_handle_t cm)
-+{
-+      /* add to work queue, llist, for cm thread processing */
-+      dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry);
-+      dapl_os_lock(&cm->hca->ib_trans.llock);
-+      dapls_cm_acquire(cm);
-+      dapl_llist_add_tail(&cm->hca->ib_trans.llist,
-+                          (DAPL_LLIST_ENTRY *)&cm->local_entry, cm);
-+      dapl_os_unlock(&cm->hca->ib_trans.llock);
-+}
-+
-+static void dapli_dequeue_listen(dp_ib_cm_handle_t cm) 
-+{
-+      DAPL_HCA *hca = cm->hca;
-+
-+      dapl_os_lock(&hca->ib_trans.llock);
-+      dapl_llist_remove_entry(&hca->ib_trans.llist, 
-+                              (DAPL_LLIST_ENTRY *)&cm->local_entry);
-+      dapls_cm_release(cm);
-+      dapl_os_unlock(&hca->ib_trans.llock);
-+}
-+
-+/* called with local LIST and CM object lock */
-+static void dapli_cm_dequeue(dp_ib_cm_handle_t cm)
-+{
-+      /* Remove from work queue, cr thread processing */
-+      dapl_llist_remove_entry(&cm->hca->ib_trans.list,
-+                              (DAPL_LLIST_ENTRY *)&cm->local_entry);
-+      dapls_cm_release(cm);
-+}
-+
-+static void ucm_disconnect_final(dp_ib_cm_handle_t cm) 
-+{
-+      /* no EP attachment or not RC, nothing to process */
-+      if (cm->ep == NULL ||
-+          cm->ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) 
-+              return;
-+
-+      dapl_os_lock(&cm->lock);
-+      if (cm->state == DCM_DISCONNECTED) {
-+              dapl_os_unlock(&cm->lock);
-+              return;
-+      }
-+              
-+      cm->state = DCM_DISCONNECTED;
-+      dapl_os_unlock(&cm->lock);
-+
-+      if (cm->sp) 
-+              dapls_cr_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->sp);
-+      else
-+              dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep);
-+
-+}
-+
-+/*
-+ * called from consumer thread via ep_disconnect/ep_free or 
-+ * from cm_thread when receiving DREQ
-+ */
-+DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm)
-+{
-+      int finalize = 1;
-+      int wakeup = 0;
-+
-+      dapl_os_lock(&cm->lock);
-+      switch (cm->state) {
-+      case DCM_CONNECTED:
-+              /* CONSUMER: move to err state to flush, if not UD */
-+              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) 
-+                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);
-+
-+              /* send DREQ, event after DREP or DREQ timeout */
-+              cm->state = DCM_DISC_PENDING;
-+              cm->msg.op = htons(DCM_DREQ);
-+              finalize = 0; /* wait for DREP, wakeup timer after DREQ sent */
-+              wakeup = 1;
-+              break;
-+      case DCM_DISC_PENDING:
-+              /* DREQ timeout, resend until retries exhausted */
-+              cm->msg.op = htons(DCM_DREQ);
-+              if (cm->retries >= cm->hca->ib_trans.retries) {
-+                      dapl_log(DAPL_DBG_TYPE_ERR, 
-+                              " CM_DREQ: RETRIES EXHAUSTED:"
-+                              " %x %x %x -> %x %x %x\n",
-+                              htons(cm->msg.saddr.ib.lid), 
-+                              htonl(cm->msg.saddr.ib.qpn), 
-+                              htons(cm->msg.sport), 
-+                              htons(cm->msg.daddr.ib.lid), 
-+                              htonl(cm->msg.dqpn), 
-+                              htons(cm->msg.dport));
-+                      finalize = 1;
-+              }
-+              break;
-+      case DCM_DISC_RECV:
-+              /* CM_THREAD: move to err state to flush, if not UD */
-+              if (cm->ep->qp_handle->qp_type != IBV_QPT_UD) 
-+                      dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);
-+
-+              /* DREQ received, send DREP and schedule event, finalize */
-+              cm->msg.op = htons(DCM_DREP);
-+              break;
-+      case DCM_DISCONNECTED:
-+              dapl_os_unlock(&cm->lock);
-+              return DAT_SUCCESS;
-+      default:
-+              dapl_log(DAPL_DBG_TYPE_WARN, 
-+                      "  disconnect UNKNOWN state: ep %p cm %p %s %s"
-+                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",
-+                      cm->ep, cm,
-+                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",
-+                      dapl_cm_state_str(cm->state),
-+                      ntohs(cm->msg.saddr.ib.lid),
-+                      ntohs(cm->msg.sport),
-+                      ntohl(cm->msg.saddr.ib.qpn),    
-+                      cm->sp ? "<-" : "->",
-+                      ntohs(cm->msg.daddr.ib.lid),
-+                      ntohs(cm->msg.dport),
-+                      ntohl(cm->msg.daddr.ib.qpn),
-+                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), 
-+                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); 
-+
-+              dapl_os_unlock(&cm->lock);
-+              return DAT_SUCCESS;
-+      }
-+      
-+      dapl_os_get_time(&cm->timer); /* reply expected */
-+      ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); 
-+      dapl_os_unlock(&cm->lock);
-+      
-+      if (wakeup)
-+              dapls_thread_signal(&cm->hca->ib_trans.signal);
-+
-+      if (finalize) 
-+              ucm_disconnect_final(cm);
-+      
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * ACTIVE: get remote CM SID server info from r_addr. 
-+ *         send, or resend CM msg via UD CM QP 
-+ */
-+DAT_RETURN
-+dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm)
-+{
-+      dapl_log(DAPL_DBG_TYPE_EP, 
-+               " connect: lid %x i_qpn %x lport %x p_sz=%d -> "
-+               " lid %x c_qpn %x rport %x\n",
-+               htons(cm->msg.saddr.ib.lid), htonl(cm->msg.saddr.ib.qpn),
-+               htons(cm->msg.sport), htons(cm->msg.p_size),
-+               htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn),
-+               htons(cm->msg.dport));
-+
-+      dapl_os_lock(&cm->lock);
-+      if (cm->state != DCM_REP_PENDING) {
-+              dapl_os_unlock(&cm->lock);
-+              return DAT_INVALID_STATE;
-+      }
-+      
-+      if (cm->retries == cm->hca->ib_trans.retries) {
-+              dapl_log(DAPL_DBG_TYPE_ERR, 
-+                      " CM_REQ: RETRIES EXHAUSTED:"
-+                       " 0x%x %x 0x%x -> 0x%x %x 0x%x\n",
-+                       htons(cm->msg.saddr.ib.lid), 
-+                       htonl(cm->msg.saddr.ib.qpn), 
-+                       htons(cm->msg.sport), 
-+                       htons(cm->msg.daddr.ib.lid), 
-+                       htonl(cm->msg.dqpn), 
-+                       htons(cm->msg.dport));
-+
-+              dapl_os_unlock(&cm->lock);
-+
-+#ifdef DAPL_COUNTERS
-+              /* called from check_timers in cm_thread, cm lock held */
-+              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {
-+                      dapl_os_unlock(&cm->hca->ib_trans.lock);
-+                      dapls_print_cm_list(ep->header.owner_ia);
-+                      dapl_os_lock(&cm->hca->ib_trans.lock);
-+              }
-+#endif
-+              dapl_evd_connection_callback(cm, 
-+                                           IB_CME_DESTINATION_UNREACHABLE,
-+                                           NULL, 0, ep);
-+              
-+              return DAT_ERROR(DAT_INVALID_ADDRESS, 
-+                               DAT_INVALID_ADDRESS_UNREACHABLE);
-+      }
-+      dapl_os_unlock(&cm->lock);
-+
-+      cm->msg.op = htons(DCM_REQ);
-+      dapl_os_get_time(&cm->timer); /* reply expected */
-+      if (ucm_send(&cm->hca->ib_trans, &cm->msg, 
-+                   &cm->msg.p_data, ntohs(cm->msg.p_size)))           
-+              goto bail;
-+
-+      /* first time through, link EP and CM, put on work queue */
-+      if (!cm->retries) {
-+              dapli_queue_conn(cm);
-+      }
-+      return DAT_SUCCESS;
-+
-+bail:
-+      dapl_log(DAPL_DBG_TYPE_WARN, 
-+               " connect: ERR %s -> cm_lid %x cm_qpn %x r_psp %x p_sz=%d\n",
-+               strerror(errno), htons(cm->msg.daddr.ib.lid), 
-+               htonl(cm->msg.dqpn), htons(cm->msg.dport), 
-+               htonl(cm->msg.p_size));
-+
-+      dapli_cm_free(cm);
-+      return DAT_INSUFFICIENT_RESOURCES;
-+}
-+
-+/*
-+ * ACTIVE: exchange QP information, called from CR thread
-+ */
-+static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)
-+{
-+      DAPL_EP *ep = cm->ep;
-+      ib_cm_events_t event = IB_CME_CONNECTED;
-+
-+      dapl_os_lock(&cm->lock);
-+      if (cm->state != DCM_REP_PENDING) {
-+              dapl_log(DAPL_DBG_TYPE_WARN, 
-+                       " CONN_RTU: UNEXPECTED state:"
-+                       " op %s, st %s <- lid %x sqpn %x sport %x\n", 
-+                       dapl_cm_op_str(ntohs(msg->op)), 
-+                       dapl_cm_state_str(cm->state), 
-+                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), 
-+                       ntohs(msg->sport));
-+              dapl_os_unlock(&cm->lock);
-+              return;
-+      }
-+
-+      /* save remote address information to EP and CM */
-+      dapl_os_memcpy(&ep->remote_ia_address,
-+                     &msg->saddr, sizeof(union dcm_addr));
-+      dapl_os_memcpy(&cm->msg.daddr, 
-+                     &msg->saddr, sizeof(union dcm_addr));
-+
-+      /* validate private data size, and copy if necessary */
-+      if (msg->p_size) {
-+              if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {
-+                      dapl_log(DAPL_DBG_TYPE_WARN, 
-+                               " CONN_RTU: invalid p_size %d:"
-+                               " st %s <- lid %x sqpn %x spsp %x\n", 
-+                               ntohs(msg->p_size), 
-+                               dapl_cm_state_str(cm->state), 
-+                               ntohs(msg->saddr.ib.lid), 
-+                               ntohl(msg->saddr.ib.qpn), 
-+                               ntohs(msg->sport));
-+                      dapl_os_unlock(&cm->lock);
-+                      goto bail;
-+              }
-+              dapl_os_memcpy(cm->msg.p_data, 
-+                             msg->p_data, ntohs(msg->p_size));
-+      }
-+              
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " CONN_RTU: DST lid=%x,"
-+                   " iqp=%x, qp_type=%d, port=%x psize=%d\n",
-+                   ntohs(cm->msg.daddr.ib.lid),
-+                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type,
-+                   ntohs(msg->sport), ntohs(msg->p_size));
-+
-+      if (ntohs(msg->op) == DCM_REP)
-+              event = IB_CME_CONNECTED;
-+      else if (ntohs(msg->op) == DCM_REJ_USER) 
-+              event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
-+      else  
-+              event = IB_CME_DESTINATION_REJECT;
-+      
-+      if (event != IB_CME_CONNECTED) {
-+              dapl_log(DAPL_DBG_TYPE_CM, 
-+                       " ACTIVE: CM_REQ REJECTED:"
-+                       " cm %p op %s, st %s dlid %x iqp %x port %x <-"
-+                       " slid %x iqp %x port %x\n", cm,
-+                       dapl_cm_op_str(ntohs(msg->op)), 
-+                       dapl_cm_state_str(cm->state), 
-+                       ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn), 
-+                       ntohs(msg->dport), ntohs(msg->saddr.ib.lid), 
-+                       ntohl(msg->saddr.ib.qpn), ntohs(msg->sport));
-+
-+              cm->state = DCM_REJECTED;
-+              dapl_os_unlock(&cm->lock);
-+
-+#ifdef DAT_EXTENSIONS
-+              if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) 
-+                      goto ud_bail;
-+              else
-+#endif
-+              goto bail;
-+      }
-+      dapl_os_unlock(&cm->lock);
-+
-+      /* modify QP to RTR and then to RTS with remote info */
-+      dapl_os_lock(&cm->ep->header.lock);
-+      if (dapls_modify_qp_state(cm->ep->qp_handle,
-+                                IBV_QPS_RTR, 
-+                                cm->msg.daddr.ib.qpn,
-+                                cm->msg.daddr.ib.lid,
-+                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_RTU: QPS_RTR ERR %s <- lid %x iqp %x\n",
-+                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
-+                       ntohl(cm->msg.daddr.ib.qpn));
-+              dapl_os_unlock(&cm->ep->header.lock);
-+              event = IB_CME_LOCAL_FAILURE;
-+              goto bail;
-+      }
-+      if (dapls_modify_qp_state(cm->ep->qp_handle,
-+                                IBV_QPS_RTS, 
-+                                cm->msg.daddr.ib.qpn,
-+                                cm->msg.daddr.ib.lid,
-+                                NULL) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " CONN_RTU: QPS_RTS ERR %s <- lid %x iqp %x\n",
-+                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
-+                       ntohl(cm->msg.daddr.ib.qpn));
-+              dapl_os_unlock(&cm->ep->header.lock);
-+              event = IB_CME_LOCAL_FAILURE;
-+              goto bail;
-+      }
-+      dapl_os_unlock(&cm->ep->header.lock);
-+      
-+      /* Send RTU, no private data */
-+      cm->msg.op = htons(DCM_RTU);
-+      
-+      dapl_os_lock(&cm->lock);
-+      cm->state = DCM_CONNECTED;
-+      dapl_os_unlock(&cm->lock);
-+
-+      if (ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0))            
-+              goto bail;
-+
-+      /* init cm_handle and post the event with private data */
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");
-+
-+#ifdef DAT_EXTENSIONS
-+ud_bail:
-+      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) {
-+              DAT_IB_EXTENSION_EVENT_DATA xevent;
-+              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);
-+              
-+              /* post EVENT, modify_qp, AH already created, ucm msg */
-+              xevent.status = 0;
-+              xevent.type = DAT_IB_UD_REMOTE_AH;
-+              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);
-+              xevent.remote_ah.ah = dapls_create_ah(cm->hca, 
-+                                                    cm->ep->qp_handle->pd, 
-+                                                    cm->ep->qp_handle, 
-+                                                    htons(lid), 
-+                                                    NULL);
-+              if (xevent.remote_ah.ah == NULL) {
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               " active UD RTU: ERR create_ah"
-+                               " for qpn 0x%x lid 0x%x\n",
-+                               xevent.remote_ah.qpn, lid);
-+                      event = IB_CME_LOCAL_FAILURE;
-+                      goto bail;
-+              }
-+              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */
-+
-+              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
-+                             &cm->msg.daddr,
-+                             sizeof(union dcm_addr));
-+
-+              /* remote ia_addr reference includes ucm qpn, not IB qpn */
-+              ((union dcm_addr*)
-+                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;
-+
-+              dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                           " ACTIVE: UD xevent ah %p qpn %x lid %x\n",
-+                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);
-+              dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                           " ACTIVE: UD xevent ia_addr qp_type %d"
-+                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",
-+                           ((union dcm_addr*)
-+                              &xevent.remote_ah.ia_addr)->ib.qp_type,
-+                           ntohs(((union dcm_addr*)
-+                              &xevent.remote_ah.ia_addr)->ib.lid),
-+                           ntohl(((union dcm_addr*)
-+                              &xevent.remote_ah.ia_addr)->ib.qpn),
-+                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),
-+                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));
-+
-+              if (event == IB_CME_CONNECTED)
-+                      event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;
-+              else {
-+                      xevent.type = DAT_IB_UD_CONNECT_REJECT;
-+                      event = DAT_IB_UD_CONNECTION_REJECT_EVENT;
-+              }
-+
-+              dapls_evd_post_connection_event_ext(
-+                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,
-+                              event,
-+                              (DAT_EP_HANDLE)ep,
-+                              (DAT_COUNT)ntohs(cm->msg.p_size),
-+                              (DAT_PVOID *)cm->msg.p_data,
-+                              (DAT_PVOID *)&xevent);
-+      } else
-+#endif
-+      {
-+              dapl_evd_connection_callback(cm,
-+                                           IB_CME_CONNECTED,
-+                                           cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);
-+      }
-+      dapl_log(DAPL_DBG_TYPE_CM_EST,
-+               " UCM_ACTIVE_CONN %d [lid port qpn] %x %x %x -> %x %x %x\n",
-+               cm->retries, ntohs(cm->msg.saddr.ib.lid),
-+               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),
-+               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),
-+               ntohl(cm->msg.dqpn));
-+      return;
-+bail:
-+      dapl_evd_connection_callback(NULL, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);
-+      dapli_cm_free(cm);
-+}
-+
-+/*
-+ * PASSIVE: Accept on listen CM PSP.
-+ *          create new CM object for this CR, 
-+ *        receive peer QP information, private data, 
-+ *        and post cr_event 
-+ */
-+static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg)
-+{
-+      dp_ib_cm_handle_t acm;
-+
-+      /* Allocate accept CM and setup passive references */
-+      if ((acm = dapls_ib_cm_create(NULL)) == NULL) {
-+              dapl_log(DAPL_DBG_TYPE_WARN, " accept: ERR cm_create\n");
-+              return;
-+      }
-+
-+      /* dest CM info from CR msg, source CM info from listen */
-+      acm->sp = cm->sp;
-+      acm->hca = cm->hca;
-+      acm->msg.op = msg->op;
-+      acm->msg.dport = msg->sport;
-+      acm->msg.dqpn = msg->sqpn;
-+      acm->msg.sport = cm->msg.sport; 
-+      acm->msg.sqpn = cm->msg.sqpn;
-+      acm->msg.p_size = msg->p_size;
-+
-+      /* CR saddr is CM daddr info, need EP for local saddr */
-+      dapl_os_memcpy(&acm->msg.daddr, &msg->saddr, sizeof(union dcm_addr));
-+      
-+      dapl_log(DAPL_DBG_TYPE_CM,
-+               " accept: DST port=%x lid=%x, iqp=%x, psize=%d\n",
-+               ntohs(acm->msg.dport), ntohs(acm->msg.daddr.ib.lid), 
-+               htonl(acm->msg.daddr.ib.qpn), htons(acm->msg.p_size));
-+
-+      /* validate private data size before reading */
-+      if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) {
-+              dapl_log(DAPL_DBG_TYPE_WARN, " accept: psize (%d) wrong\n",
-+                       ntohs(msg->p_size));
-+              goto bail;
-+      }
-+
-+      /* read private data into cm_handle if any present */
-+      if (msg->p_size) 
-+              dapl_os_memcpy(acm->msg.p_data, 
-+                             msg->p_data, ntohs(msg->p_size));
-+              
-+      acm->state = DCM_ACCEPTING;
-+      dapli_queue_conn(acm);
-+
-+#ifdef DAT_EXTENSIONS
-+      if (acm->msg.daddr.ib.qp_type == IBV_QPT_UD) {
-+              DAT_IB_EXTENSION_EVENT_DATA xevent;
-+
-+              /* post EVENT, modify_qp created ah */
-+              xevent.status = 0;
-+              xevent.type = DAT_IB_UD_CONNECT_REQUEST;
-+
-+              dapls_evd_post_cr_event_ext(acm->sp,
-+                                          DAT_IB_UD_CONNECTION_REQUEST_EVENT,
-+                                          acm,
-+                                          (DAT_COUNT)ntohs(acm->msg.p_size),
-+                                          (DAT_PVOID *)acm->msg.p_data,
-+                                          (DAT_PVOID *)&xevent);
-+      } else
-+#endif
-+              /* trigger CR event and return SUCCESS */
-+              dapls_cr_callback(acm,
-+                                IB_CME_CONNECTION_REQUEST_PENDING,
-+                                acm->msg.p_data, ntohs(msg->p_size), acm->sp);
-+      return;
-+
-+bail:
-+      /* schedule work thread cleanup */
-+      dapli_cm_free(acm);
-+      return;
-+}
-+
-+/*
-+ * PASSIVE: read RTU from active peer, post CONN event
-+ */
-+static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)
-+{
-+      dapl_os_lock(&cm->lock);
-+      if ((ntohs(msg->op) != DCM_RTU) || (cm->state != DCM_RTU_PENDING)) {
-+              dapl_log(DAPL_DBG_TYPE_WARN, 
-+                       " accept_rtu: UNEXPECTED op, state:"
-+                       " op %s, st %s <- lid %x iqp %x sport %x\n", 
-+                       dapl_cm_op_str(ntohs(msg->op)), 
-+                       dapl_cm_state_str(cm->state), 
-+                       ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), 
-+                       ntohs(msg->sport));
-+              dapl_os_unlock(&cm->lock);
-+              goto bail;
-+      }
-+      cm->state = DCM_CONNECTED;
-+      dapl_os_unlock(&cm->lock);
-+      
-+      /* final data exchange if remote QP state is good to go */
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: connected!\n");
-+
-+#ifdef DAT_EXTENSIONS
-+      if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {
-+              DAT_IB_EXTENSION_EVENT_DATA xevent;
-+              uint16_t lid = ntohs(cm->msg.daddr.ib.lid);
-+              
-+              /* post EVENT, modify_qp, AH already created, ucm msg */
-+              xevent.status = 0;
-+              xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;
-+              xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn);
-+              xevent.remote_ah.ah = dapls_create_ah(cm->hca, 
-+                                                    cm->ep->qp_handle->pd, 
-+                                                    cm->ep->qp_handle, 
-+                                                    htons(lid), 
-+                                                    NULL);
-+              if (xevent.remote_ah.ah == NULL) {
-+                      dapl_log(DAPL_DBG_TYPE_ERR,
-+                               " passive UD RTU: ERR create_ah"
-+                               " for qpn 0x%x lid 0x%x\n",
-+                               xevent.remote_ah.qpn, lid);
-+                      goto bail;
-+              }
-+              cm->ah = xevent.remote_ah.ah; /* keep ref to destroy */
-+              dapl_os_memcpy(&xevent.remote_ah.ia_addr,
-+                             &cm->msg.daddr,
-+                              sizeof(union dcm_addr));
-+
-+              /* remote ia_addr reference includes ucm qpn, not IB qpn */
-+              ((union dcm_addr*)
-+                      &xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn;
-+
-+              dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                           " PASSIVE: UD xevent ah %p qpn %x lid %x\n",
-+                           xevent.remote_ah.ah, xevent.remote_ah.qpn, lid);
-+              dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                           " PASSIVE: UD xevent ia_addr qp_type %d"
-+                           " lid 0x%x qpn 0x%x gid 0x"F64x" 0x"F64x" \n",
-+                           ((union dcm_addr*)
-+                              &xevent.remote_ah.ia_addr)->ib.qp_type,
-+                           ntohs(((union dcm_addr*)
-+                              &xevent.remote_ah.ia_addr)->ib.lid),
-+                           ntohl(((union dcm_addr*)
-+                              &xevent.remote_ah.ia_addr)->ib.qpn),
-+                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),
-+                           ntohll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));
-+
-+              dapls_evd_post_connection_event_ext(
-+                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,
-+                              DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,
-+                              (DAT_EP_HANDLE)cm->ep,
-+                              (DAT_COUNT)ntohs(cm->msg.p_size),
-+                              (DAT_PVOID *)cm->msg.p_data,
-+                              (DAT_PVOID *)&xevent);
-+      } else {
-+#endif
-+              dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp);
-+      }
-+      dapl_log(DAPL_DBG_TYPE_CM_EST,
-+               " UCM_PASSIVE_CONN %d [lid port qpn] %x %x %x <- %x %x %x\n",
-+               cm->retries, ntohs(cm->msg.saddr.ib.lid),
-+               ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn),
-+               ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport),
-+               ntohl(cm->msg.dqpn));
-+      return;
-+bail:
-+      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp);
-+      dapli_cm_free(cm);
-+}
-+
-+/*
-+ * PASSIVE: user accepted, send reply message with pdata
-+ */
-+static int ucm_reply(dp_ib_cm_handle_t cm)
-+{
-+      dapl_os_lock(&cm->lock);
-+      if (cm->state != DCM_RTU_PENDING) {
-+              dapl_log(DAPL_DBG_TYPE_ERR, 
-+                       " CM_REPLY: wrong state %s",
-+                       dapl_cm_state_str(cm->state));
-+              dapl_os_unlock(&cm->lock);
-+              return -1;
-+      }
-+
-+      if (cm->retries == cm->hca->ib_trans.retries) {
-+              dapl_log(DAPL_DBG_TYPE_ERR, 
-+                      " CM_REPLY: RETRIES EXHAUSTED (lid port qpn)"
-+                       " %x %x %x -> %x %x %x\n",
-+                       htons(cm->msg.saddr.ib.lid), 
-+                       htons(cm->msg.sport), 
-+                       htonl(cm->msg.saddr.ib.qpn), 
-+                       htons(cm->msg.daddr.ib.lid), 
-+                       htons(cm->msg.dport), 
-+                       htonl(cm->msg.daddr.ib.qpn));
-+                      
-+              dapl_os_unlock(&cm->lock);
-+#ifdef DAPL_COUNTERS
-+              /* called from check_timers in cm_thread, cm lock held */
-+              if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) {
-+                      dapl_os_unlock(&cm->hca->ib_trans.lock);
-+                      dapls_print_cm_list(dapl_llist_peek_head(&cm->hca->ia_list_head));
-+                      dapl_os_lock(&cm->hca->ib_trans.lock);
-+              }
-+#endif
-+#ifdef DAT_EXTENSIONS
-+              if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) {
-+                      DAT_IB_EXTENSION_EVENT_DATA xevent;
-+                                      
-+                      /* post REJECT event with CONN_REQ p_data */
-+                      xevent.status = 0;
-+                      xevent.type = DAT_IB_UD_CONNECT_ERROR;
-+                                      
-+                      dapls_evd_post_connection_event_ext(
-+                              (DAPL_EVD *)cm->ep->param.connect_evd_handle,
-+                              DAT_IB_UD_CONNECTION_ERROR_EVENT,
-+                              (DAT_EP_HANDLE)cm->ep,
-+                              (DAT_COUNT)ntohs(cm->msg.p_size),
-+                              (DAT_PVOID *)cm->msg.p_data,
-+                              (DAT_PVOID *)&xevent);
-+              } else 
-+#endif
-+                      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, 
-+                                        NULL, 0, cm->sp);
-+              return -1;
-+      }
-+      dapl_os_get_time(&cm->timer); /* RTU expected */
-+      dapl_os_unlock(&cm->lock);
-+      if (ucm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size))             
-+              return -1;
-+
-+      return 0;
-+}
-+
-+
-+/*
-+ * PASSIVE: consumer accept, send local QP information, private data, 
-+ * queue on work thread to receive RTU information to avoid blocking
-+ * user thread. 
-+ */
-+DAT_RETURN
-+dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)
-+{
-+      DAPL_IA *ia = ep->header.owner_ia;
-+      dp_ib_cm_handle_t cm = cr->ib_cm_handle;
-+
-+      if (p_size > DCM_MAX_PDATA_SIZE)
-+              return DAT_LENGTH_ERROR;
-+
-+      dapl_os_lock(&cm->lock);
-+      if (cm->state != DCM_ACCEPTING) {
-+              dapl_os_unlock(&cm->lock);
-+              return DAT_INVALID_STATE;
-+      }
-+      dapl_os_unlock(&cm->lock);
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " ACCEPT_USR: remote lid=%x"
-+                   " iqp=%x qp_type %d, psize=%d\n",
-+                   ntohs(cm->msg.daddr.ib.lid),
-+                   ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type, 
-+                   p_size);
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM,
-+                   " ACCEPT_USR: remote GID subnet %016llx id %016llx\n",
-+                   (unsigned long long)
-+                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[0]),
-+                   (unsigned long long)
-+                   htonll(*(uint64_t*)&cm->msg.daddr.ib.gid[8]));
-+
-+#ifdef DAT_EXTENSIONS
-+      if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD &&
-+          ep->qp_handle->qp_type != IBV_QPT_UD) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                           " ACCEPT_USR: ERR remote QP is UD,"
-+                           ", but local QP is not\n");
-+              return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);
-+      }
-+#endif
-+
-+      /* modify QP to RTR and then to RTS with remote info already read */
-+      dapl_os_lock(&ep->header.lock);
-+      if (dapls_modify_qp_state(ep->qp_handle,
-+                                IBV_QPS_RTR, 
-+                                cm->msg.daddr.ib.qpn,
-+                                cm->msg.daddr.ib.lid,
-+                                (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_USR: QPS_RTR ERR %s -> lid %x qpn %x\n",
-+                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
-+                       ntohl(cm->msg.daddr.ib.qpn));
-+              dapl_os_unlock(&ep->header.lock);
-+              goto bail;
-+      }
-+      if (dapls_modify_qp_state(ep->qp_handle,
-+                                IBV_QPS_RTS, 
-+                                cm->msg.daddr.ib.qpn,
-+                                cm->msg.daddr.ib.lid,
-+                                NULL) != DAT_SUCCESS) {
-+              dapl_log(DAPL_DBG_TYPE_ERR,
-+                       " ACCEPT_USR: QPS_RTS ERR %s -> lid %x qpn %x\n",
-+                       strerror(errno), ntohs(cm->msg.daddr.ib.lid),
-+                       ntohl(cm->msg.daddr.ib.qpn));
-+              dapl_os_unlock(&ep->header.lock);
-+              goto bail;
-+      }
-+      dapl_os_unlock(&ep->header.lock);
-+
-+      /* save remote address information */
-+      dapl_os_memcpy(&ep->remote_ia_address,
-+                     &cm->msg.saddr, sizeof(union dcm_addr));
-+
-+      /* setup local QP info and type from EP, copy pdata, for reply */
-+      cm->msg.op = htons(DCM_REP);
-+      cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp_num);
-+      cm->msg.saddr.ib.qp_type = ep->qp_handle->qp_type;
-+      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; 
-+      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
-+                     &cm->hca->ib_trans.addr.ib.gid, 16); 
-+
-+      /* 
-+       * UD: deliver p_data with REQ and EST event, keep REQ p_data in 
-+       * cm->msg.p_data and save REPLY accept data in cm->p_data for retries 
-+       */
-+      cm->p_size = p_size;
-+      dapl_os_memcpy(&cm->p_data, p_data, p_size);
-+
-+      /* save state and setup valid reference to EP, HCA */
-+      dapl_ep_link_cm(ep, cm);
-+      cm->ep = ep;
-+      cm->hca = ia->hca_ptr;
-+      
-+      dapl_os_lock(&cm->lock);
-+      dapl_os_get_time(&cm->timer); /* RTU expected */
-+      cm->state = DCM_RTU_PENDING;
-+      dapl_os_unlock(&cm->lock);
-+
-+      if (ucm_reply(cm)) {
-+              dapl_ep_unlink_cm(ep, cm);
-+              goto bail;
-+      }
-+      dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: accepted!\n");
-+      dapls_thread_signal(&cm->hca->ib_trans.signal);
-+      return DAT_SUCCESS;
-+bail:
-+      dapli_cm_free(cm);
-+      return DAT_INTERNAL_ERROR;
-+}
-+
-+
-+/*
-+ * dapls_ib_connect
-+ *
-+ * Initiate a connection with the passive listener on another node
-+ *
-+ * Input:
-+ *    ep_handle,
-+ *    remote_ia_address,
-+ *    remote_conn_qual,
-+ *    prd_size                size of private data and structure
-+ *    prd_prt                 pointer to private data structure
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INVALID_PARAMETER
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
-+               IN DAT_IA_ADDRESS_PTR r_addr,
-+               IN DAT_CONN_QUAL r_psp,
-+               IN DAT_COUNT p_size, IN void *p_data)
-+{
-+      DAPL_EP *ep = (DAPL_EP *)ep_handle;
-+      dp_ib_cm_handle_t cm;
-+      
-+      /* create CM object, initialize SRC info from EP */
-+      cm = dapls_ib_cm_create(ep);
-+      if (cm == NULL)
-+              return DAT_INSUFFICIENT_RESOURCES;
-+
-+      /* remote hca and port: lid, gid, network order */
-+      dapl_os_memcpy(&cm->msg.daddr, r_addr, sizeof(union dcm_addr));
-+
-+      /* remote uCM information, comes from consumer provider r_addr */
-+      cm->msg.dport = htons((uint16_t)r_psp);
-+      cm->msg.dqpn = cm->msg.daddr.ib.qpn;
-+      cm->msg.daddr.ib.qpn = 0; /* don't have a remote qpn until reply */
-+      
-+      if (p_size) {
-+              cm->msg.p_size = htons(p_size);
-+              dapl_os_memcpy(&cm->msg.p_data, p_data, p_size);
-+      }
-+      
-+      cm->state = DCM_REP_PENDING;
-+
-+      /* build connect request, send to remote CM based on r_addr info */
-+      return (dapli_cm_connect(ep, cm));
-+}
-+
-+/*
-+ * dapls_ib_disconnect
-+ *
-+ * Disconnect an EP
-+ *
-+ * Input:
-+ *    ep_handle,
-+ *    disconnect_flags
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ */
-+DAT_RETURN
-+dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags)
-+{
-+      dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr);
-+
-+      dapl_os_lock(&ep_ptr->header.lock);
-+      if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED ||
-+          ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ||
-+          cm_ptr == NULL) {
-+              dapl_os_unlock(&ep_ptr->header.lock);
-+              return DAT_SUCCESS;
-+      } 
-+      dapl_os_unlock(&ep_ptr->header.lock);
-+      
-+      dapli_cm_disconnect(cm_ptr);
-+
-+        /* ABRUPT close, wait for callback and DISCONNECTED state */
-+        if (close_flags == DAT_CLOSE_ABRUPT_FLAG) {
-+                dapl_os_lock(&ep_ptr->header.lock);
-+                while (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) {
-+                        dapl_os_unlock(&ep_ptr->header.lock);
-+                        dapl_os_sleep_usec(10000);
-+                        dapl_os_lock(&ep_ptr->header.lock);
-+                }
-+                dapl_os_unlock(&ep_ptr->header.lock);
-+        }
-+
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_ib_disconnect_clean
-+ *
-+ * Clean up outstanding connection data. This routine is invoked
-+ * after the final disconnect callback has occurred. Only on the
-+ * ACTIVE side of a connection. It is also called if dat_ep_connect
-+ * times out using the consumer supplied timeout value.
-+ *
-+ * Input:
-+ *    ep_ptr          DAPL_EP
-+ *    active          Indicates active side of connection
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    void
-+ *
-+ */
-+void
-+dapls_ib_disconnect_clean(IN DAPL_EP *ep,
-+                        IN DAT_BOOLEAN active,
-+                        IN const ib_cm_events_t ib_cm_event)
-+{
-+      if (ib_cm_event == IB_CME_TIMEOUT) {
-+              dp_ib_cm_handle_t cm_ptr;
-+
-+              if ((cm_ptr = dapl_get_cm_from_ep(ep)) == NULL)
-+                      return;
-+
-+              dapl_log(DAPL_DBG_TYPE_WARN,
-+                      "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n",
-+                      ep, cm_ptr, dapl_cm_state_str(cm_ptr->state));
-+              
-+              /* schedule release of socket and local resources */
-+              dapli_cm_free(cm_ptr);
-+      }
-+}
-+
-+/*
-+ * dapl_ib_setup_conn_listener
-+ *
-+ * Have the CM set up a connection listener.
-+ *
-+ * Input:
-+ *    ibm_hca_handle          HCA handle
-+ *    qp_handle                       QP handle
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INTERNAL_ERROR
-+ *    DAT_CONN_QUAL_UNAVAILBLE
-+ *    DAT_CONN_QUAL_IN_USE
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_setup_conn_listener(IN DAPL_IA *ia, 
-+                           IN DAT_UINT64 sid, 
-+                           IN DAPL_SP *sp)
-+{
-+      ib_cm_srvc_handle_t cm = NULL;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " listen(ia %p ServiceID %x sp %p)\n",
-+                   ia, sid, sp);
-+
-+      /* reserve local port, then allocate CM object */
-+      if (!ucm_get_port(&ia->hca_ptr->ib_trans, (uint16_t)sid)) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_WARN,
-+                           " listen: ERROR %s on conn_qual %x\n",
-+                           strerror(errno), sid);
-+              return DAT_CONN_QUAL_IN_USE;
-+      }
-+
-+      /* cm_create will setup saddr for listen server */
-+      if ((cm = dapls_ib_cm_create(NULL)) == NULL)
-+              return DAT_INSUFFICIENT_RESOURCES;
-+
-+      /* LISTEN: init DST address and QP info to local CM server info */
-+      cm->sp = sp;
-+      cm->hca = ia->hca_ptr;
-+      cm->msg.sport = htons((uint16_t)sid);
-+      cm->msg.sqpn = htonl(ia->hca_ptr->ib_trans.qp->qp_num);
-+      cm->msg.saddr.ib.qp_type = IBV_QPT_UD;
-+        cm->msg.saddr.ib.lid = ia->hca_ptr->ib_trans.addr.ib.lid; 
-+      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
-+                     &cm->hca->ib_trans.addr.ib.gid, 16); 
-+      
-+      /* save cm_handle reference in service point */
-+      sp->cm_srvc_handle = cm;
-+
-+      /* queue up listen socket to process inbound CR's */
-+      cm->state = DCM_LISTEN;
-+      dapli_queue_listen(cm);
-+
-+      return DAT_SUCCESS;
-+}
-+
-+
-+/*
-+ * dapl_ib_remove_conn_listener
-+ *
-+ * Have the CM remove a connection listener.
-+ *
-+ * Input:
-+ *    ia_handle               IA handle
-+ *    ServiceID               IB Channel Service ID
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INVALID_STATE
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_remove_conn_listener(IN DAPL_IA *ia, IN DAPL_SP *sp)
-+{
-+      ib_cm_srvc_handle_t cm = sp->cm_srvc_handle;
-+
-+      /* free cm_srvc_handle and port, and mark CM for cleanup */
-+      if (cm) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " remove_listener(ia %p sp %p cm %p psp=%x)\n",
-+                   ia, sp, cm, ntohs(cm->msg.dport));
-+
-+              sp->cm_srvc_handle = NULL;
-+              dapli_dequeue_listen(cm);  
-+              ucm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport));
-+              dapls_cm_release(cm);  /* last ref, dealloc */
-+      }
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_ib_accept_connection
-+ *
-+ * Perform necessary steps to accept a connection
-+ *
-+ * Input:
-+ *    cr_handle
-+ *    ep_handle
-+ *    private_data_size
-+ *    private_data
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INSUFFICIENT_RESOURCES
-+ *    DAT_INTERNAL_ERROR
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
-+                         IN DAT_EP_HANDLE ep_handle,
-+                         IN DAT_COUNT p_size, 
-+                         IN const DAT_PVOID p_data)
-+{
-+      DAPL_CR *cr = (DAPL_CR *)cr_handle;
-+      DAPL_EP *ep = (DAPL_EP *)ep_handle;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " accept_connection(cr %p ep %p prd %p,%d)\n",
-+                   cr, ep, p_data, p_size);
-+
-+      /* allocate and attach a QP if necessary */
-+      if (ep->qp_state == DAPL_QP_STATE_UNATTACHED) {
-+              DAT_RETURN status;
-+              status = dapls_ib_qp_alloc(ep->header.owner_ia,
-+                                         ep, ep);
-+              if (status != DAT_SUCCESS)
-+                      return status;
-+      }
-+      return (dapli_accept_usr(ep, cr, p_size, p_data));
-+}
-+
-+/*
-+ * dapls_ib_reject_connection
-+ *
-+ * Reject a connection
-+ *
-+ * Input:
-+ *    cr_handle
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INTERNAL_ERROR
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm,
-+                         IN int reason,
-+                         IN DAT_COUNT psize, IN const DAT_PVOID pdata)
-+{
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   " reject(cm %p reason %x, pdata %p, psize %d)\n",
-+                   cm, reason, pdata, psize);
-+
-+        if (psize > DCM_MAX_PDATA_SIZE)
-+                return DAT_LENGTH_ERROR;
-+
-+      /* cr_thread will destroy CR, update saddr lid, gid, qp_type info */
-+      dapl_os_lock(&cm->lock);
-+      dapl_log(DAPL_DBG_TYPE_CM, 
-+               " PASSIVE: REJECTING CM_REQ:"
-+               " cm %p op %s, st %s slid %x iqp %x port %x ->"
-+               " dlid %x iqp %x port %x\n", cm,
-+               dapl_cm_op_str(ntohs(cm->msg.op)), 
-+               dapl_cm_state_str(cm->state), 
-+               ntohs(cm->hca->ib_trans.addr.ib.lid), 
-+               ntohl(cm->msg.saddr.ib.qpn), 
-+               ntohs(cm->msg.sport), ntohs(cm->msg.daddr.ib.lid), 
-+               ntohl(cm->msg.daddr.ib.qpn), ntohs(cm->msg.dport));
-+
-+      cm->state = DCM_REJECTED;
-+      cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; 
-+      cm->msg.saddr.ib.qp_type = cm->msg.daddr.ib.qp_type;
-+      dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
-+                     &cm->hca->ib_trans.addr.ib.gid, 16); 
-+      cm->msg.op = htons(DCM_REJ_USER);
-+      
-+      if (ucm_send(&cm->hca->ib_trans, &cm->msg, pdata, psize)) {
-+              dapl_log(DAPL_DBG_TYPE_WARN,
-+                       " cm_reject: send ERR: %s\n", strerror(errno));
-+              dapl_os_unlock(&cm->lock);
-+              return DAT_INTERNAL_ERROR;
-+      }
-+      dapl_os_unlock(&cm->lock);
-+      dapli_cm_free(cm);
-+      return DAT_SUCCESS;
-+}
-+
-+/*
-+ * dapls_ib_cm_remote_addr
-+ *
-+ * Obtain the remote IP address given a connection
-+ *
-+ * Input:
-+ *    cr_handle
-+ *
-+ * Output:
-+ *    remote_ia_address: where to place the remote address
-+ *
-+ * Returns:
-+ *    DAT_SUCCESS
-+ *    DAT_INVALID_HANDLE
-+ *
-+ */
-+DAT_RETURN
-+dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,
-+                      OUT DAT_SOCK_ADDR6 * remote_ia_address)
-+{
-+      DAPL_HEADER *header;
-+      dp_ib_cm_handle_t cm;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_EP,
-+                   "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",
-+                   dat_handle);
-+
-+      header = (DAPL_HEADER *) dat_handle;
-+
-+      if (header->magic == DAPL_MAGIC_EP)
-+              cm = dapl_get_cm_from_ep((DAPL_EP *) dat_handle);
-+      else if (header->magic == DAPL_MAGIC_CR)
-+              cm = ((DAPL_CR *) dat_handle)->ib_cm_handle;
-+      else
-+              return DAT_INVALID_HANDLE;
-+
-+      dapl_os_memcpy(remote_ia_address,
-+                     &cm->msg.daddr, sizeof(DAT_SOCK_ADDR6));
-+
-+      return DAT_SUCCESS;
-+}
-+
-+int dapls_ib_private_data_size(
-+      IN DAPL_HCA *hca_ptr)
-+{
-+      return DCM_MAX_PDATA_SIZE;
-+}
-+
-+#if defined(_WIN32) || defined(_WIN64)
-+
-+void cm_thread(void *arg)
-+{
-+      struct dapl_hca *hca = arg;
-+      dp_ib_cm_handle_t cm, next;
-+      DWORD time_ms;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);
-+      dapl_os_lock(&hca->ib_trans.lock);
-+      for (hca->ib_trans.cm_state = IB_THREAD_RUN;
-+           hca->ib_trans.cm_state == IB_THREAD_RUN ||
-+           !dapl_llist_is_empty(&hca->ib_trans.list);
-+           dapl_os_lock(&hca->ib_trans.lock)) {
-+
-+              time_ms = INFINITE;
-+              CompSetZero(&hca->ib_trans.signal.set);
-+              CompSetAdd(&hca->ib_hca_handle->channel, &hca->ib_trans.signal.set);
-+              CompSetAdd(&hca->ib_trans.rch->comp_channel, &hca->ib_trans.signal.set);
-+              CompSetAdd(&hca->ib_trans.ib_cq->comp_channel, &hca->ib_trans.signal.set);
-+
-+              next = dapl_llist_is_empty(&hca->ib_trans.list) ? NULL :
-+                      dapl_llist_peek_head(&hca->ib_trans.list);
-+
-+              while (next) {
-+                      cm = next;
-+                      next = dapl_llist_next_entry(&hca->ib_trans.list,
-+                                                   (DAPL_LLIST_ENTRY *)&cm->local_entry);
-+                      dapls_cm_acquire(cm); /* hold thread ref */
-+                      dapl_os_lock(&cm->lock);
-+                      if (cm->state == DCM_FREE || 
-+                          hca->ib_trans.cm_state != IB_THREAD_RUN) {
-+                              dapl_os_unlock(&cm->lock);
-+                              dapl_log(DAPL_DBG_TYPE_CM, 
-+                                       " CM FREE: %p ep=%p st=%s refs=%d\n", 
-+                                       cm, cm->ep, dapl_cm_state_str(cm->state), 
-+                                       cm->ref_count);
-+
-+                              dapls_cm_release(cm); /* release alloc ref */
-+                              dapli_cm_dequeue(cm); /* release workq ref */
-+                              dapls_cm_release(cm); /* release thread ref */
-+                              continue;
-+                      }
-+                      dapl_os_unlock(&cm->lock);
-+                      ucm_check_timers(cm, &time_ms);
-+                      dapls_cm_release(cm); /* release thread ref */
-+              }
-+
-+              dapl_os_unlock(&hca->ib_trans.lock);
-+
-+              hca->ib_hca_handle->channel.Milliseconds = time_ms;
-+              hca->ib_trans.rch->comp_channel.Milliseconds = time_ms;
-+              hca->ib_trans.ib_cq->comp_channel.Milliseconds = time_ms;
-+              CompSetPoll(&hca->ib_trans.signal.set, time_ms);
-+
-+              hca->ib_hca_handle->channel.Milliseconds = 0;
-+              hca->ib_trans.rch->comp_channel.Milliseconds = 0;
-+              hca->ib_trans.ib_cq->comp_channel.Milliseconds = 0;
-+
-+              ucm_recv(&hca->ib_trans);
-+              ucm_async_event(hca);
-+              dapli_cq_event_cb(&hca->ib_trans);
-+      }
-+
-+      dapl_os_unlock(&hca->ib_trans.lock);
-+      hca->ib_trans.cm_state = IB_THREAD_EXIT;
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);
-+}
-+
-+#else                         // _WIN32 || _WIN64
-+
-+void cm_thread(void *arg)
-+{
-+      struct dapl_hca *hca = arg;
-+      dp_ib_cm_handle_t cm, next;
-+      struct dapl_fd_set *set;
-+      char rbuf[2];
-+      int time_ms;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca);
-+      set = dapl_alloc_fd_set();
-+      if (!set)
-+              goto out;
-+
-+      dapl_os_lock(&hca->ib_trans.lock);
-+      hca->ib_trans.cm_state = IB_THREAD_RUN;
-+
-+      while (1) {
-+              time_ms = -1; /* reset to blocking */
-+              dapl_fd_zero(set);
-+              dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ);    
-+              dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ);
-+              dapl_fd_set(hca->ib_trans.rch->fd, set, DAPL_FD_READ);
-+              dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ);
-+              
-+              if (!dapl_llist_is_empty(&hca->ib_trans.list))
-+                      next = dapl_llist_peek_head(&hca->ib_trans.list);
-+              else
-+                      next = NULL;
-+
-+              while (next) {
-+                      cm = next;
-+                      next = dapl_llist_next_entry(
-+                                      &hca->ib_trans.list,
-+                                      (DAPL_LLIST_ENTRY *)&cm->local_entry);
-+                      dapls_cm_acquire(cm); /* hold thread ref */
-+                      dapl_os_lock(&cm->lock);
-+                      if (cm->state == DCM_FREE || 
-+                          hca->ib_trans.cm_state != IB_THREAD_RUN) {
-+                              dapl_os_unlock(&cm->lock);
-+                              dapl_log(DAPL_DBG_TYPE_CM, 
-+                                       " CM FREE: %p ep=%p st=%s refs=%d\n", 
-+                                       cm, cm->ep, dapl_cm_state_str(cm->state), 
-+                                       cm->ref_count);
-+
-+                              dapls_cm_release(cm); /* release alloc ref */
-+                              dapli_cm_dequeue(cm); /* release workq ref */
-+                              dapls_cm_release(cm); /* release thread ref */
-+                              continue;
-+                      }
-+                      dapl_os_unlock(&cm->lock);
-+                      ucm_check_timers(cm, &time_ms);
-+                      dapls_cm_release(cm); /* release thread ref */
-+              }
-+
-+              /* set to exit and all resources destroyed */
-+              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&
-+                  (dapl_llist_is_empty(&hca->ib_trans.list)))
-+                      break;
-+
-+              dapl_os_unlock(&hca->ib_trans.lock);
-+              dapl_select(set, time_ms);
-+
-+              /* Process events: CM, ASYNC, NOTIFY THREAD */
-+              if (dapl_poll(hca->ib_trans.rch->fd, 
-+                            DAPL_FD_READ) == DAPL_FD_READ) {
-+                      ucm_recv(&hca->ib_trans);
-+              }
-+              if (dapl_poll(hca->ib_hca_handle->async_fd, 
-+                            DAPL_FD_READ) == DAPL_FD_READ) {
-+                      ucm_async_event(hca);
-+              }
-+              if (dapl_poll(hca->ib_trans.ib_cq->fd, 
-+                            DAPL_FD_READ) == DAPL_FD_READ) {
-+                      dapli_cq_event_cb(&hca->ib_trans);
-+              }
-+              while (dapl_poll(hca->ib_trans.signal.scm[0], 
-+                               DAPL_FD_READ) == DAPL_FD_READ) {
-+                      recv(hca->ib_trans.signal.scm[0], rbuf, 2, 0);
-+              }
-+              dapl_os_lock(&hca->ib_trans.lock);
-+              
-+              /* set to exit and all resources destroyed */
-+              if ((hca->ib_trans.cm_state != IB_THREAD_RUN) &&
-+                  (dapl_llist_is_empty(&hca->ib_trans.list)))
-+                      break;
-+      }
-+
-+      dapl_os_unlock(&hca->ib_trans.lock);
-+      free(set);
-+out:
-+      hca->ib_trans.cm_state = IB_THREAD_EXIT;
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca);
-+}
-+#endif
-+
-+#ifdef DAPL_COUNTERS
-+static char _ctr_host_[128];
-+/* Debug aid: List all Connections in process and state */
-+void dapls_print_cm_list(IN DAPL_IA *ia_ptr)
-+{
-+      /* Print in process CM's for this IA, if debug type set */
-+      int i = 0;
-+      dp_ib_cm_handle_t cm, next_cm;
-+      struct dapl_llist_entry **list;
-+      DAPL_OS_LOCK *lock;
-+      
-+      /* LISTEN LIST */
-+      list = &ia_ptr->hca_ptr->ib_trans.llist;
-+      lock = &ia_ptr->hca_ptr->ib_trans.llock;
-+
-+      dapl_os_lock(lock);
-+      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))
-+              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);
-+      else
-+              next_cm = NULL;
-+
-+      gethostname(_ctr_host_, sizeof(_ctr_host_));
-+      printf("\n [%s:%x] DAPL IA LISTEN/CONNECTIONS IN PROCESS:\n", 
-+              _ctr_host_ , dapl_os_getpid());
-+
-+      while (next_cm) {
-+              cm = next_cm;
-+              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,
-+                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);
-+
-+              printf( "  LISTEN[%d]: sp %p %s uCM_QP: %x %x %x l_pid %x (%x)\n",
-+                      i, cm->sp, dapl_cm_state_str(cm->state),
-+                      ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport),
-+                      ntohl(cm->msg.sqpn), ntohl(*(DAT_UINT32*)cm->msg.resv), 
-+                      ntohl(*(DAT_UINT32*)cm->msg.resv)); 
-+              i++;
-+      }
-+      dapl_os_unlock(lock);
-+
-+      /* CONNECTION LIST */
-+      list = &ia_ptr->hca_ptr->ib_trans.list;
-+      lock = &ia_ptr->hca_ptr->ib_trans.lock;
-+
-+      dapl_os_lock(lock);
-+      if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list))
-+              next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list);
-+      else
-+              next_cm = NULL;
-+
-+        while (next_cm) {
-+              cm = next_cm;
-+              next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list,
-+                                              (DAPL_LLIST_ENTRY*)&cm->local_entry);
-+
-+              printf( "  CONN[%d]: ep %p cm %p %s %s"
-+                      "  %x %x %x %s %x %x %x r_pid %x (%x)\n",
-+                      i, cm->ep, cm,
-+                      cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD",
-+                      dapl_cm_state_str(cm->state),
-+                      ntohs(cm->msg.saddr.ib.lid),
-+                      ntohs(cm->msg.sport),
-+                      ntohl(cm->msg.saddr.ib.qpn),    
-+                      cm->sp ? "<-" : "->",
-+                      ntohs(cm->msg.daddr.ib.lid),
-+                      ntohs(cm->msg.dport),
-+                      ntohl(cm->msg.daddr.ib.qpn),
-+                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv), 
-+                      ntohs(cm->msg.op) == DCM_REQ ? 0 : ntohl(*(DAT_UINT32*)cm->msg.resv)); 
-+              i++;
-+      }
-+      printf("\n");
-+      dapl_os_unlock(lock);
-+}
-+#endif
-diff --git a/trunk/ulp/dapl2/dapl/openib_ucm/device.c b/trunk/ulp/dapl2/dapl/openib_ucm/device.c
-index 1959c76..b7d9efd 100644
---- a/trunk/ulp/dapl2/dapl/openib_ucm/device.c
-+++ b/trunk/ulp/dapl2/dapl/openib_ucm/device.c
-@@ -581,8 +581,6 @@ void ucm_async_event(struct dapl_hca *hca)
-       struct ibv_async_event event;
-       struct _ib_hca_transport *tp = &hca->ib_trans;
--      dapl_log(DAPL_DBG_TYPE_WARN, " async_event(%p)\n", hca);
--
-       if (!ibv_get_async_event(hca->ib_hca_handle, &event)) {
-               switch (event.event_type) {
-diff --git a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c
-index 718e433..36b632a 100644
---- a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c
-+++ b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_set_unwaitable.c
-@@ -71,7 +71,6 @@ DAT_RETURN DAT_API dapl_evd_set_unwaitable(IN DAT_EVD_HANDLE evd_handle)
-       }
-       dapl_os_lock(&evd_ptr->header.lock);
-       evd_ptr->evd_waitable = DAT_FALSE;
--      dapl_os_unlock(&evd_ptr->header.lock);
-       /*
-        * If this evd is waiting, wake it up. There is an obvious race
-@@ -85,6 +84,7 @@ DAT_RETURN DAT_API dapl_evd_set_unwaitable(IN DAT_EVD_HANDLE evd_handle)
-               else
-                       dapl_os_wait_object_wakeup(&evd_ptr->wait_object);
-       }
-+      dapl_os_unlock(&evd_ptr->header.lock);
-       bail:
-       return dat_status;
- }
-diff --git a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c
-index 79afb0d..33cec50 100644
---- a/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c
-+++ b/trunk/ulp/dapl2/dapl/udapl/dapl_evd_wait.c
-@@ -168,14 +168,12 @@ DAT_RETURN DAT_API dapl_evd_wait(IN DAT_EVD_HANDLE evd_handle,
-                * return right away if the ib_cq_handle associate with these evd
-                * equal to IB_INVALID_HANDLE
-                */
--              dapl_os_unlock(&evd_ptr->header.lock);
--              dapls_evd_copy_cq(evd_ptr);
--              dapl_os_lock(&evd_ptr->header.lock);
-+              dat_status = dapls_evd_copy_cq(evd_ptr);
-+              if (dat_status == DAT_QUEUE_FULL)
-+                      goto bail;
--              if (dapls_rbuf_count(&evd_ptr->pending_event_queue) >=
--                  threshold) {
-+              if (dapls_rbuf_count(&evd_ptr->pending_event_queue) >= threshold)
-                       break;
--              }
-               /*
-                * Do not enable the completion notification if this evd is not 
-@@ -266,6 +264,8 @@ DAT_RETURN DAT_API dapl_evd_wait(IN DAT_EVD_HANDLE evd_handle,
-       if (dat_status) {
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            "dapl_evd_wait () returns 0x%x\n", dat_status);
-+              if (dat_status == DAT_QUEUE_FULL)
-+                      dapls_evd_post_overflow_event(evd_ptr);
-       }
-       return dat_status;
- }
-diff --git a/trunk/ulp/dapl2/dapl/udapl/dapl_init.c b/trunk/ulp/dapl2/dapl/udapl/dapl_init.c
-index 605ab80..07e5b31 100644
---- a/trunk/ulp/dapl2/dapl/udapl/dapl_init.c
-+++ b/trunk/ulp/dapl2/dapl/udapl/dapl_init.c
-@@ -1,307 +1,307 @@
--/*\r
-- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
-- *\r
-- * This Software is licensed under one of the following licenses:\r
-- *\r
-- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/cpl.php.\r
-- *\r
-- * 2) under the terms of the "The BSD License" a copy of which is\r
-- *    available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/bsd-license.php.\r
-- *\r
-- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
-- *    copy of which is available from the Open Source Initiative, see\r
-- *    http://www.opensource.org/licenses/gpl-license.php.\r
-- *\r
-- * Licensee has the right to choose one of the above licenses.\r
-- *\r
-- * Redistributions of source code must retain the above copyright\r
-- * notice and one of the license notices.\r
-- *\r
-- * Redistributions in binary form must reproduce both the above copyright\r
-- * notice, one of the license notices in the documentation\r
-- * and/or other materials provided with the distribution.\r
-- */\r
--\r
--/**********************************************************************\r
-- * \r
-- * MODULE: dapl_init.c\r
-- *\r
-- * PURPOSE: Interface Adapter management\r
-- * Description: Interfaces in this file are completely described in\r
-- *            the DAPL 1.1 API, Chapter 6, section 2\r
-- *\r
-- * $Id:$\r
-- **********************************************************************/\r
--\r
--#include "dapl.h"\r
--#include <dat2/dat_registry.h>        /* Provider API function prototypes */\r
--#include "dapl_hca_util.h"\r
--#include "dapl_init.h"\r
--#include "dapl_provider.h"\r
--#include "dapl_mr_util.h"\r
--#include "dapl_osd.h"\r
--#include "dapl_adapter_util.h"\r
--#include "dapl_name_service.h"\r
--#include "dapl_timer_util.h"\r
--#include "dapl_vendor.h"\r
--\r
--/*\r
-- * dapl_init\r
-- *\r
-- * initialize this provider\r
-- * includes initialization of all global variables\r
-- * as well as registering all supported IAs with the dat registry\r
-- *\r
-- * This function needs to be called once when the provider is loaded.\r
-- *\r
-- * Input:\r
-- *    none\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Return Values:\r
-- */\r
--void dapl_init(void)\r
--{\r
--      DAT_RETURN dat_status;\r
--\r
--      /* set up debug type */\r
--      g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE",\r
--                                            DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN);\r
--      /* set up debug destination */\r
--      g_dapl_dbg_dest = dapl_os_get_env_val("DAPL_DBG_DEST",\r
--                                            DAPL_DBG_DEST_STDOUT);\r
--\r
--      /* open log file on first logging call if necessary */\r
--      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)\r
--              openlog("libdapl", LOG_ODELAY | LOG_PID | LOG_CONS, LOG_USER);\r
--\r
--      dapl_log(DAPL_DBG_TYPE_UTIL, "dapl_init: dbg_type=0x%x,dbg_dest=0x%x\n",\r
--               g_dapl_dbg_type, g_dapl_dbg_dest);\r
--\r
--      /* See if the user is on a loopback setup */\r
--      g_dapl_loopback_connection = dapl_os_get_env_bool("DAPL_LOOPBACK");\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n",\r
--                   g_dapl_loopback_connection ? "" : "NOT");\r
--\r
--      /* initialize verbs library */\r
--      dapls_ib_init();\r
--\r
--      /* initialize the timer */\r
--      dapls_timer_init();\r
--\r
--      /* Set up name services */\r
--      dat_status = dapls_ns_init();\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dapls_ns_init failed %d\n", dat_status);\r
--              goto bail;\r
--      }\r
--\r
--      /* initialize the provider list */\r
--      dat_status = dapl_provider_list_create();\r
--\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dapl_provider_list_create failed %d\n",\r
--                           dat_status);\r
--              goto bail;\r
--      }\r
--\r
--      return;\r
--\r
--      bail:\r
--      dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n");\r
--      return;\r
--}\r
--\r
--/*\r
-- * dapl_fini\r
-- *\r
-- * finalize this provider\r
-- * includes freeing of all global variables\r
-- * as well as deregistering all supported IAs from the dat registry\r
-- *\r
-- * This function needs to be called once when the provider is loaded.\r
-- *\r
-- * Input:\r
-- *    none\r
-- *\r
-- * Output:\r
-- *    none\r
-- *\r
-- * Return Values:\r
-- */\r
--void dapl_fini(void)\r
--{\r
--      DAT_RETURN dat_status;\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: ENTER (dapl_fini)\n");\r
--\r
--      dat_status = dapl_provider_list_destroy();\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dapl_provider_list_destroy failed %d\n",\r
--                           dat_status);\r
--      }\r
--\r
--      dapls_ib_release();\r
--      dapls_timer_release();\r
--\r
--      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Exit (dapl_fini)\n");\r
--\r
--      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)\r
--              closelog();\r
--\r
--      return;\r
--}\r
--\r
--/*\r
-- *\r
-- * This function is called by the registry to initialize a provider\r
-- *\r
-- * The instance data string is expected to have the following form:\r
-- *\r
-- * <hca name> <port number>\r
-- *\r
-- */\r
--void DAT_API\r
--DAT_PROVIDER_INIT_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info,\r
--                          IN const char *instance_data)\r
--{\r
--      DAT_PROVIDER *provider;\r
--      DAPL_HCA *hca_ptr;\r
--      DAT_RETURN dat_status;\r
--      char *data;\r
--      char *name;\r
--      char *port;\r
--      unsigned int len;\r
--      unsigned int i;\r
--\r
--      data = NULL;\r
--      provider = NULL;\r
--      hca_ptr = NULL;\r
--\r
--#if defined(_WIN32) || defined(_WIN64)\r
--      /* initialize DAPL library here as when called from DLL context in DLLmain()\r
--       * the IB (ibal) call hangs.\r
--       */\r
--      dapl_init();\r
--#endif\r
--\r
--      dat_status =\r
--          dapl_provider_list_insert(provider_info->ia_name, &provider);\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dat_provider_list_insert failed: %x\n",\r
--                           dat_status);\r
--              goto bail;\r
--      }\r
--\r
--      data = dapl_os_strdup(instance_data);\r
--      if (NULL == data) {\r
--              goto bail;\r
--      }\r
--\r
--      len = dapl_os_strlen(data);\r
--\r
--      for (i = 0; i < len; i++) {\r
--              if (' ' == data[i]) {\r
--                      data[i] = '\0';\r
--                      break;\r
--              }\r
--      }\r
--\r
--      /* if the instance data did not have a valid format */\r
--      if (i == len) {\r
--              goto bail;\r
--      }\r
--\r
--      name = data;\r
--      port = data + (i + 1);\r
--\r
--      hca_ptr = dapl_hca_alloc(name, port);\r
--      if (NULL == hca_ptr) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "%s() dapl_hca_alloc failed?\n");\r
--              goto bail;\r
--      }\r
--\r
--      provider->extension = hca_ptr;\r
--      dat_status = dat_registry_add_provider(provider, provider_info);\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dat_registry_add_provider failed: %x\n",\r
--                           dat_status);\r
--      }\r
--\r
--      bail:\r
--      if (NULL != data) {\r
--              dapl_os_free(data, len + 1);\r
--      }\r
--\r
--      if (DAT_SUCCESS != dat_status) {\r
--              if (NULL != provider) {\r
--                      (void)dapl_provider_list_remove(provider_info->ia_name);\r
--              }\r
--\r
--              if (NULL != hca_ptr) {\r
--                      dapl_hca_free(hca_ptr);\r
--              }\r
--      }\r
--}\r
--\r
--/*\r
-- *\r
-- * This function is called by the registry to de-initialize a provider\r
-- *\r
-- */\r
--void DAT_API\r
--DAT_PROVIDER_FINI_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info)\r
--{\r
--      DAT_PROVIDER *provider;\r
--      DAT_RETURN dat_status;\r
--\r
--      dat_status =\r
--          dapl_provider_list_search(provider_info->ia_name, &provider);\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dat_registry_add_provider failed: %x\n",\r
--                           dat_status);\r
--              return;\r
--      }\r
--\r
--      dat_status = dat_registry_remove_provider(provider, provider_info);\r
--      if (DAT_SUCCESS != dat_status) {\r
--              dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
--                           "dat_registry_add_provider failed: %x\n",\r
--                           dat_status);\r
--      }\r
--\r
--      /*\r
--       * free HCA memory\r
--       */\r
--      dapl_hca_free(provider->extension);\r
--\r
--      (void)dapl_provider_list_remove(provider_info->ia_name);\r
--\r
--#if defined(_WIN32) || defined(_WIN64)\r
--      /* cleanup DAPL library - relocated here from OSD DLL context as the IBAL\r
--       * calls hung in the DLL context?\r
--       */\r
--      dapl_fini();\r
--#endif\r
--}\r
--\r
--/*\r
-- * Local variables:\r
-- *  c-indent-level: 4\r
-- *  c-basic-offset: 4\r
-- *  tab-width: 8\r
-- * End:\r
-- */\r
-+/*
-+ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
-+ *
-+ * This Software is licensed under one of the following licenses:
-+ *
-+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/cpl.php.
-+ *
-+ * 2) under the terms of the "The BSD License" a copy of which is
-+ *    available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/bsd-license.php.
-+ *
-+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-+ *    copy of which is available from the Open Source Initiative, see
-+ *    http://www.opensource.org/licenses/gpl-license.php.
-+ *
-+ * Licensee has the right to choose one of the above licenses.
-+ *
-+ * Redistributions of source code must retain the above copyright
-+ * notice and one of the license notices.
-+ *
-+ * Redistributions in binary form must reproduce both the above copyright
-+ * notice, one of the license notices in the documentation
-+ * and/or other materials provided with the distribution.
-+ */
-+
-+/**********************************************************************
-+ * 
-+ * MODULE: dapl_init.c
-+ *
-+ * PURPOSE: Interface Adapter management
-+ * Description: Interfaces in this file are completely described in
-+ *            the DAPL 1.1 API, Chapter 6, section 2
-+ *
-+ * $Id:$
-+ **********************************************************************/
-+
-+#include "dapl.h"
-+#include <dat2/dat_registry.h>        /* Provider API function prototypes */
-+#include "dapl_hca_util.h"
-+#include "dapl_init.h"
-+#include "dapl_provider.h"
-+#include "dapl_mr_util.h"
-+#include "dapl_osd.h"
-+#include "dapl_adapter_util.h"
-+#include "dapl_name_service.h"
-+#include "dapl_timer_util.h"
-+#include "dapl_vendor.h"
-+
-+/*
-+ * dapl_init
-+ *
-+ * initialize this provider
-+ * includes initialization of all global variables
-+ * as well as registering all supported IAs with the dat registry
-+ *
-+ * This function needs to be called once when the provider is loaded.
-+ *
-+ * Input:
-+ *    none
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Return Values:
-+ */
-+void dapl_init(void)
-+{
-+      DAT_RETURN dat_status;
-+
-+      /* set up debug type */
-+      g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE",
-+                                            DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN);
-+      /* set up debug destination */
-+      g_dapl_dbg_dest = dapl_os_get_env_val("DAPL_DBG_DEST",
-+                                            DAPL_DBG_DEST_STDOUT);
-+
-+      /* open log file on first logging call if necessary */
-+      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)
-+              openlog("libdapl", LOG_ODELAY | LOG_PID | LOG_CONS, LOG_USER);
-+
-+      dapl_log(DAPL_DBG_TYPE_UTIL, "dapl_init: dbg_type=0x%x,dbg_dest=0x%x\n",
-+               g_dapl_dbg_type, g_dapl_dbg_dest);
-+
-+      /* See if the user is on a loopback setup */
-+      g_dapl_loopback_connection = dapl_os_get_env_bool("DAPL_LOOPBACK");
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n",
-+                   g_dapl_loopback_connection ? "" : "NOT");
-+
-+      /* initialize verbs library */
-+      dapls_ib_init();
-+
-+      /* initialize the timer */
-+      dapls_timer_init();
-+
-+      /* Set up name services */
-+      dat_status = dapls_ns_init();
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dapls_ns_init failed %d\n", dat_status);
-+              goto bail;
-+      }
-+
-+      /* initialize the provider list */
-+      dat_status = dapl_provider_list_create();
-+
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dapl_provider_list_create failed %d\n",
-+                           dat_status);
-+              goto bail;
-+      }
-+
-+      return;
-+
-+      bail:
-+      dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n");
-+      return;
-+}
-+
-+/*
-+ * dapl_fini
-+ *
-+ * finalize this provider
-+ * includes freeing of all global variables
-+ * as well as deregistering all supported IAs from the dat registry
-+ *
-+ * This function needs to be called once when the provider is loaded.
-+ *
-+ * Input:
-+ *    none
-+ *
-+ * Output:
-+ *    none
-+ *
-+ * Return Values:
-+ */
-+void dapl_fini(void)
-+{
-+      DAT_RETURN dat_status;
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: ENTER (dapl_fini)\n");
-+
-+      dat_status = dapl_provider_list_destroy();
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dapl_provider_list_destroy failed %d\n",
-+                           dat_status);
-+      }
-+
-+      dapls_ib_release();
-+      dapls_timer_release();
-+
-+      dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Exit (dapl_fini)\n");
-+
-+      if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)
-+              closelog();
-+
-+      return;
-+}
-+
-+/*
-+ *
-+ * This function is called by the registry to initialize a provider
-+ *
-+ * The instance data string is expected to have the following form:
-+ *
-+ * <hca name> <port number>
-+ *
-+ */
-+void DAT_API
-+DAT_PROVIDER_INIT_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info,
-+                          IN const char *instance_data)
-+{
-+      DAT_PROVIDER *provider;
-+      DAPL_HCA *hca_ptr;
-+      DAT_RETURN dat_status;
-+      char *data;
-+      char *name;
-+      char *port;
-+      unsigned int len;
-+      unsigned int i;
-+
-+      data = NULL;
-+      provider = NULL;
-+      hca_ptr = NULL;
-+
-+#if defined(_WIN32) || defined(_WIN64)
-+      /* initialize DAPL library here as when called from DLL context in DLLmain()
-+       * the IB (ibal) call hangs.
-+       */
-+      dapl_init();
-+#endif
-+
-+      dat_status =
-+          dapl_provider_list_insert(provider_info->ia_name, &provider);
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dat_provider_list_insert failed: %x\n",
-+                           dat_status);
-+              goto bail;
-+      }
-+
-+      data = dapl_os_strdup(instance_data);
-+      if (NULL == data) {
-+              goto bail;
-+      }
-+
-+      len = dapl_os_strlen(data);
-+
-+      for (i = 0; i < len; i++) {
-+              if (' ' == data[i]) {
-+                      data[i] = '\0';
-+                      break;
-+              }
-+      }
-+
-+      /* if the instance data did not have a valid format */
-+      if (i == len) {
-+              goto bail;
-+      }
-+
-+      name = data;
-+      port = data + (i + 1);
-+
-+      hca_ptr = dapl_hca_alloc(name, port);
-+      if (NULL == hca_ptr) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "%s() dapl_hca_alloc failed?\n");
-+              goto bail;
-+      }
-+
-+      provider->extension = hca_ptr;
-+      dat_status = dat_registry_add_provider(provider, provider_info);
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dat_registry_add_provider failed: %x\n",
-+                           dat_status);
-+      }
-+
-+      bail:
-+      if (NULL != data) {
-+              dapl_os_free(data, len + 1);
-+      }
-+
-+      if (DAT_SUCCESS != dat_status) {
-+              if (NULL != provider) {
-+                      (void)dapl_provider_list_remove(provider_info->ia_name);
-+              }
-+
-+              if (NULL != hca_ptr) {
-+                      dapl_hca_free(hca_ptr);
-+              }
-+      }
-+}
-+
-+/*
-+ *
-+ * This function is called by the registry to de-initialize a provider
-+ *
-+ */
-+void DAT_API
-+DAT_PROVIDER_FINI_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info)
-+{
-+      DAT_PROVIDER *provider;
-+      DAT_RETURN dat_status;
-+
-+      dat_status =
-+          dapl_provider_list_search(provider_info->ia_name, &provider);
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dat_registry_add_provider failed: %x\n",
-+                           dat_status);
-+              return;
-+      }
-+
-+      dat_status = dat_registry_remove_provider(provider, provider_info);
-+      if (DAT_SUCCESS != dat_status) {
-+              dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-+                           "dat_registry_add_provider failed: %x\n",
-+                           dat_status);
-+      }
-+
-+      /*
-+       * free HCA memory
-+       */
-+      dapl_hca_free(provider->extension);
-+
-+      (void)dapl_provider_list_remove(provider_info->ia_name);
-+
-+#if defined(_WIN32) || defined(_WIN64)
-+      /* cleanup DAPL library - relocated here from OSD DLL context as the IBAL
-+       * calls hung in the DLL context?
-+       */
-+      dapl_fini();
-+#endif
-+}
-+
-+/*
-+ * Local variables:
-+ *  c-indent-level: 4
-+ *  c-basic-offset: 4
-+ *  tab-width: 8
-+ * End:
-+ */