ソースを参照

qcacmn: Add support to handle control frames in mgmt txrx

Firmware sends control frames in same wmi path as mgmt
frames. Currently, these frames will be dropped by mgmt
txrx component, so add support to handle control frames
in mgmt txrx component.

Change-Id: Ia046c1b3b25d40429a859e9c2659126b3d5eb3c0
CRs-Fixed: 2932123
Surabhi Vishnoi 4 年 前
コミット
8c88323efe

+ 1 - 0
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_main_i.h

@@ -36,6 +36,7 @@
 #define IEEE80211_FC0_TYPE_MASK             0x0c
 #define IEEE80211_FC0_SUBTYPE_MASK          0xf0
 #define IEEE80211_FC0_TYPE_MGT              0x00
+#define IEEE80211_FC0_TYPE_CTL              0x04
 
 /* for TYPE_MGT */
 #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ     0x00

+ 2 - 0
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h

@@ -618,6 +618,7 @@ struct action_frm_hdr {
  * @MGMT_ACTION_MCSC_REQ: MCSC request frame
  * @MGMT_ACTION_MCSC_RSP: MCSC response frame
  * @MGMT_FRAME_TYPE_ALL:         mgmt frame type for all type of frames
+ * @MGMT_CTRL_FRAME: Control Frames
  * @MGMT_MAX_FRAME_TYPE:         max. mgmt frame types
  */
 enum mgmt_frame_type {
@@ -743,6 +744,7 @@ enum mgmt_frame_type {
 	MGMT_ACTION_MCSC_REQ,
 	MGMT_ACTION_MCSC_RSP,
 	MGMT_FRAME_TYPE_ALL,
+	MGMT_CTRL_FRAME,
 	MGMT_MAX_FRAME_TYPE,
 };
 

+ 31 - 19
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_tgt_api.c

@@ -1066,9 +1066,10 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
 	mgmt_type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
 	mgmt_subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
 
-	if (mgmt_type != IEEE80211_FC0_TYPE_MGT) {
-		mgmt_txrx_err("Rx event doesn't conatin a mgmt. packet, %d",
-			mgmt_type);
+	if (mgmt_type != IEEE80211_FC0_TYPE_MGT &&
+	    mgmt_type != IEEE80211_FC0_TYPE_CTL) {
+		mgmt_txrx_err("Rx event doesn't contain a mgmt/ctrl packet, %d",
+			      mgmt_type);
 		qdf_nbuf_free(buf);
 		return QDF_STATUS_E_FAILURE;
 	}
@@ -1086,7 +1087,8 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	if ((mgmt_subtype == MGMT_SUBTYPE_BEACON ||
+	if (mgmt_type == IEEE80211_FC0_TYPE_MGT &&
+	    (mgmt_subtype == MGMT_SUBTYPE_BEACON ||
 	     mgmt_subtype == MGMT_SUBTYPE_PROBE_RESP) &&
 	    !(is_from_addr_valid && is_bssid_valid)) {
 		mgmt_txrx_debug_rl("from addr "QDF_MAC_ADDR_FMT" bssid addr "QDF_MAC_ADDR_FMT" not valid, modifying them",
@@ -1144,15 +1146,21 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
 		}
 	}
 
-	frm_type = mgmt_txrx_get_frm_type(mgmt_subtype, mpdu_data_ptr);
-	if (frm_type == MGMT_FRM_UNSPECIFIED) {
-		mgmt_txrx_debug_rl("Unspecified mgmt frame type fc: %x %x",
-				   wh->i_fc[0], wh->i_fc[1]);
-		qdf_nbuf_free(buf);
-		return QDF_STATUS_E_FAILURE;
+	if (mgmt_type == IEEE80211_FC0_TYPE_MGT) {
+		frm_type = mgmt_txrx_get_frm_type(mgmt_subtype, mpdu_data_ptr);
+		if (frm_type == MGMT_FRM_UNSPECIFIED) {
+			mgmt_txrx_debug_rl(
+			"Unspecified mgmt frame type fc: %x %x", wh->i_fc[0],
+								wh->i_fc[1]);
+			qdf_nbuf_free(buf);
+			return QDF_STATUS_E_FAILURE;
+		}
+	} else {
+		frm_type = MGMT_CTRL_FRAME;
 	}
 
-	if (!(mgmt_subtype == MGMT_SUBTYPE_BEACON ||
+	if (mgmt_type == IEEE80211_FC0_TYPE_MGT &&
+	    !(mgmt_subtype == MGMT_SUBTYPE_BEACON ||
 	      mgmt_subtype == MGMT_SUBTYPE_PROBE_RESP ||
 	      mgmt_subtype == MGMT_SUBTYPE_PROBE_REQ))
 		mgmt_txrx_debug("Rcvd mgmt frame subtype %x (frame type %u) from "QDF_MAC_ADDR_FMT", seq_num = %d, rssi = %d tsf_delta: %u",
@@ -1181,14 +1189,18 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
 		}
 	}
 
-	rx_handler = mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[MGMT_FRAME_TYPE_ALL];
-	if (rx_handler) {
-		status = wlan_mgmt_txrx_rx_handler_list_copy(rx_handler,
-				&rx_handler_head, &rx_handler_tail);
-		if (status != QDF_STATUS_SUCCESS) {
-			qdf_spin_unlock_bh(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
-			qdf_nbuf_free(buf);
-			goto rx_handler_mem_free;
+	if (mgmt_type == IEEE80211_FC0_TYPE_MGT) {
+		rx_handler =
+		mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[MGMT_FRAME_TYPE_ALL];
+		if (rx_handler) {
+			status = wlan_mgmt_txrx_rx_handler_list_copy(
+				rx_handler, &rx_handler_head, &rx_handler_tail);
+			if (status != QDF_STATUS_SUCCESS) {
+				qdf_spin_unlock_bh(
+				  &mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
+				qdf_nbuf_free(buf);
+				goto rx_handler_mem_free;
+			}
 		}
 	}