lkml.org 
[lkml]   [2018]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.18 38/76] mac80211: always account for A-MSDU header changes
    Date
    From: Johannes Berg <johannes.berg@intel.com>

    [ Upstream commit aa58acf325b4aadeecae2bfc90658273b47dbace ]

    In the error path of changing the SKB headroom of the second
    A-MSDU subframe, we would not account for the already-changed
    length of the first frame that just got converted to be in
    A-MSDU format and thus is a bit longer now.

    Fix this by doing the necessary accounting.

    It would be possible to reorder the operations, but that would
    make the code more complex (to calculate the necessary pad),
    and the headroom expansion should not fail frequently enough
    to make that worthwhile.

    Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    net/mac80211/tx.c | 12 +++++++-----
    1 file changed, 7 insertions(+), 5 deletions(-)

    diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
    index 1aac5e3c7eee..6ca0865de945 100644
    --- a/net/mac80211/tx.c
    +++ b/net/mac80211/tx.c
    @@ -3239,7 +3239,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,

    if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) +
    2 + pad))
    - goto out;
    + goto out_recalc;

    ret = true;
    data = skb_push(skb, ETH_ALEN + 2);
    @@ -3256,11 +3256,13 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
    head->data_len += skb->len;
    *frag_tail = skb;

    - flow->backlog += head->len - orig_len;
    - tin->backlog_bytes += head->len - orig_len;
    -
    - fq_recalc_backlog(fq, tin, flow);
    +out_recalc:
    + if (head->len != orig_len) {
    + flow->backlog += head->len - orig_len;
    + tin->backlog_bytes += head->len - orig_len;

    + fq_recalc_backlog(fq, tin, flow);
    + }
    out:
    spin_unlock_bh(&fq->lock);

    --
    2.17.1
    \
     
     \ /
      Last update: 2018-09-24 17:09    [W:4.392 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site