Lines Matching refs:sq
84 static void serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff);
94 static int serviced_udp_send(struct serviced_query* sq, sldns_buffer* buff);
97 static int serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff);
100 static void serviced_callbacks(struct serviced_query* sq, int error,
1021 if(outnet->dtenv && pend_tcp && w && w->sq &&
1026 dt_msg_send_outside_query(outnet->dtenv, &w->sq->addr,
1027 &pend_tcp->pi->addr, comm_tcp, NULL, w->sq->zone,
1028 w->sq->zonelen, &tmp);
1253 * the callbacks remove references in sq->pending to the waiting_tcp
1462 log_assert(!pend->sq->busy);
1463 pend->sq->busy = 1;
1474 pend->sq->busy = 0;
1838 struct serviced_query* sq = (struct serviced_query*)node;
1839 alloc_reg_release(sq->alloc, sq->region);
1840 if(sq->timer)
1841 comm_timer_delete(sq->timer);
1842 free(sq);
2218 struct outside_network* outnet = pend->sq->outnet;
2267 pend->sq->zone, pend->sq->zonelen, packet);
2274 pending_udp_query(struct serviced_query* sq, struct sldns_buffer* packet,
2279 pend->outnet = sq->outnet;
2280 pend->sq = sq;
2281 pend->addrlen = sq->addrlen;
2282 memmove(&pend->addr, &sq->addr, sq->addrlen);
2286 pend->timer = comm_timer_create(sq->outnet->base, pending_udp_timer_cb,
2293 if(sq->outnet->unused_fds == NULL) {
2306 if(sq->outnet->udp_wait_last)
2307 sq->outnet->udp_wait_last->next_waiting = pend;
2309 sq->outnet->udp_wait_first = pend;
2310 sq->outnet->udp_wait_last = pend;
2313 log_assert(!sq->busy);
2314 sq->busy = 1;
2316 pending_delete(sq->outnet, pend);
2319 sq->busy = 0;
2434 pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
2437 struct pending_tcp* pend = sq->outnet->tcp_free;
2449 reuse = reuse_tcp_find(sq->outnet, &sq->addr, sq->addrlen,
2450 sq->ssl_upstream);
2455 reuse_tcp_lru_touch(sq->outnet, reuse);
2464 reuse_tcp_close_oldest(sq->outnet);
2465 pend = sq->outnet->tcp_free;
2475 if(!(w->timer = comm_timer_create(sq->outnet->base, outnet_tcptimer, w))) {
2482 w->id = tcp_select_id(sq->outnet, reuse);
2484 memcpy(&w->addr, &sq->addr, sq->addrlen);
2485 w->addrlen = sq->addrlen;
2486 w->outnet = sq->outnet;
2491 w->ssl_upstream = sq->ssl_upstream;
2492 w->tls_auth_name = sq->tls_auth_name;
2500 w->sq = NULL;
2531 memcpy(&pend->reuse.addr, &sq->addr, sq->addrlen);
2532 pend->reuse.addrlen = sq->addrlen;
2539 if(sq->outnet->dtenv &&
2540 (sq->outnet->dtenv->log_resolver_query_messages ||
2541 sq->outnet->dtenv->log_forwarder_query_messages)) {
2545 dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr,
2546 &pend->pi->addr, comm_tcp, NULL, sq->zone,
2547 sq->zonelen, &tmp);
2556 w->sq = sq;
2558 outnet_waiting_tcp_list_add(sq->outnet, w, 1);
2602 struct serviced_query* sq = (struct serviced_query*)arg;
2603 struct outside_network* outnet = sq->outnet;
2607 if(!sq->cblist)
2610 if(outnet->do_udp && !(sq->tcp_upstream || sq->ssl_upstream)) {
2611 if(!serviced_udp_send(sq, outnet->udp_buff))
2614 if(!serviced_tcp_send(sq, outnet->udp_buff))
2622 serviced_callbacks(sq, NETEVENT_CLOSED, NULL, NULL);
2634 struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
2639 if(!sq) {
2643 sq->node.key = sq;
2644 sq->alloc = alloc;
2645 sq->region = region;
2646 sq->qbuf = regional_alloc_init(region, sldns_buffer_begin(buff),
2648 if(!sq->qbuf) {
2650 free(sq);
2653 sq->qbuflen = sldns_buffer_limit(buff);
2654 sq->zone = regional_alloc_init(region, zone, zonelen);
2655 if(!sq->zone) {
2657 free(sq);
2660 sq->zonelen = zonelen;
2661 sq->qtype = qtype;
2662 sq->dnssec = dnssec;
2663 sq->want_dnssec = want_dnssec;
2664 sq->nocaps = nocaps;
2665 sq->tcp_upstream = tcp_upstream;
2666 sq->ssl_upstream = ssl_upstream;
2668 sq->tls_auth_name = regional_strdup(region, tls_auth_name);
2669 if(!sq->tls_auth_name) {
2671 free(sq);
2675 sq
2677 memcpy(&sq->addr, addr, addrlen);
2678 sq->addrlen = addrlen;
2679 sq->opt_list = opt_list;
2680 sq->busy = 0;
2681 sq->timer = comm_timer_create(outnet->base, serviced_timer_cb, sq);
2682 if(!sq->timer) {
2684 free(sq);
2688 comm_timer_set(sq->timer, &t);
2689 sq->outnet = outnet;
2690 sq->cblist = NULL;
2691 sq->pending = NULL;
2692 sq->status = serviced_initial;
2693 sq->retry = 0;
2694 sq->to_be_deleted = 0;
2695 sq->padding_block_size = pad_queries_block_size;
2701 rbtree_insert(outnet->serviced, &sq->node);
2703 return sq;
2710 struct serviced_query* sq)
2735 if(pend_tcp->c->fd != -1 && sq->outnet->tcp_reuse.count <
2736 sq->outnet->tcp_reuse_max) {
2739 if(!reuse_tcp_insert(sq->outnet, pend_tcp)) {
2742 reuse_tcp_setup_timeout(pend_tcp, sq->outnet->tcp_reuse_timeout);
2750 serviced_delete(struct serviced_query* sq)
2753 if(sq->pending) {
2755 if(sq->status == serviced_query_UDP_EDNS ||
2756 sq->status == serviced_query_UDP ||
2757 sq->status == serviced_query_UDP_EDNS_FRAG ||
2758 sq->status == serviced_query_UDP_EDNS_fallback) {
2759 struct pending* p = (struct pending*)sq->pending;
2762 portcomm_loweruse(sq->outnet, p->pc);
2763 pending_delete(sq->outnet, p);
2766 outnet_send_wait_udp(sq->outnet);
2769 sq->pending;
2791 if(!reuse_tcp_remove_serviced_keep(w, sq)) {
2793 reuse_cb_and_decommission(sq->outnet,
2795 use_free_buffer(sq->outnet);
2797 sq->pending = NULL;
2800 outnet_waiting_tcp_list_remove(sq->outnet, w);
2807 serviced_node_del(&sq->node, NULL);
2850 serviced_query_udp_size(struct serviced_query* sq, enum serviced_query_status status) {
2853 if(addr_is_ip6(&sq->addr, sq->addrlen)) {
2870 serviced_encode(struct serviced_query* sq, sldns_buffer* buff, int with_edns)
2873 if(sq->outnet->use_caps_for_id && !sq->nocaps) {
2874 serviced_perturb_qname(sq->outnet->rnd, sq->qbuf, sq->qbuflen);
2879 sldns_buffer_write(buff, sq->qbuf, sq->qbuflen);
2889 edns.opt_list_out = sq->opt_list;
2891 edns.udp_size = serviced_query_udp_size(sq, sq->status);
2893 if((sq->dnssec & EDNS_DO))
2895 if((sq->dnssec & BIT_CD))
2897 if (sq->ssl_upstream && sq->padding_block_size) {
2903 edns.padding_block_size = sq->padding_block_size;
2912 * @param sq: query to send.
2917 serviced_udp_send(struct serviced_query* sq, sldns_buffer* buff)
2921 time_t now = *sq->outnet->now_secs;
2923 if(!infra_host(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone,
2924 sq->zonelen, now, &vs, &edns_lame_known, &rtt))
2926 sq->last_rtt = rtt;
2928 if(sq->status == serviced_initial) {
2930 sq->status = serviced_query_UDP_EDNS;
2932 sq->status = serviced_query_UDP;
2935 serviced_encode(sq, buff, (sq->status == serviced_query_UDP_EDNS) ||
2936 (sq->status == serviced_query_UDP_EDNS_FRAG));
2937 sq->last_sent_time = *sq->outnet->now_tv;
2938 sq->edns_lame_known = (int)edns_lame_known;
2940 sq->pending = pending_udp_query(sq, buff, rtt,
2941 serviced_udp_callback, sq);
2942 if(!sq->pending)
2999 serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c,
3003 int dobackup = (sq->cblist && sq->cblist->next); /* >1 cb*/
3014 rbtree_delete(sq->outnet->serviced, sq);
3016 sq->to_be_deleted = 1;
3018 if(sq->outnet->use_caps_for_id && error == NETEVENT_NOERROR && c &&
3019 !sq->nocaps && sq->qtype != LDNS_RR_TYPE_PTR) {
3031 &sq->addr, sq->addrlen);
3036 !serviced_check_qname(c->buffer, sq->qbuf,
3037 sq->qbuflen)) {
3040 &sq->addr, sq->addrlen);
3059 backup_p = regional_alloc_init(sq->region,
3066 sq->outnet->svcd_overhead = backlen;
3068 /* test the actual sq->cblist, because the next elem could be deleted*/
3069 while((p=sq->cblist) != NULL) {
3070 sq->cblist = p->next; /* remove this element */
3080 sq->outnet->svcd_overhead = 0;
3083 log_assert(sq->cblist == NULL);
3084 serviced_delete(sq);
3091 struct serviced_query* sq = (struct serviced_query*)arg;
3094 struct waiting_tcp* w = (struct waiting_tcp*)sq->pending;
3102 sq->pending = NULL; /* removed after this callback */
3105 &sq->addr, sq->addrlen);
3107 infra_update_tcp_works(sq->outnet->infra, &sq->addr,
3108 sq->addrlen, sq->zone, sq->zonelen);
3113 if(error==NETEVENT_NOERROR && pi && sq->outnet->dtenv &&
3114 (sq->outnet->dtenv->log_resolver_response_messages ||
3115 sq->outnet->dtenv->log_forwarder_response_messages)) {
3116 log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen);
3118 dt_msg_send_outside_response(sq->outnet->dtenv, &sq->addr,
3119 &pi->addr, c->type, c->ssl, sq->zone, sq->zonelen, sq->qbuf,
3120 sq->qbuflen, &sq->last_sent_time, sq->outnet->now_tv,
3124 if(error==NETEVENT_NOERROR && sq->status == serviced_query_TCP_EDNS &&
3129 sq->status = serviced_query_TCP_EDNS_fallback;
3130 serviced_tcp_initiate(sq, c->buffer);
3133 sq->status == serviced_query_TCP_EDNS_fallback &&
3142 if(!sq->want_dnssec)
3143 if(!infra_edns_update(sq->outnet->infra, &sq->addr,
3144 sq->addrlen, sq->zone, sq->zonelen, -1,
3145 *sq->outnet->now_secs))
3147 sq->status = serviced_query_TCP;
3149 if(sq->tcp_upstream || sq->ssl_upstream) {
3150 struct timeval now = *sq->outnet->now_tv;
3152 if(!infra_rtt_update(sq->outnet->infra, &sq->addr,
3153 sq->addrlen, sq->zone, sq->zonelen, sq->qtype,
3154 -1, sq->last_rtt, (time_t)now.tv_sec))
3156 } else if(now.tv_sec > sq->last_sent_time.tv_sec ||
3157 (now.tv_sec == sq->last_sent_time.tv_sec &&
3158 now.tv_usec > sq->last_sent_time.tv_usec)) {
3160 int roundtime = ((int)(now.tv_sec - sq->last_sent_time.tv_sec))*1000
3161 + ((int)now.tv_usec - (int)sq->last_sent_time.tv_usec)/1000;
3167 if(!infra_rtt_update(sq->outnet->infra, &sq->addr,
3168 sqsq->zone, sq->zonelen, sq->qtype,
3169 roundtime, sq->last_rtt, (time_t)now.tv_sec))
3180 memcpy(&rep->remote_addr, &sq->addr, sq->addrlen);
3181 rep->remote_addrlen = sq->addrlen;
3182 serviced_callbacks(sq, error, c, rep);
3187 serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff)
3190 sq->status==serviced_query_TCP_EDNS?"EDNS":"");
3191 serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS);
3192 sq->last_sent_time = *sq->outnet->now_tv;
3193 log_assert(!sq->busy);
3194 sq->busy = 1;
3195 sq->pending = pending_tcp_query(sq, buff, sq->outnet->tcp_auth_query_timeout,
3196 serviced_tcp_callback, sq);
3197 sq->busy = 0;
3198 if(!sq->pending) {
3202 serviced_callbacks(sq, NETEVENT_CLOSED, NULL, NULL);
3208 serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff)
3212 if(!infra_host(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone,
3213 sq->zonelen, *sq->outnet->now_secs, &vs, &edns_lame_known,
3216 sq->last_rtt = rtt;
3218 sq->status = serviced_query_TCP_EDNS;
3219 else sq->status = serviced_query_TCP;
3220 serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS);
3221 sq->last_sent_time = *sq->outnet->now_tv;
3222 if(sq->tcp_upstream || sq->ssl_upstream) {
3224 if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < sq->outnet->tcp_auth_query_timeout)
3225 timeout = sq->outnet->tcp_auth_query_timeout;
3227 timeout = sq->outnet->tcp_auth_query_timeout;
3229 log_assert(!sq->busy);
3230 sq->busy = 1;
3231 sq->pending = pending_tcp_query(sq, buff, timeout,
3232 serviced_tcp_callback, sq);
3233 sq->busy = 0;
3234 return sq->pending != NULL;
3279 struct serviced_query* sq = (struct serviced_query*)arg;
3280 struct outside_network* outnet = sq->outnet;
3281 struct timeval now = *sq->outnet->now_tv;
3283 struct pending* p = (struct pending*)sq->pending;
3286 sq->pending = NULL; /* removed after callback */
3288 if(sq->status == serviced_query_UDP_EDNS && sq->last_rtt < 5000 &&
3289 (serviced_query_udp_size(sq, serviced_query_UDP_EDNS_FRAG) < serviced_query_udp_size(sq, serviced_query_UDP_EDNS))) {
3291 sq->status = serviced_query_UDP_EDNS_FRAG;
3292 log_name_addr(VERB_ALGO, "try edns1xx0", sq->qbuf+10,
3293 &sq->addr, sq->addrlen);
3294 if(!serviced_udp_send(sq, c->buffer)) {
3295 serviced_callbacks(sq, NETEVENT_CLOSED, c, rep);
3299 if(sq->status == serviced_query_UDP_EDNS_FRAG) {
3301 sq->status = serviced_query_UDP_EDNS;
3303 sq->retry++;
3304 if(!infra_rtt_update(outnet->infra, &sq->addr, sq->addrlen,
3305 sq->zone, sq->zonelen, sq->qtype, -1, sq->last_rtt,
3308 if(sq->retry < OUTBOUND_UDP_RETRY) {
3309 log_name_addr(VERB_ALGO, "retry query", sq->qbuf+10,
3310 &sq->addr, sq->addrlen);
3311 if(!serviced_udp_send(sq, c->buffer)) {
3312 serviced_callbacks(sq, NETEVENT_CLOSED, c, rep);
3319 serviced_callbacks(sq, error, c, rep);
3329 log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen);
3332 dt_msg_send_outside_response(outnet->dtenv, &sq->addr,
3333 &p->pc->pif->addr, c->type, c->ssl, sq->zone, sq->zonelen,
3334 sq->qbuf, sq->qbuflen, &sq->last_sent_time,
3335 sq->outnet->now_tv, c->buffer);
3338 if( (sq->status == serviced_query_UDP_EDNS
3339 ||sq->status == serviced_query_UDP_EDNS_FRAG)
3343 || packet_edns_malformed(c->buffer, sq->qtype)
3347 sq->status = serviced_query_UDP_EDNS_fallback;
3348 sq->retry = 0;
3349 if(!serviced_udp_send(sq, c->buffer)) {
3350 serviced_callbacks(sq, NETEVENT_CLOSED, c, rep);
3353 } else if(sq->status == serviced_query_UDP_EDNS &&
3354 !sq->edns_lame_known) {
3357 &sq->addr, sq->addrlen);
3358 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
3359 sq->zone, sq->zonelen, 0, (time_t)now.tv_sec)) {
3362 sq->edns_lame_known = 1;
3363 } else if(sq->status == serviced_query_UDP_EDNS_fallback &&
3364 !sq->edns_lame_known && (LDNS_RCODE_WIRE(
3372 if(!sq->want_dnssec) {
3374 &sq->addr, sq->addrlen);
3375 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
3376 sq->zone, sq->zonelen, -1, (time_t)now.tv_sec)) {
3381 "not stored because need DNSSEC for", &sq->addr,
3382 sq->addrlen);
3384 sq->status = serviced_query_UDP;
3386 if(now.tv_sec > sq->last_sent_time.tv_sec ||
3387 (now.tv_sec == sq->last_sent_time.tv_sec &&
3388 now.tv_usec > sq->last_sent_time.tv_usec)) {
3390 int roundtime = ((int)(now.tv_sec - sq->last_sent_time.tv_sec))*1000
3391 + ((int)now.tv_usec - (int)sq->last_sent_time.tv_usec)/1000;
3397 if(!infra_rtt_update(outnet->infra, &sq->addr, sq->addrlen,
3398 sq->zone, sq->zonelen, sq->qtype, roundtime,
3399 sq->last_rtt, (time_t)now.tv_sec))
3408 if(sq->status == serviced_query_UDP_EDNS ||
3409 sq->status == serviced_query_UDP_EDNS_FRAG ||
3410 sq->status == serviced_query_UDP_EDNS_fallback)
3412 sq->status = serviced_query_TCP_EDNS;
3413 else sq->status = serviced_query_TCP;
3414 serviced_tcp_initiate(sq, c->buffer);
3418 serviced_callbacks(sq, error, c, rep);
3431 struct serviced_query* sq;
3476 sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen,
3478 if(!sq) {
3503 sq = serviced_create(outnet, buff, dnssec, want_dnssec, nocaps,
3510 if(!sq) {
3518 sq->region, sizeof(*cb)))) {
3523 (void)rbtree_delete(outnet->serviced, sq);
3524 serviced_node_del(&sq->node, NULL);
3536 sq->region, sizeof(*cb)))) {
3543 cb->next = sq->cblist;
3544 sq->cblist = cb;
3545 return sq;
3550 callback_list_remove(struct serviced_query* sq, void* cb_arg)
3552 struct service_callback** pp = &sq->cblist;
3563 void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
3565 if(!sq)
3567 callback_list_remove(sq, cb_arg);
3569 if(!sq->cblist && !sq->busy && !sq->to_be_deleted) {
3570 (void)rbtree_delete(sq->outnet->serviced, sq);
3571 serviced_delete(sq);
3897 struct serviced_query* sq;
3928 RBTREE_FOR(sq, struct serviced_query*, outnet->serviced) {
3929 s += sizeof(*sq) + sq->qbuflen;
3930 for(sb = sq->cblist; sb; sb = sb->next)
3937 serviced_get_mem(struct serviced_query* sq)
3941 s = sizeof(*sq) + sq->qbuflen;
3942 for(sb = sq->cblist; sb; sb = sb->next)
3944 if(sq->status == serviced_query_UDP_EDNS ||
3945 sq->status == serviced_query_UDP ||
3946 sq->status == serviced_query_UDP_EDNS_FRAG ||
3947 sq->status == serviced_query_UDP_EDNS_fallback) {