]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
OFED compat: convert return values to errno
authorSean Hefty <sean.hefty@intel.com>
Thu, 15 Apr 2010 17:05:21 +0000 (17:05 +0000)
committerSean Hefty <sean.hefty@intel.com>
Thu, 15 Apr 2010 17:05:21 +0000 (17:05 +0000)
Convert libibverbs and librdmacm to use errno.  Return values
from winverbs and winsock are converted into errno values.

To handle values undefined in the current WDK version of errno.h,
add a new header file under the linux include directory with
missing values.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1@2786 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

26 files changed:
trunk/inc/user/linux/_errno.h [new file with mode: 0644]
trunk/tests/perftest/rdma_bw/SOURCES
trunk/tests/perftest/rdma_lat/SOURCES
trunk/tests/perftest/read_bw/SOURCES
trunk/tests/perftest/read_lat/SOURCES
trunk/tests/perftest/send_bw/SOURCES
trunk/tests/perftest/send_lat/SOURCES
trunk/tests/perftest/write_bw/SOURCES
trunk/tests/perftest/write_lat/SOURCES
trunk/ulp/dapl2/dapl/openib_cma/SOURCES
trunk/ulp/dapl2/dapl/openib_scm/SOURCES
trunk/ulp/dapl2/dapl/openib_ucm/SOURCES
trunk/ulp/libibumad/src/Sources
trunk/ulp/libibverbs/examples/asyncwatch/SOURCES
trunk/ulp/libibverbs/examples/rc_pingpong/SOURCES
trunk/ulp/libibverbs/examples/uc_pingpong/SOURCES
trunk/ulp/libibverbs/examples/ud_pingpong/SOURCES
trunk/ulp/libibverbs/include/infiniband/verbs.h
trunk/ulp/libibverbs/src/ibv_exports.src
trunk/ulp/libibverbs/src/ibv_main.cpp
trunk/ulp/libibverbs/src/verbs.cpp
trunk/ulp/librdmacm/examples/cmatose/SOURCES
trunk/ulp/librdmacm/include/rdma/rdma_cma.h
trunk/ulp/librdmacm/src/Sources
trunk/ulp/librdmacm/src/cma.cpp
trunk/ulp/librdmacm/src/cma_exports.src

diff --git a/trunk/inc/user/linux/_errno.h b/trunk/inc/user/linux/_errno.h
new file mode 100644 (file)
index 0000000..c3e5959
--- /dev/null
@@ -0,0 +1,91 @@
+/*\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
index f0bbf0e4115d1bd399524276a7204c64f24749c2..1fedb20e382a01add15ff41ac14f95cb72581cf8 100644 (file)
@@ -14,7 +14,8 @@ SOURCES = rdma_bw.rc rdma_bw.c ..\perftest.c
        \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
index c1e26ada0679c7306d5117a9d61e365bbeea7ec6..ab37d71980b6f233f262580eff2a26c7149c3d70 100644 (file)
@@ -14,7 +14,8 @@ SOURCES = rdma_lat.rc rdma_lat.c ..\perftest.c
        \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
index 0c28233ca0a91eee388670020514bc982c6da895..fbf699fbf56baac3f5dd2e535ddf7e7ec0017d9b 100644 (file)
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 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
index 2aebbe01f6d5bd577148736a58f438188a7badce..c354d5a1301fa8ce97afa28ffc6d6bbf16a2891e 100644 (file)
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 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
index 907bcfb1149df5ac646ab2d8a90f282f84261813..382d17ad756ec1c38a46b3a9191afec0dc485d16 100644 (file)
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 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
index e92f25b70fd7c3efcb7627ba22e64c0ba84bc17f..92e2f546eeb0fe6dbafe23eadbfc63e63cfd9165 100644 (file)
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 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
index 4e7a5a169e27cf129df49470416143327fbf0039..8b7426d765a7b7ce2f0e452e6d868c36a1d92022 100644 (file)
@@ -13,8 +13,8 @@ USE_IOSTREAM = 1
 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
index f869ff1a1cabf0bd2d076d50697dd9ecf82e5ef8..6e948e274e015c24f9ea6bb72bf0efdcca0b170a 100644 (file)
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 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
index d6b97a2d1c05463361871c212df9f1ec0838a2e7..0c3764bb3f93e210e1a5bab8be3ada480ba58948 100644 (file)
@@ -25,7 +25,7 @@ SOURCES = \
        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
index 6e4ad30cc03c46a31bef9375fc79e5a622b64e7c..2129e2771773cc15a60af93ac8172d8e9529246e 100644 (file)
@@ -25,7 +25,7 @@ SOURCES = \
         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
index 7eecf48a060cdbf1c7ddab27673862b676da3d27..a2b5dce4b78e2a1813f5e2cc86666c73d88a7873 100644 (file)
@@ -21,7 +21,8 @@ SOURCES = udapl.rc ..\dapl_common_src.c ..\dapl_udapl_src.c ..\openib_common.c \
 \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
index 1d53cf293749c99452ccd1398f89f398ddbc8eeb..971ca4c12f8645936a65e98d69c9c332be83a853 100644 (file)
@@ -21,7 +21,8 @@ SOURCES = \
        ibum_main.cpp   \\r
        umad.cpp\r
 \r
-INCLUDES = ..\include;..\..\libibverbs\include;..\..\..\inc;..\..\..\inc\user;\r
+INCLUDES = ..\include;..\..\libibverbs\include;..\..\..\inc;\\r
+                  ..\..\..\inc\user;..\..\..\inc\user\linux;\r
 \r
 USER_C_FLAGS = $(USER_C_FLAGS) -DEXPORT_IBUM_SYMBOLS\r
 \r
index f8c7c854a2adf3811a3906a8d14bfd053c399171..c62d745abb3799be26120c9edc89737732fec73f 100644 (file)
@@ -14,7 +14,8 @@ SOURCES =                     \
        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
index 8de70ed489ca172a619447a2cf7cc2801d636376..e4d74d6e52da6b07033a5af438370444b7c24477 100644 (file)
@@ -14,7 +14,8 @@ SOURCES =                     \
        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
index c84ae84c3b6aa216fc8c611c5762f83ec2f98e99..463261f1048a781c4578484eb1c244b485d82cc9 100644 (file)
@@ -14,7 +14,8 @@ SOURCES =                     \
        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
index 5cdce283289514432fc0a810569208a90e25d165..b52779488521c50e543236d8c9d00b37bccc3c64 100644 (file)
@@ -14,7 +14,8 @@ SOURCES =                     \
        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
index 780f938e2f1d4bdefbdb60c965f6f018d59e2d52..25584e5927559cf1079ccb30c9a7e545faaea36c 100644 (file)
@@ -37,7 +37,7 @@
 \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
@@ -53,18 +53,6 @@ typedef unsigned __int16     uint16_t;
 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
@@ -1136,6 +1124,9 @@ int ibvw_get_windata(struct ibvw_windata *windata, int version);
 __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
index 67707a55834d5defbd2ce9321ee7e2debd563c42..48fc8bc26a69e769f12aea2b8e9cce387ffe77cb 100644 (file)
@@ -53,4 +53,5 @@ ibv_port_state_str
 ibv_event_type_str\r
 ibvw_get_windata\r
 ibvw_release_windata\r
+ibvw_wv_errno\r
 #endif\r
index 76216e06433c3788b2674e1cb9137beff7ee964c..c6f4b73fc059549fce769e12f8da51d992ac64ce 100644 (file)
@@ -28,6 +28,8 @@
  */\r
 \r
 #include <windows.h>\r
+#include <rdma/wvstatus.h>\r
+#include <_errno.h>\r
 \r
 extern CRITICAL_SECTION lock;\r
 HANDLE heap;\r
index 849f8aeb35e0cad558a9308b929735fb1236bd9b..8aa407de56b55478c99e70bc3997ab46227b54da 100644 (file)
@@ -83,7 +83,7 @@ static int ibv_find_gid_index(struct ibv_context *context, uint8_t port_num,
                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
@@ -140,7 +140,7 @@ int ibv_query_device(struct ibv_context *context,
 \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
@@ -208,7 +208,7 @@ int ibv_query_port(struct ibv_context *context, uint8_t port_num,
        \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
@@ -238,14 +238,14 @@ __declspec(dllexport)
 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
@@ -311,7 +311,7 @@ int ibv_dereg_mr(struct ibv_mr *mr)
        if (SUCCEEDED(hr)) {\r
                delete mr;\r
        }\r
-       return hr;\r
+       return ibvw_wv_errno(hr);\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -386,7 +386,7 @@ int ibv_resize_cq(struct ibv_cq *cq, int cqe)
        if (SUCCEEDED(hr)) {\r
                cq->cqe = (int) entries;\r
        }\r
-       return hr;\r
+       return ibvw_wv_errno(hr);\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -407,7 +407,7 @@ int ibv_req_notify_cq(struct ibv_cq *cq, int solicited_only)
        } else {\r
                hr = 0;\r
        }\r
-       return hr;\r
+       return ibvw_wv_errno(hr);\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -506,7 +506,7 @@ int ibv_modify_srq(struct ibv_srq *srq,
                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
@@ -522,7 +522,7 @@ int ibv_post_srq_recv(struct ibv_srq *srq,
                                                                          (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
@@ -533,7 +533,7 @@ int ibv_query_srq(struct ibv_srq *srq, struct ibv_srq_attr *srq_attr)
 \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
@@ -626,7 +626,7 @@ int ibv_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
 \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
@@ -725,7 +725,7 @@ int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
                qp->state = attr->qp_state;\r
        }\r
 \r
-       return hr;\r
+       return ibvw_wv_errno(hr);\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -737,7 +737,7 @@ int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,
        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
@@ -778,7 +778,7 @@ int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,
                }\r
        }\r
 \r
-       return hr;\r
+       return ibvw_wv_errno(hr);\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -791,7 +791,7 @@ int ibv_post_recv(struct ibv_qp *qp, struct ibv_recv_wr *wr,
                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
@@ -890,11 +890,41 @@ int ibv_destroy_ah(struct ibv_ah *ah)
 __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
index cfe59ff21ad4d236b2631890f6cb46ed9bb71901..396635f2305acfbfa24fef59b35e5995103b0792 100644 (file)
@@ -12,7 +12,8 @@ USE_IOSTREAM = 1
 \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
index 7b9a6e0e5792dc56104da7dd1d829e32759bd852..0fd481c4b4171c965403857db98830dcabcfd003 100644 (file)
@@ -626,6 +626,9 @@ int rdma_set_option(struct rdma_cm_id *id, int level, int optname,
 __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
index 3a771696e0470db7bb051d63fca89b75527d7916..6a8418a0b1293ecf00264bdb8abafbf046ca12bc 100644 (file)
@@ -21,7 +21,8 @@ SOURCES =                     \
        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
index 40e741136b9a0f2e4be8859024593033c69b21b7..53bf25fedbdf0e974beaeb41448383e79b1dcd9d 100644 (file)
@@ -244,15 +244,16 @@ int rdma_create_id(struct rdma_event_channel *channel,
 {\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
@@ -269,6 +270,7 @@ int rdma_create_id(struct rdma_event_channel *channel,
                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
@@ -364,11 +366,12 @@ static int ucma_query_connect(struct rdma_cm_id *id, struct rdma_conn_param *par
        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
@@ -388,9 +391,9 @@ static int ucma_query_connect(struct rdma_cm_id *id, struct rdma_conn_param *par
        }\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
@@ -405,6 +408,7 @@ static int ucma_query_datagram(struct rdma_cm_id *id, struct rdma_ud_param *para
        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
@@ -427,9 +431,9 @@ static int ucma_query_datagram(struct rdma_cm_id *id, struct rdma_ud_param *para
        }\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
@@ -441,24 +445,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
 {\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
@@ -470,6 +479,7 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
        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
@@ -480,21 +490,21 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
                                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
@@ -516,14 +526,14 @@ int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms)
        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
@@ -547,7 +557,7 @@ static int ucma_modify_qp_init(struct cma_id_private *id_priv, struct ibv_qp *qp
                                                                           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
@@ -638,11 +648,12 @@ int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
        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
@@ -663,7 +674,7 @@ int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
                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
@@ -673,17 +684,18 @@ static int ucma_get_request(struct cma_id_private *listen, int index)
 {\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
@@ -701,6 +713,7 @@ static int ucma_get_request(struct cma_id_private *listen, int index)
                                                                                                &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
@@ -716,7 +729,7 @@ err1:
        if (id_priv != NULL) {\r
                rdma_destroy_id(&id_priv->id);\r
        }\r
-       return hr;\r
+       return ret;\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -724,7 +737,7 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
 {\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
@@ -743,13 +756,13 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
        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
@@ -762,11 +775,12 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
        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
@@ -787,7 +801,7 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
                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
@@ -804,7 +818,7 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data,
        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
@@ -829,7 +843,7 @@ int rdma_disconnect(struct rdma_cm_id *id)
        }\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
@@ -861,12 +875,12 @@ static int ucma_process_conn_req(struct cma_event *event)
 \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
@@ -885,7 +899,7 @@ static int ucma_process_conn_resp(struct cma_event *event)
        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
@@ -902,7 +916,7 @@ static int ucma_process_conn_resp(struct cma_event *event)
                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
@@ -916,12 +930,12 @@ static void ucma_process_establish(struct cma_event *event)
 {\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
@@ -938,7 +952,7 @@ static int ucma_process_event(struct cma_event *event)
 {\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
@@ -948,7 +962,7 @@ static int ucma_process_event(struct cma_event *event)
                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
@@ -962,7 +976,7 @@ static int ucma_process_event(struct cma_event *event)
                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
@@ -977,11 +991,11 @@ static int ucma_process_event(struct cma_event *event)
                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
@@ -1028,13 +1042,15 @@ __declspec(dllexport)
 int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,\r
                                                void *context)\r
 {\r
-       return WV_NOT_SUPPORTED;\r
+       _set_errno(ENOSYS);\r
+       return -1;\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
+       _set_errno(ENOSYS);\r
+       return -1;\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -1082,7 +1098,8 @@ __declspec(dllexport)
 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
+       _set_errno(ENOSYS);\r
+       return -1;\r
 }\r
 \r
 __declspec(dllexport)\r
@@ -1091,3 +1108,39 @@ int rdma_migrate_id(struct rdma_cm_id *id, struct rdma_event_channel *channel)
        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
index 853173b38ff37f6c897a9efc319a7f89b7566ba8..a8fe8f312ab538f124133d9bbb261d9c0097ae4b 100644 (file)
@@ -30,4 +30,5 @@ rdma_free_devices
 rdma_event_str\r
 rdma_set_option\r
 rdma_migrate_id\r
+rdmaw_wsa_errno\r
 #endif\r