RDMA/i40iw: Fix refused connections
authorIsmail, Mustafa <mustafa.ismail@intel.com>
Mon, 18 Apr 2016 15:32:56 +0000 (10:32 -0500)
committerDoug Ledford <dledford@redhat.com>
Thu, 28 Apr 2016 20:32:53 +0000 (16:32 -0400)
Make sure cm_node is setup before sending SYN packet and
ORD/IRD negotiation.

Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw_cm.c

index 38f917a6c7784101247c6a59af14b21a73d85d0a..bdd4104db40d0ce226e70037a6ca33790d62ac11 100644 (file)
@@ -2852,7 +2852,6 @@ static struct i40iw_cm_node *i40iw_create_cm_node(
                                        void *private_data,
                                        struct i40iw_cm_info *cm_info)
 {
-       int ret;
        struct i40iw_cm_node *cm_node;
        struct i40iw_cm_listener *loopback_remotelistener;
        struct i40iw_cm_node *loopback_remotenode;
@@ -2922,29 +2921,6 @@ static struct i40iw_cm_node *i40iw_create_cm_node(
        memcpy(cm_node->pdata_buf, private_data, private_data_len);
 
        cm_node->state = I40IW_CM_STATE_SYN_SENT;
-       ret = i40iw_send_syn(cm_node, 0);
-
-       if (ret) {
-               if (cm_node->ipv4)
-                       i40iw_debug(cm_node->dev,
-                                   I40IW_DEBUG_CM,
-                                   "Api - connect() FAILED: dest addr=%pI4",
-                                   cm_node->rem_addr);
-               else
-                       i40iw_debug(cm_node->dev, I40IW_DEBUG_CM,
-                                   "Api - connect() FAILED: dest addr=%pI6",
-                                   cm_node->rem_addr);
-               i40iw_rem_ref_cm_node(cm_node);
-               cm_node = NULL;
-       }
-
-       if (cm_node)
-               i40iw_debug(cm_node->dev,
-                           I40IW_DEBUG_CM,
-                           "Api - connect(): port=0x%04x, cm_node=%p, cm_id = %p.\n",
-                           cm_node->rem_port,
-                           cm_node,
-                           cm_node->cm_id);
 
        return cm_node;
 }
@@ -3828,23 +3804,8 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
                                       conn_param->private_data_len,
                                       (void *)conn_param->private_data,
                                       &cm_info);
-       if (!cm_node) {
-               i40iw_manage_qhash(iwdev,
-                                  &cm_info,
-                                  I40IW_QHASH_TYPE_TCP_ESTABLISHED,
-                                  I40IW_QHASH_MANAGE_TYPE_DELETE,
-                                  NULL,
-                                  false);
-
-               if (apbvt_set && !i40iw_listen_port_in_use(&iwdev->cm_core,
-                                                          cm_info.loc_port))
-                       i40iw_manage_apbvt(iwdev,
-                                          cm_info.loc_port,
-                                          I40IW_MANAGE_APBVT_DEL);
-               cm_id->rem_ref(cm_id);
-               iwdev->cm_core.stats_connect_errs++;
-               return -ENOMEM;
-       }
+       if (!cm_node)
+               goto err;
 
        i40iw_record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord);
        if (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO &&
@@ -3857,7 +3818,49 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
        cm_node->iwqp = iwqp;
        iwqp->cm_id = cm_id;
        i40iw_add_ref(&iwqp->ibqp);
+
+       if (cm_node->state == I40IW_CM_STATE_SYN_SENT) {
+               if (i40iw_send_syn(cm_node, 0)) {
+                       i40iw_rem_ref_cm_node(cm_node);
+                       goto err;
+               }
+       }
+
+       i40iw_debug(cm_node->dev,
+                   I40IW_DEBUG_CM,
+                   "Api - connect(): port=0x%04x, cm_node=%p, cm_id = %p.\n",
+                   cm_node->rem_port,
+                   cm_node,
+                   cm_node->cm_id);
        return 0;
+
+err:
+       if (cm_node) {
+               if (cm_node->ipv4)
+                       i40iw_debug(cm_node->dev,
+                                   I40IW_DEBUG_CM,
+                                   "Api - connect() FAILED: dest addr=%pI4",
+                                   cm_node->rem_addr);
+               else
+                       i40iw_debug(cm_node->dev, I40IW_DEBUG_CM,
+                                   "Api - connect() FAILED: dest addr=%pI6",
+                                   cm_node->rem_addr);
+       }
+       i40iw_manage_qhash(iwdev,
+                          &cm_info,
+                          I40IW_QHASH_TYPE_TCP_ESTABLISHED,
+                          I40IW_QHASH_MANAGE_TYPE_DELETE,
+                          NULL,
+                          false);
+
+       if (apbvt_set && !i40iw_listen_port_in_use(&iwdev->cm_core,
+                                                  cm_info.loc_port))
+               i40iw_manage_apbvt(iwdev,
+                                  cm_info.loc_port,
+                                  I40IW_MANAGE_APBVT_DEL);
+       cm_id->rem_ref(cm_id);
+       iwdev->cm_core.stats_connect_errs++;
+       return -ENOMEM;
 }
 
 /**