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 */
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;