mac80211: don't expose ieee80211_add_srates_ie()
[firefly-linux-kernel-4.4.55.git] / net / mac80211 / mesh_plink.c
1 /*
2  * Copyright (c) 2008, 2009 open80211s Ltd.
3  * Author:     Luis Carlos Cobo <luisca@cozybit.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9 #include <linux/gfp.h>
10 #include <linux/kernel.h>
11 #include <linux/random.h>
12 #include "ieee80211_i.h"
13 #include "rate.h"
14 #include "mesh.h"
15
16 #define PLINK_GET_LLID(p) (p + 2)
17 #define PLINK_GET_PLID(p) (p + 4)
18
19 #define mod_plink_timer(s, t) (mod_timer(&s->plink_timer, \
20                                 jiffies + HZ * t / 1000))
21
22 #define dot11MeshMaxRetries(s) (s->u.mesh.mshcfg.dot11MeshMaxRetries)
23 #define dot11MeshRetryTimeout(s) (s->u.mesh.mshcfg.dot11MeshRetryTimeout)
24 #define dot11MeshConfirmTimeout(s) (s->u.mesh.mshcfg.dot11MeshConfirmTimeout)
25 #define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout)
26 #define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks)
27
28 /* We only need a valid sta if user configured a minimum rssi_threshold. */
29 #define rssi_threshold_check(sta, sdata) \
30                 (sdata->u.mesh.mshcfg.rssi_threshold == 0 ||\
31                 (sta && (s8) -ewma_read(&sta->avg_signal) > \
32                 sdata->u.mesh.mshcfg.rssi_threshold))
33
34 enum plink_event {
35         PLINK_UNDEFINED,
36         OPN_ACPT,
37         OPN_RJCT,
38         OPN_IGNR,
39         CNF_ACPT,
40         CNF_RJCT,
41         CNF_IGNR,
42         CLS_ACPT,
43         CLS_IGNR
44 };
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
50 static inline
51 void mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata)
52 {
53         atomic_inc(&sdata->u.mesh.mshstats.estab_plinks);
54         mesh_accept_plinks_update(sdata);
55 }
56
57 static inline
58 void mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata)
59 {
60         atomic_dec(&sdata->u.mesh.mshstats.estab_plinks);
61         mesh_accept_plinks_update(sdata);
62 }
63
64 /**
65  * mesh_plink_fsm_restart - restart a mesh peer link finite state machine
66  *
67  * @sta: mesh peer link to restart
68  *
69  * Locking: this function must be called holding sta->lock
70  */
71 static inline void mesh_plink_fsm_restart(struct sta_info *sta)
72 {
73         sta->plink_state = NL80211_PLINK_LISTEN;
74         sta->llid = sta->plid = sta->reason = 0;
75         sta->plink_retries = 0;
76 }
77
78 /*
79  * Allocate mesh sta entry and insert into station table
80  */
81 static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
82                                          u8 *hw_addr)
83 {
84         struct sta_info *sta;
85
86         if (sdata->local->num_sta >= MESH_MAX_PLINKS)
87                 return NULL;
88
89         sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL);
90         if (!sta)
91                 return NULL;
92
93         sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
94         sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
95         sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
96
97         set_sta_flag(sta, WLAN_STA_WME);
98
99         return sta;
100 }
101
102 /*
103  * mesh_set_ht_prot_mode - set correct HT protection mode
104  *
105  * Section 9.23.3.5 of IEEE 80211-2012 describes the protection rules for HT
106  * mesh STA in a MBSS. Three HT protection modes are supported for now, non-HT
107  * mixed mode, 20MHz-protection and no-protection mode. non-HT mixed mode is
108  * selected if any non-HT peers are present in our MBSS.  20MHz-protection mode
109  * is selected if all peers in our 20/40MHz MBSS support HT and atleast one
110  * HT20 peer is present. Otherwise no-protection mode is selected.
111  */
112 static u32 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata)
113 {
114         struct ieee80211_local *local = sdata->local;
115         struct sta_info *sta;
116         u32 changed = 0;
117         u16 ht_opmode;
118         bool non_ht_sta = false, ht20_sta = false;
119
120         if (local->_oper_channel_type == NL80211_CHAN_NO_HT)
121                 return 0;
122
123         rcu_read_lock();
124         list_for_each_entry_rcu(sta, &local->sta_list, list) {
125                 if (sdata != sta->sdata ||
126                     sta->plink_state != NL80211_PLINK_ESTAB)
127                         continue;
128
129                 switch (sta->ch_type) {
130                 case NL80211_CHAN_NO_HT:
131                         mpl_dbg(sdata,
132                                 "mesh_plink %pM: nonHT sta (%pM) is present\n",
133                                 sdata->vif.addr, sta->sta.addr);
134                         non_ht_sta = true;
135                         goto out;
136                 case NL80211_CHAN_HT20:
137                         mpl_dbg(sdata,
138                                 "mesh_plink %pM: HT20 sta (%pM) is present\n",
139                                 sdata->vif.addr, sta->sta.addr);
140                         ht20_sta = true;
141                 default:
142                         break;
143                 }
144         }
145 out:
146         rcu_read_unlock();
147
148         if (non_ht_sta)
149                 ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED;
150         else if (ht20_sta && local->_oper_channel_type > NL80211_CHAN_HT20)
151                 ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_20MHZ;
152         else
153                 ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
154
155         if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) {
156                 sdata->vif.bss_conf.ht_operation_mode = ht_opmode;
157                 sdata->u.mesh.mshcfg.ht_opmode = ht_opmode;
158                 changed = BSS_CHANGED_HT;
159                 mpl_dbg(sdata,
160                         "mesh_plink %pM: protection mode changed to %d\n",
161                         sdata->vif.addr, ht_opmode);
162         }
163
164         return changed;
165 }
166
167 /**
168  * __mesh_plink_deactivate - deactivate mesh peer link
169  *
170  * @sta: mesh peer link to deactivate
171  *
172  * All mesh paths with this peer as next hop will be flushed
173  *
174  * Locking: the caller must hold sta->lock
175  */
176 static bool __mesh_plink_deactivate(struct sta_info *sta)
177 {
178         struct ieee80211_sub_if_data *sdata = sta->sdata;
179         bool deactivated = false;
180
181         if (sta->plink_state == NL80211_PLINK_ESTAB) {
182                 mesh_plink_dec_estab_count(sdata);
183                 deactivated = true;
184         }
185         sta->plink_state = NL80211_PLINK_BLOCKED;
186         mesh_path_flush_by_nexthop(sta);
187
188         return deactivated;
189 }
190
191 /**
192  * mesh_plink_deactivate - deactivate mesh peer link
193  *
194  * @sta: mesh peer link to deactivate
195  *
196  * All mesh paths with this peer as next hop will be flushed
197  */
198 void mesh_plink_deactivate(struct sta_info *sta)
199 {
200         struct ieee80211_sub_if_data *sdata = sta->sdata;
201         bool deactivated;
202
203         spin_lock_bh(&sta->lock);
204         deactivated = __mesh_plink_deactivate(sta);
205         sta->reason = cpu_to_le16(WLAN_REASON_MESH_PEER_CANCELED);
206         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
207                             sta->sta.addr, sta->llid, sta->plid,
208                             sta->reason);
209         spin_unlock_bh(&sta->lock);
210
211         if (deactivated)
212                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
213 }
214
215 static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
216                 enum ieee80211_self_protected_actioncode action,
217                 u8 *da, __le16 llid, __le16 plid, __le16 reason) {
218         struct ieee80211_local *local = sdata->local;
219         struct sk_buff *skb;
220         struct ieee80211_mgmt *mgmt;
221         bool include_plid = false;
222         u16 peering_proto = 0;
223         u8 *pos, ie_len = 4;
224         int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) +
225                       sizeof(mgmt->u.action.u.self_prot);
226
227         skb = dev_alloc_skb(local->tx_headroom +
228                             hdr_len +
229                             2 + /* capability info */
230                             2 + /* AID */
231                             2 + 8 + /* supported rates */
232                             2 + (IEEE80211_MAX_SUPP_RATES - 8) +
233                             2 + sdata->u.mesh.mesh_id_len +
234                             2 + sizeof(struct ieee80211_meshconf_ie) +
235                             2 + sizeof(struct ieee80211_ht_cap) +
236                             2 + sizeof(struct ieee80211_ht_operation) +
237                             2 + 8 + /* peering IE */
238                             sdata->u.mesh.ie_len);
239         if (!skb)
240                 return -1;
241         skb_reserve(skb, local->tx_headroom);
242         mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
243         memset(mgmt, 0, hdr_len);
244         mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
245                                           IEEE80211_STYPE_ACTION);
246         memcpy(mgmt->da, da, ETH_ALEN);
247         memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
248         memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
249         mgmt->u.action.category = WLAN_CATEGORY_SELF_PROTECTED;
250         mgmt->u.action.u.self_prot.action_code = action;
251
252         if (action != WLAN_SP_MESH_PEERING_CLOSE) {
253                 /* capability info */
254                 pos = skb_put(skb, 2);
255                 memset(pos, 0, 2);
256                 if (action == WLAN_SP_MESH_PEERING_CONFIRM) {
257                         /* AID */
258                         pos = skb_put(skb, 2);
259                         memcpy(pos + 2, &plid, 2);
260                 }
261                 if (ieee80211_add_srates_ie(sdata, skb, true) ||
262                     ieee80211_add_ext_srates_ie(sdata, skb, true) ||
263                     mesh_add_rsn_ie(skb, sdata) ||
264                     mesh_add_meshid_ie(skb, sdata) ||
265                     mesh_add_meshconf_ie(skb, sdata))
266                         return -1;
267         } else {        /* WLAN_SP_MESH_PEERING_CLOSE */
268                 if (mesh_add_meshid_ie(skb, sdata))
269                         return -1;
270         }
271
272         /* Add Mesh Peering Management element */
273         switch (action) {
274         case WLAN_SP_MESH_PEERING_OPEN:
275                 break;
276         case WLAN_SP_MESH_PEERING_CONFIRM:
277                 ie_len += 2;
278                 include_plid = true;
279                 break;
280         case WLAN_SP_MESH_PEERING_CLOSE:
281                 if (plid) {
282                         ie_len += 2;
283                         include_plid = true;
284                 }
285                 ie_len += 2;    /* reason code */
286                 break;
287         default:
288                 return -EINVAL;
289         }
290
291         if (WARN_ON(skb_tailroom(skb) < 2 + ie_len))
292                 return -ENOMEM;
293
294         pos = skb_put(skb, 2 + ie_len);
295         *pos++ = WLAN_EID_PEER_MGMT;
296         *pos++ = ie_len;
297         memcpy(pos, &peering_proto, 2);
298         pos += 2;
299         memcpy(pos, &llid, 2);
300         pos += 2;
301         if (include_plid) {
302                 memcpy(pos, &plid, 2);
303                 pos += 2;
304         }
305         if (action == WLAN_SP_MESH_PEERING_CLOSE) {
306                 memcpy(pos, &reason, 2);
307                 pos += 2;
308         }
309
310         if (action != WLAN_SP_MESH_PEERING_CLOSE) {
311                 if (mesh_add_ht_cap_ie(skb, sdata) ||
312                     mesh_add_ht_oper_ie(skb, sdata))
313                         return -1;
314         }
315
316         if (mesh_add_vendor_ies(skb, sdata))
317                 return -1;
318
319         ieee80211_tx_skb(sdata, skb);
320         return 0;
321 }
322
323 /* mesh_peer_init - initialize new mesh peer and return resulting sta_info
324  *
325  * @sdata: local meshif
326  * @addr: peer's address
327  * @elems: IEs from beacon or mesh peering frame
328  *
329  * call under RCU
330  */
331 static struct sta_info *mesh_peer_init(struct ieee80211_sub_if_data *sdata,
332                                        u8 *addr,
333                                        struct ieee802_11_elems *elems)
334 {
335         struct ieee80211_local *local = sdata->local;
336         enum ieee80211_band band = local->oper_channel->band;
337         struct ieee80211_supported_band *sband;
338         u32 rates, basic_rates = 0;
339         struct sta_info *sta;
340         bool insert = false;
341
342         sband = local->hw.wiphy->bands[band];
343         rates = ieee80211_sta_get_rates(local, elems, band, &basic_rates);
344
345         sta = sta_info_get(sdata, addr);
346         if (!sta) {
347                 /* Userspace handles peer allocation when security is enabled */
348                 if (sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) {
349                         cfg80211_notify_new_peer_candidate(sdata->dev, addr,
350                                                            elems->ie_start,
351                                                            elems->total_len,
352                                                            GFP_ATOMIC);
353                         return NULL;
354                 }
355
356                 sta = mesh_plink_alloc(sdata, addr);
357                 if (!sta)
358                         return NULL;
359                 insert = true;
360         }
361
362         spin_lock_bh(&sta->lock);
363         sta->last_rx = jiffies;
364         sta->sta.supp_rates[band] = rates;
365         if (elems->ht_cap_elem &&
366             sdata->local->_oper_channel_type != NL80211_CHAN_NO_HT)
367                 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
368                                                   elems->ht_cap_elem,
369                                                   &sta->sta.ht_cap);
370         else
371                 memset(&sta->sta.ht_cap, 0, sizeof(sta->sta.ht_cap));
372
373         if (elems->ht_operation) {
374                 if (!(elems->ht_operation->ht_param &
375                       IEEE80211_HT_PARAM_CHAN_WIDTH_ANY))
376                         sta->sta.ht_cap.cap &=
377                                             ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
378                 sta->ch_type =
379                         ieee80211_ht_oper_to_channel_type(elems->ht_operation);
380         }
381
382         rate_control_rate_init(sta);
383         spin_unlock_bh(&sta->lock);
384
385         if (insert && sta_info_insert(sta))
386                 return NULL;
387
388         return sta;
389 }
390
391 void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,
392                            u8 *hw_addr,
393                            struct ieee802_11_elems *elems)
394 {
395         struct sta_info *sta;
396
397         rcu_read_lock();
398         sta = mesh_peer_init(sdata, hw_addr, elems);
399         if (!sta)
400                 goto out;
401
402         if (mesh_peer_accepts_plinks(elems) &&
403             sta->plink_state == NL80211_PLINK_LISTEN &&
404             sdata->u.mesh.accepting_plinks &&
405             sdata->u.mesh.mshcfg.auto_open_plinks &&
406             rssi_threshold_check(sta, sdata))
407                 mesh_plink_open(sta);
408
409 out:
410         rcu_read_unlock();
411 }
412
413 static void mesh_plink_timer(unsigned long data)
414 {
415         struct sta_info *sta;
416         __le16 llid, plid, reason;
417         struct ieee80211_sub_if_data *sdata;
418
419         /*
420          * This STA is valid because sta_info_destroy() will
421          * del_timer_sync() this timer after having made sure
422          * it cannot be readded (by deleting the plink.)
423          */
424         sta = (struct sta_info *) data;
425
426         if (sta->sdata->local->quiescing) {
427                 sta->plink_timer_was_running = true;
428                 return;
429         }
430
431         spin_lock_bh(&sta->lock);
432         if (sta->ignore_plink_timer) {
433                 sta->ignore_plink_timer = false;
434                 spin_unlock_bh(&sta->lock);
435                 return;
436         }
437         mpl_dbg(sta->sdata,
438                 "Mesh plink timer for %pM fired on state %d\n",
439                 sta->sta.addr, sta->plink_state);
440         reason = 0;
441         llid = sta->llid;
442         plid = sta->plid;
443         sdata = sta->sdata;
444
445         switch (sta->plink_state) {
446         case NL80211_PLINK_OPN_RCVD:
447         case NL80211_PLINK_OPN_SNT:
448                 /* retry timer */
449                 if (sta->plink_retries < dot11MeshMaxRetries(sdata)) {
450                         u32 rand;
451                         mpl_dbg(sta->sdata,
452                                 "Mesh plink for %pM (retry, timeout): %d %d\n",
453                                 sta->sta.addr, sta->plink_retries,
454                                 sta->plink_timeout);
455                         get_random_bytes(&rand, sizeof(u32));
456                         sta->plink_timeout = sta->plink_timeout +
457                                              rand % sta->plink_timeout;
458                         ++sta->plink_retries;
459                         mod_plink_timer(sta, sta->plink_timeout);
460                         spin_unlock_bh(&sta->lock);
461                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN,
462                                             sta->sta.addr, llid, 0, 0);
463                         break;
464                 }
465                 reason = cpu_to_le16(WLAN_REASON_MESH_MAX_RETRIES);
466                 /* fall through on else */
467         case NL80211_PLINK_CNF_RCVD:
468                 /* confirm timer */
469                 if (!reason)
470                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIRM_TIMEOUT);
471                 sta->plink_state = NL80211_PLINK_HOLDING;
472                 mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
473                 spin_unlock_bh(&sta->lock);
474                 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
475                                     sta->sta.addr, llid, plid, reason);
476                 break;
477         case NL80211_PLINK_HOLDING:
478                 /* holding timer */
479                 del_timer(&sta->plink_timer);
480                 mesh_plink_fsm_restart(sta);
481                 spin_unlock_bh(&sta->lock);
482                 break;
483         default:
484                 spin_unlock_bh(&sta->lock);
485                 break;
486         }
487 }
488
489 #ifdef CONFIG_PM
490 void mesh_plink_quiesce(struct sta_info *sta)
491 {
492         if (del_timer_sync(&sta->plink_timer))
493                 sta->plink_timer_was_running = true;
494 }
495
496 void mesh_plink_restart(struct sta_info *sta)
497 {
498         if (sta->plink_timer_was_running) {
499                 add_timer(&sta->plink_timer);
500                 sta->plink_timer_was_running = false;
501         }
502 }
503 #endif
504
505 static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout)
506 {
507         sta->plink_timer.expires = jiffies + (HZ * timeout / 1000);
508         sta->plink_timer.data = (unsigned long) sta;
509         sta->plink_timer.function = mesh_plink_timer;
510         sta->plink_timeout = timeout;
511         add_timer(&sta->plink_timer);
512 }
513
514 int mesh_plink_open(struct sta_info *sta)
515 {
516         __le16 llid;
517         struct ieee80211_sub_if_data *sdata = sta->sdata;
518
519         if (!test_sta_flag(sta, WLAN_STA_AUTH))
520                 return -EPERM;
521
522         spin_lock_bh(&sta->lock);
523         get_random_bytes(&llid, 2);
524         sta->llid = llid;
525         if (sta->plink_state != NL80211_PLINK_LISTEN) {
526                 spin_unlock_bh(&sta->lock);
527                 return -EBUSY;
528         }
529         sta->plink_state = NL80211_PLINK_OPN_SNT;
530         mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata));
531         spin_unlock_bh(&sta->lock);
532         mpl_dbg(sdata,
533                 "Mesh plink: starting establishment with %pM\n",
534                 sta->sta.addr);
535
536         return mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN,
537                                    sta->sta.addr, llid, 0, 0);
538 }
539
540 void mesh_plink_block(struct sta_info *sta)
541 {
542         struct ieee80211_sub_if_data *sdata = sta->sdata;
543         bool deactivated;
544
545         spin_lock_bh(&sta->lock);
546         deactivated = __mesh_plink_deactivate(sta);
547         sta->plink_state = NL80211_PLINK_BLOCKED;
548         spin_unlock_bh(&sta->lock);
549
550         if (deactivated)
551                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
552 }
553
554
555 void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_mgmt *mgmt,
556                          size_t len, struct ieee80211_rx_status *rx_status)
557 {
558         struct ieee802_11_elems elems;
559         struct sta_info *sta;
560         enum plink_event event;
561         enum ieee80211_self_protected_actioncode ftype;
562         size_t baselen;
563         bool matches_local = true;
564         u8 ie_len;
565         u8 *baseaddr;
566         u32 changed = 0;
567         __le16 plid, llid, reason;
568         static const char *mplstates[] = {
569                 [NL80211_PLINK_LISTEN] = "LISTEN",
570                 [NL80211_PLINK_OPN_SNT] = "OPN-SNT",
571                 [NL80211_PLINK_OPN_RCVD] = "OPN-RCVD",
572                 [NL80211_PLINK_CNF_RCVD] = "CNF_RCVD",
573                 [NL80211_PLINK_ESTAB] = "ESTAB",
574                 [NL80211_PLINK_HOLDING] = "HOLDING",
575                 [NL80211_PLINK_BLOCKED] = "BLOCKED"
576         };
577
578         /* need action_code, aux */
579         if (len < IEEE80211_MIN_ACTION_SIZE + 3)
580                 return;
581
582         if (is_multicast_ether_addr(mgmt->da)) {
583                 mpl_dbg(sdata,
584                         "Mesh plink: ignore frame from multicast address\n");
585                 return;
586         }
587
588         baseaddr = mgmt->u.action.u.self_prot.variable;
589         baselen = (u8 *) mgmt->u.action.u.self_prot.variable - (u8 *) mgmt;
590         if (mgmt->u.action.u.self_prot.action_code ==
591                                                 WLAN_SP_MESH_PEERING_CONFIRM) {
592                 baseaddr += 4;
593                 baselen += 4;
594         }
595         ieee802_11_parse_elems(baseaddr, len - baselen, &elems);
596         if (!elems.peering) {
597                 mpl_dbg(sdata,
598                         "Mesh plink: missing necessary peer link ie\n");
599                 return;
600         }
601         if (elems.rsn_len &&
602                         sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) {
603                 mpl_dbg(sdata,
604                         "Mesh plink: can't establish link with secure peer\n");
605                 return;
606         }
607
608         ftype = mgmt->u.action.u.self_prot.action_code;
609         ie_len = elems.peering_len;
610         if ((ftype == WLAN_SP_MESH_PEERING_OPEN && ie_len != 4) ||
611             (ftype == WLAN_SP_MESH_PEERING_CONFIRM && ie_len != 6) ||
612             (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len != 6
613                                                         && ie_len != 8)) {
614                 mpl_dbg(sdata,
615                         "Mesh plink: incorrect plink ie length %d %d\n",
616                         ftype, ie_len);
617                 return;
618         }
619
620         if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
621                                 (!elems.mesh_id || !elems.mesh_config)) {
622                 mpl_dbg(sdata, "Mesh plink: missing necessary ie\n");
623                 return;
624         }
625         /* Note the lines below are correct, the llid in the frame is the plid
626          * from the point of view of this host.
627          */
628         memcpy(&plid, PLINK_GET_LLID(elems.peering), 2);
629         if (ftype == WLAN_SP_MESH_PEERING_CONFIRM ||
630             (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8))
631                 memcpy(&llid, PLINK_GET_PLID(elems.peering), 2);
632
633         rcu_read_lock();
634
635         sta = sta_info_get(sdata, mgmt->sa);
636         if (!sta && ftype != WLAN_SP_MESH_PEERING_OPEN) {
637                 mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n");
638                 rcu_read_unlock();
639                 return;
640         }
641
642         if (ftype == WLAN_SP_MESH_PEERING_OPEN &&
643             !rssi_threshold_check(sta, sdata)) {
644                 mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n",
645                         mgmt->sa);
646                 rcu_read_unlock();
647                 return;
648         }
649
650         if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) {
651                 mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n");
652                 rcu_read_unlock();
653                 return;
654         }
655
656         if (sta && sta->plink_state == NL80211_PLINK_BLOCKED) {
657                 rcu_read_unlock();
658                 return;
659         }
660
661         /* Now we will figure out the appropriate event... */
662         event = PLINK_UNDEFINED;
663         if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
664             !mesh_matches_local(sdata, &elems)) {
665                 matches_local = false;
666                 switch (ftype) {
667                 case WLAN_SP_MESH_PEERING_OPEN:
668                         event = OPN_RJCT;
669                         break;
670                 case WLAN_SP_MESH_PEERING_CONFIRM:
671                         event = CNF_RJCT;
672                         break;
673                 default:
674                         break;
675                 }
676         }
677
678         if (!sta && !matches_local) {
679                 rcu_read_unlock();
680                 reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
681                 llid = 0;
682                 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
683                                     mgmt->sa, llid, plid, reason);
684                 return;
685         } else if (!sta) {
686                 /* ftype == WLAN_SP_MESH_PEERING_OPEN */
687                 if (!mesh_plink_free_count(sdata)) {
688                         mpl_dbg(sdata, "Mesh plink error: no more free plinks\n");
689                         rcu_read_unlock();
690                         return;
691                 }
692                 event = OPN_ACPT;
693         } else if (matches_local) {
694                 switch (ftype) {
695                 case WLAN_SP_MESH_PEERING_OPEN:
696                         if (!mesh_plink_free_count(sdata) ||
697                             (sta->plid && sta->plid != plid))
698                                 event = OPN_IGNR;
699                         else
700                                 event = OPN_ACPT;
701                         break;
702                 case WLAN_SP_MESH_PEERING_CONFIRM:
703                         if (!mesh_plink_free_count(sdata) ||
704                             (sta->llid != llid || sta->plid != plid))
705                                 event = CNF_IGNR;
706                         else
707                                 event = CNF_ACPT;
708                         break;
709                 case WLAN_SP_MESH_PEERING_CLOSE:
710                         if (sta->plink_state == NL80211_PLINK_ESTAB)
711                                 /* Do not check for llid or plid. This does not
712                                  * follow the standard but since multiple plinks
713                                  * per sta are not supported, it is necessary in
714                                  * order to avoid a livelock when MP A sees an
715                                  * establish peer link to MP B but MP B does not
716                                  * see it. This can be caused by a timeout in
717                                  * B's peer link establishment or B beign
718                                  * restarted.
719                                  */
720                                 event = CLS_ACPT;
721                         else if (sta->plid != plid)
722                                 event = CLS_IGNR;
723                         else if (ie_len == 7 && sta->llid != llid)
724                                 event = CLS_IGNR;
725                         else
726                                 event = CLS_ACPT;
727                         break;
728                 default:
729                         mpl_dbg(sdata, "Mesh plink: unknown frame subtype\n");
730                         rcu_read_unlock();
731                         return;
732                 }
733         }
734
735         if (event == OPN_ACPT) {
736                 /* allocate sta entry if necessary and update info */
737                 sta = mesh_peer_init(sdata, mgmt->sa, &elems);
738                 if (!sta) {
739                         mpl_dbg(sdata, "Mesh plink: failed to init peer!\n");
740                         rcu_read_unlock();
741                         return;
742                 }
743         }
744
745         mpl_dbg(sdata,
746                 "Mesh plink (peer, state, llid, plid, event): %pM %s %d %d %d\n",
747                 mgmt->sa, mplstates[sta->plink_state],
748                 le16_to_cpu(sta->llid), le16_to_cpu(sta->plid),
749                 event);
750         reason = 0;
751         spin_lock_bh(&sta->lock);
752         switch (sta->plink_state) {
753                 /* spin_unlock as soon as state is updated at each case */
754         case NL80211_PLINK_LISTEN:
755                 switch (event) {
756                 case CLS_ACPT:
757                         mesh_plink_fsm_restart(sta);
758                         spin_unlock_bh(&sta->lock);
759                         break;
760                 case OPN_ACPT:
761                         sta->plink_state = NL80211_PLINK_OPN_RCVD;
762                         sta->plid = plid;
763                         get_random_bytes(&llid, 2);
764                         sta->llid = llid;
765                         mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata));
766                         spin_unlock_bh(&sta->lock);
767                         mesh_plink_frame_tx(sdata,
768                                             WLAN_SP_MESH_PEERING_OPEN,
769                                             sta->sta.addr, llid, 0, 0);
770                         mesh_plink_frame_tx(sdata,
771                                             WLAN_SP_MESH_PEERING_CONFIRM,
772                                             sta->sta.addr, llid, plid, 0);
773                         break;
774                 default:
775                         spin_unlock_bh(&sta->lock);
776                         break;
777                 }
778                 break;
779
780         case NL80211_PLINK_OPN_SNT:
781                 switch (event) {
782                 case OPN_RJCT:
783                 case CNF_RJCT:
784                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
785                 case CLS_ACPT:
786                         if (!reason)
787                                 reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
788                         sta->reason = reason;
789                         sta->plink_state = NL80211_PLINK_HOLDING;
790                         if (!mod_plink_timer(sta,
791                                              dot11MeshHoldingTimeout(sdata)))
792                                 sta->ignore_plink_timer = true;
793
794                         llid = sta->llid;
795                         spin_unlock_bh(&sta->lock);
796                         mesh_plink_frame_tx(sdata,
797                                             WLAN_SP_MESH_PEERING_CLOSE,
798                                             sta->sta.addr, llid, plid, reason);
799                         break;
800                 case OPN_ACPT:
801                         /* retry timer is left untouched */
802                         sta->plink_state = NL80211_PLINK_OPN_RCVD;
803                         sta->plid = plid;
804                         llid = sta->llid;
805                         spin_unlock_bh(&sta->lock);
806                         mesh_plink_frame_tx(sdata,
807                                             WLAN_SP_MESH_PEERING_CONFIRM,
808                                             sta->sta.addr, llid, plid, 0);
809                         break;
810                 case CNF_ACPT:
811                         sta->plink_state = NL80211_PLINK_CNF_RCVD;
812                         if (!mod_plink_timer(sta,
813                                              dot11MeshConfirmTimeout(sdata)))
814                                 sta->ignore_plink_timer = true;
815
816                         spin_unlock_bh(&sta->lock);
817                         break;
818                 default:
819                         spin_unlock_bh(&sta->lock);
820                         break;
821                 }
822                 break;
823
824         case NL80211_PLINK_OPN_RCVD:
825                 switch (event) {
826                 case OPN_RJCT:
827                 case CNF_RJCT:
828                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
829                 case CLS_ACPT:
830                         if (!reason)
831                                 reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
832                         sta->reason = reason;
833                         sta->plink_state = NL80211_PLINK_HOLDING;
834                         if (!mod_plink_timer(sta,
835                                              dot11MeshHoldingTimeout(sdata)))
836                                 sta->ignore_plink_timer = true;
837
838                         llid = sta->llid;
839                         spin_unlock_bh(&sta->lock);
840                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
841                                             sta->sta.addr, llid, plid, reason);
842                         break;
843                 case OPN_ACPT:
844                         llid = sta->llid;
845                         spin_unlock_bh(&sta->lock);
846                         mesh_plink_frame_tx(sdata,
847                                             WLAN_SP_MESH_PEERING_CONFIRM,
848                                             sta->sta.addr, llid, plid, 0);
849                         break;
850                 case CNF_ACPT:
851                         del_timer(&sta->plink_timer);
852                         sta->plink_state = NL80211_PLINK_ESTAB;
853                         spin_unlock_bh(&sta->lock);
854                         mesh_plink_inc_estab_count(sdata);
855                         changed |= mesh_set_ht_prot_mode(sdata);
856                         changed |= BSS_CHANGED_BEACON;
857                         mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n",
858                                 sta->sta.addr);
859                         break;
860                 default:
861                         spin_unlock_bh(&sta->lock);
862                         break;
863                 }
864                 break;
865
866         case NL80211_PLINK_CNF_RCVD:
867                 switch (event) {
868                 case OPN_RJCT:
869                 case CNF_RJCT:
870                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
871                 case CLS_ACPT:
872                         if (!reason)
873                                 reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
874                         sta->reason = reason;
875                         sta->plink_state = NL80211_PLINK_HOLDING;
876                         if (!mod_plink_timer(sta,
877                                              dot11MeshHoldingTimeout(sdata)))
878                                 sta->ignore_plink_timer = true;
879
880                         llid = sta->llid;
881                         spin_unlock_bh(&sta->lock);
882                         mesh_plink_frame_tx(sdata,
883                                             WLAN_SP_MESH_PEERING_CLOSE,
884                                             sta->sta.addr, llid, plid, reason);
885                         break;
886                 case OPN_ACPT:
887                         del_timer(&sta->plink_timer);
888                         sta->plink_state = NL80211_PLINK_ESTAB;
889                         spin_unlock_bh(&sta->lock);
890                         mesh_plink_inc_estab_count(sdata);
891                         changed |= mesh_set_ht_prot_mode(sdata);
892                         changed |= BSS_CHANGED_BEACON;
893                         mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n",
894                                 sta->sta.addr);
895                         mesh_plink_frame_tx(sdata,
896                                             WLAN_SP_MESH_PEERING_CONFIRM,
897                                             sta->sta.addr, llid, plid, 0);
898                         break;
899                 default:
900                         spin_unlock_bh(&sta->lock);
901                         break;
902                 }
903                 break;
904
905         case NL80211_PLINK_ESTAB:
906                 switch (event) {
907                 case CLS_ACPT:
908                         reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
909                         sta->reason = reason;
910                         __mesh_plink_deactivate(sta);
911                         sta->plink_state = NL80211_PLINK_HOLDING;
912                         llid = sta->llid;
913                         mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
914                         spin_unlock_bh(&sta->lock);
915                         changed |= mesh_set_ht_prot_mode(sdata);
916                         changed |= BSS_CHANGED_BEACON;
917                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
918                                             sta->sta.addr, llid, plid, reason);
919                         break;
920                 case OPN_ACPT:
921                         llid = sta->llid;
922                         spin_unlock_bh(&sta->lock);
923                         mesh_plink_frame_tx(sdata,
924                                             WLAN_SP_MESH_PEERING_CONFIRM,
925                                             sta->sta.addr, llid, plid, 0);
926                         break;
927                 default:
928                         spin_unlock_bh(&sta->lock);
929                         break;
930                 }
931                 break;
932         case NL80211_PLINK_HOLDING:
933                 switch (event) {
934                 case CLS_ACPT:
935                         if (del_timer(&sta->plink_timer))
936                                 sta->ignore_plink_timer = 1;
937                         mesh_plink_fsm_restart(sta);
938                         spin_unlock_bh(&sta->lock);
939                         break;
940                 case OPN_ACPT:
941                 case CNF_ACPT:
942                 case OPN_RJCT:
943                 case CNF_RJCT:
944                         llid = sta->llid;
945                         reason = sta->reason;
946                         spin_unlock_bh(&sta->lock);
947                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
948                                             sta->sta.addr, llid, plid, reason);
949                         break;
950                 default:
951                         spin_unlock_bh(&sta->lock);
952                 }
953                 break;
954         default:
955                 /* should not get here, PLINK_BLOCKED is dealt with at the
956                  * beginning of the function
957                  */
958                 spin_unlock_bh(&sta->lock);
959                 break;
960         }
961
962         rcu_read_unlock();
963
964         if (changed)
965                 ieee80211_bss_info_change_notify(sdata, changed);
966 }