!endif\r
\r
DLLENTRY = DllMain\r
-USE_NTDLL = 1\r
+USE_MSVCRT = 1\r
\r
SOURCES = \\r
winverbs.rc \\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
- $(SDK_LIB_PATH)\uuid.lib\r
+ $(SDK_LIB_PATH)\uuid.lib \\r
+ $(SDK_LIB_PATH)\ws2_32.lib\r
DWORD bytes;\r
HRESULT hr;\r
\r
- if (m_Id != NULL) {\r
+ if (m_Id != 0) {\r
m_pVerbs->pre_destroy_cq(m_hVerbsCq);\r
hr = WvDeviceIoControl(m_hFile, WV_IOCTL_CQ_DESTROY, &m_Id, sizeof m_Id,\r
NULL, 0, &bytes, NULL) ?\r
}\r
\r
STDMETHODIMP CWVDevice::\r
-FindGidIndex(UINT8 PortNumber, WV_GID *pGid, UINT16 *pIndex)\r
+FindGid(UINT8 PortNumber, WV_GID *pGid, DWORD *pIndex)\r
{\r
WV_GID gid;\r
DWORD index;\r
for (index = 0; true; index++) {\r
hr = QueryGid(PortNumber, index, &gid);\r
if (FAILED(hr)) {\r
- break;\r
+ return hr;\r
}\r
\r
- if (RtlCompareMemory(pGid, &gid, sizeof(gid)) == sizeof(gid)) {\r
+ if (RtlEqualMemory(pGid, &gid, sizeof(gid))) {\r
*pIndex = (UINT16) index;\r
- break;\r
+ return WV_SUCCESS;\r
}\r
}\r
\r
- return hr;\r
+ return WV_INVALID_ADDRESS;\r
}\r
\r
STDMETHODIMP CWVDevice::\r
return hr;\r
}\r
\r
+STDMETHODIMP CWVDevice::\r
+FindPkey(UINT8 PortNumber, NET16 Pkey, DWORD *pIndex)\r
+{\r
+ NET16 key;\r
+ DWORD index;\r
+ HRESULT hr;\r
+\r
+ for (index = 0; true; index++) {\r
+ hr = QueryPkey(PortNumber, index, &key);\r
+ if (FAILED(hr)) {\r
+ return hr;\r
+ }\r
+\r
+ if (Pkey == key) {\r
+ *pIndex = (UINT16) index;\r
+ return WV_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return WV_INVALID_ADDRESS;\r
+}\r
+\r
STDMETHODIMP CWVDevice::\r
CreateCompletionQueue(SIZE_T *pEntries, IWVCompletionQueue** ppCq)\r
{\r
STDMETHODIMP Query(WV_DEVICE_ATTRIBUTES* pAttributes);\r
STDMETHODIMP QueryPort(UINT8 PortNumber, WV_PORT_ATTRIBUTES* pAttributes);\r
STDMETHODIMP QueryGid(UINT8 PortNumber, DWORD Index, WV_GID* pGid);\r
+ STDMETHODIMP FindGid(UINT8 PortNumber, WV_GID *pGid, DWORD *pIndex);\r
STDMETHODIMP QueryPkey(UINT8 PortNumber, DWORD Index, NET16* pPkey);\r
+ STDMETHODIMP FindPkey(UINT8 PortNumber, NET16 Pkey, DWORD *pIndex);\r
STDMETHODIMP CreateCompletionQueue(SIZE_T *pEntries, IWVCompletionQueue** ppCq);\r
STDMETHODIMP AllocateProtectionDomain(IWVProtectionDomain** ppPd);\r
STDMETHODIMP Notify(UINT8 PortNumber, OVERLAPPED* pOverlapped, DWORD* pFlags);\r
*ppDevice = NULL;\r
return hr;\r
}\r
- STDMETHODIMP FindGidIndex(UINT8 PortNumber, WV_GID *pGid, UINT16 *pIndex);\r
\r
CWVProvider *m_pProvider;\r
uvp_interface_t m_Verbs;\r
#include "wv_memory.h"\r
#include "wv_ep.h"\r
#include "wv_ioctl.h"\r
+#include "wv_qp.h"\r
+\r
+static void WvIoConvertConnParam(WV_IO_CONNECT_PARAM *pIoParam,\r
+ WV_CONNECT_PARAM *pParam)\r
+{\r
+ pIoParam->DataLength = (UINT8) pParam->DataLength;\r
+ pIoParam->ResponderResources = pParam->ResponderResources;\r
+ pIoParam->InitiatorDepth = pParam->InitiatorDepth;\r
+ pIoParam->RetryCount = pParam->RetryCount;\r
+ pIoParam->RnrRetryCount = pParam->RnrRetryCount;\r
+ RtlZeroMemory(pIoParam->Reserved, sizeof pIoParam->Reserved);\r
+ RtlCopyMemory(pIoParam->Data, pParam->Data, pParam->DataLength);\r
+}\r
\r
CWVConnectEndpoint::CWVConnectEndpoint(CWVProvider *pProvider)\r
{\r
pProvider->AddRef();\r
m_pProvider = pProvider;\r
m_hFile = pProvider->m_hFile;\r
+ m_Socket = INVALID_SOCKET;\r
+}\r
+\r
+STDMETHODIMP CWVConnectEndpoint::\r
+Allocate(void)\r
+{\r
+ UINT64 EpType;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ EpType = WV_IO_EP_TYPE_CONNECT;\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_CREATE, &EpType, sizeof EpType,\r
+ &m_Id, sizeof m_Id, &bytes, NULL)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ return hr;\r
}\r
\r
CWVConnectEndpoint::~CWVConnectEndpoint()\r
{\r
+ DWORD bytes;\r
+\r
+ if (m_Id != 0) {\r
+ WvDeviceIoControl(m_hFile, WV_IOCTL_EP_DESTROY, &m_Id, sizeof m_Id,\r
+ NULL, 0, &bytes, NULL);\r
+ }\r
+\r
+ if (m_Socket != INVALID_SOCKET) {\r
+ closesocket(m_Socket);\r
+ }\r
m_pProvider->Release();\r
}\r
\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
-BindAddress(const struct sockaddr* pAddress)\r
+Modify(DWORD Option, const VOID* pOptionData, SIZE_T OptionLength)\r
{\r
- UNREFERENCED_PARAMETER(pAddress);\r
+ WV_IO_ID *pId;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+ CWVBuffer buf;\r
+\r
+ bytes = sizeof WV_IO_ID + OptionLength;\r
+ pId = (WV_IO_ID *) buf.Get(bytes);\r
+ if (pId == NULL) {\r
+ return WV_NO_MEMORY;\r
+ }\r
\r
- return E_NOTIMPL;\r
+ pId->Id = m_Id;\r
+ pId->Data = Option;\r
+ RtlCopyMemory(pId + 1, pOptionData, OptionLength);\r
+\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_MODIFY, pId, bytes,\r
+ NULL, 0, &bytes, NULL)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ buf.Put();\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
-Reject(const VOID* pPrivateData, SIZE_T PrivateDataLength)\r
+BindAddress(SOCKADDR* pAddress)\r
{\r
- UNREFERENCED_PARAMETER(pPrivateData);\r
- UNREFERENCED_PARAMETER(PrivateDataLength);\r
+ WV_IO_EP_BIND attr;\r
+ BOOLEAN any;\r
+ DWORD bytes;\r
+ int len;\r
+ HRESULT hr;\r
+\r
+ if (pAddress->sa_family == AF_INET) {\r
+ any = (((SOCKADDR_IN *) pAddress)->sin_addr.S_un.S_addr == INADDR_ANY);\r
+ bytes = sizeof(SOCKADDR_IN);\r
+ } else {\r
+ any = IN6ADDR_ISANY((SOCKADDR_IN6 *) pAddress);\r
+ bytes = sizeof(SOCKADDR_IN6);\r
+ }\r
\r
- return E_NOTIMPL;\r
+ if (any) {\r
+ RtlZeroMemory(&attr.Device, sizeof attr.Device);\r
+ } else {\r
+ hr = m_pProvider->TranslateAddress(pAddress, (WV_DEVICE_ADDRESS *) &attr.Device);\r
+ if (FAILED(hr)) {\r
+ return hr;\r
+ }\r
+ }\r
+\r
+ m_Socket = socket(pAddress->sa_family, SOCK_STREAM, IPPROTO_TCP);\r
+ if (m_Socket == INVALID_SOCKET) {\r
+ return WSAGetLastError();\r
+ }\r
+\r
+ hr = bind(m_Socket, pAddress, bytes);\r
+ if (FAILED(hr)) {\r
+ goto get_err;\r
+ }\r
+\r
+ attr.Id = m_Id;\r
+ len = sizeof attr.Address;\r
+ hr = getsockname(m_Socket, (sockaddr *) &attr.Address, &len);\r
+ if (FAILED(hr)) {\r
+ goto get_err;\r
+ }\r
+\r
+ if (!WvDeviceIoControl(m_hFile, WV_IOCTL_EP_BIND, &attr, sizeof attr,\r
+ &attr, sizeof attr, &bytes, NULL)) {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ goto err;\r
+ }\r
+\r
+ return WV_SUCCESS;\r
+\r
+get_err:\r
+ hr = WSAGetLastError();\r
+err:\r
+ closesocket(m_Socket);\r
+ m_Socket = INVALID_SOCKET;\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
-Connect(IWVConnectQueuePair* pQp, WV_CONNECT_PARAM* pParam, OVERLAPPED* pOverlapped)\r
+Listen(SIZE_T Backlog)\r
{\r
- UNREFERENCED_PARAMETER(pQp);\r
- UNREFERENCED_PARAMETER(pParam);\r
- UNREFERENCED_PARAMETER(pOverlapped);\r
+ WV_IO_EP_LISTEN attr;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ attr.Id = m_Id;\r
+ attr.Backlog = Backlog;\r
+\r
+ if (!WvDeviceIoControl(m_hFile, WV_IOCTL_EP_LISTEN, &attr, sizeof attr,\r
+ &attr, sizeof attr, &bytes, NULL)) {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ } else {\r
+ hr = WV_SUCCESS;\r
+ }\r
\r
- return E_NOTIMPL;\r
+ return hr;\r
+}\r
+\r
+STDMETHODIMP CWVConnectEndpoint::\r
+Reject(const VOID* pUserData, SIZE_T UserDataLength)\r
+{\r
+ WV_IO_ID *pId;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+ CWVBuffer buf;\r
+\r
+ bytes = sizeof WV_IO_ID + UserDataLength;\r
+ pId = (WV_IO_ID *) buf.Get(bytes);\r
+ if (pId == NULL) {\r
+ return WV_NO_MEMORY;\r
+ }\r
+\r
+ pId->Id = m_Id;\r
+ RtlCopyMemory(pId + 1, pUserData, UserDataLength);\r
+\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_REJECT, pId, bytes,\r
+ NULL, 0, &bytes, NULL)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ buf.Put();\r
+ return hr;\r
+}\r
+\r
+STDMETHODIMP CWVConnectEndpoint::\r
+GetRequest(IWVConnectEndpoint* pEndpoint, OVERLAPPED* pOverlapped)\r
+{\r
+ WV_IO_EP_GET_REQUEST req;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ req.Id = m_Id;\r
+ req.EpId = ((CWVConnectEndpoint *) pEndpoint)->m_Id;\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_GET_REQUEST,\r
+ &req, sizeof req, NULL, 0, &bytes, pOverlapped)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ return hr;\r
+}\r
+\r
+STDMETHODIMP CWVConnectEndpoint::\r
+Connect(IWVConnectQueuePair* pQp, const SOCKADDR* pAddress,\r
+ WV_CONNECT_PARAM* pParam, OVERLAPPED* pOverlapped)\r
+{\r
+ WV_IO_EP_CONNECT attr;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ attr.Id = m_Id;\r
+ attr.QpId = ((CWVConnectQueuePair *) pQp)->m_Id;\r
+\r
+ if (pAddress->sa_family == AF_INET) {\r
+ RtlCopyMemory(&attr.PeerAddress, pAddress, sizeof(SOCKADDR_IN));\r
+ } else {\r
+ RtlCopyMemory(&attr.PeerAddress, pAddress, sizeof(SOCKADDR_IN6));\r
+ }\r
+ WvIoConvertConnParam(&attr.Param, pParam);\r
+\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_CONNECT, &attr, sizeof attr,\r
+ NULL, 0, &bytes, pOverlapped)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
Accept(IWVConnectQueuePair* pQp, WV_CONNECT_PARAM* pParam, OVERLAPPED* pOverlapped)\r
{\r
- UNREFERENCED_PARAMETER(pQp);\r
- UNREFERENCED_PARAMETER(pParam);\r
- UNREFERENCED_PARAMETER(pOverlapped);\r
+ CWVConnectQueuePair *qp = (CWVConnectQueuePair *) pQp;\r
+ WV_IO_EP_ACCEPT attr;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+ void *pout;\r
+ DWORD size;\r
+\r
+ attr.Id = m_Id;\r
+ attr.QpId = qp->m_Id;\r
+ qp->m_pVerbs->nd_modify_qp(qp->m_hVerbsQp, &pout, &size);\r
+ WvIoConvertConnParam(&attr.Param, pParam);\r
+\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_ACCEPT, &attr, sizeof attr,\r
+ pout, size, &bytes, pOverlapped)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
\r
- return E_NOTIMPL;\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
-Disconnect(OVERLAPPED* pOverlapped)\r
+Disconnect(void)\r
{\r
- UNREFERENCED_PARAMETER(pOverlapped);\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_DISCONNECT,\r
+ &m_Id, sizeof m_Id, NULL, 0, &bytes, NULL)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
\r
- return E_NOTIMPL;\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
NotifyDisconnect(OVERLAPPED* pOverlapped)\r
{\r
- UNREFERENCED_PARAMETER(pOverlapped);\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_DISCONNECT_NOTIFY,\r
+ &m_Id, sizeof m_Id, NULL, 0, &bytes, pOverlapped)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
\r
- return E_NOTIMPL;\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVConnectEndpoint::\r
Query(WV_CONNECT_ATTRIBUTES* pAttributes)\r
{\r
- UNREFERENCED_PARAMETER(pAttributes);\r
+ WV_IO_EP_ATTRIBUTES attr;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
\r
- return E_NOTIMPL;\r
+ if (!WvDeviceIoControl(m_hFile, WV_IOCTL_EP_QUERY, &m_Id, sizeof m_Id,\r
+ &attr, sizeof attr, &bytes, NULL)) {\r
+ return HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ RtlCopyMemory(&pAttributes->LocalAddress, &attr.LocalAddress,\r
+ sizeof pAttributes->LocalAddress);\r
+ RtlCopyMemory(&pAttributes->PeerAddress, &attr.PeerAddress,\r
+ sizeof pAttributes->PeerAddress);\r
+ RtlCopyMemory(&pAttributes->Device, &attr.Device, sizeof pAttributes->Device);\r
+ pAttributes->Param.DataLength = attr.Param.Connect.DataLength;\r
+ pAttributes->Param.ResponderResources = (SIZE_T) attr.Param.Connect.ResponderResources;\r
+ pAttributes->Param.InitiatorDepth = (SIZE_T) attr.Param.Connect.InitiatorDepth;\r
+ pAttributes->Param.RetryCount = attr.Param.Connect.RetryCount;\r
+ pAttributes->Param.RnrRetryCount = attr.Param.Connect.RnrRetryCount;\r
+ RtlCopyMemory(pAttributes->Param.Data, attr.Param.Connect.Data, attr.Param.Connect.DataLength);\r
+\r
+ return WV_SUCCESS;\r
}\r
\r
\r
m_pProvider = pProvider;\r
m_hFile = pProvider->m_hFile;\r
}\r
+ \r
+STDMETHODIMP CWVDatagramEndpoint::\r
+Allocate(void)\r
+{\r
+ UINT64 EpType;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ EpType = WV_IO_EP_TYPE_DATAGRAM;\r
+ if (WvDeviceIoControl(m_hFile, WV_IOCTL_EP_CREATE, &EpType, sizeof EpType,\r
+ &m_Id, sizeof m_Id, &bytes, NULL)) {\r
+ hr = WV_SUCCESS;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ return hr;\r
+}\r
\r
CWVDatagramEndpoint::~CWVDatagramEndpoint()\r
{\r
+ DWORD bytes;\r
+\r
+ if (m_Id != 0) {\r
+ WvDeviceIoControl(m_hFile, WV_IOCTL_EP_DESTROY, &m_Id, sizeof m_Id,\r
+ NULL, 0, &bytes, NULL);\r
+ }\r
m_pProvider->Release();\r
}\r
\r
}\r
\r
STDMETHODIMP CWVDatagramEndpoint::\r
-BindAddress(const struct sockaddr* pAddress)\r
+Modify(DWORD Option, const VOID* pOptionData, SIZE_T OptionLength)\r
+{\r
+ UNREFERENCED_PARAMETER(Option);\r
+ UNREFERENCED_PARAMETER(pOptionData);\r
+ UNREFERENCED_PARAMETER(OptionLength);\r
+\r
+ return E_NOTIMPL;\r
+}\r
+\r
+STDMETHODIMP CWVDatagramEndpoint::\r
+BindAddress(SOCKADDR* pAddress)\r
{\r
UNREFERENCED_PARAMETER(pAddress);\r
\r
}\r
\r
STDMETHODIMP CWVDatagramEndpoint::\r
-Reject(const VOID* pPrivateData, SIZE_T PrivateDataLength)\r
+Listen(SIZE_T Backlog)\r
{\r
- UNREFERENCED_PARAMETER(pPrivateData);\r
- UNREFERENCED_PARAMETER(PrivateDataLength);\r
+ UNREFERENCED_PARAMETER(Backlog);\r
+\r
+ return E_NOTIMPL;\r
+}\r
+\r
+STDMETHODIMP CWVDatagramEndpoint::\r
+Reject(const VOID* pUserData, SIZE_T UserDataLength)\r
+{\r
+ UNREFERENCED_PARAMETER(pUserData);\r
+ UNREFERENCED_PARAMETER(UserDataLength);\r
+\r
+ return E_NOTIMPL;\r
+}\r
+\r
+STDMETHODIMP CWVDatagramEndpoint::\r
+GetRequest(IWVDatagramEndpoint* pEndpoint, OVERLAPPED* pOverlapped)\r
+{\r
+ UNREFERENCED_PARAMETER(pEndpoint);\r
+ UNREFERENCED_PARAMETER(pOverlapped);\r
\r
return E_NOTIMPL;\r
}\r
\r
STDMETHODIMP CWVDatagramEndpoint::\r
-Lookup(const struct sockaddr* pAddress, const VOID* pPrivateData,\r
- SIZE_T PrivateDataLength, OVERLAPPED* pOverlapped)\r
+Lookup(const SOCKADDR* pAddress, const VOID* pUserData,\r
+ SIZE_T UserDataLength, OVERLAPPED* pOverlapped)\r
{\r
UNREFERENCED_PARAMETER(pAddress);\r
- UNREFERENCED_PARAMETER(pPrivateData);\r
- UNREFERENCED_PARAMETER(PrivateDataLength);\r
+ UNREFERENCED_PARAMETER(pUserData);\r
+ UNREFERENCED_PARAMETER(UserDataLength);\r
UNREFERENCED_PARAMETER(pOverlapped);\r
\r
return E_NOTIMPL;\r
}\r
\r
STDMETHODIMP CWVDatagramEndpoint::\r
-JoinMulticast(const struct sockaddr* pAddress, OVERLAPPED* pOverlapped)\r
+JoinMulticast(const SOCKADDR* pAddress, OVERLAPPED* pOverlapped)\r
{\r
UNREFERENCED_PARAMETER(pAddress);\r
UNREFERENCED_PARAMETER(pOverlapped);\r
}\r
\r
STDMETHODIMP CWVDatagramEndpoint::\r
-LeaveMulticast(const struct sockaddr* pAddress, OVERLAPPED* pOverlapped)\r
+LeaveMulticast(const SOCKADDR* pAddress, OVERLAPPED* pOverlapped)\r
{\r
UNREFERENCED_PARAMETER(pAddress);\r
UNREFERENCED_PARAMETER(pOverlapped);\r
DWORD *pNumberOfBytesTransferred, BOOL bWait);\r
\r
// IWVEndpoint methods\r
- STDMETHODIMP BindAddress(const struct sockaddr* pAddress);\r
- STDMETHODIMP Reject(const VOID* pPrivateData, SIZE_T PrivateDataLength);\r
+ STDMETHODIMP Modify(DWORD Option, const VOID* pOptionData, SIZE_T OptionLength);\r
+ STDMETHODIMP BindAddress(SOCKADDR* pAddress);\r
+ STDMETHODIMP Listen(SIZE_T Backlog);\r
+ STDMETHODIMP Reject(const VOID* pUserData, SIZE_T UserDataLength);\r
\r
// IWVConnectEndpoint methods\r
- STDMETHODIMP Connect(IWVConnectQueuePair* pQp, WV_CONNECT_PARAM* pParam,\r
- OVERLAPPED* pOverlapped);\r
+ STDMETHODIMP GetRequest(IWVConnectEndpoint* pEndpoint, OVERLAPPED* pOverlapped);\r
+ STDMETHODIMP Connect(IWVConnectQueuePair* pQp, const SOCKADDR* pAddress,\r
+ WV_CONNECT_PARAM* pParam, OVERLAPPED* pOverlapped);\r
STDMETHODIMP Accept(IWVConnectQueuePair* pQp, WV_CONNECT_PARAM* pParam,\r
OVERLAPPED* pOverlapped);\r
- STDMETHODIMP Disconnect(OVERLAPPED* pOverlapped);\r
+ STDMETHODIMP Disconnect();\r
STDMETHODIMP NotifyDisconnect(OVERLAPPED* pOverlapped);\r
STDMETHODIMP Query(WV_CONNECT_ATTRIBUTES* pAttributes);\r
\r
goto err2;\r
}\r
\r
+ hr = ep->Allocate();\r
+ if (FAILED(hr)) {\r
+ goto err2;\r
+ }\r
+\r
*ppConnectEndpoint = ep;\r
return WV_SUCCESS;\r
\r
}\r
\r
CWVProvider *m_pProvider;\r
+\r
+protected:\r
+ SOCKET m_Socket;\r
+\r
+ STDMETHODIMP Allocate();\r
};\r
\r
class CWVDatagramEndpoint : IWVDatagramEndpoint, public CWVBase\r
DWORD *pNumberOfBytesTransferred, BOOL bWait);\r
\r
// IWVEndpoint methods\r
- STDMETHODIMP BindAddress(const struct sockaddr* pAddress);\r
- STDMETHODIMP Reject(const VOID* pPrivateData, SIZE_T PrivateDataLength);\r
+ STDMETHODIMP Modify(DWORD Option, const VOID* pOptionData, SIZE_T OptionLength);\r
+ STDMETHODIMP BindAddress(SOCKADDR* pAddress);\r
+ STDMETHODIMP Listen(SIZE_T Backlog);\r
+ STDMETHODIMP Reject(const VOID* pUserData, SIZE_T UserDataLength);\r
\r
// IWVDatagramEndpoint methods\r
- STDMETHODIMP Lookup(const struct sockaddr* pAddress, const VOID* pPrivateData,\r
- SIZE_T PrivateDataLength, OVERLAPPED* pOverlapped);\r
+ STDMETHODIMP GetRequest(IWVDatagramEndpoint* pEndpoint, OVERLAPPED* pOverlapped);\r
+ STDMETHODIMP Lookup(const SOCKADDR* pAddress, const VOID* pUserData,\r
+ SIZE_T UserDataLength, OVERLAPPED* pOverlapped);\r
STDMETHODIMP Accept(WV_DATAGRAM_PARAM* pParam, OVERLAPPED* pOverlapped);\r
- STDMETHODIMP JoinMulticast(const struct sockaddr* pAddress,\r
+ STDMETHODIMP JoinMulticast(const SOCKADDR* pAddress,\r
OVERLAPPED* pOverlapped);\r
- STDMETHODIMP LeaveMulticast(const struct sockaddr* pAddress,\r
+ STDMETHODIMP LeaveMulticast(const SOCKADDR* pAddress,\r
OVERLAPPED* pOverlapped);\r
STDMETHODIMP Query(WV_DATAGRAM_ATTRIBUTES* pAttributes);\r
\r
goto err2;\r
}\r
\r
+ hr = ep->Allocate();\r
+ if (FAILED(hr)) {\r
+ goto err2;\r
+ }\r
+\r
*ppDatagramEndpoint = ep;\r
return WV_SUCCESS;\r
\r
}\r
\r
CWVProvider *m_pProvider;\r
+\r
+protected:\r
+ STDMETHODIMP Allocate();\r
};\r
\r
#endif // _WV_EP_H_\r
DWORD bytes;\r
HRESULT hr;\r
\r
- if (m_Id != NULL) {\r
+ if (m_Id != 0) {\r
m_pVerbs->pre_deallocate_pd(m_hVerbsPd);\r
- hr = WvDeviceIoControl(m_hFile, WV_IOCTL_PD_ALLOCATE, &m_Id, sizeof m_Id,\r
+ hr = WvDeviceIoControl(m_hFile, WV_IOCTL_PD_DEALLOCATE, &m_Id, sizeof m_Id,\r
NULL, 0, &bytes, NULL) ?\r
WV_SUCCESS : HRESULT_FROM_WIN32(GetLastError());\r
m_pVerbs->post_deallocate_pd(m_hVerbsPd, (ib_api_status_t) hr);\r
DWORD bytes;\r
HRESULT hr;\r
\r
- if (m_Id != NULL) {\r
+ if (m_Id != 0) {\r
m_pVerbs->pre_destroy_mw(m_hVerbsMw);\r
hr = WvDeviceIoControl(m_hFile, WV_IOCTL_MW_DEALLOCATE,\r
&m_Id, sizeof m_Id, NULL, 0, &bytes, NULL) ?\r
HRESULT hr;\r
ib_api_status_t stat;\r
\r
- if (m_Id != NULL) {\r
+ if (m_Id != 0) {\r
stat = m_pVerbs->pre_destroy_av(m_hVerbsAh);\r
if (stat != IB_VERBS_PROCESSING_DONE) {\r
hr = WvDeviceIoControl(m_hFile, WV_IOCTL_AH_DESTROY,\r
STDMETHODIMP CWVAddressHandle::\r
ConvertAv(ib_av_attr_t *pVerbsAv, WV_ADDRESS_VECTOR *pAv)\r
{\r
+ DWORD index;\r
HRESULT hr;\r
\r
pVerbsAv->grh_valid = pAv->Route.Valid;\r
if (pVerbsAv->grh_valid) {\r
- hr = m_pPd->m_pDevice->FindGidIndex(pAv->PortNumber, &pAv->Route.SGid,\r
- &pVerbsAv->grh.resv1);\r
+ hr = m_pPd->m_pDevice->FindGid(pAv->PortNumber, &pAv->Route.SGid, &index);\r
if (FAILED(hr)) {\r
return hr;\r
}\r
\r
+ pVerbsAv->grh.resv1 = (UINT16) index;\r
pVerbsAv->grh.ver_class_flow =\r
_byteswap_ulong(_byteswap_ulong(pAv->Route.FlowLabel) |\r
(pAv->Route.TrafficClass << 20));\r
*/\r
\r
#include <iba\ib_al.h>\r
+#include <iba\ib_at_ioctl.h>\r
\r
#include "wv_memory.h"\r
#include "wv_provider.h"\r
#include "wv_device.h"\r
#include "wv_ep.h"\r
-#include "wv_listen.h"\r
#include "wv_ioctl.h"\r
\r
CWVProvider::CWVProvider()\r
CWVProvider::~CWVProvider()\r
{\r
CloseHandle(m_hFile);\r
- InterlockedDecrement(&WvRef);\r
+ if (InterlockedDecrement(&WvRef) == 0) {\r
+ WSACleanup();\r
+ }\r
}\r
\r
STDMETHODIMP CWVProvider::\r
}\r
\r
STDMETHODIMP CWVProvider::\r
-QueryAddressList(WV_ADDRESS_LIST* pAddressList, SIZE_T* pBufferSize)\r
+TranslateAddress(SOCKADDR* pAddress, WV_DEVICE_ADDRESS* pDeviceAddress)\r
{\r
- UNREFERENCED_PARAMETER(pAddressList);\r
- UNREFERENCED_PARAMETER(pBufferSize);\r
+ HANDLE hIbat;\r
+ IOCTL_IBAT_IP_TO_PORT_IN addr;\r
+ IBAT_PORT_RECORD port;\r
+ DWORD bytes;\r
+ HRESULT hr;\r
+\r
+ hIbat = CreateFileW(IBAT_WIN32_NAME, GENERIC_READ | GENERIC_WRITE,\r
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,\r
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\r
+ if (hIbat == INVALID_HANDLE_VALUE) {\r
+ return HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
+\r
+ addr.Version = IBAT_IOCTL_VERSION;\r
+ if (pAddress->sa_family == AF_INET) {\r
+ addr.Address.IpVersion = 4;\r
+ RtlCopyMemory(addr.Address.Address + 12,\r
+ &((SOCKADDR_IN *)pAddress)->sin_addr, 4);\r
+ } else {\r
+ addr.Address.IpVersion = 6;\r
+ RtlCopyMemory(addr.Address.Address,\r
+ &((SOCKADDR_IN6 *)pAddress)->sin6_addr, 16);\r
+ }\r
+\r
+ if (DeviceIoControl(hIbat, IOCTL_IBAT_IP_TO_PORT,\r
+ &addr, sizeof addr, &port, sizeof port, &bytes, NULL)) {\r
+ hr = WV_SUCCESS;\r
+ pDeviceAddress->DeviceGuid = port.CaGuid;\r
+ pDeviceAddress->Pkey = port.PKey;\r
+ pDeviceAddress->PortNumber = port.PortNum;\r
+ } else {\r
+ hr = HRESULT_FROM_WIN32(GetLastError());\r
+ }\r
\r
- return E_NOTIMPL;\r
+ CloseHandle(hIbat);\r
+ return hr;\r
}\r
\r
STDMETHODIMP CWVProvider::\r
{\r
return CWVDatagramEndpoint::CreateInstance(this, ppDatagramEndpoint);\r
}\r
-\r
-STDMETHODIMP CWVProvider::\r
-CreateListen(const struct sockaddr* pAddress, SIZE_T Backlog, IWVListen** ppListen)\r
-{\r
- return CWVListen::CreateInstance(this, pAddress, Backlog, ppListen);\r
-}\r
STDMETHODIMP_(HANDLE) GetFileHandle();\r
STDMETHODIMP QueryDeviceList(NET64* pGuidList, SIZE_T* pBufferSize);\r
STDMETHODIMP QueryDevice(NET64 Guid, WV_DEVICE_ATTRIBUTES* pAttributes);\r
- STDMETHODIMP QueryAddressList(WV_ADDRESS_LIST* pAddressList, SIZE_T* pBufferSize);\r
+ STDMETHODIMP TranslateAddress(SOCKADDR* pAddress,\r
+ WV_DEVICE_ADDRESS* pDeviceAddress);\r
\r
STDMETHODIMP OpenDevice(NET64 Guid, IWVDevice** ppDevice);\r
\r
STDMETHODIMP CreateConnectEndpoint(IWVConnectEndpoint** ppConnectEndpoint);\r
STDMETHODIMP CreateDatagramEndpoint(IWVDatagramEndpoint** ppDatagramEndpoint);\r
- STDMETHODIMP CreateListen(const struct sockaddr* pAddress,\r
- SIZE_T backlog, IWVListen** ppListen);\r
\r
CWVProvider();\r
~CWVProvider();\r
void Delete() {delete this;}\r
static STDMETHODIMP CreateInstance(IWVProvider** ppProvider)\r
{\r
+ WSADATA wsadata;\r
HRESULT hr;\r
CWVProvider *wv;\r
\r
+ if (WvRef == 0) {\r
+ hr = WSAStartup(MAKEWORD(2, 2), &wsadata);\r
+ if (FAILED(hr)) {\r
+ return hr;\r
+ }\r
+ }\r
+\r
wv = new CWVProvider;\r
if (wv == NULL) {\r
hr = WV_NO_MEMORY;\r
\r
pIoAttr->AccessFlags = (UINT8) pAttr->AccessFlags;\r
pIoAttr->QpFlags = (UINT8) pAttr->QpFlags;\r
+ RtlZeroMemory(pIoAttr->Reserved, sizeof pIoAttr->Reserved);\r
}\r
\r
CWVQueuePair::CWVQueuePair(CWVProtectionDomain *pPd)\r
DWORD bytes;\r
HRESULT hr;\r
\r
- if (m_Id != NULL) {\r
+ if (m_Id != 0) {\r
m_pVerbs->pre_destroy_qp(m_hVerbsQp);\r
hr = WvDeviceIoControl(m_hFile, WV_IOCTL_QP_DESTROY, &m_Id, sizeof m_Id,\r
NULL, 0, &bytes, NULL) ?\r
pattr->MaxSge = attr.max_sge;\r
pattr->MaxWr = attr.max_wr;\r
pattr->SrqLimit = attr.srq_limit;\r
+ pattr->Reserved = 0;\r
RtlCopyMemory(pattr + 1, (void *) (ULONG_PTR) verbsData.p_inout_buf,\r
verbsData.input_size);\r
\r
DWORD bytes;\r
HRESULT hr;\r
\r
- if (m_Id != NULL) {\r
+ if (m_Id != 0) {\r
m_pVerbs->pre_destroy_srq(m_hVerbsSrq);\r
hr = WvDeviceIoControl(m_hFile, WV_IOCTL_SRQ_DESTROY, &m_Id, sizeof m_Id,\r
NULL, 0, &bytes, NULL) ?\r
\r
pattr->Id.Id = m_Id;\r
pattr->Id.VerbInfo = verbsData.command;\r
+ pattr->Reserved = 0;\r
RtlCopyMemory(pattr + 1, (void *) (ULONG_PTR) verbsData.p_inout_buf,\r
verbsData.input_size);\r
\r
pattr->Id.VerbInfo = verbsData.command;\r
pattr->MaxWr = attr.max_wr;\r
pattr->SrqLimit = attr.srq_limit;\r
+ pattr->Reserved = 0;\r
RtlCopyMemory(pattr + 1, (void *) (ULONG_PTR) verbsData.p_inout_buf,\r
verbsData.input_size);\r
\r
#include <initguid.h>\r
\r
#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
#include <unknwn.h>\r
#include <rdma\wvstatus.h>\r
\r
\r
} WV_PORT_ATTRIBUTES;\r
\r
-typedef struct _WV_ADDRESS\r
+typedef struct _WV_DEVICE_ADDRESS\r
{\r
- SOCKET_ADDRESS Address;\r
- NET64 DeviceGuid;\r
- NET16 Pkey;\r
- UINT8 PortNumber;\r
-\r
-} WV_ADDRESS;\r
-\r
-typedef struct _WV_ADDRESS_LIST\r
-{\r
- SIZE_T Count;\r
- WV_ADDRESS Address[1];\r
+ NET64 DeviceGuid;\r
+ NET16 Pkey;\r
+ UINT8 PortNumber;\r
\r
-} WV_ADDRESS_LIST;\r
+} WV_DEVICE_ADDRESS;\r
\r
// Port notification flags\r
#define WV_EVENT_ERROR 0x00000001\r
\r
#define WV_CM_UDP_QKEY 0x01234567\r
\r
-#pragma warning(push)\r
-#pragma warning(disable: 4200)\r
typedef struct _WV_CONNECT_PARAM\r
{\r
SIZE_T DataLength;\r
UINT8 RetryCount; // Ignored when accepting\r
UINT8 RnrRetryCount;\r
UINT8 Reserved[2];\r
- UINT8 Data[];\r
+ UINT8 Data[56];\r
\r
} WV_CONNECT_PARAM;\r
\r
WV_ADDRESS_VECTOR AddressVector;\r
NET32 Qpn;\r
NET32 Qkey;\r
- UINT8 Data[];\r
+ UINT8 Data[56];\r
\r
} WV_DATAGRAM_PARAM;\r
-#pragma warning(pop)\r
+\r
+typedef union _WV_SOCKADDR\r
+{\r
+ SOCKADDR Sa;\r
+ SOCKADDR_IN Sin;\r
+ SOCKADDR_IN6 Sin6;\r
+\r
+} WV_SOCKADDR;\r
\r
typedef struct _WV_CONNECT_ATTRIBUTES\r
{\r
- WV_ADDRESS LocalAddress;\r
- SOCKET_ADDRESS PeerAddress;\r
+ WV_SOCKADDR LocalAddress;\r
+ WV_SOCKADDR PeerAddress;\r
+ WV_DEVICE_ADDRESS Device;\r
WV_CONNECT_PARAM Param;\r
\r
} WV_CONNECT_ATTRIBUTES;\r
\r
typedef struct _WV_DATAGRAM_ATTRIBUTES\r
{\r
- WV_ADDRESS LocalAddress;\r
- SOCKET_ADDRESS PeerAddress; // Specify when querying\r
+ WV_SOCKADDR LocalAddress;\r
+ WV_SOCKADDR PeerAddress; // Specify when querying\r
+ WV_DEVICE_ADDRESS Device;\r
WV_DATAGRAM_PARAM Param;\r
\r
} WV_DATAGRAM_ATTRIBUTES;\r
\r
+// Endpoint options\r
+#define WV_EP_OPTION_ROUTE 0x00000001\r
+\r
#undef INTERFACE\r
#define INTERFACE IWVOverlapped\r
// {64687592-aa67-4b55-bc4b-e189bdd2fc4f}\r
) PURE;\r
\r
// IWVEndpoint methods\r
+ STDMETHOD(Modify)(\r
+ THIS_\r
+ __in DWORD Option,\r
+ __in_bcount_opt(OptionLength) const VOID* pOptionData,\r
+ __in SIZE_T OptionLength\r
+ ) PURE;\r
+\r
STDMETHOD(BindAddress)(\r
THIS_\r
- __in const struct sockaddr* pAddress\r
+ __in SOCKADDR* pAddress\r
+ ) PURE;\r
+\r
+ STDMETHOD(Listen)(\r
+ THIS_\r
+ __in SIZE_T Backlog\r
) PURE;\r
\r
STDMETHOD(Reject)(\r
THIS_\r
- __in_bcount_opt(PrivateDataLength) const VOID* pPrivateData,\r
- __in SIZE_T PrivateDataLength\r
+ __in_bcount_opt(UserDataLength) const VOID* pUserData,\r
+ __in SIZE_T UserDataLength\r
) PURE;\r
};\r
\r
) PURE;\r
\r
// IWVEndpoint methods\r
+ __override STDMETHOD(Modify)(\r
+ THIS_\r
+ __in DWORD Option,\r
+ __in_bcount_opt(OptionLength) const VOID* pOptionData,\r
+ __in SIZE_T OptionLength\r
+ ) PURE;\r
+\r
__override STDMETHOD(BindAddress)(\r
THIS_\r
- __in const struct sockaddr* pAddress\r
+ __in SOCKADDR* pAddress\r
+ ) PURE;\r
+\r
+ __override STDMETHOD(Listen)(\r
+ THIS_\r
+ __in SIZE_T Backlog\r
) PURE;\r
\r
__override STDMETHOD(Reject)(\r
THIS_\r
- __in_bcount_opt(PrivateDataLength) const VOID* pPrivateData,\r
- __in SIZE_T PrivateDataLength\r
+ __in_bcount_opt(UserDataLength) const VOID* pUserData,\r
+ __in SIZE_T UserDataLength\r
) PURE;\r
\r
// IWVConnectEndpoint methods\r
+ STDMETHOD(GetRequest)(\r
+ THIS_\r
+ __in IWVConnectEndpoint* pEndpoint,\r
+ __in_opt OVERLAPPED* pOverlapped\r
+ ) PURE;\r
+\r
STDMETHOD(Connect)(\r
THIS_\r
__in IWVConnectQueuePair* pQp,\r
+ __in const SOCKADDR* pAddress,\r
__in WV_CONNECT_PARAM* pParam,\r
__in_opt OVERLAPPED* pOverlapped\r
) PURE;\r
) PURE;\r
\r
STDMETHOD(Disconnect)(\r
- THIS_\r
- __in_opt OVERLAPPED* pOverlapped\r
+ THIS\r
) PURE;\r
\r
STDMETHOD(NotifyDisconnect)(\r
) PURE;\r
\r
// IWVEndpoint methods\r
+ __override STDMETHOD(Modify)(\r
+ THIS_\r
+ __in DWORD Option,\r
+ __in_bcount_opt(OptionLength) const VOID* pOptionData,\r
+ __in SIZE_T OptionLength\r
+ ) PURE;\r
+\r
__override STDMETHOD(BindAddress)(\r
THIS_\r
- __in const struct sockaddr* pAddress\r
+ __in SOCKADDR* pAddress\r
+ ) PURE;\r
+\r
+ __override STDMETHOD(Listen)(\r
+ THIS_\r
+ __in SIZE_T Backlog\r
) PURE;\r
\r
__override STDMETHOD(Reject)(\r
THIS_\r
- __in_bcount_opt(PrivateDataLength) const VOID* pPrivateData,\r
- __in SIZE_T PrivateDataLength\r
+ __in_bcount_opt(UserDataLength) const VOID* pUserData,\r
+ __in SIZE_T UserDataLength\r
) PURE;\r
\r
// IWVDatagramEndpoint methods\r
+ STDMETHOD(GetRequest)(\r
+ THIS_\r
+ __in IWVDatagramEndpoint* pEndpoint,\r
+ __in_opt OVERLAPPED* pOverlapped\r
+ ) PURE;\r
+\r
STDMETHOD(Lookup)(\r
THIS_\r
- __in const struct sockaddr* pAddress,\r
- __in_bcount_opt(PrivateDataLength) const VOID* pPrivateData,\r
- __in SIZE_T PrivateDataLength,\r
+ __in const SOCKADDR* pAddress,\r
+ __in_bcount_opt(UserDataLength) const VOID* pUserData,\r
+ __in SIZE_T UserDataLength,\r
__in_opt OVERLAPPED* pOverlapped\r
) PURE;\r
\r
\r
STDMETHOD(JoinMulticast)(\r
THIS_\r
- __in const struct sockaddr* pAddress,\r
+ __in const SOCKADDR* pAddress,\r
__in_opt OVERLAPPED* pOverlapped\r
) PURE;\r
\r
STDMETHOD(LeaveMulticast)(\r
THIS_\r
- __in const struct sockaddr* pAddress,\r
+ __in const SOCKADDR* pAddress,\r
__in_opt OVERLAPPED* pOverlapped\r
) PURE;\r
\r
};\r
\r
\r
-#undef INTERFACE\r
-#define INTERFACE IWVListen\r
-// {5b839fd4-7410-441f-a2d9-5d75b1d8599b}\r
-DEFINE_GUID(IID_IWVListen, 0x5b839fd4, 0x7410, 0x441f,\r
- 0xa2, 0xd9, 0x5d, 0x75, 0xb1, 0xd8, 0x59, 0x9b);\r
-\r
-DECLARE_INTERFACE_(IWVListen, IWVOverlapped)\r
-{\r
- // IUnknown methods\r
- __override STDMETHOD(QueryInterface)(\r
- THIS_\r
- REFIID riid,\r
- LPVOID FAR* ppvObj\r
- ) PURE;\r
-\r
- __override STDMETHOD_(ULONG,AddRef)(\r
- THIS\r
- ) PURE;\r
-\r
- __override STDMETHOD_(ULONG,Release)(\r
- THIS\r
- ) PURE;\r
-\r
- // IWVOverlapped methods\r
- __override STDMETHOD(CancelOverlappedRequests)(\r
- THIS\r
- ) PURE;\r
-\r
- __override STDMETHOD(GetOverlappedResult)(\r
- THIS_\r
- __inout_opt OVERLAPPED *pOverlapped,\r
- __out DWORD *pNumberOfBytesTransferred,\r
- __in BOOL bWait\r
- ) PURE;\r
-\r
- // IWVListen methods\r
- STDMETHOD(GetRequest)(\r
- THIS_\r
- __in IWVEndpoint* pEndpoint,\r
- __in_opt OVERLAPPED* pOverlapped\r
- ) PURE;\r
-};\r
-\r
-\r
#undef INTERFACE\r
#define INTERFACE IWVDevice\r
// {244af78c-b1ac-40e4-9896-271d58d591b8}\r
__out WV_GID* pGid\r
) PURE;\r
\r
+ STDMETHOD(FindGid)(\r
+ THIS_\r
+ __in UINT8 PortNumber,\r
+ __in WV_GID* pGid,\r
+ __out DWORD* pIndex\r
+ ) PURE;\r
+\r
STDMETHOD(QueryPkey)(\r
THIS_\r
__in UINT8 PortNumber,\r
__out NET16* pPkey\r
) PURE;\r
\r
+ STDMETHOD(FindPkey)(\r
+ THIS_\r
+ __in UINT8 PortNumber,\r
+ __in NET16 Pkey,\r
+ __out DWORD* pIndex\r
+ ) PURE;\r
+\r
STDMETHOD(CreateCompletionQueue)(\r
THIS_\r
__inout SIZE_T *pEntries,\r
\r
#undef INTERFACE\r
#define INTERFACE IWVProvider\r
-// {6901010c-17af-4894-a1dc-794d3611f262}\r
-DEFINE_GUID(IID_IWVProvider, 0x6901010c, 0x17af, 0x4894,\r
- 0xa1, 0xdc, 0x79, 0x4d, 0x36, 0x11, 0xf2, 0x62);\r
+// {060E95D6-EC54-43b2-83FC-B578FD037259}\r
+DEFINE_GUID(IID_IWVProvider, 0x60e95d6, 0xec54, 0x43b2,\r
+ 0x83, 0xfc, 0xb5, 0x78, 0xfd, 0x3, 0x72, 0x59);\r
\r
DECLARE_INTERFACE_(IWVProvider, IUnknown)\r
{\r
__out WV_DEVICE_ATTRIBUTES* pAttributes\r
) PURE;\r
\r
- STDMETHOD(QueryAddressList)(\r
+ STDMETHOD(TranslateAddress)(\r
THIS_\r
- __inout_bcount_part_opt(*pBufferSize, *pBufferSize) WV_ADDRESS_LIST* pAddressList,\r
- __inout SIZE_T* pBufferSize\r
+ __in SOCKADDR* pAddress,\r
+ __out WV_DEVICE_ADDRESS* pDeviceAddress\r
) PURE;\r
\r
STDMETHOD(OpenDevice)(\r
THIS_\r
__deref_out IWVDatagramEndpoint** ppDatagramEndpoint\r
) PURE;\r
-\r
- STDMETHOD(CreateListen)(\r
- THIS_\r
- __in const struct sockaddr* pAddress,\r
- __in SIZE_T Backlog,\r
- __deref_out IWVListen** ppListen\r
- ) PURE;\r
};\r
\r
__declspec(dllexport) HRESULT WvGetObject(REFIID riid, LPVOID FAR* ppvObj);\r
#define WV_DEVICE_BUSY ((HRESULT)0x80000011L)\r
#define WV_NO_MORE_ENTRIES ((HRESULT)0x8000001AL)\r
#define WV_IO_PENDING ((HRESULT)0x800703E5L)\r
+#define WV_REJECTED ((HRESULT)0x80070047L)\r
#define WV_UNSUCCESSFUL ((HRESULT)0xC0000001L)\r
#define WV_ACCESS_VIOLATION ((HRESULT)0xC0000005L)\r
#define WV_INVALID_HANDLE ((HRESULT)0xC0000008L)\r