/* Check whether the remote protocol version matches ours. */
        version = rds_ib_protocol_compatible(event, isv6);
-       if (!version)
+       if (!version) {
+               err = RDS_RDMA_REJ_INCOMPAT;
                goto out;
+       }
 
        dp = event->param.conn.private_data;
        if (isv6) {
        if (conn)
                mutex_unlock(&conn->c_cm_lock);
        if (err)
-               rdma_reject(cm_id, NULL, 0);
+               rdma_reject(cm_id, &err, sizeof(int));
        return destroy;
 }
 
 
        struct rds_connection *conn = cm_id->context;
        struct rds_transport *trans;
        int ret = 0;
+       int *err;
+       u8 len;
 
        rdsdebug("conn %p id %p handling event %u (%s)\n", conn, cm_id,
                 event->event, rdma_event_msg(event->event));
                break;
 
        case RDMA_CM_EVENT_REJECTED:
+               if (!conn)
+                       break;
+               err = (int *)rdma_consumer_reject_data(cm_id, event, &len);
+               if (!err || (err && ((*err) == RDS_RDMA_REJ_INCOMPAT))) {
+                       pr_warn("RDS/RDMA: conn <%pI6c, %pI6c> rejected, dropping connection\n",
+                               &conn->c_laddr, &conn->c_faddr);
+                       conn->c_proposed_version = RDS_PROTOCOL_COMPAT_VERSION;
+                       rds_conn_drop(conn);
+               }
                rdsdebug("Connection rejected: %s\n",
                         rdma_reject_msg(cm_id, event->status));
+               break;
                /* FALLTHROUGH */
        case RDMA_CM_EVENT_ADDR_ERROR:
        case RDMA_CM_EVENT_ROUTE_ERROR:
 
 
 #define RDS_RDMA_RESOLVE_TIMEOUT_MS     5000
 
+/* Below reject reason is for legacy interoperability issue with non-linux
+ * RDS endpoints where older version incompatibility is conveyed via value 1.
+ * For future version(s), proper encoded reject reason should be be used.
+ */
+#define RDS_RDMA_REJ_INCOMPAT          1
+
 int rds_rdma_conn_connect(struct rds_connection *conn);
 int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id,
                              struct rdma_cm_event *event);