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 android.net; 187b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 197b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.content.Context; 209d598e115f306e4f0860638c5647a959ac1320c5Erik Klineimport android.os.Bundle; 217b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Handler; 227b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Looper; 237b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Message; 247b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Messenger; 257b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.util.Log; 267b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.AsyncChannel; 287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.Protocol; 298bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colittiimport android.net.ConnectivityManager.PacketKeepalive; 307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 313192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwaltimport java.util.ArrayList; 3295ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fengluimport java.util.concurrent.atomic.AtomicBoolean; 337b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 347b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt/** 353192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * A Utility class for handling for communicating between bearer-specific 363192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * code and ConnectivityService. 377b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * 387b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * A bearer may have more than one NetworkAgent if it can simultaneously 397b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * support separate networks (IMS / Internet / MMS Apns on cellular, or 403192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * perhaps connections with different SSID or P2P for Wi-Fi). 417b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * 427b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * @hide 437b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 447b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltpublic abstract class NetworkAgent extends Handler { 4531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen // Guaranteed to be valid (not NETID_UNSET), otherwise registerNetworkAgent() would have thrown 4631a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen // an exception. 4731a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen public final int netId; 4831a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen 493192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt private volatile AsyncChannel mAsyncChannel; 507b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private final String LOG_TAG; 517b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private static final boolean DBG = true; 52fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt private static final boolean VDBG = false; 537b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private final Context mContext; 543192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>(); 55b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu private volatile long mLastBwRefreshTime = 0; 56b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu private static final long BW_REFRESH_MIN_WIN_MS = 500; 5795ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu private boolean mPollLceScheduled = false; 5895ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu private AtomicBoolean mPollLcePending = new AtomicBoolean(false); 597b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private static final int BASE = Protocol.BASE_NETWORK_AGENT; 617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by ConnectivityService to the NetworkAgent to inform it of 647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * suspected connectivity problems on its network. The NetworkAgent 657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * should take steps to verify and correct connectivity. 667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 673192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int CMD_SUSPECT_BAD = BASE; 687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 697b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent (note the EVENT vs CMD prefix) to 717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * ConnectivityService to pass the current NetworkInfo (connection state). 727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent when the NetworkInfo changes, mainly due to change of state. 737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * obj = NetworkInfo 747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 753192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_INFO_CHANGED = BASE + 1; 767b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 777b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 787b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent to ConnectivityService to pass the current 797b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * NetworkCapabilties. 807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * obj = NetworkCapabilities 817b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 823192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_CAPABILITIES_CHANGED = BASE + 2; 837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 857b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent to ConnectivityService to pass the current 867b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * NetworkProperties. 877b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * obj = NetworkProperties 887b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 893192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3; 907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /* centralize place where base network score, and network score scaling, will be 922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * stored, so as we can consistently compare apple and oranges, or wifi, ethernet and LTE 932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public static final int WIFI_BASE_SCORE = 60; 952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 967b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 977b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent to ConnectivityService to pass the current 987b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * network score. 993192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * obj = network score Integer 1007b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 1013192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4; 1027b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 1036bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 1046bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Sent by the NetworkAgent to ConnectivityService to add new UID ranges 1056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * to be forced into this Network. For VPNs only. 1066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * obj = UidRange[] to forward 1076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 1086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public static final int EVENT_UID_RANGES_ADDED = BASE + 5; 1096bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 1106bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 1116bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Sent by the NetworkAgent to ConnectivityService to remove UID ranges 1126bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * from being forced into this Network. For VPNs only. 1136bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * obj = UidRange[] to stop forwarding 1146bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 1156bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public static final int EVENT_UID_RANGES_REMOVED = BASE + 6; 1166bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 11742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran /** 118e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * Sent by ConnectivityService to the NetworkAgent to inform the agent of the 11949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * networks status - whether we could use the network or could not, due to 12049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * either a bad network configuration (no internet link) or captive portal. 12149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * 12249f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * arg1 = either {@code VALID_NETWORK} or {@code INVALID_NETWORK} 1232324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * obj = Bundle containing map from {@code REDIRECT_URL_KEY} to {@code String} 1242324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * representing URL that Internet probe was redirect to, if it was redirected, 1252324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * or mapping to {@code null} otherwise. 12649f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt */ 12760446165d8bd44f72cec8d0c5583a688369fa660Lorenzo Colitti public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7; 12849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt 12949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt public static final int VALID_NETWORK = 1; 13049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt public static final int INVALID_NETWORK = 2; 13149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt 1322324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen public static String REDIRECT_URL_KEY = "redirect URL"; 1332324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen 134e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt /** 135e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt * Sent by the NetworkAgent to ConnectivityService to indicate this network was 136e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt * explicitly selected. This should be sent before the NetworkInfo is marked 137e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt * CONNECTED so it can be given special treatment at that time. 138e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * 139e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * obj = boolean indicating whether to use this network even if unvalidated 140e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt */ 14160446165d8bd44f72cec8d0c5583a688369fa660Lorenzo Colitti public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8; 142e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt 143e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti /** 144e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * Sent by ConnectivityService to the NetworkAgent to inform the agent of 145e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * whether the network should in the future be used even if not validated. 146e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * This decision is made by the user, but it is the network transport's 147e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * responsibility to remember it. 148e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * 149e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * arg1 = 1 if true, 0 if false 150e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti */ 151e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9; 152e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti 1538bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 1548bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Sent by ConnectivityService to the NetworkAgent to inform the agent to pull 155b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu * the underlying network connection for updated bandwidth information. 156b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu */ 157b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10; 158b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu 1598bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 1608bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Sent by ConnectivityService to the NetworkAgent to request that the specified packet be sent 1618bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * periodically on the given interval. 1628bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * 1638bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * arg1 = the slot number of the keepalive to start 1648bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * arg2 = interval in seconds 1658bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * obj = KeepalivePacketData object describing the data to be sent 1668bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * 1678bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics. 1688bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti */ 1698bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti public static final int CMD_START_PACKET_KEEPALIVE = BASE + 11; 1708bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 1718bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 1728bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Requests that the specified keepalive packet be stopped. 1738bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * 1748bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * arg1 = slot number of the keepalive to stop. 1758bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * 1768bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics. 1778bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti */ 1788bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti public static final int CMD_STOP_PACKET_KEEPALIVE = BASE + 12; 1798bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 1808bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 1818bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Sent by the NetworkAgent to ConnectivityService to provide status on a packet keepalive 1828bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * request. This may either be the reply to a CMD_START_PACKET_KEEPALIVE, or an asynchronous 1838bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * error notification. 1848bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * 1858bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * This is also sent by KeepaliveTracker to the app's ConnectivityManager.PacketKeepalive to 1868bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * so that the app's PacketKeepaliveCallback methods can be called. 1878bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * 1888bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * arg1 = slot number of the keepalive 1898bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * arg2 = error code 1908bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti */ 1918bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti public static final int EVENT_PACKET_KEEPALIVE = BASE + 13; 1928bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 193c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti /** 194c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti * Sent by ConnectivityService to inform this network transport of signal strength thresholds 195c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti * that when crossed should trigger a system wakeup and a NetworkCapabilities update. 196c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti * 197c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti * obj = int[] describing signal strength thresholds. 198c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti */ 199c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti public static final int CMD_SET_SIGNAL_STRENGTH_THRESHOLDS = BASE + 14; 200c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti 201bf10991d76ce6674726a668939be300cae150130Paul Jensen /** 202f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * Sent by ConnectivityService to the NeworkAgent to inform the agent to avoid 203f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * automatically reconnecting to this network (e.g. via autojoin). Happens 204f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * when user selects "No" option on the "Stay connected?" dialog box. 205f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen */ 206bf10991d76ce6674726a668939be300cae150130Paul Jensen public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15; 207f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen 2083192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, 2093192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt NetworkCapabilities nc, LinkProperties lp, int score) { 2108cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran this(looper, context, logTag, ni, nc, lp, score, null); 2118cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran } 2128cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran 2138cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, 2148cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { 2157b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt super(looper); 2167b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt LOG_TAG = logTag; 2177b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt mContext = context; 2183192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt if (ni == null || nc == null || lp == null) { 2193192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt throw new IllegalArgumentException(); 2207b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2213192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt 222fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt if (VDBG) log("Registering NetworkAgent"); 2233192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( 2243192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt Context.CONNECTIVITY_SERVICE); 22531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni), 2268cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran new LinkProperties(lp), new NetworkCapabilities(nc), score, misc); 2277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2297b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt @Override 2307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void handleMessage(Message msg) { 2317b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt switch (msg.what) { 2327b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 2333192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt if (mAsyncChannel != null) { 2343192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt log("Received new connection while already connected!"); 2353192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } else { 236fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt if (VDBG) log("NetworkAgent fully connected"); 2373192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt AsyncChannel ac = new AsyncChannel(); 2383192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ac.connected(null, this, msg.replyTo); 2393192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ac.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 2403192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt AsyncChannel.STATUS_SUCCESSFUL); 2413192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt synchronized (mPreConnectedQueue) { 2423192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mAsyncChannel = ac; 2433192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt for (Message m : mPreConnectedQueue) { 2443192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ac.sendMessage(m); 2453192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } 2463192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mPreConnectedQueue.clear(); 2477b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2487b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2497b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 2507b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2517b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case AsyncChannel.CMD_CHANNEL_DISCONNECT: { 252fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt if (VDBG) log("CMD_CHANNEL_DISCONNECT"); 2537b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt if (mAsyncChannel != null) mAsyncChannel.disconnect(); 2547b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 2557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2567b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 2577b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt if (DBG) log("NetworkAgent channel lost"); 2583192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt // let the client know CS is done with us. 2593192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt unwanted(); 2603192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt synchronized (mPreConnectedQueue) { 2613192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mAsyncChannel = null; 2623192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } 2637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 2647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case CMD_SUSPECT_BAD: { 2667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt log("Unhandled Message " + msg); 2677b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 2687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 269b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu case CMD_REQUEST_BANDWIDTH_UPDATE: { 27095ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu long currentTimeMs = System.currentTimeMillis(); 271b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu if (VDBG) { 272b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu log("CMD_REQUEST_BANDWIDTH_UPDATE request received."); 273b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu } 27495ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu if (currentTimeMs >= (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) { 27595ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu mPollLceScheduled = false; 27695ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu if (mPollLcePending.getAndSet(true) == false) { 27795ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu pollLceData(); 27895ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu } 27995ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu } else { 28095ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu // deliver the request at a later time rather than discard it completely. 28195ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu if (!mPollLceScheduled) { 28295ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu long waitTime = mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS - 28395ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu currentTimeMs + 1; 28495ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu mPollLceScheduled = sendEmptyMessageDelayed( 28595ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu CMD_REQUEST_BANDWIDTH_UPDATE, waitTime); 28695ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu } 287b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu } 288b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu break; 289b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu } 29049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt case CMD_REPORT_NETWORK_STATUS: { 2912324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen String redirectUrl = ((Bundle)msg.obj).getString(REDIRECT_URL_KEY); 29249f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt if (VDBG) { 29349f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt log("CMD_REPORT_NETWORK_STATUS(" + 2942324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen (msg.arg1 == VALID_NETWORK ? "VALID, " : "INVALID, ") + redirectUrl); 29549f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt } 2962324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen networkStatus(msg.arg1, redirectUrl); 29749f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt break; 29849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt } 299e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti case CMD_SAVE_ACCEPT_UNVALIDATED: { 300e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti saveAcceptUnvalidated(msg.arg1 != 0); 3018bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti break; 3028bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 3038bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti case CMD_START_PACKET_KEEPALIVE: { 3048bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti startPacketKeepalive(msg); 3058bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti break; 3068bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 3078bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti case CMD_STOP_PACKET_KEEPALIVE: { 3088bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti stopPacketKeepalive(msg); 3098bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti break; 310e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti } 311c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti 312c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti case CMD_SET_SIGNAL_STRENGTH_THRESHOLDS: { 3139d598e115f306e4f0860638c5647a959ac1320c5Erik Kline ArrayList<Integer> thresholds = 3149d598e115f306e4f0860638c5647a959ac1320c5Erik Kline ((Bundle) msg.obj).getIntegerArrayList("thresholds"); 3159d598e115f306e4f0860638c5647a959ac1320c5Erik Kline // TODO: Change signal strength thresholds API to use an ArrayList<Integer> 3169d598e115f306e4f0860638c5647a959ac1320c5Erik Kline // rather than convert to int[]. 3179d598e115f306e4f0860638c5647a959ac1320c5Erik Kline int[] intThresholds = new int[(thresholds != null) ? thresholds.size() : 0]; 3189d598e115f306e4f0860638c5647a959ac1320c5Erik Kline for (int i = 0; i < intThresholds.length; i++) { 3199d598e115f306e4f0860638c5647a959ac1320c5Erik Kline intThresholds[i] = thresholds.get(i); 3209d598e115f306e4f0860638c5647a959ac1320c5Erik Kline } 3219d598e115f306e4f0860638c5647a959ac1320c5Erik Kline setSignalStrengthThresholds(intThresholds); 322c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti break; 323c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti } 324f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen case CMD_PREVENT_AUTOMATIC_RECONNECT: { 325f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen preventAutomaticReconnect(); 326f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen break; 327e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti } 3287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3297b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 3313192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt private void queueOrSendMessage(int what, Object obj) { 3328bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti queueOrSendMessage(what, 0, 0, obj); 3338bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 3348bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 3358bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti private void queueOrSendMessage(int what, int arg1, int arg2) { 3368bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti queueOrSendMessage(what, arg1, arg2, null); 3378bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 3388bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 3398bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti private void queueOrSendMessage(int what, int arg1, int arg2, Object obj) { 3408bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti Message msg = Message.obtain(); 3418bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti msg.what = what; 3428bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti msg.arg1 = arg1; 3438bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti msg.arg2 = arg2; 3448bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti msg.obj = obj; 3458bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti queueOrSendMessage(msg); 3468bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 3478bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 3488bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti private void queueOrSendMessage(Message msg) { 3493192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt synchronized (mPreConnectedQueue) { 3503192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt if (mAsyncChannel != null) { 3518bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti mAsyncChannel.sendMessage(msg); 3523192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } else { 3533192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mPreConnectedQueue.add(msg); 3549a6a11ae1edc9ee883022345c167eb4b4641402bLorenzo Colitti } 3557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3567b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3577b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 3587b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 3597b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has new LinkProperties data. 3607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 3617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void sendLinkProperties(LinkProperties linkProperties) { 3623192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_PROPERTIES_CHANGED, new LinkProperties(linkProperties)); 3637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 3657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 3667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has new NetworkInfo data. 3677b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 3687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void sendNetworkInfo(NetworkInfo networkInfo) { 3693192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo)); 3707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 3727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 3737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has new NetworkCapabilities data. 3747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 3757b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) { 37695ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu mPollLcePending.set(false); 377b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu mLastBwRefreshTime = System.currentTimeMillis(); 3783192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED, 3793192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt new NetworkCapabilities(networkCapabilities)); 3807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3817b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 3827b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 3837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has a new score for this network. 3847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 3853192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public void sendNetworkScore(int score) { 38635f7a94c846cfdaa75ed6bc58ec37bdef7a09be8Robert Greenwalt if (score < 0) { 38735f7a94c846cfdaa75ed6bc58ec37bdef7a09be8Robert Greenwalt throw new IllegalArgumentException("Score must be >= 0"); 38835f7a94c846cfdaa75ed6bc58ec37bdef7a09be8Robert Greenwalt } 3893192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new Integer(score)); 3907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 3917b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 3923192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt /** 3936bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Called by the VPN code when it wants to add ranges of UIDs to be routed 3946bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * through the VPN network. 3956bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 3966bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public void addUidRanges(UidRange[] ranges) { 3976bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen queueOrSendMessage(EVENT_UID_RANGES_ADDED, ranges); 3986bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen } 3996bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 4006bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 4016bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Called by the VPN code when it wants to remove ranges of UIDs from being routed 4026bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * through the VPN network. 4036bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 4046bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public void removeUidRanges(UidRange[] ranges) { 4056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen queueOrSendMessage(EVENT_UID_RANGES_REMOVED, ranges); 4066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen } 4076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 4086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 409e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt * Called by the bearer to indicate this network was manually selected by the user. 410e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt * This should be called before the NetworkInfo is marked CONNECTED so that this 411e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * Network can be given special treatment at that time. If {@code acceptUnvalidated} is 412e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * {@code true}, then the system will switch to this network. If it is {@code false} and the 413e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * network cannot be validated, the system will ask the user whether to switch to this network. 414e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * If the user confirms and selects "don't ask again", then the system will call 415e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * {@link #saveAcceptUnvalidated} to persist the user's choice. Thus, if the transport ever 416e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * calls this method with {@code acceptUnvalidated} set to {@code false}, it must also implement 417e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * {@link #saveAcceptUnvalidated} to respect the user's choice. 418e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt */ 419e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti public void explicitlySelected(boolean acceptUnvalidated) { 420e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, acceptUnvalidated); 421e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt } 422e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt 423e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt /** 4243192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * Called when ConnectivityService has indicated they no longer want this network. 4253192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * The parent factory should (previously) have received indication of the change 4263192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * as well, either canceling NetworkRequests or altering their score such that this 4273192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * network won't be immediately requested again. 4283192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt */ 4293192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt abstract protected void unwanted(); 4307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 43149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt /** 432b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu * Called when ConnectivityService request a bandwidth update. The parent factory 433b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu * shall try to overwrite this method and produce a bandwidth update if capable. 434b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu */ 435b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu protected void pollLceData() { 436b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu } 437b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu 438b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu /** 43949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * Called when the system determines the usefulness of this network. 44049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * 44149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * Networks claiming internet connectivity will have their internet 44249f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * connectivity verified. 44349f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * 44449f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * Currently there are two possible values: 44549f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * {@code VALID_NETWORK} if the system is happy with the connection, 44649f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * {@code INVALID_NETWORK} if the system is not happy. 44749f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * TODO - add indications of captive portal-ness and related success/failure, 44849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * ie, CAPTIVE_SUCCESS_NETWORK, CAPTIVE_NETWORK for successful login and detection 44949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * 45049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * This may be called multiple times as the network status changes and may 45149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt * generate false negatives if we lose ip connectivity before the link is torn down. 4522324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * 4532324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * @param status one of {@code VALID_NETWORK} or {@code INVALID_NETWORK}. 4542324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * @param redirectUrl If the Internet probe was redirected, this is the destination it was 4552324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen * redirected to, otherwise {@code null}. 45649f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt */ 4572324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen protected void networkStatus(int status, String redirectUrl) { 45849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt } 45949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt 460e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti /** 461e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * Called when the user asks to remember the choice to use this network even if unvalidated. 462e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * The transport is responsible for remembering the choice, and the next time the user connects 463e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * to the network, should explicitlySelected with {@code acceptUnvalidated} set to {@code true}. 464e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * This method will only be called if {@link #explicitlySelected} was called with 465e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti * {@code acceptUnvalidated} set to {@code false}. 466e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti */ 467e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti protected void saveAcceptUnvalidated(boolean accept) { 468e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti } 469e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti 4708bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 4718bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Requests that the network hardware send the specified packet at the specified interval. 4728bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti */ 4738bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti protected void startPacketKeepalive(Message msg) { 4748bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti onPacketKeepaliveEvent(msg.arg1, PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED); 4758bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 4768bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 4778bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 4788bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Requests that the network hardware send the specified packet at the specified interval. 4798bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti */ 4808bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti protected void stopPacketKeepalive(Message msg) { 4818bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti onPacketKeepaliveEvent(msg.arg1, PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED); 4828bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 4838bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 4848bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti /** 4858bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti * Called by the network when a packet keepalive event occurs. 4868bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti */ 4878bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti public void onPacketKeepaliveEvent(int slot, int reason) { 4888bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti queueOrSendMessage(EVENT_PACKET_KEEPALIVE, slot, reason); 4898bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti } 4908bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti 491c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti /** 492c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti * Called by ConnectivityService to inform this network transport of signal strength thresholds 493c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti * that when crossed should trigger a system wakeup and a NetworkCapabilities update. 494c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti */ 495c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti protected void setSignalStrengthThresholds(int[] thresholds) { 496c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti } 497c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti 498bf10991d76ce6674726a668939be300cae150130Paul Jensen /** 499f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * Called when the user asks to not stay connected to this network because it was found to not 500f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * provide Internet access. Usually followed by call to {@code unwanted}. The transport is 501f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * responsible for making sure the device does not automatically reconnect to the same network 502f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen * after the {@code unwanted} call. 503f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen */ 504f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen protected void preventAutomaticReconnect() { 505f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen } 506f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen 5077b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt protected void log(String s) { 5087b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt Log.d(LOG_TAG, "NetworkAgent: " + s); 5097b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 5107b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt} 511