diff options
Diffstat (limited to 'net/mac80211/mesh_plink.c')
-rw-r--r-- | net/mac80211/mesh_plink.c | 257 |
1 files changed, 137 insertions, 120 deletions
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index f4adc0917888..7e57f5d07f66 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c | |||
@@ -19,35 +19,18 @@ | |||
19 | #define mpl_dbg(fmt, args...) do { (void)(0); } while (0) | 19 | #define mpl_dbg(fmt, args...) do { (void)(0); } while (0) |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #define PLINK_GET_LLID(p) (p + 4) | 22 | #define PLINK_GET_LLID(p) (p + 2) |
23 | #define PLINK_GET_PLID(p) (p + 6) | 23 | #define PLINK_GET_PLID(p) (p + 4) |
24 | 24 | ||
25 | #define mod_plink_timer(s, t) (mod_timer(&s->plink_timer, \ | 25 | #define mod_plink_timer(s, t) (mod_timer(&s->plink_timer, \ |
26 | jiffies + HZ * t / 1000)) | 26 | jiffies + HZ * t / 1000)) |
27 | 27 | ||
28 | /* Peer link cancel reasons, all subject to ANA approval */ | ||
29 | #define MESH_LINK_CANCELLED 2 | ||
30 | #define MESH_MAX_NEIGHBORS 3 | ||
31 | #define MESH_CAPABILITY_POLICY_VIOLATION 4 | ||
32 | #define MESH_CLOSE_RCVD 5 | ||
33 | #define MESH_MAX_RETRIES 6 | ||
34 | #define MESH_CONFIRM_TIMEOUT 7 | ||
35 | #define MESH_SECURITY_ROLE_NEGOTIATION_DIFFERS 8 | ||
36 | #define MESH_SECURITY_AUTHENTICATION_IMPOSSIBLE 9 | ||
37 | #define MESH_SECURITY_FAILED_VERIFICATION 10 | ||
38 | |||
39 | #define dot11MeshMaxRetries(s) (s->u.mesh.mshcfg.dot11MeshMaxRetries) | 28 | #define dot11MeshMaxRetries(s) (s->u.mesh.mshcfg.dot11MeshMaxRetries) |
40 | #define dot11MeshRetryTimeout(s) (s->u.mesh.mshcfg.dot11MeshRetryTimeout) | 29 | #define dot11MeshRetryTimeout(s) (s->u.mesh.mshcfg.dot11MeshRetryTimeout) |
41 | #define dot11MeshConfirmTimeout(s) (s->u.mesh.mshcfg.dot11MeshConfirmTimeout) | 30 | #define dot11MeshConfirmTimeout(s) (s->u.mesh.mshcfg.dot11MeshConfirmTimeout) |
42 | #define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout) | 31 | #define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout) |
43 | #define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks) | 32 | #define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks) |
44 | 33 | ||
45 | enum plink_frame_type { | ||
46 | PLINK_OPEN = 1, | ||
47 | PLINK_CONFIRM, | ||
48 | PLINK_CLOSE | ||
49 | }; | ||
50 | |||
51 | enum plink_event { | 34 | enum plink_event { |
52 | PLINK_UNDEFINED, | 35 | PLINK_UNDEFINED, |
53 | OPN_ACPT, | 36 | OPN_ACPT, |
@@ -60,6 +43,10 @@ enum plink_event { | |||
60 | CLS_IGNR | 43 | CLS_IGNR |
61 | }; | 44 | }; |
62 | 45 | ||
46 | static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | ||
47 | enum ieee80211_self_protected_actioncode action, | ||
48 | u8 *da, __le16 llid, __le16 plid, __le16 reason); | ||
49 | |||
63 | static inline | 50 | static inline |
64 | void mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata) | 51 | void mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata) |
65 | { | 52 | { |
@@ -105,7 +92,9 @@ static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata, | |||
105 | if (!sta) | 92 | if (!sta) |
106 | return NULL; | 93 | return NULL; |
107 | 94 | ||
108 | sta->flags = WLAN_STA_AUTHORIZED | WLAN_STA_AUTH; | 95 | set_sta_flag(sta, WLAN_STA_AUTH); |
96 | set_sta_flag(sta, WLAN_STA_AUTHORIZED); | ||
97 | set_sta_flag(sta, WLAN_STA_WME); | ||
109 | sta->sta.supp_rates[local->hw.conf.channel->band] = rates; | 98 | sta->sta.supp_rates[local->hw.conf.channel->band] = rates; |
110 | rate_control_rate_init(sta); | 99 | rate_control_rate_init(sta); |
111 | 100 | ||
@@ -150,6 +139,10 @@ void mesh_plink_deactivate(struct sta_info *sta) | |||
150 | 139 | ||
151 | spin_lock_bh(&sta->lock); | 140 | spin_lock_bh(&sta->lock); |
152 | deactivated = __mesh_plink_deactivate(sta); | 141 | deactivated = __mesh_plink_deactivate(sta); |
142 | sta->reason = cpu_to_le16(WLAN_REASON_MESH_PEER_CANCELED); | ||
143 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, | ||
144 | sta->sta.addr, sta->llid, sta->plid, | ||
145 | sta->reason); | ||
153 | spin_unlock_bh(&sta->lock); | 146 | spin_unlock_bh(&sta->lock); |
154 | 147 | ||
155 | if (deactivated) | 148 | if (deactivated) |
@@ -157,16 +150,16 @@ void mesh_plink_deactivate(struct sta_info *sta) | |||
157 | } | 150 | } |
158 | 151 | ||
159 | static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | 152 | static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, |
160 | enum plink_frame_type action, u8 *da, __le16 llid, __le16 plid, | 153 | enum ieee80211_self_protected_actioncode action, |
161 | __le16 reason) { | 154 | u8 *da, __le16 llid, __le16 plid, __le16 reason) { |
162 | struct ieee80211_local *local = sdata->local; | 155 | struct ieee80211_local *local = sdata->local; |
163 | struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400 + | 156 | struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400 + |
164 | sdata->u.mesh.ie_len); | 157 | sdata->u.mesh.ie_len); |
165 | struct ieee80211_mgmt *mgmt; | 158 | struct ieee80211_mgmt *mgmt; |
166 | bool include_plid = false; | 159 | bool include_plid = false; |
167 | static const u8 meshpeeringproto[] = { 0x00, 0x0F, 0xAC, 0x2A }; | 160 | int ie_len = 4; |
161 | u16 peering_proto = 0; | ||
168 | u8 *pos; | 162 | u8 *pos; |
169 | int ie_len; | ||
170 | 163 | ||
171 | if (!skb) | 164 | if (!skb) |
172 | return -1; | 165 | return -1; |
@@ -175,63 +168,75 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
175 | * common action part (1) | 168 | * common action part (1) |
176 | */ | 169 | */ |
177 | mgmt = (struct ieee80211_mgmt *) | 170 | mgmt = (struct ieee80211_mgmt *) |
178 | skb_put(skb, 25 + sizeof(mgmt->u.action.u.plink_action)); | 171 | skb_put(skb, 25 + sizeof(mgmt->u.action.u.self_prot)); |
179 | memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.plink_action)); | 172 | memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.self_prot)); |
180 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 173 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
181 | IEEE80211_STYPE_ACTION); | 174 | IEEE80211_STYPE_ACTION); |
182 | memcpy(mgmt->da, da, ETH_ALEN); | 175 | memcpy(mgmt->da, da, ETH_ALEN); |
183 | memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); | 176 | memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); |
184 | memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); | 177 | memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); |
185 | mgmt->u.action.category = WLAN_CATEGORY_MESH_ACTION; | 178 | mgmt->u.action.category = WLAN_CATEGORY_SELF_PROTECTED; |
186 | mgmt->u.action.u.plink_action.action_code = action; | 179 | mgmt->u.action.u.self_prot.action_code = action; |
187 | 180 | ||
188 | if (action == PLINK_CLOSE) | 181 | if (action != WLAN_SP_MESH_PEERING_CLOSE) { |
189 | mgmt->u.action.u.plink_action.aux = reason; | 182 | /* capability info */ |
190 | else { | 183 | pos = skb_put(skb, 2); |
191 | mgmt->u.action.u.plink_action.aux = cpu_to_le16(0x0); | 184 | memset(pos, 0, 2); |
192 | if (action == PLINK_CONFIRM) { | 185 | if (action == WLAN_SP_MESH_PEERING_CONFIRM) { |
193 | pos = skb_put(skb, 4); | 186 | /* AID */ |
194 | /* two-byte status code followed by two-byte AID */ | 187 | pos = skb_put(skb, 2); |
195 | memset(pos, 0, 2); | ||
196 | memcpy(pos + 2, &plid, 2); | 188 | memcpy(pos + 2, &plid, 2); |
197 | } | 189 | } |
198 | mesh_mgmt_ies_add(skb, sdata); | 190 | if (ieee80211_add_srates_ie(&sdata->vif, skb) || |
191 | ieee80211_add_ext_srates_ie(&sdata->vif, skb) || | ||
192 | mesh_add_rsn_ie(skb, sdata) || | ||
193 | mesh_add_meshid_ie(skb, sdata) || | ||
194 | mesh_add_meshconf_ie(skb, sdata)) | ||
195 | return -1; | ||
196 | } else { /* WLAN_SP_MESH_PEERING_CLOSE */ | ||
197 | if (mesh_add_meshid_ie(skb, sdata)) | ||
198 | return -1; | ||
199 | } | 199 | } |
200 | 200 | ||
201 | /* Add Peer Link Management element */ | 201 | /* Add Mesh Peering Management element */ |
202 | switch (action) { | 202 | switch (action) { |
203 | case PLINK_OPEN: | 203 | case WLAN_SP_MESH_PEERING_OPEN: |
204 | ie_len = 6; | ||
205 | break; | 204 | break; |
206 | case PLINK_CONFIRM: | 205 | case WLAN_SP_MESH_PEERING_CONFIRM: |
207 | ie_len = 8; | 206 | ie_len += 2; |
208 | include_plid = true; | 207 | include_plid = true; |
209 | break; | 208 | break; |
210 | case PLINK_CLOSE: | 209 | case WLAN_SP_MESH_PEERING_CLOSE: |
211 | default: | 210 | if (plid) { |
212 | if (!plid) | 211 | ie_len += 2; |
213 | ie_len = 8; | ||
214 | else { | ||
215 | ie_len = 10; | ||
216 | include_plid = true; | 212 | include_plid = true; |
217 | } | 213 | } |
214 | ie_len += 2; /* reason code */ | ||
218 | break; | 215 | break; |
216 | default: | ||
217 | return -EINVAL; | ||
219 | } | 218 | } |
220 | 219 | ||
220 | if (WARN_ON(skb_tailroom(skb) < 2 + ie_len)) | ||
221 | return -ENOMEM; | ||
222 | |||
221 | pos = skb_put(skb, 2 + ie_len); | 223 | pos = skb_put(skb, 2 + ie_len); |
222 | *pos++ = WLAN_EID_PEER_LINK; | 224 | *pos++ = WLAN_EID_PEER_MGMT; |
223 | *pos++ = ie_len; | 225 | *pos++ = ie_len; |
224 | memcpy(pos, meshpeeringproto, sizeof(meshpeeringproto)); | 226 | memcpy(pos, &peering_proto, 2); |
225 | pos += 4; | 227 | pos += 2; |
226 | memcpy(pos, &llid, 2); | 228 | memcpy(pos, &llid, 2); |
229 | pos += 2; | ||
227 | if (include_plid) { | 230 | if (include_plid) { |
228 | pos += 2; | ||
229 | memcpy(pos, &plid, 2); | 231 | memcpy(pos, &plid, 2); |
230 | } | ||
231 | if (action == PLINK_CLOSE) { | ||
232 | pos += 2; | 232 | pos += 2; |
233 | } | ||
234 | if (action == WLAN_SP_MESH_PEERING_CLOSE) { | ||
233 | memcpy(pos, &reason, 2); | 235 | memcpy(pos, &reason, 2); |
236 | pos += 2; | ||
234 | } | 237 | } |
238 | if (mesh_add_vendor_ies(skb, sdata)) | ||
239 | return -1; | ||
235 | 240 | ||
236 | ieee80211_tx_skb(sdata, skb); | 241 | ieee80211_tx_skb(sdata, skb); |
237 | return 0; | 242 | return 0; |
@@ -322,21 +327,21 @@ static void mesh_plink_timer(unsigned long data) | |||
322 | ++sta->plink_retries; | 327 | ++sta->plink_retries; |
323 | mod_plink_timer(sta, sta->plink_timeout); | 328 | mod_plink_timer(sta, sta->plink_timeout); |
324 | spin_unlock_bh(&sta->lock); | 329 | spin_unlock_bh(&sta->lock); |
325 | mesh_plink_frame_tx(sdata, PLINK_OPEN, sta->sta.addr, llid, | 330 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN, |
326 | 0, 0); | 331 | sta->sta.addr, llid, 0, 0); |
327 | break; | 332 | break; |
328 | } | 333 | } |
329 | reason = cpu_to_le16(MESH_MAX_RETRIES); | 334 | reason = cpu_to_le16(WLAN_REASON_MESH_MAX_RETRIES); |
330 | /* fall through on else */ | 335 | /* fall through on else */ |
331 | case NL80211_PLINK_CNF_RCVD: | 336 | case NL80211_PLINK_CNF_RCVD: |
332 | /* confirm timer */ | 337 | /* confirm timer */ |
333 | if (!reason) | 338 | if (!reason) |
334 | reason = cpu_to_le16(MESH_CONFIRM_TIMEOUT); | 339 | reason = cpu_to_le16(WLAN_REASON_MESH_CONFIRM_TIMEOUT); |
335 | sta->plink_state = NL80211_PLINK_HOLDING; | 340 | sta->plink_state = NL80211_PLINK_HOLDING; |
336 | mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata)); | 341 | mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata)); |
337 | spin_unlock_bh(&sta->lock); | 342 | spin_unlock_bh(&sta->lock); |
338 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, plid, | 343 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, |
339 | reason); | 344 | sta->sta.addr, llid, plid, reason); |
340 | break; | 345 | break; |
341 | case NL80211_PLINK_HOLDING: | 346 | case NL80211_PLINK_HOLDING: |
342 | /* holding timer */ | 347 | /* holding timer */ |
@@ -380,7 +385,7 @@ int mesh_plink_open(struct sta_info *sta) | |||
380 | __le16 llid; | 385 | __le16 llid; |
381 | struct ieee80211_sub_if_data *sdata = sta->sdata; | 386 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
382 | 387 | ||
383 | if (!test_sta_flags(sta, WLAN_STA_AUTH)) | 388 | if (!test_sta_flag(sta, WLAN_STA_AUTH)) |
384 | return -EPERM; | 389 | return -EPERM; |
385 | 390 | ||
386 | spin_lock_bh(&sta->lock); | 391 | spin_lock_bh(&sta->lock); |
@@ -396,7 +401,7 @@ int mesh_plink_open(struct sta_info *sta) | |||
396 | mpl_dbg("Mesh plink: starting establishment with %pM\n", | 401 | mpl_dbg("Mesh plink: starting establishment with %pM\n", |
397 | sta->sta.addr); | 402 | sta->sta.addr); |
398 | 403 | ||
399 | return mesh_plink_frame_tx(sdata, PLINK_OPEN, | 404 | return mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN, |
400 | sta->sta.addr, llid, 0, 0); | 405 | sta->sta.addr, llid, 0, 0); |
401 | } | 406 | } |
402 | 407 | ||
@@ -422,7 +427,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
422 | struct ieee802_11_elems elems; | 427 | struct ieee802_11_elems elems; |
423 | struct sta_info *sta; | 428 | struct sta_info *sta; |
424 | enum plink_event event; | 429 | enum plink_event event; |
425 | enum plink_frame_type ftype; | 430 | enum ieee80211_self_protected_actioncode ftype; |
426 | size_t baselen; | 431 | size_t baselen; |
427 | bool deactivated, matches_local = true; | 432 | bool deactivated, matches_local = true; |
428 | u8 ie_len; | 433 | u8 ie_len; |
@@ -449,14 +454,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
449 | return; | 454 | return; |
450 | } | 455 | } |
451 | 456 | ||
452 | baseaddr = mgmt->u.action.u.plink_action.variable; | 457 | baseaddr = mgmt->u.action.u.self_prot.variable; |
453 | baselen = (u8 *) mgmt->u.action.u.plink_action.variable - (u8 *) mgmt; | 458 | baselen = (u8 *) mgmt->u.action.u.self_prot.variable - (u8 *) mgmt; |
454 | if (mgmt->u.action.u.plink_action.action_code == PLINK_CONFIRM) { | 459 | if (mgmt->u.action.u.self_prot.action_code == |
460 | WLAN_SP_MESH_PEERING_CONFIRM) { | ||
455 | baseaddr += 4; | 461 | baseaddr += 4; |
456 | baselen += 4; | 462 | baselen += 4; |
457 | } | 463 | } |
458 | ieee802_11_parse_elems(baseaddr, len - baselen, &elems); | 464 | ieee802_11_parse_elems(baseaddr, len - baselen, &elems); |
459 | if (!elems.peer_link) { | 465 | if (!elems.peering) { |
460 | mpl_dbg("Mesh plink: missing necessary peer link ie\n"); | 466 | mpl_dbg("Mesh plink: missing necessary peer link ie\n"); |
461 | return; | 467 | return; |
462 | } | 468 | } |
@@ -466,37 +472,40 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
466 | return; | 472 | return; |
467 | } | 473 | } |
468 | 474 | ||
469 | ftype = mgmt->u.action.u.plink_action.action_code; | 475 | ftype = mgmt->u.action.u.self_prot.action_code; |
470 | ie_len = elems.peer_link_len; | 476 | ie_len = elems.peering_len; |
471 | if ((ftype == PLINK_OPEN && ie_len != 6) || | 477 | if ((ftype == WLAN_SP_MESH_PEERING_OPEN && ie_len != 4) || |
472 | (ftype == PLINK_CONFIRM && ie_len != 8) || | 478 | (ftype == WLAN_SP_MESH_PEERING_CONFIRM && ie_len != 6) || |
473 | (ftype == PLINK_CLOSE && ie_len != 8 && ie_len != 10)) { | 479 | (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len != 6 |
480 | && ie_len != 8)) { | ||
474 | mpl_dbg("Mesh plink: incorrect plink ie length %d %d\n", | 481 | mpl_dbg("Mesh plink: incorrect plink ie length %d %d\n", |
475 | ftype, ie_len); | 482 | ftype, ie_len); |
476 | return; | 483 | return; |
477 | } | 484 | } |
478 | 485 | ||
479 | if (ftype != PLINK_CLOSE && (!elems.mesh_id || !elems.mesh_config)) { | 486 | if (ftype != WLAN_SP_MESH_PEERING_CLOSE && |
487 | (!elems.mesh_id || !elems.mesh_config)) { | ||
480 | mpl_dbg("Mesh plink: missing necessary ie\n"); | 488 | mpl_dbg("Mesh plink: missing necessary ie\n"); |
481 | return; | 489 | return; |
482 | } | 490 | } |
483 | /* Note the lines below are correct, the llid in the frame is the plid | 491 | /* Note the lines below are correct, the llid in the frame is the plid |
484 | * from the point of view of this host. | 492 | * from the point of view of this host. |
485 | */ | 493 | */ |
486 | memcpy(&plid, PLINK_GET_LLID(elems.peer_link), 2); | 494 | memcpy(&plid, PLINK_GET_LLID(elems.peering), 2); |
487 | if (ftype == PLINK_CONFIRM || (ftype == PLINK_CLOSE && ie_len == 10)) | 495 | if (ftype == WLAN_SP_MESH_PEERING_CONFIRM || |
488 | memcpy(&llid, PLINK_GET_PLID(elems.peer_link), 2); | 496 | (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8)) |
497 | memcpy(&llid, PLINK_GET_PLID(elems.peering), 2); | ||
489 | 498 | ||
490 | rcu_read_lock(); | 499 | rcu_read_lock(); |
491 | 500 | ||
492 | sta = sta_info_get(sdata, mgmt->sa); | 501 | sta = sta_info_get(sdata, mgmt->sa); |
493 | if (!sta && ftype != PLINK_OPEN) { | 502 | if (!sta && ftype != WLAN_SP_MESH_PEERING_OPEN) { |
494 | mpl_dbg("Mesh plink: cls or cnf from unknown peer\n"); | 503 | mpl_dbg("Mesh plink: cls or cnf from unknown peer\n"); |
495 | rcu_read_unlock(); | 504 | rcu_read_unlock(); |
496 | return; | 505 | return; |
497 | } | 506 | } |
498 | 507 | ||
499 | if (sta && !test_sta_flags(sta, WLAN_STA_AUTH)) { | 508 | if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) { |
500 | mpl_dbg("Mesh plink: Action frame from non-authed peer\n"); | 509 | mpl_dbg("Mesh plink: Action frame from non-authed peer\n"); |
501 | rcu_read_unlock(); | 510 | rcu_read_unlock(); |
502 | return; | 511 | return; |
@@ -509,30 +518,30 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
509 | 518 | ||
510 | /* Now we will figure out the appropriate event... */ | 519 | /* Now we will figure out the appropriate event... */ |
511 | event = PLINK_UNDEFINED; | 520 | event = PLINK_UNDEFINED; |
512 | if (ftype != PLINK_CLOSE && (!mesh_matches_local(&elems, sdata))) { | 521 | if (ftype != WLAN_SP_MESH_PEERING_CLOSE && |
522 | (!mesh_matches_local(&elems, sdata))) { | ||
513 | matches_local = false; | 523 | matches_local = false; |
514 | switch (ftype) { | 524 | switch (ftype) { |
515 | case PLINK_OPEN: | 525 | case WLAN_SP_MESH_PEERING_OPEN: |
516 | event = OPN_RJCT; | 526 | event = OPN_RJCT; |
517 | break; | 527 | break; |
518 | case PLINK_CONFIRM: | 528 | case WLAN_SP_MESH_PEERING_CONFIRM: |
519 | event = CNF_RJCT; | 529 | event = CNF_RJCT; |
520 | break; | 530 | break; |
521 | case PLINK_CLOSE: | 531 | default: |
522 | /* avoid warning */ | ||
523 | break; | 532 | break; |
524 | } | 533 | } |
525 | } | 534 | } |
526 | 535 | ||
527 | if (!sta && !matches_local) { | 536 | if (!sta && !matches_local) { |
528 | rcu_read_unlock(); | 537 | rcu_read_unlock(); |
529 | reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); | 538 | reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG); |
530 | llid = 0; | 539 | llid = 0; |
531 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, mgmt->sa, llid, | 540 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, |
532 | plid, reason); | 541 | mgmt->sa, llid, plid, reason); |
533 | return; | 542 | return; |
534 | } else if (!sta) { | 543 | } else if (!sta) { |
535 | /* ftype == PLINK_OPEN */ | 544 | /* ftype == WLAN_SP_MESH_PEERING_OPEN */ |
536 | u32 rates; | 545 | u32 rates; |
537 | 546 | ||
538 | rcu_read_unlock(); | 547 | rcu_read_unlock(); |
@@ -557,21 +566,21 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
557 | } else if (matches_local) { | 566 | } else if (matches_local) { |
558 | spin_lock_bh(&sta->lock); | 567 | spin_lock_bh(&sta->lock); |
559 | switch (ftype) { | 568 | switch (ftype) { |
560 | case PLINK_OPEN: | 569 | case WLAN_SP_MESH_PEERING_OPEN: |
561 | if (!mesh_plink_free_count(sdata) || | 570 | if (!mesh_plink_free_count(sdata) || |
562 | (sta->plid && sta->plid != plid)) | 571 | (sta->plid && sta->plid != plid)) |
563 | event = OPN_IGNR; | 572 | event = OPN_IGNR; |
564 | else | 573 | else |
565 | event = OPN_ACPT; | 574 | event = OPN_ACPT; |
566 | break; | 575 | break; |
567 | case PLINK_CONFIRM: | 576 | case WLAN_SP_MESH_PEERING_CONFIRM: |
568 | if (!mesh_plink_free_count(sdata) || | 577 | if (!mesh_plink_free_count(sdata) || |
569 | (sta->llid != llid || sta->plid != plid)) | 578 | (sta->llid != llid || sta->plid != plid)) |
570 | event = CNF_IGNR; | 579 | event = CNF_IGNR; |
571 | else | 580 | else |
572 | event = CNF_ACPT; | 581 | event = CNF_ACPT; |
573 | break; | 582 | break; |
574 | case PLINK_CLOSE: | 583 | case WLAN_SP_MESH_PEERING_CLOSE: |
575 | if (sta->plink_state == NL80211_PLINK_ESTAB) | 584 | if (sta->plink_state == NL80211_PLINK_ESTAB) |
576 | /* Do not check for llid or plid. This does not | 585 | /* Do not check for llid or plid. This does not |
577 | * follow the standard but since multiple plinks | 586 | * follow the standard but since multiple plinks |
@@ -620,10 +629,12 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
620 | sta->llid = llid; | 629 | sta->llid = llid; |
621 | mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata)); | 630 | mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata)); |
622 | spin_unlock_bh(&sta->lock); | 631 | spin_unlock_bh(&sta->lock); |
623 | mesh_plink_frame_tx(sdata, PLINK_OPEN, sta->sta.addr, llid, | 632 | mesh_plink_frame_tx(sdata, |
624 | 0, 0); | 633 | WLAN_SP_MESH_PEERING_OPEN, |
625 | mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, | 634 | sta->sta.addr, llid, 0, 0); |
626 | llid, plid, 0); | 635 | mesh_plink_frame_tx(sdata, |
636 | WLAN_SP_MESH_PEERING_CONFIRM, | ||
637 | sta->sta.addr, llid, plid, 0); | ||
627 | break; | 638 | break; |
628 | default: | 639 | default: |
629 | spin_unlock_bh(&sta->lock); | 640 | spin_unlock_bh(&sta->lock); |
@@ -635,10 +646,10 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
635 | switch (event) { | 646 | switch (event) { |
636 | case OPN_RJCT: | 647 | case OPN_RJCT: |
637 | case CNF_RJCT: | 648 | case CNF_RJCT: |
638 | reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); | 649 | reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG); |
639 | case CLS_ACPT: | 650 | case CLS_ACPT: |
640 | if (!reason) | 651 | if (!reason) |
641 | reason = cpu_to_le16(MESH_CLOSE_RCVD); | 652 | reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE); |
642 | sta->reason = reason; | 653 | sta->reason = reason; |
643 | sta->plink_state = NL80211_PLINK_HOLDING; | 654 | sta->plink_state = NL80211_PLINK_HOLDING; |
644 | if (!mod_plink_timer(sta, | 655 | if (!mod_plink_timer(sta, |
@@ -647,8 +658,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
647 | 658 | ||
648 | llid = sta->llid; | 659 | llid = sta->llid; |
649 | spin_unlock_bh(&sta->lock); | 660 | spin_unlock_bh(&sta->lock); |
650 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, | 661 | mesh_plink_frame_tx(sdata, |
651 | plid, reason); | 662 | WLAN_SP_MESH_PEERING_CLOSE, |
663 | sta->sta.addr, llid, plid, reason); | ||
652 | break; | 664 | break; |
653 | case OPN_ACPT: | 665 | case OPN_ACPT: |
654 | /* retry timer is left untouched */ | 666 | /* retry timer is left untouched */ |
@@ -656,8 +668,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
656 | sta->plid = plid; | 668 | sta->plid = plid; |
657 | llid = sta->llid; | 669 | llid = sta->llid; |
658 | spin_unlock_bh(&sta->lock); | 670 | spin_unlock_bh(&sta->lock); |
659 | mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, | 671 | mesh_plink_frame_tx(sdata, |
660 | plid, 0); | 672 | WLAN_SP_MESH_PEERING_CONFIRM, |
673 | sta->sta.addr, llid, plid, 0); | ||
661 | break; | 674 | break; |
662 | case CNF_ACPT: | 675 | case CNF_ACPT: |
663 | sta->plink_state = NL80211_PLINK_CNF_RCVD; | 676 | sta->plink_state = NL80211_PLINK_CNF_RCVD; |
@@ -677,10 +690,10 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
677 | switch (event) { | 690 | switch (event) { |
678 | case OPN_RJCT: | 691 | case OPN_RJCT: |
679 | case CNF_RJCT: | 692 | case CNF_RJCT: |
680 | reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); | 693 | reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG); |
681 | case CLS_ACPT: | 694 | case CLS_ACPT: |
682 | if (!reason) | 695 | if (!reason) |
683 | reason = cpu_to_le16(MESH_CLOSE_RCVD); | 696 | reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE); |
684 | sta->reason = reason; | 697 | sta->reason = reason; |
685 | sta->plink_state = NL80211_PLINK_HOLDING; | 698 | sta->plink_state = NL80211_PLINK_HOLDING; |
686 | if (!mod_plink_timer(sta, | 699 | if (!mod_plink_timer(sta, |
@@ -689,14 +702,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
689 | 702 | ||
690 | llid = sta->llid; | 703 | llid = sta->llid; |
691 | spin_unlock_bh(&sta->lock); | 704 | spin_unlock_bh(&sta->lock); |
692 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, | 705 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, |
693 | plid, reason); | 706 | sta->sta.addr, llid, plid, reason); |
694 | break; | 707 | break; |
695 | case OPN_ACPT: | 708 | case OPN_ACPT: |
696 | llid = sta->llid; | 709 | llid = sta->llid; |
697 | spin_unlock_bh(&sta->lock); | 710 | spin_unlock_bh(&sta->lock); |
698 | mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, | 711 | mesh_plink_frame_tx(sdata, |
699 | plid, 0); | 712 | WLAN_SP_MESH_PEERING_CONFIRM, |
713 | sta->sta.addr, llid, plid, 0); | ||
700 | break; | 714 | break; |
701 | case CNF_ACPT: | 715 | case CNF_ACPT: |
702 | del_timer(&sta->plink_timer); | 716 | del_timer(&sta->plink_timer); |
@@ -717,10 +731,10 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
717 | switch (event) { | 731 | switch (event) { |
718 | case OPN_RJCT: | 732 | case OPN_RJCT: |
719 | case CNF_RJCT: | 733 | case CNF_RJCT: |
720 | reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); | 734 | reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG); |
721 | case CLS_ACPT: | 735 | case CLS_ACPT: |
722 | if (!reason) | 736 | if (!reason) |
723 | reason = cpu_to_le16(MESH_CLOSE_RCVD); | 737 | reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE); |
724 | sta->reason = reason; | 738 | sta->reason = reason; |
725 | sta->plink_state = NL80211_PLINK_HOLDING; | 739 | sta->plink_state = NL80211_PLINK_HOLDING; |
726 | if (!mod_plink_timer(sta, | 740 | if (!mod_plink_timer(sta, |
@@ -729,8 +743,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
729 | 743 | ||
730 | llid = sta->llid; | 744 | llid = sta->llid; |
731 | spin_unlock_bh(&sta->lock); | 745 | spin_unlock_bh(&sta->lock); |
732 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, | 746 | mesh_plink_frame_tx(sdata, |
733 | plid, reason); | 747 | WLAN_SP_MESH_PEERING_CLOSE, |
748 | sta->sta.addr, llid, plid, reason); | ||
734 | break; | 749 | break; |
735 | case OPN_ACPT: | 750 | case OPN_ACPT: |
736 | del_timer(&sta->plink_timer); | 751 | del_timer(&sta->plink_timer); |
@@ -740,8 +755,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
740 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); | 755 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); |
741 | mpl_dbg("Mesh plink with %pM ESTABLISHED\n", | 756 | mpl_dbg("Mesh plink with %pM ESTABLISHED\n", |
742 | sta->sta.addr); | 757 | sta->sta.addr); |
743 | mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, | 758 | mesh_plink_frame_tx(sdata, |
744 | plid, 0); | 759 | WLAN_SP_MESH_PEERING_CONFIRM, |
760 | sta->sta.addr, llid, plid, 0); | ||
745 | break; | 761 | break; |
746 | default: | 762 | default: |
747 | spin_unlock_bh(&sta->lock); | 763 | spin_unlock_bh(&sta->lock); |
@@ -752,7 +768,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
752 | case NL80211_PLINK_ESTAB: | 768 | case NL80211_PLINK_ESTAB: |
753 | switch (event) { | 769 | switch (event) { |
754 | case CLS_ACPT: | 770 | case CLS_ACPT: |
755 | reason = cpu_to_le16(MESH_CLOSE_RCVD); | 771 | reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE); |
756 | sta->reason = reason; | 772 | sta->reason = reason; |
757 | deactivated = __mesh_plink_deactivate(sta); | 773 | deactivated = __mesh_plink_deactivate(sta); |
758 | sta->plink_state = NL80211_PLINK_HOLDING; | 774 | sta->plink_state = NL80211_PLINK_HOLDING; |
@@ -761,14 +777,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
761 | spin_unlock_bh(&sta->lock); | 777 | spin_unlock_bh(&sta->lock); |
762 | if (deactivated) | 778 | if (deactivated) |
763 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); | 779 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); |
764 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, | 780 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, |
765 | plid, reason); | 781 | sta->sta.addr, llid, plid, reason); |
766 | break; | 782 | break; |
767 | case OPN_ACPT: | 783 | case OPN_ACPT: |
768 | llid = sta->llid; | 784 | llid = sta->llid; |
769 | spin_unlock_bh(&sta->lock); | 785 | spin_unlock_bh(&sta->lock); |
770 | mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, | 786 | mesh_plink_frame_tx(sdata, |
771 | plid, 0); | 787 | WLAN_SP_MESH_PEERING_CONFIRM, |
788 | sta->sta.addr, llid, plid, 0); | ||
772 | break; | 789 | break; |
773 | default: | 790 | default: |
774 | spin_unlock_bh(&sta->lock); | 791 | spin_unlock_bh(&sta->lock); |
@@ -790,8 +807,8 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m | |||
790 | llid = sta->llid; | 807 | llid = sta->llid; |
791 | reason = sta->reason; | 808 | reason = sta->reason; |
792 | spin_unlock_bh(&sta->lock); | 809 | spin_unlock_bh(&sta->lock); |
793 | mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, | 810 | mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, |
794 | llid, plid, reason); | 811 | sta->sta.addr, llid, plid, reason); |
795 | break; | 812 | break; |
796 | default: | 813 | default: |
797 | spin_unlock_bh(&sta->lock); | 814 | spin_unlock_bh(&sta->lock); |