diff options
author | Hakjun Choi <hakjunc@google.com> | 2021-12-01 07:40:25 +0000 |
---|---|---|
committer | Hakjun Choi <hakjunc@google.com> | 2021-12-16 23:25:43 +0000 |
commit | a01f473aa9e83ffaa45015a3292e835a4342bcaa (patch) | |
tree | 9736049b467c0461e37ecb42cf0104429bd4648d | |
parent | 04b57e4d135f90217742e221b48cbff0bea7f711 (diff) | |
download | telephony-a01f473aa9e83ffaa45015a3292e835a4342bcaa.tar.gz |
Implement RCS Dedicated Bearer metrics - fix not reporting case
Implement and update to store and pull Dedicated Bearer event atoms.
BUG: 174871215
BUG: 207320536
Test: atest QosCallbackTrackerTest
Change-Id: Ia3106c8422eafa39b7ead632fabe1085f93e5cf4
Merged-In: Ia3106c8422eafa39b7ead632fabe1085f93e5cf4
-rw-r--r-- | src/java/com/android/internal/telephony/dataconnection/QosCallbackTracker.java | 91 |
1 files changed, 56 insertions, 35 deletions
diff --git a/src/java/com/android/internal/telephony/dataconnection/QosCallbackTracker.java b/src/java/com/android/internal/telephony/dataconnection/QosCallbackTracker.java index 93fc1b0aac..aa268572b8 100644 --- a/src/java/com/android/internal/telephony/dataconnection/QosCallbackTracker.java +++ b/src/java/com/android/internal/telephony/dataconnection/QosCallbackTracker.java @@ -35,6 +35,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -132,13 +133,16 @@ public class QosCallbackTracker { logd("updateSessions: sessions size=" + sessions.size()); int bearerState = DedicatedBearerEvent_STATE_NONE; + final List<QosBearerSession> sessionsToAdd = new ArrayList<>(); final Map<Integer, QosBearerSession> incomingSessions = new HashMap<>(); + final HashSet<Integer> sessionsReportedToMetric = new HashSet<>(); for (final QosBearerSession incomingSession : sessions) { - incomingSessions.put(incomingSession.getQosBearerSessionId(), incomingSession); + int sessionId = incomingSession.getQosBearerSessionId(); + incomingSessions.put(sessionId, incomingSession); final QosBearerSession existingSession = mQosBearerSessions.get( - incomingSession.getQosBearerSessionId()); + sessionId); for (final int callbackId : mCallbacksToFilter.keySet()) { final IFilter filter = mCallbacksToFilter.get(callbackId); @@ -149,7 +153,6 @@ public class QosCallbackTracker { if (!existingSessionMatch && incomingSessionMatch) { // The filter matches now and didn't match earlier sendSessionAvailable(callbackId, incomingSession, filter); - bearerState = DedicatedBearerEvent_STATE_ADDED; } @@ -162,25 +165,46 @@ public class QosCallbackTracker { } } - notifyMetricDedicatedBearerEvent(incomingSession, filter, bearerState); + // this QosBearerSession has registered QosCallbackId + if (!sessionsReportedToMetric.contains(sessionId) && incomingSessionMatch) { + // this session has listener + notifyMetricDedicatedBearerEvent(incomingSession, bearerState, true); + sessionsReportedToMetric.add(sessionId); + } + } + + // this QosBearerSession does not have registered QosCallbackId + if (!sessionsReportedToMetric.contains(sessionId)) { + // no listener is registered to this session + bearerState = DedicatedBearerEvent_STATE_ADDED; + notifyMetricDedicatedBearerEvent(incomingSession, bearerState, false); + sessionsReportedToMetric.add(sessionId); } sessionsToAdd.add(incomingSession); } final List<Integer> sessionsToRemove = new ArrayList<>(); + sessionsReportedToMetric.clear(); + bearerState = DedicatedBearerEvent_STATE_DELETED; + // Find sessions that no longer exist for (final QosBearerSession existingSession : mQosBearerSessions.values()) { - if (!incomingSessions.containsKey(existingSession.getQosBearerSessionId())) { + final int sessionId = existingSession.getQosBearerSessionId(); + if (!incomingSessions.containsKey(sessionId)) { for (final int callbackId : mCallbacksToFilter.keySet()) { final IFilter filter = mCallbacksToFilter.get(callbackId); // The filter matches which means it was previously available, and now is lost if (doFiltersMatch(existingSession, filter)) { - bearerState = DedicatedBearerEvent_STATE_DELETED; sendSessionLost(callbackId, existingSession); - notifyMetricDedicatedBearerEvent(existingSession, filter, bearerState); + notifyMetricDedicatedBearerEvent(existingSession, bearerState, true); + sessionsReportedToMetric.add(sessionId); } } sessionsToRemove.add(existingSession.getQosBearerSessionId()); + if (!sessionsReportedToMetric.contains(sessionId)) { + notifyMetricDedicatedBearerEvent(existingSession, bearerState, false); + sessionsReportedToMetric.add(sessionId); + } } } @@ -360,40 +384,37 @@ public class QosCallbackTracker { return 0; } - private void notifyMetricDedicatedBearerEvent(final QosBearerSession session, - final IFilter filter, final int bearerState) { - - final int slotId = mPhoneID; - int ratAtEnd = 0; - int qci = 0; - boolean localConnectionInfoReceived = false; - boolean remoteConnectionInfoReceived = false; - - - QosBearerFilter qosBearerFilter = getMatchingQosBearerFilter(session, filter); - if (session.getQos() instanceof EpsQos) { - ratAtEnd = TelephonyProtoEnums.NETWORK_TYPE_LTE; - qci = ((EpsQos) session.getQos()).getQci(); - } else if (session.getQos() instanceof NrQos) { - ratAtEnd = TelephonyProtoEnums.NETWORK_TYPE_NR; - qci = ((NrQos) session.getQos()).get5Qi(); - } else { - return; + private boolean doesLocalConnectionInfoExist(final QosBearerSession qosBearerSession) { + for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) { + if (!sessionFilter.getLocalAddresses().isEmpty() + && sessionFilter.getLocalPortRange().isValid()) { + return true; + } } + return false; + } - if (qosBearerFilter != null) { - if (!qosBearerFilter.getLocalAddresses().isEmpty() - && qosBearerFilter.getLocalPortRange().isValid()) { - localConnectionInfoReceived = true; - } - if (!qosBearerFilter.getRemoteAddresses().isEmpty() - && qosBearerFilter.getRemotePortRange().isValid()) { - remoteConnectionInfoReceived = true; + private boolean doesRemoteConnectionInfoExist(final QosBearerSession qosBearerSession) { + for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) { + if (!sessionFilter.getRemoteAddresses().isEmpty() + && sessionFilter.getRemotePortRange().isValid()) { + return true; } } + return false; + } + + private void notifyMetricDedicatedBearerEvent(final QosBearerSession session, + final int bearerState, final boolean hasListener) { + + final int slotId = mPhoneID; + int ratAtEnd = getRatInfoFromSessionInfo(session); + int qci = getQCIFromSessionInfo(session); + boolean localConnectionInfoReceived = doesLocalConnectionInfoExist(session); + boolean remoteConnectionInfoReceived = doesRemoteConnectionInfoExist(session); mRcsStats.onImsDedicatedBearerEvent(slotId, ratAtEnd, qci, bearerState, - localConnectionInfoReceived, remoteConnectionInfoReceived, true); + localConnectionInfoReceived, remoteConnectionInfoReceived, hasListener); } public interface IFilter { |