summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-07-08 19:27:40 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-07-12 20:44:26 +0200
commit5c00b517f7dfcd8edef4819580fa21c38d19c2bc (patch)
tree2b000e9f09c2297d2ca4c934da5a4321234561f2
parentec2adfa818da0d6845ff5f0ad1a8e1017cf4461d (diff)
downloadconnman-5c00b517f7dfcd8edef4819580fa21c38d19c2bc.tar.gz
connman-5c00b517f7dfcd8edef4819580fa21c38d19c2bc.tar.bz2
connman-5c00b517f7dfcd8edef4819580fa21c38d19c2bc.zip
Set DNS host routes before toggling the service READY state
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.
-rw-r--r--src/connection.c17
-rw-r--r--src/connman.h3
-rw-r--r--src/service.c35
3 files changed, 49 insertions, 6 deletions
diff --git a/src/connection.c b/src/connection.c
index 82648d65..dcaa8fe1 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -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);
diff --git a/src/connman.h b/src/connman.h
index 3b8f7c26..7482d5bc 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -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);
diff --git a/src/service.c b/src/service.c
index af8f2c42..93eaa5a1 100644
--- a/src/service.c
+++ b/src/service.c
@@ -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);