Merge "Fix ConnectivityServiceTest for NATT Keepalive"

am: cab3e6009c

Change-Id: Idbdffc7bbd2d9a96f6e6052810722df04a20a65c
This commit is contained in:
nharold
2018-02-20 22:55:38 +00:00
committed by android-build-merger
4 changed files with 30 additions and 30 deletions

View File

@@ -1602,8 +1602,12 @@ public class ConnectivityManager {
/** The hardware returned an error. */ /** The hardware returned an error. */
public static final int ERROR_HARDWARE_ERROR = -31; public static final int ERROR_HARDWARE_ERROR = -31;
/** The NAT-T destination port for IPsec */
public static final int NATT_PORT = 4500; 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 Network mNetwork;
private final PacketKeepaliveCallback mCallback; private final PacketKeepaliveCallback mCallback;
private final Looper mLooper; private final Looper mLooper;

View File

@@ -16,8 +16,8 @@
package android.net; package android.net;
import android.system.OsConstants; import static android.net.ConnectivityManager.PacketKeepalive.*;
import android.net.ConnectivityManager;
import android.net.util.IpUtils; import android.net.util.IpUtils;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@@ -25,13 +25,10 @@ import android.system.OsConstants;
import android.util.Log; import android.util.Log;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress; import java.net.InetAddress;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import static android.net.ConnectivityManager.PacketKeepalive.*;
/** /**
* Represents the actual packets that are sent by the * Represents the actual packets that are sent by the
* {@link android.net.ConnectivityManager.PacketKeepalive} API. * {@link android.net.ConnectivityManager.PacketKeepalive} API.
@@ -98,13 +95,6 @@ public class KeepalivePacketData implements Parcelable {
InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort) InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort)
throws InvalidPacketException { 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)) { if (!(srcAddress instanceof Inet4Address) || !(dstAddress instanceof Inet4Address)) {
throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
} }

View File

@@ -172,7 +172,7 @@ public class KeepaliveTracker {
} }
private int checkInterval() { private int checkInterval() {
return mInterval >= 10 ? SUCCESS : ERROR_INVALID_INTERVAL; return mInterval >= MIN_INTERVAL ? SUCCESS : ERROR_INVALID_INTERVAL;
} }
private int isValid() { private int isValid() {

View File

@@ -3183,6 +3183,9 @@ public class ConnectivityServiceTest {
InetAddress dstIPv4 = InetAddress.getByName("8.8.8.8"); InetAddress dstIPv4 = InetAddress.getByName("8.8.8.8");
InetAddress dstIPv6 = InetAddress.getByName("2001:4860:4860::8888"); InetAddress dstIPv6 = InetAddress.getByName("2001:4860:4860::8888");
final int validKaInterval = 15;
final int invalidKaInterval = 9;
LinkProperties lp = new LinkProperties(); LinkProperties lp = new LinkProperties();
lp.setInterfaceName("wlan12"); lp.setInterfaceName("wlan12");
lp.addLinkAddress(new LinkAddress(myIPv6, 64)); lp.addLinkAddress(new LinkAddress(myIPv6, 64));
@@ -3197,36 +3200,37 @@ public class ConnectivityServiceTest {
PacketKeepalive ka; PacketKeepalive ka;
// Attempt to start keepalives with invalid parameters and check for errors. // 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); 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); 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); 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); callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS);
ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv6); // NAT-T is only supported for IPv4.
callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); // NAT-T is IPv4-only. 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); 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); 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); 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); callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED);
// Check that a started keepalive can be stopped. // Check that a started keepalive can be stopped.
mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS);
ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted(); callback.expectStarted();
mWiFiNetworkAgent.setStopKeepaliveError(PacketKeepalive.SUCCESS); mWiFiNetworkAgent.setStopKeepaliveError(PacketKeepalive.SUCCESS);
ka.stop(); ka.stop();
@@ -3234,7 +3238,7 @@ public class ConnectivityServiceTest {
// Check that deleting the IP address stops the keepalive. // Check that deleting the IP address stops the keepalive.
LinkProperties bogusLp = new LinkProperties(lp); 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(); callback.expectStarted();
bogusLp.removeLinkAddress(new LinkAddress(myIPv4, 25)); bogusLp.removeLinkAddress(new LinkAddress(myIPv4, 25));
bogusLp.addLinkAddress(new LinkAddress(notMyIPv4, 25)); bogusLp.addLinkAddress(new LinkAddress(notMyIPv4, 25));
@@ -3243,7 +3247,7 @@ public class ConnectivityServiceTest {
mWiFiNetworkAgent.sendLinkProperties(lp); mWiFiNetworkAgent.sendLinkProperties(lp);
// Check that a started keepalive is stopped correctly when the network disconnects. // 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(); callback.expectStarted();
mWiFiNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect();
waitFor(mWiFiNetworkAgent.getDisconnectedCV()); waitFor(mWiFiNetworkAgent.getDisconnectedCV());
@@ -3260,7 +3264,7 @@ public class ConnectivityServiceTest {
mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS); mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS);
// Check things work as expected when the keepalive is stopped and the network disconnects. // 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(); callback.expectStarted();
ka.stop(); ka.stop();
mWiFiNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect();
@@ -3274,13 +3278,14 @@ public class ConnectivityServiceTest {
// Check that keepalive slots start from 1 and increment. The first one gets slot 1. // Check that keepalive slots start from 1 and increment. The first one gets slot 1.
mWiFiNetworkAgent.setExpectedKeepaliveSlot(1); mWiFiNetworkAgent.setExpectedKeepaliveSlot(1);
ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4); ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted(); callback.expectStarted();
// The second one gets slot 2. // The second one gets slot 2.
mWiFiNetworkAgent.setExpectedKeepaliveSlot(2); mWiFiNetworkAgent.setExpectedKeepaliveSlot(2);
TestKeepaliveCallback callback2 = new TestKeepaliveCallback(); 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(); callback2.expectStarted();
// Now stop the first one and create a third. This also gets slot 1. // Now stop the first one and create a third. This also gets slot 1.
@@ -3289,7 +3294,8 @@ public class ConnectivityServiceTest {
mWiFiNetworkAgent.setExpectedKeepaliveSlot(1); mWiFiNetworkAgent.setExpectedKeepaliveSlot(1);
TestKeepaliveCallback callback3 = new TestKeepaliveCallback(); 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(); callback3.expectStarted();
ka2.stop(); ka2.stop();