aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/sta_info.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2011-12-14 06:35:30 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-12-15 14:46:34 -0500
commitd9a7ddb05e5419ca5e4b54f57074dc33c7ea991c (patch)
tree3de3213e7e79a64254ea778374aeaaffa61b5bab /net/mac80211/sta_info.h
parent87be1e1e00f870567780dec111193426b4c085e8 (diff)
mac80211: refactor station state transitions
Station entries can have various states, the most important ones being auth, assoc and authorized. This patch prepares us for telling the driver about these states, we don't want to confuse drivers with strange transitions, so with this we enforce that they move in the right order between them (back and forth); some transitions might happen before the driver even knows about the station, but at least runtime transitions will be ordered correctly. As a consequence, IBSS and MESH stations will now have the ASSOC flag set (so they can transition to AUTHORIZED), and we can get rid of a special case in TX processing. When freeing a station, unwind the state so that other parts of the code (or drivers later) can rely on the transitions. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/sta_info.h')
-rw-r--r--net/mac80211/sta_info.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 1a14fab4bc9a..63f4d316a954 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -73,6 +73,14 @@ enum ieee80211_sta_info_flags {
73 WLAN_STA_4ADDR_EVENT, 73 WLAN_STA_4ADDR_EVENT,
74}; 74};
75 75
76enum ieee80211_sta_state {
77 /* NOTE: These need to be ordered correctly! */
78 IEEE80211_STA_NONE,
79 IEEE80211_STA_AUTH,
80 IEEE80211_STA_ASSOC,
81 IEEE80211_STA_AUTHORIZED,
82};
83
76#define STA_TID_NUM 16 84#define STA_TID_NUM 16
77#define ADDBA_RESP_INTERVAL HZ 85#define ADDBA_RESP_INTERVAL HZ
78#define HT_AGG_MAX_RETRIES 0x3 86#define HT_AGG_MAX_RETRIES 0x3
@@ -262,6 +270,7 @@ struct sta_ampdu_mlme {
262 * @dummy: indicate a dummy station created for receiving 270 * @dummy: indicate a dummy station created for receiving
263 * EAP frames before association 271 * EAP frames before association
264 * @sta: station information we share with the driver 272 * @sta: station information we share with the driver
273 * @sta_state: duplicates information about station state (for debug)
265 */ 274 */
266struct sta_info { 275struct sta_info {
267 /* General information, mostly static */ 276 /* General information, mostly static */
@@ -283,6 +292,8 @@ struct sta_info {
283 292
284 bool uploaded; 293 bool uploaded;
285 294
295 enum ieee80211_sta_state sta_state;
296
286 /* use the accessors defined below */ 297 /* use the accessors defined below */
287 unsigned long _flags; 298 unsigned long _flags;
288 299
@@ -371,12 +382,18 @@ static inline enum nl80211_plink_state sta_plink_state(struct sta_info *sta)
371static inline void set_sta_flag(struct sta_info *sta, 382static inline void set_sta_flag(struct sta_info *sta,
372 enum ieee80211_sta_info_flags flag) 383 enum ieee80211_sta_info_flags flag)
373{ 384{
385 WARN_ON(flag == WLAN_STA_AUTH ||
386 flag == WLAN_STA_ASSOC ||
387 flag == WLAN_STA_AUTHORIZED);
374 set_bit(flag, &sta->_flags); 388 set_bit(flag, &sta->_flags);
375} 389}
376 390
377static inline void clear_sta_flag(struct sta_info *sta, 391static inline void clear_sta_flag(struct sta_info *sta,
378 enum ieee80211_sta_info_flags flag) 392 enum ieee80211_sta_info_flags flag)
379{ 393{
394 WARN_ON(flag == WLAN_STA_AUTH ||
395 flag == WLAN_STA_ASSOC ||
396 flag == WLAN_STA_AUTHORIZED);
380 clear_bit(flag, &sta->_flags); 397 clear_bit(flag, &sta->_flags);
381} 398}
382 399
@@ -389,15 +406,32 @@ static inline int test_sta_flag(struct sta_info *sta,
389static inline int test_and_clear_sta_flag(struct sta_info *sta, 406static inline int test_and_clear_sta_flag(struct sta_info *sta,
390 enum ieee80211_sta_info_flags flag) 407 enum ieee80211_sta_info_flags flag)
391{ 408{
409 WARN_ON(flag == WLAN_STA_AUTH ||
410 flag == WLAN_STA_ASSOC ||
411 flag == WLAN_STA_AUTHORIZED);
392 return test_and_clear_bit(flag, &sta->_flags); 412 return test_and_clear_bit(flag, &sta->_flags);
393} 413}
394 414
395static inline int test_and_set_sta_flag(struct sta_info *sta, 415static inline int test_and_set_sta_flag(struct sta_info *sta,
396 enum ieee80211_sta_info_flags flag) 416 enum ieee80211_sta_info_flags flag)
397{ 417{
418 WARN_ON(flag == WLAN_STA_AUTH ||
419 flag == WLAN_STA_ASSOC ||
420 flag == WLAN_STA_AUTHORIZED);
398 return test_and_set_bit(flag, &sta->_flags); 421 return test_and_set_bit(flag, &sta->_flags);
399} 422}
400 423
424int sta_info_move_state_checked(struct sta_info *sta,
425 enum ieee80211_sta_state new_state);
426
427static inline void sta_info_move_state(struct sta_info *sta,
428 enum ieee80211_sta_state new_state)
429{
430 int ret = sta_info_move_state_checked(sta, new_state);
431 WARN_ON_ONCE(ret);
432}
433
434
401void ieee80211_assign_tid_tx(struct sta_info *sta, int tid, 435void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,
402 struct tid_ampdu_tx *tid_tx); 436 struct tid_ampdu_tx *tid_tx);
403 437
@@ -489,6 +523,9 @@ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
489 */ 523 */
490struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, 524struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
491 u8 *addr, gfp_t gfp); 525 u8 *addr, gfp_t gfp);
526
527void sta_info_free(struct ieee80211_local *local, struct sta_info *sta);
528
492/* 529/*
493 * Insert STA info into hash table/list, returns zero or a 530 * Insert STA info into hash table/list, returns zero or a
494 * -EEXIST if (if the same MAC address is already present). 531 * -EEXIST if (if the same MAC address is already present).