Add a call for synchronous passive side operation that obtains
connection requests.  This is similar to the socket accept call.

From: Sean Hefty <[email protected]>
---
 trunk/ulp/librdmacm/include/rdma/rdma_cma.h |    3 ++
 trunk/ulp/librdmacm/src/cma.cpp             |   40 +++++++++++++++++++++++++++
 trunk/ulp/librdmacm/src/cma_exports.src     |    1 +
 3 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h 
b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
index b4cda67..489fa66 100644
--- a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
+++ b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
@@ -417,6 +417,9 @@ int rdma_connect(struct rdma_cm_id *id, struct 
rdma_conn_param *conn_param);
 __declspec(dllexport)
 int rdma_listen(struct rdma_cm_id *id, int backlog);
 
+__declspec(dllexport)
+int rdma_get_request(struct rdma_cm_id *listen, struct rdma_cm_id **id);
+
 /**
  * rdma_accept - Called to accept a connection request.
  * @id: Connection identifier associated with the request.
diff --git a/trunk/ulp/librdmacm/src/cma.cpp b/trunk/ulp/librdmacm/src/cma.cpp
index 7240c4d..f897245 100644
--- a/trunk/ulp/librdmacm/src/cma.cpp
+++ b/trunk/ulp/librdmacm/src/cma.cpp
@@ -919,6 +919,46 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
 }
 
 __declspec(dllexport)
+int rdma_get_request(struct rdma_cm_id *listen, struct rdma_cm_id **id)
+{
+       struct cma_id_private *id_priv;
+       struct rdma_cm_event *event;
+       int ret;
+
+       id_priv = CONTAINING_RECORD(listen, struct cma_id_private, id);
+       if (!id_priv->sync) {
+               return rdma_seterrno(EINVAL);
+       }
+
+       if (listen->event) {
+               rdma_ack_cm_event(listen->event);
+               listen->event = NULL;
+       }
+
+       ret = rdma_get_cm_event(listen->channel, &event);
+       if (ret)
+               return ret;
+
+       if (event->status) {
+               ret = rdma_seterrno(event->status);
+               goto err;
+       }
+       
+       if (event->event != RDMA_CM_EVENT_CONNECT_REQUEST) {
+               ret = rdma_seterrno(EINVAL);
+               goto err;
+       }
+
+       *id = event->id;
+       (*id)->event = event;
+       return 0;
+
+err:
+       listen->event = event;
+       return ret;
+}
+
+__declspec(dllexport)
 int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
 {
        struct cma_id_private *id_priv;
diff --git a/trunk/ulp/librdmacm/src/cma_exports.src 
b/trunk/ulp/librdmacm/src/cma_exports.src
index 8f370be..2d6b336 100644
--- a/trunk/ulp/librdmacm/src/cma_exports.src
+++ b/trunk/ulp/librdmacm/src/cma_exports.src
@@ -32,5 +32,6 @@ rdma_set_option
 rdma_migrate_id
 rdma_getaddrinfo
 rdma_freeaddrinfo
+rdma_get_request
 rdmaw_wsa_errno
 #endif

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to