diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 91c99be32c..71266a0a06 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1602,8 +1602,12 @@ public class ConnectivityManager { /** The hardware returned an error. */ public static final int ERROR_HARDWARE_ERROR = -31; + /** The NAT-T destination port for IPsec */ public static final int NATT_PORT = 4500; + /** The minimum interval in seconds between keepalive packet transmissions */ + public static final int MIN_INTERVAL = 10; + private final Network mNetwork; private final PacketKeepaliveCallback mCallback; private final Looper mLooper; diff --git a/core/java/android/net/KeepalivePacketData.java b/core/java/android/net/KeepalivePacketData.java index 08d4ff5da9..7436ad0878 100644 --- a/core/java/android/net/KeepalivePacketData.java +++ b/core/java/android/net/KeepalivePacketData.java @@ -16,8 +16,8 @@ package android.net; -import android.system.OsConstants; -import android.net.ConnectivityManager; +import static android.net.ConnectivityManager.PacketKeepalive.*; + import android.net.util.IpUtils; import android.os.Parcel; import android.os.Parcelable; @@ -25,13 +25,10 @@ import android.system.OsConstants; import android.util.Log; import java.net.Inet4Address; -import java.net.Inet6Address; import java.net.InetAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import static android.net.ConnectivityManager.PacketKeepalive.*; - /** * Represents the actual packets that are sent by the * {@link android.net.ConnectivityManager.PacketKeepalive} API. @@ -98,13 +95,6 @@ public class KeepalivePacketData implements Parcelable { InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort) throws InvalidPacketException { - // FIXME: remove this and actually support IPv6 keepalives - if (srcAddress instanceof Inet6Address && dstAddress instanceof Inet6Address) { - // Optimistically returning an IPv6 Keepalive Packet with no data, - // which currently only works on cellular - return new KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, new byte[0]); - } - if (!(srcAddress instanceof Inet4Address) || !(dstAddress instanceof Inet4Address)) { throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); } diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java index d24f9c985a..0f8fc17047 100644 --- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java +++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java @@ -172,7 +172,7 @@ public class KeepaliveTracker { } private int checkInterval() { - return mInterval >= 10 ? SUCCESS : ERROR_INVALID_INTERVAL; + return mInterval >= MIN_INTERVAL ? SUCCESS : ERROR_INVALID_INTERVAL; } private int isValid() { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 39daeabac3..28f8122002 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -3183,6 +3183,9 @@ public class ConnectivityServiceTest { InetAddress dstIPv4 = InetAddress.getByName("8.8.8.8"); InetAddress dstIPv6 = InetAddress.getByName("2001:4860:4860::8888"); + final int validKaInterval = 15; + final int invalidKaInterval = 9; + LinkProperties lp = new LinkProperties(); lp.setInterfaceName("wlan12"); lp.addLinkAddress(new LinkAddress(myIPv6, 64)); @@ -3197,36 +3200,37 @@ public class ConnectivityServiceTest { PacketKeepalive ka; // Attempt to start keepalives with invalid parameters and check for errors. - ka = mCm.startNattKeepalive(notMyNet, 25, callback, myIPv4, 1234, dstIPv4); + ka = mCm.startNattKeepalive(notMyNet, validKaInterval, callback, myIPv4, 1234, dstIPv4); callback.expectError(PacketKeepalive.ERROR_INVALID_NETWORK); - ka = mCm.startNattKeepalive(myNet, 19, callback, notMyIPv4, 1234, dstIPv4); + ka = mCm.startNattKeepalive(myNet, invalidKaInterval, callback, myIPv4, 1234, dstIPv4); callback.expectError(PacketKeepalive.ERROR_INVALID_INTERVAL); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 1234, dstIPv6); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 1234, dstIPv6); callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv6, 1234, dstIPv4); callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv6); - callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); // NAT-T is IPv4-only. + // NAT-T is only supported for IPv4. + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv6, 1234, dstIPv6); + callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 123456, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 123456, dstIPv4); callback.expectError(PacketKeepalive.ERROR_INVALID_PORT); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 123456, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 123456, dstIPv4); callback.expectError(PacketKeepalive.ERROR_INVALID_PORT); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED); // Check that a started keepalive can be stopped. mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectStarted(); mWiFiNetworkAgent.setStopKeepaliveError(PacketKeepalive.SUCCESS); ka.stop(); @@ -3234,7 +3238,7 @@ public class ConnectivityServiceTest { // Check that deleting the IP address stops the keepalive. LinkProperties bogusLp = new LinkProperties(lp); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectStarted(); bogusLp.removeLinkAddress(new LinkAddress(myIPv4, 25)); bogusLp.addLinkAddress(new LinkAddress(notMyIPv4, 25)); @@ -3243,7 +3247,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.sendLinkProperties(lp); // Check that a started keepalive is stopped correctly when the network disconnects. - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectStarted(); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); @@ -3260,7 +3264,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); // Check things work as expected when the keepalive is stopped and the network disconnects. - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectStarted(); ka.stop(); mWiFiNetworkAgent.disconnect(); @@ -3274,13 +3278,14 @@ public class ConnectivityServiceTest { // Check that keepalive slots start from 1 and increment. The first one gets slot 1. mWiFiNetworkAgent.setExpectedKeepaliveSlot(1); - ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); + ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4); callback.expectStarted(); // The second one gets slot 2. mWiFiNetworkAgent.setExpectedKeepaliveSlot(2); TestKeepaliveCallback callback2 = new TestKeepaliveCallback(); - PacketKeepalive ka2 = mCm.startNattKeepalive(myNet, 25, callback2, myIPv4, 6789, dstIPv4); + PacketKeepalive ka2 = mCm.startNattKeepalive( + myNet, validKaInterval, callback2, myIPv4, 6789, dstIPv4); callback2.expectStarted(); // Now stop the first one and create a third. This also gets slot 1. @@ -3289,7 +3294,8 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setExpectedKeepaliveSlot(1); TestKeepaliveCallback callback3 = new TestKeepaliveCallback(); - PacketKeepalive ka3 = mCm.startNattKeepalive(myNet, 25, callback3, myIPv4, 9876, dstIPv4); + PacketKeepalive ka3 = mCm.startNattKeepalive( + myNet, validKaInterval, callback3, myIPv4, 9876, dstIPv4); callback3.expectStarted(); ka2.stop();