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