"<%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
NIPQUAD(reset.src.s_addr),
NIPQUAD(reset.dst.s_addr), conn->c_tos);
- conn->c_drop_source = 1;
+ conn->c_drop_source = DR_USER_RESET;
rds_conn_drop(conn);
}
mutex_lock(&conn->c_cm_lock);
if (!rds_conn_transition(conn, RDS_CONN_UP, RDS_CONN_DISCONNECTING)
&& !rds_conn_transition(conn, RDS_CONN_ERROR, RDS_CONN_DISCONNECTING)) {
- conn->c_drop_source = 2;
+ conn->c_drop_source = DR_INV_CONN_STATE;
rds_conn_error(conn, "shutdown called in state %d\n",
atomic_read(&conn->c_state));
mutex_unlock(&conn->c_cm_lock);
* Quite reproduceable with loopback connections.
* Mostly harmless.
*/
- conn->c_drop_source = 3;
+ conn->c_drop_source = DR_DOWN_TRANSITION_FAIL;
rds_conn_error(conn,
"%s: failed to transition to state DOWN, "
"current state is %d\n",
synchronize_rcu();
/* shut the connection down */
- conn->c_drop_source = 4;
+ conn->c_drop_source = DR_CONN_DESTROY;
rds_conn_drop(conn);
flush_work(&conn->c_down_w);
rds_conn_message_info_retrans);
}
-char *conn_drop_reason_str(u8 reason)
+static char *conn_drop_reasons[] = {
+ [DR_DEFAULT] = "unknown reason (default_state)",
+ [DR_USER_RESET] = "user reset",
+ [DR_INV_CONN_STATE] = "invalid connection state",
+ [DR_DOWN_TRANSITION_FAIL] = "failure to move to DOWN state",
+ [DR_CONN_DESTROY] = "connection destroy",
+ [DR_ZERO_LANE_DOWN] = "zero lane went down",
+ [DR_CONN_CONNECT_FAIL] = "conn_connect failure",
+ [DR_HB_TIMEOUT] = "hb timeout",
+ [DR_RECONNECT_TIMEOUT] = "reconnect timeout",
+ [DR_IB_CONN_DROP_RACE] = "race between ESTABLISHED event and drop",
+ [DR_IB_NOT_CONNECTING_STATE] = "conn is not in CONNECTING state",
+ [DR_IB_QP_EVENT] = "qp event",
+ [DR_IB_BASE_CONN_DOWN] = "base conn down",
+ [DR_IB_REQ_WHILE_CONN_UP] = "incoming REQ in CONN_UP state",
+ [DR_IB_REQ_WHILE_CONNECTING] = "incoming REQ in CONNECTING state",
+ [DR_IB_PAS_SETUP_QP_FAIL] = "passive setup_qp failure",
+ [DR_IB_RDMA_ACCEPT_FAIL] = "rdma_accept failure",
+ [DR_IB_ACT_SETUP_QP_FAIL] = "active setup_qp failure",
+ [DR_IB_RDMA_CONNECT_FAIL] = "rdma_connect failure",
+ [DR_IB_SET_IB_PATH_FAIL] = "rdma_set_ib_paths failure",
+ [DR_IB_RESOLVE_ROUTE_FAIL] = "resolve_route failure",
+ [DR_IB_RDMA_CM_ID_MISMATCH] = "detected rdma_cm_id mismatch",
+ [DR_IB_ROUTE_ERR] = "ROUTE_ERROR event",
+ [DR_IB_ADDR_ERR] = "ADDR_ERROR event",
+ [DR_IB_CONNECT_ERR] = "CONNECT_ERROR or UNREACHABLE or DEVICE_REMOVE event",
+ [DR_IB_CONSUMER_DEFINED_REJ] = "CONSUMER_DEFINED reject",
+ [DR_IB_REJECTED_EVENT] = "REJECTED event",
+ [DR_IB_ADDR_CHANGE] = "ADDR_CHANGE event",
+ [DR_IB_DISCONNECTED_EVENT] = "DISCONNECTED event",
+ [DR_IB_TIMEWAIT_EXIT] = "TIMEWAIT_EXIT event",
+ [DR_IB_POST_RECV_FAIL] = "post_recv failure",
+ [DR_IB_SEND_ACK_FAIL] = "send_ack failure",
+ [DR_IB_HEADER_MISSING] = "no header in incoming msg",
+ [DR_IB_HEADER_CORRUPTED] = "corrupted header in incoming msg",
+ [DR_IB_FRAG_HEADER_MISMATCH] = "fragment header mismatch",
+ [DR_IB_RECV_COMP_ERR] = "recv completion error",
+ [DR_IB_SEND_COMP_ERR] = "send completion error",
+ [DR_IB_POST_SEND_FAIL] = "post_send failure",
+ [DR_IB_UMMOD] = "rds_rdma module unload",
+ [DR_IB_ACTIVE_BOND_FAILOVER] = "active bonding failover",
+ [DR_IB_LOOPBACK_CONN_DROP] = "corresponding loopback conn drop",
+ [DR_IB_ACTIVE_BOND_FAILBACK] = "active bonding failback",
+ [DR_IW_QP_EVENT] = "qp_event",
+ [DR_IW_REQ_WHILE_CONNECTING] = "incoming REQ in connecting state",
+ [DR_IW_PAS_SETUP_QP_FAIL] = "passive setup_qp failure",
+ [DR_IW_RDMA_ACCEPT_FAIL] = "rdma_accept failure",
+ [DR_IW_ACT_SETUP_QP_FAIL] = "active setup_qp failure",
+ [DR_IW_RDMA_CONNECT_FAIL] = "rdma_connect failure",
+ [DR_IW_POST_RECV_FAIL] = "post_recv failure",
+ [DR_IW_SEND_ACK_FAIL] = "send_ack failure",
+ [DR_IW_HEADER_MISSING] = "no header in incoming msg",
+ [DR_IW_HEADER_CORRUPTED] = "corrupted header in incoming msg",
+ [DR_IW_FRAG_HEADER_MISMATCH] = "fragment header mismatch",
+ [DR_IW_RECV_COMP_ERR] = "recv completion error",
+ [DR_IW_SEND_COMP_ERR] = "send completion error",
+ [DR_TCP_STATE_CLOSE] = "sk_state to TCP_CLOSE",
+ [DR_TCP_SEND_FAIL] = "tcp_send failure",
+};
+
+char *conn_drop_reason_str(enum rds_conn_drop_src reason)
{
- /* Here is distribution of drop reason:
- *
- * 0-19: rds-core
- *
- * 20-119: IB
- * 20-39: ib_cm
- * 40-59: event handling
- * 60-79: data path
- * 80-119: special features like active bonding
- *
- * 120-139: iWARP
- *
- * 140-159: TCP
- *
- * 160-255: any other future additions
- *
- */
- switch (reason) {
- case 1: return "user reset";
- case 2: return "invalid connection state";
- case 3: return "failure to move to DOWN state";
- case 4: return "connection destroy";
- case 5: return "zero lane went down";
- case 6: return "conn_connect failure";
- case 7: return "hb timeout";
- case 8: return "reconnect timeout";
-
- case 20: return "race between ESTABLISHED event and drop";
- case 21: return "conn is not in CONNECTING state";
- case 22: return "qp event";
- case 23: return "base conn down";
- case 24: return "incoming REQ in CONN_UP state";
- case 25: return "incoming REQ in CONNECTING state";
- case 26: return "setup_qp failure";
- case 27: return "rdma_accept failure";
- case 28: return "setup_qp failure";
- case 29: return "rdma_connect failure";
-
- case 40: return "rdma_set_ib_paths failure";
- case 41: return "resolve_route failure";
- case 42: return "detected rdma_cm_id mismatch";
- case 43: return "ROUTE_ERROR event";
- case 44: return "ADDR_ERROR event";
- case 45: return "CONNECT_ERROR or UNREACHABLE or DEVICE_REMOVE event";
- case 46: return "CONSUMER_DEFINED reject";
- case 47: return "REJECTED event";
- case 48: return "ADDR_CHANGE event";
- case 49: return "DISCONNECTED event";
- case 50: return "TIMEWAIT_EXIT event";
-
- case 60: return "post_recv failure";
- case 61: return "send_ack failure";
- case 62: return "no header in incoming msg";
- case 63: return "corrupted header in incoming msg";
- case 64: return "fragment header mismatch";
- case 65: return "recv completion error";
- case 66: return "send completion error";
- case 67: return "post_send failure";
-
- case 80: return "rds_rdma module unload";
- case 81: return "active bonding failover";
- case 82: return "corresponding loopback conn drop";
- case 83: return "active bonding failback";
-
- case 120: return "qp_event";
- case 121: return "incoming REQ in connecting state";
- case 122: return "setup_qp failure";
- case 123: return "rdma_accept failure";
- case 124: return "setup_qp failure";
- case 125: return "rdma_connect failure";
-
- case 130: return "post_recv failure";
- case 131: return "send_ack failure";
- case 132: return "no header in incoming msg";
- case 133: return "corrupted header in incoming msg";
- case 134: return "fragment header mismatch";
- case 135: return "recv completion error";
- case 136: return "send completion error";
-
- case 140: return "sk_state to TCP_CLOSE";
- case 141: return "tcp_send failure";
-
- default: return "unknown reason";
- }
+ return rds_str_array(conn_drop_reasons,
+ ARRAY_SIZE(conn_drop_reasons), reason);
}
static void rds_conn_probe_lanes(struct rds_connection *conn)
NIPQUAD(tmp->c_faddr),
tmp->c_tos);
- conn->c_drop_source = 5;
+ conn->c_drop_source = DR_ZERO_LANE_DOWN;
rds_conn_drop(tmp);
}
}
spin_lock_irqsave(&rds_ibdev->spinlock, flags);
list_for_each_entry(ic, &rds_ibdev->conn_list, ib_node) {
- ic->conn->c_drop_source = 80;
+ ic->conn->c_drop_source = DR_IB_UMMOD;
rds_conn_drop(ic->conn);
}
spin_unlock_irqrestore(&rds_ibdev->spinlock, flags);
rds_rtd(RDS_RTD_CM_EXT,
"conn: %p, calling rds_conn_drop\n", conn);
- conn->c_drop_source = 81;
+ conn->c_drop_source = DR_IB_ACTIVE_BOND_FAILOVER;
rds_conn_drop(conn);
kfree(work);
"conn:%p, tos %d, calling rds_conn_drop\n",
ic2->conn,
ic2->conn->c_tos);
- ic2->conn->c_drop_source = 82;
+ ic2->conn->c_drop_source = DR_IB_LOOPBACK_CONN_DROP;
rds_conn_drop(ic2->conn);
}
}
rds_rtd(RDS_RTD_CM_EXT,
"conn: %p, tos %d, calling rds_conn_drop\n",
ic->conn, ic->conn->c_tos);
- ic->conn->c_drop_source = 83;
+ ic->conn->c_drop_source = DR_IB_ACTIVE_BOND_FAILBACK;
rds_conn_drop(ic->conn);
}
}
rds_rtd(RDS_RTD_CM,
"ic->i_cm_id is NULL, ic: %p, calling rds_conn_drop\n",
ic);
- conn->c_drop_source = 20;
+ conn->c_drop_source = DR_IB_CONN_DROP_RACE;
rds_conn_drop(conn);
return;
}
rds_rtd(RDS_RTD_CM,
"conn is in connecting state, conn: %p, calling rds_conn_drop\n",
conn);
- conn->c_drop_source = 21;
+ conn->c_drop_source = DR_IB_NOT_CONNECTING_STATE;
rds_conn_drop(conn);
return;
}
"Fatal QP Event %u (%s) - connection %pI4->%pI4 tos %d, reconnecting\n",
event->event, rds_ib_event_str(event->event),
&conn->c_laddr, &conn->c_faddr, conn->c_tos);
- conn->c_drop_source = 22;
+ conn->c_drop_source = DR_IB_QP_EVENT;
rds_conn_drop(conn);
break;
}
NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr),
conn->c_tos);
- conn->c_drop_source = 23;
+ conn->c_drop_source = DR_IB_BASE_CONN_DOWN;
rds_conn_drop(conn);
}
if (rds_conn_state(conn) == RDS_CONN_UP) {
rds_rtd(RDS_RTD_CM_EXT_P,
"incoming connect while connecting\n");
- conn->c_drop_source = 24;
+ conn->c_drop_source = DR_IB_REQ_WHILE_CONN_UP;
rds_conn_drop(conn);
rds_ib_stats_inc(s_ib_listen_closed_stale);
} else if (rds_conn_state(conn) == RDS_CONN_CONNECTING) {
NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr),
conn->c_tos);
- conn->c_drop_source = 25;
+ conn->c_drop_source = DR_IB_REQ_WHILE_CONNECTING;
rds_conn_drop(conn);
rds_ib_stats_inc(s_ib_listen_closed_stale);
} else {
err = rds_ib_setup_qp(conn);
if (err) {
- conn->c_drop_source = 26;
+ conn->c_drop_source = DR_IB_PAS_SETUP_QP_FAIL;
rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", err);
goto out;
}
/* rdma_accept() calls rdma_reject() internally if it fails */
err = rdma_accept(cm_id, &conn_param);
if (err) {
- conn->c_drop_source = 27;
+ conn->c_drop_source = DR_IB_RDMA_ACCEPT_FAIL;
rds_ib_conn_error(conn, "rdma_accept failed (%d)\n", err);
}
#if RDMA_RDS_APM_SUPPORTED
ret = rds_ib_setup_qp(conn);
if (ret) {
- conn->c_drop_source = 28;
+ conn->c_drop_source = DR_IB_ACT_SETUP_QP_FAIL;
rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", ret);
goto out;
}
ib_init_frag_size);
ret = rdma_connect(cm_id, &conn_param);
if (ret) {
- conn->c_drop_source = 29;
+ conn->c_drop_source = DR_IB_RDMA_CONNECT_FAIL;
rds_ib_conn_error(conn, "rdma_connect failed (%d)\n", ret);
}
recv->r_ibinc, sg_page(&recv->r_frag->f_sg),
(long) sg_dma_address(&recv->r_frag->f_sg), ret);
if (ret) {
- conn->c_drop_source = 60;
+ conn->c_drop_source = DR_IB_POST_RECV_FAIL;
rds_ib_conn_error(conn, "recv post on "
"%pI4 returned %d, disconnecting and "
"reconnecting\n", &conn->c_faddr,
rds_ib_stats_inc(s_ib_ack_send_failure);
- ic->conn->c_drop_source = 61;
+ ic->conn->c_drop_source = DR_IB_SEND_ACK_FAIL;
rds_ib_conn_error(ic->conn, "sending ack failed\n");
} else
rds_ib_stats_inc(s_ib_ack_sent);
data_len);
if (data_len < sizeof(struct rds_header)) {
- conn->c_drop_source = 62;
+ conn->c_drop_source = DR_IB_HEADER_MISSING;
rds_ib_conn_error(conn, "incoming message "
"from %pI4 didn't inclue a "
"header, disconnecting and "
/* Validate the checksum. */
if (!rds_message_verify_checksum(ihdr)) {
- conn->c_drop_source = 63;
+ conn->c_drop_source = DR_IB_HEADER_CORRUPTED;
rds_ib_conn_error(conn, "incoming message "
"from %pI4 has corrupted header - "
"forcing a reconnect\n",
|| hdr->h_len != ihdr->h_len
|| hdr->h_sport != ihdr->h_sport
|| hdr->h_dport != ihdr->h_dport) {
- conn->c_drop_source = 64;
+ conn->c_drop_source = DR_IB_FRAG_HEADER_MISMATCH;
rds_ib_conn_error(conn,
"fragment header mismatch; forcing reconnect\n");
return;
} else {
/* We expect errors as the qp is drained during shutdown */
if (rds_conn_up(conn) || rds_conn_connecting(conn)) {
- conn->c_drop_source = 65;
+ conn->c_drop_source = DR_IB_RECV_COMP_ERR;
rds_ib_conn_error(conn, "recv completion "
"<%pI4,%pI4,%d> had status %u "
"vendor_err %u, disconnecting and "
/* We expect errors as the qp is drained during shutdown */
if (wc->status != IB_WC_SUCCESS && rds_conn_up(conn)) {
- conn->c_drop_source = 66;
+ conn->c_drop_source = DR_IB_SEND_COMP_ERR;
rds_ib_conn_error(conn,
"send completion <%u.%u.%u.%u,%u.%u.%u.%u,%d> status "
"%u vendor_err %u, disconnecting and reconnecting\n",
prev->s_op = NULL;
}
- ic->conn->c_drop_source = 67;
+ ic->conn->c_drop_source = DR_IB_POST_SEND_FAIL;
rds_ib_conn_error(ic->conn, "ib_post_send failed\n");
goto out;
}
"- connection %pI4->%pI4, reconnecting\n",
event->event, &conn->c_laddr,
&conn->c_faddr);
- conn->c_drop_source = 120;
+ conn->c_drop_source = DR_IW_QP_EVENT;
rds_conn_drop(conn);
break;
}
if (!rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) {
if (rds_conn_state(conn) == RDS_CONN_UP) {
rdsdebug("incoming connect while connecting\n");
- conn->c_drop_source = 121;
+ conn->c_drop_source = DR_IW_REQ_WHILE_CONNECTING;
rds_conn_drop(conn);
rds_iw_stats_inc(s_iw_listen_closed_stale);
} else
err = rds_iw_setup_qp(conn);
if (err) {
- conn->c_drop_source = 122;
+ conn->c_drop_source = DR_IW_PAS_SETUP_QP_FAIL;
rds_iw_conn_error(conn, "rds_iw_setup_qp failed (%d)\n", err);
goto out;
}
err = rdma_accept(cm_id, &conn_param);
mutex_unlock(&conn->c_cm_lock);
if (err) {
- conn->c_drop_source = 123;
+ conn->c_drop_source = DR_IW_RDMA_ACCEPT_FAIL;
rds_iw_conn_error(conn, "rdma_accept failed (%d)\n", err);
goto out;
}
ret = rds_iw_setup_qp(conn);
if (ret) {
- conn->c_drop_source = 124;
+ conn->c_drop_source = DR_IW_ACT_SETUP_QP_FAIL;
rds_iw_conn_error(conn, "rds_iw_setup_qp failed (%d)\n", ret);
goto out;
}
ret = rdma_connect(cm_id, &conn_param);
if (ret) {
- conn->c_drop_source = 125;
+ conn->c_drop_source = DR_IW_RDMA_CONNECT_FAIL;
rds_iw_conn_error(conn, "rdma_connect failed (%d)\n", ret);
}
out:
recv->r_iwinc, recv->r_frag->f_page,
(long) recv->r_frag->f_mapped, ret);
if (ret) {
- conn->c_drop_source = 130;
+ conn->c_drop_source = DR_IW_POST_RECV_FAIL;
rds_iw_conn_error(conn, "recv post on "
"%pI4 returned %d, disconnecting and "
"reconnecting\n", &conn->c_faddr,
rds_iw_stats_inc(s_iw_ack_send_failure);
- ic->conn->c_drop_source = 131;
+ ic->conn->c_drop_source = DR_IW_SEND_ACK_FAIL;
rds_iw_conn_error(ic->conn, "sending ack failed\n");
} else
rds_iw_stats_inc(s_iw_ack_sent);
byte_len);
if (byte_len < sizeof(struct rds_header)) {
- conn->c_drop_source = 132;
+ conn->c_drop_source = DR_IW_HEADER_MISSING;
rds_iw_conn_error(conn, "incoming message "
"from %pI4 didn't inclue a "
"header, disconnecting and "
/* Validate the checksum. */
if (!rds_message_verify_checksum(ihdr)) {
- conn->c_drop_source = 133;
+ conn->c_drop_source = DR_IW_HEADER_CORRUPTED;
rds_iw_conn_error(conn, "incoming message "
"from %pI4 has corrupted header - "
"forcing a reconnect\n",
|| hdr->h_len != ihdr->h_len
|| hdr->h_sport != ihdr->h_sport
|| hdr->h_dport != ihdr->h_dport) {
- conn->c_drop_source = 134;
+ conn->c_drop_source = DR_IW_FRAG_HEADER_MISMATCH;
rds_iw_conn_error(conn,
"fragment header mismatch; forcing reconnect\n");
return;
if (wc.status == IB_WC_SUCCESS) {
rds_iw_process_recv(conn, recv, wc.byte_len, state);
} else {
- conn->c_drop_source = 135;
+ conn->c_drop_source = DR_IW_RECV_COMP_ERR;
rds_iw_conn_error(conn, "recv completion on "
"%pI4 had status %u, disconnecting and "
"reconnecting\n", &conn->c_faddr,
/* We expect errors as the qp is drained during shutdown */
if (wc.status != IB_WC_SUCCESS && rds_conn_up(conn)) {
- conn->c_drop_source = 136;
+ conn->c_drop_source = DR_IW_SEND_COMP_ERR;
rds_iw_conn_error(conn,
"send completion on %pI4 "
"had status %u, disconnecting and reconnecting\n",
"ADDR_RESOLVED: ret %d, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
ret, NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr), conn->c_tos);
- conn->c_drop_source = 40;
+ conn->c_drop_source = DR_IB_SET_IB_PATH_FAIL;
rds_conn_drop(conn);
ret = 0;
}
ibic = conn->c_transport_data;
if (ibic && ibic->i_cm_id == cm_id)
ibic->i_cm_id = NULL;
- conn->c_drop_source = 41;
+ conn->c_drop_source = DR_IB_RESOLVE_ROUTE_FAIL;
rds_conn_drop(conn);
}
} else if (conn->c_to_index < (RDS_RDMA_RESOLVE_TO_MAX_INDEX-1))
"ROUTE_RESOLVED: calling rds_conn_drop, conn %p <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
conn, NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr), conn->c_tos);
- conn->c_drop_source = 42;
+ conn->c_drop_source = DR_IB_RDMA_CM_ID_MISMATCH;
rds_conn_drop(conn);
}
}
"ROUTE_ERROR: conn %p, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
conn, NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr), conn->c_tos);
- conn->c_drop_source = 43;
+ conn->c_drop_source = DR_IB_ROUTE_ERR;
rds_conn_drop(conn);
}
break;
"ADDR_ERROR: conn %p, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
conn, NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr), conn->c_tos);
- conn->c_drop_source = 44;
+ conn->c_drop_source = DR_IB_ADDR_ERR;
rds_conn_drop(conn);
}
break;
"CONN/UNREACHABLE/RMVAL ERR: conn %p, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
conn, NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr), conn->c_tos);
- conn->c_drop_source = 45;
+ conn->c_drop_source = DR_IB_CONNECT_ERR;
rds_conn_drop(conn);
}
break;
if (!conn->c_tos) {
conn->c_proposed_version =
RDS_PROTOCOL_COMPAT_VERSION;
- conn->c_drop_source = 46;
+ conn->c_drop_source = DR_IB_CONSUMER_DEFINED_REJ;
rds_conn_drop(conn);
} else {
if (conn->c_loopback)
NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr),
conn->c_tos);
- conn->c_drop_source = 47;
+ conn->c_drop_source = DR_IB_REJECTED_EVENT;
rds_conn_drop(conn);
}
}
"ADDR_CHANGE: calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr),
conn->c_tos);
- conn->c_drop_source = 48;
+ conn->c_drop_source = DR_IB_ADDR_CHANGE;
rds_conn_drop(conn);
}
#else
"ADDR_CHANGE: calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr),
conn->c_tos);
- conn->c_drop_source = 48;
+ conn->c_drop_source = DR_IB_ADDR_CHANGE;
rds_conn_drop(conn);
}
#endif
rds_rtd(RDS_RTD_CM,
"DISCONNECT event - dropping connection %pI4->%pI4 tos %d\n",
&conn->c_laddr, &conn->c_faddr, conn->c_tos);
- conn->c_drop_source = 49;
+ conn->c_drop_source = DR_IB_DISCONNECTED_EVENT;
rds_conn_drop(conn);
break;
"dropping connection "
"%pI4->%pI4\n", &conn->c_laddr,
&conn->c_faddr);
- conn->c_drop_source = 50;
+ conn->c_drop_source = DR_IB_TIMEWAIT_EXIT;
rds_conn_drop(conn);
} else
printk(KERN_INFO "TIMEWAIT_EXIT event - conn=NULL\n");
#define RDS_RDMA_RESOLVE_TO_MAX_INDEX 5
#define RDS_ADDR_RES_TM_INDEX_MAX 5
+enum rds_conn_drop_src {
+ /* rds-core */
+ DR_DEFAULT,
+ DR_USER_RESET,
+ DR_INV_CONN_STATE,
+ DR_DOWN_TRANSITION_FAIL,
+ DR_CONN_DESTROY,
+ DR_ZERO_LANE_DOWN,
+ DR_CONN_CONNECT_FAIL,
+ DR_HB_TIMEOUT,
+ DR_RECONNECT_TIMEOUT,
+
+ /* ib_cm */
+ DR_IB_CONN_DROP_RACE,
+ DR_IB_NOT_CONNECTING_STATE,
+ DR_IB_QP_EVENT,
+ DR_IB_BASE_CONN_DOWN,
+ DR_IB_REQ_WHILE_CONN_UP,
+ DR_IB_REQ_WHILE_CONNECTING,
+ DR_IB_PAS_SETUP_QP_FAIL,
+ DR_IB_RDMA_ACCEPT_FAIL,
+ DR_IB_ACT_SETUP_QP_FAIL,
+ DR_IB_RDMA_CONNECT_FAIL,
+
+ /* event handling */
+ DR_IB_SET_IB_PATH_FAIL,
+ DR_IB_RESOLVE_ROUTE_FAIL,
+ DR_IB_RDMA_CM_ID_MISMATCH,
+ DR_IB_ROUTE_ERR,
+ DR_IB_ADDR_ERR,
+ DR_IB_CONNECT_ERR,
+ DR_IB_CONSUMER_DEFINED_REJ,
+ DR_IB_REJECTED_EVENT,
+ DR_IB_ADDR_CHANGE,
+ DR_IB_DISCONNECTED_EVENT,
+ DR_IB_TIMEWAIT_EXIT,
+
+ /* data path */
+ DR_IB_POST_RECV_FAIL,
+ DR_IB_SEND_ACK_FAIL,
+ DR_IB_HEADER_MISSING,
+ DR_IB_HEADER_CORRUPTED,
+ DR_IB_FRAG_HEADER_MISMATCH,
+ DR_IB_RECV_COMP_ERR,
+ DR_IB_SEND_COMP_ERR,
+ DR_IB_POST_SEND_FAIL,
+
+ /* special features like active bonding */
+ DR_IB_UMMOD,
+ DR_IB_ACTIVE_BOND_FAILOVER,
+ DR_IB_LOOPBACK_CONN_DROP,
+ DR_IB_ACTIVE_BOND_FAILBACK,
+
+ /* iWARP */
+ DR_IW_QP_EVENT,
+ DR_IW_REQ_WHILE_CONNECTING,
+ DR_IW_PAS_SETUP_QP_FAIL,
+ DR_IW_RDMA_ACCEPT_FAIL,
+ DR_IW_ACT_SETUP_QP_FAIL,
+ DR_IW_RDMA_CONNECT_FAIL,
+
+ DR_IW_POST_RECV_FAIL,
+ DR_IW_SEND_ACK_FAIL,
+ DR_IW_HEADER_MISSING,
+ DR_IW_HEADER_CORRUPTED,
+ DR_IW_FRAG_HEADER_MISMATCH,
+ DR_IW_RECV_COMP_ERR,
+ DR_IW_SEND_COMP_ERR,
+
+ /* TCP */
+ DR_TCP_STATE_CLOSE,
+ DR_TCP_SEND_FAIL,
+};
+
struct rds_connection {
struct hlist_node c_hash_node;
__be32 c_laddr;
unsigned int c_reconnect_racing;
unsigned int c_route_resolved;
- u8 c_drop_source;
+
+ enum rds_conn_drop_src c_drop_source;
};
static inline
struct rds_info_lengths *lens,
int (*visitor)(struct rds_connection *, void *),
size_t item_len);
-char *conn_drop_reason_str(u8 reason);
+char *conn_drop_reason_str(enum rds_conn_drop_src reason);
void __rds_conn_error(struct rds_connection *conn, const char *, ...)
__attribute__ ((format (printf, 2, 3)));
#define rds_conn_error(conn, fmt...) \
break;
case TCP_CLOSE_WAIT:
case TCP_CLOSE:
- conn->c_drop_source = 140;
+ conn->c_drop_source = DR_TCP_STATE_CLOSE;
rds_conn_drop(conn);
default:
break;
printk(KERN_WARNING "RDS/tcp: send to %u.%u.%u.%u "
"returned %d, disconnecting and reconnecting\n",
NIPQUAD(conn->c_faddr), ret);
- conn->c_drop_source = 141;
+ conn->c_drop_source = DR_TCP_SEND_FAIL;
rds_conn_drop(conn);
}
}
* drop the connection if it doesn't work out after a while
*/
conn->c_connection_start = get_seconds();
- conn->c_drop_source = 0;
+ conn->c_drop_source = DR_DEFAULT;
ret = conn->c_trans->conn_connect(conn);
rds_rtd(RDS_RTD_CM_EXT,
"reconnecting..., conn %p\n", conn);
rds_queue_reconnect(conn);
} else {
- conn->c_drop_source = 6;
+ conn->c_drop_source = DR_CONN_CONNECT_FAIL;
rds_conn_error(conn, "RDS: connect failed\n");
}
}
"RDS/IB: connection <%u.%u.%u.%u,%u.%u.%u.%u,%d> timed out (0x%lx,0x%lx)..discon and recon\n",
NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr),
conn->c_tos, conn->c_hb_start, now);
- conn->c_drop_source = 7;
+ conn->c_drop_source = DR_HB_TIMEOUT;
rds_conn_drop(conn);
return;
}
"conn not up, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr),
conn->c_tos);
- conn->c_drop_source = 8;
+ conn->c_drop_source = DR_RECONNECT_TIMEOUT;
rds_conn_drop(conn);
conn->c_reconnect_racing = 0;
}