Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next

+1007 -1388
-2
Documentation/DocBook/80211.tmpl
··· 132 132 !Finclude/net/cfg80211.h cfg80211_send_rx_assoc 133 133 !Finclude/net/cfg80211.h cfg80211_send_assoc_timeout 134 134 !Finclude/net/cfg80211.h cfg80211_send_deauth 135 - !Finclude/net/cfg80211.h __cfg80211_send_deauth 136 135 !Finclude/net/cfg80211.h cfg80211_send_disassoc 137 - !Finclude/net/cfg80211.h __cfg80211_send_disassoc 138 136 !Finclude/net/cfg80211.h cfg80211_ibss_joined 139 137 !Finclude/net/cfg80211.h cfg80211_connect_result 140 138 !Finclude/net/cfg80211.h cfg80211_roamed
-8
drivers/net/wireless/iwlegacy/commands.h
··· 1348 1348 #define TX_CMD_SEC_KEY128 0x08 1349 1349 1350 1350 /* 1351 - * security overhead sizes 1352 - */ 1353 - #define WEP_IV_LEN 4 1354 - #define WEP_ICV_LEN 4 1355 - #define CCMP_MIC_LEN 8 1356 - #define TKIP_ICV_LEN 4 1357 - 1358 - /* 1359 1351 * C_TX = 0x1c (command) 1360 1352 */ 1361 1353
-8
drivers/net/wireless/iwlwifi/dvm/commands.h
··· 1221 1221 #define TX_CMD_SEC_KEY128 0x08 1222 1222 1223 1223 /* 1224 - * security overhead sizes 1225 - */ 1226 - #define WEP_IV_LEN 4 1227 - #define WEP_ICV_LEN 4 1228 - #define CCMP_MIC_LEN 8 1229 - #define TKIP_ICV_LEN 4 1230 - 1231 - /* 1232 1224 * REPLY_TX = 0x1c (command) 1233 1225 */ 1234 1226
+1 -13
drivers/net/wireless/iwlwifi/mvm/mac80211.c
··· 84 84 .types = BIT(NL80211_IFTYPE_STATION) | 85 85 BIT(NL80211_IFTYPE_AP), 86 86 }, 87 - { 88 - .max = 1, 89 - .types = BIT(NL80211_IFTYPE_P2P_CLIENT) | 90 - BIT(NL80211_IFTYPE_P2P_GO), 91 - }, 92 - { 93 - .max = 1, 94 - .types = BIT(NL80211_IFTYPE_P2P_DEVICE), 95 - }, 96 87 }; 97 88 98 89 static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = { ··· 164 173 hw->chanctx_data_size = sizeof(u16); 165 174 166 175 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 167 - BIT(NL80211_IFTYPE_P2P_CLIENT) | 168 - BIT(NL80211_IFTYPE_AP) | 169 - BIT(NL80211_IFTYPE_P2P_GO) | 170 - BIT(NL80211_IFTYPE_P2P_DEVICE); 176 + BIT(NL80211_IFTYPE_AP); 171 177 172 178 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | 173 179 WIPHY_FLAG_DISABLE_BEACON_HINTS |
+3 -3
drivers/net/wireless/iwlwifi/pcie/tx.c
··· 224 224 225 225 switch (sec_ctl & TX_CMD_SEC_MSK) { 226 226 case TX_CMD_SEC_CCM: 227 - len += CCMP_MIC_LEN; 227 + len += IEEE80211_CCMP_MIC_LEN; 228 228 break; 229 229 case TX_CMD_SEC_TKIP: 230 - len += TKIP_ICV_LEN; 230 + len += IEEE80211_TKIP_ICV_LEN; 231 231 break; 232 232 case TX_CMD_SEC_WEP: 233 - len += WEP_IV_LEN + WEP_ICV_LEN; 233 + len += IEEE80211_WEP_IV_LEN + IEEE80211_WEP_ICV_LEN; 234 234 break; 235 235 } 236 236
+10 -12
drivers/net/wireless/mac80211_hwsim.c
··· 1723 1723 class_destroy(hwsim_class); 1724 1724 } 1725 1725 1726 - 1727 - static struct device_driver mac80211_hwsim_driver = { 1728 - .name = "mac80211_hwsim", 1729 - .bus = &platform_bus_type, 1730 - .owner = THIS_MODULE, 1726 + static struct platform_driver mac80211_hwsim_driver = { 1727 + .driver = { 1728 + .name = "mac80211_hwsim", 1729 + .owner = THIS_MODULE, 1730 + }, 1731 1731 }; 1732 1732 1733 1733 static const struct net_device_ops hwsim_netdev_ops = { ··· 2169 2169 #endif 2170 2170 BIT(NL80211_IFTYPE_AP) | 2171 2171 BIT(NL80211_IFTYPE_P2P_GO) }, 2172 - { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_DEVICE) }, 2173 2172 }; 2174 2173 2175 2174 static struct ieee80211_iface_combination hwsim_if_comb = { ··· 2218 2219 spin_lock_init(&hwsim_radio_lock); 2219 2220 INIT_LIST_HEAD(&hwsim_radios); 2220 2221 2221 - err = driver_register(&mac80211_hwsim_driver); 2222 + err = platform_driver_register(&mac80211_hwsim_driver); 2222 2223 if (err) 2223 2224 return err; 2224 2225 ··· 2253 2254 err = -ENOMEM; 2254 2255 goto failed_drvdata; 2255 2256 } 2256 - data->dev->driver = &mac80211_hwsim_driver; 2257 + data->dev->driver = &mac80211_hwsim_driver.driver; 2257 2258 err = device_bind_driver(data->dev); 2258 2259 if (err != 0) { 2259 2260 printk(KERN_DEBUG ··· 2294 2295 BIT(NL80211_IFTYPE_P2P_CLIENT) | 2295 2296 BIT(NL80211_IFTYPE_P2P_GO) | 2296 2297 BIT(NL80211_IFTYPE_ADHOC) | 2297 - BIT(NL80211_IFTYPE_MESH_POINT) | 2298 - BIT(NL80211_IFTYPE_P2P_DEVICE); 2298 + BIT(NL80211_IFTYPE_MESH_POINT); 2299 2299 2300 2300 hw->flags = IEEE80211_HW_MFP_CAPABLE | 2301 2301 IEEE80211_HW_SIGNAL_DBM | ··· 2562 2564 failed: 2563 2565 mac80211_hwsim_free(); 2564 2566 failed_unregister_driver: 2565 - driver_unregister(&mac80211_hwsim_driver); 2567 + platform_driver_unregister(&mac80211_hwsim_driver); 2566 2568 return err; 2567 2569 } 2568 2570 module_init(init_mac80211_hwsim); ··· 2575 2577 2576 2578 mac80211_hwsim_free(); 2577 2579 unregister_netdev(hwsim_mon); 2578 - driver_unregister(&mac80211_hwsim_driver); 2580 + platform_driver_unregister(&mac80211_hwsim_driver); 2579 2581 } 2580 2582 module_exit(exit_mac80211_hwsim);
+9
include/linux/ieee80211.h
··· 1829 1829 WLAN_KEY_LEN_AES_CMAC = 16, 1830 1830 }; 1831 1831 1832 + #define IEEE80211_WEP_IV_LEN 4 1833 + #define IEEE80211_WEP_ICV_LEN 4 1834 + #define IEEE80211_CCMP_HDR_LEN 8 1835 + #define IEEE80211_CCMP_MIC_LEN 8 1836 + #define IEEE80211_CCMP_PN_LEN 6 1837 + #define IEEE80211_TKIP_IV_LEN 8 1838 + #define IEEE80211_TKIP_ICV_LEN 4 1839 + #define IEEE80211_CMAC_PN_LEN 6 1840 + 1832 1841 /* Public action codes */ 1833 1842 enum ieee80211_pub_actioncode { 1834 1843 WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,
+55 -31
include/net/cfg80211.h
··· 753 753 * @STATION_INFO_LOCAL_PM: @local_pm filled 754 754 * @STATION_INFO_PEER_PM: @peer_pm filled 755 755 * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled 756 + * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled 757 + * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled 756 758 */ 757 759 enum station_info_flags { 758 760 STATION_INFO_INACTIVE_TIME = 1<<0, ··· 783 781 STATION_INFO_NONPEER_PM = 1<<23, 784 782 STATION_INFO_RX_BYTES64 = 1<<24, 785 783 STATION_INFO_TX_BYTES64 = 1<<25, 784 + STATION_INFO_CHAIN_SIGNAL = 1<<26, 785 + STATION_INFO_CHAIN_SIGNAL_AVG = 1<<27, 786 786 }; 787 787 788 788 /** ··· 861 857 u16 beacon_interval; 862 858 }; 863 859 860 + #define IEEE80211_MAX_CHAINS 4 861 + 864 862 /** 865 863 * struct station_info - station information 866 864 * ··· 880 874 * For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. 881 875 * @signal_avg: Average signal strength, type depends on the wiphy's signal_type. 882 876 * For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. 877 + * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg 878 + * @chain_signal: per-chain signal strength of last received packet in dBm 879 + * @chain_signal_avg: per-chain signal strength average in dBm 883 880 * @txrate: current unicast bitrate from this station 884 881 * @rxrate: current unicast bitrate to this station 885 882 * @rx_packets: packets received from this station ··· 918 909 u8 plink_state; 919 910 s8 signal; 920 911 s8 signal_avg; 912 + 913 + u8 chains; 914 + s8 chain_signal[IEEE80211_MAX_CHAINS]; 915 + s8 chain_signal_avg[IEEE80211_MAX_CHAINS]; 916 + 921 917 struct rate_info txrate; 922 918 struct rate_info rxrate; 923 919 u32 rx_packets; ··· 1161 1147 * @sync_method: which synchronization method to use 1162 1148 * @path_sel_proto: which path selection protocol to use 1163 1149 * @path_metric: which metric to use 1150 + * @auth_id: which authentication method this mesh is using 1164 1151 * @ie: vendor information elements (optional) 1165 1152 * @ie_len: length of vendor information elements 1166 1153 * @is_authenticated: this mesh requires authentication ··· 1180 1165 u8 sync_method; 1181 1166 u8 path_sel_proto; 1182 1167 u8 path_metric; 1168 + u8 auth_id; 1183 1169 const u8 *ie; 1184 1170 u8 ie_len; 1185 1171 bool is_authenticated; ··· 1257 1241 * @scan_start: time (in jiffies) when the scan started 1258 1242 * @wdev: the wireless device to scan for 1259 1243 * @aborted: (internal) scan request was notified as aborted 1244 + * @notified: (internal) scan request was notified as done or aborted 1260 1245 * @no_cck: used to send probe requests at non CCK rate in 2GHz band 1261 1246 */ 1262 1247 struct cfg80211_scan_request { ··· 1275 1258 /* internal */ 1276 1259 struct wiphy *wiphy; 1277 1260 unsigned long scan_start; 1278 - bool aborted; 1261 + bool aborted, notified; 1279 1262 bool no_cck; 1280 1263 1281 1264 /* keep last */ ··· 1867 1850 * @get_mpath: get a mesh path for the given parameters 1868 1851 * @dump_mpath: dump mesh path callback -- resume dump at index @idx 1869 1852 * @join_mesh: join the mesh network with the specified parameters 1853 + * (invoked with the wireless_dev mutex held) 1870 1854 * @leave_mesh: leave the current mesh network 1855 + * (invoked with the wireless_dev mutex held) 1871 1856 * 1872 1857 * @get_mesh_config: Get the current mesh configuration 1873 1858 * ··· 1896 1877 * the scan/scan_done bracket too. 1897 1878 * 1898 1879 * @auth: Request to authenticate with the specified peer 1880 + * (invoked with the wireless_dev mutex held) 1899 1881 * @assoc: Request to (re)associate with the specified peer 1882 + * (invoked with the wireless_dev mutex held) 1900 1883 * @deauth: Request to deauthenticate from the specified peer 1884 + * (invoked with the wireless_dev mutex held) 1901 1885 * @disassoc: Request to disassociate from the specified peer 1886 + * (invoked with the wireless_dev mutex held) 1902 1887 * 1903 1888 * @connect: Connect to the ESS with the specified parameters. When connected, 1904 1889 * call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS. 1905 1890 * If the connection fails for some reason, call cfg80211_connect_result() 1906 1891 * with the status from the AP. 1892 + * (invoked with the wireless_dev mutex held) 1907 1893 * @disconnect: Disconnect from the BSS/ESS. 1894 + * (invoked with the wireless_dev mutex held) 1908 1895 * 1909 1896 * @join_ibss: Join the specified IBSS (or create if necessary). Once done, call 1910 1897 * cfg80211_ibss_joined(), also call that function when changing BSSID due 1911 1898 * to a merge. 1899 + * (invoked with the wireless_dev mutex held) 1912 1900 * @leave_ibss: Leave the IBSS. 1901 + * (invoked with the wireless_dev mutex held) 1913 1902 * 1914 1903 * @set_mcast_rate: Set the specified multicast rate (only if vif is in ADHOC or 1915 1904 * MESH mode) ··· 2583 2556 * may request, if implemented. 2584 2557 * 2585 2558 * @wowlan: WoWLAN support information 2559 + * @wowlan_config: current WoWLAN configuration; this should usually not be 2560 + * used since access to it is necessarily racy, use the parameter passed 2561 + * to the suspend() operation instead. 2586 2562 * 2587 2563 * @ap_sme_capa: AP SME capabilities, flags from &enum nl80211_ap_sme_features. 2588 2564 * @ht_capa_mod_mask: Specify what ht_cap values can be over-ridden. ··· 2653 2623 2654 2624 #ifdef CONFIG_PM 2655 2625 struct wiphy_wowlan_support wowlan; 2626 + struct cfg80211_wowlan *wowlan_config; 2656 2627 #endif 2657 2628 2658 2629 u16 max_remain_on_channel_duration; ··· 2865 2834 * by cfg80211 on change_interface 2866 2835 * @mgmt_registrations: list of registrations for management frames 2867 2836 * @mgmt_registrations_lock: lock for the list 2868 - * @mtx: mutex used to lock data in this struct 2837 + * @mtx: mutex used to lock data in this struct, may be used by drivers 2838 + * and some API functions require it held 2869 2839 * @cleanup_work: work struct used for cleanup that can't be done directly 2870 2840 * @beacon_interval: beacon interval used on this device for transmitting 2871 2841 * beacons, 0 when not valid ··· 2889 2857 spinlock_t mgmt_registrations_lock; 2890 2858 2891 2859 struct mutex mtx; 2892 - 2893 - struct work_struct cleanup_work; 2894 2860 2895 2861 bool use_4addr, p2p_started; 2896 2862 ··· 3018 2988 struct ieee80211_rate * 3019 2989 ieee80211_get_response_rate(struct ieee80211_supported_band *sband, 3020 2990 u32 basic_rates, int bitrate); 2991 + 2992 + /** 2993 + * ieee80211_mandatory_rates - get mandatory rates for a given band 2994 + * @sband: the band to look for rates in 2995 + * 2996 + * This function returns a bitmap of the mandatory rates for the given 2997 + * band, bits are set according to the rate position in the bitrates array. 2998 + */ 2999 + u32 ieee80211_mandatory_rates(struct ieee80211_supported_band *sband); 3021 3000 3022 3001 /* 3023 3002 * Radiotap parsing functions -- for controlled injection support ··· 3439 3400 * This function is called whenever an authentication has been processed in 3440 3401 * station mode. The driver is required to call either this function or 3441 3402 * cfg80211_send_auth_timeout() to indicate the result of cfg80211_ops::auth() 3442 - * call. This function may sleep. 3403 + * call. This function may sleep. The caller must hold the corresponding wdev's 3404 + * mutex. 3443 3405 */ 3444 3406 void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len); 3445 3407 ··· 3449 3409 * @dev: network device 3450 3410 * @addr: The MAC address of the device with which the authentication timed out 3451 3411 * 3452 - * This function may sleep. 3412 + * This function may sleep. The caller must hold the corresponding wdev's 3413 + * mutex. 3453 3414 */ 3454 3415 void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr); 3455 3416 ··· 3465 3424 * This function is called whenever a (re)association response has been 3466 3425 * processed in station mode. The driver is required to call either this 3467 3426 * function or cfg80211_send_assoc_timeout() to indicate the result of 3468 - * cfg80211_ops::assoc() call. This function may sleep. 3427 + * cfg80211_ops::assoc() call. This function may sleep. The caller must hold 3428 + * the corresponding wdev's mutex. 3469 3429 */ 3470 3430 void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss, 3471 3431 const u8 *buf, size_t len); ··· 3476 3434 * @dev: network device 3477 3435 * @addr: The MAC address of the device with which the association timed out 3478 3436 * 3479 - * This function may sleep. 3437 + * This function may sleep. The caller must hold the corresponding wdev's mutex. 3480 3438 */ 3481 3439 void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr); 3482 3440 ··· 3488 3446 * 3489 3447 * This function is called whenever deauthentication has been processed in 3490 3448 * station mode. This includes both received deauthentication frames and 3491 - * locally generated ones. This function may sleep. 3449 + * locally generated ones. This function may sleep. The caller must hold the 3450 + * corresponding wdev's mutex. 3492 3451 */ 3493 3452 void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len); 3494 - 3495 - /** 3496 - * __cfg80211_send_deauth - notification of processed deauthentication 3497 - * @dev: network device 3498 - * @buf: deauthentication frame (header + body) 3499 - * @len: length of the frame data 3500 - * 3501 - * Like cfg80211_send_deauth(), but doesn't take the wdev lock. 3502 - */ 3503 - void __cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len); 3504 3453 3505 3454 /** 3506 3455 * cfg80211_send_disassoc - notification of processed disassociation ··· 3501 3468 * 3502 3469 * This function is called whenever disassociation has been processed in 3503 3470 * station mode. This includes both received disassociation frames and locally 3504 - * generated ones. This function may sleep. 3471 + * generated ones. This function may sleep. The caller must hold the 3472 + * corresponding wdev's mutex. 3505 3473 */ 3506 3474 void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len); 3507 - 3508 - /** 3509 - * __cfg80211_send_disassoc - notification of processed disassociation 3510 - * @dev: network device 3511 - * @buf: disassociation response frame (header + body) 3512 - * @len: length of the frame data 3513 - * 3514 - * Like cfg80211_send_disassoc(), but doesn't take the wdev lock. 3515 - */ 3516 - void __cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, 3517 - size_t len); 3518 3475 3519 3476 /** 3520 3477 * cfg80211_send_unprot_deauth - notification of unprotected deauthentication ··· 4176 4153 * cfg80211_crit_proto_stopped() - indicate critical protocol stopped by driver. 4177 4154 * 4178 4155 * @wdev: the wireless device for which critical protocol is stopped. 4156 + * @gfp: allocation flags 4179 4157 * 4180 4158 * This function can be called by the driver to indicate it has reverted 4181 4159 * operation back to normal. One reason could be that the duration given
+7
include/net/ieee80211_radiotap.h
··· 269 269 #define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04 270 270 #define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08 271 271 #define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10 272 + #define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20 272 273 273 274 #define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03 274 275 #define IEEE80211_RADIOTAP_MCS_BW_20 0 ··· 279 278 #define IEEE80211_RADIOTAP_MCS_SGI 0x04 280 279 #define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08 281 280 #define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10 281 + #define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60 282 + #define IEEE80211_RADIOTAP_MCS_STBC_1 1 283 + #define IEEE80211_RADIOTAP_MCS_STBC_2 2 284 + #define IEEE80211_RADIOTAP_MCS_STBC_3 3 285 + 286 + #define IEEE80211_RADIOTAP_MCS_STBC_SHIFT 5 282 287 283 288 /* For IEEE80211_RADIOTAP_AMPDU_STATUS */ 284 289 #define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN 0x0001
+20 -6
include/net/mac80211.h
··· 805 805 * on this subframe 806 806 * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC 807 807 * is stored in the @ampdu_delimiter_crc field) 808 + * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 808 809 */ 809 810 enum mac80211_rx_flags { 810 811 RX_FLAG_MMIC_ERROR = BIT(0), ··· 833 832 RX_FLAG_80MHZ = BIT(23), 834 833 RX_FLAG_80P80MHZ = BIT(24), 835 834 RX_FLAG_160MHZ = BIT(25), 835 + RX_FLAG_STBC_MASK = BIT(26) | BIT(27), 836 836 }; 837 + 838 + #define RX_FLAG_STBC_SHIFT 26 837 839 838 840 /** 839 841 * struct ieee80211_rx_status - receive status ··· 854 850 * @signal: signal strength when receiving this frame, either in dBm, in dB or 855 851 * unspecified depending on the hardware capabilities flags 856 852 * @IEEE80211_HW_SIGNAL_* 853 + * @chains: bitmask of receive chains for which separate signal strength 854 + * values were filled. 855 + * @chain_signal: per-chain signal strength, in dBm (unlike @signal, doesn't 856 + * support dB or unspecified units) 857 857 * @antenna: antenna used 858 858 * @rate_idx: index of data rate into band's supported rates or MCS index if 859 859 * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) ··· 889 881 u8 band; 890 882 u8 antenna; 891 883 s8 signal; 884 + u8 chains; 885 + s8 chain_signal[IEEE80211_MAX_CHAINS]; 892 886 u8 ampdu_delimiter_crc; 893 887 u8 vendor_radiotap_align; 894 888 u8 vendor_radiotap_oui[3]; ··· 1245 1235 * struct ieee80211_sta_rates - station rate selection table 1246 1236 * 1247 1237 * @rcu_head: RCU head used for freeing the table on update 1248 - * @rates: transmit rates/flags to be used by default. 1238 + * @rate: transmit rates/flags to be used by default. 1249 1239 * Overriding entries per-packet is possible by using cb tx control. 1250 1240 */ 1251 1241 struct ieee80211_sta_rates { ··· 1286 1276 * notifications and capabilities. The value is only valid after 1287 1277 * the station moves to associated state. 1288 1278 * @smps_mode: current SMPS mode (off, static or dynamic) 1289 - * @tx_rates: rate control selection table 1279 + * @rates: rate control selection table 1290 1280 */ 1291 1281 struct ieee80211_sta { 1292 1282 u32 supp_rates[IEEE80211_NUM_BANDS]; ··· 3053 3043 * This function may not be called in IRQ context. Calls to this function 3054 3044 * for a single hardware must be synchronized against each other. Calls to 3055 3045 * this function, ieee80211_rx_ni() and ieee80211_rx_irqsafe() may not be 3056 - * mixed for a single hardware. 3046 + * mixed for a single hardware. Must not run concurrently with 3047 + * ieee80211_tx_status() or ieee80211_tx_status_ni(). 3057 3048 * 3058 3049 * In process context use instead ieee80211_rx_ni(). 3059 3050 * ··· 3070 3059 * (internally defers to a tasklet.) 3071 3060 * 3072 3061 * Calls to this function, ieee80211_rx() or ieee80211_rx_ni() may not 3073 - * be mixed for a single hardware. 3062 + * be mixed for a single hardware.Must not run concurrently with 3063 + * ieee80211_tx_status() or ieee80211_tx_status_ni(). 3074 3064 * 3075 3065 * @hw: the hardware this frame came in on 3076 3066 * @skb: the buffer to receive, owned by mac80211 after this call ··· 3085 3073 * (internally disables bottom halves). 3086 3074 * 3087 3075 * Calls to this function, ieee80211_rx() and ieee80211_rx_irqsafe() may 3088 - * not be mixed for a single hardware. 3076 + * not be mixed for a single hardware. Must not run concurrently with 3077 + * ieee80211_tx_status() or ieee80211_tx_status_ni(). 3089 3078 * 3090 3079 * @hw: the hardware this frame came in on 3091 3080 * @skb: the buffer to receive, owned by mac80211 after this call ··· 3209 3196 * This function may not be called in IRQ context. Calls to this function 3210 3197 * for a single hardware must be synchronized against each other. Calls 3211 3198 * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe() 3212 - * may not be mixed for a single hardware. 3199 + * may not be mixed for a single hardware. Must not run concurrently with 3200 + * ieee80211_rx() or ieee80211_rx_ni(). 3213 3201 * 3214 3202 * @hw: the hardware the frame was transmitted by 3215 3203 * @skb: the frame that was transmitted, owned by mac80211 after this call
+20
include/uapi/linux/nl80211.h
··· 27 27 28 28 #include <linux/types.h> 29 29 30 + #define NL80211_GENL_NAME "nl80211" 31 + 30 32 /** 31 33 * DOC: Station handling 32 34 * ··· 1431 1429 * @NL80211_ATTR_MAX_CRIT_PROT_DURATION: duration in milliseconds in which 1432 1430 * the connection should have increased reliability (u16). 1433 1431 * 1432 + * @NL80211_ATTR_PEER_AID: Association ID for the peer TDLS station (u16). 1433 + * This is similar to @NL80211_ATTR_STA_AID but with a difference of being 1434 + * allowed to be used with the first @NL80211_CMD_SET_STATION command to 1435 + * update a TDLS peer STA entry. 1436 + * 1434 1437 * @NL80211_ATTR_MAX: highest attribute number currently defined 1435 1438 * @__NL80211_ATTR_AFTER_LAST: internal use 1436 1439 */ ··· 1734 1727 NL80211_ATTR_CRIT_PROT_ID, 1735 1728 NL80211_ATTR_MAX_CRIT_PROT_DURATION, 1736 1729 1730 + NL80211_ATTR_PEER_AID, 1731 + 1737 1732 /* add attributes here, update the policy in nl80211.c */ 1738 1733 1739 1734 __NL80211_ATTR_AFTER_LAST, ··· 2000 1991 * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode 2001 1992 * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards 2002 1993 * non-peer STA 1994 + * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU 1995 + * Contains a nested array of signal strength attributes (u8, dBm) 1996 + * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average 1997 + * Same format as NL80211_STA_INFO_CHAIN_SIGNAL. 2003 1998 * @__NL80211_STA_INFO_AFTER_LAST: internal 2004 1999 * @NL80211_STA_INFO_MAX: highest possible station info attribute 2005 2000 */ ··· 2033 2020 NL80211_STA_INFO_NONPEER_PM, 2034 2021 NL80211_STA_INFO_RX_BYTES64, 2035 2022 NL80211_STA_INFO_TX_BYTES64, 2023 + NL80211_STA_INFO_CHAIN_SIGNAL, 2024 + NL80211_STA_INFO_CHAIN_SIGNAL_AVG, 2036 2025 2037 2026 /* keep last */ 2038 2027 __NL80211_STA_INFO_AFTER_LAST, ··· 2652 2637 * @NL80211_MESH_SETUP_USERSPACE_MPM: Enable this option if userspace will 2653 2638 * implement an MPM which handles peer allocation and state. 2654 2639 * 2640 + * @NL80211_MESH_SETUP_AUTH_PROTOCOL: Inform the kernel of the authentication 2641 + * method (u8, as defined in IEEE 8.4.2.100.6, e.g. 0x1 for SAE). 2642 + * Default is no authentication method required. 2643 + * 2655 2644 * @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number 2656 2645 * 2657 2646 * @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use ··· 2669 2650 NL80211_MESH_SETUP_USERSPACE_AMPE, 2670 2651 NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC, 2671 2652 NL80211_MESH_SETUP_USERSPACE_MPM, 2653 + NL80211_MESH_SETUP_AUTH_PROTOCOL, 2672 2654 2673 2655 /* keep last */ 2674 2656 __NL80211_MESH_SETUP_ATTR_AFTER_LAST,
+3 -3
net/mac80211/aes_ccm.c
··· 85 85 *cpos++ = *pos++ ^ e[i]; 86 86 } 87 87 88 - for (i = 0; i < CCMP_MIC_LEN; i++) 88 + for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) 89 89 mic[i] = b[i] ^ s_0[i]; 90 90 } 91 91 ··· 123 123 crypto_cipher_encrypt_one(tfm, a, a); 124 124 } 125 125 126 - for (i = 0; i < CCMP_MIC_LEN; i++) { 126 + for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) { 127 127 if ((mic[i] ^ s_0[i]) != a[i]) 128 128 return -1; 129 129 } ··· 138 138 139 139 tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); 140 140 if (!IS_ERR(tfm)) 141 - crypto_cipher_setkey(tfm, key, ALG_CCMP_KEY_LEN); 141 + crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP); 142 142 143 143 return tfm; 144 144 }
+15 -5
net/mac80211/cfg.c
··· 444 444 struct ieee80211_local *local = sdata->local; 445 445 struct timespec uptime; 446 446 u64 packets = 0; 447 - int ac; 447 + int i, ac; 448 448 449 449 sinfo->generation = sdata->local->sta_generation; 450 450 ··· 487 487 drv_get_rssi(local, sdata, &sta->sta, &sinfo->signal)) 488 488 sinfo->signal = (s8)sta->last_signal; 489 489 sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); 490 + } 491 + if (sta->chains) { 492 + sinfo->filled |= STATION_INFO_CHAIN_SIGNAL | 493 + STATION_INFO_CHAIN_SIGNAL_AVG; 494 + 495 + sinfo->chains = sta->chains; 496 + for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 497 + sinfo->chain_signal[i] = sta->chain_signal_last[i]; 498 + sinfo->chain_signal_avg[i] = 499 + (s8) -ewma_read(&sta->chain_signal_avg[i]); 500 + } 490 501 } 491 502 492 503 sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); ··· 739 728 740 729 if (sset == ETH_SS_STATS) { 741 730 sz_sta_stats = sizeof(ieee80211_gstrings_sta_stats); 742 - memcpy(data, *ieee80211_gstrings_sta_stats, sz_sta_stats); 731 + memcpy(data, ieee80211_gstrings_sta_stats, sz_sta_stats); 743 732 } 744 733 drv_get_et_strings(sdata, sset, &(data[sz_sta_stats])); 745 734 } ··· 1746 1735 ifmsh->mesh_pp_id = setup->path_sel_proto; 1747 1736 ifmsh->mesh_pm_id = setup->path_metric; 1748 1737 ifmsh->user_mpm = setup->user_mpm; 1738 + ifmsh->mesh_auth_id = setup->auth_id; 1749 1739 ifmsh->security = IEEE80211_MESH_SEC_NONE; 1750 1740 if (setup->is_authenticated) 1751 1741 ifmsh->security |= IEEE80211_MESH_SEC_AUTHED; ··· 2318 2306 enum ieee80211_smps_mode old_req; 2319 2307 int err; 2320 2308 2321 - lockdep_assert_held(&sdata->u.mgd.mtx); 2309 + lockdep_assert_held(&sdata->wdev.mtx); 2322 2310 2323 2311 old_req = sdata->u.mgd.req_smps; 2324 2312 sdata->u.mgd.req_smps = smps_mode; ··· 2375 2363 local->dynamic_ps_forced_timeout = timeout; 2376 2364 2377 2365 /* no change, but if automatic follow powersave */ 2378 - mutex_lock(&sdata->u.mgd.mtx); 2379 2366 __ieee80211_request_smps(sdata, sdata->u.mgd.req_smps); 2380 - mutex_unlock(&sdata->u.mgd.mtx); 2381 2367 2382 2368 if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 2383 2369 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
+8 -7
net/mac80211/debugfs_netdev.c
··· 228 228 if (sdata->vif.type != NL80211_IFTYPE_STATION) 229 229 return -EOPNOTSUPP; 230 230 231 - mutex_lock(&sdata->u.mgd.mtx); 231 + sdata_lock(sdata); 232 232 err = __ieee80211_request_smps(sdata, smps_mode); 233 - mutex_unlock(&sdata->u.mgd.mtx); 233 + sdata_unlock(sdata); 234 234 235 235 return err; 236 236 } ··· 313 313 case NL80211_IFTYPE_STATION: 314 314 fc |= cpu_to_le16(IEEE80211_FCTL_TODS); 315 315 /* BSSID SA DA */ 316 - mutex_lock(&sdata->u.mgd.mtx); 316 + sdata_lock(sdata); 317 317 if (!sdata->u.mgd.associated) { 318 - mutex_unlock(&sdata->u.mgd.mtx); 318 + sdata_unlock(sdata); 319 319 dev_kfree_skb(skb); 320 320 return -ENOTCONN; 321 321 } 322 322 memcpy(hdr->addr1, sdata->u.mgd.associated->bssid, ETH_ALEN); 323 323 memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN); 324 324 memcpy(hdr->addr3, addr, ETH_ALEN); 325 - mutex_unlock(&sdata->u.mgd.mtx); 325 + sdata_unlock(sdata); 326 326 break; 327 327 default: 328 328 dev_kfree_skb(skb); ··· 471 471 IEEE80211_IF_FILE(peer, u.wds.remote_addr, MAC); 472 472 473 473 #ifdef CONFIG_MAC80211_MESH 474 + IEEE80211_IF_FILE(estab_plinks, u.mesh.estab_plinks, ATOMIC); 475 + 474 476 /* Mesh stats attributes */ 475 477 IEEE80211_IF_FILE(fwded_mcast, u.mesh.mshstats.fwded_mcast, DEC); 476 478 IEEE80211_IF_FILE(fwded_unicast, u.mesh.mshstats.fwded_unicast, DEC); ··· 482 480 u.mesh.mshstats.dropped_frames_congestion, DEC); 483 481 IEEE80211_IF_FILE(dropped_frames_no_route, 484 482 u.mesh.mshstats.dropped_frames_no_route, DEC); 485 - IEEE80211_IF_FILE(estab_plinks, u.mesh.estab_plinks, ATOMIC); 486 483 487 484 /* Mesh parameters */ 488 485 IEEE80211_IF_FILE(dot11MeshMaxRetries, ··· 584 583 static void add_mesh_files(struct ieee80211_sub_if_data *sdata) 585 584 { 586 585 DEBUGFS_ADD_MODE(tsf, 0600); 586 + DEBUGFS_ADD_MODE(estab_plinks, 0400); 587 587 } 588 588 589 589 static void add_mesh_stats(struct ieee80211_sub_if_data *sdata) ··· 600 598 MESHSTATS_ADD(dropped_frames_ttl); 601 599 MESHSTATS_ADD(dropped_frames_no_route); 602 600 MESHSTATS_ADD(dropped_frames_congestion); 603 - MESHSTATS_ADD(estab_plinks); 604 601 #undef MESHSTATS_ADD 605 602 } 606 603
+2 -2
net/mac80211/ht.c
··· 429 429 container_of(work, struct ieee80211_sub_if_data, 430 430 u.mgd.request_smps_work); 431 431 432 - mutex_lock(&sdata->u.mgd.mtx); 432 + sdata_lock(sdata); 433 433 __ieee80211_request_smps(sdata, sdata->u.mgd.driver_smps_mode); 434 - mutex_unlock(&sdata->u.mgd.mtx); 434 + sdata_unlock(sdata); 435 435 } 436 436 437 437 void ieee80211_request_smps(struct ieee80211_vif *vif,
+22 -27
net/mac80211/ibss.c
··· 54 54 struct beacon_data *presp; 55 55 int frame_len; 56 56 57 - lockdep_assert_held(&ifibss->mtx); 57 + sdata_assert_lock(sdata); 58 58 59 59 /* Reset own TSF to allow time synchronization work. */ 60 60 drv_reset_tsf(local, sdata); ··· 74 74 } 75 75 76 76 presp = rcu_dereference_protected(ifibss->presp, 77 - lockdep_is_held(&ifibss->mtx)); 77 + lockdep_is_held(&sdata->wdev.mtx)); 78 78 rcu_assign_pointer(ifibss->presp, NULL); 79 79 if (presp) 80 80 kfree_rcu(presp, rcu_head); ··· 263 263 const struct cfg80211_bss_ies *ies; 264 264 u64 tsf; 265 265 266 - lockdep_assert_held(&sdata->u.ibss.mtx); 266 + sdata_assert_lock(sdata); 267 267 268 268 if (beacon_int < 10) 269 269 beacon_int = 10; ··· 341 341 struct ieee80211_local *local = sdata->local; 342 342 struct sta_info *sta; 343 343 struct ieee80211_chanctx_conf *chanctx_conf; 344 + struct ieee80211_supported_band *sband; 344 345 int band; 345 346 346 347 /* ··· 381 380 sta->last_rx = jiffies; 382 381 383 382 /* make sure mandatory rates are always added */ 383 + sband = local->hw.wiphy->bands[band]; 384 384 sta->sta.supp_rates[band] = supp_rates | 385 - ieee80211_mandatory_rates(local, band); 385 + ieee80211_mandatory_rates(sband); 386 386 387 387 return ieee80211_ibss_finish_sta(sta, auth); 388 388 } ··· 410 408 struct sta_info *sta; 411 409 u8 deauth_frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 412 410 413 - lockdep_assert_held(&sdata->u.ibss.mtx); 411 + sdata_assert_lock(sdata); 414 412 415 413 if (len < 24 + 6) 416 414 return; ··· 494 492 prev_rates = sta->sta.supp_rates[band]; 495 493 /* make sure mandatory rates are always added */ 496 494 sta->sta.supp_rates[band] = supp_rates | 497 - ieee80211_mandatory_rates(local, band); 495 + ieee80211_mandatory_rates(sband); 498 496 499 497 if (sta->sta.supp_rates[band] != prev_rates) { 500 498 ibss_dbg(sdata, ··· 626 624 struct ieee80211_local *local = sdata->local; 627 625 struct sta_info *sta; 628 626 struct ieee80211_chanctx_conf *chanctx_conf; 627 + struct ieee80211_supported_band *sband; 629 628 int band; 630 629 631 630 /* ··· 661 658 sta->last_rx = jiffies; 662 659 663 660 /* make sure mandatory rates are always added */ 661 + sband = local->hw.wiphy->bands[band]; 664 662 sta->sta.supp_rates[band] = supp_rates | 665 - ieee80211_mandatory_rates(local, band); 663 + ieee80211_mandatory_rates(sband); 666 664 667 665 spin_lock(&ifibss->incomplete_lock); 668 666 list_add(&sta->list, &ifibss->incomplete_stations); ··· 677 673 int active = 0; 678 674 struct sta_info *sta; 679 675 680 - lockdep_assert_held(&sdata->u.ibss.mtx); 676 + sdata_assert_lock(sdata); 681 677 682 678 rcu_read_lock(); 683 679 ··· 703 699 { 704 700 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 705 701 706 - lockdep_assert_held(&ifibss->mtx); 702 + sdata_assert_lock(sdata); 707 703 708 704 mod_timer(&ifibss->timer, 709 705 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL)); ··· 734 730 u16 capability; 735 731 int i; 736 732 737 - lockdep_assert_held(&ifibss->mtx); 733 + sdata_assert_lock(sdata); 738 734 739 735 if (ifibss->fixed_bssid) { 740 736 memcpy(bssid, ifibss->bssid, ETH_ALEN); ··· 777 773 int active_ibss; 778 774 u16 capability; 779 775 780 - lockdep_assert_held(&ifibss->mtx); 776 + sdata_assert_lock(sdata); 781 777 782 778 active_ibss = ieee80211_sta_active_ibss(sdata); 783 779 ibss_dbg(sdata, "sta_find_ibss (active_ibss=%d)\n", active_ibss); ··· 847 843 struct beacon_data *presp; 848 844 u8 *pos, *end; 849 845 850 - lockdep_assert_held(&ifibss->mtx); 846 + sdata_assert_lock(sdata); 851 847 852 848 presp = rcu_dereference_protected(ifibss->presp, 853 - lockdep_is_held(&ifibss->mtx)); 849 + lockdep_is_held(&sdata->wdev.mtx)); 854 850 855 851 if (ifibss->state != IEEE80211_IBSS_MLME_JOINED || 856 852 len < 24 + 2 || !presp) ··· 934 930 mgmt = (struct ieee80211_mgmt *) skb->data; 935 931 fc = le16_to_cpu(mgmt->frame_control); 936 932 937 - mutex_lock(&sdata->u.ibss.mtx); 933 + sdata_lock(sdata); 938 934 939 935 if (!sdata->u.ibss.ssid_len) 940 936 goto mgmt_out; /* not ready to merge yet */ ··· 957 953 } 958 954 959 955 mgmt_out: 960 - mutex_unlock(&sdata->u.ibss.mtx); 956 + sdata_unlock(sdata); 961 957 } 962 958 963 959 void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata) ··· 965 961 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 966 962 struct sta_info *sta; 967 963 968 - mutex_lock(&ifibss->mtx); 964 + sdata_lock(sdata); 969 965 970 966 /* 971 967 * Work could be scheduled after scan or similar ··· 1001 997 } 1002 998 1003 999 out: 1004 - mutex_unlock(&ifibss->mtx); 1000 + sdata_unlock(sdata); 1005 1001 } 1006 1002 1007 1003 static void ieee80211_ibss_timer(unsigned long data) ··· 1018 1014 1019 1015 setup_timer(&ifibss->timer, ieee80211_ibss_timer, 1020 1016 (unsigned long) sdata); 1021 - mutex_init(&ifibss->mtx); 1022 1017 INIT_LIST_HEAD(&ifibss->incomplete_stations); 1023 1018 spin_lock_init(&ifibss->incomplete_lock); 1024 1019 } ··· 1043 1040 struct cfg80211_ibss_params *params) 1044 1041 { 1045 1042 u32 changed = 0; 1046 - 1047 - mutex_lock(&sdata->u.ibss.mtx); 1048 1043 1049 1044 if (params->bssid) { 1050 1045 memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN); ··· 1075 1074 1076 1075 memcpy(sdata->u.ibss.ssid, params->ssid, params->ssid_len); 1077 1076 sdata->u.ibss.ssid_len = params->ssid_len; 1078 - 1079 - mutex_unlock(&sdata->u.ibss.mtx); 1080 1077 1081 1078 /* 1082 1079 * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is ··· 1110 1111 int active_ibss; 1111 1112 struct sta_info *sta; 1112 1113 struct beacon_data *presp; 1113 - 1114 - mutex_lock(&sdata->u.ibss.mtx); 1115 1114 1116 1115 active_ibss = ieee80211_sta_active_ibss(sdata); 1117 1116 ··· 1154 1157 /* remove beacon */ 1155 1158 kfree(sdata->u.ibss.ie); 1156 1159 presp = rcu_dereference_protected(ifibss->presp, 1157 - lockdep_is_held(&sdata->u.ibss.mtx)); 1160 + lockdep_is_held(&sdata->wdev.mtx)); 1158 1161 RCU_INIT_POINTER(sdata->u.ibss.presp, NULL); 1159 1162 sdata->vif.bss_conf.ibss_joined = false; 1160 1163 sdata->vif.bss_conf.ibss_creator = false; ··· 1169 1172 skb_queue_purge(&sdata->skb_queue); 1170 1173 1171 1174 del_timer_sync(&sdata->u.ibss.timer); 1172 - 1173 - mutex_unlock(&sdata->u.ibss.mtx); 1174 1175 1175 1176 return 0; 1176 1177 }
+21 -8
net/mac80211/ieee80211_i.h
··· 394 394 bool nullfunc_failed; 395 395 bool connection_loss; 396 396 397 - struct mutex mtx; 398 397 struct cfg80211_bss *associated; 399 398 struct ieee80211_mgd_auth_data *auth_data; 400 399 struct ieee80211_mgd_assoc_data *assoc_data; ··· 487 488 struct ieee80211_if_ibss { 488 489 struct timer_list timer; 489 490 490 - struct mutex mtx; 491 - 492 491 unsigned long last_scan_completed; 493 492 494 493 u32 basic_rates; ··· 577 580 bool accepting_plinks; 578 581 int num_gates; 579 582 struct beacon_data __rcu *beacon; 580 - /* just protects beacon updates for now */ 581 - struct mutex mtx; 582 583 const u8 *ie; 583 584 u8 ie_len; 584 585 enum { ··· 771 776 struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p) 772 777 { 773 778 return container_of(p, struct ieee80211_sub_if_data, vif); 779 + } 780 + 781 + static inline void sdata_lock(struct ieee80211_sub_if_data *sdata) 782 + __acquires(&sdata->wdev.mtx) 783 + { 784 + mutex_lock(&sdata->wdev.mtx); 785 + __acquire(&sdata->wdev.mtx); 786 + } 787 + 788 + static inline void sdata_unlock(struct ieee80211_sub_if_data *sdata) 789 + __releases(&sdata->wdev.mtx) 790 + { 791 + mutex_unlock(&sdata->wdev.mtx); 792 + __release(&sdata->wdev.mtx); 793 + } 794 + 795 + static inline void 796 + sdata_assert_lock(struct ieee80211_sub_if_data *sdata) 797 + { 798 + lockdep_assert_held(&sdata->wdev.mtx); 774 799 } 775 800 776 801 static inline enum ieee80211_band ··· 1282 1267 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata); 1283 1268 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, 1284 1269 __le16 fc, bool acked); 1270 + void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata); 1285 1271 1286 1272 /* IBSS code */ 1287 1273 void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local); ··· 1520 1504 { 1521 1505 ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0); 1522 1506 } 1523 - 1524 - u32 ieee80211_mandatory_rates(struct ieee80211_local *local, 1525 - enum ieee80211_band band); 1526 1507 1527 1508 void ieee80211_dynamic_ps_enable_work(struct work_struct *work); 1528 1509 void ieee80211_dynamic_ps_disable_work(struct work_struct *work);
+17 -1
net/mac80211/iface.c
··· 474 474 master->control_port_protocol; 475 475 sdata->control_port_no_encrypt = 476 476 master->control_port_no_encrypt; 477 + sdata->vif.cab_queue = master->vif.cab_queue; 478 + memcpy(sdata->vif.hw_queue, master->vif.hw_queue, 479 + sizeof(sdata->vif.hw_queue)); 477 480 break; 478 481 } 479 482 case NL80211_IFTYPE_AP: ··· 656 653 657 654 ieee80211_recalc_ps(local, -1); 658 655 659 - if (dev) { 656 + if (sdata->vif.type == NL80211_IFTYPE_MONITOR || 657 + sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { 658 + /* XXX: for AP_VLAN, actually track AP queues */ 659 + netif_tx_start_all_queues(dev); 660 + } else if (dev) { 660 661 unsigned long flags; 661 662 int n_acs = IEEE80211_NUM_ACS; 662 663 int ac; ··· 1702 1695 LIST_HEAD(wdev_list); 1703 1696 1704 1697 ASSERT_RTNL(); 1698 + 1699 + /* 1700 + * Close all AP_VLAN interfaces first, as otherwise they 1701 + * might be closed while the AP interface they belong to 1702 + * is closed, causing unregister_netdevice_many() to crash. 1703 + */ 1704 + list_for_each_entry(sdata, &local->interfaces, list) 1705 + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 1706 + dev_close(sdata->dev); 1705 1707 1706 1708 mutex_lock(&local->iflist_mtx); 1707 1709 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
+12 -12
net/mac80211/key.c
··· 335 335 switch (cipher) { 336 336 case WLAN_CIPHER_SUITE_WEP40: 337 337 case WLAN_CIPHER_SUITE_WEP104: 338 - key->conf.iv_len = WEP_IV_LEN; 339 - key->conf.icv_len = WEP_ICV_LEN; 338 + key->conf.iv_len = IEEE80211_WEP_IV_LEN; 339 + key->conf.icv_len = IEEE80211_WEP_ICV_LEN; 340 340 break; 341 341 case WLAN_CIPHER_SUITE_TKIP: 342 - key->conf.iv_len = TKIP_IV_LEN; 343 - key->conf.icv_len = TKIP_ICV_LEN; 342 + key->conf.iv_len = IEEE80211_TKIP_IV_LEN; 343 + key->conf.icv_len = IEEE80211_TKIP_ICV_LEN; 344 344 if (seq) { 345 345 for (i = 0; i < IEEE80211_NUM_TIDS; i++) { 346 346 key->u.tkip.rx[i].iv32 = ··· 352 352 spin_lock_init(&key->u.tkip.txlock); 353 353 break; 354 354 case WLAN_CIPHER_SUITE_CCMP: 355 - key->conf.iv_len = CCMP_HDR_LEN; 356 - key->conf.icv_len = CCMP_MIC_LEN; 355 + key->conf.iv_len = IEEE80211_CCMP_HDR_LEN; 356 + key->conf.icv_len = IEEE80211_CCMP_MIC_LEN; 357 357 if (seq) { 358 358 for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) 359 - for (j = 0; j < CCMP_PN_LEN; j++) 359 + for (j = 0; j < IEEE80211_CCMP_PN_LEN; j++) 360 360 key->u.ccmp.rx_pn[i][j] = 361 - seq[CCMP_PN_LEN - j - 1]; 361 + seq[IEEE80211_CCMP_PN_LEN - j - 1]; 362 362 } 363 363 /* 364 364 * Initialize AES key state here as an optimization so that ··· 375 375 key->conf.iv_len = 0; 376 376 key->conf.icv_len = sizeof(struct ieee80211_mmie); 377 377 if (seq) 378 - for (j = 0; j < CMAC_PN_LEN; j++) 378 + for (j = 0; j < IEEE80211_CMAC_PN_LEN; j++) 379 379 key->u.aes_cmac.rx_pn[j] = 380 - seq[CMAC_PN_LEN - j - 1]; 380 + seq[IEEE80211_CMAC_PN_LEN - j - 1]; 381 381 /* 382 382 * Initialize AES key state here as an optimization so that 383 383 * it does not need to be initialized for every packet. ··· 740 740 pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS]; 741 741 else 742 742 pn = key->u.ccmp.rx_pn[tid]; 743 - memcpy(seq->ccmp.pn, pn, CCMP_PN_LEN); 743 + memcpy(seq->ccmp.pn, pn, IEEE80211_CCMP_PN_LEN); 744 744 break; 745 745 case WLAN_CIPHER_SUITE_AES_CMAC: 746 746 if (WARN_ON(tid != 0)) 747 747 return; 748 748 pn = key->u.aes_cmac.rx_pn; 749 - memcpy(seq->aes_cmac.pn, pn, CMAC_PN_LEN); 749 + memcpy(seq->aes_cmac.pn, pn, IEEE80211_CMAC_PN_LEN); 750 750 break; 751 751 } 752 752 }
+2 -13
net/mac80211/key.h
··· 19 19 #define NUM_DEFAULT_KEYS 4 20 20 #define NUM_DEFAULT_MGMT_KEYS 2 21 21 22 - #define WEP_IV_LEN 4 23 - #define WEP_ICV_LEN 4 24 - #define ALG_CCMP_KEY_LEN 16 25 - #define CCMP_HDR_LEN 8 26 - #define CCMP_MIC_LEN 8 27 - #define CCMP_TK_LEN 16 28 - #define CCMP_PN_LEN 6 29 - #define TKIP_IV_LEN 8 30 - #define TKIP_ICV_LEN 4 31 - #define CMAC_PN_LEN 6 32 - 33 22 struct ieee80211_local; 34 23 struct ieee80211_sub_if_data; 35 24 struct sta_info; ··· 82 93 * frames and the last counter is used with Robust 83 94 * Management frames. 84 95 */ 85 - u8 rx_pn[IEEE80211_NUM_TIDS + 1][CCMP_PN_LEN]; 96 + u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN]; 86 97 struct crypto_cipher *tfm; 87 98 u32 replays; /* dot11RSNAStatsCCMPReplays */ 88 99 } ccmp; 89 100 struct { 90 101 atomic64_t tx_pn; 91 - u8 rx_pn[CMAC_PN_LEN]; 102 + u8 rx_pn[IEEE80211_CMAC_PN_LEN]; 92 103 struct crypto_cipher *tfm; 93 104 u32 replays; /* dot11RSNAStatsCMACReplays */ 94 105 u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
+2 -2
net/mac80211/main.c
··· 331 331 return NOTIFY_DONE; 332 332 333 333 ifmgd = &sdata->u.mgd; 334 - mutex_lock(&ifmgd->mtx); 334 + sdata_lock(sdata); 335 335 336 336 /* Copy the addresses to the bss_conf list */ 337 337 ifa = idev->ifa_list; ··· 349 349 ieee80211_bss_info_change_notify(sdata, 350 350 BSS_CHANGED_ARP_FILTER); 351 351 352 - mutex_unlock(&ifmgd->mtx); 352 + sdata_unlock(sdata); 353 353 354 354 return NOTIFY_DONE; 355 355 }
+19 -19
net/mac80211/mesh.c
··· 161 161 del_timer_sync(&sta->plink_timer); 162 162 } 163 163 164 - if (changed) 164 + if (changed) { 165 + sdata_lock(sdata); 165 166 ieee80211_mbss_info_change_notify(sdata, changed); 167 + sdata_unlock(sdata); 168 + } 166 169 } 167 170 168 171 int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) ··· 580 577 mesh_path_expire(sdata); 581 578 582 579 changed = mesh_accept_plinks_update(sdata); 580 + sdata_lock(sdata); 583 581 ieee80211_mbss_info_change_notify(sdata, changed); 582 + sdata_unlock(sdata); 584 583 585 584 mod_timer(&ifmsh->housekeeping_timer, 586 585 round_jiffies(jiffies + ··· 702 697 } 703 698 704 699 static int 705 - ieee80211_mesh_rebuild_beacon(struct ieee80211_if_mesh *ifmsh) 700 + ieee80211_mesh_rebuild_beacon(struct ieee80211_sub_if_data *sdata) 706 701 { 707 702 struct beacon_data *old_bcn; 708 703 int ret; 709 704 710 - mutex_lock(&ifmsh->mtx); 711 - 712 - old_bcn = rcu_dereference_protected(ifmsh->beacon, 713 - lockdep_is_held(&ifmsh->mtx)); 714 - ret = ieee80211_mesh_build_beacon(ifmsh); 705 + old_bcn = rcu_dereference_protected(sdata->u.mesh.beacon, 706 + lockdep_is_held(&sdata->wdev.mtx)); 707 + ret = ieee80211_mesh_build_beacon(&sdata->u.mesh); 715 708 if (ret) 716 709 /* just reuse old beacon */ 717 - goto out; 710 + return ret; 718 711 719 712 if (old_bcn) 720 713 kfree_rcu(old_bcn, rcu_head); 721 - out: 722 - mutex_unlock(&ifmsh->mtx); 723 - return ret; 714 + return 0; 724 715 } 725 716 726 717 void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata, ··· 727 726 BSS_CHANGED_HT | 728 727 BSS_CHANGED_BASIC_RATES | 729 728 BSS_CHANGED_BEACON_INT))) 730 - if (ieee80211_mesh_rebuild_beacon(&sdata->u.mesh)) 729 + if (ieee80211_mesh_rebuild_beacon(sdata)) 731 730 return; 732 731 ieee80211_bss_info_change_notify(sdata, changed); 733 732 } ··· 742 741 BSS_CHANGED_BASIC_RATES | 743 742 BSS_CHANGED_BEACON_INT; 744 743 enum ieee80211_band band = ieee80211_get_sdata_band(sdata); 744 + struct ieee80211_supported_band *sband = 745 + sdata->local->hw.wiphy->bands[band]; 745 746 746 747 local->fif_other_bss++; 747 748 /* mesh ifaces must set allmulti to forward mcast traffic */ ··· 751 748 ieee80211_configure_filter(local); 752 749 753 750 ifmsh->mesh_cc_id = 0; /* Disabled */ 754 - ifmsh->mesh_auth_id = 0; /* Disabled */ 755 751 /* register sync ops from extensible synchronization framework */ 756 752 ifmsh->sync_ops = ieee80211_mesh_sync_ops_get(ifmsh->mesh_sp_id); 757 753 ifmsh->adjusting_tbtt = false; ··· 761 759 sdata->vif.bss_conf.ht_operation_mode = 762 760 ifmsh->mshcfg.ht_opmode; 763 761 sdata->vif.bss_conf.enable_beacon = true; 764 - sdata->vif.bss_conf.basic_rates = 765 - ieee80211_mandatory_rates(local, band); 762 + sdata->vif.bss_conf.basic_rates = ieee80211_mandatory_rates(sband); 766 763 767 764 changed |= ieee80211_mps_local_status_update(sdata); 768 765 ··· 789 788 sdata->vif.bss_conf.enable_beacon = false; 790 789 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); 791 790 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); 792 - mutex_lock(&ifmsh->mtx); 791 + sdata_lock(sdata); 793 792 bcn = rcu_dereference_protected(ifmsh->beacon, 794 - lockdep_is_held(&ifmsh->mtx)); 793 + lockdep_is_held(&sdata->wdev.mtx)); 795 794 rcu_assign_pointer(ifmsh->beacon, NULL); 796 795 kfree_rcu(bcn, rcu_head); 797 - mutex_unlock(&ifmsh->mtx); 796 + sdata_unlock(sdata); 798 797 799 798 /* flush STAs and mpaths on this iface */ 800 799 sta_info_flush(sdata); ··· 1042 1041 spin_lock_init(&ifmsh->mesh_preq_queue_lock); 1043 1042 spin_lock_init(&ifmsh->sync_offset_lock); 1044 1043 RCU_INIT_POINTER(ifmsh->beacon, NULL); 1045 - mutex_init(&ifmsh->mtx); 1046 1044 1047 1045 sdata->vif.bss_conf.bssid = zero_addr; 1048 1046 }
+6 -1
net/mac80211/mesh_plink.c
··· 517 517 ieee80211_mps_frame_release(sta, elems); 518 518 out: 519 519 rcu_read_unlock(); 520 + sdata_lock(sdata); 520 521 ieee80211_mbss_info_change_notify(sdata, changed); 522 + sdata_unlock(sdata); 521 523 } 522 524 523 525 static void mesh_plink_timer(unsigned long data) ··· 1070 1068 1071 1069 rcu_read_unlock(); 1072 1070 1073 - if (changed) 1071 + if (changed) { 1072 + sdata_lock(sdata); 1074 1073 ieee80211_mbss_info_change_notify(sdata, changed); 1074 + sdata_unlock(sdata); 1075 + } 1075 1076 }
+175 -235
net/mac80211/mlme.c
··· 91 91 #define IEEE80211_SIGNAL_AVE_MIN_COUNT 4 92 92 93 93 /* 94 - * All cfg80211 functions have to be called outside a locked 95 - * section so that they can acquire a lock themselves... This 96 - * is much simpler than queuing up things in cfg80211, but we 97 - * do need some indirection for that here. 98 - */ 99 - enum rx_mgmt_action { 100 - /* no action required */ 101 - RX_MGMT_NONE, 102 - 103 - /* caller must call cfg80211_send_deauth() */ 104 - RX_MGMT_CFG80211_DEAUTH, 105 - 106 - /* caller must call cfg80211_send_disassoc() */ 107 - RX_MGMT_CFG80211_DISASSOC, 108 - 109 - /* caller must call cfg80211_send_rx_auth() */ 110 - RX_MGMT_CFG80211_RX_AUTH, 111 - 112 - /* caller must call cfg80211_send_rx_assoc() */ 113 - RX_MGMT_CFG80211_RX_ASSOC, 114 - 115 - /* caller must call cfg80211_send_assoc_timeout() */ 116 - RX_MGMT_CFG80211_ASSOC_TIMEOUT, 117 - 118 - /* used when a processed beacon causes a deauth */ 119 - RX_MGMT_CFG80211_TX_DEAUTH, 120 - }; 121 - 122 - /* utils */ 123 - static inline void ASSERT_MGD_MTX(struct ieee80211_if_managed *ifmgd) 124 - { 125 - lockdep_assert_held(&ifmgd->mtx); 126 - } 127 - 128 - /* 129 94 * We can have multiple work items (and connection probing) 130 95 * scheduling this timer, but we need to take care to only 131 96 * reschedule it when it should fire _earlier_ than it was ··· 100 135 * has happened -- the work that runs from this timer will 101 136 * do that. 102 137 */ 103 - static void run_again(struct ieee80211_if_managed *ifmgd, unsigned long timeout) 138 + static void run_again(struct ieee80211_sub_if_data *sdata, 139 + unsigned long timeout) 104 140 { 105 - ASSERT_MGD_MTX(ifmgd); 141 + sdata_assert_lock(sdata); 106 142 107 - if (!timer_pending(&ifmgd->timer) || 108 - time_before(timeout, ifmgd->timer.expires)) 109 - mod_timer(&ifmgd->timer, timeout); 143 + if (!timer_pending(&sdata->u.mgd.timer) || 144 + time_before(timeout, sdata->u.mgd.timer.expires)) 145 + mod_timer(&sdata->u.mgd.timer, timeout); 110 146 } 111 147 112 148 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) ··· 618 652 struct ieee80211_channel *chan; 619 653 u32 rates = 0; 620 654 621 - lockdep_assert_held(&ifmgd->mtx); 655 + sdata_assert_lock(sdata); 622 656 623 657 rcu_read_lock(); 624 658 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); ··· 928 962 if (!ieee80211_sdata_running(sdata)) 929 963 return; 930 964 931 - mutex_lock(&ifmgd->mtx); 965 + sdata_lock(sdata); 932 966 if (!ifmgd->associated) 933 967 goto out; 934 968 ··· 951 985 IEEE80211_QUEUE_STOP_REASON_CSA); 952 986 out: 953 987 ifmgd->flags &= ~IEEE80211_STA_CSA_RECEIVED; 954 - mutex_unlock(&ifmgd->mtx); 988 + sdata_unlock(sdata); 955 989 } 956 990 957 991 void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success) ··· 981 1015 982 1016 static void 983 1017 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, 984 - u64 timestamp, struct ieee802_11_elems *elems) 1018 + u64 timestamp, struct ieee802_11_elems *elems, 1019 + bool beacon) 985 1020 { 986 1021 struct ieee80211_local *local = sdata->local; 987 1022 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; ··· 999 1032 struct cfg80211_chan_def new_vht_chandef = {}; 1000 1033 const struct ieee80211_sec_chan_offs_ie *sec_chan_offs; 1001 1034 const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie; 1035 + const struct ieee80211_ht_operation *ht_oper; 1002 1036 int secondary_channel_offset = -1; 1003 1037 1004 - ASSERT_MGD_MTX(ifmgd); 1038 + sdata_assert_lock(sdata); 1005 1039 1006 1040 if (!cbss) 1007 1041 return; ··· 1016 1048 1017 1049 sec_chan_offs = elems->sec_chan_offs; 1018 1050 wide_bw_chansw_ie = elems->wide_bw_chansw_ie; 1051 + ht_oper = elems->ht_operation; 1019 1052 1020 1053 if (ifmgd->flags & (IEEE80211_STA_DISABLE_HT | 1021 1054 IEEE80211_STA_DISABLE_40MHZ)) { 1022 1055 sec_chan_offs = NULL; 1023 1056 wide_bw_chansw_ie = NULL; 1057 + /* only used for bandwidth here */ 1058 + ht_oper = NULL; 1024 1059 } 1025 1060 1026 1061 if (ifmgd->flags & IEEE80211_STA_DISABLE_VHT) ··· 1065 1094 return; 1066 1095 } 1067 1096 1068 - if (sec_chan_offs) { 1097 + if (!beacon && sec_chan_offs) { 1069 1098 secondary_channel_offset = sec_chan_offs->sec_chan_offs; 1099 + } else if (beacon && ht_oper) { 1100 + secondary_channel_offset = 1101 + ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET; 1070 1102 } else if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) { 1071 - /* if HT is enabled and the IE not present, it's still HT */ 1103 + /* 1104 + * If it's not a beacon, HT is enabled and the IE not present, 1105 + * it's 20 MHz, 802.11-2012 8.5.2.6: 1106 + * This element [the Secondary Channel Offset Element] is 1107 + * present when switching to a 40 MHz channel. It may be 1108 + * present when switching to a 20 MHz channel (in which 1109 + * case the secondary channel offset is set to SCN). 1110 + */ 1072 1111 secondary_channel_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE; 1073 1112 } 1074 1113 ··· 1354 1373 1355 1374 if (mgd->flags & (IEEE80211_STA_BEACON_POLL | 1356 1375 IEEE80211_STA_CONNECTION_POLL)) 1376 + return false; 1377 + 1378 + if (!sdata->vif.bss_conf.dtim_period) 1357 1379 return false; 1358 1380 1359 1381 rcu_read_lock(); ··· 1811 1827 struct ieee80211_local *local = sdata->local; 1812 1828 u32 changed = 0; 1813 1829 1814 - ASSERT_MGD_MTX(ifmgd); 1830 + sdata_assert_lock(sdata); 1815 1831 1816 1832 if (WARN_ON_ONCE(tx && !frame_buf)) 1817 1833 return; ··· 2020 2036 } 2021 2037 2022 2038 ifmgd->probe_timeout = jiffies + msecs_to_jiffies(probe_wait_ms); 2023 - run_again(ifmgd, ifmgd->probe_timeout); 2039 + run_again(sdata, ifmgd->probe_timeout); 2024 2040 if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 2025 2041 ieee80211_flush_queues(sdata->local, sdata); 2026 2042 } ··· 2034 2050 if (!ieee80211_sdata_running(sdata)) 2035 2051 return; 2036 2052 2037 - mutex_lock(&ifmgd->mtx); 2053 + sdata_lock(sdata); 2038 2054 2039 2055 if (!ifmgd->associated) 2040 2056 goto out; ··· 2088 2104 ifmgd->probe_send_count = 0; 2089 2105 ieee80211_mgd_probe_ap_send(sdata); 2090 2106 out: 2091 - mutex_unlock(&ifmgd->mtx); 2107 + sdata_unlock(sdata); 2092 2108 } 2093 2109 2094 2110 struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw, ··· 2104 2120 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 2105 2121 return NULL; 2106 2122 2107 - ASSERT_MGD_MTX(ifmgd); 2123 + sdata_assert_lock(sdata); 2108 2124 2109 2125 if (ifmgd->associated) 2110 2126 cbss = ifmgd->associated; ··· 2137 2153 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2138 2154 u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 2139 2155 2140 - mutex_lock(&ifmgd->mtx); 2156 + sdata_lock(sdata); 2141 2157 if (!ifmgd->associated) { 2142 - mutex_unlock(&ifmgd->mtx); 2158 + sdata_unlock(sdata); 2143 2159 return; 2144 2160 } 2145 2161 ··· 2150 2166 ieee80211_wake_queues_by_reason(&sdata->local->hw, 2151 2167 IEEE80211_MAX_QUEUE_MAP, 2152 2168 IEEE80211_QUEUE_STOP_REASON_CSA); 2153 - mutex_unlock(&ifmgd->mtx); 2154 2169 2155 - /* 2156 - * must be outside lock due to cfg80211, 2157 - * but that's not a problem. 2158 - */ 2159 2170 cfg80211_send_deauth(sdata->dev, frame_buf, IEEE80211_DEAUTH_FRAME_LEN); 2171 + sdata_unlock(sdata); 2160 2172 } 2161 2173 2162 2174 static void ieee80211_beacon_connection_loss_work(struct work_struct *work) ··· 2219 2239 { 2220 2240 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; 2221 2241 2222 - lockdep_assert_held(&sdata->u.mgd.mtx); 2242 + sdata_assert_lock(sdata); 2223 2243 2224 2244 if (!assoc) { 2225 2245 sta_info_destroy_addr(sdata, auth_data->bss->bssid); ··· 2260 2280 auth_data->key_idx, tx_flags); 2261 2281 } 2262 2282 2263 - static enum rx_mgmt_action __must_check 2264 - ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, 2265 - struct ieee80211_mgmt *mgmt, size_t len) 2283 + static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, 2284 + struct ieee80211_mgmt *mgmt, size_t len) 2266 2285 { 2267 2286 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2268 2287 u8 bssid[ETH_ALEN]; 2269 2288 u16 auth_alg, auth_transaction, status_code; 2270 2289 struct sta_info *sta; 2271 2290 2272 - lockdep_assert_held(&ifmgd->mtx); 2291 + sdata_assert_lock(sdata); 2273 2292 2274 2293 if (len < 24 + 6) 2275 - return RX_MGMT_NONE; 2294 + return; 2276 2295 2277 2296 if (!ifmgd->auth_data || ifmgd->auth_data->done) 2278 - return RX_MGMT_NONE; 2297 + return; 2279 2298 2280 2299 memcpy(bssid, ifmgd->auth_data->bss->bssid, ETH_ALEN); 2281 2300 2282 2301 if (!ether_addr_equal(bssid, mgmt->bssid)) 2283 - return RX_MGMT_NONE; 2302 + return; 2284 2303 2285 2304 auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg); 2286 2305 auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction); ··· 2291 2312 mgmt->sa, auth_alg, ifmgd->auth_data->algorithm, 2292 2313 auth_transaction, 2293 2314 ifmgd->auth_data->expected_transaction); 2294 - return RX_MGMT_NONE; 2315 + return; 2295 2316 } 2296 2317 2297 2318 if (status_code != WLAN_STATUS_SUCCESS) { 2298 2319 sdata_info(sdata, "%pM denied authentication (status %d)\n", 2299 2320 mgmt->sa, status_code); 2300 2321 ieee80211_destroy_auth_data(sdata, false); 2301 - return RX_MGMT_CFG80211_RX_AUTH; 2322 + cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, len); 2323 + return; 2302 2324 } 2303 2325 2304 2326 switch (ifmgd->auth_data->algorithm) { ··· 2312 2332 if (ifmgd->auth_data->expected_transaction != 4) { 2313 2333 ieee80211_auth_challenge(sdata, mgmt, len); 2314 2334 /* need another frame */ 2315 - return RX_MGMT_NONE; 2335 + return; 2316 2336 } 2317 2337 break; 2318 2338 default: 2319 2339 WARN_ONCE(1, "invalid auth alg %d", 2320 2340 ifmgd->auth_data->algorithm); 2321 - return RX_MGMT_NONE; 2341 + return; 2322 2342 } 2323 2343 2324 2344 sdata_info(sdata, "authenticated\n"); 2325 2345 ifmgd->auth_data->done = true; 2326 2346 ifmgd->auth_data->timeout = jiffies + IEEE80211_AUTH_WAIT_ASSOC; 2327 2347 ifmgd->auth_data->timeout_started = true; 2328 - run_again(ifmgd, ifmgd->auth_data->timeout); 2348 + run_again(sdata, ifmgd->auth_data->timeout); 2329 2349 2330 2350 if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE && 2331 2351 ifmgd->auth_data->expected_transaction != 2) { ··· 2333 2353 * Report auth frame to user space for processing since another 2334 2354 * round of Authentication frames is still needed. 2335 2355 */ 2336 - return RX_MGMT_CFG80211_RX_AUTH; 2356 + cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, len); 2357 + return; 2337 2358 } 2338 2359 2339 2360 /* move station state to auth */ ··· 2350 2369 } 2351 2370 mutex_unlock(&sdata->local->sta_mtx); 2352 2371 2353 - return RX_MGMT_CFG80211_RX_AUTH; 2372 + cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, len); 2373 + return; 2354 2374 out_err: 2355 2375 mutex_unlock(&sdata->local->sta_mtx); 2356 2376 /* ignore frame -- wait for timeout */ 2357 - return RX_MGMT_NONE; 2358 2377 } 2359 2378 2360 2379 2361 - static enum rx_mgmt_action __must_check 2362 - ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, 2363 - struct ieee80211_mgmt *mgmt, size_t len) 2380 + static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, 2381 + struct ieee80211_mgmt *mgmt, size_t len) 2364 2382 { 2365 2383 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2366 2384 const u8 *bssid = NULL; 2367 2385 u16 reason_code; 2368 2386 2369 - lockdep_assert_held(&ifmgd->mtx); 2387 + sdata_assert_lock(sdata); 2370 2388 2371 2389 if (len < 24 + 2) 2372 - return RX_MGMT_NONE; 2390 + return; 2373 2391 2374 2392 if (!ifmgd->associated || 2375 2393 !ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid)) 2376 - return RX_MGMT_NONE; 2394 + return; 2377 2395 2378 2396 bssid = ifmgd->associated->bssid; 2379 2397 ··· 2383 2403 2384 2404 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 2385 2405 2386 - return RX_MGMT_CFG80211_DEAUTH; 2406 + cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, len); 2387 2407 } 2388 2408 2389 2409 2390 - static enum rx_mgmt_action __must_check 2391 - ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, 2392 - struct ieee80211_mgmt *mgmt, size_t len) 2410 + static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, 2411 + struct ieee80211_mgmt *mgmt, size_t len) 2393 2412 { 2394 2413 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2395 2414 u16 reason_code; 2396 2415 2397 - lockdep_assert_held(&ifmgd->mtx); 2416 + sdata_assert_lock(sdata); 2398 2417 2399 2418 if (len < 24 + 2) 2400 - return RX_MGMT_NONE; 2419 + return; 2401 2420 2402 2421 if (!ifmgd->associated || 2403 2422 !ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid)) 2404 - return RX_MGMT_NONE; 2423 + return; 2405 2424 2406 2425 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); 2407 2426 ··· 2409 2430 2410 2431 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 2411 2432 2412 - return RX_MGMT_CFG80211_DISASSOC; 2433 + cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, len); 2413 2434 } 2414 2435 2415 2436 static void ieee80211_get_rates(struct ieee80211_supported_band *sband, ··· 2459 2480 { 2460 2481 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; 2461 2482 2462 - lockdep_assert_held(&sdata->u.mgd.mtx); 2483 + sdata_assert_lock(sdata); 2463 2484 2464 2485 if (!assoc) { 2465 2486 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); ··· 2640 2661 return true; 2641 2662 } 2642 2663 2643 - static enum rx_mgmt_action __must_check 2644 - ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, 2645 - struct ieee80211_mgmt *mgmt, size_t len, 2646 - struct cfg80211_bss **bss) 2664 + static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, 2665 + struct ieee80211_mgmt *mgmt, 2666 + size_t len) 2647 2667 { 2648 2668 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2649 2669 struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data; ··· 2650 2672 struct ieee802_11_elems elems; 2651 2673 u8 *pos; 2652 2674 bool reassoc; 2675 + struct cfg80211_bss *bss; 2653 2676 2654 - lockdep_assert_held(&ifmgd->mtx); 2677 + sdata_assert_lock(sdata); 2655 2678 2656 2679 if (!assoc_data) 2657 - return RX_MGMT_NONE; 2680 + return; 2658 2681 if (!ether_addr_equal(assoc_data->bss->bssid, mgmt->bssid)) 2659 - return RX_MGMT_NONE; 2682 + return; 2660 2683 2661 2684 /* 2662 2685 * AssocResp and ReassocResp have identical structure, so process both ··· 2665 2686 */ 2666 2687 2667 2688 if (len < 24 + 6) 2668 - return RX_MGMT_NONE; 2689 + return; 2669 2690 2670 2691 reassoc = ieee80211_is_reassoc_req(mgmt->frame_control); 2671 2692 capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); ··· 2692 2713 assoc_data->timeout = jiffies + msecs_to_jiffies(ms); 2693 2714 assoc_data->timeout_started = true; 2694 2715 if (ms > IEEE80211_ASSOC_TIMEOUT) 2695 - run_again(ifmgd, assoc_data->timeout); 2696 - return RX_MGMT_NONE; 2716 + run_again(sdata, assoc_data->timeout); 2717 + return; 2697 2718 } 2698 2719 2699 - *bss = assoc_data->bss; 2720 + bss = assoc_data->bss; 2700 2721 2701 2722 if (status_code != WLAN_STATUS_SUCCESS) { 2702 2723 sdata_info(sdata, "%pM denied association (code=%d)\n", 2703 2724 mgmt->sa, status_code); 2704 2725 ieee80211_destroy_assoc_data(sdata, false); 2705 2726 } else { 2706 - if (!ieee80211_assoc_success(sdata, *bss, mgmt, len)) { 2727 + if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) { 2707 2728 /* oops -- internal error -- send timeout for now */ 2708 2729 ieee80211_destroy_assoc_data(sdata, false); 2709 - cfg80211_put_bss(sdata->local->hw.wiphy, *bss); 2710 - return RX_MGMT_CFG80211_ASSOC_TIMEOUT; 2730 + cfg80211_put_bss(sdata->local->hw.wiphy, bss); 2731 + cfg80211_send_assoc_timeout(sdata->dev, mgmt->bssid); 2732 + return; 2711 2733 } 2712 2734 sdata_info(sdata, "associated\n"); 2713 2735 ··· 2720 2740 ieee80211_destroy_assoc_data(sdata, true); 2721 2741 } 2722 2742 2723 - return RX_MGMT_CFG80211_RX_ASSOC; 2743 + cfg80211_send_rx_assoc(sdata->dev, bss, (u8 *)mgmt, len); 2724 2744 } 2725 2745 2726 2746 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, ··· 2734 2754 struct ieee80211_channel *channel; 2735 2755 bool need_ps = false; 2736 2756 2737 - lockdep_assert_held(&sdata->u.mgd.mtx); 2757 + sdata_assert_lock(sdata); 2738 2758 2739 2759 if ((sdata->u.mgd.associated && 2740 2760 ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) || ··· 2776 2796 mutex_unlock(&local->iflist_mtx); 2777 2797 } 2778 2798 2779 - ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, elems); 2799 + ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, 2800 + elems, true); 2780 2801 2781 2802 } 2782 2803 ··· 2793 2812 2794 2813 ifmgd = &sdata->u.mgd; 2795 2814 2796 - ASSERT_MGD_MTX(ifmgd); 2815 + sdata_assert_lock(sdata); 2797 2816 2798 2817 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) 2799 2818 return; /* ignore ProbeResp to foreign address */ ··· 2818 2837 ifmgd->auth_data->tries = 0; 2819 2838 ifmgd->auth_data->timeout = jiffies; 2820 2839 ifmgd->auth_data->timeout_started = true; 2821 - run_again(ifmgd, ifmgd->auth_data->timeout); 2840 + run_again(sdata, ifmgd->auth_data->timeout); 2822 2841 } 2823 2842 } 2824 2843 ··· 2843 2862 (1ULL << WLAN_EID_HT_CAPABILITY) | 2844 2863 (1ULL << WLAN_EID_HT_OPERATION); 2845 2864 2846 - static enum rx_mgmt_action 2847 - ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, 2848 - struct ieee80211_mgmt *mgmt, size_t len, 2849 - u8 *deauth_buf, struct ieee80211_rx_status *rx_status) 2865 + static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, 2866 + struct ieee80211_mgmt *mgmt, size_t len, 2867 + struct ieee80211_rx_status *rx_status) 2850 2868 { 2851 2869 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2852 2870 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; ··· 2860 2880 u8 erp_value = 0; 2861 2881 u32 ncrc; 2862 2882 u8 *bssid; 2883 + u8 deauth_buf[IEEE80211_DEAUTH_FRAME_LEN]; 2863 2884 2864 - lockdep_assert_held(&ifmgd->mtx); 2885 + sdata_assert_lock(sdata); 2865 2886 2866 2887 /* Process beacon from the current BSS */ 2867 2888 baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt; 2868 2889 if (baselen > len) 2869 - return RX_MGMT_NONE; 2890 + return; 2870 2891 2871 2892 rcu_read_lock(); 2872 2893 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 2873 2894 if (!chanctx_conf) { 2874 2895 rcu_read_unlock(); 2875 - return RX_MGMT_NONE; 2896 + return; 2876 2897 } 2877 2898 2878 2899 if (rx_status->freq != chanctx_conf->def.chan->center_freq) { 2879 2900 rcu_read_unlock(); 2880 - return RX_MGMT_NONE; 2901 + return; 2881 2902 } 2882 2903 chan = chanctx_conf->def.chan; 2883 2904 rcu_read_unlock(); ··· 2905 2924 /* continue assoc process */ 2906 2925 ifmgd->assoc_data->timeout = jiffies; 2907 2926 ifmgd->assoc_data->timeout_started = true; 2908 - run_again(ifmgd, ifmgd->assoc_data->timeout); 2909 - return RX_MGMT_NONE; 2927 + run_again(sdata, ifmgd->assoc_data->timeout); 2928 + return; 2910 2929 } 2911 2930 2912 2931 if (!ifmgd->associated || 2913 2932 !ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid)) 2914 - return RX_MGMT_NONE; 2933 + return; 2915 2934 bssid = ifmgd->associated->bssid; 2916 2935 2917 2936 /* Track average RSSI from the Beacon frames of the current AP */ ··· 3057 3076 } 3058 3077 3059 3078 if (ncrc == ifmgd->beacon_crc && ifmgd->beacon_crc_valid) 3060 - return RX_MGMT_NONE; 3079 + return; 3061 3080 ifmgd->beacon_crc = ncrc; 3062 3081 ifmgd->beacon_crc_valid = true; 3063 3082 ··· 3091 3110 } 3092 3111 3093 3112 changed |= BSS_CHANGED_DTIM_PERIOD; 3113 + ieee80211_recalc_ps_vif(sdata); 3094 3114 } 3095 3115 3096 3116 if (elems.erp_info) { ··· 3113 3131 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, 3114 3132 WLAN_REASON_DEAUTH_LEAVING, 3115 3133 true, deauth_buf); 3116 - return RX_MGMT_CFG80211_TX_DEAUTH; 3134 + cfg80211_send_deauth(sdata->dev, deauth_buf, 3135 + sizeof(deauth_buf)); 3136 + return; 3117 3137 } 3118 3138 3119 3139 if (sta && elems.opmode_notif) ··· 3132 3148 elems.pwr_constr_elem); 3133 3149 3134 3150 ieee80211_bss_info_change_notify(sdata, changed); 3135 - 3136 - return RX_MGMT_NONE; 3137 3151 } 3138 3152 3139 3153 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 3140 3154 struct sk_buff *skb) 3141 3155 { 3142 - struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 3143 3156 struct ieee80211_rx_status *rx_status; 3144 3157 struct ieee80211_mgmt *mgmt; 3145 - struct cfg80211_bss *bss = NULL; 3146 - enum rx_mgmt_action rma = RX_MGMT_NONE; 3147 - u8 deauth_buf[IEEE80211_DEAUTH_FRAME_LEN]; 3148 3158 u16 fc; 3149 3159 struct ieee802_11_elems elems; 3150 3160 int ies_len; ··· 3147 3169 mgmt = (struct ieee80211_mgmt *) skb->data; 3148 3170 fc = le16_to_cpu(mgmt->frame_control); 3149 3171 3150 - mutex_lock(&ifmgd->mtx); 3172 + sdata_lock(sdata); 3151 3173 3152 3174 switch (fc & IEEE80211_FCTL_STYPE) { 3153 3175 case IEEE80211_STYPE_BEACON: 3154 - rma = ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, 3155 - deauth_buf, rx_status); 3176 + ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status); 3156 3177 break; 3157 3178 case IEEE80211_STYPE_PROBE_RESP: 3158 3179 ieee80211_rx_mgmt_probe_resp(sdata, skb); 3159 3180 break; 3160 3181 case IEEE80211_STYPE_AUTH: 3161 - rma = ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); 3182 + ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); 3162 3183 break; 3163 3184 case IEEE80211_STYPE_DEAUTH: 3164 - rma = ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); 3185 + ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); 3165 3186 break; 3166 3187 case IEEE80211_STYPE_DISASSOC: 3167 - rma = ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); 3188 + ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); 3168 3189 break; 3169 3190 case IEEE80211_STYPE_ASSOC_RESP: 3170 3191 case IEEE80211_STYPE_REASSOC_RESP: 3171 - rma = ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len, &bss); 3192 + ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); 3172 3193 break; 3173 3194 case IEEE80211_STYPE_ACTION: 3174 3195 if (mgmt->u.action.category == WLAN_CATEGORY_SPECTRUM_MGMT) { ··· 3187 3210 3188 3211 ieee80211_sta_process_chanswitch(sdata, 3189 3212 rx_status->mactime, 3190 - &elems); 3213 + &elems, false); 3191 3214 } else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) { 3192 3215 ies_len = skb->len - 3193 3216 offsetof(struct ieee80211_mgmt, ··· 3209 3232 3210 3233 ieee80211_sta_process_chanswitch(sdata, 3211 3234 rx_status->mactime, 3212 - &elems); 3235 + &elems, false); 3213 3236 } 3214 3237 break; 3215 3238 } 3216 - mutex_unlock(&ifmgd->mtx); 3217 - 3218 - switch (rma) { 3219 - case RX_MGMT_NONE: 3220 - /* no action */ 3221 - break; 3222 - case RX_MGMT_CFG80211_DEAUTH: 3223 - cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len); 3224 - break; 3225 - case RX_MGMT_CFG80211_DISASSOC: 3226 - cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); 3227 - break; 3228 - case RX_MGMT_CFG80211_RX_AUTH: 3229 - cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, skb->len); 3230 - break; 3231 - case RX_MGMT_CFG80211_RX_ASSOC: 3232 - cfg80211_send_rx_assoc(sdata->dev, bss, (u8 *)mgmt, skb->len); 3233 - break; 3234 - case RX_MGMT_CFG80211_ASSOC_TIMEOUT: 3235 - cfg80211_send_assoc_timeout(sdata->dev, mgmt->bssid); 3236 - break; 3237 - case RX_MGMT_CFG80211_TX_DEAUTH: 3238 - cfg80211_send_deauth(sdata->dev, deauth_buf, 3239 - sizeof(deauth_buf)); 3240 - break; 3241 - default: 3242 - WARN(1, "unexpected: %d", rma); 3243 - } 3239 + sdata_unlock(sdata); 3244 3240 } 3245 3241 3246 3242 static void ieee80211_sta_timer(unsigned long data) ··· 3227 3277 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, 3228 3278 u8 *bssid, u8 reason, bool tx) 3229 3279 { 3230 - struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 3231 3280 u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 3232 3281 3233 3282 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, 3234 3283 tx, frame_buf); 3235 - mutex_unlock(&ifmgd->mtx); 3236 3284 3237 - /* 3238 - * must be outside lock due to cfg80211, 3239 - * but that's not a problem. 3240 - */ 3241 3285 cfg80211_send_deauth(sdata->dev, frame_buf, IEEE80211_DEAUTH_FRAME_LEN); 3242 - 3243 - mutex_lock(&ifmgd->mtx); 3244 3286 } 3245 3287 3246 3288 static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) ··· 3242 3300 struct ieee80211_mgd_auth_data *auth_data = ifmgd->auth_data; 3243 3301 u32 tx_flags = 0; 3244 3302 3245 - lockdep_assert_held(&ifmgd->mtx); 3303 + sdata_assert_lock(sdata); 3246 3304 3247 3305 if (WARN_ON_ONCE(!auth_data)) 3248 3306 return -EINVAL; 3249 - 3250 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 3251 - tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 3252 - IEEE80211_TX_INTFL_MLME_CONN_TX; 3253 3307 3254 3308 auth_data->tries++; 3255 3309 ··· 3280 3342 auth_data->expected_transaction = trans; 3281 3343 } 3282 3344 3345 + if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 3346 + tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 3347 + IEEE80211_TX_INTFL_MLME_CONN_TX; 3348 + 3283 3349 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, 3284 3350 auth_data->data, auth_data->data_len, 3285 3351 auth_data->bss->bssid, ··· 3307 3365 * will not answer to direct packet in unassociated state. 3308 3366 */ 3309 3367 ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1], 3310 - NULL, 0, (u32) -1, true, tx_flags, 3368 + NULL, 0, (u32) -1, true, 0, 3311 3369 auth_data->bss->channel, false); 3312 3370 rcu_read_unlock(); 3313 3371 } 3314 3372 3315 - if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { 3373 + if (tx_flags == 0) { 3316 3374 auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT; 3317 3375 ifmgd->auth_data->timeout_started = true; 3318 - run_again(ifmgd, auth_data->timeout); 3376 + run_again(sdata, auth_data->timeout); 3319 3377 } else { 3320 3378 auth_data->timeout_started = false; 3321 3379 } ··· 3328 3386 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; 3329 3387 struct ieee80211_local *local = sdata->local; 3330 3388 3331 - lockdep_assert_held(&sdata->u.mgd.mtx); 3389 + sdata_assert_lock(sdata); 3332 3390 3333 3391 assoc_data->tries++; 3334 3392 if (assoc_data->tries > IEEE80211_ASSOC_MAX_TRIES) { ··· 3352 3410 if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { 3353 3411 assoc_data->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT; 3354 3412 assoc_data->timeout_started = true; 3355 - run_again(&sdata->u.mgd, assoc_data->timeout); 3413 + run_again(sdata, assoc_data->timeout); 3356 3414 } else { 3357 3415 assoc_data->timeout_started = false; 3358 3416 } ··· 3377 3435 struct ieee80211_local *local = sdata->local; 3378 3436 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 3379 3437 3380 - mutex_lock(&ifmgd->mtx); 3438 + sdata_lock(sdata); 3381 3439 3382 3440 if (ifmgd->status_received) { 3383 3441 __le16 fc = ifmgd->status_fc; ··· 3389 3447 if (status_acked) { 3390 3448 ifmgd->auth_data->timeout = 3391 3449 jiffies + IEEE80211_AUTH_TIMEOUT_SHORT; 3392 - run_again(ifmgd, ifmgd->auth_data->timeout); 3450 + run_again(sdata, ifmgd->auth_data->timeout); 3393 3451 } else { 3394 3452 ifmgd->auth_data->timeout = jiffies - 1; 3395 3453 } ··· 3400 3458 if (status_acked) { 3401 3459 ifmgd->assoc_data->timeout = 3402 3460 jiffies + IEEE80211_ASSOC_TIMEOUT_SHORT; 3403 - run_again(ifmgd, ifmgd->assoc_data->timeout); 3461 + run_again(sdata, ifmgd->assoc_data->timeout); 3404 3462 } else { 3405 3463 ifmgd->assoc_data->timeout = jiffies - 1; 3406 3464 } ··· 3423 3481 3424 3482 ieee80211_destroy_auth_data(sdata, false); 3425 3483 3426 - mutex_unlock(&ifmgd->mtx); 3427 3484 cfg80211_send_auth_timeout(sdata->dev, bssid); 3428 - mutex_lock(&ifmgd->mtx); 3429 3485 } 3430 3486 } else if (ifmgd->auth_data && ifmgd->auth_data->timeout_started) 3431 - run_again(ifmgd, ifmgd->auth_data->timeout); 3487 + run_again(sdata, ifmgd->auth_data->timeout); 3432 3488 3433 3489 if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started && 3434 3490 time_after(jiffies, ifmgd->assoc_data->timeout)) { ··· 3439 3499 3440 3500 ieee80211_destroy_assoc_data(sdata, false); 3441 3501 3442 - mutex_unlock(&ifmgd->mtx); 3443 3502 cfg80211_send_assoc_timeout(sdata->dev, bssid); 3444 - mutex_lock(&ifmgd->mtx); 3445 3503 } 3446 3504 } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started) 3447 - run_again(ifmgd, ifmgd->assoc_data->timeout); 3505 + run_again(sdata, ifmgd->assoc_data->timeout); 3448 3506 3449 3507 if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL | 3450 3508 IEEE80211_STA_CONNECTION_POLL) && ··· 3476 3538 false); 3477 3539 } 3478 3540 } else if (time_is_after_jiffies(ifmgd->probe_timeout)) 3479 - run_again(ifmgd, ifmgd->probe_timeout); 3541 + run_again(sdata, ifmgd->probe_timeout); 3480 3542 else if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 3481 3543 mlme_dbg(sdata, 3482 3544 "Failed to send nullfunc to AP %pM after %dms, disconnecting\n", ··· 3505 3567 } 3506 3568 } 3507 3569 3508 - mutex_unlock(&ifmgd->mtx); 3570 + sdata_unlock(sdata); 3509 3571 } 3510 3572 3511 3573 static void ieee80211_sta_bcn_mon_timer(unsigned long data) ··· 3561 3623 } 3562 3624 } 3563 3625 3626 + #ifdef CONFIG_PM 3627 + void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) 3628 + { 3629 + struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 3630 + 3631 + sdata_lock(sdata); 3632 + if (!ifmgd->associated) { 3633 + sdata_unlock(sdata); 3634 + return; 3635 + } 3636 + 3637 + if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { 3638 + sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; 3639 + mlme_dbg(sdata, "driver requested disconnect after resume\n"); 3640 + ieee80211_sta_connection_lost(sdata, 3641 + ifmgd->associated->bssid, 3642 + WLAN_REASON_UNSPECIFIED, 3643 + true); 3644 + sdata_unlock(sdata); 3645 + return; 3646 + } 3647 + sdata_unlock(sdata); 3648 + } 3649 + #endif 3650 + 3564 3651 /* interface setup */ 3565 3652 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) 3566 3653 { ··· 3613 3650 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; 3614 3651 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; 3615 3652 ifmgd->p2p_noa_index = -1; 3616 - 3617 - mutex_init(&ifmgd->mtx); 3618 3653 3619 3654 if (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS) 3620 3655 ifmgd->req_smps = IEEE80211_SMPS_AUTOMATIC; ··· 3969 4008 3970 4009 /* try to authenticate/probe */ 3971 4010 3972 - mutex_lock(&ifmgd->mtx); 3973 - 3974 4011 if ((ifmgd->auth_data && !ifmgd->auth_data->done) || 3975 4012 ifmgd->assoc_data) { 3976 4013 err = -EBUSY; ··· 3988 4029 WLAN_REASON_UNSPECIFIED, 3989 4030 false, frame_buf); 3990 4031 3991 - __cfg80211_send_deauth(sdata->dev, frame_buf, 3992 - sizeof(frame_buf)); 4032 + cfg80211_send_deauth(sdata->dev, frame_buf, 4033 + sizeof(frame_buf)); 3993 4034 } 3994 4035 3995 4036 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); ··· 4006 4047 4007 4048 /* hold our own reference */ 4008 4049 cfg80211_ref_bss(local->hw.wiphy, auth_data->bss); 4009 - err = 0; 4010 - goto out_unlock; 4050 + return 0; 4011 4051 4012 4052 err_clear: 4013 4053 memset(ifmgd->bssid, 0, ETH_ALEN); ··· 4014 4056 ifmgd->auth_data = NULL; 4015 4057 err_free: 4016 4058 kfree(auth_data); 4017 - out_unlock: 4018 - mutex_unlock(&ifmgd->mtx); 4019 - 4020 4059 return err; 4021 4060 } 4022 4061 ··· 4044 4089 assoc_data->ssid_len = ssidie[1]; 4045 4090 rcu_read_unlock(); 4046 4091 4047 - mutex_lock(&ifmgd->mtx); 4048 - 4049 4092 if (ifmgd->associated) { 4050 4093 u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 4051 4094 ··· 4051 4098 WLAN_REASON_UNSPECIFIED, 4052 4099 false, frame_buf); 4053 4100 4054 - __cfg80211_send_deauth(sdata->dev, frame_buf, 4055 - sizeof(frame_buf)); 4101 + cfg80211_send_deauth(sdata->dev, frame_buf, 4102 + sizeof(frame_buf)); 4056 4103 } 4057 4104 4058 4105 if (ifmgd->auth_data && !ifmgd->auth_data->done) { ··· 4246 4293 } 4247 4294 rcu_read_unlock(); 4248 4295 4249 - run_again(ifmgd, assoc_data->timeout); 4296 + run_again(sdata, assoc_data->timeout); 4250 4297 4251 4298 if (bss->corrupt_data) { 4252 4299 char *corrupt_type = "data"; ··· 4262 4309 corrupt_type); 4263 4310 } 4264 4311 4265 - err = 0; 4266 - goto out; 4312 + return 0; 4267 4313 err_clear: 4268 4314 memset(ifmgd->bssid, 0, ETH_ALEN); 4269 4315 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); 4270 4316 ifmgd->assoc_data = NULL; 4271 4317 err_free: 4272 4318 kfree(assoc_data); 4273 - out: 4274 - mutex_unlock(&ifmgd->mtx); 4275 - 4276 4319 return err; 4277 4320 } 4278 4321 ··· 4278 4329 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 4279 4330 u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 4280 4331 bool tx = !req->local_state_change; 4281 - bool sent_frame = false; 4282 - 4283 - mutex_lock(&ifmgd->mtx); 4332 + bool report_frame = false; 4284 4333 4285 4334 sdata_info(sdata, 4286 4335 "deauthenticating from %pM by local choice (reason=%d)\n", ··· 4291 4344 req->reason_code, tx, 4292 4345 frame_buf); 4293 4346 ieee80211_destroy_auth_data(sdata, false); 4294 - mutex_unlock(&ifmgd->mtx); 4295 4347 4296 - sent_frame = tx; 4348 + report_frame = true; 4297 4349 goto out; 4298 4350 } 4299 4351 ··· 4300 4354 ether_addr_equal(ifmgd->associated->bssid, req->bssid)) { 4301 4355 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, 4302 4356 req->reason_code, tx, frame_buf); 4303 - sent_frame = tx; 4357 + report_frame = true; 4304 4358 } 4305 - mutex_unlock(&ifmgd->mtx); 4306 4359 4307 4360 out: 4308 - if (sent_frame) 4309 - __cfg80211_send_deauth(sdata->dev, frame_buf, 4310 - IEEE80211_DEAUTH_FRAME_LEN); 4361 + if (report_frame) 4362 + cfg80211_send_deauth(sdata->dev, frame_buf, 4363 + IEEE80211_DEAUTH_FRAME_LEN); 4311 4364 4312 4365 return 0; 4313 4366 } ··· 4318 4373 u8 bssid[ETH_ALEN]; 4319 4374 u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 4320 4375 4321 - mutex_lock(&ifmgd->mtx); 4322 - 4323 4376 /* 4324 4377 * cfg80211 should catch this ... but it's racy since 4325 4378 * we can receive a disassoc frame, process it, hand it 4326 4379 * to cfg80211 while that's in a locked section already 4327 4380 * trying to tell us that the user wants to disconnect. 4328 4381 */ 4329 - if (ifmgd->associated != req->bss) { 4330 - mutex_unlock(&ifmgd->mtx); 4382 + if (ifmgd->associated != req->bss) 4331 4383 return -ENOLINK; 4332 - } 4333 4384 4334 4385 sdata_info(sdata, 4335 4386 "disassociating from %pM by local choice (reason=%d)\n", ··· 4335 4394 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, 4336 4395 req->reason_code, !req->local_state_change, 4337 4396 frame_buf); 4338 - mutex_unlock(&ifmgd->mtx); 4339 4397 4340 - __cfg80211_send_disassoc(sdata->dev, frame_buf, 4341 - IEEE80211_DEAUTH_FRAME_LEN); 4398 + cfg80211_send_disassoc(sdata->dev, frame_buf, 4399 + IEEE80211_DEAUTH_FRAME_LEN); 4342 4400 4343 4401 return 0; 4344 4402 } ··· 4357 4417 cancel_work_sync(&ifmgd->csa_connection_drop_work); 4358 4418 cancel_work_sync(&ifmgd->chswitch_work); 4359 4419 4360 - mutex_lock(&ifmgd->mtx); 4420 + sdata_lock(sdata); 4361 4421 if (ifmgd->assoc_data) 4362 4422 ieee80211_destroy_assoc_data(sdata, false); 4363 4423 if (ifmgd->auth_data) 4364 4424 ieee80211_destroy_auth_data(sdata, false); 4365 4425 del_timer_sync(&ifmgd->timer); 4366 - mutex_unlock(&ifmgd->mtx); 4426 + sdata_unlock(sdata); 4367 4427 } 4368 4428 4369 4429 void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
+8 -1
net/mac80211/rate.c
··· 688 688 struct ieee80211_sta *pubsta, 689 689 struct ieee80211_sta_rates *rates) 690 690 { 691 - struct ieee80211_sta_rates *old = rcu_dereference(pubsta->rates); 691 + struct ieee80211_sta_rates *old; 692 692 693 + /* 694 + * mac80211 guarantees that this function will not be called 695 + * concurrently, so the following RCU access is safe, even without 696 + * extra locking. This can not be checked easily, so we just set 697 + * the condition to true. 698 + */ 699 + old = rcu_dereference_protected(pubsta->rates, true); 693 700 rcu_assign_pointer(pubsta->rates, rates); 694 701 if (old) 695 702 kfree_rcu(old, rcu_head);
+27 -6
net/mac80211/rx.c
··· 258 258 pos += 2; 259 259 260 260 if (status->flag & RX_FLAG_HT) { 261 + unsigned int stbc; 262 + 261 263 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_MCS); 262 264 *pos++ = local->hw.radiotap_mcs_details; 263 265 *pos = 0; ··· 269 267 *pos |= IEEE80211_RADIOTAP_MCS_BW_40; 270 268 if (status->flag & RX_FLAG_HT_GF) 271 269 *pos |= IEEE80211_RADIOTAP_MCS_FMT_GF; 270 + stbc = (status->flag & RX_FLAG_STBC_MASK) >> RX_FLAG_STBC_SHIFT; 271 + *pos |= stbc << IEEE80211_RADIOTAP_MCS_STBC_SHIFT; 272 272 pos++; 273 273 *pos++ = status->rate_idx; 274 274 } ··· 1376 1372 struct sk_buff *skb = rx->skb; 1377 1373 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 1378 1374 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 1375 + int i; 1379 1376 1380 1377 if (!sta) 1381 1378 return RX_CONTINUE; ··· 1425 1420 if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { 1426 1421 sta->last_signal = status->signal; 1427 1422 ewma_add(&sta->avg_signal, -status->signal); 1423 + } 1424 + 1425 + if (status->chains) { 1426 + sta->chains = status->chains; 1427 + for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { 1428 + int signal = status->chain_signal[i]; 1429 + 1430 + if (!(status->chains & BIT(i))) 1431 + continue; 1432 + 1433 + sta->chain_signal_last[i] = signal; 1434 + ewma_add(&sta->chain_signal_avg[i], -signal); 1435 + } 1428 1436 } 1429 1437 1430 1438 /* ··· 1626 1608 entry->ccmp = 1; 1627 1609 memcpy(entry->last_pn, 1628 1610 rx->key->u.ccmp.rx_pn[queue], 1629 - CCMP_PN_LEN); 1611 + IEEE80211_CCMP_PN_LEN); 1630 1612 } 1631 1613 return RX_QUEUED; 1632 1614 } ··· 1645 1627 * (IEEE 802.11i, 8.3.3.4.5) */ 1646 1628 if (entry->ccmp) { 1647 1629 int i; 1648 - u8 pn[CCMP_PN_LEN], *rpn; 1630 + u8 pn[IEEE80211_CCMP_PN_LEN], *rpn; 1649 1631 int queue; 1650 1632 if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP) 1651 1633 return RX_DROP_UNUSABLE; 1652 - memcpy(pn, entry->last_pn, CCMP_PN_LEN); 1653 - for (i = CCMP_PN_LEN - 1; i >= 0; i--) { 1634 + memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN); 1635 + for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) { 1654 1636 pn[i]++; 1655 1637 if (pn[i]) 1656 1638 break; 1657 1639 } 1658 1640 queue = rx->security_idx; 1659 1641 rpn = rx->key->u.ccmp.rx_pn[queue]; 1660 - if (memcmp(pn, rpn, CCMP_PN_LEN)) 1642 + if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN)) 1661 1643 return RX_DROP_UNUSABLE; 1662 - memcpy(entry->last_pn, pn, CCMP_PN_LEN); 1644 + memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN); 1663 1645 } 1664 1646 1665 1647 skb_pull(rx->skb, ieee80211_hdrlen(fc)); ··· 3054 3036 * and location updates. Note that mac80211 3055 3037 * itself never looks at these frames. 3056 3038 */ 3039 + if (!multicast && 3040 + !ether_addr_equal(sdata->vif.addr, hdr->addr1)) 3041 + return 0; 3057 3042 if (ieee80211_is_public_action(hdr, skb->len)) 3058 3043 return 1; 3059 3044 if (!ieee80211_is_beacon(hdr->frame_control))
+2
net/mac80211/sta_info.c
··· 358 358 do_posix_clock_monotonic_gettime(&uptime); 359 359 sta->last_connected = uptime.tv_sec; 360 360 ewma_init(&sta->avg_signal, 1024, 8); 361 + for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++) 362 + ewma_init(&sta->chain_signal_avg[i], 1024, 8); 361 363 362 364 if (sta_prepare_rate_control(local, sta, gfp)) { 363 365 kfree(sta);
+5
net/mac80211/sta_info.h
··· 344 344 int last_signal; 345 345 struct ewma avg_signal; 346 346 int last_ack_signal; 347 + 348 + u8 chains; 349 + s8 chain_signal_last[IEEE80211_MAX_CHAINS]; 350 + struct ewma chain_signal_avg[IEEE80211_MAX_CHAINS]; 351 + 347 352 /* Plus 1 for non-QoS frames */ 348 353 __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1]; 349 354
+2 -2
net/mac80211/tkip.c
··· 208 208 u32 iv32 = get_unaligned_le32(&data[4]); 209 209 u16 iv16 = data[2] | (data[0] << 8); 210 210 211 - spin_lock_bh(&key->u.tkip.txlock); 211 + spin_lock(&key->u.tkip.txlock); 212 212 ieee80211_compute_tkip_p1k(key, iv32); 213 213 tkip_mixing_phase2(tk, ctx, iv16, p2k); 214 - spin_unlock_bh(&key->u.tkip.txlock); 214 + spin_unlock(&key->u.tkip.txlock); 215 215 } 216 216 EXPORT_SYMBOL(ieee80211_get_tkip_p2k); 217 217
+9 -28
net/mac80211/util.c
··· 1072 1072 ieee80211_set_wmm_default(sdata, true); 1073 1073 } 1074 1074 1075 - u32 ieee80211_mandatory_rates(struct ieee80211_local *local, 1076 - enum ieee80211_band band) 1077 - { 1078 - struct ieee80211_supported_band *sband; 1079 - struct ieee80211_rate *bitrates; 1080 - u32 mandatory_rates; 1081 - enum ieee80211_rate_flags mandatory_flag; 1082 - int i; 1083 - 1084 - sband = local->hw.wiphy->bands[band]; 1085 - if (WARN_ON(!sband)) 1086 - return 1; 1087 - 1088 - if (band == IEEE80211_BAND_2GHZ) 1089 - mandatory_flag = IEEE80211_RATE_MANDATORY_B; 1090 - else 1091 - mandatory_flag = IEEE80211_RATE_MANDATORY_A; 1092 - 1093 - bitrates = sband->bitrates; 1094 - mandatory_rates = 0; 1095 - for (i = 0; i < sband->n_bitrates; i++) 1096 - if (bitrates[i].flags & mandatory_flag) 1097 - mandatory_rates |= BIT(i); 1098 - return mandatory_rates; 1099 - } 1100 - 1101 1075 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, 1102 1076 u16 transaction, u16 auth_alg, u16 status, 1103 1077 const u8 *extra, size_t extra_len, const u8 *da, ··· 1581 1607 if (sdata->u.mgd.dtim_period) 1582 1608 changed |= BSS_CHANGED_DTIM_PERIOD; 1583 1609 1584 - mutex_lock(&sdata->u.mgd.mtx); 1610 + sdata_lock(sdata); 1585 1611 ieee80211_bss_info_change_notify(sdata, changed); 1586 - mutex_unlock(&sdata->u.mgd.mtx); 1612 + sdata_unlock(sdata); 1587 1613 break; 1588 1614 case NL80211_IFTYPE_ADHOC: 1589 1615 changed |= BSS_CHANGED_IBSS; ··· 1713 1739 local->suspended = false; 1714 1740 mb(); 1715 1741 local->resuming = false; 1742 + 1743 + list_for_each_entry(sdata, &local->interfaces, list) { 1744 + if (!ieee80211_sdata_running(sdata)) 1745 + continue; 1746 + if (sdata->vif.type == NL80211_IFTYPE_STATION) 1747 + ieee80211_sta_restart(sdata); 1748 + } 1716 1749 1717 1750 mod_timer(&local->sta_cleanup, jiffies + 1); 1718 1751 #else
+25 -23
net/mac80211/wep.c
··· 28 28 int ieee80211_wep_init(struct ieee80211_local *local) 29 29 { 30 30 /* start WEP IV from a random value */ 31 - get_random_bytes(&local->wep_iv, WEP_IV_LEN); 31 + get_random_bytes(&local->wep_iv, IEEE80211_WEP_IV_LEN); 32 32 33 33 local->wep_tx_tfm = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC); 34 34 if (IS_ERR(local->wep_tx_tfm)) { ··· 98 98 99 99 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 100 100 101 - if (WARN_ON(skb_tailroom(skb) < WEP_ICV_LEN || 102 - skb_headroom(skb) < WEP_IV_LEN)) 101 + if (WARN_ON(skb_tailroom(skb) < IEEE80211_WEP_ICV_LEN || 102 + skb_headroom(skb) < IEEE80211_WEP_IV_LEN)) 103 103 return NULL; 104 104 105 105 hdrlen = ieee80211_hdrlen(hdr->frame_control); 106 - newhdr = skb_push(skb, WEP_IV_LEN); 107 - memmove(newhdr, newhdr + WEP_IV_LEN, hdrlen); 106 + newhdr = skb_push(skb, IEEE80211_WEP_IV_LEN); 107 + memmove(newhdr, newhdr + IEEE80211_WEP_IV_LEN, hdrlen); 108 108 109 109 /* the HW only needs room for the IV, but not the actual IV */ 110 110 if (info->control.hw_key && 111 111 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) 112 112 return newhdr + hdrlen; 113 113 114 - skb_set_network_header(skb, skb_network_offset(skb) + WEP_IV_LEN); 114 + skb_set_network_header(skb, skb_network_offset(skb) + 115 + IEEE80211_WEP_IV_LEN); 115 116 ieee80211_wep_get_iv(local, keylen, keyidx, newhdr + hdrlen); 116 117 return newhdr + hdrlen; 117 118 } ··· 126 125 unsigned int hdrlen; 127 126 128 127 hdrlen = ieee80211_hdrlen(hdr->frame_control); 129 - memmove(skb->data + WEP_IV_LEN, skb->data, hdrlen); 130 - skb_pull(skb, WEP_IV_LEN); 128 + memmove(skb->data + IEEE80211_WEP_IV_LEN, skb->data, hdrlen); 129 + skb_pull(skb, IEEE80211_WEP_IV_LEN); 131 130 } 132 131 133 132 ··· 147 146 put_unaligned(icv, (__le32 *)(data + data_len)); 148 147 149 148 crypto_cipher_setkey(tfm, rc4key, klen); 150 - for (i = 0; i < data_len + WEP_ICV_LEN; i++) 149 + for (i = 0; i < data_len + IEEE80211_WEP_ICV_LEN; i++) 151 150 crypto_cipher_encrypt_one(tfm, data + i, data + i); 152 151 153 152 return 0; ··· 173 172 if (!iv) 174 173 return -1; 175 174 176 - len = skb->len - (iv + WEP_IV_LEN - skb->data); 175 + len = skb->len - (iv + IEEE80211_WEP_IV_LEN - skb->data); 177 176 178 177 /* Prepend 24-bit IV to RC4 key */ 179 178 memcpy(rc4key, iv, 3); ··· 182 181 memcpy(rc4key + 3, key, keylen); 183 182 184 183 /* Add room for ICV */ 185 - skb_put(skb, WEP_ICV_LEN); 184 + skb_put(skb, IEEE80211_WEP_ICV_LEN); 186 185 187 186 return ieee80211_wep_encrypt_data(local->wep_tx_tfm, rc4key, keylen + 3, 188 - iv + WEP_IV_LEN, len); 187 + iv + IEEE80211_WEP_IV_LEN, len); 189 188 } 190 189 191 190 ··· 202 201 return -1; 203 202 204 203 crypto_cipher_setkey(tfm, rc4key, klen); 205 - for (i = 0; i < data_len + WEP_ICV_LEN; i++) 204 + for (i = 0; i < data_len + IEEE80211_WEP_ICV_LEN; i++) 206 205 crypto_cipher_decrypt_one(tfm, data + i, data + i); 207 206 208 207 crc = cpu_to_le32(~crc32_le(~0, data, data_len)); 209 - if (memcmp(&crc, data + data_len, WEP_ICV_LEN) != 0) 208 + if (memcmp(&crc, data + data_len, IEEE80211_WEP_ICV_LEN) != 0) 210 209 /* ICV mismatch */ 211 210 return -1; 212 211 ··· 238 237 return -1; 239 238 240 239 hdrlen = ieee80211_hdrlen(hdr->frame_control); 241 - if (skb->len < hdrlen + WEP_IV_LEN + WEP_ICV_LEN) 240 + if (skb->len < hdrlen + IEEE80211_WEP_IV_LEN + IEEE80211_WEP_ICV_LEN) 242 241 return -1; 243 242 244 - len = skb->len - hdrlen - WEP_IV_LEN - WEP_ICV_LEN; 243 + len = skb->len - hdrlen - IEEE80211_WEP_IV_LEN - IEEE80211_WEP_ICV_LEN; 245 244 246 245 keyidx = skb->data[hdrlen + 3] >> 6; 247 246 ··· 257 256 memcpy(rc4key + 3, key->conf.key, key->conf.keylen); 258 257 259 258 if (ieee80211_wep_decrypt_data(local->wep_rx_tfm, rc4key, klen, 260 - skb->data + hdrlen + WEP_IV_LEN, 261 - len)) 259 + skb->data + hdrlen + 260 + IEEE80211_WEP_IV_LEN, len)) 262 261 ret = -1; 263 262 264 263 /* Trim ICV */ 265 - skb_trim(skb, skb->len - WEP_ICV_LEN); 264 + skb_trim(skb, skb->len - IEEE80211_WEP_ICV_LEN); 266 265 267 266 /* Remove IV */ 268 - memmove(skb->data + WEP_IV_LEN, skb->data, hdrlen); 269 - skb_pull(skb, WEP_IV_LEN); 267 + memmove(skb->data + IEEE80211_WEP_IV_LEN, skb->data, hdrlen); 268 + skb_pull(skb, IEEE80211_WEP_IV_LEN); 270 269 271 270 return ret; 272 271 } ··· 306 305 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) 307 306 return RX_DROP_UNUSABLE; 308 307 } else if (!(status->flag & RX_FLAG_IV_STRIPPED)) { 309 - if (!pskb_may_pull(rx->skb, ieee80211_hdrlen(fc) + WEP_IV_LEN)) 308 + if (!pskb_may_pull(rx->skb, ieee80211_hdrlen(fc) + 309 + IEEE80211_WEP_IV_LEN)) 310 310 return RX_DROP_UNUSABLE; 311 311 if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 312 312 rx->sta->wep_weak_iv_count++; 313 313 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key); 314 314 /* remove ICV */ 315 - if (pskb_trim(rx->skb, rx->skb->len - WEP_ICV_LEN)) 315 + if (pskb_trim(rx->skb, rx->skb->len - IEEE80211_WEP_ICV_LEN)) 316 316 return RX_DROP_UNUSABLE; 317 317 } 318 318
+36 -32
net/mac80211/wpa.c
··· 62 62 63 63 tail = MICHAEL_MIC_LEN; 64 64 if (!info->control.hw_key) 65 - tail += TKIP_ICV_LEN; 65 + tail += IEEE80211_TKIP_ICV_LEN; 66 66 67 67 if (WARN_ON(skb_tailroom(skb) < tail || 68 - skb_headroom(skb) < TKIP_IV_LEN)) 68 + skb_headroom(skb) < IEEE80211_TKIP_IV_LEN)) 69 69 return TX_DROP; 70 70 71 71 key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY]; ··· 198 198 if (info->control.hw_key) 199 199 tail = 0; 200 200 else 201 - tail = TKIP_ICV_LEN; 201 + tail = IEEE80211_TKIP_ICV_LEN; 202 202 203 203 if (WARN_ON(skb_tailroom(skb) < tail || 204 - skb_headroom(skb) < TKIP_IV_LEN)) 204 + skb_headroom(skb) < IEEE80211_TKIP_IV_LEN)) 205 205 return -1; 206 206 207 - pos = skb_push(skb, TKIP_IV_LEN); 208 - memmove(pos, pos + TKIP_IV_LEN, hdrlen); 209 - skb_set_network_header(skb, skb_network_offset(skb) + TKIP_IV_LEN); 207 + pos = skb_push(skb, IEEE80211_TKIP_IV_LEN); 208 + memmove(pos, pos + IEEE80211_TKIP_IV_LEN, hdrlen); 209 + skb_set_network_header(skb, skb_network_offset(skb) + 210 + IEEE80211_TKIP_IV_LEN); 210 211 pos += hdrlen; 211 212 212 213 /* the HW only needs room for the IV, but not the actual IV */ ··· 228 227 return 0; 229 228 230 229 /* Add room for ICV */ 231 - skb_put(skb, TKIP_ICV_LEN); 230 + skb_put(skb, IEEE80211_TKIP_ICV_LEN); 232 231 233 232 return ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm, 234 233 key, skb, pos, len); ··· 291 290 return RX_DROP_UNUSABLE; 292 291 293 292 /* Trim ICV */ 294 - skb_trim(skb, skb->len - TKIP_ICV_LEN); 293 + skb_trim(skb, skb->len - IEEE80211_TKIP_ICV_LEN); 295 294 296 295 /* Remove IV */ 297 - memmove(skb->data + TKIP_IV_LEN, skb->data, hdrlen); 298 - skb_pull(skb, TKIP_IV_LEN); 296 + memmove(skb->data + IEEE80211_TKIP_IV_LEN, skb->data, hdrlen); 297 + skb_pull(skb, IEEE80211_TKIP_IV_LEN); 299 298 300 299 return RX_CONTINUE; 301 300 } ··· 338 337 else 339 338 qos_tid = 0; 340 339 341 - data_len = skb->len - hdrlen - CCMP_HDR_LEN; 340 + data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN; 342 341 if (encrypted) 343 - data_len -= CCMP_MIC_LEN; 342 + data_len -= IEEE80211_CCMP_MIC_LEN; 344 343 345 344 /* First block, b_0 */ 346 345 b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */ ··· 349 348 */ 350 349 b_0[1] = qos_tid | (mgmt << 4); 351 350 memcpy(&b_0[2], hdr->addr2, ETH_ALEN); 352 - memcpy(&b_0[8], pn, CCMP_PN_LEN); 351 + memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN); 353 352 /* l(m) */ 354 353 put_unaligned_be16(data_len, &b_0[14]); 355 354 ··· 425 424 if (info->control.hw_key) 426 425 tail = 0; 427 426 else 428 - tail = CCMP_MIC_LEN; 427 + tail = IEEE80211_CCMP_MIC_LEN; 429 428 430 429 if (WARN_ON(skb_tailroom(skb) < tail || 431 - skb_headroom(skb) < CCMP_HDR_LEN)) 430 + skb_headroom(skb) < IEEE80211_CCMP_HDR_LEN)) 432 431 return -1; 433 432 434 - pos = skb_push(skb, CCMP_HDR_LEN); 435 - memmove(pos, pos + CCMP_HDR_LEN, hdrlen); 436 - skb_set_network_header(skb, skb_network_offset(skb) + CCMP_HDR_LEN); 433 + pos = skb_push(skb, IEEE80211_CCMP_HDR_LEN); 434 + memmove(pos, pos + IEEE80211_CCMP_HDR_LEN, hdrlen); 435 + skb_set_network_header(skb, skb_network_offset(skb) + 436 + IEEE80211_CCMP_HDR_LEN); 437 437 438 438 /* the HW only needs room for the IV, but not the actual IV */ 439 439 if (info->control.hw_key && ··· 459 457 if (info->control.hw_key) 460 458 return 0; 461 459 462 - pos += CCMP_HDR_LEN; 460 + pos += IEEE80211_CCMP_HDR_LEN; 463 461 ccmp_special_blocks(skb, pn, scratch, 0); 464 462 ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len, 465 - pos, skb_put(skb, CCMP_MIC_LEN)); 463 + pos, skb_put(skb, IEEE80211_CCMP_MIC_LEN)); 466 464 467 465 return 0; 468 466 } ··· 492 490 struct ieee80211_key *key = rx->key; 493 491 struct sk_buff *skb = rx->skb; 494 492 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 495 - u8 pn[CCMP_PN_LEN]; 493 + u8 pn[IEEE80211_CCMP_PN_LEN]; 496 494 int data_len; 497 495 int queue; 498 496 ··· 502 500 !ieee80211_is_robust_mgmt_frame(hdr)) 503 501 return RX_CONTINUE; 504 502 505 - data_len = skb->len - hdrlen - CCMP_HDR_LEN - CCMP_MIC_LEN; 503 + data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - 504 + IEEE80211_CCMP_MIC_LEN; 506 505 if (!rx->sta || data_len < 0) 507 506 return RX_DROP_UNUSABLE; 508 507 509 508 if (status->flag & RX_FLAG_DECRYPTED) { 510 - if (!pskb_may_pull(rx->skb, hdrlen + CCMP_HDR_LEN)) 509 + if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_CCMP_HDR_LEN)) 511 510 return RX_DROP_UNUSABLE; 512 511 } else { 513 512 if (skb_linearize(rx->skb)) ··· 519 516 520 517 queue = rx->security_idx; 521 518 522 - if (memcmp(pn, key->u.ccmp.rx_pn[queue], CCMP_PN_LEN) <= 0) { 519 + if (memcmp(pn, key->u.ccmp.rx_pn[queue], IEEE80211_CCMP_PN_LEN) <= 0) { 523 520 key->u.ccmp.replays++; 524 521 return RX_DROP_UNUSABLE; 525 522 } ··· 531 528 532 529 if (ieee80211_aes_ccm_decrypt( 533 530 key->u.ccmp.tfm, scratch, 534 - skb->data + hdrlen + CCMP_HDR_LEN, data_len, 535 - skb->data + skb->len - CCMP_MIC_LEN, 536 - skb->data + hdrlen + CCMP_HDR_LEN)) 531 + skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN, 532 + data_len, 533 + skb->data + skb->len - IEEE80211_CCMP_MIC_LEN, 534 + skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN)) 537 535 return RX_DROP_UNUSABLE; 538 536 } 539 537 540 - memcpy(key->u.ccmp.rx_pn[queue], pn, CCMP_PN_LEN); 538 + memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN); 541 539 542 540 /* Remove CCMP header and MIC */ 543 - if (pskb_trim(skb, skb->len - CCMP_MIC_LEN)) 541 + if (pskb_trim(skb, skb->len - IEEE80211_CCMP_MIC_LEN)) 544 542 return RX_DROP_UNUSABLE; 545 - memmove(skb->data + CCMP_HDR_LEN, skb->data, hdrlen); 546 - skb_pull(skb, CCMP_HDR_LEN); 543 + memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen); 544 + skb_pull(skb, IEEE80211_CCMP_HDR_LEN); 547 545 548 546 return RX_CONTINUE; 549 547 }
+54 -183
net/wireless/core.c
··· 34 34 MODULE_AUTHOR("Johannes Berg"); 35 35 MODULE_LICENSE("GPL"); 36 36 MODULE_DESCRIPTION("wireless configuration support"); 37 + MODULE_ALIAS_GENL_FAMILY(NL80211_GENL_NAME); 37 38 38 - /* RCU-protected (and cfg80211_mutex for writers) */ 39 + /* RCU-protected (and RTNL for writers) */ 39 40 LIST_HEAD(cfg80211_rdev_list); 40 41 int cfg80211_rdev_list_generation; 41 - 42 - DEFINE_MUTEX(cfg80211_mutex); 43 42 44 43 /* for debugfs */ 45 44 static struct dentry *ieee80211_debugfs_dir; ··· 51 52 MODULE_PARM_DESC(cfg80211_disable_40mhz_24ghz, 52 53 "Disable 40MHz support in the 2.4GHz band"); 53 54 54 - /* requires cfg80211_mutex to be held! */ 55 55 struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx) 56 56 { 57 57 struct cfg80211_registered_device *result = NULL, *rdev; 58 58 59 - assert_cfg80211_lock(); 59 + ASSERT_RTNL(); 60 60 61 61 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 62 62 if (rdev->wiphy_idx == wiphy_idx) { ··· 74 76 return rdev->wiphy_idx; 75 77 } 76 78 77 - /* requires cfg80211_rdev_mutex to be held! */ 78 79 struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx) 79 80 { 80 81 struct cfg80211_registered_device *rdev; 81 82 82 - assert_cfg80211_lock(); 83 + ASSERT_RTNL(); 83 84 84 85 rdev = cfg80211_rdev_by_wiphy_idx(wiphy_idx); 85 86 if (!rdev) ··· 86 89 return &rdev->wiphy; 87 90 } 88 91 89 - struct cfg80211_registered_device * 90 - cfg80211_get_dev_from_ifindex(struct net *net, int ifindex) 91 - { 92 - struct cfg80211_registered_device *rdev = ERR_PTR(-ENODEV); 93 - struct net_device *dev; 94 - 95 - mutex_lock(&cfg80211_mutex); 96 - dev = dev_get_by_index(net, ifindex); 97 - if (!dev) 98 - goto out; 99 - if (dev->ieee80211_ptr) { 100 - rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy); 101 - mutex_lock(&rdev->mtx); 102 - } else 103 - rdev = ERR_PTR(-ENODEV); 104 - dev_put(dev); 105 - out: 106 - mutex_unlock(&cfg80211_mutex); 107 - return rdev; 108 - } 109 - 110 - /* requires cfg80211_mutex to be held */ 111 92 int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, 112 93 char *newname) 113 94 { 114 95 struct cfg80211_registered_device *rdev2; 115 96 int wiphy_idx, taken = -1, result, digits; 116 97 117 - assert_cfg80211_lock(); 98 + ASSERT_RTNL(); 118 99 119 100 /* prohibit calling the thing phy%d when %d is not its number */ 120 101 sscanf(newname, PHY_NAME "%d%n", &wiphy_idx, &taken); ··· 190 215 void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev, 191 216 struct wireless_dev *wdev) 192 217 { 193 - lockdep_assert_held(&rdev->devlist_mtx); 194 - lockdep_assert_held(&rdev->sched_scan_mtx); 218 + ASSERT_RTNL(); 195 219 196 220 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)) 197 221 return; ··· 204 230 rdev->opencount--; 205 231 206 232 if (rdev->scan_req && rdev->scan_req->wdev == wdev) { 207 - bool busy = work_busy(&rdev->scan_done_wk); 208 - 209 233 /* 210 - * If the work isn't pending or running (in which case it would 211 - * be waiting for the lock we hold) the driver didn't properly 212 - * cancel the scan when the interface was removed. In this case 213 - * warn and leak the scan request object to not crash later. 234 + * If the scan request wasn't notified as done, set it 235 + * to aborted and leak it after a warning. The driver 236 + * should have notified us that it ended at the latest 237 + * during rdev_stop_p2p_device(). 214 238 */ 215 - WARN_ON(!busy); 216 - 217 - rdev->scan_req->aborted = true; 218 - ___cfg80211_scan_done(rdev, !busy); 239 + if (WARN_ON(!rdev->scan_req->notified)) 240 + rdev->scan_req->aborted = true; 241 + ___cfg80211_scan_done(rdev, !rdev->scan_req->notified); 219 242 } 220 243 } 221 244 ··· 226 255 227 256 rtnl_lock(); 228 257 229 - /* read-only iteration need not hold the devlist_mtx */ 230 - 231 258 list_for_each_entry(wdev, &rdev->wdev_list, list) { 232 259 if (wdev->netdev) { 233 260 dev_close(wdev->netdev); ··· 234 265 /* otherwise, check iftype */ 235 266 switch (wdev->iftype) { 236 267 case NL80211_IFTYPE_P2P_DEVICE: 237 - /* but this requires it */ 238 - mutex_lock(&rdev->devlist_mtx); 239 - mutex_lock(&rdev->sched_scan_mtx); 240 268 cfg80211_stop_p2p_device(rdev, wdev); 241 - mutex_unlock(&rdev->sched_scan_mtx); 242 - mutex_unlock(&rdev->devlist_mtx); 243 269 break; 244 270 default: 245 271 break; ··· 262 298 event_work); 263 299 264 300 rtnl_lock(); 265 - cfg80211_lock_rdev(rdev); 266 - 267 301 cfg80211_process_rdev_events(rdev); 268 - cfg80211_unlock_rdev(rdev); 269 302 rtnl_unlock(); 270 303 } 271 304 ··· 270 309 271 310 struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv) 272 311 { 273 - static int wiphy_counter; 312 + static atomic_t wiphy_counter = ATOMIC_INIT(0); 274 313 275 314 struct cfg80211_registered_device *rdev; 276 315 int alloc_size; ··· 292 331 293 332 rdev->ops = ops; 294 333 295 - mutex_lock(&cfg80211_mutex); 296 - 297 - rdev->wiphy_idx = wiphy_counter++; 334 + rdev->wiphy_idx = atomic_inc_return(&wiphy_counter); 298 335 299 336 if (unlikely(rdev->wiphy_idx < 0)) { 300 - wiphy_counter--; 301 - mutex_unlock(&cfg80211_mutex); 302 337 /* ugh, wrapped! */ 338 + atomic_dec(&wiphy_counter); 303 339 kfree(rdev); 304 340 return NULL; 305 341 } 306 342 307 - mutex_unlock(&cfg80211_mutex); 308 - 309 343 /* give it a proper name */ 310 344 dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx); 311 345 312 - mutex_init(&rdev->mtx); 313 - mutex_init(&rdev->devlist_mtx); 314 - mutex_init(&rdev->sched_scan_mtx); 315 346 INIT_LIST_HEAD(&rdev->wdev_list); 316 347 INIT_LIST_HEAD(&rdev->beacon_registrations); 317 348 spin_lock_init(&rdev->beacon_registrations_lock); ··· 551 598 /* check and set up bitrates */ 552 599 ieee80211_set_bitrate_flags(wiphy); 553 600 554 - mutex_lock(&cfg80211_mutex); 601 + rtnl_lock(); 555 602 556 603 res = device_add(&rdev->wiphy.dev); 557 604 if (res) { 558 - mutex_unlock(&cfg80211_mutex); 605 + rtnl_unlock(); 559 606 return res; 560 607 } 561 608 ··· 584 631 } 585 632 586 633 cfg80211_debugfs_rdev_add(rdev); 587 - mutex_unlock(&cfg80211_mutex); 588 634 589 - /* 590 - * due to a locking dependency this has to be outside of the 591 - * cfg80211_mutex lock 592 - */ 593 635 res = rfkill_register(rdev->rfkill); 594 - if (res) 595 - goto out_rm_dev; 636 + if (res) { 637 + device_del(&rdev->wiphy.dev); 596 638 597 - rtnl_lock(); 639 + debugfs_remove_recursive(rdev->wiphy.debugfsdir); 640 + list_del_rcu(&rdev->list); 641 + wiphy_regulatory_deregister(wiphy); 642 + rtnl_unlock(); 643 + return res; 644 + } 645 + 598 646 rdev->wiphy.registered = true; 599 647 rtnl_unlock(); 600 648 return 0; 601 - 602 - out_rm_dev: 603 - device_del(&rdev->wiphy.dev); 604 - return res; 605 649 } 606 650 EXPORT_SYMBOL(wiphy_register); 607 651 ··· 625 675 { 626 676 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 627 677 678 + wait_event(rdev->dev_wait, ({ 679 + int __count; 680 + rtnl_lock(); 681 + __count = rdev->opencount; 682 + rtnl_unlock(); 683 + __count == 0; })); 684 + 628 685 rtnl_lock(); 629 686 rdev->wiphy.registered = false; 630 - rtnl_unlock(); 631 687 632 688 rfkill_unregister(rdev->rfkill); 633 689 634 - /* protect the device list */ 635 - mutex_lock(&cfg80211_mutex); 636 - 637 - wait_event(rdev->dev_wait, ({ 638 - int __count; 639 - mutex_lock(&rdev->devlist_mtx); 640 - __count = rdev->opencount; 641 - mutex_unlock(&rdev->devlist_mtx); 642 - __count == 0; })); 643 - 644 - mutex_lock(&rdev->devlist_mtx); 645 690 BUG_ON(!list_empty(&rdev->wdev_list)); 646 - mutex_unlock(&rdev->devlist_mtx); 647 691 648 692 /* 649 693 * First remove the hardware from everywhere, this makes ··· 648 704 synchronize_rcu(); 649 705 650 706 /* 651 - * Try to grab rdev->mtx. If a command is still in progress, 652 - * hopefully the driver will refuse it since it's tearing 653 - * down the device already. We wait for this command to complete 654 - * before unlinking the item from the list. 655 - * Note: as codified by the BUG_ON above we cannot get here if 656 - * a virtual interface is still present. Hence, we can only get 657 - * to lock contention here if userspace issues a command that 658 - * identified the hardware by wiphy index. 659 - */ 660 - cfg80211_lock_rdev(rdev); 661 - /* nothing */ 662 - cfg80211_unlock_rdev(rdev); 663 - 664 - /* 665 707 * If this device got a regulatory hint tell core its 666 708 * free to listen now to a new shiny device regulatory hint 667 709 */ ··· 656 726 cfg80211_rdev_list_generation++; 657 727 device_del(&rdev->wiphy.dev); 658 728 659 - mutex_unlock(&cfg80211_mutex); 729 + rtnl_unlock(); 660 730 661 731 flush_work(&rdev->scan_done_wk); 662 732 cancel_work_sync(&rdev->conn_work); 663 733 flush_work(&rdev->event_work); 664 734 cancel_delayed_work_sync(&rdev->dfs_update_channels_wk); 665 735 666 - if (rdev->wowlan && rdev->ops->set_wakeup) 736 + #ifdef CONFIG_PM 737 + if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup) 667 738 rdev_set_wakeup(rdev, false); 739 + #endif 668 740 cfg80211_rdev_free_wowlan(rdev); 669 741 } 670 742 EXPORT_SYMBOL(wiphy_unregister); ··· 676 744 struct cfg80211_internal_bss *scan, *tmp; 677 745 struct cfg80211_beacon_registration *reg, *treg; 678 746 rfkill_destroy(rdev->rfkill); 679 - mutex_destroy(&rdev->mtx); 680 - mutex_destroy(&rdev->devlist_mtx); 681 - mutex_destroy(&rdev->sched_scan_mtx); 682 747 list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) { 683 748 list_del(&reg->list); 684 749 kfree(reg); ··· 700 771 } 701 772 EXPORT_SYMBOL(wiphy_rfkill_set_hw_state); 702 773 703 - static void wdev_cleanup_work(struct work_struct *work) 704 - { 705 - struct wireless_dev *wdev; 706 - struct cfg80211_registered_device *rdev; 707 - 708 - wdev = container_of(work, struct wireless_dev, cleanup_work); 709 - rdev = wiphy_to_dev(wdev->wiphy); 710 - 711 - mutex_lock(&rdev->sched_scan_mtx); 712 - 713 - if (WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev)) { 714 - rdev->scan_req->aborted = true; 715 - ___cfg80211_scan_done(rdev, true); 716 - } 717 - 718 - if (WARN_ON(rdev->sched_scan_req && 719 - rdev->sched_scan_req->dev == wdev->netdev)) { 720 - __cfg80211_stop_sched_scan(rdev, false); 721 - } 722 - 723 - mutex_unlock(&rdev->sched_scan_mtx); 724 - 725 - mutex_lock(&rdev->devlist_mtx); 726 - rdev->opencount--; 727 - mutex_unlock(&rdev->devlist_mtx); 728 - wake_up(&rdev->dev_wait); 729 - 730 - dev_put(wdev->netdev); 731 - } 732 - 733 774 void cfg80211_unregister_wdev(struct wireless_dev *wdev) 734 775 { 735 776 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); ··· 709 810 if (WARN_ON(wdev->netdev)) 710 811 return; 711 812 712 - mutex_lock(&rdev->devlist_mtx); 713 - mutex_lock(&rdev->sched_scan_mtx); 714 813 list_del_rcu(&wdev->list); 715 814 rdev->devlist_generation++; 716 815 ··· 720 823 WARN_ON_ONCE(1); 721 824 break; 722 825 } 723 - mutex_unlock(&rdev->sched_scan_mtx); 724 - mutex_unlock(&rdev->devlist_mtx); 725 826 } 726 827 EXPORT_SYMBOL(cfg80211_unregister_wdev); 727 828 ··· 738 843 } 739 844 740 845 void cfg80211_leave(struct cfg80211_registered_device *rdev, 741 - struct wireless_dev *wdev) 846 + struct wireless_dev *wdev) 742 847 { 743 848 struct net_device *dev = wdev->netdev; 744 849 ··· 748 853 break; 749 854 case NL80211_IFTYPE_P2P_CLIENT: 750 855 case NL80211_IFTYPE_STATION: 751 - mutex_lock(&rdev->sched_scan_mtx); 752 856 __cfg80211_stop_sched_scan(rdev, false); 753 - mutex_unlock(&rdev->sched_scan_mtx); 754 857 755 858 wdev_lock(wdev); 756 859 #ifdef CONFIG_CFG80211_WEXT ··· 757 864 wdev->wext.ie_len = 0; 758 865 wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 759 866 #endif 760 - __cfg80211_disconnect(rdev, dev, 761 - WLAN_REASON_DEAUTH_LEAVING, true); 762 - cfg80211_mlme_down(rdev, dev); 867 + cfg80211_disconnect(rdev, dev, 868 + WLAN_REASON_DEAUTH_LEAVING, true); 763 869 wdev_unlock(wdev); 764 870 break; 765 871 case NL80211_IFTYPE_MESH_POINT: ··· 801 909 * are added with nl80211. 802 910 */ 803 911 mutex_init(&wdev->mtx); 804 - INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work); 805 912 INIT_LIST_HEAD(&wdev->event_list); 806 913 spin_lock_init(&wdev->event_lock); 807 914 INIT_LIST_HEAD(&wdev->mgmt_registrations); 808 915 spin_lock_init(&wdev->mgmt_registrations_lock); 809 916 810 - mutex_lock(&rdev->devlist_mtx); 811 917 wdev->identifier = ++rdev->wdev_id; 812 918 list_add_rcu(&wdev->list, &rdev->wdev_list); 813 919 rdev->devlist_generation++; ··· 818 928 } 819 929 wdev->netdev = dev; 820 930 wdev->sme_state = CFG80211_SME_IDLE; 821 - mutex_unlock(&rdev->devlist_mtx); 822 931 #ifdef CONFIG_CFG80211_WEXT 823 932 wdev->wext.default_key = -1; 824 933 wdev->wext.default_mgmt_key = -1; ··· 843 954 break; 844 955 case NETDEV_DOWN: 845 956 cfg80211_update_iface_num(rdev, wdev->iftype, -1); 846 - dev_hold(dev); 847 - queue_work(cfg80211_wq, &wdev->cleanup_work); 957 + if (rdev->scan_req && rdev->scan_req->wdev == wdev) { 958 + if (WARN_ON(!rdev->scan_req->notified)) 959 + rdev->scan_req->aborted = true; 960 + ___cfg80211_scan_done(rdev, true); 961 + } 962 + 963 + if (WARN_ON(rdev->sched_scan_req && 964 + rdev->sched_scan_req->dev == wdev->netdev)) { 965 + __cfg80211_stop_sched_scan(rdev, false); 966 + } 967 + 968 + rdev->opencount--; 969 + wake_up(&rdev->dev_wait); 848 970 break; 849 971 case NETDEV_UP: 850 - /* 851 - * If we have a really quick DOWN/UP succession we may 852 - * have this work still pending ... cancel it and see 853 - * if it was pending, in which case we need to account 854 - * for some of the work it would have done. 855 - */ 856 - if (cancel_work_sync(&wdev->cleanup_work)) { 857 - mutex_lock(&rdev->devlist_mtx); 858 - rdev->opencount--; 859 - mutex_unlock(&rdev->devlist_mtx); 860 - dev_put(dev); 861 - } 862 972 cfg80211_update_iface_num(rdev, wdev->iftype, 1); 863 - cfg80211_lock_rdev(rdev); 864 - mutex_lock(&rdev->devlist_mtx); 865 - mutex_lock(&rdev->sched_scan_mtx); 866 973 wdev_lock(wdev); 867 974 switch (wdev->iftype) { 868 975 #ifdef CONFIG_CFG80211_WEXT ··· 890 1005 break; 891 1006 } 892 1007 wdev_unlock(wdev); 893 - mutex_unlock(&rdev->sched_scan_mtx); 894 1008 rdev->opencount++; 895 - mutex_unlock(&rdev->devlist_mtx); 896 - cfg80211_unlock_rdev(rdev); 897 1009 898 1010 /* 899 1011 * Configure power management to the driver here so that its ··· 907 1025 break; 908 1026 case NETDEV_UNREGISTER: 909 1027 /* 910 - * NB: cannot take rdev->mtx here because this may be 911 - * called within code protected by it when interfaces 912 - * are removed with nl80211. 913 - */ 914 - mutex_lock(&rdev->devlist_mtx); 915 - /* 916 1028 * It is possible to get NETDEV_UNREGISTER 917 1029 * multiple times. To detect that, check 918 1030 * that the interface is still on the list ··· 922 1046 kfree(wdev->wext.keys); 923 1047 #endif 924 1048 } 925 - mutex_unlock(&rdev->devlist_mtx); 926 1049 /* 927 1050 * synchronise (so that we won't find this netdev 928 1051 * from other code any more) and then clear the list ··· 941 1066 return notifier_from_errno(-EOPNOTSUPP); 942 1067 if (rfkill_blocked(rdev->rfkill)) 943 1068 return notifier_from_errno(-ERFKILL); 944 - mutex_lock(&rdev->devlist_mtx); 945 1069 ret = cfg80211_can_add_interface(rdev, wdev->iftype); 946 - mutex_unlock(&rdev->devlist_mtx); 947 1070 if (ret) 948 1071 return notifier_from_errno(ret); 949 1072 break; ··· 959 1086 struct cfg80211_registered_device *rdev; 960 1087 961 1088 rtnl_lock(); 962 - mutex_lock(&cfg80211_mutex); 963 1089 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 964 1090 if (net_eq(wiphy_net(&rdev->wiphy), net)) 965 1091 WARN_ON(cfg80211_switch_netns(rdev, &init_net)); 966 1092 } 967 - mutex_unlock(&cfg80211_mutex); 968 1093 rtnl_unlock(); 969 1094 } 970 1095
+19 -74
net/wireless/core.h
··· 5 5 */ 6 6 #ifndef __NET_WIRELESS_CORE_H 7 7 #define __NET_WIRELESS_CORE_H 8 - #include <linux/mutex.h> 9 8 #include <linux/list.h> 10 9 #include <linux/netdevice.h> 11 10 #include <linux/rbtree.h> ··· 22 23 struct cfg80211_registered_device { 23 24 const struct cfg80211_ops *ops; 24 25 struct list_head list; 25 - /* we hold this mutex during any call so that 26 - * we cannot do multiple calls at once, and also 27 - * to avoid the deregister call to proceed while 28 - * any call is in progress */ 29 - struct mutex mtx; 30 26 31 27 /* rfkill support */ 32 28 struct rfkill_ops rfkill_ops; ··· 43 49 /* wiphy index, internal only */ 44 50 int wiphy_idx; 45 51 46 - /* associated wireless interfaces */ 47 - struct mutex devlist_mtx; 48 - /* protected by devlist_mtx or RCU */ 52 + /* associated wireless interfaces, protected by rtnl or RCU */ 49 53 struct list_head wdev_list; 50 54 int devlist_generation, wdev_id; 51 55 int opencount; /* also protected by devlist_mtx */ ··· 67 75 struct work_struct scan_done_wk; 68 76 struct work_struct sched_scan_results_wk; 69 77 70 - struct mutex sched_scan_mtx; 71 - 72 78 #ifdef CONFIG_NL80211_TESTMODE 73 79 struct genl_info *testmode_info; 74 80 #endif 75 81 76 82 struct work_struct conn_work; 77 83 struct work_struct event_work; 78 - 79 - struct cfg80211_wowlan *wowlan; 80 84 81 85 struct delayed_work dfs_update_channels_wk; 82 86 ··· 94 106 static inline void 95 107 cfg80211_rdev_free_wowlan(struct cfg80211_registered_device *rdev) 96 108 { 109 + #ifdef CONFIG_PM 97 110 int i; 98 111 99 - if (!rdev->wowlan) 112 + if (!rdev->wiphy.wowlan_config) 100 113 return; 101 - for (i = 0; i < rdev->wowlan->n_patterns; i++) 102 - kfree(rdev->wowlan->patterns[i].mask); 103 - kfree(rdev->wowlan->patterns); 104 - if (rdev->wowlan->tcp && rdev->wowlan->tcp->sock) 105 - sock_release(rdev->wowlan->tcp->sock); 106 - kfree(rdev->wowlan->tcp); 107 - kfree(rdev->wowlan); 114 + for (i = 0; i < rdev->wiphy.wowlan_config->n_patterns; i++) 115 + kfree(rdev->wiphy.wowlan_config->patterns[i].mask); 116 + kfree(rdev->wiphy.wowlan_config->patterns); 117 + if (rdev->wiphy.wowlan_config->tcp && 118 + rdev->wiphy.wowlan_config->tcp->sock) 119 + sock_release(rdev->wiphy.wowlan_config->tcp->sock); 120 + kfree(rdev->wiphy.wowlan_config->tcp); 121 + kfree(rdev->wiphy.wowlan_config); 122 + #endif 108 123 } 109 124 110 125 extern struct workqueue_struct *cfg80211_wq; 111 - extern struct mutex cfg80211_mutex; 112 126 extern struct list_head cfg80211_rdev_list; 113 127 extern int cfg80211_rdev_list_generation; 114 - 115 - static inline void assert_cfg80211_lock(void) 116 - { 117 - lockdep_assert_held(&cfg80211_mutex); 118 - } 119 128 120 129 struct cfg80211_internal_bss { 121 130 struct list_head list; ··· 146 161 struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx); 147 162 int get_wiphy_idx(struct wiphy *wiphy); 148 163 149 - /* requires cfg80211_rdev_mutex to be held! */ 150 164 struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx); 151 - 152 - /* identical to cfg80211_get_dev_from_info but only operate on ifindex */ 153 - extern struct cfg80211_registered_device * 154 - cfg80211_get_dev_from_ifindex(struct net *net, int ifindex); 155 165 156 166 int cfg80211_switch_netns(struct cfg80211_registered_device *rdev, 157 167 struct net *net); 158 - 159 - static inline void cfg80211_lock_rdev(struct cfg80211_registered_device *rdev) 160 - { 161 - mutex_lock(&rdev->mtx); 162 - } 163 - 164 - static inline void cfg80211_unlock_rdev(struct cfg80211_registered_device *rdev) 165 - { 166 - BUG_ON(IS_ERR(rdev) || !rdev); 167 - mutex_unlock(&rdev->mtx); 168 - } 169 168 170 169 static inline void wdev_lock(struct wireless_dev *wdev) 171 170 __acquires(wdev) ··· 165 196 mutex_unlock(&wdev->mtx); 166 197 } 167 198 168 - #define ASSERT_RDEV_LOCK(rdev) lockdep_assert_held(&(rdev)->mtx) 199 + #define ASSERT_RDEV_LOCK(rdev) ASSERT_RTNL() 169 200 #define ASSERT_WDEV_LOCK(wdev) lockdep_assert_held(&(wdev)->mtx) 170 201 171 202 static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev) ··· 283 314 struct net_device *dev); 284 315 285 316 /* MLME */ 286 - int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 287 - struct net_device *dev, 288 - struct ieee80211_channel *chan, 289 - enum nl80211_auth_type auth_type, 290 - const u8 *bssid, 291 - const u8 *ssid, int ssid_len, 292 - const u8 *ie, int ie_len, 293 - const u8 *key, int key_len, int key_idx, 294 - const u8 *sae_data, int sae_data_len); 295 317 int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 296 - struct net_device *dev, struct ieee80211_channel *chan, 297 - enum nl80211_auth_type auth_type, const u8 *bssid, 318 + struct net_device *dev, 319 + struct ieee80211_channel *chan, 320 + enum nl80211_auth_type auth_type, 321 + const u8 *bssid, 298 322 const u8 *ssid, int ssid_len, 299 323 const u8 *ie, int ie_len, 300 324 const u8 *key, int key_len, int key_idx, 301 325 const u8 *sae_data, int sae_data_len); 302 - int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 303 - struct net_device *dev, 304 - struct ieee80211_channel *chan, 305 - const u8 *bssid, 306 - const u8 *ssid, int ssid_len, 307 - struct cfg80211_assoc_request *req); 308 326 int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 309 327 struct net_device *dev, 310 328 struct ieee80211_channel *chan, 311 329 const u8 *bssid, 312 330 const u8 *ssid, int ssid_len, 313 331 struct cfg80211_assoc_request *req); 314 - int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 315 - struct net_device *dev, const u8 *bssid, 316 - const u8 *ie, int ie_len, u16 reason, 317 - bool local_state_change); 318 332 int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 319 333 struct net_device *dev, const u8 *bssid, 320 334 const u8 *ie, int ie_len, u16 reason, ··· 329 377 const struct ieee80211_vht_cap *vht_capa_mask); 330 378 331 379 /* SME */ 332 - int __cfg80211_connect(struct cfg80211_registered_device *rdev, 333 - struct net_device *dev, 334 - struct cfg80211_connect_params *connect, 335 - struct cfg80211_cached_keys *connkeys, 336 - const u8 *prev_bssid); 337 380 int cfg80211_connect(struct cfg80211_registered_device *rdev, 338 381 struct net_device *dev, 339 382 struct cfg80211_connect_params *connect, 340 - struct cfg80211_cached_keys *connkeys); 341 - int __cfg80211_disconnect(struct cfg80211_registered_device *rdev, 342 - struct net_device *dev, u16 reason, 343 - bool wextev); 383 + struct cfg80211_cached_keys *connkeys, 384 + const u8 *prev_bssid); 344 385 int cfg80211_disconnect(struct cfg80211_registered_device *rdev, 345 386 struct net_device *dev, u16 reason, 346 387 bool wextev);
+2 -2
net/wireless/debugfs.c
··· 74 74 if (!buf) 75 75 return -ENOMEM; 76 76 77 - mutex_lock(&cfg80211_mutex); 77 + rtnl_lock(); 78 78 79 79 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 80 80 sband = wiphy->bands[band]; ··· 85 85 buf, buf_size, offset); 86 86 } 87 87 88 - mutex_unlock(&cfg80211_mutex); 88 + rtnl_unlock(); 89 89 90 90 r = simple_read_from_buffer(user_buf, count, ppos, buf, offset); 91 91
+2 -8
net/wireless/ibss.c
··· 152 152 struct wireless_dev *wdev = dev->ieee80211_ptr; 153 153 int err; 154 154 155 - mutex_lock(&rdev->devlist_mtx); 155 + ASSERT_RTNL(); 156 + 156 157 wdev_lock(wdev); 157 158 err = __cfg80211_join_ibss(rdev, dev, params, connkeys); 158 159 wdev_unlock(wdev); 159 - mutex_unlock(&rdev->devlist_mtx); 160 160 161 161 return err; 162 162 } ··· 359 359 wdev->wext.ibss.channel_fixed = false; 360 360 } 361 361 362 - mutex_lock(&rdev->devlist_mtx); 363 362 wdev_lock(wdev); 364 363 err = cfg80211_ibss_wext_join(rdev, wdev); 365 364 wdev_unlock(wdev); 366 - mutex_unlock(&rdev->devlist_mtx); 367 365 368 366 return err; 369 367 } ··· 427 429 memcpy(wdev->wext.ibss.ssid, ssid, len); 428 430 wdev->wext.ibss.ssid_len = len; 429 431 430 - mutex_lock(&rdev->devlist_mtx); 431 432 wdev_lock(wdev); 432 433 err = cfg80211_ibss_wext_join(rdev, wdev); 433 434 wdev_unlock(wdev); 434 - mutex_unlock(&rdev->devlist_mtx); 435 435 436 436 return err; 437 437 } ··· 508 512 } else 509 513 wdev->wext.ibss.bssid = NULL; 510 514 511 - mutex_lock(&rdev->devlist_mtx); 512 515 wdev_lock(wdev); 513 516 err = cfg80211_ibss_wext_join(rdev, wdev); 514 517 wdev_unlock(wdev); 515 - mutex_unlock(&rdev->devlist_mtx); 516 518 517 519 return err; 518 520 }
+1 -2
net/wireless/mesh.c
··· 82 82 .sync_method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET, 83 83 .path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP, 84 84 .path_metric = IEEE80211_PATH_METRIC_AIRTIME, 85 + .auth_id = 0, /* open */ 85 86 .ie = NULL, 86 87 .ie_len = 0, 87 88 .is_secure = false, ··· 186 185 struct wireless_dev *wdev = dev->ieee80211_ptr; 187 186 int err; 188 187 189 - mutex_lock(&rdev->devlist_mtx); 190 188 wdev_lock(wdev); 191 189 err = __cfg80211_join_mesh(rdev, dev, setup, conf); 192 190 wdev_unlock(wdev); 193 - mutex_unlock(&rdev->devlist_mtx); 194 191 195 192 return err; 196 193 }
+53 -163
net/wireless/mlme.c
··· 25 25 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 26 26 27 27 trace_cfg80211_send_rx_auth(dev); 28 - wdev_lock(wdev); 29 28 30 29 nl80211_send_rx_auth(rdev, dev, buf, len, GFP_KERNEL); 31 30 cfg80211_sme_rx_auth(dev, buf, len); 32 - 33 - wdev_unlock(wdev); 34 31 } 35 32 EXPORT_SYMBOL(cfg80211_send_rx_auth); 36 33 ··· 43 46 int ieoffs = offsetof(struct ieee80211_mgmt, u.assoc_resp.variable); 44 47 45 48 trace_cfg80211_send_rx_assoc(dev, bss); 46 - wdev_lock(wdev); 47 49 48 50 status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code); 49 51 ··· 55 59 if (status_code != WLAN_STATUS_SUCCESS && wdev->conn && 56 60 cfg80211_sme_failed_reassoc(wdev)) { 57 61 cfg80211_put_bss(wiphy, bss); 58 - goto out; 62 + return; 59 63 } 60 64 61 65 nl80211_send_rx_assoc(rdev, dev, buf, len, GFP_KERNEL); ··· 67 71 * sme will schedule work that does it later. 68 72 */ 69 73 cfg80211_put_bss(wiphy, bss); 70 - goto out; 74 + return; 71 75 } 72 76 73 77 if (!wdev->conn && wdev->sme_state == CFG80211_SME_IDLE) { ··· 83 87 __cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, ie, len - ieoffs, 84 88 status_code, 85 89 status_code == WLAN_STATUS_SUCCESS, bss); 86 - out: 87 - wdev_unlock(wdev); 88 90 } 89 91 EXPORT_SYMBOL(cfg80211_send_rx_assoc); 90 92 91 - void __cfg80211_send_deauth(struct net_device *dev, 92 - const u8 *buf, size_t len) 93 + void cfg80211_send_deauth(struct net_device *dev, 94 + const u8 *buf, size_t len) 93 95 { 94 96 struct wireless_dev *wdev = dev->ieee80211_ptr; 95 97 struct wiphy *wiphy = wdev->wiphy; ··· 96 102 const u8 *bssid = mgmt->bssid; 97 103 bool was_current = false; 98 104 99 - trace___cfg80211_send_deauth(dev); 105 + trace_cfg80211_send_deauth(dev); 100 106 ASSERT_WDEV_LOCK(wdev); 101 107 102 108 if (wdev->current_bss && ··· 123 129 false, NULL); 124 130 } 125 131 } 126 - EXPORT_SYMBOL(__cfg80211_send_deauth); 127 - 128 - void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len) 129 - { 130 - struct wireless_dev *wdev = dev->ieee80211_ptr; 131 - 132 - wdev_lock(wdev); 133 - __cfg80211_send_deauth(dev, buf, len); 134 - wdev_unlock(wdev); 135 - } 136 132 EXPORT_SYMBOL(cfg80211_send_deauth); 137 133 138 - void __cfg80211_send_disassoc(struct net_device *dev, 139 - const u8 *buf, size_t len) 134 + void cfg80211_send_disassoc(struct net_device *dev, 135 + const u8 *buf, size_t len) 140 136 { 141 137 struct wireless_dev *wdev = dev->ieee80211_ptr; 142 138 struct wiphy *wiphy = wdev->wiphy; ··· 136 152 u16 reason_code; 137 153 bool from_ap; 138 154 139 - trace___cfg80211_send_disassoc(dev); 155 + trace_cfg80211_send_disassoc(dev); 140 156 ASSERT_WDEV_LOCK(wdev); 141 157 142 158 nl80211_send_disassoc(rdev, dev, buf, len, GFP_KERNEL); ··· 159 175 from_ap = !ether_addr_equal(mgmt->sa, dev->dev_addr); 160 176 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap); 161 177 } 162 - EXPORT_SYMBOL(__cfg80211_send_disassoc); 163 - 164 - void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len) 165 - { 166 - struct wireless_dev *wdev = dev->ieee80211_ptr; 167 - 168 - wdev_lock(wdev); 169 - __cfg80211_send_disassoc(dev, buf, len); 170 - wdev_unlock(wdev); 171 - } 172 178 EXPORT_SYMBOL(cfg80211_send_disassoc); 173 179 174 180 void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr) ··· 168 194 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 169 195 170 196 trace_cfg80211_send_auth_timeout(dev, addr); 171 - wdev_lock(wdev); 172 197 173 198 nl80211_send_auth_timeout(rdev, dev, addr, GFP_KERNEL); 174 199 if (wdev->sme_state == CFG80211_SME_CONNECTING) 175 200 __cfg80211_connect_result(dev, addr, NULL, 0, NULL, 0, 176 201 WLAN_STATUS_UNSPECIFIED_FAILURE, 177 202 false, NULL); 178 - 179 - wdev_unlock(wdev); 180 203 } 181 204 EXPORT_SYMBOL(cfg80211_send_auth_timeout); 182 205 ··· 184 213 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 185 214 186 215 trace_cfg80211_send_assoc_timeout(dev, addr); 187 - wdev_lock(wdev); 188 216 189 217 nl80211_send_assoc_timeout(rdev, dev, addr, GFP_KERNEL); 190 218 if (wdev->sme_state == CFG80211_SME_CONNECTING) 191 219 __cfg80211_connect_result(dev, addr, NULL, 0, NULL, 0, 192 220 WLAN_STATUS_UNSPECIFIED_FAILURE, 193 221 false, NULL); 194 - 195 - wdev_unlock(wdev); 196 222 } 197 223 EXPORT_SYMBOL(cfg80211_send_assoc_timeout); 198 224 ··· 221 253 EXPORT_SYMBOL(cfg80211_michael_mic_failure); 222 254 223 255 /* some MLME handling for userspace SME */ 224 - int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 225 - struct net_device *dev, 226 - struct ieee80211_channel *chan, 227 - enum nl80211_auth_type auth_type, 228 - const u8 *bssid, 229 - const u8 *ssid, int ssid_len, 230 - const u8 *ie, int ie_len, 231 - const u8 *key, int key_len, int key_idx, 232 - const u8 *sae_data, int sae_data_len) 256 + int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 257 + struct net_device *dev, 258 + struct ieee80211_channel *chan, 259 + enum nl80211_auth_type auth_type, 260 + const u8 *bssid, 261 + const u8 *ssid, int ssid_len, 262 + const u8 *ie, int ie_len, 263 + const u8 *key, int key_len, int key_idx, 264 + const u8 *sae_data, int sae_data_len) 233 265 { 234 266 struct wireless_dev *wdev = dev->ieee80211_ptr; 235 - struct cfg80211_auth_request req; 267 + struct cfg80211_auth_request req = { 268 + .ie = ie, 269 + .ie_len = ie_len, 270 + .sae_data = sae_data, 271 + .sae_data_len = sae_data_len, 272 + .auth_type = auth_type, 273 + .key = key, 274 + .key_len = key_len, 275 + .key_idx = key_idx, 276 + }; 236 277 int err; 237 278 238 279 ASSERT_WDEV_LOCK(wdev); ··· 254 277 ether_addr_equal(bssid, wdev->current_bss->pub.bssid)) 255 278 return -EALREADY; 256 279 257 - memset(&req, 0, sizeof(req)); 258 - 259 - req.ie = ie; 260 - req.ie_len = ie_len; 261 - req.sae_data = sae_data; 262 - req.sae_data_len = sae_data_len; 263 - req.auth_type = auth_type; 264 280 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 265 281 WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); 266 - req.key = key; 267 - req.key_len = key_len; 268 - req.key_idx = key_idx; 269 282 if (!req.bss) 270 283 return -ENOENT; 271 284 ··· 268 301 269 302 out: 270 303 cfg80211_put_bss(&rdev->wiphy, req.bss); 271 - return err; 272 - } 273 - 274 - int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 275 - struct net_device *dev, struct ieee80211_channel *chan, 276 - enum nl80211_auth_type auth_type, const u8 *bssid, 277 - const u8 *ssid, int ssid_len, 278 - const u8 *ie, int ie_len, 279 - const u8 *key, int key_len, int key_idx, 280 - const u8 *sae_data, int sae_data_len) 281 - { 282 - int err; 283 - 284 - mutex_lock(&rdev->devlist_mtx); 285 - wdev_lock(dev->ieee80211_ptr); 286 - err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 287 - ssid, ssid_len, ie, ie_len, 288 - key, key_len, key_idx, 289 - sae_data, sae_data_len); 290 - wdev_unlock(dev->ieee80211_ptr); 291 - mutex_unlock(&rdev->devlist_mtx); 292 - 293 304 return err; 294 305 } 295 306 ··· 305 360 p1[i] &= p2[i]; 306 361 } 307 362 308 - int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 309 - struct net_device *dev, 310 - struct ieee80211_channel *chan, 311 - const u8 *bssid, 312 - const u8 *ssid, int ssid_len, 313 - struct cfg80211_assoc_request *req) 363 + int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 364 + struct net_device *dev, 365 + struct ieee80211_channel *chan, 366 + const u8 *bssid, 367 + const u8 *ssid, int ssid_len, 368 + struct cfg80211_assoc_request *req) 314 369 { 315 370 struct wireless_dev *wdev = dev->ieee80211_ptr; 316 371 int err; ··· 360 415 return err; 361 416 } 362 417 363 - int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 364 - struct net_device *dev, 365 - struct ieee80211_channel *chan, 366 - const u8 *bssid, 367 - const u8 *ssid, int ssid_len, 368 - struct cfg80211_assoc_request *req) 369 - { 370 - struct wireless_dev *wdev = dev->ieee80211_ptr; 371 - int err; 372 - 373 - mutex_lock(&rdev->devlist_mtx); 374 - wdev_lock(wdev); 375 - err = __cfg80211_mlme_assoc(rdev, dev, chan, bssid, 376 - ssid, ssid_len, req); 377 - wdev_unlock(wdev); 378 - mutex_unlock(&rdev->devlist_mtx); 379 - 380 - return err; 381 - } 382 - 383 - int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 384 - struct net_device *dev, const u8 *bssid, 385 - const u8 *ie, int ie_len, u16 reason, 386 - bool local_state_change) 418 + int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 419 + struct net_device *dev, const u8 *bssid, 420 + const u8 *ie, int ie_len, u16 reason, 421 + bool local_state_change) 387 422 { 388 423 struct wireless_dev *wdev = dev->ieee80211_ptr; 389 424 struct cfg80211_deauth_request req = { ··· 383 458 return rdev_deauth(rdev, dev, &req); 384 459 } 385 460 386 - int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 387 - struct net_device *dev, const u8 *bssid, 388 - const u8 *ie, int ie_len, u16 reason, 389 - bool local_state_change) 461 + int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, 462 + struct net_device *dev, const u8 *bssid, 463 + const u8 *ie, int ie_len, u16 reason, 464 + bool local_state_change) 390 465 { 391 466 struct wireless_dev *wdev = dev->ieee80211_ptr; 392 - int err; 393 - 394 - wdev_lock(wdev); 395 - err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason, 396 - local_state_change); 397 - wdev_unlock(wdev); 398 - 399 - return err; 400 - } 401 - 402 - static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, 403 - struct net_device *dev, const u8 *bssid, 404 - const u8 *ie, int ie_len, u16 reason, 405 - bool local_state_change) 406 - { 407 - struct wireless_dev *wdev = dev->ieee80211_ptr; 408 - struct cfg80211_disassoc_request req; 467 + struct cfg80211_disassoc_request req = { 468 + .reason_code = reason, 469 + .local_state_change = local_state_change, 470 + .ie = ie, 471 + .ie_len = ie_len, 472 + }; 409 473 410 474 ASSERT_WDEV_LOCK(wdev); 411 475 ··· 404 490 if (WARN(!wdev->current_bss, "sme_state=%d\n", wdev->sme_state)) 405 491 return -ENOTCONN; 406 492 407 - memset(&req, 0, sizeof(req)); 408 - req.reason_code = reason; 409 - req.local_state_change = local_state_change; 410 - req.ie = ie; 411 - req.ie_len = ie_len; 412 493 if (ether_addr_equal(wdev->current_bss->pub.bssid, bssid)) 413 494 req.bss = &wdev->current_bss->pub; 414 495 else ··· 412 503 return rdev_disassoc(rdev, dev, &req); 413 504 } 414 505 415 - int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, 416 - struct net_device *dev, const u8 *bssid, 417 - const u8 *ie, int ie_len, u16 reason, 418 - bool local_state_change) 419 - { 420 - struct wireless_dev *wdev = dev->ieee80211_ptr; 421 - int err; 422 - 423 - wdev_lock(wdev); 424 - err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason, 425 - local_state_change); 426 - wdev_unlock(wdev); 427 - 428 - return err; 429 - } 430 - 431 506 void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, 432 507 struct net_device *dev) 433 508 { 434 509 struct wireless_dev *wdev = dev->ieee80211_ptr; 435 - struct cfg80211_deauth_request req; 436 510 u8 bssid[ETH_ALEN]; 511 + struct cfg80211_deauth_request req = { 512 + .reason_code = WLAN_REASON_DEAUTH_LEAVING, 513 + .bssid = bssid, 514 + }; 437 515 438 516 ASSERT_WDEV_LOCK(wdev); 439 517 440 518 if (!rdev->ops->deauth) 441 519 return; 442 520 443 - memset(&req, 0, sizeof(req)); 444 - req.reason_code = WLAN_REASON_DEAUTH_LEAVING; 445 - req.ie = NULL; 446 - req.ie_len = 0; 447 - 448 521 if (!wdev->current_bss) 449 522 return; 450 523 451 524 memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN); 452 - req.bssid = bssid; 453 525 rdev_deauth(rdev, dev, &req); 454 526 455 527 if (wdev->current_bss) { ··· 738 848 dfs_update_channels_wk); 739 849 wiphy = &rdev->wiphy; 740 850 741 - mutex_lock(&cfg80211_mutex); 851 + rtnl_lock(); 742 852 for (bandid = 0; bandid < IEEE80211_NUM_BANDS; bandid++) { 743 853 sband = wiphy->bands[bandid]; 744 854 if (!sband) ··· 771 881 check_again = true; 772 882 } 773 883 } 774 - mutex_unlock(&cfg80211_mutex); 884 + rtnl_unlock(); 775 885 776 886 /* reschedule if there are other channels waiting to be cleared again */ 777 887 if (check_again)
+159 -187
net/wireless/nl80211.c
··· 37 37 38 38 /* the netlink family */ 39 39 static struct genl_family nl80211_fam = { 40 - .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */ 41 - .name = "nl80211", /* have users key off the name instead */ 42 - .hdrsize = 0, /* no private header */ 43 - .version = 1, /* no particular meaning now */ 40 + .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */ 41 + .name = NL80211_GENL_NAME, /* have users key off the name instead */ 42 + .hdrsize = 0, /* no private header */ 43 + .version = 1, /* no particular meaning now */ 44 44 .maxattr = NL80211_ATTR_MAX, 45 45 .netnsok = true, 46 46 .pre_doit = nl80211_pre_doit, ··· 59 59 int wiphy_idx = -1; 60 60 int ifidx = -1; 61 61 62 - assert_cfg80211_lock(); 62 + ASSERT_RTNL(); 63 63 64 64 if (!have_ifidx && !have_wdev_id) 65 65 return ERR_PTR(-EINVAL); ··· 80 80 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 81 81 continue; 82 82 83 - mutex_lock(&rdev->devlist_mtx); 84 83 list_for_each_entry(wdev, &rdev->wdev_list, list) { 85 84 if (have_ifidx && wdev->netdev && 86 85 wdev->netdev->ifindex == ifidx) { ··· 91 92 break; 92 93 } 93 94 } 94 - mutex_unlock(&rdev->devlist_mtx); 95 95 96 96 if (result) 97 97 break; ··· 107 109 struct cfg80211_registered_device *rdev = NULL, *tmp; 108 110 struct net_device *netdev; 109 111 110 - assert_cfg80211_lock(); 112 + ASSERT_RTNL(); 111 113 112 114 if (!attrs[NL80211_ATTR_WIPHY] && 113 115 !attrs[NL80211_ATTR_IFINDEX] && ··· 126 128 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 127 129 if (tmp) { 128 130 /* make sure wdev exists */ 129 - mutex_lock(&tmp->devlist_mtx); 130 131 list_for_each_entry(wdev, &tmp->wdev_list, list) { 131 132 if (wdev->identifier != (u32)wdev_id) 132 133 continue; 133 134 found = true; 134 135 break; 135 136 } 136 - mutex_unlock(&tmp->devlist_mtx); 137 137 138 138 if (!found) 139 139 tmp = NULL; ··· 178 182 /* 179 183 * This function returns a pointer to the driver 180 184 * that the genl_info item that is passed refers to. 181 - * If successful, it returns non-NULL and also locks 182 - * the driver's mutex! 183 - * 184 - * This means that you need to call cfg80211_unlock_rdev() 185 - * before being allowed to acquire &cfg80211_mutex! 186 - * 187 - * This is necessary because we need to lock the global 188 - * mutex to get an item off the list safely, and then 189 - * we lock the rdev mutex so it doesn't go away under us. 190 - * 191 - * We don't want to keep cfg80211_mutex locked 192 - * for all the time in order to allow requests on 193 - * other interfaces to go through at the same time. 194 185 * 195 186 * The result of this can be a PTR_ERR and hence must 196 187 * be checked with IS_ERR() for errors. ··· 185 202 static struct cfg80211_registered_device * 186 203 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 187 204 { 188 - struct cfg80211_registered_device *rdev; 189 - 190 - mutex_lock(&cfg80211_mutex); 191 - rdev = __cfg80211_rdev_from_attrs(netns, info->attrs); 192 - 193 - /* if it is not an error we grab the lock on 194 - * it to assure it won't be going away while 195 - * we operate on it */ 196 - if (!IS_ERR(rdev)) 197 - mutex_lock(&rdev->mtx); 198 - 199 - mutex_unlock(&cfg80211_mutex); 200 - 201 - return rdev; 205 + return __cfg80211_rdev_from_attrs(netns, info->attrs); 202 206 } 203 207 204 208 /* policy for the attributes */ ··· 348 378 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 349 379 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 350 380 .len = IEEE80211_MAX_DATA_LEN }, 381 + [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 }, 351 382 }; 352 383 353 384 /* policy for the key attributes */ ··· 426 455 int err; 427 456 428 457 rtnl_lock(); 429 - mutex_lock(&cfg80211_mutex); 430 458 431 459 if (!cb->args[0]) { 432 460 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, ··· 454 484 *rdev = wiphy_to_dev(wiphy); 455 485 *wdev = NULL; 456 486 457 - mutex_lock(&(*rdev)->devlist_mtx); 458 487 list_for_each_entry(tmp, &(*rdev)->wdev_list, list) { 459 488 if (tmp->identifier == cb->args[1]) { 460 489 *wdev = tmp; 461 490 break; 462 491 } 463 492 } 464 - mutex_unlock(&(*rdev)->devlist_mtx); 465 493 466 494 if (!*wdev) { 467 495 err = -ENODEV; ··· 467 499 } 468 500 } 469 501 470 - cfg80211_lock_rdev(*rdev); 471 - 472 - mutex_unlock(&cfg80211_mutex); 473 502 return 0; 474 503 out_unlock: 475 - mutex_unlock(&cfg80211_mutex); 476 504 rtnl_unlock(); 477 505 return err; 478 506 } 479 507 480 508 static void nl80211_finish_wdev_dump(struct cfg80211_registered_device *rdev) 481 509 { 482 - cfg80211_unlock_rdev(rdev); 483 510 rtnl_unlock(); 484 511 } 485 512 ··· 1530 1567 struct nlattr **tb = nl80211_fam.attrbuf; 1531 1568 int res; 1532 1569 1533 - mutex_lock(&cfg80211_mutex); 1570 + rtnl_lock(); 1534 1571 res = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, 1535 1572 tb, nl80211_fam.maxattr, nl80211_policy); 1536 1573 if (res == 0) { ··· 1544 1581 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 1545 1582 1546 1583 netdev = dev_get_by_index(sock_net(skb->sk), ifidx); 1547 - if (!netdev) { 1548 - mutex_unlock(&cfg80211_mutex); 1584 + if (!netdev) 1549 1585 return -ENODEV; 1550 - } 1551 1586 if (netdev->ieee80211_ptr) { 1552 1587 dev = wiphy_to_dev( 1553 1588 netdev->ieee80211_ptr->wiphy); ··· 1589 1628 !skb->len && 1590 1629 cb->min_dump_alloc < 4096) { 1591 1630 cb->min_dump_alloc = 4096; 1592 - mutex_unlock(&cfg80211_mutex); 1593 1631 return 1; 1594 1632 } 1595 1633 idx--; ··· 1597 1637 } while (cb->args[1] > 0); 1598 1638 break; 1599 1639 } 1600 - mutex_unlock(&cfg80211_mutex); 1640 + rtnl_unlock(); 1601 1641 1602 1642 cb->args[0] = idx; 1603 1643 ··· 1752 1792 if (result) 1753 1793 return result; 1754 1794 1755 - mutex_lock(&rdev->devlist_mtx); 1756 1795 switch (iftype) { 1757 1796 case NL80211_IFTYPE_AP: 1758 1797 case NL80211_IFTYPE_P2P_GO: ··· 1775 1816 default: 1776 1817 result = -EINVAL; 1777 1818 } 1778 - mutex_unlock(&rdev->devlist_mtx); 1779 1819 1780 1820 return result; 1781 1821 } ··· 1823 1865 u32 frag_threshold = 0, rts_threshold = 0; 1824 1866 u8 coverage_class = 0; 1825 1867 1868 + ASSERT_RTNL(); 1869 + 1826 1870 /* 1827 1871 * Try to find the wiphy and netdev. Normally this 1828 1872 * function shouldn't need the netdev, but this is ··· 1834 1874 * also passed a netdev to set_wiphy, so that it is 1835 1875 * possible to let that go to the right netdev! 1836 1876 */ 1837 - mutex_lock(&cfg80211_mutex); 1838 1877 1839 1878 if (info->attrs[NL80211_ATTR_IFINDEX]) { 1840 1879 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 1841 1880 1842 1881 netdev = dev_get_by_index(genl_info_net(info), ifindex); 1843 - if (netdev && netdev->ieee80211_ptr) { 1882 + if (netdev && netdev->ieee80211_ptr) 1844 1883 rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy); 1845 - mutex_lock(&rdev->mtx); 1846 - } else 1884 + else 1847 1885 netdev = NULL; 1848 1886 } 1849 1887 1850 1888 if (!netdev) { 1851 1889 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 1852 1890 info->attrs); 1853 - if (IS_ERR(rdev)) { 1854 - mutex_unlock(&cfg80211_mutex); 1891 + if (IS_ERR(rdev)) 1855 1892 return PTR_ERR(rdev); 1856 - } 1857 1893 wdev = NULL; 1858 1894 netdev = NULL; 1859 1895 result = 0; 1860 - 1861 - mutex_lock(&rdev->mtx); 1862 1896 } else 1863 1897 wdev = netdev->ieee80211_ptr; 1864 1898 ··· 1864 1910 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 1865 1911 result = cfg80211_dev_rename( 1866 1912 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 1867 - 1868 - mutex_unlock(&cfg80211_mutex); 1869 1913 1870 1914 if (result) 1871 1915 goto bad_res; ··· 2071 2119 } 2072 2120 2073 2121 bad_res: 2074 - mutex_unlock(&rdev->mtx); 2075 2122 if (netdev) 2076 2123 dev_put(netdev); 2077 2124 return result; ··· 2168 2217 struct cfg80211_registered_device *rdev; 2169 2218 struct wireless_dev *wdev; 2170 2219 2171 - mutex_lock(&cfg80211_mutex); 2220 + rtnl_lock(); 2172 2221 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 2173 2222 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 2174 2223 continue; ··· 2178 2227 } 2179 2228 if_idx = 0; 2180 2229 2181 - mutex_lock(&rdev->devlist_mtx); 2182 2230 list_for_each_entry(wdev, &rdev->wdev_list, list) { 2183 2231 if (if_idx < if_start) { 2184 2232 if_idx++; ··· 2186 2236 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 2187 2237 cb->nlh->nlmsg_seq, NLM_F_MULTI, 2188 2238 rdev, wdev) < 0) { 2189 - mutex_unlock(&rdev->devlist_mtx); 2190 2239 goto out; 2191 2240 } 2192 2241 if_idx++; 2193 2242 } 2194 - mutex_unlock(&rdev->devlist_mtx); 2195 2243 2196 2244 wp_idx++; 2197 2245 } 2198 2246 out: 2199 - mutex_unlock(&cfg80211_mutex); 2247 + rtnl_unlock(); 2200 2248 2201 2249 cb->args[0] = wp_idx; 2202 2250 cb->args[1] = if_idx; ··· 2427 2479 INIT_LIST_HEAD(&wdev->mgmt_registrations); 2428 2480 spin_lock_init(&wdev->mgmt_registrations_lock); 2429 2481 2430 - mutex_lock(&rdev->devlist_mtx); 2431 2482 wdev->identifier = ++rdev->wdev_id; 2432 2483 list_add_rcu(&wdev->list, &rdev->wdev_list); 2433 2484 rdev->devlist_generation++; 2434 - mutex_unlock(&rdev->devlist_mtx); 2435 2485 break; 2436 2486 default: 2437 2487 break; ··· 2938 2992 struct wireless_dev *wdev; 2939 2993 bool ret = false; 2940 2994 2941 - mutex_lock(&rdev->devlist_mtx); 2942 - 2943 2995 list_for_each_entry(wdev, &rdev->wdev_list, list) { 2944 2996 if (wdev->iftype != NL80211_IFTYPE_AP && 2945 2997 wdev->iftype != NL80211_IFTYPE_P2P_GO) ··· 2950 3006 ret = true; 2951 3007 break; 2952 3008 } 2953 - 2954 - mutex_unlock(&rdev->devlist_mtx); 2955 3009 2956 3010 return ret; 2957 3011 } ··· 3112 3170 params.radar_required = true; 3113 3171 } 3114 3172 3115 - mutex_lock(&rdev->devlist_mtx); 3116 3173 err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype, 3117 3174 params.chandef.chan, 3118 3175 CHAN_MODE_SHARED, 3119 3176 radar_detect_width); 3120 - mutex_unlock(&rdev->devlist_mtx); 3121 - 3122 3177 if (err) 3123 3178 return err; 3124 3179 ··· 3315 3376 return true; 3316 3377 } 3317 3378 3379 + static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 3380 + int id) 3381 + { 3382 + void *attr; 3383 + int i = 0; 3384 + 3385 + if (!mask) 3386 + return true; 3387 + 3388 + attr = nla_nest_start(msg, id); 3389 + if (!attr) 3390 + return false; 3391 + 3392 + for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 3393 + if (!(mask & BIT(i))) 3394 + continue; 3395 + 3396 + if (nla_put_u8(msg, i, signal[i])) 3397 + return false; 3398 + } 3399 + 3400 + nla_nest_end(msg, attr); 3401 + 3402 + return true; 3403 + } 3404 + 3318 3405 static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq, 3319 3406 int flags, 3320 3407 struct cfg80211_registered_device *rdev, ··· 3376 3411 (u32)sinfo->rx_bytes)) 3377 3412 goto nla_put_failure; 3378 3413 if ((sinfo->filled & (STATION_INFO_TX_BYTES | 3379 - NL80211_STA_INFO_TX_BYTES64)) && 3414 + STATION_INFO_TX_BYTES64)) && 3380 3415 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 3381 3416 (u32)sinfo->tx_bytes)) 3382 3417 goto nla_put_failure; ··· 3411 3446 break; 3412 3447 default: 3413 3448 break; 3449 + } 3450 + if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL) { 3451 + if (!nl80211_put_signal(msg, sinfo->chains, 3452 + sinfo->chain_signal, 3453 + NL80211_STA_INFO_CHAIN_SIGNAL)) 3454 + goto nla_put_failure; 3455 + } 3456 + if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL_AVG) { 3457 + if (!nl80211_put_signal(msg, sinfo->chains, 3458 + sinfo->chain_signal_avg, 3459 + NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 3460 + goto nla_put_failure; 3414 3461 } 3415 3462 if (sinfo->filled & STATION_INFO_TX_BITRATE) { 3416 3463 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, ··· 3811 3834 struct station_parameters *params) 3812 3835 { 3813 3836 /* Dummy STA entry gets updated once the peer capabilities are known */ 3837 + if (info->attrs[NL80211_ATTR_PEER_AID]) 3838 + params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 3814 3839 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 3815 3840 params->ht_capa = 3816 3841 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); ··· 3953 3974 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 3954 3975 return -EINVAL; 3955 3976 3956 - if (!info->attrs[NL80211_ATTR_STA_AID]) 3977 + if (!info->attrs[NL80211_ATTR_STA_AID] && 3978 + !info->attrs[NL80211_ATTR_PEER_AID]) 3957 3979 return -EINVAL; 3958 3980 3959 3981 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); ··· 3965 3985 params.listen_interval = 3966 3986 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 3967 3987 3968 - params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 3988 + if (info->attrs[NL80211_ATTR_STA_AID]) 3989 + params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 3990 + else 3991 + params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 3969 3992 if (!params.aid || params.aid > IEEE80211_MAX_AID) 3970 3993 return -EINVAL; 3971 3994 ··· 4617 4634 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 4618 4635 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 4619 4636 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 4637 + [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 4620 4638 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 4621 4639 [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY, 4622 4640 .len = IEEE80211_MAX_DATA_LEN }, ··· 4803 4819 if (setup->is_secure) 4804 4820 setup->user_mpm = true; 4805 4821 4822 + if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 4823 + if (!setup->user_mpm) 4824 + return -EINVAL; 4825 + setup->auth_id = 4826 + nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 4827 + } 4828 + 4806 4829 return 0; 4807 4830 } 4808 4831 ··· 4852 4861 void *hdr = NULL; 4853 4862 struct nlattr *nl_reg_rules; 4854 4863 unsigned int i; 4855 - int err = -EINVAL; 4856 - 4857 - mutex_lock(&cfg80211_mutex); 4858 4864 4859 4865 if (!cfg80211_regdomain) 4860 - goto out; 4866 + return -EINVAL; 4861 4867 4862 4868 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4863 - if (!msg) { 4864 - err = -ENOBUFS; 4865 - goto out; 4866 - } 4869 + if (!msg) 4870 + return -ENOBUFS; 4867 4871 4868 4872 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 4869 4873 NL80211_CMD_GET_REG); ··· 4917 4931 nla_nest_end(msg, nl_reg_rules); 4918 4932 4919 4933 genlmsg_end(msg, hdr); 4920 - err = genlmsg_reply(msg, info); 4921 - goto out; 4934 + return genlmsg_reply(msg, info); 4922 4935 4923 4936 nla_put_failure_rcu: 4924 4937 rcu_read_unlock(); ··· 4925 4940 genlmsg_cancel(msg, hdr); 4926 4941 put_failure: 4927 4942 nlmsg_free(msg); 4928 - err = -EMSGSIZE; 4929 - out: 4930 - mutex_unlock(&cfg80211_mutex); 4931 - return err; 4943 + return -EMSGSIZE; 4932 4944 } 4933 4945 4934 4946 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) ··· 4991 5009 } 4992 5010 } 4993 5011 4994 - mutex_lock(&cfg80211_mutex); 4995 - 4996 5012 r = set_regdom(rd); 4997 5013 /* set_regdom took ownership */ 4998 5014 rd = NULL; 4999 - mutex_unlock(&cfg80211_mutex); 5000 5015 5001 5016 bad_reg: 5002 5017 kfree(rd); ··· 5043 5064 if (!rdev->ops->scan) 5044 5065 return -EOPNOTSUPP; 5045 5066 5046 - mutex_lock(&rdev->sched_scan_mtx); 5047 5067 if (rdev->scan_req) { 5048 5068 err = -EBUSY; 5049 5069 goto unlock; ··· 5228 5250 } 5229 5251 5230 5252 unlock: 5231 - mutex_unlock(&rdev->sched_scan_mtx); 5232 5253 return err; 5233 5254 } 5234 5255 ··· 5298 5321 5299 5322 if (ie_len > wiphy->max_sched_scan_ie_len) 5300 5323 return -EINVAL; 5301 - 5302 - mutex_lock(&rdev->sched_scan_mtx); 5303 5324 5304 5325 if (rdev->sched_scan_req) { 5305 5326 err = -EINPROGRESS; ··· 5466 5491 out_free: 5467 5492 kfree(request); 5468 5493 out: 5469 - mutex_unlock(&rdev->sched_scan_mtx); 5470 5494 return err; 5471 5495 } 5472 5496 ··· 5473 5499 struct genl_info *info) 5474 5500 { 5475 5501 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5476 - int err; 5477 5502 5478 5503 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) || 5479 5504 !rdev->ops->sched_scan_stop) 5480 5505 return -EOPNOTSUPP; 5481 5506 5482 - mutex_lock(&rdev->sched_scan_mtx); 5483 - err = __cfg80211_stop_sched_scan(rdev, false); 5484 - mutex_unlock(&rdev->sched_scan_mtx); 5485 - 5486 - return err; 5507 + return __cfg80211_stop_sched_scan(rdev, false); 5487 5508 } 5488 5509 5489 5510 static int nl80211_start_radar_detection(struct sk_buff *skb, ··· 5510 5541 if (!rdev->ops->start_radar_detection) 5511 5542 return -EOPNOTSUPP; 5512 5543 5513 - mutex_lock(&rdev->devlist_mtx); 5514 5544 err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype, 5515 5545 chandef.chan, CHAN_MODE_SHARED, 5516 5546 BIT(chandef.width)); 5517 5547 if (err) 5518 - goto err_locked; 5548 + return err; 5519 5549 5520 5550 err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef); 5521 5551 if (!err) { ··· 5522 5554 wdev->cac_started = true; 5523 5555 wdev->cac_start_time = jiffies; 5524 5556 } 5525 - err_locked: 5526 - mutex_unlock(&rdev->devlist_mtx); 5527 - 5528 5557 return err; 5529 5558 } 5530 5559 ··· 5904 5939 if (local_state_change) 5905 5940 return 0; 5906 5941 5907 - return cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 5908 - ssid, ssid_len, ie, ie_len, 5909 - key.p.key, key.p.key_len, key.idx, 5910 - sae_data, sae_data_len); 5942 + wdev_lock(dev->ieee80211_ptr); 5943 + err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 5944 + ssid, ssid_len, ie, ie_len, 5945 + key.p.key, key.p.key_len, key.idx, 5946 + sae_data, sae_data_len); 5947 + wdev_unlock(dev->ieee80211_ptr); 5948 + return err; 5911 5949 } 5912 5950 5913 5951 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, ··· 6077 6109 } 6078 6110 6079 6111 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 6080 - if (!err) 6112 + if (!err) { 6113 + wdev_lock(dev->ieee80211_ptr); 6081 6114 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, 6082 6115 ssid, ssid_len, &req); 6116 + wdev_unlock(dev->ieee80211_ptr); 6117 + } 6083 6118 6084 6119 return err; 6085 6120 } ··· 6092 6121 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6093 6122 struct net_device *dev = info->user_ptr[1]; 6094 6123 const u8 *ie = NULL, *bssid; 6095 - int ie_len = 0; 6124 + int ie_len = 0, err; 6096 6125 u16 reason_code; 6097 6126 bool local_state_change; 6098 6127 ··· 6127 6156 6128 6157 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6129 6158 6130 - return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 6131 - local_state_change); 6159 + wdev_lock(dev->ieee80211_ptr); 6160 + err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 6161 + local_state_change); 6162 + wdev_unlock(dev->ieee80211_ptr); 6163 + return err; 6132 6164 } 6133 6165 6134 6166 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) ··· 6139 6165 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6140 6166 struct net_device *dev = info->user_ptr[1]; 6141 6167 const u8 *ie = NULL, *bssid; 6142 - int ie_len = 0; 6168 + int ie_len = 0, err; 6143 6169 u16 reason_code; 6144 6170 bool local_state_change; 6145 6171 ··· 6174 6200 6175 6201 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6176 6202 6177 - return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 6178 - local_state_change); 6203 + wdev_lock(dev->ieee80211_ptr); 6204 + err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 6205 + local_state_change); 6206 + wdev_unlock(dev->ieee80211_ptr); 6207 + return err; 6179 6208 } 6180 6209 6181 6210 static bool ··· 6396 6419 void *data = NULL; 6397 6420 int data_len = 0; 6398 6421 6422 + rtnl_lock(); 6423 + 6399 6424 if (cb->args[0]) { 6400 6425 /* 6401 6426 * 0 is a valid index, but not valid for args[0], ··· 6409 6430 nl80211_fam.attrbuf, nl80211_fam.maxattr, 6410 6431 nl80211_policy); 6411 6432 if (err) 6412 - return err; 6433 + goto out_err; 6413 6434 6414 - mutex_lock(&cfg80211_mutex); 6415 6435 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), 6416 6436 nl80211_fam.attrbuf); 6417 6437 if (IS_ERR(rdev)) { 6418 - mutex_unlock(&cfg80211_mutex); 6419 - return PTR_ERR(rdev); 6438 + err = PTR_ERR(rdev); 6439 + goto out_err; 6420 6440 } 6421 6441 phy_idx = rdev->wiphy_idx; 6422 6442 rdev = NULL; 6423 - mutex_unlock(&cfg80211_mutex); 6424 6443 6425 6444 if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]) 6426 6445 cb->args[1] = ··· 6430 6453 data_len = nla_len((void *)cb->args[1]); 6431 6454 } 6432 6455 6433 - mutex_lock(&cfg80211_mutex); 6434 6456 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 6435 6457 if (!rdev) { 6436 - mutex_unlock(&cfg80211_mutex); 6437 - return -ENOENT; 6458 + err = -ENOENT; 6459 + goto out_err; 6438 6460 } 6439 - cfg80211_lock_rdev(rdev); 6440 - mutex_unlock(&cfg80211_mutex); 6441 6461 6442 6462 if (!rdev->ops->testmode_dump) { 6443 6463 err = -EOPNOTSUPP; ··· 6475 6501 /* see above */ 6476 6502 cb->args[0] = phy_idx + 1; 6477 6503 out_err: 6478 - cfg80211_unlock_rdev(rdev); 6504 + rtnl_unlock(); 6479 6505 return err; 6480 6506 } 6481 6507 ··· 6683 6709 sizeof(connect.vht_capa)); 6684 6710 } 6685 6711 6686 - err = cfg80211_connect(rdev, dev, &connect, connkeys); 6712 + wdev_lock(dev->ieee80211_ptr); 6713 + err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL); 6714 + wdev_unlock(dev->ieee80211_ptr); 6687 6715 if (err) 6688 6716 kfree(connkeys); 6689 6717 return err; ··· 6696 6720 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6697 6721 struct net_device *dev = info->user_ptr[1]; 6698 6722 u16 reason; 6723 + int ret; 6699 6724 6700 6725 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 6701 6726 reason = WLAN_REASON_DEAUTH_LEAVING; ··· 6710 6733 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 6711 6734 return -EOPNOTSUPP; 6712 6735 6713 - return cfg80211_disconnect(rdev, dev, reason, true); 6736 + wdev_lock(dev->ieee80211_ptr); 6737 + ret = cfg80211_disconnect(rdev, dev, reason, true); 6738 + wdev_unlock(dev->ieee80211_ptr); 6739 + return ret; 6714 6740 } 6715 6741 6716 6742 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) ··· 7489 7509 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 7490 7510 struct cfg80211_registered_device *rdev) 7491 7511 { 7512 + struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 7492 7513 struct nlattr *nl_pats, *nl_pat; 7493 7514 int i, pat_len; 7494 7515 7495 - if (!rdev->wowlan->n_patterns) 7516 + if (!wowlan->n_patterns) 7496 7517 return 0; 7497 7518 7498 7519 nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 7499 7520 if (!nl_pats) 7500 7521 return -ENOBUFS; 7501 7522 7502 - for (i = 0; i < rdev->wowlan->n_patterns; i++) { 7523 + for (i = 0; i < wowlan->n_patterns; i++) { 7503 7524 nl_pat = nla_nest_start(msg, i + 1); 7504 7525 if (!nl_pat) 7505 7526 return -ENOBUFS; 7506 - pat_len = rdev->wowlan->patterns[i].pattern_len; 7527 + pat_len = wowlan->patterns[i].pattern_len; 7507 7528 if (nla_put(msg, NL80211_WOWLAN_PKTPAT_MASK, 7508 7529 DIV_ROUND_UP(pat_len, 8), 7509 - rdev->wowlan->patterns[i].mask) || 7530 + wowlan->patterns[i].mask) || 7510 7531 nla_put(msg, NL80211_WOWLAN_PKTPAT_PATTERN, 7511 - pat_len, rdev->wowlan->patterns[i].pattern) || 7532 + pat_len, wowlan->patterns[i].pattern) || 7512 7533 nla_put_u32(msg, NL80211_WOWLAN_PKTPAT_OFFSET, 7513 - rdev->wowlan->patterns[i].pkt_offset)) 7534 + wowlan->patterns[i].pkt_offset)) 7514 7535 return -ENOBUFS; 7515 7536 nla_nest_end(msg, nl_pat); 7516 7537 } ··· 7558 7577 &tcp->payload_tok)) 7559 7578 return -ENOBUFS; 7560 7579 7580 + nla_nest_end(msg, nl_tcp); 7581 + 7561 7582 return 0; 7562 7583 } 7563 7584 ··· 7574 7591 !rdev->wiphy.wowlan.tcp) 7575 7592 return -EOPNOTSUPP; 7576 7593 7577 - if (rdev->wowlan && rdev->wowlan->tcp) { 7594 + if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 7578 7595 /* adjust size to have room for all the data */ 7579 - size += rdev->wowlan->tcp->tokens_size + 7580 - rdev->wowlan->tcp->payload_len + 7581 - rdev->wowlan->tcp->wake_len + 7582 - rdev->wowlan->tcp->wake_len / 8; 7596 + size += rdev->wiphy.wowlan_config->tcp->tokens_size + 7597 + rdev->wiphy.wowlan_config->tcp->payload_len + 7598 + rdev->wiphy.wowlan_config->tcp->wake_len + 7599 + rdev->wiphy.wowlan_config->tcp->wake_len / 8; 7583 7600 } 7584 7601 7585 7602 msg = nlmsg_new(size, GFP_KERNEL); ··· 7591 7608 if (!hdr) 7592 7609 goto nla_put_failure; 7593 7610 7594 - if (rdev->wowlan) { 7611 + if (rdev->wiphy.wowlan_config) { 7595 7612 struct nlattr *nl_wowlan; 7596 7613 7597 7614 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS); 7598 7615 if (!nl_wowlan) 7599 7616 goto nla_put_failure; 7600 7617 7601 - if ((rdev->wowlan->any && 7618 + if ((rdev->wiphy.wowlan_config->any && 7602 7619 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 7603 - (rdev->wowlan->disconnect && 7620 + (rdev->wiphy.wowlan_config->disconnect && 7604 7621 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 7605 - (rdev->wowlan->magic_pkt && 7622 + (rdev->wiphy.wowlan_config->magic_pkt && 7606 7623 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 7607 - (rdev->wowlan->gtk_rekey_failure && 7624 + (rdev->wiphy.wowlan_config->gtk_rekey_failure && 7608 7625 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 7609 - (rdev->wowlan->eap_identity_req && 7626 + (rdev->wiphy.wowlan_config->eap_identity_req && 7610 7627 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 7611 - (rdev->wowlan->four_way_handshake && 7628 + (rdev->wiphy.wowlan_config->four_way_handshake && 7612 7629 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 7613 - (rdev->wowlan->rfkill_release && 7630 + (rdev->wiphy.wowlan_config->rfkill_release && 7614 7631 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 7615 7632 goto nla_put_failure; 7616 7633 7617 7634 if (nl80211_send_wowlan_patterns(msg, rdev)) 7618 7635 goto nla_put_failure; 7619 7636 7620 - if (nl80211_send_wowlan_tcp(msg, rdev->wowlan->tcp)) 7637 + if (nl80211_send_wowlan_tcp(msg, 7638 + rdev->wiphy.wowlan_config->tcp)) 7621 7639 goto nla_put_failure; 7622 7640 7623 7641 nla_nest_end(msg, nl_wowlan); ··· 7785 7801 struct cfg80211_wowlan *ntrig; 7786 7802 struct wiphy_wowlan_support *wowlan = &rdev->wiphy.wowlan; 7787 7803 int err, i; 7788 - bool prev_enabled = rdev->wowlan; 7804 + bool prev_enabled = rdev->wiphy.wowlan_config; 7789 7805 7790 7806 if (!rdev->wiphy.wowlan.flags && !rdev->wiphy.wowlan.n_patterns && 7791 7807 !rdev->wiphy.wowlan.tcp) ··· 7793 7809 7794 7810 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 7795 7811 cfg80211_rdev_free_wowlan(rdev); 7796 - rdev->wowlan = NULL; 7812 + rdev->wiphy.wowlan_config = NULL; 7797 7813 goto set_wakeup; 7798 7814 } 7799 7815 ··· 7929 7945 goto error; 7930 7946 } 7931 7947 cfg80211_rdev_free_wowlan(rdev); 7932 - rdev->wowlan = ntrig; 7948 + rdev->wiphy.wowlan_config = ntrig; 7933 7949 7934 7950 set_wakeup: 7935 - if (rdev->ops->set_wakeup && prev_enabled != !!rdev->wowlan) 7936 - rdev_set_wakeup(rdev, rdev->wowlan); 7951 + if (rdev->ops->set_wakeup && 7952 + prev_enabled != !!rdev->wiphy.wowlan_config) 7953 + rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 7937 7954 7938 7955 return 0; 7939 7956 error: ··· 8119 8134 if (wdev->p2p_started) 8120 8135 return 0; 8121 8136 8122 - mutex_lock(&rdev->devlist_mtx); 8123 8137 err = cfg80211_can_add_interface(rdev, wdev->iftype); 8124 - mutex_unlock(&rdev->devlist_mtx); 8125 8138 if (err) 8126 8139 return err; 8127 8140 ··· 8128 8145 return err; 8129 8146 8130 8147 wdev->p2p_started = true; 8131 - mutex_lock(&rdev->devlist_mtx); 8132 8148 rdev->opencount++; 8133 - mutex_unlock(&rdev->devlist_mtx); 8134 8149 8135 8150 return 0; 8136 8151 } ··· 8144 8163 if (!rdev->ops->stop_p2p_device) 8145 8164 return -EOPNOTSUPP; 8146 8165 8147 - mutex_lock(&rdev->devlist_mtx); 8148 - mutex_lock(&rdev->sched_scan_mtx); 8149 8166 cfg80211_stop_p2p_device(rdev, wdev); 8150 - mutex_unlock(&rdev->sched_scan_mtx); 8151 - mutex_unlock(&rdev->devlist_mtx); 8152 8167 8153 8168 return 0; 8154 8169 } ··· 8287 8310 info->user_ptr[0] = rdev; 8288 8311 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || 8289 8312 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 8290 - mutex_lock(&cfg80211_mutex); 8313 + ASSERT_RTNL(); 8314 + 8291 8315 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info), 8292 8316 info->attrs); 8293 8317 if (IS_ERR(wdev)) { 8294 - mutex_unlock(&cfg80211_mutex); 8295 8318 if (rtnl) 8296 8319 rtnl_unlock(); 8297 8320 return PTR_ERR(wdev); ··· 8302 8325 8303 8326 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { 8304 8327 if (!dev) { 8305 - mutex_unlock(&cfg80211_mutex); 8306 8328 if (rtnl) 8307 8329 rtnl_unlock(); 8308 8330 return -EINVAL; ··· 8315 8339 if (dev) { 8316 8340 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 8317 8341 !netif_running(dev)) { 8318 - mutex_unlock(&cfg80211_mutex); 8319 8342 if (rtnl) 8320 8343 rtnl_unlock(); 8321 8344 return -ENETDOWN; ··· 8323 8348 dev_hold(dev); 8324 8349 } else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) { 8325 8350 if (!wdev->p2p_started) { 8326 - mutex_unlock(&cfg80211_mutex); 8327 8351 if (rtnl) 8328 8352 rtnl_unlock(); 8329 8353 return -ENETDOWN; 8330 8354 } 8331 8355 } 8332 - 8333 - cfg80211_lock_rdev(rdev); 8334 - 8335 - mutex_unlock(&cfg80211_mutex); 8336 8356 8337 8357 info->user_ptr[0] = rdev; 8338 8358 } ··· 8338 8368 static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb, 8339 8369 struct genl_info *info) 8340 8370 { 8341 - if (info->user_ptr[0]) 8342 - cfg80211_unlock_rdev(info->user_ptr[0]); 8343 8371 if (info->user_ptr[1]) { 8344 8372 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 8345 8373 struct wireless_dev *wdev = info->user_ptr[1]; ··· 8359 8391 .dumpit = nl80211_dump_wiphy, 8360 8392 .policy = nl80211_policy, 8361 8393 /* can be retrieved by unprivileged users */ 8362 - .internal_flags = NL80211_FLAG_NEED_WIPHY, 8394 + .internal_flags = NL80211_FLAG_NEED_WIPHY | 8395 + NL80211_FLAG_NEED_RTNL, 8363 8396 }, 8364 8397 { 8365 8398 .cmd = NL80211_CMD_SET_WIPHY, ··· 8375 8406 .dumpit = nl80211_dump_interface, 8376 8407 .policy = nl80211_policy, 8377 8408 /* can be retrieved by unprivileged users */ 8378 - .internal_flags = NL80211_FLAG_NEED_WDEV, 8409 + .internal_flags = NL80211_FLAG_NEED_WDEV | 8410 + NL80211_FLAG_NEED_RTNL, 8379 8411 }, 8380 8412 { 8381 8413 .cmd = NL80211_CMD_SET_INTERFACE, ··· 8535 8565 .cmd = NL80211_CMD_GET_REG, 8536 8566 .doit = nl80211_get_reg, 8537 8567 .policy = nl80211_policy, 8568 + .internal_flags = NL80211_FLAG_NEED_RTNL, 8538 8569 /* can be retrieved by unprivileged users */ 8539 8570 }, 8540 8571 { ··· 8543 8572 .doit = nl80211_set_reg, 8544 8573 .policy = nl80211_policy, 8545 8574 .flags = GENL_ADMIN_PERM, 8575 + .internal_flags = NL80211_FLAG_NEED_RTNL, 8546 8576 }, 8547 8577 { 8548 8578 .cmd = NL80211_CMD_REQ_SET_REG, ··· 8998 9026 struct cfg80211_scan_request *req = rdev->scan_req; 8999 9027 struct nlattr *nest; 9000 9028 int i; 9001 - 9002 - lockdep_assert_held(&rdev->sched_scan_mtx); 9003 9029 9004 9030 if (WARN_ON(!req)) 9005 9031 return 0; ··· 9940 9970 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9941 9971 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 9942 9972 netdev->ifindex)) || 9973 + nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) || 9943 9974 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) || 9944 9975 (sig_dbm && 9945 9976 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || ··· 9981 10010 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9982 10011 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 9983 10012 netdev->ifindex)) || 10013 + nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) || 9984 10014 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 9985 10015 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) || 9986 10016 (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
+44 -92
net/wireless/reg.c
··· 81 81 .country_ie_env = ENVIRON_ANY, 82 82 }; 83 83 84 - /* Receipt of information from last regulatory request */ 84 + /* 85 + * Receipt of information from last regulatory request, 86 + * protected by RTNL (and can be accessed with RCU protection) 87 + */ 85 88 static struct regulatory_request __rcu *last_request = 86 89 (void __rcu *)&core_request_world; 87 90 ··· 99 96 * Central wireless core regulatory domains, we only need two, 100 97 * the current one and a world regulatory domain in case we have no 101 98 * information to give us an alpha2. 99 + * (protected by RTNL, can be read under RCU) 102 100 */ 103 101 const struct ieee80211_regdomain __rcu *cfg80211_regdomain; 104 102 105 103 /* 106 - * Protects static reg.c components: 107 - * - cfg80211_regdomain (if not used with RCU) 108 - * - cfg80211_world_regdom 109 - * - last_request (if not used with RCU) 110 - * - reg_num_devs_support_basehint 111 - */ 112 - static DEFINE_MUTEX(reg_mutex); 113 - 114 - /* 115 104 * Number of devices that registered to the core 116 105 * that support cellular base station regulatory hints 106 + * (protected by RTNL) 117 107 */ 118 108 static int reg_num_devs_support_basehint; 119 109 120 - static inline void assert_reg_lock(void) 121 - { 122 - lockdep_assert_held(&reg_mutex); 123 - } 124 - 125 110 static const struct ieee80211_regdomain *get_cfg80211_regdom(void) 126 111 { 127 - return rcu_dereference_protected(cfg80211_regdomain, 128 - lockdep_is_held(&reg_mutex)); 112 + return rtnl_dereference(cfg80211_regdomain); 129 113 } 130 114 131 115 static const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy) 132 116 { 133 - return rcu_dereference_protected(wiphy->regd, 134 - lockdep_is_held(&reg_mutex)); 117 + return rtnl_dereference(wiphy->regd); 135 118 } 136 119 137 120 static void rcu_free_regdom(const struct ieee80211_regdomain *r) ··· 129 140 130 141 static struct regulatory_request *get_last_request(void) 131 142 { 132 - return rcu_dereference_check(last_request, 133 - lockdep_is_held(&reg_mutex)); 143 + return rcu_dereference_rtnl(last_request); 134 144 } 135 145 136 146 /* Used to queue up regulatory hints */ ··· 188 200 } 189 201 }; 190 202 203 + /* protected by RTNL */ 191 204 static const struct ieee80211_regdomain *cfg80211_world_regdom = 192 205 &world_regdom; 193 206 ··· 204 215 const struct ieee80211_regdomain *r; 205 216 struct regulatory_request *lr; 206 217 207 - assert_reg_lock(); 218 + ASSERT_RTNL(); 208 219 209 220 r = get_cfg80211_regdom(); 210 221 ··· 366 377 const struct ieee80211_regdomain *curdom, *regdom = NULL; 367 378 int i; 368 379 369 - mutex_lock(&cfg80211_mutex); 380 + rtnl_lock(); 370 381 371 382 mutex_lock(&reg_regdb_search_mutex); 372 383 while (!list_empty(&reg_regdb_search_list)) { ··· 391 402 if (!IS_ERR_OR_NULL(regdom)) 392 403 set_regdom(regdom); 393 404 394 - mutex_unlock(&cfg80211_mutex); 405 + rtnl_unlock(); 395 406 } 396 407 397 408 static DECLARE_WORK(reg_regdb_work, reg_regdb_search); ··· 925 936 926 937 bool reg_last_request_cell_base(void) 927 938 { 928 - bool val; 929 - 930 - mutex_lock(&reg_mutex); 931 - val = reg_request_cell_base(get_last_request()); 932 - mutex_unlock(&reg_mutex); 933 - 934 - return val; 939 + return reg_request_cell_base(get_last_request()); 935 940 } 936 941 937 942 #ifdef CONFIG_CFG80211_CERTIFICATION_ONUS ··· 1208 1225 struct cfg80211_registered_device *rdev; 1209 1226 struct wiphy *wiphy; 1210 1227 1211 - assert_cfg80211_lock(); 1228 + ASSERT_RTNL(); 1212 1229 1213 1230 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 1214 1231 wiphy = &rdev->wiphy; ··· 1427 1444 * what it believes should be the current regulatory domain. 1428 1445 * 1429 1446 * Returns one of the different reg request treatment values. 1430 - * 1431 - * Caller must hold &reg_mutex 1432 1447 */ 1433 1448 static enum reg_request_treatment 1434 1449 __regulatory_hint(struct wiphy *wiphy, ··· 1551 1570 { 1552 1571 struct regulatory_request *reg_request, *lr; 1553 1572 1554 - mutex_lock(&cfg80211_mutex); 1555 - mutex_lock(&reg_mutex); 1556 1573 lr = get_last_request(); 1557 1574 1558 1575 /* When last_request->processed becomes true this will be rescheduled */ 1559 1576 if (lr && !lr->processed) { 1560 1577 REG_DBG_PRINT("Pending regulatory request, waiting for it to be processed...\n"); 1561 - goto out; 1578 + return; 1562 1579 } 1563 1580 1564 1581 spin_lock(&reg_requests_lock); 1565 1582 1566 1583 if (list_empty(&reg_requests_list)) { 1567 1584 spin_unlock(&reg_requests_lock); 1568 - goto out; 1585 + return; 1569 1586 } 1570 1587 1571 1588 reg_request = list_first_entry(&reg_requests_list, ··· 1574 1595 spin_unlock(&reg_requests_lock); 1575 1596 1576 1597 reg_process_hint(reg_request, reg_request->initiator); 1577 - 1578 - out: 1579 - mutex_unlock(&reg_mutex); 1580 - mutex_unlock(&cfg80211_mutex); 1581 1598 } 1582 1599 1583 1600 /* Processes beacon hints -- this has nothing to do with country IEs */ ··· 1581 1606 { 1582 1607 struct cfg80211_registered_device *rdev; 1583 1608 struct reg_beacon *pending_beacon, *tmp; 1584 - 1585 - mutex_lock(&cfg80211_mutex); 1586 - mutex_lock(&reg_mutex); 1587 1609 1588 1610 /* This goes through the _pending_ beacon list */ 1589 1611 spin_lock_bh(&reg_pending_beacons_lock); ··· 1598 1626 } 1599 1627 1600 1628 spin_unlock_bh(&reg_pending_beacons_lock); 1601 - mutex_unlock(&reg_mutex); 1602 - mutex_unlock(&cfg80211_mutex); 1603 1629 } 1604 1630 1605 1631 static void reg_todo(struct work_struct *work) 1606 1632 { 1633 + rtnl_lock(); 1607 1634 reg_process_pending_hints(); 1608 1635 reg_process_pending_beacon_hints(); 1636 + rtnl_unlock(); 1609 1637 } 1610 1638 1611 1639 static void queue_regulatory_request(struct regulatory_request *request) ··· 1689 1717 } 1690 1718 EXPORT_SYMBOL(regulatory_hint); 1691 1719 1692 - /* 1693 - * We hold wdev_lock() here so we cannot hold cfg80211_mutex() and 1694 - * therefore cannot iterate over the rdev list here. 1695 - */ 1696 1720 void regulatory_hint_11d(struct wiphy *wiphy, enum ieee80211_band band, 1697 1721 const u8 *country_ie, u8 country_ie_len) 1698 1722 { 1699 1723 char alpha2[2]; 1700 1724 enum environment_cap env = ENVIRON_ANY; 1701 - struct regulatory_request *request, *lr; 1702 - 1703 - mutex_lock(&reg_mutex); 1704 - lr = get_last_request(); 1705 - 1706 - if (unlikely(!lr)) 1707 - goto out; 1725 + struct regulatory_request *request = NULL, *lr; 1708 1726 1709 1727 /* IE len must be evenly divisible by 2 */ 1710 1728 if (country_ie_len & 0x01) 1711 - goto out; 1729 + return; 1712 1730 1713 1731 if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN) 1714 - goto out; 1732 + return; 1733 + 1734 + request = kzalloc(sizeof(*request), GFP_KERNEL); 1735 + if (!request) 1736 + return; 1715 1737 1716 1738 alpha2[0] = country_ie[0]; 1717 1739 alpha2[1] = country_ie[1]; ··· 1715 1749 else if (country_ie[2] == 'O') 1716 1750 env = ENVIRON_OUTDOOR; 1717 1751 1752 + rcu_read_lock(); 1753 + lr = get_last_request(); 1754 + 1755 + if (unlikely(!lr)) 1756 + goto out; 1757 + 1718 1758 /* 1719 1759 * We will run this only upon a successful connection on cfg80211. 1720 1760 * We leave conflict resolution to the workqueue, where can hold 1721 - * cfg80211_mutex. 1761 + * the RTNL. 1722 1762 */ 1723 1763 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE && 1724 1764 lr->wiphy_idx != WIPHY_IDX_INVALID) 1725 - goto out; 1726 - 1727 - request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL); 1728 - if (!request) 1729 1765 goto out; 1730 1766 1731 1767 request->wiphy_idx = get_wiphy_idx(wiphy); ··· 1737 1769 request->country_ie_env = env; 1738 1770 1739 1771 queue_regulatory_request(request); 1772 + request = NULL; 1740 1773 out: 1741 - mutex_unlock(&reg_mutex); 1774 + kfree(request); 1775 + rcu_read_unlock(); 1742 1776 } 1743 1777 1744 1778 static void restore_alpha2(char *alpha2, bool reset_user) ··· 1828 1858 LIST_HEAD(tmp_reg_req_list); 1829 1859 struct cfg80211_registered_device *rdev; 1830 1860 1831 - mutex_lock(&cfg80211_mutex); 1832 - mutex_lock(&reg_mutex); 1861 + ASSERT_RTNL(); 1833 1862 1834 1863 reset_regdomains(true, &world_regdom); 1835 1864 restore_alpha2(alpha2, reset_user); ··· 1882 1913 spin_lock(&reg_requests_lock); 1883 1914 list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list); 1884 1915 spin_unlock(&reg_requests_lock); 1885 - 1886 - mutex_unlock(&reg_mutex); 1887 - mutex_unlock(&cfg80211_mutex); 1888 1916 1889 1917 REG_DBG_PRINT("Kicking the queue\n"); 1890 1918 ··· 2197 2231 struct regulatory_request *lr; 2198 2232 int r; 2199 2233 2200 - mutex_lock(&reg_mutex); 2201 2234 lr = get_last_request(); 2202 2235 2203 2236 /* Note that this doesn't update the wiphys, this is done below */ ··· 2206 2241 reg_set_request_processed(); 2207 2242 2208 2243 kfree(rd); 2209 - goto out; 2244 + return r; 2210 2245 } 2211 2246 2212 2247 /* This would make this whole thing pointless */ 2213 - if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom())) { 2214 - r = -EINVAL; 2215 - goto out; 2216 - } 2248 + if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom())) 2249 + return -EINVAL; 2217 2250 2218 2251 /* update all wiphys now with the new established regulatory domain */ 2219 2252 update_all_wiphy_regulatory(lr->initiator); ··· 2222 2259 2223 2260 reg_set_request_processed(); 2224 2261 2225 - out: 2226 - mutex_unlock(&reg_mutex); 2227 - 2228 - return r; 2262 + return 0; 2229 2263 } 2230 2264 2231 2265 int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env) ··· 2247 2287 2248 2288 void wiphy_regulatory_register(struct wiphy *wiphy) 2249 2289 { 2250 - mutex_lock(&reg_mutex); 2251 - 2252 2290 if (!reg_dev_ignore_cell_hint(wiphy)) 2253 2291 reg_num_devs_support_basehint++; 2254 2292 2255 2293 wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE); 2256 - 2257 - mutex_unlock(&reg_mutex); 2258 2294 } 2259 2295 2260 - /* Caller must hold cfg80211_mutex */ 2261 2296 void wiphy_regulatory_deregister(struct wiphy *wiphy) 2262 2297 { 2263 2298 struct wiphy *request_wiphy = NULL; 2264 2299 struct regulatory_request *lr; 2265 2300 2266 - mutex_lock(&reg_mutex); 2267 2301 lr = get_last_request(); 2268 2302 2269 2303 if (!reg_dev_ignore_cell_hint(wiphy)) ··· 2270 2316 request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx); 2271 2317 2272 2318 if (!request_wiphy || request_wiphy != wiphy) 2273 - goto out; 2319 + return; 2274 2320 2275 2321 lr->wiphy_idx = WIPHY_IDX_INVALID; 2276 2322 lr->country_ie_env = ENVIRON_ANY; 2277 - out: 2278 - mutex_unlock(&reg_mutex); 2279 2323 } 2280 2324 2281 2325 static void reg_timeout_work(struct work_struct *work) ··· 2337 2385 cancel_delayed_work_sync(&reg_timeout); 2338 2386 2339 2387 /* Lock to suppress warnings */ 2340 - mutex_lock(&reg_mutex); 2388 + rtnl_lock(); 2341 2389 reset_regdomains(true, NULL); 2342 - mutex_unlock(&reg_mutex); 2390 + rtnl_unlock(); 2343 2391 2344 2392 dev_set_uevent_suppress(&reg_pdev->dev, true); 2345 2393
+30 -17
net/wireless/scan.c
··· 169 169 union iwreq_data wrqu; 170 170 #endif 171 171 172 - lockdep_assert_held(&rdev->sched_scan_mtx); 172 + ASSERT_RTNL(); 173 173 174 174 request = rdev->scan_req; 175 175 ··· 230 230 rdev = container_of(wk, struct cfg80211_registered_device, 231 231 scan_done_wk); 232 232 233 - mutex_lock(&rdev->sched_scan_mtx); 233 + rtnl_lock(); 234 234 ___cfg80211_scan_done(rdev, false); 235 - mutex_unlock(&rdev->sched_scan_mtx); 235 + rtnl_unlock(); 236 236 } 237 237 238 238 void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted) ··· 241 241 WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); 242 242 243 243 request->aborted = aborted; 244 + request->notified = true; 244 245 queue_work(cfg80211_wq, &wiphy_to_dev(request->wiphy)->scan_done_wk); 245 246 } 246 247 EXPORT_SYMBOL(cfg80211_scan_done); ··· 256 255 257 256 request = rdev->sched_scan_req; 258 257 259 - mutex_lock(&rdev->sched_scan_mtx); 258 + rtnl_lock(); 260 259 261 260 /* we don't have sched_scan_req anymore if the scan is stopping */ 262 261 if (request) { ··· 271 270 nl80211_send_sched_scan_results(rdev, request->dev); 272 271 } 273 272 274 - mutex_unlock(&rdev->sched_scan_mtx); 273 + rtnl_unlock(); 275 274 } 276 275 277 276 void cfg80211_sched_scan_results(struct wiphy *wiphy) ··· 290 289 291 290 trace_cfg80211_sched_scan_stopped(wiphy); 292 291 293 - mutex_lock(&rdev->sched_scan_mtx); 292 + rtnl_lock(); 294 293 __cfg80211_stop_sched_scan(rdev, true); 295 - mutex_unlock(&rdev->sched_scan_mtx); 294 + rtnl_unlock(); 296 295 } 297 296 EXPORT_SYMBOL(cfg80211_sched_scan_stopped); 298 297 ··· 301 300 { 302 301 struct net_device *dev; 303 302 304 - lockdep_assert_held(&rdev->sched_scan_mtx); 303 + ASSERT_RTNL(); 305 304 306 305 if (!rdev->sched_scan_req) 307 306 return -ENOENT; ··· 1041 1040 EXPORT_SYMBOL(cfg80211_unlink_bss); 1042 1041 1043 1042 #ifdef CONFIG_CFG80211_WEXT 1043 + static struct cfg80211_registered_device * 1044 + cfg80211_get_dev_from_ifindex(struct net *net, int ifindex) 1045 + { 1046 + struct cfg80211_registered_device *rdev; 1047 + struct net_device *dev; 1048 + 1049 + ASSERT_RTNL(); 1050 + 1051 + dev = dev_get_by_index(net, ifindex); 1052 + if (!dev) 1053 + return ERR_PTR(-ENODEV); 1054 + if (dev->ieee80211_ptr) 1055 + rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy); 1056 + else 1057 + rdev = ERR_PTR(-ENODEV); 1058 + dev_put(dev); 1059 + return rdev; 1060 + } 1061 + 1044 1062 int cfg80211_wext_siwscan(struct net_device *dev, 1045 1063 struct iw_request_info *info, 1046 1064 union iwreq_data *wrqu, char *extra) ··· 1082 1062 if (IS_ERR(rdev)) 1083 1063 return PTR_ERR(rdev); 1084 1064 1085 - mutex_lock(&rdev->sched_scan_mtx); 1086 1065 if (rdev->scan_req) { 1087 1066 err = -EBUSY; 1088 1067 goto out; ··· 1188 1169 dev_hold(dev); 1189 1170 } 1190 1171 out: 1191 - mutex_unlock(&rdev->sched_scan_mtx); 1192 1172 kfree(creq); 1193 - cfg80211_unlock_rdev(rdev); 1194 1173 return err; 1195 1174 } 1196 1175 EXPORT_SYMBOL_GPL(cfg80211_wext_siwscan); ··· 1487 1470 if (IS_ERR(rdev)) 1488 1471 return PTR_ERR(rdev); 1489 1472 1490 - if (rdev->scan_req) { 1491 - res = -EAGAIN; 1492 - goto out; 1493 - } 1473 + if (rdev->scan_req) 1474 + return -EAGAIN; 1494 1475 1495 1476 res = ieee80211_scan_results(rdev, info, extra, data->length); 1496 1477 data->length = 0; ··· 1497 1482 res = 0; 1498 1483 } 1499 1484 1500 - out: 1501 - cfg80211_unlock_rdev(rdev); 1502 1485 return res; 1503 1486 } 1504 1487 EXPORT_SYMBOL_GPL(cfg80211_wext_giwscan);
+36 -77
net/wireless/sme.c
··· 43 43 struct wireless_dev *wdev; 44 44 bool is_all_idle = true; 45 45 46 - mutex_lock(&cfg80211_mutex); 47 - 48 46 /* 49 47 * All devices must be idle as otherwise if you are actively 50 48 * scanning some new beacon hints could be learned and would 51 49 * count as new regulatory hints. 52 50 */ 53 51 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 54 - cfg80211_lock_rdev(rdev); 55 52 list_for_each_entry(wdev, &rdev->wdev_list, list) { 56 53 wdev_lock(wdev); 57 54 if (wdev->sme_state != CFG80211_SME_IDLE) 58 55 is_all_idle = false; 59 56 wdev_unlock(wdev); 60 57 } 61 - cfg80211_unlock_rdev(rdev); 62 58 } 63 - 64 - mutex_unlock(&cfg80211_mutex); 65 59 66 60 return is_all_idle; 67 61 } 68 62 69 63 static void disconnect_work(struct work_struct *work) 70 64 { 71 - if (!cfg80211_is_all_idle()) 72 - return; 73 - 74 - regulatory_hint_disconnect(); 65 + rtnl_lock(); 66 + if (cfg80211_is_all_idle()) 67 + regulatory_hint_disconnect(); 68 + rtnl_unlock(); 75 69 } 76 70 77 71 static DECLARE_WORK(cfg80211_disconnect_work, disconnect_work); ··· 79 85 ASSERT_RTNL(); 80 86 ASSERT_RDEV_LOCK(rdev); 81 87 ASSERT_WDEV_LOCK(wdev); 82 - lockdep_assert_held(&rdev->sched_scan_mtx); 83 88 84 89 if (rdev->scan_req) 85 90 return -EBUSY; ··· 169 176 case CFG80211_CONN_AUTHENTICATE_NEXT: 170 177 BUG_ON(!rdev->ops->auth); 171 178 wdev->conn->state = CFG80211_CONN_AUTHENTICATING; 172 - return __cfg80211_mlme_auth(rdev, wdev->netdev, 173 - params->channel, params->auth_type, 174 - params->bssid, 175 - params->ssid, params->ssid_len, 176 - NULL, 0, 177 - params->key, params->key_len, 178 - params->key_idx, NULL, 0); 179 + return cfg80211_mlme_auth(rdev, wdev->netdev, 180 + params->channel, params->auth_type, 181 + params->bssid, 182 + params->ssid, params->ssid_len, 183 + NULL, 0, 184 + params->key, params->key_len, 185 + params->key_idx, NULL, 0); 179 186 case CFG80211_CONN_ASSOCIATE_NEXT: 180 187 BUG_ON(!rdev->ops->assoc); 181 188 wdev->conn->state = CFG80211_CONN_ASSOCIATING; ··· 191 198 req.vht_capa = params->vht_capa; 192 199 req.vht_capa_mask = params->vht_capa_mask; 193 200 194 - err = __cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel, 195 - params->bssid, params->ssid, 196 - params->ssid_len, &req); 201 + err = cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel, 202 + params->bssid, params->ssid, 203 + params->ssid_len, &req); 197 204 if (err) 198 - __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, 199 - NULL, 0, 200 - WLAN_REASON_DEAUTH_LEAVING, 201 - false); 205 + cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, 206 + NULL, 0, 207 + WLAN_REASON_DEAUTH_LEAVING, 208 + false); 202 209 return err; 203 210 case CFG80211_CONN_DEAUTH_ASSOC_FAIL: 204 - __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, 205 - NULL, 0, 206 - WLAN_REASON_DEAUTH_LEAVING, false); 211 + cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, 212 + NULL, 0, 213 + WLAN_REASON_DEAUTH_LEAVING, false); 207 214 /* return an error so that we call __cfg80211_connect_result() */ 208 215 return -EINVAL; 209 216 default: ··· 219 226 u8 bssid_buf[ETH_ALEN], *bssid = NULL; 220 227 221 228 rtnl_lock(); 222 - cfg80211_lock_rdev(rdev); 223 - mutex_lock(&rdev->devlist_mtx); 224 - mutex_lock(&rdev->sched_scan_mtx); 225 229 226 230 list_for_each_entry(wdev, &rdev->wdev_list, list) { 231 + if (!wdev->netdev) 232 + continue; 233 + 227 234 wdev_lock(wdev); 228 235 if (!netif_running(wdev->netdev)) { 229 236 wdev_unlock(wdev); ··· 246 253 wdev_unlock(wdev); 247 254 } 248 255 249 - mutex_unlock(&rdev->sched_scan_mtx); 250 - mutex_unlock(&rdev->devlist_mtx); 251 - cfg80211_unlock_rdev(rdev); 252 256 rtnl_unlock(); 253 257 } 254 258 ··· 760 770 } 761 771 EXPORT_SYMBOL(cfg80211_disconnected); 762 772 763 - int __cfg80211_connect(struct cfg80211_registered_device *rdev, 764 - struct net_device *dev, 765 - struct cfg80211_connect_params *connect, 766 - struct cfg80211_cached_keys *connkeys, 767 - const u8 *prev_bssid) 773 + int cfg80211_connect(struct cfg80211_registered_device *rdev, 774 + struct net_device *dev, 775 + struct cfg80211_connect_params *connect, 776 + struct cfg80211_cached_keys *connkeys, 777 + const u8 *prev_bssid) 768 778 { 769 779 struct wireless_dev *wdev = dev->ieee80211_ptr; 770 780 struct cfg80211_bss *bss = NULL; ··· 911 921 } 912 922 } 913 923 914 - int cfg80211_connect(struct cfg80211_registered_device *rdev, 915 - struct net_device *dev, 916 - struct cfg80211_connect_params *connect, 917 - struct cfg80211_cached_keys *connkeys) 918 - { 919 - int err; 920 - 921 - mutex_lock(&rdev->devlist_mtx); 922 - /* might request scan - scan_mtx -> wdev_mtx dependency */ 923 - mutex_lock(&rdev->sched_scan_mtx); 924 - wdev_lock(dev->ieee80211_ptr); 925 - err = __cfg80211_connect(rdev, dev, connect, connkeys, NULL); 926 - wdev_unlock(dev->ieee80211_ptr); 927 - mutex_unlock(&rdev->sched_scan_mtx); 928 - mutex_unlock(&rdev->devlist_mtx); 929 - 930 - return err; 931 - } 932 - 933 - int __cfg80211_disconnect(struct cfg80211_registered_device *rdev, 934 - struct net_device *dev, u16 reason, bool wextev) 924 + int cfg80211_disconnect(struct cfg80211_registered_device *rdev, 925 + struct net_device *dev, u16 reason, bool wextev) 935 926 { 936 927 struct wireless_dev *wdev = dev->ieee80211_ptr; 937 928 int err; ··· 932 961 /* was it connected by userspace SME? */ 933 962 if (!wdev->conn) { 934 963 cfg80211_mlme_down(rdev, dev); 935 - return 0; 964 + goto disconnect; 936 965 } 937 966 938 967 if (wdev->sme_state == CFG80211_SME_CONNECTING && ··· 947 976 } 948 977 949 978 /* wdev->conn->params.bssid must be set if > SCANNING */ 950 - err = __cfg80211_mlme_deauth(rdev, dev, 979 + err = cfg80211_mlme_deauth(rdev, dev, 951 980 wdev->conn->params.bssid, 952 981 NULL, 0, reason, false); 953 982 if (err) ··· 958 987 return err; 959 988 } 960 989 990 + disconnect: 961 991 if (wdev->sme_state == CFG80211_SME_CONNECTED) 962 992 __cfg80211_disconnected(dev, NULL, 0, 0, false); 963 993 else if (wdev->sme_state == CFG80211_SME_CONNECTING) ··· 967 995 wextev, NULL); 968 996 969 997 return 0; 970 - } 971 - 972 - int cfg80211_disconnect(struct cfg80211_registered_device *rdev, 973 - struct net_device *dev, 974 - u16 reason, bool wextev) 975 - { 976 - int err; 977 - 978 - wdev_lock(dev->ieee80211_ptr); 979 - err = __cfg80211_disconnect(rdev, dev, reason, wextev); 980 - wdev_unlock(dev->ieee80211_ptr); 981 - 982 - return err; 983 998 } 984 999 985 1000 void cfg80211_sme_disassoc(struct net_device *dev, ··· 991 1032 992 1033 memcpy(bssid, bss->pub.bssid, ETH_ALEN); 993 1034 994 - __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, 995 - WLAN_REASON_DEAUTH_LEAVING, false); 1035 + cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, 1036 + WLAN_REASON_DEAUTH_LEAVING, false); 996 1037 }
+6 -2
net/wireless/sysfs.c
··· 91 91 cfg80211_leave(rdev, wdev); 92 92 } 93 93 94 + #ifdef CONFIG_PM 94 95 static int wiphy_suspend(struct device *dev, pm_message_t state) 95 96 { 96 97 struct cfg80211_registered_device *rdev = dev_to_rdev(dev); ··· 101 100 102 101 rtnl_lock(); 103 102 if (rdev->wiphy.registered) { 104 - if (!rdev->wowlan) 103 + if (!rdev->wiphy.wowlan_config) 105 104 cfg80211_leave_all(rdev); 106 105 if (rdev->ops->suspend) 107 - ret = rdev_suspend(rdev, rdev->wowlan); 106 + ret = rdev_suspend(rdev, rdev->wiphy.wowlan_config); 108 107 if (ret == 1) { 109 108 /* Driver refuse to configure wowlan */ 110 109 cfg80211_leave_all(rdev); ··· 133 132 134 133 return ret; 135 134 } 135 + #endif 136 136 137 137 static const void *wiphy_namespace(struct device *d) 138 138 { ··· 148 146 .dev_release = wiphy_dev_release, 149 147 .dev_attrs = ieee80211_dev_attrs, 150 148 .dev_uevent = wiphy_uevent, 149 + #ifdef CONFIG_PM 151 150 .suspend = wiphy_suspend, 152 151 .resume = wiphy_resume, 152 + #endif 153 153 .ns_type = &net_ns_type_operations, 154 154 .namespace = wiphy_namespace, 155 155 };
+15 -12
net/wireless/trace.h
··· 1911 1911 NETDEV_PR_ARG, MAC_PR_ARG(bssid), CHAN_PR_ARG) 1912 1912 ); 1913 1913 1914 - DEFINE_EVENT(netdev_evt_only, __cfg80211_send_deauth, 1914 + DEFINE_EVENT(netdev_evt_only, cfg80211_send_deauth, 1915 1915 TP_PROTO(struct net_device *netdev), 1916 1916 TP_ARGS(netdev) 1917 1917 ); 1918 1918 1919 - DEFINE_EVENT(netdev_evt_only, __cfg80211_send_disassoc, 1919 + DEFINE_EVENT(netdev_evt_only, cfg80211_send_disassoc, 1920 1920 TP_PROTO(struct net_device *netdev), 1921 1921 TP_ARGS(netdev) 1922 1922 ); ··· 2441 2441 TP_STRUCT__entry( 2442 2442 WIPHY_ENTRY 2443 2443 WDEV_ENTRY 2444 + __field(bool, non_wireless) 2444 2445 __field(bool, disconnect) 2445 2446 __field(bool, magic_pkt) 2446 2447 __field(bool, gtk_rekey_failure) ··· 2450 2449 __field(bool, rfkill_release) 2451 2450 __field(s32, pattern_idx) 2452 2451 __field(u32, packet_len) 2453 - __dynamic_array(u8, packet, wakeup->packet_present_len) 2452 + __dynamic_array(u8, packet, 2453 + wakeup ? wakeup->packet_present_len : 0) 2454 2454 ), 2455 2455 TP_fast_assign( 2456 2456 WIPHY_ASSIGN; 2457 2457 WDEV_ASSIGN; 2458 - __entry->disconnect = wakeup->disconnect; 2459 - __entry->magic_pkt = wakeup->magic_pkt; 2460 - __entry->gtk_rekey_failure = wakeup->gtk_rekey_failure; 2461 - __entry->eap_identity_req = wakeup->eap_identity_req; 2462 - __entry->four_way_handshake = wakeup->four_way_handshake; 2463 - __entry->rfkill_release = wakeup->rfkill_release; 2464 - __entry->pattern_idx = wakeup->pattern_idx; 2465 - __entry->packet_len = wakeup->packet_len; 2466 - if (wakeup->packet && wakeup->packet_present_len) 2458 + __entry->non_wireless = !wakeup; 2459 + __entry->disconnect = wakeup ? wakeup->disconnect : false; 2460 + __entry->magic_pkt = wakeup ? wakeup->magic_pkt : false; 2461 + __entry->gtk_rekey_failure = wakeup ? wakeup->gtk_rekey_failure : false; 2462 + __entry->eap_identity_req = wakeup ? wakeup->eap_identity_req : false; 2463 + __entry->four_way_handshake = wakeup ? wakeup->four_way_handshake : false; 2464 + __entry->rfkill_release = wakeup ? wakeup->rfkill_release : false; 2465 + __entry->pattern_idx = wakeup ? wakeup->pattern_idx : false; 2466 + __entry->packet_len = wakeup ? wakeup->packet_len : false; 2467 + if (wakeup && wakeup->packet && wakeup->packet_present_len) 2467 2468 memcpy(__get_dynamic_array(packet), wakeup->packet, 2468 2469 wakeup->packet_present_len); 2469 2470 ),
+28 -11
net/wireless/util.c
··· 33 33 } 34 34 EXPORT_SYMBOL(ieee80211_get_response_rate); 35 35 36 + u32 ieee80211_mandatory_rates(struct ieee80211_supported_band *sband) 37 + { 38 + struct ieee80211_rate *bitrates; 39 + u32 mandatory_rates = 0; 40 + enum ieee80211_rate_flags mandatory_flag; 41 + int i; 42 + 43 + if (WARN_ON(!sband)) 44 + return 1; 45 + 46 + if (sband->band == IEEE80211_BAND_2GHZ) 47 + mandatory_flag = IEEE80211_RATE_MANDATORY_B; 48 + else 49 + mandatory_flag = IEEE80211_RATE_MANDATORY_A; 50 + 51 + bitrates = sband->bitrates; 52 + for (i = 0; i < sband->n_bitrates; i++) 53 + if (bitrates[i].flags & mandatory_flag) 54 + mandatory_rates |= BIT(i); 55 + return mandatory_rates; 56 + } 57 + EXPORT_SYMBOL(ieee80211_mandatory_rates); 58 + 36 59 int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band) 37 60 { 38 61 /* see 802.11 17.3.8.3.2 and Annex J ··· 808 785 ASSERT_RTNL(); 809 786 ASSERT_RDEV_LOCK(rdev); 810 787 811 - mutex_lock(&rdev->devlist_mtx); 812 - 813 788 list_for_each_entry(wdev, &rdev->wdev_list, list) 814 789 cfg80211_process_wdev_events(wdev); 815 - 816 - mutex_unlock(&rdev->devlist_mtx); 817 790 } 818 791 819 792 int cfg80211_change_iface(struct cfg80211_registered_device *rdev, ··· 841 822 return -EBUSY; 842 823 843 824 if (ntype != otype && netif_running(dev)) { 844 - mutex_lock(&rdev->devlist_mtx); 845 825 err = cfg80211_can_change_interface(rdev, dev->ieee80211_ptr, 846 826 ntype); 847 - mutex_unlock(&rdev->devlist_mtx); 848 827 if (err) 849 828 return err; 850 829 ··· 858 841 break; 859 842 case NL80211_IFTYPE_STATION: 860 843 case NL80211_IFTYPE_P2P_CLIENT: 844 + wdev_lock(dev->ieee80211_ptr); 861 845 cfg80211_disconnect(rdev, dev, 862 846 WLAN_REASON_DEAUTH_LEAVING, true); 847 + wdev_unlock(dev->ieee80211_ptr); 863 848 break; 864 849 case NL80211_IFTYPE_MESH_POINT: 865 850 /* mesh should be handled? */ ··· 1188 1169 case 84: 1189 1170 *band = IEEE80211_BAND_2GHZ; 1190 1171 return true; 1172 + case 180: 1173 + *band = IEEE80211_BAND_60GHZ; 1174 + return true; 1191 1175 } 1192 1176 1193 1177 return false; ··· 1206 1184 if (!beacon_int) 1207 1185 return -EINVAL; 1208 1186 1209 - mutex_lock(&rdev->devlist_mtx); 1210 - 1211 1187 list_for_each_entry(wdev, &rdev->wdev_list, list) { 1212 1188 if (!wdev->beacon_interval) 1213 1189 continue; ··· 1214 1194 break; 1215 1195 } 1216 1196 } 1217 - 1218 - mutex_unlock(&rdev->devlist_mtx); 1219 1197 1220 1198 return res; 1221 1199 } ··· 1238 1220 int i, j; 1239 1221 1240 1222 ASSERT_RTNL(); 1241 - lockdep_assert_held(&rdev->devlist_mtx); 1242 1223 1243 1224 if (WARN_ON(hweight32(radar_detect) > 1)) 1244 1225 return -EINVAL;
+4 -18
net/wireless/wext-compat.c
··· 72 72 struct cfg80211_registered_device *rdev; 73 73 struct vif_params vifparams; 74 74 enum nl80211_iftype type; 75 - int ret; 76 75 77 76 rdev = wiphy_to_dev(wdev->wiphy); 78 77 ··· 97 98 98 99 memset(&vifparams, 0, sizeof(vifparams)); 99 100 100 - cfg80211_lock_rdev(rdev); 101 - ret = cfg80211_change_iface(rdev, dev, type, NULL, &vifparams); 102 - cfg80211_unlock_rdev(rdev); 103 - 104 - return ret; 101 + return cfg80211_change_iface(rdev, dev, type, NULL, &vifparams); 105 102 } 106 103 EXPORT_SYMBOL_GPL(cfg80211_wext_siwmode); 107 104 ··· 574 579 { 575 580 int err; 576 581 577 - /* devlist mutex needed for possible IBSS re-join */ 578 - mutex_lock(&rdev->devlist_mtx); 579 582 wdev_lock(dev->ieee80211_ptr); 580 583 err = __cfg80211_set_encryption(rdev, dev, pairwise, addr, 581 584 remove, tx_key, idx, params); 582 585 wdev_unlock(dev->ieee80211_ptr); 583 - mutex_unlock(&rdev->devlist_mtx); 584 586 585 587 return err; 586 588 } ··· 779 787 struct cfg80211_chan_def chandef = { 780 788 .width = NL80211_CHAN_WIDTH_20_NOHT, 781 789 }; 782 - int freq, err; 790 + int freq; 783 791 784 792 switch (wdev->iftype) { 785 793 case NL80211_IFTYPE_STATION: ··· 796 804 chandef.chan = ieee80211_get_channel(&rdev->wiphy, freq); 797 805 if (!chandef.chan) 798 806 return -EINVAL; 799 - mutex_lock(&rdev->devlist_mtx); 800 - err = cfg80211_set_monitor_channel(rdev, &chandef); 801 - mutex_unlock(&rdev->devlist_mtx); 802 - return err; 807 + return cfg80211_set_monitor_channel(rdev, &chandef); 803 808 case NL80211_IFTYPE_MESH_POINT: 804 809 freq = cfg80211_wext_freq(wdev->wiphy, wextfreq); 805 810 if (freq < 0) ··· 807 818 chandef.chan = ieee80211_get_channel(&rdev->wiphy, freq); 808 819 if (!chandef.chan) 809 820 return -EINVAL; 810 - mutex_lock(&rdev->devlist_mtx); 811 - err = cfg80211_set_mesh_channel(rdev, wdev, &chandef); 812 - mutex_unlock(&rdev->devlist_mtx); 813 - return err; 821 + return cfg80211_set_mesh_channel(rdev, wdev, &chandef); 814 822 default: 815 823 return -EOPNOTSUPP; 816 824 }
+11 -30
net/wireless/wext-sme.c
··· 54 54 if (wdev->wext.prev_bssid_valid) 55 55 prev_bssid = wdev->wext.prev_bssid; 56 56 57 - err = __cfg80211_connect(rdev, wdev->netdev, 58 - &wdev->wext.connect, ck, prev_bssid); 57 + err = cfg80211_connect(rdev, wdev->netdev, 58 + &wdev->wext.connect, ck, prev_bssid); 59 59 if (err) 60 60 kfree(ck); 61 61 ··· 87 87 return -EINVAL; 88 88 } 89 89 90 - cfg80211_lock_rdev(rdev); 91 - mutex_lock(&rdev->devlist_mtx); 92 - mutex_lock(&rdev->sched_scan_mtx); 93 90 wdev_lock(wdev); 94 91 95 92 if (wdev->sme_state != CFG80211_SME_IDLE) { ··· 100 103 /* if SSID set, we'll try right again, avoid event */ 101 104 if (wdev->wext.connect.ssid_len) 102 105 event = false; 103 - err = __cfg80211_disconnect(rdev, dev, 104 - WLAN_REASON_DEAUTH_LEAVING, event); 106 + err = cfg80211_disconnect(rdev, dev, 107 + WLAN_REASON_DEAUTH_LEAVING, event); 105 108 if (err) 106 109 goto out; 107 110 } ··· 133 136 err = cfg80211_mgd_wext_connect(rdev, wdev); 134 137 out: 135 138 wdev_unlock(wdev); 136 - mutex_unlock(&rdev->sched_scan_mtx); 137 - mutex_unlock(&rdev->devlist_mtx); 138 - cfg80211_unlock_rdev(rdev); 139 139 return err; 140 140 } 141 141 ··· 184 190 if (len > 0 && ssid[len - 1] == '\0') 185 191 len--; 186 192 187 - cfg80211_lock_rdev(rdev); 188 - mutex_lock(&rdev->devlist_mtx); 189 - mutex_lock(&rdev->sched_scan_mtx); 190 193 wdev_lock(wdev); 191 194 192 195 err = 0; ··· 199 208 /* if SSID set now, we'll try to connect, avoid event */ 200 209 if (len) 201 210 event = false; 202 - err = __cfg80211_disconnect(rdev, dev, 203 - WLAN_REASON_DEAUTH_LEAVING, event); 211 + err = cfg80211_disconnect(rdev, dev, 212 + WLAN_REASON_DEAUTH_LEAVING, event); 204 213 if (err) 205 214 goto out; 206 215 } ··· 217 226 err = cfg80211_mgd_wext_connect(rdev, wdev); 218 227 out: 219 228 wdev_unlock(wdev); 220 - mutex_unlock(&rdev->sched_scan_mtx); 221 - mutex_unlock(&rdev->devlist_mtx); 222 - cfg80211_unlock_rdev(rdev); 223 229 return err; 224 230 } 225 231 ··· 275 287 if (is_zero_ether_addr(bssid) || is_broadcast_ether_addr(bssid)) 276 288 bssid = NULL; 277 289 278 - cfg80211_lock_rdev(rdev); 279 - mutex_lock(&rdev->devlist_mtx); 280 - mutex_lock(&rdev->sched_scan_mtx); 281 290 wdev_lock(wdev); 282 291 283 292 if (wdev->sme_state != CFG80211_SME_IDLE) { ··· 288 303 ether_addr_equal(bssid, wdev->wext.connect.bssid)) 289 304 goto out; 290 305 291 - err = __cfg80211_disconnect(rdev, dev, 292 - WLAN_REASON_DEAUTH_LEAVING, false); 306 + err = cfg80211_disconnect(rdev, dev, 307 + WLAN_REASON_DEAUTH_LEAVING, false); 293 308 if (err) 294 309 goto out; 295 310 } ··· 303 318 err = cfg80211_mgd_wext_connect(rdev, wdev); 304 319 out: 305 320 wdev_unlock(wdev); 306 - mutex_unlock(&rdev->sched_scan_mtx); 307 - mutex_unlock(&rdev->devlist_mtx); 308 - cfg80211_unlock_rdev(rdev); 309 321 return err; 310 322 } 311 323 ··· 365 383 wdev->wext.ie_len = ie_len; 366 384 367 385 if (wdev->sme_state != CFG80211_SME_IDLE) { 368 - err = __cfg80211_disconnect(rdev, dev, 369 - WLAN_REASON_DEAUTH_LEAVING, false); 386 + err = cfg80211_disconnect(rdev, dev, 387 + WLAN_REASON_DEAUTH_LEAVING, false); 370 388 if (err) 371 389 goto out; 372 390 } ··· 402 420 switch (mlme->cmd) { 403 421 case IW_MLME_DEAUTH: 404 422 case IW_MLME_DISASSOC: 405 - err = __cfg80211_disconnect(rdev, dev, mlme->reason_code, 406 - true); 423 + err = cfg80211_disconnect(rdev, dev, mlme->reason_code, true); 407 424 break; 408 425 default: 409 426 err = -EOPNOTSUPP;