Fix some syntax issues with IP command.
Was not building secondary tables properly. Also IPv6 host routes
were failing.
bug:5615697
Change-Id: I0d5ad2ed7d13e4d5bd8c2f8ce15fc0ccb36a4690
diff --git a/NatController.cpp b/NatController.cpp
index ce5b3f1..5f6a46a 100644
--- a/NatController.cpp
+++ b/NatController.cpp
@@ -74,8 +74,12 @@
return -1;
runCmd(IP_PATH, "rule flush");
+ runCmd(IP_PATH, "-6 rule flush");
runCmd(IP_PATH, "rule add from all lookup default prio 32767");
runCmd(IP_PATH, "rule add from all lookup main prio 32766");
+ runCmd(IP_PATH, "-6 rule add from all lookup default prio 32767");
+ runCmd(IP_PATH, "-6 rule add from all lookup main prio 32766");
+ runCmd(IP_PATH, "route flush cache");
natCount = 0;
return 0;
@@ -86,6 +90,14 @@
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) {
@@ -112,8 +124,8 @@
tableNumber = secondaryTableCtrl->findTableNumber(extIface);
if (tableNumber != -1) {
for(i = 0; i < addrCount && ret == 0; i++) {
- snprintf(cmd, sizeof(cmd), "rule add from %s table %d", argv[5+i],
- tableNumber + BASE_TABLE_NUMBER);
+ 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) LOGE("IP rule %s got %d", cmd, ret);
@@ -122,6 +134,7 @@
ret |= runCmd(IP_PATH, cmd);
if (ret) LOGE("IP route %s got %d", cmd, ret);
}
+ runCmd(IP_PATH, "route flush cache");
}
if (ret != 0 || setForwardRules(true, intIface, extIface) != 0) {
@@ -131,10 +144,11 @@
tableNumber + BASE_TABLE_NUMBER);
runCmd(IP_PATH, cmd);
- snprintf(cmd, sizeof(cmd), "rule del from %s table %d", argv[5+i],
- tableNumber + BASE_TABLE_NUMBER);
+ 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);
}
+ runCmd(IP_PATH, "route flush cache");
}
LOGE("Error setting forward rules");
errno = ENODEV;
@@ -239,7 +253,13 @@
// if the interface has gone down these will be gone already and give errors
// ignore them.
runCmd(IP_PATH, cmd);
+
+ 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);
}
+
+ runCmd(IP_PATH, "route flush cache");
}
if (--natCount <= 0) {
diff --git a/NatController.h b/NatController.h
index d10cbd9..eae32b4 100644
--- a/NatController.h
+++ b/NatController.h
@@ -40,6 +40,7 @@
int runCmd(const char *path, const char *cmd);
bool checkInterface(const char *iface);
int setForwardRules(bool set, const char *intIface, const char *extIface);
+ const char *getVersion(const char *addr);
};
#endif
diff --git a/SecondaryTableController.cpp b/SecondaryTableController.cpp
index d6f6825..1be1c79 100644
--- a/SecondaryTableController.cpp
+++ b/SecondaryTableController.cpp
@@ -35,6 +35,8 @@
#include "SecondaryTableController.h"
static char IP_PATH[] = "/system/bin/ip";
+static char ADD[] = "add";
+static char DEL[] = "del";
SecondaryTableController::SecondaryTableController() {
int i;
@@ -60,8 +62,6 @@
int SecondaryTableController::addRoute(SocketClient *cli, char *iface, char *dest, int prefix,
char *gateway) {
- char *cmd;
-
int tableIndex = findTableNumber(iface);
if (tableIndex == -1) {
tableIndex = findTableNumber(""); // look for an empty slot
@@ -74,22 +74,44 @@
strncpy(mInterfaceTable[tableIndex], iface, MAX_IFACE_LENGTH);
}
- asprintf(&cmd, "%s route add %s/%d via %s table %d",
- IP_PATH, dest, prefix, gateway, tableIndex+BASE_TABLE_NUMBER);
+ return modifyRoute(cli, ADD, iface, dest, prefix, gateway, tableIndex);
+}
+
+int SecondaryTableController::modifyRoute(SocketClient *cli, char *action, char *iface, char *dest,
+ int prefix, char *gateway, int tableIndex) {
+ char *cmd;
+
+ if (strcmp("::", gateway) == 0) {
+ // IP tool doesn't like "::" - the equiv of 0.0.0.0 that it accepts for ipv4
+ asprintf(&cmd, "%s route %s %s/%d dev %s table %d",
+ IP_PATH, action, dest, prefix, iface, tableIndex+BASE_TABLE_NUMBER);
+ } else {
+ asprintf(&cmd, "%s route %s %s/%d via %s dev %s table %d",
+ IP_PATH, action, dest, prefix, gateway, iface, tableIndex+BASE_TABLE_NUMBER);
+ }
+
if (runAndFree(cli, cmd)) {
- LOGE("ip route add failed: %s", cmd);
+ LOGE("ip route %s failed: %s route %s %s/%d via %s dev %s table %d", action,
+ IP_PATH, action, dest, prefix, gateway, iface, tableIndex+BASE_TABLE_NUMBER);
errno = ENODEV;
- cli->sendMsg(ResponseCode::OperationFailed, "ip route add failed", true);
+ cli->sendMsg(ResponseCode::OperationFailed, "ip route modification failed", true);
return -1;
}
- mInterfaceRuleCount[tableIndex]++;
- cli->sendMsg(ResponseCode::CommandOkay, "Route added", false);
+
+ if (strcmp(action, ADD) == 0) {
+ mInterfaceRuleCount[tableIndex]++;
+ } else {
+ if (--mInterfaceRuleCount[tableIndex] < 1) {
+ mInterfaceRuleCount[tableIndex] = 0;
+ mInterfaceTable[tableIndex][0] = 0;
+ }
+ }
+ cli->sendMsg(ResponseCode::CommandOkay, "Route modified", false);
return 0;
}
int SecondaryTableController::removeRoute(SocketClient *cli, char *iface, char *dest, int prefix,
char *gateway) {
- char *cmd;
int tableIndex = findTableNumber(iface);
if (tableIndex == -1) {
LOGE("Interface not found");
@@ -98,19 +120,7 @@
return -1;
}
- asprintf(&cmd, "%s route del %s/%d via %s table %d",
- IP_PATH, dest, prefix, gateway, tableIndex+BASE_TABLE_NUMBER);
- if (runAndFree(cli, cmd)) {
- LOGE("ip route del failed");
- errno = ENODEV;
- cli->sendMsg(ResponseCode::OperationFailed, "ip route del failed", true);
- return -1;
- }
- if (--mInterfaceRuleCount[tableIndex]<1) {
- mInterfaceTable[tableIndex][0]=0;
- }
- cli->sendMsg(ResponseCode::CommandOkay, "Route removed", false);
- return 0;
+ return modifyRoute(cli, DEL, iface, dest, prefix, gateway, tableIndex);
}
int SecondaryTableController::runAndFree(SocketClient *cli, char *cmd) {
diff --git a/SecondaryTableController.h b/SecondaryTableController.h
index 7c77385..0051f7f 100644
--- a/SecondaryTableController.h
+++ b/SecondaryTableController.h
@@ -35,6 +35,9 @@
int findTableNumber(const char *iface);
private:
+ int modifyRoute(SocketClient *cli, char *action, char *iface, char *dest, int prefix,
+ char *gateway, int tableIndex);
+
char mInterfaceTable[INTERFACES_TRACKED][MAX_IFACE_LENGTH];
int mInterfaceRuleCount[INTERFACES_TRACKED];