From 5c00b517f7dfcd8edef4819580fa21c38d19c2bc Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Thu, 8 Jul 2010 19:27:40 +0200 Subject: [PATCH] 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. --- src/connection.c | 17 +++++++++++------ src/connman.h | 3 +++ src/service.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/connection.c b/src/connection.c index 82648d6..dcaa8fe 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 3b8f7c2..7482d5b 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 af8f2c4..93eaa5a 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); -- 2.7.4