summaryrefslogtreecommitdiff
path: root/src/inet.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-01-05 05:29:32 -0800
committerMarcel Holtmann <marcel@holtmann.org>2010-01-05 05:29:32 -0800
commit4426a1e749526a70c891d8bffe845be694481330 (patch)
tree5d6669686b26a5d4f90d5bee451425696850d738 /src/inet.c
parent70451fe10abf95ffa9dfac4fb90ff1726bd627b8 (diff)
downloadconnman-4426a1e749526a70c891d8bffe845be694481330.tar.gz
connman-4426a1e749526a70c891d8bffe845be694481330.tar.bz2
connman-4426a1e749526a70c891d8bffe845be694481330.zip
Split gateway and host route setting in two separate functions
Diffstat (limited to 'src/inet.c')
-rw-r--r--src/inet.c80
1 files changed, 53 insertions, 27 deletions
diff --git a/src/inet.c b/src/inet.c
index d82d41dd..06ee60cf 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -620,15 +620,13 @@ int connman_inet_clear_address(int index)
return 0;
}
-int connman_inet_set_gateway_interface(int index)
+int connman_inet_set_host_route(int index, const char *host)
{
struct ifreq ifr;
struct rtentry rt;
struct sockaddr_in addr;
int sk, err;
- DBG("");
-
sk = socket(PF_INET, SOCK_DGRAM, 0);
if (sk < 0)
return -1;
@@ -644,25 +642,30 @@ int connman_inet_set_gateway_interface(int index)
DBG("ifname %s", ifr.ifr_name);
memset(&rt, 0, sizeof(rt));
+ rt.rt_flags = RTF_UP | RTF_HOST;
- rt.rt_dev = ifr.ifr_name;
-
- rt.rt_flags = RTF_UP;
+ 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));
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
+ memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = INADDR_ANY;
memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
- memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
-
- memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
+ rt.rt_dev = ifr.ifr_name;
err = ioctl(sk, SIOCADDRT, &rt);
if (err < 0)
- connman_error("Setting interface as default route failed (%s)",
+ connman_error("Setting host route failed (%s)",
strerror(errno));
+
close(sk);
return err;
@@ -690,16 +693,16 @@ int connman_inet_set_gateway_address(int index, const char *gateway)
DBG("ifname %s", ifr.ifr_name);
memset(&rt, 0, sizeof(rt));
- rt.rt_flags = RTF_UP | RTF_HOST;
+ rt.rt_flags = RTF_UP | RTF_GATEWAY;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = inet_addr(gateway);
+ addr.sin_addr.s_addr = INADDR_ANY;
memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = INADDR_ANY;
+ addr.sin_addr.s_addr = inet_addr(gateway);
memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
memset(&addr, 0, sizeof(addr));
@@ -707,36 +710,59 @@ int connman_inet_set_gateway_address(int index, const char *gateway)
addr.sin_addr.s_addr = INADDR_ANY;
memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
- rt.rt_dev = ifr.ifr_name;
-
err = ioctl(sk, SIOCADDRT, &rt);
if (err < 0)
- connman_error("Setting host gateway route failed (%s)",
+ connman_error("Setting default gateway route failed (%s)",
strerror(errno));
+ close(sk);
+
+ return err;
+}
+
+int connman_inet_set_gateway_interface(int index)
+{
+ struct ifreq ifr;
+ struct rtentry rt;
+ struct sockaddr_in addr;
+ int sk, err;
+
+ DBG("");
+
+ 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_GATEWAY;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = INADDR_ANY;
- memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
+ rt.rt_dev = ifr.ifr_name;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = inet_addr(gateway);
- memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
+ rt.rt_flags = RTF_UP;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
+
memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
+ memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
+
+ memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
+
err = ioctl(sk, SIOCADDRT, &rt);
if (err < 0)
- connman_error("Setting default route failed (%s)",
+ connman_error("Setting default interface route failed (%s)",
strerror(errno));
-
close(sk);
return err;