From bd85f8903eb114cf3c267377947c64a24bf0a390 Mon Sep 17 00:00:00 2001 From: Hungming Chen Date: Mon, 14 Mar 2022 16:11:06 +0800 Subject: [PATCH] ClatCoordinator: use Java class BpfMap to remove clat rule This a preparation to replace duplicated native functions with the existing Java class. Bug: 221213090 Test: atest FrameworksNetTests Test: manual check Steps: 1. Connect wlan and check map content {iface index, v4addr, v6addr, pfx96} manually after clat started. $ adb shell dumpsys netd ClatdController BPF ingress map: iif(iface) nat64Prefix v6Addr -> v4Addr oif(iface) 47(wlan0) 64:ff9b::/96 2a00:79e1:abc:6f02:2479:2f51:25a9:28f1 -> 192.0.0.4 53(v4-wlan0) BPF egress map: iif(iface) v4Addr -> v6Addr nat64Prefix oif(iface) 53(v4-wlan0) 192.0.0.4 -> 2a00:79e1:abc:6f02:2479:2f51:25a9:28f1 64:ff9b::/96 47(wlan0) ether 2. Disconnect wlan and check the bpf map is removed. $ adb shell dumpsys netd ClatdController BPF ingress map: iif(iface) nat64Prefix v6Addr -> v4Addr oif(iface) BPF egress map: iif(iface) v4Addr -> v6Addr nat64Prefix oif(iface) Change-Id: Ia0c90c7104c4a42d34a28a5ddf3cf13a289f8c76 --- service/native/libs/libclat/bpfhelper.cpp | 20 ----------------- .../server/connectivity/ClatCoordinator.java | 22 +++++++++++++++++++ .../connectivity/ClatCoordinatorTest.java | 2 ++ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/service/native/libs/libclat/bpfhelper.cpp b/service/native/libs/libclat/bpfhelper.cpp index c05a05868a..475675fa56 100644 --- a/service/native/libs/libclat/bpfhelper.cpp +++ b/service/native/libs/libclat/bpfhelper.cpp @@ -139,26 +139,6 @@ void maybeStopBpf(const ClatdTracker& tracker) { ALOGE("tcFilterDelDevEgressClatIpv4(%d[%s]) failure: %s", tracker.v4ifIndex, tracker.v4iface, strerror(-rv)); } - - // We cleanup the maps last, so scanning through them can be used to - // determine what still needs cleanup. - - ClatEgress4Key txKey = { - .iif = tracker.v4ifIndex, - .local4 = tracker.v4, - }; - - auto ret = mClatEgress4Map.deleteValue(txKey); - if (!ret.ok()) ALOGE("mClatEgress4Map.deleteValue failure: %s", strerror(ret.error().code())); - - ClatIngress6Key rxKey = { - .iif = tracker.ifIndex, - .pfx96 = tracker.pfx96, - .local6 = tracker.v6, - }; - - ret = mClatIngress6Map.deleteValue(rxKey); - if (!ret.ok()) ALOGE("mClatIngress6Map.deleteValue failure: %s", strerror(ret.error().code())); } } // namespace clat diff --git a/service/src/com/android/server/connectivity/ClatCoordinator.java b/service/src/com/android/server/connectivity/ClatCoordinator.java index 253e56c791..35b8f17c82 100644 --- a/service/src/com/android/server/connectivity/ClatCoordinator.java +++ b/service/src/com/android/server/connectivity/ClatCoordinator.java @@ -563,6 +563,27 @@ public class ClatCoordinator { return v6Str; } + private void maybeStopBpf(final ClatdTracker tracker) { + if (mIngressMap == null || mEgressMap == null) return; + + final ClatEgress4Key txKey = new ClatEgress4Key(tracker.v4ifIndex, tracker.v4); + try { + mEgressMap.deleteEntry(txKey); + } catch (ErrnoException | IllegalStateException e) { + Log.e(TAG, "Could not delete entry (" + txKey + "): " + e); + } + + final ClatIngress6Key rxKey = new ClatIngress6Key(tracker.ifIndex, tracker.pfx96, + tracker.v6); + try { + mIngressMap.deleteEntry(rxKey); + } catch (ErrnoException | IllegalStateException e) { + Log.e(TAG, "Could not delete entry (" + rxKey + "): " + e); + } + + // TODO: dettach program. + } + /** * Stop clatd */ @@ -572,6 +593,7 @@ public class ClatCoordinator { } Log.i(TAG, "Stopping clatd pid=" + mClatdTracker.pid + " on " + mClatdTracker.iface); + maybeStopBpf(mClatdTracker); mDeps.stopClatd(mClatdTracker.iface, mClatdTracker.pfx96.getHostAddress(), mClatdTracker.v4.getHostAddress(), mClatdTracker.v6.getHostAddress(), mClatdTracker.pid); diff --git a/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java b/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java index dc81038c67..790473d5f7 100644 --- a/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java +++ b/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java @@ -426,6 +426,8 @@ public class ClatCoordinatorTest { // [3] Expect clatd to stop successfully. coordinator.clatStop(); + inOrder.verify(mEgressMap).deleteEntry(eq(EGRESS_KEY)); + inOrder.verify(mIngressMap).deleteEntry(eq(INGRESS_KEY)); inOrder.verify(mDeps).stopClatd(eq(BASE_IFACE), eq(NAT64_PREFIX_STRING), eq(XLAT_LOCAL_IPV4ADDR_STRING), eq(XLAT_LOCAL_IPV6ADDR_STRING), eq(CLATD_PID)); inOrder.verify(mDeps).untagSocket(eq(RAW_SOCK_COOKIE));