diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-11-16 09:28:56 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-11-21 16:20:42 -0500 |
commit | a1a3fcec6fcc36482c1c57bde7ed4078313495cd (patch) | |
tree | 964cc2165660bc85a49702e589c01810de1fe565 /net/mac80211/tx.c | |
parent | 252b86c43225d067468dd182e9ae616ad2532bc8 (diff) |
mac80211: move fragment flag adjustment
Instead of adjusting the fragment flags at
TX time, adjust them at fragmentation time.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 26a7cfb80b7c..f521ed4ab930 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -847,6 +847,7 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx, | |||
847 | int frag_threshold) | 847 | int frag_threshold) |
848 | { | 848 | { |
849 | struct ieee80211_local *local = tx->local; | 849 | struct ieee80211_local *local = tx->local; |
850 | struct ieee80211_tx_info *info; | ||
850 | struct sk_buff *tmp; | 851 | struct sk_buff *tmp; |
851 | int per_fragm = frag_threshold - hdrlen - FCS_LEN; | 852 | int per_fragm = frag_threshold - hdrlen - FCS_LEN; |
852 | int pos = hdrlen + per_fragm; | 853 | int pos = hdrlen + per_fragm; |
@@ -876,6 +877,14 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx, | |||
876 | IEEE80211_ENCRYPT_HEADROOM); | 877 | IEEE80211_ENCRYPT_HEADROOM); |
877 | /* copy control information */ | 878 | /* copy control information */ |
878 | memcpy(tmp->cb, skb->cb, sizeof(tmp->cb)); | 879 | memcpy(tmp->cb, skb->cb, sizeof(tmp->cb)); |
880 | |||
881 | info = IEEE80211_SKB_CB(tmp); | ||
882 | info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | | ||
883 | IEEE80211_TX_CTL_FIRST_FRAGMENT); | ||
884 | |||
885 | if (rem) | ||
886 | info->flags |= IEEE80211_TX_CTL_MORE_FRAMES; | ||
887 | |||
879 | skb_copy_queue_mapping(tmp, skb); | 888 | skb_copy_queue_mapping(tmp, skb); |
880 | tmp->priority = skb->priority; | 889 | tmp->priority = skb->priority; |
881 | tmp->dev = skb->dev; | 890 | tmp->dev = skb->dev; |
@@ -1203,7 +1212,6 @@ static bool __ieee80211_tx(struct ieee80211_local *local, | |||
1203 | struct ieee80211_sub_if_data *sdata; | 1212 | struct ieee80211_sub_if_data *sdata; |
1204 | unsigned long flags; | 1213 | unsigned long flags; |
1205 | int len; | 1214 | int len; |
1206 | bool fragm = false; | ||
1207 | 1215 | ||
1208 | skb_queue_walk_safe(skbs, skb, tmp) { | 1216 | skb_queue_walk_safe(skbs, skb, tmp) { |
1209 | int q = skb_get_queue_mapping(skb); | 1217 | int q = skb_get_queue_mapping(skb); |
@@ -1230,15 +1238,8 @@ static bool __ieee80211_tx(struct ieee80211_local *local, | |||
1230 | 1238 | ||
1231 | info = IEEE80211_SKB_CB(skb); | 1239 | info = IEEE80211_SKB_CB(skb); |
1232 | 1240 | ||
1233 | if (fragm) | ||
1234 | info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | | ||
1235 | IEEE80211_TX_CTL_FIRST_FRAGMENT); | ||
1236 | |||
1237 | len = skb->len; | 1241 | len = skb->len; |
1238 | 1242 | ||
1239 | if (!skb_queue_is_last(skbs, skb)) | ||
1240 | info->flags |= IEEE80211_TX_CTL_MORE_FRAMES; | ||
1241 | |||
1242 | sdata = vif_to_sdata(info->control.vif); | 1243 | sdata = vif_to_sdata(info->control.vif); |
1243 | 1244 | ||
1244 | switch (sdata->vif.type) { | 1245 | switch (sdata->vif.type) { |
@@ -1266,7 +1267,6 @@ static bool __ieee80211_tx(struct ieee80211_local *local, | |||
1266 | 1267 | ||
1267 | ieee80211_tpt_led_trig_tx(local, fc, len); | 1268 | ieee80211_tpt_led_trig_tx(local, fc, len); |
1268 | ieee80211_led_tx(local, 1); | 1269 | ieee80211_led_tx(local, 1); |
1269 | fragm = true; | ||
1270 | } | 1270 | } |
1271 | 1271 | ||
1272 | WARN_ON(!skb_queue_empty(skbs)); | 1272 | WARN_ON(!skb_queue_empty(skbs)); |