summaryrefslogtreecommitdiff
path: root/src/resolver.c
diff options
context:
space:
mode:
authorElena Tebesoi <elena.tebesoi@gmail.com>2012-05-21 14:49:42 +0200
committerMarcel Holtmann <marcel@holtmann.org>2012-05-22 21:13:32 +0200
commit5bf6e62fa5cdf7d9a19af04948e53b7db07abbc8 (patch)
tree060c07ba757ca3958a03b093def615be15fee232 /src/resolver.c
parenta880cf2c775982f35f080c207176ecbadf751aa3 (diff)
downloadconnman-5bf6e62fa5cdf7d9a19af04948e53b7db07abbc8.tar.gz
connman-5bf6e62fa5cdf7d9a19af04948e53b7db07abbc8.tar.bz2
connman-5bf6e62fa5cdf7d9a19af04948e53b7db07abbc8.zip
resolver: Send RS before RDNSS lifetime expires
Implemented feature from RFC 6106 section '5.1. Recursive DNS Server Option': "Lifetime 32-bit unsigned integer. ... Hosts MAY send a Router Solicitation to ensure the RDNSS information is fresh before the interval expires." Host will send RS when a certain threshold of RDNSS lifetime is reached. Values which can be adjusted: - lifetime threshold - set to 80% from lifetime - number of retries in case RA is not received - set to 0 - time between retries, in case RA is not received - set to 3 seconds
Diffstat (limited to 'src/resolver.c')
-rw-r--r--src/resolver.c65
1 files changed, 61 insertions, 4 deletions
diff --git a/src/resolver.c b/src/resolver.c
index 421b12f0..4780ac12 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -36,11 +36,18 @@
#define RESOLVER_FLAG_PUBLIC (1 << 0)
+/*
+ * Threshold for RDNSS lifetime. Will be used to trigger RS
+ * before RDNSS entries actually expire
+ */
+#define RESOLVER_LIFETIME_REFRESH_THRESHOLD 0.8
+
struct entry_data {
char *interface;
char *domain;
char *server;
unsigned int flags;
+ unsigned int lifetime;
guint timeout;
};
@@ -253,11 +260,47 @@ static gboolean resolver_expire_cb(gpointer user_data)
return FALSE;
}
+static gboolean resolver_refresh_cb(gpointer user_data)
+{
+ struct entry_data *entry = user_data;
+ int index;
+ unsigned int interval;
+ struct connman_service *service = NULL;
+
+ /* Round up what we have left from lifetime */
+ interval = entry->lifetime *
+ (1 - RESOLVER_LIFETIME_REFRESH_THRESHOLD) + 1.0;
+
+ DBG("RDNSS start interface %s domain %s "
+ "server %s remaining lifetime %d",
+ entry->interface, 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 (service != NULL) {
+ /*
+ * Send Router Solicitation to refresh RDNSS entries
+ * before their lifetime expires
+ */
+ __connman_refresh_rs_ipv6(
+ __connman_service_get_network(service),
+ index);
+ }
+ }
+ return FALSE;
+}
+
static int append_resolver(const char *interface, 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);
@@ -273,10 +316,17 @@ static int append_resolver(const char *interface, const char *domain,
entry->domain = g_strdup(domain);
entry->server = g_strdup(server);
entry->flags = flags;
+ entry->lifetime = lifetime;
if (lifetime) {
int index;
- entry->timeout = g_timeout_add_seconds(lifetime,
- resolver_expire_cb, entry);
+ interval = lifetime * RESOLVER_LIFETIME_REFRESH_THRESHOLD;
+
+ DBG("RDNSS start interface %s domain %s "
+ "server %s lifetime threshold %d",
+ interface, domain, server, interval);
+
+ entry->timeout = g_timeout_add_seconds(interval,
+ resolver_refresh_cb, entry);
/*
* We update the service only for those nameservers
@@ -350,6 +400,7 @@ int connman_resolver_append_lifetime(const char *interface, 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);
@@ -373,8 +424,14 @@ int connman_resolver_append_lifetime(const char *interface, const char *domain,
return 0;
}
- entry->timeout = g_timeout_add_seconds(lifetime,
- resolver_expire_cb, entry);
+ interval = lifetime * RESOLVER_LIFETIME_REFRESH_THRESHOLD;
+
+ DBG("RDNSS start interface %s domain %s "
+ "server %s lifetime threshold %d",
+ interface, domain, server, interval);
+
+ entry->timeout = g_timeout_add_seconds(interval,
+ resolver_refresh_cb, entry);
return 0;
}