|
|
|
@ -162,7 +162,7 @@ static int ip_route_cmd(const char *ifname, uint32_t network, uint8_t prefix_len |
|
|
|
addr.s_addr = network; |
|
|
|
addr.s_addr = network; |
|
|
|
|
|
|
|
|
|
|
|
char cmdline[256]; |
|
|
|
char cmdline[256]; |
|
|
|
snprintf(cmdline, sizeof(cmdline), "ip route %s %s/%d dev %s 2>/dev/null", |
|
|
|
snprintf(cmdline, sizeof(cmdline), "ip route %s %s/%d dev %s >/dev/null 2>&1", |
|
|
|
cmd, ip_to_str(&addr, AF_INET).str, prefix_len, ifname); |
|
|
|
cmd, ip_to_str(&addr, AF_INET).str, prefix_len, ifname); |
|
|
|
|
|
|
|
|
|
|
|
int ret = system(cmdline); |
|
|
|
int ret = system(cmdline); |
|
|
|
@ -210,15 +210,15 @@ int tun_route_del(uint32_t ifindex, const char *ifname, uint32_t network, uint8_ |
|
|
|
int tun_route_flush(const char *ifname) { |
|
|
|
int tun_route_flush(const char *ifname) { |
|
|
|
// Use ip route flush as primary method - works reliably
|
|
|
|
// Use ip route flush as primary method - works reliably
|
|
|
|
char cmdline[256]; |
|
|
|
char cmdline[256]; |
|
|
|
snprintf(cmdline, sizeof(cmdline), "ip route flush dev %s 2>/dev/null", ifname); |
|
|
|
snprintf(cmdline, sizeof(cmdline), "ip route flush dev %s >/dev/null 2>&1", ifname); |
|
|
|
int ret = system(cmdline); |
|
|
|
int ret = system(cmdline); |
|
|
|
|
|
|
|
|
|
|
|
if (ret != 0) { |
|
|
|
if (ret != 0) { |
|
|
|
// Fallback: try to list and delete routes one by one
|
|
|
|
// Fallback: try to list and delete routes one by one
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_TUN, "ip route flush failed, trying alternative method"); |
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_TUN, "ip route flush failed, trying alternative method"); |
|
|
|
snprintf(cmdline, sizeof(cmdline),
|
|
|
|
snprintf(cmdline, sizeof(cmdline),
|
|
|
|
"ip route show dev %s 2>/dev/null | while read r; do ip route del $r dev %s 2>/dev/null; done", |
|
|
|
"ip route show dev %s 2>/dev/null | while read r; do ip route del $r dev %s >/dev/null 2>&1; done", |
|
|
|
ifname, ifname); |
|
|
|
ifname, ifname); |
|
|
|
ret = system(cmdline); |
|
|
|
ret = system(cmdline); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -457,7 +457,7 @@ static int route_cmd(const char *ifname, uint32_t network, uint8_t prefix_len, c |
|
|
|
addr.s_addr = htonl(network); |
|
|
|
addr.s_addr = htonl(network); |
|
|
|
|
|
|
|
|
|
|
|
char cmdline[256]; |
|
|
|
char cmdline[256]; |
|
|
|
snprintf(cmdline, sizeof(cmdline), "route %s -net %s/%d -interface %s 2>/dev/null", |
|
|
|
snprintf(cmdline, sizeof(cmdline), "route %s -net %s/%d -interface %s >/dev/null 2>&1", |
|
|
|
cmd, ip_to_str(&addr, AF_INET).str, prefix_len, ifname); |
|
|
|
cmd, ip_to_str(&addr, AF_INET).str, prefix_len, ifname); |
|
|
|
|
|
|
|
|
|
|
|
int ret = system(cmdline); |
|
|
|
int ret = system(cmdline); |
|
|
|
@ -503,7 +503,7 @@ int tun_route_flush(const char *ifname) { |
|
|
|
char cmdline[256]; |
|
|
|
char cmdline[256]; |
|
|
|
snprintf(cmdline, sizeof(cmdline),
|
|
|
|
snprintf(cmdline, sizeof(cmdline),
|
|
|
|
"route -n show -interface %s 2>/dev/null | grep -v '^[[:space:]]*#' | " |
|
|
|
"route -n show -interface %s 2>/dev/null | grep -v '^[[:space:]]*#' | " |
|
|
|
"awk '/^[0-9]+\\./{print $1}' | while read r; do route delete -net $r 2>/dev/null; done", |
|
|
|
"awk '/^[0-9]+\\./{print $1}' | while read r; do route delete -net $r >/dev/null 2>&1; done", |
|
|
|
ifname); |
|
|
|
ifname); |
|
|
|
int ret = system(cmdline); |
|
|
|
int ret = system(cmdline); |
|
|
|
|
|
|
|
|
|
|
|
|