Project description.
[connman] / src / connection.c
index 62d6a31..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);
@@ -349,12 +378,12 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_append_variant(&dict, "Default",
                                        DBUS_TYPE_BOOLEAN, &element->enabled);
 
-       device = __connman_element_get_device(element);
+       device = __connman_element_get_device_path(element);
        if (device != NULL)
                connman_dbus_dict_append_variant(&dict, "Device",
                                        DBUS_TYPE_OBJECT_PATH, &device);
 
-       network = __connman_element_get_network(element);
+       network = __connman_element_get_network_path(element);
        if (network != NULL)
                connman_dbus_dict_append_variant(&dict, "Network",
                                        DBUS_TYPE_OBJECT_PATH, &network);
@@ -467,6 +496,7 @@ static void unregister_interface(struct connman_element *element)
 
 static int connection_probe(struct connman_element *element)
 {
+       struct connman_service *service;
        const char *gateway = NULL;
 
        DBG("element %p name %s", element, element->name);
@@ -485,6 +515,10 @@ static int connection_probe(struct connman_element *element)
        if (register_interface(element) < 0)
                return -ENODEV;
 
+       service = __connman_element_get_service(element);
+       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_READY);
+
        if (gateway == NULL)
                return 0;
 
@@ -498,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);
 
@@ -509,10 +547,15 @@ done:
 
 static void connection_remove(struct connman_element *element)
 {
+       struct connman_service *service;
        const char *gateway = NULL;
 
        DBG("element %p name %s", element, element->name);
 
+       service = __connman_element_get_service(element);
+       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_DISCONNECT);
+
        unregister_interface(element);
 
        connman_element_get_value(element,