lkml.org 
[lkml]   [2013]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[138/251] mac80211: fix duplicate retransmission detection
    3.6.11.9-rc1 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Johannes Berg <johannes.berg@intel.com>

    [ Upstream commit 6b0f32745dcfba01d7be33acd1b40306c7a914c6 ]

    The duplicate retransmission detection code in mac80211
    erroneously attempts to do the check for every frame,
    even frames that don't have a sequence control field or
    that don't use it (QoS-Null frames.)

    This is problematic because it causes the code to access
    data beyond the end of the SKB and depending on the data
    there will drop packets erroneously.

    Correct the code to not do duplicate detection for such
    frames.

    I found this error while testing AP powersave, it lead
    to retransmitted PS-Poll frames being dropped entirely
    as the data beyond the end of the SKB was always zero.

    Cc: stable@vger.kernel.org [all versions]
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    net/mac80211/rx.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
    index bd11c1c..56515ef 100644
    --- a/net/mac80211/rx.c
    +++ b/net/mac80211/rx.c
    @@ -805,8 +805,14 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
    struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
    struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

    - /* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
    - if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
    + /*
    + * Drop duplicate 802.11 retransmissions
    + * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery")
    + */
    + if (rx->skb->len >= 24 && rx->sta &&
    + !ieee80211_is_ctl(hdr->frame_control) &&
    + !ieee80211_is_qos_nullfunc(hdr->frame_control) &&
    + !is_multicast_ether_addr(hdr->addr1)) {
    if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
    rx->sta->last_seq_ctrl[rx->seqno_idx] ==
    hdr->seq_ctrl)) {
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-09-11 08:21    [W:2.214 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site