Reference DataSaver setting from BPF map on V+ only
Only reference DataSaverEnabled map on V+ platform because the
information in map before platform V is not time-precise. See comment in
this commit for detail.
Bug: 288340533
Test: presubmit
Change-Id: I0795e88e6006e6d24d27b63c31d0e3ed81d0262c
diff --git a/DnsResolver/DnsBpfHelper.cpp b/DnsResolver/DnsBpfHelper.cpp
index 37c46ca..de8bef5 100644
--- a/DnsResolver/DnsBpfHelper.cpp
+++ b/DnsResolver/DnsBpfHelper.cpp
@@ -62,16 +62,24 @@
if (isBlockedByUidRules(enabledRules.value(), uidRules)) return true;
// For data saver.
- if (!metered) return false;
+ // DataSaverEnabled map on V+ platforms is the only reliable source of information about the
+ // current data saver status. While ConnectivityService offers two ways to update this map for U
+ // and V+, the U- platform implementation can have delays, potentially leading to inaccurate
+ // results. Conversely, the V+ platform implementation is synchronized with the actual data saver
+ // state, making it a trustworthy source. Since this library primarily serves DNS resolvers,
+ // relying solely on V+ data prevents erroneous blocking of DNS queries.
+ if (android::modules::sdklevel::IsAtLeastV() && metered) {
+ // The background data setting (PENALTY_BOX_MATCH) and unrestricted data usage setting
+ // (HAPPY_BOX_MATCH) for individual apps override the system wide Data Saver setting.
+ if (uidRules & PENALTY_BOX_MATCH) return true;
+ if (uidRules & HAPPY_BOX_MATCH) return false;
- // The background data setting (PENALTY_BOX_MATCH) and unrestricted data usage setting
- // (HAPPY_BOX_MATCH) for individual apps override the system wide Data Saver setting.
- if (uidRules & PENALTY_BOX_MATCH) return true;
- if (uidRules & HAPPY_BOX_MATCH) return false;
+ auto dataSaverSetting = mDataSaverEnabledMap.readValue(DATA_SAVER_ENABLED_KEY);
+ RETURN_IF_RESULT_NOT_OK(dataSaverSetting);
+ return dataSaverSetting.value();
+ }
- auto dataSaverSetting = mDataSaverEnabledMap.readValue(DATA_SAVER_ENABLED_KEY);
- RETURN_IF_RESULT_NOT_OK(dataSaverSetting);
- return dataSaverSetting.value();
+ return false;
}
} // namespace net