From d31f3c8e6b025820697669ac60637a1e942a3f33 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 5 Jan 2010 05:35:55 -0800 Subject: [PATCH] Add helper for removing host routes --- include/inet.h | 3 ++- src/connection.c | 2 +- src/inet.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/include/inet.h b/include/inet.h index 307fe94..0b62357 100644 --- a/include/inet.h +++ b/include/inet.h @@ -44,7 +44,8 @@ connman_bool_t connman_inet_is_mac80211(int index); int connman_inet_set_address(int index, struct connman_ipaddress *ipaddress); int connman_inet_clear_address(int index); -int connman_inet_set_host_route(int index, const char *host); +int connman_inet_add_host_route(int index, const char *host); +int connman_inet_del_host_route(int index, const char *host); int connman_inet_set_gateway_address(int index, const char *gateway); int connman_inet_set_gateway_interface(int index); diff --git a/src/connection.c b/src/connection.c index 51eed8f..f7d4368 100644 --- a/src/connection.c +++ b/src/connection.c @@ -352,7 +352,7 @@ static void set_default_gateway(struct gateway_data *data) goto done; } - connman_inet_set_host_route(element->index, data->gateway); + connman_inet_add_host_route(element->index, data->gateway); if (connman_inet_set_gateway_address(element->index, data->gateway) < 0) return; diff --git a/src/inet.c b/src/inet.c index 06ee60c..c31c8bb 100644 --- a/src/inet.c +++ b/src/inet.c @@ -620,7 +620,7 @@ int connman_inet_clear_address(int index) return 0; } -int connman_inet_set_host_route(int index, const char *host) +int connman_inet_add_host_route(int index, const char *host) { struct ifreq ifr; struct rtentry rt; @@ -663,7 +663,48 @@ int connman_inet_set_host_route(int index, const char *host) err = ioctl(sk, SIOCADDRT, &rt); if (err < 0) - connman_error("Setting host route failed (%s)", + connman_error("Adding host route failed (%s)", + strerror(errno)); + + close(sk); + + return err; +} + +int connman_inet_del_host_route(int index, const char *host) +{ + struct ifreq ifr; + struct rtentry rt; + struct sockaddr_in addr; + int sk, err; + + sk = socket(PF_INET, SOCK_DGRAM, 0); + if (sk < 0) + return -1; + + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_ifindex = index; + + if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) { + close(sk); + return -1; + } + + DBG("ifname %s", ifr.ifr_name); + + memset(&rt, 0, sizeof(rt)); + rt.rt_flags = RTF_UP | RTF_HOST; + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr(host); + memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst)); + + rt.rt_dev = ifr.ifr_name; + + err = ioctl(sk, SIOCDELRT, &rt); + if (err < 0) + connman_error("Deleting host route failed (%s)", strerror(errno)); close(sk); -- 2.7.4