Loading core/java/android/net/ConnectivityManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading core/java/android/net/KeepalivePacketData.java +2 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading Loading @@ -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); } Loading services/core/java/com/android/server/connectivity/KeepaliveTracker.java +1 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading tests/net/java/com/android/server/ConnectivityServiceTest.java +23 −17 Original line number Diff line number Diff line Loading @@ -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)); Loading @@ -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(); Loading @@ -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)); Loading @@ -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()); Loading @@ -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(); Loading @@ -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. Loading @@ -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(); Loading Loading
core/java/android/net/ConnectivityManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
core/java/android/net/KeepalivePacketData.java +2 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading Loading @@ -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); } Loading
services/core/java/com/android/server/connectivity/KeepaliveTracker.java +1 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading
tests/net/java/com/android/server/ConnectivityServiceTest.java +23 −17 Original line number Diff line number Diff line Loading @@ -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)); Loading @@ -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(); Loading @@ -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)); Loading @@ -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()); Loading @@ -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(); Loading @@ -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. Loading @@ -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(); Loading