[SP28] Add API for set data warning
To have better control and race-free of set data warning to tether offload hardware, an interface of set warning and limit at the same time in the NetworkStatsProvider is needed. This is a no-op change which expose such interface with minimum changes in service side to get build pass. The implementation would be included in follow-up patches. Test: atest NetworkStatsServiceTest Test: atest NetworkPolicyManagerServiceTest Test: atest GtsNetworkStackHostTestCases Test: m doc-comment-check-docs Bug: 149467454 Bug: 170699770 Bug: 170179169 Ignore-AOSP-First: avoid long automerger delay Change-Id: I6ee661497f7dedb871c85786d1950cab951d8aa2
This commit is contained in:
@@ -23,6 +23,6 @@ package android.net.netstats.provider;
|
||||
*/
|
||||
oneway interface INetworkStatsProvider {
|
||||
void onRequestStatsUpdate(int token);
|
||||
void onSetLimit(String iface, long quotaBytes);
|
||||
void onSetAlert(long quotaBytes);
|
||||
void onSetWarningAndLimit(String iface, long warningBytes, long limitBytes);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,6 @@ import android.net.NetworkStats;
|
||||
oneway interface INetworkStatsProviderCallback {
|
||||
void notifyStatsUpdated(int token, in NetworkStats ifaceStats, in NetworkStats uidStats);
|
||||
void notifyAlertReached();
|
||||
void notifyLimitReached();
|
||||
void notifyWarningOrLimitReached();
|
||||
void unregister();
|
||||
}
|
||||
|
||||
@@ -29,7 +29,8 @@ import android.os.RemoteException;
|
||||
@SystemApi
|
||||
public abstract class NetworkStatsProvider {
|
||||
/**
|
||||
* A value used by {@link #onSetLimit} and {@link #onSetAlert} indicates there is no limit.
|
||||
* A value used by {@link #onSetLimit}, {@link #onSetAlert} and {@link #onSetWarningAndLimit}
|
||||
* indicates there is no limit.
|
||||
*/
|
||||
public static final int QUOTA_UNLIMITED = -1;
|
||||
|
||||
@@ -42,13 +43,13 @@ public abstract class NetworkStatsProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSetLimit(String iface, long quotaBytes) {
|
||||
NetworkStatsProvider.this.onSetLimit(iface, quotaBytes);
|
||||
public void onSetAlert(long quotaBytes) {
|
||||
NetworkStatsProvider.this.onSetAlert(quotaBytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSetAlert(long quotaBytes) {
|
||||
NetworkStatsProvider.this.onSetAlert(quotaBytes);
|
||||
public void onSetWarningAndLimit(String iface, long warningBytes, long limitBytes) {
|
||||
NetworkStatsProvider.this.onSetWarningAndLimit(iface, warningBytes, limitBytes);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -145,11 +146,28 @@ public abstract class NetworkStatsProvider {
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify system that the quota set by {@code onSetLimit} has been reached.
|
||||
* Notify system that the warning set by {@link #onSetWarningAndLimit} has been reached.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
// TODO: Expose as system API.
|
||||
public void notifyWarningReached() {
|
||||
try {
|
||||
// Reuse the code path to notify warning reached with limit reached
|
||||
// since framework handles them in the same way.
|
||||
getProviderCallbackBinderOrThrow().notifyWarningOrLimitReached();
|
||||
} catch (RemoteException e) {
|
||||
e.rethrowAsRuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify system that the quota set by {@link #onSetLimit} or limit set by
|
||||
* {@link #onSetWarningAndLimit} has been reached.
|
||||
*/
|
||||
public void notifyLimitReached() {
|
||||
try {
|
||||
getProviderCallbackBinderOrThrow().notifyLimitReached();
|
||||
getProviderCallbackBinderOrThrow().notifyWarningOrLimitReached();
|
||||
} catch (RemoteException e) {
|
||||
e.rethrowAsRuntimeException();
|
||||
}
|
||||
@@ -180,8 +198,34 @@ public abstract class NetworkStatsProvider {
|
||||
* @param quotaBytes the quota defined as the number of bytes, starting from zero and counting
|
||||
* from now. A value of {@link #QUOTA_UNLIMITED} indicates there is no limit.
|
||||
*/
|
||||
// TODO: deprecate this once onSetWarningAndLimit is ready.
|
||||
public abstract void onSetLimit(@NonNull String iface, long quotaBytes);
|
||||
|
||||
/**
|
||||
* Called by {@code NetworkStatsService} when setting the interface quotas for the specified
|
||||
* upstream interface. If a provider implements {@link #onSetWarningAndLimit}, the system
|
||||
* will not call {@link #onSetLimit}. When this method is called, the implementation
|
||||
* should behave as follows:
|
||||
* 1. If {@code warningBytes} is reached on {@code iface}, block all further traffic on
|
||||
* {@code iface} and call {@link NetworkStatsProvider@notifyWarningReached()}.
|
||||
* 2. If {@code limitBytes} is reached on {@code iface}, block all further traffic on
|
||||
* {@code iface} and call {@link NetworkStatsProvider#notifyLimitReached()}.
|
||||
*
|
||||
* @param iface the interface requiring the operation.
|
||||
* @param warningBytes the warning defined as the number of bytes, starting from zero and
|
||||
* counting from now. A value of {@link #QUOTA_UNLIMITED} indicates
|
||||
* there is no warning.
|
||||
* @param limitBytes the limit defined as the number of bytes, starting from zero and counting
|
||||
* from now. A value of {@link #QUOTA_UNLIMITED} indicates there is no limit.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
// TODO: Expose as system API.
|
||||
public void onSetWarningAndLimit(@NonNull String iface, long warningBytes, long limitBytes) {
|
||||
// Backward compatibility for those who didn't override this function.
|
||||
onSetLimit(iface, limitBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by {@code NetworkStatsService} when setting the alert bytes. Custom implementations
|
||||
* MUST call {@link NetworkStatsProvider#notifyAlertReached()} when {@code quotaBytes} bytes
|
||||
|
||||
@@ -1676,7 +1676,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
@Override
|
||||
public void setStatsProviderLimitAsync(@NonNull String iface, long quota) {
|
||||
if (LOGV) Slog.v(TAG, "setStatsProviderLimitAsync(" + iface + "," + quota + ")");
|
||||
invokeForAllStatsProviderCallbacks((cb) -> cb.mProvider.onSetLimit(iface, quota));
|
||||
// TODO: Set warning accordingly.
|
||||
invokeForAllStatsProviderCallbacks((cb) -> cb.mProvider.onSetWarningAndLimit(iface,
|
||||
NetworkStatsProvider.QUOTA_UNLIMITED, quota));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2071,10 +2073,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyLimitReached() {
|
||||
Log.d(TAG, mTag + ": onLimitReached");
|
||||
public void notifyWarningOrLimitReached() {
|
||||
Log.d(TAG, mTag + ": notifyWarningOrLimitReached");
|
||||
LocalServices.getService(NetworkPolicyManagerInternal.class)
|
||||
.onStatsProviderLimitReached(mTag);
|
||||
.onStatsProviderWarningOrLimitReached(mTag);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user