aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r--net/mac80211/util.c53
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
914void 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
920void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, 901void 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}
2061EXPORT_SYMBOL_GPL(ieee80211_ave_rssi); 2047EXPORT_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}