• Michal Kazior's avatar
    mac80211: fix unnecessary frame drops in mesh fwding · cf440128
    Michal Kazior authored
    The ieee80211_queue_stopped() expects hw queue
    number but it was given raw WMM AC number instead.
    
    This could cause frame drops and problems with
    traffic in some cases - most notably if driver
    doesn't map AC numbers to queue numbers 1:1 and
    uses ieee80211_stop_queues() and
    ieee80211_wake_queue() only without ever calling
    ieee80211_wake_queues().
    
    On ath10k it was possible to hit this problem in
    the following case:
    
      1. wlan0 uses queue 0
         (ath10k maps queues per vif)
      2. offchannel uses queue 15
      3. queues 1-14 are unused
      4. ieee80211_stop_queues()
      5. ieee80211_wake_queue(q=0)
      6. ieee80211_wake_queue(q=15)
         (other queues are not woken up because both
          driver and mac80211 know other queues are
          unused)
      7. ieee80211_rx_h_mesh_fwding()
      8. ieee80211_select_queue_80211() returns 2
      9. ieee80211_queue_stopped(q=2) returns true
     10. frame is dropped (oops!)
    
    Fixes: d3c1597b ("mac80211: fix forwarded mesh frame queue mapping")
    Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    cf440128
rx.c 102 KB