Loading services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java +5 −4 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.connectivity.tethering; package com.android.server.connectivity.tethering; import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; import android.net.INetd; import android.net.INetd; import android.net.IpPrefix; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkAddress; Loading Loading @@ -48,7 +50,6 @@ import java.util.Objects; public class IPv6TetheringInterfaceServices { public class IPv6TetheringInterfaceServices { private static final String TAG = IPv6TetheringInterfaceServices.class.getSimpleName(); private static final String TAG = IPv6TetheringInterfaceServices.class.getSimpleName(); private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); private static final int RFC7421_IP_PREFIX_LENGTH = 64; private final String mIfName; private final String mIfName; private final INetworkManagementService mNMService; private final INetworkManagementService mNMService; Loading Loading @@ -124,7 +125,7 @@ public class IPv6TetheringInterfaceServices { params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); for (LinkAddress linkAddr : v6only.getLinkAddresses()) { for (LinkAddress linkAddr : v6only.getLinkAddresses()) { if (linkAddr.getPrefixLength() != RFC7421_IP_PREFIX_LENGTH) continue; if (linkAddr.getPrefixLength() != RFC7421_PREFIX_LENGTH) continue; final IpPrefix prefix = new IpPrefix( final IpPrefix prefix = new IpPrefix( linkAddr.getAddress(), linkAddr.getPrefixLength()); linkAddr.getAddress(), linkAddr.getPrefixLength()); Loading Loading @@ -206,7 +207,7 @@ public class IPv6TetheringInterfaceServices { for (Inet6Address dns : deprecatedDnses) { for (Inet6Address dns : deprecatedDnses) { final String dnsString = dns.getHostAddress(); final String dnsString = dns.getHostAddress(); try { try { netd.interfaceDelAddress(mIfName, dnsString, RFC7421_IP_PREFIX_LENGTH); netd.interfaceDelAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH); } catch (ServiceSpecificException | RemoteException e) { } catch (ServiceSpecificException | RemoteException e) { Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e); Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e); } } Loading @@ -223,7 +224,7 @@ public class IPv6TetheringInterfaceServices { for (Inet6Address dns : addedDnses) { for (Inet6Address dns : addedDnses) { final String dnsString = dns.getHostAddress(); final String dnsString = dns.getHostAddress(); try { try { netd.interfaceAddAddress(mIfName, dnsString, RFC7421_IP_PREFIX_LENGTH); netd.interfaceAddAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH); } catch (ServiceSpecificException | RemoteException e) { } catch (ServiceSpecificException | RemoteException e) { Log.e(TAG, "Failed to add local dns IP: " + dnsString, e); Log.e(TAG, "Failed to add local dns IP: " + dnsString, e); newDnses.remove(dns); newDnses.remove(dns); Loading services/net/java/android/net/ip/IpManager.java +30 −6 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.net.ip; package android.net.ip; import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; import com.android.internal.util.MessageUtils; import com.android.internal.util.MessageUtils; import com.android.internal.util.WakeupMessage; import com.android.internal.util.WakeupMessage; Loading @@ -42,6 +44,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.ServiceSpecificException; import android.os.SystemClock; import android.os.SystemClock; import android.system.OsConstants; import android.text.TextUtils; import android.text.TextUtils; import android.util.LocalLog; import android.util.LocalLog; import android.util.Log; import android.util.Log; Loading Loading @@ -1028,15 +1031,36 @@ public class IpManager extends StateMachine { return true; return true; } } private boolean startIPv6() { private void enableInterfaceIPv6PrivacyExtensions() { // Set privacy extensions. final String PREFER_TEMPADDRS = "2"; final String PREFER_TEMPADDRS = "2"; NetdService.run((INetd netd) -> { netd.setProcSysNet( INetd.IPV6, INetd.CONF, mInterfaceName, "use_tempaddr", PREFER_TEMPADDRS); }); } private void setInterfaceIPv6RaRtInfoMaxPlen(int plen) { // Setting RIO max plen is best effort. Catch and ignore most exceptions. try { try { NetdService.run((INetd netd) -> { NetdService.run((INetd netd) -> { netd.setProcSysNet( netd.setProcSysNet( INetd.IPV6, INetd.CONF, mInterfaceName, "use_tempaddr", INetd.IPV6, INetd.CONF, mInterfaceName, "accept_ra_rt_info_max_plen", PREFER_TEMPADDRS); Integer.toString(plen)); }); }); } catch (ServiceSpecificException e) { // Old kernel versions without support for RIOs do not export accept_ra_rt_info_max_plen // in the /proc filesystem. If the kernel supports RIOs we should never see any other // type of error. if (e.errorCode != OsConstants.ENOENT) { logError("unexpected error setting accept_ra_rt_info_max_plen %s", e); } } } private boolean startIPv6() { try { enableInterfaceIPv6PrivacyExtensions(); setInterfaceIPv6RaRtInfoMaxPlen(RFC7421_PREFIX_LENGTH); mNwService.enableIpv6(mInterfaceName); mNwService.enableIpv6(mInterfaceName); } catch (IllegalStateException|RemoteException|ServiceSpecificException e) { } catch (IllegalStateException|RemoteException|ServiceSpecificException e) { logError("Unable to change interface settings: %s", e); logError("Unable to change interface settings: %s", e); Loading services/net/java/android/net/util/NetworkConstants.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,7 @@ public final class NetworkConstants { public static final int IPV6_SRC_ADDR_OFFSET = 8; public static final int IPV6_SRC_ADDR_OFFSET = 8; public static final int IPV6_DST_ADDR_OFFSET = 24; public static final int IPV6_DST_ADDR_OFFSET = 24; public static final int IPV6_ADDR_LEN = 16; public static final int IPV6_ADDR_LEN = 16; public static final int RFC7421_PREFIX_LENGTH = 64; /** /** * ICMPv6 constants. * ICMPv6 constants. Loading Loading
services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java +5 −4 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.connectivity.tethering; package com.android.server.connectivity.tethering; import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; import android.net.INetd; import android.net.INetd; import android.net.IpPrefix; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkAddress; Loading Loading @@ -48,7 +50,6 @@ import java.util.Objects; public class IPv6TetheringInterfaceServices { public class IPv6TetheringInterfaceServices { private static final String TAG = IPv6TetheringInterfaceServices.class.getSimpleName(); private static final String TAG = IPv6TetheringInterfaceServices.class.getSimpleName(); private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); private static final int RFC7421_IP_PREFIX_LENGTH = 64; private final String mIfName; private final String mIfName; private final INetworkManagementService mNMService; private final INetworkManagementService mNMService; Loading Loading @@ -124,7 +125,7 @@ public class IPv6TetheringInterfaceServices { params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); for (LinkAddress linkAddr : v6only.getLinkAddresses()) { for (LinkAddress linkAddr : v6only.getLinkAddresses()) { if (linkAddr.getPrefixLength() != RFC7421_IP_PREFIX_LENGTH) continue; if (linkAddr.getPrefixLength() != RFC7421_PREFIX_LENGTH) continue; final IpPrefix prefix = new IpPrefix( final IpPrefix prefix = new IpPrefix( linkAddr.getAddress(), linkAddr.getPrefixLength()); linkAddr.getAddress(), linkAddr.getPrefixLength()); Loading Loading @@ -206,7 +207,7 @@ public class IPv6TetheringInterfaceServices { for (Inet6Address dns : deprecatedDnses) { for (Inet6Address dns : deprecatedDnses) { final String dnsString = dns.getHostAddress(); final String dnsString = dns.getHostAddress(); try { try { netd.interfaceDelAddress(mIfName, dnsString, RFC7421_IP_PREFIX_LENGTH); netd.interfaceDelAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH); } catch (ServiceSpecificException | RemoteException e) { } catch (ServiceSpecificException | RemoteException e) { Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e); Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e); } } Loading @@ -223,7 +224,7 @@ public class IPv6TetheringInterfaceServices { for (Inet6Address dns : addedDnses) { for (Inet6Address dns : addedDnses) { final String dnsString = dns.getHostAddress(); final String dnsString = dns.getHostAddress(); try { try { netd.interfaceAddAddress(mIfName, dnsString, RFC7421_IP_PREFIX_LENGTH); netd.interfaceAddAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH); } catch (ServiceSpecificException | RemoteException e) { } catch (ServiceSpecificException | RemoteException e) { Log.e(TAG, "Failed to add local dns IP: " + dnsString, e); Log.e(TAG, "Failed to add local dns IP: " + dnsString, e); newDnses.remove(dns); newDnses.remove(dns); Loading
services/net/java/android/net/ip/IpManager.java +30 −6 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.net.ip; package android.net.ip; import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; import com.android.internal.util.MessageUtils; import com.android.internal.util.MessageUtils; import com.android.internal.util.WakeupMessage; import com.android.internal.util.WakeupMessage; Loading @@ -42,6 +44,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.ServiceSpecificException; import android.os.SystemClock; import android.os.SystemClock; import android.system.OsConstants; import android.text.TextUtils; import android.text.TextUtils; import android.util.LocalLog; import android.util.LocalLog; import android.util.Log; import android.util.Log; Loading Loading @@ -1028,15 +1031,36 @@ public class IpManager extends StateMachine { return true; return true; } } private boolean startIPv6() { private void enableInterfaceIPv6PrivacyExtensions() { // Set privacy extensions. final String PREFER_TEMPADDRS = "2"; final String PREFER_TEMPADDRS = "2"; NetdService.run((INetd netd) -> { netd.setProcSysNet( INetd.IPV6, INetd.CONF, mInterfaceName, "use_tempaddr", PREFER_TEMPADDRS); }); } private void setInterfaceIPv6RaRtInfoMaxPlen(int plen) { // Setting RIO max plen is best effort. Catch and ignore most exceptions. try { try { NetdService.run((INetd netd) -> { NetdService.run((INetd netd) -> { netd.setProcSysNet( netd.setProcSysNet( INetd.IPV6, INetd.CONF, mInterfaceName, "use_tempaddr", INetd.IPV6, INetd.CONF, mInterfaceName, "accept_ra_rt_info_max_plen", PREFER_TEMPADDRS); Integer.toString(plen)); }); }); } catch (ServiceSpecificException e) { // Old kernel versions without support for RIOs do not export accept_ra_rt_info_max_plen // in the /proc filesystem. If the kernel supports RIOs we should never see any other // type of error. if (e.errorCode != OsConstants.ENOENT) { logError("unexpected error setting accept_ra_rt_info_max_plen %s", e); } } } private boolean startIPv6() { try { enableInterfaceIPv6PrivacyExtensions(); setInterfaceIPv6RaRtInfoMaxPlen(RFC7421_PREFIX_LENGTH); mNwService.enableIpv6(mInterfaceName); mNwService.enableIpv6(mInterfaceName); } catch (IllegalStateException|RemoteException|ServiceSpecificException e) { } catch (IllegalStateException|RemoteException|ServiceSpecificException e) { logError("Unable to change interface settings: %s", e); logError("Unable to change interface settings: %s", e); Loading
services/net/java/android/net/util/NetworkConstants.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,7 @@ public final class NetworkConstants { public static final int IPV6_SRC_ADDR_OFFSET = 8; public static final int IPV6_SRC_ADDR_OFFSET = 8; public static final int IPV6_DST_ADDR_OFFSET = 24; public static final int IPV6_DST_ADDR_OFFSET = 24; public static final int IPV6_ADDR_LEN = 16; public static final int IPV6_ADDR_LEN = 16; public static final int RFC7421_PREFIX_LENGTH = 64; /** /** * ICMPv6 constants. * ICMPv6 constants. Loading