diff --git a/server/TetherController.cpp b/server/TetherController.cpp
index 44c7e35..092d456 100644
--- a/server/TetherController.cpp
+++ b/server/TetherController.cpp
@@ -40,12 +40,36 @@
 using android::base::ReadFileToString;
 using android::base::WriteStringToFile;
 
+namespace {
+
+static const char BP_TOOLS_MODE[] = "bp-tools";
+static const char IPV4_FORWARDING_PROC_FILE[] = "/proc/sys/net/ipv4/ip_forward";
+static const char IPV6_FORWARDING_PROC_FILE[] = "/proc/sys/net/ipv6/conf/all/forwarding";
+
+bool writeToFile(const char* filename, const char* value) {
+    return WriteStringToFile(value, file);
+}
+
+bool inBpToolsMode() {
+    // In BP tools mode, do not disable IP forwarding
+    char bootmode[PROPERTY_VALUE_MAX] = {0};
+    property_get("ro.bootmode", bootmode, "unknown");
+    return !strcmp(BP_TOOLS_MODE, bootmode);
+}
+
+}  // namespace
+
 TetherController::TetherController() {
     mInterfaces = new InterfaceCollection();
     mDnsNetId = 0;
     mDnsForwarders = new NetAddressCollection();
     mDaemonFd = -1;
     mDaemonPid = 0;
+    if (inBpToolsMode()) {
+        enableForwarding(BP_TOOLS_MODE);
+    } else {
+        setIpFwdEnabled();
+    }
 }
 
 TetherController::~TetherController() {
@@ -57,35 +81,33 @@
     mInterfaces->clear();
 
     mDnsForwarders->clear();
+    mForwardingRequests.clear();
 }
 
-int TetherController::setIpFwdEnabled(bool enable) {
-
-    ALOGD("Setting IP forward enable = %d", enable);
-
-    // In BP tools mode, do not disable IP forwarding
-    char bootmode[PROPERTY_VALUE_MAX] = {0};
-    property_get("ro.bootmode", bootmode, "unknown");
-    if ((enable == false) && (0 == strcmp("bp-tools", bootmode))) {
-        return 0;
-    }
-
-    if (!WriteStringToFile(enable ? "1" : "0", "/proc/sys/net/ipv4/ip_forward")) {
-        ALOGE("Failed to write ip_forward (%s)", strerror(errno));
-        return -1;
-    }
-
-    return 0;
+bool TetherController::setIpFwdEnabled() {
+    bool success = true;
+    const char* value = mForwardingRequests.empty() ? "0" : "1";
+    ALOGD("Setting IP forward enable = %s", value);
+    success &= writeToFile(IPV4_FORWARDING_PROC_FILE, value);
+    success &= writeToFile(IPV6_FORWARDING_PROC_FILE, value);
+    return success;
 }
 
-bool TetherController::getIpFwdEnabled() {
-    std::string enabled;
-    if (!ReadFileToString("/proc/sys/net/ipv4/ip_forward", &enabled)) {
-        ALOGE("Failed to read ip_forward (%s)", strerror(errno));
-        return -1;
-    }
+bool TetherController::enableForwarding(const char* requester) {
+    // Don't return an error if this requester already requested forwarding. Only return errors for
+    // things that the caller caller needs to care about, such as "couldn't write to the file to
+    // enable forwarding".
+    mForwardingRequests.insert(requester);
+    return setIpFwdEnabled();
+}
 
-    return (enabled == "1" ? true : false);
+bool TetherController::disableForwarding(const char* requester) {
+    mForwardingRequests.erase(requester);
+    return setIpFwdEnabled();
+}
+
+size_t TetherController::forwardingRequestCount() {
+    return mForwardingRequests.size();
 }
 
 #define TETHER_START_CONST_ARG        8
