Add underpinned Network parameter in SocketKeepalive.start()

Take a Network parameter to have an one-to-one mapping between
keepalive and its underpinned network on the automatic keepalive.

Existing design could not really tell which network should the
automatic keepalive check for the TCP socket status if there are
multiple automatic keepalives enabled, e.g. Bothe IWLAN and VPN
on WiFi enable the automatic keepalive. The keepalive for IWLAN
should check if there are any TCP sockets on the IWLAN network
instead of VPN network.

Bug: 259000745
Test: atest FrameworksNetTests
Test: Cts in the follow up commit
Change-Id: I7353f4ef43e8fdad02c4d4a0bb5f6efa7d94c1b4
This commit is contained in:
chiachangwang
2023-02-14 09:22:05 +00:00
parent 7c17c283ea
commit 676c84ef98
7 changed files with 46 additions and 28 deletions

View File

@@ -188,7 +188,7 @@ interface IConnectivityManager
void startNattKeepaliveWithFd(in Network network, in ParcelFileDescriptor pfd, int resourceId,
int intervalSeconds, in ISocketKeepaliveCallback cb, String srcAddr,
String dstAddr, boolean automaticOnOffKeepalives);
String dstAddr, boolean automaticOnOffKeepalives, in Network underpinnedNetwork);
void startTcpKeepalive(in Network network, in ParcelFileDescriptor pfd, int intervalSeconds,
in ISocketKeepaliveCallback cb);

View File

@@ -66,10 +66,12 @@ public final class NattSocketKeepalive extends SocketKeepalive {
* the supplied {@link Callback} will see a call to
* {@link Callback#onError(int)} with {@link #ERROR_INVALID_INTERVAL}.
* @param flags Flags to enable/disable available options on this keepalive.
* @param underpinnedNetwork The underpinned network of this keepalive.
*
* @hide
*/
@Override
protected void startImpl(int intervalSec, int flags) {
protected void startImpl(int intervalSec, int flags, Network underpinnedNetwork) {
if (0 != (flags & ~FLAG_AUTOMATIC_ON_OFF)) {
throw new IllegalArgumentException("Illegal flag value for "
+ this.getClass().getSimpleName() + " : " + flags);
@@ -79,7 +81,8 @@ public final class NattSocketKeepalive extends SocketKeepalive {
try {
mService.startNattKeepaliveWithFd(mNetwork, mPfd, mResourceId,
intervalSec, mCallback, mSource.getHostAddress(),
mDestination.getHostAddress(), automaticOnOffKeepalives);
mDestination.getHostAddress(), automaticOnOffKeepalives,
underpinnedNetwork);
} catch (RemoteException e) {
Log.e(TAG, "Error starting socket keepalive: ", e);
throw e.rethrowFromSystemServer();

View File

@@ -355,7 +355,7 @@ public abstract class SocketKeepalive implements AutoCloseable {
*/
public final void start(@IntRange(from = MIN_INTERVAL_SEC, to = MAX_INTERVAL_SEC)
int intervalSec) {
startImpl(intervalSec, 0 /* flags */);
startImpl(intervalSec, 0 /* flags */, null /* underpinnedNetwork */);
}
/**
@@ -374,16 +374,18 @@ public abstract class SocketKeepalive implements AutoCloseable {
* the supplied {@link Callback} will see a call to
* {@link Callback#onError(int)} with {@link #ERROR_INVALID_INTERVAL}.
* @param flags Flags to enable/disable available options on this keepalive.
* @param underpinnedNetwork The underpinned network of this keepalive.
* @hide
*/
@SystemApi(client = PRIVILEGED_APPS)
public final void start(@IntRange(from = MIN_INTERVAL_SEC, to = MAX_INTERVAL_SEC)
int intervalSec, @StartFlags int flags) {
startImpl(intervalSec, flags);
int intervalSec, @StartFlags int flags, @NonNull Network underpinnedNetwork) {
startImpl(intervalSec, flags, underpinnedNetwork);
}
/** @hide */
protected abstract void startImpl(int intervalSec, @StartFlags int flags);
protected abstract void startImpl(int intervalSec, @StartFlags int flags,
Network underpinnedNetwork);
/**
* Requests that keepalive be stopped. The application must wait for {@link Callback#onStopped}

View File

@@ -50,7 +50,7 @@ public final class TcpSocketKeepalive extends SocketKeepalive {
* acknowledgement.
*/
@Override
protected void startImpl(int intervalSec, int flags) {
protected void startImpl(int intervalSec, int flags, Network underpinnedNetwork) {
if (0 != flags) {
throw new IllegalArgumentException("Illegal flag value for "
+ this.getClass().getSimpleName() + " : " + flags);