diff options
Diffstat (limited to 'net/mac80211/sta_info.c')
-rw-r--r-- | net/mac80211/sta_info.c | 777 |
1 files changed, 401 insertions, 376 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 71f370dd24bc..211c475f73c6 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -32,49 +32,33 @@ | |||
32 | * for faster lookup and a list for iteration. They are managed using | 32 | * for faster lookup and a list for iteration. They are managed using |
33 | * RCU, i.e. access to the list and hash table is protected by RCU. | 33 | * RCU, i.e. access to the list and hash table is protected by RCU. |
34 | * | 34 | * |
35 | * Upon allocating a STA info structure with sta_info_alloc(), the caller owns | 35 | * Upon allocating a STA info structure with sta_info_alloc(), the caller |
36 | * that structure. It must then either destroy it using sta_info_destroy() | 36 | * owns that structure. It must then insert it into the hash table using |
37 | * (which is pretty useless) or insert it into the hash table using | 37 | * either sta_info_insert() or sta_info_insert_rcu(); only in the latter |
38 | * sta_info_insert() which demotes the reference from ownership to a regular | 38 | * case (which acquires an rcu read section but must not be called from |
39 | * RCU-protected reference; if the function is called without protection by an | 39 | * within one) will the pointer still be valid after the call. Note that |
40 | * RCU critical section the reference is instantly invalidated. Note that the | 40 | * the caller may not do much with the STA info before inserting it, in |
41 | * caller may not do much with the STA info before inserting it, in particular, | 41 | * particular, it may not start any mesh peer link management or add |
42 | * it may not start any mesh peer link management or add encryption keys. | 42 | * encryption keys. |
43 | * | 43 | * |
44 | * When the insertion fails (sta_info_insert()) returns non-zero), the | 44 | * When the insertion fails (sta_info_insert()) returns non-zero), the |
45 | * structure will have been freed by sta_info_insert()! | 45 | * structure will have been freed by sta_info_insert()! |
46 | * | 46 | * |
47 | * sta entries are added by mac80211 when you establish a link with a | 47 | * Station entries are added by mac80211 when you establish a link with a |
48 | * peer. This means different things for the different type of interfaces | 48 | * peer. This means different things for the different type of interfaces |
49 | * we support. For a regular station this mean we add the AP sta when we | 49 | * we support. For a regular station this mean we add the AP sta when we |
50 | * receive an assocation response from the AP. For IBSS this occurs when | 50 | * receive an assocation response from the AP. For IBSS this occurs when |
51 | * we receive a probe response or a beacon from target IBSS network. For | 51 | * get to know about a peer on the same IBSS. For WDS we add the sta for |
52 | * WDS we add the sta for the peer imediately upon device open. When using | 52 | * the peer imediately upon device open. When using AP mode we add stations |
53 | * AP mode we add stations for each respective station upon request from | 53 | * for each respective station upon request from userspace through nl80211. |
54 | * userspace through nl80211. | ||
55 | * | 54 | * |
56 | * Because there are debugfs entries for each station, and adding those | 55 | * In order to remove a STA info structure, various sta_info_destroy_*() |
57 | * must be able to sleep, it is also possible to "pin" a station entry, | 56 | * calls are available. |
58 | * that means it can be removed from the hash table but not be freed. | ||
59 | * See the comment in __sta_info_unlink() for more information, this is | ||
60 | * an internal capability only. | ||
61 | * | 57 | * |
62 | * In order to remove a STA info structure, the caller needs to first | 58 | * There is no concept of ownership on a STA entry, each structure is |
63 | * unlink it (sta_info_unlink()) from the list and hash tables and | 59 | * owned by the global hash table/list until it is removed. All users of |
64 | * then destroy it; sta_info_destroy() will wait for an RCU grace period | 60 | * the structure need to be RCU protected so that the structure won't be |
65 | * to elapse before actually freeing it. Due to the pinning and the | 61 | * freed before they are done using it. |
66 | * possibility of multiple callers trying to remove the same STA info at | ||
67 | * the same time, sta_info_unlink() can clear the STA info pointer it is | ||
68 | * passed to indicate that the STA info is owned by somebody else now. | ||
69 | * | ||
70 | * If sta_info_unlink() did not clear the pointer then the caller owns | ||
71 | * the STA info structure now and is responsible of destroying it with | ||
72 | * a call to sta_info_destroy(). | ||
73 | * | ||
74 | * In all other cases, there is no concept of ownership on a STA entry, | ||
75 | * each structure is owned by the global hash table/list until it is | ||
76 | * removed. All users of the structure need to be RCU protected so that | ||
77 | * the structure won't be freed before they are done using it. | ||
78 | */ | 62 | */ |
79 | 63 | ||
80 | /* Caller must hold local->sta_lock */ | 64 | /* Caller must hold local->sta_lock */ |
@@ -103,13 +87,37 @@ static int sta_info_hash_del(struct ieee80211_local *local, | |||
103 | } | 87 | } |
104 | 88 | ||
105 | /* protected by RCU */ | 89 | /* protected by RCU */ |
106 | struct sta_info *sta_info_get(struct ieee80211_local *local, const u8 *addr) | 90 | struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata, |
91 | const u8 *addr) | ||
107 | { | 92 | { |
93 | struct ieee80211_local *local = sdata->local; | ||
108 | struct sta_info *sta; | 94 | struct sta_info *sta; |
109 | 95 | ||
110 | sta = rcu_dereference(local->sta_hash[STA_HASH(addr)]); | 96 | sta = rcu_dereference(local->sta_hash[STA_HASH(addr)]); |
111 | while (sta) { | 97 | while (sta) { |
112 | if (memcmp(sta->sta.addr, addr, ETH_ALEN) == 0) | 98 | if (sta->sdata == sdata && |
99 | memcmp(sta->sta.addr, addr, ETH_ALEN) == 0) | ||
100 | break; | ||
101 | sta = rcu_dereference(sta->hnext); | ||
102 | } | ||
103 | return sta; | ||
104 | } | ||
105 | |||
106 | /* | ||
107 | * Get sta info either from the specified interface | ||
108 | * or from one of its vlans | ||
109 | */ | ||
110 | struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata, | ||
111 | const u8 *addr) | ||
112 | { | ||
113 | struct ieee80211_local *local = sdata->local; | ||
114 | struct sta_info *sta; | ||
115 | |||
116 | sta = rcu_dereference(local->sta_hash[STA_HASH(addr)]); | ||
117 | while (sta) { | ||
118 | if ((sta->sdata == sdata || | ||
119 | sta->sdata->bss == sdata->bss) && | ||
120 | memcmp(sta->sta.addr, addr, ETH_ALEN) == 0) | ||
113 | break; | 121 | break; |
114 | sta = rcu_dereference(sta->hnext); | 122 | sta = rcu_dereference(sta->hnext); |
115 | } | 123 | } |
@@ -161,101 +169,6 @@ static void __sta_info_free(struct ieee80211_local *local, | |||
161 | kfree(sta); | 169 | kfree(sta); |
162 | } | 170 | } |
163 | 171 | ||
164 | void sta_info_destroy(struct sta_info *sta) | ||
165 | { | ||
166 | struct ieee80211_local *local; | ||
167 | struct sk_buff *skb; | ||
168 | int i; | ||
169 | |||
170 | might_sleep(); | ||
171 | |||
172 | if (!sta) | ||
173 | return; | ||
174 | |||
175 | local = sta->local; | ||
176 | |||
177 | cancel_work_sync(&sta->drv_unblock_wk); | ||
178 | |||
179 | rate_control_remove_sta_debugfs(sta); | ||
180 | ieee80211_sta_debugfs_remove(sta); | ||
181 | |||
182 | #ifdef CONFIG_MAC80211_MESH | ||
183 | if (ieee80211_vif_is_mesh(&sta->sdata->vif)) | ||
184 | mesh_plink_deactivate(sta); | ||
185 | #endif | ||
186 | |||
187 | /* | ||
188 | * We have only unlinked the key, and actually destroying it | ||
189 | * may mean it is removed from hardware which requires that | ||
190 | * the key->sta pointer is still valid, so flush the key todo | ||
191 | * list here. | ||
192 | * | ||
193 | * ieee80211_key_todo() will synchronize_rcu() so after this | ||
194 | * nothing can reference this sta struct any more. | ||
195 | */ | ||
196 | ieee80211_key_todo(); | ||
197 | |||
198 | #ifdef CONFIG_MAC80211_MESH | ||
199 | if (ieee80211_vif_is_mesh(&sta->sdata->vif)) | ||
200 | del_timer_sync(&sta->plink_timer); | ||
201 | #endif | ||
202 | |||
203 | while ((skb = skb_dequeue(&sta->ps_tx_buf)) != NULL) { | ||
204 | local->total_ps_buffered--; | ||
205 | dev_kfree_skb_any(skb); | ||
206 | } | ||
207 | |||
208 | while ((skb = skb_dequeue(&sta->tx_filtered)) != NULL) | ||
209 | dev_kfree_skb_any(skb); | ||
210 | |||
211 | for (i = 0; i < STA_TID_NUM; i++) { | ||
212 | struct tid_ampdu_rx *tid_rx; | ||
213 | struct tid_ampdu_tx *tid_tx; | ||
214 | |||
215 | spin_lock_bh(&sta->lock); | ||
216 | tid_rx = sta->ampdu_mlme.tid_rx[i]; | ||
217 | /* Make sure timer won't free the tid_rx struct, see below */ | ||
218 | if (tid_rx) | ||
219 | tid_rx->shutdown = true; | ||
220 | |||
221 | spin_unlock_bh(&sta->lock); | ||
222 | |||
223 | /* | ||
224 | * Outside spinlock - shutdown is true now so that the timer | ||
225 | * won't free tid_rx, we have to do that now. Can't let the | ||
226 | * timer do it because we have to sync the timer outside the | ||
227 | * lock that it takes itself. | ||
228 | */ | ||
229 | if (tid_rx) { | ||
230 | del_timer_sync(&tid_rx->session_timer); | ||
231 | kfree(tid_rx); | ||
232 | } | ||
233 | |||
234 | /* | ||
235 | * No need to do such complications for TX agg sessions, the | ||
236 | * path leading to freeing the tid_tx struct goes via a call | ||
237 | * from the driver, and thus needs to look up the sta struct | ||
238 | * again, which cannot be found when we get here. Hence, we | ||
239 | * just need to delete the timer and free the aggregation | ||
240 | * info; we won't be telling the peer about it then but that | ||
241 | * doesn't matter if we're not talking to it again anyway. | ||
242 | */ | ||
243 | tid_tx = sta->ampdu_mlme.tid_tx[i]; | ||
244 | if (tid_tx) { | ||
245 | del_timer_sync(&tid_tx->addba_resp_timer); | ||
246 | /* | ||
247 | * STA removed while aggregation session being | ||
248 | * started? Bit odd, but purge frames anyway. | ||
249 | */ | ||
250 | skb_queue_purge(&tid_tx->pending); | ||
251 | kfree(tid_tx); | ||
252 | } | ||
253 | } | ||
254 | |||
255 | __sta_info_free(local, sta); | ||
256 | } | ||
257 | |||
258 | |||
259 | /* Caller must hold local->sta_lock */ | 172 | /* Caller must hold local->sta_lock */ |
260 | static void sta_info_hash_add(struct ieee80211_local *local, | 173 | static void sta_info_hash_add(struct ieee80211_local *local, |
261 | struct sta_info *sta) | 174 | struct sta_info *sta) |
@@ -352,7 +265,93 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, | |||
352 | return sta; | 265 | return sta; |
353 | } | 266 | } |
354 | 267 | ||
355 | int sta_info_insert(struct sta_info *sta) | 268 | static int sta_info_finish_insert(struct sta_info *sta, bool async) |
269 | { | ||
270 | struct ieee80211_local *local = sta->local; | ||
271 | struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
272 | struct station_info sinfo; | ||
273 | unsigned long flags; | ||
274 | int err = 0; | ||
275 | |||
276 | WARN_ON(!mutex_is_locked(&local->sta_mtx)); | ||
277 | |||
278 | /* notify driver */ | ||
279 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
280 | sdata = container_of(sdata->bss, | ||
281 | struct ieee80211_sub_if_data, | ||
282 | u.ap); | ||
283 | err = drv_sta_add(local, sdata, &sta->sta); | ||
284 | if (err) { | ||
285 | if (!async) | ||
286 | return err; | ||
287 | printk(KERN_DEBUG "%s: failed to add IBSS STA %pM to driver (%d)" | ||
288 | " - keeping it anyway.\n", | ||
289 | sdata->name, sta->sta.addr, err); | ||
290 | } else { | ||
291 | sta->uploaded = true; | ||
292 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
293 | if (async) | ||
294 | printk(KERN_DEBUG "%s: Finished adding IBSS STA %pM\n", | ||
295 | wiphy_name(local->hw.wiphy), sta->sta.addr); | ||
296 | #endif | ||
297 | } | ||
298 | |||
299 | sdata = sta->sdata; | ||
300 | |||
301 | if (!async) { | ||
302 | local->num_sta++; | ||
303 | local->sta_generation++; | ||
304 | smp_mb(); | ||
305 | |||
306 | /* make the station visible */ | ||
307 | spin_lock_irqsave(&local->sta_lock, flags); | ||
308 | sta_info_hash_add(local, sta); | ||
309 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
310 | } | ||
311 | |||
312 | list_add(&sta->list, &local->sta_list); | ||
313 | |||
314 | ieee80211_sta_debugfs_add(sta); | ||
315 | rate_control_add_sta_debugfs(sta); | ||
316 | |||
317 | sinfo.filled = 0; | ||
318 | sinfo.generation = local->sta_generation; | ||
319 | cfg80211_new_sta(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL); | ||
320 | |||
321 | |||
322 | return 0; | ||
323 | } | ||
324 | |||
325 | static void sta_info_finish_pending(struct ieee80211_local *local) | ||
326 | { | ||
327 | struct sta_info *sta; | ||
328 | unsigned long flags; | ||
329 | |||
330 | spin_lock_irqsave(&local->sta_lock, flags); | ||
331 | while (!list_empty(&local->sta_pending_list)) { | ||
332 | sta = list_first_entry(&local->sta_pending_list, | ||
333 | struct sta_info, list); | ||
334 | list_del(&sta->list); | ||
335 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
336 | |||
337 | sta_info_finish_insert(sta, true); | ||
338 | |||
339 | spin_lock_irqsave(&local->sta_lock, flags); | ||
340 | } | ||
341 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
342 | } | ||
343 | |||
344 | static void sta_info_finish_work(struct work_struct *work) | ||
345 | { | ||
346 | struct ieee80211_local *local = | ||
347 | container_of(work, struct ieee80211_local, sta_finish_work); | ||
348 | |||
349 | mutex_lock(&local->sta_mtx); | ||
350 | sta_info_finish_pending(local); | ||
351 | mutex_unlock(&local->sta_mtx); | ||
352 | } | ||
353 | |||
354 | int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU) | ||
356 | { | 355 | { |
357 | struct ieee80211_local *local = sta->local; | 356 | struct ieee80211_local *local = sta->local; |
358 | struct ieee80211_sub_if_data *sdata = sta->sdata; | 357 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
@@ -364,38 +363,89 @@ int sta_info_insert(struct sta_info *sta) | |||
364 | * something inserts a STA (on one CPU) without holding the RTNL | 363 | * something inserts a STA (on one CPU) without holding the RTNL |
365 | * and another CPU turns off the net device. | 364 | * and another CPU turns off the net device. |
366 | */ | 365 | */ |
367 | if (unlikely(!netif_running(sdata->dev))) { | 366 | if (unlikely(!ieee80211_sdata_running(sdata))) { |
368 | err = -ENETDOWN; | 367 | err = -ENETDOWN; |
368 | rcu_read_lock(); | ||
369 | goto out_free; | 369 | goto out_free; |
370 | } | 370 | } |
371 | 371 | ||
372 | if (WARN_ON(compare_ether_addr(sta->sta.addr, sdata->dev->dev_addr) == 0 || | 372 | if (WARN_ON(compare_ether_addr(sta->sta.addr, sdata->vif.addr) == 0 || |
373 | is_multicast_ether_addr(sta->sta.addr))) { | 373 | is_multicast_ether_addr(sta->sta.addr))) { |
374 | err = -EINVAL; | 374 | err = -EINVAL; |
375 | rcu_read_lock(); | ||
375 | goto out_free; | 376 | goto out_free; |
376 | } | 377 | } |
377 | 378 | ||
379 | /* | ||
380 | * In ad-hoc mode, we sometimes need to insert stations | ||
381 | * from tasklet context from the RX path. To avoid races, | ||
382 | * always do so in that case -- see the comment below. | ||
383 | */ | ||
384 | if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { | ||
385 | spin_lock_irqsave(&local->sta_lock, flags); | ||
386 | /* check if STA exists already */ | ||
387 | if (sta_info_get_bss(sdata, sta->sta.addr)) { | ||
388 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
389 | rcu_read_lock(); | ||
390 | err = -EEXIST; | ||
391 | goto out_free; | ||
392 | } | ||
393 | |||
394 | local->num_sta++; | ||
395 | local->sta_generation++; | ||
396 | smp_mb(); | ||
397 | sta_info_hash_add(local, sta); | ||
398 | |||
399 | list_add_tail(&sta->list, &local->sta_pending_list); | ||
400 | |||
401 | rcu_read_lock(); | ||
402 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
403 | |||
404 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
405 | printk(KERN_DEBUG "%s: Added IBSS STA %pM\n", | ||
406 | wiphy_name(local->hw.wiphy), sta->sta.addr); | ||
407 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
408 | |||
409 | ieee80211_queue_work(&local->hw, &local->sta_finish_work); | ||
410 | |||
411 | return 0; | ||
412 | } | ||
413 | |||
414 | /* | ||
415 | * On first glance, this will look racy, because the code | ||
416 | * below this point, which inserts a station with sleeping, | ||
417 | * unlocks the sta_lock between checking existence in the | ||
418 | * hash table and inserting into it. | ||
419 | * | ||
420 | * However, it is not racy against itself because it keeps | ||
421 | * the mutex locked. It still seems to race against the | ||
422 | * above code that atomically inserts the station... That, | ||
423 | * however, is not true because the above code can only | ||
424 | * be invoked for IBSS interfaces, and the below code will | ||
425 | * not be -- and the two do not race against each other as | ||
426 | * the hash table also keys off the interface. | ||
427 | */ | ||
428 | |||
429 | might_sleep(); | ||
430 | |||
431 | mutex_lock(&local->sta_mtx); | ||
432 | |||
378 | spin_lock_irqsave(&local->sta_lock, flags); | 433 | spin_lock_irqsave(&local->sta_lock, flags); |
379 | /* check if STA exists already */ | 434 | /* check if STA exists already */ |
380 | if (sta_info_get(local, sta->sta.addr)) { | 435 | if (sta_info_get_bss(sdata, sta->sta.addr)) { |
381 | spin_unlock_irqrestore(&local->sta_lock, flags); | 436 | spin_unlock_irqrestore(&local->sta_lock, flags); |
437 | rcu_read_lock(); | ||
382 | err = -EEXIST; | 438 | err = -EEXIST; |
383 | goto out_free; | 439 | goto out_free; |
384 | } | 440 | } |
385 | list_add(&sta->list, &local->sta_list); | ||
386 | local->sta_generation++; | ||
387 | local->num_sta++; | ||
388 | sta_info_hash_add(local, sta); | ||
389 | 441 | ||
390 | /* notify driver */ | 442 | spin_unlock_irqrestore(&local->sta_lock, flags); |
391 | if (local->ops->sta_notify) { | ||
392 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
393 | sdata = container_of(sdata->bss, | ||
394 | struct ieee80211_sub_if_data, | ||
395 | u.ap); | ||
396 | 443 | ||
397 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_ADD, &sta->sta); | 444 | err = sta_info_finish_insert(sta, false); |
398 | sdata = sta->sdata; | 445 | if (err) { |
446 | mutex_unlock(&local->sta_mtx); | ||
447 | rcu_read_lock(); | ||
448 | goto out_free; | ||
399 | } | 449 | } |
400 | 450 | ||
401 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 451 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
@@ -403,18 +453,9 @@ int sta_info_insert(struct sta_info *sta) | |||
403 | wiphy_name(local->hw.wiphy), sta->sta.addr); | 453 | wiphy_name(local->hw.wiphy), sta->sta.addr); |
404 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | 454 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ |
405 | 455 | ||
406 | spin_unlock_irqrestore(&local->sta_lock, flags); | 456 | /* move reference to rcu-protected */ |
407 | 457 | rcu_read_lock(); | |
408 | #ifdef CONFIG_MAC80211_DEBUGFS | 458 | mutex_unlock(&local->sta_mtx); |
409 | /* | ||
410 | * Debugfs entry adding might sleep, so schedule process | ||
411 | * context task for adding entry for STAs that do not yet | ||
412 | * have one. | ||
413 | * NOTE: due to auto-freeing semantics this may only be done | ||
414 | * if the insertion is successful! | ||
415 | */ | ||
416 | schedule_work(&local->sta_debugfs_add); | ||
417 | #endif | ||
418 | 459 | ||
419 | if (ieee80211_vif_is_mesh(&sdata->vif)) | 460 | if (ieee80211_vif_is_mesh(&sdata->vif)) |
420 | mesh_accept_plinks_update(sdata); | 461 | mesh_accept_plinks_update(sdata); |
@@ -426,6 +467,15 @@ int sta_info_insert(struct sta_info *sta) | |||
426 | return err; | 467 | return err; |
427 | } | 468 | } |
428 | 469 | ||
470 | int sta_info_insert(struct sta_info *sta) | ||
471 | { | ||
472 | int err = sta_info_insert_rcu(sta); | ||
473 | |||
474 | rcu_read_unlock(); | ||
475 | |||
476 | return err; | ||
477 | } | ||
478 | |||
429 | static inline void __bss_tim_set(struct ieee80211_if_ap *bss, u16 aid) | 479 | static inline void __bss_tim_set(struct ieee80211_if_ap *bss, u16 aid) |
430 | { | 480 | { |
431 | /* | 481 | /* |
@@ -494,108 +544,6 @@ void sta_info_clear_tim_bit(struct sta_info *sta) | |||
494 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); | 544 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); |
495 | } | 545 | } |
496 | 546 | ||
497 | static void __sta_info_unlink(struct sta_info **sta) | ||
498 | { | ||
499 | struct ieee80211_local *local = (*sta)->local; | ||
500 | struct ieee80211_sub_if_data *sdata = (*sta)->sdata; | ||
501 | /* | ||
502 | * pull caller's reference if we're already gone. | ||
503 | */ | ||
504 | if (sta_info_hash_del(local, *sta)) { | ||
505 | *sta = NULL; | ||
506 | return; | ||
507 | } | ||
508 | |||
509 | if ((*sta)->key) { | ||
510 | ieee80211_key_free((*sta)->key); | ||
511 | WARN_ON((*sta)->key); | ||
512 | } | ||
513 | |||
514 | list_del(&(*sta)->list); | ||
515 | (*sta)->dead = true; | ||
516 | |||
517 | if (test_and_clear_sta_flags(*sta, | ||
518 | WLAN_STA_PS_STA | WLAN_STA_PS_DRIVER)) { | ||
519 | BUG_ON(!sdata->bss); | ||
520 | |||
521 | atomic_dec(&sdata->bss->num_sta_ps); | ||
522 | __sta_info_clear_tim_bit(sdata->bss, *sta); | ||
523 | } | ||
524 | |||
525 | local->num_sta--; | ||
526 | local->sta_generation++; | ||
527 | |||
528 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
529 | rcu_assign_pointer(sdata->u.vlan.sta, NULL); | ||
530 | |||
531 | if (local->ops->sta_notify) { | ||
532 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
533 | sdata = container_of(sdata->bss, | ||
534 | struct ieee80211_sub_if_data, | ||
535 | u.ap); | ||
536 | |||
537 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE, | ||
538 | &(*sta)->sta); | ||
539 | sdata = (*sta)->sdata; | ||
540 | } | ||
541 | |||
542 | if (ieee80211_vif_is_mesh(&sdata->vif)) { | ||
543 | mesh_accept_plinks_update(sdata); | ||
544 | #ifdef CONFIG_MAC80211_MESH | ||
545 | del_timer(&(*sta)->plink_timer); | ||
546 | #endif | ||
547 | } | ||
548 | |||
549 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
550 | printk(KERN_DEBUG "%s: Removed STA %pM\n", | ||
551 | wiphy_name(local->hw.wiphy), (*sta)->sta.addr); | ||
552 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
553 | |||
554 | /* | ||
555 | * Finally, pull caller's reference if the STA is pinned by the | ||
556 | * task that is adding the debugfs entries. In that case, we | ||
557 | * leave the STA "to be freed". | ||
558 | * | ||
559 | * The rules are not trivial, but not too complex either: | ||
560 | * (1) pin_status is only modified under the sta_lock | ||
561 | * (2) STAs may only be pinned under the RTNL so that | ||
562 | * sta_info_flush() is guaranteed to actually destroy | ||
563 | * all STAs that are active for a given interface, this | ||
564 | * is required for correctness because otherwise we | ||
565 | * could notify a driver that an interface is going | ||
566 | * away and only after that (!) notify it about a STA | ||
567 | * on that interface going away. | ||
568 | * (3) sta_info_debugfs_add_work() will set the status | ||
569 | * to PINNED when it found an item that needs a new | ||
570 | * debugfs directory created. In that case, that item | ||
571 | * must not be freed although all *RCU* users are done | ||
572 | * with it. Hence, we tell the caller of _unlink() | ||
573 | * that the item is already gone (as can happen when | ||
574 | * two tasks try to unlink/destroy at the same time) | ||
575 | * (4) We set the pin_status to DESTROY here when we | ||
576 | * find such an item. | ||
577 | * (5) sta_info_debugfs_add_work() will reset the pin_status | ||
578 | * from PINNED to NORMAL when it is done with the item, | ||
579 | * but will check for DESTROY before resetting it in | ||
580 | * which case it will free the item. | ||
581 | */ | ||
582 | if ((*sta)->pin_status == STA_INFO_PIN_STAT_PINNED) { | ||
583 | (*sta)->pin_status = STA_INFO_PIN_STAT_DESTROY; | ||
584 | *sta = NULL; | ||
585 | return; | ||
586 | } | ||
587 | } | ||
588 | |||
589 | void sta_info_unlink(struct sta_info **sta) | ||
590 | { | ||
591 | struct ieee80211_local *local = (*sta)->local; | ||
592 | unsigned long flags; | ||
593 | |||
594 | spin_lock_irqsave(&local->sta_lock, flags); | ||
595 | __sta_info_unlink(sta); | ||
596 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
597 | } | ||
598 | |||
599 | static int sta_info_buffer_expired(struct sta_info *sta, | 547 | static int sta_info_buffer_expired(struct sta_info *sta, |
600 | struct sk_buff *skb) | 548 | struct sk_buff *skb) |
601 | { | 549 | { |
@@ -652,109 +600,209 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local, | |||
652 | } | 600 | } |
653 | } | 601 | } |
654 | 602 | ||
655 | 603 | static int __must_check __sta_info_destroy(struct sta_info *sta) | |
656 | static void sta_info_cleanup(unsigned long data) | ||
657 | { | 604 | { |
658 | struct ieee80211_local *local = (struct ieee80211_local *) data; | 605 | struct ieee80211_local *local; |
659 | struct sta_info *sta; | 606 | struct ieee80211_sub_if_data *sdata; |
607 | struct sk_buff *skb; | ||
608 | unsigned long flags; | ||
609 | int ret, i; | ||
660 | 610 | ||
661 | rcu_read_lock(); | 611 | might_sleep(); |
662 | list_for_each_entry_rcu(sta, &local->sta_list, list) | ||
663 | sta_info_cleanup_expire_buffered(local, sta); | ||
664 | rcu_read_unlock(); | ||
665 | 612 | ||
666 | if (local->quiescing) | 613 | if (!sta) |
667 | return; | 614 | return -ENOENT; |
668 | 615 | ||
669 | local->sta_cleanup.expires = | 616 | local = sta->local; |
670 | round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL); | 617 | sdata = sta->sdata; |
671 | add_timer(&local->sta_cleanup); | ||
672 | } | ||
673 | 618 | ||
674 | #ifdef CONFIG_MAC80211_DEBUGFS | 619 | spin_lock_irqsave(&local->sta_lock, flags); |
675 | /* | 620 | ret = sta_info_hash_del(local, sta); |
676 | * See comment in __sta_info_unlink, | 621 | /* this might still be the pending list ... which is fine */ |
677 | * caller must hold local->sta_lock. | 622 | if (!ret) |
678 | */ | 623 | list_del(&sta->list); |
679 | static void __sta_info_pin(struct sta_info *sta) | 624 | spin_unlock_irqrestore(&local->sta_lock, flags); |
680 | { | 625 | if (ret) |
681 | WARN_ON(sta->pin_status != STA_INFO_PIN_STAT_NORMAL); | 626 | return ret; |
682 | sta->pin_status = STA_INFO_PIN_STAT_PINNED; | 627 | |
628 | if (sta->key) { | ||
629 | ieee80211_key_free(sta->key); | ||
630 | /* | ||
631 | * We have only unlinked the key, and actually destroying it | ||
632 | * may mean it is removed from hardware which requires that | ||
633 | * the key->sta pointer is still valid, so flush the key todo | ||
634 | * list here. | ||
635 | * | ||
636 | * ieee80211_key_todo() will synchronize_rcu() so after this | ||
637 | * nothing can reference this sta struct any more. | ||
638 | */ | ||
639 | ieee80211_key_todo(); | ||
640 | |||
641 | WARN_ON(sta->key); | ||
642 | } | ||
643 | |||
644 | sta->dead = true; | ||
645 | |||
646 | if (test_and_clear_sta_flags(sta, | ||
647 | WLAN_STA_PS_STA | WLAN_STA_PS_DRIVER)) { | ||
648 | BUG_ON(!sdata->bss); | ||
649 | |||
650 | atomic_dec(&sdata->bss->num_sta_ps); | ||
651 | __sta_info_clear_tim_bit(sdata->bss, sta); | ||
652 | } | ||
653 | |||
654 | local->num_sta--; | ||
655 | local->sta_generation++; | ||
656 | |||
657 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
658 | rcu_assign_pointer(sdata->u.vlan.sta, NULL); | ||
659 | |||
660 | if (sta->uploaded) { | ||
661 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
662 | sdata = container_of(sdata->bss, | ||
663 | struct ieee80211_sub_if_data, | ||
664 | u.ap); | ||
665 | drv_sta_remove(local, sdata, &sta->sta); | ||
666 | sdata = sta->sdata; | ||
667 | } | ||
668 | |||
669 | #ifdef CONFIG_MAC80211_MESH | ||
670 | if (ieee80211_vif_is_mesh(&sdata->vif)) { | ||
671 | mesh_accept_plinks_update(sdata); | ||
672 | del_timer(&sta->plink_timer); | ||
673 | } | ||
674 | #endif | ||
675 | |||
676 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
677 | printk(KERN_DEBUG "%s: Removed STA %pM\n", | ||
678 | wiphy_name(local->hw.wiphy), sta->sta.addr); | ||
679 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
680 | cancel_work_sync(&sta->drv_unblock_wk); | ||
681 | |||
682 | rate_control_remove_sta_debugfs(sta); | ||
683 | ieee80211_sta_debugfs_remove(sta); | ||
684 | |||
685 | #ifdef CONFIG_MAC80211_MESH | ||
686 | if (ieee80211_vif_is_mesh(&sta->sdata->vif)) { | ||
687 | mesh_plink_deactivate(sta); | ||
688 | del_timer_sync(&sta->plink_timer); | ||
689 | } | ||
690 | #endif | ||
691 | |||
692 | while ((skb = skb_dequeue(&sta->ps_tx_buf)) != NULL) { | ||
693 | local->total_ps_buffered--; | ||
694 | dev_kfree_skb_any(skb); | ||
695 | } | ||
696 | |||
697 | while ((skb = skb_dequeue(&sta->tx_filtered)) != NULL) | ||
698 | dev_kfree_skb_any(skb); | ||
699 | |||
700 | for (i = 0; i < STA_TID_NUM; i++) { | ||
701 | struct tid_ampdu_rx *tid_rx; | ||
702 | struct tid_ampdu_tx *tid_tx; | ||
703 | |||
704 | spin_lock_bh(&sta->lock); | ||
705 | tid_rx = sta->ampdu_mlme.tid_rx[i]; | ||
706 | /* Make sure timer won't free the tid_rx struct, see below */ | ||
707 | if (tid_rx) | ||
708 | tid_rx->shutdown = true; | ||
709 | |||
710 | spin_unlock_bh(&sta->lock); | ||
711 | |||
712 | /* | ||
713 | * Outside spinlock - shutdown is true now so that the timer | ||
714 | * won't free tid_rx, we have to do that now. Can't let the | ||
715 | * timer do it because we have to sync the timer outside the | ||
716 | * lock that it takes itself. | ||
717 | */ | ||
718 | if (tid_rx) { | ||
719 | del_timer_sync(&tid_rx->session_timer); | ||
720 | kfree(tid_rx); | ||
721 | } | ||
722 | |||
723 | /* | ||
724 | * No need to do such complications for TX agg sessions, the | ||
725 | * path leading to freeing the tid_tx struct goes via a call | ||
726 | * from the driver, and thus needs to look up the sta struct | ||
727 | * again, which cannot be found when we get here. Hence, we | ||
728 | * just need to delete the timer and free the aggregation | ||
729 | * info; we won't be telling the peer about it then but that | ||
730 | * doesn't matter if we're not talking to it again anyway. | ||
731 | */ | ||
732 | tid_tx = sta->ampdu_mlme.tid_tx[i]; | ||
733 | if (tid_tx) { | ||
734 | del_timer_sync(&tid_tx->addba_resp_timer); | ||
735 | /* | ||
736 | * STA removed while aggregation session being | ||
737 | * started? Bit odd, but purge frames anyway. | ||
738 | */ | ||
739 | skb_queue_purge(&tid_tx->pending); | ||
740 | kfree(tid_tx); | ||
741 | } | ||
742 | } | ||
743 | |||
744 | __sta_info_free(local, sta); | ||
745 | |||
746 | return 0; | ||
683 | } | 747 | } |
684 | 748 | ||
685 | /* | 749 | int sta_info_destroy_addr(struct ieee80211_sub_if_data *sdata, const u8 *addr) |
686 | * See comment in __sta_info_unlink, returns sta if it | ||
687 | * needs to be destroyed. | ||
688 | */ | ||
689 | static struct sta_info *__sta_info_unpin(struct sta_info *sta) | ||
690 | { | 750 | { |
691 | struct sta_info *ret = NULL; | 751 | struct sta_info *sta; |
692 | unsigned long flags; | 752 | int ret; |
693 | 753 | ||
694 | spin_lock_irqsave(&sta->local->sta_lock, flags); | 754 | mutex_lock(&sdata->local->sta_mtx); |
695 | WARN_ON(sta->pin_status != STA_INFO_PIN_STAT_DESTROY && | 755 | sta = sta_info_get(sdata, addr); |
696 | sta->pin_status != STA_INFO_PIN_STAT_PINNED); | 756 | ret = __sta_info_destroy(sta); |
697 | if (sta->pin_status == STA_INFO_PIN_STAT_DESTROY) | 757 | mutex_unlock(&sdata->local->sta_mtx); |
698 | ret = sta; | ||
699 | sta->pin_status = STA_INFO_PIN_STAT_NORMAL; | ||
700 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); | ||
701 | 758 | ||
702 | return ret; | 759 | return ret; |
703 | } | 760 | } |
704 | 761 | ||
705 | static void sta_info_debugfs_add_work(struct work_struct *work) | 762 | int sta_info_destroy_addr_bss(struct ieee80211_sub_if_data *sdata, |
763 | const u8 *addr) | ||
706 | { | 764 | { |
707 | struct ieee80211_local *local = | 765 | struct sta_info *sta; |
708 | container_of(work, struct ieee80211_local, sta_debugfs_add); | 766 | int ret; |
709 | struct sta_info *sta, *tmp; | ||
710 | unsigned long flags; | ||
711 | 767 | ||
712 | /* We need to keep the RTNL across the whole pinned status. */ | 768 | mutex_lock(&sdata->local->sta_mtx); |
713 | rtnl_lock(); | 769 | sta = sta_info_get_bss(sdata, addr); |
714 | while (1) { | 770 | ret = __sta_info_destroy(sta); |
715 | sta = NULL; | 771 | mutex_unlock(&sdata->local->sta_mtx); |
716 | 772 | ||
717 | spin_lock_irqsave(&local->sta_lock, flags); | 773 | return ret; |
718 | list_for_each_entry(tmp, &local->sta_list, list) { | 774 | } |
719 | /* | ||
720 | * debugfs.add_has_run will be set by | ||
721 | * ieee80211_sta_debugfs_add regardless | ||
722 | * of what else it does. | ||
723 | */ | ||
724 | if (!tmp->debugfs.add_has_run) { | ||
725 | sta = tmp; | ||
726 | __sta_info_pin(sta); | ||
727 | break; | ||
728 | } | ||
729 | } | ||
730 | spin_unlock_irqrestore(&local->sta_lock, flags); | ||
731 | 775 | ||
732 | if (!sta) | 776 | static void sta_info_cleanup(unsigned long data) |
733 | break; | 777 | { |
778 | struct ieee80211_local *local = (struct ieee80211_local *) data; | ||
779 | struct sta_info *sta; | ||
734 | 780 | ||
735 | ieee80211_sta_debugfs_add(sta); | 781 | rcu_read_lock(); |
736 | rate_control_add_sta_debugfs(sta); | 782 | list_for_each_entry_rcu(sta, &local->sta_list, list) |
783 | sta_info_cleanup_expire_buffered(local, sta); | ||
784 | rcu_read_unlock(); | ||
737 | 785 | ||
738 | sta = __sta_info_unpin(sta); | 786 | if (local->quiescing) |
739 | sta_info_destroy(sta); | 787 | return; |
740 | } | 788 | |
741 | rtnl_unlock(); | 789 | local->sta_cleanup.expires = |
790 | round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL); | ||
791 | add_timer(&local->sta_cleanup); | ||
742 | } | 792 | } |
743 | #endif | ||
744 | 793 | ||
745 | void sta_info_init(struct ieee80211_local *local) | 794 | void sta_info_init(struct ieee80211_local *local) |
746 | { | 795 | { |
747 | spin_lock_init(&local->sta_lock); | 796 | spin_lock_init(&local->sta_lock); |
797 | mutex_init(&local->sta_mtx); | ||
748 | INIT_LIST_HEAD(&local->sta_list); | 798 | INIT_LIST_HEAD(&local->sta_list); |
799 | INIT_LIST_HEAD(&local->sta_pending_list); | ||
800 | INIT_WORK(&local->sta_finish_work, sta_info_finish_work); | ||
749 | 801 | ||
750 | setup_timer(&local->sta_cleanup, sta_info_cleanup, | 802 | setup_timer(&local->sta_cleanup, sta_info_cleanup, |
751 | (unsigned long)local); | 803 | (unsigned long)local); |
752 | local->sta_cleanup.expires = | 804 | local->sta_cleanup.expires = |
753 | round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL); | 805 | round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL); |
754 | |||
755 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
756 | INIT_WORK(&local->sta_debugfs_add, sta_info_debugfs_add_work); | ||
757 | #endif | ||
758 | } | 806 | } |
759 | 807 | ||
760 | int sta_info_start(struct ieee80211_local *local) | 808 | int sta_info_start(struct ieee80211_local *local) |
@@ -766,16 +814,6 @@ int sta_info_start(struct ieee80211_local *local) | |||
766 | void sta_info_stop(struct ieee80211_local *local) | 814 | void sta_info_stop(struct ieee80211_local *local) |
767 | { | 815 | { |
768 | del_timer(&local->sta_cleanup); | 816 | del_timer(&local->sta_cleanup); |
769 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
770 | /* | ||
771 | * Make sure the debugfs adding work isn't pending after this | ||
772 | * because we're about to be destroyed. It doesn't matter | ||
773 | * whether it ran or not since we're going to flush all STAs | ||
774 | * anyway. | ||
775 | */ | ||
776 | cancel_work_sync(&local->sta_debugfs_add); | ||
777 | #endif | ||
778 | |||
779 | sta_info_flush(local, NULL); | 817 | sta_info_flush(local, NULL); |
780 | } | 818 | } |
781 | 819 | ||
@@ -791,26 +829,19 @@ int sta_info_flush(struct ieee80211_local *local, | |||
791 | struct ieee80211_sub_if_data *sdata) | 829 | struct ieee80211_sub_if_data *sdata) |
792 | { | 830 | { |
793 | struct sta_info *sta, *tmp; | 831 | struct sta_info *sta, *tmp; |
794 | LIST_HEAD(tmp_list); | ||
795 | int ret = 0; | 832 | int ret = 0; |
796 | unsigned long flags; | ||
797 | 833 | ||
798 | might_sleep(); | 834 | might_sleep(); |
799 | 835 | ||
800 | spin_lock_irqsave(&local->sta_lock, flags); | 836 | mutex_lock(&local->sta_mtx); |
837 | |||
838 | sta_info_finish_pending(local); | ||
839 | |||
801 | list_for_each_entry_safe(sta, tmp, &local->sta_list, list) { | 840 | list_for_each_entry_safe(sta, tmp, &local->sta_list, list) { |
802 | if (!sdata || sdata == sta->sdata) { | 841 | if (!sdata || sdata == sta->sdata) |
803 | __sta_info_unlink(&sta); | 842 | WARN_ON(__sta_info_destroy(sta)); |
804 | if (sta) { | ||
805 | list_add_tail(&sta->list, &tmp_list); | ||
806 | ret++; | ||
807 | } | ||
808 | } | ||
809 | } | 843 | } |
810 | spin_unlock_irqrestore(&local->sta_lock, flags); | 844 | mutex_unlock(&local->sta_mtx); |
811 | |||
812 | list_for_each_entry_safe(sta, tmp, &tmp_list, list) | ||
813 | sta_info_destroy(sta); | ||
814 | 845 | ||
815 | return ret; | 846 | return ret; |
816 | } | 847 | } |
@@ -820,34 +851,28 @@ void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata, | |||
820 | { | 851 | { |
821 | struct ieee80211_local *local = sdata->local; | 852 | struct ieee80211_local *local = sdata->local; |
822 | struct sta_info *sta, *tmp; | 853 | struct sta_info *sta, *tmp; |
823 | LIST_HEAD(tmp_list); | ||
824 | unsigned long flags; | ||
825 | 854 | ||
826 | spin_lock_irqsave(&local->sta_lock, flags); | 855 | mutex_lock(&local->sta_mtx); |
827 | list_for_each_entry_safe(sta, tmp, &local->sta_list, list) | 856 | list_for_each_entry_safe(sta, tmp, &local->sta_list, list) |
828 | if (time_after(jiffies, sta->last_rx + exp_time)) { | 857 | if (time_after(jiffies, sta->last_rx + exp_time)) { |
829 | #ifdef CONFIG_MAC80211_IBSS_DEBUG | 858 | #ifdef CONFIG_MAC80211_IBSS_DEBUG |
830 | printk(KERN_DEBUG "%s: expiring inactive STA %pM\n", | 859 | printk(KERN_DEBUG "%s: expiring inactive STA %pM\n", |
831 | sdata->dev->name, sta->sta.addr); | 860 | sdata->name, sta->sta.addr); |
832 | #endif | 861 | #endif |
833 | __sta_info_unlink(&sta); | 862 | WARN_ON(__sta_info_destroy(sta)); |
834 | if (sta) | ||
835 | list_add(&sta->list, &tmp_list); | ||
836 | } | 863 | } |
837 | spin_unlock_irqrestore(&local->sta_lock, flags); | 864 | mutex_unlock(&local->sta_mtx); |
838 | |||
839 | list_for_each_entry_safe(sta, tmp, &tmp_list, list) | ||
840 | sta_info_destroy(sta); | ||
841 | } | 865 | } |
842 | 866 | ||
843 | struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw, | 867 | struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw, |
844 | const u8 *addr) | 868 | const u8 *addr) |
845 | { | 869 | { |
846 | struct sta_info *sta = sta_info_get(hw_to_local(hw), addr); | 870 | struct sta_info *sta, *nxt; |
847 | 871 | ||
848 | if (!sta) | 872 | /* Just return a random station ... first in list ... */ |
849 | return NULL; | 873 | for_each_sta_info(hw_to_local(hw), addr, sta, nxt) |
850 | return &sta->sta; | 874 | return &sta->sta; |
875 | return NULL; | ||
851 | } | 876 | } |
852 | EXPORT_SYMBOL_GPL(ieee80211_find_sta_by_hw); | 877 | EXPORT_SYMBOL_GPL(ieee80211_find_sta_by_hw); |
853 | 878 | ||
@@ -872,7 +897,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
872 | struct ieee80211_local *local = sdata->local; | 897 | struct ieee80211_local *local = sdata->local; |
873 | int sent, buffered; | 898 | int sent, buffered; |
874 | 899 | ||
875 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_AWAKE, &sta->sta); | 900 | drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); |
876 | 901 | ||
877 | if (!skb_queue_empty(&sta->ps_tx_buf)) | 902 | if (!skb_queue_empty(&sta->ps_tx_buf)) |
878 | sta_info_clear_tim_bit(sta); | 903 | sta_info_clear_tim_bit(sta); |
@@ -885,7 +910,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
885 | 910 | ||
886 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 911 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
887 | printk(KERN_DEBUG "%s: STA %pM aid %d sending %d filtered/%d PS frames " | 912 | printk(KERN_DEBUG "%s: STA %pM aid %d sending %d filtered/%d PS frames " |
888 | "since STA not sleeping anymore\n", sdata->dev->name, | 913 | "since STA not sleeping anymore\n", sdata->name, |
889 | sta->sta.addr, sta->sta.aid, sent - buffered, buffered); | 914 | sta->sta.addr, sta->sta.aid, sent - buffered, buffered); |
890 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | 915 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ |
891 | } | 916 | } |
@@ -944,7 +969,7 @@ void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta) | |||
944 | */ | 969 | */ |
945 | printk(KERN_DEBUG "%s: STA %pM sent PS Poll even " | 970 | printk(KERN_DEBUG "%s: STA %pM sent PS Poll even " |
946 | "though there are no buffered frames for it\n", | 971 | "though there are no buffered frames for it\n", |
947 | sdata->dev->name, sta->sta.addr); | 972 | sdata->name, sta->sta.addr); |
948 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | 973 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ |
949 | } | 974 | } |
950 | } | 975 | } |