aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/mesh_pathtbl.c4
-rw-r--r--net/mac80211/rx.c10
-rw-r--r--net/mac80211/tx.c4
-rw-r--r--net/mac80211/wme.c6
4 files changed, 14 insertions, 10 deletions
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 55a206cfb8cc..4fc8c7a5d4dd 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -14,6 +14,7 @@
14#include <linux/spinlock.h> 14#include <linux/spinlock.h>
15#include <linux/string.h> 15#include <linux/string.h>
16#include <net/mac80211.h> 16#include <net/mac80211.h>
17#include "wme.h"
17#include "ieee80211_i.h" 18#include "ieee80211_i.h"
18#include "mesh.h" 19#include "mesh.h"
19 20
@@ -212,6 +213,7 @@ void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta)
212 struct ieee80211_hdr *hdr; 213 struct ieee80211_hdr *hdr;
213 struct sk_buff_head tmpq; 214 struct sk_buff_head tmpq;
214 unsigned long flags; 215 unsigned long flags;
216 struct ieee80211_sub_if_data *sdata = mpath->sdata;
215 217
216 rcu_assign_pointer(mpath->next_hop, sta); 218 rcu_assign_pointer(mpath->next_hop, sta);
217 219
@@ -222,6 +224,8 @@ void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta)
222 while ((skb = __skb_dequeue(&mpath->frame_queue)) != NULL) { 224 while ((skb = __skb_dequeue(&mpath->frame_queue)) != NULL) {
223 hdr = (struct ieee80211_hdr *) skb->data; 225 hdr = (struct ieee80211_hdr *) skb->data;
224 memcpy(hdr->addr1, sta->sta.addr, ETH_ALEN); 226 memcpy(hdr->addr1, sta->sta.addr, ETH_ALEN);
227 skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
228 ieee80211_set_qos_hdr(sdata->local, skb);
225 __skb_queue_tail(&tmpq, skb); 229 __skb_queue_tail(&tmpq, skb);
226 } 230 }
227 231
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 811e3ade8c74..b1ea4444065e 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1905,13 +1905,13 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1905 memset(info, 0, sizeof(*info)); 1905 memset(info, 0, sizeof(*info));
1906 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 1906 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
1907 info->control.vif = &rx->sdata->vif; 1907 info->control.vif = &rx->sdata->vif;
1908 skb_set_queue_mapping(skb, 1908 if (is_multicast_ether_addr(fwd_hdr->addr1)) {
1909 ieee80211_select_queue(rx->sdata, fwd_skb));
1910 ieee80211_set_qos_hdr(local, skb);
1911 if (is_multicast_ether_addr(fwd_hdr->addr1))
1912 IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, 1909 IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
1913 fwded_mcast); 1910 fwded_mcast);
1914 else { 1911 skb_set_queue_mapping(fwd_skb,
1912 ieee80211_select_queue(sdata, fwd_skb));
1913 ieee80211_set_qos_hdr(local, fwd_skb);
1914 } else {
1915 int err; 1915 int err;
1916 /* 1916 /*
1917 * Save TA to addr1 to send TA a path error if a 1917 * Save TA to addr1 to send TA a path error if a
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 2521716aa97b..2a8e437165fb 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1879,6 +1879,10 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
1879 rcu_read_unlock(); 1879 rcu_read_unlock();
1880 } 1880 }
1881 1881
1882 /* For mesh, the use of the QoS header is mandatory */
1883 if (ieee80211_vif_is_mesh(&sdata->vif))
1884 sta_flags |= WLAN_STA_WME;
1885
1882 /* receiver and we are QoS enabled, use a QoS type frame */ 1886 /* receiver and we are QoS enabled, use a QoS type frame */
1883 if ((sta_flags & WLAN_STA_WME) && local->hw.queues >= 4) { 1887 if ((sta_flags & WLAN_STA_WME) && local->hw.queues >= 4) {
1884 fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); 1888 fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c
index 7a49532f14cb..a9fee2bc6300 100644
--- a/net/mac80211/wme.c
+++ b/net/mac80211/wme.c
@@ -83,11 +83,7 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
83 break; 83 break;
84#ifdef CONFIG_MAC80211_MESH 84#ifdef CONFIG_MAC80211_MESH
85 case NL80211_IFTYPE_MESH_POINT: 85 case NL80211_IFTYPE_MESH_POINT:
86 /* 86 ra = skb->data;
87 * XXX: This is clearly broken ... but already was before,
88 * because ieee80211_fill_mesh_addresses() would clear A1
89 * except for multicast addresses.
90 */
91 break; 87 break;
92#endif 88#endif
93 case NL80211_IFTYPE_STATION: 89 case NL80211_IFTYPE_STATION: