diff options
Diffstat (limited to 'server/TetherController.cpp')
| -rw-r--r-- | server/TetherController.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/server/TetherController.cpp b/server/TetherController.cpp index 49c1b7e6..62dcbbf1 100644 --- a/server/TetherController.cpp +++ b/server/TetherController.cpp @@ -507,12 +507,13 @@ int TetherController::setDefaults() { "COMMIT\n", LOCAL_FORWARD, LOCAL_FORWARD, LOCAL_NAT_POSTROUTING); std::string v6Cmd = StringPrintf( - "*filter\n" - ":%s -\n" - "COMMIT\n" - "*raw\n" - ":%s -\n" - "COMMIT\n", LOCAL_FORWARD, LOCAL_RAW_PREROUTING); + "*filter\n" + ":%s -\n" + "COMMIT\n" + "*raw\n" + ":%s -\n" + "COMMIT\n", + LOCAL_FORWARD, LOCAL_RAW_PREROUTING); int res = iptablesRestoreFunction(V4, v4Cmd, nullptr); if (res < 0) { @@ -552,8 +553,8 @@ int TetherController::enableNat(const char* intIface, const char* extIface) { "COMMIT\n" }; - if (iptablesRestoreFunction(V4, Join(v4Cmds, '\n'), nullptr) || - setupIPv6CountersChain()) { + if (iptablesRestoreFunction(V4, Join(v4Cmds, '\n'), nullptr) || setupIPv6CountersChain() || + setTetherGlobalAlertRule()) { ALOGE("Error setting postroute rule: iface=%s", extIface); if (!isAnyForwardingPairEnabled()) { // unwind what's been done, but don't care about success - what more could we do? @@ -574,6 +575,19 @@ int TetherController::enableNat(const char* intIface, const char* extIface) { return 0; } +int TetherController::setTetherGlobalAlertRule() { + // Only add this if we are the first enabled nat + if (isAnyForwardingPairEnabled()) { + return 0; + } + const std::string cmds = + "*filter\n" + + StringPrintf("-I %s -j %s\n", LOCAL_FORWARD, BandwidthController::LOCAL_GLOBAL_ALERT) + + "COMMIT\n"; + + return iptablesRestoreFunction(V4V6, cmds, nullptr); +} + int TetherController::setupIPv6CountersChain() { // Only add this if we are the first enabled nat if (isAnyForwardingPairEnabled()) { @@ -584,13 +598,11 @@ int TetherController::setupIPv6CountersChain() { * IPv6 tethering doesn't need the state-based conntrack rules, so * it unconditionally jumps to the tether counters chain all the time. */ - std::vector<std::string> v6Cmds = { - "*filter", - StringPrintf("-A %s -g %s", LOCAL_FORWARD, LOCAL_TETHER_COUNTERS_CHAIN), - "COMMIT\n" - }; + const std::string v6Cmds = + "*filter\n" + + StringPrintf("-A %s -g %s\n", LOCAL_FORWARD, LOCAL_TETHER_COUNTERS_CHAIN) + "COMMIT\n"; - return iptablesRestoreFunction(V6, Join(v6Cmds, '\n'), nullptr); + return iptablesRestoreFunction(V6, v6Cmds, nullptr); } // Gets a pointer to the ForwardingDownstream for an interface pair in the map, or nullptr @@ -738,7 +750,8 @@ int TetherController::setForwardRules(bool add, const char *intIface, const char int TetherController::disableNat(const char* intIface, const char* extIface) { if (!isIfaceName(intIface) || !isIfaceName(extIface)) { - return -ENODEV; + errno = ENODEV; + return -errno; } setForwardRules(false, intIface, extIface); |
