Loading src/java/com/android/internal/telephony/data/QosCallbackTracker.java +64 −44 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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( Loading @@ -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; Loading tests/telephonytests/src/com/android/internal/telephony/data/QosCallbackTrackerTest.java +52 −12 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading @@ -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)); } } Loading Loading @@ -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); } Loading Loading @@ -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 { Loading Loading
src/java/com/android/internal/telephony/data/QosCallbackTracker.java +64 −44 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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( Loading @@ -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; Loading
tests/telephonytests/src/com/android/internal/telephony/data/QosCallbackTrackerTest.java +52 −12 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading @@ -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)); } } Loading Loading @@ -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); } Loading Loading @@ -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 { Loading