Project description.
[connman] / src / connection.c
index 0d544eb..293b911 100644 (file)
@@ -98,6 +98,28 @@ static int set_route(struct connman_element *element, const char *gateway)
        DBG("ifname %s", ifr.ifr_name);
 
        memset(&rt, 0, sizeof(rt));
+       rt.rt_flags = RTF_UP | RTF_HOST;
+
+       addr = (struct sockaddr_in *) &rt.rt_dst;
+       addr->sin_family = AF_INET;
+       addr->sin_addr.s_addr = inet_addr(gateway);
+
+       addr = (struct sockaddr_in *) &rt.rt_gateway;
+       addr->sin_family = AF_INET;
+       addr->sin_addr.s_addr = INADDR_ANY;
+
+       addr = (struct sockaddr_in *) &rt.rt_genmask;
+       addr->sin_family = AF_INET;
+       addr->sin_addr.s_addr = INADDR_ANY;
+
+       rt.rt_dev = ifr.ifr_name;
+
+       err = ioctl(sk, SIOCADDRT, &rt);
+       if (err < 0)
+               connman_error("Setting host gateway route failed (%s)",
+                                                       strerror(errno));
+
+       memset(&rt, 0, sizeof(rt));
        rt.rt_flags = RTF_UP | RTF_GATEWAY;
 
        addr = (struct sockaddr_in *) &rt.rt_dst;
@@ -114,7 +136,8 @@ static int set_route(struct connman_element *element, const char *gateway)
 
        err = ioctl(sk, SIOCADDRT, &rt);
        if (err < 0)
-               DBG("default route setting failed (%s)", strerror(errno));
+               connman_error("Setting default route failed (%s)",
+                                                       strerror(errno));
 
        close(sk);
 
@@ -161,7 +184,8 @@ static int del_route(struct connman_element *element, const char *gateway)
 
        err = ioctl(sk, SIOCDELRT, &rt);
        if (err < 0)
-               DBG("default route removal failed (%s)", strerror(errno));
+               connman_error("Removing default route failed (%s)",
+                                                       strerror(errno));
 
        close(sk);
 
@@ -228,6 +252,7 @@ static void del_default(struct connman_element *element, gpointer user_data)
 
 static void new_default(struct connman_element *element, gpointer user_data)
 {
+       struct connman_service *service;
        const char *gateway;
 
        DBG("element %p name %s", element, element->name);
@@ -243,7 +268,11 @@ static void new_default(struct connman_element *element, gpointer user_data)
        if (gateway == NULL)
                return;
 
-       set_route(element, gateway);
+       if (set_route(element, gateway) < 0)
+               return;
+
+       service = __connman_element_get_service(element);
+       __connman_service_indicate_default(service);
 
        connman_element_set_enabled(element, TRUE);
        emit_default_signal(element);
@@ -487,7 +516,8 @@ static int connection_probe(struct connman_element *element)
                return -ENODEV;
 
        service = __connman_element_get_service(element);
-       __connman_service_ready(service);
+       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_READY);
 
        if (gateway == NULL)
                return 0;
@@ -502,9 +532,13 @@ static int connection_probe(struct connman_element *element)
                return 0;
        }
 
-       set_route(element, gateway);
+       if (set_route(element, gateway) < 0)
+               return 0;
 
 done:
+       service = __connman_element_get_service(element);
+       __connman_service_indicate_default(service);
+
        connman_element_set_enabled(element, TRUE);
        emit_default_signal(element);
 
@@ -519,7 +553,8 @@ static void connection_remove(struct connman_element *element)
        DBG("element %p name %s", element, element->name);
 
        service = __connman_element_get_service(element);
-       __connman_service_disconnect(service);
+       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_DISCONNECT);
 
        unregister_interface(element);