diff options
Diffstat (limited to 'server/TetherController.cpp')
| -rw-r--r-- | server/TetherController.cpp | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/server/TetherController.cpp b/server/TetherController.cpp index 44c7e35a..092d4566 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 @@ TetherController::~TetherController() { 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; - } +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; +} - return 0; +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(); } -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::disableForwarding(const char* requester) { + mForwardingRequests.erase(requester); + return setIpFwdEnabled(); +} - return (enabled == "1" ? true : false); +size_t TetherController::forwardingRequestCount() { + return mForwardingRequests.size(); } #define TETHER_START_CONST_ARG 8 |
