summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-01-05 05:35:55 -0800
committerMarcel Holtmann <marcel@holtmann.org>2010-01-05 05:35:55 -0800
commitd31f3c8e6b025820697669ac60637a1e942a3f33 (patch)
tree91005e341387ce3f63bd43d5eabbc7f220665716
parent4426a1e749526a70c891d8bffe845be694481330 (diff)
downloadconnman-d31f3c8e6b025820697669ac60637a1e942a3f33.tar.gz
connman-d31f3c8e6b025820697669ac60637a1e942a3f33.tar.bz2
connman-d31f3c8e6b025820697669ac60637a1e942a3f33.zip
Add helper for removing host routes
-rw-r--r--include/inet.h3
-rw-r--r--src/connection.c2
-rw-r--r--src/inet.c45
3 files changed, 46 insertions, 4 deletions
diff --git a/include/inet.h b/include/inet.h
index 307fe94b..0b62357b 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 51eed8f5..f7d43681 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 06ee60cf..c31c8bbc 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);