Clear incoming packet mark rules on netd startup.
Currently, we put the incoming packet mark rules directly into
the INPUT chain of the mangle table, which is not cleared on netd
start. Move these rules to their own chain. This makes them
consistent with all the other iptables rules and makes it easy to
clear them on startup using the existing mechanisms.
Bug: 28362720
Test: bullhead builds, boots
Test: netd_{unit,integration}_test pass
Test: watch -n1 "adb shell iptables -v -n -t mangle -L INPUT" while switching networks
Test: rules are cleared on netd restart
Change-Id: I9130f997a96dcfdfdfdd950520a76f8473b5f603
diff --git a/server/RouteController.cpp b/server/RouteController.cpp
index f2894cb..aeed3e9 100644
--- a/server/RouteController.cpp
+++ b/server/RouteController.cpp
@@ -81,6 +81,8 @@
const char* const ROUTE_TABLE_NAME_LOCAL = "local";
const char* const ROUTE_TABLE_NAME_MAIN = "main";
+const char* const RouteController::LOCAL_MANGLE_INPUT = "routectrl_mangle_INPUT";
+
// These values are upstream, but not yet in our headers.
// TODO: delete these definitions when updating the headers.
const uint16_t FRA_UID_RANGE = 20;
@@ -422,8 +424,9 @@
fwmark.protectedFromVpn = true;
fwmark.permission = permission;
- std::string cmd = StringPrintf("%s INPUT -i %s -j MARK --set-mark 0x%x",
- add ? "-A" : "-D", interface, fwmark.intValue);
+ std::string cmd = StringPrintf("%s %s -i %s -j MARK --set-mark 0x%x",
+ add ? "-A" : "-D", RouteController::LOCAL_MANGLE_INPUT,
+ interface, fwmark.intValue);
if (RouteController::iptablesRestoreCommandFunction(V4V6, "mangle", cmd, nullptr) != 0) {
ALOGE("failed to change iptables rule that sets incoming packet mark");
return -EREMOTEIO;