mesh_plink.c revision fc10302ef1d22ec559b94a22c3b6b1fc7180240e
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
694static void
695mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
696			 struct ieee80211_mgmt *mgmt,
697			 struct ieee802_11_elems *elems)
698{
699
700	struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
701	enum ieee80211_self_protected_actioncode action = 0;
702	struct sta_info *sta;
703	enum plink_event event;
704	enum ieee80211_self_protected_actioncode ftype;
705	bool matches_local;
706	u32 changed = 0;
707	u8 ie_len;
708	__le16 plid, llid;
709
710	if (!elems->peering) {
711		mpl_dbg(sdata,
712			"Mesh plink: missing necessary peer link ie\n");
713		return;
714	}
715
716	if (elems->rsn_len &&
717	    sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) {
718		mpl_dbg(sdata,
719			"Mesh plink: can't establish link with secure peer\n");
720		return;
721	}
722
723	ftype = mgmt->u.action.u.self_prot.action_code;
724	ie_len = elems->peering_len;
725	if ((ftype == WLAN_SP_MESH_PEERING_OPEN && ie_len != 4) ||
726	    (ftype == WLAN_SP_MESH_PEERING_CONFIRM && ie_len != 6) ||
727	    (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len != 6
728							&& ie_len != 8)) {
729		mpl_dbg(sdata,
730			"Mesh plink: incorrect plink ie length %d %d\n",
731			ftype, ie_len);
732		return;
733	}
734
735	if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
736	    (!elems->mesh_id || !elems->mesh_config)) {
737		mpl_dbg(sdata, "Mesh plink: missing necessary ie\n");
738		return;
739	}
740	/* Note the lines below are correct, the llid in the frame is the plid
741	 * from the point of view of this host.
742	 */
743	memcpy(&plid, PLINK_GET_LLID(elems->peering), 2);
744	if (ftype == WLAN_SP_MESH_PEERING_CONFIRM ||
745	    (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8))
746		memcpy(&llid, PLINK_GET_PLID(elems->peering), 2);
747
748	/* WARNING: Only for sta pointer, is dropped & re-acquired */
749	rcu_read_lock();
750
751	sta = sta_info_get(sdata, mgmt->sa);
752
753	matches_local = (ftype == WLAN_SP_MESH_PEERING_CLOSE ||
754			 mesh_matches_local(sdata, elems));
755
756	if (ftype == WLAN_SP_MESH_PEERING_OPEN &&
757	    !rssi_threshold_check(sdata, sta)) {
758		mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n",
759			mgmt->sa);
760		goto unlock_rcu;
761	}
762
763	if (!sta) {
764		if (ftype != WLAN_SP_MESH_PEERING_OPEN) {
765			mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n");
766			goto unlock_rcu;
767		}
768		/* ftype == WLAN_SP_MESH_PEERING_OPEN */
769		if (!mesh_plink_free_count(sdata)) {
770			mpl_dbg(sdata, "Mesh plink error: no more free plinks\n");
771			goto unlock_rcu;
772		}
773		/* deny open request from non-matching peer */
774		if (!matches_local) {
775			mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
776					    mgmt->sa, 0, plid,
777					    cpu_to_le16(WLAN_REASON_MESH_CONFIG));
778			goto unlock_rcu;
779		}
780	} else {
781		if (!test_sta_flag(sta, WLAN_STA_AUTH)) {
782			mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n");
783			goto unlock_rcu;
784		}
785		if (sta->plink_state == NL80211_PLINK_BLOCKED)
786			goto unlock_rcu;
787	}
788
789	/* Now we will figure out the appropriate event... */
790	event = PLINK_UNDEFINED;
791
792	if (!sta)
793		event = OPN_ACPT;
794	else {
795		switch (ftype) {
796		case WLAN_SP_MESH_PEERING_OPEN:
797			if (!matches_local)
798				event = OPN_RJCT;
799			else if (!mesh_plink_free_count(sdata) ||
800				 (sta->plid && sta->plid != plid))
801				event = OPN_IGNR;
802			else
803				event = OPN_ACPT;
804			break;
805		case WLAN_SP_MESH_PEERING_CONFIRM:
806			if (!matches_local)
807				event = CNF_RJCT;
808			else 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 == 8 && 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			goto unlock_rcu;
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			goto unlock_rcu;
846		}
847	}
848
849	mpl_dbg(sdata, "peer %pM in state %s got event %s\n", mgmt->sa,
850		       mplstates[sta->plink_state], mplevents[event]);
851	spin_lock_bh(&sta->lock);
852	switch (sta->plink_state) {
853	case NL80211_PLINK_LISTEN:
854		switch (event) {
855		case CLS_ACPT:
856			mesh_plink_fsm_restart(sta);
857			break;
858		case OPN_ACPT:
859			sta->plink_state = NL80211_PLINK_OPN_RCVD;
860			sta->plid = plid;
861			get_random_bytes(&llid, 2);
862			sta->llid = llid;
863			mesh_plink_timer_set(sta,
864					     mshcfg->dot11MeshRetryTimeout);
865
866			/* set the non-peer mode to active during peering */
867			changed |= ieee80211_mps_local_status_update(sdata);
868
869			action = WLAN_SP_MESH_PEERING_OPEN;
870			break;
871		default:
872			break;
873		}
874		break;
875
876	case NL80211_PLINK_OPN_SNT:
877		switch (event) {
878		case OPN_RJCT:
879		case CNF_RJCT:
880		case CLS_ACPT:
881			mesh_plink_close(sdata, sta, event);
882			action = WLAN_SP_MESH_PEERING_CLOSE;
883			break;
884
885		case OPN_ACPT:
886			/* retry timer is left untouched */
887			sta->plink_state = NL80211_PLINK_OPN_RCVD;
888			sta->plid = plid;
889			action = WLAN_SP_MESH_PEERING_CONFIRM;
890			break;
891		case CNF_ACPT:
892			sta->plink_state = NL80211_PLINK_CNF_RCVD;
893			if (!mod_plink_timer(sta,
894					     mshcfg->dot11MeshConfirmTimeout))
895				sta->ignore_plink_timer = true;
896
897			break;
898		default:
899			break;
900		}
901		break;
902
903	case NL80211_PLINK_OPN_RCVD:
904		switch (event) {
905		case OPN_RJCT:
906		case CNF_RJCT:
907		case CLS_ACPT:
908			mesh_plink_close(sdata, sta, event);
909			action = WLAN_SP_MESH_PEERING_CLOSE;
910			break;
911		case OPN_ACPT:
912			action = WLAN_SP_MESH_PEERING_CONFIRM;
913			break;
914		case CNF_ACPT:
915			changed |= mesh_plink_establish(sdata, sta);
916			break;
917		default:
918			break;
919		}
920		break;
921
922	case NL80211_PLINK_CNF_RCVD:
923		switch (event) {
924		case OPN_RJCT:
925		case CNF_RJCT:
926		case CLS_ACPT:
927			mesh_plink_close(sdata, sta, event);
928			action = WLAN_SP_MESH_PEERING_CLOSE;
929			break;
930		case OPN_ACPT:
931			changed |= mesh_plink_establish(sdata, sta);
932			action = WLAN_SP_MESH_PEERING_CONFIRM;
933			break;
934		default:
935			break;
936		}
937		break;
938
939	case NL80211_PLINK_ESTAB:
940		switch (event) {
941		case CLS_ACPT:
942			changed |= __mesh_plink_deactivate(sta);
943			changed |= mesh_set_ht_prot_mode(sdata);
944			changed |= mesh_set_short_slot_time(sdata);
945			mesh_plink_close(sdata, sta, event);
946			action = WLAN_SP_MESH_PEERING_CLOSE;
947			break;
948		case OPN_ACPT:
949			action = WLAN_SP_MESH_PEERING_CONFIRM;
950			break;
951		default:
952			break;
953		}
954		break;
955	case NL80211_PLINK_HOLDING:
956		switch (event) {
957		case CLS_ACPT:
958			if (del_timer(&sta->plink_timer))
959				sta->ignore_plink_timer = 1;
960			mesh_plink_fsm_restart(sta);
961			break;
962		case OPN_ACPT:
963		case CNF_ACPT:
964		case OPN_RJCT:
965		case CNF_RJCT:
966			action = WLAN_SP_MESH_PEERING_CLOSE;
967			break;
968		default:
969			break;
970		}
971		break;
972	default:
973		/* should not get here, PLINK_BLOCKED is dealt with at the
974		 * beginning of the function
975		 */
976		break;
977	}
978	spin_unlock_bh(&sta->lock);
979	if (action) {
980		mesh_plink_frame_tx(sdata, action, sta->sta.addr,
981				    sta->llid, sta->plid, sta->reason);
982
983		/* also send confirm in open case */
984		if (action == WLAN_SP_MESH_PEERING_OPEN) {
985			mesh_plink_frame_tx(sdata,
986					    WLAN_SP_MESH_PEERING_CONFIRM,
987					    sta->sta.addr, sta->llid,
988					    sta->plid, 0);
989		}
990	}
991
992unlock_rcu:
993	rcu_read_unlock();
994
995	if (changed)
996		ieee80211_mbss_info_change_notify(sdata, changed);
997}
998
999void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata,
1000			 struct ieee80211_mgmt *mgmt, size_t len,
1001			 struct ieee80211_rx_status *rx_status)
1002{
1003	struct ieee802_11_elems elems;
1004	size_t baselen;
1005	u8 *baseaddr;
1006
1007	/* need action_code, aux */
1008	if (len < IEEE80211_MIN_ACTION_SIZE + 3)
1009		return;
1010
1011	if (sdata->u.mesh.user_mpm)
1012		/* userspace must register for these */
1013		return;
1014
1015	if (is_multicast_ether_addr(mgmt->da)) {
1016		mpl_dbg(sdata,
1017			"Mesh plink: ignore frame from multicast address\n");
1018		return;
1019	}
1020
1021	baseaddr = mgmt->u.action.u.self_prot.variable;
1022	baselen = (u8 *) mgmt->u.action.u.self_prot.variable - (u8 *) mgmt;
1023	if (mgmt->u.action.u.self_prot.action_code ==
1024						WLAN_SP_MESH_PEERING_CONFIRM) {
1025		baseaddr += 4;
1026		baselen += 4;
1027	}
1028	ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems);
1029	mesh_process_plink_frame(sdata, mgmt, &elems);
1030}
1031