]> Pileus Git - ~andy/linux/blob - net/mac80211/mesh_plink.c
Input: synaptics - add manual min/max quirk
[~andy/linux] / 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_set_sta_local_pm(sta,
226                         NL80211_MESH_POWER_UNKNOWN);
227
228         return changed;
229 }
230
231 /**
232  * mesh_plink_deactivate - deactivate mesh peer link
233  *
234  * @sta: mesh peer link to deactivate
235  *
236  * All mesh paths with this peer as next hop will be flushed
237  */
238 u32 mesh_plink_deactivate(struct sta_info *sta)
239 {
240         struct ieee80211_sub_if_data *sdata = sta->sdata;
241         u32 changed;
242
243         spin_lock_bh(&sta->lock);
244         changed = __mesh_plink_deactivate(sta);
245         sta->reason = cpu_to_le16(WLAN_REASON_MESH_PEER_CANCELED);
246         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
247                             sta->sta.addr, sta->llid, sta->plid,
248                             sta->reason);
249         spin_unlock_bh(&sta->lock);
250
251         return changed;
252 }
253
254 static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
255                                enum ieee80211_self_protected_actioncode action,
256                                u8 *da, __le16 llid, __le16 plid, __le16 reason)
257 {
258         struct ieee80211_local *local = sdata->local;
259         struct sk_buff *skb;
260         struct ieee80211_tx_info *info;
261         struct ieee80211_mgmt *mgmt;
262         bool include_plid = false;
263         u16 peering_proto = 0;
264         u8 *pos, ie_len = 4;
265         int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) +
266                       sizeof(mgmt->u.action.u.self_prot);
267         int err = -ENOMEM;
268
269         skb = dev_alloc_skb(local->tx_headroom +
270                             hdr_len +
271                             2 + /* capability info */
272                             2 + /* AID */
273                             2 + 8 + /* supported rates */
274                             2 + (IEEE80211_MAX_SUPP_RATES - 8) +
275                             2 + sdata->u.mesh.mesh_id_len +
276                             2 + sizeof(struct ieee80211_meshconf_ie) +
277                             2 + sizeof(struct ieee80211_ht_cap) +
278                             2 + sizeof(struct ieee80211_ht_operation) +
279                             2 + 8 + /* peering IE */
280                             sdata->u.mesh.ie_len);
281         if (!skb)
282                 return -1;
283         info = IEEE80211_SKB_CB(skb);
284         skb_reserve(skb, local->tx_headroom);
285         mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
286         memset(mgmt, 0, hdr_len);
287         mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
288                                           IEEE80211_STYPE_ACTION);
289         memcpy(mgmt->da, da, ETH_ALEN);
290         memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
291         memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
292         mgmt->u.action.category = WLAN_CATEGORY_SELF_PROTECTED;
293         mgmt->u.action.u.self_prot.action_code = action;
294
295         if (action != WLAN_SP_MESH_PEERING_CLOSE) {
296                 enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
297
298                 /* capability info */
299                 pos = skb_put(skb, 2);
300                 memset(pos, 0, 2);
301                 if (action == WLAN_SP_MESH_PEERING_CONFIRM) {
302                         /* AID */
303                         pos = skb_put(skb, 2);
304                         memcpy(pos + 2, &plid, 2);
305                 }
306                 if (ieee80211_add_srates_ie(sdata, skb, true, band) ||
307                     ieee80211_add_ext_srates_ie(sdata, skb, true, band) ||
308                     mesh_add_rsn_ie(sdata, skb) ||
309                     mesh_add_meshid_ie(sdata, skb) ||
310                     mesh_add_meshconf_ie(sdata, skb))
311                         goto free;
312         } else {        /* WLAN_SP_MESH_PEERING_CLOSE */
313                 info->flags |= IEEE80211_TX_CTL_NO_ACK;
314                 if (mesh_add_meshid_ie(sdata, skb))
315                         goto free;
316         }
317
318         /* Add Mesh Peering Management element */
319         switch (action) {
320         case WLAN_SP_MESH_PEERING_OPEN:
321                 break;
322         case WLAN_SP_MESH_PEERING_CONFIRM:
323                 ie_len += 2;
324                 include_plid = true;
325                 break;
326         case WLAN_SP_MESH_PEERING_CLOSE:
327                 if (plid) {
328                         ie_len += 2;
329                         include_plid = true;
330                 }
331                 ie_len += 2;    /* reason code */
332                 break;
333         default:
334                 err = -EINVAL;
335                 goto free;
336         }
337
338         if (WARN_ON(skb_tailroom(skb) < 2 + ie_len))
339                 goto free;
340
341         pos = skb_put(skb, 2 + ie_len);
342         *pos++ = WLAN_EID_PEER_MGMT;
343         *pos++ = ie_len;
344         memcpy(pos, &peering_proto, 2);
345         pos += 2;
346         memcpy(pos, &llid, 2);
347         pos += 2;
348         if (include_plid) {
349                 memcpy(pos, &plid, 2);
350                 pos += 2;
351         }
352         if (action == WLAN_SP_MESH_PEERING_CLOSE) {
353                 memcpy(pos, &reason, 2);
354                 pos += 2;
355         }
356
357         if (action != WLAN_SP_MESH_PEERING_CLOSE) {
358                 if (mesh_add_ht_cap_ie(sdata, skb) ||
359                     mesh_add_ht_oper_ie(sdata, skb))
360                         goto free;
361         }
362
363         if (mesh_add_vendor_ies(sdata, skb))
364                 goto free;
365
366         ieee80211_tx_skb(sdata, skb);
367         return 0;
368 free:
369         kfree_skb(skb);
370         return err;
371 }
372
373 static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
374                                struct sta_info *sta,
375                                struct ieee802_11_elems *elems, bool insert)
376 {
377         struct ieee80211_local *local = sdata->local;
378         enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
379         struct ieee80211_supported_band *sband;
380         u32 rates, basic_rates = 0, changed = 0;
381
382         sband = local->hw.wiphy->bands[band];
383         rates = ieee80211_sta_get_rates(sdata, elems, band, &basic_rates);
384
385         spin_lock_bh(&sta->lock);
386         sta->last_rx = jiffies;
387
388         /* rates and capabilities don't change during peering */
389         if (sta->plink_state == NL80211_PLINK_ESTAB)
390                 goto out;
391
392         if (sta->sta.supp_rates[band] != rates)
393                 changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
394         sta->sta.supp_rates[band] = rates;
395
396         if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
397                                               elems->ht_cap_elem, sta))
398                 changed |= IEEE80211_RC_BW_CHANGED;
399
400         /* HT peer is operating 20MHz-only */
401         if (elems->ht_operation &&
402             !(elems->ht_operation->ht_param &
403               IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) {
404                 if (sta->sta.bandwidth != IEEE80211_STA_RX_BW_20)
405                         changed |= IEEE80211_RC_BW_CHANGED;
406                 sta->sta.bandwidth = IEEE80211_STA_RX_BW_20;
407         }
408
409         if (insert)
410                 rate_control_rate_init(sta);
411         else
412                 rate_control_rate_update(local, sband, sta, changed);
413 out:
414         spin_unlock_bh(&sta->lock);
415 }
416
417 static struct sta_info *
418 __mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr)
419 {
420         struct sta_info *sta;
421
422         if (sdata->local->num_sta >= MESH_MAX_PLINKS)
423                 return NULL;
424
425         sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL);
426         if (!sta)
427                 return NULL;
428
429         sta->plink_state = NL80211_PLINK_LISTEN;
430
431         sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
432         sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
433         sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
434
435         set_sta_flag(sta, WLAN_STA_WME);
436
437         return sta;
438 }
439
440 static struct sta_info *
441 mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *addr,
442                     struct ieee802_11_elems *elems)
443 {
444         struct sta_info *sta = NULL;
445
446         /* Userspace handles station allocation */
447         if (sdata->u.mesh.user_mpm ||
448             sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED)
449                 cfg80211_notify_new_peer_candidate(sdata->dev, addr,
450                                                    elems->ie_start,
451                                                    elems->total_len,
452                                                    GFP_KERNEL);
453         else
454                 sta = __mesh_sta_info_alloc(sdata, addr);
455
456         return sta;
457 }
458
459 /*
460  * mesh_sta_info_get - return mesh sta info entry for @addr.
461  *
462  * @sdata: local meshif
463  * @addr: peer's address
464  * @elems: IEs from beacon or mesh peering frame.
465  *
466  * Return existing or newly allocated sta_info under RCU read lock.
467  * (re)initialize with given IEs.
468  */
469 static struct sta_info *
470 mesh_sta_info_get(struct ieee80211_sub_if_data *sdata,
471                   u8 *addr, struct ieee802_11_elems *elems) __acquires(RCU)
472 {
473         struct sta_info *sta = NULL;
474
475         rcu_read_lock();
476         sta = sta_info_get(sdata, addr);
477         if (sta) {
478                 mesh_sta_info_init(sdata, sta, elems, false);
479         } else {
480                 rcu_read_unlock();
481                 /* can't run atomic */
482                 sta = mesh_sta_info_alloc(sdata, addr, elems);
483                 if (!sta) {
484                         rcu_read_lock();
485                         return NULL;
486                 }
487
488                 mesh_sta_info_init(sdata, sta, elems, true);
489
490                 if (sta_info_insert_rcu(sta))
491                         return NULL;
492         }
493
494         return sta;
495 }
496
497 /*
498  * mesh_neighbour_update - update or initialize new mesh neighbor.
499  *
500  * @sdata: local meshif
501  * @addr: peer's address
502  * @elems: IEs from beacon or mesh peering frame
503  *
504  * Initiates peering if appropriate.
505  */
506 void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,
507                            u8 *hw_addr,
508                            struct ieee802_11_elems *elems)
509 {
510         struct sta_info *sta;
511         u32 changed = 0;
512
513         sta = mesh_sta_info_get(sdata, hw_addr, elems);
514         if (!sta)
515                 goto out;
516
517         if (mesh_peer_accepts_plinks(elems) &&
518             sta->plink_state == NL80211_PLINK_LISTEN &&
519             sdata->u.mesh.accepting_plinks &&
520             sdata->u.mesh.mshcfg.auto_open_plinks &&
521             rssi_threshold_check(sta, sdata))
522                 changed = mesh_plink_open(sta);
523
524         ieee80211_mps_frame_release(sta, elems);
525 out:
526         rcu_read_unlock();
527         ieee80211_mbss_info_change_notify(sdata, changed);
528 }
529
530 static void mesh_plink_timer(unsigned long data)
531 {
532         struct sta_info *sta;
533         __le16 llid, plid, reason;
534         struct ieee80211_sub_if_data *sdata;
535         struct mesh_config *mshcfg;
536
537         /*
538          * This STA is valid because sta_info_destroy() will
539          * del_timer_sync() this timer after having made sure
540          * it cannot be readded (by deleting the plink.)
541          */
542         sta = (struct sta_info *) data;
543
544         if (sta->sdata->local->quiescing)
545                 return;
546
547         spin_lock_bh(&sta->lock);
548         if (sta->ignore_plink_timer) {
549                 sta->ignore_plink_timer = false;
550                 spin_unlock_bh(&sta->lock);
551                 return;
552         }
553         mpl_dbg(sta->sdata,
554                 "Mesh plink timer for %pM fired on state %s\n",
555                 sta->sta.addr, mplstates[sta->plink_state]);
556         reason = 0;
557         llid = sta->llid;
558         plid = sta->plid;
559         sdata = sta->sdata;
560         mshcfg = &sdata->u.mesh.mshcfg;
561
562         switch (sta->plink_state) {
563         case NL80211_PLINK_OPN_RCVD:
564         case NL80211_PLINK_OPN_SNT:
565                 /* retry timer */
566                 if (sta->plink_retries < mshcfg->dot11MeshMaxRetries) {
567                         u32 rand;
568                         mpl_dbg(sta->sdata,
569                                 "Mesh plink for %pM (retry, timeout): %d %d\n",
570                                 sta->sta.addr, sta->plink_retries,
571                                 sta->plink_timeout);
572                         get_random_bytes(&rand, sizeof(u32));
573                         sta->plink_timeout = sta->plink_timeout +
574                                              rand % sta->plink_timeout;
575                         ++sta->plink_retries;
576                         mod_plink_timer(sta, sta->plink_timeout);
577                         spin_unlock_bh(&sta->lock);
578                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN,
579                                             sta->sta.addr, llid, 0, 0);
580                         break;
581                 }
582                 reason = cpu_to_le16(WLAN_REASON_MESH_MAX_RETRIES);
583                 /* fall through on else */
584         case NL80211_PLINK_CNF_RCVD:
585                 /* confirm timer */
586                 if (!reason)
587                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIRM_TIMEOUT);
588                 sta->plink_state = NL80211_PLINK_HOLDING;
589                 mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout);
590                 spin_unlock_bh(&sta->lock);
591                 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
592                                     sta->sta.addr, llid, plid, reason);
593                 break;
594         case NL80211_PLINK_HOLDING:
595                 /* holding timer */
596                 del_timer(&sta->plink_timer);
597                 mesh_plink_fsm_restart(sta);
598                 spin_unlock_bh(&sta->lock);
599                 break;
600         default:
601                 spin_unlock_bh(&sta->lock);
602                 break;
603         }
604 }
605
606 static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout)
607 {
608         sta->plink_timer.expires = jiffies + (HZ * timeout / 1000);
609         sta->plink_timer.data = (unsigned long) sta;
610         sta->plink_timer.function = mesh_plink_timer;
611         sta->plink_timeout = timeout;
612         add_timer(&sta->plink_timer);
613 }
614
615 u32 mesh_plink_open(struct sta_info *sta)
616 {
617         __le16 llid;
618         struct ieee80211_sub_if_data *sdata = sta->sdata;
619         u32 changed;
620
621         if (!test_sta_flag(sta, WLAN_STA_AUTH))
622                 return 0;
623
624         spin_lock_bh(&sta->lock);
625         get_random_bytes(&llid, 2);
626         sta->llid = llid;
627         if (sta->plink_state != NL80211_PLINK_LISTEN &&
628             sta->plink_state != NL80211_PLINK_BLOCKED) {
629                 spin_unlock_bh(&sta->lock);
630                 return 0;
631         }
632         sta->plink_state = NL80211_PLINK_OPN_SNT;
633         mesh_plink_timer_set(sta, sdata->u.mesh.mshcfg.dot11MeshRetryTimeout);
634         spin_unlock_bh(&sta->lock);
635         mpl_dbg(sdata,
636                 "Mesh plink: starting establishment with %pM\n",
637                 sta->sta.addr);
638
639         /* set the non-peer mode to active during peering */
640         changed = ieee80211_mps_local_status_update(sdata);
641
642         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN,
643                             sta->sta.addr, llid, 0, 0);
644         return changed;
645 }
646
647 u32 mesh_plink_block(struct sta_info *sta)
648 {
649         u32 changed;
650
651         spin_lock_bh(&sta->lock);
652         changed = __mesh_plink_deactivate(sta);
653         sta->plink_state = NL80211_PLINK_BLOCKED;
654         spin_unlock_bh(&sta->lock);
655
656         return changed;
657 }
658
659
660 void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata,
661                          struct ieee80211_mgmt *mgmt, size_t len,
662                          struct ieee80211_rx_status *rx_status)
663 {
664         struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
665         struct ieee802_11_elems elems;
666         struct sta_info *sta;
667         enum plink_event event;
668         enum ieee80211_self_protected_actioncode ftype;
669         size_t baselen;
670         bool matches_local = true;
671         u8 ie_len;
672         u8 *baseaddr;
673         u32 changed = 0;
674         __le16 plid, llid, reason;
675
676         /* need action_code, aux */
677         if (len < IEEE80211_MIN_ACTION_SIZE + 3)
678                 return;
679
680         if (sdata->u.mesh.user_mpm)
681                 /* userspace must register for these */
682                 return;
683
684         if (is_multicast_ether_addr(mgmt->da)) {
685                 mpl_dbg(sdata,
686                         "Mesh plink: ignore frame from multicast address\n");
687                 return;
688         }
689
690         baseaddr = mgmt->u.action.u.self_prot.variable;
691         baselen = (u8 *) mgmt->u.action.u.self_prot.variable - (u8 *) mgmt;
692         if (mgmt->u.action.u.self_prot.action_code ==
693                                                 WLAN_SP_MESH_PEERING_CONFIRM) {
694                 baseaddr += 4;
695                 baselen += 4;
696         }
697         ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems);
698
699         if (!elems.peering) {
700                 mpl_dbg(sdata,
701                         "Mesh plink: missing necessary peer link ie\n");
702                 return;
703         }
704
705         if (elems.rsn_len &&
706             sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) {
707                 mpl_dbg(sdata,
708                         "Mesh plink: can't establish link with secure peer\n");
709                 return;
710         }
711
712         ftype = mgmt->u.action.u.self_prot.action_code;
713         ie_len = elems.peering_len;
714         if ((ftype == WLAN_SP_MESH_PEERING_OPEN && ie_len != 4) ||
715             (ftype == WLAN_SP_MESH_PEERING_CONFIRM && ie_len != 6) ||
716             (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len != 6
717                                                         && ie_len != 8)) {
718                 mpl_dbg(sdata,
719                         "Mesh plink: incorrect plink ie length %d %d\n",
720                         ftype, ie_len);
721                 return;
722         }
723
724         if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
725             (!elems.mesh_id || !elems.mesh_config)) {
726                 mpl_dbg(sdata, "Mesh plink: missing necessary ie\n");
727                 return;
728         }
729         /* Note the lines below are correct, the llid in the frame is the plid
730          * from the point of view of this host.
731          */
732         memcpy(&plid, PLINK_GET_LLID(elems.peering), 2);
733         if (ftype == WLAN_SP_MESH_PEERING_CONFIRM ||
734             (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8))
735                 memcpy(&llid, PLINK_GET_PLID(elems.peering), 2);
736
737         /* WARNING: Only for sta pointer, is dropped & re-acquired */
738         rcu_read_lock();
739
740         sta = sta_info_get(sdata, mgmt->sa);
741         if (!sta && ftype != WLAN_SP_MESH_PEERING_OPEN) {
742                 mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n");
743                 rcu_read_unlock();
744                 return;
745         }
746
747         if (ftype == WLAN_SP_MESH_PEERING_OPEN &&
748             !rssi_threshold_check(sta, sdata)) {
749                 mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n",
750                         mgmt->sa);
751                 rcu_read_unlock();
752                 return;
753         }
754
755         if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) {
756                 mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n");
757                 rcu_read_unlock();
758                 return;
759         }
760
761         if (sta && sta->plink_state == NL80211_PLINK_BLOCKED) {
762                 rcu_read_unlock();
763                 return;
764         }
765
766         /* Now we will figure out the appropriate event... */
767         event = PLINK_UNDEFINED;
768         if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
769             !mesh_matches_local(sdata, &elems)) {
770                 matches_local = false;
771                 switch (ftype) {
772                 case WLAN_SP_MESH_PEERING_OPEN:
773                         event = OPN_RJCT;
774                         break;
775                 case WLAN_SP_MESH_PEERING_CONFIRM:
776                         event = CNF_RJCT;
777                         break;
778                 default:
779                         break;
780                 }
781         }
782
783         if (!sta && !matches_local) {
784                 rcu_read_unlock();
785                 reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
786                 llid = 0;
787                 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
788                                     mgmt->sa, llid, plid, reason);
789                 return;
790         } else if (!sta) {
791                 /* ftype == WLAN_SP_MESH_PEERING_OPEN */
792                 if (!mesh_plink_free_count(sdata)) {
793                         mpl_dbg(sdata, "Mesh plink error: no more free plinks\n");
794                         rcu_read_unlock();
795                         return;
796                 }
797                 event = OPN_ACPT;
798         } else if (matches_local) {
799                 switch (ftype) {
800                 case WLAN_SP_MESH_PEERING_OPEN:
801                         if (!mesh_plink_free_count(sdata) ||
802                             (sta->plid && sta->plid != plid))
803                                 event = OPN_IGNR;
804                         else
805                                 event = OPN_ACPT;
806                         break;
807                 case WLAN_SP_MESH_PEERING_CONFIRM:
808                         if (!mesh_plink_free_count(sdata) ||
809                             (sta->llid != llid || sta->plid != plid))
810                                 event = CNF_IGNR;
811                         else
812                                 event = CNF_ACPT;
813                         break;
814                 case WLAN_SP_MESH_PEERING_CLOSE:
815                         if (sta->plink_state == NL80211_PLINK_ESTAB)
816                                 /* Do not check for llid or plid. This does not
817                                  * follow the standard but since multiple plinks
818                                  * per sta are not supported, it is necessary in
819                                  * order to avoid a livelock when MP A sees an
820                                  * establish peer link to MP B but MP B does not
821                                  * see it. This can be caused by a timeout in
822                                  * B's peer link establishment or B beign
823                                  * restarted.
824                                  */
825                                 event = CLS_ACPT;
826                         else if (sta->plid != plid)
827                                 event = CLS_IGNR;
828                         else if (ie_len == 7 && sta->llid != llid)
829                                 event = CLS_IGNR;
830                         else
831                                 event = CLS_ACPT;
832                         break;
833                 default:
834                         mpl_dbg(sdata, "Mesh plink: unknown frame subtype\n");
835                         rcu_read_unlock();
836                         return;
837                 }
838         }
839
840         if (event == OPN_ACPT) {
841                 rcu_read_unlock();
842                 /* allocate sta entry if necessary and update info */
843                 sta = mesh_sta_info_get(sdata, mgmt->sa, &elems);
844                 if (!sta) {
845                         mpl_dbg(sdata, "Mesh plink: failed to init peer!\n");
846                         rcu_read_unlock();
847                         return;
848                 }
849         }
850
851         mpl_dbg(sdata, "peer %pM in state %s got event %s\n", mgmt->sa,
852                        mplstates[sta->plink_state], mplevents[event]);
853         reason = 0;
854         spin_lock_bh(&sta->lock);
855         switch (sta->plink_state) {
856                 /* spin_unlock as soon as state is updated at each case */
857         case NL80211_PLINK_LISTEN:
858                 switch (event) {
859                 case CLS_ACPT:
860                         mesh_plink_fsm_restart(sta);
861                         spin_unlock_bh(&sta->lock);
862                         break;
863                 case OPN_ACPT:
864                         sta->plink_state = NL80211_PLINK_OPN_RCVD;
865                         sta->plid = plid;
866                         get_random_bytes(&llid, 2);
867                         sta->llid = llid;
868                         mesh_plink_timer_set(sta,
869                                              mshcfg->dot11MeshRetryTimeout);
870
871                         /* set the non-peer mode to active during peering */
872                         changed |= ieee80211_mps_local_status_update(sdata);
873
874                         spin_unlock_bh(&sta->lock);
875                         mesh_plink_frame_tx(sdata,
876                                             WLAN_SP_MESH_PEERING_OPEN,
877                                             sta->sta.addr, llid, 0, 0);
878                         mesh_plink_frame_tx(sdata,
879                                             WLAN_SP_MESH_PEERING_CONFIRM,
880                                             sta->sta.addr, llid, plid, 0);
881                         break;
882                 default:
883                         spin_unlock_bh(&sta->lock);
884                         break;
885                 }
886                 break;
887
888         case NL80211_PLINK_OPN_SNT:
889                 switch (event) {
890                 case OPN_RJCT:
891                 case CNF_RJCT:
892                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
893                 case CLS_ACPT:
894                         if (!reason)
895                                 reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
896                         sta->reason = reason;
897                         sta->plink_state = NL80211_PLINK_HOLDING;
898                         if (!mod_plink_timer(sta,
899                                              mshcfg->dot11MeshHoldingTimeout))
900                                 sta->ignore_plink_timer = true;
901
902                         llid = sta->llid;
903                         spin_unlock_bh(&sta->lock);
904                         mesh_plink_frame_tx(sdata,
905                                             WLAN_SP_MESH_PEERING_CLOSE,
906                                             sta->sta.addr, llid, plid, reason);
907                         break;
908                 case OPN_ACPT:
909                         /* retry timer is left untouched */
910                         sta->plink_state = NL80211_PLINK_OPN_RCVD;
911                         sta->plid = plid;
912                         llid = sta->llid;
913                         spin_unlock_bh(&sta->lock);
914                         mesh_plink_frame_tx(sdata,
915                                             WLAN_SP_MESH_PEERING_CONFIRM,
916                                             sta->sta.addr, llid, plid, 0);
917                         break;
918                 case CNF_ACPT:
919                         sta->plink_state = NL80211_PLINK_CNF_RCVD;
920                         if (!mod_plink_timer(sta,
921                                              mshcfg->dot11MeshConfirmTimeout))
922                                 sta->ignore_plink_timer = true;
923
924                         spin_unlock_bh(&sta->lock);
925                         break;
926                 default:
927                         spin_unlock_bh(&sta->lock);
928                         break;
929                 }
930                 break;
931
932         case NL80211_PLINK_OPN_RCVD:
933                 switch (event) {
934                 case OPN_RJCT:
935                 case CNF_RJCT:
936                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
937                 case CLS_ACPT:
938                         if (!reason)
939                                 reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
940                         sta->reason = reason;
941                         sta->plink_state = NL80211_PLINK_HOLDING;
942                         if (!mod_plink_timer(sta,
943                                              mshcfg->dot11MeshHoldingTimeout))
944                                 sta->ignore_plink_timer = true;
945
946                         llid = sta->llid;
947                         spin_unlock_bh(&sta->lock);
948                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
949                                             sta->sta.addr, llid, plid, reason);
950                         break;
951                 case OPN_ACPT:
952                         llid = sta->llid;
953                         spin_unlock_bh(&sta->lock);
954                         mesh_plink_frame_tx(sdata,
955                                             WLAN_SP_MESH_PEERING_CONFIRM,
956                                             sta->sta.addr, llid, plid, 0);
957                         break;
958                 case CNF_ACPT:
959                         del_timer(&sta->plink_timer);
960                         sta->plink_state = NL80211_PLINK_ESTAB;
961                         spin_unlock_bh(&sta->lock);
962                         changed |= mesh_plink_inc_estab_count(sdata);
963                         changed |= mesh_set_ht_prot_mode(sdata);
964                         changed |= mesh_set_short_slot_time(sdata);
965                         mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n",
966                                 sta->sta.addr);
967                         ieee80211_mps_sta_status_update(sta);
968                         changed |= ieee80211_mps_set_sta_local_pm(sta,
969                                                        mshcfg->power_mode);
970                         break;
971                 default:
972                         spin_unlock_bh(&sta->lock);
973                         break;
974                 }
975                 break;
976
977         case NL80211_PLINK_CNF_RCVD:
978                 switch (event) {
979                 case OPN_RJCT:
980                 case CNF_RJCT:
981                         reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);
982                 case CLS_ACPT:
983                         if (!reason)
984                                 reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
985                         sta->reason = reason;
986                         sta->plink_state = NL80211_PLINK_HOLDING;
987                         if (!mod_plink_timer(sta,
988                                              mshcfg->dot11MeshHoldingTimeout))
989                                 sta->ignore_plink_timer = true;
990
991                         llid = sta->llid;
992                         spin_unlock_bh(&sta->lock);
993                         mesh_plink_frame_tx(sdata,
994                                             WLAN_SP_MESH_PEERING_CLOSE,
995                                             sta->sta.addr, llid, plid, reason);
996                         break;
997                 case OPN_ACPT:
998                         del_timer(&sta->plink_timer);
999                         sta->plink_state = NL80211_PLINK_ESTAB;
1000                         spin_unlock_bh(&sta->lock);
1001                         changed |= mesh_plink_inc_estab_count(sdata);
1002                         changed |= mesh_set_ht_prot_mode(sdata);
1003                         changed |= mesh_set_short_slot_time(sdata);
1004                         mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n",
1005                                 sta->sta.addr);
1006                         mesh_plink_frame_tx(sdata,
1007                                             WLAN_SP_MESH_PEERING_CONFIRM,
1008                                             sta->sta.addr, llid, plid, 0);
1009                         ieee80211_mps_sta_status_update(sta);
1010                         changed |= ieee80211_mps_set_sta_local_pm(sta,
1011                                                         mshcfg->power_mode);
1012                         break;
1013                 default:
1014                         spin_unlock_bh(&sta->lock);
1015                         break;
1016                 }
1017                 break;
1018
1019         case NL80211_PLINK_ESTAB:
1020                 switch (event) {
1021                 case CLS_ACPT:
1022                         reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);
1023                         sta->reason = reason;
1024                         changed |= __mesh_plink_deactivate(sta);
1025                         sta->plink_state = NL80211_PLINK_HOLDING;
1026                         llid = sta->llid;
1027                         mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout);
1028                         spin_unlock_bh(&sta->lock);
1029                         changed |= mesh_set_ht_prot_mode(sdata);
1030                         changed |= mesh_set_short_slot_time(sdata);
1031                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
1032                                             sta->sta.addr, llid, plid, reason);
1033                         break;
1034                 case OPN_ACPT:
1035                         llid = sta->llid;
1036                         spin_unlock_bh(&sta->lock);
1037                         mesh_plink_frame_tx(sdata,
1038                                             WLAN_SP_MESH_PEERING_CONFIRM,
1039                                             sta->sta.addr, llid, plid, 0);
1040                         break;
1041                 default:
1042                         spin_unlock_bh(&sta->lock);
1043                         break;
1044                 }
1045                 break;
1046         case NL80211_PLINK_HOLDING:
1047                 switch (event) {
1048                 case CLS_ACPT:
1049                         if (del_timer(&sta->plink_timer))
1050                                 sta->ignore_plink_timer = 1;
1051                         mesh_plink_fsm_restart(sta);
1052                         spin_unlock_bh(&sta->lock);
1053                         break;
1054                 case OPN_ACPT:
1055                 case CNF_ACPT:
1056                 case OPN_RJCT:
1057                 case CNF_RJCT:
1058                         llid = sta->llid;
1059                         reason = sta->reason;
1060                         spin_unlock_bh(&sta->lock);
1061                         mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
1062                                             sta->sta.addr, llid, plid, reason);
1063                         break;
1064                 default:
1065                         spin_unlock_bh(&sta->lock);
1066                 }
1067                 break;
1068         default:
1069                 /* should not get here, PLINK_BLOCKED is dealt with at the
1070                  * beginning of the function
1071                  */
1072                 spin_unlock_bh(&sta->lock);
1073                 break;
1074         }
1075
1076         rcu_read_unlock();
1077
1078         if (changed)
1079                 ieee80211_mbss_info_change_notify(sdata, changed);
1080 }