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 |