ClatdController - also attach 'clsact' qdisc to v4-* interface

Note that cleanup is already partially handled by init's resetEgressMap()

Test: compiles, atest, flashed to phone on wifi/cellular ipv6 only
      network and observed dumpsys netd printout and interface tc state
Bug: 139396664
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I1a90da16f1751c354e01d1b7706255ecde24996a
diff --git a/server/ClatdController.cpp b/server/ClatdController.cpp
index cf51eca..379e857 100644
--- a/server/ClatdController.cpp
+++ b/server/ClatdController.cpp
@@ -348,6 +348,22 @@
         return;
     }
 
+    rv = tcQdiscAddDevClsact(mNetlinkFd, tracker.v4ifIndex);
+    if (rv) {
+        ALOGE("tcQdiscAddDevClsact(%d[%s]) failure: %s", tracker.v4ifIndex, tracker.v4iface,
+              strerror(-rv));
+        rv = tcQdiscDelDevClsact(mNetlinkFd, tracker.ifIndex);
+        if (rv < 0) {
+            ALOGE("tcQdiscDelDevClsact(%d[%s]) failure: %s", tracker.ifIndex, tracker.iface,
+                  strerror(-rv));
+        }
+        ret = mClatEgressMap.deleteValue(txKey);
+        if (!isOk(ret)) ALOGE("mClatEgressMap.deleteValue failure: %s", strerror(ret.code()));
+        ret = mClatIngressMap.deleteValue(rxKey);
+        if (!isOk(ret)) ALOGE("mClatIngressMap.deleteValue failure: %s", strerror(ret.code()));
+        return;
+    }
+
     rv = tcFilterAddDevIngressBpf(mNetlinkFd, tracker.ifIndex, rxProgFd, isEthernet);
     if (rv) {
         if ((rv == -ENOENT) && (mClatEbpfMode == ClatEbpfMaybe)) {
@@ -362,6 +378,11 @@
             ALOGE("tcQdiscDelDevClsact(%d[%s]) failure: %s", tracker.ifIndex, tracker.iface,
                   strerror(-rv));
         }
+        rv = tcQdiscDelDevClsact(mNetlinkFd, tracker.v4ifIndex);
+        if (rv) {
+            ALOGE("tcQdiscDelDevClsact(%d[%s]) failure: %s", tracker.v4ifIndex, tracker.v4iface,
+                  strerror(-rv));
+        }
         ret = mClatEgressMap.deleteValue(txKey);
         if (!isOk(ret)) ALOGE("mClatEgressMap.deleteValue failure: %s", strerror(ret.code()));
         ret = mClatIngressMap.deleteValue(rxKey);
@@ -387,12 +408,19 @@
 void ClatdController::maybeStopBpf(const ClatdTracker& tracker) {
     if (mClatEbpfMode == ClatEbpfDisabled) return;
 
-    // No need to remove filter, since we remove qdisc it is attached to,
+    // No need to remove filters, since we remove qdiscs they are attached to,
     // which automatically removes everything attached to the qdisc.
     int rv = tcQdiscDelDevClsact(mNetlinkFd, tracker.ifIndex);
-    if (rv < 0)
+    if (rv < 0) {
         ALOGE("tcQdiscDelDevClsact(%d[%s]) failure: %s", tracker.ifIndex, tracker.iface,
               strerror(-rv));
+    }
+
+    rv = tcQdiscDelDevClsact(mNetlinkFd, tracker.v4ifIndex);
+    if (rv < 0) {
+        ALOGE("tcQdiscDelDevClsact(%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.