aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/tdls.c
diff options
context:
space:
mode:
authorArik Nemtsov <arik@wizery.com>2014-07-17 10:14:19 -0400
committerJohannes Berg <johannes.berg@intel.com>2014-07-21 06:14:03 -0400
commit46792a2dfcc7e000e6927088fbf06a135aaaa3eb (patch)
tree20ef8483283badb38f54cc99a1e0717ad0b29be1 /net/mac80211/tdls.c
parent6ae32e5d284a5db589bfa63561932ad3306f538a (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.c69
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
81static 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
81static int 118static int
82ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev, 119ieee80211_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;