Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Unified Diff: net/base/net_util_win.cc

Issue 566243005: Cast: Allow extension to control wifi options on windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: less base Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« net/base/net_util_unittest.cc ('K') | « net/base/net_util_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« net/base/net_util_unittest.cc ('K') | « net/base/net_util_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698