Explorar el Código

qcacld-3.0: Enhancements for link switch disconnect

For link switch disconnect do not send the deauth/disassoc frame
OTA and avoid flow pool unmap as to avoid flushing the memory
allocated for the packets sent OTA for which status is not yet
received.

Once the status is received DP flushes them via the
non-transitioning link.

Change-Id: If2ec024f19730f6ebebf0428f912bfa8dbbddea9
CRs-Fixed: 3557779
Vinod Kumar Pirla hace 1 año
padre
commit
863127e879

+ 5 - 2
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -84,7 +84,9 @@ QDF_STATUS cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 		cm_csr_set_ss_none(req->vdev_id);
 	}
 
-	user_disconnect = req->source == CM_OSIF_DISCONNECT ? true : false;
+	user_disconnect =
+		(req->source == CM_OSIF_DISCONNECT ||
+		 req->source == CM_MLO_LINK_SWITCH_DISCONNECT) ? true : false;
 	if (user_disconnect) {
 		wlan_p2p_cleanup_roc_by_vdev(vdev, false);
 		wlan_tdls_notify_sta_disconnect(req->vdev_id, false,
@@ -92,7 +94,8 @@ QDF_STATUS cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 	}
 	cm_abort_connect_request_timers(vdev);
 
-	if (req->source != CM_MLO_ROAM_INTERNAL_DISCONNECT) {
+	if (req->source != CM_MLO_ROAM_INTERNAL_DISCONNECT &&
+	    req->source != CM_MLO_LINK_SWITCH_DISCONNECT) {
 		mlme_debug("Free copied reassoc rsp");
 		mlo_roam_free_copied_reassoc_rsp(vdev);
 	}

+ 22 - 0
core/hdd/src/wlan_hdd_main.c

@@ -15845,8 +15845,30 @@ static void hdd_v2_flow_pool_map(int vdev_id)
  */
 static void hdd_v2_flow_pool_unmap(int vdev_id)
 {
+	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	struct wlan_objmgr_vdev *vdev;
+
+	if (!hdd_ctx) {
+		hdd_err("HDD context null");
+		return;
+	}
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(hdd_ctx->psoc, vdev_id,
+						    WLAN_OSIF_ID);
+	if (!vdev) {
+		hdd_err("Invalid VDEV %d", vdev_id);
+		return;
+	}
+
+	if (wlan_vdev_mlme_is_mlo_link_switch_in_progress(vdev)) {
+		hdd_info("Link switch ongoing do not invoke flow pool unmap");
+		goto release_ref;
+	}
+
 	cdp_flow_pool_unmap(cds_get_context(QDF_MODULE_ID_SOC),
 			    OL_TXRX_PDEV_ID, vdev_id);
+release_ref:
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
 }
 
 static void hdd_hastings_bt_war_initialize(struct hdd_context *hdd_ctx)

+ 4 - 1
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -4750,6 +4750,8 @@ static void lim_prepare_and_send_disassoc(struct mac_context *mac_ctx,
 		disassoc_req.doNotSendOverTheAir = 1;
 		disassoc_req.reasonCode =
 					REASON_AUTHORIZED_ACCESS_LIMIT_REACHED;
+	} else if (req->req.reason_code == CM_MLO_LINK_SWITCH_DISCONNECT) {
+		disassoc_req.doNotSendOverTheAir = 1;
 	}
 
 	msg.bodyptr = &disassoc_req;
@@ -4897,7 +4899,8 @@ lim_cm_handle_disconnect_req(struct wlan_cm_vdev_discon_req *req)
 	}
 
 	if (req->req.source == CM_PEER_DISCONNECT ||
-	    req->req.source == CM_SB_DISCONNECT)
+	    req->req.source == CM_SB_DISCONNECT ||
+	    req->req.source == CM_MLO_LINK_SWITCH_DISCONNECT)
 		lim_process_sb_disconnect_req(mac_ctx, pe_session, req);
 	else
 		lim_process_nb_disconnect_req(mac_ctx, pe_session, req);

+ 2 - 0
core/sme/src/csr/csr_api_roam.c

@@ -5850,6 +5850,8 @@ QDF_STATUS cm_csr_handle_diconnect_req(struct wlan_objmgr_vdev *vdev,
 			/* Unknown reason code */
 			break;
 		}
+	} else if (req->req.source == CM_MLO_LINK_SWITCH_DISCONNECT) {
+		/* Do not update any stats as session is going to be deleted*/
 	} else {
 		session->disconnect_stats.disconnection_by_app++;
 	}