[PATCH 4/4] mac80211: Populate QoS header on mesh frames sent to gates.
From: Thomas Pedersen <hidden>
Date: 2011-10-29 05:05:44
Subsystem:
mac80211, the rest · Maintainers:
Johannes Berg, Linus Torvalds
From: Javier Cardona <redacted> Also set correct skb queue mapping once next hop is known, and set txinfo jiffies when forwarding. Signed-off-by: Javier Cardona <redacted> --- net/mac80211/mesh_hwmp.c | 5 ++++- net/mac80211/mesh_pathtbl.c | 5 +++++ net/mac80211/rx.c | 8 +++++--- 3 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
index b7d9dfd..d46109b 100644
--- a/net/mac80211/mesh_hwmp.c
+++ b/net/mac80211/mesh_hwmp.c@@ -1028,8 +1028,11 @@ int mesh_nexthop_lookup(struct sk_buff *skb, PREQ_Q_F_START | PREQ_Q_F_REFRESH); } next_hop = rcu_dereference(mpath->next_hop); - if (next_hop) + if (next_hop) { memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN); + skb_set_queue_mapping(skb, + ieee80211_select_queue(sdata, skb)); + } else err = -ENOENT; } else {
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 332b5ff1..9d2f55f 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c@@ -270,6 +270,11 @@ static void prepare_for_gate(struct sk_buff *skb, char *dst_addr, memcpy(hdr->addr1, next_hop, ETH_ALEN); rcu_read_unlock(); memcpy(hdr->addr3, dst_addr, ETH_ALEN); + + /* once next hop is set we can set qos header */ + skb_set_queue_mapping(skb, + ieee80211_select_queue(gate_mpath->sdata, skb)); + ieee80211_set_qos_hdr(gate_mpath->sdata, skb); } /**
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index ad39216..dc60a19 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c@@ -1963,12 +1963,10 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) memset(info, 0, sizeof(*info)); info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; info->control.vif = &rx->sdata->vif; + info->control.jiffies = jiffies; if (is_multicast_ether_addr(fwd_hdr->addr1)) { IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, fwded_mcast); - skb_set_queue_mapping(fwd_skb, - ieee80211_select_queue(sdata, fwd_skb)); - ieee80211_set_qos_hdr(sdata, fwd_skb); } else { int err; /*
@@ -1989,6 +1987,10 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) } IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, fwded_frames); + + /* next hop is now known, update the queue mapping */ + skb_set_queue_mapping(fwd_skb, + ieee80211_select_queue(sdata, fwd_skb)); ieee80211_add_pending_skb(local, fwd_skb); } }
--
1.7.5.4