From: Marek Vavrusa Date: Wed, 8 Jun 2016 07:08:13 +0000 (-0700) Subject: lib/resolve: store auth addr/rtt in consume() layer X-Git-Tag: v1.1.0~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9ffeb1ac89bb3b6bed508186a636bafcd454673;p=thirdparty%2Fknot-resolver.git lib/resolve: store auth addr/rtt in consume() layer during the consume step, the information about upstream authoritative (address and current rtt) is exposed in the request structure, just like information about current query --- diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua index f633d9b87..e568172ff 100644 --- a/daemon/lua/kres.lua +++ b/daemon/lua/kres.lua @@ -213,6 +213,10 @@ struct kr_request { const knot_rrset_t *key; const struct sockaddr *addr; } qsource; + struct { + unsigned rtt; + const struct sockaddr *addr; + } upstream; uint32_t options; int state; rr_array_t authority; diff --git a/lib/resolve.c b/lib/resolve.c index fd5229687..bd9fce5f4 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -445,7 +445,19 @@ int kr_resolve_consume(struct kr_request *request, const struct sockaddr *src, k randomized_qname_case(qname_raw, qry->secret); } request->state = KNOT_STATE_CONSUME; - ITERATE_LAYERS(request, qry, consume, packet); + if (qry->flags & QUERY_CACHED) { + ITERATE_LAYERS(request, qry, consume, packet); + } else { + struct timeval now; + gettimeofday(&now, NULL); + /* Fill in source and latency information. */ + request->upstream.rtt = time_diff(&qry->timestamp, &now); + request->upstream.addr = src; + ITERATE_LAYERS(request, qry, consume, packet); + /* Clear temporary information */ + request->upstream.addr = NULL; + request->upstream.rtt = 0; + } } /* Track RTT for iterative answers */ diff --git a/lib/resolve.h b/lib/resolve.h index 3fb4aa622..2896d54f2 100644 --- a/lib/resolve.h +++ b/lib/resolve.h @@ -113,6 +113,10 @@ struct kr_request { const knot_rrset_t *key; const struct sockaddr *addr; } qsource; + struct { + unsigned rtt; /**< Current upstream RTT */ + const struct sockaddr *addr; /**< Current upstream address */ + } upstream; /**< Upstream information, valid only in consume() phase */ uint32_t options; int state; rr_array_t authority;