]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
refresh
authorU-AMR\MSHEFTY <MSHEFTY@mshefty-MOBL2.amr.corp.intel.com>
Wed, 6 Jan 2010 20:49:19 +0000 (12:49 -0800)
committerU-AMR\MSHEFTY <MSHEFTY@mshefty-MOBL2.amr.corp.intel.com>
Wed, 6 Jan 2010 20:49:19 +0000 (12:49 -0800)
meta
patches/cm_poll
patches/refresh-temp [deleted file]

diff --git a/meta b/meta
index 7cafd7ff447dd108e22a754579bcba0bf1f15b66..9b85e57f503d1b051fbcfac1bcaa5e24b7bc5f82 100644 (file)
--- a/meta
+++ b/meta
@@ -1,11 +1,10 @@
 Version: 1
-Previous: a57a4f111d68a57cb753ef55bb6d82929ff71003
-Head: 610bb73b7fd4aaa6b0216b751ea4fff6b16489bc
+Previous: 63a394bd4e09ddb49cef8d26f2781b37613dab0c
+Head: 3065a5cc4992c1604b37316627a16b1c04869374
 Applied:
   rm-build: d6d2302f2d258fa2c07e55a2e124a9bdd75367a0
   cm_listen_handler: 56372fe5e423b7238a4db99258c1493748c0a582
-  cm_poll: cf3d8f575a7f2febaead9e8cbacbeb30f0ede7f5
-  refresh-temp: 610bb73b7fd4aaa6b0216b751ea4fff6b16489bc
+  cm_poll: 3065a5cc4992c1604b37316627a16b1c04869374
 Unapplied:
   old-bld-32: bd1bd1d366e3927b7646da33e243213a5d59c235
   old-apphang: 7a6f7ff02c6035e54fc262414eb9484ea98018b9
index 6848768eb753a707f76a6763c3032a6f13ffc5c1..8b342904dd029273715300d381fcc5d024f409fd 100644 (file)
@@ -1,5 +1,5 @@
 Bottom: fa748f1c52b43305bedd9af43719f0863bbecab5
-Top:    b937ed604e0f514a53056550ac39de031e204f3d
+Top:    02d34126680ab0fe5b80784d79d0d5bdbf9ff7bf
 Author: U-AMR\MSHEFTY <MSHEFTY@mshefty-MOBL2.amr.corp.intel.com>
 Date:   2010-01-06 10:08:50 -0800
 
@@ -22,10 +22,10 @@ Signed-off-by: Sean Hefty <sean.hefty@intel.com>
 ---
 
 diff --git a/trunk/core/al/kernel/al_cm.c b/trunk/core/al/kernel/al_cm.c
-index 177bb9e..10860c4 100644
+index 177bb9e..40eb65a 100644
 --- a/trunk/core/al/kernel/al_cm.c
 +++ b/trunk/core/al/kernel/al_cm.c
-@@ -99,36 +99,45 @@ cm_cep_handler(const ib_al_handle_t h_al, const net32_t cid)
+@@ -99,36 +99,44 @@ cm_cep_handler(const ib_al_handle_t h_al, const net32_t cid)
  static void\r
  cm_listen_handler(const ib_al_handle_t h_al, const net32_t cid)\r
  {\r
@@ -39,34 +39,43 @@ index 177bb9e..10860c4 100644
 +}\r
 +\r
 +static NTSTATUS\r
-+cm_get_reqeust(iba_cm_id *p_id, iba_cm_event *p_event)\r
++cm_get_request(iba_cm_id *p_listen_id, iba_cm_id **pp_id, iba_cm_event *p_event)\r
 +{\r
        void                            *context;\r
        net32_t                         new_cid;\r
        ib_mad_element_t        *mad;\r
-       iba_cm_id                       *id, *listen_id;\r
-       iba_cm_event            event;\r
--      NTSTATUS                        status;\r
+-      iba_cm_id                       *id, *listen_id;\r
+-      iba_cm_event            event;\r
 +      ib_api_status_t         ib_status;\r
+       NTSTATUS                        status;\r
  \r
 -      while (al_cep_poll(h_al, cid, &context, &new_cid, &mad) == IB_SUCCESS) {\r
 -\r
 -              listen_id = (iba_cm_id *) context;\r
--\r
++      status = al_cep_poll(gh_al, p_listen_id->cid, &context, &new_cid, &mad);\r
++      if (ib_status != IB_SUCCESS) {\r
++              return ib_to_ntstatus(ib_status);\r
++      }\r
\r
 -              id = cm_alloc_id(listen_id->callback, listen_id);\r
 -              if (id == NULL) {\r
 -                      kal_cep_destroy(h_al, new_cid, STATUS_NO_MORE_ENTRIES);\r
 -                      ib_put_mad(mad);\r
 -                      continue;\r
 -              }\r
-+      status = al_cep_poll(gh_al, p_id->cid, &context, &new_cid, &mad);\r
-+      if (ib_status != IB_SUCCESS) {\r
-+              return ib_to_ntstatus(ib_status);\r
++      *pp_id = cm_alloc_id(p_listen_id->callback, p_listen_id);\r
++      if (*pp_id == NULL) {\r
++              kal_cep_destroy(gh_al, new_cid, STATUS_NO_MORE_ENTRIES);\r
++              status = STATUS_NO_MEMORY;\r
++              goto out;\r
 +      }\r
  \r
 -              kal_cep_config(h_al, new_cid, cm_cep_handler, id, cm_destroy_handler);\r
 -              id->cid = new_cid;\r
-+      listen_id = (iba_cm_id *) context;\r
++      kal_cep_config(gh_al, new_cid, cm_cep_handler, *pp_id, cm_destroy_handler);\r
++      (*pp_id)->cid = new_cid;\r
++      kal_cep_format_event(gh_al, new_cid, mad, p_event);\r
++      status = STATUS_SUCCESS;\r
  \r
 -              kal_cep_format_event(h_al, id->cid, mad, &event);\r
 -              status = id->callback(id, &event);\r
@@ -75,35 +84,217 @@ index 177bb9e..10860c4 100644
 -                      kal_cep_destroy(h_al, id->cid, status);\r
 -                      cm_free_id(id);\r
 -              }\r
-+      id = cm_alloc_id(listen_id->callback, listen_id);\r
-+      if (id == NULL) {\r
-+              kal_cep_destroy(gh_al, new_cid, STATUS_NO_MORE_ENTRIES);\r
-               ib_put_mad(mad);\r
-+              return STATUS_NO_MEMORY;\r
+-              ib_put_mad(mad);\r
+-      }\r
++out:\r
++      ib_put_mad(mad);\r
++      return status;\r
+ }\r
\r
+ static NTSTATUS\r
+@@ -367,6 +375,7 @@ void cm_get_interface(iba_cm_interface *p_ifc)
+       p_ifc->create_id = cm_create_id;\r
+       p_ifc->destroy_id = cm_destroy_id;\r
+       p_ifc->listen = cm_listen;\r
++      p_ifc->get_reqeust = cm_get_request;\r
+       p_ifc->send_req = cm_send_req;\r
+       p_ifc->send_rep = cm_send_rep;\r
+       p_ifc->send_rtu = cm_send_rtu;\r
+diff --git a/trunk/core/winverbs/kernel/wv_ep.c b/trunk/core/winverbs/kernel/wv_ep.c
+index 3d5c6ce..47baba1 100644
+--- a/trunk/core/winverbs/kernel/wv_ep.c
++++ b/trunk/core/winverbs/kernel/wv_ep.c
+@@ -1110,24 +1110,30 @@ complete:
+       WdfRequestComplete(Request, status);\r
+ }\r
\r
+-static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)\r
++static void WvEpGetIbRequest(WV_ENDPOINT *pListen)\r
+ {\r
+-      WV_ENDPOINT             *listen, *ep;\r
++      WV_ENDPOINT             *ep;\r
+       WDFREQUEST              request;\r
+       NTSTATUS                status;\r
+       IB_CMA_HEADER   *hdr;\r
++      iba_cm_id               *id;\r
++      iba_cm_event    *event;\r
\r
+-      listen = ((iba_cm_id *) pId->context)->context;\r
++      WdfObjectAcquireLock(pListen->Queue);\r
++      status = WdfIoQueueRetrieveNextRequest(pListen->Queue, &request);\r
++      if (!NT_SUCCESS(status)) {\r
++              goto release;\r
++      }\r
\r
+-      WdfObjectAcquireLock(listen->Queue);\r
+-      status = WdfIoQueueRetrieveNextRequest(listen->Queue, &request);\r
++      status = IbCmInterface.CM.get_request(pListen->pIbCmId, &id, &event);\r
+       if (!NT_SUCCESS(status)) {\r
++              WdfIoRequestRequeue(request);\r
+               goto release;\r
        }\r
\r
+-      ASSERT(!IsListEmpty(&listen->Entry));\r
+-      ep = CONTAINING_RECORD(RemoveHeadList(&listen->Entry), WV_ENDPOINT, Entry);\r
+-      ep->pIbCmId = pId;\r
++      ASSERT(!IsListEmpty(&pListen->Entry));\r
++      ep = CONTAINING_RECORD(RemoveHeadList(&pListen->Entry), WV_ENDPOINT, Entry);\r
++      ep->pIbCmId = id;\r
+       pId->callback = WvEpIbCmHandler;\r
+       pId->context = ep;\r
\r
+@@ -1162,10 +1168,68 @@ static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)
\r
+       WdfRequestComplete(request, STATUS_SUCCESS);\r
+ release:\r
+-      WdfObjectReleaseLock(listen->Queue);\r
++      WdfObjectReleaseLock(pListen->Queue);\r
+       return status;\r
+ }\r
\r
++static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)\r
++{\r
++      WV_ENDPOINT             *listen;\r
++//, *ep;\r
++//    WDFREQUEST              request;\r
++//    NTSTATUS                status;\r
++//    IB_CMA_HEADER   *hdr;\r
 +\r
-+      kal_cep_config(gh_al, new_cid, cm_cep_handler, id, cm_destroy_handler);\r
-+      id->cid = new_cid;\r
-+\r
-+      kal_cep_format_event(gh_al, id->cid, mad, &event);\r
-+      ib_put_mad(mad);\r
++      listen = pId->context; //((iba_cm_id *) pId->context)->context;\r
++      WvEpGetIbRequest(listen);\r
 +      return STATUS_SUCCESS;\r
++//    WdfObjectAcquireLock(listen->Queue);\r
++//    status = WdfIoQueueRetrieveNextRequest(listen->Queue, &request);\r
++//    if (!NT_SUCCESS(status)) {\r
++//            goto release;\r
++//    }\r
++//\r
++//    ASSERT(!IsListEmpty(&listen->Entry));\r
++//    ep = CONTAINING_RECORD(RemoveHeadList(&listen->Entry), WV_ENDPOINT, Entry);\r
++//    ep->pIbCmId = pId;\r
++//    pId->callback = WvEpIbCmHandler;\r
++//    pId->context = ep;\r
++//\r
++//    hdr = pEvent->data.req.req.p_pdata;\r
++//    if ((hdr->IpVersion >> 4) == 4) {\r
++//            ep->Attributes.LocalAddress.SockAddr.In.SinFamily = WV_AF_INET;\r
++//            ep->Attributes.LocalAddress.SockAddr.In.SinAddr = hdr->DstAddress.Ip4.Address;\r
++//            ep->Attributes.PeerAddress.SockAddr.In.SinFamily = WV_AF_INET;\r
++//            ep->Attributes.PeerAddress.SockAddr.In.SinAddr = hdr->SrcAddress.Ip4.Address;\r
++//    } else {\r
++//            ep->Attributes.LocalAddress.SockAddr.In6.Sin6Family = WV_AF_INET6; \r
++//            RtlCopyMemory(ep->Attributes.LocalAddress.SockAddr.In6.Sin6Addr,\r
++//                                      hdr->DstAddress.Ip6Address, 16);\r
++//            ep->Attributes.PeerAddress.SockAddr.In6.Sin6Family = WV_AF_INET6;\r
++//            RtlCopyMemory(ep->Attributes.PeerAddress.SockAddr.In6.Sin6Addr,\r
++//                                      hdr->SrcAddress.Ip6Address, 16);\r
++//    }\r
++//    ep->Attributes.Device.DeviceGuid = pEvent->data.req.local_ca_guid;\r
++//    ep->Attributes.Device.Pkey = pEvent->data.req.req.p_primary_path->pkey;\r
++//    ep->Attributes.Device.PortNumber = pEvent->data.req.port_num;\r
++//    ep->Attributes.Param.Connect.ResponderResources = pEvent->data.req.req.resp_res;\r
++//    ep->Attributes.Param.Connect.InitiatorDepth = pEvent->data.req.req.init_depth;\r
++//    ep->Attributes.Param.Connect.RetryCount = pEvent->data.req.req.retry_cnt;\r
++//    ep->Attributes.Param.Connect.RnrRetryCount = pEvent->data.req.req.rnr_retry_cnt;\r
++//    ep->Attributes.Param.Connect.DataLength = sizeof(ep->Attributes.Param.Connect.Data);\r
++//    RtlCopyMemory(ep->Attributes.Param.Connect.Data, hdr + 1,\r
++//                              sizeof(ep->Attributes.Param.Connect.Data));\r
++//    ep->Route = *pEvent->data.req.req.p_primary_path;\r
++//\r
++//    ep->State = WvEpPassiveConnect;\r
++//    WvEpPut(ep);\r
++//\r
++//    WdfRequestComplete(request, STATUS_SUCCESS);\r
++//release:\r
++//    WdfObjectReleaseLock(listen->Queue);\r
++//    return status;\r
++}\r
++\r
+ void WvEpListen(WV_PROVIDER *pProvider, WDFREQUEST Request)\r
+ {\r
+       WV_ENDPOINT                     *ep;\r
+@@ -1235,24 +1299,24 @@ void WvEpGetRequest(WV_PROVIDER *pProvider, WDFREQUEST Request)
+       status = WdfRequestRetrieveInputBuffer(Request, sizeof(WV_IO_EP_GET_REQUEST),\r
+                                                                                  &req, NULL);\r
+       if (!NT_SUCCESS(status)) {\r
+-              goto complete;\r
++              goto err1;\r
+       }\r
\r
+       listen = WvEpAcquire(pProvider, req->Id);\r
+       if (listen == NULL) {\r
+               status = STATUS_NOT_FOUND;\r
+-              goto complete;\r
++              goto err1;\r
+       }\r
\r
+       if (listen->State != WvEpListening) {\r
+               status = STATUS_NOT_SUPPORTED;\r
+-              goto release1;\r
++              goto err2;\r
+       }\r
\r
+       ep = WvEpAcquire(pProvider, req->EpId);\r
+       if (ep == NULL) {\r
+               status = STATUS_NOT_FOUND;\r
+-              goto release1;\r
++              goto err2;\r
+       }\r
\r
+       WdfObjectAcquireLock(ep->Queue);\r
+@@ -1262,9 +1326,8 @@ void WvEpGetRequest(WV_PROVIDER *pProvider, WDFREQUEST Request)
+               status = STATUS_CONNECTION_IN_USE;\r
+       }\r
+       WdfObjectReleaseLock(ep->Queue);\r
+-\r
+       if (!NT_SUCCESS(status)) {\r
+-              goto release2;\r
++              goto err3;\r
+       }\r
\r
+       WdfObjectAcquireLock(listen->Queue);\r
+@@ -1274,15 +1337,21 @@ void WvEpGetRequest(WV_PROVIDER *pProvider, WDFREQUEST Request)
+               WvEpGet(ep);\r
+       }\r
+       WdfObjectReleaseLock(listen->Queue);\r
++      if (!NT_SUCCESS(status)) {\r
++              goto err3;\r
++      }\r
\r
+-release2:\r
+       WvEpRelease(ep);\r
+-release1:\r
++      WvEpGetIbRequest(listen);\r
+       WvEpRelease(listen);\r
+-complete:\r
+-      if (!NT_SUCCESS(status)) {\r
+-              WdfRequestComplete(Request, status);\r
+-      }\r
++      return;\r
++\r
++err3:\r
++      WvEpRelease(ep);\r
++err2:\r
++      WvEpRelease(listen);\r
++err1:\r
++      WdfRequestComplete(Request, status);\r
  }\r
  \r
- static NTSTATUS\r
+ void WvEpLookup(WV_PROVIDER *pProvider, WDFREQUEST Request)\r
 diff --git a/trunk/inc/kernel/iba/ib_cm_ifc.h b/trunk/inc/kernel/iba/ib_cm_ifc.h
-index 0949482..07626e5 100644
+index 0949482..5cc2d07 100644
 --- a/trunk/inc/kernel/iba/ib_cm_ifc.h
 +++ b/trunk/inc/kernel/iba/ib_cm_ifc.h
-@@ -239,6 +239,7 @@ typedef struct _iba_cm_interface
+@@ -239,6 +239,8 @@ typedef struct _iba_cm_interface
  \r
        NTSTATUS                (*listen)(iba_cm_id *p_id, net64_t service_id, void *p_compare_buf,\r
                                                          uint8_t compare_len, uint8_t compare_offset);\r
-+      NTSTATUS                (*get_reqeust)(iba_cm_id *p_id, iba_cm_event *p_event);\r
++      NTSTATUS                (*get_request)(iba_cm_id *p_listen_id, iba_cm_id **pp_id,\r
++                                                                 iba_cm_event *p_event);\r
  \r
        NTSTATUS                (*send_req)(iba_cm_id *p_id, iba_cm_req *p_req);\r
        NTSTATUS                (*send_rep)(iba_cm_id *p_id, iba_cm_rep *p_rep);\r
-@@ -282,9 +283,9 @@ static inline UINT8 IbaCmVersionMinor(USHORT Version)
+@@ -282,9 +284,9 @@ static inline UINT8 IbaCmVersionMinor(USHORT Version)
        return (UINT8) Version;\r
  }\r
  \r
diff --git a/patches/refresh-temp b/patches/refresh-temp
deleted file mode 100644 (file)
index d63314c..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-Bottom: b937ed604e0f514a53056550ac39de031e204f3d
-Top:    02d34126680ab0fe5b80784d79d0d5bdbf9ff7bf
-Author: U-AMR\MSHEFTY <MSHEFTY@mshefty-MOBL2.amr.corp.intel.com>
-Date:   2010-01-06 12:49:09 -0800
-
-Refresh of cm_poll
-
----
-
-diff --git a/trunk/core/al/kernel/al_cm.c b/trunk/core/al/kernel/al_cm.c
-index 10860c4..40eb65a 100644
---- a/trunk/core/al/kernel/al_cm.c
-+++ b/trunk/core/al/kernel/al_cm.c
-@@ -109,35 +109,34 @@ cm_listen_handler(const ib_al_handle_t h_al, const net32_t cid)
- }\r
\r
- static NTSTATUS\r
--cm_get_reqeust(iba_cm_id *p_id, iba_cm_event *p_event)\r
-+cm_get_request(iba_cm_id *p_listen_id, iba_cm_id **pp_id, iba_cm_event *p_event)\r
- {\r
-       void                            *context;\r
-       net32_t                         new_cid;\r
-       ib_mad_element_t        *mad;\r
--      iba_cm_id                       *id, *listen_id;\r
--      iba_cm_event            event;\r
-       ib_api_status_t         ib_status;\r
-+      NTSTATUS                        status;\r
\r
--      status = al_cep_poll(gh_al, p_id->cid, &context, &new_cid, &mad);\r
-+      status = al_cep_poll(gh_al, p_listen_id->cid, &context, &new_cid, &mad);\r
-       if (ib_status != IB_SUCCESS) {\r
-               return ib_to_ntstatus(ib_status);\r
-       }\r
\r
--      listen_id = (iba_cm_id *) context;\r
--\r
--      id = cm_alloc_id(listen_id->callback, listen_id);\r
--      if (id == NULL) {\r
-+      *pp_id = cm_alloc_id(p_listen_id->callback, p_listen_id);\r
-+      if (*pp_id == NULL) {\r
-               kal_cep_destroy(gh_al, new_cid, STATUS_NO_MORE_ENTRIES);\r
--              ib_put_mad(mad);\r
--              return STATUS_NO_MEMORY;\r
-+              status = STATUS_NO_MEMORY;\r
-+              goto out;\r
-       }\r
\r
--      kal_cep_config(gh_al, new_cid, cm_cep_handler, id, cm_destroy_handler);\r
--      id->cid = new_cid;\r
-+      kal_cep_config(gh_al, new_cid, cm_cep_handler, *pp_id, cm_destroy_handler);\r
-+      (*pp_id)->cid = new_cid;\r
-+      kal_cep_format_event(gh_al, new_cid, mad, p_event);\r
-+      status = STATUS_SUCCESS;\r
\r
--      kal_cep_format_event(gh_al, id->cid, mad, &event);\r
-+out:\r
-       ib_put_mad(mad);\r
--      return STATUS_SUCCESS;\r
-+      return status;\r
- }\r
\r
- static NTSTATUS\r
-@@ -376,6 +375,7 @@ void cm_get_interface(iba_cm_interface *p_ifc)
-       p_ifc->create_id = cm_create_id;\r
-       p_ifc->destroy_id = cm_destroy_id;\r
-       p_ifc->listen = cm_listen;\r
-+      p_ifc->get_reqeust = cm_get_request;\r
-       p_ifc->send_req = cm_send_req;\r
-       p_ifc->send_rep = cm_send_rep;\r
-       p_ifc->send_rtu = cm_send_rtu;\r
-diff --git a/trunk/core/winverbs/kernel/wv_ep.c b/trunk/core/winverbs/kernel/wv_ep.c
-index 3d5c6ce..47baba1 100644
---- a/trunk/core/winverbs/kernel/wv_ep.c
-+++ b/trunk/core/winverbs/kernel/wv_ep.c
-@@ -1110,24 +1110,30 @@ complete:
-       WdfRequestComplete(Request, status);\r
- }\r
\r
--static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)\r
-+static void WvEpGetIbRequest(WV_ENDPOINT *pListen)\r
- {\r
--      WV_ENDPOINT             *listen, *ep;\r
-+      WV_ENDPOINT             *ep;\r
-       WDFREQUEST              request;\r
-       NTSTATUS                status;\r
-       IB_CMA_HEADER   *hdr;\r
-+      iba_cm_id               *id;\r
-+      iba_cm_event    *event;\r
\r
--      listen = ((iba_cm_id *) pId->context)->context;\r
-+      WdfObjectAcquireLock(pListen->Queue);\r
-+      status = WdfIoQueueRetrieveNextRequest(pListen->Queue, &request);\r
-+      if (!NT_SUCCESS(status)) {\r
-+              goto release;\r
-+      }\r
\r
--      WdfObjectAcquireLock(listen->Queue);\r
--      status = WdfIoQueueRetrieveNextRequest(listen->Queue, &request);\r
-+      status = IbCmInterface.CM.get_request(pListen->pIbCmId, &id, &event);\r
-       if (!NT_SUCCESS(status)) {\r
-+              WdfIoRequestRequeue(request);\r
-               goto release;\r
-       }\r
\r
--      ASSERT(!IsListEmpty(&listen->Entry));\r
--      ep = CONTAINING_RECORD(RemoveHeadList(&listen->Entry), WV_ENDPOINT, Entry);\r
--      ep->pIbCmId = pId;\r
-+      ASSERT(!IsListEmpty(&pListen->Entry));\r
-+      ep = CONTAINING_RECORD(RemoveHeadList(&pListen->Entry), WV_ENDPOINT, Entry);\r
-+      ep->pIbCmId = id;\r
-       pId->callback = WvEpIbCmHandler;\r
-       pId->context = ep;\r
\r
-@@ -1162,10 +1168,68 @@ static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)
\r
-       WdfRequestComplete(request, STATUS_SUCCESS);\r
- release:\r
--      WdfObjectReleaseLock(listen->Queue);\r
-+      WdfObjectReleaseLock(pListen->Queue);\r
-       return status;\r
- }\r
\r
-+static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)\r
-+{\r
-+      WV_ENDPOINT             *listen;\r
-+//, *ep;\r
-+//    WDFREQUEST              request;\r
-+//    NTSTATUS                status;\r
-+//    IB_CMA_HEADER   *hdr;\r
-+\r
-+      listen = pId->context; //((iba_cm_id *) pId->context)->context;\r
-+      WvEpGetIbRequest(listen);\r
-+      return STATUS_SUCCESS;\r
-+//    WdfObjectAcquireLock(listen->Queue);\r
-+//    status = WdfIoQueueRetrieveNextRequest(listen->Queue, &request);\r
-+//    if (!NT_SUCCESS(status)) {\r
-+//            goto release;\r
-+//    }\r
-+//\r
-+//    ASSERT(!IsListEmpty(&listen->Entry));\r
-+//    ep = CONTAINING_RECORD(RemoveHeadList(&listen->Entry), WV_ENDPOINT, Entry);\r
-+//    ep->pIbCmId = pId;\r
-+//    pId->callback = WvEpIbCmHandler;\r
-+//    pId->context = ep;\r
-+//\r
-+//    hdr = pEvent->data.req.req.p_pdata;\r
-+//    if ((hdr->IpVersion >> 4) == 4) {\r
-+//            ep->Attributes.LocalAddress.SockAddr.In.SinFamily = WV_AF_INET;\r
-+//            ep->Attributes.LocalAddress.SockAddr.In.SinAddr = hdr->DstAddress.Ip4.Address;\r
-+//            ep->Attributes.PeerAddress.SockAddr.In.SinFamily = WV_AF_INET;\r
-+//            ep->Attributes.PeerAddress.SockAddr.In.SinAddr = hdr->SrcAddress.Ip4.Address;\r
-+//    } else {\r
-+//            ep->Attributes.LocalAddress.SockAddr.In6.Sin6Family = WV_AF_INET6; \r
-+//            RtlCopyMemory(ep->Attributes.LocalAddress.SockAddr.In6.Sin6Addr,\r
-+//                                      hdr->DstAddress.Ip6Address, 16);\r
-+//            ep->Attributes.PeerAddress.SockAddr.In6.Sin6Family = WV_AF_INET6;\r
-+//            RtlCopyMemory(ep->Attributes.PeerAddress.SockAddr.In6.Sin6Addr,\r
-+//                                      hdr->SrcAddress.Ip6Address, 16);\r
-+//    }\r
-+//    ep->Attributes.Device.DeviceGuid = pEvent->data.req.local_ca_guid;\r
-+//    ep->Attributes.Device.Pkey = pEvent->data.req.req.p_primary_path->pkey;\r
-+//    ep->Attributes.Device.PortNumber = pEvent->data.req.port_num;\r
-+//    ep->Attributes.Param.Connect.ResponderResources = pEvent->data.req.req.resp_res;\r
-+//    ep->Attributes.Param.Connect.InitiatorDepth = pEvent->data.req.req.init_depth;\r
-+//    ep->Attributes.Param.Connect.RetryCount = pEvent->data.req.req.retry_cnt;\r
-+//    ep->Attributes.Param.Connect.RnrRetryCount = pEvent->data.req.req.rnr_retry_cnt;\r
-+//    ep->Attributes.Param.Connect.DataLength = sizeof(ep->Attributes.Param.Connect.Data);\r
-+//    RtlCopyMemory(ep->Attributes.Param.Connect.Data, hdr + 1,\r
-+//                              sizeof(ep->Attributes.Param.Connect.Data));\r
-+//    ep->Route = *pEvent->data.req.req.p_primary_path;\r
-+//\r
-+//    ep->State = WvEpPassiveConnect;\r
-+//    WvEpPut(ep);\r
-+//\r
-+//    WdfRequestComplete(request, STATUS_SUCCESS);\r
-+//release:\r
-+//    WdfObjectReleaseLock(listen->Queue);\r
-+//    return status;\r
-+}\r
-+\r
- void WvEpListen(WV_PROVIDER *pProvider, WDFREQUEST Request)\r
- {\r
-       WV_ENDPOINT                     *ep;\r
-@@ -1235,24 +1299,24 @@ void WvEpGetRequest(WV_PROVIDER *pProvider, WDFREQUEST Request)
-       status = WdfRequestRetrieveInputBuffer(Request, sizeof(WV_IO_EP_GET_REQUEST),\r
-                                                                                  &req, NULL);\r
-       if (!NT_SUCCESS(status)) {\r
--              goto complete;\r
-+              goto err1;\r
-       }\r
\r
-       listen = WvEpAcquire(pProvider, req->Id);\r
-       if (listen == NULL) {\r
-               status = STATUS_NOT_FOUND;\r
--              goto complete;\r
-+              goto err1;\r
-       }\r
\r
-       if (listen->State != WvEpListening) {\r
-               status = STATUS_NOT_SUPPORTED;\r
--              goto release1;\r
-+              goto err2;\r
-       }\r
\r
-       ep = WvEpAcquire(pProvider, req->EpId);\r
-       if (ep == NULL) {\r
-               status = STATUS_NOT_FOUND;\r
--              goto release1;\r
-+              goto err2;\r
-       }\r
\r
-       WdfObjectAcquireLock(ep->Queue);\r
-@@ -1262,9 +1326,8 @@ void WvEpGetRequest(WV_PROVIDER *pProvider, WDFREQUEST Request)
-               status = STATUS_CONNECTION_IN_USE;\r
-       }\r
-       WdfObjectReleaseLock(ep->Queue);\r
--\r
-       if (!NT_SUCCESS(status)) {\r
--              goto release2;\r
-+              goto err3;\r
-       }\r
\r
-       WdfObjectAcquireLock(listen->Queue);\r
-@@ -1274,15 +1337,21 @@ void WvEpGetRequest(WV_PROVIDER *pProvider, WDFREQUEST Request)
-               WvEpGet(ep);\r
-       }\r
-       WdfObjectReleaseLock(listen->Queue);\r
-+      if (!NT_SUCCESS(status)) {\r
-+              goto err3;\r
-+      }\r
\r
--release2:\r
-       WvEpRelease(ep);\r
--release1:\r
-+      WvEpGetIbRequest(listen);\r
-       WvEpRelease(listen);\r
--complete:\r
--      if (!NT_SUCCESS(status)) {\r
--              WdfRequestComplete(Request, status);\r
--      }\r
-+      return;\r
-+\r
-+err3:\r
-+      WvEpRelease(ep);\r
-+err2:\r
-+      WvEpRelease(listen);\r
-+err1:\r
-+      WdfRequestComplete(Request, status);\r
- }\r
\r
- void WvEpLookup(WV_PROVIDER *pProvider, WDFREQUEST Request)\r
-diff --git a/trunk/inc/kernel/iba/ib_cm_ifc.h b/trunk/inc/kernel/iba/ib_cm_ifc.h
-index 07626e5..5cc2d07 100644
---- a/trunk/inc/kernel/iba/ib_cm_ifc.h
-+++ b/trunk/inc/kernel/iba/ib_cm_ifc.h
-@@ -239,7 +239,8 @@ typedef struct _iba_cm_interface
\r
-       NTSTATUS                (*listen)(iba_cm_id *p_id, net64_t service_id, void *p_compare_buf,\r
-                                                         uint8_t compare_len, uint8_t compare_offset);\r
--      NTSTATUS                (*get_reqeust)(iba_cm_id *p_id, iba_cm_event *p_event);\r
-+      NTSTATUS                (*get_request)(iba_cm_id *p_listen_id, iba_cm_id **pp_id,\r
-+                                                                 iba_cm_event *p_event);\r
\r
-       NTSTATUS                (*send_req)(iba_cm_id *p_id, iba_cm_req *p_req);\r
-       NTSTATUS                (*send_rep)(iba_cm_id *p_id, iba_cm_rep *p_rep);