Made ibwrapper compilable.
[vlendec/samba-autobuild/.git] / ctdb / ib / ibwrapper.c
index 268469d9e1943d0f7ecc8fe29deb43702a3023bb..998a0167d7ffbe3fe6d6025afa5cafd04275c634 100644 (file)
@@ -21,8 +21,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include "ibwrapper.h"
-
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <sys/socket.h>
 #include <netdb.h>
 #include <arpa/inet.h>
+#include <malloc.h>
+#include <assert.h>
+#include <unistd.h>
 
-#include <rdma/rdma_cma.h>
+#include "includes.h"
 #include "lib/events/events.h"
+#include "ibwrapper.h"
+
+#include <rdma/rdma_cma.h>
 
 #include "ibwrapper_internal.h"
 #include "lib/util/dlinklist.h"
@@ -44,6 +48,8 @@ static char ibw_lasterr[IBW_LASTERR_BUFSIZE];
 
 static void ibw_event_handler_verbs(struct event_context *ev,
        struct fd_event *fde, uint16_t flags, void *private_data);
+static int ibw_fill_cq(struct ibw_conn *conn);
+
 
 static int ibw_init_memory(struct ibw_conn *conn)
 {
@@ -53,7 +59,7 @@ static int ibw_init_memory(struct ibw_conn *conn)
        int     i;
        struct ibw_wr   *p;
 
-       pconn->buf = memalign(pctx->page_size, pctx->max_msg_size);
+       pconn->buf = memalign(pctx->pagesize, pctx->max_msg_size);
        if (!pconn->buf) {
                sprintf(ibw_lasterr, "couldn't allocate work buf\n");
                return -1;
@@ -72,17 +78,14 @@ static int ibw_init_memory(struct ibw_conn *conn)
                p->msg = pconn->buf + (i * pctx->max_msg_size);
                p->wr_id = i;
 
-               DLIST_ADD(pconn->mr_list_avail, p);
+               DLIST_ADD(pconn->wr_list_avail, p);
        }
 
        return 0;
 }
 
-static int ibw_ctx_priv_destruct(void *ptr)
+static int ibw_ctx_priv_destruct(struct ibw_ctx_priv *pctx)
 {
-       struct ibw_ctx *pctx = talloc_get_type(ctx->internal, struct ibw_ctx_priv);
-       assert(pctx!=NULL);
-
        if (pctx->pd) {
                ibv_dealloc_pd(pctx->pd);
                pctx->pd = NULL;
@@ -102,21 +105,17 @@ static int ibw_ctx_priv_destruct(void *ptr)
                rdma_destroy_id(pctx->cm_id);
                pctx->cm_id = NULL;
        }
+
+       return 0;
 }
 
-static int ibw_ctx_destruct(void *ptr)
+static int ibw_ctx_destruct(struct ibw_ctx *ctx)
 {
-       struct ibw_ctx *ctx = talloc_get_type(ptr, struct ibw_ctx);
-       assert(ctx!=NULL);
-
        return 0;
 }
 
-static int ibw_conn_priv_destruct(void *ptr)
+static int ibw_conn_priv_destruct(struct ibw_conn_priv *pconn)
 {
-       struct ibw_conn *pconn = talloc_get_type(ptr, struct ibw_conn_priv);
-       assert(pconn!=NULL);
-
        /* free memory regions */
        if (pconn->mr) {
                ibv_dereg_mr(pconn->mr);
@@ -132,8 +131,8 @@ static int ibw_conn_priv_destruct(void *ptr)
 
        /* destroy verbs */
        if (pconn->cm_id->qp) {
-               ibv_destroy_qp(pconn->qp);
-               pconn->qp = NULL;
+               ibv_destroy_qp(pconn->cm_id->qp);
+               pconn->cm_id->qp = NULL;
        }
        if (pconn->cq) {
                ibv_destroy_cq(pconn->cq);
@@ -149,21 +148,16 @@ static int ibw_conn_priv_destruct(void *ptr)
                pconn->verbs_channel_event = NULL;
        }
        if (pconn->cm_id) {
-               rdma_destroy_id(pctx->cm_id);
-               pctx->cm_id = NULL;
+               rdma_destroy_id(pconn->cm_id);
+               pconn->cm_id = NULL;
        }
+       return 0;
 }
 
-static int ibw_conn_destruct(void *ptr)
+static int ibw_conn_destruct(struct ibw_conn *conn)
 {
-       struct ibw_conn *conn = talloc_get_type(ptr, struct ibw_conn);
-       struct ibw_ctx  *ctx;
-
-       assert(conn!=NULL);
-       ctx = ibw_conn->ctx;
-       assert(ctx!=NULL);
-
-       DLIST_REMOVE(ctx->conn_list, conn);
+       /* important here: ctx is a talloc _parent_ */
+       DLIST_REMOVE(conn->ctx->conn_list, conn);
        return 0;
 }
 
@@ -174,11 +168,11 @@ static struct ibw_conn *ibw_conn_new(struct ibw_ctx *ctx)
 
        conn = talloc_zero(ctx, struct ibw_conn);
        assert(conn!=NULL);
-       talloc_set_destructor(conn, struct ibw_conn_destruct);
+       talloc_set_destructor(conn, ibw_conn_destruct);
 
        pconn = talloc_zero(ctx, struct ibw_conn_priv);
        assert(pconn!=NULL);
-       talloc_set_destructor(pconn, struct ibw_conn_priv_destruct);
+       talloc_set_destructor(pconn, ibw_conn_priv_destruct);
 
        conn->ctx = ctx;
 
@@ -202,17 +196,17 @@ static int ibw_setup_cq_qp(struct ibw_conn *conn)
        pconn->verbs_channel = ibv_create_comp_channel(pconn->cm_id->verbs);
        if (!pconn->verbs_channel) {
                sprintf(ibw_lasterr, "ibv_create_comp_channel failed %d\n", errno);
-               goto cleanup;
+               return -1;
        }
-       DEBUG(10, "created channel %p\n", pconn->channel);
+       DEBUG(10, ("created channel %p\n", pconn->verbs_channel));
 
        pconn->verbs_channel_event = event_add_fd(pctx->ectx, conn,
                pconn->verbs_channel->fd, EVENT_FD_READ, ibw_event_handler_verbs, conn);
 
        /* init cq */
-       pconn->cq = ibv_create_cq(conn->cm_id->verbs, pctx->qsize,
+       pconn->cq = ibv_create_cq(pconn->cm_id->verbs, pctx->qsize,
                conn, pconn->verbs_channel, 0);
-       if (cq==NULL) {
+       if (pconn->cq==NULL) {
                sprintf(ibw_lasterr, "ibv_create_cq failed\n");
                return -1;
        }
@@ -233,21 +227,21 @@ static int ibw_setup_cq_qp(struct ibw_conn *conn)
        init_attr.send_cq = pconn->cq;
        init_attr.recv_cq = pconn->cq;
 
-       rc = rdma_create_qp(conn->cm_id, pctx->pd, &init_attr);
+       rc = rdma_create_qp(pconn->cm_id, pctx->pd, &init_attr);
        if (rc) {
-               sprintf(ibw_lasterr, "rdma_create_qp (%d) failed with %d\n", is_server, rc);
+               sprintf(ibw_lasterr, "rdma_create_qp failed with %d\n", rc);
                return rc;
        }
        /* elase result is in pconn->cm_id->qp */
 
-       return rc;
+       return ibw_fill_cq(conn);
 }
 
 static int ibw_refill_cq_recv(struct ibw_conn *conn)
 {
        struct ibw_ctx_priv *pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
        struct ibw_conn_priv *pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
-       int     i, rc;
+       int     rc;
        struct ibv_sge list = {
                .addr   = (uintptr_t) NULL,
                .length = pctx->max_msg_size,
@@ -262,19 +256,19 @@ static int ibw_refill_cq_recv(struct ibw_conn *conn)
        struct ibw_wr   *p = pconn->wr_list_avail;
 
        if (p==NULL) {
-               sprintf(ibw_last_err, "out of wr_list_avail");
-               DEBUG(0, ibw_last_err);
+               sprintf(ibw_lasterr, "out of wr_list_avail");
+               DEBUG(0, (ibw_lasterr));
                return -1;
        }
        DLIST_REMOVE(pconn->wr_list_avail, p);
        DLIST_ADD(pconn->wr_list_used, p);
-       list.addr = p->msg;
+       list.addr = (uintptr_t) p->msg;
        wr.wr_id = p->wr_id;
 
-       rc = ibv_post_recv(pconn->qp, &wr, &bad_wr);
+       rc = ibv_post_recv(pconn->cm_id->qp, &wr, &bad_wr);
        if (rc) {
                sprintf(ibw_lasterr, "ibv_post_recv failed with %d\n", rc);
-               DEBUG(0, ibw_last_err);
+               DEBUG(0, (ibw_lasterr));
                return -2;
        }
 
@@ -302,19 +296,19 @@ static int ibw_fill_cq(struct ibw_conn *conn)
        for(i = pctx->opts.max_recv_wr; i!=0; i--) {
                p = pconn->wr_list_avail;
                if (p==NULL) {
-                       sprintf(ibw_last_err, "out of wr_list_avail");
-                       DEBUG(0, ibw_last_err);
+                       sprintf(ibw_lasterr, "out of wr_list_avail");
+                       DEBUG(0, (ibw_lasterr));
                        return -1;
                }
                DLIST_REMOVE(pconn->wr_list_avail, p);
                DLIST_ADD(pconn->wr_list_used, p);
-               list.addr = p->msg;
+               list.addr = (uintptr_t) p->msg;
                wr.wr_id = p->wr_id;
 
-               rc = ibv_post_recv(pconn->qp, &wr, &bad_wr);
+               rc = ibv_post_recv(pconn->cm_id->qp, &wr, &bad_wr);
                if (rc) {
                        sprintf(ibw_lasterr, "ibv_post_recv failed with %d\n", rc);
-                       DEBUG(0, ibw_last_err);
+                       DEBUG(0, (ibw_lasterr));
                        return -2;
                }
        }
@@ -365,15 +359,14 @@ static void ibw_event_handler_cm(struct event_context *ev,
        }
        cma_id = event->id;
 
-       DEBUG(10, "cma_event type %d cma_id %p (%s)\n", event->event, id,
-                 (cma_id == ctx->cm_id) ? "parent" : "child");
+       DEBUG(10, ("cma_event type %d cma_id %p (%s)\n", event->event, cma_id,
+                 (cma_id == pctx->cm_id) ? "parent" : "child"));
 
        switch (event->event) {
        case RDMA_CM_EVENT_ADDR_RESOLVED:
                /* continuing from ibw_connect ... */
                rc = rdma_resolve_route(cma_id, 2000);
                if (rc) {
-                       ctx->state = ERROR;
                        sprintf(ibw_lasterr, "rdma_resolve_route error %d\n", rc);
                        goto error;
                }
@@ -397,7 +390,7 @@ static void ibw_event_handler_cm(struct event_context *ev,
                pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
                pconn->cm_id = cma_id; /* !!! event will be freed but id not */
                cma_id->context = (void *)conn;
-               DEBUG(10, "pconn->cm_id %p\n", pconn->cm_id);
+               DEBUG(10, ("pconn->cm_id %p\n", pconn->cm_id));
 
                conn->state = IBWC_INIT;
                pctx->connstate_func(ctx, conn);
@@ -405,9 +398,9 @@ static void ibw_event_handler_cm(struct event_context *ev,
                /* continued at ibw_accept when invoked by the func above */
                if (!pconn->is_accepted) {
                        talloc_free(conn);
-                       DEBUG(10, "pconn->cm_id %p wasn't accepted\n", pconn->cm_id);
+                       DEBUG(10, ("pconn->cm_id %p wasn't accepted\n", pconn->cm_id));
                } else {
-                       if (ibw_setup_cq_qp(ctx, conn))
+                       if (ibw_setup_cq_qp(conn))
                                goto error;
                }
 
@@ -420,7 +413,7 @@ static void ibw_event_handler_cm(struct event_context *ev,
 
        case RDMA_CM_EVENT_ESTABLISHED:
                /* expected after ibw_accept and ibw_connect[not directly] */
-               DEBUG(0, "ESTABLISHED (conn: %u)\n", cma_id->context);
+               DEBUG(0, ("ESTABLISHED (conn: %u)\n", (unsigned int)cma_id->context));
                conn = talloc_get_type(cma_id->context, struct ibw_conn);
                assert(conn!=NULL); /* important assumption */
 
@@ -440,8 +433,8 @@ static void ibw_event_handler_cm(struct event_context *ev,
                goto error;
 
        case RDMA_CM_EVENT_DISCONNECTED:
-               if (cma_id!=ctx->cm_id) {
-                       DEBUG(0, "client DISCONNECT event\n");
+               if (cma_id!=pctx->cm_id) {
+                       DEBUG(0, ("client DISCONNECT event\n"));
                        conn = talloc_get_type(cma_id->context, struct ibw_conn);
                        conn->state = IBWC_DISCONNECTED;
                        pctx->connstate_func(NULL, conn);
@@ -450,9 +443,9 @@ static void ibw_event_handler_cm(struct event_context *ev,
 
                        /* if we are the last... */
                        if (ctx->conn_list==NULL)
-                               rdma_disconnect(ctx->cm_id);
+                               rdma_disconnect(pctx->cm_id);
                } else {
-                       DEBUG(0, "server DISCONNECT event\n");
+                       DEBUG(0, ("server DISCONNECT event\n"));
                        ctx->state = IBWS_STOPPED; /* ??? TODO: try it... */
                        /* talloc_free(ctx) should be called within or after this func */
                        pctx->connstate_func(ctx, NULL);
@@ -469,14 +462,14 @@ static void ibw_event_handler_cm(struct event_context *ev,
        }
 
        if ((rc=rdma_ack_cm_event(event))) {
-               sprintf(ibw_lasterr, "rdma_ack_cm_event failed with %d\n");
+               sprintf(ibw_lasterr, "rdma_ack_cm_event failed with %d\n", rc);
                goto error;
        }
 
        return;
 error:
-       DEBUG(0, "cm event handler: %s", ibw_lasterr);
-       if (cma_id!=ctx->cm_id) {
+       DEBUG(0, ("cm event handler: %s", ibw_lasterr));
+       if (cma_id!=pctx->cm_id) {
                conn = talloc_get_type(cma_id->context, struct ibw_conn);
                if (conn)
                        conn->state = IBWC_ERROR;
@@ -490,14 +483,14 @@ error:
 static void ibw_event_handler_verbs(struct event_context *ev,
        struct fd_event *fde, uint16_t flags, void *private_data)
 {
-       struct ibw_ctx  *conn = talloc_get_type(private_data, struct ibw_conn);
-       struct ibw_ctx_priv *pconn = talloc_get_type(conn->internal, struct ibw_ctx_priv);
-       struct ibw_ctx  *pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
+       struct ibw_conn *conn = talloc_get_type(private_data, struct ibw_conn);
+       struct ibw_conn_priv *pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
+       struct ibw_ctx_priv *pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
 
        struct ibv_wc wc;
        int rc;
 
-       rc = ibv_poll_cq(conn->cq, 1, &wc);
+       rc = ibv_poll_cq(pconn->cq, 1, &wc);
        if (rc!=1) {
                sprintf(ibw_lasterr, "ibv_poll_cq error %d\n", rc);
                goto error;
@@ -513,8 +506,8 @@ static void ibw_event_handler_verbs(struct event_context *ev,
                {
                        struct ibw_wr   *p;
        
-                       DEBUG(10, "send completion\n");
-                       assert(pconn->qp->qp_num==wc.qp_num);
+                       DEBUG(10, ("send completion\n"));
+                       assert(pconn->cm_id->qp->qp_num==wc.qp_num);
                        assert(wc.wr_id < pctx->qsize);
                        p = pconn->wr_index[wc.wr_id];
                        DLIST_REMOVE(pconn->wr_list_used, p);
@@ -523,25 +516,25 @@ static void ibw_event_handler_verbs(struct event_context *ev,
                break;
 
        case IBV_WC_RDMA_WRITE:
-               DEBUG(10, "rdma write completion\n");
+               DEBUG(10, ("rdma write completion\n"));
                break;
 
        case IBV_WC_RDMA_READ:
-               DEBUG(10, "rdma read completion\n");
+               DEBUG(10, ("rdma read completion\n"));
                break;
 
        case IBV_WC_RECV:
                {
                        struct ibw_wr   *p;
        
-                       assert(pconn->qp->qp_num==wc.qp_num);
+                       assert(pconn->cm_id->qp->qp_num==wc.qp_num);
                        assert(wc.wr_id < pctx->qsize);
                        p = pconn->wr_index[wc.wr_id];
        
                        DLIST_REMOVE(pconn->wr_list_used, p);
                        DLIST_ADD(pconn->wr_list_avail, p);
        
-                       DEBUG(10, "recv completion\n");
+                       DEBUG(10, ("recv completion\n"));
                        assert(wc.byte_len <= pctx->max_msg_size);
        
                        pctx->receive_func(conn, p->msg, wc.byte_len);
@@ -557,15 +550,15 @@ static void ibw_event_handler_verbs(struct event_context *ev,
 
        return;
 error:
-       DEBUG(0, ibw_lasterr);
-       conn->status = IBWC_ERROR;
+       DEBUG(0, (ibw_lasterr));
+       conn->state = IBWC_ERROR;
        pctx->connstate_func(NULL, conn);
 }
 
 static int ibw_process_init_attrs(struct ibw_initattr *attr, int nattr, struct ibw_opts *opts)
 {
-       int     i, mtu;
-       char *name, *value;
+       int     i;
+       const char *name, *value;
 
        opts->max_send_wr = 256;
        opts->max_recv_wr = 1024;
@@ -591,7 +584,7 @@ struct ibw_ctx *ibw_init(struct ibw_initattr *attr, int nattr,
        void *ctx_userdata,
        ibw_connstate_fn_t ibw_connstate,
        ibw_receive_fn_t ibw_receive,
-       event_content *ectx,
+       struct event_context *ectx,
        int max_msg_size)
 {
        struct ibw_ctx *ctx = talloc_zero(NULL, struct ibw_ctx);
@@ -604,7 +597,7 @@ struct ibw_ctx *ibw_init(struct ibw_initattr *attr, int nattr,
        assert(ctx!=NULL);
        ibw_lasterr[0] = '\0';
        talloc_set_destructor(ctx, ibw_ctx_destruct);
-       ctx->userdata = userdata;
+       ctx->ctx_userdata = ctx_userdata;
 
        pctx = talloc_zero(ctx, struct ibw_ctx_priv);
        talloc_set_destructor(pctx, ibw_ctx_priv_destruct);
@@ -617,7 +610,7 @@ struct ibw_ctx *ibw_init(struct ibw_initattr *attr, int nattr,
        pctx->ectx = ectx;
 
        /* process attributes */
-       if (ibw_process_init_attrs(attr, nattr, pctx->opts))
+       if (ibw_process_init_attrs(attr, nattr, &pctx->opts))
                goto cleanup;
 
        /* init cm */
@@ -636,15 +629,15 @@ struct ibw_ctx *ibw_init(struct ibw_initattr *attr, int nattr,
                sprintf(ibw_lasterr, "rdma_create_id error %d\n", rc);
                goto cleanup;
        }
-       DEBUG(10, "created cm_id %p\n", pctx->cm_id);
+       DEBUG(10, ("created cm_id %p\n", pctx->cm_id));
 
        /* init verbs */
-       pctx->pd = ibv_alloc_pd(pctx->cmid->verbs);
+       pctx->pd = ibv_alloc_pd(pctx->cm_id->verbs);
        if (!pctx->pd) {
                sprintf(ibw_lasterr, "ibv_alloc_pd failed %d\n", errno);
                goto cleanup;
        }
-       DEBUG(10, "created pd %p\n", pctx->pd);
+       DEBUG(10, ("created pd %p\n", pctx->pd));
 
        pctx->pagesize = sysconf(_SC_PAGESIZE);
        pctx->qsize = pctx->opts.max_send_wr + pctx->opts.max_recv_wr;
@@ -653,7 +646,7 @@ struct ibw_ctx *ibw_init(struct ibw_initattr *attr, int nattr,
        return ctx;
        /* don't put code here */
 cleanup:
-       DEBUG(0, ibw_lasterr);
+       DEBUG(0, (ibw_lasterr));
 
        if (ctx)
                talloc_free(ctx);
@@ -663,7 +656,6 @@ cleanup:
 
 int ibw_stop(struct ibw_ctx *ctx)
 {
-       struct ibw_ctx_priv *pctx = (struct ibw_ctx_priv *)ctx->internal;
        struct ibw_conn *p;
 
        for(p=ctx->conn_list; p!=NULL; p=p->next) {
@@ -684,10 +676,10 @@ int ibw_bind(struct ibw_ctx *ctx, struct sockaddr_in *my_addr)
        rc = rdma_bind_addr(pctx->cm_id, (struct sockaddr *) my_addr);
        if (rc) {
                sprintf(ibw_lasterr, "rdma_bind_addr error %d\n", rc);
-               DEBUG(0, ibw_lasterr);
+               DEBUG(0, (ibw_lasterr));
                return rc;
        }
-       DEBUG(10, "rdma_bind_addr successful\n");
+       DEBUG(10, ("rdma_bind_addr successful\n"));
 
        return 0;
 }
@@ -697,11 +689,11 @@ int ibw_listen(struct ibw_ctx *ctx, int backlog)
        struct ibw_ctx_priv *pctx = talloc_get_type(ctx->internal, struct ibw_ctx_priv);
        int     rc;
 
-       DEBUG_LOG("rdma_listen...\n");
+       DEBUG(10, ("rdma_listen...\n"));
        rc = rdma_listen(pctx->cm_id, backlog);
        if (rc) {
-               sprintf(ibw_lasterr, "rdma_listen failed: %d\n", ret);
-               DEBUG(0, ibw_lasterr);
+               sprintf(ibw_lasterr, "rdma_listen failed: %d\n", rc);
+               DEBUG(0, (ibw_lasterr));
                return rc;
        }       
 
@@ -710,9 +702,9 @@ int ibw_listen(struct ibw_ctx *ctx, int backlog)
 
 int ibw_accept(struct ibw_ctx *ctx, struct ibw_conn *conn, void *conn_userdata)
 {
-       struct ibw_ctx_priv *pctx = talloc_get_type(ctx->internal, struct ibw_ctx_priv);
        struct ibw_conn_priv *pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
        struct rdma_conn_param  conn_param;
+       int     rc;
 
        conn->conn_userdata = conn_userdata;
 
@@ -722,7 +714,7 @@ int ibw_accept(struct ibw_ctx *ctx, struct ibw_conn *conn, void *conn_userdata)
        rc = rdma_accept(pconn->cm_id, &conn_param);
        if (rc) {
                sprintf(ibw_lasterr, "rdma_accept failed %d\n", rc);
-               DEBUG(0, ibw_lasterr);
+               DEBUG(0, (ibw_lasterr));
                return -1;;
        }
 
@@ -737,6 +729,7 @@ int ibw_connect(struct ibw_ctx *ctx, struct sockaddr_in *serv_addr, void *conn_u
 {
        struct ibw_ctx_priv *pctx = talloc_get_type(ctx->internal, struct ibw_ctx_priv);
        struct ibw_conn *conn = NULL;
+       struct ibw_conn_priv *pconn = NULL;
        int     rc;
 
        conn = ibw_conn_new(ctx);
@@ -755,7 +748,7 @@ int ibw_connect(struct ibw_ctx *ctx, struct sockaddr_in *serv_addr, void *conn_u
        rc = rdma_resolve_addr(pconn->cm_id, NULL, (struct sockaddr *) &serv_addr, 2000);
        if (rc) {
                sprintf(ibw_lasterr, "rdma_resolve_addr error %d\n", rc);
-               DEBUG(0, ibw_lasterr);
+               DEBUG(0, (ibw_lasterr));
                return -1;
        }
 
@@ -764,13 +757,17 @@ int ibw_connect(struct ibw_ctx *ctx, struct sockaddr_in *serv_addr, void *conn_u
        return 0;
 }
 
-void ibw_disconnect(struct ibw_conn *conn)
+int ibw_disconnect(struct ibw_conn *conn)
 {
-       struct ibw_conn_priv *pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
-       struct ibw_ctx *ctx = conn->ctx;
-       struct ibw_ctx_priv *pctx = talloc_get_type(ctx->internal);
+       int     rc;
+       struct ibw_ctx_priv *pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
 
-       rdma_disconnect(pctx->cm_id);
+       rc = rdma_disconnect(pctx->cm_id);
+       if (rc) {
+               sprintf(ibw_lasterr, "ibw_disconnect failed with %d", rc);
+               DEBUG(0, (ibw_lasterr));
+               return rc;
+       }
 
        /* continued at RDMA_CM_EVENT_DISCONNECTED */
 
@@ -780,31 +777,31 @@ void ibw_disconnect(struct ibw_conn *conn)
 int ibw_alloc_send_buf(struct ibw_conn *conn, void **buf, void **key)
 {
        struct ibw_conn_priv *pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
-       struct ibw_ctx_priv *pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
-       struct ibw_wr *p = pctx->wr_list_avail;
+       struct ibw_wr *p = pconn->wr_list_avail;
 
        if (p==NULL) {
-               sprintf(ibw_last_err, "insufficient wr chunks\n");
+               sprintf(ibw_lasterr, "insufficient wr chunks\n");
                return -1;
        }
 
-       DLIST_REMOVE(pctx->wr_list_avail, p);
-       DLIST_ADD(pctx->wr_list_used, p);
+       DLIST_REMOVE(pconn->wr_list_avail, p);
+       DLIST_ADD(pconn->wr_list_used, p);
 
        *buf = (void *)p->msg;
        *key = (void *)p;
 
-       return pctx->buf;
+       return 0;
 }
 
 int ibw_send(struct ibw_conn *conn, void *buf, void *key, int n)
 {
-       struct ibw_ctx_priv pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
+       struct ibw_ctx_priv *pctx = talloc_get_type(conn->ctx->internal, struct ibw_ctx_priv);
+       struct ibw_conn_priv *pconn = talloc_get_type(conn->internal, struct ibw_conn_priv);
        struct ibw_wr *p = talloc_get_type(key, struct ibw_wr);
        struct ibv_sge list = {
                .addr   = (uintptr_t) p->msg,
                .length = n,
-               .lkey   = pctx->mr->lkey
+               .lkey   = pconn->mr->lkey
        };
        struct ibv_send_wr wr = {
                .wr_id      = p->wr_id,
@@ -818,10 +815,10 @@ int ibw_send(struct ibw_conn *conn, void *buf, void *key, int n)
        assert(p->msg==(char *)buf);
        assert(n<=pctx->max_msg_size);
 
-       return ibv_post_send(conn->qp, &wr, &bad_wr);
+       return ibv_post_send(pconn->cm_id->qp, &wr, &bad_wr);
 }
 
-const char *ibw_getLastError()
+const char *ibw_getLastError(void)
 {
        return ibw_lasterr;
 }