* Dispatch as many frames as possible from the re-order queue. * Frames will always be "at the front"; we process all frames * up to the first empty slot in the window. On completion we * cleanup state if there are still pending frames in the current * BA window. We assume the frame at slot 0 is already handled * by the caller; we always start at slot 1. */
| 874 | * by the caller; we always start at slot 1. |
| 875 | */ |
| 876 | static void |
| 877 | ampdu_rx_dispatch(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni) |
| 878 | { |
| 879 | struct ieee80211vap *vap = ni->ni_vap; |
| 880 | int i, r, r2; |
| 881 | |
| 882 | /* flush run of frames */ |
| 883 | r2 = 0; |
| 884 | for (i = 1; i < rap->rxa_wnd; i++) { |
| 885 | r = ampdu_dispatch_slot(rap, ni, i); |
| 886 | if (r == 0) |
| 887 | break; |
| 888 | r2 += r; |
| 889 | } |
| 890 | |
| 891 | /* move up frames */ |
| 892 | ampdu_rx_moveup(rap, ni, i, -1); |
| 893 | |
| 894 | /* |
| 895 | * Adjust the start of the BA window to |
| 896 | * reflect the frames just dispatched. |
| 897 | */ |
| 898 | rap->rxa_start = IEEE80211_SEQ_ADD(rap->rxa_start, i); |
| 899 | vap->iv_stats.is_ampdu_rx_oor += r2; |
| 900 | |
| 901 | IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni, |
| 902 | "%s: moved slot up %d slots to start at %d (%d frames)", |
| 903 | __func__, |
| 904 | i, |
| 905 | rap->rxa_start, |
| 906 | r2); |
| 907 | } |
| 908 | |
| 909 | /* |
| 910 | * Dispatch all frames in the A-MPDU re-order queue. |
no test coverage detected