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>
This commit is contained in:
Родитель
252b86c432
Коммит
a1a3fcec6f
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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));
|
||||||
|
|
Загрузка…
Ссылка в новой задаче