Merge "Add QoS filter matching and unit tests"

This commit is contained in:
Treehugger Robot
2021-03-02 22:39:09 +00:00
committed by Gerrit Code Review
6 changed files with 225 additions and 164 deletions

View File

@@ -136,7 +136,7 @@ public final class DataCallResponse implements Parcelable {
private final @HandoverFailureMode int mHandoverFailureMode;
private final int mPduSessionId;
private final Qos mDefaultQos;
private final List<QosSession> mQosSessions;
private final List<QosBearerSession> mQosBearerSessions;
private final SliceInfo mSliceInfo;
/**
@@ -187,7 +187,7 @@ public final class DataCallResponse implements Parcelable {
mHandoverFailureMode = HANDOVER_FAILURE_MODE_LEGACY;
mPduSessionId = PDU_SESSION_ID_NOT_SET;
mDefaultQos = null;
mQosSessions = new ArrayList<>();
mQosBearerSessions = new ArrayList<>();
mSliceInfo = null;
}
@@ -197,7 +197,7 @@ public final class DataCallResponse implements Parcelable {
@Nullable List<InetAddress> dnsAddresses, @Nullable List<InetAddress> gatewayAddresses,
@Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6,
@HandoverFailureMode int handoverFailureMode, int pduSessionId,
@Nullable Qos defaultQos, @Nullable List<QosSession> qosSessions,
@Nullable Qos defaultQos, @Nullable List<QosBearerSession> qosBearerSessions,
@Nullable SliceInfo sliceInfo) {
mCause = cause;
mSuggestedRetryTime = suggestedRetryTime;
@@ -219,7 +219,7 @@ public final class DataCallResponse implements Parcelable {
mHandoverFailureMode = handoverFailureMode;
mPduSessionId = pduSessionId;
mDefaultQos = defaultQos;
mQosSessions = qosSessions;
mQosBearerSessions = qosBearerSessions;
mSliceInfo = sliceInfo;
}
@@ -246,8 +246,8 @@ public final class DataCallResponse implements Parcelable {
mHandoverFailureMode = source.readInt();
mPduSessionId = source.readInt();
mDefaultQos = source.readParcelable(Qos.class.getClassLoader());
mQosSessions = new ArrayList<>();
source.readList(mQosSessions, QosSession.class.getClassLoader());
mQosBearerSessions = new ArrayList<>();
source.readList(mQosBearerSessions, QosBearerSession.class.getClassLoader());
mSliceInfo = source.readParcelable(SliceInfo.class.getClassLoader());
}
@@ -393,8 +393,8 @@ public final class DataCallResponse implements Parcelable {
* @hide
*/
@NonNull
public List<QosSession> getQosSessions() {
return mQosSessions;
public List<QosBearerSession> getQosBearerSessions() {
return mQosBearerSessions;
}
/**
@@ -426,7 +426,7 @@ public final class DataCallResponse implements Parcelable {
.append(" handoverFailureMode=").append(getHandoverFailureMode())
.append(" pduSessionId=").append(getPduSessionId())
.append(" defaultQos=").append(mDefaultQos)
.append(" qosSessions=").append(mQosSessions)
.append(" qosBearerSessions=").append(mQosBearerSessions)
.append(" sliceInfo=").append(mSliceInfo)
.append("}");
return sb.toString();
@@ -446,10 +446,10 @@ public final class DataCallResponse implements Parcelable {
mDefaultQos == other.mDefaultQos :
mDefaultQos.equals(other.mDefaultQos);
final boolean isQosSessionsSame = (mQosSessions == null || mQosSessions == null) ?
mQosSessions == other.mQosSessions :
mQosSessions.size() == other.mQosSessions.size()
&& mQosSessions.containsAll(other.mQosSessions);
final boolean isQosBearerSessionsSame = (mQosBearerSessions == null || mQosBearerSessions == null) ?
mQosBearerSessions == other.mQosBearerSessions :
mQosBearerSessions.size() == other.mQosBearerSessions.size()
&& mQosBearerSessions.containsAll(other.mQosBearerSessions);
return mCause == other.mCause
&& mSuggestedRetryTime == other.mSuggestedRetryTime
@@ -471,7 +471,7 @@ public final class DataCallResponse implements Parcelable {
&& mHandoverFailureMode == other.mHandoverFailureMode
&& mPduSessionId == other.mPduSessionId
&& isQosSame
&& isQosSessionsSame
&& isQosBearerSessionsSame
&& Objects.equals(mSliceInfo, other.mSliceInfo);
}
@@ -480,7 +480,7 @@ public final class DataCallResponse implements Parcelable {
return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType,
mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses,
mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mDefaultQos,
mQosSessions, mSliceInfo);
mQosBearerSessions, mSliceInfo);
}
@Override
@@ -510,7 +510,7 @@ public final class DataCallResponse implements Parcelable {
} else {
dest.writeParcelable((NrQos)mDefaultQos, flags);
}
dest.writeList(mQosSessions);
dest.writeList(mQosBearerSessions);
dest.writeParcelable(mSliceInfo, flags);
}
@@ -593,7 +593,7 @@ public final class DataCallResponse implements Parcelable {
private Qos mDefaultQos;
private List<QosSession> mQosSessions = new ArrayList<>();
private List<QosBearerSession> mQosBearerSessions = new ArrayList<>();
private SliceInfo mSliceInfo;
@@ -807,15 +807,16 @@ public final class DataCallResponse implements Parcelable {
/**
* Set the dedicated bearer QOS sessions for this data connection.
*
* @param qosSessions Dedicated bearer QOS (Quality Of Service) sessions received
* @param qosBearerSessions Dedicated bearer QOS (Quality Of Service) sessions received
* from network.
*
* @return The same instance of the builder.
*
* @hide
*/
public @NonNull Builder setQosSessions(@NonNull List<QosSession> qosSessions) {
mQosSessions = qosSessions;
public @NonNull Builder setQosBearerSessions(
@NonNull List<QosBearerSession> qosBearerSessions) {
mQosBearerSessions = qosBearerSessions;
return this;
}
@@ -843,7 +844,7 @@ public final class DataCallResponse implements Parcelable {
return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
mPcscfAddresses, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId,
mDefaultQos, mQosSessions, mSliceInfo);
mDefaultQos, mQosBearerSessions, mSliceInfo);
}
}
}

View File

@@ -48,6 +48,10 @@ public final class EpsQos extends Qos implements Parcelable {
qosClassId = source.readInt();
}
public int getQci() {
return qosClassId;
}
public static @NonNull EpsQos createFromParcelBody(@NonNull Parcel in) {
return new EpsQos(in);
}

View File

@@ -56,7 +56,15 @@ public abstract class Qos {
this.uplink = new QosBandwidth(uplink.maxBitrateKbps, uplink.guaranteedBitrateKbps);
}
static class QosBandwidth implements Parcelable {
public QosBandwidth getDownlinkBandwidth() {
return downlink;
}
public QosBandwidth getUplinkBandwidth() {
return uplink;
}
public static class QosBandwidth implements Parcelable {
int maxBitrateKbps;
int guaranteedBitrateKbps;
@@ -73,6 +81,14 @@ public abstract class Qos {
guaranteedBitrateKbps = source.readInt();
}
public int getMaxBitrateKbps() {
return maxBitrateKbps;
}
public int getGuaranteedBitrateKbps() {
return guaranteedBitrateKbps;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(maxBitrateKbps);

View File

@@ -38,7 +38,7 @@ import java.util.Objects;
*
* @hide
*/
public final class QosFilter implements Parcelable {
public final class QosBearerFilter implements Parcelable {
private List<LinkAddress> localAddresses;
private List<LinkAddress> remoteAddresses;
@@ -74,7 +74,7 @@ public final class QosFilter implements Parcelable {
@IntDef(prefix = "QOS_FILTER_DIRECTION_",
value = {QOS_FILTER_DIRECTION_DOWNLINK, QOS_FILTER_DIRECTION_UPLINK,
QOS_FILTER_DIRECTION_BIDIRECTIONAL})
public @interface QosFilterDirection {}
public @interface QosBearerFilterDirection {}
public static final int QOS_FILTER_DIRECTION_DOWNLINK =
android.hardware.radio.V1_6.QosFilterDirection.DOWNLINK;
@@ -83,7 +83,7 @@ public final class QosFilter implements Parcelable {
public static final int QOS_FILTER_DIRECTION_BIDIRECTIONAL =
android.hardware.radio.V1_6.QosFilterDirection.BIDIRECTIONAL;
@QosFilterDirection
@QosBearerFilterDirection
private int filterDirection;
/**
@@ -92,7 +92,7 @@ public final class QosFilter implements Parcelable {
*/
private int precedence;
QosFilter() {
QosBearerFilter() {
localAddresses = new ArrayList<>();
remoteAddresses = new ArrayList<>();
localPort = new PortRange();
@@ -101,7 +101,7 @@ public final class QosFilter implements Parcelable {
filterDirection = QOS_FILTER_DIRECTION_BIDIRECTIONAL;
}
public QosFilter(List<LinkAddress> localAddresses, List<LinkAddress> remoteAddresses,
public QosBearerFilter(List<LinkAddress> localAddresses, List<LinkAddress> remoteAddresses,
PortRange localPort, PortRange remotePort, int protocol, int tos,
long flowLabel, long spi, int direction, int precedence) {
this.localAddresses = localAddresses;
@@ -116,10 +116,30 @@ public final class QosFilter implements Parcelable {
this.precedence = precedence;
}
public List<LinkAddress> getLocalAddresses() {
return localAddresses;
}
public List<LinkAddress> getRemoteAddresses() {
return remoteAddresses;
}
public PortRange getLocalPortRange() {
return localPort;
}
public PortRange getRemotePortRange() {
return remotePort;
}
public int getPrecedence() {
return precedence;
}
/** @hide */
public static @NonNull QosFilter create(
public static @NonNull QosBearerFilter create(
@NonNull android.hardware.radio.V1_6.QosFilter qosFilter) {
QosFilter ret = new QosFilter();
QosBearerFilter ret = new QosBearerFilter();
String[] localAddresses = qosFilter.localAddresses.stream().toArray(String[]::new);
if (localAddresses != null) {
@@ -202,6 +222,14 @@ public final class QosFilter implements Parcelable {
this.end = end;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(start);
@@ -254,7 +282,7 @@ public final class QosFilter implements Parcelable {
@Override
public String toString() {
return "QosFilter {"
return "QosBearerFilter {"
+ " localAddresses=" + localAddresses
+ " remoteAddresses=" + remoteAddresses
+ " localPort=" + localPort
@@ -278,11 +306,11 @@ public final class QosFilter implements Parcelable {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof QosFilter)) {
if (o == null || !(o instanceof QosBearerFilter)) {
return false;
}
QosFilter other = (QosFilter) o;
QosBearerFilter other = (QosBearerFilter) o;
return localAddresses.size() == other.localAddresses.size()
&& localAddresses.containsAll(other.localAddresses)
@@ -324,7 +352,7 @@ public final class QosFilter implements Parcelable {
LinkAddress.LIFETIME_UNKNOWN, LinkAddress.LIFETIME_UNKNOWN);
}
private QosFilter(Parcel source) {
private QosBearerFilter(Parcel source) {
localAddresses = new ArrayList<>();
source.readList(localAddresses, LinkAddress.class.getClassLoader());
remoteAddresses = new ArrayList<>();
@@ -358,16 +386,16 @@ public final class QosFilter implements Parcelable {
return 0;
}
public static final @NonNull Parcelable.Creator<QosFilter> CREATOR =
new Parcelable.Creator<QosFilter>() {
public static final @NonNull Parcelable.Creator<QosBearerFilter> CREATOR =
new Parcelable.Creator<QosBearerFilter>() {
@Override
public QosFilter createFromParcel(Parcel source) {
return new QosFilter(source);
public QosBearerFilter createFromParcel(Parcel source) {
return new QosBearerFilter(source);
}
@Override
public QosFilter[] newArray(int size) {
return new QosFilter[size];
public QosBearerFilter[] newArray(int size) {
return new QosBearerFilter[size];
}
};
}

View File

@@ -0,0 +1,137 @@
/**
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.telephony.data;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Class that stores information specific to QOS session.
*
* @hide
*/
public final class QosBearerSession implements Parcelable{
final int qosBearerSessionId;
final Qos qos;
final List<QosBearerFilter> qosBearerFilterList;
public QosBearerSession(int qosBearerSessionId, @NonNull Qos qos, @NonNull List<QosBearerFilter> qosBearerFilterList) {
this.qosBearerSessionId = qosBearerSessionId;
this.qos = qos;
this.qosBearerFilterList = qosBearerFilterList;
}
private QosBearerSession(Parcel source) {
qosBearerSessionId = source.readInt();
qos = source.readParcelable(Qos.class.getClassLoader());
qosBearerFilterList = new ArrayList<>();
source.readList(qosBearerFilterList, QosBearerFilter.class.getClassLoader());
}
public int getQosBearerSessionId() {
return qosBearerSessionId;
}
public Qos getQos() {
return qos;
}
public List<QosBearerFilter> getQosBearerFilterList() {
return qosBearerFilterList;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(qosBearerSessionId);
if (qos.getType() == Qos.QOS_TYPE_EPS) {
dest.writeParcelable((EpsQos)qos, flags);
} else {
dest.writeParcelable((NrQos)qos, flags);
}
dest.writeList(qosBearerFilterList);
}
public static @NonNull QosBearerSession create(
@NonNull android.hardware.radio.V1_6.QosSession qosSession) {
List<QosBearerFilter> qosBearerFilters = new ArrayList<>();
if (qosSession.qosFilters != null) {
for (android.hardware.radio.V1_6.QosFilter filter : qosSession.qosFilters) {
qosBearerFilters.add(QosBearerFilter.create(filter));
}
}
return new QosBearerSession(
qosSession.qosSessionId,
Qos.create(qosSession.qos),
qosBearerFilters);
}
@Override
public int describeContents() {
return 0;
}
@Override
public String toString() {
return "QosBearerSession {"
+ " qosBearerSessionId=" + qosBearerSessionId
+ " qos=" + qos
+ " qosBearerFilterList=" + qosBearerFilterList + "}";
}
@Override
public int hashCode() {
return Objects.hash(qosBearerSessionId, qos, qosBearerFilterList);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof QosBearerSession)) {
return false;
}
QosBearerSession other = (QosBearerSession) o;
return this.qosBearerSessionId == other.qosBearerSessionId
&& this.qos.equals(other.qos)
&& this.qosBearerFilterList.size() == other.qosBearerFilterList.size()
&& this.qosBearerFilterList.containsAll(other.qosBearerFilterList);
}
public static final @NonNull Parcelable.Creator<QosBearerSession> CREATOR =
new Parcelable.Creator<QosBearerSession>() {
@Override
public QosBearerSession createFromParcel(Parcel source) {
return new QosBearerSession(source);
}
@Override
public QosBearerSession[] newArray(int size) {
return new QosBearerSession[size];
}
};
}

View File

@@ -1,125 +0,0 @@
/**
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.telephony.data;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Class that stores information specific to QOS session.
*
* @hide
*/
public final class QosSession implements Parcelable{
final int qosSessionId;
final Qos qos;
final List<QosFilter> qosFilterList;
public QosSession(int qosSessionId, @NonNull Qos qos, @NonNull List<QosFilter> qosFilterList) {
this.qosSessionId = qosSessionId;
this.qos = qos;
this.qosFilterList = qosFilterList;
}
private QosSession(Parcel source) {
qosSessionId = source.readInt();
qos = source.readParcelable(Qos.class.getClassLoader());
qosFilterList = new ArrayList<>();
source.readList(qosFilterList, QosFilter.class.getClassLoader());
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(qosSessionId);
if (qos.getType() == Qos.QOS_TYPE_EPS) {
dest.writeParcelable((EpsQos)qos, flags);
} else {
dest.writeParcelable((NrQos)qos, flags);
}
dest.writeList(qosFilterList);
}
public static @NonNull QosSession create(
@NonNull android.hardware.radio.V1_6.QosSession qosSession) {
List<QosFilter> qosFilters = new ArrayList<>();
if (qosSession.qosFilters != null) {
for (android.hardware.radio.V1_6.QosFilter filter : qosSession.qosFilters) {
qosFilters.add(QosFilter.create(filter));
}
}
return new QosSession(
qosSession.qosSessionId,
Qos.create(qosSession.qos),
qosFilters);
}
@Override
public int describeContents() {
return 0;
}
@Override
public String toString() {
return "QosSession {"
+ " qosSessionId=" + qosSessionId
+ " qos=" + qos
+ " qosFilterList=" + qosFilterList + "}";
}
@Override
public int hashCode() {
return Objects.hash(qosSessionId, qos, qosFilterList);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof QosSession)) {
return false;
}
QosSession other = (QosSession) o;
return this.qosSessionId == other.qosSessionId
&& this.qos.equals(other.qos)
&& this.qosFilterList.size() == other.qosFilterList.size()
&& this.qosFilterList.containsAll(other.qosFilterList);
}
public static final @NonNull Parcelable.Creator<QosSession> CREATOR =
new Parcelable.Creator<QosSession>() {
@Override
public QosSession createFromParcel(Parcel source) {
return new QosSession(source);
}
@Override
public QosSession[] newArray(int size) {
return new QosSession[size];
}
};
}