diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-08-05 17:01:33 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-08-05 17:02:46 +0200 |
commit | 6e0684729420912df019cc64d3f8a3c8290cc5f1 (patch) | |
tree | 23919408824ac60fb8f5bcc532d6558e9aa955c5 /src/resolve/resolved-dns-transaction.c | |
parent | aea2429d6ec32261dbf6b9caa125fcc6ea9ea76a (diff) |
resolved: add 100ms initial jitter to all LLMNR requests
Diffstat (limited to 'src/resolve/resolved-dns-transaction.c')
-rw-r--r-- | src/resolve/resolved-dns-transaction.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c index ad1b277555..53d6e18dc5 100644 --- a/src/resolve/resolved-dns-transaction.c +++ b/src/resolve/resolved-dns-transaction.c @@ -490,6 +490,33 @@ int dns_transaction_go(DnsTransaction *t) { } } + if (t->scope->protocol == DNS_PROTOCOL_LLMNR && !t->initial_jitter) { + usec_t jitter; + + /* RFC 4795 Section 2.7 suggests all queries should be + * delayed by a random time from 0 to JITTER_INTERVAL. */ + + t->initial_jitter = true; + + random_bytes(&jitter, sizeof(jitter)); + jitter %= LLMNR_JITTER_INTERVAL_USEC; + + r = sd_event_add_time( + t->scope->manager->event, + &t->timeout_event_source, + clock_boottime_or_monotonic(), + now(clock_boottime_or_monotonic()) + jitter, LLMNR_JITTER_INTERVAL_USEC, + on_transaction_timeout, t); + if (r < 0) + return r; + + t->n_attempts = 0; + t->state = DNS_TRANSACTION_PENDING; + + log_debug("Delaying LLMNR transaction for " USEC_FMT "us.", jitter); + return 0; + } + log_debug("Cache miss!"); /* Otherwise, we need to ask the network */ |