Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c6da115 authored by Surabhi Vishnoi's avatar Surabhi Vishnoi Committed by Madan Koyyalamudi
Browse files

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
parent 6e000465
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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

/**
 * mgmt_wakelock_reason - reasons mgmt_txrx might hold a wakelock
+2 −0
Original line number Diff line number Diff line
@@ -600,6 +600,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 {
@@ -724,6 +725,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
Original line number Diff line number Diff line
@@ -1063,8 +1063,9 @@ 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",
	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;
@@ -1083,7 +1084,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",
@@ -1141,15 +1143,21 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
		}
	}

	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]);
			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",
@@ -1178,16 +1186,20 @@ QDF_STATUS tgt_mgmt_txrx_rx_frame_handler(
		}
	}

	rx_handler = mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[MGMT_FRAME_TYPE_ALL];
	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);
			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_spin_unlock_bh(
				  &mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
				qdf_nbuf_free(buf);
				goto rx_handler_mem_free;
			}
		}
	}

	if (!rx_handler_head) {
		qdf_spin_unlock_bh(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);