4
4
* Copyright 2006-2007 Jiri Benc <[email protected] >
5
5
* Copyright 2007-2010 Johannes Berg <[email protected] >
6
6
* Copyright 2013-2014 Intel Mobile Communications GmbH
7
+ * Copyright(c) 2015 - 2016 Intel Deutschland GmbH
7
8
*
8
9
* This program is free software; you can redistribute it and/or modify
9
10
* it under the terms of the GNU General Public License version 2 as
@@ -798,6 +799,23 @@ static ieee80211_rx_result ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
798
799
return RX_CONTINUE ;
799
800
}
800
801
802
+ static inline bool ieee80211_rx_reorder_ready (struct tid_ampdu_rx * tid_agg_rx ,
803
+ int index )
804
+ {
805
+ struct sk_buff_head * frames = & tid_agg_rx -> reorder_buf [index ];
806
+ struct sk_buff * tail = skb_peek_tail (frames );
807
+ struct ieee80211_rx_status * status ;
808
+
809
+ if (!tail )
810
+ return false;
811
+
812
+ status = IEEE80211_SKB_RXCB (tail );
813
+ if (status -> flag & RX_FLAG_AMSDU_MORE )
814
+ return false;
815
+
816
+ return true;
817
+ }
818
+
801
819
static void ieee80211_release_reorder_frame (struct ieee80211_sub_if_data * sdata ,
802
820
struct tid_ampdu_rx * tid_agg_rx ,
803
821
int index ,
@@ -812,7 +830,7 @@ static void ieee80211_release_reorder_frame(struct ieee80211_sub_if_data *sdata,
812
830
if (skb_queue_empty (skb_list ))
813
831
goto no_frame ;
814
832
815
- if (!ieee80211_rx_reorder_ready (skb_list )) {
833
+ if (!ieee80211_rx_reorder_ready (tid_agg_rx , index )) {
816
834
__skb_queue_purge (skb_list );
817
835
goto no_frame ;
818
836
}
@@ -866,7 +884,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata,
866
884
867
885
/* release the buffer until next missing frame */
868
886
index = tid_agg_rx -> head_seq_num % tid_agg_rx -> buf_size ;
869
- if (!ieee80211_rx_reorder_ready (& tid_agg_rx -> reorder_buf [ index ] ) &&
887
+ if (!ieee80211_rx_reorder_ready (tid_agg_rx , index ) &&
870
888
tid_agg_rx -> stored_mpdu_num ) {
871
889
/*
872
890
* No buffers ready to be released, but check whether any
@@ -875,8 +893,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata,
875
893
int skipped = 1 ;
876
894
for (j = (index + 1 ) % tid_agg_rx -> buf_size ; j != index ;
877
895
j = (j + 1 ) % tid_agg_rx -> buf_size ) {
878
- if (!ieee80211_rx_reorder_ready (
879
- & tid_agg_rx -> reorder_buf [j ])) {
896
+ if (!ieee80211_rx_reorder_ready (tid_agg_rx , j )) {
880
897
skipped ++ ;
881
898
continue ;
882
899
}
@@ -903,8 +920,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata,
903
920
skipped ) & IEEE80211_SN_MASK ;
904
921
skipped = 0 ;
905
922
}
906
- } else while (ieee80211_rx_reorder_ready (
907
- & tid_agg_rx -> reorder_buf [index ])) {
923
+ } else while (ieee80211_rx_reorder_ready (tid_agg_rx , index )) {
908
924
ieee80211_release_reorder_frame (sdata , tid_agg_rx , index ,
909
925
frames );
910
926
index = tid_agg_rx -> head_seq_num % tid_agg_rx -> buf_size ;
@@ -915,8 +931,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata,
915
931
916
932
for (; j != (index - 1 ) % tid_agg_rx -> buf_size ;
917
933
j = (j + 1 ) % tid_agg_rx -> buf_size ) {
918
- if (ieee80211_rx_reorder_ready (
919
- & tid_agg_rx -> reorder_buf [j ]))
934
+ if (ieee80211_rx_reorder_ready (tid_agg_rx , j ))
920
935
break ;
921
936
}
922
937
@@ -987,7 +1002,7 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_sub_if_data *sdata
987
1002
index = mpdu_seq_num % tid_agg_rx -> buf_size ;
988
1003
989
1004
/* check if we already stored this frame */
990
- if (ieee80211_rx_reorder_ready (& tid_agg_rx -> reorder_buf [ index ] )) {
1005
+ if (ieee80211_rx_reorder_ready (tid_agg_rx , index )) {
991
1006
dev_kfree_skb (skb );
992
1007
goto out ;
993
1008
}
0 commit comments