lkml.org 
[lkml]   [2020]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 015/130] mac80211: don't overwrite QoS TID of injected frames
    Date
    From: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>

    [ Upstream commit 527d675969a1dff17baa270d4447ac1c87058299 ]

    Currently ieee80211_set_qos_hdr sets the QoS TID of all frames based
    on the value assigned to skb->priority. This means it will also
    overwrite the QoS TID of injected frames. The commit 753ffad3d624
    ("mac80211: fix TID field in monitor mode transmit") prevented
    injected frames from being modified because of this by setting
    skb->priority to the TID of the injected frame, which assured the
    QoS TID will not be changed to a different value. Unfortunately,
    this workaround complicates the handling of injected frames because
    we can't set skb->priority without affecting the TID value in the
    QoS field of injected frames.

    To avoid this, and to simplify the next patch, detect if a frame is
    injected in ieee80211_set_qos_hdr and if so do not change its QoS
    field.

    Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
    Link: https://lore.kernel.org/r/20201104061823.197407-4-Mathy.Vanhoef@kuleuven.be
    [fix typos in commit message]
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/mac80211/tx.c | 5 +----
    net/mac80211/wme.c | 8 ++++++++
    2 files changed, 9 insertions(+), 4 deletions(-)

    diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
    index 30a0c7c6224b3..11085a4b5ee3a 100644
    --- a/net/mac80211/tx.c
    +++ b/net/mac80211/tx.c
    @@ -2280,10 +2280,7 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
    payload[7]);
    }

    - /*
    - * Initialize skb->priority for QoS frames. This is put in the TID field
    - * of the frame before passing it to the driver.
    - */
    + /* Initialize skb->priority for QoS frames */
    if (ieee80211_is_data_qos(hdr->frame_control)) {
    u8 *p = ieee80211_get_qos_ctl(hdr);
    skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
    diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c
    index 72920d82928c4..8cd157e67fc77 100644
    --- a/net/mac80211/wme.c
    +++ b/net/mac80211/wme.c
    @@ -249,6 +249,14 @@ void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,

    p = ieee80211_get_qos_ctl(hdr);

    + /* don't overwrite the QoS field of injected frames */
    + if (info->flags & IEEE80211_TX_CTL_INJECTED) {
    + /* do take into account Ack policy of injected frames */
    + if (*p & IEEE80211_QOS_CTL_ACK_POLICY_NOACK)
    + info->flags |= IEEE80211_TX_CTL_NO_ACK;
    + return;
    + }
    +
    /* set up the first byte */

    /*
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-12-23 04:06    [W:4.380 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site