From 68963a38aae4ef241b59935aed52c3c8248cc101 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Thu, 15 Apr 2010 17:05:21 +0000 Subject: [PATCH] OFED compat: convert return values to errno 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 git-svn-id: svn://openib.tc.cornell.edu/gen1@2786 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- 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 +- .../libibverbs/examples/asyncwatch/SOURCES | 3 +- .../libibverbs/examples/rc_pingpong/SOURCES | 3 +- .../libibverbs/examples/uc_pingpong/SOURCES | 3 +- .../libibverbs/examples/ud_pingpong/SOURCES | 3 +- .../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 100644 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 100644 index 00000000..c3e59598 --- /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 + +/* 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 f0bbf0e4..1fedb20e 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 c1e26ada..ab37d719 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 0c28233c..fbf699fb 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 2aebbe01..c354d5a1 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 907bcfb1..382d17ad 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 e92f25b7..92e2f546 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 4e7a5a16..8b7426d7 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 f869ff1a..6e948e27 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 d6b97a2d..0c3764bb 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 6e4ad30c..2129e277 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 7eecf48a..a2b5dce4 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 1d53cf29..971ca4c1 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 f8c7c854..c62d745a 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 8de70ed4..e4d74d6e 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 c84ae84c..463261f1 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 5cdce283..b5277948 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 780f938e..25584e59 100644 --- a/trunk/ulp/libibverbs/include/infiniband/verbs.h +++ b/trunk/ulp/libibverbs/include/infiniband/verbs.h @@ -37,7 +37,7 @@ #include #include -#include +#include <_errno.h> #include #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 67707a55..48fc8bc2 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 76216e06..c6f4b73f 100644 --- a/trunk/ulp/libibverbs/src/ibv_main.cpp +++ b/trunk/ulp/libibverbs/src/ibv_main.cpp @@ -28,6 +28,8 @@ */ #include +#include +#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 849f8aeb..8aa407de 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 cfe59ff2..396635f2 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 7b9a6e0e..0fd481c4 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 3a771696..6a8418a0 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 40e74113..53bf25fe 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 853173b3..a8fe8f31 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 -- 2.46.0