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

Commit 1e8b0527 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Add QoS filter matching and unit tests"

parents c9033503 82984a8c
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