ClatdController - implement resetEgressMap()

Test: compiles, atest
Bug: 139396664
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ie5f969cf94d9571a0ee5a2847c87e397132f46f1
diff --git a/server/ClatdController.cpp b/server/ClatdController.cpp
index da8f5da..a29962c 100644
--- a/server/ClatdController.cpp
+++ b/server/ClatdController.cpp
@@ -70,6 +70,22 @@
 namespace android {
 namespace net {
 
+void ClatdController::resetEgressMap() {
+    int netlinkFd = mNetlinkFd.get();
+
+    const auto del = [&netlinkFd](const ClatEgressKey& key,
+                                  const BpfMap<ClatEgressKey, ClatEgressValue>&) {
+        ALOGW("Removing stale clat config on interface %d.", key.iif);
+        int rv = tcQdiscDelDevClsact(netlinkFd, key.iif);
+        if (rv < 0) ALOGE("tcQdiscDelDevClsact() failure: %s", strerror(-rv));
+        return netdutils::status::ok;  // keep on going regardless
+    };
+    auto ret = mClatEgressMap.iterate(del);
+    if (!isOk(ret)) ALOGE("mClatEgressMap.iterate() failure: %s", strerror(ret.code()));
+    ret = mClatEgressMap.clear();
+    if (!isOk(ret)) ALOGE("mClatEgressMap.clear() failure: %s", strerror(ret.code()));
+}
+
 void ClatdController::resetIngressMap() {
     int netlinkFd = mNetlinkFd.get();
 
@@ -142,6 +158,7 @@
     }
     mClatIngressMap.reset(rv);
 
+    resetEgressMap();
     resetIngressMap();
 }
 
diff --git a/server/ClatdController.h b/server/ClatdController.h
index 9efa8ae..8794e80 100644
--- a/server/ClatdController.h
+++ b/server/ClatdController.h
@@ -82,6 +82,7 @@
     std::map<std::string, ClatdTracker> mClatdTrackers GUARDED_BY(mutex);
     ClatdTracker* getClatdTracker(const std::string& interface) REQUIRES(mutex);
 
+    void resetEgressMap() REQUIRES(mutex);
     void resetIngressMap() REQUIRES(mutex);
 
     void dumpEgress(netdutils::DumpWriter& dw) REQUIRES(mutex);