sta_info.c 17.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright 2002-2005, Instant802 Networks, Inc.
 * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
17
#include <linux/timer.h>
18
#include <linux/rtnetlink.h>
19 20 21 22 23

#include <net/mac80211.h>
#include "ieee80211_i.h"
#include "ieee80211_rate.h"
#include "sta_info.h"
J
Jiri Benc 已提交
24
#include "debugfs_sta.h"
25
#include "mesh.h"
26

27 28 29 30 31 32 33
/**
 * DOC: STA information lifetime rules
 *
 * STA info structures (&struct sta_info) are managed in a hash table
 * for faster lookup and a list for iteration. They are managed using
 * RCU, i.e. access to the list and hash table is protected by RCU.
 *
34 35 36 37 38 39
 * Upon allocating a STA info structure with sta_info_alloc(), the caller owns
 * that structure. It must then either destroy it using sta_info_destroy()
 * (which is pretty useless) or insert it into the hash table using
 * sta_info_insert() which demotes the reference from ownership to a regular
 * RCU-protected reference; if the function is called without protection by an
 * RCU critical section the reference is instantly invalidated.
40 41 42 43
 *
 * Because there are debugfs entries for each station, and adding those
 * must be able to sleep, it is also possible to "pin" a station entry,
 * that means it can be removed from the hash table but not be freed.
J
Johannes Berg 已提交
44
 * See the comment in __sta_info_unlink() for more information.
45 46
 *
 * In order to remove a STA info structure, the caller needs to first
J
Johannes Berg 已提交
47
 * unlink it (sta_info_unlink()) from the list and hash tables and
48 49
 * then wait for an RCU synchronisation before it can be freed. Due to
 * the pinning and the possibility of multiple callers trying to remove
J
Johannes Berg 已提交
50
 * the same STA info at the same time, sta_info_unlink() can clear the
51 52 53
 * STA info pointer it is passed to indicate that the STA info is owned
 * by somebody else now.
 *
J
Johannes Berg 已提交
54
 * If sta_info_unlink() did not clear the pointer then the caller owns
55
 * the STA info structure now and is responsible of destroying it with
J
Johannes Berg 已提交
56
 * a call to sta_info_destroy(), not before RCU synchronisation, of
57 58 59 60 61 62 63
 * course. Note that sta_info_destroy() must be protected by the RTNL.
 *
 * In all other cases, there is no concept of ownership on a STA entry,
 * each structure is owned by the global hash table/list until it is
 * removed. All users of the structure need to be RCU protected so that
 * the structure won't be freed before they are done using it.
 */
64 65

/* Caller must hold local->sta_lock */
66 67
static int sta_info_hash_del(struct ieee80211_local *local,
			     struct sta_info *sta)
68 69 70 71 72
{
	struct sta_info *s;

	s = local->sta_hash[STA_HASH(sta->addr)];
	if (!s)
73 74
		return -ENOENT;
	if (s == sta) {
75 76
		rcu_assign_pointer(local->sta_hash[STA_HASH(sta->addr)],
				   s->hnext);
77
		return 0;
78 79
	}

80
	while (s->hnext && s->hnext != sta)
81
		s = s->hnext;
82
	if (s->hnext) {
83
		rcu_assign_pointer(s->hnext, sta->hnext);
84 85
		return 0;
	}
86

87
	return -ENOENT;
88 89
}

90
/* protected by RCU */
91 92
static struct sta_info *__sta_info_find(struct ieee80211_local *local,
					u8 *addr)
93 94 95
{
	struct sta_info *sta;

96
	sta = rcu_dereference(local->sta_hash[STA_HASH(addr)]);
97
	while (sta) {
98
		if (compare_ether_addr(sta->addr, addr) == 0)
99
			break;
100
		sta = rcu_dereference(sta->hnext);
101
	}
102 103 104 105 106
	return sta;
}

struct sta_info *sta_info_get(struct ieee80211_local *local, u8 *addr)
{
107
	return __sta_info_find(local, addr);
108 109 110
}
EXPORT_SYMBOL(sta_info_get);

111 112 113 114 115 116
struct sta_info *sta_info_get_by_idx(struct ieee80211_local *local, int idx,
				     struct net_device *dev)
{
	struct sta_info *sta;
	int i = 0;

117
	list_for_each_entry_rcu(sta, &local->sta_list, list) {
118 119
		if (dev && dev != sta->sdata->dev)
			continue;
120 121 122 123
		if (i < idx) {
			++i;
			continue;
		}
124
		return sta;
125 126 127 128
	}

	return NULL;
}
129

130
void sta_info_destroy(struct sta_info *sta)
131 132 133
{
	struct ieee80211_local *local = sta->local;
	struct sk_buff *skb;
134
	int i;
J
Johannes Berg 已提交
135 136 137 138
	DECLARE_MAC_BUF(mbuf);

	if (!sta)
		return;
139

140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
	ASSERT_RTNL();
	might_sleep();

	rate_control_remove_sta_debugfs(sta);
	ieee80211_sta_debugfs_remove(sta);

#ifdef CONFIG_MAC80211_MESH
	if (ieee80211_vif_is_mesh(&sta->sdata->vif))
		mesh_plink_deactivate(sta);
#endif

	/*
	 * NOTE: This will call synchronize_rcu() internally to
	 * make sure no key references can be in use. We rely on
	 * that here for the mesh code!
	 */
	ieee80211_key_free(sta->key);
	WARN_ON(sta->key);

#ifdef CONFIG_MAC80211_MESH
	if (ieee80211_vif_is_mesh(&sta->sdata->vif))
		del_timer_sync(&sta->plink_timer);
#endif

164 165 166 167
	while ((skb = skb_dequeue(&sta->ps_tx_buf)) != NULL) {
		local->total_ps_buffered--;
		dev_kfree_skb_any(skb);
	}
168 169

	while ((skb = skb_dequeue(&sta->tx_filtered)) != NULL)
170
		dev_kfree_skb_any(skb);
171

172
	for (i = 0; i <  STA_TID_NUM; i++) {
173 174 175 176 177 178 179 180
		spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
		if (sta->ampdu_mlme.tid_rx[i])
		  del_timer_sync(&sta->ampdu_mlme.tid_rx[i]->session_timer);
		spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
		spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
		if (sta->ampdu_mlme.tid_tx[i])
		  del_timer_sync(&sta->ampdu_mlme.tid_tx[i]->addba_resp_timer);
		spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
181
	}
182

183 184
	rate_control_free_sta(sta->rate_ctrl, sta->rate_ctrl_priv);
	rate_control_put(sta->rate_ctrl);
185

J
Johannes Berg 已提交
186 187 188 189 190
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
	printk(KERN_DEBUG "%s: Destroyed STA %s\n",
	       wiphy_name(local->hw.wiphy), print_mac(mbuf, sta->addr));
#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */

191 192 193 194
	kfree(sta);
}


195 196 197
/* Caller must hold local->sta_lock */
static void sta_info_hash_add(struct ieee80211_local *local,
			      struct sta_info *sta)
198
{
199 200
	sta->hnext = local->sta_hash[STA_HASH(sta->addr)];
	rcu_assign_pointer(local->sta_hash[STA_HASH(sta->addr)], sta);
201 202
}

J
Johannes Berg 已提交
203 204
struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
				u8 *addr, gfp_t gfp)
205
{
206
	struct ieee80211_local *local = sdata->local;
207
	struct sta_info *sta;
208
	int i;
J
Johannes Berg 已提交
209
	DECLARE_MAC_BUF(mbuf);
210

J
Johannes Berg 已提交
211
	sta = kzalloc(sizeof(*sta), gfp);
212
	if (!sta)
J
Johannes Berg 已提交
213
		return NULL;
214

215 216 217
	memcpy(sta->addr, addr, ETH_ALEN);
	sta->local = local;
	sta->sdata = sdata;
218 219

	sta->rate_ctrl = rate_control_get(local->rate_ctrl);
220
	sta->rate_ctrl_priv = rate_control_alloc_sta(sta->rate_ctrl,
J
Johannes Berg 已提交
221
						     gfp);
222 223 224
	if (!sta->rate_ctrl_priv) {
		rate_control_put(sta->rate_ctrl);
		kfree(sta);
J
Johannes Berg 已提交
225
		return NULL;
226 227
	}

228
	spin_lock_init(&sta->ampdu_mlme.ampdu_rx);
229
	spin_lock_init(&sta->ampdu_mlme.ampdu_tx);
230 231 232 233 234
	for (i = 0; i < STA_TID_NUM; i++) {
		/* timer_to_tid must be initialized with identity mapping to
		 * enable session_timer's data differentiation. refer to
		 * sta_rx_agg_session_timer_expired for useage */
		sta->timer_to_tid[i] = i;
235 236
		/* tid to tx queue: initialize according to HW (0 is valid) */
		sta->tid_to_tx_q[i] = local->hw.queues;
237 238 239 240 241 242 243
		/* rx */
		sta->ampdu_mlme.tid_state_rx[i] = HT_AGG_STATE_IDLE;
		sta->ampdu_mlme.tid_rx[i] = NULL;
		/* tx */
		sta->ampdu_mlme.tid_state_tx[i] = HT_AGG_STATE_IDLE;
		sta->ampdu_mlme.tid_tx[i] = NULL;
		sta->ampdu_mlme.addba_req_num[i] = 0;
244
	}
245 246
	skb_queue_head_init(&sta->ps_tx_buf);
	skb_queue_head_init(&sta->tx_filtered);
J
Johannes Berg 已提交
247 248 249 250 251 252

#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
	printk(KERN_DEBUG "%s: Allocated STA %s\n",
	       wiphy_name(local->hw.wiphy), print_mac(mbuf, sta->addr));
#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */

253
#ifdef CONFIG_MAC80211_MESH
254
	sta->plink_state = PLINK_LISTEN;
255 256 257 258
	spin_lock_init(&sta->plink_lock);
	init_timer(&sta->plink_timer);
#endif

J
Johannes Berg 已提交
259 260 261 262 263 264 265 266 267 268
	return sta;
}

int sta_info_insert(struct sta_info *sta)
{
	struct ieee80211_local *local = sta->local;
	struct ieee80211_sub_if_data *sdata = sta->sdata;
	unsigned long flags;
	DECLARE_MAC_BUF(mac);

269 270 271 272 273 274 275 276 277 278 279 280 281
	/*
	 * Can't be a WARN_ON because it can be triggered through a race:
	 * something inserts a STA (on one CPU) without holding the RTNL
	 * and another CPU turns off the net device.
	 */
	if (unlikely(!netif_running(sdata->dev)))
		return -ENETDOWN;

	if (WARN_ON(compare_ether_addr(sta->addr, sdata->dev->dev_addr) == 0))
		return -EINVAL;

	if (WARN_ON(is_multicast_ether_addr(sta->addr)))
		return -EINVAL;
282

283
	spin_lock_irqsave(&local->sta_lock, flags);
284
	/* check if STA exists already */
J
Johannes Berg 已提交
285
	if (__sta_info_find(local, sta->addr)) {
286
		spin_unlock_irqrestore(&local->sta_lock, flags);
J
Johannes Berg 已提交
287
		return -EEXIST;
288
	}
289 290 291
	list_add(&sta->list, &local->sta_list);
	local->num_sta++;
	sta_info_hash_add(local, sta);
292

293 294
	/* notify driver */
	if (local->ops->sta_notify) {
295
		if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN)
296 297 298
			sdata = sdata->u.vlan.ap;

		local->ops->sta_notify(local_to_hw(local), &sdata->vif,
J
Johannes Berg 已提交
299
				       STA_NOTIFY_ADD, sta->addr);
300
	}
301

302
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
J
Johannes Berg 已提交
303 304
	printk(KERN_DEBUG "%s: Inserted STA %s\n",
	       wiphy_name(local->hw.wiphy), print_mac(mac, sta->addr));
305 306
#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */

J
Johannes Berg 已提交
307 308
	spin_unlock_irqrestore(&local->sta_lock, flags);

J
Jiri Benc 已提交
309
#ifdef CONFIG_MAC80211_DEBUGFS
310 311 312 313
	/* debugfs entry adding might sleep, so schedule process
	 * context task for adding entry for STAs that do not yet
	 * have one. */
	queue_work(local->hw.workqueue, &local->sta_debugfs_add);
J
Jiri Benc 已提交
314 315
#endif

J
Johannes Berg 已提交
316 317 318 319
	if (ieee80211_vif_is_mesh(&sdata->vif))
		mesh_accept_plinks_update(sdata);

	return 0;
320 321
}

322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
static inline void __bss_tim_set(struct ieee80211_if_ap *bss, u16 aid)
{
	/*
	 * This format has been mandated by the IEEE specifications,
	 * so this line may not be changed to use the __set_bit() format.
	 */
	bss->tim[aid / 8] |= (1 << (aid % 8));
}

static inline void __bss_tim_clear(struct ieee80211_if_ap *bss, u16 aid)
{
	/*
	 * This format has been mandated by the IEEE specifications,
	 * so this line may not be changed to use the __clear_bit() format.
	 */
	bss->tim[aid / 8] &= ~(1 << (aid % 8));
}

static void __sta_info_set_tim_bit(struct ieee80211_if_ap *bss,
				   struct sta_info *sta)
{
	if (bss)
		__bss_tim_set(bss, sta->aid);
345 346
	if (sta->local->ops->set_tim) {
		sta->local->tim_in_locked_section = true;
347
		sta->local->ops->set_tim(local_to_hw(sta->local), sta->aid, 1);
348 349
		sta->local->tim_in_locked_section = false;
	}
350 351 352 353
}

void sta_info_set_tim_bit(struct sta_info *sta)
{
354
	unsigned long flags;
355

356 357 358
	spin_lock_irqsave(&sta->local->sta_lock, flags);
	__sta_info_set_tim_bit(sta->sdata->bss, sta);
	spin_unlock_irqrestore(&sta->local->sta_lock, flags);
359 360 361 362 363 364 365
}

static void __sta_info_clear_tim_bit(struct ieee80211_if_ap *bss,
				     struct sta_info *sta)
{
	if (bss)
		__bss_tim_clear(bss, sta->aid);
366 367
	if (sta->local->ops->set_tim) {
		sta->local->tim_in_locked_section = true;
368
		sta->local->ops->set_tim(local_to_hw(sta->local), sta->aid, 0);
369 370
		sta->local->tim_in_locked_section = false;
	}
371 372 373 374
}

void sta_info_clear_tim_bit(struct sta_info *sta)
{
375
	unsigned long flags;
376

377 378 379
	spin_lock_irqsave(&sta->local->sta_lock, flags);
	__sta_info_clear_tim_bit(sta->sdata->bss, sta);
	spin_unlock_irqrestore(&sta->local->sta_lock, flags);
380 381
}

382 383 384 385 386
/*
 * See comment in __sta_info_unlink,
 * caller must hold local->sta_lock.
 */
static void __sta_info_pin(struct sta_info *sta)
387
{
388 389 390
	WARN_ON(sta->pin_status != STA_INFO_PIN_STAT_NORMAL);
	sta->pin_status = STA_INFO_PIN_STAT_PINNED;
}
391

392 393 394 395 396 397 398 399
/*
 * See comment in __sta_info_unlink, returns sta if it
 * needs to be destroyed.
 */
static struct sta_info *__sta_info_unpin(struct sta_info *sta)
{
	struct sta_info *ret = NULL;
	unsigned long flags;
400

401 402 403 404 405 406 407
	spin_lock_irqsave(&sta->local->sta_lock, flags);
	WARN_ON(sta->pin_status != STA_INFO_PIN_STAT_DESTROY &&
		sta->pin_status != STA_INFO_PIN_STAT_PINNED);
	if (sta->pin_status == STA_INFO_PIN_STAT_DESTROY)
		ret = sta;
	sta->pin_status = STA_INFO_PIN_STAT_NORMAL;
	spin_unlock_irqrestore(&sta->local->sta_lock, flags);
408

409
	return ret;
410 411
}

412
static void __sta_info_unlink(struct sta_info **sta)
413
{
414 415 416 417 418 419 420 421 422 423 424 425
	struct ieee80211_local *local = (*sta)->local;
	struct ieee80211_sub_if_data *sdata = (*sta)->sdata;
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
	DECLARE_MAC_BUF(mbuf);
#endif
	/*
	 * pull caller's reference if we're already gone.
	 */
	if (sta_info_hash_del(local, *sta)) {
		*sta = NULL;
		return;
	}
426

427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
	/*
	 * Also pull caller's reference if the STA is pinned by the
	 * task that is adding the debugfs entries. In that case, we
	 * leave the STA "to be freed".
	 *
	 * The rules are not trivial, but not too complex either:
	 *  (1) pin_status is only modified under the sta_lock
	 *  (2) sta_info_debugfs_add_work() will set the status
	 *	to PINNED when it found an item that needs a new
	 *	debugfs directory created. In that case, that item
	 *	must not be freed although all *RCU* users are done
	 *	with it. Hence, we tell the caller of _unlink()
	 *	that the item is already gone (as can happen when
	 *	two tasks try to unlink/destroy at the same time)
	 *  (3) We set the pin_status to DESTROY here when we
	 *	find such an item.
	 *  (4) sta_info_debugfs_add_work() will reset the pin_status
	 *	from PINNED to NORMAL when it is done with the item,
	 *	but will check for DESTROY before resetting it in
	 *	which case it will free the item.
	 */
	if ((*sta)->pin_status == STA_INFO_PIN_STAT_PINNED) {
		(*sta)->pin_status = STA_INFO_PIN_STAT_DESTROY;
		*sta = NULL;
		return;
	}
453

454
	list_del(&(*sta)->list);
455

456 457 458 459 460
	if ((*sta)->flags & WLAN_STA_PS) {
		(*sta)->flags &= ~WLAN_STA_PS;
		if (sdata->bss)
			atomic_dec(&sdata->bss->num_sta_ps);
		__sta_info_clear_tim_bit(sdata->bss, *sta);
461 462
	}

463
	local->num_sta--;
464

465
	if (local->ops->sta_notify) {
466
		if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN)
467 468 469
			sdata = sdata->u.vlan.ap;

		local->ops->sta_notify(local_to_hw(local), &sdata->vif,
470
				       STA_NOTIFY_REMOVE, (*sta)->addr);
471
	}
472

473 474 475 476 477 478
	if (ieee80211_vif_is_mesh(&sdata->vif)) {
		mesh_accept_plinks_update(sdata);
#ifdef CONFIG_MAC80211_MESH
		del_timer(&(*sta)->plink_timer);
#endif
	}
479

480 481 482 483
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
	printk(KERN_DEBUG "%s: Removed STA %s\n",
	       wiphy_name(local->hw.wiphy), print_mac(mbuf, (*sta)->addr));
#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
484 485
}

486 487 488 489 490 491 492 493 494
void sta_info_unlink(struct sta_info **sta)
{
	struct ieee80211_local *local = (*sta)->local;
	unsigned long flags;

	spin_lock_irqsave(&local->sta_lock, flags);
	__sta_info_unlink(sta);
	spin_unlock_irqrestore(&local->sta_lock, flags);
}
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521

static inline int sta_info_buffer_expired(struct ieee80211_local *local,
					  struct sta_info *sta,
					  struct sk_buff *skb)
{
	struct ieee80211_tx_packet_data *pkt_data;
	int timeout;

	if (!skb)
		return 0;

	pkt_data = (struct ieee80211_tx_packet_data *) skb->cb;

	/* Timeout: (2 * listen_interval * beacon_int * 1024 / 1000000) sec */
	timeout = (sta->listen_interval * local->hw.conf.beacon_int * 32 /
		   15625) * HZ;
	if (timeout < STA_TX_BUFFER_EXPIRE)
		timeout = STA_TX_BUFFER_EXPIRE;
	return time_after(jiffies, pkt_data->jiffies + timeout);
}


static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
					     struct sta_info *sta)
{
	unsigned long flags;
	struct sk_buff *skb;
522
	struct ieee80211_sub_if_data *sdata;
523
	DECLARE_MAC_BUF(mac);
524 525 526 527 528 529 530

	if (skb_queue_empty(&sta->ps_tx_buf))
		return;

	for (;;) {
		spin_lock_irqsave(&sta->ps_tx_buf.lock, flags);
		skb = skb_peek(&sta->ps_tx_buf);
531
		if (sta_info_buffer_expired(local, sta, skb))
532
			skb = __skb_dequeue(&sta->ps_tx_buf);
533
		else
534 535 536
			skb = NULL;
		spin_unlock_irqrestore(&sta->ps_tx_buf.lock, flags);

537
		if (!skb)
538
			break;
539

540
		sdata = sta->sdata;
541 542 543 544 545
		local->total_ps_buffered--;
		printk(KERN_DEBUG "Buffered frame expired (STA "
		       "%s)\n", print_mac(mac, sta->addr));
		dev_kfree_skb(skb);

546 547
		if (skb_queue_empty(&sta->ps_tx_buf))
			sta_info_clear_tim_bit(sta);
548 549 550 551 552 553 554 555 556
	}
}


static void sta_info_cleanup(unsigned long data)
{
	struct ieee80211_local *local = (struct ieee80211_local *) data;
	struct sta_info *sta;

557 558
	rcu_read_lock();
	list_for_each_entry_rcu(sta, &local->sta_list, list)
559
		sta_info_cleanup_expire_buffered(local, sta);
560
	rcu_read_unlock();
561

562 563
	local->sta_cleanup.expires =
		round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL);
564 565 566
	add_timer(&local->sta_cleanup);
}

J
Jiri Benc 已提交
567
#ifdef CONFIG_MAC80211_DEBUGFS
568
static void sta_info_debugfs_add_work(struct work_struct *work)
J
Jiri Benc 已提交
569 570 571 572
{
	struct ieee80211_local *local =
		container_of(work, struct ieee80211_local, sta_debugfs_add);
	struct sta_info *sta, *tmp;
573
	unsigned long flags;
J
Jiri Benc 已提交
574 575 576

	while (1) {
		sta = NULL;
577 578

		spin_lock_irqsave(&local->sta_lock, flags);
J
Jiri Benc 已提交
579
		list_for_each_entry(tmp, &local->sta_list, list) {
580
			if (!tmp->debugfs.dir) {
J
Jiri Benc 已提交
581
				sta = tmp;
582
				__sta_info_pin(sta);
J
Jiri Benc 已提交
583 584 585
				break;
			}
		}
586
		spin_unlock_irqrestore(&local->sta_lock, flags);
J
Jiri Benc 已提交
587 588 589 590 591 592

		if (!sta)
			break;

		ieee80211_sta_debugfs_add(sta);
		rate_control_add_sta_debugfs(sta);
593 594 595 596 597 598 599

		sta = __sta_info_unpin(sta);

		if (sta) {
			synchronize_rcu();
			sta_info_destroy(sta);
		}
J
Jiri Benc 已提交
600 601 602 603
	}
}
#endif

604 605
void sta_info_init(struct ieee80211_local *local)
{
606
	spin_lock_init(&local->sta_lock);
607 608
	INIT_LIST_HEAD(&local->sta_list);

609 610
	setup_timer(&local->sta_cleanup, sta_info_cleanup,
		    (unsigned long)local);
611 612
	local->sta_cleanup.expires =
		round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL);
J
Jiri Benc 已提交
613 614

#ifdef CONFIG_MAC80211_DEBUGFS
615
	INIT_WORK(&local->sta_debugfs_add, sta_info_debugfs_add_work);
J
Jiri Benc 已提交
616
#endif
617 618 619 620 621 622 623 624 625 626 627
}

int sta_info_start(struct ieee80211_local *local)
{
	add_timer(&local->sta_cleanup);
	return 0;
}

void sta_info_stop(struct ieee80211_local *local)
{
	del_timer(&local->sta_cleanup);
628
	sta_info_flush(local, NULL);
629 630 631 632
}

/**
 * sta_info_flush - flush matching STA entries from the STA table
633 634 635
 *
 * Returns the number of removed STA entries.
 *
636
 * @local: local interface data
637
 * @sdata: matching rule for the net device (sta->dev) or %NULL to match all STAs
638
 */
639
int sta_info_flush(struct ieee80211_local *local,
640
		    struct ieee80211_sub_if_data *sdata)
641 642
{
	struct sta_info *sta, *tmp;
643
	LIST_HEAD(tmp_list);
644
	int ret = 0;
645
	unsigned long flags;
646

647
	might_sleep();
648

649 650 651 652
	spin_lock_irqsave(&local->sta_lock, flags);
	list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
		if (!sdata || sdata == sta->sdata) {
			__sta_info_unlink(&sta);
653
			if (sta) {
654
				list_add_tail(&sta->list, &tmp_list);
655 656
				ret++;
			}
657
		}
658
	}
659 660 661 662 663 664
	spin_unlock_irqrestore(&local->sta_lock, flags);

	synchronize_rcu();

	list_for_each_entry_safe(sta, tmp, &tmp_list, list)
		sta_info_destroy(sta);
665 666

	return ret;
667
}