nl80211: Move peer link state definition to nl80211
authorJavier Cardona <javier@cozybit.com>
Fri, 13 May 2011 17:45:43 +0000 (10:45 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 16 May 2011 18:10:49 +0000 (14:10 -0400)
These definitions need to be exposed now that we can set the peer link
states via NL80211_ATTR_STA_PLINK_STATE.  They were already being
(opaquely) reported by NL80211_STA_INFO_PLINK_STATE.

Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/nl80211.h
include/net/cfg80211.h
net/mac80211/cfg.c
net/mac80211/mesh_plink.c
net/mac80211/rx.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/wireless/nl80211.c

index 0ea497cb607c9c92869ee5b279aecb67dd187318..fc3a94821b1ed74b2940078961242df6d4be700a 100644 (file)
@@ -973,9 +973,10 @@ enum nl80211_commands {
  * @NL80211_ATTR_SUPPORT_MESH_AUTH: Currently, this means the underlying driver
  *     allows auth frames in a mesh to be passed to userspace for processing via
  *     the @NL80211_MESH_SETUP_USERSPACE_AUTH flag.
- * @NL80211_ATTR_STA_PLINK_STATE: The state of a mesh peer link. Used when
- *      userspace is driving the peer link management state machine.
- *      @NL80211_MESH_SETUP_USERSPACE_AMPE must be enabled.
+ * @NL80211_ATTR_STA_PLINK_STATE: The state of a mesh peer link as
+ *     defined in &enum nl80211_plink_state. Used when userspace is
+ *     driving the peer link management state machine.
+ *     @NL80211_MESH_SETUP_USERSPACE_AMPE must be enabled.
  *
  * @NL80211_ATTR_WOWLAN_SUPPORTED: indicates, as part of the wiphy capabilities,
  *     the supported WoWLAN triggers
@@ -1396,6 +1397,7 @@ enum nl80211_sta_bss_param {
  * @NL80211_STA_INFO_LLID: the station's mesh LLID
  * @NL80211_STA_INFO_PLID: the station's mesh PLID
  * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station
+ *     (see %enum nl80211_plink_state)
  * @NL80211_STA_INFO_RX_BITRATE: last unicast data frame rx rate, nested
  *     attribute, like NL80211_STA_INFO_TX_BITRATE.
  * @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute
@@ -2326,4 +2328,37 @@ enum nl80211_if_combination_attrs {
        MAX_NL80211_IFACE_COMB = NUM_NL80211_IFACE_COMB - 1
 };
 
+
+/**
+ * enum nl80211_plink_state - state of a mesh peer link finite state machine
+ *
+ * @NL80211_PLINK_LISTEN: initial state, considered the implicit
+ *     state of non existant mesh peer links
+ * @NL80211_PLINK_OPN_SNT: mesh plink open frame has been sent to
+ *     this mesh peer
+ * @NL80211_PLINK_OPN_RCVD: mesh plink open frame has been received
+ *     from this mesh peer
+ * @NL80211_PLINK_CNF_RCVD: mesh plink confirm frame has been
+ *     received from this mesh peer
+ * @NL80211_PLINK_ESTAB: mesh peer link is established
+ * @NL80211_PLINK_HOLDING: mesh peer link is being closed or cancelled
+ * @NL80211_PLINK_BLOCKED: all frames transmitted from this mesh
+ *     plink are discarded
+ * @NUM_NL80211_PLINK_STATES: number of peer link states
+ * @MAX_NL80211_PLINK_STATES: highest numerical value of plink states
+ */
+enum nl80211_plink_state {
+       NL80211_PLINK_LISTEN,
+       NL80211_PLINK_OPN_SNT,
+       NL80211_PLINK_OPN_RCVD,
+       NL80211_PLINK_CNF_RCVD,
+       NL80211_PLINK_ESTAB,
+       NL80211_PLINK_HOLDING,
+       NL80211_PLINK_BLOCKED,
+
+       /* keep last */
+       NUM_NL80211_PLINK_STATES,
+       MAX_NL80211_PLINK_STATES = NUM_NL80211_PLINK_STATES - 1
+};
+
 #endif /* __LINUX_NL80211_H */
index 04afcfb9eaf4abcc945e742e6b9a152087a11dce..0a2d795d35dec63b16457fd081fcfa7e09869a60 100644 (file)
@@ -371,33 +371,6 @@ enum plink_actions {
        PLINK_ACTION_BLOCK,
 };
 
-/**
- * enum plink_states - state of a mesh peer link finite state machine
- *
- * @PLINK_LISTEN: initial state, considered the implicit state of non
- * existant mesh peer links
- * @PLINK_OPN_SNT: mesh plink open frame has been sent to this mesh
- * peer @PLINK_OPN_RCVD: mesh plink open frame has been received from
- * this mesh peer
- * @PLINK_CNF_RCVD: mesh plink confirm frame has been received from
- * this mesh peer
- * @PLINK_ESTAB: mesh peer link is established
- * @PLINK_HOLDING: mesh peer link is being closed or cancelled
- * @PLINK_BLOCKED: all frames transmitted from this mesh plink are
- * discarded
- * @PLINK_INVALID: reserved
- */
-enum plink_state {
-       PLINK_LISTEN,
-       PLINK_OPN_SNT,
-       PLINK_OPN_RCVD,
-       PLINK_CNF_RCVD,
-       PLINK_ESTAB,
-       PLINK_HOLDING,
-       PLINK_BLOCKED,
-       PLINK_INVALID,
-};
-
 /**
  * struct station_parameters - station parameters
  *
index 6ecd5862735d9fded8ad3201525ae0031c3cd28e..be70c70d3f5bfa6ecfb57e56d3b12eb06e6f78e9 100644 (file)
@@ -730,9 +730,9 @@ static void sta_apply_parameters(struct ieee80211_local *local,
 #ifdef CONFIG_MAC80211_MESH
                if (sdata->u.mesh.security & IEEE80211_MESH_SEC_SECURED)
                        switch (params->plink_state) {
-                       case PLINK_LISTEN:
-                       case PLINK_ESTAB:
-                       case PLINK_BLOCKED:
+                       case NL80211_PLINK_LISTEN:
+                       case NL80211_PLINK_ESTAB:
+                       case NL80211_PLINK_BLOCKED:
                                sta->plink_state = params->plink_state;
                                break;
                        default:
index 2c37bee3095a2741b661f54cb924c40ab773723d..f4adc0917888d61f6ea033063af41b4c41f60f40 100644 (file)
@@ -83,7 +83,7 @@ void mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata)
  */
 static inline void mesh_plink_fsm_restart(struct sta_info *sta)
 {
-       sta->plink_state = PLINK_LISTEN;
+       sta->plink_state = NL80211_PLINK_LISTEN;
        sta->llid = sta->plid = sta->reason = 0;
        sta->plink_retries = 0;
 }
@@ -126,11 +126,11 @@ static bool __mesh_plink_deactivate(struct sta_info *sta)
        struct ieee80211_sub_if_data *sdata = sta->sdata;
        bool deactivated = false;
 
-       if (sta->plink_state == PLINK_ESTAB) {
+       if (sta->plink_state == NL80211_PLINK_ESTAB) {
                mesh_plink_dec_estab_count(sdata);
                deactivated = true;
        }
-       sta->plink_state = PLINK_BLOCKED;
+       sta->plink_state = NL80211_PLINK_BLOCKED;
        mesh_path_flush_by_nexthop(sta);
 
        return deactivated;
@@ -268,7 +268,7 @@ void mesh_neighbour_update(u8 *hw_addr, u32 rates,
        sta->last_rx = jiffies;
        sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
        if (mesh_peer_accepts_plinks(elems) &&
-                       sta->plink_state == PLINK_LISTEN &&
+                       sta->plink_state == NL80211_PLINK_LISTEN &&
                        sdata->u.mesh.accepting_plinks &&
                        sdata->u.mesh.mshcfg.auto_open_plinks)
                mesh_plink_open(sta);
@@ -308,8 +308,8 @@ static void mesh_plink_timer(unsigned long data)
        sdata = sta->sdata;
 
        switch (sta->plink_state) {
-       case PLINK_OPN_RCVD:
-       case PLINK_OPN_SNT:
+       case NL80211_PLINK_OPN_RCVD:
+       case NL80211_PLINK_OPN_SNT:
                /* retry timer */
                if (sta->plink_retries < dot11MeshMaxRetries(sdata)) {
                        u32 rand;
@@ -328,17 +328,17 @@ static void mesh_plink_timer(unsigned long data)
                }
                reason = cpu_to_le16(MESH_MAX_RETRIES);
                /* fall through on else */
-       case PLINK_CNF_RCVD:
+       case NL80211_PLINK_CNF_RCVD:
                /* confirm timer */
                if (!reason)
                        reason = cpu_to_le16(MESH_CONFIRM_TIMEOUT);
-               sta->plink_state = PLINK_HOLDING;
+               sta->plink_state = NL80211_PLINK_HOLDING;
                mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
                spin_unlock_bh(&sta->lock);
                mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, plid,
                                    reason);
                break;
-       case PLINK_HOLDING:
+       case NL80211_PLINK_HOLDING:
                /* holding timer */
                del_timer(&sta->plink_timer);
                mesh_plink_fsm_restart(sta);
@@ -386,11 +386,11 @@ int mesh_plink_open(struct sta_info *sta)
        spin_lock_bh(&sta->lock);
        get_random_bytes(&llid, 2);
        sta->llid = llid;
-       if (sta->plink_state != PLINK_LISTEN) {
+       if (sta->plink_state != NL80211_PLINK_LISTEN) {
                spin_unlock_bh(&sta->lock);
                return -EBUSY;
        }
-       sta->plink_state = PLINK_OPN_SNT;
+       sta->plink_state = NL80211_PLINK_OPN_SNT;
        mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata));
        spin_unlock_bh(&sta->lock);
        mpl_dbg("Mesh plink: starting establishment with %pM\n",
@@ -407,7 +407,7 @@ void mesh_plink_block(struct sta_info *sta)
 
        spin_lock_bh(&sta->lock);
        deactivated = __mesh_plink_deactivate(sta);
-       sta->plink_state = PLINK_BLOCKED;
+       sta->plink_state = NL80211_PLINK_BLOCKED;
        spin_unlock_bh(&sta->lock);
 
        if (deactivated)
@@ -430,13 +430,13 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
        __le16 plid, llid, reason;
 #ifdef CONFIG_MAC80211_VERBOSE_MPL_DEBUG
        static const char *mplstates[] = {
-               [PLINK_LISTEN] = "LISTEN",
-               [PLINK_OPN_SNT] = "OPN-SNT",
-               [PLINK_OPN_RCVD] = "OPN-RCVD",
-               [PLINK_CNF_RCVD] = "CNF_RCVD",
-               [PLINK_ESTAB] = "ESTAB",
-               [PLINK_HOLDING] = "HOLDING",
-               [PLINK_BLOCKED] = "BLOCKED"
+               [NL80211_PLINK_LISTEN] = "LISTEN",
+               [NL80211_PLINK_OPN_SNT] = "OPN-SNT",
+               [NL80211_PLINK_OPN_RCVD] = "OPN-RCVD",
+               [NL80211_PLINK_CNF_RCVD] = "CNF_RCVD",
+               [NL80211_PLINK_ESTAB] = "ESTAB",
+               [NL80211_PLINK_HOLDING] = "HOLDING",
+               [NL80211_PLINK_BLOCKED] = "BLOCKED"
        };
 #endif
 
@@ -502,7 +502,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                return;
        }
 
-       if (sta && sta->plink_state == PLINK_BLOCKED) {
+       if (sta && sta->plink_state == NL80211_PLINK_BLOCKED) {
                rcu_read_unlock();
                return;
        }
@@ -572,7 +572,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                                event = CNF_ACPT;
                        break;
                case PLINK_CLOSE:
-                       if (sta->plink_state == PLINK_ESTAB)
+                       if (sta->plink_state == NL80211_PLINK_ESTAB)
                                /* Do not check for llid or plid. This does not
                                 * follow the standard but since multiple plinks
                                 * per sta are not supported, it is necessary in
@@ -607,14 +607,14 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
        reason = 0;
        switch (sta->plink_state) {
                /* spin_unlock as soon as state is updated at each case */
-       case PLINK_LISTEN:
+       case NL80211_PLINK_LISTEN:
                switch (event) {
                case CLS_ACPT:
                        mesh_plink_fsm_restart(sta);
                        spin_unlock_bh(&sta->lock);
                        break;
                case OPN_ACPT:
-                       sta->plink_state = PLINK_OPN_RCVD;
+                       sta->plink_state = NL80211_PLINK_OPN_RCVD;
                        sta->plid = plid;
                        get_random_bytes(&llid, 2);
                        sta->llid = llid;
@@ -631,7 +631,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                }
                break;
 
-       case PLINK_OPN_SNT:
+       case NL80211_PLINK_OPN_SNT:
                switch (event) {
                case OPN_RJCT:
                case CNF_RJCT:
@@ -640,7 +640,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        if (!reason)
                                reason = cpu_to_le16(MESH_CLOSE_RCVD);
                        sta->reason = reason;
-                       sta->plink_state = PLINK_HOLDING;
+                       sta->plink_state = NL80211_PLINK_HOLDING;
                        if (!mod_plink_timer(sta,
                                             dot11MeshHoldingTimeout(sdata)))
                                sta->ignore_plink_timer = true;
@@ -652,7 +652,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        break;
                case OPN_ACPT:
                        /* retry timer is left untouched */
-                       sta->plink_state = PLINK_OPN_RCVD;
+                       sta->plink_state = NL80211_PLINK_OPN_RCVD;
                        sta->plid = plid;
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
@@ -660,7 +660,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                                            plid, 0);
                        break;
                case CNF_ACPT:
-                       sta->plink_state = PLINK_CNF_RCVD;
+                       sta->plink_state = NL80211_PLINK_CNF_RCVD;
                        if (!mod_plink_timer(sta,
                                             dot11MeshConfirmTimeout(sdata)))
                                sta->ignore_plink_timer = true;
@@ -673,7 +673,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                }
                break;
 
-       case PLINK_OPN_RCVD:
+       case NL80211_PLINK_OPN_RCVD:
                switch (event) {
                case OPN_RJCT:
                case CNF_RJCT:
@@ -682,7 +682,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        if (!reason)
                                reason = cpu_to_le16(MESH_CLOSE_RCVD);
                        sta->reason = reason;
-                       sta->plink_state = PLINK_HOLDING;
+                       sta->plink_state = NL80211_PLINK_HOLDING;
                        if (!mod_plink_timer(sta,
                                             dot11MeshHoldingTimeout(sdata)))
                                sta->ignore_plink_timer = true;
@@ -700,7 +700,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        break;
                case CNF_ACPT:
                        del_timer(&sta->plink_timer);
-                       sta->plink_state = PLINK_ESTAB;
+                       sta->plink_state = NL80211_PLINK_ESTAB;
                        spin_unlock_bh(&sta->lock);
                        mesh_plink_inc_estab_count(sdata);
                        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
@@ -713,7 +713,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                }
                break;
 
-       case PLINK_CNF_RCVD:
+       case NL80211_PLINK_CNF_RCVD:
                switch (event) {
                case OPN_RJCT:
                case CNF_RJCT:
@@ -722,7 +722,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        if (!reason)
                                reason = cpu_to_le16(MESH_CLOSE_RCVD);
                        sta->reason = reason;
-                       sta->plink_state = PLINK_HOLDING;
+                       sta->plink_state = NL80211_PLINK_HOLDING;
                        if (!mod_plink_timer(sta,
                                             dot11MeshHoldingTimeout(sdata)))
                                sta->ignore_plink_timer = true;
@@ -734,7 +734,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        break;
                case OPN_ACPT:
                        del_timer(&sta->plink_timer);
-                       sta->plink_state = PLINK_ESTAB;
+                       sta->plink_state = NL80211_PLINK_ESTAB;
                        spin_unlock_bh(&sta->lock);
                        mesh_plink_inc_estab_count(sdata);
                        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
@@ -749,13 +749,13 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                }
                break;
 
-       case PLINK_ESTAB:
+       case NL80211_PLINK_ESTAB:
                switch (event) {
                case CLS_ACPT:
                        reason = cpu_to_le16(MESH_CLOSE_RCVD);
                        sta->reason = reason;
                        deactivated = __mesh_plink_deactivate(sta);
-                       sta->plink_state = PLINK_HOLDING;
+                       sta->plink_state = NL80211_PLINK_HOLDING;
                        llid = sta->llid;
                        mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
                        spin_unlock_bh(&sta->lock);
@@ -775,7 +775,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                        break;
                }
                break;
-       case PLINK_HOLDING:
+       case NL80211_PLINK_HOLDING:
                switch (event) {
                case CLS_ACPT:
                        if (del_timer(&sta->plink_timer))
index 1b9413fb38392c7975eb953ca3227e972f7d3b59..3a9515cb7ce13c3f9dd2b22cf528b554922e08ed 100644 (file)
@@ -490,7 +490,7 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
         * establisment frame, beacon or probe, drop the frame.
         */
 
-       if (!rx->sta || sta_plink_state(rx->sta) != PLINK_ESTAB) {
+       if (!rx->sta || sta_plink_state(rx->sta) != NL80211_PLINK_ESTAB) {
                struct ieee80211_mgmt *mgmt;
 
                if (!ieee80211_is_mgmt(hdr->frame_control))
index 82ab6b4643fcdff48624aa46925e286f4d3b7d03..4a15f96035622592d830422822b6b12fe649d77a 100644 (file)
@@ -277,7 +277,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
 #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
 
 #ifdef CONFIG_MAC80211_MESH
-       sta->plink_state = PLINK_LISTEN;
+       sta->plink_state = NL80211_PLINK_LISTEN;
        init_timer(&sta->plink_timer);
 #endif
 
index d6b566076f051d066fc19a0ff4c268c24e41b8d1..c6ae8718bd571f5d37ab7687d5894056d1b35837 100644 (file)
@@ -318,7 +318,7 @@ struct sta_info {
        u8 plink_retries;
        bool ignore_plink_timer;
        bool plink_timer_was_running;
-       enum plink_state plink_state;
+       enum nl80211_plink_state plink_state;
        u32 plink_timeout;
        struct timer_list plink_timer;
 #endif
@@ -336,12 +336,12 @@ struct sta_info {
        struct ieee80211_sta sta;
 };
 
-static inline enum plink_state sta_plink_state(struct sta_info *sta)
+static inline enum nl80211_plink_state sta_plink_state(struct sta_info *sta)
 {
 #ifdef CONFIG_MAC80211_MESH
        return sta->plink_state;
 #endif
-       return PLINK_LISTEN;
+       return NL80211_PLINK_LISTEN;
 }
 
 static inline void set_sta_flags(struct sta_info *sta, const u32 flags)
index beac296b1fde49b725235b63ae6e21c45b6727e7..2222ce08ee91ea8d82e8c8222451c4af1bb4c5ef 100644 (file)
@@ -2335,7 +2335,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
        memset(&params, 0, sizeof(params));
 
        params.listen_interval = -1;
-       params.plink_state = PLINK_INVALID;
+       params.plink_state = -1;
 
        if (info->attrs[NL80211_ATTR_STA_AID])
                return -EINVAL;