Merge "Add 5G/NR QOS support" am: df448f6eaa
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1643762 Change-Id: Icd4c21b9731256c9b3d39bffc5fddc43276c5fda
This commit is contained in:
committed by
Automerger Merge Worker
commit
6ed7c1c523
@@ -230,8 +230,8 @@ package android.net {
|
||||
method public final void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities);
|
||||
method public final void sendNetworkScore(@IntRange(from=0, to=99) int);
|
||||
method public final void sendQosCallbackError(int, int);
|
||||
method public final void sendQosSessionAvailable(int, int, @NonNull android.telephony.data.EpsBearerQosSessionAttributes);
|
||||
method public final void sendQosSessionLost(int, int);
|
||||
method public final void sendQosSessionAvailable(int, int, @NonNull android.net.QosSessionAttributes);
|
||||
method public final void sendQosSessionLost(int, int, int);
|
||||
method public final void sendSocketKeepaliveEvent(int, int);
|
||||
method public final void setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>);
|
||||
method public void unregister();
|
||||
@@ -363,6 +363,7 @@ package android.net {
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.net.QosSession> CREATOR;
|
||||
field public static final int TYPE_EPS_BEARER = 1; // 0x1
|
||||
field public static final int TYPE_NR_BEARER = 2; // 0x2
|
||||
}
|
||||
|
||||
public interface QosSessionAttributes {
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.net.NetworkInfo;
|
||||
import android.net.NetworkScore;
|
||||
import android.net.QosSession;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
|
||||
/**
|
||||
* Interface for NetworkAgents to send network properties.
|
||||
@@ -37,6 +38,7 @@ oneway interface INetworkAgentRegistry {
|
||||
void sendSocketKeepaliveEvent(int slot, int reason);
|
||||
void sendUnderlyingNetworks(in @nullable List<Network> networks);
|
||||
void sendEpsQosSessionAvailable(int callbackId, in QosSession session, in EpsBearerQosSessionAttributes attributes);
|
||||
void sendNrQosSessionAvailable(int callbackId, in QosSession session, in NrQosSessionAttributes attributes);
|
||||
void sendQosSessionLost(int qosCallbackId, in QosSession session);
|
||||
void sendQosCallbackError(int qosCallbackId, int exceptionType);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package android.net;
|
||||
import android.os.Bundle;
|
||||
import android.net.QosSession;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
|
||||
/**
|
||||
* AIDL interface for QosCallback
|
||||
@@ -29,6 +30,8 @@ oneway interface IQosCallback
|
||||
{
|
||||
void onQosEpsBearerSessionAvailable(in QosSession session,
|
||||
in EpsBearerQosSessionAttributes attributes);
|
||||
void onNrQosSessionAvailable(in QosSession session,
|
||||
in NrQosSessionAttributes attributes);
|
||||
void onQosSessionLost(in QosSession session);
|
||||
void onError(in int type);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.RemoteException;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
@@ -1160,29 +1161,37 @@ public abstract class NetworkAgent {
|
||||
|
||||
|
||||
/**
|
||||
* Sends the attributes of Eps Bearer Qos Session back to the Application
|
||||
* Sends the attributes of Qos Session back to the Application
|
||||
*
|
||||
* @param qosCallbackId the callback id that the session belongs to
|
||||
* @param sessionId the unique session id across all Eps Bearer Qos Sessions
|
||||
* @param attributes the attributes of the Eps Qos Session
|
||||
* @param sessionId the unique session id across all Qos Sessions
|
||||
* @param attributes the attributes of the Qos Session
|
||||
*/
|
||||
public final void sendQosSessionAvailable(final int qosCallbackId, final int sessionId,
|
||||
@NonNull final EpsBearerQosSessionAttributes attributes) {
|
||||
@NonNull final QosSessionAttributes attributes) {
|
||||
Objects.requireNonNull(attributes, "The attributes must be non-null");
|
||||
queueOrSendMessage(ra -> ra.sendEpsQosSessionAvailable(qosCallbackId,
|
||||
new QosSession(sessionId, QosSession.TYPE_EPS_BEARER),
|
||||
attributes));
|
||||
if (attributes instanceof EpsBearerQosSessionAttributes) {
|
||||
queueOrSendMessage(ra -> ra.sendEpsQosSessionAvailable(qosCallbackId,
|
||||
new QosSession(sessionId, QosSession.TYPE_EPS_BEARER),
|
||||
(EpsBearerQosSessionAttributes)attributes));
|
||||
} else if (attributes instanceof NrQosSessionAttributes) {
|
||||
queueOrSendMessage(ra -> ra.sendNrQosSessionAvailable(qosCallbackId,
|
||||
new QosSession(sessionId, QosSession.TYPE_NR_BEARER),
|
||||
(NrQosSessionAttributes)attributes));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends event that the Eps Qos Session was lost.
|
||||
* Sends event that the Qos Session was lost.
|
||||
*
|
||||
* @param qosCallbackId the callback id that the session belongs to
|
||||
* @param sessionId the unique session id across all Eps Bearer Qos Sessions
|
||||
* @param sessionId the unique session id across all Qos Sessions
|
||||
* @param qosSessionType the session type {@code QosSesson#QosSessionType}
|
||||
*/
|
||||
public final void sendQosSessionLost(final int qosCallbackId, final int sessionId) {
|
||||
public final void sendQosSessionLost(final int qosCallbackId,
|
||||
final int sessionId, final int qosSessionType) {
|
||||
queueOrSendMessage(ra -> ra.sendQosSessionLost(qosCallbackId,
|
||||
new QosSession(sessionId, QosSession.TYPE_EPS_BEARER)));
|
||||
new QosSession(sessionId, qosSessionType)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,6 +19,7 @@ package android.net;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
|
||||
@@ -83,6 +84,25 @@ class QosCallbackConnection extends android.net.IQosCallback.Stub {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when either the {@link NrQosSessionAttributes} has changed or on the first time
|
||||
* the attributes have become available.
|
||||
*
|
||||
* @param session the session that is now available
|
||||
* @param attributes the corresponding attributes of session
|
||||
*/
|
||||
@Override
|
||||
public void onNrQosSessionAvailable(@NonNull final QosSession session,
|
||||
@NonNull final NrQosSessionAttributes attributes) {
|
||||
|
||||
mExecutor.execute(() -> {
|
||||
final QosCallback callback = mCallback;
|
||||
if (callback != null) {
|
||||
callback.onQosSessionAvailable(session, attributes);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the session is lost.
|
||||
*
|
||||
|
||||
@@ -36,6 +36,11 @@ public final class QosSession implements Parcelable {
|
||||
*/
|
||||
public static final int TYPE_EPS_BEARER = 1;
|
||||
|
||||
/**
|
||||
* The {@link QosSession} is a NR Session.
|
||||
*/
|
||||
public static final int TYPE_NR_BEARER = 2;
|
||||
|
||||
private final int mSessionId;
|
||||
|
||||
private final int mSessionType;
|
||||
@@ -100,6 +105,7 @@ public final class QosSession implements Parcelable {
|
||||
*/
|
||||
@IntDef(value = {
|
||||
TYPE_EPS_BEARER,
|
||||
TYPE_NR_BEARER,
|
||||
})
|
||||
@interface QosSessionType {}
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
import android.util.SparseArray;
|
||||
@@ -633,7 +634,13 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
||||
@Override
|
||||
public void sendEpsQosSessionAvailable(final int qosCallbackId, final QosSession session,
|
||||
final EpsBearerQosSessionAttributes attributes) {
|
||||
mQosCallbackTracker.sendEventQosSessionAvailable(qosCallbackId, session, attributes);
|
||||
mQosCallbackTracker.sendEventEpsQosSessionAvailable(qosCallbackId, session, attributes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendNrQosSessionAvailable(final int qosCallbackId, final QosSession session,
|
||||
final NrQosSessionAttributes attributes) {
|
||||
mQosCallbackTracker.sendEventNrQosSessionAvailable(qosCallbackId, session, attributes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.net.QosSession;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.Objects;
|
||||
@@ -146,13 +147,23 @@ class QosCallbackAgentConnection implements IBinder.DeathRecipient {
|
||||
mNetworkAgentInfo.onQosCallbackUnregistered(mAgentCallbackId);
|
||||
}
|
||||
|
||||
void sendEventQosSessionAvailable(final QosSession session,
|
||||
void sendEventEpsQosSessionAvailable(final QosSession session,
|
||||
final EpsBearerQosSessionAttributes attributes) {
|
||||
try {
|
||||
if (DBG) log("sendEventQosSessionAvailable: sending...");
|
||||
if (DBG) log("sendEventEpsQosSessionAvailable: sending...");
|
||||
mCallback.onQosEpsBearerSessionAvailable(session, attributes);
|
||||
} catch (final RemoteException e) {
|
||||
loge("sendEventQosSessionAvailable: remote exception", e);
|
||||
loge("sendEventEpsQosSessionAvailable: remote exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
void sendEventNrQosSessionAvailable(final QosSession session,
|
||||
final NrQosSessionAttributes attributes) {
|
||||
try {
|
||||
if (DBG) log("sendEventNrQosSessionAvailable: sending...");
|
||||
mCallback.onNrQosSessionAvailable(session, attributes);
|
||||
} catch (final RemoteException e) {
|
||||
loge("sendEventNrQosSessionAvailable: remote exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.os.Binder;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.net.module.util.CollectionUtils;
|
||||
@@ -179,17 +180,31 @@ public class QosCallbackTracker {
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the NetworkAgent sends the qos session available event
|
||||
* Called when the NetworkAgent sends the qos session available event for EPS
|
||||
*
|
||||
* @param qosCallbackId the callback id that the qos session is now available to
|
||||
* @param session the qos session that is now available
|
||||
* @param attributes the qos attributes that are now available on the qos session
|
||||
*/
|
||||
public void sendEventQosSessionAvailable(final int qosCallbackId,
|
||||
public void sendEventEpsQosSessionAvailable(final int qosCallbackId,
|
||||
final QosSession session,
|
||||
final EpsBearerQosSessionAttributes attributes) {
|
||||
runOnAgentConnection(qosCallbackId, "sendEventQosSessionAvailable: ",
|
||||
ac -> ac.sendEventQosSessionAvailable(session, attributes));
|
||||
runOnAgentConnection(qosCallbackId, "sendEventEpsQosSessionAvailable: ",
|
||||
ac -> ac.sendEventEpsQosSessionAvailable(session, attributes));
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the NetworkAgent sends the qos session available event for NR
|
||||
*
|
||||
* @param qosCallbackId the callback id that the qos session is now available to
|
||||
* @param session the qos session that is now available
|
||||
* @param attributes the qos attributes that are now available on the qos session
|
||||
*/
|
||||
public void sendEventNrQosSessionAvailable(final int qosCallbackId,
|
||||
final QosSession session,
|
||||
final NrQosSessionAttributes attributes) {
|
||||
runOnAgentConnection(qosCallbackId, "sendEventNrQosSessionAvailable: ",
|
||||
ac -> ac.sendEventNrQosSessionAvailable(session, attributes));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -266,6 +266,7 @@ import android.security.Credentials;
|
||||
import android.system.Os;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.telephony.data.EpsBearerQosSessionAttributes;
|
||||
import android.telephony.data.NrQosSessionAttributes;
|
||||
import android.test.mock.MockContentResolver;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArraySet;
|
||||
@@ -9966,13 +9967,43 @@ public class ConnectivityServiceTest {
|
||||
&& session.getSessionType() == QosSession.TYPE_EPS_BEARER), eq(attributes));
|
||||
|
||||
mQosCallbackMockHelper.mAgentWrapper.getNetworkAgent()
|
||||
.sendQosSessionLost(qosCallbackId, sessionId);
|
||||
.sendQosSessionLost(qosCallbackId, sessionId, QosSession.TYPE_EPS_BEARER);
|
||||
waitForIdle();
|
||||
verify(mQosCallbackMockHelper.mCallback).onQosSessionLost(argThat(session ->
|
||||
session.getSessionId() == sessionId
|
||||
&& session.getSessionType() == QosSession.TYPE_EPS_BEARER));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNrQosCallbackAvailableAndLost() throws Exception {
|
||||
mQosCallbackMockHelper = new QosCallbackMockHelper();
|
||||
final int sessionId = 10;
|
||||
final int qosCallbackId = 1;
|
||||
|
||||
when(mQosCallbackMockHelper.mFilter.validate())
|
||||
.thenReturn(QosCallbackException.EX_TYPE_FILTER_NONE);
|
||||
mQosCallbackMockHelper.registerQosCallback(
|
||||
mQosCallbackMockHelper.mFilter, mQosCallbackMockHelper.mCallback);
|
||||
waitForIdle();
|
||||
|
||||
final NrQosSessionAttributes attributes = new NrQosSessionAttributes(
|
||||
1, 2, 3, 4, 5, 6, 7, new ArrayList<>());
|
||||
mQosCallbackMockHelper.mAgentWrapper.getNetworkAgent()
|
||||
.sendQosSessionAvailable(qosCallbackId, sessionId, attributes);
|
||||
waitForIdle();
|
||||
|
||||
verify(mQosCallbackMockHelper.mCallback).onNrQosSessionAvailable(argThat(session ->
|
||||
session.getSessionId() == sessionId
|
||||
&& session.getSessionType() == QosSession.TYPE_NR_BEARER), eq(attributes));
|
||||
|
||||
mQosCallbackMockHelper.mAgentWrapper.getNetworkAgent()
|
||||
.sendQosSessionLost(qosCallbackId, sessionId, QosSession.TYPE_NR_BEARER);
|
||||
waitForIdle();
|
||||
verify(mQosCallbackMockHelper.mCallback).onQosSessionLost(argThat(session ->
|
||||
session.getSessionId() == sessionId
|
||||
&& session.getSessionType() == QosSession.TYPE_NR_BEARER));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQosCallbackTooManyRequests() throws Exception {
|
||||
mQosCallbackMockHelper = new QosCallbackMockHelper();
|
||||
|
||||
Reference in New Issue
Block a user