conn->c_reconnect_warn = 1;
conn->c_reconnect_drops = 0;
conn->c_reconnect_err = 0;
+ printk(KERN_INFO "RDS/IB: connection "
+ "<%u.%u.%u.%u,%u.%u.%u.%u,%d> dropped\n",
+ NIPQUAD(conn->c_laddr),
+ NIPQUAD(conn->c_faddr),
+ conn->c_tos);
} else if ((conn->c_reconnect_warn) &&
(now - conn->c_reconnect_start > 60)) {
- printk(KERN_INFO "RDS/IB: re-connect to %u.%u.%u.%u is "
- "stalling for more than 1 min...(drops=%u err=%d)\n",
- NIPQUAD(conn->c_faddr), conn->c_reconnect_drops,
+ printk(KERN_INFO "RDS/IB: re-connect "
+ "<%u.%u.%u.%u,%u.%u.%u.%u,%d> stalling "
+ "for more than 1 min...(drops=%u err=%d)\n",
+ NIPQUAD(conn->c_laddr),
+ NIPQUAD(conn->c_faddr),
+ conn->c_tos,
+ conn->c_reconnect_drops,
conn->c_reconnect_err);
conn->c_reconnect_warn = 0;
}
goto out;
}
+ if (conn->c_reconnect && (conn->c_version != version)) {
+ printk(KERN_WARNING "RDS/IB: connection "
+ "<%u.%u.%u.%u,%u.%u.%u.%u,%d,%u.%u> rejecting version "
+ "(%u/%u)\n",
+ NIPQUAD(conn->c_laddr),
+ NIPQUAD(conn->c_faddr),
+ conn->c_tos,
+ RDS_PROTOCOL_MAJOR(conn->c_version),
+ RDS_PROTOCOL_MINOR(conn->c_version),
+ RDS_PROTOCOL_MAJOR(version),
+ RDS_PROTOCOL_MINOR(version));
+
+ conn = NULL;
+ goto out;
+ }
+
/*
* The connection request may occur while the
* previous connection exist, e.g. in case of failover.
*/
if (now > conn->c_connection_start &&
now - conn->c_connection_start > 15) {
- printk(KERN_CRIT "rds connection racing for 15s, forcing reset "
- "connection %u.%u.%u.%u->%u.%u.%u.%u\n",
- NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr));
+ printk(KERN_CRIT "RDS/IB: connection "
+ "<%u.%u.%u.%u,%u.%u.%u.%u,%d> "
+ "racing for 15s, forcing reset ",
+ NIPQUAD(conn->c_laddr),
+ NIPQUAD(conn->c_faddr),
+ conn->c_tos);
rds_conn_drop(conn);
rds_ib_stats_inc(s_ib_listen_closed_stale);
} else {
/* If the peer doesn't do protocol negotiation, we must
* default to RDSv3.0 */
- rds_ib_set_protocol(conn, RDS_PROTOCOL_4_0);
+ rds_ib_set_protocol(conn, RDS_PROTOCOL_4_1);
ic->i_flowctl = rds_ib_sysctl_flow_control; /* advertise flow control */
ret = rds_ib_setup_qp(conn);
#include <net/sock.h>
#include <net/inet_common.h>
-#define RDS_IB_REJ_CONSUMER_DEFINED 28
+#define RDS_REJ_CONSUMER_DEFINED 28
static struct rdma_cm_id *rds_iw_listen_id;
case RDMA_CM_EVENT_REJECTED:
err = (int *)event->param.conn.private_data;
if (conn) {
- if ((*err) == 0 &&
- event->status == RDS_IB_REJ_CONSUMER_DEFINED) {
- /* rejection from 3.x protocol */
- if (!conn->c_tos) {
- /* retry the connect with a
- * lower compatible protocol */
+ if (!conn->c_reconnect) {
+ if ((*err) == 0 &&
+ event->status == RDS_REJ_CONSUMER_DEFINED) {
+ /* rejection from 3.x protocol */
+ if (!conn->c_tos) {
+ /* retry the connect with a
+ lower compatible protocol */
+ conn->c_proposed_version =
+ RDS_PROTOCOL_COMPAT_VERSION;
+ }
+ } else {
conn->c_proposed_version =
- RDS_PROTOCOL_COMPAT_VERSION;
- rds_conn_drop(conn);
+ RDS_PROTOCOL_VERSION;
}
- } else
- rds_conn_drop(conn);
+ }
+ rds_conn_drop(conn);
}
break;