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
