NetworkAgentInfo.java revision d49159f4e997faae6ef4141b667ad6fef74a6724
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
19ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensenimport android.content.Context;
207b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.LinkProperties;
217b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.Network;
227b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.NetworkCapabilities;
237b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.NetworkInfo;
248cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandranimport android.net.NetworkMisc;
257b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.net.NetworkRequest;
26ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensenimport android.os.Handler;
277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Messenger;
287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.util.SparseArray;
297b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.AsyncChannel;
31ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensenimport com.android.server.connectivity.NetworkMonitor;
327b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
337b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport java.util.ArrayList;
347b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
357b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt/**
367b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * A bag class used by ConnectivityService for holding a collection of most recent
377b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * information published by a particular NetworkAgent as well as the
387b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * AsyncChannel/messenger for reaching that NetworkAgent and lists of NetworkRequests
397b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * interested in using it.
407b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */
417b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltpublic class NetworkAgentInfo {
427b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public NetworkInfo networkInfo;
4331a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // This Network object should always be used if possible, so as to encourage reuse of the
4431a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // enclosed socket factory and connection pool.  Avoid creating other Network objects.
4531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // This Network object is always valid.
4631a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    public final Network network;
477b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public LinkProperties linkProperties;
487b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public NetworkCapabilities networkCapabilities;
49ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen    public final NetworkMonitor networkMonitor;
508cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran    public final NetworkMisc networkMisc;
5171b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // Indicates if netd has been told to create this Network.  Once created the appropriate routing
5271b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // rules are setup and routes are added so packets can begin flowing over the Network.
53d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // This is a sticky bit; once set it is never cleared.
54eec75412a971a5ccb769364120c769c331946eb3Paul Jensen    public boolean created;
5571b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // Set to true if this Network successfully passed validation or if it did not satisfy the
5671b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // default NetworkRequest in which case validation will not be attempted.
57d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // This is a sticky bit; once set it is never cleared even if future validation attempts fail.
58d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti    public boolean everValidated;
59ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen
607b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // The result of the last validation attempt on this network (true if validated, false if not).
617b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // This bit exists only because we never unvalidate a network once it's been validated, and that
627b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // is because the network scoring and revalidation code does not (may not?) deal properly with
637b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // networks becoming unvalidated.
647b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    // TODO: Fix the network scoring code, remove this, and rename everValidated to validated.
657b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti    public boolean lastValidated;
667b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti
67d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // Whether a captive portal was ever detected on this network.
68d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    // This is a sticky bit; once set it is never cleared.
69d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti    public boolean captivePortalDetected;
70d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti
712161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    // This represents the last score received from the NetworkAgent.
722161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    private int currentScore;
732161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    // Penalty applied to scores of Networks that have not been validated.
742161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    private static final int UNVALIDATED_SCORE_PENALTY = 40;
752161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
76e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt    // Score for explicitly connected network.
77e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    //
78e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    // This ensures that a) the explicitly selected network is never trumped by anything else, and
79e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    // b) the explicitly selected network is never torn down.
80e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    private static final int MAXIMUM_NETWORK_SCORE = 100;
81e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt
827b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    // The list of NetworkRequests being satisfied by this Network.
837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public final SparseArray<NetworkRequest> networkRequests = new SparseArray<NetworkRequest>();
8471b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // The list of NetworkRequests that this Network previously satisfied with the highest
8571b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // score.  A non-empty list indicates that if this Network was validated it is lingered.
8671b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen    // NOTE: This list is only used for debugging.
879258c64bef1a01fe89bc7c1fa402c44c0e6a1255Robert Greenwalt    public final ArrayList<NetworkRequest> networkLingered = new ArrayList<NetworkRequest>();
887b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
897b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public final Messenger messenger;
907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public final AsyncChannel asyncChannel;
917b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
92954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti    // Used by ConnectivityService to keep track of 464xlat.
93954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti    public Nat464Xlat clatd;
94954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti
9531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
968cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran            LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
972c311d61eaf331818e601f97485f88c4cf26384dPaul Jensen            NetworkMisc misc, NetworkRequest defaultRequest) {
987b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        this.messenger = messenger;
997b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        asyncChannel = ac;
10031a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen        network = net;
1017b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        networkInfo = info;
1027b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        linkProperties = lp;
1037b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        networkCapabilities = nc;
1047b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        currentScore = score;
1052c311d61eaf331818e601f97485f88c4cf26384dPaul Jensen        networkMonitor = new NetworkMonitor(context, handler, this, defaultRequest);
1068cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran        networkMisc = misc;
1077b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
1087b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
10971bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt    public void addRequest(NetworkRequest networkRequest) {
11071bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt        networkRequests.put(networkRequest.requestId, networkRequest);
11171bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt    }
11271bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt
1130cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen    // Does this network satisfy request?
1140cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen    public boolean satisfies(NetworkRequest request) {
1150cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen        return created &&
1160cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen                request.networkCapabilities.satisfiedByNetworkCapabilities(networkCapabilities);
1170cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen    }
1180cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen
1196bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public boolean isVPN() {
1206bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
1216bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
1226bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
123b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    private int getCurrentScore(boolean pretendValidated) {
1242161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // TODO: We may want to refactor this into a NetworkScore class that takes a base score from
1252161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // the NetworkAgent and signals from the NetworkAgent and uses those signals to modify the
1262161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // score.  The NetworkScore class would provide a nice place to centralize score constants
1272161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        // so they are not scattered about the transports.
1282161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
129e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // If this network is explicitly selected and the user has decided to use it even if it's
130e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // unvalidated, give it the maximum score. Also give it the maximum score if it's explicitly
131e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // selected and we're trying to see what its score could be. This ensures that we don't tear
132e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // down an explicitly selected network before the user gets a chance to prefer it when
133e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        // a higher-scoring network (e.g., Ethernet) is available.
134e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        if (networkMisc.explicitlySelected && (networkMisc.acceptUnvalidated || pretendValidated)) {
135e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti            return MAXIMUM_NETWORK_SCORE;
136e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        }
1372161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
138e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        int score = currentScore;
139d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti        if (!everValidated && !pretendValidated) score -= UNVALIDATED_SCORE_PENALTY;
1402161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        if (score < 0) score = 0;
1412161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        return score;
1422161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    }
1432161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
144b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // Get the current score for this Network.  This may be modified from what the
145b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // NetworkAgent sent, as it has modifiers applied to it.
146b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    public int getCurrentScore() {
147b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen        return getCurrentScore(false);
148b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    }
149b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen
150b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // Get the current score for this Network as if it was validated.  This may be modified from
151b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    // what the NetworkAgent sent, as it has modifiers applied to it.
152b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    public int getCurrentScoreAsValidated() {
153b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen        return getCurrentScore(true);
154b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen    }
155b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen
1562161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    public void setCurrentScore(int newScore) {
1572161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen        currentScore = newScore;
1582161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen    }
1592161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen
1607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public String toString() {
1617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        return "NetworkAgentInfo{ ni{" + networkInfo + "}  network{" +
1627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                network + "}  lp{" +
1637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                linkProperties + "}  nc{" +
1647b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti                networkCapabilities + "}  Score{" + getCurrentScore() + "}  " +
1657b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti                "everValidated{" + everValidated + "}  lastValidated{" + lastValidated + "}  " +
1667b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti                "created{" + created + "}  " +
167e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                "explicitlySelected{" + networkMisc.explicitlySelected + "} " +
168e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                "acceptUnvalidated{" + networkMisc.acceptUnvalidated + "} " +
169d49159f4e997faae6ef4141b667ad6fef74a6724Lorenzo Colitti                "captivePortalDetected{" + captivePortalDetected + "} " +
170e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                "}";
1717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
1727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
1737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public String name() {
1747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        return "NetworkAgentInfo [" + networkInfo.getTypeName() + " (" +
17560061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen                networkInfo.getSubtypeName() + ") - " +
17660061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen                (network == null ? "null" : network.toString()) + "]";
1777b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
1787b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt}
179