From f710aa8c0a61bf645448735ef051dbf36f446849 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Fri, 2 Apr 2010 23:32:04 +0000 Subject: [PATCH] winverbs/nd: allow retrying connect The ND documentation specifies that ND:Connect() should be retry-able. Add this support to the winverbs ND provider. Signed-off-by: Sean Hefty git-svn-id: svn://openib.tc.cornell.edu/gen1@2762 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/netdirect/user/nd_connect.cpp | 22 ++++++++++++++++++++-- trunk/ulp/netdirect/user/nd_connect.h | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/trunk/ulp/netdirect/user/nd_connect.cpp b/trunk/ulp/netdirect/user/nd_connect.cpp index 81d5f7bd..3042530d 100644 --- a/trunk/ulp/netdirect/user/nd_connect.cpp +++ b/trunk/ulp/netdirect/user/nd_connect.cpp @@ -37,15 +37,26 @@ CNDConnector::CNDConnector(CNDAdapter *pAdapter) pAdapter->AddRef(); m_pAdapter = pAdapter; m_pWvConnEp = NULL; + m_Connects = 0; } STDMETHODIMP CNDConnector:: Init(void) { + IWVConnectEndpoint *ep; HRESULT hr; - hr = m_pAdapter->m_pWvProvider->CreateConnectEndpoint(&m_pWvConnEp); - return NDConvertWVStatus(hr); + hr = m_pAdapter->m_pWvProvider->CreateConnectEndpoint(&ep); + if (FAILED(hr)) { + return NDConvertWVStatus(hr); + } + + if (m_pWvConnEp != NULL) { + m_pWvConnEp->Release(); + } + + m_pWvConnEp = ep; + return ND_SUCCESS; } CNDConnector::~CNDConnector() @@ -132,6 +143,13 @@ Connect(INDEndpoint* pEndpoint, IBAT_PATH_BLOB path; HRESULT hr; + if (m_Connects++ > 0) { + hr = Init(); + if (FAILED(hr)) { + goto out; + } + } + RtlCopyMemory(&addr, &m_pAdapter->m_Address, AddressLength); if (addr.Sa.sa_family == AF_INET) { addr.Sin.sin_port = LocalPort; diff --git a/trunk/ulp/netdirect/user/nd_connect.h b/trunk/ulp/netdirect/user/nd_connect.h index 2da2f222..688fedc7 100644 --- a/trunk/ulp/netdirect/user/nd_connect.h +++ b/trunk/ulp/netdirect/user/nd_connect.h @@ -114,6 +114,7 @@ public: protected: STDMETHODIMP Init(); + int m_Connects; }; #endif // _ND_CONNECTOR_H_ -- 2.46.0