diff options
| author | 2014-02-18 17:11:09 +0000 | |
|---|---|---|
| committer | 2014-02-18 17:11:10 +0000 | |
| commit | 02a64daefece8ccdc40935c7bc865a8966249c44 (patch) | |
| tree | c386b46c4b8dca87ba42612e4b7e6cba480d6de0 | |
| parent | 234b0b037ee1f8dc50c846279216a8e4d779ff56 (diff) | |
| parent | 1da35f71d2889699864d0cd8f76a6ee8caacfb5b (diff) | |
Merge "Tethering: Skip link local addresses when enabling NAT"
| -rw-r--r-- | services/java/com/android/server/NetworkManagementService.java | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index ad7ec99775a3..e6c5422a8fc1 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<InterfaceAddress> excludeLinkLocal(List<InterfaceAddress> addresses) { + ArrayList<InterfaceAddress> filtered = new ArrayList<InterfaceAddress>(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<InterfaceAddress> 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<InterfaceAddress> interfaceAddresses = excludeLinkLocal( + internalNetworkInterface.getInterfaceAddresses()); cmd.appendArg(interfaceAddresses.size()); for (InterfaceAddress ia : interfaceAddresses) { InetAddress addr = NetworkUtils.getNetworkPart( |