Browse Source

qcacld-3.0: Don't send peer update after peer delete

During tdls peer delete, wmi command WMI_PEER_DELETE has been
send but later on from driver wmi command for peer update is
send without checking for peer reference before sending to fw.

Fix, to check for peer reference before posting the cmd to fw.

change-ID: I216d1ad726af3369c227ae566e22949cadb8300c
CRs-Fixed: 2667811
Pankaj Singh 5 years ago
parent
commit
8e2e7b47a3

+ 15 - 2
components/tdls/core/src/wlan_tdls_cmds_process.c

@@ -490,8 +490,11 @@ static QDF_STATUS tdls_activate_add_peer(struct tdls_add_peer_request *req)
 				  TDLS_LINK_CONNECTING, TDLS_LINK_SUCCESS);
 
 	status = tdls_pe_add_peer(req);
-	if (QDF_IS_STATUS_ERROR(status))
+	if (QDF_IS_STATUS_ERROR(status)) {
+		tdls_err(QDF_MAC_ADDR_STR " add peer failed with status %d",
+			 QDF_MAC_ADDR_ARRAY(mac), status);
 		goto setlink;
+	}
 
 	return QDF_STATUS_SUCCESS;
 
@@ -950,8 +953,11 @@ tdls_activate_update_peer(struct tdls_update_peer_request *req)
 
 	tdls_set_peer_caps(vdev_obj, mac, &req->update_peer_req);
 	status = tdls_pe_update_peer(req);
-	if (QDF_IS_STATUS_ERROR(status))
+	if (QDF_IS_STATUS_ERROR(status)) {
+		tdls_err(QDF_MAC_ADDR_STR " update peer failed with status %d",
+			 QDF_MAC_ADDR_ARRAY(mac), status);
 		goto setlink;
+	}
 
 	return QDF_STATUS_SUCCESS;
 
@@ -1182,6 +1188,13 @@ QDF_STATUS tdls_process_del_peer(struct tdls_oper_request *req)
 		goto error;
 	}
 
+	if (!peer->valid_entry) {
+		tdls_err("invalid peer:" QDF_MAC_ADDR_STR " link state %d",
+			 QDF_MAC_ADDR_ARRAY(mac), peer->link_status);
+		status = QDF_STATUS_E_INVAL;
+		goto error;
+	}
+
 	if (soc_obj->tdls_dp_vdev_update)
 		soc_obj->tdls_dp_vdev_update(&soc_obj->soc,
 					     wlan_vdev_get_id(vdev),

+ 5 - 1
components/tdls/core/src/wlan_tdls_ct.c

@@ -522,8 +522,12 @@ void tdls_indicate_teardown(struct tdls_vdev_priv_obj *tdls_vdev,
 		return;
 	}
 
-	if (TDLS_LINK_CONNECTED != curr_peer->link_status)
+	if (curr_peer->link_status != TDLS_LINK_CONNECTED) {
+		tdls_err("link state %d peer:" QDF_MAC_ADDR_STR,
+			 curr_peer->link_status,
+			 QDF_MAC_ADDR_ARRAY(curr_peer->peer_mac.bytes));
 		return;
+	}
 
 	tdls_set_peer_link_status(curr_peer,
 				  TDLS_LINK_TEARING,

+ 3 - 0
components/tdls/core/src/wlan_tdls_peer.c

@@ -613,6 +613,9 @@ void tdls_set_peer_link_status(struct tdls_peer *peer,
 	struct tdls_soc_priv_obj *soc_obj;
 	struct tdls_vdev_priv_obj *vdev_obj;
 
+	tdls_debug("state %d reason %d peer:" QDF_MAC_ADDR_STR,
+		   link_status, link_reason,
+		   QDF_MAC_ADDR_ARRAY(peer->peer_mac.bytes));
 	peer->link_status = link_status;
 
 	if (link_status >= TDLS_LINK_DISCOVERED)

+ 3 - 0
core/wma/inc/wma.h

@@ -1737,6 +1737,9 @@ QDF_STATUS wma_peer_unmap_conf_cb(uint8_t vdev_id,
 				  uint32_t peer_id_cnt,
 				  uint16_t *peer_id_list);
 
+bool wma_objmgr_peer_exist(tp_wma_handle wma,
+			   uint8_t *peer_addr, uint8_t *peer_vdev_id);
+
 /**
  * wma_get_cca_stats() - send request to fw to get CCA
  * @wmi_hdl: wma handle

+ 4 - 4
core/wma/src/wma_dev_if.c

@@ -1533,8 +1533,8 @@ QDF_STATUS wma_peer_unmap_conf_cb(uint8_t vdev_id,
 	return qdf_status;
 }
 
-static bool wma_objmgr_peer_exist(tp_wma_handle wma, uint8_t vdev_id,
-				  uint8_t *peer_addr, uint8_t *peer_vdev_id)
+bool wma_objmgr_peer_exist(tp_wma_handle wma,
+			   uint8_t *peer_addr, uint8_t *peer_vdev_id)
 {
 	struct wlan_objmgr_peer *peer;
 
@@ -1587,7 +1587,7 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *mac_addr,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (!wma_objmgr_peer_exist(wma, vdev_id, peer_addr, NULL)) {
+	if (!wma_objmgr_peer_exist(wma, peer_addr, NULL)) {
 		wma_err("peer doesn't exist peer_addr %pM vdevid %d peer_count %d",
 			 peer_addr, vdev_id,
 			 wma->interfaces[vdev_id].peer_count);
@@ -1737,7 +1737,7 @@ static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
 	 * Check if peer with same MAC exist on any Vdev, If so avoid
 	 * adding this peer.
 	 */
-	if (wma_objmgr_peer_exist(wma, vdev_id, peer_addr, &peer_vdev_id)) {
+	if (wma_objmgr_peer_exist(wma, peer_addr, &peer_vdev_id)) {
 		wma_info("Peer %pM already exist on vdev %d, current vdev %d",
 			  peer_addr, peer_vdev_id, vdev_id);
 		return NULL;

+ 9 - 0
core/wma/src/wma_features.c

@@ -3812,6 +3812,15 @@ int wma_update_tdls_peer_state(WMA_HANDLE handle,
 		goto end_tdls_peer_state;
 	}
 
+
+	if (!wma_objmgr_peer_exist(wma_handle,
+				   peer_state->peer_macaddr, NULL)) {
+		wma_err("peer:" QDF_MAC_ADDR_STR "doesn't exist",
+			QDF_MAC_ADDR_ARRAY(peer_state->peer_macaddr));
+		ret = -EINVAL;
+		goto end_tdls_peer_state;
+	}
+
 	peer_cap = &peer_state->peer_cap;
 
 	/* peer capability info is valid only when peer state is connected */