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

Commit 62ca6d1f authored by Jayachandran C's avatar Jayachandran C
Browse files

Add indication APIs to expose QOS from LTE and NR bearers

Add indication APIs to expose Quality Of Service (QOS) information
from LTE and NR default as well as dedicated bearers. The QOS is
added to the existing SetupDataCallResult structure so that the
baseband can notify whenever there is a change in QoS on a PDN.

Bug: 158315614
Test: 1) Simulated V1_6 SetupDataCallResult and verified the Qos objects
      are passed correctly in the APIs
      2) atest frameworks/opt/telephony/tests/telephonytests/
Change-Id: I67533710fc7a66ff2f2a26d8bfc5342081647bf2
parent 93a50596
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ import android.telephony.data.DataCallResponse;
import android.telephony.data.DataCallResponse.HandoverFailureMode;
import android.telephony.data.DataProfile;
import android.telephony.data.DataService;
import android.telephony.data.Qos;
import android.telephony.data.QosSession;
import android.telephony.emergency.EmergencyNumber;
import android.text.TextUtils;
import android.util.Log;
@@ -2912,7 +2914,13 @@ public class RIL extends BaseCommands implements CommandsInterface {
            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

            try {
                if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
                    android.hardware.radio.V1_6.IRadio radioProxy16 =
                            (android.hardware.radio.V1_6.IRadio) radioProxy;
                    radioProxy16.getDataCallList_1_6(rr.mSerial);
                } else {
                    radioProxy.getDataCallList(rr.mSerial);
                }
            } catch (RemoteException | RuntimeException e) {
                handleRadioProxyExceptionForRR(rr, "getDataCallList", e);
            }
@@ -7146,7 +7154,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
    }

    /**
     * Convert SetupDataCallResult defined in 1.0, 1.4, or 1.5 types.hal into DataCallResponse
     * Convert SetupDataCallResult defined in 1.0, 1.4, 1.5 or 1.6 types.hal into DataCallResponse
     * @param dcResult setup data call result
     * @return converted DataCallResponse object
     */
@@ -7162,6 +7170,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
        String[] dnses = null;
        String[] gateways = null;
        String[] pcscfs = null;
        Qos defaultQos = null;

        @HandoverFailureMode
        int handoverFailureMode = DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY;
@@ -7169,6 +7178,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
        int pduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET;

        List<LinkAddress> laList = new ArrayList<>();
        List<QosSession> qosSessions = new ArrayList<>();

        if (dcResult instanceof android.hardware.radio.V1_0.SetupDataCallResult) {
            final android.hardware.radio.V1_0.SetupDataCallResult result =
@@ -7256,6 +7266,9 @@ public class RIL extends BaseCommands implements CommandsInterface {
            mtuV6 = result.mtuV6;
            handoverFailureMode = result.handoverFailureMode;
            pduSessionId = result.pduSessionId;
            defaultQos = Qos.create(result.defaultQos);
            qosSessions = result.qosSessions.stream().map(session ->
                    QosSession.create(session)).collect(Collectors.toList());
        } else {
            Rlog.e(RILJ_LOG_TAG, "Unsupported SetupDataCallResult " + dcResult);
            return null;
@@ -7322,6 +7335,8 @@ public class RIL extends BaseCommands implements CommandsInterface {
                .setMtuV6(mtuV6)
                .setHandoverFailureMode(handoverFailureMode)
                .setPduSessionId(pduSessionId)
                .setDefaultQos(defaultQos)
                .setQosSessions(qosSessions)
                .build();
    }

+12 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ import android.telephony.data.DataCallResponse.HandoverFailureMode;
import android.telephony.data.DataProfile;
import android.telephony.data.DataService;
import android.telephony.data.DataServiceCallback;
import android.telephony.data.Qos;
import android.telephony.data.QosSession;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.Pair;
@@ -300,6 +302,8 @@ public class DataConnection extends StateMachine {
    private boolean mIsSuspended;
    private int mDownlinkBandwidth = 14;
    private int mUplinkBandwidth = 14;
    private Qos mDefaultQos = null;
    private List<QosSession> mQosSessions = new ArrayList<>();

    /** The corresponding network agent for this data connection. */
    private DcNetworkAgent mNetworkAgent;
@@ -607,6 +611,11 @@ public class DataConnection extends StateMachine {
        return mPduSessionId;
    }

    public void updateQosParameters(DataCallResponse response) {
        mDefaultQos = response.getDefaultQos();
        mQosSessions = response.getQosSessions();
    }

    @VisibleForTesting
    public UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) {
        UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties);
@@ -1271,6 +1280,7 @@ public class DataConnection extends StateMachine {
            }

            updatePcscfAddr(response);
            updateQosParameters(response);
            result = updateLinkProperty(response).setupResult;
        }

@@ -3592,6 +3602,8 @@ public class DataConnection extends StateMachine {
        pw.println("mUnmeteredOverride=" + mUnmeteredOverride);
        pw.println("mDownlinkBandwidth" + mDownlinkBandwidth);
        pw.println("mUplinkBandwidth=" + mUplinkBandwidth);
        pw.println("mDefaultQos=" + mDefaultQos);
        pw.println("mQosSessions=" + mQosSessions);
        pw.println("disallowedApnTypes="
                + ApnSetting.getApnTypesStringFromBitmask(getDisallowedApnTypes()));
        pw.println("mInstanceNumber=" + mInstanceNumber);
+1 −0
Original line number Diff line number Diff line
@@ -303,6 +303,7 @@ public class DcController extends Handler {

                    // Its active so update the DataConnections link properties
                    UpdateLinkPropertyResult result = dc.updateLinkProperty(newState);
                    dc.updateQosParameters(newState);
                    if (result.oldLp.equals(result.newLp)) {
                        if (DBG) log("onDataStateChanged: no change");
                    } else {
+112 −0
Original line number Diff line number Diff line
@@ -156,6 +156,11 @@ import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataProfile;
import android.telephony.data.EpsQos;
import android.telephony.data.NrQos;
import android.telephony.data.Qos;
import android.telephony.data.QosFilter;
import android.telephony.data.QosSession;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

@@ -2175,6 +2180,7 @@ public class RILTest extends TelephonyTest {
                .setMtu(1500)
                .setMtuV4(1500)
                .setMtuV6(1500)
                .setQosSessions(new ArrayList<>())
                .build();

        assertEquals(response, RIL.convertDataCallResult(result10));
@@ -2248,9 +2254,115 @@ public class RILTest extends TelephonyTest {
                .setMtu(3000)
                .setMtuV4(1500)
                .setMtuV6(3000)
                .setQosSessions(new ArrayList<>())
                .build();

        assertEquals(response, RIL.convertDataCallResult(result15));

        // Test V1.6 SetupDataCallResult
        android.hardware.radio.V1_6.SetupDataCallResult result16 =
                new android.hardware.radio.V1_6.SetupDataCallResult();
        result16.cause = android.hardware.radio.V1_4.DataCallFailCause.NONE;
        result16.suggestedRetryTime = -1;
        result16.cid = 0;
        result16.active = android.hardware.radio.V1_4.DataConnActiveStatus.ACTIVE;
        result16.type = android.hardware.radio.V1_4.PdpProtocolType.IPV4V6;
        result16.ifname = "ifname";

        result16.addresses = new ArrayList<>(Arrays.asList(la1, la2));
        result16.dnses = new ArrayList<>(Arrays.asList("10.0.2.3", "fd00:976a::9"));
        result16.gateways = new ArrayList<>(Arrays.asList("10.0.2.15", "fe80::2"));
        result16.pcscf = new ArrayList<>(Arrays.asList(
                "fd00:976a:c206:20::6", "fd00:976a:c206:20::9", "fd00:976a:c202:1d::9"));
        result16.mtuV4 = 1500;
        result16.mtuV6 = 3000;
        result16.handoverFailureMode = android.hardware.radio.V1_6.HandoverFailureMode.LEGACY;

        // Build android.hardware.radio.V1_6.EpsQos
        android.hardware.radio.V1_6.EpsQos halEpsQos = new android.hardware.radio.V1_6.EpsQos();
        halEpsQos.qci = 4;
        halEpsQos.downlink.maxBitrateKbps = 4;
        halEpsQos.downlink.guaranteedBitrateKbps = 7;
        halEpsQos.uplink.maxBitrateKbps = 5;
        halEpsQos.uplink.guaranteedBitrateKbps = 8;

        result16.defaultQos.eps(halEpsQos);

        // android.hardware.radio.V1_6.PortRange
        android.hardware.radio.V1_6.PortRange localPort =
                new android.hardware.radio.V1_6.PortRange();
        android.hardware.radio.V1_6.PortRange remotePort =
                new android.hardware.radio.V1_6.PortRange();
        localPort.start = 123;
        localPort.end = 123;
        remotePort.start = 223;
        remotePort.end = 223;

        // android.hardware.radio.V1_6.QosFilter
        android.hardware.radio.V1_6.QosFilter halQosFilter =
                new android.hardware.radio.V1_6.QosFilter();
        halQosFilter.localAddresses = new ArrayList<>(Arrays.asList("122.22.22.22"));
        halQosFilter.remoteAddresses = new ArrayList<>(Arrays.asList("144.44.44.44"));
        halQosFilter.localPort.range(localPort);
        halQosFilter.remotePort.range(remotePort);
        halQosFilter.protocol = android.hardware.radio.V1_6.QosProtocol.UDP;
        halQosFilter.tos.value((byte)7);
        halQosFilter.flowLabel.value(987);
        halQosFilter.spi.value(678);
        halQosFilter.direction = android.hardware.radio.V1_6.QosFilterDirection.BIDIRECTIONAL;
        halQosFilter.precedence = 45;

        // android.hardware.radio.V1_6.QosSession
        android.hardware.radio.V1_6.QosSession halQosSession =
                new android.hardware.radio.V1_6.QosSession();
        halQosSession.qosSessionId = 1234;
        halQosSession.qos.eps(halEpsQos);
        halQosSession.qosFilters = new ArrayList<>(Arrays.asList(halQosFilter));

        result16.qosSessions = new ArrayList<>(Arrays.asList(halQosSession));

        EpsQos epsQos = new EpsQos(halEpsQos);
        QosFilter qosFilter = new QosFilter(
                Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress("122.22.22.22"), 32)),
                Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 32)),
                new QosFilter.PortRange(123, 123), new QosFilter.PortRange(223, 223),
                QosFilter.QOS_PROTOCOL_UDP, 7, 987, 678,
                QosFilter.QOS_FILTER_DIRECTION_BIDIRECTIONAL, 45);
        ArrayList<QosFilter> qosFilters = new ArrayList<>();
        ArrayList<QosSession> qosSessions = new ArrayList<>();
        qosFilters.add(qosFilter);
        QosSession qosSession = new QosSession(1234, epsQos, qosFilters);
        qosSessions.add(qosSession);

        response = new DataCallResponse.Builder()
                .setCause(0)
                .setRetryDurationMillis(-1L)
                .setId(0)
                .setLinkStatus(2)
                .setProtocolType(ApnSetting.PROTOCOL_IPV4V6)
                .setInterfaceName("ifname")
                .setAddresses(Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress("10.0.2.15"), 32),
                        new LinkAddress("2607:fb90:a620:651d:eabe:f8da:c107:44be/64")))
                .setDnsAddresses(Arrays.asList(InetAddresses.parseNumericAddress("10.0.2.3"),
                        InetAddresses.parseNumericAddress("fd00:976a::9")))
                .setGatewayAddresses(Arrays.asList(InetAddresses.parseNumericAddress("10.0.2.15"),
                        InetAddresses.parseNumericAddress("fe80::2")))
                .setPcscfAddresses(Arrays.asList(
                        InetAddresses.parseNumericAddress("fd00:976a:c206:20::6"),
                        InetAddresses.parseNumericAddress("fd00:976a:c206:20::9"),
                        InetAddresses.parseNumericAddress("fd00:976a:c202:1d::9")))
                .setMtu(3000)
                .setMtuV4(1500)
                .setMtuV6(3000)
                .setHandoverFailureMode(DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY)
                .setDefaultQos(epsQos)
                .setQosSessions(qosSessions)
                .build();

        assertEquals(response, RIL.convertDataCallResult(result16));
    }

    @Test
+4 −0
Original line number Diff line number Diff line
@@ -27,9 +27,11 @@ import android.net.LinkAddress;
import android.os.Parcel;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.EpsQos;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;

import java.util.ArrayList;
import java.util.Arrays;

public class DataCallResponseTest extends AndroidTestCase {
@@ -51,6 +53,8 @@ public class DataCallResponseTest extends AndroidTestCase {
                        Arrays.asList(InetAddresses.parseNumericAddress(FAKE_PCSCF_ADDRESS)))
                .setMtuV4(1440)
                .setMtuV6(1440)
                .setDefaultQos(new EpsQos())
                .setQosSessions(new ArrayList<>())
                .build();

        Parcel p = Parcel.obtain();