Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sta_info.h
Go to the documentation of this file.
1 /*
2  * Copyright 2002-2005, Devicescape Software, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 
9 #ifndef STA_INFO_H
10 #define STA_INFO_H
11 
12 #include <linux/list.h>
13 #include <linux/types.h>
14 #include <linux/if_ether.h>
15 #include <linux/workqueue.h>
16 #include <linux/average.h>
17 #include <linux/etherdevice.h>
18 #include "key.h"
19 
81 };
82 
83 #define STA_TID_NUM 16
84 #define ADDBA_RESP_INTERVAL HZ
85 #define HT_AGG_MAX_RETRIES 15
86 #define HT_AGG_BURST_RETRIES 3
87 #define HT_AGG_RETRIES_PERIOD (15 * HZ)
88 
89 #define HT_AGG_STATE_DRV_READY 0
90 #define HT_AGG_STATE_RESPONSE_RECEIVED 1
91 #define HT_AGG_STATE_OPERATIONAL 2
92 #define HT_AGG_STATE_STOPPING 3
93 #define HT_AGG_STATE_WANT_START 4
94 #define HT_AGG_STATE_WANT_STOP 5
95 
122 struct tid_ampdu_tx {
127  unsigned long state;
128  unsigned long last_tx;
132  bool tx_stop;
134 
137 };
138 
164 struct tid_ampdu_rx {
168  unsigned long *reorder_time;
171  unsigned long last_rx;
178 };
179 
198  struct mutex mtx;
199  /* rx */
203  /* tx */
210 };
211 
212 
287 struct sta_info {
288  /* General information, mostly static */
289  struct list_head list;
299 
302 
304 
305  bool dead;
306 
307  bool uploaded;
308 
310 
311  /* use the accessors defined below */
312  unsigned long _flags;
313 
314  /*
315  * STA powersave frame queues, no more than the internal
316  * locking required.
317  */
320  unsigned long driver_buffered_tids;
321 
322  /* Updated from RX path only, no locking requirements */
323  unsigned long rx_packets, rx_bytes;
324  unsigned long wep_weak_iv_count;
325  unsigned long last_rx;
327  unsigned long num_duplicates;
328  unsigned long rx_fragments;
329  unsigned long rx_dropped;
331  struct ewma avg_signal;
332  /* Plus 1 for non-QoS frames */
334 
335  /* Updated from TX status path only, no locking requirements */
336  unsigned long tx_filtered_count;
338  /* moving percentage of failed MSDUs */
339  unsigned int fail_avg;
340 
341  /* Updated from TX path only, no locking requirements */
342  unsigned long tx_packets;
343  unsigned long tx_bytes;
344  unsigned long tx_fragments;
349 
350  /*
351  * Aggregation information, locked with lock.
352  */
355 
356 #ifdef CONFIG_MAC80211_MESH
357  /*
358  * Mesh peer link attributes
359  * TODO: move to a sub-structure that is referenced with pointer?
360  */
361  __le16 llid;
362  __le16 plid;
363  __le16 reason;
364  u8 plink_retries;
365  bool ignore_plink_timer;
366  bool plink_timer_was_running;
367  enum nl80211_plink_state plink_state;
368  u32 plink_timeout;
369  struct timer_list plink_timer;
370  s64 t_offset;
371  s64 t_offset_setpoint;
372  enum nl80211_channel_type ch_type;
373 #endif
374 
375 #ifdef CONFIG_MAC80211_DEBUGFS
376  struct sta_info_debugfsdentries {
377  struct dentry *dir;
378  bool add_has_run;
379  } debugfs;
380 #endif
381 
382  unsigned int lost_packets;
383  unsigned int beacon_loss_count;
384 
386 
387  /* keep last! */
389 };
390 
391 static inline enum nl80211_plink_state sta_plink_state(struct sta_info *sta)
392 {
393 #ifdef CONFIG_MAC80211_MESH
394  return sta->plink_state;
395 #endif
396  return NL80211_PLINK_LISTEN;
397 }
398 
399 static inline void set_sta_flag(struct sta_info *sta,
401 {
402  WARN_ON(flag == WLAN_STA_AUTH ||
403  flag == WLAN_STA_ASSOC ||
404  flag == WLAN_STA_AUTHORIZED);
405  set_bit(flag, &sta->_flags);
406 }
407 
408 static inline void clear_sta_flag(struct sta_info *sta,
410 {
411  WARN_ON(flag == WLAN_STA_AUTH ||
412  flag == WLAN_STA_ASSOC ||
413  flag == WLAN_STA_AUTHORIZED);
414  clear_bit(flag, &sta->_flags);
415 }
416 
417 static inline int test_sta_flag(struct sta_info *sta,
419 {
420  return test_bit(flag, &sta->_flags);
421 }
422 
423 static inline int test_and_clear_sta_flag(struct sta_info *sta,
425 {
426  WARN_ON(flag == WLAN_STA_AUTH ||
427  flag == WLAN_STA_ASSOC ||
428  flag == WLAN_STA_AUTHORIZED);
429  return test_and_clear_bit(flag, &sta->_flags);
430 }
431 
432 static inline int test_and_set_sta_flag(struct sta_info *sta,
434 {
435  WARN_ON(flag == WLAN_STA_AUTH ||
436  flag == WLAN_STA_ASSOC ||
437  flag == WLAN_STA_AUTHORIZED);
438  return test_and_set_bit(flag, &sta->_flags);
439 }
440 
441 int sta_info_move_state(struct sta_info *sta,
443 
444 static inline void sta_info_pre_move_state(struct sta_info *sta,
446 {
447  int ret;
448 
449  WARN_ON_ONCE(test_sta_flag(sta, WLAN_STA_INSERTED));
450 
451  ret = sta_info_move_state(sta, new_state);
452  WARN_ON_ONCE(ret);
453 }
454 
455 
456 void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,
457  struct tid_ampdu_tx *tid_tx);
458 
459 static inline struct tid_ampdu_tx *
460 rcu_dereference_protected_tid_tx(struct sta_info *sta, int tid)
461 {
462  return rcu_dereference_protected(sta->ampdu_mlme.tid_tx[tid],
463  lockdep_is_held(&sta->lock) ||
464  lockdep_is_held(&sta->ampdu_mlme.mtx));
465 }
466 
467 #define STA_HASH_SIZE 256
468 #define STA_HASH(sta) (sta[5])
469 
470 
471 /* Maximum number of frames to buffer per power saving station per AC */
472 #define STA_MAX_TX_BUFFER 64
473 
474 /* Minimum buffered frame expiry time. If STA uses listen interval that is
475  * smaller than this value, the minimum value here is used instead. */
476 #define STA_TX_BUFFER_EXPIRE (10 * HZ)
477 
478 /* How often station data is cleaned up (e.g., expiration of buffered frames)
479  */
480 #define STA_INFO_CLEANUP_INTERVAL (10 * HZ)
481 
482 /*
483  * Get a STA info, must be under RCU read lock.
484  */
486  const u8 *addr);
487 
489  const u8 *addr);
490 
491 static inline
492 void for_each_sta_info_type_check(struct ieee80211_local *local,
493  const u8 *addr,
494  struct sta_info *sta,
495  struct sta_info *nxt)
496 {
497 }
498 
499 #define for_each_sta_info(local, _addr, _sta, nxt) \
500  for ( /* initialise loop */ \
501  _sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
502  nxt = _sta ? rcu_dereference(_sta->hnext) : NULL; \
503  /* typecheck */ \
504  for_each_sta_info_type_check(local, (_addr), _sta, nxt),\
505  /* continue condition */ \
506  _sta; \
507  /* advance loop */ \
508  _sta = nxt, \
509  nxt = _sta ? rcu_dereference(_sta->hnext) : NULL \
510  ) \
511  /* compare address and run code only if it matches */ \
512  if (ether_addr_equal(_sta->sta.addr, (_addr)))
513 
514 /*
515  * Get STA info by index, BROKEN!
516  */
518  int idx);
519 /*
520  * Create a new STA info, caller owns returned structure
521  * until sta_info_insert().
522  */
524  const u8 *addr, gfp_t gfp);
525 
526 void sta_info_free(struct ieee80211_local *local, struct sta_info *sta);
527 
528 /*
529  * Insert STA info into hash table/list, returns zero or a
530  * -EEXIST if (if the same MAC address is already present).
531  *
532  * Calling the non-rcu version makes the caller relinquish,
533  * the _rcu version calls read_lock_rcu() and must be called
534  * without it held.
535  */
536 int sta_info_insert(struct sta_info *sta);
537 int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU);
538 
539 int __must_check __sta_info_destroy(struct sta_info *sta);
541  const u8 *addr);
543  const u8 *addr);
544 
545 void sta_info_recalc_tim(struct sta_info *sta);
546 
547 void sta_info_init(struct ieee80211_local *local);
548 void sta_info_stop(struct ieee80211_local *local);
550  struct ieee80211_sub_if_data *sdata);
551 void sta_set_rate_info_tx(struct sta_info *sta,
552  const struct ieee80211_tx_rate *rate,
553  struct rate_info *rinfo);
555  unsigned long exp_time);
556 
557 void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta);
559 void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta);
560 
561 #endif /* STA_INFO_H */