NetworkAgent.java revision fc0c6890c675494b15cd847b20c5a5ede491fc3c
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; 207b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Handler; 217b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Looper; 227b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Message; 237b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Messenger; 247b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Parcel; 257b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Parcelable; 267b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.util.Log; 277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.AsyncChannel; 297b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.Protocol; 307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 313192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwaltimport java.util.ArrayList; 327b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport 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 { 453192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt private volatile AsyncChannel mAsyncChannel; 467b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private final String LOG_TAG; 477b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private static final boolean DBG = true; 48fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt private static final boolean VDBG = false; 497b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private final Context mContext; 503192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>(); 517b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 527b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt private static final int BASE = Protocol.BASE_NETWORK_AGENT; 537b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 547b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by ConnectivityService to the NetworkAgent to inform it of 567b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * suspected connectivity problems on its network. The NetworkAgent 577b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * should take steps to verify and correct connectivity. 587b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 593192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int CMD_SUSPECT_BAD = BASE; 607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent (note the EVENT vs CMD prefix) to 637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * ConnectivityService to pass the current NetworkInfo (connection state). 647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent when the NetworkInfo changes, mainly due to change of state. 657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * obj = NetworkInfo 667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 673192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_INFO_CHANGED = BASE + 1; 687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 697b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent to ConnectivityService to pass the current 717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * NetworkCapabilties. 727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * obj = NetworkCapabilities 737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 743192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_CAPABILITIES_CHANGED = BASE + 2; 757b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 767b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 777b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent to ConnectivityService to pass the current 787b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * NetworkProperties. 797b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * obj = NetworkProperties 807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 813192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3; 827b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 832ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /* centralize place where base network score, and network score scaling, will be 842ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * stored, so as we can consistently compare apple and oranges, or wifi, ethernet and LTE 852ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 862ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public static final int WIFI_BASE_SCORE = 60; 872ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 887b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 897b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Sent by the NetworkAgent to ConnectivityService to pass the current 907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * network score. 913192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * obj = network score Integer 927b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 933192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4; 947b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 956bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 966bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Sent by the NetworkAgent to ConnectivityService to add new UID ranges 976bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * to be forced into this Network. For VPNs only. 986bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * obj = UidRange[] to forward 996bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 1006bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public static final int EVENT_UID_RANGES_ADDED = BASE + 5; 1016bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 1026bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 1036bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Sent by the NetworkAgent to ConnectivityService to remove UID ranges 1046bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * from being forced into this Network. For VPNs only. 1056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * obj = UidRange[] to stop forwarding 1066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 1076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public static final int EVENT_UID_RANGES_REMOVED = BASE + 6; 1086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 10942065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran /** 11042065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * Sent by the NetworkAgent to ConnectivityService to block all routes for a certain address 11142065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * family (AF_INET or AF_INET6) on this Network. For VPNs only. 11242065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * obj = Integer representing the family (AF_INET or AF_INET6) 11342065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran */ 11442065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public static final int EVENT_BLOCK_ADDRESS_FAMILY = BASE + 7; 11542065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran 11642065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran /** 11742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * Sent by the NetworkAgent to ConnectivityService to unblock routes for a certain address 11842065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * family (AF_INET or AF_INET6) on this Network. For VPNs only. 11942065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * obj = Integer representing the family (AF_INET or AF_INET6) 12042065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran */ 12142065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public static final int EVENT_UNBLOCK_ADDRESS_FAMILY = BASE + 8; 12242065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran 1233192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, 1243192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt NetworkCapabilities nc, LinkProperties lp, int score) { 1258cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran this(looper, context, logTag, ni, nc, lp, score, null); 1268cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran } 1278cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran 1288cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, 1298cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { 1307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt super(looper); 1317b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt LOG_TAG = logTag; 1327b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt mContext = context; 1333192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt if (ni == null || nc == null || lp == null) { 1343192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt throw new IllegalArgumentException(); 1357b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1363192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt 137fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt if (VDBG) log("Registering NetworkAgent"); 1383192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( 1393192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt Context.CONNECTIVITY_SERVICE); 1403192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni), 1418cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran new LinkProperties(lp), new NetworkCapabilities(nc), score, misc); 1427b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1437b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 1447b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt @Override 1457b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void handleMessage(Message msg) { 1467b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt switch (msg.what) { 1477b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1483192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt if (mAsyncChannel != null) { 1493192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt log("Received new connection while already connected!"); 1503192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } else { 151fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt if (VDBG) log("NetworkAgent fully connected"); 1523192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt AsyncChannel ac = new AsyncChannel(); 1533192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ac.connected(null, this, msg.replyTo); 1543192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ac.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1553192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt AsyncChannel.STATUS_SUCCESSFUL); 1563192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt synchronized (mPreConnectedQueue) { 1573192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mAsyncChannel = ac; 1583192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt for (Message m : mPreConnectedQueue) { 1593192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt ac.sendMessage(m); 1603192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } 1613192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mPreConnectedQueue.clear(); 1627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 1657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case AsyncChannel.CMD_CHANNEL_DISCONNECT: { 167fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt if (VDBG) log("CMD_CHANNEL_DISCONNECT"); 1687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt if (mAsyncChannel != null) mAsyncChannel.disconnect(); 1697b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 1707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 1727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt if (DBG) log("NetworkAgent channel lost"); 1733192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt // let the client know CS is done with us. 1743192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt unwanted(); 1753192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt synchronized (mPreConnectedQueue) { 1763192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mAsyncChannel = null; 1773192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } 1787b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 1797b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt case CMD_SUSPECT_BAD: { 1817b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt log("Unhandled Message " + msg); 1827b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt break; 1837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1857b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1867b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 1873192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt private void queueOrSendMessage(int what, Object obj) { 1883192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt synchronized (mPreConnectedQueue) { 1893192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt if (mAsyncChannel != null) { 1903192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mAsyncChannel.sendMessage(what, obj); 1913192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt } else { 1923192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt Message msg = Message.obtain(); 1933192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt msg.what = what; 1943192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt msg.obj = obj; 1953192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt mPreConnectedQueue.add(msg); 1969a6a11ae1edc9ee883022345c167eb4b4641402bLorenzo Colitti } 1977b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1987b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 1997b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2007b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 2017b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has new LinkProperties data. 2027b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 2037b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void sendLinkProperties(LinkProperties linkProperties) { 2043192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_PROPERTIES_CHANGED, new LinkProperties(linkProperties)); 2057b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2067b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2077b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 2087b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has new NetworkInfo data. 2097b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 2107b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void sendNetworkInfo(NetworkInfo networkInfo) { 2113192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo)); 2127b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2137b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2147b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 2157b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has new NetworkCapabilities data. 2167b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 2177b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) { 2183192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED, 2193192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt new NetworkCapabilities(networkCapabilities)); 2207b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2217b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2227b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt /** 2237b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Called by the bearer code when it has a new score for this network. 2247b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */ 2253192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt public void sendNetworkScore(int score) { 2263192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new Integer(score)); 2277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2293192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt /** 2306bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Called by the VPN code when it wants to add ranges of UIDs to be routed 2316bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * through the VPN network. 2326bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 2336bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public void addUidRanges(UidRange[] ranges) { 2346bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen queueOrSendMessage(EVENT_UID_RANGES_ADDED, ranges); 2356bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen } 2366bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 2376bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 2386bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Called by the VPN code when it wants to remove ranges of UIDs from being routed 2396bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * through the VPN network. 2406bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */ 2416bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen public void removeUidRanges(UidRange[] ranges) { 2426bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen queueOrSendMessage(EVENT_UID_RANGES_REMOVED, ranges); 2436bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen } 2446bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 2456bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen /** 24642065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * Called by the VPN code when it wants to block an address family from being routed, typically 24742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * because the VPN network doesn't support that family. 24842065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran */ 24942065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public void blockAddressFamily(int family) { 25042065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran queueOrSendMessage(EVENT_BLOCK_ADDRESS_FAMILY, family); 25142065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran } 25242065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran 25342065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran /** 25442065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran * Called by the VPN code when it wants to unblock an address family from being routed. 25542065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran */ 25642065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public void unblockAddressFamily(int family) { 25742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran queueOrSendMessage(EVENT_UNBLOCK_ADDRESS_FAMILY, family); 25842065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran } 25942065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran 26042065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran /** 2613192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * Called when ConnectivityService has indicated they no longer want this network. 2623192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * The parent factory should (previously) have received indication of the change 2633192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * as well, either canceling NetworkRequests or altering their score such that this 2643192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * network won't be immediately requested again. 2653192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt */ 2663192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt abstract protected void unwanted(); 2677b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt 2687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt protected void log(String s) { 2697b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt Log.d(LOG_TAG, "NetworkAgent: " + s); 2707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt } 2717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt} 272