Use RFC 7217 stable privacy addresses

Ask Netd to setup WiFi interfaces to use stable privacy addresses. This
should fail benignly on devices with kernels lacking RFC 7217 support.

Test: as follows
    - built
    - flashed
    - booted
    - Manually observed persistent stable secret
    - Manually observed randomized IPv6 addresses (with flags = 800)
Bug: 17613910

Change-Id: I9465de16685b1eb0fd842446a530cf98d77a0c28
This commit is contained in:
Joel Scherpelz
2017-06-07 15:38:38 +09:00
parent 4ff3cf1eca
commit 2db1074e4f
3 changed files with 47 additions and 8 deletions

View File

@@ -96,6 +96,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.
*/

View File

@@ -1028,6 +1028,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);

View File

@@ -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;
}