NetworkAgentInfo.java revision 585e24889455d1d70d14a9c89a8acef922994898
17b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt/* 27b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Copyright (C) 2014 The Android Open Source Project 37b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * 47b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License"); 57b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * you may not use this file except in compliance with the License. 67b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * You may obtain a copy of the License at 77b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * 87b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * http://www.apache.org/licenses/LICENSE-2.0 97b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * 107b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Unless required by applicable law or agreed to in writing, software 117b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS, 127b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * See the License for the specific language governing permissions and 147b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * limitations under the License. 157b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 167b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 177b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltpackage com.android.server.connectivity; 187b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 19e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensenimport static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; 20e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen 21ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensenimport android.content.Context; 227b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.LinkProperties; 237b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.Network; 247b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.NetworkCapabilities; 257b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.NetworkInfo; 268cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandranimport android.net.NetworkMisc; 277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.NetworkRequest; 28f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkeyimport android.net.NetworkState; 29ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensenimport android.os.Handler; 307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Messenger; 317b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.util.SparseArray; 327b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 337b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.AsyncChannel; 34cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensenimport com.android.server.ConnectivityService; 35ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensenimport com.android.server.connectivity.NetworkMonitor; 367b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 377b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport java.util.ArrayList; 3885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensenimport java.util.Comparator; 397b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 407b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt/** 417b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * A bag class used by ConnectivityService for holding a collection of most recent 427b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * information published by a particular NetworkAgent as well as the 437b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * AsyncChannel/messenger for reaching that NetworkAgent and lists of NetworkRequests 4485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen * interested in using it. Default sort order is descending by score. 457b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 46e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// States of a network: 47e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// -------------------- 48e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 1. registered, uncreated, disconnected, unvalidated 49e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// This state is entered when a NetworkFactory registers a NetworkAgent in any state except 50e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// the CONNECTED state. 51585e24889455d1d70d14a9c89a8acef922994898Robin Lee// 2. registered, uncreated, connecting, unvalidated 52585e24889455d1d70d14a9c89a8acef922994898Robin Lee// This state is entered when a registered NetworkAgent for a VPN network transitions to the 53585e24889455d1d70d14a9c89a8acef922994898Robin Lee// CONNECTING state (TODO: go through this state for every network, not just VPNs). 54585e24889455d1d70d14a9c89a8acef922994898Robin Lee// ConnectivityService will tell netd to create the network early in order to add extra UID 55585e24889455d1d70d14a9c89a8acef922994898Robin Lee// routing rules referencing the netID. These rules need to be in place before the network is 56585e24889455d1d70d14a9c89a8acef922994898Robin Lee// connected to avoid racing against client apps trying to connect to a half-setup network. 57585e24889455d1d70d14a9c89a8acef922994898Robin Lee// 3. registered, uncreated, connected, unvalidated 58585e24889455d1d70d14a9c89a8acef922994898Robin Lee// This state is entered when a registered NetworkAgent transitions to the CONNECTED state. 59585e24889455d1d70d14a9c89a8acef922994898Robin Lee// ConnectivityService will tell netd to create the network if it was not already created, and 60585e24889455d1d70d14a9c89a8acef922994898Robin Lee// immediately transition to state #4. 61585e24889455d1d70d14a9c89a8acef922994898Robin Lee// 4. registered, created, connected, unvalidated 62cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen// If this network can satisfy the default NetworkRequest, then NetworkMonitor will 63e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// probe for Internet connectivity. 64e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If this network cannot satisfy the default NetworkRequest, it will immediately be 65585e24889455d1d70d14a9c89a8acef922994898Robin Lee// transitioned to state #5. 66e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// A network may remain in this state if NetworkMonitor fails to find Internet connectivity, 67e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// for example: 68e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// a. a captive portal is present, or 69e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// b. a WiFi router whose Internet backhaul is down, or 70e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// c. a wireless connection stops transfering packets temporarily (e.g. device is in elevator 71e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// or tunnel) but does not disconnect from the AP/cell tower, or 72e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// d. a stand-alone device offering a WiFi AP without an uplink for configuration purposes. 73585e24889455d1d70d14a9c89a8acef922994898Robin Lee// 5. registered, created, connected, validated 74e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 75e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// The device's default network connection: 76e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ---------------------------------------- 77585e24889455d1d70d14a9c89a8acef922994898Robin Lee// Networks in states #4 and #5 may be used as a device's default network connection if they 78e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// satisfy the default NetworkRequest. 79585e24889455d1d70d14a9c89a8acef922994898Robin Lee// A network, that satisfies the default NetworkRequest, in state #5 should always be chosen 80585e24889455d1d70d14a9c89a8acef922994898Robin Lee// in favor of a network, that satisfies the default NetworkRequest, in state #4. 81e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// When deciding between two networks, that both satisfy the default NetworkRequest, to select 82e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// for the default network connection, the one with the higher score should be chosen. 83e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 84e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// When a network disconnects: 85e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// --------------------------- 86e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If a network's transport disappears, for example: 87e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// a. WiFi turned off, or 88e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// b. cellular data turned off, or 89e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// c. airplane mode is turned on, or 90e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// d. a wireless connection disconnects from AP/cell tower entirely (e.g. device is out of range 91e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// of AP for an extended period of time, or switches to another AP without roaming) 92585e24889455d1d70d14a9c89a8acef922994898Robin Lee// then that network can transition from any state (#1-#5) to unregistered. This happens by 93e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// the transport disconnecting their NetworkAgent's AsyncChannel with ConnectivityManager. 94e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ConnectivityService also tells netd to destroy the network. 95e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 96e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// When ConnectivityService disconnects a network: 97e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ----------------------------------------------- 98e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If a network has no chance of satisfying any requests (even if it were to become validated 99585e24889455d1d70d14a9c89a8acef922994898Robin Lee// and enter state #5), ConnectivityService will disconnect the NetworkAgent's AsyncChannel. 100e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If the network ever for any period of time had satisfied a NetworkRequest (i.e. had been 101e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// the highest scoring that satisfied the NetworkRequest's constraints), but is no longer the 102e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// highest scoring network for any NetworkRequest, then there will be a 30s pause before 103e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ConnectivityService disconnects the NetworkAgent's AsyncChannel. During this pause the 104e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// network is considered "lingering". This pause exists to allow network communication to be 105e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// wrapped up rather than abruptly terminated. During this pause if the network begins satisfying 106e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// a NetworkRequest, ConnectivityService will cancel the future disconnection of the NetworkAgent's 107e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// AsyncChannel, and the network is no longer considered "lingering". 10885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensenpublic class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { 1097b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public NetworkInfo networkInfo; 11031a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen // This Network object should always be used if possible, so as to encourage reuse of the 11131a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen // enclosed socket factory and connection pool. Avoid creating other Network objects. 11231a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen // This Network object is always valid. 11331a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen public final Network network; 1147b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public LinkProperties linkProperties; 1151c7ba0285b3fe8de479d6c09b2ff45572913c2cbPaul Jensen // This should only be modified via ConnectivityService.updateCapabilities(). 1167b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public NetworkCapabilities networkCapabilities; 117ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen public final NetworkMonitor networkMonitor; 1188cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran public final NetworkMisc networkMisc; 119585e24889455d1d70d14a9c89a8acef922994898Robin Lee // Indicates if netd has been told to create this Network. From this point on the appropriate 120585e24889455d1d70d14a9c89a8acef922994898Robin Lee // routing rules are setup and routes are added so packets can begin flowing over the Network. 121d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti // This is a sticky bit; once set it is never cleared. 122eec75412a971a5ccb769364120c769c331946eb3Paul Jensen public boolean created; 123585e24889455d1d70d14a9c89a8acef922994898Robin Lee // Set to true after the first time this network is marked as CONNECTED. Once set, the network 124585e24889455d1d70d14a9c89a8acef922994898Robin Lee // shows up in API calls, is able to satisfy NetworkRequests and can become the default network. 125585e24889455d1d70d14a9c89a8acef922994898Robin Lee // This is a sticky bit; once set it is never cleared. 126585e24889455d1d70d14a9c89a8acef922994898Robin Lee public boolean everConnected; 12771b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // Set to true if this Network successfully passed validation or if it did not satisfy the 12871b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // default NetworkRequest in which case validation will not be attempted. 129d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti // This is a sticky bit; once set it is never cleared even if future validation attempts fail. 130d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti public boolean everValidated; 131ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen 1327b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // The result of the last validation attempt on this network (true if validated, false if not). 1337b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // This bit exists only because we never unvalidate a network once it's been validated, and that 1347b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // is because the network scoring and revalidation code does not (may not?) deal properly with 1357b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // networks becoming unvalidated. 1367b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // TODO: Fix the network scoring code, remove this, and rename everValidated to validated. 1377b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti public boolean lastValidated; 1387b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti 139d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti // Whether a captive portal was ever detected on this network. 140d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti // This is a sticky bit; once set it is never cleared. 1413d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen public boolean everCaptivePortalDetected; 1423d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen 1433d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen // Whether a captive portal was found during the last network validation attempt. 1443d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen public boolean lastCaptivePortalDetected; 145d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti 14685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Indicates whether the network is lingering. Networks are lingered when they become unneeded 14785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // as a result of their NetworkRequests being satisfied by a different network, so as to allow 14885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // communication to wrap up before the network is taken down. This usually only happens to the 14985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // default network. Lingering ends with either the linger timeout expiring and the network 15085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // being taken down, or the network satisfying a request again. 15185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen public boolean lingering; 15285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen 1532161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // This represents the last score received from the NetworkAgent. 1542161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen private int currentScore; 1552161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // Penalty applied to scores of Networks that have not been validated. 1562161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen private static final int UNVALIDATED_SCORE_PENALTY = 40; 1572161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 158e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt // Score for explicitly connected network. 159e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // 160e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // This ensures that a) the explicitly selected network is never trumped by anything else, and 161e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // b) the explicitly selected network is never torn down. 162e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti private static final int MAXIMUM_NETWORK_SCORE = 100; 163e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt 1647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt // The list of NetworkRequests being satisfied by this Network. 1657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public final SparseArray<NetworkRequest> networkRequests = new SparseArray<NetworkRequest>(); 16671b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // The list of NetworkRequests that this Network previously satisfied with the highest 16771b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // score. A non-empty list indicates that if this Network was validated it is lingered. 16871b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // NOTE: This list is only used for debugging. 1699258c64bef1a01fe89bc7c1fa402c44c0e6a1255Robert Greenwalt public final ArrayList<NetworkRequest> networkLingered = new ArrayList<NetworkRequest>(); 1707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 1717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public final Messenger messenger; 1727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public final AsyncChannel asyncChannel; 1737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 174954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti // Used by ConnectivityService to keep track of 464xlat. 175954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti public Nat464Xlat clatd; 176954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti 17731a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, 1788cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler, 179cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen NetworkMisc misc, NetworkRequest defaultRequest, ConnectivityService connService) { 1807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt this.messenger = messenger; 1817b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt asyncChannel = ac; 18231a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen network = net; 1837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt networkInfo = info; 1847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt linkProperties = lp; 1857b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt networkCapabilities = nc; 1867b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt currentScore = score; 187cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen networkMonitor = connService.createNetworkMonitor(context, handler, this, defaultRequest); 1888cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran networkMisc = misc; 1897b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 1913d911469a190437fe936103e861bfa171841fbd6Paul Jensen /** 1923d911469a190437fe936103e861bfa171841fbd6Paul Jensen * Add {@code networkRequest} to this network as it's satisfied by this network. 1933d911469a190437fe936103e861bfa171841fbd6Paul Jensen * NOTE: This function must only be called on ConnectivityService's main thread. 1943d911469a190437fe936103e861bfa171841fbd6Paul Jensen * @return true if {@code networkRequest} was added or false if {@code networkRequest} was 1953d911469a190437fe936103e861bfa171841fbd6Paul Jensen * already present. 1963d911469a190437fe936103e861bfa171841fbd6Paul Jensen */ 1973d911469a190437fe936103e861bfa171841fbd6Paul Jensen public boolean addRequest(NetworkRequest networkRequest) { 1983d911469a190437fe936103e861bfa171841fbd6Paul Jensen if (networkRequests.get(networkRequest.requestId) == networkRequest) return false; 19971bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt networkRequests.put(networkRequest.requestId, networkRequest); 2003d911469a190437fe936103e861bfa171841fbd6Paul Jensen return true; 20171bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt } 20271bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt 2030cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen // Does this network satisfy request? 2040cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen public boolean satisfies(NetworkRequest request) { 2050cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen return created && 2060cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen request.networkCapabilities.satisfiedByNetworkCapabilities(networkCapabilities); 2070cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen } 2080cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen 209c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti public boolean satisfiesImmutableCapabilitiesOf(NetworkRequest request) { 210c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti return created && 211c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti request.networkCapabilities.satisfiedByImmutableNetworkCapabilities( 212c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti networkCapabilities); 213c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti } 214c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti 2156bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public boolean isVPN() { 2166bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN); 2176bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen } 2186bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 219b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen private int getCurrentScore(boolean pretendValidated) { 2202161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // TODO: We may want to refactor this into a NetworkScore class that takes a base score from 2212161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // the NetworkAgent and signals from the NetworkAgent and uses those signals to modify the 2222161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // score. The NetworkScore class would provide a nice place to centralize score constants 2232161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // so they are not scattered about the transports. 2242161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 225e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // If this network is explicitly selected and the user has decided to use it even if it's 226e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // unvalidated, give it the maximum score. Also give it the maximum score if it's explicitly 227e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // selected and we're trying to see what its score could be. This ensures that we don't tear 228e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // down an explicitly selected network before the user gets a chance to prefer it when 229e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti // a higher-scoring network (e.g., Ethernet) is available. 230e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti if (networkMisc.explicitlySelected && (networkMisc.acceptUnvalidated || pretendValidated)) { 231e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti return MAXIMUM_NETWORK_SCORE; 232e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti } 2332161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 234e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti int score = currentScore; 235e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // Use NET_CAPABILITY_VALIDATED here instead of lastValidated, this allows 236e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // ConnectivityService.updateCapabilities() to compute the old score prior to updating 237e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen // networkCapabilities (with a potentially different validated state). 238e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen if (!networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED) && !pretendValidated) { 239e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen score -= UNVALIDATED_SCORE_PENALTY; 240e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen } 2412161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen if (score < 0) score = 0; 2422161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen return score; 2432161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen } 2442161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 245b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // Get the current score for this Network. This may be modified from what the 246b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // NetworkAgent sent, as it has modifiers applied to it. 247b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen public int getCurrentScore() { 248b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen return getCurrentScore(false); 249b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen } 250b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen 251b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // Get the current score for this Network as if it was validated. This may be modified from 252b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // what the NetworkAgent sent, as it has modifiers applied to it. 253b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen public int getCurrentScoreAsValidated() { 254b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen return getCurrentScore(true); 255b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen } 256b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen 2572161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen public void setCurrentScore(int newScore) { 2582161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen currentScore = newScore; 2592161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen } 2602161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 261f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey public NetworkState getNetworkState() { 262f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey synchronized (this) { 263f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey // Network objects are outwardly immutable so there is no point to duplicating. 264f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey // Duplicating also precludes sharing socket factories and connection pools. 265f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey final String subscriberId = (networkMisc != null) ? networkMisc.subscriberId : null; 266f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey return new NetworkState(new NetworkInfo(networkInfo), 267f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey new LinkProperties(linkProperties), 268f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey new NetworkCapabilities(networkCapabilities), network, subscriberId, null); 269f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey } 270f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey } 271f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey 2727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public String toString() { 273230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline return "NetworkAgentInfo{ ni{" + networkInfo + "} " + 274230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline "network{" + network + "} nethandle{" + network.getNetworkHandle() + "} " + 275230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline "lp{" + linkProperties + "} " + 276230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline "nc{" + networkCapabilities + "} Score{" + getCurrentScore() + "} " + 2777b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti "everValidated{" + everValidated + "} lastValidated{" + lastValidated + "} " + 27885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen "created{" + created + "} lingering{" + lingering + "} " + 279e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti "explicitlySelected{" + networkMisc.explicitlySelected + "} " + 280e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti "acceptUnvalidated{" + networkMisc.acceptUnvalidated + "} " + 2813d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen "everCaptivePortalDetected{" + everCaptivePortalDetected + "} " + 2823d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen "lastCaptivePortalDetected{" + lastCaptivePortalDetected + "} " + 283e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti "}"; 2847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2857b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2867b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public String name() { 2877b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt return "NetworkAgentInfo [" + networkInfo.getTypeName() + " (" + 28860061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen networkInfo.getSubtypeName() + ") - " + 28960061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen (network == null ? "null" : network.toString()) + "]"; 2907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 29185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen 29285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen // Enables sorting in descending order of score. 29385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen @Override 29485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen public int compareTo(NetworkAgentInfo other) { 29585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen return other.getCurrentScore() - getCurrentScore(); 29685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen } 2977b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt} 298