@@ -1997,6 +1997,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
__le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_NOFORWARD);
u16 q, hdrlen;
+ unsigned long qreason;
hdr = (struct ieee80211_hdr *) skb->data;
hdrlen = ieee80211_hdrlen(hdr->frame_control);
@@ -2064,7 +2065,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
return RX_CONTINUE;
q = ieee80211_select_queue_80211(sdata, skb, hdr);
- if (ieee80211_queue_stopped(&local->hw, q)) {
+ qreason = ieee80211_queue_stopped(&local->hw, q);
+ if (qreason & ~(IEEE80211_QUEUE_STOP_REASON_SKB_ADD |
+ IEEE80211_QUEUE_STOP_REASON_AGGREGATION)) {
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion);
return RX_DROP_MONITOR;
}
In case of the HW asking mac80211 to back off, the queues would be stopped with reason DRIVER. Limit dropping forwarded mesh data frames by putting them on the pending queue anyway if the outgoing HW queues appear to be only momentarily stopped. Signed-off-by: Thomas Pedersen <thomas@cozybit.com> --- net/mac80211/rx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)