diff options
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 1167 |
1 files changed, 596 insertions, 571 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index c80d5899f279..0fbadd8b983c 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -38,23 +38,12 @@ | |||
38 | 38 | ||
39 | /* misc utils */ | 39 | /* misc utils */ |
40 | 40 | ||
41 | static inline void ieee80211_include_sequence(struct ieee80211_sub_if_data *sdata, | ||
42 | struct ieee80211_hdr *hdr) | ||
43 | { | ||
44 | /* Set the sequence number for this frame. */ | ||
45 | hdr->seq_ctrl = cpu_to_le16(sdata->sequence); | ||
46 | |||
47 | /* Increase the sequence number. */ | ||
48 | sdata->sequence = (sdata->sequence + 0x10) & IEEE80211_SCTL_SEQ; | ||
49 | } | ||
50 | |||
51 | #ifdef CONFIG_MAC80211_LOWTX_FRAME_DUMP | 41 | #ifdef CONFIG_MAC80211_LOWTX_FRAME_DUMP |
52 | static void ieee80211_dump_frame(const char *ifname, const char *title, | 42 | static void ieee80211_dump_frame(const char *ifname, const char *title, |
53 | const struct sk_buff *skb) | 43 | const struct sk_buff *skb) |
54 | { | 44 | { |
55 | const struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 45 | const struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
56 | u16 fc; | 46 | unsigned int hdrlen; |
57 | int hdrlen; | ||
58 | DECLARE_MAC_BUF(mac); | 47 | DECLARE_MAC_BUF(mac); |
59 | 48 | ||
60 | printk(KERN_DEBUG "%s: %s (len=%d)", ifname, title, skb->len); | 49 | printk(KERN_DEBUG "%s: %s (len=%d)", ifname, title, skb->len); |
@@ -63,13 +52,12 @@ static void ieee80211_dump_frame(const char *ifname, const char *title, | |||
63 | return; | 52 | return; |
64 | } | 53 | } |
65 | 54 | ||
66 | fc = le16_to_cpu(hdr->frame_control); | 55 | hdrlen = ieee80211_hdrlen(hdr->frame_control); |
67 | hdrlen = ieee80211_get_hdrlen(fc); | ||
68 | if (hdrlen > skb->len) | 56 | if (hdrlen > skb->len) |
69 | hdrlen = skb->len; | 57 | hdrlen = skb->len; |
70 | if (hdrlen >= 4) | 58 | if (hdrlen >= 4) |
71 | printk(" FC=0x%04x DUR=0x%04x", | 59 | printk(" FC=0x%04x DUR=0x%04x", |
72 | fc, le16_to_cpu(hdr->duration_id)); | 60 | le16_to_cpu(hdr->frame_control), le16_to_cpu(hdr->duration_id)); |
73 | if (hdrlen >= 10) | 61 | if (hdrlen >= 10) |
74 | printk(" A1=%s", print_mac(mac, hdr->addr1)); | 62 | printk(" A1=%s", print_mac(mac, hdr->addr1)); |
75 | if (hdrlen >= 16) | 63 | if (hdrlen >= 16) |
@@ -87,15 +75,16 @@ static inline void ieee80211_dump_frame(const char *ifname, const char *title, | |||
87 | } | 75 | } |
88 | #endif /* CONFIG_MAC80211_LOWTX_FRAME_DUMP */ | 76 | #endif /* CONFIG_MAC80211_LOWTX_FRAME_DUMP */ |
89 | 77 | ||
90 | static u16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, | 78 | static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, |
91 | int next_frag_len) | 79 | int next_frag_len) |
92 | { | 80 | { |
93 | int rate, mrate, erp, dur, i; | 81 | int rate, mrate, erp, dur, i; |
94 | struct ieee80211_rate *txrate = tx->rate; | 82 | struct ieee80211_rate *txrate; |
95 | struct ieee80211_local *local = tx->local; | 83 | struct ieee80211_local *local = tx->local; |
96 | struct ieee80211_supported_band *sband; | 84 | struct ieee80211_supported_band *sband; |
97 | 85 | ||
98 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 86 | sband = local->hw.wiphy->bands[tx->channel->band]; |
87 | txrate = &sband->bitrates[tx->rate_idx]; | ||
99 | 88 | ||
100 | erp = 0; | 89 | erp = 0; |
101 | if (tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) | 90 | if (tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) |
@@ -139,7 +128,7 @@ static u16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, | |||
139 | 128 | ||
140 | /* data/mgmt */ | 129 | /* data/mgmt */ |
141 | if (0 /* FIX: data/mgmt during CFP */) | 130 | if (0 /* FIX: data/mgmt during CFP */) |
142 | return 32768; | 131 | return cpu_to_le16(32768); |
143 | 132 | ||
144 | if (group_addr) /* Group address as the destination - no ACK */ | 133 | if (group_addr) /* Group address as the destination - no ACK */ |
145 | return 0; | 134 | return 0; |
@@ -209,19 +198,7 @@ static u16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, | |||
209 | tx->sdata->bss_conf.use_short_preamble); | 198 | tx->sdata->bss_conf.use_short_preamble); |
210 | } | 199 | } |
211 | 200 | ||
212 | return dur; | 201 | return cpu_to_le16(dur); |
213 | } | ||
214 | |||
215 | static inline int __ieee80211_queue_stopped(const struct ieee80211_local *local, | ||
216 | int queue) | ||
217 | { | ||
218 | return test_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]); | ||
219 | } | ||
220 | |||
221 | static inline int __ieee80211_queue_pending(const struct ieee80211_local *local, | ||
222 | int queue) | ||
223 | { | ||
224 | return test_bit(IEEE80211_LINK_STATE_PENDING, &local->state[queue]); | ||
225 | } | 202 | } |
226 | 203 | ||
227 | static int inline is_ieee80211_device(struct net_device *dev, | 204 | static int inline is_ieee80211_device(struct net_device *dev, |
@@ -233,16 +210,16 @@ static int inline is_ieee80211_device(struct net_device *dev, | |||
233 | 210 | ||
234 | /* tx handlers */ | 211 | /* tx handlers */ |
235 | 212 | ||
236 | static ieee80211_tx_result | 213 | static ieee80211_tx_result debug_noinline |
237 | ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) | 214 | ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) |
238 | { | 215 | { |
239 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 216 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
240 | struct sk_buff *skb = tx->skb; | 217 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; |
241 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
242 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | 218 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ |
219 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
243 | u32 sta_flags; | 220 | u32 sta_flags; |
244 | 221 | ||
245 | if (unlikely(tx->flags & IEEE80211_TX_INJECTED)) | 222 | if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED)) |
246 | return TX_CONTINUE; | 223 | return TX_CONTINUE; |
247 | 224 | ||
248 | if (unlikely(tx->local->sta_sw_scanning) && | 225 | if (unlikely(tx->local->sta_sw_scanning) && |
@@ -256,7 +233,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) | |||
256 | if (tx->flags & IEEE80211_TX_PS_BUFFERED) | 233 | if (tx->flags & IEEE80211_TX_PS_BUFFERED) |
257 | return TX_CONTINUE; | 234 | return TX_CONTINUE; |
258 | 235 | ||
259 | sta_flags = tx->sta ? tx->sta->flags : 0; | 236 | sta_flags = tx->sta ? get_sta_flags(tx->sta) : 0; |
260 | 237 | ||
261 | if (likely(tx->flags & IEEE80211_TX_UNICAST)) { | 238 | if (likely(tx->flags & IEEE80211_TX_UNICAST)) { |
262 | if (unlikely(!(sta_flags & WLAN_STA_ASSOC) && | 239 | if (unlikely(!(sta_flags & WLAN_STA_ASSOC) && |
@@ -287,17 +264,6 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) | |||
287 | return TX_CONTINUE; | 264 | return TX_CONTINUE; |
288 | } | 265 | } |
289 | 266 | ||
290 | static ieee80211_tx_result | ||
291 | ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) | ||
292 | { | ||
293 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; | ||
294 | |||
295 | if (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)) >= 24) | ||
296 | ieee80211_include_sequence(tx->sdata, hdr); | ||
297 | |||
298 | return TX_CONTINUE; | ||
299 | } | ||
300 | |||
301 | /* This function is called whenever the AP is about to exceed the maximum limit | 267 | /* This function is called whenever the AP is about to exceed the maximum limit |
302 | * of buffered frames for power saving STAs. This situation should not really | 268 | * of buffered frames for power saving STAs. This situation should not really |
303 | * happen often during normal operation, so dropping the oldest buffered packet | 269 | * happen often during normal operation, so dropping the oldest buffered packet |
@@ -316,8 +282,7 @@ static void purge_old_ps_buffers(struct ieee80211_local *local) | |||
316 | 282 | ||
317 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { | 283 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { |
318 | struct ieee80211_if_ap *ap; | 284 | struct ieee80211_if_ap *ap; |
319 | if (sdata->dev == local->mdev || | 285 | if (sdata->vif.type != IEEE80211_IF_TYPE_AP) |
320 | sdata->vif.type != IEEE80211_IF_TYPE_AP) | ||
321 | continue; | 286 | continue; |
322 | ap = &sdata->u.ap; | 287 | ap = &sdata->u.ap; |
323 | skb = skb_dequeue(&ap->ps_bc_buf); | 288 | skb = skb_dequeue(&ap->ps_bc_buf); |
@@ -340,13 +305,17 @@ static void purge_old_ps_buffers(struct ieee80211_local *local) | |||
340 | rcu_read_unlock(); | 305 | rcu_read_unlock(); |
341 | 306 | ||
342 | local->total_ps_buffered = total; | 307 | local->total_ps_buffered = total; |
308 | #ifdef MAC80211_VERBOSE_PS_DEBUG | ||
343 | printk(KERN_DEBUG "%s: PS buffers full - purged %d frames\n", | 309 | printk(KERN_DEBUG "%s: PS buffers full - purged %d frames\n", |
344 | wiphy_name(local->hw.wiphy), purged); | 310 | wiphy_name(local->hw.wiphy), purged); |
311 | #endif | ||
345 | } | 312 | } |
346 | 313 | ||
347 | static ieee80211_tx_result | 314 | static ieee80211_tx_result |
348 | ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) | 315 | ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) |
349 | { | 316 | { |
317 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
318 | |||
350 | /* | 319 | /* |
351 | * broadcast/multicast frame | 320 | * broadcast/multicast frame |
352 | * | 321 | * |
@@ -355,8 +324,12 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) | |||
355 | * This is done either by the hardware or us. | 324 | * This is done either by the hardware or us. |
356 | */ | 325 | */ |
357 | 326 | ||
358 | /* not AP/IBSS or ordered frame */ | 327 | /* powersaving STAs only in AP/VLAN mode */ |
359 | if (!tx->sdata->bss || (tx->fc & IEEE80211_FCTL_ORDER)) | 328 | if (!tx->sdata->bss) |
329 | return TX_CONTINUE; | ||
330 | |||
331 | /* no buffering for ordered frames */ | ||
332 | if (tx->fc & IEEE80211_FCTL_ORDER) | ||
360 | return TX_CONTINUE; | 333 | return TX_CONTINUE; |
361 | 334 | ||
362 | /* no stations in PS mode */ | 335 | /* no stations in PS mode */ |
@@ -369,11 +342,13 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) | |||
369 | purge_old_ps_buffers(tx->local); | 342 | purge_old_ps_buffers(tx->local); |
370 | if (skb_queue_len(&tx->sdata->bss->ps_bc_buf) >= | 343 | if (skb_queue_len(&tx->sdata->bss->ps_bc_buf) >= |
371 | AP_MAX_BC_BUFFER) { | 344 | AP_MAX_BC_BUFFER) { |
345 | #ifdef MAC80211_VERBOSE_PS_DEBUG | ||
372 | if (net_ratelimit()) { | 346 | if (net_ratelimit()) { |
373 | printk(KERN_DEBUG "%s: BC TX buffer full - " | 347 | printk(KERN_DEBUG "%s: BC TX buffer full - " |
374 | "dropping the oldest frame\n", | 348 | "dropping the oldest frame\n", |
375 | tx->dev->name); | 349 | tx->dev->name); |
376 | } | 350 | } |
351 | #endif | ||
377 | dev_kfree_skb(skb_dequeue(&tx->sdata->bss->ps_bc_buf)); | 352 | dev_kfree_skb(skb_dequeue(&tx->sdata->bss->ps_bc_buf)); |
378 | } else | 353 | } else |
379 | tx->local->total_ps_buffered++; | 354 | tx->local->total_ps_buffered++; |
@@ -382,7 +357,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) | |||
382 | } | 357 | } |
383 | 358 | ||
384 | /* buffered in hardware */ | 359 | /* buffered in hardware */ |
385 | tx->control->flags |= IEEE80211_TXCTL_SEND_AFTER_DTIM; | 360 | info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM; |
386 | 361 | ||
387 | return TX_CONTINUE; | 362 | return TX_CONTINUE; |
388 | } | 363 | } |
@@ -391,6 +366,8 @@ static ieee80211_tx_result | |||
391 | ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | 366 | ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) |
392 | { | 367 | { |
393 | struct sta_info *sta = tx->sta; | 368 | struct sta_info *sta = tx->sta; |
369 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
370 | u32 staflags; | ||
394 | DECLARE_MAC_BUF(mac); | 371 | DECLARE_MAC_BUF(mac); |
395 | 372 | ||
396 | if (unlikely(!sta || | 373 | if (unlikely(!sta || |
@@ -398,9 +375,10 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
398 | (tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP))) | 375 | (tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP))) |
399 | return TX_CONTINUE; | 376 | return TX_CONTINUE; |
400 | 377 | ||
401 | if (unlikely((sta->flags & WLAN_STA_PS) && | 378 | staflags = get_sta_flags(sta); |
402 | !(sta->flags & WLAN_STA_PSPOLL))) { | 379 | |
403 | struct ieee80211_tx_packet_data *pkt_data; | 380 | if (unlikely((staflags & WLAN_STA_PS) && |
381 | !(staflags & WLAN_STA_PSPOLL))) { | ||
404 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 382 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
405 | printk(KERN_DEBUG "STA %s aid %d: PS buffer (entries " | 383 | printk(KERN_DEBUG "STA %s aid %d: PS buffer (entries " |
406 | "before %d)\n", | 384 | "before %d)\n", |
@@ -411,11 +389,13 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
411 | purge_old_ps_buffers(tx->local); | 389 | purge_old_ps_buffers(tx->local); |
412 | if (skb_queue_len(&sta->ps_tx_buf) >= STA_MAX_TX_BUFFER) { | 390 | if (skb_queue_len(&sta->ps_tx_buf) >= STA_MAX_TX_BUFFER) { |
413 | struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf); | 391 | struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf); |
392 | #ifdef MAC80211_VERBOSE_PS_DEBUG | ||
414 | if (net_ratelimit()) { | 393 | if (net_ratelimit()) { |
415 | printk(KERN_DEBUG "%s: STA %s TX " | 394 | printk(KERN_DEBUG "%s: STA %s TX " |
416 | "buffer full - dropping oldest frame\n", | 395 | "buffer full - dropping oldest frame\n", |
417 | tx->dev->name, print_mac(mac, sta->addr)); | 396 | tx->dev->name, print_mac(mac, sta->addr)); |
418 | } | 397 | } |
398 | #endif | ||
419 | dev_kfree_skb(old); | 399 | dev_kfree_skb(old); |
420 | } else | 400 | } else |
421 | tx->local->total_ps_buffered++; | 401 | tx->local->total_ps_buffered++; |
@@ -424,24 +404,23 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
424 | if (skb_queue_empty(&sta->ps_tx_buf)) | 404 | if (skb_queue_empty(&sta->ps_tx_buf)) |
425 | sta_info_set_tim_bit(sta); | 405 | sta_info_set_tim_bit(sta); |
426 | 406 | ||
427 | pkt_data = (struct ieee80211_tx_packet_data *)tx->skb->cb; | 407 | info->control.jiffies = jiffies; |
428 | pkt_data->jiffies = jiffies; | ||
429 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); | 408 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); |
430 | return TX_QUEUED; | 409 | return TX_QUEUED; |
431 | } | 410 | } |
432 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 411 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
433 | else if (unlikely(sta->flags & WLAN_STA_PS)) { | 412 | else if (unlikely(test_sta_flags(sta, WLAN_STA_PS))) { |
434 | printk(KERN_DEBUG "%s: STA %s in PS mode, but pspoll " | 413 | printk(KERN_DEBUG "%s: STA %s in PS mode, but pspoll " |
435 | "set -> send frame\n", tx->dev->name, | 414 | "set -> send frame\n", tx->dev->name, |
436 | print_mac(mac, sta->addr)); | 415 | print_mac(mac, sta->addr)); |
437 | } | 416 | } |
438 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | 417 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ |
439 | sta->flags &= ~WLAN_STA_PSPOLL; | 418 | clear_sta_flags(sta, WLAN_STA_PSPOLL); |
440 | 419 | ||
441 | return TX_CONTINUE; | 420 | return TX_CONTINUE; |
442 | } | 421 | } |
443 | 422 | ||
444 | static ieee80211_tx_result | 423 | static ieee80211_tx_result debug_noinline |
445 | ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx) | 424 | ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx) |
446 | { | 425 | { |
447 | if (unlikely(tx->flags & IEEE80211_TX_PS_BUFFERED)) | 426 | if (unlikely(tx->flags & IEEE80211_TX_PS_BUFFERED)) |
@@ -453,21 +432,22 @@ ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx) | |||
453 | return ieee80211_tx_h_multicast_ps_buf(tx); | 432 | return ieee80211_tx_h_multicast_ps_buf(tx); |
454 | } | 433 | } |
455 | 434 | ||
456 | static ieee80211_tx_result | 435 | static ieee80211_tx_result debug_noinline |
457 | ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) | 436 | ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) |
458 | { | 437 | { |
459 | struct ieee80211_key *key; | 438 | struct ieee80211_key *key; |
439 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
460 | u16 fc = tx->fc; | 440 | u16 fc = tx->fc; |
461 | 441 | ||
462 | if (unlikely(tx->control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) | 442 | if (unlikely(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT)) |
463 | tx->key = NULL; | 443 | tx->key = NULL; |
464 | else if (tx->sta && (key = rcu_dereference(tx->sta->key))) | 444 | else if (tx->sta && (key = rcu_dereference(tx->sta->key))) |
465 | tx->key = key; | 445 | tx->key = key; |
466 | else if ((key = rcu_dereference(tx->sdata->default_key))) | 446 | else if ((key = rcu_dereference(tx->sdata->default_key))) |
467 | tx->key = key; | 447 | tx->key = key; |
468 | else if (tx->sdata->drop_unencrypted && | 448 | else if (tx->sdata->drop_unencrypted && |
469 | !(tx->control->flags & IEEE80211_TXCTL_EAPOL_FRAME) && | 449 | !(info->flags & IEEE80211_TX_CTL_EAPOL_FRAME) && |
470 | !(tx->flags & IEEE80211_TX_INJECTED)) { | 450 | !(info->flags & IEEE80211_TX_CTL_INJECTED)) { |
471 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); | 451 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); |
472 | return TX_DROP; | 452 | return TX_DROP; |
473 | } else | 453 | } else |
@@ -496,15 +476,197 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) | |||
496 | } | 476 | } |
497 | 477 | ||
498 | if (!tx->key || !(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) | 478 | if (!tx->key || !(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) |
499 | tx->control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 479 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
500 | 480 | ||
501 | return TX_CONTINUE; | 481 | return TX_CONTINUE; |
502 | } | 482 | } |
503 | 483 | ||
504 | static ieee80211_tx_result | 484 | static ieee80211_tx_result debug_noinline |
485 | ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) | ||
486 | { | ||
487 | struct rate_selection rsel; | ||
488 | struct ieee80211_supported_band *sband; | ||
489 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
490 | |||
491 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | ||
492 | |||
493 | if (likely(tx->rate_idx < 0)) { | ||
494 | rate_control_get_rate(tx->dev, sband, tx->skb, &rsel); | ||
495 | tx->rate_idx = rsel.rate_idx; | ||
496 | if (unlikely(rsel.probe_idx >= 0)) { | ||
497 | info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
498 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
499 | info->control.alt_retry_rate_idx = tx->rate_idx; | ||
500 | tx->rate_idx = rsel.probe_idx; | ||
501 | } else | ||
502 | info->control.alt_retry_rate_idx = -1; | ||
503 | |||
504 | if (unlikely(tx->rate_idx < 0)) | ||
505 | return TX_DROP; | ||
506 | } else | ||
507 | info->control.alt_retry_rate_idx = -1; | ||
508 | |||
509 | if (tx->sdata->bss_conf.use_cts_prot && | ||
510 | (tx->flags & IEEE80211_TX_FRAGMENTED) && (rsel.nonerp_idx >= 0)) { | ||
511 | tx->last_frag_rate_idx = tx->rate_idx; | ||
512 | if (rsel.probe_idx >= 0) | ||
513 | tx->flags &= ~IEEE80211_TX_PROBE_LAST_FRAG; | ||
514 | else | ||
515 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
516 | tx->rate_idx = rsel.nonerp_idx; | ||
517 | info->tx_rate_idx = rsel.nonerp_idx; | ||
518 | info->flags &= ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
519 | } else { | ||
520 | tx->last_frag_rate_idx = tx->rate_idx; | ||
521 | info->tx_rate_idx = tx->rate_idx; | ||
522 | } | ||
523 | info->tx_rate_idx = tx->rate_idx; | ||
524 | |||
525 | return TX_CONTINUE; | ||
526 | } | ||
527 | |||
528 | static ieee80211_tx_result debug_noinline | ||
529 | ieee80211_tx_h_misc(struct ieee80211_tx_data *tx) | ||
530 | { | ||
531 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; | ||
532 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
533 | struct ieee80211_supported_band *sband; | ||
534 | |||
535 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | ||
536 | |||
537 | if (tx->sta) | ||
538 | info->control.aid = tx->sta->aid; | ||
539 | |||
540 | if (!info->control.retry_limit) { | ||
541 | if (!is_multicast_ether_addr(hdr->addr1)) { | ||
542 | int len = min_t(int, tx->skb->len + FCS_LEN, | ||
543 | tx->local->fragmentation_threshold); | ||
544 | if (len > tx->local->rts_threshold | ||
545 | && tx->local->rts_threshold < | ||
546 | IEEE80211_MAX_RTS_THRESHOLD) { | ||
547 | info->flags |= IEEE80211_TX_CTL_USE_RTS_CTS; | ||
548 | info->flags |= | ||
549 | IEEE80211_TX_CTL_LONG_RETRY_LIMIT; | ||
550 | info->control.retry_limit = | ||
551 | tx->local->long_retry_limit; | ||
552 | } else { | ||
553 | info->control.retry_limit = | ||
554 | tx->local->short_retry_limit; | ||
555 | } | ||
556 | } else { | ||
557 | info->control.retry_limit = 1; | ||
558 | } | ||
559 | } | ||
560 | |||
561 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | ||
562 | /* Do not use multiple retry rates when sending fragmented | ||
563 | * frames. | ||
564 | * TODO: The last fragment could still use multiple retry | ||
565 | * rates. */ | ||
566 | info->control.alt_retry_rate_idx = -1; | ||
567 | } | ||
568 | |||
569 | /* Use CTS protection for unicast frames sent using extended rates if | ||
570 | * there are associated non-ERP stations and RTS/CTS is not configured | ||
571 | * for the frame. */ | ||
572 | if ((tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) && | ||
573 | (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_ERP_G) && | ||
574 | (tx->flags & IEEE80211_TX_UNICAST) && | ||
575 | tx->sdata->bss_conf.use_cts_prot && | ||
576 | !(info->flags & IEEE80211_TX_CTL_USE_RTS_CTS)) | ||
577 | info->flags |= IEEE80211_TX_CTL_USE_CTS_PROTECT; | ||
578 | |||
579 | /* Transmit data frames using short preambles if the driver supports | ||
580 | * short preambles at the selected rate and short preambles are | ||
581 | * available on the network at the current point in time. */ | ||
582 | if (ieee80211_is_data(hdr->frame_control) && | ||
583 | (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) && | ||
584 | tx->sdata->bss_conf.use_short_preamble && | ||
585 | (!tx->sta || test_sta_flags(tx->sta, WLAN_STA_SHORT_PREAMBLE))) { | ||
586 | info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; | ||
587 | } | ||
588 | |||
589 | if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) || | ||
590 | (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) { | ||
591 | struct ieee80211_rate *rate; | ||
592 | s8 baserate = -1; | ||
593 | int idx; | ||
594 | |||
595 | /* Do not use multiple retry rates when using RTS/CTS */ | ||
596 | info->control.alt_retry_rate_idx = -1; | ||
597 | |||
598 | /* Use min(data rate, max base rate) as CTS/RTS rate */ | ||
599 | rate = &sband->bitrates[tx->rate_idx]; | ||
600 | |||
601 | for (idx = 0; idx < sband->n_bitrates; idx++) { | ||
602 | if (sband->bitrates[idx].bitrate > rate->bitrate) | ||
603 | continue; | ||
604 | if (tx->sdata->basic_rates & BIT(idx) && | ||
605 | (baserate < 0 || | ||
606 | (sband->bitrates[baserate].bitrate | ||
607 | < sband->bitrates[idx].bitrate))) | ||
608 | baserate = idx; | ||
609 | } | ||
610 | |||
611 | if (baserate >= 0) | ||
612 | info->control.rts_cts_rate_idx = baserate; | ||
613 | else | ||
614 | info->control.rts_cts_rate_idx = 0; | ||
615 | } | ||
616 | |||
617 | if (tx->sta) | ||
618 | info->control.aid = tx->sta->aid; | ||
619 | |||
620 | return TX_CONTINUE; | ||
621 | } | ||
622 | |||
623 | static ieee80211_tx_result debug_noinline | ||
624 | ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) | ||
625 | { | ||
626 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
627 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; | ||
628 | u16 *seq; | ||
629 | u8 *qc; | ||
630 | int tid; | ||
631 | |||
632 | /* only for injected frames */ | ||
633 | if (unlikely(ieee80211_is_ctl(hdr->frame_control))) | ||
634 | return TX_CONTINUE; | ||
635 | |||
636 | if (ieee80211_hdrlen(hdr->frame_control) < 24) | ||
637 | return TX_CONTINUE; | ||
638 | |||
639 | if (!ieee80211_is_data_qos(hdr->frame_control)) { | ||
640 | info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; | ||
641 | return TX_CONTINUE; | ||
642 | } | ||
643 | |||
644 | /* | ||
645 | * This should be true for injected/management frames only, for | ||
646 | * management frames we have set the IEEE80211_TX_CTL_ASSIGN_SEQ | ||
647 | * above since they are not QoS-data frames. | ||
648 | */ | ||
649 | if (!tx->sta) | ||
650 | return TX_CONTINUE; | ||
651 | |||
652 | /* include per-STA, per-TID sequence counter */ | ||
653 | |||
654 | qc = ieee80211_get_qos_ctl(hdr); | ||
655 | tid = *qc & IEEE80211_QOS_CTL_TID_MASK; | ||
656 | seq = &tx->sta->tid_seq[tid]; | ||
657 | |||
658 | hdr->seq_ctrl = cpu_to_le16(*seq); | ||
659 | |||
660 | /* Increase the sequence number. */ | ||
661 | *seq = (*seq + 0x10) & IEEE80211_SCTL_SEQ; | ||
662 | |||
663 | return TX_CONTINUE; | ||
664 | } | ||
665 | |||
666 | static ieee80211_tx_result debug_noinline | ||
505 | ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | 667 | ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) |
506 | { | 668 | { |
507 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | 669 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; |
508 | size_t hdrlen, per_fragm, num_fragm, payload_len, left; | 670 | size_t hdrlen, per_fragm, num_fragm, payload_len, left; |
509 | struct sk_buff **frags, *first, *frag; | 671 | struct sk_buff **frags, *first, *frag; |
510 | int i; | 672 | int i; |
@@ -515,9 +677,19 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
515 | if (!(tx->flags & IEEE80211_TX_FRAGMENTED)) | 677 | if (!(tx->flags & IEEE80211_TX_FRAGMENTED)) |
516 | return TX_CONTINUE; | 678 | return TX_CONTINUE; |
517 | 679 | ||
680 | /* | ||
681 | * Warn when submitting a fragmented A-MPDU frame and drop it. | ||
682 | * This scenario is handled in __ieee80211_tx_prepare but extra | ||
683 | * caution taken here as fragmented ampdu may cause Tx stop. | ||
684 | */ | ||
685 | if (WARN_ON(tx->flags & IEEE80211_TX_CTL_AMPDU || | ||
686 | skb_get_queue_mapping(tx->skb) >= | ||
687 | ieee80211_num_regular_queues(&tx->local->hw))) | ||
688 | return TX_DROP; | ||
689 | |||
518 | first = tx->skb; | 690 | first = tx->skb; |
519 | 691 | ||
520 | hdrlen = ieee80211_get_hdrlen(tx->fc); | 692 | hdrlen = ieee80211_hdrlen(hdr->frame_control); |
521 | payload_len = first->len - hdrlen; | 693 | payload_len = first->len - hdrlen; |
522 | per_fragm = frag_threshold - hdrlen - FCS_LEN; | 694 | per_fragm = frag_threshold - hdrlen - FCS_LEN; |
523 | num_fragm = DIV_ROUND_UP(payload_len, per_fragm); | 695 | num_fragm = DIV_ROUND_UP(payload_len, per_fragm); |
@@ -558,6 +730,8 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
558 | fhdr->seq_ctrl = cpu_to_le16(seq | ((i + 1) & IEEE80211_SCTL_FRAG)); | 730 | fhdr->seq_ctrl = cpu_to_le16(seq | ((i + 1) & IEEE80211_SCTL_FRAG)); |
559 | copylen = left > per_fragm ? per_fragm : left; | 731 | copylen = left > per_fragm ? per_fragm : left; |
560 | memcpy(skb_put(frag, copylen), pos, copylen); | 732 | memcpy(skb_put(frag, copylen), pos, copylen); |
733 | memcpy(frag->cb, first->cb, sizeof(frag->cb)); | ||
734 | skb_copy_queue_mapping(frag, first); | ||
561 | 735 | ||
562 | pos += copylen; | 736 | pos += copylen; |
563 | left -= copylen; | 737 | left -= copylen; |
@@ -570,7 +744,6 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
570 | return TX_CONTINUE; | 744 | return TX_CONTINUE; |
571 | 745 | ||
572 | fail: | 746 | fail: |
573 | printk(KERN_DEBUG "%s: failed to fragment frame\n", tx->dev->name); | ||
574 | if (frags) { | 747 | if (frags) { |
575 | for (i = 0; i < num_fragm - 1; i++) | 748 | for (i = 0; i < num_fragm - 1; i++) |
576 | if (frags[i]) | 749 | if (frags[i]) |
@@ -581,7 +754,7 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
581 | return TX_DROP; | 754 | return TX_DROP; |
582 | } | 755 | } |
583 | 756 | ||
584 | static ieee80211_tx_result | 757 | static ieee80211_tx_result debug_noinline |
585 | ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx) | 758 | ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx) |
586 | { | 759 | { |
587 | if (!tx->key) | 760 | if (!tx->key) |
@@ -601,236 +774,57 @@ ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx) | |||
601 | return TX_DROP; | 774 | return TX_DROP; |
602 | } | 775 | } |
603 | 776 | ||
604 | static ieee80211_tx_result | 777 | static ieee80211_tx_result debug_noinline |
605 | ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) | 778 | ieee80211_tx_h_calculate_duration(struct ieee80211_tx_data *tx) |
606 | { | 779 | { |
607 | struct rate_selection rsel; | 780 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; |
608 | struct ieee80211_supported_band *sband; | 781 | int next_len, i; |
609 | 782 | int group_addr = is_multicast_ether_addr(hdr->addr1); | |
610 | sband = tx->local->hw.wiphy->bands[tx->local->hw.conf.channel->band]; | ||
611 | |||
612 | if (likely(!tx->rate)) { | ||
613 | rate_control_get_rate(tx->dev, sband, tx->skb, &rsel); | ||
614 | tx->rate = rsel.rate; | ||
615 | if (unlikely(rsel.probe)) { | ||
616 | tx->control->flags |= | ||
617 | IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
618 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
619 | tx->control->alt_retry_rate = tx->rate; | ||
620 | tx->rate = rsel.probe; | ||
621 | } else | ||
622 | tx->control->alt_retry_rate = NULL; | ||
623 | |||
624 | if (!tx->rate) | ||
625 | return TX_DROP; | ||
626 | } else | ||
627 | tx->control->alt_retry_rate = NULL; | ||
628 | 783 | ||
629 | if (tx->sdata->bss_conf.use_cts_prot && | 784 | if (!(tx->flags & IEEE80211_TX_FRAGMENTED)) { |
630 | (tx->flags & IEEE80211_TX_FRAGMENTED) && rsel.nonerp) { | 785 | hdr->duration_id = ieee80211_duration(tx, group_addr, 0); |
631 | tx->last_frag_rate = tx->rate; | 786 | return TX_CONTINUE; |
632 | if (rsel.probe) | ||
633 | tx->flags &= ~IEEE80211_TX_PROBE_LAST_FRAG; | ||
634 | else | ||
635 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
636 | tx->rate = rsel.nonerp; | ||
637 | tx->control->tx_rate = rsel.nonerp; | ||
638 | tx->control->flags &= ~IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
639 | } else { | ||
640 | tx->last_frag_rate = tx->rate; | ||
641 | tx->control->tx_rate = tx->rate; | ||
642 | } | 787 | } |
643 | tx->control->tx_rate = tx->rate; | ||
644 | |||
645 | return TX_CONTINUE; | ||
646 | } | ||
647 | 788 | ||
648 | static ieee80211_tx_result | 789 | hdr->duration_id = ieee80211_duration(tx, group_addr, |
649 | ieee80211_tx_h_misc(struct ieee80211_tx_data *tx) | 790 | tx->extra_frag[0]->len); |
650 | { | ||
651 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | ||
652 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
653 | u16 dur; | ||
654 | struct ieee80211_tx_control *control = tx->control; | ||
655 | 791 | ||
656 | if (!control->retry_limit) { | 792 | for (i = 0; i < tx->num_extra_frag; i++) { |
657 | if (!is_multicast_ether_addr(hdr->addr1)) { | 793 | if (i + 1 < tx->num_extra_frag) { |
658 | if (tx->skb->len + FCS_LEN > tx->local->rts_threshold | 794 | next_len = tx->extra_frag[i + 1]->len; |
659 | && tx->local->rts_threshold < | ||
660 | IEEE80211_MAX_RTS_THRESHOLD) { | ||
661 | control->flags |= | ||
662 | IEEE80211_TXCTL_USE_RTS_CTS; | ||
663 | control->flags |= | ||
664 | IEEE80211_TXCTL_LONG_RETRY_LIMIT; | ||
665 | control->retry_limit = | ||
666 | tx->local->long_retry_limit; | ||
667 | } else { | ||
668 | control->retry_limit = | ||
669 | tx->local->short_retry_limit; | ||
670 | } | ||
671 | } else { | 795 | } else { |
672 | control->retry_limit = 1; | 796 | next_len = 0; |
673 | } | 797 | tx->rate_idx = tx->last_frag_rate_idx; |
674 | } | ||
675 | |||
676 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | ||
677 | /* Do not use multiple retry rates when sending fragmented | ||
678 | * frames. | ||
679 | * TODO: The last fragment could still use multiple retry | ||
680 | * rates. */ | ||
681 | control->alt_retry_rate = NULL; | ||
682 | } | ||
683 | |||
684 | /* Use CTS protection for unicast frames sent using extended rates if | ||
685 | * there are associated non-ERP stations and RTS/CTS is not configured | ||
686 | * for the frame. */ | ||
687 | if ((tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) && | ||
688 | (tx->rate->flags & IEEE80211_RATE_ERP_G) && | ||
689 | (tx->flags & IEEE80211_TX_UNICAST) && | ||
690 | tx->sdata->bss_conf.use_cts_prot && | ||
691 | !(control->flags & IEEE80211_TXCTL_USE_RTS_CTS)) | ||
692 | control->flags |= IEEE80211_TXCTL_USE_CTS_PROTECT; | ||
693 | |||
694 | /* Transmit data frames using short preambles if the driver supports | ||
695 | * short preambles at the selected rate and short preambles are | ||
696 | * available on the network at the current point in time. */ | ||
697 | if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && | ||
698 | (tx->rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && | ||
699 | tx->sdata->bss_conf.use_short_preamble && | ||
700 | (!tx->sta || (tx->sta->flags & WLAN_STA_SHORT_PREAMBLE))) { | ||
701 | tx->control->flags |= IEEE80211_TXCTL_SHORT_PREAMBLE; | ||
702 | } | ||
703 | |||
704 | /* Setup duration field for the first fragment of the frame. Duration | ||
705 | * for remaining fragments will be updated when they are being sent | ||
706 | * to low-level driver in ieee80211_tx(). */ | ||
707 | dur = ieee80211_duration(tx, is_multicast_ether_addr(hdr->addr1), | ||
708 | (tx->flags & IEEE80211_TX_FRAGMENTED) ? | ||
709 | tx->extra_frag[0]->len : 0); | ||
710 | hdr->duration_id = cpu_to_le16(dur); | ||
711 | |||
712 | if ((control->flags & IEEE80211_TXCTL_USE_RTS_CTS) || | ||
713 | (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) { | ||
714 | struct ieee80211_supported_band *sband; | ||
715 | struct ieee80211_rate *rate, *baserate; | ||
716 | int idx; | ||
717 | |||
718 | sband = tx->local->hw.wiphy->bands[ | ||
719 | tx->local->hw.conf.channel->band]; | ||
720 | |||
721 | /* Do not use multiple retry rates when using RTS/CTS */ | ||
722 | control->alt_retry_rate = NULL; | ||
723 | |||
724 | /* Use min(data rate, max base rate) as CTS/RTS rate */ | ||
725 | rate = tx->rate; | ||
726 | baserate = NULL; | ||
727 | |||
728 | for (idx = 0; idx < sband->n_bitrates; idx++) { | ||
729 | if (sband->bitrates[idx].bitrate > rate->bitrate) | ||
730 | continue; | ||
731 | if (tx->sdata->basic_rates & BIT(idx) && | ||
732 | (!baserate || | ||
733 | (baserate->bitrate < sband->bitrates[idx].bitrate))) | ||
734 | baserate = &sband->bitrates[idx]; | ||
735 | } | 798 | } |
736 | 799 | ||
737 | if (baserate) | 800 | hdr = (struct ieee80211_hdr *)tx->extra_frag[i]->data; |
738 | control->rts_cts_rate = baserate; | 801 | hdr->duration_id = ieee80211_duration(tx, 0, next_len); |
739 | else | ||
740 | control->rts_cts_rate = &sband->bitrates[0]; | ||
741 | } | ||
742 | |||
743 | if (tx->sta) { | ||
744 | control->aid = tx->sta->aid; | ||
745 | tx->sta->tx_packets++; | ||
746 | tx->sta->tx_fragments++; | ||
747 | tx->sta->tx_bytes += tx->skb->len; | ||
748 | if (tx->extra_frag) { | ||
749 | int i; | ||
750 | tx->sta->tx_fragments += tx->num_extra_frag; | ||
751 | for (i = 0; i < tx->num_extra_frag; i++) { | ||
752 | tx->sta->tx_bytes += | ||
753 | tx->extra_frag[i]->len; | ||
754 | } | ||
755 | } | ||
756 | } | 802 | } |
757 | 803 | ||
758 | return TX_CONTINUE; | 804 | return TX_CONTINUE; |
759 | } | 805 | } |
760 | 806 | ||
761 | static ieee80211_tx_result | 807 | static ieee80211_tx_result debug_noinline |
762 | ieee80211_tx_h_load_stats(struct ieee80211_tx_data *tx) | 808 | ieee80211_tx_h_stats(struct ieee80211_tx_data *tx) |
763 | { | 809 | { |
764 | struct ieee80211_local *local = tx->local; | 810 | int i; |
765 | struct sk_buff *skb = tx->skb; | ||
766 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
767 | u32 load = 0, hdrtime; | ||
768 | struct ieee80211_rate *rate = tx->rate; | ||
769 | |||
770 | /* TODO: this could be part of tx_status handling, so that the number | ||
771 | * of retries would be known; TX rate should in that case be stored | ||
772 | * somewhere with the packet */ | ||
773 | |||
774 | /* Estimate total channel use caused by this frame */ | ||
775 | |||
776 | /* 1 bit at 1 Mbit/s takes 1 usec; in channel_use values, | ||
777 | * 1 usec = 1/8 * (1080 / 10) = 13.5 */ | ||
778 | |||
779 | if (tx->channel->band == IEEE80211_BAND_5GHZ || | ||
780 | (tx->channel->band == IEEE80211_BAND_2GHZ && | ||
781 | rate->flags & IEEE80211_RATE_ERP_G)) | ||
782 | hdrtime = CHAN_UTIL_HDR_SHORT; | ||
783 | else | ||
784 | hdrtime = CHAN_UTIL_HDR_LONG; | ||
785 | |||
786 | load = hdrtime; | ||
787 | if (!is_multicast_ether_addr(hdr->addr1)) | ||
788 | load += hdrtime; | ||
789 | |||
790 | if (tx->control->flags & IEEE80211_TXCTL_USE_RTS_CTS) | ||
791 | load += 2 * hdrtime; | ||
792 | else if (tx->control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) | ||
793 | load += hdrtime; | ||
794 | 811 | ||
795 | /* TODO: optimise again */ | 812 | if (!tx->sta) |
796 | load += skb->len * CHAN_UTIL_RATE_LCM / rate->bitrate; | 813 | return TX_CONTINUE; |
797 | 814 | ||
815 | tx->sta->tx_packets++; | ||
816 | tx->sta->tx_fragments++; | ||
817 | tx->sta->tx_bytes += tx->skb->len; | ||
798 | if (tx->extra_frag) { | 818 | if (tx->extra_frag) { |
799 | int i; | 819 | tx->sta->tx_fragments += tx->num_extra_frag; |
800 | for (i = 0; i < tx->num_extra_frag; i++) { | 820 | for (i = 0; i < tx->num_extra_frag; i++) |
801 | load += 2 * hdrtime; | 821 | tx->sta->tx_bytes += tx->extra_frag[i]->len; |
802 | load += tx->extra_frag[i]->len * | ||
803 | tx->rate->bitrate; | ||
804 | } | ||
805 | } | 822 | } |
806 | 823 | ||
807 | /* Divide channel_use by 8 to avoid wrapping around the counter */ | ||
808 | load >>= CHAN_UTIL_SHIFT; | ||
809 | local->channel_use_raw += load; | ||
810 | if (tx->sta) | ||
811 | tx->sta->channel_use_raw += load; | ||
812 | tx->sdata->channel_use_raw += load; | ||
813 | |||
814 | return TX_CONTINUE; | 824 | return TX_CONTINUE; |
815 | } | 825 | } |
816 | 826 | ||
817 | 827 | ||
818 | typedef ieee80211_tx_result (*ieee80211_tx_handler)(struct ieee80211_tx_data *); | ||
819 | static ieee80211_tx_handler ieee80211_tx_handlers[] = | ||
820 | { | ||
821 | ieee80211_tx_h_check_assoc, | ||
822 | ieee80211_tx_h_sequence, | ||
823 | ieee80211_tx_h_ps_buf, | ||
824 | ieee80211_tx_h_select_key, | ||
825 | ieee80211_tx_h_michael_mic_add, | ||
826 | ieee80211_tx_h_fragment, | ||
827 | ieee80211_tx_h_encrypt, | ||
828 | ieee80211_tx_h_rate_ctrl, | ||
829 | ieee80211_tx_h_misc, | ||
830 | ieee80211_tx_h_load_stats, | ||
831 | NULL | ||
832 | }; | ||
833 | |||
834 | /* actual transmit path */ | 828 | /* actual transmit path */ |
835 | 829 | ||
836 | /* | 830 | /* |
@@ -854,12 +848,12 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
854 | (struct ieee80211_radiotap_header *) skb->data; | 848 | (struct ieee80211_radiotap_header *) skb->data; |
855 | struct ieee80211_supported_band *sband; | 849 | struct ieee80211_supported_band *sband; |
856 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); | 850 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); |
857 | struct ieee80211_tx_control *control = tx->control; | 851 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
858 | 852 | ||
859 | sband = tx->local->hw.wiphy->bands[tx->local->hw.conf.channel->band]; | 853 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; |
860 | 854 | ||
861 | control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 855 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
862 | tx->flags |= IEEE80211_TX_INJECTED; | 856 | info->flags |= IEEE80211_TX_CTL_INJECTED; |
863 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; | 857 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; |
864 | 858 | ||
865 | /* | 859 | /* |
@@ -896,7 +890,7 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
896 | r = &sband->bitrates[i]; | 890 | r = &sband->bitrates[i]; |
897 | 891 | ||
898 | if (r->bitrate == target_rate) { | 892 | if (r->bitrate == target_rate) { |
899 | tx->rate = r; | 893 | tx->rate_idx = i; |
900 | break; | 894 | break; |
901 | } | 895 | } |
902 | } | 896 | } |
@@ -907,7 +901,7 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
907 | * radiotap uses 0 for 1st ant, mac80211 is 1 for | 901 | * radiotap uses 0 for 1st ant, mac80211 is 1 for |
908 | * 1st ant | 902 | * 1st ant |
909 | */ | 903 | */ |
910 | control->antenna_sel_tx = (*iterator.this_arg) + 1; | 904 | info->antenna_sel_tx = (*iterator.this_arg) + 1; |
911 | break; | 905 | break; |
912 | 906 | ||
913 | #if 0 | 907 | #if 0 |
@@ -931,8 +925,8 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
931 | skb_trim(skb, skb->len - FCS_LEN); | 925 | skb_trim(skb, skb->len - FCS_LEN); |
932 | } | 926 | } |
933 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_WEP) | 927 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_WEP) |
934 | control->flags &= | 928 | info->flags &= |
935 | ~IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 929 | ~IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
936 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) | 930 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) |
937 | tx->flags |= IEEE80211_TX_FRAGMENTED; | 931 | tx->flags |= IEEE80211_TX_FRAGMENTED; |
938 | break; | 932 | break; |
@@ -967,12 +961,12 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
967 | static ieee80211_tx_result | 961 | static ieee80211_tx_result |
968 | __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | 962 | __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, |
969 | struct sk_buff *skb, | 963 | struct sk_buff *skb, |
970 | struct net_device *dev, | 964 | struct net_device *dev) |
971 | struct ieee80211_tx_control *control) | ||
972 | { | 965 | { |
973 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 966 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
974 | struct ieee80211_hdr *hdr; | 967 | struct ieee80211_hdr *hdr; |
975 | struct ieee80211_sub_if_data *sdata; | 968 | struct ieee80211_sub_if_data *sdata; |
969 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
976 | 970 | ||
977 | int hdrlen; | 971 | int hdrlen; |
978 | 972 | ||
@@ -981,7 +975,9 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
981 | tx->dev = dev; /* use original interface */ | 975 | tx->dev = dev; /* use original interface */ |
982 | tx->local = local; | 976 | tx->local = local; |
983 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 977 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
984 | tx->control = control; | 978 | tx->channel = local->hw.conf.channel; |
979 | tx->rate_idx = -1; | ||
980 | tx->last_frag_rate_idx = -1; | ||
985 | /* | 981 | /* |
986 | * Set this flag (used below to indicate "automatic fragmentation"), | 982 | * Set this flag (used below to indicate "automatic fragmentation"), |
987 | * it will be cleared/left by radiotap as desired. | 983 | * it will be cleared/left by radiotap as desired. |
@@ -1008,34 +1004,33 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1008 | 1004 | ||
1009 | if (is_multicast_ether_addr(hdr->addr1)) { | 1005 | if (is_multicast_ether_addr(hdr->addr1)) { |
1010 | tx->flags &= ~IEEE80211_TX_UNICAST; | 1006 | tx->flags &= ~IEEE80211_TX_UNICAST; |
1011 | control->flags |= IEEE80211_TXCTL_NO_ACK; | 1007 | info->flags |= IEEE80211_TX_CTL_NO_ACK; |
1012 | } else { | 1008 | } else { |
1013 | tx->flags |= IEEE80211_TX_UNICAST; | 1009 | tx->flags |= IEEE80211_TX_UNICAST; |
1014 | control->flags &= ~IEEE80211_TXCTL_NO_ACK; | 1010 | info->flags &= ~IEEE80211_TX_CTL_NO_ACK; |
1015 | } | 1011 | } |
1016 | 1012 | ||
1017 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | 1013 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { |
1018 | if ((tx->flags & IEEE80211_TX_UNICAST) && | 1014 | if ((tx->flags & IEEE80211_TX_UNICAST) && |
1019 | skb->len + FCS_LEN > local->fragmentation_threshold && | 1015 | skb->len + FCS_LEN > local->fragmentation_threshold && |
1020 | !local->ops->set_frag_threshold) | 1016 | !local->ops->set_frag_threshold && |
1017 | !(info->flags & IEEE80211_TX_CTL_AMPDU)) | ||
1021 | tx->flags |= IEEE80211_TX_FRAGMENTED; | 1018 | tx->flags |= IEEE80211_TX_FRAGMENTED; |
1022 | else | 1019 | else |
1023 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; | 1020 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; |
1024 | } | 1021 | } |
1025 | 1022 | ||
1026 | if (!tx->sta) | 1023 | if (!tx->sta) |
1027 | control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT; | 1024 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; |
1028 | else if (tx->sta->flags & WLAN_STA_CLEAR_PS_FILT) { | 1025 | else if (test_and_clear_sta_flags(tx->sta, WLAN_STA_CLEAR_PS_FILT)) |
1029 | control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT; | 1026 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; |
1030 | tx->sta->flags &= ~WLAN_STA_CLEAR_PS_FILT; | ||
1031 | } | ||
1032 | 1027 | ||
1033 | hdrlen = ieee80211_get_hdrlen(tx->fc); | 1028 | hdrlen = ieee80211_get_hdrlen(tx->fc); |
1034 | if (skb->len > hdrlen + sizeof(rfc1042_header) + 2) { | 1029 | if (skb->len > hdrlen + sizeof(rfc1042_header) + 2) { |
1035 | u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)]; | 1030 | u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)]; |
1036 | tx->ethertype = (pos[0] << 8) | pos[1]; | 1031 | tx->ethertype = (pos[0] << 8) | pos[1]; |
1037 | } | 1032 | } |
1038 | control->flags |= IEEE80211_TXCTL_FIRST_FRAGMENT; | 1033 | info->flags |= IEEE80211_TX_CTL_FIRST_FRAGMENT; |
1039 | 1034 | ||
1040 | return TX_CONTINUE; | 1035 | return TX_CONTINUE; |
1041 | } | 1036 | } |
@@ -1045,14 +1040,12 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1045 | */ | 1040 | */ |
1046 | static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | 1041 | static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, |
1047 | struct sk_buff *skb, | 1042 | struct sk_buff *skb, |
1048 | struct net_device *mdev, | 1043 | struct net_device *mdev) |
1049 | struct ieee80211_tx_control *control) | ||
1050 | { | 1044 | { |
1051 | struct ieee80211_tx_packet_data *pkt_data; | 1045 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1052 | struct net_device *dev; | 1046 | struct net_device *dev; |
1053 | 1047 | ||
1054 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | 1048 | dev = dev_get_by_index(&init_net, info->control.ifindex); |
1055 | dev = dev_get_by_index(&init_net, pkt_data->ifindex); | ||
1056 | if (unlikely(dev && !is_ieee80211_device(dev, mdev))) { | 1049 | if (unlikely(dev && !is_ieee80211_device(dev, mdev))) { |
1057 | dev_put(dev); | 1050 | dev_put(dev); |
1058 | dev = NULL; | 1051 | dev = NULL; |
@@ -1060,7 +1053,7 @@ static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1060 | if (unlikely(!dev)) | 1053 | if (unlikely(!dev)) |
1061 | return -ENODEV; | 1054 | return -ENODEV; |
1062 | /* initialises tx with control */ | 1055 | /* initialises tx with control */ |
1063 | __ieee80211_tx_prepare(tx, skb, dev, control); | 1056 | __ieee80211_tx_prepare(tx, skb, dev); |
1064 | dev_put(dev); | 1057 | dev_put(dev); |
1065 | return 0; | 1058 | return 0; |
1066 | } | 1059 | } |
@@ -1068,50 +1061,49 @@ static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1068 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | 1061 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, |
1069 | struct ieee80211_tx_data *tx) | 1062 | struct ieee80211_tx_data *tx) |
1070 | { | 1063 | { |
1071 | struct ieee80211_tx_control *control = tx->control; | 1064 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1072 | int ret, i; | 1065 | int ret, i; |
1073 | 1066 | ||
1074 | if (!ieee80211_qdisc_installed(local->mdev) && | 1067 | if (netif_subqueue_stopped(local->mdev, skb)) |
1075 | __ieee80211_queue_stopped(local, 0)) { | ||
1076 | netif_stop_queue(local->mdev); | ||
1077 | return IEEE80211_TX_AGAIN; | 1068 | return IEEE80211_TX_AGAIN; |
1078 | } | 1069 | |
1079 | if (skb) { | 1070 | if (skb) { |
1080 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), | 1071 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), |
1081 | "TX to low-level driver", skb); | 1072 | "TX to low-level driver", skb); |
1082 | ret = local->ops->tx(local_to_hw(local), skb, control); | 1073 | ret = local->ops->tx(local_to_hw(local), skb); |
1083 | if (ret) | 1074 | if (ret) |
1084 | return IEEE80211_TX_AGAIN; | 1075 | return IEEE80211_TX_AGAIN; |
1085 | local->mdev->trans_start = jiffies; | 1076 | local->mdev->trans_start = jiffies; |
1086 | ieee80211_led_tx(local, 1); | 1077 | ieee80211_led_tx(local, 1); |
1087 | } | 1078 | } |
1088 | if (tx->extra_frag) { | 1079 | if (tx->extra_frag) { |
1089 | control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS | | ||
1090 | IEEE80211_TXCTL_USE_CTS_PROTECT | | ||
1091 | IEEE80211_TXCTL_CLEAR_PS_FILT | | ||
1092 | IEEE80211_TXCTL_FIRST_FRAGMENT); | ||
1093 | for (i = 0; i < tx->num_extra_frag; i++) { | 1080 | for (i = 0; i < tx->num_extra_frag; i++) { |
1094 | if (!tx->extra_frag[i]) | 1081 | if (!tx->extra_frag[i]) |
1095 | continue; | 1082 | continue; |
1096 | if (__ieee80211_queue_stopped(local, control->queue)) | 1083 | info = IEEE80211_SKB_CB(tx->extra_frag[i]); |
1084 | info->flags &= ~(IEEE80211_TX_CTL_USE_RTS_CTS | | ||
1085 | IEEE80211_TX_CTL_USE_CTS_PROTECT | | ||
1086 | IEEE80211_TX_CTL_CLEAR_PS_FILT | | ||
1087 | IEEE80211_TX_CTL_FIRST_FRAGMENT); | ||
1088 | if (netif_subqueue_stopped(local->mdev, | ||
1089 | tx->extra_frag[i])) | ||
1097 | return IEEE80211_TX_FRAG_AGAIN; | 1090 | return IEEE80211_TX_FRAG_AGAIN; |
1098 | if (i == tx->num_extra_frag) { | 1091 | if (i == tx->num_extra_frag) { |
1099 | control->tx_rate = tx->last_frag_rate; | 1092 | info->tx_rate_idx = tx->last_frag_rate_idx; |
1100 | 1093 | ||
1101 | if (tx->flags & IEEE80211_TX_PROBE_LAST_FRAG) | 1094 | if (tx->flags & IEEE80211_TX_PROBE_LAST_FRAG) |
1102 | control->flags |= | 1095 | info->flags |= |
1103 | IEEE80211_TXCTL_RATE_CTRL_PROBE; | 1096 | IEEE80211_TX_CTL_RATE_CTRL_PROBE; |
1104 | else | 1097 | else |
1105 | control->flags &= | 1098 | info->flags &= |
1106 | ~IEEE80211_TXCTL_RATE_CTRL_PROBE; | 1099 | ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; |
1107 | } | 1100 | } |
1108 | 1101 | ||
1109 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), | 1102 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), |
1110 | "TX to low-level driver", | 1103 | "TX to low-level driver", |
1111 | tx->extra_frag[i]); | 1104 | tx->extra_frag[i]); |
1112 | ret = local->ops->tx(local_to_hw(local), | 1105 | ret = local->ops->tx(local_to_hw(local), |
1113 | tx->extra_frag[i], | 1106 | tx->extra_frag[i]); |
1114 | control); | ||
1115 | if (ret) | 1107 | if (ret) |
1116 | return IEEE80211_TX_FRAG_AGAIN; | 1108 | return IEEE80211_TX_FRAG_AGAIN; |
1117 | local->mdev->trans_start = jiffies; | 1109 | local->mdev->trans_start = jiffies; |
@@ -1124,17 +1116,65 @@ static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | |||
1124 | return IEEE80211_TX_OK; | 1116 | return IEEE80211_TX_OK; |
1125 | } | 1117 | } |
1126 | 1118 | ||
1127 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | 1119 | /* |
1128 | struct ieee80211_tx_control *control) | 1120 | * Invoke TX handlers, return 0 on success and non-zero if the |
1121 | * frame was dropped or queued. | ||
1122 | */ | ||
1123 | static int invoke_tx_handlers(struct ieee80211_tx_data *tx) | ||
1124 | { | ||
1125 | struct sk_buff *skb = tx->skb; | ||
1126 | ieee80211_tx_result res = TX_DROP; | ||
1127 | int i; | ||
1128 | |||
1129 | #define CALL_TXH(txh) \ | ||
1130 | res = txh(tx); \ | ||
1131 | if (res != TX_CONTINUE) \ | ||
1132 | goto txh_done; | ||
1133 | |||
1134 | CALL_TXH(ieee80211_tx_h_check_assoc) | ||
1135 | CALL_TXH(ieee80211_tx_h_ps_buf) | ||
1136 | CALL_TXH(ieee80211_tx_h_select_key) | ||
1137 | CALL_TXH(ieee80211_tx_h_michael_mic_add) | ||
1138 | CALL_TXH(ieee80211_tx_h_rate_ctrl) | ||
1139 | CALL_TXH(ieee80211_tx_h_misc) | ||
1140 | CALL_TXH(ieee80211_tx_h_sequence) | ||
1141 | CALL_TXH(ieee80211_tx_h_fragment) | ||
1142 | /* handlers after fragment must be aware of tx info fragmentation! */ | ||
1143 | CALL_TXH(ieee80211_tx_h_encrypt) | ||
1144 | CALL_TXH(ieee80211_tx_h_calculate_duration) | ||
1145 | CALL_TXH(ieee80211_tx_h_stats) | ||
1146 | #undef CALL_TXH | ||
1147 | |||
1148 | txh_done: | ||
1149 | if (unlikely(res == TX_DROP)) { | ||
1150 | I802_DEBUG_INC(tx->local->tx_handlers_drop); | ||
1151 | dev_kfree_skb(skb); | ||
1152 | for (i = 0; i < tx->num_extra_frag; i++) | ||
1153 | if (tx->extra_frag[i]) | ||
1154 | dev_kfree_skb(tx->extra_frag[i]); | ||
1155 | kfree(tx->extra_frag); | ||
1156 | return -1; | ||
1157 | } else if (unlikely(res == TX_QUEUED)) { | ||
1158 | I802_DEBUG_INC(tx->local->tx_handlers_queued); | ||
1159 | return -1; | ||
1160 | } | ||
1161 | |||
1162 | return 0; | ||
1163 | } | ||
1164 | |||
1165 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb) | ||
1129 | { | 1166 | { |
1130 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1167 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1131 | struct sta_info *sta; | 1168 | struct sta_info *sta; |
1132 | ieee80211_tx_handler *handler; | ||
1133 | struct ieee80211_tx_data tx; | 1169 | struct ieee80211_tx_data tx; |
1134 | ieee80211_tx_result res = TX_DROP, res_prepare; | 1170 | ieee80211_tx_result res_prepare; |
1135 | int ret, i, retries = 0; | 1171 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1172 | int ret, i; | ||
1173 | u16 queue; | ||
1174 | |||
1175 | queue = skb_get_queue_mapping(skb); | ||
1136 | 1176 | ||
1137 | WARN_ON(__ieee80211_queue_pending(local, control->queue)); | 1177 | WARN_ON(test_bit(queue, local->queues_pending)); |
1138 | 1178 | ||
1139 | if (unlikely(skb->len < 10)) { | 1179 | if (unlikely(skb->len < 10)) { |
1140 | dev_kfree_skb(skb); | 1180 | dev_kfree_skb(skb); |
@@ -1144,7 +1184,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1144 | rcu_read_lock(); | 1184 | rcu_read_lock(); |
1145 | 1185 | ||
1146 | /* initialises tx */ | 1186 | /* initialises tx */ |
1147 | res_prepare = __ieee80211_tx_prepare(&tx, skb, dev, control); | 1187 | res_prepare = __ieee80211_tx_prepare(&tx, skb, dev); |
1148 | 1188 | ||
1149 | if (res_prepare == TX_DROP) { | 1189 | if (res_prepare == TX_DROP) { |
1150 | dev_kfree_skb(skb); | 1190 | dev_kfree_skb(skb); |
@@ -1154,86 +1194,53 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1154 | 1194 | ||
1155 | sta = tx.sta; | 1195 | sta = tx.sta; |
1156 | tx.channel = local->hw.conf.channel; | 1196 | tx.channel = local->hw.conf.channel; |
1197 | info->band = tx.channel->band; | ||
1157 | 1198 | ||
1158 | for (handler = ieee80211_tx_handlers; *handler != NULL; | 1199 | if (invoke_tx_handlers(&tx)) |
1159 | handler++) { | 1200 | goto out; |
1160 | res = (*handler)(&tx); | ||
1161 | if (res != TX_CONTINUE) | ||
1162 | break; | ||
1163 | } | ||
1164 | |||
1165 | skb = tx.skb; /* handlers are allowed to change skb */ | ||
1166 | |||
1167 | if (unlikely(res == TX_DROP)) { | ||
1168 | I802_DEBUG_INC(local->tx_handlers_drop); | ||
1169 | goto drop; | ||
1170 | } | ||
1171 | |||
1172 | if (unlikely(res == TX_QUEUED)) { | ||
1173 | I802_DEBUG_INC(local->tx_handlers_queued); | ||
1174 | rcu_read_unlock(); | ||
1175 | return 0; | ||
1176 | } | ||
1177 | |||
1178 | if (tx.extra_frag) { | ||
1179 | for (i = 0; i < tx.num_extra_frag; i++) { | ||
1180 | int next_len, dur; | ||
1181 | struct ieee80211_hdr *hdr = | ||
1182 | (struct ieee80211_hdr *) | ||
1183 | tx.extra_frag[i]->data; | ||
1184 | |||
1185 | if (i + 1 < tx.num_extra_frag) { | ||
1186 | next_len = tx.extra_frag[i + 1]->len; | ||
1187 | } else { | ||
1188 | next_len = 0; | ||
1189 | tx.rate = tx.last_frag_rate; | ||
1190 | } | ||
1191 | dur = ieee80211_duration(&tx, 0, next_len); | ||
1192 | hdr->duration_id = cpu_to_le16(dur); | ||
1193 | } | ||
1194 | } | ||
1195 | 1201 | ||
1196 | retry: | 1202 | retry: |
1197 | ret = __ieee80211_tx(local, skb, &tx); | 1203 | ret = __ieee80211_tx(local, skb, &tx); |
1198 | if (ret) { | 1204 | if (ret) { |
1199 | struct ieee80211_tx_stored_packet *store = | 1205 | struct ieee80211_tx_stored_packet *store; |
1200 | &local->pending_packet[control->queue]; | 1206 | |
1207 | /* | ||
1208 | * Since there are no fragmented frames on A-MPDU | ||
1209 | * queues, there's no reason for a driver to reject | ||
1210 | * a frame there, warn and drop it. | ||
1211 | */ | ||
1212 | if (WARN_ON(queue >= ieee80211_num_regular_queues(&local->hw))) | ||
1213 | goto drop; | ||
1214 | |||
1215 | store = &local->pending_packet[queue]; | ||
1201 | 1216 | ||
1202 | if (ret == IEEE80211_TX_FRAG_AGAIN) | 1217 | if (ret == IEEE80211_TX_FRAG_AGAIN) |
1203 | skb = NULL; | 1218 | skb = NULL; |
1204 | set_bit(IEEE80211_LINK_STATE_PENDING, | 1219 | set_bit(queue, local->queues_pending); |
1205 | &local->state[control->queue]); | ||
1206 | smp_mb(); | 1220 | smp_mb(); |
1207 | /* When the driver gets out of buffers during sending of | 1221 | /* |
1208 | * fragments and calls ieee80211_stop_queue, there is | 1222 | * When the driver gets out of buffers during sending of |
1209 | * a small window between IEEE80211_LINK_STATE_XOFF and | 1223 | * fragments and calls ieee80211_stop_queue, the netif |
1210 | * IEEE80211_LINK_STATE_PENDING flags are set. If a buffer | 1224 | * subqueue is stopped. There is, however, a small window |
1225 | * in which the PENDING bit is not yet set. If a buffer | ||
1211 | * gets available in that window (i.e. driver calls | 1226 | * gets available in that window (i.e. driver calls |
1212 | * ieee80211_wake_queue), we would end up with ieee80211_tx | 1227 | * ieee80211_wake_queue), we would end up with ieee80211_tx |
1213 | * called with IEEE80211_LINK_STATE_PENDING. Prevent this by | 1228 | * called with the PENDING bit still set. Prevent this by |
1214 | * continuing transmitting here when that situation is | 1229 | * continuing transmitting here when that situation is |
1215 | * possible to have happened. */ | 1230 | * possible to have happened. |
1216 | if (!__ieee80211_queue_stopped(local, control->queue)) { | 1231 | */ |
1217 | clear_bit(IEEE80211_LINK_STATE_PENDING, | 1232 | if (!__netif_subqueue_stopped(local->mdev, queue)) { |
1218 | &local->state[control->queue]); | 1233 | clear_bit(queue, local->queues_pending); |
1219 | retries++; | ||
1220 | /* | ||
1221 | * Driver bug, it's rejecting packets but | ||
1222 | * not stopping queues. | ||
1223 | */ | ||
1224 | if (WARN_ON_ONCE(retries > 5)) | ||
1225 | goto drop; | ||
1226 | goto retry; | 1234 | goto retry; |
1227 | } | 1235 | } |
1228 | memcpy(&store->control, control, | ||
1229 | sizeof(struct ieee80211_tx_control)); | ||
1230 | store->skb = skb; | 1236 | store->skb = skb; |
1231 | store->extra_frag = tx.extra_frag; | 1237 | store->extra_frag = tx.extra_frag; |
1232 | store->num_extra_frag = tx.num_extra_frag; | 1238 | store->num_extra_frag = tx.num_extra_frag; |
1233 | store->last_frag_rate = tx.last_frag_rate; | 1239 | store->last_frag_rate_idx = tx.last_frag_rate_idx; |
1234 | store->last_frag_rate_ctrl_probe = | 1240 | store->last_frag_rate_ctrl_probe = |
1235 | !!(tx.flags & IEEE80211_TX_PROBE_LAST_FRAG); | 1241 | !!(tx.flags & IEEE80211_TX_PROBE_LAST_FRAG); |
1236 | } | 1242 | } |
1243 | out: | ||
1237 | rcu_read_unlock(); | 1244 | rcu_read_unlock(); |
1238 | return 0; | 1245 | return 0; |
1239 | 1246 | ||
@@ -1250,24 +1257,57 @@ retry: | |||
1250 | 1257 | ||
1251 | /* device xmit handlers */ | 1258 | /* device xmit handlers */ |
1252 | 1259 | ||
1260 | static int ieee80211_skb_resize(struct ieee80211_local *local, | ||
1261 | struct sk_buff *skb, | ||
1262 | int head_need, bool may_encrypt) | ||
1263 | { | ||
1264 | int tail_need = 0; | ||
1265 | |||
1266 | /* | ||
1267 | * This could be optimised, devices that do full hardware | ||
1268 | * crypto (including TKIP MMIC) need no tailroom... But we | ||
1269 | * have no drivers for such devices currently. | ||
1270 | */ | ||
1271 | if (may_encrypt) { | ||
1272 | tail_need = IEEE80211_ENCRYPT_TAILROOM; | ||
1273 | tail_need -= skb_tailroom(skb); | ||
1274 | tail_need = max_t(int, tail_need, 0); | ||
1275 | } | ||
1276 | |||
1277 | if (head_need || tail_need) { | ||
1278 | /* Sorry. Can't account for this any more */ | ||
1279 | skb_orphan(skb); | ||
1280 | } | ||
1281 | |||
1282 | if (skb_header_cloned(skb)) | ||
1283 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | ||
1284 | else | ||
1285 | I802_DEBUG_INC(local->tx_expand_skb_head); | ||
1286 | |||
1287 | if (pskb_expand_head(skb, head_need, tail_need, GFP_ATOMIC)) { | ||
1288 | printk(KERN_DEBUG "%s: failed to reallocate TX buffer\n", | ||
1289 | wiphy_name(local->hw.wiphy)); | ||
1290 | return -ENOMEM; | ||
1291 | } | ||
1292 | |||
1293 | /* update truesize too */ | ||
1294 | skb->truesize += head_need + tail_need; | ||
1295 | |||
1296 | return 0; | ||
1297 | } | ||
1298 | |||
1253 | int ieee80211_master_start_xmit(struct sk_buff *skb, | 1299 | int ieee80211_master_start_xmit(struct sk_buff *skb, |
1254 | struct net_device *dev) | 1300 | struct net_device *dev) |
1255 | { | 1301 | { |
1256 | struct ieee80211_tx_control control; | 1302 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1257 | struct ieee80211_tx_packet_data *pkt_data; | ||
1258 | struct net_device *odev = NULL; | 1303 | struct net_device *odev = NULL; |
1259 | struct ieee80211_sub_if_data *osdata; | 1304 | struct ieee80211_sub_if_data *osdata; |
1260 | int headroom; | 1305 | int headroom; |
1306 | bool may_encrypt; | ||
1261 | int ret; | 1307 | int ret; |
1262 | 1308 | ||
1263 | /* | 1309 | if (info->control.ifindex) |
1264 | * copy control out of the skb so other people can use skb->cb | 1310 | odev = dev_get_by_index(&init_net, info->control.ifindex); |
1265 | */ | ||
1266 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1267 | memset(&control, 0, sizeof(struct ieee80211_tx_control)); | ||
1268 | |||
1269 | if (pkt_data->ifindex) | ||
1270 | odev = dev_get_by_index(&init_net, pkt_data->ifindex); | ||
1271 | if (unlikely(odev && !is_ieee80211_device(odev, dev))) { | 1311 | if (unlikely(odev && !is_ieee80211_device(odev, dev))) { |
1272 | dev_put(odev); | 1312 | dev_put(odev); |
1273 | odev = NULL; | 1313 | odev = NULL; |
@@ -1280,32 +1320,25 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, | |||
1280 | dev_kfree_skb(skb); | 1320 | dev_kfree_skb(skb); |
1281 | return 0; | 1321 | return 0; |
1282 | } | 1322 | } |
1323 | |||
1283 | osdata = IEEE80211_DEV_TO_SUB_IF(odev); | 1324 | osdata = IEEE80211_DEV_TO_SUB_IF(odev); |
1284 | 1325 | ||
1285 | headroom = osdata->local->tx_headroom + IEEE80211_ENCRYPT_HEADROOM; | 1326 | may_encrypt = !(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT); |
1286 | if (skb_headroom(skb) < headroom) { | 1327 | |
1287 | if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) { | 1328 | headroom = osdata->local->tx_headroom; |
1288 | dev_kfree_skb(skb); | 1329 | if (may_encrypt) |
1289 | dev_put(odev); | 1330 | headroom += IEEE80211_ENCRYPT_HEADROOM; |
1290 | return 0; | 1331 | headroom -= skb_headroom(skb); |
1291 | } | 1332 | headroom = max_t(int, 0, headroom); |
1333 | |||
1334 | if (ieee80211_skb_resize(osdata->local, skb, headroom, may_encrypt)) { | ||
1335 | dev_kfree_skb(skb); | ||
1336 | dev_put(odev); | ||
1337 | return 0; | ||
1292 | } | 1338 | } |
1293 | 1339 | ||
1294 | control.vif = &osdata->vif; | 1340 | info->control.vif = &osdata->vif; |
1295 | control.type = osdata->vif.type; | 1341 | ret = ieee80211_tx(odev, skb); |
1296 | if (pkt_data->flags & IEEE80211_TXPD_REQ_TX_STATUS) | ||
1297 | control.flags |= IEEE80211_TXCTL_REQ_TX_STATUS; | ||
1298 | if (pkt_data->flags & IEEE80211_TXPD_DO_NOT_ENCRYPT) | ||
1299 | control.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | ||
1300 | if (pkt_data->flags & IEEE80211_TXPD_REQUEUE) | ||
1301 | control.flags |= IEEE80211_TXCTL_REQUEUE; | ||
1302 | if (pkt_data->flags & IEEE80211_TXPD_EAPOL_FRAME) | ||
1303 | control.flags |= IEEE80211_TXCTL_EAPOL_FRAME; | ||
1304 | if (pkt_data->flags & IEEE80211_TXPD_AMPDU) | ||
1305 | control.flags |= IEEE80211_TXCTL_AMPDU; | ||
1306 | control.queue = pkt_data->queue; | ||
1307 | |||
1308 | ret = ieee80211_tx(odev, skb, &control); | ||
1309 | dev_put(odev); | 1342 | dev_put(odev); |
1310 | 1343 | ||
1311 | return ret; | 1344 | return ret; |
@@ -1315,7 +1348,7 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
1315 | struct net_device *dev) | 1348 | struct net_device *dev) |
1316 | { | 1349 | { |
1317 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1350 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1318 | struct ieee80211_tx_packet_data *pkt_data; | 1351 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1319 | struct ieee80211_radiotap_header *prthdr = | 1352 | struct ieee80211_radiotap_header *prthdr = |
1320 | (struct ieee80211_radiotap_header *)skb->data; | 1353 | (struct ieee80211_radiotap_header *)skb->data; |
1321 | u16 len_rthdr; | 1354 | u16 len_rthdr; |
@@ -1337,12 +1370,12 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
1337 | 1370 | ||
1338 | skb->dev = local->mdev; | 1371 | skb->dev = local->mdev; |
1339 | 1372 | ||
1340 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1341 | memset(pkt_data, 0, sizeof(*pkt_data)); | ||
1342 | /* needed because we set skb device to master */ | 1373 | /* needed because we set skb device to master */ |
1343 | pkt_data->ifindex = dev->ifindex; | 1374 | info->control.ifindex = dev->ifindex; |
1344 | 1375 | ||
1345 | pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; | 1376 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
1377 | /* Interfaces should always request a status report */ | ||
1378 | info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; | ||
1346 | 1379 | ||
1347 | /* | 1380 | /* |
1348 | * fix up the pointers accounting for the radiotap | 1381 | * fix up the pointers accounting for the radiotap |
@@ -1386,10 +1419,11 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1386 | struct net_device *dev) | 1419 | struct net_device *dev) |
1387 | { | 1420 | { |
1388 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1421 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1389 | struct ieee80211_tx_packet_data *pkt_data; | 1422 | struct ieee80211_tx_info *info; |
1390 | struct ieee80211_sub_if_data *sdata; | 1423 | struct ieee80211_sub_if_data *sdata; |
1391 | int ret = 1, head_need; | 1424 | int ret = 1, head_need; |
1392 | u16 ethertype, hdrlen, meshhdrlen = 0, fc; | 1425 | u16 ethertype, hdrlen, meshhdrlen = 0; |
1426 | __le16 fc; | ||
1393 | struct ieee80211_hdr hdr; | 1427 | struct ieee80211_hdr hdr; |
1394 | struct ieee80211s_hdr mesh_hdr; | 1428 | struct ieee80211s_hdr mesh_hdr; |
1395 | const u8 *encaps_data; | 1429 | const u8 *encaps_data; |
@@ -1400,8 +1434,6 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1400 | 1434 | ||
1401 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1435 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
1402 | if (unlikely(skb->len < ETH_HLEN)) { | 1436 | if (unlikely(skb->len < ETH_HLEN)) { |
1403 | printk(KERN_DEBUG "%s: short skb (len=%d)\n", | ||
1404 | dev->name, skb->len); | ||
1405 | ret = 0; | 1437 | ret = 0; |
1406 | goto fail; | 1438 | goto fail; |
1407 | } | 1439 | } |
@@ -1412,12 +1444,12 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1412 | /* convert Ethernet header to proper 802.11 header (based on | 1444 | /* convert Ethernet header to proper 802.11 header (based on |
1413 | * operation mode) */ | 1445 | * operation mode) */ |
1414 | ethertype = (skb->data[12] << 8) | skb->data[13]; | 1446 | ethertype = (skb->data[12] << 8) | skb->data[13]; |
1415 | fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; | 1447 | fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA); |
1416 | 1448 | ||
1417 | switch (sdata->vif.type) { | 1449 | switch (sdata->vif.type) { |
1418 | case IEEE80211_IF_TYPE_AP: | 1450 | case IEEE80211_IF_TYPE_AP: |
1419 | case IEEE80211_IF_TYPE_VLAN: | 1451 | case IEEE80211_IF_TYPE_VLAN: |
1420 | fc |= IEEE80211_FCTL_FROMDS; | 1452 | fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS); |
1421 | /* DA BSSID SA */ | 1453 | /* DA BSSID SA */ |
1422 | memcpy(hdr.addr1, skb->data, ETH_ALEN); | 1454 | memcpy(hdr.addr1, skb->data, ETH_ALEN); |
1423 | memcpy(hdr.addr2, dev->dev_addr, ETH_ALEN); | 1455 | memcpy(hdr.addr2, dev->dev_addr, ETH_ALEN); |
@@ -1425,7 +1457,7 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1425 | hdrlen = 24; | 1457 | hdrlen = 24; |
1426 | break; | 1458 | break; |
1427 | case IEEE80211_IF_TYPE_WDS: | 1459 | case IEEE80211_IF_TYPE_WDS: |
1428 | fc |= IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS; | 1460 | fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); |
1429 | /* RA TA DA SA */ | 1461 | /* RA TA DA SA */ |
1430 | memcpy(hdr.addr1, sdata->u.wds.remote_addr, ETH_ALEN); | 1462 | memcpy(hdr.addr1, sdata->u.wds.remote_addr, ETH_ALEN); |
1431 | memcpy(hdr.addr2, dev->dev_addr, ETH_ALEN); | 1463 | memcpy(hdr.addr2, dev->dev_addr, ETH_ALEN); |
@@ -1435,7 +1467,7 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1435 | break; | 1467 | break; |
1436 | #ifdef CONFIG_MAC80211_MESH | 1468 | #ifdef CONFIG_MAC80211_MESH |
1437 | case IEEE80211_IF_TYPE_MESH_POINT: | 1469 | case IEEE80211_IF_TYPE_MESH_POINT: |
1438 | fc |= IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS; | 1470 | fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); |
1439 | /* RA TA DA SA */ | 1471 | /* RA TA DA SA */ |
1440 | if (is_multicast_ether_addr(skb->data)) | 1472 | if (is_multicast_ether_addr(skb->data)) |
1441 | memcpy(hdr.addr1, skb->data, ETH_ALEN); | 1473 | memcpy(hdr.addr1, skb->data, ETH_ALEN); |
@@ -1465,7 +1497,7 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1465 | break; | 1497 | break; |
1466 | #endif | 1498 | #endif |
1467 | case IEEE80211_IF_TYPE_STA: | 1499 | case IEEE80211_IF_TYPE_STA: |
1468 | fc |= IEEE80211_FCTL_TODS; | 1500 | fc |= cpu_to_le16(IEEE80211_FCTL_TODS); |
1469 | /* BSSID SA DA */ | 1501 | /* BSSID SA DA */ |
1470 | memcpy(hdr.addr1, sdata->u.sta.bssid, ETH_ALEN); | 1502 | memcpy(hdr.addr1, sdata->u.sta.bssid, ETH_ALEN); |
1471 | memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); | 1503 | memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); |
@@ -1493,13 +1525,14 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1493 | rcu_read_lock(); | 1525 | rcu_read_lock(); |
1494 | sta = sta_info_get(local, hdr.addr1); | 1526 | sta = sta_info_get(local, hdr.addr1); |
1495 | if (sta) | 1527 | if (sta) |
1496 | sta_flags = sta->flags; | 1528 | sta_flags = get_sta_flags(sta); |
1497 | rcu_read_unlock(); | 1529 | rcu_read_unlock(); |
1498 | } | 1530 | } |
1499 | 1531 | ||
1500 | /* receiver is QoS enabled, use a QoS type frame */ | 1532 | /* receiver and we are QoS enabled, use a QoS type frame */ |
1501 | if (sta_flags & WLAN_STA_WME) { | 1533 | if (sta_flags & WLAN_STA_WME && |
1502 | fc |= IEEE80211_STYPE_QOS_DATA; | 1534 | ieee80211_num_regular_queues(&local->hw) >= 4) { |
1535 | fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); | ||
1503 | hdrlen += 2; | 1536 | hdrlen += 2; |
1504 | } | 1537 | } |
1505 | 1538 | ||
@@ -1527,7 +1560,7 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1527 | goto fail; | 1560 | goto fail; |
1528 | } | 1561 | } |
1529 | 1562 | ||
1530 | hdr.frame_control = cpu_to_le16(fc); | 1563 | hdr.frame_control = fc; |
1531 | hdr.duration_id = 0; | 1564 | hdr.duration_id = 0; |
1532 | hdr.seq_ctrl = 0; | 1565 | hdr.seq_ctrl = 0; |
1533 | 1566 | ||
@@ -1562,32 +1595,26 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1562 | * build in headroom in __dev_alloc_skb() (linux/skbuff.h) and | 1595 | * build in headroom in __dev_alloc_skb() (linux/skbuff.h) and |
1563 | * alloc_skb() (net/core/skbuff.c) | 1596 | * alloc_skb() (net/core/skbuff.c) |
1564 | */ | 1597 | */ |
1565 | head_need = hdrlen + encaps_len + meshhdrlen + local->tx_headroom; | 1598 | head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb); |
1566 | head_need -= skb_headroom(skb); | ||
1567 | 1599 | ||
1568 | /* We are going to modify skb data, so make a copy of it if happens to | 1600 | /* |
1569 | * be cloned. This could happen, e.g., with Linux bridge code passing | 1601 | * So we need to modify the skb header and hence need a copy of |
1570 | * us broadcast frames. */ | 1602 | * that. The head_need variable above doesn't, so far, include |
1603 | * the needed header space that we don't need right away. If we | ||
1604 | * can, then we don't reallocate right now but only after the | ||
1605 | * frame arrives at the master device (if it does...) | ||
1606 | * | ||
1607 | * If we cannot, however, then we will reallocate to include all | ||
1608 | * the ever needed space. Also, if we need to reallocate it anyway, | ||
1609 | * make it big enough for everything we may ever need. | ||
1610 | */ | ||
1571 | 1611 | ||
1572 | if (head_need > 0 || skb_cloned(skb)) { | 1612 | if (head_need > 0 || skb_cloned(skb)) { |
1573 | #if 0 | 1613 | head_need += IEEE80211_ENCRYPT_HEADROOM; |
1574 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " | 1614 | head_need += local->tx_headroom; |
1575 | "of headroom\n", dev->name, head_need); | 1615 | head_need = max_t(int, 0, head_need); |
1576 | #endif | 1616 | if (ieee80211_skb_resize(local, skb, head_need, true)) |
1577 | |||
1578 | if (skb_cloned(skb)) | ||
1579 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | ||
1580 | else | ||
1581 | I802_DEBUG_INC(local->tx_expand_skb_head); | ||
1582 | /* Since we have to reallocate the buffer, make sure that there | ||
1583 | * is enough room for possible WEP IV/ICV and TKIP (8 bytes | ||
1584 | * before payload and 12 after). */ | ||
1585 | if (pskb_expand_head(skb, (head_need > 0 ? head_need + 8 : 8), | ||
1586 | 12, GFP_ATOMIC)) { | ||
1587 | printk(KERN_DEBUG "%s: failed to reallocate TX buffer" | ||
1588 | "\n", dev->name); | ||
1589 | goto fail; | 1617 | goto fail; |
1590 | } | ||
1591 | } | 1618 | } |
1592 | 1619 | ||
1593 | if (encaps_data) { | 1620 | if (encaps_data) { |
@@ -1602,7 +1629,7 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1602 | h_pos += meshhdrlen; | 1629 | h_pos += meshhdrlen; |
1603 | } | 1630 | } |
1604 | 1631 | ||
1605 | if (fc & IEEE80211_STYPE_QOS_DATA) { | 1632 | if (ieee80211_is_data_qos(fc)) { |
1606 | __le16 *qos_control; | 1633 | __le16 *qos_control; |
1607 | 1634 | ||
1608 | qos_control = (__le16*) skb_push(skb, 2); | 1635 | qos_control = (__le16*) skb_push(skb, 2); |
@@ -1618,11 +1645,14 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1618 | nh_pos += hdrlen; | 1645 | nh_pos += hdrlen; |
1619 | h_pos += hdrlen; | 1646 | h_pos += hdrlen; |
1620 | 1647 | ||
1621 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | 1648 | info = IEEE80211_SKB_CB(skb); |
1622 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | 1649 | memset(info, 0, sizeof(*info)); |
1623 | pkt_data->ifindex = dev->ifindex; | 1650 | info->control.ifindex = dev->ifindex; |
1624 | if (ethertype == ETH_P_PAE) | 1651 | if (ethertype == ETH_P_PAE) |
1625 | pkt_data->flags |= IEEE80211_TXPD_EAPOL_FRAME; | 1652 | info->flags |= IEEE80211_TX_CTL_EAPOL_FRAME; |
1653 | |||
1654 | /* Interfaces should always request a status report */ | ||
1655 | info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; | ||
1626 | 1656 | ||
1627 | skb->dev = local->mdev; | 1657 | skb->dev = local->mdev; |
1628 | dev->stats.tx_packets++; | 1658 | dev->stats.tx_packets++; |
@@ -1647,46 +1677,55 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1647 | return ret; | 1677 | return ret; |
1648 | } | 1678 | } |
1649 | 1679 | ||
1650 | /* helper functions for pending packets for when queues are stopped */ | ||
1651 | 1680 | ||
1681 | /* | ||
1682 | * ieee80211_clear_tx_pending may not be called in a context where | ||
1683 | * it is possible that it packets could come in again. | ||
1684 | */ | ||
1652 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) | 1685 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) |
1653 | { | 1686 | { |
1654 | int i, j; | 1687 | int i, j; |
1655 | struct ieee80211_tx_stored_packet *store; | 1688 | struct ieee80211_tx_stored_packet *store; |
1656 | 1689 | ||
1657 | for (i = 0; i < local->hw.queues; i++) { | 1690 | for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { |
1658 | if (!__ieee80211_queue_pending(local, i)) | 1691 | if (!test_bit(i, local->queues_pending)) |
1659 | continue; | 1692 | continue; |
1660 | store = &local->pending_packet[i]; | 1693 | store = &local->pending_packet[i]; |
1661 | kfree_skb(store->skb); | 1694 | kfree_skb(store->skb); |
1662 | for (j = 0; j < store->num_extra_frag; j++) | 1695 | for (j = 0; j < store->num_extra_frag; j++) |
1663 | kfree_skb(store->extra_frag[j]); | 1696 | kfree_skb(store->extra_frag[j]); |
1664 | kfree(store->extra_frag); | 1697 | kfree(store->extra_frag); |
1665 | clear_bit(IEEE80211_LINK_STATE_PENDING, &local->state[i]); | 1698 | clear_bit(i, local->queues_pending); |
1666 | } | 1699 | } |
1667 | } | 1700 | } |
1668 | 1701 | ||
1702 | /* | ||
1703 | * Transmit all pending packets. Called from tasklet, locks master device | ||
1704 | * TX lock so that no new packets can come in. | ||
1705 | */ | ||
1669 | void ieee80211_tx_pending(unsigned long data) | 1706 | void ieee80211_tx_pending(unsigned long data) |
1670 | { | 1707 | { |
1671 | struct ieee80211_local *local = (struct ieee80211_local *)data; | 1708 | struct ieee80211_local *local = (struct ieee80211_local *)data; |
1672 | struct net_device *dev = local->mdev; | 1709 | struct net_device *dev = local->mdev; |
1673 | struct ieee80211_tx_stored_packet *store; | 1710 | struct ieee80211_tx_stored_packet *store; |
1674 | struct ieee80211_tx_data tx; | 1711 | struct ieee80211_tx_data tx; |
1675 | int i, ret, reschedule = 0; | 1712 | int i, ret; |
1676 | 1713 | ||
1677 | netif_tx_lock_bh(dev); | 1714 | netif_tx_lock_bh(dev); |
1678 | for (i = 0; i < local->hw.queues; i++) { | 1715 | for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { |
1679 | if (__ieee80211_queue_stopped(local, i)) | 1716 | /* Check that this queue is ok */ |
1717 | if (__netif_subqueue_stopped(local->mdev, i)) | ||
1680 | continue; | 1718 | continue; |
1681 | if (!__ieee80211_queue_pending(local, i)) { | 1719 | |
1682 | reschedule = 1; | 1720 | if (!test_bit(i, local->queues_pending)) { |
1721 | ieee80211_wake_queue(&local->hw, i); | ||
1683 | continue; | 1722 | continue; |
1684 | } | 1723 | } |
1724 | |||
1685 | store = &local->pending_packet[i]; | 1725 | store = &local->pending_packet[i]; |
1686 | tx.control = &store->control; | ||
1687 | tx.extra_frag = store->extra_frag; | 1726 | tx.extra_frag = store->extra_frag; |
1688 | tx.num_extra_frag = store->num_extra_frag; | 1727 | tx.num_extra_frag = store->num_extra_frag; |
1689 | tx.last_frag_rate = store->last_frag_rate; | 1728 | tx.last_frag_rate_idx = store->last_frag_rate_idx; |
1690 | tx.flags = 0; | 1729 | tx.flags = 0; |
1691 | if (store->last_frag_rate_ctrl_probe) | 1730 | if (store->last_frag_rate_ctrl_probe) |
1692 | tx.flags |= IEEE80211_TX_PROBE_LAST_FRAG; | 1731 | tx.flags |= IEEE80211_TX_PROBE_LAST_FRAG; |
@@ -1695,19 +1734,11 @@ void ieee80211_tx_pending(unsigned long data) | |||
1695 | if (ret == IEEE80211_TX_FRAG_AGAIN) | 1734 | if (ret == IEEE80211_TX_FRAG_AGAIN) |
1696 | store->skb = NULL; | 1735 | store->skb = NULL; |
1697 | } else { | 1736 | } else { |
1698 | clear_bit(IEEE80211_LINK_STATE_PENDING, | 1737 | clear_bit(i, local->queues_pending); |
1699 | &local->state[i]); | 1738 | ieee80211_wake_queue(&local->hw, i); |
1700 | reschedule = 1; | ||
1701 | } | 1739 | } |
1702 | } | 1740 | } |
1703 | netif_tx_unlock_bh(dev); | 1741 | netif_tx_unlock_bh(dev); |
1704 | if (reschedule) { | ||
1705 | if (!ieee80211_qdisc_installed(dev)) { | ||
1706 | if (!__ieee80211_queue_stopped(local, 0)) | ||
1707 | netif_wake_queue(dev); | ||
1708 | } else | ||
1709 | netif_schedule(dev); | ||
1710 | } | ||
1711 | } | 1742 | } |
1712 | 1743 | ||
1713 | /* functions for drivers to get certain frames */ | 1744 | /* functions for drivers to get certain frames */ |
@@ -1776,23 +1807,24 @@ static void ieee80211_beacon_add_tim(struct ieee80211_local *local, | |||
1776 | } | 1807 | } |
1777 | 1808 | ||
1778 | struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | 1809 | struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, |
1779 | struct ieee80211_vif *vif, | 1810 | struct ieee80211_vif *vif) |
1780 | struct ieee80211_tx_control *control) | ||
1781 | { | 1811 | { |
1782 | struct ieee80211_local *local = hw_to_local(hw); | 1812 | struct ieee80211_local *local = hw_to_local(hw); |
1783 | struct sk_buff *skb; | 1813 | struct sk_buff *skb = NULL; |
1814 | struct ieee80211_tx_info *info; | ||
1784 | struct net_device *bdev; | 1815 | struct net_device *bdev; |
1785 | struct ieee80211_sub_if_data *sdata = NULL; | 1816 | struct ieee80211_sub_if_data *sdata = NULL; |
1786 | struct ieee80211_if_ap *ap = NULL; | 1817 | struct ieee80211_if_ap *ap = NULL; |
1818 | struct ieee80211_if_sta *ifsta = NULL; | ||
1787 | struct rate_selection rsel; | 1819 | struct rate_selection rsel; |
1788 | struct beacon_data *beacon; | 1820 | struct beacon_data *beacon; |
1789 | struct ieee80211_supported_band *sband; | 1821 | struct ieee80211_supported_band *sband; |
1790 | struct ieee80211_mgmt *mgmt; | 1822 | struct ieee80211_mgmt *mgmt; |
1791 | int *num_beacons; | 1823 | int *num_beacons; |
1792 | bool err = true; | 1824 | enum ieee80211_band band = local->hw.conf.channel->band; |
1793 | u8 *pos; | 1825 | u8 *pos; |
1794 | 1826 | ||
1795 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 1827 | sband = local->hw.wiphy->bands[band]; |
1796 | 1828 | ||
1797 | rcu_read_lock(); | 1829 | rcu_read_lock(); |
1798 | 1830 | ||
@@ -1817,9 +1849,6 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1817 | memcpy(skb_put(skb, beacon->head_len), beacon->head, | 1849 | memcpy(skb_put(skb, beacon->head_len), beacon->head, |
1818 | beacon->head_len); | 1850 | beacon->head_len); |
1819 | 1851 | ||
1820 | ieee80211_include_sequence(sdata, | ||
1821 | (struct ieee80211_hdr *)skb->data); | ||
1822 | |||
1823 | /* | 1852 | /* |
1824 | * Not very nice, but we want to allow the driver to call | 1853 | * Not very nice, but we want to allow the driver to call |
1825 | * ieee80211_beacon_get() as a response to the set_tim() | 1854 | * ieee80211_beacon_get() as a response to the set_tim() |
@@ -1842,9 +1871,24 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1842 | beacon->tail, beacon->tail_len); | 1871 | beacon->tail, beacon->tail_len); |
1843 | 1872 | ||
1844 | num_beacons = &ap->num_beacons; | 1873 | num_beacons = &ap->num_beacons; |
1874 | } else | ||
1875 | goto out; | ||
1876 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | ||
1877 | struct ieee80211_hdr *hdr; | ||
1878 | ifsta = &sdata->u.sta; | ||
1845 | 1879 | ||
1846 | err = false; | 1880 | if (!ifsta->probe_resp) |
1847 | } | 1881 | goto out; |
1882 | |||
1883 | skb = skb_copy(ifsta->probe_resp, GFP_ATOMIC); | ||
1884 | if (!skb) | ||
1885 | goto out; | ||
1886 | |||
1887 | hdr = (struct ieee80211_hdr *) skb->data; | ||
1888 | hdr->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, | ||
1889 | IEEE80211_STYPE_BEACON); | ||
1890 | |||
1891 | num_beacons = &ifsta->num_beacons; | ||
1848 | } else if (ieee80211_vif_is_mesh(&sdata->vif)) { | 1892 | } else if (ieee80211_vif_is_mesh(&sdata->vif)) { |
1849 | /* headroom, head length, tail length and maximum TIM length */ | 1893 | /* headroom, head length, tail length and maximum TIM length */ |
1850 | skb = dev_alloc_skb(local->tx_headroom + 400); | 1894 | skb = dev_alloc_skb(local->tx_headroom + 400); |
@@ -1855,8 +1899,8 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1855 | mgmt = (struct ieee80211_mgmt *) | 1899 | mgmt = (struct ieee80211_mgmt *) |
1856 | skb_put(skb, 24 + sizeof(mgmt->u.beacon)); | 1900 | skb_put(skb, 24 + sizeof(mgmt->u.beacon)); |
1857 | memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon)); | 1901 | memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon)); |
1858 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, | 1902 | mgmt->frame_control = |
1859 | IEEE80211_STYPE_BEACON); | 1903 | cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON); |
1860 | memset(mgmt->da, 0xff, ETH_ALEN); | 1904 | memset(mgmt->da, 0xff, ETH_ALEN); |
1861 | memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); | 1905 | memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); |
1862 | /* BSSID is left zeroed, wildcard value */ | 1906 | /* BSSID is left zeroed, wildcard value */ |
@@ -1871,44 +1915,41 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1871 | mesh_mgmt_ies_add(skb, sdata->dev); | 1915 | mesh_mgmt_ies_add(skb, sdata->dev); |
1872 | 1916 | ||
1873 | num_beacons = &sdata->u.sta.num_beacons; | 1917 | num_beacons = &sdata->u.sta.num_beacons; |
1874 | 1918 | } else { | |
1875 | err = false; | 1919 | WARN_ON(1); |
1920 | goto out; | ||
1876 | } | 1921 | } |
1877 | 1922 | ||
1878 | if (err) { | 1923 | info = IEEE80211_SKB_CB(skb); |
1879 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 1924 | |
1880 | if (net_ratelimit()) | 1925 | info->band = band; |
1881 | printk(KERN_DEBUG "no beacon data avail for %s\n", | 1926 | rate_control_get_rate(local->mdev, sband, skb, &rsel); |
1882 | bdev->name); | 1927 | |
1883 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | 1928 | if (unlikely(rsel.rate_idx < 0)) { |
1929 | if (net_ratelimit()) { | ||
1930 | printk(KERN_DEBUG "%s: ieee80211_beacon_get: " | ||
1931 | "no rate found\n", | ||
1932 | wiphy_name(local->hw.wiphy)); | ||
1933 | } | ||
1934 | dev_kfree_skb(skb); | ||
1884 | skb = NULL; | 1935 | skb = NULL; |
1885 | goto out; | 1936 | goto out; |
1886 | } | 1937 | } |
1887 | 1938 | ||
1888 | if (control) { | 1939 | info->control.vif = vif; |
1889 | rate_control_get_rate(local->mdev, sband, skb, &rsel); | 1940 | info->tx_rate_idx = rsel.rate_idx; |
1890 | if (!rsel.rate) { | 1941 | |
1891 | if (net_ratelimit()) { | 1942 | info->flags |= IEEE80211_TX_CTL_NO_ACK; |
1892 | printk(KERN_DEBUG "%s: ieee80211_beacon_get: " | 1943 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
1893 | "no rate found\n", | 1944 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; |
1894 | wiphy_name(local->hw.wiphy)); | 1945 | info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; |
1895 | } | 1946 | if (sdata->bss_conf.use_short_preamble && |
1896 | dev_kfree_skb(skb); | 1947 | sband->bitrates[rsel.rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) |
1897 | skb = NULL; | 1948 | info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; |
1898 | goto out; | 1949 | |
1899 | } | 1950 | info->antenna_sel_tx = local->hw.conf.antenna_sel_tx; |
1951 | info->control.retry_limit = 1; | ||
1900 | 1952 | ||
1901 | control->vif = vif; | ||
1902 | control->tx_rate = rsel.rate; | ||
1903 | if (sdata->bss_conf.use_short_preamble && | ||
1904 | rsel.rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) | ||
1905 | control->flags |= IEEE80211_TXCTL_SHORT_PREAMBLE; | ||
1906 | control->antenna_sel_tx = local->hw.conf.antenna_sel_tx; | ||
1907 | control->flags |= IEEE80211_TXCTL_NO_ACK; | ||
1908 | control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | ||
1909 | control->retry_limit = 1; | ||
1910 | control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT; | ||
1911 | } | ||
1912 | (*num_beacons)++; | 1953 | (*num_beacons)++; |
1913 | out: | 1954 | out: |
1914 | rcu_read_unlock(); | 1955 | rcu_read_unlock(); |
@@ -1918,14 +1959,13 @@ EXPORT_SYMBOL(ieee80211_beacon_get); | |||
1918 | 1959 | ||
1919 | void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 1960 | void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1920 | const void *frame, size_t frame_len, | 1961 | const void *frame, size_t frame_len, |
1921 | const struct ieee80211_tx_control *frame_txctl, | 1962 | const struct ieee80211_tx_info *frame_txctl, |
1922 | struct ieee80211_rts *rts) | 1963 | struct ieee80211_rts *rts) |
1923 | { | 1964 | { |
1924 | const struct ieee80211_hdr *hdr = frame; | 1965 | const struct ieee80211_hdr *hdr = frame; |
1925 | u16 fctl; | ||
1926 | 1966 | ||
1927 | fctl = IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS; | 1967 | rts->frame_control = |
1928 | rts->frame_control = cpu_to_le16(fctl); | 1968 | cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS); |
1929 | rts->duration = ieee80211_rts_duration(hw, vif, frame_len, | 1969 | rts->duration = ieee80211_rts_duration(hw, vif, frame_len, |
1930 | frame_txctl); | 1970 | frame_txctl); |
1931 | memcpy(rts->ra, hdr->addr1, sizeof(rts->ra)); | 1971 | memcpy(rts->ra, hdr->addr1, sizeof(rts->ra)); |
@@ -1935,14 +1975,13 @@ EXPORT_SYMBOL(ieee80211_rts_get); | |||
1935 | 1975 | ||
1936 | void ieee80211_ctstoself_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 1976 | void ieee80211_ctstoself_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1937 | const void *frame, size_t frame_len, | 1977 | const void *frame, size_t frame_len, |
1938 | const struct ieee80211_tx_control *frame_txctl, | 1978 | const struct ieee80211_tx_info *frame_txctl, |
1939 | struct ieee80211_cts *cts) | 1979 | struct ieee80211_cts *cts) |
1940 | { | 1980 | { |
1941 | const struct ieee80211_hdr *hdr = frame; | 1981 | const struct ieee80211_hdr *hdr = frame; |
1942 | u16 fctl; | ||
1943 | 1982 | ||
1944 | fctl = IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS; | 1983 | cts->frame_control = |
1945 | cts->frame_control = cpu_to_le16(fctl); | 1984 | cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS); |
1946 | cts->duration = ieee80211_ctstoself_duration(hw, vif, | 1985 | cts->duration = ieee80211_ctstoself_duration(hw, vif, |
1947 | frame_len, frame_txctl); | 1986 | frame_len, frame_txctl); |
1948 | memcpy(cts->ra, hdr->addr1, sizeof(cts->ra)); | 1987 | memcpy(cts->ra, hdr->addr1, sizeof(cts->ra)); |
@@ -1951,23 +1990,21 @@ EXPORT_SYMBOL(ieee80211_ctstoself_get); | |||
1951 | 1990 | ||
1952 | struct sk_buff * | 1991 | struct sk_buff * |
1953 | ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | 1992 | ieee80211_get_buffered_bc(struct ieee80211_hw *hw, |
1954 | struct ieee80211_vif *vif, | 1993 | struct ieee80211_vif *vif) |
1955 | struct ieee80211_tx_control *control) | ||
1956 | { | 1994 | { |
1957 | struct ieee80211_local *local = hw_to_local(hw); | 1995 | struct ieee80211_local *local = hw_to_local(hw); |
1958 | struct sk_buff *skb; | 1996 | struct sk_buff *skb = NULL; |
1959 | struct sta_info *sta; | 1997 | struct sta_info *sta; |
1960 | ieee80211_tx_handler *handler; | ||
1961 | struct ieee80211_tx_data tx; | 1998 | struct ieee80211_tx_data tx; |
1962 | ieee80211_tx_result res = TX_DROP; | ||
1963 | struct net_device *bdev; | 1999 | struct net_device *bdev; |
1964 | struct ieee80211_sub_if_data *sdata; | 2000 | struct ieee80211_sub_if_data *sdata; |
1965 | struct ieee80211_if_ap *bss = NULL; | 2001 | struct ieee80211_if_ap *bss = NULL; |
1966 | struct beacon_data *beacon; | 2002 | struct beacon_data *beacon; |
2003 | struct ieee80211_tx_info *info; | ||
1967 | 2004 | ||
1968 | sdata = vif_to_sdata(vif); | 2005 | sdata = vif_to_sdata(vif); |
1969 | bdev = sdata->dev; | 2006 | bdev = sdata->dev; |
1970 | 2007 | bss = &sdata->u.ap; | |
1971 | 2008 | ||
1972 | if (!bss) | 2009 | if (!bss) |
1973 | return NULL; | 2010 | return NULL; |
@@ -1975,19 +2012,16 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | |||
1975 | rcu_read_lock(); | 2012 | rcu_read_lock(); |
1976 | beacon = rcu_dereference(bss->beacon); | 2013 | beacon = rcu_dereference(bss->beacon); |
1977 | 2014 | ||
1978 | if (sdata->vif.type != IEEE80211_IF_TYPE_AP || !beacon || | 2015 | if (sdata->vif.type != IEEE80211_IF_TYPE_AP || !beacon || !beacon->head) |
1979 | !beacon->head) { | 2016 | goto out; |
1980 | rcu_read_unlock(); | ||
1981 | return NULL; | ||
1982 | } | ||
1983 | 2017 | ||
1984 | if (bss->dtim_count != 0) | 2018 | if (bss->dtim_count != 0) |
1985 | return NULL; /* send buffered bc/mc only after DTIM beacon */ | 2019 | goto out; /* send buffered bc/mc only after DTIM beacon */ |
1986 | memset(control, 0, sizeof(*control)); | 2020 | |
1987 | while (1) { | 2021 | while (1) { |
1988 | skb = skb_dequeue(&bss->ps_bc_buf); | 2022 | skb = skb_dequeue(&bss->ps_bc_buf); |
1989 | if (!skb) | 2023 | if (!skb) |
1990 | return NULL; | 2024 | goto out; |
1991 | local->total_ps_buffered--; | 2025 | local->total_ps_buffered--; |
1992 | 2026 | ||
1993 | if (!skb_queue_empty(&bss->ps_bc_buf) && skb->len >= 2) { | 2027 | if (!skb_queue_empty(&bss->ps_bc_buf) && skb->len >= 2) { |
@@ -2000,30 +2034,21 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | |||
2000 | cpu_to_le16(IEEE80211_FCTL_MOREDATA); | 2034 | cpu_to_le16(IEEE80211_FCTL_MOREDATA); |
2001 | } | 2035 | } |
2002 | 2036 | ||
2003 | if (!ieee80211_tx_prepare(&tx, skb, local->mdev, control)) | 2037 | if (!ieee80211_tx_prepare(&tx, skb, local->mdev)) |
2004 | break; | 2038 | break; |
2005 | dev_kfree_skb_any(skb); | 2039 | dev_kfree_skb_any(skb); |
2006 | } | 2040 | } |
2041 | |||
2042 | info = IEEE80211_SKB_CB(skb); | ||
2043 | |||
2007 | sta = tx.sta; | 2044 | sta = tx.sta; |
2008 | tx.flags |= IEEE80211_TX_PS_BUFFERED; | 2045 | tx.flags |= IEEE80211_TX_PS_BUFFERED; |
2009 | tx.channel = local->hw.conf.channel; | 2046 | tx.channel = local->hw.conf.channel; |
2047 | info->band = tx.channel->band; | ||
2010 | 2048 | ||
2011 | for (handler = ieee80211_tx_handlers; *handler != NULL; handler++) { | 2049 | if (invoke_tx_handlers(&tx)) |
2012 | res = (*handler)(&tx); | ||
2013 | if (res == TX_DROP || res == TX_QUEUED) | ||
2014 | break; | ||
2015 | } | ||
2016 | skb = tx.skb; /* handlers are allowed to change skb */ | ||
2017 | |||
2018 | if (res == TX_DROP) { | ||
2019 | I802_DEBUG_INC(local->tx_handlers_drop); | ||
2020 | dev_kfree_skb(skb); | ||
2021 | skb = NULL; | ||
2022 | } else if (res == TX_QUEUED) { | ||
2023 | I802_DEBUG_INC(local->tx_handlers_queued); | ||
2024 | skb = NULL; | 2050 | skb = NULL; |
2025 | } | 2051 | out: |
2026 | |||
2027 | rcu_read_unlock(); | 2052 | rcu_read_unlock(); |
2028 | 2053 | ||
2029 | return skb; | 2054 | return skb; |