Commit a1a3fcec authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: move fragment flag adjustment

Instead of adjusting the fragment flags at
TX time, adjust them at fragmentation time.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 252b86c4
...@@ -847,6 +847,7 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx, ...@@ -847,6 +847,7 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx,
int frag_threshold) int frag_threshold)
{ {
struct ieee80211_local *local = tx->local; struct ieee80211_local *local = tx->local;
struct ieee80211_tx_info *info;
struct sk_buff *tmp; struct sk_buff *tmp;
int per_fragm = frag_threshold - hdrlen - FCS_LEN; int per_fragm = frag_threshold - hdrlen - FCS_LEN;
int pos = hdrlen + per_fragm; int pos = hdrlen + per_fragm;
...@@ -876,6 +877,14 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx, ...@@ -876,6 +877,14 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx,
IEEE80211_ENCRYPT_HEADROOM); IEEE80211_ENCRYPT_HEADROOM);
/* copy control information */ /* copy control information */
memcpy(tmp->cb, skb->cb, sizeof(tmp->cb)); memcpy(tmp->cb, skb->cb, sizeof(tmp->cb));
info = IEEE80211_SKB_CB(tmp);
info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT |
IEEE80211_TX_CTL_FIRST_FRAGMENT);
if (rem)
info->flags |= IEEE80211_TX_CTL_MORE_FRAMES;
skb_copy_queue_mapping(tmp, skb); skb_copy_queue_mapping(tmp, skb);
tmp->priority = skb->priority; tmp->priority = skb->priority;
tmp->dev = skb->dev; tmp->dev = skb->dev;
...@@ -1203,7 +1212,6 @@ static bool __ieee80211_tx(struct ieee80211_local *local, ...@@ -1203,7 +1212,6 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
unsigned long flags; unsigned long flags;
int len; int len;
bool fragm = false;
skb_queue_walk_safe(skbs, skb, tmp) { skb_queue_walk_safe(skbs, skb, tmp) {
int q = skb_get_queue_mapping(skb); int q = skb_get_queue_mapping(skb);
...@@ -1230,15 +1238,8 @@ static bool __ieee80211_tx(struct ieee80211_local *local, ...@@ -1230,15 +1238,8 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
info = IEEE80211_SKB_CB(skb); info = IEEE80211_SKB_CB(skb);
if (fragm)
info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT |
IEEE80211_TX_CTL_FIRST_FRAGMENT);
len = skb->len; len = skb->len;
if (!skb_queue_is_last(skbs, skb))
info->flags |= IEEE80211_TX_CTL_MORE_FRAMES;
sdata = vif_to_sdata(info->control.vif); sdata = vif_to_sdata(info->control.vif);
switch (sdata->vif.type) { switch (sdata->vif.type) {
...@@ -1266,7 +1267,6 @@ static bool __ieee80211_tx(struct ieee80211_local *local, ...@@ -1266,7 +1267,6 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
ieee80211_tpt_led_trig_tx(local, fc, len); ieee80211_tpt_led_trig_tx(local, fc, len);
ieee80211_led_tx(local, 1); ieee80211_led_tx(local, 1);
fragm = true;
} }
WARN_ON(!skb_queue_empty(skbs)); WARN_ON(!skb_queue_empty(skbs));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment