Fix tethering in the case of a regular upstream connection.
Fixes tethering via Ethernet, Bluetooth and WiFi (hotspot).
Tethering when the upstream has a DUN-specific APN is likely still broken
(untested).
For now, assign a fixed NetId (a hack) until we can change the framework to
create a valid NetworkAgent and all that jazz.
Bug: 15968336
Bug: 14988803
Change-Id: Idcf4d492d9329a9c87913e27be6dd835a792bea2
diff --git a/server/NatController.cpp b/server/NatController.cpp
index 6c066f8..8340b73 100644
--- a/server/NatController.cpp
+++ b/server/NatController.cpp
@@ -33,15 +33,13 @@
#include "NatController.h"
#include "NetworkController.h"
-#include "SecondaryTableController.h"
#include "NetdConstants.h"
const char* NatController::LOCAL_FORWARD = "natctrl_FORWARD";
const char* NatController::LOCAL_NAT_POSTROUTING = "natctrl_nat_POSTROUTING";
const char* NatController::LOCAL_TETHER_COUNTERS_CHAIN = "natctrl_tether_counters";
-NatController::NatController(SecondaryTableController *table_ctrl, NetworkController* net_ctrl) :
- mSecondaryTableCtrl(table_ctrl), mNetCtrl(net_ctrl) {
+NatController::NatController(NetworkController* net_ctrl) : mNetCtrl(net_ctrl) {
}
NatController::~NatController() {
@@ -114,12 +112,6 @@
{{IPTABLES_PATH, "-F", LOCAL_FORWARD,}, 1},
{{IPTABLES_PATH, "-A", LOCAL_FORWARD, "-j", "DROP"}, 1},
{{IPTABLES_PATH, "-t", "nat", "-F", LOCAL_NAT_POSTROUTING}, 1},
- {{IP_PATH, "rule", "flush"}, 0},
- {{IP_PATH, "-6", "rule", "flush"}, 0},
- {{IP_PATH, "rule", "add", "from", "all", "lookup", "default", "prio", "32767"}, 0},
- {{IP_PATH, "rule", "add", "from", "all", "lookup", "main", "prio", "32766"}, 0},
- {{IP_PATH, "-6", "rule", "add", "from", "all", "lookup", "default", "prio", "32767"}, 0},
- {{IP_PATH, "-6", "rule", "add", "from", "all", "lookup", "main", "prio", "32766"}, 0},
{{IP_PATH, "route", "flush", "cache"}, 0},
};
for (unsigned int cmdNum = 0; cmdNum < ARRAY_SIZE(defaultCommands); cmdNum++) {
@@ -134,17 +126,15 @@
return 0;
}
-int NatController::routesOp(bool add, const char *intIface, const char *extIface, char **argv, int addrCount) {
- unsigned netId = mNetCtrl->getNetworkForInterface(extIface);
+int NatController::routesOp(bool add, const char *intIface, char **argv, int addrCount) {
+ unsigned netId = mNetCtrl->getNetworkForInterface(intIface);
int ret = 0;
for (int i = 0; i < addrCount; i++) {
if (add) {
- ret |= mSecondaryTableCtrl->modifyFromRule(netId, ADD, argv[5+i]);
- ret |= mSecondaryTableCtrl->modifyLocalRoute(netId, ADD, intIface, argv[5+i]);
+ ret |= mNetCtrl->addRoute(netId, intIface, argv[5+i], NULL, false, INVALID_UID);
} else {
- ret |= mSecondaryTableCtrl->modifyLocalRoute(netId, DEL, intIface, argv[5+i]);
- ret |= mSecondaryTableCtrl->modifyFromRule(netId, DEL, argv[5+i]);
+ ret |= mNetCtrl->addRoute(netId, intIface, argv[5+i], NULL, false, INVALID_UID);
}
}
const char *cmd[] = {
@@ -183,9 +173,9 @@
errno = EINVAL;
return -1;
}
- if (routesOp(true, intIface, extIface, argv, addrCount)) {
+ if (routesOp(true, intIface, argv, addrCount)) {
ALOGE("Error setting route rules");
- routesOp(false, intIface, extIface, argv, addrCount);
+ routesOp(false, intIface, argv, addrCount);
errno = ENODEV;
return -1;
}
@@ -206,7 +196,7 @@
if (runCmd(ARRAY_SIZE(cmd), cmd)) {
ALOGE("Error seting postroute rule: iface=%s", extIface);
// unwind what's been done, but don't care about success - what more could we do?
- routesOp(false, intIface, extIface, argv, addrCount);
+ routesOp(false, intIface, argv, addrCount);
setDefaults();
return -1;
}
@@ -215,7 +205,7 @@
if (setForwardRules(true, intIface, extIface) != 0) {
ALOGE("Error setting forward rules");
- routesOp(false, intIface, extIface, argv, addrCount);
+ routesOp(false, intIface, argv, addrCount);
if (natCount == 0) {
setDefaults();
}
@@ -415,7 +405,7 @@
}
setForwardRules(false, intIface, extIface);
- routesOp(false, intIface, extIface, argv, addrCount);
+ routesOp(false, intIface, argv, addrCount);
if (--natCount <= 0) {
// handle decrement to 0 case (do reset to defaults) and erroneous dec below 0
setDefaults();