diff options
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r-- | net/mac80211/util.c | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index a7368870c8ee..447e6651e7fa 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -738,17 +738,11 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
738 | elems->supp_rates = pos; | 738 | elems->supp_rates = pos; |
739 | elems->supp_rates_len = elen; | 739 | elems->supp_rates_len = elen; |
740 | break; | 740 | break; |
741 | case WLAN_EID_FH_PARAMS: | ||
742 | elems->fh_params = pos; | ||
743 | elems->fh_params_len = elen; | ||
744 | break; | ||
745 | case WLAN_EID_DS_PARAMS: | 741 | case WLAN_EID_DS_PARAMS: |
746 | elems->ds_params = pos; | 742 | if (elen >= 1) |
747 | elems->ds_params_len = elen; | 743 | elems->ds_params = pos; |
748 | break; | 744 | else |
749 | case WLAN_EID_CF_PARAMS: | 745 | elem_parse_failed = true; |
750 | elems->cf_params = pos; | ||
751 | elems->cf_params_len = elen; | ||
752 | break; | 746 | break; |
753 | case WLAN_EID_TIM: | 747 | case WLAN_EID_TIM: |
754 | if (elen >= sizeof(struct ieee80211_tim_ie)) { | 748 | if (elen >= sizeof(struct ieee80211_tim_ie)) { |
@@ -757,10 +751,6 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
757 | } else | 751 | } else |
758 | elem_parse_failed = true; | 752 | elem_parse_failed = true; |
759 | break; | 753 | break; |
760 | case WLAN_EID_IBSS_PARAMS: | ||
761 | elems->ibss_params = pos; | ||
762 | elems->ibss_params_len = elen; | ||
763 | break; | ||
764 | case WLAN_EID_CHALLENGE: | 754 | case WLAN_EID_CHALLENGE: |
765 | elems->challenge = pos; | 755 | elems->challenge = pos; |
766 | elems->challenge_len = elen; | 756 | elems->challenge_len = elen; |
@@ -790,8 +780,10 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
790 | elems->rsn_len = elen; | 780 | elems->rsn_len = elen; |
791 | break; | 781 | break; |
792 | case WLAN_EID_ERP_INFO: | 782 | case WLAN_EID_ERP_INFO: |
793 | elems->erp_info = pos; | 783 | if (elen >= 1) |
794 | elems->erp_info_len = elen; | 784 | elems->erp_info = pos; |
785 | else | ||
786 | elem_parse_failed = true; | ||
795 | break; | 787 | break; |
796 | case WLAN_EID_EXT_SUPP_RATES: | 788 | case WLAN_EID_EXT_SUPP_RATES: |
797 | elems->ext_supp_rates = pos; | 789 | elems->ext_supp_rates = pos; |
@@ -870,13 +862,6 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
870 | } | 862 | } |
871 | elems->ch_switch_ie = (void *)pos; | 863 | elems->ch_switch_ie = (void *)pos; |
872 | break; | 864 | break; |
873 | case WLAN_EID_QUIET: | ||
874 | if (!elems->quiet_elem) { | ||
875 | elems->quiet_elem = pos; | ||
876 | elems->quiet_elem_len = elen; | ||
877 | } | ||
878 | elems->num_of_quiet_elem++; | ||
879 | break; | ||
880 | case WLAN_EID_COUNTRY: | 865 | case WLAN_EID_COUNTRY: |
881 | elems->country_elem = pos; | 866 | elems->country_elem = pos; |
882 | elems->country_elem_len = elen; | 867 | elems->country_elem_len = elen; |
@@ -889,8 +874,10 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
889 | elems->pwr_constr_elem = pos; | 874 | elems->pwr_constr_elem = pos; |
890 | break; | 875 | break; |
891 | case WLAN_EID_TIMEOUT_INTERVAL: | 876 | case WLAN_EID_TIMEOUT_INTERVAL: |
892 | elems->timeout_int = pos; | 877 | if (elen >= sizeof(struct ieee80211_timeout_interval_ie)) |
893 | elems->timeout_int_len = elen; | 878 | elems->timeout_int = (void *)pos; |
879 | else | ||
880 | elem_parse_failed = true; | ||
894 | break; | 881 | break; |
895 | default: | 882 | default: |
896 | break; | 883 | break; |
@@ -911,12 +898,6 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
911 | return crc; | 898 | return crc; |
912 | } | 899 | } |
913 | 900 | ||
914 | void ieee802_11_parse_elems(u8 *start, size_t len, | ||
915 | struct ieee802_11_elems *elems) | ||
916 | { | ||
917 | ieee802_11_parse_elems_crc(start, len, elems, 0, 0); | ||
918 | } | ||
919 | |||
920 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, | 901 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, |
921 | bool bss_notify) | 902 | bool bss_notify) |
922 | { | 903 | { |
@@ -1474,6 +1455,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1474 | /* add interfaces */ | 1455 | /* add interfaces */ |
1475 | sdata = rtnl_dereference(local->monitor_sdata); | 1456 | sdata = rtnl_dereference(local->monitor_sdata); |
1476 | if (sdata) { | 1457 | if (sdata) { |
1458 | /* in HW restart it exists already */ | ||
1459 | WARN_ON(local->resuming); | ||
1477 | res = drv_add_interface(local, sdata); | 1460 | res = drv_add_interface(local, sdata); |
1478 | if (WARN_ON(res)) { | 1461 | if (WARN_ON(res)) { |
1479 | rcu_assign_pointer(local->monitor_sdata, NULL); | 1462 | rcu_assign_pointer(local->monitor_sdata, NULL); |
@@ -1663,6 +1646,9 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1663 | local->in_reconfig = false; | 1646 | local->in_reconfig = false; |
1664 | barrier(); | 1647 | barrier(); |
1665 | 1648 | ||
1649 | if (local->monitors == local->open_count && local->monitors > 0) | ||
1650 | ieee80211_add_virtual_monitor(local); | ||
1651 | |||
1666 | /* | 1652 | /* |
1667 | * Clear the WLAN_STA_BLOCK_BA flag so new aggregation | 1653 | * Clear the WLAN_STA_BLOCK_BA flag so new aggregation |
1668 | * sessions can be established after a resume. | 1654 | * sessions can be established after a resume. |
@@ -2056,7 +2042,7 @@ int ieee80211_ave_rssi(struct ieee80211_vif *vif) | |||
2056 | /* non-managed type inferfaces */ | 2042 | /* non-managed type inferfaces */ |
2057 | return 0; | 2043 | return 0; |
2058 | } | 2044 | } |
2059 | return ifmgd->ave_beacon_signal; | 2045 | return ifmgd->ave_beacon_signal / 16; |
2060 | } | 2046 | } |
2061 | EXPORT_SYMBOL_GPL(ieee80211_ave_rssi); | 2047 | EXPORT_SYMBOL_GPL(ieee80211_ave_rssi); |
2062 | 2048 | ||
@@ -2171,8 +2157,7 @@ void ieee80211_dfs_radar_detected_work(struct work_struct *work) | |||
2171 | /* currently not handled */ | 2157 | /* currently not handled */ |
2172 | WARN_ON(1); | 2158 | WARN_ON(1); |
2173 | else { | 2159 | else { |
2174 | cfg80211_chandef_create(&chandef, local->hw.conf.channel, | 2160 | chandef = local->hw.conf.chandef; |
2175 | local->hw.conf.channel_type); | ||
2176 | cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL); | 2161 | cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL); |
2177 | } | 2162 | } |
2178 | } | 2163 | } |