[openib-general] [PATCH] PUT after UNLOCK
Libor Michalek
libor at topspin.com
Fri Feb 25 10:35:35 PST 2005
On Tue, Feb 22, 2005 at 11:42:21AM +0200, Michael S. Tsirkin wrote:
> SDP_CONN_PUT was called before SDP_CONN_UNLOCK.
> If this is the last reference, the connection could be removed
> and an attempt to unlock would crash.
The conn_hold can be moved to after sdp_cm_connect() returns a
success result, which removes the need to call conn_put in case of
error. I'd also rather move it closer to the send_cm_req() request
which is the request that is really the reason for the increment
in reference.
In making that move a couple other functions then need to reflect
this change. Here's a patch which makes this update, and simplifies
the active connection sequence.
-Libor
Index: infiniband/ulp/sdp/sdp_inet.c
===================================================================
--- infiniband/ulp/sdp/sdp_inet.c (revision 1909)
+++ infiniband/ulp/sdp/sdp_inet.c (working copy)
@@ -590,8 +590,6 @@
conn->dst_addr = ntohl(addr->sin_addr.s_addr);
conn->dst_port = ntohs(addr->sin_port);
-
- sdp_conn_hold(conn); /* CM reference */
/*
* close, allow connection completion notification.
*/
@@ -610,8 +608,6 @@
sock->state = SS_UNCONNECTED;
conn->istate = SDP_SOCK_ST_CLOSED;
- sdp_conn_put(conn); /* CM reference */
-
goto done;
}
Index: infiniband/ulp/sdp/sdp_proto.h
===================================================================
--- infiniband/ulp/sdp/sdp_proto.h (revision 1908)
+++ infiniband/ulp/sdp/sdp_proto.h (working copy)
@@ -120,8 +120,6 @@
int sdp_wall_send_abort(struct sdp_opt *conn);
-int sdp_wall_recv_reject(struct sdp_opt *conn, int error);
-
int sdp_wall_recv_confirm(struct sdp_opt *conn);
int sdp_wall_recv_failed(struct sdp_opt *conn, int error);
@@ -334,6 +332,7 @@
struct ib_cm_event *event,
struct sdp_opt *conn);
+void sdp_cm_actv_error(struct sdp_opt *conn, int error);
/*
* passive connect functions
*/
@@ -351,10 +350,6 @@
int sdp_cm_reject(struct sdp_opt *conn);
-int sdp_cm_failed(struct sdp_opt *conn);
-
-int sdp_cm_confirm(struct sdp_opt *conn);
-
int sdp_recv_flush(struct sdp_opt *conn);
int sdp_send_flush(struct sdp_opt *conn);
Index: infiniband/ulp/sdp/sdp_actv.c
===================================================================
--- infiniband/ulp/sdp/sdp_actv.c (revision 1909)
+++ infiniband/ulp/sdp/sdp_actv.c (working copy)
@@ -37,7 +37,72 @@
/*
* Connection establishment functions
*/
+void sdp_cm_actv_error(struct sdp_opt *conn, int error)
+{
+ int result;
+ /*
+ * error value is positive error.
+ *
+ * Handle errors within active connections stream.
+ * First generate appropriate response, REJ, DREQ or nothing.
+ * Second the socket must be notified of the error.
+ */
+ switch (conn->state) {
+ default:
+ sdp_dbg_warn(conn, "REP error in unknown connection state");
+ case SDP_CONN_ST_REQ_PATH:
+ /*
+ * CM message was never sent.
+ */
+ conn->state = SDP_CONN_ST_CLOSED;
+ case SDP_CONN_ST_CLOSED:
+ break;
+ case SDP_CONN_ST_ERROR_STRM: /* socket has been destroyed. */
+ error = ECONNRESET;
+ case SDP_CONN_ST_REQ_SENT:
+ case SDP_CONN_ST_REP_RECV:
+ case SDP_CONN_ST_RTU_SENT:
+ /*
+ * All four states we have gotten a REP and are now in
+ * one of these states.
+ */
+ result = ib_send_cm_rej(conn->cm_id,
+ IB_CM_REJ_CONSUMER_DEFINED,
+ NULL, 0, NULL, 0);
+ if (0 > result)
+ sdp_dbg_warn(conn, "Error <%d> sending CM REJ.",
+ result);
+
+ conn->state = SDP_CONN_ST_CLOSED;
+ break;
+ case SDP_CONN_ST_ESTABLISHED:
+ /*
+ * Made it all the way to esablished, need to initiate a
+ * full disconnect.
+ */
+ result = ib_send_cm_dreq(conn->cm_id, NULL, 0);
+ if (0 > result)
+ sdp_dbg_warn(NULL, "Error <%d> sending CM DREQ",
+ result);
+
+ conn->state = SDP_CONN_ST_TIME_WAIT_1;
+ break;
+ }
+
+ SDP_CONN_SET_ERR(conn, error);
+ conn->istate = SDP_SOCK_ST_ERROR;
+ conn->shutdown = SHUTDOWN_MASK;
+ conn->send_buf = 0;
+
+ if (conn->sk->sk_socket)
+ conn->sk->sk_socket->state = SS_UNCONNECTED;
+
+ sdp_iocb_q_cancel_all(conn, (0 - error));
+ sdp_inet_wake_error(conn->sk);
+ return;
+}
+
/*
* _sdp_actv_conn_establish - process an accepted connection request.
*/
@@ -53,134 +118,97 @@
conn->dst_addr, conn->dst_port);
sk = conn->sk;
+
+ qp_attr = kmalloc(sizeof(*qp_attr), GFP_KERNEL);
+ if (!qp_attr)
+ return -ENOMEM;
/*
- * only reason not to confirm is if the connection state has changed
- * from under us, and the change wasn't followed up with a Abort(),
- * which it should have been.
+ * modify QP to RTR
*/
- if (SDP_SOCK_ST_CONNECT == conn->istate) {
- qp_attr = kmalloc(sizeof(*qp_attr), GFP_KERNEL);
- if (!qp_attr) {
- result = -ENOMEM;
- goto error;
- }
- /*
- * modify QP to RTR
- */
- qp_attr->qp_state = IB_QPS_RTR;
+ qp_attr->qp_state = IB_QPS_RTR;
- result = ib_cm_init_qp_attr(conn->cm_id, qp_attr, &attr_mask);
- if (result) {
- sdp_dbg_warn(conn, "Error <%d> QP attributes for RTR",
- result);
- goto error;
- }
+ result = ib_cm_init_qp_attr(conn->cm_id, qp_attr, &attr_mask);
+ if (result) {
+ sdp_dbg_warn(conn, "Error <%d> QP attributes for RTR", result);
+ goto done;
+ }
- qp_attr->min_rnr_timer = 0; /* IB_RNR_TIMER_122_88; */
- qp_attr->rq_psn = conn->rq_psn;
-
- attr_mask |= (IB_QP_MIN_RNR_TIMER | IB_QP_RQ_PSN);
+ qp_attr->min_rnr_timer = 0; /* IB_RNR_TIMER_122_88; */
+ qp_attr->rq_psn = conn->rq_psn;
+
+ attr_mask |= (IB_QP_MIN_RNR_TIMER | IB_QP_RQ_PSN);
- result = ib_modify_qp(conn->qp, qp_attr, attr_mask);
- if (result) {
- sdp_dbg_warn(conn, "Error <%d> QP modify to RTR",
- result);
- goto error;
- }
- /*
- * finalize connection acceptance.
- */
- SDP_CONN_ST_SET(conn, SDP_CONN_ST_RTU_SENT);
- /*
- * post receive buffers.
- */
- result = sdp_recv_flush(conn);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> posting recv buffers.",
- result);
- goto error;
- }
- /*
- * modify QP to RTS
- */
- qp_attr->qp_state = IB_QPS_RTS;
+ result = ib_modify_qp(conn->qp, qp_attr, attr_mask);
+ if (result) {
+ sdp_dbg_warn(conn, "Error <%d> QP modify to RTR", result);
+ goto done;
+ }
+ /*
+ * finalize connection acceptance.
+ */
+ SDP_CONN_ST_SET(conn, SDP_CONN_ST_RTU_SENT);
+ /*
+ * post receive buffers.
+ */
+ result = sdp_recv_flush(conn);
+ if (0 > result) {
+ sdp_dbg_warn(conn, "Error <%d> posting recv buffers.", result);
+ goto done;
+ }
+ /*
+ * modify QP to RTS
+ */
+ qp_attr->qp_state = IB_QPS_RTS;
- result = ib_cm_init_qp_attr(conn->cm_id, qp_attr, &attr_mask);
- if (result) {
- sdp_dbg_warn(conn, "Error <%d> QP attributes for RTS",
- result);
- goto error;
- }
+ result = ib_cm_init_qp_attr(conn->cm_id, qp_attr, &attr_mask);
+ if (result) {
+ sdp_dbg_warn(conn, "Error <%d> QP attributes for RTS", result);
+ goto done;
+ }
- result = ib_modify_qp(conn->qp, qp_attr, attr_mask);
- if (result) {
- sdp_dbg_warn(conn, "Error <%d> QP modify to RTS",
- result);
- goto error;
- }
- /*
- * respond to the remote connection manager with a RTU
- */
- result = sdp_cm_confirm(conn);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> CM connect confirm",
- result);
- goto error;
- }
- /*
- * wake the accepting connection
- */
- SDP_CONN_ST_SET(conn, SDP_CONN_ST_ESTABLISHED);
+ result = ib_modify_qp(conn->qp, qp_attr, attr_mask);
+ if (result) {
+ sdp_dbg_warn(conn, "Error <%d> QP modify to RTS", result);
+ goto done;
+ }
+ /*
+ * respond to the remote connection manager with a RTU
+ */
+ result = ib_send_cm_rtu(conn->cm_id, NULL, 0);
+ if (0 > result) {
+ sdp_dbg_warn(conn, "Error <%d> sending CM RTU.", result);
+ goto done;
+ }
+ /*
+ * wake the accepting connection
+ */
+ SDP_CONN_ST_SET(conn, SDP_CONN_ST_ESTABLISHED);
- sk->sk_socket->state = SS_CONNECTED;
- conn->istate = SDP_SOCK_ST_ESTABLISHED;
- conn->send_buf = SDP_INET_SEND_SIZE;
- /*
- * release disconnects.
- */
- conn->flags &= ~SDP_CONN_F_DIS_HOLD;
+ sk->sk_socket->state = SS_CONNECTED;
+ conn->istate = SDP_SOCK_ST_ESTABLISHED;
+ conn->send_buf = SDP_INET_SEND_SIZE;
+ /*
+ * release disconnects.
+ */
+ conn->flags &= ~SDP_CONN_F_DIS_HOLD;
- inet_sk(sk)->saddr = htonl(conn->src_addr);
- inet_sk(sk)->rcv_saddr = htonl(conn->src_addr);
+ inet_sk(sk)->saddr = htonl(conn->src_addr);
+ inet_sk(sk)->rcv_saddr = htonl(conn->src_addr);
- result = sdp_send_flush(conn);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> flushing receives.",
- result);
- goto error;
- }
- /*
- * write/read ready. (for those waiting on just one...)
- */
- sdp_inet_wake_send(sk);
- sdp_inet_wake_recv(sk, 0);
-
- kfree(qp_attr);
- } else {
- /*
- * fail this connection
- */
- result = sdp_cm_failed(conn);
- if (0 > result)
- sdp_dbg_warn(conn, "Error <%d> CM connect failed",
- result);
-
- SDP_CONN_SET_ERR(conn, EPROTO);
- conn->istate = SDP_SOCK_ST_ERROR;
-
- goto drop;
+ result = sdp_send_flush(conn);
+ if (0 > result) {
+ sdp_dbg_warn(conn, "Error <%d> flushing receives.", result);
+ goto done;
}
-
- return 0;
-error:
- SDP_CONN_SET_ERR(conn, result);
- conn->istate = SDP_SOCK_ST_ERROR;
-
+ /*
+ * write/read ready. (for those waiting on just one...)
+ */
+ sdp_inet_wake_send(sk);
+ sdp_inet_wake_recv(sk, 0);
+
+ result = 0;
+done:
kfree(qp_attr);
-drop:
- sdp_inet_wake_error(sk);
-
- sdp_conn_put(conn); /* CM sk reference */
return result;
}
@@ -246,100 +274,76 @@
struct sdp_opt *conn)
{
struct sdp_msg_hello_ack *hello_ack;
- int result;
- int error;
+ int result = -EPROTO;
if (NULL == conn)
return -EINVAL;
- if (cm_id != conn->cm_id)
+ if (cm_id != conn->cm_id) {
sdp_dbg_warn(conn, "REP comm ID mismatch. <%08x:%08x>",
conn->cm_id->local_id, cm_id->local_id);
+ return -EINVAL;
+ }
hello_ack = (struct sdp_msg_hello_ack *)event->private_data;
sdp_dbg_ctrl(conn, "CM REP. comm <%08x>", cm_id->local_id);
+
+ if (conn->state != SDP_CONN_ST_REQ_SENT)
+ goto error;
+
/*
- * lock the connection
+ * check Hello Header Ack, to determine if we want
+ * the connection.
*/
- switch (conn->state) {
- case SDP_CONN_ST_ERROR_STRM:
- result = sdp_cm_reject(conn);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> CM reject request",
- result);
- error = result;
- goto done;
- }
+ result = _sdp_cm_hello_ack_check(hello_ack);
+ if (0 > result) {
+ sdp_dbg_warn(conn, "Error <%d> hello ack check.", result);
+ goto error;
+ }
- sdp_conn_put(conn);
+ SDP_CONN_ST_SET(conn, SDP_CONN_ST_REP_RECV);
+ /*
+ * read remote information
+ */
+ conn->send_size = hello_ack->hah.l_rcv_size;
+ conn->r_max_adv = hello_ack->hah.max_adv;
+ conn->r_recv_bf = hello_ack->bsdh.recv_bufs;
+ conn->recv_seq = hello_ack->bsdh.seq_num;
+ conn->advt_seq = hello_ack->bsdh.seq_num;
- break;
- case SDP_CONN_ST_REQ_SENT:
- /*
- * check Hello Header Ack, to determine if we want
- * the connection.
- */
- result = _sdp_cm_hello_ack_check(hello_ack);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> hello ack check.",
- result);
- error = result;
- goto reject;
- }
+ conn->d_qpn = event->param.rep_rcvd.remote_qpn;
+ /*
+ * The maximum amount of data that can be sent to the remote
+ * peer is the smaller of the local and remote buffer sizes,
+ * minus the size of the message header.
+ */
+ conn->send_size = min((u16)sdp_buff_pool_buff_size(),
+ (u16)conn->send_size) - SDP_MSG_HDR_SIZE;
+ /*
+ * Pop the hello message that was sent
+ */
+ (void)sdp_buff_pool_put(sdp_buff_q_get_head(&conn->send_post));
- SDP_CONN_ST_SET(conn, SDP_CONN_ST_REP_RECV);
- /*
- * read remote information
- */
- conn->send_size = hello_ack->hah.l_rcv_size;
- conn->r_max_adv = hello_ack->hah.max_adv;
- conn->r_recv_bf = hello_ack->bsdh.recv_bufs;
- conn->recv_seq = hello_ack->bsdh.seq_num;
- conn->advt_seq = hello_ack->bsdh.seq_num;
+ result = _sdp_actv_conn_establish(conn);
+ if (0 > result) {
+ sdp_dbg_warn(conn, "Error <%d> accept receive failed", result);
+ goto error;
+ }
- conn->d_qpn = event->param.rep_rcvd.remote_qpn;
- /*
- * The maximum amount of data that can be sent to the remote
- * peer is the smaller of the local and remote buffer sizes,
- * minus the size of the message header.
- */
- conn->send_size = (min((u16)sdp_buff_pool_buff_size(),
- (u16)conn->send_size) -
- SDP_MSG_HDR_SIZE);
- /*
- * Pop the hello message that was sent
- */
- (void)sdp_buff_pool_put(sdp_buff_q_get_head(&conn->send_post));
+ return 0;
+error:
+ sdp_cm_actv_error(conn, (0 - result));
- result = _sdp_actv_conn_establish(conn);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> accept receive failed",
- result);
- error = result;
- goto done;
- }
+ if (conn->state == SDP_CONN_ST_CLOSED) {
- break;
- default:
- sdp_dbg_warn(conn, "REP received in unknown connection state");
- /*
- * drop CM reference
- */
- result = sdp_wall_recv_drop(conn);
- SDP_EXPECT(!(0 > result));
+ conn->cm_id = NULL;
+ sdp_conn_put(conn); /* CM reference */
- error = -EPROTO;
- goto done;
+ return -EPROTO;
}
return 0;
-reject:
- result = sdp_wall_recv_reject(conn, EPROTO);
- SDP_EXPECT(!(0 > result));
-done:
- conn->cm_id = NULL;
- return error;
}
/*
@@ -375,8 +379,8 @@
}
if (SDP_CONN_ST_REQ_PATH != conn->state) {
- sdp_dbg_warn(conn, "Path record completion in bad state");
- goto done;
+ status = -EPROTO;
+ goto failed;
}
conn->plid = 0;
@@ -393,7 +397,9 @@
status);
goto failed;
}
-
+
+ status = -ENOMEM; /* incase error path is taken */
+
sdp_dbg_ctrl(conn, "Path record lookup complete <%016llx:%016llx:%d>",
(unsigned long long)
cpu_to_be64(path->dgid.global.subnet_prefix),
@@ -462,6 +468,7 @@
expect = sdp_buff_pool_put(buff);
SDP_EXPECT(!(0 > expect));
+ status = -EPROTO;
goto failed;
}
#if 1
@@ -505,36 +512,28 @@
if (NULL == conn->cm_id) {
sdp_dbg_warn(conn, "Failed to create CM handle, %d",
(u8)(buff->tail - buff->data));
-
- result = -ENOMEM;
goto failed;
}
- SDP_CONN_ST_SET(conn, SDP_CONN_ST_REQ_SENT);
/*
* initiate connection
*/
result = ib_send_cm_req(conn->cm_id, ¶m);
if (0 != result) {
sdp_dbg_warn(conn, "Error <%d> CM connect request", result);
+ status = result;
goto failed;
}
- result = 0;
+ SDP_CONN_ST_SET(conn, SDP_CONN_ST_REQ_SENT);
+ sdp_conn_hold(conn); /* CM reference */
+
goto done;
failed:
-
- result = sdp_wall_recv_reject(conn, (0 - status));
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> rejecting connection", result);
-
- expect = sdp_wall_recv_drop(conn);
- SDP_EXPECT(!(0 > expect));
- }
- /* if */
+ sdp_cm_actv_error(conn, (0 - status));
done:
sdp_conn_unlock(conn);
- sdp_conn_put(conn);
+ sdp_conn_put(conn); /* address resolution reference */
}
/*
@@ -542,23 +541,21 @@
*/
int sdp_cm_connect(struct sdp_opt *conn)
{
- int result = 0;
-
+ int result;
/*
* get the buffer size we'll use for this connection. (and all others)
*/
if (sizeof(struct sdp_msg_hello) > conn->recv_size) {
sdp_dbg_warn(conn, "buffer size <%d> too small. <%Zu>",
conn->recv_size, sizeof(struct sdp_msg_hello));
- result = -ENOBUFS;
- goto error;
+ return -ENOBUFS;
}
SDP_CONN_ST_SET(conn, SDP_CONN_ST_REQ_PATH);
/*
* lookup the remote address
*/
- sdp_conn_hold(conn);
+ sdp_conn_hold(conn); /* address resolution reference */
sdp_conn_unlock(conn);
result = sdp_link_path_lookup(htonl(conn->dst_addr),
@@ -577,13 +574,10 @@
/*
* callback dosn't have this socket.
*/
- sdp_conn_put(conn);
+ sdp_conn_put(conn); /* address resolution reference */
- result = -EDESTADDRREQ;
- goto error;
+ return -EDESTADDRREQ;
}
return 0;
-error:
- return result;
}
Index: infiniband/ulp/sdp/sdp_conn.c
===================================================================
--- infiniband/ulp/sdp/sdp_conn.c (revision 1909)
+++ infiniband/ulp/sdp/sdp_conn.c (working copy)
@@ -748,7 +748,7 @@
* in case CM/IB are still tracking this connection.
*/
if (conn->cm_id) {
- sdp_dbg_warn(conn, "CM local id <%d>", conn->cm_id->local_id);
+ sdp_dbg_ctrl(conn, "CM local id <%d>", conn->cm_id->local_id);
result = ib_destroy_cm_id(conn->cm_id);
if (result)
Index: infiniband/ulp/sdp/sdp_wall.c
===================================================================
--- infiniband/ulp/sdp/sdp_wall.c (revision 1908)
+++ infiniband/ulp/sdp/sdp_wall.c (working copy)
@@ -227,11 +227,6 @@
* instead of canceling allow the path completion to
* determine that the socket has moved to an error state.
*/
- result = sdp_wall_recv_drop(conn);
- SDP_EXPECT(!(0 > result));
- /*
- * fall through
- */
case SDP_CONN_ST_REQ_SENT:
case SDP_CONN_ST_REP_SENT:
/*
@@ -277,32 +272,6 @@
*/
/*
- * sdp_wall_recv_reject - callback to reject an active open
- */
-int sdp_wall_recv_reject(struct sdp_opt *conn, int error)
-{
- sdp_dbg_ctrl(conn, "Reject recv. src <%08x:%04x> dst <%08x:%04x> <%d>",
- conn->src_addr, conn->src_port,
- conn->dst_addr, conn->dst_port, error);
- /*
- * the connection has been rejected, move to error, and notify anyone
- * waiting of the state change.
- */
- SDP_CONN_SET_ERR(conn, error);
- conn->sk->sk_socket->state = SS_UNCONNECTED;
- conn->istate = SDP_SOCK_ST_ERROR;
- conn->shutdown = SHUTDOWN_MASK;
-
- sdp_iocb_q_cancel_all(conn, (0 - error));
-
- sdp_inet_wake_error(conn->sk);
-
- sdp_conn_put(conn); /* CM reference */
-
- return 0;
-}
-
-/*
* sdp_wall_recv_confirm - callback to confirm accepeted passive open
*/
int sdp_wall_recv_confirm(struct sdp_opt *conn)
Index: infiniband/ulp/sdp/sdp_event.c
===================================================================
--- infiniband/ulp/sdp/sdp_event.c (revision 1908)
+++ infiniband/ulp/sdp/sdp_event.c (working copy)
@@ -222,25 +222,12 @@
* check state
*/
switch (conn->state) {
- case SDP_CONN_ST_REQ_PATH:
- /*
- * cancel address resolution
- */
-#if _OLD_CODE
- result = ip2pr_path_record_cancel(conn->plid);
- SDP_EXPECT(!(0 > result));
-#endif
- /*
- * fall through
- */
- case SDP_CONN_ST_REQ_SENT: /* active open, Hello msg sent */
- result = sdp_wall_recv_reject(conn, ECONNREFUSED);
- if (0 > result) {
- sdp_dbg_warn(conn, "Error <%d> receiving CM reject.",
- result);
- goto error;
- }
+ case SDP_CONN_ST_REQ_SENT: /* active open, Hello msg sent */
+ conn->state = SDP_CONN_ST_CLOSED;
+ sdp_cm_actv_error(conn, ECONNREFUSED);
+ sdp_conn_put(conn); /* CM reference */
+
break;
case SDP_CONN_ST_REP_SENT: /* passive open, Hello ack msg sent */
result = sdp_wall_recv_failed(conn, ECONNREFUSED);
@@ -252,7 +239,6 @@
}
break;
- case SDP_CONN_ST_REP_RECV: /* active open, Hello ack msg recv'd */
case SDP_CONN_ST_REQ_RECV: /* passive open, Hello msg recv'd */
/*
* connection state is outstanding to the gateway, so the
Index: infiniband/ulp/sdp/sdp_post.c
===================================================================
--- infiniband/ulp/sdp/sdp_post.c (revision 1909)
+++ infiniband/ulp/sdp/sdp_post.c (working copy)
@@ -131,55 +131,7 @@
sdp_conn_put(conn);
}
-
/*
- * _sdp_cm_confirm - initiate a confirm request using the CM
- */
-static void _sdp_cm_confirm(void *arg)
-{
- struct sdp_opt *conn = (struct sdp_opt *)arg;
- int result;
-
- if (NULL == conn)
- sdp_dbg_warn(NULL, "Error, posting confirm for NULL conn");
-
- sdp_dbg_ctrl(conn, "Defered confirm <%08x>", conn->cm_id->local_id);
- /*
- * send a confirm request using the connection manager
- */
- result = ib_send_cm_rtu(conn->cm_id, NULL, 0);
- if (0 > result)
- sdp_dbg_warn(NULL, "Error <%d> CM confirm request", result);
-
- sdp_conn_put(conn);
-}
-
-/*
- * _sdp_cm_failed - initiate a Failed request using the CM
- */
-static void _sdp_cm_failed(void *arg)
-{
- struct sdp_opt *conn = (struct sdp_opt *)arg;
- int result;
-
- if (NULL == conn)
- sdp_dbg_warn(NULL, "Error, posting failed for NULL conn");
-
- sdp_dbg_ctrl(conn, "Defered failed request <%08x>",
- conn->cm_id->local_id);
- /*
- * send a failed request using the connection manager
- */
- result = ib_send_cm_rej(conn->cm_id,
- IB_CM_REJ_CONSUMER_DEFINED,
- NULL, 0, NULL, 0);
- if (0 > result)
- sdp_dbg_warn(NULL, "Error <%d> CM failed request", result);
-
- sdp_conn_put(conn);
-}
-
-/*
* _sdp_cm_deferred_generic - initiate a defered request using the CM
*/
static int _sdp_cm_deferred_generic(struct sdp_opt *conn,
@@ -214,19 +166,3 @@
{
return _sdp_cm_deferred_generic(conn, _sdp_cm_reject);
}
-
-/*
- * sdp_cm_confirm - initiate a confirm request using the CM
- */
-int sdp_cm_confirm(struct sdp_opt *conn)
-{
- return _sdp_cm_deferred_generic(conn, _sdp_cm_confirm);
-}
-
-/*
- * sdp_cm_failed - initiate a failed request using the CM
- */
-int sdp_cm_failed(struct sdp_opt *conn)
-{
- return _sdp_cm_deferred_generic(conn, _sdp_cm_failed);
-}
More information about the general
mailing list