From 1da35f71d2889699864d0cd8f76a6ee8caacfb5b Mon Sep 17 00:00:00 2001 From: jiaguo Date: Thu, 9 Jan 2014 16:39:59 +0800 Subject: [PATCH] Tethering: Skip link local addresses when enabling NAT Only one entry is allowed to be added to route table 60 for all interface ipv6 link local addresses, so skip ipv6 link local addresses on all interfaces when enabling NAT Change-Id: Ibbe6c2bdae83586cdd38287089715f3433bbb91f Signed-off-by: jiaguo --- .../android/server/NetworkManagementService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index ad7ec99775a31..e6c5422a8fc11 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -82,6 +82,7 @@ import java.net.SocketException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.StringTokenizer; @@ -1022,6 +1023,15 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + private List excludeLinkLocal(List addresses) { + ArrayList filtered = new ArrayList(addresses.size()); + for (InterfaceAddress ia : addresses) { + if (!ia.getAddress().isLinkLocalAddress()) + filtered.add(ia); + } + return filtered; + } + private void modifyNat(String action, String internalInterface, String externalInterface) throws SocketException { final Command cmd = new Command("nat", action, internalInterface, externalInterface); @@ -1031,8 +1041,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub if (internalNetworkInterface == null) { cmd.appendArg("0"); } else { - Collection interfaceAddresses = internalNetworkInterface - .getInterfaceAddresses(); + // Don't touch link-local routes, as link-local addresses aren't routable, + // kernel creates link-local routes on all interfaces automatically + List interfaceAddresses = excludeLinkLocal( + internalNetworkInterface.getInterfaceAddresses()); cmd.appendArg(interfaceAddresses.size()); for (InterfaceAddress ia : interfaceAddresses) { InetAddress addr = NetworkUtils.getNetworkPart(