diff options
author | 2017-06-22 06:34:28 +0000 | |
---|---|---|
committer | 2017-06-22 06:34:31 +0000 | |
commit | a88b12ce5e2778081a321ac049aa2ff7fd1c281d (patch) | |
tree | 71795956eea71d9748027de3bd8c03e20534ac62 | |
parent | 4ff3cf1eca71e61896a6f4a493974113656f3fd5 (diff) | |
parent | 2db1074e4f747ee71e913cd890d385e563f23b5c (diff) |
Merge "Use RFC 7217 stable privacy addresses"
3 files changed, 47 insertions, 8 deletions
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index c34de1551ebf..92e78bc8d977 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -97,6 +97,12 @@ interface INetworkManagementService void enableIpv6(String iface); /** + * Set IPv6 autoconf address generation mode. + * This is a no-op if an unsupported mode is requested. + */ + void setIPv6AddrGenMode(String iface, int mode); + + /** * Enables or enables IPv6 ND offload. */ void setInterfaceIpv6NdOffload(String iface, boolean enable); diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index ac2f4d09a5ba..15932cc2ee0c 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -1029,6 +1029,15 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override + public void setIPv6AddrGenMode(String iface, int mode) throws ServiceSpecificException { + try { + mNetdService.setIPv6AddrGenMode(iface, mode); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + @Override public void disableIpv6(String iface) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 6608167d5815..7b57bbd397d7 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -20,16 +20,17 @@ import com.android.internal.util.MessageUtils; import com.android.internal.util.WakeupMessage; import android.content.Context; -import android.net.apf.ApfCapabilities; -import android.net.apf.ApfFilter; import android.net.DhcpResults; +import android.net.INetd; import android.net.InterfaceConfiguration; import android.net.LinkAddress; -import android.net.LinkProperties; import android.net.LinkProperties.ProvisioningChange; +import android.net.LinkProperties; import android.net.ProxyInfo; import android.net.RouteInfo; import android.net.StaticIpConfiguration; +import android.net.apf.ApfCapabilities; +import android.net.apf.ApfFilter; import android.net.dhcp.DhcpClient; import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpManagerEvent; @@ -38,7 +39,9 @@ import android.os.INetworkManagementService; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.ServiceSpecificException; import android.os.SystemClock; +import android.system.OsConstants; import android.text.TextUtils; import android.util.LocalLog; import android.util.Log; @@ -319,6 +322,16 @@ public class IpManager extends StateMachine { return this; } + public Builder withIPv6AddrGenModeEUI64() { + mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_EUI64; + return this; + } + + public Builder withIPv6AddrGenModeStablePrivacy() { + mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY; + return this; + } + public ProvisioningConfiguration build() { return new ProvisioningConfiguration(mConfig); } @@ -331,6 +344,7 @@ public class IpManager extends StateMachine { /* package */ StaticIpConfiguration mStaticIpConfig; /* package */ ApfCapabilities mApfCapabilities; /* package */ int mProvisioningTimeoutMs = DEFAULT_TIMEOUT_MS; + /* package */ int mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY; public ProvisioningConfiguration() {} @@ -354,6 +368,7 @@ public class IpManager extends StateMachine { .add("mStaticIpConfig: " + mStaticIpConfig) .add("mApfCapabilities: " + mApfCapabilities) .add("mProvisioningTimeoutMs: " + mProvisioningTimeoutMs) + .add("mIPv6AddrGenMode: " + mIPv6AddrGenMode) .toString(); } } @@ -1044,16 +1059,25 @@ public class IpManager extends StateMachine { return true; } + private void setIPv6AddrGenModeIfSupported() throws RemoteException { + try { + mNwService.setIPv6AddrGenMode(mInterfaceName, mConfiguration.mIPv6AddrGenMode); + } catch (ServiceSpecificException e) { + if (e.errorCode != OsConstants.EOPNOTSUPP) { + throw e; + } + } + } + private boolean startIPv6() { // Set privacy extensions. try { mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true); + + setIPv6AddrGenModeIfSupported(); mNwService.enableIpv6(mInterfaceName); - } catch (RemoteException re) { - logError("Unable to change interface settings: %s", re); - return false; - } catch (IllegalStateException ie) { - logError("Unable to change interface settings: %s", ie); + } catch (IllegalStateException | RemoteException | ServiceSpecificException e) { + logError("Unable to change interface settings: %s", e); return false; } |