From 4426a1e749526a70c891d8bffe845be694481330 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 5 Jan 2010 05:29:32 -0800 Subject: Split gateway and host route setting in two separate functions --- src/connection.c | 2 ++ src/inet.c | 80 +++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 55 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/connection.c b/src/connection.c index 902bef41..51eed8f5 100644 --- a/src/connection.c +++ b/src/connection.c @@ -352,6 +352,8 @@ static void set_default_gateway(struct gateway_data *data) goto done; } + connman_inet_set_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 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; -- cgit v1.2.3