wil6210: Drop unicast sub frame if part of a multicast amsdu

Check that for a given multicast amsdu frame, all its sub frames are
multicast also, if not, means if found a unicast sub frame, drop it
and all the next sub frames for the same multicast amsdu.

Change-Id: Ib9bcc45d9fcafec11c9c2a786fcabf278a666cb4
Signed-off-by: Ahmad Masri <amasri@codeaurora.org>
This commit is contained in:
Ahmad Masri 2021-03-07 13:06:08 +02:00 committed by Gerrit - the friendly Code Review server
parent e18073515c
commit 1fc0fad0d9
2 changed files with 15 additions and 3 deletions

View File

@ -859,9 +859,20 @@ static int wil_check_amsdu(struct wil6210_priv *wil, void *msg, int cid,
switch (vif->wdev.iftype) {
case NL80211_IFTYPE_STATION:
case NL80211_IFTYPE_P2P_CLIENT:
/* check if the MSDU (a sub-frame of AMSDU) is multicast */
if (is_multicast_ether_addr(da))
return 0;
/* check if the current AMSDU (MPDU) frame is a multicast.
* If so we have unicast sub frame as part of a multicast
* AMSDU. Current frame and all sub frames should be dropped.
*/
if (wil_rx_status_get_mcast(msg)) {
wil_dbg_txrx(wil,
"Found unicast sub frame in a multicast mpdu. Drop it\n");
goto out;
}
/* On client side, DA should be the client mac address */
ndev = vif_to_ndev(vif);
if (ether_addr_equal(ndev->dev_addr, da))
@ -882,12 +893,13 @@ static int wil_check_amsdu(struct wil6210_priv *wil, void *msg, int cid,
return 0;
}
out:
sta->amsdu_drop_sn = seq;
sta->amsdu_drop_tid = tid;
sta->amsdu_drop = 1;
wil_dbg_txrx(wil,
"Drop AMSDU frame, sn=%d. Drop this and all next sub frames\n",
seq);
"Drop AMSDU frame, sn=%d tid=%d. Drop this and all next sub frames\n",
seq, tid);
return -EAGAIN;
}

View File

@ -372,7 +372,7 @@ static inline u16 wil_rx_status_get_flow_id(void *msg)
static inline u8 wil_rx_status_get_mcast(void *msg)
{
return WIL_GET_BITS(((struct wil_rx_status_compressed *)msg)->d0,
26, 26);
25, 26);
}
/**