Keep better tabs on secondary tables.
We had some places (NatController) where routes were being set
but not accounted for in the number-of-routes talley so we
could end up thinking the table was empty and not clean up
after ourselves properly.
Also consolidated constants.
bug:5917475
Change-Id: I98a41d433e1d4b4ca6692fb2328e2c9afc828145
diff --git a/NatController.cpp b/NatController.cpp
index ef1f343..bdbc429 100644
--- a/NatController.cpp
+++ b/NatController.cpp
@@ -30,12 +30,10 @@
#include "NatController.h"
#include "SecondaryTableController.h"
#include "oem_iptables_hook.h"
+#include "NetdConstants.h"
extern "C" int system_nosh(const char *command);
-static char IPTABLES_PATH[] = "/system/bin/iptables";
-static char IP_PATH[] = "/system/bin/ip";
-
NatController::NatController(SecondaryTableController *ctrl) {
secondaryTableCtrl = ctrl;
setDefaults();
@@ -93,14 +91,6 @@
return true;
}
-const char *NatController::getVersion(const char *addr) {
- if (strchr(addr, ':') != NULL) {
- return "-6";
- } else {
- return "-4";
- }
-}
-
// 0 1 2 3 4 5
// nat enable intface extface addrcnt nated-ipaddr/prelength
int NatController::enableNat(const int argc, char **argv) {
@@ -126,16 +116,10 @@
tableNumber = secondaryTableCtrl->findTableNumber(extIface);
if (tableNumber != -1) {
- for(i = 0; i < addrCount && ret == 0; i++) {
- snprintf(cmd, sizeof(cmd), "%s rule add from %s table %d", getVersion(argv[5+i]),
- argv[5+i], tableNumber + BASE_TABLE_NUMBER);
- ret |= runCmd(IP_PATH, cmd);
- if (ret) ALOGE("IP rule %s got %d", cmd, ret);
+ for(i = 0; i < addrCount; i++) {
+ ret |= secondaryTableCtrl->modifyFromRule(tableNumber, ADD, argv[5+i]);
- snprintf(cmd, sizeof(cmd), "route add %s dev %s table %d", argv[5+i], intIface,
- tableNumber + BASE_TABLE_NUMBER);
- ret |= runCmd(IP_PATH, cmd);
- if (ret) ALOGE("IP route %s got %d", cmd, ret);
+ ret |= secondaryTableCtrl->modifyLocalRoute(tableNumber, ADD, intIface, argv[5+i]);
}
runCmd(IP_PATH, "route flush cache");
}
@@ -143,13 +127,9 @@
if (ret != 0 || setForwardRules(true, intIface, extIface) != 0) {
if (tableNumber != -1) {
for (i = 0; i < addrCount; i++) {
- snprintf(cmd, sizeof(cmd), "route del %s dev %s table %d", argv[5+i], intIface,
- tableNumber + BASE_TABLE_NUMBER);
- runCmd(IP_PATH, cmd);
+ secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
- snprintf(cmd, sizeof(cmd), "%s rule del from %s table %d", getVersion(argv[5+i]),
- argv[5+i], tableNumber + BASE_TABLE_NUMBER);
- runCmd(IP_PATH, cmd);
+ secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
}
runCmd(IP_PATH, "route flush cache");
}
@@ -166,9 +146,9 @@
ALOGE("Error seting postroute rule: %s", cmd);
// unwind what's been done, but don't care about success - what more could we do?
for (i = 0; i < addrCount; i++) {
- snprintf(cmd, sizeof(cmd), "route del %s dev %s table %d", argv[5+i], intIface,
- tableNumber + BASE_TABLE_NUMBER);
- runCmd(IP_PATH, cmd);
+ secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
+
+ secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
}
setDefaults();
return -1;
@@ -251,15 +231,9 @@
tableNumber = secondaryTableCtrl->findTableNumber(extIface);
if (tableNumber != -1) {
for (i = 0; i < addrCount; i++) {
- snprintf(cmd, sizeof(cmd), "route del %s dev %s table %d", argv[5+i], intIface,
- tableNumber + BASE_TABLE_NUMBER);
- // if the interface has gone down these will be gone already and give errors
- // ignore them.
- runCmd(IP_PATH, cmd);
+ secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
- snprintf(cmd, sizeof(cmd), "%s rule del from %s table %d", getVersion(argv[5+i]),
- argv[5+i], tableNumber + BASE_TABLE_NUMBER);
- runCmd(IP_PATH, cmd);
+ secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
}
runCmd(IP_PATH, "route flush cache");