The last_rx timestamp which controls timeout of an Rx block ack session is not updated when a frame is received. This can result in the session timing out too early.
Not a huge deal because the AP will simply request a new session when it has more data to send. And many APs do not even enable session timeouts in which case our timeout handler remains inactive, too. But we should handle negotiated session timeouts correctly. ok? diff 02c3ac519701a4fe198f8ee3de592b34a39ee6f7 d1e8e8a7b10a061d0364e3a63366e646218124a7 blob - 92f77754c4dd9d8a340a24bc2ce6f89ca77e0f84 blob + 983c18557ae9bef84372346fd4833c530994faa3 --- sys/dev/pci/if_iwm.c +++ sys/dev/pci/if_iwm.c @@ -5121,6 +5121,9 @@ iwm_rx_reorder(struct iwm_softc *sc, struct mbuf *m, i if (rxba == NULL || tid != rxba->tid || rxba->sta_id != IWM_STATION_ID) return 0; + if (rxba->timeout != 0) + getmicrouptime(&rxba->last_rx); + /* Bypass A-MPDU re-ordering in net80211. */ rxi->rxi_flags |= IEEE80211_RXI_AMPDU_DONE; blob - 5cac83fd48ebe997a4cd7842730b0cb05f7c28ee blob + 1ac1ad3b420a9de838df6e2fc30d21c5bcb8661f --- sys/dev/pci/if_iwx.c +++ sys/dev/pci/if_iwx.c @@ -4202,6 +4202,9 @@ iwx_rx_reorder(struct iwx_softc *sc, struct mbuf *m, i if (rxba == NULL || tid != rxba->tid || rxba->sta_id != IWX_STATION_ID) return 0; + if (rxba->timeout != 0) + getmicrouptime(&rxba->last_rx); + /* Bypass A-MPDU re-ordering in net80211. */ rxi->rxi_flags |= IEEE80211_RXI_AMPDU_DONE;