diff options
| author | 2014-02-18 09:13:00 -0800 | |
|---|---|---|
| committer | 2014-02-18 09:13:00 -0800 | |
| commit | df47ecaa0973b80c9b97ef9ed3ad7abcfef361c7 (patch) | |
| tree | 6e65afc56da04b47f40d36909faf291b65f8d343 | |
| parent | e6d256c50b0709378a5bfff0ae27eb7cf6cc3894 (diff) | |
| parent | 02a64daefece8ccdc40935c7bc865a8966249c44 (diff) | |
am 02a64dae: Merge "Tethering: Skip link local addresses when enabling NAT"
* commit '02a64daefece8ccdc40935c7bc865a8966249c44':
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( |