Move setsockopt before connect to avoid race with data. Seems to fail on windows. Not seen on linux.
Signed-off-by: Arlin Davis <[email protected]> --- dapl/openib_scm/cm.c | 34 ++++++++++++++++++++-------------- 1 files changed, 20 insertions(+), 14 deletions(-) diff --git a/dapl/openib_scm/cm.c b/dapl/openib_scm/cm.c index c957f29..105351c 100644 --- a/dapl/openib_scm/cm.c +++ b/dapl/openib_scm/cm.c @@ -69,7 +69,15 @@ enum DAPL_FD_EVENTS { static int dapl_config_socket(DAPL_SOCKET s) { unsigned long nonblocking = 1; - return ioctlsocket(s, FIONBIO, &nonblocking); + int ret, opt; + + ret = ioctlsocket(s, FIONBIO, &nonblocking); + + /* no delay for small packets */ + if (!ret) + ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, + (char *)&opt, sizeof(opt)); + return ret; } static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr, @@ -176,11 +184,17 @@ enum DAPL_FD_EVENTS { static int dapl_config_socket(DAPL_SOCKET s) { - int ret; + int ret, opt = 1; + /* non-blocking */ ret = fcntl(s, F_GETFL); if (ret >= 0) ret = fcntl(s, F_SETFL, ret | O_NONBLOCK); + + /* no delay for small packets */ + if (!ret) + ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, + (char *)&opt, sizeof(opt)); return ret; } @@ -434,7 +448,7 @@ DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr) */ static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err) { - int ret, len, exp, opt = 1; + int len, exp; struct iovec iov[2]; struct dapl_ep *ep_ptr = cm_ptr->ep; @@ -450,14 +464,6 @@ static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err) goto bail; } - /* no delay for small packets */ - ret = setsockopt(cm_ptr->socket, IPPROTO_TCP, TCP_NODELAY, - (char *)&opt, sizeof(opt)); - if (ret) - dapl_log(DAPL_DBG_TYPE_ERR, - " CONN_PENDING: NODELAY setsockopt: %s\n", - strerror(errno)); - cm_ptr->state = DCM_REP_PENDING; /* send qp info and pdata to remote peer */ @@ -537,7 +543,7 @@ dapli_socket_connect(DAPL_EP * ep_ptr, if (ret < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " connect: config socket %d ERR %d %s\n", - cm_ptr->socket, ret, strerror(errno)); + cm_ptr->socket, ret, strerror(dapl_socket_errno())); dat_ret = DAT_INTERNAL_ERROR; goto bail; } @@ -954,8 +960,8 @@ static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr) (char *)&opt, sizeof(opt)); if (ret) dapl_log(DAPL_DBG_TYPE_ERR, - " ACCEPT: NODELAY setsockopt: %s\n", - strerror(errno)); + " ACCEPT: NODELAY setsockopt: 0x%x 0x%x %s\n", + ret, dapl_socket_errno(), strerror(dapl_socket_errno())); /* get local address information from socket */ sl = sizeof(acm_ptr->addr); -- 1.5.2.5 _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
