Track overlapped registration requests and cancel them independently from
the winverbs protection domain.

Signed-off-by: Sean Hefty <[email protected]>
---
 trunk/ulp/netdirect2/user/nd_mw.cpp |   21 ++++++++++++++++++---
 trunk/ulp/netdirect2/user/nd_mw.h   |    1 +
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/trunk/ulp/netdirect2/user/nd_mw.cpp 
b/trunk/ulp/netdirect2/user/nd_mw.cpp
index 89ed1a7..f6a85bf 100644
--- a/trunk/ulp/netdirect2/user/nd_mw.cpp
+++ b/trunk/ulp/netdirect2/user/nd_mw.cpp
@@ -35,6 +35,7 @@ CNDMemoryRegion::CNDMemoryRegion(CNDAdapter *pAdapter)
        pAdapter->AddRef();
        m_pAdapter = pAdapter;
        RtlZeroMemory(&m_Keys, sizeof(m_Keys));
+       m_pOverlapped = NULL;
 }
 
 CNDMemoryRegion::~CNDMemoryRegion()
@@ -70,13 +71,26 @@ Release(void)
 STDMETHODIMP CNDMemoryRegion::
 CancelOverlappedRequests(void)
 {
-       return ND_NOT_SUPPORTED;
+       if (m_pOverlapped != NULL) {
+               CancelIoEx(m_pAdapter->GetFileHandle(), m_pOverlapped);
+       }
+
+       return ND_SUCCESS;
 }
 
 STDMETHODIMP CNDMemoryRegion::
 GetOverlappedResult(OVERLAPPED *pOverlapped, BOOL bWait)
 {
-       return ND_NOT_SUPPORTED;
+       DWORD bytes;
+       HRESULT hr;
+
+       hr = NDConvertWVStatus(m_pAdapter->m_pWvPd->
+                                                  
GetOverlappedResult(pOverlapped, &bytes, bWait));
+       if (hr != ND_PENDING) {
+               m_pOverlapped = NULL;
+       }
+
+       return hr;
 }
 
 DWORD ConvertAccessFlags(DWORD Flags)
@@ -98,6 +112,7 @@ Register(const VOID* pBuffer, SIZE_T cbBuffer, DWORD flags, 
OVERLAPPED* pOverlap
 {
        HRESULT hr;
 
+       m_pOverlapped = pOverlapped;
        hr = m_pAdapter->m_pWvPd->RegisterMemory(pBuffer, cbBuffer, 
ConvertAccessFlags(flags),
                                                                                
         pOverlapped, &m_Keys);
        return NDConvertWVStatus(hr);
@@ -108,7 +123,7 @@ Deregister(OVERLAPPED* pOverlapped)
 {
        HRESULT hr;
 
-       //??? if the lkey is not unique, we need to change this
+       m_pOverlapped = pOverlapped;
        hr = m_pAdapter->m_pWvPd->DeregisterMemory(m_Keys.Lkey, pOverlapped);
        return NDConvertWVStatus(hr);
 }
diff --git a/trunk/ulp/netdirect2/user/nd_mw.h 
b/trunk/ulp/netdirect2/user/nd_mw.h
index f4b9fb3..eb0bbc9 100644
--- a/trunk/ulp/netdirect2/user/nd_mw.h
+++ b/trunk/ulp/netdirect2/user/nd_mw.h
@@ -83,6 +83,7 @@ public:
 
 protected:
        CNDAdapter                      *m_pAdapter;
+       OVERLAPPED                      *m_pOverlapped;
 };
 
 

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to