mirror of
https://github.com/openwrt/openwrt.git
synced 2025-02-21 09:42:09 +00:00
mac80211: fix regression in sw a-msdu tx introduced in mesh improvement patches
Fixes: 6262d3eb068c ("mac80211: sync mesh fast xmit patch with upstream requested changes") Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
12a3c863d2
commit
f6a7ce2501
@ -137,8 +137,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+ if (!entry)
|
+ if (!entry)
|
||||||
+ return false;
|
+ return false;
|
||||||
+
|
+
|
||||||
+ if (skb_headroom(skb) + 2 * ETH_ALEN < entry->hdrlen +
|
+ if (skb_headroom(skb) < entry->hdrlen + entry->fast_tx.hdr_len)
|
||||||
+ entry->fast_tx.hdr_len)
|
|
||||||
+ return false;
|
+ return false;
|
||||||
+
|
+
|
||||||
+ sta = rcu_dereference(entry->mpath->next_hop);
|
+ sta = rcu_dereference(entry->mpath->next_hop);
|
||||||
@ -177,6 +176,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+ if (copy_sa)
|
+ if (copy_sa)
|
||||||
+ ether_addr_copy(meshhdr->eaddr2, sa);
|
+ ether_addr_copy(meshhdr->eaddr2, sa);
|
||||||
+
|
+
|
||||||
|
+ skb_push(skb, 2 * ETH_ALEN);
|
||||||
+ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
|
+ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
|
||||||
+ entry->mpath->dst, sdata->vif.addr);
|
+ entry->mpath->dst, sdata->vif.addr);
|
||||||
+
|
+
|
||||||
@ -764,28 +764,20 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
|
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
|
||||||
@@ -3645,8 +3652,6 @@ static void __ieee80211_xmit_fast(struct
|
@@ -3646,7 +3653,6 @@ static void __ieee80211_xmit_fast(struct
|
||||||
struct ieee80211_tx_data tx;
|
|
||||||
ieee80211_tx_result r;
|
ieee80211_tx_result r;
|
||||||
int hw_headroom = sdata->local->hw.extra_tx_headroom;
|
int hw_headroom = sdata->local->hw.extra_tx_headroom;
|
||||||
- int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
|
int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
|
||||||
- struct ethhdr eth;
|
- struct ethhdr eth;
|
||||||
|
|
||||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||||
if (unlikely(!skb))
|
if (unlikely(!skb))
|
||||||
@@ -3661,16 +3666,15 @@ static void __ieee80211_xmit_fast(struct
|
@@ -3666,11 +3672,10 @@ static void __ieee80211_xmit_fast(struct
|
||||||
* more room than we already have in 'extra_head'
|
|
||||||
*/
|
|
||||||
if (unlikely(ieee80211_skb_resize(sdata, skb,
|
|
||||||
- max_t(int, extra_head + hw_headroom -
|
|
||||||
+ max_t(int, fast_tx->hdr_len + hw_headroom -
|
|
||||||
skb_headroom(skb), 0),
|
|
||||||
ENCRYPT_NO)))
|
ENCRYPT_NO)))
|
||||||
goto free;
|
goto free;
|
||||||
|
|
||||||
- memcpy(ð, skb->data, ETH_HLEN - 2);
|
- memcpy(ð, skb->data, ETH_HLEN - 2);
|
||||||
- hdr = skb_push(skb, extra_head);
|
hdr = skb_push(skb, extra_head);
|
||||||
+ hdr = skb_push(skb, fast_tx->hdr_len);
|
|
||||||
memcpy(skb->data, fast_tx->hdr, fast_tx->hdr_len);
|
memcpy(skb->data, fast_tx->hdr, fast_tx->hdr_len);
|
||||||
- memcpy(skb->data + fast_tx->da_offs, eth.h_dest, ETH_ALEN);
|
- memcpy(skb->data + fast_tx->da_offs, eth.h_dest, ETH_ALEN);
|
||||||
- memcpy(skb->data + fast_tx->sa_offs, eth.h_source, ETH_ALEN);
|
- memcpy(skb->data + fast_tx->sa_offs, eth.h_source, ETH_ALEN);
|
||||||
@ -794,7 +786,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
info = IEEE80211_SKB_CB(skb);
|
info = IEEE80211_SKB_CB(skb);
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
@@ -3689,7 +3693,8 @@ static void __ieee80211_xmit_fast(struct
|
@@ -3689,7 +3694,8 @@ static void __ieee80211_xmit_fast(struct
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
|
if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
|
||||||
@ -804,7 +796,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
*ieee80211_get_qos_ctl(hdr) = tid;
|
*ieee80211_get_qos_ctl(hdr) = tid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3732,6 +3737,7 @@ static bool ieee80211_xmit_fast(struct i
|
@@ -3732,6 +3738,7 @@ static bool ieee80211_xmit_fast(struct i
|
||||||
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
|
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
|
||||||
struct tid_ampdu_tx *tid_tx = NULL;
|
struct tid_ampdu_tx *tid_tx = NULL;
|
||||||
struct sk_buff *next;
|
struct sk_buff *next;
|
||||||
@ -812,17 +804,16 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
u8 tid = IEEE80211_NUM_TIDS;
|
u8 tid = IEEE80211_NUM_TIDS;
|
||||||
|
|
||||||
/* control port protocol needs a lot of special handling */
|
/* control port protocol needs a lot of special handling */
|
||||||
@@ -3757,14 +3763,18 @@ static bool ieee80211_xmit_fast(struct i
|
@@ -3757,6 +3764,8 @@ static bool ieee80211_xmit_fast(struct i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ memcpy(ð, skb->data, ETH_HLEN - 2);
|
+ memcpy(ð, skb->data, ETH_HLEN - 2);
|
||||||
+
|
+
|
||||||
/* after this point (skb is modified) we cannot return false */
|
/* after this point (skb is modified) we cannot return false */
|
||||||
+ skb_pull(skb, ETH_HLEN - 2);
|
|
||||||
skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
|
skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return true;
|
@@ -3764,7 +3773,8 @@ static bool ieee80211_xmit_fast(struct i
|
||||||
|
|
||||||
skb_list_walk_safe(skb, skb, next) {
|
skb_list_walk_safe(skb, skb, next) {
|
||||||
skb_mark_not_on_list(skb);
|
skb_mark_not_on_list(skb);
|
||||||
|
@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+
|
+
|
||||||
+ skb->dev = sdata->dev;
|
+ skb->dev = sdata->dev;
|
||||||
+ memcpy(ð, skb->data, ETH_HLEN - 2);
|
+ memcpy(ð, skb->data, ETH_HLEN - 2);
|
||||||
+ skb_pull(skb, sizeof(eth));
|
+ skb_pull(skb, 2);
|
||||||
+ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
|
+ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
|
||||||
+ eth.h_dest, eth.h_source);
|
+ eth.h_dest, eth.h_source);
|
||||||
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
|
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
|
||||||
|
@ -13,7 +13,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|||||||
|
|
||||||
--- a/include/net/mac80211.h
|
--- a/include/net/mac80211.h
|
||||||
+++ b/include/net/mac80211.h
|
+++ b/include/net/mac80211.h
|
||||||
@@ -5970,6 +5970,18 @@ void ieee80211_queue_delayed_work(struct
|
@@ -5968,6 +5968,18 @@ void ieee80211_queue_delayed_work(struct
|
||||||
unsigned long delay);
|
unsigned long delay);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user