Explorar o código

qcacld-3.0: Set peer link status properly

Since peer link status bases on vdev and stream goes through
vdev0 (assoc link) at start, rx/tx pkt count on vdev0, but
it choices vdev1 as tdls link, the peer status does not change on
vdev1 though it has been changed for vdev0 per the rx/tx pkt count.

To resolve this issue, set peer link status properly when forward
discovery response frame.

CRs-Fixed: 3590371
Change-Id: Idfb0b8c43e3b8d5b67a387ba3b877def15130eb6
Paul Zhang hai 1 ano
pai
achega
efb48cb5c3

+ 16 - 8
components/tdls/core/src/wlan_tdls_ct.c

@@ -549,6 +549,16 @@ int tdls_recv_discovery_resp(struct tdls_vdev_priv_obj *tdls_vdev,
 		   QDF_MAC_ADDR_REF(curr_peer->peer_mac.bytes),
 		   curr_peer->link_status);
 
+	/* Since peer link status bases on vdev and stream goes through
+	 * vdev0 (assoc link) at start, rx/tx pkt count on vdev0, but
+	 * it choices vdev1 as tdls link, the peer status does not change on
+	 * vdev1 though it has been changed for vdev0 per the rx/tx pkt count.
+	 */
+	if (wlan_vdev_mlme_is_mlo_vdev(tdls_vdev->vdev) &&
+	    curr_peer->link_status == TDLS_LINK_IDLE)
+		tdls_set_peer_link_status(curr_peer, TDLS_LINK_DISCOVERING,
+					  TDLS_LINK_SUCCESS);
+
 	tdls_cfg = &tdls_vdev->threshold_config;
 	if (TDLS_LINK_DISCOVERING == curr_peer->link_status) {
 		/* Since we are here, it means Throughput threshold is
@@ -865,11 +875,11 @@ static void tdls_ct_process_cap_supported(struct tdls_peer *curr_peer,
 					struct tdls_soc_priv_obj *tdls_soc_obj)
 {
 	if (curr_peer->rx_pkt || curr_peer->tx_pkt)
-		tdls_debug(QDF_MAC_ADDR_FMT "link_status %d tdls_support %d tx %d rx %d rssi %d",
+		tdls_debug(QDF_MAC_ADDR_FMT "link_status %d tdls_support %d tx %d rx %d rssi %d vdev %d",
 			   QDF_MAC_ADDR_REF(curr_peer->peer_mac.bytes),
 			   curr_peer->link_status, curr_peer->tdls_support,
 			   curr_peer->tx_pkt, curr_peer->rx_pkt,
-			   curr_peer->rssi);
+			   curr_peer->rssi, wlan_vdev_get_id(tdls_vdev->vdev));
 
 	switch (curr_peer->link_status) {
 	case TDLS_LINK_IDLE:
@@ -910,10 +920,11 @@ static void tdls_ct_process_cap_unknown(struct tdls_peer *curr_peer,
 			return;
 
 	if (curr_peer->rx_pkt || curr_peer->tx_pkt)
-		tdls_debug(QDF_MAC_ADDR_FMT "link_status %d tdls_support %d tx %d rx %d",
+		tdls_debug(QDF_MAC_ADDR_FMT "link_status %d tdls_support %d tx %d rx %d vdev %d",
 			   QDF_MAC_ADDR_REF(curr_peer->peer_mac.bytes),
 			   curr_peer->link_status, curr_peer->tdls_support,
-			   curr_peer->tx_pkt, curr_peer->rx_pkt);
+			   curr_peer->tx_pkt, curr_peer->rx_pkt,
+			   wlan_vdev_get_id(tdls_vdev->vdev));
 
 	if (!TDLS_IS_LINK_CONNECTED(curr_peer) &&
 	    ((curr_peer->tx_pkt + curr_peer->rx_pkt) >=
@@ -1025,7 +1036,7 @@ void tdls_ct_handler(void *user_data)
 	if (!user_data)
 		return;
 
-	vdev = tdls_get_vdev(user_data, WLAN_TDLS_NB_ID);
+	vdev = (struct wlan_objmgr_vdev *)user_data;
 	if (!vdev)
 		return;
 
@@ -1040,9 +1051,6 @@ void tdls_ct_handler(void *user_data)
 	} else {
 		tdls_ct_process_handler(vdev);
 	}
-
-	wlan_objmgr_vdev_release_ref(vdev,
-				     WLAN_TDLS_NB_ID);
 }
 
 int tdls_set_tdls_offchannel(struct tdls_soc_priv_obj *tdls_soc,

+ 1 - 1
components/tdls/core/src/wlan_tdls_main.c

@@ -205,7 +205,7 @@ static QDF_STATUS tdls_vdev_init(struct tdls_vdev_priv_obj *vdev_obj)
 				WLAN_TDLS_PEER_SUB_LIST_SIZE);
 	}
 	qdf_mc_timer_init(&vdev_obj->peer_update_timer, QDF_TIMER_TYPE_SW,
-			  tdls_ct_handler, soc_obj->soc);
+			  tdls_ct_handler, vdev_obj->vdev);
 	qdf_mc_timer_init(&vdev_obj->peer_discovery_timer, QDF_TIMER_TYPE_SW,
 			  tdls_discovery_timeout_peer_cb, vdev_obj->vdev);