Separate NAT from forwarding.

Bug: 19500693

Change-Id: Ib3871106ea3c0d68327611e7568c0710210e4ff2
diff --git a/server/CommandListener.cpp b/server/CommandListener.cpp
index 76281fd..1b058b7 100644
--- a/server/CommandListener.cpp
+++ b/server/CommandListener.cpp
@@ -503,28 +503,49 @@
 }
 
 int CommandListener::IpFwdCmd::runCommand(SocketClient *cli, int argc, char **argv) {
+    bool matched = false;
     bool success;
 
-    if (argc == 2 && !strcmp(argv[1], "status")) {
-        char *tmp = NULL;
+    if (argc == 2) {
+        //   0     1
+        // ipfwd status
+        if (!strcmp(argv[1], "status")) {
+            char *tmp = NULL;
 
-        asprintf(&tmp, "Forwarding %s",
-                 ((sTetherCtrl->forwardingRequestCount() > 0) ? "enabled" : "disabled"));
-        cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false);
-        free(tmp);
-        return 0;
+            asprintf(&tmp, "Forwarding %s",
+                     ((sTetherCtrl->forwardingRequestCount() > 0) ? "enabled" : "disabled"));
+            cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false);
+            free(tmp);
+            return 0;
+        }
+    } else if (argc == 3) {
+        //  0      1         2
+        // ipfwd enable  <requester>
+        // ipfwd disable <requester>
+        if (!strcmp(argv[1], "enable")) {
+            matched = true;
+            success = sTetherCtrl->enableForwarding(argv[2]);
+        } else if (!strcmp(argv[1], "disable")) {
+            matched = true;
+            success = sTetherCtrl->disableForwarding(argv[2]);
+        }
+    } else if (argc == 4) {
+        //  0      1      2     3
+        // ipfwd  add   wlan0 dummy0
+        // ipfwd remove wlan0 dummy0
+        int ret = 0;
+        if (!strcmp(argv[1], "add")) {
+            matched = true;
+            ret = RouteController::enableTethering(argv[2], argv[3]);
+        } else if (!strcmp(argv[1], "remove")) {
+            matched = true;
+            ret = RouteController::disableTethering(argv[2], argv[3]);
+        }
+        success = (ret == 0);
+        errno = -ret;
     }
 
-    if (argc < 3) {
-        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false);
-        return 0;
-    }
-
-    if (!strcmp(argv[1], "enable")) {
-        success = sTetherCtrl->enableForwarding(argv[2]);
-    } else if (!strcmp(argv[1], "disable")) {
-        success = sTetherCtrl->disableForwarding(argv[2]);
-    } else {
+    if (!matched) {
         cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false);
         return 0;
     }
@@ -534,7 +555,6 @@
     } else {
         cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true);
     }
-
     return 0;
 }
 
diff --git a/server/NatController.cpp b/server/NatController.cpp
index e66d971..5a15afa 100644
--- a/server/NatController.cpp
+++ b/server/NatController.cpp
@@ -199,15 +199,6 @@
     };
     runCmd(ARRAY_SIZE(cmd2), cmd2);
 
-    if (int ret = RouteController::enableTethering(intIface, extIface)) {
-        ALOGE("failed to add tethering rule for iif=%s oif=%s", intIface, extIface);
-        if (natCount == 0) {
-            setDefaults();
-        }
-        errno = -ret;
-        return -1;
-    }
-
     natCount++;
     return 0;
 }
@@ -368,12 +359,6 @@
         return -1;
     }
 
-    if (int ret = RouteController::disableTethering(intIface, extIface)) {
-        ALOGE("failed to remove tethering rule for iif=%s oif=%s", intIface, extIface);
-        errno = -ret;
-        return -1;
-    }
-
     setForwardRules(false, intIface, extIface);
     if (--natCount <= 0) {
         // handle decrement to 0 case (do reset to defaults) and erroneous dec below 0