summaryrefslogtreecommitdiff
path: root/src/resolver.c
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2012-11-21 16:25:11 +0200
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-11-22 13:23:56 +0200
commit99e49dd2add20aecafe79b24effb4b87353449f9 (patch)
tree921fa679315338259ce489bb03c96ccd172aa476 /src/resolver.c
parent86f21518b2ad016df155610524d9fc3f72018861 (diff)
downloadconnman-99e49dd2add20aecafe79b24effb4b87353449f9.tar.gz
connman-99e49dd2add20aecafe79b24effb4b87353449f9.tar.bz2
connman-99e49dd2add20aecafe79b24effb4b87353449f9.zip
core: Use interface index instead of interface name
Service and network code use only interface indexes. Convert the rest of the code using interface names to use interface indexes instead. The files affected are: include/resolver.h src/connman.h src/dnsproxy.c src/resolver.c src/rtnl.c src/service.c src/tethering.c As the network and service code used interface indexes, the interface name had to be looked up via a SIOCGIFNAME ioctl when needed. If a service was removed due to the interface and network being taken down, the lookup wouldn't work. This caused DNS servers to be left behind with broken sockets since removing the DNS servers was done using the interface name.
Diffstat (limited to 'src/resolver.c')
-rw-r--r--src/resolver.c133
1 files changed, 60 insertions, 73 deletions
diff --git a/src/resolver.c b/src/resolver.c
index 982b767d..b965778b 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -44,7 +44,7 @@
#define RESOLVER_LIFETIME_REFRESH_THRESHOLD 0.8
struct entry_data {
- char *interface;
+ int index;
char *domain;
char *server;
int family;
@@ -57,7 +57,7 @@ static GSList *entry_list = NULL;
static connman_bool_t dnsproxy_enabled = FALSE;
struct resolvfile_entry {
- char *interface;
+ int index;
char *domain;
char *server;
};
@@ -75,7 +75,6 @@ static void resolvfile_remove_entries(GList *entries)
g_free(entry->server);
g_free(entry->domain);
- g_free(entry->interface);
g_free(entry);
}
@@ -158,21 +157,21 @@ done:
return err;
}
-int __connman_resolvfile_append(const char *interface, const char *domain,
+int __connman_resolvfile_append(int index, const char *domain,
const char *server)
{
struct resolvfile_entry *entry;
- DBG("interface %s server %s", interface, server);
+ DBG("index %d server %s", index, server);
- if (interface == NULL)
+ if (index < 0)
return -ENOENT;
entry = g_try_new0(struct resolvfile_entry, 1);
if (entry == NULL)
return -ENOMEM;
- entry->interface = g_strdup(interface);
+ entry->index = index;
entry->domain = g_strdup(domain);
entry->server = g_strdup(server);
@@ -181,18 +180,17 @@ int __connman_resolvfile_append(const char *interface, const char *domain,
return resolvfile_export();
}
-int __connman_resolvfile_remove(const char *interface, const char *domain,
+int __connman_resolvfile_remove(int index, const char *domain,
const char *server)
{
GList *list, *matches = NULL;
- DBG("interface %s server %s", interface, server);
+ DBG("index %d server %s", index, server);
for (list = resolvfile_list; list; list = g_list_next(list)) {
struct resolvfile_entry *entry = list->data;
- if (interface != NULL &&
- g_strcmp0(entry->interface, interface) != 0)
+ if (index >= 0 && entry->index != index)
continue;
if (domain != NULL && g_strcmp0(entry->domain, domain) != 0)
@@ -219,10 +217,10 @@ static void remove_entries(GSList *entries)
entry_list = g_slist_remove(entry_list, entry);
if (dnsproxy_enabled == TRUE) {
- __connman_dnsproxy_remove(entry->interface, entry->domain,
+ __connman_dnsproxy_remove(entry->index, entry->domain,
entry->server);
} else {
- __connman_resolvfile_remove(entry->interface, entry->domain,
+ __connman_resolvfile_remove(entry->index, entry->domain,
entry->server);
}
@@ -230,7 +228,6 @@ static void remove_entries(GSList *entries)
g_source_remove(entry->timeout);
g_free(entry->server);
g_free(entry->domain);
- g_free(entry->interface);
g_free(entry);
}
@@ -241,17 +238,15 @@ static gboolean resolver_expire_cb(gpointer user_data)
{
struct entry_data *entry = user_data;
GSList *list;
- int index;
- DBG("interface %s domain %s server %s",
- entry->interface, entry->domain, entry->server);
+ DBG("index %d domain %s server %s",
+ entry->index, entry->domain, entry->server);
list = g_slist_prepend(NULL, entry);
- index = connman_inet_ifindex(entry->interface);
- if (index >= 0) {
+ if (entry->index >= 0) {
struct connman_service *service;
- service = __connman_service_lookup_from_index(index);
+ service = __connman_service_lookup_from_index(entry->index);
if (service != NULL)
__connman_service_nameserver_remove(service,
entry->server, TRUE);
@@ -265,7 +260,6 @@ static gboolean resolver_expire_cb(gpointer user_data)
static gboolean resolver_refresh_cb(gpointer user_data)
{
struct entry_data *entry = user_data;
- int index;
unsigned int interval;
struct connman_service *service = NULL;
@@ -273,17 +267,16 @@ static gboolean resolver_refresh_cb(gpointer user_data)
interval = entry->lifetime *
(1 - RESOLVER_LIFETIME_REFRESH_THRESHOLD) + 1.0;
- DBG("RDNSS start interface %s domain %s "
+ DBG("RDNSS start index %d domain %s "
"server %s remaining lifetime %d",
- entry->interface, entry->domain,
+ entry->index, entry->domain,
entry->server, interval);
entry->timeout = g_timeout_add_seconds(interval,
resolver_expire_cb, entry);
- index = connman_inet_ifindex(entry->interface);
- if (index >= 0) {
- service = __connman_service_lookup_from_index(index);
+ if (entry->index >= 0) {
+ service = __connman_service_lookup_from_index(entry->index);
if (service != NULL) {
/*
* Send Router Solicitation to refresh RDNSS entries
@@ -291,21 +284,21 @@ static gboolean resolver_refresh_cb(gpointer user_data)
*/
__connman_refresh_rs_ipv6(
__connman_service_get_network(service),
- index);
+ entry->index);
}
}
return FALSE;
}
-static int append_resolver(const char *interface, const char *domain,
+static int append_resolver(int index, const char *domain,
const char *server, unsigned int lifetime,
unsigned int flags)
{
struct entry_data *entry;
unsigned int interval;
- DBG("interface %s domain %s server %s lifetime %d flags %d",
- interface, domain, server, lifetime, flags);
+ DBG("index %d domain %s server %s lifetime %d flags %d",
+ index, domain, server, lifetime, flags);
if (server == NULL && domain == NULL)
return -EINVAL;
@@ -314,7 +307,7 @@ static int append_resolver(const char *interface, const char *domain,
if (entry == NULL)
return -ENOMEM;
- entry->interface = g_strdup(interface);
+ entry->index = index;
entry->domain = g_strdup(domain);
entry->server = g_strdup(server);
entry->flags = flags;
@@ -324,12 +317,11 @@ static int append_resolver(const char *interface, const char *domain,
entry->family = connman_inet_check_ipaddress(server);
if (lifetime) {
- int index;
interval = lifetime * RESOLVER_LIFETIME_REFRESH_THRESHOLD;
- DBG("RDNSS start interface %s domain %s "
+ DBG("RDNSS start index %d domain %s "
"server %s lifetime threshold %d",
- interface, domain, server, interval);
+ index, domain, server, interval);
entry->timeout = g_timeout_add_seconds(interval,
resolver_refresh_cb, entry);
@@ -338,10 +330,9 @@ static int append_resolver(const char *interface, const char *domain,
* We update the service only for those nameservers
* that are automagically added via netlink (lifetime > 0)
*/
- index = connman_inet_ifindex(interface);
- if (server != NULL && index >= 0) {
+ if (server != NULL && entry->index >= 0) {
struct connman_service *service;
- service = __connman_service_lookup_from_index(index);
+ service = __connman_service_lookup_from_index(entry->index);
if (service != NULL)
__connman_service_nameserver_append(service,
server, TRUE);
@@ -350,27 +341,27 @@ static int append_resolver(const char *interface, const char *domain,
entry_list = g_slist_append(entry_list, entry);
if (dnsproxy_enabled == TRUE)
- __connman_dnsproxy_append(interface, domain, server);
+ __connman_dnsproxy_append(entry->index, domain, server);
else
- __connman_resolvfile_append(interface, domain, server);
+ __connman_resolvfile_append(entry->index, domain, server);
return 0;
}
/**
* connman_resolver_append:
- * @interface: network interface
+ * @index: network interface index
* @domain: domain limitation
* @server: server address
*
* Append resolver server address to current list
*/
-int connman_resolver_append(const char *interface, const char *domain,
+int connman_resolver_append(int index, const char *domain,
const char *server)
{
GSList *list;
- DBG("interface %s domain %s server %s", interface, domain, server);
+ DBG("index %d domain %s server %s", index, domain, server);
if (server == NULL && domain == NULL)
return -EINVAL;
@@ -381,32 +372,32 @@ int connman_resolver_append(const char *interface, const char *domain,
if (entry->timeout > 0)
continue;
- if (g_strcmp0(entry->interface, interface) == 0 &&
+ if (entry->index == index &&
g_strcmp0(entry->domain, domain) == 0 &&
g_strcmp0(entry->server, server) == 0)
return -EEXIST;
}
- return append_resolver(interface, domain, server, 0, 0);
+ return append_resolver(index, domain, server, 0, 0);
}
/**
* connman_resolver_append_lifetime:
- * @interface: network interface
+ * @index: network interface index
* @domain: domain limitation
* @server: server address
* @timeout: server lifetime in seconds
*
* Append resolver server address to current list
*/
-int connman_resolver_append_lifetime(const char *interface, const char *domain,
+int connman_resolver_append_lifetime(int index, const char *domain,
const char *server, unsigned int lifetime)
{
GSList *list;
unsigned int interval;
- DBG("interface %s domain %s server %s lifetime %d",
- interface, domain, server, lifetime);
+ DBG("index %d domain %s server %s lifetime %d",
+ index, domain, server, lifetime);
if (server == NULL && domain == NULL)
return -EINVAL;
@@ -415,7 +406,7 @@ int connman_resolver_append_lifetime(const char *interface, const char *domain,
struct entry_data *entry = list->data;
if (entry->timeout == 0 ||
- g_strcmp0(entry->interface, interface) != 0 ||
+ entry->index != index ||
g_strcmp0(entry->domain, domain) != 0 ||
g_strcmp0(entry->server, server) != 0)
continue;
@@ -429,37 +420,36 @@ int connman_resolver_append_lifetime(const char *interface, const char *domain,
interval = lifetime * RESOLVER_LIFETIME_REFRESH_THRESHOLD;
- DBG("RDNSS start interface %s domain %s "
+ DBG("RDNSS start index %d domain %s "
"server %s lifetime threshold %d",
- interface, domain, server, interval);
+ index, domain, server, interval);
entry->timeout = g_timeout_add_seconds(interval,
resolver_refresh_cb, entry);
return 0;
}
- return append_resolver(interface, domain, server, lifetime, 0);
+ return append_resolver(index, domain, server, lifetime, 0);
}
/**
* connman_resolver_remove:
- * @interface: network interface
+ * @index: network interface index
* @domain: domain limitation
* @server: server address
*
* Remover resolver server address from current list
*/
-int connman_resolver_remove(const char *interface, const char *domain,
- const char *server)
+int connman_resolver_remove(int index, const char *domain, const char *server)
{
GSList *list, *matches = NULL;
- DBG("interface %s domain %s server %s", interface, domain, server);
+ DBG("index %d domain %s server %s", index, domain, server);
for (list = entry_list; list; list = list->next) {
struct entry_data *entry = list->data;
- if (g_strcmp0(entry->interface, interface) != 0)
+ if (entry->index != index)
continue;
if (g_strcmp0(entry->domain, domain) != 0)
@@ -482,23 +472,23 @@ int connman_resolver_remove(const char *interface, const char *domain,
/**
* connman_resolver_remove_all:
- * @interface: network interface
+ * @index: network interface index
*
- * Remove all resolver server address for the specified interface
+ * Remove all resolver server address for the specified interface index
*/
-int connman_resolver_remove_all(const char *interface)
+int connman_resolver_remove_all(int index)
{
GSList *list, *matches = NULL;
- DBG("interface %s", interface);
+ DBG("index %d", index);
- if (interface == NULL)
+ if (index < 0)
return -EINVAL;
for (list = entry_list; list; list = list->next) {
struct entry_data *entry = list->data;
- if (g_strcmp0(entry->interface, interface) != 0)
+ if (entry->index != index)
continue;
matches = g_slist_prepend(matches, entry);
@@ -525,23 +515,22 @@ void connman_resolver_flush(void)
return;
}
-int __connman_resolver_redo_servers(const char *interface)
+int __connman_resolver_redo_servers(int index)
{
GSList *list;
if (dnsproxy_enabled == FALSE)
return 0;
- DBG("interface %s", interface);
+ DBG("index %d", index);
- if (interface == NULL)
+ if (index < 0)
return -EINVAL;
for (list = entry_list; list; list = list->next) {
struct entry_data *entry = list->data;
- if (entry->timeout == 0 ||
- g_strcmp0(entry->interface, interface) != 0)
+ if (entry->timeout == 0 || entry->index != index)
continue;
/*
@@ -555,7 +544,7 @@ int __connman_resolver_redo_servers(const char *interface)
* We remove the server, and then re-create so that it will
* use proper source addresses when sending DNS queries.
*/
- __connman_dnsproxy_remove(entry->interface, entry->domain,
+ __connman_dnsproxy_remove(entry->index, entry->domain,
entry->server);
/*
* Remove also the resolver timer for the old server entry.
@@ -566,7 +555,7 @@ int __connman_resolver_redo_servers(const char *interface)
g_source_remove(entry->timeout);
entry->timeout = 0;
- __connman_dnsproxy_append(entry->interface, entry->domain,
+ __connman_dnsproxy_append(entry->index, entry->domain,
entry->server);
}
@@ -576,7 +565,6 @@ int __connman_resolver_redo_servers(const char *interface)
static void free_entry(gpointer data)
{
struct entry_data *entry = data;
- g_free(entry->interface);
g_free(entry->domain);
g_free(entry->server);
g_free(entry);
@@ -585,7 +573,6 @@ static void free_entry(gpointer data)
static void free_resolvfile(gpointer data)
{
struct resolvfile_entry *entry = data;
- g_free(entry->interface);
g_free(entry->domain);
g_free(entry->server);
g_free(entry);
@@ -611,7 +598,7 @@ int __connman_resolver_init(connman_bool_t dnsproxy)
ns = connman_setting_get_string_list("FallbackNameservers");
for (i = 0; ns != NULL && ns[i] != NULL; i += 1) {
DBG("server %s", ns[i]);
- append_resolver(NULL, NULL, ns[i], 0, RESOLVER_FLAG_PUBLIC);
+ append_resolver(-1, NULL, ns[i], 0, RESOLVER_FLAG_PUBLIC);
}
return 0;