diff options
| author | Maciej Żenczykowski <maze@google.com> | 2021-01-21 01:05:09 -0800 |
|---|---|---|
| committer | Maciej Żenczykowski <maze@google.com> | 2021-01-21 02:58:44 -0800 |
| commit | 288ec5b428d7dfd04c1f6d618618b57daaa48791 (patch) | |
| tree | f644468042180714d40462c62b62f8d58045816f /server/TetherController.cpp | |
| parent | cc6a5b95e38a9dd0e329ed437de6d0a1da4abe86 (diff) | |
attach upstream ipv4 and ipv6 tether offload tc ebpf programs
Test: atest, TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: If3eb91ca9c241dbc43dcb4e1741fd2a55b4d3016
Diffstat (limited to 'server/TetherController.cpp')
| -rw-r--r-- | server/TetherController.cpp | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/server/TetherController.cpp b/server/TetherController.cpp index 647c46c7..b50dd5b7 100644 --- a/server/TetherController.cpp +++ b/server/TetherController.cpp @@ -631,7 +631,8 @@ int TetherController::enableNat(const char* intIface, const char* extIface) { return -ENODEV; } - if (firstDownstreamForThisUpstream) startDownstreamBpf(extIface); + if (firstDownstreamForThisUpstream) startBpf(extIface, DOWNSTREAM); + startBpf(intIface, UPSTREAM); return 0; } @@ -815,6 +816,7 @@ int TetherController::disableNat(const char* intIface, const char* extIface) { } setForwardRules(false, intIface, extIface); + stopBpf(intIface); if (!isAnyForwardingEnabledOnUpstream(extIface)) stopBpf(extIface); if (!isAnyForwardingPairEnabled()) setDefaults(); return 0; @@ -1091,45 +1093,46 @@ Result<void> TetherController::setBpfLimit(uint32_t ifIndex, uint64_t limit) { return {}; } -void TetherController::startDownstreamBpf(const char* extIface) { - int ifIndex = if_nametoindex(extIface); +void TetherController::startBpf(const char* iface, bool downstream) { + const char* const downStr = downstream ? "DOWNSTREAM" : "UPSTREAM"; + int ifIndex = if_nametoindex(iface); if (!ifIndex) { - ALOGE("Fail to get index for interface %s", extIface); + ALOGE("Fail to get index for interface %s", iface); return; } - auto isEthernet = android::net::isEthernet(extIface); + auto isEthernet = android::net::isEthernet(iface); if (!isEthernet.ok()) { - ALOGE("isEthernet(%s[%d]) failure: %s", extIface, ifIndex, + ALOGE("isEthernet(%s[%d]) failure: %s", iface, ifIndex, isEthernet.error().message().c_str()); return; } - int rv = getTetherDownstream6TcProgFd(isEthernet.value()); + int rv = getTether6TcProgFd(isEthernet.value(), downstream); if (rv < 0) { - ALOGE("getTetherDownstream6TcProgFd(%d) failure: %s", isEthernet.value(), strerror(-rv)); + ALOGE("getTether6TcProgFd(%d, %s) failure: %s", isEthernet.value(), downStr, strerror(-rv)); return; } unique_fd tether6ProgFd(rv); - rv = getTetherDownstream4TcProgFd(isEthernet.value()); + rv = getTether4TcProgFd(isEthernet.value(), downstream); if (rv < 0) { - ALOGE("getTetherDownstream4TcProgFd(%d) failure: %s", isEthernet.value(), strerror(-rv)); + ALOGE("getTether4TcProgFd(%d, %s) failure: %s", isEthernet.value(), downStr, strerror(-rv)); return; } unique_fd tether4ProgFd(rv); - rv = tcFilterAddDevIngress6Tether(ifIndex, tether6ProgFd, isEthernet.value(), DOWNSTREAM); + rv = tcFilterAddDevIngress6Tether(ifIndex, tether6ProgFd, isEthernet.value(), downstream); if (rv) { - ALOGE("tcFilterAddDevIngress6Tether(%d[%s], %d, DOWNSTREAM) failure: %s", ifIndex, extIface, - isEthernet.value(), strerror(-rv)); + ALOGE("tcFilterAddDevIngress6Tether(%d[%s], %d, %s) failure: %s", ifIndex, iface, + isEthernet.value(), downStr, strerror(-rv)); return; } - rv = tcFilterAddDevIngress4Tether(ifIndex, tether4ProgFd, isEthernet.value(), DOWNSTREAM); + rv = tcFilterAddDevIngress4Tether(ifIndex, tether4ProgFd, isEthernet.value(), downstream); if (rv) { - ALOGE("tcFilterAddDevIngress4Tether(%d[%s], %d, DOWNSTREAM) failure: %s", ifIndex, extIface, - isEthernet.value(), strerror(-rv)); + ALOGE("tcFilterAddDevIngress4Tether(%d[%s], %d, %s) failure: %s", ifIndex, iface, + isEthernet.value(), downStr, strerror(-rv)); return; } } |
