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