Set DNS host routes before toggling the service READY state
authorSamuel Ortiz <sameo@linux.intel.com>
Thu, 8 Jul 2010 17:27:40 +0000 (19:27 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 12 Jul 2010 18:44:26 +0000 (20:44 +0200)
update_nameservers() is called when a service hits the READY state. The DNS
proxy code will be able to connect to the added nameservers if the right
host routes have been set.

src/connection.c
src/connman.h
src/service.c

index 82648d6..dcaa8fe 100644 (file)
@@ -157,8 +157,6 @@ static void set_default_gateway(struct gateway_data *data)
                goto done;
        }
 
-       connman_inet_add_host_route(element->index, data->gateway, NULL);
-
        if (connman_inet_set_gateway_address(element->index, data->gateway) < 0)
                return;
 
@@ -276,14 +274,20 @@ static int connection_probe(struct connman_element *element)
                element->ipv4.gateway = g_strdup(gateway);
        }
 
-       service = __connman_element_get_service(element);
-       __connman_service_indicate_state(service,
-                                       CONNMAN_SERVICE_STATE_READY);
-
        connman_element_set_enabled(element, TRUE);
 
        active_gateway = find_active_gateway();
        new_gateway = add_gateway(element->index, gateway);
+       service = __connman_element_get_service(element);
+
+       if (new_gateway) {
+               connman_inet_add_host_route(element->index,
+                                               new_gateway->gateway, NULL);
+               __connman_service_nameserver_add_routes(service,
+                                                       new_gateway->gateway);
+       }
+
+       __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_READY);
 
        if (service == NULL) {
                new_gateway->vpn = TRUE;
@@ -325,6 +329,7 @@ static void connection_remove(struct connman_element *element)
        DBG("element %p name %s", element, element->name);
 
        service = __connman_element_get_service(element);
+       __connman_service_nameserver_del_routes(service);
        __connman_service_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_DISCONNECT);
 
index 3b8f7c2..7482d5b 100644 (file)
@@ -448,6 +448,9 @@ void __connman_service_append_nameserver(struct connman_service *service,
                                                const char *nameserver);
 void __connman_service_remove_nameserver(struct connman_service *service,
                                                const char *nameserver);
+void __connman_service_nameserver_add_routes(struct connman_service *service,
+                                               const char *gw);
+void __connman_service_nameserver_del_routes(struct connman_service *service);
 
 unsigned long __connman_service_stats_get_rx_packets(struct connman_service *service);
 unsigned long __connman_service_stats_get_tx_packets(struct connman_service *service);
index af8f2c4..93eaa5a 100644 (file)
@@ -374,6 +374,41 @@ void __connman_service_remove_nameserver(struct connman_service *service,
        update_nameservers(service);
 }
 
+void __connman_service_nameserver_add_routes(struct connman_service *service,
+                                               const char *gw)
+{
+       int index;
+
+       index = connman_network_get_index(service->network);
+
+       if (service->nameservers != NULL) {
+               int i;
+
+               for (i = 0; service->nameservers[i]; i++)
+                       connman_inet_add_host_route(index,
+                                               service->nameservers[i], gw);
+       } else if (service->nameserver != NULL) {
+               connman_inet_add_host_route(index, service->nameserver, gw);
+       }
+}
+
+void __connman_service_nameserver_del_routes(struct connman_service *service)
+{
+       int index;
+
+       index = connman_network_get_index(service->network);
+
+       if (service->nameservers != NULL) {
+               int i;
+
+               for (i = 0; service->nameservers[i]; i++)
+                       connman_inet_del_host_route(index,
+                                               service->nameservers[i]);
+       } else if (service->nameserver != NULL) {
+               connman_inet_del_host_route(index, service->nameserver);
+       }
+}
+
 static void __connman_service_stats_start(struct connman_service *service)
 {
        DBG("service %p", service);