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 <[email protected]>
---
This has been compiled tested only.

 trunk/inc/user/linux/_errno.h                     |   91 ++++++++++++
 trunk/tests/perftest/rdma_bw/SOURCES              |    3 
 trunk/tests/perftest/rdma_lat/SOURCES             |    3 
 trunk/tests/perftest/read_bw/SOURCES              |    3 
 trunk/tests/perftest/read_lat/SOURCES             |    3 
 trunk/tests/perftest/send_bw/SOURCES              |    3 
 trunk/tests/perftest/send_lat/SOURCES             |    3 
 trunk/tests/perftest/write_bw/SOURCES             |    4 -
 trunk/tests/perftest/write_lat/SOURCES            |    3 
 trunk/ulp/dapl2/dapl/openib_cma/SOURCES           |    2 
 trunk/ulp/dapl2/dapl/openib_scm/SOURCES           |    2 
 trunk/ulp/dapl2/dapl/openib_ucm/SOURCES           |    3 
 trunk/ulp/libibumad/src/Sources                   |    3 
 trunk/ulp/libibverbs/examples/asyncwatch/SOURCES  |    3 
 trunk/ulp/libibverbs/examples/rc_pingpong/SOURCES |    3 
 trunk/ulp/libibverbs/examples/uc_pingpong/SOURCES |    3 
 trunk/ulp/libibverbs/examples/ud_pingpong/SOURCES |    3 
 trunk/ulp/libibverbs/include/infiniband/verbs.h   |   17 +-
 trunk/ulp/libibverbs/src/ibv_exports.src          |    1 
 trunk/ulp/libibverbs/src/ibv_main.cpp             |    2 
 trunk/ulp/libibverbs/src/verbs.cpp                |   66 ++++++--
 trunk/ulp/librdmacm/examples/cmatose/SOURCES      |    3 
 trunk/ulp/librdmacm/include/rdma/rdma_cma.h       |    3 
 trunk/ulp/librdmacm/src/Sources                   |    3 
 trunk/ulp/librdmacm/src/cma.cpp                   |  165 ++++++++++++++-------
 trunk/ulp/librdmacm/src/cma_exports.src           |    1 
 26 files changed, 293 insertions(+), 106 deletions(-)
 create mode 100755 trunk/inc/user/linux/_errno.h

diff --git a/trunk/inc/user/linux/_errno.h b/trunk/inc/user/linux/_errno.h
new file mode 100755
index 0000000..c3e5959
--- /dev/null
+++ b/trunk/inc/user/linux/_errno.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2009 Intel Corp, Inc.  All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifndef __ERRNO_H_
+#define __ERRNO_H_
+
+#include <errno.h>
+
+/* provide defines missing in older errno.h */
+#ifndef EINVAL
+#define EINVAL          22
+#define ERANGE          34
+#define EILSEQ          42
+#define STRUNCATE       80
+#endif
+
+#ifndef EADDRINUSE
+#define EADDRINUSE      100
+#define EADDRNOTAVAIL   101
+#define EAFNOSUPPORT    102
+#define EALREADY        103
+#define EBADMSG         104
+#define ECANCELED       105
+#define ECONNABORTED    106
+#define ECONNREFUSED    107
+#define ECONNRESET      108
+#define EDESTADDRREQ    109
+#define EHOSTUNREACH    110
+#define EIDRM           111
+#define EINPROGRESS     112
+#define EISCONN         113
+#define ELOOP           114
+#define EMSGSIZE        115
+#define ENETDOWN        116
+#define ENETRESET       117
+#define ENETUNREACH     118
+#define ENOBUFS         119
+#define ENODATA         120
+#define ENOLINK         121
+#define ENOMSG          122
+#define ENOPROTOOPT     123
+#define ENOSR           124
+#define ENOSTR          125
+#define ENOTCONN        126
+#define ENOTRECOVERABLE 127
+#define ENOTSOCK        128
+#define ENOTSUP         129
+#define EOPNOTSUPP      130
+#define EOTHER          131
+#define EOVERFLOW       132
+#define EOWNERDEAD      133
+#define EPROTO          134
+#define EPROTONOSUPPORT 135
+#define EPROTOTYPE      136
+#define ETIME           137
+#define ETIMEDOUT       138
+#define ETXTBSY         139
+#define EWOULDBLOCK     140
+#endif
+
+#endif /* __ERRNO_H_ */
diff --git a/trunk/tests/perftest/rdma_bw/SOURCES 
b/trunk/tests/perftest/rdma_bw/SOURCES
index f0bbf0e..1fedb20 100644
--- a/trunk/tests/perftest/rdma_bw/SOURCES
+++ b/trunk/tests/perftest/rdma_bw/SOURCES
@@ -14,7 +14,8 @@ SOURCES = rdma_bw.rc rdma_bw.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
                   ..\..\..\ulp\librdmacm\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/tests/perftest/rdma_lat/SOURCES 
b/trunk/tests/perftest/rdma_lat/SOURCES
index c1e26ad..ab37d71 100644
--- a/trunk/tests/perftest/rdma_lat/SOURCES
+++ b/trunk/tests/perftest/rdma_lat/SOURCES
@@ -14,7 +14,8 @@ SOURCES = rdma_lat.rc rdma_lat.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
                   ..\..\..\ulp\librdmacm\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/tests/perftest/read_bw/SOURCES 
b/trunk/tests/perftest/read_bw/SOURCES
index 0c28233..fbf699f 100644
--- a/trunk/tests/perftest/read_bw/SOURCES
+++ b/trunk/tests/perftest/read_bw/SOURCES
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 SOURCES = read_bw.rc read_bw.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/tests/perftest/read_lat/SOURCES 
b/trunk/tests/perftest/read_lat/SOURCES
index 2aebbe0..c354d5a 100644
--- a/trunk/tests/perftest/read_lat/SOURCES
+++ b/trunk/tests/perftest/read_lat/SOURCES
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 SOURCES = read_lat.rc read_lat.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/tests/perftest/send_bw/SOURCES 
b/trunk/tests/perftest/send_bw/SOURCES
index 907bcfb..382d17a 100644
--- a/trunk/tests/perftest/send_bw/SOURCES
+++ b/trunk/tests/perftest/send_bw/SOURCES
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 SOURCES = send_bw.rc send_bw.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/tests/perftest/send_lat/SOURCES 
b/trunk/tests/perftest/send_lat/SOURCES
index e92f25b..92e2f54 100644
--- a/trunk/tests/perftest/send_lat/SOURCES
+++ b/trunk/tests/perftest/send_lat/SOURCES
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 SOURCES = send_lat.rc send_lat.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/tests/perftest/write_bw/SOURCES 
b/trunk/tests/perftest/write_bw/SOURCES
index 4e7a5a1..8b7426d 100644
--- a/trunk/tests/perftest/write_bw/SOURCES
+++ b/trunk/tests/perftest/write_bw/SOURCES
@@ -13,8 +13,8 @@ USE_IOSTREAM = 1
 SOURCES = write_bw.rc write_bw.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
-
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
        $(SDK_LIB_PATH)\advapi32.lib    \
diff --git a/trunk/tests/perftest/write_lat/SOURCES 
b/trunk/tests/perftest/write_lat/SOURCES
index f869ff1..6e948e2 100644
--- a/trunk/tests/perftest/write_lat/SOURCES
+++ b/trunk/tests/perftest/write_lat/SOURCES
@@ -13,7 +13,8 @@ USE_IOSTREAM = 1
 SOURCES = write_lat.rc write_lat.c ..\perftest.c
        
 INCLUDES = ..;..\..\..\ulp\libibverbs\include;\
-                  ..\..\..\inc;..\..\..\inc\user;
+                  ..\..\..\inc;..\..\..\inc\user;\
+                  ..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/ulp/dapl2/dapl/openib_cma/SOURCES 
b/trunk/ulp/dapl2/dapl/openib_cma/SOURCES
index d6b97a2..0c3764b 100644
--- a/trunk/ulp/dapl2/dapl/openib_cma/SOURCES
+++ b/trunk/ulp/dapl2/dapl/openib_cma/SOURCES
@@ -25,7 +25,7 @@ SOURCES = \
        cm.c
 
 INCLUDES = ..\include;..\openib_common;..\common;windows;..\..\dat\include;\
-                  ..\..\dat\udat\windows;..\udapl\windows;\
+                  
..\..\dat\udat\windows;..\udapl\windows;..\..\..\..\inc\user\linux;\
                   
..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;\
                   ..\..\..\librdmacm\include
 
diff --git a/trunk/ulp/dapl2/dapl/openib_scm/SOURCES 
b/trunk/ulp/dapl2/dapl/openib_scm/SOURCES
index 6e4ad30..2129e27 100644
--- a/trunk/ulp/dapl2/dapl/openib_scm/SOURCES
+++ b/trunk/ulp/dapl2/dapl/openib_scm/SOURCES
@@ -25,7 +25,7 @@ SOURCES = \
         cm.c
 
 INCLUDES = ..\include;..\openib_common\;..\common;windows;..\..\dat\include;\
-                  ..\..\dat\udat\windows;..\udapl\windows;\
+                  
..\..\dat\udat\windows;..\udapl\windows;..\..\..\..\inc\user\linux;\
                   
..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include
 
 DAPL_OPTS = -DEXPORT_DAPL_SYMBOLS -DDAT_EXTENSIONS -DSOCK_CM -DOPENIB 
-DCQ_WAIT_OBJECT
diff --git a/trunk/ulp/dapl2/dapl/openib_ucm/SOURCES 
b/trunk/ulp/dapl2/dapl/openib_ucm/SOURCES
index 7eecf48..a2b5dce 100644
--- a/trunk/ulp/dapl2/dapl/openib_ucm/SOURCES
+++ b/trunk/ulp/dapl2/dapl/openib_ucm/SOURCES
@@ -21,7 +21,8 @@ SOURCES = udapl.rc ..\dapl_common_src.c ..\dapl_udapl_src.c 
..\openib_common.c \
 
 INCLUDES = ..\include;..\openib_common\;..\common;windows;..\..\dat\include;\
                   ..\..\dat\udat\windows;..\udapl\windows;\
-                  
..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include
+                  
..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;\
+                  ..\..\..\..\inc\user\linux;
 
 DAPL_OPTS = -DEXPORT_DAPL_SYMBOLS -DDAT_EXTENSIONS -DOPENIB -DCQ_WAIT_OBJECT
 
diff --git a/trunk/ulp/libibumad/src/Sources b/trunk/ulp/libibumad/src/Sources
index 1d53cf2..971ca4c 100644
--- a/trunk/ulp/libibumad/src/Sources
+++ b/trunk/ulp/libibumad/src/Sources
@@ -21,7 +21,8 @@ SOURCES = \
        ibum_main.cpp   \
        umad.cpp
 
-INCLUDES = ..\include;..\..\libibverbs\include;..\..\..\inc;..\..\..\inc\user;
+INCLUDES = ..\include;..\..\libibverbs\include;..\..\..\inc;\
+                  ..\..\..\inc\user;..\..\..\inc\user\linux;
 
 USER_C_FLAGS = $(USER_C_FLAGS) -DEXPORT_IBUM_SYMBOLS
 
diff --git a/trunk/ulp/libibverbs/examples/asyncwatch/SOURCES 
b/trunk/ulp/libibverbs/examples/asyncwatch/SOURCES
index f8c7c85..c62d745 100644
--- a/trunk/ulp/libibverbs/examples/asyncwatch/SOURCES
+++ b/trunk/ulp/libibverbs/examples/asyncwatch/SOURCES
@@ -14,7 +14,8 @@ SOURCES =                     \
        asyncwatch.rc   \
        asyncwatch.c
        
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\
+                       ..\..\..\..\inc\user\linux
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/ulp/libibverbs/examples/rc_pingpong/SOURCES 
b/trunk/ulp/libibverbs/examples/rc_pingpong/SOURCES
index 8de70ed..e4d74d6 100644
--- a/trunk/ulp/libibverbs/examples/rc_pingpong/SOURCES
+++ b/trunk/ulp/libibverbs/examples/rc_pingpong/SOURCES
@@ -14,7 +14,8 @@ SOURCES =                     \
        rc_pingpong.rc  \
        rc_pingpong.c
        
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\
+                  ..\..\..\..\inc\user\linux
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/ulp/libibverbs/examples/uc_pingpong/SOURCES 
b/trunk/ulp/libibverbs/examples/uc_pingpong/SOURCES
index c84ae84..463261f 100644
--- a/trunk/ulp/libibverbs/examples/uc_pingpong/SOURCES
+++ b/trunk/ulp/libibverbs/examples/uc_pingpong/SOURCES
@@ -14,7 +14,8 @@ SOURCES =                     \
        uc_pingpong.rc  \
        uc_pingpong.c
        
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\
+                  ..\..\..\..\inc\user\linux
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/ulp/libibverbs/examples/ud_pingpong/SOURCES 
b/trunk/ulp/libibverbs/examples/ud_pingpong/SOURCES
index 5cdce28..b527794 100644
--- a/trunk/ulp/libibverbs/examples/ud_pingpong/SOURCES
+++ b/trunk/ulp/libibverbs/examples/ud_pingpong/SOURCES
@@ -14,7 +14,8 @@ SOURCES =                     \
        ud_pingpong.rc  \
        ud_pingpong.c
        
-INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\
+                  ..\..\..\..\inc\user\linux
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/ulp/libibverbs/include/infiniband/verbs.h 
b/trunk/ulp/libibverbs/include/infiniband/verbs.h
index 780f938..25584e5 100644
--- a/trunk/ulp/libibverbs/include/infiniband/verbs.h
+++ b/trunk/ulp/libibverbs/include/infiniband/verbs.h
@@ -37,7 +37,7 @@
 
 #include <windows.h>
 #include <rdma\winverbs.h>
-#include <errno.h>
+#include <_errno.h>
 #include <comp_channel.h>
 
 #ifdef __cplusplus
@@ -53,18 +53,6 @@ typedef unsigned __int16     uint16_t;
 typedef unsigned __int32       uint32_t;
 typedef unsigned __int64       uint64_t;
 
-#define EOVERFLOW              WV_BUFFER_OVERFLOW
-#define EISCONN                        WV_CONNECTION_ACTIVE
-#define ECONNREFUSED   WV_CONNECTION_REFUSED
-#define ETIMEDOUT              WV_TIMEOUT
-#define ENETUNREACH            WV_HOST_UNREACHABLE
-#define EADDRINUSE             WV_ADDRESS_ALREADY_EXISTS
-#define EALREADY               WV_IO_PENDING
-#define EAFNOSUPPORT   WV_INVALID_ADDRESS
-#define EWOULDBLOCK            WV_DEVICE_BUSY
-
-#define ECONNRESET             WSAECONNRESET
-
 union ibv_gid
 {
        uint8_t                 raw[16];
@@ -1136,6 +1124,9 @@ int ibvw_get_windata(struct ibvw_windata *windata, int 
version);
 __declspec(dllexport)
 void ibvw_release_windata(struct ibvw_windata *windata, int version);
 
+__declspec(dllexport)
+int ibvw_wv_errno(HRESULT hr);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/trunk/ulp/libibverbs/src/ibv_exports.src 
b/trunk/ulp/libibverbs/src/ibv_exports.src
index 67707a5..48fc8bc 100644
--- a/trunk/ulp/libibverbs/src/ibv_exports.src
+++ b/trunk/ulp/libibverbs/src/ibv_exports.src
@@ -53,4 +53,5 @@ ibv_port_state_str
 ibv_event_type_str
 ibvw_get_windata
 ibvw_release_windata
+ibvw_wv_errno
 #endif
diff --git a/trunk/ulp/libibverbs/src/ibv_main.cpp 
b/trunk/ulp/libibverbs/src/ibv_main.cpp
index 76216e0..c6f4b73 100644
--- a/trunk/ulp/libibverbs/src/ibv_main.cpp
+++ b/trunk/ulp/libibverbs/src/ibv_main.cpp
@@ -28,6 +28,8 @@
  */
 
 #include <windows.h>
+#include <rdma/wvstatus.h>
+#include <_errno.h>
 
 extern CRITICAL_SECTION lock;
 HANDLE heap;
diff --git a/trunk/ulp/libibverbs/src/verbs.cpp 
b/trunk/ulp/libibverbs/src/verbs.cpp
index 849f8ae..8aa407d 100644
--- a/trunk/ulp/libibverbs/src/verbs.cpp
+++ b/trunk/ulp/libibverbs/src/verbs.cpp
@@ -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);
        } while (!ret && memcmp(&sgid, gid, sizeof *gid));
 
-       return ret ? ret : i - 1;
+       return ret ? -1 : i - 1;
 }
 
 static void ibv_convert_ah_attr(struct ibv_context *context,
@@ -140,7 +140,7 @@ int ibv_query_device(struct ibv_context *context,
 
        hr = context->cmd_if->Query(&attr);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        sprintf(device_attr->fw_ver, "0x%I64x", attr.FwVersion);
@@ -208,7 +208,7 @@ int ibv_query_port(struct ibv_context *context, uint8_t 
port_num,
        
        hr = context->cmd_if->QueryPort(port_num, &attr);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        port_attr->state = (enum ibv_port_state) attr.State;
@@ -238,14 +238,14 @@ __declspec(dllexport)
 int ibv_query_gid(struct ibv_context *context, uint8_t port_num,
                                  int index, union ibv_gid *gid)
 {
-       return context->cmd_if->QueryGid(port_num, index, (WV_GID *) gid);
+       return ibvw_wv_errno(context->cmd_if->QueryGid(port_num, index, (WV_GID 
*) gid));
 }
 
 __declspec(dllexport)
 int ibv_query_pkey(struct ibv_context *context, uint8_t port_num,
                                   int index, uint16_t *pkey)
 {
-       return context->cmd_if->QueryPkey(port_num, (UINT16) index, pkey);
+       return ibvw_wv_errno(context->cmd_if->QueryPkey(port_num, (UINT16) 
index, pkey));
 }
 
 __declspec(dllexport)
@@ -311,7 +311,7 @@ int ibv_dereg_mr(struct ibv_mr *mr)
        if (SUCCEEDED(hr)) {
                delete mr;
        }
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -386,7 +386,7 @@ int ibv_resize_cq(struct ibv_cq *cq, int cqe)
        if (SUCCEEDED(hr)) {
                cq->cqe = (int) entries;
        }
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -407,7 +407,7 @@ int ibv_req_notify_cq(struct ibv_cq *cq, int solicited_only)
        } else {
                hr = 0;
        }
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -506,7 +506,7 @@ int ibv_modify_srq(struct ibv_srq *srq,
                attr.srq_limit = srq_attr->srq_limit;
        }
 
-       return srq->handle->Modify(attr.max_wr, attr.srq_limit);
+       return ibvw_wv_errno(srq->handle->Modify(attr.max_wr, attr.srq_limit));
 }
 
 __declspec(dllexport)
@@ -522,7 +522,7 @@ int ibv_post_srq_recv(struct ibv_srq *srq,
                                                                          
(WV_SGE *) (*bad_recv_wr)->sg_list,
                                                                          
(*bad_recv_wr)->num_sge);
        }
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -533,7 +533,7 @@ int ibv_query_srq(struct ibv_srq *srq, struct ibv_srq_attr 
*srq_attr)
 
        hr = srq->handle->Query(&max_wr, &max_sge, &srq_limit);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        srq_attr->max_wr = (uint32_t) max_wr;
@@ -626,7 +626,7 @@ int ibv_query_qp(struct ibv_qp *qp, struct ibv_qp_attr 
*attr,
 
        hr = qp->handle->Query(&wv_attr);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        /* ibv_qp exposes qp_num.  Save qp_num from query. */
@@ -725,7 +725,7 @@ int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr 
*attr,
                qp->state = attr->qp_state;
        }
 
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -737,7 +737,7 @@ int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,
        struct ibv_ah *ah;
 
        if ((qp->qp_type == IBV_QPT_UD) && (wr->next != NULL))
-               return WV_NOT_SUPPORTED;
+               return ibvw_wv_errno(WV_NOT_SUPPORTED);
 
        for (cur_wr = wr; cur_wr != NULL; cur_wr = cur_wr->next) {
                if (qp->qp_type == IBV_QPT_UD) {
@@ -778,7 +778,7 @@ int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,
                }
        }
 
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -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,
                                                                         
(*bad_wr)->num_sge);
        }
-       return hr;
+       return ibvw_wv_errno(hr);
 }
 
 __declspec(dllexport)
@@ -890,11 +890,41 @@ int ibv_destroy_ah(struct ibv_ah *ah)
 __declspec(dllexport)
 int ibv_attach_mcast(struct ibv_qp *qp, union ibv_gid *gid, uint16_t lid)
 {
-       return qp->ud_handle->AttachMulticast((WV_GID *) gid, lid, NULL);
+       return ibvw_wv_errno(qp->ud_handle->AttachMulticast((WV_GID *) gid, 
lid, NULL));
 }
 
 __declspec(dllexport)
 int ibv_detach_mcast(struct ibv_qp *qp, union ibv_gid *gid, uint16_t lid)
 {
-       return qp->ud_handle->DetachMulticast((WV_GID *) gid, lid, NULL);
+       return ibvw_wv_errno(qp->ud_handle->DetachMulticast((WV_GID *) gid, 
lid, NULL));
+}
+
+__declspec(dllexport)
+int ibvw_wv_errno(HRESULT hr)
+{
+       switch (hr) {
+       case WV_SUCCESS:                        return 0;
+       case WV_PENDING:                        _set_errno(EINPROGRESS); break;
+       case WV_IO_PENDING:                     _set_errno(EINPROGRESS); break;
+       case WV_TIMEOUT:                        _set_errno(ETIMEDOUT); break;
+       case WV_BUFFER_OVERFLOW:        _set_errno(EOVERFLOW); break;
+       case WV_DEVICE_BUSY:            _set_errno(EBUSY); break;
+       case WV_ACCESS_VIOLATION:       _set_errno(EACCES); break;
+       case WV_INVALID_HANDLE:         _set_errno(EINVAL); break;
+       case WV_INVALID_PARAMETER:      _set_errno(EINVAL); break;
+       case WV_NO_MEMORY:                      _set_errno(ENOMEM); break;
+       case WV_INSUFFICIENT_RESOURCES: _set_errno(ENOSPC); break;
+       case WV_IO_TIMEOUT:                     _set_errno(ETIMEDOUT); break;
+       case WV_NOT_SUPPORTED:          _set_errno(ENOSYS); break;
+       case WV_CANCELLED:                      _set_errno(ECANCELED); break;
+       case WV_INVALID_ADDRESS:        _set_errno(EADDRNOTAVAIL); break;
+       case WV_ADDRESS_ALREADY_EXISTS: _set_errno(EADDRINUSE); break;
+       case WV_CONNECTION_REFUSED:     _set_errno(ECONNREFUSED); break;
+       case WV_CONNECTION_INVALID:     _set_errno(ENOTCONN); break;
+       case WV_CONNECTION_ACTIVE:      _set_errno(EISCONN); break;
+       case WV_HOST_UNREACHABLE:       _set_errno(ENETUNREACH); break;
+       case WV_CONNECTION_ABORTED:     _set_errno(ECONNABORTED); break;
+       case WV_UNKNOWN_ERROR:          _set_errno(EIO); break;
+       }
+       return -1;
 }
diff --git a/trunk/ulp/librdmacm/examples/cmatose/SOURCES 
b/trunk/ulp/librdmacm/examples/cmatose/SOURCES
index cfe59ff..396635f 100644
--- a/trunk/ulp/librdmacm/examples/cmatose/SOURCES
+++ b/trunk/ulp/librdmacm/examples/cmatose/SOURCES
@@ -12,7 +12,8 @@ USE_IOSTREAM = 1
 
 SOURCES = cmatose.c
        
-INCLUDES = 
..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;
+INCLUDES = ..;..\..\include;..\..\..\..\inc;..\..\..\..\inc\user;\
+                  ..\..\..\libibverbs\include;..\..\..\..\inc\user\linux;
 
 TARGETLIBS =                                           \
        $(SDK_LIB_PATH)\kernel32.lib    \
diff --git a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h 
b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
index 7b9a6e0..0fd481c 100644
--- a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
+++ b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
@@ -626,6 +626,9 @@ int rdma_set_option(struct rdma_cm_id *id, int level, int 
optname,
 __declspec(dllexport)
 int rdma_migrate_id(struct rdma_cm_id *id, struct rdma_event_channel *channel);
 
+__declspec(dllexport)
+int rdmaw_wsa_errno(int wsa_err);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/trunk/ulp/librdmacm/src/Sources b/trunk/ulp/librdmacm/src/Sources
index 3a77169..6a8418a 100644
--- a/trunk/ulp/librdmacm/src/Sources
+++ b/trunk/ulp/librdmacm/src/Sources
@@ -21,7 +21,8 @@ SOURCES =                     \
        cma_main.cpp    \
        cma.cpp
 
-INCLUDES = ..\include;..\..\..\inc;..\..\..\inc\user;..\..\libibverbs\include
+INCLUDES = ..\include;..\..\..\inc;..\..\..\inc\user;..\..\libibverbs\include;\
+                  ..\..\..\inc\user\linux;
 
 USER_C_FLAGS = $(USER_C_FLAGS) -DEXPORT_CMA_SYMBOLS
 
diff --git a/trunk/ulp/librdmacm/src/cma.cpp b/trunk/ulp/librdmacm/src/cma.cpp
index 40e7411..53bf25f 100644
--- a/trunk/ulp/librdmacm/src/cma.cpp
+++ b/trunk/ulp/librdmacm/src/cma.cpp
@@ -244,15 +244,16 @@ int rdma_create_id(struct rdma_event_channel *channel,
 {
        struct cma_id_private *id_priv;
        HRESULT hr;
+       int ret;
 
-       hr = ucma_acquire();
-       if (hr) {
-               return hr;
+       ret = ucma_acquire();
+       if (ret) {
+               return ret;
        }
 
        id_priv = new struct cma_id_private;
        if (id_priv == NULL) {
-               hr = ENOMEM;
+               ret = ENOMEM;
                goto err1;
        }
 
@@ -269,6 +270,7 @@ int rdma_create_id(struct rdma_event_channel *channel,
                hr = 
windata.prov->CreateDatagramEndpoint(&id_priv->id.ep.datagram);
        }
        if (FAILED(hr)) {
+               ret = ibvw_wv_errno(hr);
                goto err2;
        }
 
@@ -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;
        WV_CONNECT_ATTRIBUTES attr;
        HRESULT hr;
+       int ret;
 
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
        hr = id->ep.connect->Query(&attr);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        RtlCopyMemory(&id->route.addr.src_addr, &attr.LocalAddress,
@@ -388,9 +391,9 @@ static int ucma_query_connect(struct rdma_cm_id *id, struct 
rdma_conn_param *par
        }
 
        if (id_priv->cma_dev == NULL && attr.Device.DeviceGuid != 0) {
-               hr = ucma_get_device(id_priv, attr.Device.DeviceGuid);
-               if (FAILED(hr)) {
-                       return hr;
+               ret = ucma_get_device(id_priv, attr.Device.DeviceGuid);
+               if (ret) {
+                       return ret;
                }
 
                id->route.addr.addr.ibaddr.pkey = attr.Device.Pkey;
@@ -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;
        WV_DATAGRAM_ATTRIBUTES attr;
        HRESULT hr;
+       int ret;
 
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
        hr = id->ep.datagram->Query(&attr);
@@ -427,9 +431,9 @@ static int ucma_query_datagram(struct rdma_cm_id *id, 
struct rdma_ud_param *para
        }
 
        if (id_priv->cma_dev == NULL && attr.Device.DeviceGuid != 0) {
-               hr = ucma_get_device(id_priv, attr.Device.DeviceGuid);
-               if (FAILED(hr))
-                       return hr;
+               ret = ucma_get_device(id_priv, attr.Device.DeviceGuid);
+               if (ret)
+                       return ret;
                id->route.addr.addr.ibaddr.pkey = attr.Device.Pkey;
                id_priv->id.port_num = attr.Device.PortNumber;
        }
@@ -441,24 +445,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr 
*addr)
 {
        struct cma_id_private *id_priv;
        HRESULT hr;
+       int ret;
 
        if (id->ps == RDMA_PS_TCP) {
                hr = id->ep.connect->BindAddress(addr);
                if (SUCCEEDED(hr)) {
-                       hr = ucma_query_connect(id, NULL);
+                       ret = ucma_query_connect(id, NULL);
+               } else {
+                       ret = ibvw_wv_errno(hr);
                }
        } else {
                hr = id->ep.datagram->BindAddress(addr);
                if (SUCCEEDED(hr)) {
-                       hr = ucma_query_datagram(id, NULL);
+                       ret = ucma_query_datagram(id, NULL);
+               } else {
+                       ret = ibvw_wv_errno(hr);
                }
        }
 
-       if (SUCCEEDED(hr)) {
+       if (!ret) {
                id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
                id_priv->state = cma_addr_bind;
        }
-       return hr;
+       return ret;
 }
 
 __declspec(dllexport)
@@ -470,6 +479,7 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct 
sockaddr *src_addr,
        SOCKET s;
        DWORD size;
        HRESULT hr;
+       int ret;
 
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
        if (id_priv->state == cma_idle) {
@@ -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);
                        }
                        if (s == INVALID_SOCKET) {
-                               return WSAGetLastError();
+                               return rdmaw_wsa_errno(WSAGetLastError());
                        }
 
                        hr = WSAIoctl(s, SIO_ROUTING_INTERFACE_QUERY, dst_addr, 
ucma_addrlen(dst_addr),
                                                  &addr, sizeof addr, &size, 
NULL, NULL);
                        closesocket(s);
                        if (FAILED(hr)) {
-                               return WSAGetLastError();
+                               return rdmaw_wsa_errno(WSAGetLastError());
                        }
                        src_addr = &addr.Sa;
                }
 
-               hr = rdma_bind_addr(id, src_addr);
-               if (FAILED(hr)) {
-                       return hr;
+               ret = rdma_bind_addr(id, src_addr);
+               if (ret) {
+                       return ret;
                }
        }
 
@@ -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,
                                                   &path, timeout_ms);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        hr = (id->ps == RDMA_PS_TCP) ?
                 id->ep.connect->Modify(WV_EP_OPTION_ROUTE, &path, sizeof path) 
:
                 id->ep.datagram->Modify(WV_EP_OPTION_ROUTE, &path, sizeof 
path);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
@@ -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,
                                                                           
&index);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        qp_attr.pkey_index = index;
@@ -638,11 +648,12 @@ int rdma_connect(struct rdma_cm_id *id, struct 
rdma_conn_param *conn_param)
        struct cma_id_private *id_priv;
        WV_CONNECT_PARAM attr;
        HRESULT hr;
+       int ret;
        
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
-       hr = ucma_valid_param(id_priv, conn_param);
-       if (FAILED(hr)) {
-               return hr;
+       ret = ucma_valid_param(id_priv, conn_param);
+       if (ret) {
+               return ret;
        }
 
        RtlZeroMemory(&attr, sizeof attr);
@@ -663,7 +674,7 @@ int rdma_connect(struct rdma_cm_id *id, struct 
rdma_conn_param *conn_param)
                id_priv->refcnt--;
                id->comp_entry.Busy = 0;
                id_priv->state = cma_route_resolve;
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        return 0;
@@ -673,17 +684,18 @@ static int ucma_get_request(struct cma_id_private 
*listen, int index)
 {
        struct cma_id_private *id_priv = NULL;
        HRESULT hr;
+       int ret;
 
        EnterCriticalSection(&lock);
        if (listen->state != cma_listening) {
-               hr = WV_INVALID_PARAMETER;
+               ret = ibvw_wv_errno(WV_INVALID_PARAMETER);
                goto err1;
        }
 
        InterlockedIncrement(&listen->refcnt);
-       hr = rdma_create_id(listen->id.channel, &listen->req_list[index],
+       ret = rdma_create_id(listen->id.channel, &listen->req_list[index],
                                                listen, listen->id.ps);
-       if (FAILED(hr)) {
+       if (ret) {
                goto err2;
        }
 
@@ -701,6 +713,7 @@ static int ucma_get_request(struct cma_id_private *listen, 
int index)
                                                                                
                &id_priv->id.comp_entry.Overlap);
        }
        if (FAILED(hr) && hr != WV_IO_PENDING) {
+               ret = ibvw_wv_errno(hr);
                id_priv->id.comp_entry.Busy = 0;
                id_priv->refcnt--;
                goto err2;
@@ -716,7 +729,7 @@ err1:
        if (id_priv != NULL) {
                rdma_destroy_id(&id_priv->id);
        }
-       return hr;
+       return ret;
 }
 
 __declspec(dllexport)
@@ -724,7 +737,7 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
 {
        struct cma_id_private *id_priv, *req_id;
        HRESULT hr;
-       int i;
+       int i, ret;
 
        if (backlog <= 0) {
                backlog = CMA_DEFAULT_BACKLOG;
@@ -743,13 +756,13 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
        hr = (id->ps == RDMA_PS_TCP) ?
                 id->ep.connect->Listen(backlog) : 
id->ep.datagram->Listen(backlog);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        for (i = 0; i < backlog; i++) {
-               hr = ucma_get_request(id_priv, i);
-               if (FAILED(hr)) {
-                       return hr;
+               ret = ucma_get_request(id_priv, i);
+               if (ret) {
+                       return ret;
                }
        }
 
@@ -762,11 +775,12 @@ int rdma_accept(struct rdma_cm_id *id, struct 
rdma_conn_param *conn_param)
        struct cma_id_private *id_priv;
        WV_CONNECT_PARAM attr;
        HRESULT hr;
+       int ret;
 
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
-       hr = ucma_valid_param(id_priv, conn_param);
-       if (FAILED(hr)) {
-               return hr;
+       ret = ucma_valid_param(id_priv, conn_param);
+       if (ret) {
+               return ret;
        }
 
        RtlZeroMemory(&attr, sizeof attr);
@@ -787,7 +801,7 @@ int rdma_accept(struct rdma_cm_id *id, struct 
rdma_conn_param *conn_param)
                id_priv->refcnt--;
                id->comp_entry.Busy = 0;
                id_priv->state = cma_disconnected;
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        return 0;
@@ -804,7 +818,7 @@ int rdma_reject(struct rdma_cm_id *id, const void 
*private_data,
        id_priv->state = cma_disconnected;
        hr = id->ep.connect->Reject(private_data, private_data_len);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
        return 0;
 }
@@ -829,7 +843,7 @@ int rdma_disconnect(struct rdma_cm_id *id)
        }
        hr = id->ep.connect->Disconnect(NULL);
        if (FAILED(hr)) {
-               return hr;
+               return ibvw_wv_errno(hr);
        }
 
        return 0;
@@ -861,12 +875,12 @@ static int ucma_process_conn_req(struct cma_event *event)
 
        ucma_get_request(listen, id_priv->index);
 
-       if (SUCCEEDED(event->event.status)) {
+       if (!event->event.status) {
                event->event.status = ucma_query_connect(&id_priv->id,
                                                                                
                 &event->event.param.conn);
        }
 
-       if (SUCCEEDED(event->event.status)) {
+       if (!event->event.status) {
                event->event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
                id_priv->state = cma_passive_connect;
                event->event.listen_id = &listen->id;
@@ -885,7 +899,7 @@ static int ucma_process_conn_resp(struct cma_event *event)
        WV_CONNECT_PARAM attr;
        HRESULT hr;
 
-       if (FAILED(event->event.status)) {
+       if (event->event.status) {
                goto err;
        }
 
@@ -902,7 +916,7 @@ static int ucma_process_conn_resp(struct cma_event *event)
                goto err;
        }
 
-       return WV_IO_PENDING;
+       return EINPROGRESS;
 
 err:
        event->event.event = (event->event.status == WV_REJECTED) ?
@@ -916,12 +930,12 @@ static void ucma_process_establish(struct cma_event 
*event)
 {
        struct cma_id_private *id_priv = event->id_priv;
 
-       if (SUCCEEDED(event->event.status)) {
+       if (!event->event.status) {
                event->event.status = ucma_query_connect(&id_priv->id,
                                                                                
                 &event->event.param.conn);
        }
 
-       if (SUCCEEDED(event->event.status)) {
+       if (!event->event.status) {
                event->event.event = RDMA_CM_EVENT_ESTABLISHED;
 
                id_priv->state = cma_connected;
@@ -938,7 +952,7 @@ static int ucma_process_event(struct cma_event *event)
 {
        struct cma_id_private *listen, *id_priv;
        WV_CONNECT_ATTRIBUTES attr;
-       HRESULT hr = 0;
+       int ret = 0;
 
        id_priv = event->id_priv;
 
@@ -948,7 +962,7 @@ static int ucma_process_event(struct cma_event *event)
                listen = (struct cma_id_private *) id_priv->id.context;
                if (listen->state != cma_listening) {
                        InterlockedDecrement(&id_priv->refcnt);
-                       hr = WV_CANCELLED;
+                       ret = ECANCELED;
                        break;
                }
 
@@ -962,7 +976,7 @@ static int ucma_process_event(struct cma_event *event)
                event->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
                break;
        case cma_active_connect:
-               hr = ucma_process_conn_resp(event);
+               ret = ucma_process_conn_resp(event);
                break;
        case cma_accepting:
                ucma_process_establish(event);
@@ -977,11 +991,11 @@ static int ucma_process_event(struct cma_event *event)
                break;
        default:
                InterlockedDecrement(&id_priv->refcnt);
-               hr = WV_CANCELLED;
+               ret = ECANCELED;
        }
        LeaveCriticalSection(&lock);
 
-       return hr;
+       return ret;
 }
 
 __declspec(dllexport)
@@ -1028,13 +1042,15 @@ __declspec(dllexport)
 int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
                                                void *context)
 {
-       return WV_NOT_SUPPORTED;
+       _set_errno(ENOSYS);
+       return -1;
 }
 
 __declspec(dllexport)
 int rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
 {
-       return WV_NOT_SUPPORTED;
+       _set_errno(ENOSYS);
+       return -1;
 }
 
 __declspec(dllexport)
@@ -1082,7 +1098,8 @@ __declspec(dllexport)
 int rdma_set_option(struct rdma_cm_id *id, int level, int optname,
                                        void *optval, size_t optlen)
 {
-       return WV_NOT_SUPPORTED;
+       _set_errno(ENOSYS);
+       return -1;
 }
 
 __declspec(dllexport)
@@ -1091,3 +1108,39 @@ int rdma_migrate_id(struct rdma_cm_id *id, struct 
rdma_event_channel *channel)
        id->channel = channel;
        return 0;
 }
+
+__declspec(dllexport)
+int rdmaw_wsa_errno(int wsa_err)
+{
+       switch (wsa_err) {
+       case 0:                                 return 0;
+       case WSAEWOULDBLOCK:    _set_errno(EWOULDBLOCK); break;
+       case WSAEINPROGRESS:    _set_errno(EINPROGRESS); break;
+       case WSAEALREADY:               _set_errno(EALREADY); break;
+       case WSAENOTSOCK:               _set_errno(ENOTSOCK); break;
+       case WSAEDESTADDRREQ:   _set_errno(EDESTADDRREQ); break;
+       case WSAEMSGSIZE:               _set_errno(EMSGSIZE); break;
+       case WSAEPROTOTYPE:             _set_errno(EPROTOTYPE); break;
+       case WSAENOPROTOOPT:    _set_errno(ENOPROTOOPT); break;
+       case WSAEPROTONOSUPPORT:_set_errno(EPROTONOSUPPORT); break;
+       case WSAEOPNOTSUPP:             _set_errno(EOPNOTSUPP); break;
+       case WSAEAFNOSUPPORT:   _set_errno(EAFNOSUPPORT); break;
+       case WSAEADDRINUSE:             _set_errno(EADDRINUSE); break;
+       case WSAEADDRNOTAVAIL:  _set_errno(EADDRNOTAVAIL); break;
+       case WSAENETDOWN:               _set_errno(ENETDOWN); break;
+       case WSAENETUNREACH:    _set_errno(ENETUNREACH); break;
+       case WSAENETRESET:              _set_errno(ENETRESET); break;
+       case WSAECONNABORTED:   _set_errno(ECONNABORTED); break;
+       case WSAECONNRESET:             _set_errno(ECONNRESET); break;
+       case WSAENOBUFS:                _set_errno(ENOBUFS); break;
+       case WSAEISCONN:                _set_errno(EISCONN); break;
+       case WSAENOTCONN:               _set_errno(ENOTCONN); break;
+       case WSAETIMEDOUT:              _set_errno(ETIMEDOUT); break;
+       case WSAECONNREFUSED:   _set_errno(ECONNREFUSED); break;
+       case WSAELOOP:                  _set_errno(ELOOP); break;
+       case WSAENAMETOOLONG:   _set_errno(ENAMETOOLONG); break;
+       case WSAEHOSTUNREACH:   _set_errno(EHOSTUNREACH); break;
+       case WSAENOTEMPTY:              _set_errno(ENOTEMPTY); break;
+       }
+       return -1;
+}
diff --git a/trunk/ulp/librdmacm/src/cma_exports.src 
b/trunk/ulp/librdmacm/src/cma_exports.src
index 853173b..a8fe8f3 100644
--- a/trunk/ulp/librdmacm/src/cma_exports.src
+++ b/trunk/ulp/librdmacm/src/cma_exports.src
@@ -30,4 +30,5 @@ rdma_free_devices
 rdma_event_str
 rdma_set_option
 rdma_migrate_id
+rdmaw_wsa_errno
 #endif


_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to