Split gateway and host route setting in two separate functions
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 5 Jan 2010 13:29:32 +0000 (05:29 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 5 Jan 2010 13:29:32 +0000 (05:29 -0800)
include/inet.h
src/connection.c
src/inet.c

index ed3baec..307fe94 100644 (file)
@@ -44,8 +44,9 @@ 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_gateway_interface(int index);
+int connman_inet_set_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);
 
 #ifdef __cplusplus
 }
index 902bef4..51eed8f 100644 (file)
@@ -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;
 
index d82d41d..06ee60c 100644 (file)
@@ -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;