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

Commit 2c3e12af authored by Jayachandran C's avatar Jayachandran C Committed by Jayachandran Chinnakkannu
Browse files

Add support for filter matching by remote address in case of connected socket

Bug: 181916576
Test: Manually verified in live T-Mobile network
      atest ConnectivityServiceTest
      atest com.android.internal.telephony.dataconnection.QosCallbackTrackerTest

Change-Id: Ia97f94fe32eed2657e349873807e73557600f581
parent a1a64639
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -363,6 +363,12 @@ public class DcNetworkAgent extends NetworkAgent {
                          InetAddress address, int startPort, int endPort) {
                      return filter.matchesLocalAddress(address, startPort, endPort);
                  }

                  @Override
                  public boolean matchesRemoteAddress(
                          InetAddress address, int startPort, int endPort) {
                      return filter.matchesRemoteAddress(address, startPort, endPort);
                  }
              }));
    }

+57 −11
Original line number Diff line number Diff line
@@ -158,20 +158,65 @@ public class QosCallbackTracker {
        return getMatchingQosBearerFilter(qosBearerSession, filter) != null;
    }

    private boolean matchesByLocalAddress(
        QosBearerFilter sessionFilter, final IFilter filter) {
        for (final LinkAddress qosAddress : sessionFilter.getLocalAddresses()) {
            return filter.matchesLocalAddress(qosAddress.getAddress(),
                  sessionFilter.getLocalPortRange().getStart(),
                  sessionFilter.getLocalPortRange().getEnd());
        }
        return false;
    }

    private boolean matchesByRemoteAddress(
            QosBearerFilter sessionFilter, final IFilter filter) {
        for (final LinkAddress qosAddress : sessionFilter.getRemoteAddresses()) {
            return filter.matchesRemoteAddress(qosAddress.getAddress(),
                  sessionFilter.getRemotePortRange().getStart(),
                  sessionFilter.getRemotePortRange().getEnd());
        }
        return false;
    }

    private boolean matchesByRemoteAndLocalAddress(
            QosBearerFilter sessionFilter, final IFilter filter) {
        for (final LinkAddress remoteAddress : sessionFilter.getRemoteAddresses()) {
            for (final LinkAddress localAddress : sessionFilter.getLocalAddresses()) {
                return filter.matchesRemoteAddress(remoteAddress.getAddress(),
                        sessionFilter.getRemotePortRange().getStart(),
                        sessionFilter.getRemotePortRange().getEnd())
                        && filter.matchesLocalAddress(localAddress.getAddress(),
                              sessionFilter.getLocalPortRange().getStart(),
                              sessionFilter.getLocalPortRange().getEnd());
            }
        }
        return false;
    }

    private QosBearerFilter getFilterByPrecedence(
            QosBearerFilter qosFilter, QosBearerFilter sessionFilter) {
        // Find for the highest precedence filter, lower the value is the higher the precedence
        return qosFilter == null || sessionFilter.getPrecedence() < qosFilter.getPrecedence()
                ? sessionFilter : qosFilter;
    }

    private QosBearerFilter getMatchingQosBearerFilter(
            final QosBearerSession qosBearerSession, final IFilter filter) {
        QosBearerFilter qosFilter = null;

        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            for (final LinkAddress qosAddress : sessionFilter.getLocalAddresses()) {
                if (filter.matchesLocalAddress(qosAddress.getAddress(),
                        sessionFilter.getLocalPortRange().getStart(),
                        sessionFilter.getLocalPortRange().getEnd())) {
                    // Find for the highest precedence filter
                    if (qosFilter == null
                            || sessionFilter.getPrecedence() < qosFilter.getPrecedence()) {
                        qosFilter = sessionFilter;
           if (!sessionFilter.getLocalAddresses().isEmpty()
                   && !sessionFilter.getRemoteAddresses().isEmpty()) {
               if (matchesByRemoteAndLocalAddress(sessionFilter, filter)) {
                   qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
               }
           } else if (!sessionFilter.getRemoteAddresses().isEmpty()) {
               if (matchesByRemoteAddress(sessionFilter, filter)) {
                   qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
               }
           } else if (!sessionFilter.getLocalAddresses().isEmpty()) {
               if (matchesByLocalAddress(sessionFilter, filter)) {
                   qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
               }
           }
        }
@@ -221,6 +266,7 @@ public class QosCallbackTracker {

    public interface IFilter {
        public boolean matchesLocalAddress(InetAddress address, int startPort, int endPort);
        public boolean matchesRemoteAddress(InetAddress address, int startPort, int endPort);
    }

    /**
+60 −34
Original line number Diff line number Diff line
@@ -62,17 +62,33 @@ import java.util.List;
public class QosCallbackTrackerTest extends TelephonyTest {

    class Filter implements QosCallbackTracker.IFilter {
        InetSocketAddress address;
        InetSocketAddress localAddress;
        InetSocketAddress remoteAddress;

        Filter(@NonNull final InetSocketAddress address) {
            this.address = address;
        Filter(@NonNull final InetSocketAddress localAddress) {
            this.localAddress = localAddress;
            this.remoteAddress = null;
        }

        Filter(@NonNull final InetSocketAddress localAddress,
                @NonNull final InetSocketAddress remoteAddress) {
            this.localAddress = localAddress;
            this.remoteAddress = remoteAddress;
        }

        public boolean matchesLocalAddress(@NonNull final InetAddress address,
            final int startPort, final int endPort) {
                return startPort <= this.address.getPort()
                    && endPort >= this.address.getPort()
                    && this.address.getAddress().equals(address);
                return startPort <= localAddress.getPort()
                    && endPort >= localAddress.getPort()
                    && localAddress.getAddress().equals(address);
        }

        public boolean matchesRemoteAddress(@NonNull final InetAddress address,
            final int startPort, final int endPort) {
                return remoteAddress != null
                    && startPort <= remoteAddress.getPort()
                    && endPort >= remoteAddress.getPort()
                    && remoteAddress.getAddress().equals(address);
        }
    }

@@ -105,6 +121,15 @@ public class QosCallbackTrackerTest extends TelephonyTest {
        return new EpsQos(halEpsQos);
    }

    private QosBearerFilter createIpv4QosFilter(String localAddress,
            QosBearerFilter.PortRange localPort, int precedence) {
        return new QosBearerFilter(
                Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress(localAddress), 32)),
                new ArrayList<LinkAddress>(), localPort, null, QosBearerFilter.QOS_PROTOCOL_TCP,
                7, 987, 678, QosBearerFilter.QOS_FILTER_DIRECTION_BIDIRECTIONAL, precedence);
    }

    private QosBearerFilter createIpv4QosFilter(String localAddress, String remoteAddress,
            QosBearerFilter.PortRange localPort, QosBearerFilter.PortRange remotePort,
            int precedence) {
@@ -114,7 +139,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
                Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress(remoteAddress), 32)),
                localPort, remotePort,
                QosBearerFilter.QOS_PROTOCOL_UDP, 7, 987, 678,
                QosBearerFilter.QOS_PROTOCOL_TCP, 7, 987, 678,
                QosBearerFilter.QOS_FILTER_DIRECTION_BIDIRECTIONAL, precedence);
    }

@@ -127,9 +152,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Non-matching QosBearerFilter
        ArrayList<QosBearerFilter> qosFilters1 = new ArrayList<>();
        qosFilters1.add(createIpv4QosFilter("155.55.55.55", "144.44.44.44",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
        qosFilters1.add(createIpv4QosFilter("155.55.55.55",
                new QosBearerFilter.PortRange(2222, 2222), 45));

        ArrayList<QosBearerSession> qosSessions = new ArrayList<>();
        qosSessions.add(new QosBearerSession(1234, createEpsQos(5, 6, 7, 8), qosFilters1));
@@ -141,9 +165,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Matching QosBearerFilter
        ArrayList<QosBearerFilter> qosFilters2 = new ArrayList<>();
        qosFilters2.add(createIpv4QosFilter("122.22.22.22", "144.44.44.44",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
        qosFilters2.add(createIpv4QosFilter("122.22.22.22",
                new QosBearerFilter.PortRange(2222, 2222), 45));
        qosSessions.add(new QosBearerSession(1235, createEpsQos(5, 6, 7, 8), qosFilters2));

        mQosCallbackTracker.updateSessions(qosSessions);
@@ -159,18 +182,16 @@ public class QosCallbackTrackerTest extends TelephonyTest {
    public void testAddFilterAfterUpdateSessions() throws Exception {
        // Non-matching QosBearerFilter
        ArrayList<QosBearerFilter> qosFilters1 = new ArrayList<>();
        qosFilters1.add(createIpv4QosFilter("155.55.55.55", "144.44.44.44",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
        qosFilters1.add(createIpv4QosFilter("155.55.55.55",
                new QosBearerFilter.PortRange(2222, 2222), 45));

        ArrayList<QosBearerSession> qosSessions = new ArrayList<>();
        qosSessions.add(new QosBearerSession(1234, createEpsQos(5, 6, 7, 8), qosFilters1));

        // Matching QosBearerFilter
        ArrayList<QosBearerFilter> qosFilters2 = new ArrayList<>();
        qosFilters2.add(createIpv4QosFilter("122.22.22.22", "144.44.44.44",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
        qosFilters2.add(createIpv4QosFilter("122.22.22.22",
                new QosBearerFilter.PortRange(2222, 2222), 45));
        qosSessions.add(new QosBearerSession(1235, createEpsQos(5, 6, 7, 8), qosFilters2));

        mQosCallbackTracker.updateSessions(qosSessions);
@@ -195,9 +216,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Non-matching QosBearerFilter
        ArrayList<QosBearerFilter> qosFilters1 = new ArrayList<>();
        qosFilters1.add(createIpv4QosFilter("155.55.55.55", "144.44.44.44",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
        qosFilters1.add(createIpv4QosFilter("155.55.55.55",
                new QosBearerFilter.PortRange(2222, 2222), 45));

        ArrayList<QosBearerSession> qosSessions = new ArrayList<>();
        qosSessions.add(new QosBearerSession(1234, createEpsQos(5, 6, 7, 8), qosFilters1));
@@ -212,9 +232,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Matching QosBearerFilter
        ArrayList<QosBearerFilter> qosFilters2 = new ArrayList<>();
        qosFilters2.add(createIpv4QosFilter("122.22.22.22", "144.44.44.44",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
        qosFilters2.add(createIpv4QosFilter("122.22.22.22",
                new QosBearerFilter.PortRange(2222, 2222), 45));
        qosSessions.add(new QosBearerSession(1235, createEpsQos(5, 6, 7, 8), qosFilters2));

        mQosCallbackTracker.updateSessions(qosSessions);
@@ -248,7 +267,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Add filter after updateSessions
        Filter filter = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222));
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 2223));
        mQosCallbackTracker.addFilter(1, filter);

        verify(mDcNetworkAgent, times(1)).notifyQosSessionAvailable(eq(1),
@@ -284,7 +304,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Add filter after updateSessions
        Filter filter = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222));
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 2223));
        mQosCallbackTracker.addFilter(1, filter);

        verify(mDcNetworkAgent, times(1)).notifyQosSessionAvailable(eq(1),
@@ -324,7 +345,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Add filter after updateSessions
        Filter filter = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222));
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 2223));
        mQosCallbackTracker.addFilter(1, filter);

        verify(mDcNetworkAgent, times(1)).notifyQosSessionAvailable(eq(1),
@@ -346,7 +368,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {
    public void testEmptyQosSessions() throws Exception {
        // Add filter
        Filter filter = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("155.55.55.55"), 2222));
                InetAddresses.parseNumericAddress("155.55.55.55"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 2223));
        mQosCallbackTracker.addFilter(1, filter);

        // Matching QosBearerFilter
@@ -369,7 +392,8 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // Add filter after updateSessions
        Filter filter2 = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222));
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 2223));
        mQosCallbackTracker.addFilter(2, filter2);

        verify(mDcNetworkAgent, times(1)).notifyQosSessionAvailable(eq(1),
@@ -389,12 +413,14 @@ public class QosCallbackTrackerTest extends TelephonyTest {
    public void testMultipleQosSessions() throws Exception {
        // Add filter 1
        Filter filter1 = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("155.55.55.55"), 2222));
                InetAddresses.parseNumericAddress("155.55.55.55"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("144.44.44.44"), 2223));
        mQosCallbackTracker.addFilter(1, filter1);

        // Add filter 2
        Filter filter2 = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222));
                InetAddresses.parseNumericAddress("122.22.22.22"), 2222),
                new InetSocketAddress(InetAddresses.parseNumericAddress("177.77.77.77"), 2227));
        mQosCallbackTracker.addFilter(2, filter2);

        // QosBearerFilter 1
@@ -405,9 +431,9 @@ public class QosCallbackTrackerTest extends TelephonyTest {

        // QosBearerFilter 2
        ArrayList<QosBearerFilter> qosFilters2 = new ArrayList<>();
        qosFilters2.add(createIpv4QosFilter("122.22.22.22", "144.44.44.44",
        qosFilters2.add(createIpv4QosFilter("122.22.22.22", "177.77.77.77",
                new QosBearerFilter.PortRange(2222, 2222),
                new QosBearerFilter.PortRange(2223, 2223), 45));
                new QosBearerFilter.PortRange(2223, 2227), 45));

        ArrayList<QosBearerSession> qosSessions = new ArrayList<>();
        qosSessions.add(new QosBearerSession(1234, createEpsQos(5, 6, 7, 8), qosFilters1));