|
@@ -73,6 +73,14 @@ enum ieee80211_sta_info_flags {
|
|
WLAN_STA_4ADDR_EVENT,
|
|
WLAN_STA_4ADDR_EVENT,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+enum ieee80211_sta_state {
|
|
|
|
+ /* NOTE: These need to be ordered correctly! */
|
|
|
|
+ IEEE80211_STA_NONE,
|
|
|
|
+ IEEE80211_STA_AUTH,
|
|
|
|
+ IEEE80211_STA_ASSOC,
|
|
|
|
+ IEEE80211_STA_AUTHORIZED,
|
|
|
|
+};
|
|
|
|
+
|
|
#define STA_TID_NUM 16
|
|
#define STA_TID_NUM 16
|
|
#define ADDBA_RESP_INTERVAL HZ
|
|
#define ADDBA_RESP_INTERVAL HZ
|
|
#define HT_AGG_MAX_RETRIES 0x3
|
|
#define HT_AGG_MAX_RETRIES 0x3
|
|
@@ -262,6 +270,7 @@ struct sta_ampdu_mlme {
|
|
* @dummy: indicate a dummy station created for receiving
|
|
* @dummy: indicate a dummy station created for receiving
|
|
* EAP frames before association
|
|
* EAP frames before association
|
|
* @sta: station information we share with the driver
|
|
* @sta: station information we share with the driver
|
|
|
|
+ * @sta_state: duplicates information about station state (for debug)
|
|
*/
|
|
*/
|
|
struct sta_info {
|
|
struct sta_info {
|
|
/* General information, mostly static */
|
|
/* General information, mostly static */
|
|
@@ -283,6 +292,8 @@ struct sta_info {
|
|
|
|
|
|
bool uploaded;
|
|
bool uploaded;
|
|
|
|
|
|
|
|
+ enum ieee80211_sta_state sta_state;
|
|
|
|
+
|
|
/* use the accessors defined below */
|
|
/* use the accessors defined below */
|
|
unsigned long _flags;
|
|
unsigned long _flags;
|
|
|
|
|
|
@@ -371,12 +382,18 @@ static inline enum nl80211_plink_state sta_plink_state(struct sta_info *sta)
|
|
static inline void set_sta_flag(struct sta_info *sta,
|
|
static inline void set_sta_flag(struct sta_info *sta,
|
|
enum ieee80211_sta_info_flags flag)
|
|
enum ieee80211_sta_info_flags flag)
|
|
{
|
|
{
|
|
|
|
+ WARN_ON(flag == WLAN_STA_AUTH ||
|
|
|
|
+ flag == WLAN_STA_ASSOC ||
|
|
|
|
+ flag == WLAN_STA_AUTHORIZED);
|
|
set_bit(flag, &sta->_flags);
|
|
set_bit(flag, &sta->_flags);
|
|
}
|
|
}
|
|
|
|
|
|
static inline void clear_sta_flag(struct sta_info *sta,
|
|
static inline void clear_sta_flag(struct sta_info *sta,
|
|
enum ieee80211_sta_info_flags flag)
|
|
enum ieee80211_sta_info_flags flag)
|
|
{
|
|
{
|
|
|
|
+ WARN_ON(flag == WLAN_STA_AUTH ||
|
|
|
|
+ flag == WLAN_STA_ASSOC ||
|
|
|
|
+ flag == WLAN_STA_AUTHORIZED);
|
|
clear_bit(flag, &sta->_flags);
|
|
clear_bit(flag, &sta->_flags);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -389,15 +406,32 @@ static inline int test_sta_flag(struct sta_info *sta,
|
|
static inline int test_and_clear_sta_flag(struct sta_info *sta,
|
|
static inline int test_and_clear_sta_flag(struct sta_info *sta,
|
|
enum ieee80211_sta_info_flags flag)
|
|
enum ieee80211_sta_info_flags flag)
|
|
{
|
|
{
|
|
|
|
+ WARN_ON(flag == WLAN_STA_AUTH ||
|
|
|
|
+ flag == WLAN_STA_ASSOC ||
|
|
|
|
+ flag == WLAN_STA_AUTHORIZED);
|
|
return test_and_clear_bit(flag, &sta->_flags);
|
|
return test_and_clear_bit(flag, &sta->_flags);
|
|
}
|
|
}
|
|
|
|
|
|
static inline int test_and_set_sta_flag(struct sta_info *sta,
|
|
static inline int test_and_set_sta_flag(struct sta_info *sta,
|
|
enum ieee80211_sta_info_flags flag)
|
|
enum ieee80211_sta_info_flags flag)
|
|
{
|
|
{
|
|
|
|
+ WARN_ON(flag == WLAN_STA_AUTH ||
|
|
|
|
+ flag == WLAN_STA_ASSOC ||
|
|
|
|
+ flag == WLAN_STA_AUTHORIZED);
|
|
return test_and_set_bit(flag, &sta->_flags);
|
|
return test_and_set_bit(flag, &sta->_flags);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int sta_info_move_state_checked(struct sta_info *sta,
|
|
|
|
+ enum ieee80211_sta_state new_state);
|
|
|
|
+
|
|
|
|
+static inline void sta_info_move_state(struct sta_info *sta,
|
|
|
|
+ enum ieee80211_sta_state new_state)
|
|
|
|
+{
|
|
|
|
+ int ret = sta_info_move_state_checked(sta, new_state);
|
|
|
|
+ WARN_ON_ONCE(ret);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,
|
|
void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,
|
|
struct tid_ampdu_tx *tid_tx);
|
|
struct tid_ampdu_tx *tid_tx);
|
|
|
|
|
|
@@ -489,6 +523,9 @@ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
|
|
*/
|
|
*/
|
|
struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
|
struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
|
u8 *addr, gfp_t gfp);
|
|
u8 *addr, gfp_t gfp);
|
|
|
|
+
|
|
|
|
+void sta_info_free(struct ieee80211_local *local, struct sta_info *sta);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Insert STA info into hash table/list, returns zero or a
|
|
* Insert STA info into hash table/list, returns zero or a
|
|
* -EEXIST if (if the same MAC address is already present).
|
|
* -EEXIST if (if the same MAC address is already present).
|