From 8fa8a358b1dc122fd9ea02a12adfa68d07d135ba Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Mon, 26 Jul 2010 16:51:57 -0700 Subject: [PATCH] nd: update MR/MW APIs to match latest spec This includes deriving MR from NDOverlapped and supporting CancelOverlappedRequests(). We need to track overlapped registration requests and cancel them independently from the winverbs protection domain. Signed-off-by: Sean Hefty --- trunk/ulp/netdirect2/user/nd_mw.cpp | 29 ++++++++++++++++++++++++++++- trunk/ulp/netdirect2/user/nd_mw.h | 5 +++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/trunk/ulp/netdirect2/user/nd_mw.cpp b/trunk/ulp/netdirect2/user/nd_mw.cpp index be5446d5..f6a85bf7 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() @@ -67,6 +68,31 @@ Release(void) return CNDBase::Release(); } +STDMETHODIMP CNDMemoryRegion:: +CancelOverlappedRequests(void) +{ + if (m_pOverlapped != NULL) { + CancelIoEx(m_pAdapter->GetFileHandle(), m_pOverlapped); + } + + return ND_SUCCESS; +} + +STDMETHODIMP CNDMemoryRegion:: +GetOverlappedResult(OVERLAPPED *pOverlapped, BOOL bWait) +{ + 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) { DWORD opts = 0; @@ -86,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); @@ -96,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 47c18b2d..eb0bbc91 100644 --- a/trunk/ulp/netdirect2/user/nd_mw.h +++ b/trunk/ulp/netdirect2/user/nd_mw.h @@ -45,6 +45,10 @@ public: STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); + // INDOverlapped methods + STDMETHODIMP CancelOverlappedRequests(); + STDMETHODIMP GetOverlappedResult(OVERLAPPED *pOverlapped, BOOL bWait); + // INDMemoryRegion methods STDMETHODIMP Register(const VOID* pBuffer, SIZE_T cbBuffer, DWORD flags, OVERLAPPED* pOverlapped); @@ -79,6 +83,7 @@ public: protected: CNDAdapter *m_pAdapter; + OVERLAPPED *m_pOverlapped; }; -- 2.46.0