[DK2]Add new SocketKeepalive.start to dynamically control keepalive
Add SocketKeepalive.start with parameter to enable dynamic keepalive mode based on the existence of TCP connections. This supports IPSec mode to notify KeepaliveTracker to disable keepalive when keepalive is unnecessary to improve battery life. Keepalive is controlled by periodically TCP socket status check for both enable and disable. This is a transition commit and is expected to be updated based on the socket creation or destroy. Bug: 259000745 Test: m ; atest FrameworksNetTests Change-Id: Ie4d598d69a73c4931c7d0b6dfde0e459e5dca6b4
This commit is contained in:
parent
3d60bacfa0
commit
9ef4ffe8d4
1 changed files with 504 additions and 68 deletions
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
package android.net;
|
||||
|
||||
import static android.annotation.SystemApi.Client.PRIVILEGED_APPS;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.IntRange;
|
||||
import android.annotation.NonNull;
|
||||
|
|
@ -173,6 +175,27 @@ public abstract class SocketKeepalive implements AutoCloseable {
|
|||
})
|
||||
public @interface KeepaliveEvent {}
|
||||
|
||||
/**
|
||||
* Whether the system automatically toggles keepalive when no TCP connection is open on the VPN.
|
||||
*
|
||||
* If this flag is present, the system will monitor the VPN(s) running on top of the specified
|
||||
* network for open TCP connections. When no such connections are open, it will turn off the
|
||||
* keepalives to conserve battery power. When there is at least one such connection it will
|
||||
* turn on the keepalives to make sure functionality is preserved.
|
||||
*
|
||||
* This only works with {@link NattSocketKeepalive}.
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public static final int FLAG_AUTOMATIC_ON_OFF = 1 << 0;
|
||||
|
||||
/** @hide */
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef(prefix = { "FLAG_"}, flag = true, value = {
|
||||
FLAG_AUTOMATIC_ON_OFF
|
||||
})
|
||||
public @interface StartFlags {}
|
||||
|
||||
/**
|
||||
* The minimum interval in seconds between keepalive packet transmissions.
|
||||
*
|
||||
|
|
@ -294,13 +317,15 @@ public abstract class SocketKeepalive implements AutoCloseable {
|
|||
}
|
||||
|
||||
/**
|
||||
* Request that keepalive be started with the given {@code intervalSec}. See
|
||||
* {@link SocketKeepalive}. If the remote binder dies, or the binder call throws an exception
|
||||
* when invoking start or stop of the {@link SocketKeepalive}, a {@link RemoteException} will be
|
||||
* thrown into the {@code executor}. This is typically not important to catch because the remote
|
||||
* party is the system, so if it is not in shape to communicate through binder the system is
|
||||
* probably going down anyway. If the caller cares regardless, it can use a custom
|
||||
* {@link Executor} to catch the {@link RemoteException}.
|
||||
* Request that keepalive be started with the given {@code intervalSec}.
|
||||
*
|
||||
* See {@link SocketKeepalive}. If the remote binder dies, or the binder call throws an
|
||||
* exception when invoking start or stop of the {@link SocketKeepalive}, a
|
||||
* {@link RuntimeException} caused by a {@link RemoteException} will be thrown into the
|
||||
* {@link Executor}. This is typically not important to catch because the remote party is
|
||||
* the system, so if it is not in shape to communicate through binder the system is going
|
||||
* down anyway. If the caller still cares, it can use a custom {@link Executor} to catch the
|
||||
* {@link RuntimeException}.
|
||||
*
|
||||
* @param intervalSec The target interval in seconds between keepalive packet transmissions.
|
||||
* The interval should be between 10 seconds and 3600 seconds, otherwise
|
||||
|
|
@ -308,11 +333,35 @@ public abstract class SocketKeepalive implements AutoCloseable {
|
|||
*/
|
||||
public final void start(@IntRange(from = MIN_INTERVAL_SEC, to = MAX_INTERVAL_SEC)
|
||||
int intervalSec) {
|
||||
startImpl(intervalSec);
|
||||
startImpl(intervalSec, 0 /* flags */);
|
||||
}
|
||||
|
||||
/**
|
||||
* Request that keepalive be started with the given {@code intervalSec}.
|
||||
*
|
||||
* See {@link SocketKeepalive}. If the remote binder dies, or the binder call throws an
|
||||
* exception when invoking start or stop of the {@link SocketKeepalive}, a
|
||||
* {@link RuntimeException} caused by a {@link RemoteException} will be thrown into the
|
||||
* {@link Executor}. This is typically not important to catch because the remote party is
|
||||
* the system, so if it is not in shape to communicate through binder the system is going
|
||||
* down anyway. If the caller still cares, it can use a custom {@link Executor} to catch the
|
||||
* {@link RuntimeException}.
|
||||
*
|
||||
* @param intervalSec The target interval in seconds between keepalive packet transmissions.
|
||||
* The interval should be between 10 seconds and 3600 seconds. Otherwise,
|
||||
* 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.
|
||||
* @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);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
protected abstract void startImpl(int intervalSec);
|
||||
protected abstract void startImpl(int intervalSec, @StartFlags int flags);
|
||||
|
||||
/**
|
||||
* Requests that keepalive be stopped. The application must wait for {@link Callback#onStopped}
|
||||
|
|
|
|||
Loading…
Reference in a new issue