#include "dapl_ep_util.h"
#include "dapl_osd.h"
+/* Check for EP linking to IA and proper connect state */\r
+void dapli_ep_check(DAPL_EP *ep)\r
+{\r
+ DAPL_IA *ia_ptr = ep->header.owner_ia;\r
+ DAPL_EP *ep_ptr, *next_ep_ptr;\r
+ int found = 0;\r
+\r
+ dapl_os_lock(&ia_ptr->header.lock);\r
+ ep_ptr = (dapl_llist_is_empty (&ia_ptr->ep_list_head)\r
+ ? NULL : dapl_llist_peek_head (&ia_ptr->ep_list_head));\r
+\r
+ while (ep_ptr != NULL) {\r
+ next_ep_ptr = \r
+ dapl_llist_next_entry(&ia_ptr->ep_list_head,\r
+ &ep_ptr->header.ia_list_entry);\r
+ if (ep == ep_ptr) {\r
+ found++;\r
+ if ((ep->cr_ptr && ep->param.ep_state \r
+ != DAT_EP_STATE_COMPLETION_PENDING) ||\r
+ (!ep->cr_ptr && ep->param.ep_state \r
+ != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING))\r
+ goto err;\r
+ else \r
+ goto match;\r
+ }\r
+ ep_ptr = next_ep_ptr;\r
+ }\r
+err:\r
+ dapl_log(DAPL_DBG_TYPE_ERR,\r
+ " dapli_ep_check ERR: %s %s ep=%p state=%d magic=0x%x\n", \r
+ ep->cr_ptr ? "PASSIVE":"ACTIVE", \r
+ found ? "WRONG_STATE":"NOT_FOUND" ,\r
+ ep, ep->param.ep_state, ep->header.magic);\r
+match:\r
+ dapl_os_unlock(&ia_ptr->header.lock);\r
+ return;\r
+}\r
+
#if defined(_WIN32) || defined(_WIN64)
enum DAPL_FD_EVENTS {
DAPL_FD_READ = 0x1,
dapl_log(DAPL_DBG_TYPE_ERR,
" CONN_PENDING: %s ERR %s -> %s %d\n",
err == -1 ? "POLL" : "SOCKOPT",
- err == -1 ? strerror(errno) : strerror(err),
+ err == -1 ? strerror(dapl_socket_errno()) : strerror(err),
inet_ntoa(((struct sockaddr_in *)
&cm_ptr->addr)->sin_addr),
ntohs(((struct sockaddr_in *)
}
if (len != (exp + ntohs(cm_ptr->msg.p_size))) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " CONN_PENDING len ERR %s, wcnt=%d(%d) -> %s\n",
- strerror(errno), len,
+ " CONN_PENDING len ERR 0x%x %s, wcnt=%d(%d) -> %s\n",
+ err, strerror(err), len,
exp + ntohs(cm_ptr->msg.p_size),
inet_ntoa(((struct sockaddr_in *)
ep_ptr->param.
/* create, connect, sockopt, and exchange QP information */
if ((cm_ptr->socket =
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " connect: socket create ERR %s\n", strerror(errno));
+ " connect: socket create ERR 0x%x %s\n",
+ err, strerror(err));
goto bail;
}
ret = dapl_config_socket(cm_ptr->socket);
if (ret < 0) {
dapl_log(DAPL_DBG_TYPE_ERR,
- " connect: config socket %d ERR %d %s\n",
- cm_ptr->socket, ret, strerror(dapl_socket_errno()));
+ " connect: config socket %d RET %d ERR 0x%x %s\n",
+ cm_ptr->socket, ret,
+ dapl_socket_errno(), strerror(dapl_socket_errno()));
dat_ret = DAT_INTERNAL_ERROR;
goto bail;
}
ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&cm_ptr->addr,
sizeof(cm_ptr->addr));
if (ret && ret != EAGAIN) {
+ dapl_log(DAPL_DBG_TYPE_ERR,
+ " connect: dapl_connect_socket RET %d ERR 0x%x %s\n",
+ ret, dapl_socket_errno(),
+ strerror(dapl_socket_errno()));
dat_ret = DAT_INVALID_ADDRESS;
goto bail;
}
/* get local address information from socket */
sl = sizeof(cm_ptr->msg.daddr.so);
if (getsockname(cm_ptr->socket, (struct sockaddr *)&cm_ptr->msg.daddr.so, &sl)) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " connect getsockname ERROR: %s -> %s r_qual %d\n",
- strerror(errno),
+ " connect getsockname ERROR: 0x%x %s -> %s r_qual %d\n",
+ err, strerror(err),
inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
(unsigned int)r_qual);;
}
return DAT_SUCCESS;
bail:
dapl_log(DAPL_DBG_TYPE_ERR,
- " connect ERROR: %s -> %s r_qual %d\n",
- strerror(errno),
+ " connect ERROR: -> %s r_qual %d\n",
inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
(unsigned int)r_qual);
len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0);
if (len != exp || ntohs(cm_ptr->msg.ver) != DCM_VER) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_WARN,
- " CONN_RTU read: sk %d ERR %s, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n",
- cm_ptr->socket, strerror(errno), len, ntohs(cm_ptr->msg.ver),
+ " CONN_RTU read: sk %d ERR 0x%x, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n",
+ cm_ptr->socket, err, len, ntohs(cm_ptr->msg.ver),
inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr),
ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port),
ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port),
ntohs(*(uint16_t*)&cm_ptr->msg.resv[2]));
/* Retry; corner case where server tcp stack resets under load */
- if (dapl_socket_errno() == ECONNRESET) {
+ if (err == ECONNRESET) {
closesocket(cm_ptr->socket);
cm_ptr->socket = DAPL_INVALID_SOCKET;
dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr,
if (exp) {
len = recv(cm_ptr->socket, cm_ptr->msg.p_data, exp, 0);
if (len != exp) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " CONN_RTU read pdata: ERR %s, rcnt=%d -> %s\n",
- strerror(errno), len,
+ " CONN_RTU read pdata: ERR 0x%x %s, rcnt=%d -> %s\n",
+ err, strerror(err), len,
inet_ntoa(((struct sockaddr_in *)
ep_ptr->param.
remote_ia_address_ptr)->sin_addr));
cm_ptr->state = DCM_CONNECTED;
cm_ptr->msg.op = ntohs(DCM_RTU);
if (send(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0) == -1) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " CONN_RTU: write error = %s\n", strerror(errno));
+ " CONN_RTU: write ERR = 0x%x %s\n",
+ err, strerror(err));
goto bail;
}
/* post the event with private data */
} else
#endif
{
+ dapli_ep_check(cm_ptr->ep);
dapl_evd_connection_callback(cm_ptr, event, cm_ptr->msg.p_data,
DCM_MAX_PDATA_SIZE, ep_ptr);
}
/* bind, listen, set sockopt, accept, exchange data */
if ((cm_ptr->socket =
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) {
- dapl_log(DAPL_DBG_TYPE_ERR, " ERR: listen socket create: %s\n",
- strerror(errno));
+ int err = dapl_socket_errno();
+ dapl_log(DAPL_DBG_TYPE_ERR,
+ " listen: socket create: ERR 0x%x %s\n",
+ err, strerror(err));
dat_status = DAT_INSUFFICIENT_RESOURCES;
goto bail;
}
if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|| (listen(cm_ptr->socket, 128) < 0)) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_CM,
- " listen: ERROR %s on port %d\n",
- strerror(errno), serviceID + 1000);
- if (dapl_socket_errno() == EADDRINUSE)
+ " listen: ERROR 0x%x %s on port %d\n",
+ err, strerror(err), serviceID + 1000);
+ if (err == EADDRINUSE)
dat_status = DAT_CONN_QUAL_IN_USE;
else
dat_status = DAT_CONN_QUAL_UNAVAILABLE;
&acm_ptr->msg.daddr.so,
(socklen_t *) &len);
if (acm_ptr->socket == DAPL_INVALID_SOCKET) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " ACCEPT: ERR %s on FD %d l_cr %p\n",
- strerror(errno), cm_ptr->socket, cm_ptr);
+ " ACCEPT: ERR 0x%x %s on FD %d l_cr %p\n",
+ err, strerror(err), cm_ptr->socket, cm_ptr);
dapls_cm_release(acm_ptr);
return;
}
/* no delay for small packets */
ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,
(char *)&opt, sizeof(opt));
- if (ret)
+ if (ret) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " ACCEPT: NODELAY setsockopt: 0x%x 0x%x %s\n",
- ret, dapl_socket_errno(), strerror(dapl_socket_errno()));
-
+ " ACCEPT: NODELAY setsockopt:"
+ " RET %d ERR 0x%x %s\n",
+ ret, err, strerror(err));
+ }
+
/* get local address information from socket */
sl = sizeof(acm_ptr->addr);
getsockname(acm_ptr->socket, (struct sockaddr *)&acm_ptr->addr, &sl);
/* read in DST QP info, IA address. check for private data */
len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0);
if (len != exp || ntohs(acm_ptr->msg.ver) != DCM_VER) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " ACCEPT read: ERR %s, rcnt=%d, ver=%d\n",
- strerror(errno), len, ntohs(acm_ptr->msg.ver));
+ " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n",
+ err, strerror(err), len, ntohs(acm_ptr->msg.ver));
goto bail;
}
if (exp) {
len = recv(acm_ptr->socket, acm_ptr->msg.p_data, exp, 0);
if (len != exp) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " accept read pdata: ERR %s, rcnt=%d\n",
- strerror(errno), len);
+ " accept read pdata: ERR 0x%x %s, rcnt=%d\n",
+ err, strerror(err), len);
goto bail;
}
p_data = acm_ptr->msg.p_data;
cm_ptr->hca = ia_ptr->hca_ptr;
cm_ptr->state = DCM_ACCEPTED;
+ /* Link CM to EP, already queued on work thread */
dapl_ep_link_cm(ep_ptr, cm_ptr);
cm_ptr->ep = ep_ptr;
len = writev(cm_ptr->socket, iov, 1);
if (len != (p_size + exp)) {
+ int err = dapl_socket_errno();
dapl_log(DAPL_DBG_TYPE_ERR,
- " ACCEPT_USR: ERR %s, wcnt=%d -> %s\n",
- strerror(errno), len,
+ " ACCEPT_USR: ERR 0x%x %s, wcnt=%d -> %s\n",
+ err, strerror(err), len,
inet_ntoa(((struct sockaddr_in *)
&cm_ptr->msg.daddr.so)->sin_addr));
dapl_ep_unlink_cm(ep_ptr, cm_ptr);
htonll(*(uint64_t*)&local.saddr.ib.gid[8]));
dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");
+
return DAT_SUCCESS;
bail:
/* schedule cleanup from workq */
} else
#endif
{
+ dapli_ep_check(cm_ptr->ep);
dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
}
return;