From: Javier Cardona <[email protected]>

Also set correct skb queue mapping once next hop is known, and set
txinfo jiffies when forwarding.

Signed-off-by: Javier Cardona <[email protected]>
---
 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

_______________________________________________
Devel mailing list
[email protected]
http://open80211s.com/mailman/listinfo/devel

Reply via email to