From 8e8662929ba7fef6e2067accbc8cf95a8972531f Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 28 Oct 2014 15:24:03 +0900 Subject: [PATCH] Add support for running 464xlat on wifi as well. 1. Add a command to NetworkManagementService to enable/disable IPv6 ND offload via netd. 2. Make Nat464Xlat enable offload if clatd successfully comes up on a wifi network (which means it detected a NAT64), and correspondingly re-enable offload when the clatd interface goes down. This change does not enable clatd on wifi yet, that requires an extra 2 lines to enable it. Bug: 12111730 Change-Id: I4318611762a37487c9a84f8c4867ec5aece98be8 --- .../server/connectivity/Nat464Xlat.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java index c7a2ce1d9a..c145ca3046 100644 --- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java +++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java @@ -17,6 +17,7 @@ package com.android.server.connectivity; import static android.net.ConnectivityManager.TYPE_MOBILE; +import static android.net.ConnectivityManager.TYPE_WIFI; import java.net.Inet4Address; @@ -53,7 +54,7 @@ public class Nat464Xlat extends BaseNetworkObserver { // ConnectivityService Handler for LinkProperties updates. private final Handler mHandler; - // The network we're running on. + // The network we're running on, and its type. private final NetworkAgentInfo mNetwork; // Internal state variables. @@ -211,23 +212,41 @@ public class Nat464Xlat extends BaseNetworkObserver { return stacked; } + private LinkAddress getLinkAddress(String iface) { + try { + InterfaceConfiguration config = mNMService.getInterfaceConfig(iface); + return config.getLinkAddress(); + } catch(RemoteException|IllegalStateException e) { + Slog.e(TAG, "Error getting link properties: " + e); + return null; + } + } + + private void maybeSetIpv6NdOffload(String iface, boolean on) { + if (mNetwork.networkInfo.getType() != TYPE_WIFI) { + return; + } + try { + Slog.d(TAG, (on ? "En" : "Dis") + "abling ND offload on " + iface); + mNMService.setInterfaceIpv6NdOffload(iface, on); + } catch(RemoteException|IllegalStateException e) { + Slog.w(TAG, "Changing IPv6 ND offload on " + iface + "failed: " + e); + } + } + @Override public void interfaceAdded(String iface) { // Called by the InterfaceObserver on its own thread, so can race with stop(). if (isStarted() && mIface.equals(iface)) { Slog.i(TAG, "interface " + iface + " added, mIsRunning " + mIsRunning + "->true"); - LinkAddress clatAddress; - try { - InterfaceConfiguration config = mNMService.getInterfaceConfig(iface); - clatAddress = config.getLinkAddress(); - } catch(RemoteException e) { - Slog.e(TAG, "Error getting link properties: " + e); - return; - } - if (!mIsRunning) { + LinkAddress clatAddress = getLinkAddress(iface); + if (clatAddress == null) { + return; + } mIsRunning = true; + maybeSetIpv6NdOffload(mBaseIface, false); LinkProperties lp = new LinkProperties(mNetwork.linkProperties); lp.addStackedLink(makeLinkProperties(clatAddress)); Slog.i(TAG, "Adding stacked link " + mIface + " on top of " + mBaseIface); @@ -255,6 +274,7 @@ public class Nat464Xlat extends BaseNetworkObserver { } catch (RemoteException|IllegalStateException e) { // Well, we tried. } + maybeSetIpv6NdOffload(mBaseIface, true); LinkProperties lp = new LinkProperties(mNetwork.linkProperties); lp.removeStackedLink(mIface); clear();