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
Dieser Commit ist enthalten in:
Surabhi Vishnoi
2021-04-15 15:17:43 +05:30
committet von Madan Koyyalamudi
Ursprung 77fb0e3ac1
Commit 8c88323efe
3 geänderte Dateien mit 34 neuen und 19 gelöschten Zeilen

Datei anzeigen

@@ -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

Datei anzeigen

@@ -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,
};

Datei anzeigen

@@ -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;
}
}
}