Chromium Code Reviews| Index: net/base/net_util_win.cc |
| diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc |
| index cac92e39d54bbb391814190d1faf0ed440c61848..0fdef0b3744cd6ee39438506107afa7534ccbf39 100644 |
| --- a/net/base/net_util_win.cc |
| +++ b/net/base/net_util_win.cc |
| @@ -36,6 +36,8 @@ struct WlanApi { |
| typedef DWORD (WINAPI *WlanQueryInterfaceFunc)( |
| HANDLE, const GUID*, WLAN_INTF_OPCODE, VOID*, DWORD*, VOID**, |
| WLAN_OPCODE_VALUE_TYPE*); |
| + typedef DWORD (WINAPI *WlanSetInterfaceFunc)( |
| + HANDLE, const GUID*, WLAN_INTF_OPCODE, DWORD, const VOID*, VOID*); |
| typedef VOID (WINAPI *WlanFreeMemoryFunc)(VOID*); |
| typedef DWORD (WINAPI *WlanCloseHandleFunc)(HANDLE, VOID*); |
| @@ -54,6 +56,8 @@ struct WlanApi { |
| ::GetProcAddress(module, "WlanEnumInterfaces")); |
| query_interface_func = reinterpret_cast<WlanQueryInterfaceFunc>( |
| ::GetProcAddress(module, "WlanQueryInterface")); |
| + set_interface_func = reinterpret_cast<WlanSetInterfaceFunc>( |
| + ::GetProcAddress(module, "WlanSetInterface")); |
| free_memory_func = reinterpret_cast<WlanFreeMemoryFunc>( |
| ::GetProcAddress(module, "WlanFreeMemory")); |
| close_handle_func = reinterpret_cast<WlanCloseHandleFunc>( |
| @@ -78,6 +82,7 @@ struct WlanApi { |
| WlanOpenHandleFunc open_handle_func; |
| WlanEnumInterfacesFunc enum_interfaces_func; |
| WlanQueryInterfaceFunc query_interface_func; |
| + WlanSetInterfaceFunc set_interface_func; |
| WlanFreeMemoryFunc free_memory_func; |
| WlanCloseHandleFunc close_handle_func; |
| bool initialized; |
| @@ -102,6 +107,35 @@ NetworkChangeNotifier::ConnectionType GetNetworkInterfaceType(DWORD ifType) { |
| return type; |
| } |
| +base::LazyInstance<WlanApi>::Leaky lazy_wlanapi = |
| + LAZY_INSTANCE_INITIALIZER; |
| + |
| +struct WlanApiHandleTraits { |
| + typedef HANDLE Handle; |
| + |
| + static bool CloseHandle(HANDLE handle) { |
| + return lazy_wlanapi.Get().close_handle_func(handle, NULL) == |
| + ERROR_SUCCESS; |
|
pauljensen
2014/09/18 14:16:50
Please put this on the previous line.
hubbe
2014/09/18 18:21:05
Done.
|
| + } |
| + static bool IsHandleValid(HANDLE handle) { |
| + return base::win::HandleTraits::IsHandleValid(handle); |
| + } |
| + static HANDLE NullHandle() { |
| + return base::win::HandleTraits::NullHandle(); |
| + } |
| +}; |
| + |
|
pauljensen
2014/09/18 14:16:50
Remove the extra line.
hubbe
2014/09/18 18:21:05
Done.
|
| + |
| +typedef base::win::GenericScopedHandle< |
| + WlanApiHandleTraits, |
| + base::win::DummyVerifierTraits> WlanHandle; |
| + |
| +struct WlanApiDeleter { |
| + inline void operator()(void* ptr) const { |
| + lazy_wlanapi.Get().free_memory_func(ptr); |
| + } |
| +}; |
| + |
| } // namespace |
| bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
| @@ -216,34 +250,6 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
| } |
| WifiPHYLayerProtocol GetWifiPHYLayerProtocol() { |
| - static base::LazyInstance<WlanApi>::Leaky lazy_wlanapi = |
| - LAZY_INSTANCE_INITIALIZER; |
| - |
| - struct WlanApiHandleTraits { |
| - typedef HANDLE Handle; |
| - |
| - static bool CloseHandle(HANDLE handle) { |
| - return lazy_wlanapi.Get().close_handle_func(handle, NULL) == |
| - ERROR_SUCCESS; |
| - } |
| - static bool IsHandleValid(HANDLE handle) { |
| - return base::win::HandleTraits::IsHandleValid(handle); |
| - } |
| - static HANDLE NullHandle() { |
| - return base::win::HandleTraits::NullHandle(); |
| - } |
| - }; |
| - |
| - typedef base::win::GenericScopedHandle< |
| - WlanApiHandleTraits, |
| - base::win::DummyVerifierTraits> WlanHandle; |
| - |
| - struct WlanApiDeleter { |
| - inline void operator()(void* ptr) const { |
| - lazy_wlanapi.Get().free_memory_func(ptr); |
| - } |
| - }; |
| - |
| const WlanApi& wlanapi = lazy_wlanapi.Get(); |
| if (!wlanapi.initialized) |
| return WIFI_PHY_LAYER_PROTOCOL_NONE; |
| @@ -306,4 +312,60 @@ WifiPHYLayerProtocol GetWifiPHYLayerProtocol() { |
| } |
| } |
| +// Note: There is no need to explicitly set the options back |
| +// as the OS will automatically set them back when the WlanHandle |
| +// is closed. |
| +class WifiOptionSetter : public ScopedWifiOptions { |
| + public: |
| + WifiOptionSetter(int options) { |
| + const WlanApi& wlanapi = lazy_wlanapi.Get(); |
| + if (!wlanapi.initialized) |
| + return; |
| + |
| + DWORD cur_version = 0; |
| + const DWORD kMaxClientVersion = 2; |
| + DWORD result = wlanapi.OpenHandle( |
| + kMaxClientVersion, &cur_version, &client_); |
| + if (result != ERROR_SUCCESS) |
| + return; |
| + |
| + WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL; |
| + result = wlanapi.enum_interfaces_func(client_, NULL, &interface_list_ptr); |
| + if (result != ERROR_SUCCESS) |
| + return; |
| + scoped_ptr<WLAN_INTERFACE_INFO_LIST, WlanApiDeleter> interface_list( |
| + interface_list_ptr); |
| + |
| + for (unsigned i = 0; i < interface_list->dwNumberOfItems; ++i) { |
| + WLAN_INTERFACE_INFO* info = &interface_list->InterfaceInfo[i]; |
| + if (options & WIFI_OPTIONS_DISABLE_SCAN) { |
| + BOOL data = false; |
| + wlanapi.set_interface_func(client_, |
| + &info->InterfaceGuid, |
| + wlan_intf_opcode_background_scan_enabled, |
| + sizeof(data), |
| + &data, |
| + NULL); |
| + } |
| + if (options & WIFI_OPTIONS_MEDIA_STREAMING_MODE) { |
| + BOOL data = true; |
| + wlanapi.set_interface_func(client_, |
| + &info->InterfaceGuid, |
| + wlan_intf_opcode_media_streaming_mode, |
| + sizeof(data), |
| + &data, |
| + NULL); |
| + } |
| + } |
| + } |
| + |
| + private: |
| + WlanHandle client_; |
| +}; |
| + |
| +scoped_ptr<ScopedWifiOptions> SetWifiOptions(int options) { |
| + return scoped_ptr<ScopedWifiOptions>( |
| + new WifiOptionSetter(options)); |
|
pauljensen
2014/09/18 14:16:50
Please put this on the previous line.
hubbe
2014/09/18 18:21:05
Done.
|
| +} |
| + |
| } // namespace net |