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

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

Merge "Separate QoS filter match check - address & port" am: 56837d69

parents 526ac258 56837d69
Loading
Loading
Loading
Loading
+64 −44
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.telephony.Rlog;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -280,41 +281,61 @@ public class QosCallbackTracker extends Handler {

    private boolean matchesByLocalAddress(final @NonNull QosBearerFilter sessionFilter,
            final @NonNull IFilter filter) {
        if (sessionFilter.getLocalPortRange() == null) return false;
        int portStart;
        int portEnd;
        if (sessionFilter.getLocalPortRange() == null) {
            portStart = QosBearerFilter.QOS_MIN_PORT;
            portEnd = QosBearerFilter.QOS_MAX_PORT;
        } else if (sessionFilter.getLocalPortRange().isValid()) {
            portStart = sessionFilter.getLocalPortRange().getStart();
            portEnd = sessionFilter.getLocalPortRange().getEnd();
        } else {
            return false;
        }
        if (sessionFilter.getLocalAddresses().isEmpty()) {
            InetAddress anyAddress;
            try {
                anyAddress = InetAddress.getByAddress(new byte[] {0, 0, 0, 0});
            } catch (UnknownHostException e) {
                return false;
            }
            return filter.matchesLocalAddress(anyAddress, portStart, portEnd);
        } else {
            for (final LinkAddress qosAddress : sessionFilter.getLocalAddresses()) {
            return filter.matchesLocalAddress(qosAddress.getAddress(),
                    sessionFilter.getLocalPortRange().getStart(),
                    sessionFilter.getLocalPortRange().getEnd());
                return filter.matchesLocalAddress(qosAddress.getAddress(), portStart, portEnd);
            }
        }
        return false;
    }

    private boolean matchesByRemoteAddress(@NonNull QosBearerFilter sessionFilter,
            final @NonNull IFilter filter) {
        if (sessionFilter.getRemotePortRange() == null) return false;
        for (final LinkAddress qosAddress : sessionFilter.getRemoteAddresses()) {
            return filter.matchesRemoteAddress(qosAddress.getAddress(),
                    sessionFilter.getRemotePortRange().getStart(),
                    sessionFilter.getRemotePortRange().getEnd());
        int portStart;
        int portEnd;
        boolean result = false;
        if (sessionFilter.getRemotePortRange() == null) {
            portStart = QosBearerFilter.QOS_MIN_PORT;
            portEnd = QosBearerFilter.QOS_MAX_PORT;
        } else if (sessionFilter.getRemotePortRange().isValid()) {
            portStart = sessionFilter.getRemotePortRange().getStart();
            portEnd = sessionFilter.getRemotePortRange().getEnd();
        } else {
            return false;
        }
        if (sessionFilter.getRemoteAddresses().isEmpty()) {
            InetAddress anyAddress;
            try {
                anyAddress = InetAddress.getByAddress(new byte[] {0, 0, 0, 0});
            } catch (UnknownHostException e) {
                return false;
            }

    private boolean matchesByRemoteAndLocalAddress(@NonNull QosBearerFilter sessionFilter,
            final @NonNull IFilter filter) {
        if (sessionFilter.getLocalPortRange() == null
                || sessionFilter.getRemotePortRange() == null) return false;
        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());
            result = filter.matchesRemoteAddress(anyAddress, portStart, portEnd);
        } else {
            for (final LinkAddress qosAddress : sessionFilter.getRemoteAddresses()) {
                result = filter.matchesRemoteAddress(qosAddress.getAddress(), portStart, portEnd);
            }
        }
        return false;
        return result;
    }

    private QosBearerFilter getFilterByPrecedence(
@@ -329,27 +350,26 @@ public class QosCallbackTracker extends Handler {
        QosBearerFilter qosFilter = null;

        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            boolean unMatched = false;
            boolean hasMatchedFilter = false;
            if (!sessionFilter.getLocalAddresses().isEmpty()
                    && !sessionFilter.getRemoteAddresses().isEmpty()
                    && sessionFilter.getLocalPortRange() != null
                    && sessionFilter.getLocalPortRange().isValid()
                    && sessionFilter.getRemotePortRange() != null
                    && sessionFilter.getRemotePortRange().isValid()) {
                if (matchesByRemoteAndLocalAddress(sessionFilter, filter)) {
                    qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
                    || sessionFilter.getLocalPortRange() != null) {
                if (!matchesByLocalAddress(sessionFilter, filter)) {
                    unMatched = true;
                } else {
                    hasMatchedFilter = true;
                }
            } else if (!sessionFilter.getRemoteAddresses().isEmpty()
                    && sessionFilter.getRemotePortRange() != null
                    && sessionFilter.getRemotePortRange().isValid()) {
                if (matchesByRemoteAddress(sessionFilter, filter)) {
                    qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
            }
            } else if (!sessionFilter.getLocalAddresses().isEmpty()
                    && sessionFilter.getLocalPortRange() != null
                    && sessionFilter.getLocalPortRange().isValid()) {
                if (matchesByLocalAddress(sessionFilter, filter)) {
                    qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
            if (!sessionFilter.getRemoteAddresses().isEmpty()
                    || sessionFilter.getRemotePortRange() != null) {
                if (!matchesByRemoteAddress(sessionFilter, filter)) {
                    unMatched = true;
                } else {
                    hasMatchedFilter = true;
                }
            }
            if (!unMatched && hasMatchedFilter) {
                qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
            }
        }
        return qosFilter;
+52 −12
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ import org.junit.runner.RunWith;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Arrays;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -76,7 +75,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
                final int startPort, final int endPort) {
            return startPort <= mLocalAddress.getPort()
                    && endPort >= mLocalAddress.getPort()
                    && mLocalAddress.getAddress().equals(address);
                    && (address.isAnyLocalAddress() || mLocalAddress.getAddress().equals(address));
        }

        public boolean matchesRemoteAddress(final @NonNull InetAddress address,
@@ -84,7 +83,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
            return mRemoteAddress != null
                    && startPort <= mRemoteAddress.getPort()
                    && endPort >= mRemoteAddress.getPort()
                    && mRemoteAddress.getAddress().equals(address);
                    && (address.isAnyLocalAddress() || mRemoteAddress.getAddress().equals(address));
        }
    }

@@ -132,22 +131,32 @@ public class QosCallbackTrackerTest extends TelephonyTest {

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

    private static QosBearerFilter createIpv4QosFilter(String localAddress, String remoteAddress,
            QosBearerFilter.PortRange localPort, QosBearerFilter.PortRange remotePort,
            int precedence) {
        ArrayList<LinkAddress> localAddresses = new ArrayList<>();
        if (localAddress != null) {
            localAddresses.add(
                    new LinkAddress(InetAddresses.parseNumericAddress(localAddress), 32));
        }
        ArrayList<LinkAddress> remoteAddresses = new ArrayList<>();
        if (localAddress != null) {
            remoteAddresses.add(
                    new LinkAddress(InetAddresses.parseNumericAddress(remoteAddress), 32));
        }
        return new QosBearerFilter(
                Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress(localAddress), 32)),
                Arrays.asList(
                        new LinkAddress(InetAddresses.parseNumericAddress(remoteAddress), 32)),
                localPort, remotePort,
                localAddresses, remoteAddresses, localPort, remotePort,
                QosBearerFilter.QOS_PROTOCOL_TCP, 7, 987, 678,
                QosBearerFilter.QOS_FILTER_DIRECTION_BIDIRECTIONAL, precedence);
    }
@@ -508,6 +517,37 @@ public class QosCallbackTrackerTest extends TelephonyTest {

    }

    @Test
    @SmallTest
    public void testQosSessionFilterPortRangeWithoutAddress() throws Exception {
        // QosBearerFilter including remote port range without remote address
        ArrayList<QosBearerFilter> qosFilters1 = new ArrayList<>();
        qosFilters1.add(createIpv4QosFilter(null, null, null,
                new QosBearerFilter.PortRange(3200, 3220), 45));

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

        mQosCallbackTracker.updateSessions(qosSessions);

        // Add filter after updateSessions
        Filter filter = new Filter(new InetSocketAddress(
                InetAddresses.parseNumericAddress("122.22.22.22"), 1357),
                new InetSocketAddress(InetAddresses.parseNumericAddress("177.77.77.77"), 3202));
        mQosCallbackTracker.addFilter(1, filter);
        processAllMessages();

        verify(mNetworkAgent, times(1)).notifyQosSessionAvailable(eq(1),
                eq(1234), any(EpsBearerQosSessionAttributes.class));

        // Remove the matching QosBearerFilter
        qosSessions.remove(0);
        mQosCallbackTracker.updateSessions(qosSessions);
        processAllMessages();

        verify(mNetworkAgent, times(1)).notifyQosSessionLost(eq(1), eq(1234), eq(1));
    }

    @Test
    @SmallTest
    public void testQosMetrics() throws Exception {