diff options
author | Arik Nemtsov <arik@wizery.com> | 2014-07-17 10:14:19 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-07-21 06:14:03 -0400 |
commit | 46792a2dfcc7e000e6927088fbf06a135aaaa3eb (patch) | |
tree | 20ef8483283badb38f54cc99a1e0717ad0b29be1 /net/mac80211/tdls.c | |
parent | 6ae32e5d284a5db589bfa63561932ad3306f538a (diff) |
mac80211: consolidate TDLS IE treatment
Add all information elements for TDLS discovery and setup in the same
function.
Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
Reviewed-by: Liad Kaufman <liad.kaufman@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/tdls.c')
-rw-r--r-- | net/mac80211/tdls.c | 69 |
1 files changed, 41 insertions, 28 deletions
diff --git a/net/mac80211/tdls.c b/net/mac80211/tdls.c index 53c235de5d1c..b61448acc438 100644 --- a/net/mac80211/tdls.c +++ b/net/mac80211/tdls.c | |||
@@ -78,13 +78,49 @@ static void ieee80211_tdls_add_link_ie(struct sk_buff *skb, const u8 *src_addr, | |||
78 | memcpy(lnkid->resp_sta, peer, ETH_ALEN); | 78 | memcpy(lnkid->resp_sta, peer, ETH_ALEN); |
79 | } | 79 | } |
80 | 80 | ||
81 | static void ieee80211_tdls_add_ies(struct ieee80211_sub_if_data *sdata, | ||
82 | struct sk_buff *skb, const u8 *peer, | ||
83 | u8 action_code, bool initiator, | ||
84 | const u8 *extra_ies, size_t extra_ies_len) | ||
85 | { | ||
86 | const u8 *init_addr, *rsp_addr; | ||
87 | enum ieee80211_band band = ieee80211_get_sdata_band(sdata); | ||
88 | |||
89 | switch (action_code) { | ||
90 | case WLAN_TDLS_SETUP_REQUEST: | ||
91 | case WLAN_TDLS_SETUP_RESPONSE: | ||
92 | case WLAN_PUB_ACTION_TDLS_DISCOVER_RES: | ||
93 | ieee80211_add_srates_ie(sdata, skb, false, band); | ||
94 | ieee80211_add_ext_srates_ie(sdata, skb, false, band); | ||
95 | ieee80211_tdls_add_ext_capab(skb); | ||
96 | break; | ||
97 | case WLAN_TDLS_SETUP_CONFIRM: | ||
98 | case WLAN_TDLS_TEARDOWN: | ||
99 | case WLAN_TDLS_DISCOVERY_REQUEST: | ||
100 | break; | ||
101 | } | ||
102 | |||
103 | if (initiator) { | ||
104 | init_addr = sdata->vif.addr; | ||
105 | rsp_addr = peer; | ||
106 | } else { | ||
107 | init_addr = peer; | ||
108 | rsp_addr = sdata->vif.addr; | ||
109 | } | ||
110 | |||
111 | if (extra_ies_len) | ||
112 | memcpy(skb_put(skb, extra_ies_len), extra_ies, extra_ies_len); | ||
113 | |||
114 | ieee80211_tdls_add_link_ie(skb, init_addr, rsp_addr, | ||
115 | sdata->u.mgd.bssid); | ||
116 | } | ||
117 | |||
81 | static int | 118 | static int |
82 | ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev, | 119 | ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev, |
83 | const u8 *peer, u8 action_code, u8 dialog_token, | 120 | const u8 *peer, u8 action_code, u8 dialog_token, |
84 | u16 status_code, struct sk_buff *skb) | 121 | u16 status_code, struct sk_buff *skb) |
85 | { | 122 | { |
86 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 123 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
87 | enum ieee80211_band band = ieee80211_get_sdata_band(sdata); | ||
88 | struct ieee80211_tdls_data *tf; | 124 | struct ieee80211_tdls_data *tf; |
89 | 125 | ||
90 | tf = (void *)skb_put(skb, offsetof(struct ieee80211_tdls_data, u)); | 126 | tf = (void *)skb_put(skb, offsetof(struct ieee80211_tdls_data, u)); |
@@ -103,10 +139,6 @@ ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev, | |||
103 | tf->u.setup_req.dialog_token = dialog_token; | 139 | tf->u.setup_req.dialog_token = dialog_token; |
104 | tf->u.setup_req.capability = | 140 | tf->u.setup_req.capability = |
105 | cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata)); | 141 | cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata)); |
106 | |||
107 | ieee80211_add_srates_ie(sdata, skb, false, band); | ||
108 | ieee80211_add_ext_srates_ie(sdata, skb, false, band); | ||
109 | ieee80211_tdls_add_ext_capab(skb); | ||
110 | break; | 142 | break; |
111 | case WLAN_TDLS_SETUP_RESPONSE: | 143 | case WLAN_TDLS_SETUP_RESPONSE: |
112 | tf->category = WLAN_CATEGORY_TDLS; | 144 | tf->category = WLAN_CATEGORY_TDLS; |
@@ -117,10 +149,6 @@ ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev, | |||
117 | tf->u.setup_resp.dialog_token = dialog_token; | 149 | tf->u.setup_resp.dialog_token = dialog_token; |
118 | tf->u.setup_resp.capability = | 150 | tf->u.setup_resp.capability = |
119 | cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata)); | 151 | cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata)); |
120 | |||
121 | ieee80211_add_srates_ie(sdata, skb, false, band); | ||
122 | ieee80211_add_ext_srates_ie(sdata, skb, false, band); | ||
123 | ieee80211_tdls_add_ext_capab(skb); | ||
124 | break; | 152 | break; |
125 | case WLAN_TDLS_SETUP_CONFIRM: | 153 | case WLAN_TDLS_SETUP_CONFIRM: |
126 | tf->category = WLAN_CATEGORY_TDLS; | 154 | tf->category = WLAN_CATEGORY_TDLS; |
@@ -157,7 +185,6 @@ ieee80211_prep_tdls_direct(struct wiphy *wiphy, struct net_device *dev, | |||
157 | u16 status_code, struct sk_buff *skb) | 185 | u16 status_code, struct sk_buff *skb) |
158 | { | 186 | { |
159 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 187 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
160 | enum ieee80211_band band = ieee80211_get_sdata_band(sdata); | ||
161 | struct ieee80211_mgmt *mgmt; | 188 | struct ieee80211_mgmt *mgmt; |
162 | 189 | ||
163 | mgmt = (void *)skb_put(skb, 24); | 190 | mgmt = (void *)skb_put(skb, 24); |
@@ -179,10 +206,6 @@ ieee80211_prep_tdls_direct(struct wiphy *wiphy, struct net_device *dev, | |||
179 | dialog_token; | 206 | dialog_token; |
180 | mgmt->u.action.u.tdls_discover_resp.capability = | 207 | mgmt->u.action.u.tdls_discover_resp.capability = |
181 | cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata)); | 208 | cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata)); |
182 | |||
183 | ieee80211_add_srates_ie(sdata, skb, false, band); | ||
184 | ieee80211_add_ext_srates_ie(sdata, skb, false, band); | ||
185 | ieee80211_tdls_add_ext_capab(skb); | ||
186 | break; | 209 | break; |
187 | default: | 210 | default: |
188 | return -EINVAL; | 211 | return -EINVAL; |
@@ -202,7 +225,6 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev, | |||
202 | struct ieee80211_local *local = sdata->local; | 225 | struct ieee80211_local *local = sdata->local; |
203 | struct sk_buff *skb = NULL; | 226 | struct sk_buff *skb = NULL; |
204 | bool send_direct; | 227 | bool send_direct; |
205 | const u8 *init_addr, *rsp_addr; | ||
206 | struct sta_info *sta; | 228 | struct sta_info *sta; |
207 | int ret; | 229 | int ret; |
208 | 230 | ||
@@ -243,9 +265,6 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev, | |||
243 | if (ret < 0) | 265 | if (ret < 0) |
244 | goto fail; | 266 | goto fail; |
245 | 267 | ||
246 | if (extra_ies_len) | ||
247 | memcpy(skb_put(skb, extra_ies_len), extra_ies, extra_ies_len); | ||
248 | |||
249 | rcu_read_lock(); | 268 | rcu_read_lock(); |
250 | sta = sta_info_get(sdata, peer); | 269 | sta = sta_info_get(sdata, peer); |
251 | 270 | ||
@@ -279,21 +298,15 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev, | |||
279 | break; | 298 | break; |
280 | } | 299 | } |
281 | 300 | ||
282 | if (initiator || (sta && test_sta_flag(sta, WLAN_STA_TDLS_INITIATOR))) { | 301 | if (sta && test_sta_flag(sta, WLAN_STA_TDLS_INITIATOR)) |
283 | init_addr = sdata->vif.addr; | 302 | initiator = true; |
284 | rsp_addr = peer; | ||
285 | } else { | ||
286 | init_addr = peer; | ||
287 | rsp_addr = sdata->vif.addr; | ||
288 | } | ||
289 | 303 | ||
290 | rcu_read_unlock(); | 304 | rcu_read_unlock(); |
291 | if (ret < 0) | 305 | if (ret < 0) |
292 | goto fail; | 306 | goto fail; |
293 | 307 | ||
294 | ieee80211_tdls_add_link_ie(skb, init_addr, rsp_addr, | 308 | ieee80211_tdls_add_ies(sdata, skb, peer, action_code, initiator, |
295 | sdata->u.mgd.bssid); | 309 | extra_ies, extra_ies_len); |
296 | |||
297 | if (send_direct) { | 310 | if (send_direct) { |
298 | ieee80211_tx_skb(sdata, skb); | 311 | ieee80211_tx_skb(sdata, skb); |
299 | return 0; | 312 | return 0; |