Merge changes Ic4742bf5,I2c8a8e7f,I755a9a55,I2148bce6 am: 944f9e3da1
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/2157258
Change-Id: I70b34ae4c087876b6aa6c05ce00ad84e5cc9b489
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/bpf_progs/dscpPolicy.c b/bpf_progs/dscpPolicy.c
index 25abd2b..d3e7b38 100644
--- a/bpf_progs/dscpPolicy.c
+++ b/bpf_progs/dscpPolicy.c
@@ -53,12 +53,12 @@
DEFINE_BPF_MAP_GRW(ipv4_dscp_policies_map, ARRAY, uint32_t, DscpPolicy, MAX_POLICIES, AID_SYSTEM)
DEFINE_BPF_MAP_GRW(ipv6_dscp_policies_map, ARRAY, uint32_t, DscpPolicy, MAX_POLICIES, AID_SYSTEM)
-static inline __always_inline void match_policy(struct __sk_buff* skb, bool ipv4, bool is_eth) {
+static inline __always_inline void match_policy(struct __sk_buff* skb, bool ipv4) {
void* data = (void*)(long)skb->data;
const void* data_end = (void*)(long)skb->data_end;
- const int l2_header_size = is_eth ? sizeof(struct ethhdr) : 0;
- struct ethhdr* eth = is_eth ? data : NULL;
+ const int l2_header_size = sizeof(struct ethhdr);
+ struct ethhdr* eth = data;
if (data + l2_header_size > data_end) return;
@@ -84,7 +84,7 @@
uint8_t priority = 0; // Only used for IPv6
uint8_t flow_lbl = 0; // Only used for IPv6
if (ipv4) {
- const struct iphdr* const iph = is_eth ? (void*)(eth + 1) : data;
+ const struct iphdr* const iph = (void*)(eth + 1);
hdr_size = l2_header_size + sizeof(struct iphdr);
// Must have ipv4 header
if (data + hdr_size > data_end) return;
@@ -105,7 +105,7 @@
protocol = iph->protocol;
tos = iph->tos;
} else {
- struct ipv6hdr* ip6h = is_eth ? (void*)(eth + 1) : data;
+ struct ipv6hdr* ip6h = (void*)(eth + 1);
hdr_size = l2_header_size + sizeof(struct ipv6hdr);
// Must have ipv6 header
if (data + hdr_size > data_end) return;
@@ -293,22 +293,9 @@
if (skb->pkt_type != PACKET_HOST) return TC_ACT_PIPE;
if (skb->protocol == htons(ETH_P_IP)) {
- match_policy(skb, true, true);
+ match_policy(skb, true);
} else if (skb->protocol == htons(ETH_P_IPV6)) {
- match_policy(skb, false, true);
- }
-
- // Always return TC_ACT_PIPE
- return TC_ACT_PIPE;
-}
-
-DEFINE_BPF_PROG_KVER("schedcls/set_dscp_raw_ip", AID_ROOT, AID_SYSTEM,
- schedcls_set_dscp_raw_ip, KVER(5, 15, 0))
-(struct __sk_buff* skb) {
- if (skb->protocol == htons(ETH_P_IP)) {
- match_policy(skb, true, false);
- } else if (skb->protocol == htons(ETH_P_IPV6)) {
- match_policy(skb, false, false);
+ match_policy(skb, false);
}
// Always return TC_ACT_PIPE
diff --git a/framework/src/android/net/NetworkProvider.java b/framework/src/android/net/NetworkProvider.java
index 3615075..7edcbae 100644
--- a/framework/src/android/net/NetworkProvider.java
+++ b/framework/src/android/net/NetworkProvider.java
@@ -192,36 +192,21 @@
private class NetworkOfferCallbackProxy extends INetworkOfferCallback.Stub {
@NonNull public final NetworkOfferCallback callback;
@NonNull private final Executor mExecutor;
- /**
- * Boolean flag that prevents onNetworkNeeded / onNetworkUnneeded callbacks from being
- * propagated after unregisterNetworkOffer has been called. Since unregisterNetworkOffer
- * runs on the CS handler thread, it will not go into effect immediately.
- */
- private volatile boolean mIsStale;
NetworkOfferCallbackProxy(@NonNull final NetworkOfferCallback callback,
@NonNull final Executor executor) {
this.callback = callback;
this.mExecutor = executor;
- this.mIsStale = false;
}
@Override
public void onNetworkNeeded(final @NonNull NetworkRequest request) {
- mExecutor.execute(() -> {
- if (!mIsStale) callback.onNetworkNeeded(request);
- });
+ mExecutor.execute(() -> callback.onNetworkNeeded(request));
}
@Override
public void onNetworkUnneeded(final @NonNull NetworkRequest request) {
- mExecutor.execute(() -> {
- if (!mIsStale) callback.onNetworkUnneeded(request);
- });
- }
-
- public void markStale() {
- mIsStale = true;
+ mExecutor.execute(() -> callback.onNetworkUnneeded(request));
}
}
@@ -334,6 +319,11 @@
* if it could beat any of them, and may be advantageous to the provider's implementation that
* can rely on no longer receiving callbacks for a network that they can't bring up anyways.
*
+ * Warning: This method executes asynchronously. The NetworkOfferCallback object can continue
+ * receiving onNetworkNeeded and onNetworkUnneeded callbacks even after this method has
+ * returned. In this case, it is on the caller to take appropriate steps in order to prevent
+ * bringing up a network.
+ *
* @hide
*/
@SystemApi
@@ -342,7 +332,6 @@
final NetworkOfferCallbackProxy proxy = findProxyForCallback(callback);
if (null == proxy) return;
synchronized (mProxies) {
- proxy.markStale();
mProxies.remove(proxy);
}
mContext.getSystemService(ConnectivityManager.class).unofferNetwork(proxy);
diff --git a/tests/mts/bpf_existence_test.cpp b/tests/mts/bpf_existence_test.cpp
index 67b4f42..0911ecf 100644
--- a/tests/mts/bpf_existence_test.cpp
+++ b/tests/mts/bpf_existence_test.cpp
@@ -127,7 +127,6 @@
// Provided by *current* mainline module for T+ devices with 5.15+ kernels
static const set<string> MAINLINE_FOR_T_5_15_PLUS = {
SHARED "prog_dscpPolicy_schedcls_set_dscp_ether",
- SHARED "prog_dscpPolicy_schedcls_set_dscp_raw_ip",
};
void addAll(set<string>* a, const set<string>& b) {