Add 5G/NR QOS support

Bug: 155176305
Bug: 182317794
Test: atest ConnectivityServiceTest
      atest QosCallbackTrackerTest

Change-Id: Idf6d8a7c3b80bc50a2c1244ceaefea9381d40c2f
This commit is contained in:
Jayachandran C
2021-03-15 15:58:11 -07:00
parent 074c7d7537
commit d57b2853a3
6 changed files with 54 additions and 13 deletions

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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)));
}
/**

View File

@@ -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.
*

View File

@@ -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 {}