@@ -22,6 +22,7 @@ usr/share/man/man3/rdma_destroy_id.3
usr/share/man/man3/rdma_destroy_qp.3
usr/share/man/man3/rdma_destroy_srq.3
usr/share/man/man3/rdma_disconnect.3
+usr/share/man/man3/rdma_establish.3
usr/share/man/man3/rdma_event_str.3
usr/share/man/man3/rdma_free_devices.3
usr/share/man/man3/rdma_get_cm_event.3
@@ -25,6 +25,7 @@ librdmacm.so.1 librdmacm1 #MINVER#
rdma_destroy_srq@RDMACM_1.0 1.0.15
rdma_disconnect@RDMACM_1.0 1.0.15
rdma_event_str@RDMACM_1.0 1.0.15
+ rdma_establish@RDMACM_1.2 23
rdma_free_devices@RDMACM_1.0 1.0.15
rdma_freeaddrinfo@RDMACM_1.0 1.0.15
rdma_get_cm_event@RDMACM_1.0 1.0.15
@@ -2077,6 +2077,18 @@ static void ucma_copy_ud_event(struct cma_event *event,
dst->qkey = src->qkey;
}
+int rdma_establish(struct rdma_cm_id *id)
+{
+ if (id->qp)
+ return ERR(EINVAL);
+
+ /* id->qp is NULL, so ucma_process_conn_resp() will only send ACCEPT to
+ * the passive side, and will not attempt to modify the QP.
+ */
+ return ucma_process_conn_resp(container_of(id, struct cma_id_private,
+ id));
+}
+
int rdma_get_cm_event(struct rdma_event_channel *channel,
struct rdma_cm_event **event)
{
@@ -2153,12 +2165,17 @@ retry:
break;
case RDMA_CM_EVENT_CONNECT_RESPONSE:
ucma_copy_conn_event(evt, &resp.param.conn);
- evt->event.status = ucma_process_conn_resp(evt->id_priv);
- if (!evt->event.status)
- evt->event.event = RDMA_CM_EVENT_ESTABLISHED;
- else {
- evt->event.event = RDMA_CM_EVENT_CONNECT_ERROR;
- evt->id_priv->connect_error = 1;
+ if (!evt->id_priv->id.qp) {
+ evt->event.event = RDMA_CM_EVENT_CONNECT_RESPONSE;
+ } else {
+ evt->event.status =
+ ucma_process_conn_resp(evt->id_priv);
+ if (!evt->event.status)
+ evt->event.event = RDMA_CM_EVENT_ESTABLISHED;
+ else {
+ evt->event.event = RDMA_CM_EVENT_CONNECT_ERROR;
+ evt->id_priv->connect_error = 1;
+ }
}
break;
case RDMA_CM_EVENT_ESTABLISHED:
@@ -79,5 +79,6 @@ RDMACM_1.1 {
RDMACM_1.2 {
global:
+ rdma_establish;
rdma_init_qp_attr;
} RDMACM_1.1;
@@ -20,6 +20,7 @@ rdma_man_pages(
rdma_destroy_qp.3
rdma_destroy_srq.3
rdma_disconnect.3
+ rdma_establish.3.md
rdma_event_str.3
rdma_free_devices.3
rdma_get_cm_event.3
new file mode 100644
@@ -0,0 +1,59 @@
+---
+date: 2019-01-16
+footer: librdmacm
+header: "Librdmacm Programmer's Manual"
+layout: page
+license: 'Licensed under the OpenIB.org BSD license (FreeBSD Variant) - See COPYING.md'
+section: 3
+title: RDMA_ESTABLISH
+---
+
+# NAME
+
+rdma_establish - Complete an active connection request.
+
+# SYNOPSIS
+
+```c
+#include <rdma/rdma_cma.h>
+
+int rdma_establish(struct rdma_cm_id *id);
+```
+
+# DESCRIPTION
+
+**rdma_establish()** Acknowledge an incoming connection response event and complete the connection establishment.
+
+Notes:
+
+If a QP has not been created on the rdma_cm_id, this function should be called by the active side to complete the connection,
+
+after getting connect response event.
+
+This will trigger a connection established event on the passive side.
+
+This function should not be used on an rdma_cm_id on which a QP has been created.
+
+# ARGUMENTS
+
+*id*
+: RDMA identifier.
+
+# RETURN VALUE
+
+**rdma_establish()** returns 0 on success, or -1 on error. If an error occurs, errno will be set to indicate the failure reason.
+
+# SEE ALSO
+
+**rdma_connect**(3),
+**rdma_disconnect**(3)
+**rdma_get_cm_event**(3)
+
+# AUTHORS
+
+Danit Goldberg <danitg@mellanox.com>
+
+Yossi Itigin <yosefe@mellanox.com>
+
+
+
@@ -442,6 +442,24 @@ void rdma_destroy_qp(struct rdma_cm_id *id);
int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param);
/**
+ * rdma_establish - Complete an active connection request.
+ * @id: RDMA identifier.
+ * Description:
+ * Acknowledge an incoming connection response event and complete the
+ * connection establishment.
+ * Notes:
+ * If a QP has not been created on the rdma_cm_id, this function should be
+ * called by the active side to complete the connection, after getting connect
+ * response event. This will trigger a connection established event on the
+ * passive side.
+ * This function should not be used on an rdma_cm_id on which a QP has been
+ * created.
+ * See also:
+ * rdma_connect, rdma_disconnect, rdma_get_cm_event
+ */
+int rdma_establish(struct rdma_cm_id *id);
+
+/**
* rdma_listen - Listen for incoming connection requests.
* @id: RDMA identifier.
* @backlog: backlog of incoming connection requests.