Convert status values to errno values and set errno.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
--- /dev/null
+/*\r
+ * Copyright (c) 2009 Intel Corp, Inc. All rights reserved.\r
+ *\r
+ * This software is available to you under a choice of one of two\r
+ * licenses. You may choose to be licensed under the terms of the GNU\r
+ * General Public License (GPL) Version 2, available from the file\r
+ * COPYING in the main directory of this source tree, or the\r
+ * OpenIB.org BSD license below:\r
+ *\r
+ * Redistribution and use in source and binary forms, with or\r
+ * without modification, are permitted provided that the following\r
+ * conditions are met:\r
+ *\r
+ * - Redistributions of source code must retain the above\r
+ * copyright notice, this list of conditions and the following\r
+ * disclaimer.\r
+ *\r
+ * - Redistributions in binary form must reproduce the above\r
+ * copyright notice, this list of conditions and the following\r
+ * disclaimer in the documentation and/or other materials\r
+ * provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ */\r
+\r
+#ifndef __ERRNO_H_\r
+#define __ERRNO_H_\r
+\r
+#include <errno.h>\r
+\r
+/* provide defines missing in older errno.h */\r
+#ifndef EINVAL\r
+#define EINVAL 22\r
+#define ERANGE 34\r
+#define EILSEQ 42\r
+#define STRUNCATE 80\r
+#endif\r
+\r
+#ifndef EADDRINUSE\r
+#define EADDRINUSE 100\r
+#define EADDRNOTAVAIL 101\r
+#define EAFNOSUPPORT 102\r
+#define EALREADY 103\r
+#define EBADMSG 104\r
+#define ECANCELED 105\r
+#define ECONNABORTED 106\r
+#define ECONNREFUSED 107\r
+#define ECONNRESET 108\r
+#define EDESTADDRREQ 109\r
+#define EHOSTUNREACH 110\r
+#define EIDRM 111\r
+#define EINPROGRESS 112\r
+#define EISCONN 113\r
+#define ELOOP 114\r
+#define EMSGSIZE 115\r
+#define ENETDOWN 116\r
+#define ENETRESET 117\r
+#define ENETUNREACH 118\r
+#define ENOBUFS 119\r
+#define ENODATA 120\r
+#define ENOLINK 121\r
+#define ENOMSG 122\r
+#define ENOPROTOOPT 123\r
+#define ENOSR 124\r
+#define ENOSTR 125\r
+#define ENOTCONN 126\r
+#define ENOTRECOVERABLE 127\r
+#define ENOTSOCK 128\r
+#define ENOTSUP 129\r
+#define EOPNOTSUPP 130\r
+#define EOTHER 131\r
+#define EOVERFLOW 132\r
+#define EOWNERDEAD 133\r
+#define EPROTO 134\r
+#define EPROTONOSUPPORT 135\r
+#define EPROTOTYPE 136\r
+#define ETIME 137\r
+#define ETIMEDOUT 138\r
+#define ETXTBSY 139\r
+#define EWOULDBLOCK 140\r
+#endif\r
+\r
+#endif /* __ERRNO_H_ */\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
..\..\..\ulp\librdmacm\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
..\..\..\ulp\librdmacm\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
SOURCES = read_bw.rc read_bw.c ..\perftest.c\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
SOURCES = read_lat.rc read_lat.c ..\perftest.c\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
SOURCES = send_bw.rc send_bw.c ..\perftest.c\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
SOURCES = send_lat.rc send_lat.c ..\perftest.c\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
SOURCES = write_bw.rc write_bw.c ..\perftest.c\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
-\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
$(SDK_LIB_PATH)\advapi32.lib \\r
SOURCES = write_lat.rc write_lat.c ..\perftest.c\r
\r
INCLUDES = ..;..\..\..\ulp\libibverbs\include;\\r
- ..\..\..\inc;..\..\..\inc\user;\r
+ ..\..\..\inc;..\..\..\inc\user;\\r
+ ..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
cm.c\r
\r
INCLUDES = ..\include;..\openib_common;..\common;windows;..\..\dat\include;\\r
- ..\..\dat\udat\windows;..\udapl\windows;\\r
+ ..\..\dat\udat\windows;..\udapl\windows;..\..\..\..\inc\user\linux;\\r
..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;\\r
..\..\..\librdmacm\include\r
\r
cm.c\r
\r
INCLUDES = ..\include;..\openib_common\;..\common;windows;..\..\dat\include;\\r
- ..\..\dat\udat\windows;..\udapl\windows;\\r
+ ..\..\dat\udat\windows;..\udapl\windows;..\..\..\..\inc\user\linux;\\r
..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include\r
\r
DAPL_OPTS = -DEXPORT_DAPL_SYMBOLS -DDAT_EXTENSIONS -DSOCK_CM -DOPENIB -DCQ_WAIT_OBJECT\r
\r
INCLUDES = ..\include;..\openib_common\;..\common;windows;..\..\dat\include;\\r
..\..\dat\udat\windows;..\udapl\windows;\\r
- ..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include\r
+ ..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;\\r
+ ..\..\..\..\inc\user\linux;\r
\r
DAPL_OPTS = -DEXPORT_DAPL_SYMBOLS -DDAT_EXTENSIONS -DOPENIB -DCQ_WAIT_OBJECT\r
\r
asyncwatch.rc \\r
asyncwatch.c\r
\r
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\r
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\\r
+ ..\..\..\..\inc\user\linux\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
rc_pingpong.rc \\r
rc_pingpong.c\r
\r
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\r
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\\r
+ ..\..\..\..\inc\user\linux\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
uc_pingpong.rc \\r
uc_pingpong.c\r
\r
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\r
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\\r
+ ..\..\..\..\inc\user\linux\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
ud_pingpong.rc \\r
ud_pingpong.c\r
\r
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\r
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\\r
+ ..\..\..\..\inc\user\linux\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
\r
#include <windows.h>\r
#include <rdma\winverbs.h>\r
-#include <errno.h>\r
+#include <_errno.h>\r
#include <comp_channel.h>\r
\r
#ifdef __cplusplus\r
typedef unsigned __int32 uint32_t;\r
typedef unsigned __int64 uint64_t;\r
\r
-#define EOVERFLOW WV_BUFFER_OVERFLOW\r
-#define EISCONN WV_CONNECTION_ACTIVE\r
-#define ECONNREFUSED WV_CONNECTION_REFUSED\r
-#define ETIMEDOUT WV_TIMEOUT\r
-#define ENETUNREACH WV_HOST_UNREACHABLE\r
-#define EADDRINUSE WV_ADDRESS_ALREADY_EXISTS\r
-#define EALREADY WV_IO_PENDING\r
-#define EAFNOSUPPORT WV_INVALID_ADDRESS\r
-#define EWOULDBLOCK WV_DEVICE_BUSY\r
-\r
-#define ECONNRESET WSAECONNRESET\r
-\r
union ibv_gid\r
{\r
uint8_t raw[16];\r
__declspec(dllexport)\r
void ibvw_release_windata(struct ibvw_windata *windata, int version);\r
\r
+__declspec(dllexport)\r
+int ibvw_wv_errno(HRESULT hr);\r
+\r
#ifdef __cplusplus\r
}\r
#endif\r
ibv_event_type_str\r
ibvw_get_windata\r
ibvw_release_windata\r
+ibvw_wv_errno\r
#endif\r
*/\r
\r
#include <windows.h>\r
+#include <rdma/wvstatus.h>\r
+#include <_errno.h>\r
\r
extern CRITICAL_SECTION lock;\r
HANDLE heap;\r
ret = ibv_query_gid(context, port_num, i++, &sgid);\r
} while (!ret && memcmp(&sgid, gid, sizeof *gid));\r
\r
- return ret ? ret : i - 1;\r
+ return ret ? -1 : i - 1;\r
}\r
\r
static void ibv_convert_ah_attr(struct ibv_context *context,\r
\r
hr = context->cmd_if->Query(&attr);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
sprintf(device_attr->fw_ver, "0x%I64x", attr.FwVersion);\r
\r
hr = context->cmd_if->QueryPort(port_num, &attr);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
port_attr->state = (enum ibv_port_state) attr.State;\r
int ibv_query_gid(struct ibv_context *context, uint8_t port_num,\r
int index, union ibv_gid *gid)\r
{\r
- return context->cmd_if->QueryGid(port_num, index, (WV_GID *) gid);\r
+ return ibvw_wv_errno(context->cmd_if->QueryGid(port_num, index, (WV_GID *) gid));\r
}\r
\r
__declspec(dllexport)\r
int ibv_query_pkey(struct ibv_context *context, uint8_t port_num,\r
int index, uint16_t *pkey)\r
{\r
- return context->cmd_if->QueryPkey(port_num, (UINT16) index, pkey);\r
+ return ibvw_wv_errno(context->cmd_if->QueryPkey(port_num, (UINT16) index, pkey));\r
}\r
\r
__declspec(dllexport)\r
if (SUCCEEDED(hr)) {\r
delete mr;\r
}\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
if (SUCCEEDED(hr)) {\r
cq->cqe = (int) entries;\r
}\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
} else {\r
hr = 0;\r
}\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
attr.srq_limit = srq_attr->srq_limit;\r
}\r
\r
- return srq->handle->Modify(attr.max_wr, attr.srq_limit);\r
+ return ibvw_wv_errno(srq->handle->Modify(attr.max_wr, attr.srq_limit));\r
}\r
\r
__declspec(dllexport)\r
(WV_SGE *) (*bad_recv_wr)->sg_list,\r
(*bad_recv_wr)->num_sge);\r
}\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
\r
hr = srq->handle->Query(&max_wr, &max_sge, &srq_limit);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
srq_attr->max_wr = (uint32_t) max_wr;\r
\r
hr = qp->handle->Query(&wv_attr);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
/* ibv_qp exposes qp_num. Save qp_num from query. */\r
qp->state = attr->qp_state;\r
}\r
\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
struct ibv_ah *ah;\r
\r
if ((qp->qp_type == IBV_QPT_UD) && (wr->next != NULL))\r
- return WV_NOT_SUPPORTED;\r
+ return ibvw_wv_errno(WV_NOT_SUPPORTED);\r
\r
for (cur_wr = wr; cur_wr != NULL; cur_wr = cur_wr->next) {\r
if (qp->qp_type == IBV_QPT_UD) {\r
}\r
}\r
\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
hr = qp->handle->PostReceive((*bad_wr)->wr_id, (WV_SGE *) (*bad_wr)->sg_list,\r
(*bad_wr)->num_sge);\r
}\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
__declspec(dllexport)\r
__declspec(dllexport)\r
int ibv_attach_mcast(struct ibv_qp *qp, union ibv_gid *gid, uint16_t lid)\r
{\r
- return qp->ud_handle->AttachMulticast((WV_GID *) gid, lid, NULL);\r
+ return ibvw_wv_errno(qp->ud_handle->AttachMulticast((WV_GID *) gid, lid, NULL));\r
}\r
\r
__declspec(dllexport)\r
int ibv_detach_mcast(struct ibv_qp *qp, union ibv_gid *gid, uint16_t lid)\r
{\r
- return qp->ud_handle->DetachMulticast((WV_GID *) gid, lid, NULL);\r
+ return ibvw_wv_errno(qp->ud_handle->DetachMulticast((WV_GID *) gid, lid, NULL));\r
+}\r
+\r
+__declspec(dllexport)\r
+int ibvw_wv_errno(HRESULT hr)\r
+{\r
+ switch (hr) {\r
+ case WV_SUCCESS: return 0;\r
+ case WV_PENDING: _set_errno(EINPROGRESS); break;\r
+ case WV_IO_PENDING: _set_errno(EINPROGRESS); break;\r
+ case WV_TIMEOUT: _set_errno(ETIMEDOUT); break;\r
+ case WV_BUFFER_OVERFLOW: _set_errno(EOVERFLOW); break;\r
+ case WV_DEVICE_BUSY: _set_errno(EBUSY); break;\r
+ case WV_ACCESS_VIOLATION: _set_errno(EACCES); break;\r
+ case WV_INVALID_HANDLE: _set_errno(EINVAL); break;\r
+ case WV_INVALID_PARAMETER: _set_errno(EINVAL); break;\r
+ case WV_NO_MEMORY: _set_errno(ENOMEM); break;\r
+ case WV_INSUFFICIENT_RESOURCES: _set_errno(ENOSPC); break;\r
+ case WV_IO_TIMEOUT: _set_errno(ETIMEDOUT); break;\r
+ case WV_NOT_SUPPORTED: _set_errno(ENOSYS); break;\r
+ case WV_CANCELLED: _set_errno(ECANCELED); break;\r
+ case WV_INVALID_ADDRESS: _set_errno(EADDRNOTAVAIL); break;\r
+ case WV_ADDRESS_ALREADY_EXISTS: _set_errno(EADDRINUSE); break;\r
+ case WV_CONNECTION_REFUSED: _set_errno(ECONNREFUSED); break;\r
+ case WV_CONNECTION_INVALID: _set_errno(ENOTCONN); break;\r
+ case WV_CONNECTION_ACTIVE: _set_errno(EISCONN); break;\r
+ case WV_HOST_UNREACHABLE: _set_errno(ENETUNREACH); break;\r
+ case WV_CONNECTION_ABORTED: _set_errno(ECONNABORTED); break;\r
+ case WV_UNKNOWN_ERROR: _set_errno(EIO); break;\r
+ }\r
+ return -1;\r
}\r
\r
SOURCES = cmatose.c\r
\r
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;\r
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\\r
+ ..\..\..\libibverbs\include;..\..\..\..\inc\user\linux;\r
\r
TARGETLIBS = \\r
$(SDK_LIB_PATH)\kernel32.lib \\r
__declspec(dllexport)\r
int rdma_migrate_id(struct rdma_cm_id *id, struct rdma_event_channel *channel);\r
\r
+__declspec(dllexport)\r
+int rdmaw_wsa_errno(int wsa_err);\r
+\r
#ifdef __cplusplus\r
}\r
#endif\r
cma_main.cpp \\r
cma.cpp\r
\r
-INCLUDES = ..\include;..\..\..\inc;..\..\..\inc\user;..\..\libibverbs\include\r
+INCLUDES = ..\include;..\..\..\inc;..\..\..\inc\user;..\..\libibverbs\include;\\r
+ ..\..\..\inc\user\linux;\r
\r
USER_C_FLAGS = $(USER_C_FLAGS) -DEXPORT_CMA_SYMBOLS\r
\r
{\r
struct cma_id_private *id_priv;\r
HRESULT hr;\r
+ int ret;\r
\r
- hr = ucma_acquire();\r
- if (hr) {\r
- return hr;\r
+ ret = ucma_acquire();\r
+ if (ret) {\r
+ return ret;\r
}\r
\r
id_priv = new struct cma_id_private;\r
if (id_priv == NULL) {\r
- hr = ENOMEM;\r
+ ret = ENOMEM;\r
goto err1;\r
}\r
\r
hr = windata.prov->CreateDatagramEndpoint(&id_priv->id.ep.datagram);\r
}\r
if (FAILED(hr)) {\r
+ ret = ibvw_wv_errno(hr);\r
goto err2;\r
}\r
\r
struct cma_id_private *id_priv;\r
WV_CONNECT_ATTRIBUTES attr;\r
HRESULT hr;\r
+ int ret;\r
\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
hr = id->ep.connect->Query(&attr);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
RtlCopyMemory(&id->route.addr.src_addr, &attr.LocalAddress,\r
}\r
\r
if (id_priv->cma_dev == NULL && attr.Device.DeviceGuid != 0) {\r
- hr = ucma_get_device(id_priv, attr.Device.DeviceGuid);\r
- if (FAILED(hr)) {\r
- return hr;\r
+ ret = ucma_get_device(id_priv, attr.Device.DeviceGuid);\r
+ if (ret) {\r
+ return ret;\r
}\r
\r
id->route.addr.addr.ibaddr.pkey = attr.Device.Pkey;\r
struct cma_id_private *id_priv;\r
WV_DATAGRAM_ATTRIBUTES attr;\r
HRESULT hr;\r
+ int ret;\r
\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
hr = id->ep.datagram->Query(&attr);\r
}\r
\r
if (id_priv->cma_dev == NULL && attr.Device.DeviceGuid != 0) {\r
- hr = ucma_get_device(id_priv, attr.Device.DeviceGuid);\r
- if (FAILED(hr))\r
- return hr;\r
+ ret = ucma_get_device(id_priv, attr.Device.DeviceGuid);\r
+ if (ret)\r
+ return ret;\r
id->route.addr.addr.ibaddr.pkey = attr.Device.Pkey;\r
id_priv->id.port_num = attr.Device.PortNumber;\r
}\r
{\r
struct cma_id_private *id_priv;\r
HRESULT hr;\r
+ int ret;\r
\r
if (id->ps == RDMA_PS_TCP) {\r
hr = id->ep.connect->BindAddress(addr);\r
if (SUCCEEDED(hr)) {\r
- hr = ucma_query_connect(id, NULL);\r
+ ret = ucma_query_connect(id, NULL);\r
+ } else {\r
+ ret = ibvw_wv_errno(hr);\r
}\r
} else {\r
hr = id->ep.datagram->BindAddress(addr);\r
if (SUCCEEDED(hr)) {\r
- hr = ucma_query_datagram(id, NULL);\r
+ ret = ucma_query_datagram(id, NULL);\r
+ } else {\r
+ ret = ibvw_wv_errno(hr);\r
}\r
}\r
\r
- if (SUCCEEDED(hr)) {\r
+ if (!ret) {\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
id_priv->state = cma_addr_bind;\r
}\r
- return hr;\r
+ return ret;\r
}\r
\r
__declspec(dllexport)\r
SOCKET s;\r
DWORD size;\r
HRESULT hr;\r
+ int ret;\r
\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
if (id_priv->state == cma_idle) {\r
s = socket(dst_addr->sa_family, SOCK_DGRAM, IPPROTO_UDP);\r
}\r
if (s == INVALID_SOCKET) {\r
- return WSAGetLastError();\r
+ return rdmaw_wsa_errno(WSAGetLastError());\r
}\r
\r
hr = WSAIoctl(s, SIO_ROUTING_INTERFACE_QUERY, dst_addr, ucma_addrlen(dst_addr),\r
&addr, sizeof addr, &size, NULL, NULL);\r
closesocket(s);\r
if (FAILED(hr)) {\r
- return WSAGetLastError();\r
+ return rdmaw_wsa_errno(WSAGetLastError());\r
}\r
src_addr = &addr.Sa;\r
}\r
\r
- hr = rdma_bind_addr(id, src_addr);\r
- if (FAILED(hr)) {\r
- return hr;\r
+ ret = rdma_bind_addr(id, src_addr);\r
+ if (ret) {\r
+ return ret;\r
}\r
}\r
\r
hr = IBAT::ResolvePath(&id->route.addr.src_addr, &id->route.addr.dst_addr,\r
&path, timeout_ms);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
hr = (id->ps == RDMA_PS_TCP) ?\r
id->ep.connect->Modify(WV_EP_OPTION_ROUTE, &path, sizeof path) :\r
id->ep.datagram->Modify(WV_EP_OPTION_ROUTE, &path, sizeof path);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
id_priv->id.route.addr.addr.ibaddr.pkey,\r
&index);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
qp_attr.pkey_index = index;\r
struct cma_id_private *id_priv;\r
WV_CONNECT_PARAM attr;\r
HRESULT hr;\r
+ int ret;\r
\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
- hr = ucma_valid_param(id_priv, conn_param);\r
- if (FAILED(hr)) {\r
- return hr;\r
+ ret = ucma_valid_param(id_priv, conn_param);\r
+ if (ret) {\r
+ return ret;\r
}\r
\r
RtlZeroMemory(&attr, sizeof attr);\r
id_priv->refcnt--;\r
id->comp_entry.Busy = 0;\r
id_priv->state = cma_route_resolve;\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
return 0;\r
{\r
struct cma_id_private *id_priv = NULL;\r
HRESULT hr;\r
+ int ret;\r
\r
EnterCriticalSection(&lock);\r
if (listen->state != cma_listening) {\r
- hr = WV_INVALID_PARAMETER;\r
+ ret = ibvw_wv_errno(WV_INVALID_PARAMETER);\r
goto err1;\r
}\r
\r
InterlockedIncrement(&listen->refcnt);\r
- hr = rdma_create_id(listen->id.channel, &listen->req_list[index],\r
+ ret = rdma_create_id(listen->id.channel, &listen->req_list[index],\r
listen, listen->id.ps);\r
- if (FAILED(hr)) {\r
+ if (ret) {\r
goto err2;\r
}\r
\r
&id_priv->id.comp_entry.Overlap);\r
}\r
if (FAILED(hr) && hr != WV_IO_PENDING) {\r
+ ret = ibvw_wv_errno(hr);\r
id_priv->id.comp_entry.Busy = 0;\r
id_priv->refcnt--;\r
goto err2;\r
if (id_priv != NULL) {\r
rdma_destroy_id(&id_priv->id);\r
}\r
- return hr;\r
+ return ret;\r
}\r
\r
__declspec(dllexport)\r
{\r
struct cma_id_private *id_priv, *req_id;\r
HRESULT hr;\r
- int i;\r
+ int i, ret;\r
\r
if (backlog <= 0) {\r
backlog = CMA_DEFAULT_BACKLOG;\r
hr = (id->ps == RDMA_PS_TCP) ?\r
id->ep.connect->Listen(backlog) : id->ep.datagram->Listen(backlog);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
for (i = 0; i < backlog; i++) {\r
- hr = ucma_get_request(id_priv, i);\r
- if (FAILED(hr)) {\r
- return hr;\r
+ ret = ucma_get_request(id_priv, i);\r
+ if (ret) {\r
+ return ret;\r
}\r
}\r
\r
struct cma_id_private *id_priv;\r
WV_CONNECT_PARAM attr;\r
HRESULT hr;\r
+ int ret;\r
\r
id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);\r
- hr = ucma_valid_param(id_priv, conn_param);\r
- if (FAILED(hr)) {\r
- return hr;\r
+ ret = ucma_valid_param(id_priv, conn_param);\r
+ if (ret) {\r
+ return ret;\r
}\r
\r
RtlZeroMemory(&attr, sizeof attr);\r
id_priv->refcnt--;\r
id->comp_entry.Busy = 0;\r
id_priv->state = cma_disconnected;\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
return 0;\r
id_priv->state = cma_disconnected;\r
hr = id->ep.connect->Reject(private_data, private_data_len);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
return 0;\r
}\r
}\r
hr = id->ep.connect->Disconnect(NULL);\r
if (FAILED(hr)) {\r
- return hr;\r
+ return ibvw_wv_errno(hr);\r
}\r
\r
return 0;\r
\r
ucma_get_request(listen, id_priv->index);\r
\r
- if (SUCCEEDED(event->event.status)) {\r
+ if (!event->event.status) {\r
event->event.status = ucma_query_connect(&id_priv->id,\r
&event->event.param.conn);\r
}\r
\r
- if (SUCCEEDED(event->event.status)) {\r
+ if (!event->event.status) {\r
event->event.event = RDMA_CM_EVENT_CONNECT_REQUEST;\r
id_priv->state = cma_passive_connect;\r
event->event.listen_id = &listen->id;\r
WV_CONNECT_PARAM attr;\r
HRESULT hr;\r
\r
- if (FAILED(event->event.status)) {\r
+ if (event->event.status) {\r
goto err;\r
}\r
\r
goto err;\r
}\r
\r
- return WV_IO_PENDING;\r
+ return EINPROGRESS;\r
\r
err:\r
event->event.event = (event->event.status == WV_REJECTED) ?\r
{\r
struct cma_id_private *id_priv = event->id_priv;\r
\r
- if (SUCCEEDED(event->event.status)) {\r
+ if (!event->event.status) {\r
event->event.status = ucma_query_connect(&id_priv->id,\r
&event->event.param.conn);\r
}\r
\r
- if (SUCCEEDED(event->event.status)) {\r
+ if (!event->event.status) {\r
event->event.event = RDMA_CM_EVENT_ESTABLISHED;\r
\r
id_priv->state = cma_connected;\r
{\r
struct cma_id_private *listen, *id_priv;\r
WV_CONNECT_ATTRIBUTES attr;\r
- HRESULT hr = 0;\r
+ int ret = 0;\r
\r
id_priv = event->id_priv;\r
\r
listen = (struct cma_id_private *) id_priv->id.context;\r
if (listen->state != cma_listening) {\r
InterlockedDecrement(&id_priv->refcnt);\r
- hr = WV_CANCELLED;\r
+ ret = ECANCELED;\r
break;\r
}\r
\r
event->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;\r
break;\r
case cma_active_connect:\r
- hr = ucma_process_conn_resp(event);\r
+ ret = ucma_process_conn_resp(event);\r
break;\r
case cma_accepting:\r
ucma_process_establish(event);\r
break;\r
default:\r
InterlockedDecrement(&id_priv->refcnt);\r
- hr = WV_CANCELLED;\r
+ ret = ECANCELED;\r
}\r
LeaveCriticalSection(&lock);\r
\r
- return hr;\r
+ return ret;\r
}\r
\r
__declspec(dllexport)\r
int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,\r
void *context)\r
{\r
- return WV_NOT_SUPPORTED;\r
+ return ENOSYS;\r
}\r
\r
__declspec(dllexport)\r
int rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)\r
{\r
- return WV_NOT_SUPPORTED;\r
+ return ENOSYS;\r
}\r
\r
__declspec(dllexport)\r
int rdma_set_option(struct rdma_cm_id *id, int level, int optname,\r
void *optval, size_t optlen)\r
{\r
- return WV_NOT_SUPPORTED;\r
+ return ENOSYS;\r
}\r
\r
__declspec(dllexport)\r
id->channel = channel;\r
return 0;\r
}\r
+\r
+__declspec(dllexport)\r
+int rdmaw_wsa_errno(int wsa_err)\r
+{\r
+ switch (wsa_err) {\r
+ case 0: return 0;\r
+ case WSAEWOULDBLOCK: _set_errno(EWOULDBLOCK); break;\r
+ case WSAEINPROGRESS: _set_errno(EINPROGRESS); break;\r
+ case WSAEALREADY: _set_errno(EALREADY); break;\r
+ case WSAENOTSOCK: _set_errno(ENOTSOCK); break;\r
+ case WSAEDESTADDRREQ: _set_errno(EDESTADDRREQ); break;\r
+ case WSAEMSGSIZE: _set_errno(EMSGSIZE); break;\r
+ case WSAEPROTOTYPE: _set_errno(EPROTOTYPE); break;\r
+ case WSAENOPROTOOPT: _set_errno(ENOPROTOOPT); break;\r
+ case WSAEPROTONOSUPPORT:_set_errno(EPROTONOSUPPORT); break;\r
+ case WSAEOPNOTSUPP: _set_errno(EOPNOTSUPP); break;\r
+ case WSAEAFNOSUPPORT: _set_errno(EAFNOSUPPORT); break;\r
+ case WSAEADDRINUSE: _set_errno(EADDRINUSE); break;\r
+ case WSAEADDRNOTAVAIL: _set_errno(EADDRNOTAVAIL); break;\r
+ case WSAENETDOWN: _set_errno(ENETDOWN); break;\r
+ case WSAENETUNREACH: _set_errno(ENETUNREACH); break;\r
+ case WSAENETRESET: _set_errno(ENETRESET); break;\r
+ case WSAECONNABORTED: _set_errno(ECONNABORTED); break;\r
+ case WSAECONNRESET: _set_errno(ECONNRESET); break;\r
+ case WSAENOBUFS: _set_errno(ENOBUFS); break;\r
+ case WSAEISCONN: _set_errno(EISCONN); break;\r
+ case WSAENOTCONN: _set_errno(ENOTCONN); break;\r
+ case WSAETIMEDOUT: _set_errno(ETIMEDOUT); break;\r
+ case WSAECONNREFUSED: _set_errno(ECONNREFUSED); break;\r
+ case WSAELOOP: _set_errno(ELOOP); break;\r
+ case WSAENAMETOOLONG: _set_errno(ENAMETOOLONG); break;\r
+ case WSAEHOSTUNREACH: _set_errno(EHOSTUNREACH); break;\r
+ case WSAENOTEMPTY: _set_errno(ENOTEMPTY); break;\r
+ }\r
+ return -1;\r
+}\r
rdma_event_str\r
rdma_set_option\r
rdma_migrate_id\r
+rdmaw_wsa_errno\r
#endif\r