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

Commit d0da0899 authored by Jayachandran Chinnakkannu's avatar Jayachandran Chinnakkannu Committed by Automerger Merge Worker
Browse files

Merge "Add support for filter matching by remote address in case of connected...

Merge "Add support for filter matching by remote address in case of connected socket" am: 4c1124a2 am: 9efa35af am: 7c6f724e

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1687885

Change-Id: Ib8d653f77c58b4d49c1b09f9ad4fb2c1a7a67f32
parents 3294a5ba 7c6f724e
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -394,6 +394,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));