diff options
-rw-r--r-- | include/linux/ieee80211.h | 2 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 3 | ||||
-rw-r--r-- | net/mac80211/mesh_hwmp.c | 3 | ||||
-rw-r--r-- | net/mac80211/mesh_pathtbl.c | 2 | ||||
-rw-r--r-- | net/mac80211/rx.c | 6 | ||||
-rw-r--r-- | net/mac80211/tx.c | 2 | ||||
-rw-r--r-- | net/mac80211/wme.c | 10 | ||||
-rw-r--r-- | net/mac80211/wme.h | 3 |
8 files changed, 17 insertions, 14 deletions
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 37f95f2e10f9..72f3933938c0 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -130,6 +130,8 @@ | |||
130 | #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK 0x0060 | 130 | #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK 0x0060 |
131 | /* A-MSDU 802.11n */ | 131 | /* A-MSDU 802.11n */ |
132 | #define IEEE80211_QOS_CTL_A_MSDU_PRESENT 0x0080 | 132 | #define IEEE80211_QOS_CTL_A_MSDU_PRESENT 0x0080 |
133 | /* Mesh Control 802.11s */ | ||
134 | #define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT 0x0100 | ||
133 | 135 | ||
134 | /* U-APSD queue for WMM IEs sent by AP */ | 136 | /* U-APSD queue for WMM IEs sent by AP */ |
135 | #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD (1<<7) | 137 | #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD (1<<7) |
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 65acbf5eed2d..a4225ae69681 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -463,8 +463,7 @@ int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, | |||
463 | memcpy(hdr->addr3, meshsa, ETH_ALEN); | 463 | memcpy(hdr->addr3, meshsa, ETH_ALEN); |
464 | return 24; | 464 | return 24; |
465 | } else { | 465 | } else { |
466 | *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | | 466 | *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); |
467 | IEEE80211_FCTL_TODS); | ||
468 | /* RA TA DA SA */ | 467 | /* RA TA DA SA */ |
469 | memset(hdr->addr1, 0, ETH_ALEN); /* RA is resolved later */ | 468 | memset(hdr->addr1, 0, ETH_ALEN); /* RA is resolved later */ |
470 | memcpy(hdr->addr2, meshsa, ETH_ALEN); | 469 | memcpy(hdr->addr2, meshsa, ETH_ALEN); |
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 63df0bc3dba4..6df7913d7ca4 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
@@ -209,7 +209,6 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags, | |||
209 | static void prepare_frame_for_deferred_tx(struct ieee80211_sub_if_data *sdata, | 209 | static void prepare_frame_for_deferred_tx(struct ieee80211_sub_if_data *sdata, |
210 | struct sk_buff *skb) | 210 | struct sk_buff *skb) |
211 | { | 211 | { |
212 | struct ieee80211_local *local = sdata->local; | ||
213 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 212 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
214 | 213 | ||
215 | skb_set_mac_header(skb, 0); | 214 | skb_set_mac_header(skb, 0); |
@@ -221,7 +220,7 @@ static void prepare_frame_for_deferred_tx(struct ieee80211_sub_if_data *sdata, | |||
221 | skb->priority = 7; | 220 | skb->priority = 7; |
222 | 221 | ||
223 | info->control.vif = &sdata->vif; | 222 | info->control.vif = &sdata->vif; |
224 | ieee80211_set_qos_hdr(local, skb); | 223 | ieee80211_set_qos_hdr(sdata, skb); |
225 | } | 224 | } |
226 | 225 | ||
227 | /** | 226 | /** |
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c index 4fc8c7a5d4dd..332b5ff1e885 100644 --- a/net/mac80211/mesh_pathtbl.c +++ b/net/mac80211/mesh_pathtbl.c | |||
@@ -225,7 +225,7 @@ void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta) | |||
225 | hdr = (struct ieee80211_hdr *) skb->data; | 225 | hdr = (struct ieee80211_hdr *) skb->data; |
226 | 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)); | 227 | skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb)); |
228 | ieee80211_set_qos_hdr(sdata->local, skb); | 228 | ieee80211_set_qos_hdr(sdata, skb); |
229 | __skb_queue_tail(&tmpq, skb); | 229 | __skb_queue_tail(&tmpq, skb); |
230 | } | 230 | } |
231 | 231 | ||
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index b1ea4444065e..db46601e50bf 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1910,7 +1910,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
1910 | fwded_mcast); | 1910 | fwded_mcast); |
1911 | skb_set_queue_mapping(fwd_skb, | 1911 | skb_set_queue_mapping(fwd_skb, |
1912 | ieee80211_select_queue(sdata, fwd_skb)); | 1912 | ieee80211_select_queue(sdata, fwd_skb)); |
1913 | ieee80211_set_qos_hdr(local, fwd_skb); | 1913 | ieee80211_set_qos_hdr(sdata, fwd_skb); |
1914 | } else { | 1914 | } else { |
1915 | int err; | 1915 | int err; |
1916 | /* | 1916 | /* |
@@ -2572,12 +2572,12 @@ static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx) | |||
2572 | CALL_RXH(ieee80211_rx_h_ps_poll) | 2572 | CALL_RXH(ieee80211_rx_h_ps_poll) |
2573 | CALL_RXH(ieee80211_rx_h_michael_mic_verify) | 2573 | CALL_RXH(ieee80211_rx_h_michael_mic_verify) |
2574 | /* must be after MMIC verify so header is counted in MPDU mic */ | 2574 | /* must be after MMIC verify so header is counted in MPDU mic */ |
2575 | CALL_RXH(ieee80211_rx_h_remove_qos_control) | ||
2576 | CALL_RXH(ieee80211_rx_h_amsdu) | ||
2577 | #ifdef CONFIG_MAC80211_MESH | 2575 | #ifdef CONFIG_MAC80211_MESH |
2578 | if (ieee80211_vif_is_mesh(&rx->sdata->vif)) | 2576 | if (ieee80211_vif_is_mesh(&rx->sdata->vif)) |
2579 | CALL_RXH(ieee80211_rx_h_mesh_fwding); | 2577 | CALL_RXH(ieee80211_rx_h_mesh_fwding); |
2580 | #endif | 2578 | #endif |
2579 | CALL_RXH(ieee80211_rx_h_remove_qos_control) | ||
2580 | CALL_RXH(ieee80211_rx_h_amsdu) | ||
2581 | CALL_RXH(ieee80211_rx_h_data) | 2581 | CALL_RXH(ieee80211_rx_h_data) |
2582 | CALL_RXH(ieee80211_rx_h_ctrl); | 2582 | CALL_RXH(ieee80211_rx_h_ctrl); |
2583 | CALL_RXH(ieee80211_rx_h_mgmt_check) | 2583 | CALL_RXH(ieee80211_rx_h_mgmt_check) |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 2a8e437165fb..7cd6c28968b2 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1596,7 +1596,7 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, | |||
1596 | return; | 1596 | return; |
1597 | } | 1597 | } |
1598 | 1598 | ||
1599 | ieee80211_set_qos_hdr(local, skb); | 1599 | ieee80211_set_qos_hdr(sdata, skb); |
1600 | ieee80211_tx(sdata, skb, false); | 1600 | ieee80211_tx(sdata, skb, false); |
1601 | rcu_read_unlock(); | 1601 | rcu_read_unlock(); |
1602 | } | 1602 | } |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index a9fee2bc6300..971004c9b04f 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
@@ -135,7 +135,8 @@ u16 ieee80211_downgrade_queue(struct ieee80211_local *local, | |||
135 | return ieee802_1d_to_ac[skb->priority]; | 135 | return ieee802_1d_to_ac[skb->priority]; |
136 | } | 136 | } |
137 | 137 | ||
138 | void ieee80211_set_qos_hdr(struct ieee80211_local *local, struct sk_buff *skb) | 138 | void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata, |
139 | struct sk_buff *skb) | ||
139 | { | 140 | { |
140 | struct ieee80211_hdr *hdr = (void *)skb->data; | 141 | struct ieee80211_hdr *hdr = (void *)skb->data; |
141 | 142 | ||
@@ -146,10 +147,11 @@ void ieee80211_set_qos_hdr(struct ieee80211_local *local, struct sk_buff *skb) | |||
146 | 147 | ||
147 | tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; | 148 | tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; |
148 | 149 | ||
149 | if (unlikely(local->wifi_wme_noack_test)) | 150 | if (unlikely(sdata->local->wifi_wme_noack_test)) |
150 | ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK; | 151 | ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK; |
151 | /* qos header is 2 bytes, second reserved */ | 152 | /* qos header is 2 bytes */ |
152 | *p++ = ack_policy | tid; | 153 | *p++ = ack_policy | tid; |
153 | *p = 0; | 154 | *p = ieee80211_vif_is_mesh(&sdata->vif) ? |
155 | (IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT >> 8) : 0; | ||
154 | } | 156 | } |
155 | } | 157 | } |
diff --git a/net/mac80211/wme.h b/net/mac80211/wme.h index faead6d02026..34e166fbf4d4 100644 --- a/net/mac80211/wme.h +++ b/net/mac80211/wme.h | |||
@@ -17,7 +17,8 @@ extern const int ieee802_1d_to_ac[8]; | |||
17 | 17 | ||
18 | u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, | 18 | u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, |
19 | struct sk_buff *skb); | 19 | struct sk_buff *skb); |
20 | void ieee80211_set_qos_hdr(struct ieee80211_local *local, struct sk_buff *skb); | 20 | void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata, |
21 | struct sk_buff *skb); | ||
21 | u16 ieee80211_downgrade_queue(struct ieee80211_local *local, | 22 | u16 ieee80211_downgrade_queue(struct ieee80211_local *local, |
22 | struct sk_buff *skb); | 23 | struct sk_buff *skb); |
23 | 24 | ||