From: Thomas Pedersen <thomas@cozybit.com>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: Bob Copeland <me@bobcopeland.com>,
linux-wireless <linux-wireless@vger.kernel.org>,
open80211s <devel@lists.open80211s.org>,
Thomas Pedersen <thomas@cozybit.com>
Subject: [PATCH 14/17] mac80211: factor out peering FSM
Date: Tue, 5 Nov 2013 11:17:02 -0800 [thread overview]
Message-ID: <1383679025-7150-14-git-send-email-thomas@cozybit.com> (raw)
In-Reply-To: <1383679025-7150-1-git-send-email-thomas@cozybit.com>
Signed-off-by: Thomas Pedersen <thomas@cozybit.com>
---
net/mac80211/mesh_plink.c | 296 ++++++++++++++++++++++++----------------------
1 file changed, 154 insertions(+), 142 deletions(-)
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
index fa86d35..e5d5c69 100644
--- a/net/mac80211/mesh_plink.c
+++ b/net/mac80211/mesh_plink.c
@@ -691,14 +691,165 @@ static u32 mesh_plink_establish(struct ieee80211_sub_if_data *sdata,
return changed;
}
+/**
+ * mesh_plink_fsm - step @sta MPM based on @event
+ *
+ * @sdata: interface
+ * @sta: mesh neighbor
+ * @event: peering event
+ *
+ * Return: changed MBSS flags
+ */
+static u32 mesh_plink_fsm(struct ieee80211_sub_if_data *sdata,
+ struct sta_info *sta, enum plink_event event)
+{
+ struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
+ enum ieee80211_self_protected_actioncode action = 0;
+ u32 changed = 0;
+
+ mpl_dbg(sdata, "peer %pM in state %s got event %s\n", sta->sta.addr,
+ mplstates[sta->plink_state], mplevents[event]);
+
+ spin_lock_bh(&sta->lock);
+ switch (sta->plink_state) {
+ case NL80211_PLINK_LISTEN:
+ switch (event) {
+ case CLS_ACPT:
+ mesh_plink_fsm_restart(sta);
+ break;
+ case OPN_ACPT:
+ sta->plink_state = NL80211_PLINK_OPN_RCVD;
+ get_random_bytes(&sta->llid, 2);
+ mesh_plink_timer_set(sta,
+ mshcfg->dot11MeshRetryTimeout);
+
+ /* set the non-peer mode to active during peering */
+ changed |= ieee80211_mps_local_status_update(sdata);
+ action = WLAN_SP_MESH_PEERING_OPEN;
+ break;
+ default:
+ break;
+ }
+ break;
+ case NL80211_PLINK_OPN_SNT:
+ switch (event) {
+ case OPN_RJCT:
+ case CNF_RJCT:
+ case CLS_ACPT:
+ mesh_plink_close(sdata, sta, event);
+ action = WLAN_SP_MESH_PEERING_CLOSE;
+ break;
+ case OPN_ACPT:
+ /* retry timer is left untouched */
+ sta->plink_state = NL80211_PLINK_OPN_RCVD;
+ action = WLAN_SP_MESH_PEERING_CONFIRM;
+ break;
+ case CNF_ACPT:
+ sta->plink_state = NL80211_PLINK_CNF_RCVD;
+ if (!mod_plink_timer(sta,
+ mshcfg->dot11MeshConfirmTimeout))
+ sta->ignore_plink_timer = true;
+ break;
+ default:
+ break;
+ }
+ break;
+ case NL80211_PLINK_OPN_RCVD:
+ switch (event) {
+ case OPN_RJCT:
+ case CNF_RJCT:
+ case CLS_ACPT:
+ mesh_plink_close(sdata, sta, event);
+ action = WLAN_SP_MESH_PEERING_CLOSE;
+ break;
+ case OPN_ACPT:
+ action = WLAN_SP_MESH_PEERING_CONFIRM;
+ break;
+ case CNF_ACPT:
+ changed |= mesh_plink_establish(sdata, sta);
+ break;
+ default:
+ break;
+ }
+ break;
+ case NL80211_PLINK_CNF_RCVD:
+ switch (event) {
+ case OPN_RJCT:
+ case CNF_RJCT:
+ case CLS_ACPT:
+ mesh_plink_close(sdata, sta, event);
+ action = WLAN_SP_MESH_PEERING_CLOSE;
+ break;
+ case OPN_ACPT:
+ changed |= mesh_plink_establish(sdata, sta);
+ action = WLAN_SP_MESH_PEERING_CONFIRM;
+ break;
+ default:
+ break;
+ }
+ break;
+ case NL80211_PLINK_ESTAB:
+ switch (event) {
+ case CLS_ACPT:
+ changed |= __mesh_plink_deactivate(sta);
+ changed |= mesh_set_ht_prot_mode(sdata);
+ changed |= mesh_set_short_slot_time(sdata);
+ mesh_plink_close(sdata, sta, event);
+ action = WLAN_SP_MESH_PEERING_CLOSE;
+ break;
+ case OPN_ACPT:
+ action = WLAN_SP_MESH_PEERING_CONFIRM;
+ break;
+ default:
+ break;
+ }
+ break;
+ case NL80211_PLINK_HOLDING:
+ switch (event) {
+ case CLS_ACPT:
+ if (del_timer(&sta->plink_timer))
+ sta->ignore_plink_timer = 1;
+ mesh_plink_fsm_restart(sta);
+ break;
+ case OPN_ACPT:
+ case CNF_ACPT:
+ case OPN_RJCT:
+ case CNF_RJCT:
+ action = WLAN_SP_MESH_PEERING_CLOSE;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ /* should not get here, PLINK_BLOCKED is dealt with at the
+ * beginning of the function
+ */
+ break;
+ }
+ spin_unlock_bh(&sta->lock);
+ if (action) {
+ mesh_plink_frame_tx(sdata, action, sta->sta.addr,
+ sta->llid, sta->plid, sta->reason);
+
+ /* also send confirm in open case */
+ if (action == WLAN_SP_MESH_PEERING_OPEN) {
+ mesh_plink_frame_tx(sdata,
+ WLAN_SP_MESH_PEERING_CONFIRM,
+ sta->sta.addr, sta->llid,
+ sta->plid, 0);
+ }
+ }
+
+ return changed;
+}
+
static void
mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt,
struct ieee802_11_elems *elems)
{
- struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
- enum ieee80211_self_protected_actioncode action = 0;
struct sta_info *sta;
enum plink_event event;
enum ieee80211_self_protected_actioncode ftype;
@@ -847,146 +998,7 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
sta->plid = plid;
}
- mpl_dbg(sdata, "peer %pM in state %s got event %s\n", mgmt->sa,
- mplstates[sta->plink_state], mplevents[event]);
- spin_lock_bh(&sta->lock);
- switch (sta->plink_state) {
- case NL80211_PLINK_LISTEN:
- switch (event) {
- case CLS_ACPT:
- mesh_plink_fsm_restart(sta);
- break;
- case OPN_ACPT:
- sta->plink_state = NL80211_PLINK_OPN_RCVD;
- get_random_bytes(&llid, 2);
- sta->llid = llid;
- mesh_plink_timer_set(sta,
- mshcfg->dot11MeshRetryTimeout);
-
- /* set the non-peer mode to active during peering */
- changed |= ieee80211_mps_local_status_update(sdata);
-
- action = WLAN_SP_MESH_PEERING_OPEN;
- break;
- default:
- break;
- }
- break;
-
- case NL80211_PLINK_OPN_SNT:
- switch (event) {
- case OPN_RJCT:
- case CNF_RJCT:
- case CLS_ACPT:
- mesh_plink_close(sdata, sta, event);
- action = WLAN_SP_MESH_PEERING_CLOSE;
- break;
-
- case OPN_ACPT:
- /* retry timer is left untouched */
- sta->plink_state = NL80211_PLINK_OPN_RCVD;
- action = WLAN_SP_MESH_PEERING_CONFIRM;
- break;
- case CNF_ACPT:
- sta->plink_state = NL80211_PLINK_CNF_RCVD;
- if (!mod_plink_timer(sta,
- mshcfg->dot11MeshConfirmTimeout))
- sta->ignore_plink_timer = true;
-
- break;
- default:
- break;
- }
- break;
-
- case NL80211_PLINK_OPN_RCVD:
- switch (event) {
- case OPN_RJCT:
- case CNF_RJCT:
- case CLS_ACPT:
- mesh_plink_close(sdata, sta, event);
- action = WLAN_SP_MESH_PEERING_CLOSE;
- break;
- case OPN_ACPT:
- action = WLAN_SP_MESH_PEERING_CONFIRM;
- break;
- case CNF_ACPT:
- changed |= mesh_plink_establish(sdata, sta);
- break;
- default:
- break;
- }
- break;
-
- case NL80211_PLINK_CNF_RCVD:
- switch (event) {
- case OPN_RJCT:
- case CNF_RJCT:
- case CLS_ACPT:
- mesh_plink_close(sdata, sta, event);
- action = WLAN_SP_MESH_PEERING_CLOSE;
- break;
- case OPN_ACPT:
- changed |= mesh_plink_establish(sdata, sta);
- action = WLAN_SP_MESH_PEERING_CONFIRM;
- break;
- default:
- break;
- }
- break;
-
- case NL80211_PLINK_ESTAB:
- switch (event) {
- case CLS_ACPT:
- changed |= __mesh_plink_deactivate(sta);
- changed |= mesh_set_ht_prot_mode(sdata);
- changed |= mesh_set_short_slot_time(sdata);
- mesh_plink_close(sdata, sta, event);
- action = WLAN_SP_MESH_PEERING_CLOSE;
- break;
- case OPN_ACPT:
- action = WLAN_SP_MESH_PEERING_CONFIRM;
- break;
- default:
- break;
- }
- break;
- case NL80211_PLINK_HOLDING:
- switch (event) {
- case CLS_ACPT:
- if (del_timer(&sta->plink_timer))
- sta->ignore_plink_timer = 1;
- mesh_plink_fsm_restart(sta);
- break;
- case OPN_ACPT:
- case CNF_ACPT:
- case OPN_RJCT:
- case CNF_RJCT:
- action = WLAN_SP_MESH_PEERING_CLOSE;
- break;
- default:
- break;
- }
- break;
- default:
- /* should not get here, PLINK_BLOCKED is dealt with at the
- * beginning of the function
- */
- break;
- }
- spin_unlock_bh(&sta->lock);
- if (action) {
- mesh_plink_frame_tx(sdata, action, sta->sta.addr,
- sta->llid, sta->plid, sta->reason);
-
- /* also send confirm in open case */
- if (action == WLAN_SP_MESH_PEERING_OPEN) {
- mesh_plink_frame_tx(sdata,
- WLAN_SP_MESH_PEERING_CONFIRM,
- sta->sta.addr, sta->llid,
- sta->plid, 0);
- }
- }
+ changed |= mesh_plink_fsm(sdata, sta, event);
unlock_rcu:
rcu_read_unlock();
--
1.8.4.rc3
next prev parent reply other threads:[~2013-11-05 19:23 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-05 19:16 [PATCH 01/17] mac80211: fix off-by-one in llid check Thomas Pedersen
2013-11-05 19:16 ` [PATCH 02/17] mac80211: consolidate calls to plink_frame_tx Thomas Pedersen
2013-11-05 19:16 ` [PATCH 03/17] mac80211: hold sta->lock across plink switch statements Thomas Pedersen
2013-11-05 19:16 ` [PATCH 04/17] mac80211: mesh: factor out common plink close/estab code Thomas Pedersen
2013-11-05 19:16 ` [PATCH 05/17] mac80211: mesh_plink: group basic fitness checks Thomas Pedersen
2013-11-05 19:16 ` [PATCH 06/17] mac80211: mesh: rewrite rssi_threshold_check in C Thomas Pedersen
2013-11-05 19:16 ` [PATCH 07/17] mac80211: mesh_plink: collapse the two switch statements together Thomas Pedersen
2013-11-05 19:16 ` [PATCH 08/17] mac80211: mesh_plink: don't ignore holding timer Thomas Pedersen
2013-11-05 19:16 ` [PATCH 09/17] mac80211: return -ENOMEM in mesh_plink_frame_tx Thomas Pedersen
2013-11-05 19:16 ` [PATCH 10/17] mac80211: remove unused mesh_mgmt_ies_add() prototype Thomas Pedersen
2013-11-05 19:16 ` [PATCH 11/17] mac80211: factor peering frame processing into own function Thomas Pedersen
2013-11-05 19:17 ` [PATCH 12/17] mac80211: consolidate rcu unlocks in plink frame rx Thomas Pedersen
2013-11-05 19:17 ` [PATCH 13/17] mac80211: assign sta plid early Thomas Pedersen
2013-11-05 19:17 ` Thomas Pedersen [this message]
2013-11-05 19:17 ` [PATCH 15/17] mac80211: factor out plink event gathering Thomas Pedersen
2013-11-05 19:17 ` [PATCH 16/17] mac80211: initialize llid Thomas Pedersen
2013-11-05 19:17 ` [PATCH 17/17] mac80211: clean up mesh local link ID generation Thomas Pedersen
2013-11-06 10:35 ` [PATCH 01/17] mac80211: fix off-by-one in llid check Johannes Berg
2013-11-06 15:14 ` Thomas Pedersen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1383679025-7150-14-git-send-email-thomas@cozybit.com \
--to=thomas@cozybit.com \
--cc=devel@lists.open80211s.org \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=me@bobcopeland.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox