ZERO_STRUCT(inaddr);
inaddr.sin_family = AF_INET;
- inaddr.sin_port = 5445;
+ inaddr.sin_port = htons(5445);
inaddr.sin_addr.s_addr = INADDR_ANY;
result = rdma_bind_addr(daemon_state->rdma.cm_id,
private_data, struct smb_direct_daemon_state);
struct smb_direct_connection *sconn = NULL;
struct rdma_cm_event *cm_ev = NULL;
- struct rdma_cm_event cm_ev_copy;
int result;
NTSTATUS status;
return;
}
- cm_ev_copy = *cm_ev;
- result = rdma_ack_cm_event(cm_ev);
- if (result != 0) {
- DBG_ERR("rdma_ack_cm_event failed [%s]\n", strerror(errno));
- goto fail;
- }
- cm_ev = NULL;
+ DBG_ERR("cm_event type [%d] cm_id [%p]\n",
+ cm_ev->event, cm_ev->id);
+
+ switch (cm_ev->event) {
+ case RDMA_CM_EVENT_CONNECT_REQUEST: {
+ struct rdma_conn_param conn_param;
+ uint8_t ird_ord_hdr[8];
- DBG_DEBUG("cm_event type [%d] cm_id [%p]\n",
- cm_ev_copy.event, cm_ev_copy.id);
+ RSIVAL(ird_ord_hdr, 0, 0);
+ RSIVAL(ird_ord_hdr, 4, 16);
- switch (cm_ev_copy.event) {
- case RDMA_CM_EVENT_CONNECT_REQUEST:
DBG_DEBUG("RDMA_CM_EVENT_CONNECT_REQUEST\n");
- result = rdma_accept(cm_ev_copy.id, NULL);
+ ZERO_STRUCT(conn_param);
+// conn_param.private_data = ird_ord_hdr;
+// conn_param.private_data_len = sizeof(ird_ord_hdr);
+ conn_param.responder_resources = 1;
+ conn_param.initiator_depth = 1;
+// conn_param.retry_count = 10;
+
+ errno = 0;
+
+ result = rdma_accept(cm_ev->id, NULL);
if (result != 0) {
- DBG_ERR("rdma_accept failed [%s]\n", strerror(errno));
+ DBG_ERR("rdma_accept failed [%s] result [%d]\n", strerror(errno), result);
goto fail;
}
sconn = smb_direct_connection_listener(daemon_state,
- cm_ev_copy.id);
+ cm_ev->id);
if (sconn == NULL) {
DBG_ERR("smb_direct_connection_create failed\n");
return;
}
- cm_ev_copy.id->context = sconn;
+ cm_ev->id->context = sconn;
break;
+ }
case RDMA_CM_EVENT_ESTABLISHED:
DBG_DEBUG("RDMA_CM_EVENT_ESTABLISHED\n");
- sconn = talloc_get_type_abort(cm_ev_copy.id->context,
+ sconn = talloc_get_type_abort(cm_ev->id->context,
struct smb_direct_connection);
status = smb_direct_connection_complete_alloc(sconn);
if (!NT_STATUS_IS_OK(status)) {
case RDMA_CM_EVENT_DISCONNECTED:
DBG_DEBUG("RDMA_CM_EVENT_DISCONNECTED\n");
- sconn = talloc_get_type(cm_ev_copy.id->context,
+ sconn = talloc_get_type(cm_ev->id->context,
struct smb_direct_connection);
TALLOC_FREE(sconn);
break;
goto fail;
default:
- DBG_ERR("event %d\n", cm_ev_copy.event);
+ DBG_ERR("event %d\n", cm_ev->event);
goto fail;
}
+ result = rdma_ack_cm_event(cm_ev);
+ if (result != 0) {
+ DBG_ERR("rdma_ack_cm_event failed [%s]\n", strerror(errno));
+ goto fail;
+ }
return;
fail:
- if (cm_ev_copy.id == daemon_state->rdma.cm_id) {
+ rdma_ack_cm_event(cm_ev);
+
+ if (cm_ev->id == daemon_state->rdma.cm_id) {
/* Listening conn is erroring out, shut it down and die */
TALLOC_FREE(daemon_state->listening_conn);
+ // tevent_req_error(daemon_state->req, EPANIC);
}
TALLOC_FREE(sconn);