diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-06-25 06:32:01 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-06-25 06:32:01 -0400 |
| commit | da7878d75b8520c9ae00d27dfbbce546a7bfdfbb (patch) | |
| tree | 547fd497a80818a60ac36831377d5df97868173c /net/mac80211 | |
| parent | 0e50a4c6ab94ffe7e5515b86b5df9e5abc8c6b13 (diff) | |
| parent | 543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff) | |
Merge branch 'linus' into x86/pebs
Diffstat (limited to 'net/mac80211')
| -rw-r--r-- | net/mac80211/cfg.c | 4 | ||||
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 2 | ||||
| -rw-r--r-- | net/mac80211/main.c | 3 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 74 | ||||
| -rw-r--r-- | net/mac80211/rx.c | 4 | ||||
| -rw-r--r-- | net/mac80211/tx.c | 13 | ||||
| -rw-r--r-- | net/mac80211/util.c | 41 | ||||
| -rw-r--r-- | net/mac80211/wext.c | 28 | ||||
| -rw-r--r-- | net/mac80211/wme.c | 2 |
9 files changed, 117 insertions, 54 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 699d97b8de5e..a9fce4afdf21 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -672,7 +672,7 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, | |||
| 672 | if (params->vlan) { | 672 | if (params->vlan) { |
| 673 | sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); | 673 | sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); |
| 674 | 674 | ||
| 675 | if (sdata->vif.type != IEEE80211_IF_TYPE_VLAN || | 675 | if (sdata->vif.type != IEEE80211_IF_TYPE_VLAN && |
| 676 | sdata->vif.type != IEEE80211_IF_TYPE_AP) | 676 | sdata->vif.type != IEEE80211_IF_TYPE_AP) |
| 677 | return -EINVAL; | 677 | return -EINVAL; |
| 678 | } else | 678 | } else |
| @@ -760,7 +760,7 @@ static int ieee80211_change_station(struct wiphy *wiphy, | |||
| 760 | if (params->vlan && params->vlan != sta->sdata->dev) { | 760 | if (params->vlan && params->vlan != sta->sdata->dev) { |
| 761 | vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); | 761 | vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); |
| 762 | 762 | ||
| 763 | if (vlansdata->vif.type != IEEE80211_IF_TYPE_VLAN || | 763 | if (vlansdata->vif.type != IEEE80211_IF_TYPE_VLAN && |
| 764 | vlansdata->vif.type != IEEE80211_IF_TYPE_AP) { | 764 | vlansdata->vif.type != IEEE80211_IF_TYPE_AP) { |
| 765 | rcu_read_unlock(); | 765 | rcu_read_unlock(); |
| 766 | return -EINVAL; | 766 | return -EINVAL; |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index c7314bf4bec2..006486b26726 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -899,7 +899,7 @@ extern const struct iw_handler_def ieee80211_iw_handler_def; | |||
| 899 | 899 | ||
| 900 | 900 | ||
| 901 | /* ieee80211_ioctl.c */ | 901 | /* ieee80211_ioctl.c */ |
| 902 | int ieee80211_set_freq(struct ieee80211_local *local, int freq); | 902 | int ieee80211_set_freq(struct net_device *dev, int freq); |
| 903 | /* ieee80211_sta.c */ | 903 | /* ieee80211_sta.c */ |
| 904 | void ieee80211_sta_timer(unsigned long data); | 904 | void ieee80211_sta_timer(unsigned long data); |
| 905 | void ieee80211_sta_work(struct work_struct *work); | 905 | void ieee80211_sta_work(struct work_struct *work); |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 915afadb0602..98c0b5e56ecc 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -511,6 +511,7 @@ static int ieee80211_stop(struct net_device *dev) | |||
| 511 | case IEEE80211_IF_TYPE_STA: | 511 | case IEEE80211_IF_TYPE_STA: |
| 512 | case IEEE80211_IF_TYPE_IBSS: | 512 | case IEEE80211_IF_TYPE_IBSS: |
| 513 | sdata->u.sta.state = IEEE80211_DISABLED; | 513 | sdata->u.sta.state = IEEE80211_DISABLED; |
| 514 | memset(sdata->u.sta.bssid, 0, ETH_ALEN); | ||
| 514 | del_timer_sync(&sdata->u.sta.timer); | 515 | del_timer_sync(&sdata->u.sta.timer); |
| 515 | /* | 516 | /* |
| 516 | * When we get here, the interface is marked down. | 517 | * When we get here, the interface is marked down. |
| @@ -1313,7 +1314,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
| 1313 | /* | 1314 | /* |
| 1314 | * Clear the TX filter mask for this STA when sending the next | 1315 | * Clear the TX filter mask for this STA when sending the next |
| 1315 | * packet. If the STA went to power save mode, this will happen | 1316 | * packet. If the STA went to power save mode, this will happen |
| 1316 | * happen when it wakes up for the next time. | 1317 | * when it wakes up for the next time. |
| 1317 | */ | 1318 | */ |
| 1318 | sta->flags |= WLAN_STA_CLEAR_PS_FILT; | 1319 | sta->flags |= WLAN_STA_CLEAR_PS_FILT; |
| 1319 | 1320 | ||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 4adba09e80ca..4d2b582dd055 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | #define IEEE80211_RETRY_AUTH_INTERVAL (1 * HZ) | 44 | #define IEEE80211_RETRY_AUTH_INTERVAL (1 * HZ) |
| 45 | #define IEEE80211_SCAN_INTERVAL (2 * HZ) | 45 | #define IEEE80211_SCAN_INTERVAL (2 * HZ) |
| 46 | #define IEEE80211_SCAN_INTERVAL_SLOW (15 * HZ) | 46 | #define IEEE80211_SCAN_INTERVAL_SLOW (15 * HZ) |
| 47 | #define IEEE80211_IBSS_JOIN_TIMEOUT (20 * HZ) | 47 | #define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ) |
| 48 | 48 | ||
| 49 | #define IEEE80211_PROBE_DELAY (HZ / 33) | 49 | #define IEEE80211_PROBE_DELAY (HZ / 33) |
| 50 | #define IEEE80211_CHANNEL_TIME (HZ / 33) | 50 | #define IEEE80211_CHANNEL_TIME (HZ / 33) |
| @@ -730,7 +730,17 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
| 730 | if (bss->wmm_ie) { | 730 | if (bss->wmm_ie) { |
| 731 | wmm = 1; | 731 | wmm = 1; |
| 732 | } | 732 | } |
| 733 | |||
| 734 | /* get all rates supported by the device and the AP as | ||
| 735 | * some APs don't like getting a superset of their rates | ||
| 736 | * in the association request (e.g. D-Link DAP 1353 in | ||
| 737 | * b-only mode) */ | ||
| 738 | rates_len = ieee80211_compatible_rates(bss, sband, &rates); | ||
| 739 | |||
| 733 | ieee80211_rx_bss_put(dev, bss); | 740 | ieee80211_rx_bss_put(dev, bss); |
| 741 | } else { | ||
| 742 | rates = ~0; | ||
| 743 | rates_len = sband->n_bitrates; | ||
| 734 | } | 744 | } |
| 735 | 745 | ||
| 736 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24); | 746 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24); |
| @@ -761,10 +771,7 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
| 761 | *pos++ = ifsta->ssid_len; | 771 | *pos++ = ifsta->ssid_len; |
| 762 | memcpy(pos, ifsta->ssid, ifsta->ssid_len); | 772 | memcpy(pos, ifsta->ssid, ifsta->ssid_len); |
| 763 | 773 | ||
| 764 | /* all supported rates should be added here but some APs | 774 | /* add all rates which were marked to be used above */ |
| 765 | * (e.g. D-Link DAP 1353 in b-only mode) don't like that | ||
| 766 | * Therefore only add rates the AP supports */ | ||
| 767 | rates_len = ieee80211_compatible_rates(bss, sband, &rates); | ||
| 768 | supp_rates_len = rates_len; | 775 | supp_rates_len = rates_len; |
| 769 | if (supp_rates_len > 8) | 776 | if (supp_rates_len > 8) |
| 770 | supp_rates_len = 8; | 777 | supp_rates_len = 8; |
| @@ -1318,7 +1325,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, | |||
| 1318 | 1325 | ||
| 1319 | /* prepare reordering buffer */ | 1326 | /* prepare reordering buffer */ |
| 1320 | tid_agg_rx->reorder_buf = | 1327 | tid_agg_rx->reorder_buf = |
| 1321 | kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC); | 1328 | kmalloc(buf_size * sizeof(struct sk_buff *), GFP_ATOMIC); |
| 1322 | if (!tid_agg_rx->reorder_buf) { | 1329 | if (!tid_agg_rx->reorder_buf) { |
| 1323 | if (net_ratelimit()) | 1330 | if (net_ratelimit()) |
| 1324 | printk(KERN_ERR "can not allocate reordering buffer " | 1331 | printk(KERN_ERR "can not allocate reordering buffer " |
| @@ -1327,7 +1334,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, | |||
| 1327 | goto end; | 1334 | goto end; |
| 1328 | } | 1335 | } |
| 1329 | memset(tid_agg_rx->reorder_buf, 0, | 1336 | memset(tid_agg_rx->reorder_buf, 0, |
| 1330 | buf_size * sizeof(struct sk_buf *)); | 1337 | buf_size * sizeof(struct sk_buff *)); |
| 1331 | 1338 | ||
| 1332 | if (local->ops->ampdu_action) | 1339 | if (local->ops->ampdu_action) |
| 1333 | ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_START, | 1340 | ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_START, |
| @@ -1607,7 +1614,7 @@ void sta_addba_resp_timer_expired(unsigned long data) | |||
| 1607 | * only one argument, and both sta_info and TID are needed, so init | 1614 | * only one argument, and both sta_info and TID are needed, so init |
| 1608 | * flow in sta_info_create gives the TID as data, while the timer_to_id | 1615 | * flow in sta_info_create gives the TID as data, while the timer_to_id |
| 1609 | * array gives the sta through container_of */ | 1616 | * array gives the sta through container_of */ |
| 1610 | u16 tid = *(int *)data; | 1617 | u16 tid = *(u8 *)data; |
| 1611 | struct sta_info *temp_sta = container_of((void *)data, | 1618 | struct sta_info *temp_sta = container_of((void *)data, |
| 1612 | struct sta_info, timer_to_tid[tid]); | 1619 | struct sta_info, timer_to_tid[tid]); |
| 1613 | 1620 | ||
| @@ -1655,7 +1662,7 @@ timer_expired_exit: | |||
| 1655 | void sta_rx_agg_session_timer_expired(unsigned long data) | 1662 | void sta_rx_agg_session_timer_expired(unsigned long data) |
| 1656 | { | 1663 | { |
| 1657 | /* not an elegant detour, but there is no choice as the timer passes | 1664 | /* not an elegant detour, but there is no choice as the timer passes |
| 1658 | * only one argument, and verious sta_info are needed here, so init | 1665 | * only one argument, and various sta_info are needed here, so init |
| 1659 | * flow in sta_info_create gives the TID as data, while the timer_to_id | 1666 | * flow in sta_info_create gives the TID as data, while the timer_to_id |
| 1660 | * array gives the sta through container_of */ | 1667 | * array gives the sta through container_of */ |
| 1661 | u8 *ptid = (u8 *)data; | 1668 | u8 *ptid = (u8 *)data; |
| @@ -2329,6 +2336,7 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, | |||
| 2329 | u8 *pos; | 2336 | u8 *pos; |
| 2330 | struct ieee80211_sub_if_data *sdata; | 2337 | struct ieee80211_sub_if_data *sdata; |
| 2331 | struct ieee80211_supported_band *sband; | 2338 | struct ieee80211_supported_band *sband; |
| 2339 | union iwreq_data wrqu; | ||
| 2332 | 2340 | ||
| 2333 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 2341 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; |
| 2334 | 2342 | ||
| @@ -2351,13 +2359,10 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, | |||
| 2351 | sdata->drop_unencrypted = bss->capability & | 2359 | sdata->drop_unencrypted = bss->capability & |
| 2352 | WLAN_CAPABILITY_PRIVACY ? 1 : 0; | 2360 | WLAN_CAPABILITY_PRIVACY ? 1 : 0; |
| 2353 | 2361 | ||
| 2354 | res = ieee80211_set_freq(local, bss->freq); | 2362 | res = ieee80211_set_freq(dev, bss->freq); |
| 2355 | 2363 | ||
| 2356 | if (local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS) { | 2364 | if (res) |
| 2357 | printk(KERN_DEBUG "%s: IBSS not allowed on frequency " | 2365 | return res; |
| 2358 | "%d MHz\n", dev->name, local->oper_channel->center_freq); | ||
| 2359 | return -1; | ||
| 2360 | } | ||
| 2361 | 2366 | ||
| 2362 | /* Set beacon template */ | 2367 | /* Set beacon template */ |
| 2363 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400); | 2368 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400); |
| @@ -2472,7 +2477,9 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, | |||
| 2472 | ifsta->state = IEEE80211_IBSS_JOINED; | 2477 | ifsta->state = IEEE80211_IBSS_JOINED; |
| 2473 | mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL); | 2478 | mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL); |
| 2474 | 2479 | ||
| 2475 | ieee80211_rx_bss_put(dev, bss); | 2480 | memset(&wrqu, 0, sizeof(wrqu)); |
| 2481 | memcpy(wrqu.ap_addr.sa_data, bss->bssid, ETH_ALEN); | ||
| 2482 | wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); | ||
| 2476 | 2483 | ||
| 2477 | return res; | 2484 | return res; |
| 2478 | } | 2485 | } |
| @@ -3446,21 +3453,17 @@ static int ieee80211_sta_config_auth(struct net_device *dev, | |||
| 3446 | struct ieee80211_sta_bss *bss, *selected = NULL; | 3453 | struct ieee80211_sta_bss *bss, *selected = NULL; |
| 3447 | int top_rssi = 0, freq; | 3454 | int top_rssi = 0, freq; |
| 3448 | 3455 | ||
| 3449 | if (!(ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL | | ||
| 3450 | IEEE80211_STA_AUTO_BSSID_SEL | IEEE80211_STA_AUTO_CHANNEL_SEL))) { | ||
| 3451 | ifsta->state = IEEE80211_AUTHENTICATE; | ||
| 3452 | ieee80211_sta_reset_auth(dev, ifsta); | ||
| 3453 | return 0; | ||
| 3454 | } | ||
| 3455 | |||
| 3456 | spin_lock_bh(&local->sta_bss_lock); | 3456 | spin_lock_bh(&local->sta_bss_lock); |
| 3457 | freq = local->oper_channel->center_freq; | 3457 | freq = local->oper_channel->center_freq; |
| 3458 | list_for_each_entry(bss, &local->sta_bss_list, list) { | 3458 | list_for_each_entry(bss, &local->sta_bss_list, list) { |
| 3459 | if (!(bss->capability & WLAN_CAPABILITY_ESS)) | 3459 | if (!(bss->capability & WLAN_CAPABILITY_ESS)) |
| 3460 | continue; | 3460 | continue; |
| 3461 | 3461 | ||
| 3462 | if (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^ | 3462 | if ((ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL | |
| 3463 | !!sdata->default_key) | 3463 | IEEE80211_STA_AUTO_BSSID_SEL | |
| 3464 | IEEE80211_STA_AUTO_CHANNEL_SEL)) && | ||
| 3465 | (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^ | ||
| 3466 | !!sdata->default_key)) | ||
| 3464 | continue; | 3467 | continue; |
| 3465 | 3468 | ||
| 3466 | if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) && | 3469 | if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) && |
| @@ -3485,7 +3488,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev, | |||
| 3485 | spin_unlock_bh(&local->sta_bss_lock); | 3488 | spin_unlock_bh(&local->sta_bss_lock); |
| 3486 | 3489 | ||
| 3487 | if (selected) { | 3490 | if (selected) { |
| 3488 | ieee80211_set_freq(local, selected->freq); | 3491 | ieee80211_set_freq(dev, selected->freq); |
| 3489 | if (!(ifsta->flags & IEEE80211_STA_SSID_SET)) | 3492 | if (!(ifsta->flags & IEEE80211_STA_SSID_SET)) |
| 3490 | ieee80211_sta_set_ssid(dev, selected->ssid, | 3493 | ieee80211_sta_set_ssid(dev, selected->ssid, |
| 3491 | selected->ssid_len); | 3494 | selected->ssid_len); |
| @@ -3520,6 +3523,7 @@ static int ieee80211_sta_create_ibss(struct net_device *dev, | |||
| 3520 | struct ieee80211_supported_band *sband; | 3523 | struct ieee80211_supported_band *sband; |
| 3521 | u8 bssid[ETH_ALEN], *pos; | 3524 | u8 bssid[ETH_ALEN], *pos; |
| 3522 | int i; | 3525 | int i; |
| 3526 | int ret; | ||
| 3523 | DECLARE_MAC_BUF(mac); | 3527 | DECLARE_MAC_BUF(mac); |
| 3524 | 3528 | ||
| 3525 | #if 0 | 3529 | #if 0 |
| @@ -3564,7 +3568,9 @@ static int ieee80211_sta_create_ibss(struct net_device *dev, | |||
| 3564 | *pos++ = (u8) (rate / 5); | 3568 | *pos++ = (u8) (rate / 5); |
| 3565 | } | 3569 | } |
| 3566 | 3570 | ||
| 3567 | return ieee80211_sta_join_ibss(dev, ifsta, bss); | 3571 | ret = ieee80211_sta_join_ibss(dev, ifsta, bss); |
| 3572 | ieee80211_rx_bss_put(dev, bss); | ||
| 3573 | return ret; | ||
| 3568 | } | 3574 | } |
| 3569 | 3575 | ||
| 3570 | 3576 | ||
| @@ -3612,10 +3618,13 @@ static int ieee80211_sta_find_ibss(struct net_device *dev, | |||
| 3612 | (bss = ieee80211_rx_bss_get(dev, bssid, | 3618 | (bss = ieee80211_rx_bss_get(dev, bssid, |
| 3613 | local->hw.conf.channel->center_freq, | 3619 | local->hw.conf.channel->center_freq, |
| 3614 | ifsta->ssid, ifsta->ssid_len))) { | 3620 | ifsta->ssid, ifsta->ssid_len))) { |
| 3621 | int ret; | ||
| 3615 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %s" | 3622 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %s" |
| 3616 | " based on configured SSID\n", | 3623 | " based on configured SSID\n", |
| 3617 | dev->name, print_mac(mac, bssid)); | 3624 | dev->name, print_mac(mac, bssid)); |
| 3618 | return ieee80211_sta_join_ibss(dev, ifsta, bss); | 3625 | ret = ieee80211_sta_join_ibss(dev, ifsta, bss); |
| 3626 | ieee80211_rx_bss_put(dev, bss); | ||
| 3627 | return ret; | ||
| 3619 | } | 3628 | } |
| 3620 | #ifdef CONFIG_MAC80211_IBSS_DEBUG | 3629 | #ifdef CONFIG_MAC80211_IBSS_DEBUG |
| 3621 | printk(KERN_DEBUG " did not try to join ibss\n"); | 3630 | printk(KERN_DEBUG " did not try to join ibss\n"); |
| @@ -4092,18 +4101,17 @@ ieee80211_sta_scan_result(struct net_device *dev, | |||
| 4092 | 4101 | ||
| 4093 | memset(&iwe, 0, sizeof(iwe)); | 4102 | memset(&iwe, 0, sizeof(iwe)); |
| 4094 | iwe.cmd = SIOCGIWFREQ; | 4103 | iwe.cmd = SIOCGIWFREQ; |
| 4095 | iwe.u.freq.m = bss->freq; | 4104 | iwe.u.freq.m = ieee80211_frequency_to_channel(bss->freq); |
| 4096 | iwe.u.freq.e = 6; | 4105 | iwe.u.freq.e = 0; |
| 4097 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 4106 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
| 4098 | IW_EV_FREQ_LEN); | 4107 | IW_EV_FREQ_LEN); |
| 4099 | 4108 | ||
| 4100 | memset(&iwe, 0, sizeof(iwe)); | 4109 | memset(&iwe, 0, sizeof(iwe)); |
| 4101 | iwe.cmd = SIOCGIWFREQ; | 4110 | iwe.cmd = SIOCGIWFREQ; |
| 4102 | iwe.u.freq.m = ieee80211_frequency_to_channel(bss->freq); | 4111 | iwe.u.freq.m = bss->freq; |
| 4103 | iwe.u.freq.e = 0; | 4112 | iwe.u.freq.e = 6; |
| 4104 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 4113 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
| 4105 | IW_EV_FREQ_LEN); | 4114 | IW_EV_FREQ_LEN); |
| 4106 | |||
| 4107 | memset(&iwe, 0, sizeof(iwe)); | 4115 | memset(&iwe, 0, sizeof(iwe)); |
| 4108 | iwe.cmd = IWEVQUAL; | 4116 | iwe.cmd = IWEVQUAL; |
| 4109 | iwe.u.qual.qual = bss->signal; | 4117 | iwe.u.qual.qual = bss->signal; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 1958bfb361c6..0941e5d6a522 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -1091,7 +1091,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx) | |||
| 1091 | u16 fc, hdrlen, ethertype; | 1091 | u16 fc, hdrlen, ethertype; |
| 1092 | u8 *payload; | 1092 | u8 *payload; |
| 1093 | u8 dst[ETH_ALEN]; | 1093 | u8 dst[ETH_ALEN]; |
| 1094 | u8 src[ETH_ALEN]; | 1094 | u8 src[ETH_ALEN] __aligned(2); |
| 1095 | struct sk_buff *skb = rx->skb; | 1095 | struct sk_buff *skb = rx->skb; |
| 1096 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1096 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 1097 | DECLARE_MAC_BUF(mac); | 1097 | DECLARE_MAC_BUF(mac); |
| @@ -1234,7 +1234,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx) | |||
| 1234 | */ | 1234 | */ |
| 1235 | static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx) | 1235 | static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx) |
| 1236 | { | 1236 | { |
| 1237 | static const u8 pae_group_addr[ETH_ALEN] | 1237 | static const u8 pae_group_addr[ETH_ALEN] __aligned(2) |
| 1238 | = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 }; | 1238 | = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 }; |
| 1239 | struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; | 1239 | struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; |
| 1240 | 1240 | ||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 1d7dd54aacef..c80d5899f279 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1132,7 +1132,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
| 1132 | ieee80211_tx_handler *handler; | 1132 | ieee80211_tx_handler *handler; |
| 1133 | struct ieee80211_tx_data tx; | 1133 | struct ieee80211_tx_data tx; |
| 1134 | ieee80211_tx_result res = TX_DROP, res_prepare; | 1134 | ieee80211_tx_result res = TX_DROP, res_prepare; |
| 1135 | int ret, i; | 1135 | int ret, i, retries = 0; |
| 1136 | 1136 | ||
| 1137 | WARN_ON(__ieee80211_queue_pending(local, control->queue)); | 1137 | WARN_ON(__ieee80211_queue_pending(local, control->queue)); |
| 1138 | 1138 | ||
| @@ -1216,6 +1216,13 @@ retry: | |||
| 1216 | if (!__ieee80211_queue_stopped(local, control->queue)) { | 1216 | if (!__ieee80211_queue_stopped(local, control->queue)) { |
| 1217 | clear_bit(IEEE80211_LINK_STATE_PENDING, | 1217 | clear_bit(IEEE80211_LINK_STATE_PENDING, |
| 1218 | &local->state[control->queue]); | 1218 | &local->state[control->queue]); |
| 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; | ||
| 1219 | goto retry; | 1226 | goto retry; |
| 1220 | } | 1227 | } |
| 1221 | memcpy(&store->control, control, | 1228 | memcpy(&store->control, control, |
| @@ -1562,13 +1569,13 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
| 1562 | * be cloned. This could happen, e.g., with Linux bridge code passing | 1569 | * be cloned. This could happen, e.g., with Linux bridge code passing |
| 1563 | * us broadcast frames. */ | 1570 | * us broadcast frames. */ |
| 1564 | 1571 | ||
| 1565 | if (head_need > 0 || skb_header_cloned(skb)) { | 1572 | if (head_need > 0 || skb_cloned(skb)) { |
| 1566 | #if 0 | 1573 | #if 0 |
| 1567 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " | 1574 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " |
| 1568 | "of headroom\n", dev->name, head_need); | 1575 | "of headroom\n", dev->name, head_need); |
| 1569 | #endif | 1576 | #endif |
| 1570 | 1577 | ||
| 1571 | if (skb_header_cloned(skb)) | 1578 | if (skb_cloned(skb)) |
| 1572 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | 1579 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); |
| 1573 | else | 1580 | else |
| 1574 | I802_DEBUG_INC(local->tx_expand_skb_head); | 1581 | I802_DEBUG_INC(local->tx_expand_skb_head); |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 24a465c4df09..4e97b266f907 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -34,11 +34,11 @@ void *mac80211_wiphy_privid = &mac80211_wiphy_privid; | |||
| 34 | 34 | ||
| 35 | /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ | 35 | /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ |
| 36 | /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ | 36 | /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ |
| 37 | const unsigned char rfc1042_header[] = | 37 | const unsigned char rfc1042_header[] __aligned(2) = |
| 38 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; | 38 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; |
| 39 | 39 | ||
| 40 | /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ | 40 | /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ |
| 41 | const unsigned char bridge_tunnel_header[] = | 41 | const unsigned char bridge_tunnel_header[] __aligned(2) = |
| 42 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; | 42 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; |
| 43 | 43 | ||
| 44 | 44 | ||
| @@ -389,6 +389,41 @@ void ieee80211_iterate_active_interfaces( | |||
| 389 | struct ieee80211_local *local = hw_to_local(hw); | 389 | struct ieee80211_local *local = hw_to_local(hw); |
| 390 | struct ieee80211_sub_if_data *sdata; | 390 | struct ieee80211_sub_if_data *sdata; |
| 391 | 391 | ||
| 392 | rtnl_lock(); | ||
| 393 | |||
| 394 | list_for_each_entry(sdata, &local->interfaces, list) { | ||
| 395 | switch (sdata->vif.type) { | ||
| 396 | case IEEE80211_IF_TYPE_INVALID: | ||
| 397 | case IEEE80211_IF_TYPE_MNTR: | ||
| 398 | case IEEE80211_IF_TYPE_VLAN: | ||
| 399 | continue; | ||
| 400 | case IEEE80211_IF_TYPE_AP: | ||
| 401 | case IEEE80211_IF_TYPE_STA: | ||
| 402 | case IEEE80211_IF_TYPE_IBSS: | ||
| 403 | case IEEE80211_IF_TYPE_WDS: | ||
| 404 | case IEEE80211_IF_TYPE_MESH_POINT: | ||
| 405 | break; | ||
| 406 | } | ||
| 407 | if (sdata->dev == local->mdev) | ||
| 408 | continue; | ||
| 409 | if (netif_running(sdata->dev)) | ||
| 410 | iterator(data, sdata->dev->dev_addr, | ||
| 411 | &sdata->vif); | ||
| 412 | } | ||
| 413 | |||
| 414 | rtnl_unlock(); | ||
| 415 | } | ||
| 416 | EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces); | ||
| 417 | |||
| 418 | void ieee80211_iterate_active_interfaces_atomic( | ||
| 419 | struct ieee80211_hw *hw, | ||
| 420 | void (*iterator)(void *data, u8 *mac, | ||
| 421 | struct ieee80211_vif *vif), | ||
| 422 | void *data) | ||
| 423 | { | ||
| 424 | struct ieee80211_local *local = hw_to_local(hw); | ||
| 425 | struct ieee80211_sub_if_data *sdata; | ||
| 426 | |||
| 392 | rcu_read_lock(); | 427 | rcu_read_lock(); |
| 393 | 428 | ||
| 394 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { | 429 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { |
| @@ -413,4 +448,4 @@ void ieee80211_iterate_active_interfaces( | |||
| 413 | 448 | ||
| 414 | rcu_read_unlock(); | 449 | rcu_read_unlock(); |
| 415 | } | 450 | } |
| 416 | EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces); | 451 | EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic); |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 76e1de1dc735..6106cb79060c 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
| @@ -209,7 +209,6 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev, | |||
| 209 | range->num_frequency = c; | 209 | range->num_frequency = c; |
| 210 | 210 | ||
| 211 | IW_EVENT_CAPA_SET_KERNEL(range->event_capa); | 211 | IW_EVENT_CAPA_SET_KERNEL(range->event_capa); |
| 212 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWTHRSPY); | ||
| 213 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); | 212 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); |
| 214 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); | 213 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); |
| 215 | 214 | ||
| @@ -291,14 +290,22 @@ static int ieee80211_ioctl_giwmode(struct net_device *dev, | |||
| 291 | return 0; | 290 | return 0; |
| 292 | } | 291 | } |
| 293 | 292 | ||
| 294 | int ieee80211_set_freq(struct ieee80211_local *local, int freqMHz) | 293 | int ieee80211_set_freq(struct net_device *dev, int freqMHz) |
| 295 | { | 294 | { |
| 296 | int ret = -EINVAL; | 295 | int ret = -EINVAL; |
| 297 | struct ieee80211_channel *chan; | 296 | struct ieee80211_channel *chan; |
| 297 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
| 298 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
| 298 | 299 | ||
| 299 | chan = ieee80211_get_channel(local->hw.wiphy, freqMHz); | 300 | chan = ieee80211_get_channel(local->hw.wiphy, freqMHz); |
| 300 | 301 | ||
| 301 | if (chan && !(chan->flags & IEEE80211_CHAN_DISABLED)) { | 302 | if (chan && !(chan->flags & IEEE80211_CHAN_DISABLED)) { |
| 303 | if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS && | ||
| 304 | chan->flags & IEEE80211_CHAN_NO_IBSS) { | ||
| 305 | printk(KERN_DEBUG "%s: IBSS not allowed on frequency " | ||
| 306 | "%d MHz\n", dev->name, chan->center_freq); | ||
| 307 | return ret; | ||
| 308 | } | ||
| 302 | local->oper_channel = chan; | 309 | local->oper_channel = chan; |
| 303 | 310 | ||
| 304 | if (local->sta_sw_scanning || local->sta_hw_scanning) | 311 | if (local->sta_sw_scanning || local->sta_hw_scanning) |
| @@ -316,7 +323,6 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev, | |||
| 316 | struct iw_request_info *info, | 323 | struct iw_request_info *info, |
| 317 | struct iw_freq *freq, char *extra) | 324 | struct iw_freq *freq, char *extra) |
| 318 | { | 325 | { |
| 319 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
| 320 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 326 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 321 | 327 | ||
| 322 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA) | 328 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA) |
| @@ -330,14 +336,14 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev, | |||
| 330 | IEEE80211_STA_AUTO_CHANNEL_SEL; | 336 | IEEE80211_STA_AUTO_CHANNEL_SEL; |
| 331 | return 0; | 337 | return 0; |
| 332 | } else | 338 | } else |
| 333 | return ieee80211_set_freq(local, | 339 | return ieee80211_set_freq(dev, |
| 334 | ieee80211_channel_to_frequency(freq->m)); | 340 | ieee80211_channel_to_frequency(freq->m)); |
| 335 | } else { | 341 | } else { |
| 336 | int i, div = 1000000; | 342 | int i, div = 1000000; |
| 337 | for (i = 0; i < freq->e; i++) | 343 | for (i = 0; i < freq->e; i++) |
| 338 | div /= 10; | 344 | div /= 10; |
| 339 | if (div > 0) | 345 | if (div > 0) |
| 340 | return ieee80211_set_freq(local, freq->m / div); | 346 | return ieee80211_set_freq(dev, freq->m / div); |
| 341 | else | 347 | else |
| 342 | return -EINVAL; | 348 | return -EINVAL; |
| 343 | } | 349 | } |
| @@ -490,9 +496,15 @@ static int ieee80211_ioctl_giwap(struct net_device *dev, | |||
| 490 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 496 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 491 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || | 497 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || |
| 492 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | 498 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { |
| 493 | ap_addr->sa_family = ARPHRD_ETHER; | 499 | if (sdata->u.sta.state == IEEE80211_ASSOCIATED || |
| 494 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); | 500 | sdata->u.sta.state == IEEE80211_IBSS_JOINED) { |
| 495 | return 0; | 501 | ap_addr->sa_family = ARPHRD_ETHER; |
| 502 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); | ||
| 503 | return 0; | ||
| 504 | } else { | ||
| 505 | memset(&ap_addr->sa_data, 0, ETH_ALEN); | ||
| 506 | return 0; | ||
| 507 | } | ||
| 496 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) { | 508 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) { |
| 497 | ap_addr->sa_family = ARPHRD_ETHER; | 509 | ap_addr->sa_family = ARPHRD_ETHER; |
| 498 | memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN); | 510 | memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN); |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index dc1598b86004..635b996c8c35 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
| @@ -673,7 +673,7 @@ int ieee80211_ht_agg_queue_add(struct ieee80211_local *local, | |||
| 673 | #ifdef CONFIG_MAC80211_HT_DEBUG | 673 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| 674 | if (net_ratelimit()) | 674 | if (net_ratelimit()) |
| 675 | printk(KERN_DEBUG "allocated aggregation queue" | 675 | printk(KERN_DEBUG "allocated aggregation queue" |
| 676 | " %d tid %d addr %s pool=0x%lX", | 676 | " %d tid %d addr %s pool=0x%lX\n", |
| 677 | i, tid, print_mac(mac, sta->addr), | 677 | i, tid, print_mac(mac, sta->addr), |
| 678 | q->qdisc_pool[0]); | 678 | q->qdisc_pool[0]); |
| 679 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 679 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
