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