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
Cette révision appartient à :
Surabhi Vishnoi
2021-04-15 15:17:43 +05:30
révisé par Madan Koyyalamudi
Parent 77fb0e3ac1
révision 8c88323efe
3 fichiers modifiés avec 34 ajouts et 19 suppressions

Voir le fichier

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

Voir le fichier

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

Voir le fichier

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