Loading core/java/android/net/ConnectivityManager.java +3 −7 Original line number Diff line number Diff line Loading @@ -3121,8 +3121,6 @@ public class ConnectivityManager { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public int registerNetworkProvider(@NonNull NetworkProvider provider) { if (provider.getProviderId() != NetworkProvider.ID_NONE) { // TODO: Provide a better method for checking this by moving NetworkFactory.SerialNumber // out of NetworkFactory. throw new IllegalStateException("NetworkProviders can only be registered once"); } Loading Loading @@ -3176,8 +3174,7 @@ public class ConnectivityManager { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkMisc misc) { return registerNetworkAgent(messenger, ni, lp, nc, score, misc, NetworkFactory.SerialNumber.NONE); return registerNetworkAgent(messenger, ni, lp, nc, score, misc, NetworkProvider.ID_NONE); } /** Loading @@ -3187,10 +3184,9 @@ public class ConnectivityManager { */ @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) { NetworkCapabilities nc, int score, NetworkMisc misc, int providerId) { try { return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc, factorySerialNumber); return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc, providerId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading core/java/android/net/NetworkAgent.java +8 −9 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ public abstract class NetworkAgent extends Handler { private static final long BW_REFRESH_MIN_WIN_MS = 500; private boolean mPollLceScheduled = false; private AtomicBoolean mPollLcePending = new AtomicBoolean(false); public final int mFactorySerialNumber; public final int mProviderId; private static final int BASE = Protocol.BASE_NETWORK_AGENT; Loading Loading @@ -219,25 +219,25 @@ public abstract class NetworkAgent extends Handler { // the entire tree. public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { this(looper, context, logTag, ni, nc, lp, score, null, NetworkFactory.SerialNumber.NONE); this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE); } public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { this(looper, context, logTag, ni, nc, lp, score, misc, NetworkFactory.SerialNumber.NONE); this(looper, context, logTag, ni, nc, lp, score, misc, NetworkProvider.ID_NONE); } public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, int factorySerialNumber) { this(looper, context, logTag, ni, nc, lp, score, null, factorySerialNumber); NetworkCapabilities nc, LinkProperties lp, int score, int providerId) { this(looper, context, logTag, ni, nc, lp, score, null, providerId); } public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc, int factorySerialNumber) { int providerId) { super(looper); LOG_TAG = logTag; mContext = context; mFactorySerialNumber = factorySerialNumber; mProviderId = providerId; if (ni == null || nc == null || lp == null) { throw new IllegalArgumentException(); } Loading @@ -246,8 +246,7 @@ public abstract class NetworkAgent extends Handler { ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE); netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni), new LinkProperties(lp), new NetworkCapabilities(nc), score, misc, factorySerialNumber); new LinkProperties(lp), new NetworkCapabilities(nc), score, misc, providerId); } @Override Loading core/java/android/net/NetworkFactory.java +9 −12 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ public class NetworkFactory extends Handler { * with the same NetworkRequest but an updated score. * Also, network conditions may change for this bearer * allowing for a better score in the future. * msg.arg2 = the serial number of the factory currently responsible for the * msg.arg2 = the ID of the NetworkProvider currently responsible for the * NetworkAgent handling this request, or NetworkProvider.ID_NONE if none. */ public static final int CMD_REQUEST_NETWORK = BASE; Loading Loading @@ -156,8 +156,8 @@ public class NetworkFactory extends Handler { mProvider = new NetworkProvider(mContext, NetworkFactory.this.getLooper(), LOG_TAG) { @Override public void onNetworkRequested(@NonNull NetworkRequest request, int score, int servingFactoryProviderId) { handleAddRequest((NetworkRequest) request, score, servingFactoryProviderId); int servingProviderId) { handleAddRequest((NetworkRequest) request, score, servingProviderId); } @Override Loading Loading @@ -228,8 +228,6 @@ public class NetworkFactory extends Handler { * * @param request the request to handle. * @param score the score of the NetworkAgent currently satisfying this request. * @param servingProviderId the serial number of the NetworkFactory that * created the NetworkAgent currently satisfying this request. */ // TODO : remove this method. It is a stopgap measure to help sheperding a number // of dependent changes that would conflict throughout the automerger graph. Having this Loading @@ -237,7 +235,7 @@ public class NetworkFactory extends Handler { // the entire tree. @VisibleForTesting protected void handleAddRequest(NetworkRequest request, int score) { handleAddRequest(request, score, SerialNumber.NONE); handleAddRequest(request, score, NetworkProvider.ID_NONE); } /** Loading @@ -246,24 +244,23 @@ public class NetworkFactory extends Handler { * * @param request the request to handle. * @param score the score of the NetworkAgent currently satisfying this request. * @param servingProviderId the serial number of the NetworkFactory that * created the NetworkAgent currently satisfying this request. * @param servingProviderId the ID of the NetworkProvider that created the NetworkAgent * currently satisfying this request. */ @VisibleForTesting protected void handleAddRequest(NetworkRequest request, int score, int servingProviderId) { protected void handleAddRequest(NetworkRequest request, int score, int servingProviderId) { NetworkRequestInfo n = mNetworkRequests.get(request.requestId); if (n == null) { if (DBG) { log("got request " + request + " with score " + score + " and serial " + servingProviderId); + " and providerId " + servingProviderId); } n = new NetworkRequestInfo(request, score, servingProviderId); mNetworkRequests.put(n.request.requestId, n); } else { if (VDBG) { log("new score " + score + " for exisiting request " + request + " with serial " + servingProviderId); + " and providerId " + servingProviderId); } n.score = score; n.providerId = servingProviderId; Loading services/core/java/com/android/server/ConnectivityService.java +68 −67 Original line number Diff line number Diff line Loading @@ -366,10 +366,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_PROXY_HAS_CHANGED = 16; /** * used internally when registering NetworkFactories * obj = NetworkFactoryInfo * used internally when registering NetworkProviders * obj = NetworkProviderInfo */ private static final int EVENT_REGISTER_NETWORK_FACTORY = 17; private static final int EVENT_REGISTER_NETWORK_PROVIDER = 17; /** * used internally when registering NetworkAgents Loading Loading @@ -405,10 +405,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_RELEASE_NETWORK_REQUEST = 22; /** * used internally when registering NetworkFactories * used internally when registering NetworkProviders * obj = Messenger */ private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23; private static final int EVENT_UNREGISTER_NETWORK_PROVIDER = 23; /** * used internally to expire a wakelock when transitioning Loading Loading @@ -2387,9 +2387,9 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } pw.print("NetworkFactories for:"); for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { pw.print(" " + nfi.name); pw.print("NetworkProviders for:"); for (NetworkProviderInfo npi : mNetworkProviderInfos.values()) { pw.print(" " + npi.name); } pw.println(); pw.println(); Loading Loading @@ -2720,7 +2720,7 @@ public class ConnectivityService extends IConnectivityManager.Stub nai.lastValidated = valid; nai.everValidated |= valid; updateCapabilities(oldScore, nai, nai.networkCapabilities); // If score has changed, rebroadcast to NetworkFactories. b/17726566 // If score has changed, rebroadcast to NetworkProviders. b/17726566 if (oldScore != nai.getCurrentScore()) sendUpdatedScoreToFactories(nai); if (valid) { handleFreshlyValidatedNetwork(nai); Loading Loading @@ -2835,6 +2835,7 @@ public class ConnectivityService extends IConnectivityManager.Stub return true; } // TODO: delete when direct use of registerNetworkFactory is no longer supported. private boolean maybeHandleNetworkFactoryMessage(Message msg) { switch (msg.what) { default: Loading Loading @@ -3024,16 +3025,16 @@ public class ConnectivityService extends IConnectivityManager.Stub private void handleAsyncChannelHalfConnect(Message msg) { ensureRunningOnConnectivityServiceThread(); final AsyncChannel ac = (AsyncChannel) msg.obj; if (mNetworkFactoryInfos.containsKey(msg.replyTo)) { if (mNetworkProviderInfos.containsKey(msg.replyTo)) { if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { if (VDBG) log("NetworkFactory connected"); // Finish setting up the full connection NetworkFactoryInfo nfi = mNetworkFactoryInfos.get(msg.replyTo); nfi.completeConnection(); sendAllRequestsToFactory(nfi); NetworkProviderInfo npi = mNetworkProviderInfos.get(msg.replyTo); npi.completeConnection(); sendAllRequestsToProvider(npi); } else { loge("Error connecting NetworkFactory"); mNetworkFactoryInfos.remove(msg.obj); mNetworkProviderInfos.remove(msg.obj); } } else if (mNetworkAgentInfos.containsKey(msg.replyTo)) { if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { Loading Loading @@ -3065,8 +3066,8 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai != null) { disconnectAndDestroyNetwork(nai); } else { NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo); if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name); NetworkProviderInfo npi = mNetworkProviderInfos.remove(msg.replyTo); if (DBG && npi != null) log("unregisterNetworkFactory for " + npi.name); } } Loading Loading @@ -3149,7 +3150,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // ip[6]tables to flush routes and remove the incoming packet mark rule, so do it // after we've rematched networks with requests which should make a potential // fallback network the default or requested a new network from the // NetworkFactories, so network traffic isn't interrupted for an unnecessarily // NetworkProviders, so network traffic isn't interrupted for an unnecessarily // long time. destroyNativeNetwork(nai); mDnsManager.removeNetwork(nai.network); Loading Loading @@ -3412,8 +3413,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } } for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { nfi.cancelRequest(nri.request); for (NetworkProviderInfo npi : mNetworkProviderInfos.values()) { npi.cancelRequest(nri.request); } } else { // listens don't have a singular affectedNetwork. Check all networks to see Loading Loading @@ -3848,12 +3849,12 @@ public class ConnectivityService extends IConnectivityManager.Stub handleApplyDefaultProxy((ProxyInfo)msg.obj); break; } case EVENT_REGISTER_NETWORK_FACTORY: { handleRegisterNetworkFactory((NetworkFactoryInfo)msg.obj); case EVENT_REGISTER_NETWORK_PROVIDER: { handleRegisterNetworkProvider((NetworkProviderInfo) msg.obj); break; } case EVENT_UNREGISTER_NETWORK_FACTORY: { handleUnregisterNetworkFactory((Messenger)msg.obj); case EVENT_UNREGISTER_NETWORK_PROVIDER: { handleUnregisterNetworkProvider((Messenger) msg.obj); break; } case EVENT_REGISTER_NETWORK_AGENT: { Loading Loading @@ -4898,7 +4899,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } }; private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos = new HashMap<>(); private final HashMap<Messenger, NetworkProviderInfo> mNetworkProviderInfos = new HashMap<>(); private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests = new HashMap<>(); private static final int MAX_NETWORK_REQUESTS_PER_UID = 100; Loading @@ -4906,18 +4907,18 @@ public class ConnectivityService extends IConnectivityManager.Stub @GuardedBy("mUidToNetworkRequestCount") private final SparseIntArray mUidToNetworkRequestCount = new SparseIntArray(); private static class NetworkFactoryInfo { private static class NetworkProviderInfo { public final String name; public final Messenger messenger; private final AsyncChannel mAsyncChannel; private final IBinder.DeathRecipient mDeathRecipient; public final int factorySerialNumber; public final int providerId; NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel, int factorySerialNumber, IBinder.DeathRecipient deathRecipient) { NetworkProviderInfo(String name, Messenger messenger, AsyncChannel asyncChannel, int providerId, IBinder.DeathRecipient deathRecipient) { this.name = name; this.messenger = messenger; this.factorySerialNumber = factorySerialNumber; this.providerId = providerId; mAsyncChannel = asyncChannel; mDeathRecipient = deathRecipient; Loading @@ -4935,17 +4936,17 @@ public class ConnectivityService extends IConnectivityManager.Stub messenger.send(Message.obtain(null /* handler */, what, arg1, arg2, obj)); } catch (RemoteException e) { // Remote process died. Ignore; the death recipient will remove this // NetworkFactoryInfo from mNetworkFactoryInfos. // NetworkProviderInfo from mNetworkProviderInfos. } } void requestNetwork(NetworkRequest request, int score, int servingSerialNumber) { void requestNetwork(NetworkRequest request, int score, int servingProviderId) { if (isLegacyNetworkFactory()) { mAsyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, servingSerialNumber, request); servingProviderId, request); } else { sendMessageToNetworkProvider(NetworkProvider.CMD_REQUEST_NETWORK, score, servingSerialNumber, request); servingProviderId, request); } } Loading Loading @@ -5358,45 +5359,45 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public int registerNetworkFactory(Messenger messenger, String name) { enforceNetworkFactoryPermission(); NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(), NetworkProviderInfo npi = new NetworkProviderInfo(name, messenger, new AsyncChannel(), nextNetworkProviderId(), null /* deathRecipient */); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi)); return nfi.factorySerialNumber; mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_PROVIDER, npi)); return npi.providerId; } private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) { if (mNetworkFactoryInfos.containsKey(nfi.messenger)) { private void handleRegisterNetworkProvider(NetworkProviderInfo npi) { if (mNetworkProviderInfos.containsKey(npi.messenger)) { // Avoid creating duplicates. even if an app makes a direct AIDL call. // This will never happen if an app calls ConnectivityManager#registerNetworkProvider, // as that will throw if a duplicate provider is registered. Slog.e(TAG, "Attempt to register existing NetworkFactoryInfo " + mNetworkFactoryInfos.get(nfi.messenger).name); Slog.e(TAG, "Attempt to register existing NetworkProviderInfo " + mNetworkProviderInfos.get(npi.messenger).name); return; } if (DBG) log("Got NetworkFactory Messenger for " + nfi.name); mNetworkFactoryInfos.put(nfi.messenger, nfi); nfi.connect(mContext, mTrackerHandler); if (!nfi.isLegacyNetworkFactory()) { if (DBG) log("Got NetworkProvider Messenger for " + npi.name); mNetworkProviderInfos.put(npi.messenger, npi); npi.connect(mContext, mTrackerHandler); if (!npi.isLegacyNetworkFactory()) { // Legacy NetworkFactories get their requests when their AsyncChannel connects. sendAllRequestsToFactory(nfi); sendAllRequestsToProvider(npi); } } @Override public int registerNetworkProvider(Messenger messenger, String name) { enforceNetworkFactoryPermission(); NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, NetworkProviderInfo npi = new NetworkProviderInfo(name, messenger, null /* asyncChannel */, nextNetworkProviderId(), () -> unregisterNetworkProvider(messenger)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi)); return nfi.factorySerialNumber; mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_PROVIDER, npi)); return npi.providerId; } @Override public void unregisterNetworkProvider(Messenger messenger) { enforceNetworkFactoryPermission(); mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_FACTORY, messenger)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_PROVIDER, messenger)); } @Override Loading @@ -5404,13 +5405,13 @@ public class ConnectivityService extends IConnectivityManager.Stub unregisterNetworkProvider(messenger); } private void handleUnregisterNetworkFactory(Messenger messenger) { NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(messenger); if (nfi == null) { loge("Failed to find Messenger in unregisterNetworkFactory"); private void handleUnregisterNetworkProvider(Messenger messenger) { NetworkProviderInfo npi = mNetworkProviderInfos.remove(messenger); if (npi == null) { loge("Failed to find Messenger in unregisterNetworkProvider"); return; } if (DBG) log("unregisterNetworkFactory for " + nfi.name); if (DBG) log("unregisterNetworkProvider for " + npi.name); } @Override Loading Loading @@ -5484,7 +5485,7 @@ public class ConnectivityService extends IConnectivityManager.Stub LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc) { return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities, currentScore, networkMisc, NetworkFactory.SerialNumber.NONE); currentScore, networkMisc, NetworkProvider.ID_NONE); } /** Loading @@ -5500,11 +5501,11 @@ public class ConnectivityService extends IConnectivityManager.Stub * @param currentScore the initial score of the network. See * {@link NetworkAgentInfo#getCurrentScore}. * @param networkMisc metadata about the network. This is never updated. * @param factorySerialNumber the serial number of the factory owning this NetworkAgent. * @param providerId the ID of the provider owning this NetworkAgent. */ public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc, int factorySerialNumber) { int currentScore, NetworkMisc networkMisc, int providerId) { enforceNetworkFactoryPermission(); LinkProperties lp = new LinkProperties(linkProperties); Loading @@ -5517,7 +5518,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc, ns, mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mDnsResolver, mNMS, factorySerialNumber); mDnsResolver, mNMS, providerId); // Make sure the network capabilities reflect what the agent info says. nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc)); final String extraInfo = networkInfo.getExtraInfo(); Loading Loading @@ -5796,7 +5797,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Once a NetworkAgent is connected, complain if some immutable capabilities are removed. // Don't complain for VPNs since they're not driven by requests and there is no risk of // causing a connect/teardown loop. // TODO: remove this altogether and make it the responsibility of the NetworkFactories to // TODO: remove this altogether and make it the responsibility of the NetworkProviders to // avoid connect/teardown loops. if (nai.everConnected && !nai.isVPN() && Loading Loading @@ -6036,13 +6037,13 @@ public class ConnectivityService extends IConnectivityManager.Stub if (VDBG || DDBG){ log("sending new Min Network Score(" + score + "): " + networkRequest.toString()); } for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { nfi.requestNetwork(networkRequest, score, serial); for (NetworkProviderInfo npi : mNetworkProviderInfos.values()) { npi.requestNetwork(networkRequest, score, serial); } } /** Sends all current NetworkRequests to the specified factory. */ private void sendAllRequestsToFactory(NetworkFactoryInfo nfi) { private void sendAllRequestsToProvider(NetworkProviderInfo npi) { ensureRunningOnConnectivityServiceThread(); for (NetworkRequestInfo nri : mNetworkRequests.values()) { if (nri.request.isListen()) continue; Loading @@ -6054,9 +6055,9 @@ public class ConnectivityService extends IConnectivityManager.Stub serial = nai.factorySerialNumber; } else { score = 0; serial = NetworkFactory.SerialNumber.NONE; serial = NetworkProvider.ID_NONE; } nfi.requestNetwork(nri.request, score, serial); npi.requestNetwork(nri.request, score, serial); } } Loading Loading @@ -6337,11 +6338,11 @@ public class ConnectivityService extends IConnectivityManager.Stub Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request); } addedRequests.add(nri); // Tell NetworkFactories about the new score, so they can stop // Tell NetworkProviders about the new score, so they can stop // trying to connect if they know they cannot match it. // TODO - this could get expensive if we have a lot of requests for this // network. Think about if there is a way to reduce this. Push // netid->request mapping to each factory? // netid->request mapping to each provider? sendUpdatedScoreToFactories(nri.request, newSatisfier); if (isDefaultRequest(nri)) { isNewDefault = true; Loading Loading @@ -6370,7 +6371,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } else { Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + newNetwork.name() + " without updating mSatisfier or factories!"); " without updating mSatisfier or providers!"); } // TODO: Technically, sending CALLBACK_LOST here is // incorrect if there is a replacement network currently Loading services/core/java/com/android/server/connectivity/Vpn.java +2 −2 Original line number Diff line number Diff line Loading @@ -54,10 +54,10 @@ import android.net.LocalSocketAddress; import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; import android.net.NetworkProvider; import android.net.RouteInfo; import android.net.UidRange; import android.net.VpnService; Loading Loading @@ -958,7 +958,7 @@ public class Vpn { mNetworkAgent = new NetworkAgent(mLooper, mContext, NETWORKTYPE /* logtag */, mNetworkInfo, mNetworkCapabilities, lp, ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc, NetworkFactory.SerialNumber.VPN) { NetworkProvider.ID_VPN) { @Override public void unwanted() { // We are user controlled, not driven by NetworkRequest. Loading Loading
core/java/android/net/ConnectivityManager.java +3 −7 Original line number Diff line number Diff line Loading @@ -3121,8 +3121,6 @@ public class ConnectivityManager { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public int registerNetworkProvider(@NonNull NetworkProvider provider) { if (provider.getProviderId() != NetworkProvider.ID_NONE) { // TODO: Provide a better method for checking this by moving NetworkFactory.SerialNumber // out of NetworkFactory. throw new IllegalStateException("NetworkProviders can only be registered once"); } Loading Loading @@ -3176,8 +3174,7 @@ public class ConnectivityManager { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkMisc misc) { return registerNetworkAgent(messenger, ni, lp, nc, score, misc, NetworkFactory.SerialNumber.NONE); return registerNetworkAgent(messenger, ni, lp, nc, score, misc, NetworkProvider.ID_NONE); } /** Loading @@ -3187,10 +3184,9 @@ public class ConnectivityManager { */ @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) { NetworkCapabilities nc, int score, NetworkMisc misc, int providerId) { try { return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc, factorySerialNumber); return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc, providerId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading
core/java/android/net/NetworkAgent.java +8 −9 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ public abstract class NetworkAgent extends Handler { private static final long BW_REFRESH_MIN_WIN_MS = 500; private boolean mPollLceScheduled = false; private AtomicBoolean mPollLcePending = new AtomicBoolean(false); public final int mFactorySerialNumber; public final int mProviderId; private static final int BASE = Protocol.BASE_NETWORK_AGENT; Loading Loading @@ -219,25 +219,25 @@ public abstract class NetworkAgent extends Handler { // the entire tree. public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { this(looper, context, logTag, ni, nc, lp, score, null, NetworkFactory.SerialNumber.NONE); this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE); } public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { this(looper, context, logTag, ni, nc, lp, score, misc, NetworkFactory.SerialNumber.NONE); this(looper, context, logTag, ni, nc, lp, score, misc, NetworkProvider.ID_NONE); } public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, int factorySerialNumber) { this(looper, context, logTag, ni, nc, lp, score, null, factorySerialNumber); NetworkCapabilities nc, LinkProperties lp, int score, int providerId) { this(looper, context, logTag, ni, nc, lp, score, null, providerId); } public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc, int factorySerialNumber) { int providerId) { super(looper); LOG_TAG = logTag; mContext = context; mFactorySerialNumber = factorySerialNumber; mProviderId = providerId; if (ni == null || nc == null || lp == null) { throw new IllegalArgumentException(); } Loading @@ -246,8 +246,7 @@ public abstract class NetworkAgent extends Handler { ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE); netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni), new LinkProperties(lp), new NetworkCapabilities(nc), score, misc, factorySerialNumber); new LinkProperties(lp), new NetworkCapabilities(nc), score, misc, providerId); } @Override Loading
core/java/android/net/NetworkFactory.java +9 −12 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ public class NetworkFactory extends Handler { * with the same NetworkRequest but an updated score. * Also, network conditions may change for this bearer * allowing for a better score in the future. * msg.arg2 = the serial number of the factory currently responsible for the * msg.arg2 = the ID of the NetworkProvider currently responsible for the * NetworkAgent handling this request, or NetworkProvider.ID_NONE if none. */ public static final int CMD_REQUEST_NETWORK = BASE; Loading Loading @@ -156,8 +156,8 @@ public class NetworkFactory extends Handler { mProvider = new NetworkProvider(mContext, NetworkFactory.this.getLooper(), LOG_TAG) { @Override public void onNetworkRequested(@NonNull NetworkRequest request, int score, int servingFactoryProviderId) { handleAddRequest((NetworkRequest) request, score, servingFactoryProviderId); int servingProviderId) { handleAddRequest((NetworkRequest) request, score, servingProviderId); } @Override Loading Loading @@ -228,8 +228,6 @@ public class NetworkFactory extends Handler { * * @param request the request to handle. * @param score the score of the NetworkAgent currently satisfying this request. * @param servingProviderId the serial number of the NetworkFactory that * created the NetworkAgent currently satisfying this request. */ // TODO : remove this method. It is a stopgap measure to help sheperding a number // of dependent changes that would conflict throughout the automerger graph. Having this Loading @@ -237,7 +235,7 @@ public class NetworkFactory extends Handler { // the entire tree. @VisibleForTesting protected void handleAddRequest(NetworkRequest request, int score) { handleAddRequest(request, score, SerialNumber.NONE); handleAddRequest(request, score, NetworkProvider.ID_NONE); } /** Loading @@ -246,24 +244,23 @@ public class NetworkFactory extends Handler { * * @param request the request to handle. * @param score the score of the NetworkAgent currently satisfying this request. * @param servingProviderId the serial number of the NetworkFactory that * created the NetworkAgent currently satisfying this request. * @param servingProviderId the ID of the NetworkProvider that created the NetworkAgent * currently satisfying this request. */ @VisibleForTesting protected void handleAddRequest(NetworkRequest request, int score, int servingProviderId) { protected void handleAddRequest(NetworkRequest request, int score, int servingProviderId) { NetworkRequestInfo n = mNetworkRequests.get(request.requestId); if (n == null) { if (DBG) { log("got request " + request + " with score " + score + " and serial " + servingProviderId); + " and providerId " + servingProviderId); } n = new NetworkRequestInfo(request, score, servingProviderId); mNetworkRequests.put(n.request.requestId, n); } else { if (VDBG) { log("new score " + score + " for exisiting request " + request + " with serial " + servingProviderId); + " and providerId " + servingProviderId); } n.score = score; n.providerId = servingProviderId; Loading
services/core/java/com/android/server/ConnectivityService.java +68 −67 Original line number Diff line number Diff line Loading @@ -366,10 +366,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_PROXY_HAS_CHANGED = 16; /** * used internally when registering NetworkFactories * obj = NetworkFactoryInfo * used internally when registering NetworkProviders * obj = NetworkProviderInfo */ private static final int EVENT_REGISTER_NETWORK_FACTORY = 17; private static final int EVENT_REGISTER_NETWORK_PROVIDER = 17; /** * used internally when registering NetworkAgents Loading Loading @@ -405,10 +405,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_RELEASE_NETWORK_REQUEST = 22; /** * used internally when registering NetworkFactories * used internally when registering NetworkProviders * obj = Messenger */ private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23; private static final int EVENT_UNREGISTER_NETWORK_PROVIDER = 23; /** * used internally to expire a wakelock when transitioning Loading Loading @@ -2387,9 +2387,9 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } pw.print("NetworkFactories for:"); for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { pw.print(" " + nfi.name); pw.print("NetworkProviders for:"); for (NetworkProviderInfo npi : mNetworkProviderInfos.values()) { pw.print(" " + npi.name); } pw.println(); pw.println(); Loading Loading @@ -2720,7 +2720,7 @@ public class ConnectivityService extends IConnectivityManager.Stub nai.lastValidated = valid; nai.everValidated |= valid; updateCapabilities(oldScore, nai, nai.networkCapabilities); // If score has changed, rebroadcast to NetworkFactories. b/17726566 // If score has changed, rebroadcast to NetworkProviders. b/17726566 if (oldScore != nai.getCurrentScore()) sendUpdatedScoreToFactories(nai); if (valid) { handleFreshlyValidatedNetwork(nai); Loading Loading @@ -2835,6 +2835,7 @@ public class ConnectivityService extends IConnectivityManager.Stub return true; } // TODO: delete when direct use of registerNetworkFactory is no longer supported. private boolean maybeHandleNetworkFactoryMessage(Message msg) { switch (msg.what) { default: Loading Loading @@ -3024,16 +3025,16 @@ public class ConnectivityService extends IConnectivityManager.Stub private void handleAsyncChannelHalfConnect(Message msg) { ensureRunningOnConnectivityServiceThread(); final AsyncChannel ac = (AsyncChannel) msg.obj; if (mNetworkFactoryInfos.containsKey(msg.replyTo)) { if (mNetworkProviderInfos.containsKey(msg.replyTo)) { if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { if (VDBG) log("NetworkFactory connected"); // Finish setting up the full connection NetworkFactoryInfo nfi = mNetworkFactoryInfos.get(msg.replyTo); nfi.completeConnection(); sendAllRequestsToFactory(nfi); NetworkProviderInfo npi = mNetworkProviderInfos.get(msg.replyTo); npi.completeConnection(); sendAllRequestsToProvider(npi); } else { loge("Error connecting NetworkFactory"); mNetworkFactoryInfos.remove(msg.obj); mNetworkProviderInfos.remove(msg.obj); } } else if (mNetworkAgentInfos.containsKey(msg.replyTo)) { if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { Loading Loading @@ -3065,8 +3066,8 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai != null) { disconnectAndDestroyNetwork(nai); } else { NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo); if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name); NetworkProviderInfo npi = mNetworkProviderInfos.remove(msg.replyTo); if (DBG && npi != null) log("unregisterNetworkFactory for " + npi.name); } } Loading Loading @@ -3149,7 +3150,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // ip[6]tables to flush routes and remove the incoming packet mark rule, so do it // after we've rematched networks with requests which should make a potential // fallback network the default or requested a new network from the // NetworkFactories, so network traffic isn't interrupted for an unnecessarily // NetworkProviders, so network traffic isn't interrupted for an unnecessarily // long time. destroyNativeNetwork(nai); mDnsManager.removeNetwork(nai.network); Loading Loading @@ -3412,8 +3413,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } } for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { nfi.cancelRequest(nri.request); for (NetworkProviderInfo npi : mNetworkProviderInfos.values()) { npi.cancelRequest(nri.request); } } else { // listens don't have a singular affectedNetwork. Check all networks to see Loading Loading @@ -3848,12 +3849,12 @@ public class ConnectivityService extends IConnectivityManager.Stub handleApplyDefaultProxy((ProxyInfo)msg.obj); break; } case EVENT_REGISTER_NETWORK_FACTORY: { handleRegisterNetworkFactory((NetworkFactoryInfo)msg.obj); case EVENT_REGISTER_NETWORK_PROVIDER: { handleRegisterNetworkProvider((NetworkProviderInfo) msg.obj); break; } case EVENT_UNREGISTER_NETWORK_FACTORY: { handleUnregisterNetworkFactory((Messenger)msg.obj); case EVENT_UNREGISTER_NETWORK_PROVIDER: { handleUnregisterNetworkProvider((Messenger) msg.obj); break; } case EVENT_REGISTER_NETWORK_AGENT: { Loading Loading @@ -4898,7 +4899,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } }; private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos = new HashMap<>(); private final HashMap<Messenger, NetworkProviderInfo> mNetworkProviderInfos = new HashMap<>(); private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests = new HashMap<>(); private static final int MAX_NETWORK_REQUESTS_PER_UID = 100; Loading @@ -4906,18 +4907,18 @@ public class ConnectivityService extends IConnectivityManager.Stub @GuardedBy("mUidToNetworkRequestCount") private final SparseIntArray mUidToNetworkRequestCount = new SparseIntArray(); private static class NetworkFactoryInfo { private static class NetworkProviderInfo { public final String name; public final Messenger messenger; private final AsyncChannel mAsyncChannel; private final IBinder.DeathRecipient mDeathRecipient; public final int factorySerialNumber; public final int providerId; NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel, int factorySerialNumber, IBinder.DeathRecipient deathRecipient) { NetworkProviderInfo(String name, Messenger messenger, AsyncChannel asyncChannel, int providerId, IBinder.DeathRecipient deathRecipient) { this.name = name; this.messenger = messenger; this.factorySerialNumber = factorySerialNumber; this.providerId = providerId; mAsyncChannel = asyncChannel; mDeathRecipient = deathRecipient; Loading @@ -4935,17 +4936,17 @@ public class ConnectivityService extends IConnectivityManager.Stub messenger.send(Message.obtain(null /* handler */, what, arg1, arg2, obj)); } catch (RemoteException e) { // Remote process died. Ignore; the death recipient will remove this // NetworkFactoryInfo from mNetworkFactoryInfos. // NetworkProviderInfo from mNetworkProviderInfos. } } void requestNetwork(NetworkRequest request, int score, int servingSerialNumber) { void requestNetwork(NetworkRequest request, int score, int servingProviderId) { if (isLegacyNetworkFactory()) { mAsyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, servingSerialNumber, request); servingProviderId, request); } else { sendMessageToNetworkProvider(NetworkProvider.CMD_REQUEST_NETWORK, score, servingSerialNumber, request); servingProviderId, request); } } Loading Loading @@ -5358,45 +5359,45 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public int registerNetworkFactory(Messenger messenger, String name) { enforceNetworkFactoryPermission(); NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(), NetworkProviderInfo npi = new NetworkProviderInfo(name, messenger, new AsyncChannel(), nextNetworkProviderId(), null /* deathRecipient */); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi)); return nfi.factorySerialNumber; mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_PROVIDER, npi)); return npi.providerId; } private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) { if (mNetworkFactoryInfos.containsKey(nfi.messenger)) { private void handleRegisterNetworkProvider(NetworkProviderInfo npi) { if (mNetworkProviderInfos.containsKey(npi.messenger)) { // Avoid creating duplicates. even if an app makes a direct AIDL call. // This will never happen if an app calls ConnectivityManager#registerNetworkProvider, // as that will throw if a duplicate provider is registered. Slog.e(TAG, "Attempt to register existing NetworkFactoryInfo " + mNetworkFactoryInfos.get(nfi.messenger).name); Slog.e(TAG, "Attempt to register existing NetworkProviderInfo " + mNetworkProviderInfos.get(npi.messenger).name); return; } if (DBG) log("Got NetworkFactory Messenger for " + nfi.name); mNetworkFactoryInfos.put(nfi.messenger, nfi); nfi.connect(mContext, mTrackerHandler); if (!nfi.isLegacyNetworkFactory()) { if (DBG) log("Got NetworkProvider Messenger for " + npi.name); mNetworkProviderInfos.put(npi.messenger, npi); npi.connect(mContext, mTrackerHandler); if (!npi.isLegacyNetworkFactory()) { // Legacy NetworkFactories get their requests when their AsyncChannel connects. sendAllRequestsToFactory(nfi); sendAllRequestsToProvider(npi); } } @Override public int registerNetworkProvider(Messenger messenger, String name) { enforceNetworkFactoryPermission(); NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, NetworkProviderInfo npi = new NetworkProviderInfo(name, messenger, null /* asyncChannel */, nextNetworkProviderId(), () -> unregisterNetworkProvider(messenger)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi)); return nfi.factorySerialNumber; mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_PROVIDER, npi)); return npi.providerId; } @Override public void unregisterNetworkProvider(Messenger messenger) { enforceNetworkFactoryPermission(); mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_FACTORY, messenger)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_PROVIDER, messenger)); } @Override Loading @@ -5404,13 +5405,13 @@ public class ConnectivityService extends IConnectivityManager.Stub unregisterNetworkProvider(messenger); } private void handleUnregisterNetworkFactory(Messenger messenger) { NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(messenger); if (nfi == null) { loge("Failed to find Messenger in unregisterNetworkFactory"); private void handleUnregisterNetworkProvider(Messenger messenger) { NetworkProviderInfo npi = mNetworkProviderInfos.remove(messenger); if (npi == null) { loge("Failed to find Messenger in unregisterNetworkProvider"); return; } if (DBG) log("unregisterNetworkFactory for " + nfi.name); if (DBG) log("unregisterNetworkProvider for " + npi.name); } @Override Loading Loading @@ -5484,7 +5485,7 @@ public class ConnectivityService extends IConnectivityManager.Stub LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc) { return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities, currentScore, networkMisc, NetworkFactory.SerialNumber.NONE); currentScore, networkMisc, NetworkProvider.ID_NONE); } /** Loading @@ -5500,11 +5501,11 @@ public class ConnectivityService extends IConnectivityManager.Stub * @param currentScore the initial score of the network. See * {@link NetworkAgentInfo#getCurrentScore}. * @param networkMisc metadata about the network. This is never updated. * @param factorySerialNumber the serial number of the factory owning this NetworkAgent. * @param providerId the ID of the provider owning this NetworkAgent. */ public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc, int factorySerialNumber) { int currentScore, NetworkMisc networkMisc, int providerId) { enforceNetworkFactoryPermission(); LinkProperties lp = new LinkProperties(linkProperties); Loading @@ -5517,7 +5518,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc, ns, mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mDnsResolver, mNMS, factorySerialNumber); mDnsResolver, mNMS, providerId); // Make sure the network capabilities reflect what the agent info says. nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc)); final String extraInfo = networkInfo.getExtraInfo(); Loading Loading @@ -5796,7 +5797,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Once a NetworkAgent is connected, complain if some immutable capabilities are removed. // Don't complain for VPNs since they're not driven by requests and there is no risk of // causing a connect/teardown loop. // TODO: remove this altogether and make it the responsibility of the NetworkFactories to // TODO: remove this altogether and make it the responsibility of the NetworkProviders to // avoid connect/teardown loops. if (nai.everConnected && !nai.isVPN() && Loading Loading @@ -6036,13 +6037,13 @@ public class ConnectivityService extends IConnectivityManager.Stub if (VDBG || DDBG){ log("sending new Min Network Score(" + score + "): " + networkRequest.toString()); } for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { nfi.requestNetwork(networkRequest, score, serial); for (NetworkProviderInfo npi : mNetworkProviderInfos.values()) { npi.requestNetwork(networkRequest, score, serial); } } /** Sends all current NetworkRequests to the specified factory. */ private void sendAllRequestsToFactory(NetworkFactoryInfo nfi) { private void sendAllRequestsToProvider(NetworkProviderInfo npi) { ensureRunningOnConnectivityServiceThread(); for (NetworkRequestInfo nri : mNetworkRequests.values()) { if (nri.request.isListen()) continue; Loading @@ -6054,9 +6055,9 @@ public class ConnectivityService extends IConnectivityManager.Stub serial = nai.factorySerialNumber; } else { score = 0; serial = NetworkFactory.SerialNumber.NONE; serial = NetworkProvider.ID_NONE; } nfi.requestNetwork(nri.request, score, serial); npi.requestNetwork(nri.request, score, serial); } } Loading Loading @@ -6337,11 +6338,11 @@ public class ConnectivityService extends IConnectivityManager.Stub Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request); } addedRequests.add(nri); // Tell NetworkFactories about the new score, so they can stop // Tell NetworkProviders about the new score, so they can stop // trying to connect if they know they cannot match it. // TODO - this could get expensive if we have a lot of requests for this // network. Think about if there is a way to reduce this. Push // netid->request mapping to each factory? // netid->request mapping to each provider? sendUpdatedScoreToFactories(nri.request, newSatisfier); if (isDefaultRequest(nri)) { isNewDefault = true; Loading Loading @@ -6370,7 +6371,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } else { Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + newNetwork.name() + " without updating mSatisfier or factories!"); " without updating mSatisfier or providers!"); } // TODO: Technically, sending CALLBACK_LOST here is // incorrect if there is a replacement network currently Loading
services/core/java/com/android/server/connectivity/Vpn.java +2 −2 Original line number Diff line number Diff line Loading @@ -54,10 +54,10 @@ import android.net.LocalSocketAddress; import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; import android.net.NetworkProvider; import android.net.RouteInfo; import android.net.UidRange; import android.net.VpnService; Loading Loading @@ -958,7 +958,7 @@ public class Vpn { mNetworkAgent = new NetworkAgent(mLooper, mContext, NETWORKTYPE /* logtag */, mNetworkInfo, mNetworkCapabilities, lp, ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc, NetworkFactory.SerialNumber.VPN) { NetworkProvider.ID_VPN) { @Override public void unwanted() { // We are user controlled, not driven by NetworkRequest. Loading