X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fresolver.c;h=4780ac12c50cff89ee9ac5e600f73f67650166b4;hb=39c1cfe1013d5731f64407881ddf3dc16942063a;hp=f27f22cafffbfb78b59caed61e4e7c7de998eaf4;hpb=cd4971984e850f75c3c76fa17633fe76fb6bb806;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/resolver.c b/src/resolver.c index f27f22c..4780ac1 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,17 +316,24 @@ 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 * that are automagically added via netlink (lifetime > 0) */ index = connman_inet_ifindex(interface); - if (index >= 0) { + if (server != NULL && index >= 0) { struct connman_service *service; service = __connman_service_lookup_from_index(index); if (service != NULL) @@ -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; } @@ -493,6 +550,13 @@ int __connman_resolver_redo_servers(const char *interface) */ __connman_dnsproxy_remove(entry->interface, entry->domain, entry->server); + /* + * Remove also the resolver timer for the old server entry. + * A new timer will be set for the new server entry + * when the next Router Advertisement message arrives + * with RDNSS/DNSSL settings. + */ + g_source_remove(entry->timeout); __connman_dnsproxy_append(entry->interface, entry->domain, entry->server);