sta_info.h revision 9f409937549b1018cb8fafcb8db22ea029498b20
1/****************************************************************************** 2 * 3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 ******************************************************************************/ 15#ifndef __STA_INFO_H_ 16#define __STA_INFO_H_ 17 18#include <osdep_service.h> 19#include <drv_types.h> 20#include <wifi.h> 21 22#define IBSS_START_MAC_ID 2 23#define NUM_STA 32 24#define NUM_ACL 16 25 26 27/* if mode ==0, then the sta is allowed once the addr is hit. */ 28/* if mode ==1, then the sta is rejected once the addr is non-hit. */ 29struct rtw_wlan_acl_node { 30 struct list_head list; 31 u8 addr[ETH_ALEN]; 32 u8 valid; 33}; 34 35/* mode=0, disable */ 36/* mode=1, accept unless in deny list */ 37/* mode=2, deny unless in accept list */ 38struct wlan_acl_pool { 39 int mode; 40 int num; 41 struct rtw_wlan_acl_node aclnode[NUM_ACL]; 42 struct rtw_queue acl_node_q; 43}; 44 45struct rssi_sta { 46 s32 UndecoratedSmoothedPWDB; 47 s32 UndecoratedSmoothedCCK; 48 s32 UndecoratedSmoothedOFDM; 49 u64 PacketMap; 50 u8 ValidBit; 51}; 52 53struct stainfo_stats { 54 u64 rx_mgnt_pkts; 55 u64 rx_beacon_pkts; 56 u64 rx_probereq_pkts; 57 u64 rx_probersp_pkts; 58 u64 rx_probersp_bm_pkts; 59 u64 rx_probersp_uo_pkts; 60 u64 rx_ctrl_pkts; 61 u64 rx_data_pkts; 62 63 u64 last_rx_mgnt_pkts; 64 u64 last_rx_beacon_pkts; 65 u64 last_rx_probereq_pkts; 66 u64 last_rx_probersp_pkts; 67 u64 last_rx_probersp_bm_pkts; 68 u64 last_rx_probersp_uo_pkts; 69 u64 last_rx_ctrl_pkts; 70 u64 last_rx_data_pkts; 71 72 u64 rx_bytes; 73 u64 rx_drops; 74 75 u64 tx_pkts; 76 u64 tx_bytes; 77 u64 tx_drops; 78 79}; 80 81struct sta_info { 82 spinlock_t lock; 83 struct list_head list; /* free_sta_queue */ 84 struct list_head hash_list; /* sta_hash */ 85 struct rtw_adapter *padapter; 86 87 struct sta_xmit_priv sta_xmitpriv; 88 struct sta_recv_priv sta_recvpriv; 89 90 struct rtw_queue sleep_q; 91 unsigned int sleepq_len; 92 93 uint state; 94 uint aid; 95 uint mac_id; 96 uint qos_option; 97 u8 hwaddr[ETH_ALEN]; 98 99 uint ieee8021x_blocked; /* 0: allowed, 1:blocked */ 100 uint dot118021XPrivacy; /* aes, tkip... */ 101 union Keytype dot11tkiptxmickey; 102 union Keytype dot11tkiprxmickey; 103 union Keytype dot118021x_UncstKey; 104 union pn48 dot11txpn; /* PN48 used for Unicast xmit. */ 105 union pn48 dot11rxpn; /* PN48 used for Unicast recv. */ 106 107 108 u8 bssrateset[16]; 109 u32 bssratelen; 110 s32 rssi; 111 s32 signal_quality; 112 113 u8 cts2self; 114 u8 rtsen; 115 116 u8 raid; 117 u8 init_rate; 118 u32 ra_mask; 119 u8 wireless_mode; /* NETWORK_TYPE */ 120 struct stainfo_stats sta_stats; 121 122 /* for A-MPDU TX, ADDBA timeout check */ 123 struct timer_list addba_retry_timer; 124 125 /* for A-MPDU Rx reordering buffer control */ 126 struct recv_reorder_ctrl recvreorder_ctrl[16]; 127 128 /* for A-MPDU Tx */ 129 /* unsigned char ampdu_txen_bitmap; */ 130 u16 BA_starting_seqctrl[16]; 131 132 struct ht_priv htpriv; 133 134 /* Notes: */ 135 /* STA_Mode: */ 136 /* curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO */ 137 /* scan_q: AP CAP/INFO */ 138 139 /* AP_Mode: */ 140 /* curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO */ 141 /* sta_info: (AP & STA) CAP/INFO */ 142 143 struct list_head asoc_list; 144 struct list_head auth_list; 145 146 unsigned int expire_to; 147 unsigned int auth_seq; 148 unsigned int authalg; 149 unsigned char chg_txt[128]; 150 151 u16 capability; 152 int flags; 153 154 int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */ 155 int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */ 156 int wpa_group_cipher; 157 int wpa2_group_cipher; 158 int wpa_pairwise_cipher; 159 int wpa2_pairwise_cipher; 160 161 u8 bpairwise_key_installed; 162 163 u8 wpa_ie[32]; 164 165 u8 nonerp_set; 166 u8 no_short_slot_time_set; 167 u8 no_short_preamble_set; 168 u8 no_ht_gf_set; 169 u8 no_ht_set; 170 u8 ht_20mhz_set; 171 172 unsigned int tx_ra_bitmap; 173 u8 qos_info; 174 175 u8 max_sp_len; 176 u8 uapsd_bk;/* BIT(0): Delivery enabled, BIT(1): Trigger enabled */ 177 u8 uapsd_be; 178 u8 uapsd_vi; 179 u8 uapsd_vo; 180 181 u8 has_legacy_ac; 182 unsigned int sleepq_ac_len; 183 184 /* p2p priv data */ 185 u8 is_p2p_device; 186 u8 p2p_status_code; 187 188 u8 keep_alive_trycnt; 189 190 /* p2p client info */ 191 u8 dev_addr[ETH_ALEN]; 192 u8 dev_cap; 193 u16 config_methods; 194 u8 primary_dev_type[8]; 195 u8 num_of_secdev_type; 196 u8 secdev_types_list[32];/* 32/8 == 4; */ 197 u16 dev_name_len; 198 u8 dev_name[32]; 199 u8 *passoc_req; 200 u32 assoc_req_len; 201 202 /* for DM */ 203 struct rssi_sta rssi_stat; 204 205 /* */ 206 /* ================ODM Relative Info======================= */ 207 /* Please be care, dont declare too much structure here. It will cost memory * STA support num. */ 208 /* */ 209 /* */ 210 /* 2011/10/20 MH Add for ODM STA info. */ 211 /* */ 212 /* Driver Write */ 213 u8 bValid; /* record the sta status link or not? */ 214 u8 rssi_level; /* for Refresh RA mask */ 215 /* ODM Write */ 216 /* 1 PHY_STATUS_INFO */ 217 u8 RSSI_Path[4]; /* */ 218 u8 RSSI_Ave; 219 u8 RXEVM[4]; 220 u8 RXSNR[4]; 221 222 /* ODM Write */ 223 /* 1 TX_INFO (may changed by IC) */ 224 /* ================ODM Relative Info======================= */ 225 /* */ 226 227 /* To store the sequence number of received management frame */ 228 u16 RxMgmtFrameSeqNum; 229}; 230 231#define sta_rx_pkts(sta) \ 232 (sta->sta_stats.rx_mgnt_pkts \ 233 + sta->sta_stats.rx_ctrl_pkts \ 234 + sta->sta_stats.rx_data_pkts) 235 236#define sta_last_rx_pkts(sta) \ 237 (sta->sta_stats.last_rx_mgnt_pkts \ 238 + sta->sta_stats.last_rx_ctrl_pkts \ 239 + sta->sta_stats.last_rx_data_pkts) 240 241#define sta_rx_data_pkts(sta) \ 242 (sta->sta_stats.rx_data_pkts) 243 244#define sta_last_rx_data_pkts(sta) \ 245 (sta->sta_stats.last_rx_data_pkts) 246 247#define sta_rx_mgnt_pkts(sta) \ 248 (sta->sta_stats.rx_mgnt_pkts) 249 250#define sta_last_rx_mgnt_pkts(sta) \ 251 (sta->sta_stats.last_rx_mgnt_pkts) 252 253#define sta_rx_beacon_pkts(sta) \ 254 (sta->sta_stats.rx_beacon_pkts) 255 256#define sta_last_rx_beacon_pkts(sta) \ 257 (sta->sta_stats.last_rx_beacon_pkts) 258 259#define sta_rx_probereq_pkts(sta) \ 260 (sta->sta_stats.rx_probereq_pkts) 261 262#define sta_last_rx_probereq_pkts(sta) \ 263 (sta->sta_stats.last_rx_probereq_pkts) 264 265#define sta_rx_probersp_pkts(sta) \ 266 (sta->sta_stats.rx_probersp_pkts) 267 268#define sta_last_rx_probersp_pkts(sta) \ 269 (sta->sta_stats.last_rx_probersp_pkts) 270 271#define sta_rx_probersp_bm_pkts(sta) \ 272 (sta->sta_stats.rx_probersp_bm_pkts) 273 274#define sta_last_rx_probersp_bm_pkts(sta) \ 275 (sta->sta_stats.last_rx_probersp_bm_pkts) 276 277#define sta_rx_probersp_uo_pkts(sta) \ 278 (sta->sta_stats.rx_probersp_uo_pkts) 279 280#define sta_last_rx_probersp_uo_pkts(sta) \ 281 (sta->sta_stats.last_rx_probersp_uo_pkts) 282 283#define sta_update_last_rx_pkts(sta) \ 284 do { \ 285 sta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \ 286 sta->sta_stats.last_rx_beacon_pkts = sta->sta_stats.rx_beacon_pkts; \ 287 sta->sta_stats.last_rx_probereq_pkts = sta->sta_stats.rx_probereq_pkts; \ 288 sta->sta_stats.last_rx_probersp_pkts = sta->sta_stats.rx_probersp_pkts; \ 289 sta->sta_stats.last_rx_probersp_bm_pkts = sta->sta_stats.rx_probersp_bm_pkts; \ 290 sta->sta_stats.last_rx_probersp_uo_pkts = sta->sta_stats.rx_probersp_uo_pkts; \ 291 sta->sta_stats.last_rx_ctrl_pkts = sta->sta_stats.rx_ctrl_pkts; \ 292 sta->sta_stats.last_rx_data_pkts = sta->sta_stats.rx_data_pkts; \ 293 } while (0) 294 295#define STA_RX_PKTS_ARG(sta) \ 296 sta->sta_stats.rx_mgnt_pkts \ 297 , sta->sta_stats.rx_ctrl_pkts \ 298 , sta->sta_stats.rx_data_pkts 299 300#define STA_LAST_RX_PKTS_ARG(sta) \ 301 sta->sta_stats.last_rx_mgnt_pkts, \ 302 sta->sta_stats.last_rx_ctrl_pkts, \ 303 sta->sta_stats.last_rx_data_pkts 304 305#define STA_RX_PKTS_DIFF_ARG(sta) \ 306 sta->sta_stats.rx_mgnt_pkts - sta->sta_stats.last_rx_mgnt_pkts, \ 307 sta->sta_stats.rx_ctrl_pkts - sta->sta_stats.last_rx_ctrl_pkts, \ 308 sta->sta_stats.rx_data_pkts - sta->sta_stats.last_rx_data_pkts 309 310#define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)" 311 312struct sta_priv { 313 spinlock_t sta_hash_lock; 314 struct list_head sta_hash[NUM_STA]; 315 int asoc_sta_count; 316 317 struct rtw_adapter *padapter; 318 struct list_head asoc_list; 319 struct list_head auth_list; 320 spinlock_t asoc_list_lock; 321 spinlock_t auth_list_lock; 322 u8 asoc_list_cnt; 323 u8 auth_list_cnt; 324 325 unsigned int auth_to; /* sec, time to expire in authenticating. */ 326 unsigned int assoc_to; /* sec, time to expire before associating. */ 327 unsigned int expire_to; /* sec , time to expire after associated. */ 328 329 /* pointers to STA info; based on allocated AID or NULL if AID free 330 * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1 331 * and so on 332 */ 333 struct sta_info *sta_aid[NUM_STA]; 334 335 u16 sta_dz_bitmap;/* only support 15 stations, staion aid bitmap 336 * for sleeping sta. */ 337 u16 tim_bitmap;/* only support 15 stations, 338 * aid=0~15 mapping bit0~bit15 */ 339 340 u16 max_num_sta; 341 342 struct wlan_acl_pool acl_list; 343}; 344 345static inline u32 wifi_mac_hash(const u8 *mac) 346{ 347 u32 x; 348 349 x = mac[0]; 350 x = (x << 2) ^ mac[1]; 351 x = (x << 2) ^ mac[2]; 352 x = (x << 2) ^ mac[3]; 353 x = (x << 2) ^ mac[4]; 354 x = (x << 2) ^ mac[5]; 355 356 x ^= x >> 8; 357 x = x & (NUM_STA - 1); 358 359 return x; 360} 361 362u32 _rtw_init_sta_priv23a(struct sta_priv *pstapriv); 363u32 _rtw_free_sta_priv23a(struct sta_priv *pstapriv); 364 365struct sta_info *rtw_alloc_stainfo23a(struct sta_priv *pstapriv, u8 *hwaddr, int gfp); 366u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta); 367void rtw_free_all_stainfo23a(struct rtw_adapter *padapter); 368struct sta_info *rtw_get_stainfo23a(struct sta_priv *pstapriv, const u8 *hwaddr); 369u32 rtw_init_bcmc_stainfo23a(struct rtw_adapter *padapter); 370struct sta_info *rtw_get_bcmc_stainfo23a(struct rtw_adapter *padapter); 371u8 rtw_access_ctrl23a(struct rtw_adapter *padapter, u8 *mac_addr); 372 373#endif /* _STA_INFO_H_ */ 374