aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHakjun Choi <hakjunc@google.com>2021-12-01 07:40:25 +0000
committerHakjun Choi <hakjunc@google.com>2021-12-16 23:25:43 +0000
commita01f473aa9e83ffaa45015a3292e835a4342bcaa (patch)
tree9736049b467c0461e37ecb42cf0104429bd4648d
parent04b57e4d135f90217742e221b48cbff0bea7f711 (diff)
downloadtelephony-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.java91
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 {