ath11k: Drop multicast fragments
Fragmentation is used only with unicast frames. Drop multicast fragments to avoid any undesired behavior. Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1 v2 Cc: stable@vger.kernel.org Signed-off-by: Sriram R <srirrama@codeaurora.org> Signed-off-by: Jouni Malinen <jouni@codeaurora.org> Link: https://lore.kernel.org/r/20210511200110.1d53bfd20a8b.Ibb63283051bb5e2c45951932c6e1f351d5a73dc3@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
c3944a5621
commit
210f563b09
|
@ -260,6 +260,16 @@ static void ath11k_dp_rxdesc_set_msdu_len(struct ath11k_base *ab,
|
||||||
ab->hw_params.hw_ops->rx_desc_set_msdu_len(desc, len);
|
ab->hw_params.hw_ops->rx_desc_set_msdu_len(desc, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool ath11k_dp_rx_h_attn_is_mcbc(struct ath11k_base *ab,
|
||||||
|
struct hal_rx_desc *desc)
|
||||||
|
{
|
||||||
|
struct rx_attention *attn = ath11k_dp_rx_get_attention(ab, desc);
|
||||||
|
|
||||||
|
return ath11k_dp_rx_h_msdu_end_first_msdu(ab, desc) &&
|
||||||
|
(!!FIELD_GET(RX_ATTENTION_INFO1_MCAST_BCAST,
|
||||||
|
__le32_to_cpu(attn->info1)));
|
||||||
|
}
|
||||||
|
|
||||||
static void ath11k_dp_service_mon_ring(struct timer_list *t)
|
static void ath11k_dp_service_mon_ring(struct timer_list *t)
|
||||||
{
|
{
|
||||||
struct ath11k_base *ab = from_timer(ab, t, mon_reap_timer);
|
struct ath11k_base *ab = from_timer(ab, t, mon_reap_timer);
|
||||||
|
@ -3468,6 +3478,7 @@ static int ath11k_dp_rx_frag_h_mpdu(struct ath11k *ar,
|
||||||
u8 tid;
|
u8 tid;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
bool more_frags;
|
bool more_frags;
|
||||||
|
bool is_mcbc;
|
||||||
|
|
||||||
rx_desc = (struct hal_rx_desc *)msdu->data;
|
rx_desc = (struct hal_rx_desc *)msdu->data;
|
||||||
peer_id = ath11k_dp_rx_h_mpdu_start_peer_id(ar->ab, rx_desc);
|
peer_id = ath11k_dp_rx_h_mpdu_start_peer_id(ar->ab, rx_desc);
|
||||||
|
@ -3475,6 +3486,11 @@ static int ath11k_dp_rx_frag_h_mpdu(struct ath11k *ar,
|
||||||
seqno = ath11k_dp_rx_h_mpdu_start_seq_no(ar->ab, rx_desc);
|
seqno = ath11k_dp_rx_h_mpdu_start_seq_no(ar->ab, rx_desc);
|
||||||
frag_no = ath11k_dp_rx_h_mpdu_start_frag_no(ar->ab, msdu);
|
frag_no = ath11k_dp_rx_h_mpdu_start_frag_no(ar->ab, msdu);
|
||||||
more_frags = ath11k_dp_rx_h_mpdu_start_more_frags(ar->ab, msdu);
|
more_frags = ath11k_dp_rx_h_mpdu_start_more_frags(ar->ab, msdu);
|
||||||
|
is_mcbc = ath11k_dp_rx_h_attn_is_mcbc(ar->ab, rx_desc);
|
||||||
|
|
||||||
|
/* Multicast/Broadcast fragments are not expected */
|
||||||
|
if (is_mcbc)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!ath11k_dp_rx_h_mpdu_start_seq_ctrl_valid(ar->ab, rx_desc) ||
|
if (!ath11k_dp_rx_h_mpdu_start_seq_ctrl_valid(ar->ab, rx_desc) ||
|
||||||
!ath11k_dp_rx_h_mpdu_start_fc_valid(ar->ab, rx_desc) ||
|
!ath11k_dp_rx_h_mpdu_start_fc_valid(ar->ab, rx_desc) ||
|
||||||
|
|
Loading…
Reference in New Issue