From 68d82e9ce4ca4b02fa5447df87ced8bed6dd8e45 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 23 Sep 2011 12:56:28 +0000 Subject: [PATCH] - TCP-upstream calculates tcp-ping so server selection works if there are alternatives. git-svn-id: file:///svn/unbound/trunk@2502 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 4 ++++ services/outside_network.c | 23 +++++++++++++++++++++-- services/outside_network.h | 2 ++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index 72d1e4914..1bd52fffa 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +23 September 2011: Wouter + - TCP-upstream calculates tcp-ping so server selection works if there + are alternatives. + 20 September 2011: Wouter - Fix classification of NS set in answer section, where there is a parent-child server, and the answer has the AA flag for dir.slb.com. diff --git a/services/outside_network.c b/services/outside_network.c index 297e454ea..b3c1220ba 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -1142,7 +1142,8 @@ lookup_serviced(struct outside_network* outnet, ldns_buffer* buff, int dnssec, /** Create new serviced entry */ static struct serviced_query* serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec, - int want_dnssec, struct sockaddr_storage* addr, socklen_t addrlen) + int want_dnssec, int tcp_upstream, struct sockaddr_storage* addr, + socklen_t addrlen) { struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq)); #ifdef UNBOUND_DEBUG @@ -1159,6 +1160,7 @@ serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec, sq->qbuflen = ldns_buffer_limit(buff); sq->dnssec = dnssec; sq->want_dnssec = want_dnssec; + sq->tcp_upstream = tcp_upstream; memcpy(&sq->addr, addr, addrlen); sq->addrlen = addrlen; sq->outnet = outnet; @@ -1518,6 +1520,21 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error, log_err("Out of memory caching no edns for host"); sq->status = serviced_query_TCP; } + if(sq->tcp_upstream) { + struct timeval now = *sq->outnet->now_tv; + if(now.tv_sec > sq->last_sent_time.tv_sec || + (now.tv_sec == sq->last_sent_time.tv_sec && + now.tv_usec > sq->last_sent_time.tv_usec)) { + /* convert from microseconds to milliseconds */ + int roundtime = ((int)now.tv_sec - (int)sq->last_sent_time.tv_sec)*1000 + + ((int)now.tv_usec - (int)sq->last_sent_time.tv_usec)/1000; + verbose(VERB_ALGO, "measured TCP-time at %d msec", roundtime); + log_assert(roundtime >= 0); + if(!infra_rtt_update(sq->outnet->infra, &sq->addr, sq->addrlen, + roundtime, sq->last_rtt, (uint32_t)now.tv_sec)) + log_err("out of memory noting rtt."); + } + } /* insert address into reply info */ if(!rep) { /* create one if there isn't (on errors) */ @@ -1537,6 +1554,7 @@ serviced_tcp_initiate(struct outside_network* outnet, verbose(VERB_ALGO, "initiate TCP query %s", sq->status==serviced_query_TCP_EDNS?"EDNS":""); serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS); + sq->last_sent_time = *sq->outnet->now_tv; sq->pending = pending_tcp_query(outnet, buff, &sq->addr, sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback, sq); @@ -1561,6 +1579,7 @@ serviced_tcp_send(struct serviced_query* sq, ldns_buffer* buff) sq->status = serviced_query_TCP_EDNS; else sq->status = serviced_query_TCP; serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS); + sq->last_sent_time = *sq->outnet->now_tv; sq->pending = pending_tcp_query(sq->outnet, buff, &sq->addr, sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback, sq); @@ -1750,7 +1769,7 @@ outnet_serviced_query(struct outside_network* outnet, if(!sq) { /* make new serviced query entry */ sq = serviced_create(outnet, buff, dnssec, want_dnssec, - addr, addrlen); + tcp_upstream, addr, addrlen); if(!sq) { free(cb); return NULL; diff --git a/services/outside_network.h b/services/outside_network.h index 1ee2f1015..accf84818 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -298,6 +298,8 @@ struct serviced_query { int dnssec; /** We want signatures, or else the answer is likely useless */ int want_dnssec; + /** tcp upstream used, use tcp */ + int tcp_upstream; /** where to send it */ struct sockaddr_storage addr; /** length of addr field in use. */ -- 2.47.2