NetworkAgentInfo.java revision 31a94f48bf8014cf6a1127bd23cf9a8541a9abed
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. 5371b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // NOTE: 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. 5771b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // NOTE: This is a sticky bit; once set it is never cleared even if future validation attempts 5871b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // fail. 59d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti public boolean everValidated; 60ca8f16ad14819ba17f5ff3d2e2bf6fbc9bbaa9f7Paul Jensen 617b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // The result of the last validation attempt on this network (true if validated, false if not). 627b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // This bit exists only because we never unvalidate a network once it's been validated, and that 637b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // is because the network scoring and revalidation code does not (may not?) deal properly with 647b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // networks becoming unvalidated. 657b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti // TODO: Fix the network scoring code, remove this, and rename everValidated to validated. 667b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti public boolean lastValidated; 677b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti 682161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // This represents the last score received from the NetworkAgent. 692161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen private int currentScore; 702161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // Penalty applied to scores of Networks that have not been validated. 712161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen private static final int UNVALIDATED_SCORE_PENALTY = 40; 722161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 73e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt // Score for explicitly connected network. 74e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt private static final int EXPLICITLY_SELECTED_NETWORK_SCORE = 100; 75e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt 767b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt // The list of NetworkRequests being satisfied by this Network. 777b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public final SparseArray<NetworkRequest> networkRequests = new SparseArray<NetworkRequest>(); 7871b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // The list of NetworkRequests that this Network previously satisfied with the highest 7971b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // score. A non-empty list indicates that if this Network was validated it is lingered. 8071b645fe9cb8106dfcbf025a3fd7f58698c051bbPaul Jensen // NOTE: This list is only used for debugging. 819258c64bef1a01fe89bc7c1fa402c44c0e6a1255Robert Greenwalt public final ArrayList<NetworkRequest> networkLingered = new ArrayList<NetworkRequest>(); 827b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public final Messenger messenger; 847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public final AsyncChannel asyncChannel; 857b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 86954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti // Used by ConnectivityService to keep track of 464xlat. 87954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti public Nat464Xlat clatd; 88954394653dad05838235f48244a4320893e0f0cfLorenzo Colitti 8931a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, 908cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler, 912c311d61eaf331818e601f97485f88c4cf26384dPaul Jensen NetworkMisc misc, NetworkRequest defaultRequest) { 927b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt this.messenger = messenger; 937b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt asyncChannel = ac; 9431a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen network = net; 957b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt networkInfo = info; 967b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt linkProperties = lp; 977b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt networkCapabilities = nc; 987b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt currentScore = score; 992c311d61eaf331818e601f97485f88c4cf26384dPaul Jensen networkMonitor = new NetworkMonitor(context, handler, this, defaultRequest); 1008cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran networkMisc = misc; 101eec75412a971a5ccb769364120c769c331946eb3Paul Jensen created = false; 102d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti everValidated = false; 1037b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti lastValidated = false; 1047b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1057b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 10671bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt public void addRequest(NetworkRequest networkRequest) { 10771bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt networkRequests.put(networkRequest.requestId, networkRequest); 10871bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt } 10971bf33a02f49444fbfa35b267c70592f3b07a07dRobert Greenwalt 1100cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen // Does this network satisfy request? 1110cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen public boolean satisfies(NetworkRequest request) { 1120cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen return created && 1130cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen request.networkCapabilities.satisfiedByNetworkCapabilities(networkCapabilities); 1140cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen } 1150cc1732cfb9d68779449b4c12661b4df6bfc720bPaul Jensen 1166bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public boolean isVPN() { 1176bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN); 1186bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen } 1196bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 120b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen private int getCurrentScore(boolean pretendValidated) { 1212161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // TODO: We may want to refactor this into a NetworkScore class that takes a base score from 1222161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // the NetworkAgent and signals from the NetworkAgent and uses those signals to modify the 1232161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // score. The NetworkScore class would provide a nice place to centralize score constants 1242161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen // so they are not scattered about the transports. 1252161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 1262161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen int score = currentScore; 1272161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 128d3b8a3e77696ecd90ce59a869aaadf1e7804a9c8Lorenzo Colitti if (!everValidated && !pretendValidated) score -= UNVALIDATED_SCORE_PENALTY; 1292161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen if (score < 0) score = 0; 1302161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 131e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt if (networkMisc.explicitlySelected) score = EXPLICITLY_SELECTED_NETWORK_SCORE; 132e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt 1332161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen return score; 1342161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen } 1352161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 136b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // Get the current score for this Network. This may be modified from what the 137b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // NetworkAgent sent, as it has modifiers applied to it. 138b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen public int getCurrentScore() { 139b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen return getCurrentScore(false); 140b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen } 141b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen 142b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // Get the current score for this Network as if it was validated. This may be modified from 143b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen // what the NetworkAgent sent, as it has modifiers applied to it. 144b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen public int getCurrentScoreAsValidated() { 145b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen return getCurrentScore(true); 146b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen } 147b10e37fd1c3a95f7e621eed234c2491eb71241e2Paul Jensen 1482161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen public void setCurrentScore(int newScore) { 1492161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen currentScore = newScore; 1502161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen } 1512161a8ea123134ee3f9a10c0f8f56aabd8289f69Paul Jensen 1527b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public String toString() { 1537b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt return "NetworkAgentInfo{ ni{" + networkInfo + "} network{" + 1547b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt network + "} lp{" + 1557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt linkProperties + "} nc{" + 1567b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti networkCapabilities + "} Score{" + getCurrentScore() + "} " + 1577b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti "everValidated{" + everValidated + "} lastValidated{" + lastValidated + "} " + 1587b42f399430d5d4ace4efbee225bbd3ecd2d4146Lorenzo Colitti "created{" + created + "} " + 159e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt "explicitlySelected{" + networkMisc.explicitlySelected + "} }"; 1607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 1627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public String name() { 1637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt return "NetworkAgentInfo [" + networkInfo.getTypeName() + " (" + 16460061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen networkInfo.getSubtypeName() + ") - " + 16560061a6ebf4ef758c4a47d210de0e5be2484be5bPaul Jensen (network == null ? "null" : network.toString()) + "]"; 1667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1677b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt} 168