diff options
author | Elena Tebesoi <elena.tebesoi@gmail.com> | 2012-05-21 14:49:42 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-05-22 21:13:32 +0200 |
commit | 5bf6e62fa5cdf7d9a19af04948e53b7db07abbc8 (patch) | |
tree | 060c07ba757ca3958a03b093def615be15fee232 /src/resolver.c | |
parent | a880cf2c775982f35f080c207176ecbadf751aa3 (diff) | |
download | connman-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.c | 65 |
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; } |