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();