diff options
author | Roshan Pius <rpius@google.com> | 2020-03-30 21:44:47 -0700 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2020-03-31 14:30:10 -0700 |
commit | bd16d74680d652c9f48fd3dafb9149e6cedda9af (patch) | |
tree | 0b95120921fcc956204244997024f350b2b731ec /service | |
parent | b98ca721f6efed2fe85c07153e05e6410e741af4 (diff) |
WifiShellCommand: Add cmds for adding/removing NetworkRequest with specifier
Note that this needs rooted shell. This is because the 'shell' uid uses
'android' as package name which is also used by 'system' uid. This
results in a failure in AppOpsManager.checkPackage() in
ConnectivityService.
Bug: 152299953
Test: Manual Steps to connect to a network via network request
adb root
abd shell cmd wifi add-request <ssid> open
Manual UI approval
abd shell cmd wifi remove-request <ssid>
abd shell cmd wifi add-request <ssid> wpa2 <passphrase>
Manual UI approval
abd shell cmd wifi remove-request <ssid>
Change-Id: If7ee6b0b5753fa5b940469cd1fe661ba8c35931f
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/WifiShellCommand.java | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java index eb4210f27..5fa0490e8 100644 --- a/service/java/com/android/server/wifi/WifiShellCommand.java +++ b/service/java/com/android/server/wifi/WifiShellCommand.java @@ -16,16 +16,21 @@ package com.android.server.wifi; +import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; +import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; import android.content.Context; import android.content.pm.ParceledListSlice; +import android.net.ConnectivityManager; +import android.net.NetworkRequest; import android.net.wifi.IActionListener; import android.net.wifi.ScanResult; import android.net.wifi.SoftApConfiguration; import android.net.wifi.SupplicantState; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; +import android.net.wifi.WifiNetworkSpecifier; import android.net.wifi.WifiNetworkSuggestion; import android.net.wifi.WifiScanner; import android.net.wifi.nl80211.WifiNl80211Manager; @@ -35,6 +40,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.text.TextUtils; +import android.util.Pair; import com.android.server.wifi.util.ApConfigUtil; import com.android.server.wifi.util.ArrayUtils; @@ -44,7 +50,9 @@ import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -84,6 +92,9 @@ public class WifiShellCommand extends BasicShellCommandHandler { "status", }; + private static final Map<String, Pair<NetworkRequest, ConnectivityManager.NetworkCallback>> + sActiveRequests = new ConcurrentHashMap<>(); + private final ClientModeImpl mClientModeImpl; private final WifiLockManager mWifiLockManager; private final WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager; @@ -94,6 +105,7 @@ public class WifiShellCommand extends BasicShellCommandHandler { private final WifiLastResortWatchdog mWifiLastResortWatchdog; private final WifiServiceImpl mWifiService; private final Context mContext; + private final ConnectivityManager mConnectivityManager; WifiShellCommand(WifiInjector wifiInjector, WifiServiceImpl wifiService, Context context) { mClientModeImpl = wifiInjector.getClientModeImpl(); @@ -106,6 +118,7 @@ public class WifiShellCommand extends BasicShellCommandHandler { mWifiLastResortWatchdog = wifiInjector.getWifiLastResortWatchdog(); mWifiService = wifiService; mContext = context; + mConnectivityManager = context.getSystemService(ConnectivityManager.class); } @Override @@ -589,6 +602,53 @@ public class WifiShellCommand extends BasicShellCommandHandler { } } break; + case "add-request": { + NetworkRequest networkRequest = buildNetworkRequest(pw); + ConnectivityManager.NetworkCallback networkCallback = + new ConnectivityManager.NetworkCallback(); + pw.println("Adding request: " + networkRequest); + mConnectivityManager.requestNetwork(networkRequest, networkCallback); + String ssid = getAllArgs()[1]; + sActiveRequests.put(ssid, Pair.create(networkRequest, networkCallback)); + break; + } + case "remove-request": { + String ssid = getNextArgRequired(); + Pair<NetworkRequest, ConnectivityManager.NetworkCallback> nrAndNc = + sActiveRequests.remove(ssid); + if (nrAndNc == null) { + pw.println("No matching request to remove"); + return -1; + } + pw.println("Removing request: " + nrAndNc.first); + mConnectivityManager.unregisterNetworkCallback(nrAndNc.second); + break; + } + case "remove-all-requests": + if (sActiveRequests.isEmpty()) { + pw.println("No active requests"); + return -1; + } + for (Pair<NetworkRequest, ConnectivityManager.NetworkCallback> nrAndNc + : sActiveRequests.values()) { + pw.println("Removing request: " + nrAndNc.first); + mConnectivityManager.unregisterNetworkCallback(nrAndNc.second); + } + sActiveRequests.clear(); + break; + case "list-requests": + if (sActiveRequests.isEmpty()) { + pw.println("No active requests"); + } else { + pw.println("SSID NetworkRequest"); + for (Map.Entry<String, + Pair<NetworkRequest, ConnectivityManager.NetworkCallback>> entry : + sActiveRequests.entrySet()) { + pw.println(String.format("%-32s %-4s", + entry.getKey(), entry.getValue().first)); + } + } + break; default: return handleDefaultCommands(cmd); } @@ -620,6 +680,31 @@ public class WifiShellCommand extends BasicShellCommandHandler { return suggestionBuilder.build(); } + private NetworkRequest buildNetworkRequest(PrintWriter pw) { + String ssid = getNextArgRequired(); + String type = getNextArgRequired(); + WifiNetworkSpecifier.Builder specifierBuilder = + new WifiNetworkSpecifier.Builder(); + specifierBuilder.setSsid(ssid); + if (TextUtils.equals(type, "wpa3")) { + specifierBuilder.setWpa3Passphrase(getNextArgRequired()); + } else if (TextUtils.equals(type, "wpa2")) { + specifierBuilder.setWpa2Passphrase(getNextArgRequired()); + } else if (TextUtils.equals(type, "owe")) { + specifierBuilder.setIsEnhancedOpen(true); + } else if (TextUtils.equals(type, "open")) { + // nothing to do. + } else { + pw.println("Unknown network type " + type); + return null; + } + return new NetworkRequest.Builder() + .addTransportType(TRANSPORT_WIFI) + .removeCapability(NET_CAPABILITY_INTERNET) + .setNetworkSpecifier(specifierBuilder.build()) + .build(); + } + private int sendLinkProbe(PrintWriter pw) throws InterruptedException { // Note: should match WifiNl80211Manager#SEND_MGMT_FRAME_TIMEOUT_MS final int sendMgmtFrameTimeoutMs = 1000; @@ -771,6 +856,22 @@ public class WifiShellCommand extends BasicShellCommandHandler { pw.println(" and/or 'wifi_softap_wpa3_sae_supported', each on a separate line."); pw.println(" settings-reset"); pw.println(" Initiates wifi settings reset"); + pw.println(" add-request <ssid> open|owe|wpa2|wpa3 [<passphrase>]"); + pw.println(" Add a network request with provided params"); + pw.println(" <ssid> - SSID of the network"); + pw.println(" open|owe|wpa2|wpa3 - Security type of the network."); + pw.println(" - Use 'open' or 'owe' for networks with no passphrase"); + pw.println(" - 'open' - Open networks (Most prevalent)"); + pw.println(" - 'owe' - Enhanced open networks"); + pw.println(" - Use 'wpa2' or 'wpa3' for networks with passphrase"); + pw.println(" - 'wpa2' - WPA-2 PSK networks (Most prevalent)"); + pw.println(" - 'wpa3' - WPA-3 PSK networks"); + pw.println(" remove-request <ssid>"); + pw.println(" Remove a network request with provided SSID of the network"); + pw.println(" remove-all-requests"); + pw.println(" Removes all active requests added via shell"); + pw.println(" list-requests"); + pw.println(" Lists the requested networks added via shell"); } @Override |