Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18a1ef42 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add QoS filter matching and unit tests" am: 1e8b0527 am: 8625aaea

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1610961

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I7d25d91a30ba9d0b38f2c77ea175a765b6a14eee
parents d3bf1aa2 8625aaea
Loading
Loading
Loading
Loading
+22 −21
Original line number Diff line number Diff line
@@ -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);
        }
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -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);
    }
+17 −1
Original line number Diff line number Diff line
@@ -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);
+45 −17
Original line number Diff line number Diff line
@@ -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];
                }
            };
}
+137 −0
Original line number Diff line number Diff line
@@ -30,50 +30,62 @@ import java.util.Objects;
 *
 * @hide
 */
public final class QosSession implements Parcelable{
public final class QosBearerSession implements Parcelable{

    final int qosSessionId;
    final int qosBearerSessionId;
    final Qos qos;
    final List<QosFilter> qosFilterList;
    final List<QosBearerFilter> qosBearerFilterList;

    public QosSession(int qosSessionId, @NonNull Qos qos, @NonNull List<QosFilter> qosFilterList) {
        this.qosSessionId = qosSessionId;
    public QosBearerSession(int qosBearerSessionId, @NonNull Qos qos, @NonNull List<QosBearerFilter> qosBearerFilterList) {
        this.qosBearerSessionId = qosBearerSessionId;
        this.qos = qos;
        this.qosFilterList = qosFilterList;
        this.qosBearerFilterList = qosBearerFilterList;
    }

    private QosSession(Parcel source) {
        qosSessionId = source.readInt();
    private QosBearerSession(Parcel source) {
        qosBearerSessionId = source.readInt();
        qos = source.readParcelable(Qos.class.getClassLoader());
        qosFilterList = new ArrayList<>();
        source.readList(qosFilterList, QosFilter.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(qosSessionId);
        dest.writeInt(qosBearerSessionId);
        if (qos.getType() == Qos.QOS_TYPE_EPS) {
            dest.writeParcelable((EpsQos)qos, flags);
        } else {
            dest.writeParcelable((NrQos)qos, flags);
        }
        dest.writeList(qosFilterList);
        dest.writeList(qosBearerFilterList);
    }

    public static @NonNull QosSession create(
    public static @NonNull QosBearerSession create(
            @NonNull android.hardware.radio.V1_6.QosSession qosSession) {
        List<QosFilter> qosFilters = new ArrayList<>();
        List<QosBearerFilter> qosBearerFilters = new ArrayList<>();

        if (qosSession.qosFilters != null) {
            for (android.hardware.radio.V1_6.QosFilter filter : qosSession.qosFilters) {
                qosFilters.add(QosFilter.create(filter));
                qosBearerFilters.add(QosBearerFilter.create(filter));
            }
        }

        return new QosSession(
        return new QosBearerSession(
                        qosSession.qosSessionId,
                        Qos.create(qosSession.qos),
                        qosFilters);
                        qosBearerFilters);
    }

    @Override
@@ -83,43 +95,43 @@ public final class QosSession implements Parcelable{

    @Override
    public String toString() {
        return "QosSession {"
                + " qosSessionId=" + qosSessionId
        return "QosBearerSession {"
                + " qosBearerSessionId=" + qosBearerSessionId
                + " qos=" + qos
                + " qosFilterList=" + qosFilterList + "}";
                + " qosBearerFilterList=" + qosBearerFilterList + "}";
    }

    @Override
    public int hashCode() {
        return Objects.hash(qosSessionId, qos, qosFilterList);
        return Objects.hash(qosBearerSessionId, qos, qosBearerFilterList);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;

        if (o == null || !(o instanceof QosSession)) {
        if (o == null || !(o instanceof QosBearerSession)) {
            return false;
        }

        QosSession other = (QosSession) o;
        return this.qosSessionId == other.qosSessionId
        QosBearerSession other = (QosBearerSession) o;
        return this.qosBearerSessionId == other.qosBearerSessionId
                && this.qos.equals(other.qos)
                && this.qosFilterList.size() == other.qosFilterList.size()
                && this.qosFilterList.containsAll(other.qosFilterList);
                && this.qosBearerFilterList.size() == other.qosBearerFilterList.size()
                && this.qosBearerFilterList.containsAll(other.qosBearerFilterList);
    }


    public static final @NonNull Parcelable.Creator<QosSession> CREATOR =
            new Parcelable.Creator<QosSession>() {
    public static final @NonNull Parcelable.Creator<QosBearerSession> CREATOR =
            new Parcelable.Creator<QosBearerSession>() {
                @Override
                public QosSession createFromParcel(Parcel source) {
                    return new QosSession(source);
                public QosBearerSession createFromParcel(Parcel source) {
                    return new QosBearerSession(source);
                }

                @Override
                public QosSession[] newArray(int size) {
                    return new QosSession[size];
                public QosBearerSession[] newArray(int size) {
                    return new QosBearerSession[size];
                }
            };
}
Loading