Nat464Xlat.java revision 1df5fa55c5a5c1ba054b783ea639c99d57c357cf
113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti/*
213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * Copyright (C) 2012 The Android Open Source Project
313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti *
413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License");
513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * you may not use this file except in compliance with the License.
613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * You may obtain a copy of the License at
713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti *
813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti *      http://www.apache.org/licenses/LICENSE-2.0
913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti *
1013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software
1113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS,
1213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * See the License for the specific language governing permissions and
1413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * limitations under the License.
1513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti */
1613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
1713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittipackage com.android.server.connectivity;
1813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
1913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport static android.net.ConnectivityManager.TYPE_MOBILE;
2013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
2113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport java.net.Inet4Address;
2213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
2313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.content.Context;
2413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.net.IConnectivityManager;
2513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.net.InterfaceConfiguration;
2613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.net.LinkAddress;
2713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.net.LinkProperties;
283b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensenimport android.net.NetworkAgent;
2913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.net.NetworkUtils;
3013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.net.RouteInfo;
3113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.os.Handler;
3213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.os.Message;
333b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensenimport android.os.Messenger;
3413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.os.INetworkManagementService;
3513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.os.RemoteException;
3613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport android.util.Slog;
3713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
3813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittiimport com.android.server.net.BaseNetworkObserver;
3913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
4013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti/**
4113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * @hide
4213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti *
4313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti * Class to manage a 464xlat CLAT daemon.
4413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti */
4513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colittipublic class Nat464Xlat extends BaseNetworkObserver {
4613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private Context mContext;
4713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private INetworkManagementService mNMService;
4813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private IConnectivityManager mConnService;
4913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    // Whether we started clatd and expect it to be running.
5013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private boolean mIsStarted;
5113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    // Whether the clatd interface exists (i.e., clatd is running).
5213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private boolean mIsRunning;
5313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    // The LinkProperties of the clat interface.
5413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private LinkProperties mLP;
553b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    // Current LinkProperties of the network.  Includes mLP as a stacked link when clat is active.
563b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    private LinkProperties mBaseLP;
573b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    // ConnectivityService Handler for LinkProperties updates.
583b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    private Handler mHandler;
593b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    // Marker to connote which network we're augmenting.
603b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    private Messenger mNetworkMessenger;
6113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
6213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    // This must match the interface name in clatd.conf.
6313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private static final String CLAT_INTERFACE_NAME = "clat4";
6413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
6513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    private static final String TAG = "Nat464Xlat";
6613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
6713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    public Nat464Xlat(Context context, INetworkManagementService nmService,
6813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                      IConnectivityManager connService, Handler handler) {
6913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mContext = context;
7013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mNMService = nmService;
7113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mConnService = connService;
7213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mHandler = handler;
7313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
7413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mIsStarted = false;
7513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mIsRunning = false;
7613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mLP = new LinkProperties();
7743b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti
7843b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti        // If this is a runtime restart, it's possible that clatd is already
7943b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti        // running, but we don't know about it. If so, stop it.
8043b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti        try {
8143b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti            if (mNMService.isClatdStarted()) {
8243b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti                mNMService.stopClatd();
8343b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti            }
8443b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti        } catch(RemoteException e) {}  // Well, we tried.
8513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    }
8613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
8713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    /**
883b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen     * Determines whether a network requires clat.
893b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen     * @param network the NetworkAgentInfo corresponding to the network.
903b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen     * @return true if the network requires clat, false otherwise.
9113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti     */
921df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti    public static boolean requiresClat(NetworkAgentInfo nai) {
931df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        final int netType = nai.networkInfo.getType();
941df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        final boolean connected = nai.networkInfo.isConnected();
951df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        final boolean hasIPv4Address =
961df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                (nai.linkProperties != null) ? nai.linkProperties.hasIPv4Address() : false;
971df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        Slog.d(TAG, "requiresClat: netType=" + netType +
981df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                    ", connected=" + connected +
991df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                    ", hasIPv4Address=" + hasIPv4Address);
10013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        // Only support clat on mobile for now.
1011df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        return netType == TYPE_MOBILE && connected && !hasIPv4Address;
10213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    }
10313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
1041df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti    public boolean isRunningClat(NetworkAgentInfo network) {
1051df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        return mNetworkMessenger == network.messenger;
106d2ef1e50c491239e43c7b557ea1f7fc03e84f8f9Lorenzo Colitti    }
107d2ef1e50c491239e43c7b557ea1f7fc03e84f8f9Lorenzo Colitti
10813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    /**
10913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti     * Starts the clat daemon.
11013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti     * @param lp The link properties of the interface to start clatd on.
11113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti     */
1123b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    public void startClat(NetworkAgentInfo network) {
1133b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        if (mNetworkMessenger != null && mNetworkMessenger != network.messenger) {
1143b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen            Slog.e(TAG, "startClat: too many networks requesting clat");
1153b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen            return;
1163b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        }
1173b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        mNetworkMessenger = network.messenger;
1183b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        LinkProperties lp = network.linkProperties;
1193b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        mBaseLP = new LinkProperties(lp);
12013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        if (mIsStarted) {
12113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.e(TAG, "startClat: already started");
12213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            return;
12313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        }
12413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        String iface = lp.getInterfaceName();
12513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        Slog.i(TAG, "Starting clatd on " + iface + ", lp=" + lp);
12613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        try {
12713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mNMService.startClatd(iface);
12813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        } catch(RemoteException e) {
12913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.e(TAG, "Error starting clat daemon: " + e);
13013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        }
13113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        mIsStarted = true;
13213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    }
13313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
13413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    /**
13513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti     * Stops the clat daemon.
13613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti     */
13713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    public void stopClat() {
13813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        if (mIsStarted) {
13913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.i(TAG, "Stopping clatd");
14013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            try {
14113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                mNMService.stopClatd();
14213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            } catch(RemoteException e) {
14313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                Slog.e(TAG, "Error stopping clat daemon: " + e);
14413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            }
14513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mIsStarted = false;
14613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mIsRunning = false;
1473b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen            mNetworkMessenger = null;
1483b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen            mBaseLP = null;
14913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mLP.clear();
15013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        } else {
15113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.e(TAG, "stopClat: already stopped");
15213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        }
15313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    }
15413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
1553b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    private void updateConnectivityService() {
1563b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        Message msg = mHandler.obtainMessage(
1573b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen            NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED, mBaseLP);
1583b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        msg.replyTo = mNetworkMessenger;
1593b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        Slog.i(TAG, "sending message to ConnectivityService: " + msg);
1603b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen        msg.sendToTarget();
1613b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen    }
1623b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen
1631df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti    // Copies the stacked clat link in oldLp, if any, to the LinkProperties in nai.
1641df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti    public void fixupLinkProperties(NetworkAgentInfo nai, LinkProperties oldLp) {
1651df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        if (isRunningClat(nai) &&
1661df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                nai.linkProperties != null &&
1671df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                !nai.linkProperties.getAllInterfaceNames().contains(CLAT_INTERFACE_NAME)) {
1681df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti            Slog.d(TAG, "clatd running, updating NAI for " + nai.linkProperties.getInterfaceName());
1691df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti            for (LinkProperties stacked: oldLp.getStackedLinks()) {
1701df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                if (CLAT_INTERFACE_NAME.equals(stacked.getInterfaceName())) {
1711df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                    nai.linkProperties.addStackedLink(stacked);
1721df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                    break;
1731df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                }
1741df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti            }
1751df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti        }
1761df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti    }
1771df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti
17813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    @Override
17913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    public void interfaceAdded(String iface) {
18013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        if (iface.equals(CLAT_INTERFACE_NAME)) {
18113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.i(TAG, "interface " + CLAT_INTERFACE_NAME +
18213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                   " added, mIsRunning = " + mIsRunning + " -> true");
18313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mIsRunning = true;
18413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
185861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti            // Create the LinkProperties for the clat interface by fetching the
186861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti            // IPv4 address for the interface and adding an IPv4 default route,
187861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti            // then stack the LinkProperties on top of the link it's running on.
18813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            try {
18913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                InterfaceConfiguration config = mNMService.getInterfaceConfig(iface);
190861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti                LinkAddress clatAddress = config.getLinkAddress();
19113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                mLP.clear();
19213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                mLP.setInterfaceName(iface);
1931df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti
1941df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                // Although the clat interface is a point-to-point tunnel, we don't
1951df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                // point the route directly at the interface because some apps don't
1961df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                // understand routes without gateways (see, e.g., http://b/9597256
1971df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                // http://b/9597516). Instead, set the next hop of the route to the
1981df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                // clat IPv4 address itself (for those apps, it doesn't matter what
1991df5fa55c5a5c1ba054b783ea639c99d57c357cfLorenzo Colitti                // the IP of the gateway is, only that there is one).
200861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti                RouteInfo ipv4Default = new RouteInfo(new LinkAddress(Inet4Address.ANY, 0),
201861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti                                                      clatAddress.getAddress(), iface);
20213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                mLP.addRoute(ipv4Default);
203861c3fcaf2da175f0908a4c66b947f3fbaf80c6cLorenzo Colitti                mLP.addLinkAddress(clatAddress);
2043b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen                mBaseLP.addStackedLink(mLP);
2053b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen                Slog.i(TAG, "Adding stacked link. tracker LP: " + mBaseLP);
2063b75982e39ed9370153ae7f238f1d6041b9506edPaul Jensen                updateConnectivityService();
20713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            } catch(RemoteException e) {
20813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                Slog.e(TAG, "Error getting link properties: " + e);
20913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            }
21013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        }
21113c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    }
21213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti
21313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    @Override
21413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    public void interfaceRemoved(String iface) {
21513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        if (iface == CLAT_INTERFACE_NAME) {
21613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            if (mIsRunning) {
21713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                NetworkUtils.resetConnections(
21813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                    CLAT_INTERFACE_NAME,
21913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                    NetworkUtils.RESET_IPV4_ADDRESSES);
22043b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti                mBaseLP.removeStackedLink(mLP);
22143b76dfddbfe2a27a0658dbca8632a9b1dc8d6ffLorenzo Colitti                updateConnectivityService();
22213c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            }
22313c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.i(TAG, "interface " + CLAT_INTERFACE_NAME +
22413c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti                   " removed, mIsRunning = " + mIsRunning + " -> false");
22513c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mIsRunning = false;
22613c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            mLP.clear();
22713c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti            Slog.i(TAG, "mLP = " + mLP);
22813c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti        }
22913c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti    }
23013c9fdefdec907aaa339ffd67c0ded116cccba01Lorenzo Colitti};
231