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