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.