NetworkAgentInfo.java revision f07c7b9fd0a640bff4bf7690373613da217fe69b
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.
51e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 2. registered, uncreated, connected, unvalidated
52e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    This state is entered when a registered NetworkAgent transitions to the CONNECTED state
53e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    ConnectivityService will tell netd to create the network and immediately transition to
54e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    state #3.
55e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 3. registered, created, connected, unvalidated
56cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen//    If this network can satisfy the default NetworkRequest, then NetworkMonitor will
57e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    probe for Internet connectivity.
58e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    If this network cannot satisfy the default NetworkRequest, it will immediately be
59e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    transitioned to state #4.
60e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    A network may remain in this state if NetworkMonitor fails to find Internet connectivity,
61e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    for example:
62e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    a. a captive portal is present, or
63e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    b. a WiFi router whose Internet backhaul is down, or
64e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    c. a wireless connection stops transfering packets temporarily (e.g. device is in elevator
65e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//       or tunnel) but does not disconnect from the AP/cell tower, or
66e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    d. a stand-alone device offering a WiFi AP without an uplink for configuration purposes.
67e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// 4. registered, created, connected, validated
68e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//
69e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// The device's default network connection:
70e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ----------------------------------------
71e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// Networks in states #3 and #4 may be used as a device's default network connection if they
72e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// satisfy the default NetworkRequest.
73e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// A network, that satisfies the default NetworkRequest, in state #4 should always be chosen
74e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// in favor of a network, that satisfies the default NetworkRequest, in state #3.
75e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// When deciding between two networks, that both satisfy the default NetworkRequest, to select
76e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// for the default network connection, the one with the higher score should be chosen.
77e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//
78e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// When a network disconnects:
79e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ---------------------------
80e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If a network's transport disappears, for example:
81e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// a. WiFi turned off, or
82e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// b. cellular data turned off, or
83e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// c. airplane mode is turned on, or
84e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// d. a wireless connection disconnects from AP/cell tower entirely (e.g. device is out of range
85e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//    of AP for an extended period of time, or switches to another AP without roaming)
86e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// then that network can transition from any state (#1-#4) to unregistered.  This happens by
87e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// the transport disconnecting their NetworkAgent's AsyncChannel with ConnectivityManager.
88e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ConnectivityService also tells netd to destroy the network.
89e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen//
90e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// When ConnectivityService disconnects a network:
91e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// -----------------------------------------------
92e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If a network has no chance of satisfying any requests (even if it were to become validated
93e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// and enter state #4), ConnectivityService will disconnect the NetworkAgent's AsyncChannel.
94e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// If the network ever for any period of time had satisfied a NetworkRequest (i.e. had been
95e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// the highest scoring that satisfied the NetworkRequest's constraints), but is no longer the
96e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// highest scoring network for any NetworkRequest, then there will be a 30s pause before
97e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// ConnectivityService disconnects the NetworkAgent's AsyncChannel.  During this pause the
98e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// network is considered "lingering".  This pause exists to allow network communication to be
99e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// wrapped up rather than abruptly terminated.  During this pause if the network begins satisfying
100e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// a NetworkRequest, ConnectivityService will cancel the future disconnection of the NetworkAgent's
101e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen// AsyncChannel, and the network is no longer considered "lingering".
10285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensenpublic class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
1037b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public NetworkInfo networkInfo;
10431a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // This Network object should always be used if possible, so as to encourage reuse of the
10531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // enclosed socket factory and connection pool.  Avoid creating other Network objects.
10631a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // This Network object is always valid.
10731a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    public final Network network;
1087b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public LinkProperties linkProperties;
1091c7ba0285b3fe8de479d6c09b2ff45572913c2cbPaul Jensen    // This should only be modified via ConnectivityService.updateCapabilities().
1107b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public NetworkCapabilities networkCapabilities;
111ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen    public final NetworkMonitor networkMonitor;
1128cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran    public final NetworkMisc networkMisc;
11371b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // Indicates if netd has been told to create this Network.  Once created the appropriate routing
11471b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // rules are setup and routes are added so packets can begin flowing over the Network.
115d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // This is a sticky bit; once set it is never cleared.
116eec75412a971a5ccb769364120c769c331946eb3Paul Jensen    public boolean created;
11771b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // Set to true if this Network successfully passed validation or if it did not satisfy the
11871b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // default NetworkRequest in which case validation will not be attempted.
119d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // This is a sticky bit; once set it is never cleared even if future validation attempts fail.
120d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti    public boolean everValidated;
121ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen
1227b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // The result of the last validation attempt on this network (true if validated, false if not).
1237b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // This bit exists only because we never unvalidate a network once it's been validated, and that
1247b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // is because the network scoring and revalidation code does not (may not?) deal properly with
1257b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // networks becoming unvalidated.
1267b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // TODO: Fix the network scoring code, remove this, and rename everValidated to validated.
1277b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    public boolean lastValidated;
1287b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti
129d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // Whether a captive portal was ever detected on this network.
130d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // This is a sticky bit; once set it is never cleared.
1313d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen    public boolean everCaptivePortalDetected;
1323d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen
1333d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen    // Whether a captive portal was found during the last network validation attempt.
1343d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen    public boolean lastCaptivePortalDetected;
135d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti
13685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    // Indicates whether the network is lingering.  Networks are lingered when they become unneeded
13785cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    // as a result of their NetworkRequests being satisfied by a different network, so as to allow
13885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    // communication to wrap up before the network is taken down.  This usually only happens to the
13985cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    // default network.  Lingering ends with either the linger timeout expiring and the network
14085cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    // being taken down, or the network satisfying a request again.
14185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    public boolean lingering;
14285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen
1432161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    // This represents the last score received from the NetworkAgent.
1442161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    private int currentScore;
1452161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    // Penalty applied to scores of Networks that have not been validated.
1462161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    private static final int UNVALIDATED_SCORE_PENALTY = 40;
1472161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
148e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt    // Score for explicitly connected network.
149e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    //
150e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    // This ensures that a) the explicitly selected network is never trumped by anything else, and
151e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    // b) the explicitly selected network is never torn down.
152e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    private static final int MAXIMUM_NETWORK_SCORE = 100;
153e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt
1547b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    // The list of NetworkRequests being satisfied by this Network.
1557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public final SparseArray<NetworkRequest> networkRequests = new SparseArray<NetworkRequest>();
15671b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // The list of NetworkRequests that this Network previously satisfied with the highest
15771b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // score.  A non-empty list indicates that if this Network was validated it is lingered.
15871b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // NOTE: This list is only used for debugging.
1599258c64bef1a01fe89bc7c1fa402c44c0e6a1255Robert Greenwalt    public final ArrayList<NetworkRequest> networkLingered = new ArrayList<NetworkRequest>();
1607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
1617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public final Messenger messenger;
1627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public final AsyncChannel asyncChannel;
1637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
164954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti    // Used by ConnectivityService to keep track of 464xlat.
165954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti    public Nat464Xlat clatd;
166954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti
16731a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
1688cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran            LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
169cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen            NetworkMisc misc, NetworkRequest defaultRequest, ConnectivityService connService) {
1707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        this.messenger = messenger;
1717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        asyncChannel = ac;
17231a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen        network = net;
1737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        networkInfo = info;
1747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        linkProperties = lp;
1757b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        networkCapabilities = nc;
1767b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        currentScore = score;
177cf4c2c637268b1a2979e20a8b5644916777a02a4Paul Jensen        networkMonitor = connService.createNetworkMonitor(context, handler, this, defaultRequest);
1788cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran        networkMisc = misc;
1797b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
1807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
1813d911469a190437fe936103e861bfa171841fbd6Paul Jensen    /**
1823d911469a190437fe936103e861bfa171841fbd6Paul Jensen     * Add {@code networkRequest} to this network as it's satisfied by this network.
1833d911469a190437fe936103e861bfa171841fbd6Paul Jensen     * NOTE: This function must only be called on ConnectivityService's main thread.
1843d911469a190437fe936103e861bfa171841fbd6Paul Jensen     * @return true if {@code networkRequest} was added or false if {@code networkRequest} was
1853d911469a190437fe936103e861bfa171841fbd6Paul Jensen     *         already present.
1863d911469a190437fe936103e861bfa171841fbd6Paul Jensen     */
1873d911469a190437fe936103e861bfa171841fbd6Paul Jensen    public boolean addRequest(NetworkRequest networkRequest) {
1883d911469a190437fe936103e861bfa171841fbd6Paul Jensen        if (networkRequests.get(networkRequest.requestId) == networkRequest) return false;
18971bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt        networkRequests.put(networkRequest.requestId, networkRequest);
1903d911469a190437fe936103e861bfa171841fbd6Paul Jensen        return true;
19171bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt    }
19271bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt
1930cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen    // Does this network satisfy request?
1940cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen    public boolean satisfies(NetworkRequest request) {
1950cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen        return created &&
1960cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen                request.networkCapabilities.satisfiedByNetworkCapabilities(networkCapabilities);
1970cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen    }
1980cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen
199c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    public boolean satisfiesImmutableCapabilitiesOf(NetworkRequest request) {
200c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti        return created &&
201c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti                request.networkCapabilities.satisfiedByImmutableNetworkCapabilities(
202c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti                        networkCapabilities);
203c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    }
204c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti
2056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public boolean isVPN() {
2066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
2076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
2086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
209b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    private int getCurrentScore(boolean pretendValidated) {
2102161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // TODO: We may want to refactor this into a NetworkScore class that takes a base score from
2112161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // the NetworkAgent and signals from the NetworkAgent and uses those signals to modify the
2122161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // score.  The NetworkScore class would provide a nice place to centralize score constants
2132161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // so they are not scattered about the transports.
2142161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
215e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // If this network is explicitly selected and the user has decided to use it even if it's
216e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // unvalidated, give it the maximum score. Also give it the maximum score if it's explicitly
217e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // selected and we're trying to see what its score could be. This ensures that we don't tear
218e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // down an explicitly selected network before the user gets a chance to prefer it when
219e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // a higher-scoring network (e.g., Ethernet) is available.
220e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        if (networkMisc.explicitlySelected && (networkMisc.acceptUnvalidated || pretendValidated)) {
221e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti            return MAXIMUM_NETWORK_SCORE;
222e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        }
2232161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
224e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        int score = currentScore;
225e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen        // Use NET_CAPABILITY_VALIDATED here instead of lastValidated, this allows
226e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen        // ConnectivityService.updateCapabilities() to compute the old score prior to updating
227e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen        // networkCapabilities (with a potentially different validated state).
228e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen        if (!networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED) && !pretendValidated) {
229e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen            score -= UNVALIDATED_SCORE_PENALTY;
230e098854c41a72b22f4174bc623e8e93cde8d7331Paul Jensen        }
2312161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        if (score < 0) score = 0;
2322161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        return score;
2332161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    }
2342161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
235b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // Get the current score for this Network.  This may be modified from what the
236b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // NetworkAgent sent, as it has modifiers applied to it.
237b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    public int getCurrentScore() {
238b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen        return getCurrentScore(false);
239b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    }
240b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen
241b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // Get the current score for this Network as if it was validated.  This may be modified from
242b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // what the NetworkAgent sent, as it has modifiers applied to it.
243b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    public int getCurrentScoreAsValidated() {
244b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen        return getCurrentScore(true);
245b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    }
246b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen
2472161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    public void setCurrentScore(int newScore) {
2482161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        currentScore = newScore;
2492161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    }
2502161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
251f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey    public NetworkState getNetworkState() {
252f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey        synchronized (this) {
253f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey            // Network objects are outwardly immutable so there is no point to duplicating.
254f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey            // Duplicating also precludes sharing socket factories and connection pools.
255f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey            final String subscriberId = (networkMisc != null) ? networkMisc.subscriberId : null;
256f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey            return new NetworkState(new NetworkInfo(networkInfo),
257f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey                    new LinkProperties(linkProperties),
258f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey                    new NetworkCapabilities(networkCapabilities), network, subscriberId, null);
259f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey        }
260f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey    }
261f07c7b9fd0a640bff4bf7690373613da217fe69bJeff Sharkey
2627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public String toString() {
263230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline        return "NetworkAgentInfo{ ni{" + networkInfo + "}  " +
264230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline                "network{" + network + "}  nethandle{" + network.getNetworkHandle() + "}  " +
265230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline                "lp{" + linkProperties + "}  " +
266230d5ca49821bd7a10bb1b3e61d10f534f687772Erik Kline                "nc{" + networkCapabilities + "}  Score{" + getCurrentScore() + "}  " +
2677b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti                "everValidated{" + everValidated + "}  lastValidated{" + lastValidated + "}  " +
26885cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen                "created{" + created + "} lingering{" + lingering + "} " +
269e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                "explicitlySelected{" + networkMisc.explicitlySelected + "} " +
270e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                "acceptUnvalidated{" + networkMisc.acceptUnvalidated + "} " +
2713d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen                "everCaptivePortalDetected{" + everCaptivePortalDetected + "} " +
2723d194eae6f658ed865b2d3b748f8b83834c877abPaul Jensen                "lastCaptivePortalDetected{" + lastCaptivePortalDetected + "} " +
273e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                "}";
2747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
2757b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
2767b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public String name() {
2777b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        return "NetworkAgentInfo [" + networkInfo.getTypeName() + " (" +
27860061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen                networkInfo.getSubtypeName() + ") - " +
27960061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen                (network == null ? "null" : network.toString()) + "]";
2807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
28185cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen
28285cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    // Enables sorting in descending order of score.
28385cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    @Override
28485cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    public int compareTo(NetworkAgentInfo other) {
28585cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen        return other.getCurrentScore() - getCurrentScore();
28685cf78edc92b85ec90e91de42b14b84e202260f3Paul Jensen    }
2877b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt}
288