Lines Matching defs: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,
1006 if(outnet->dtenv && pend_tcp && w && w->sq &&
1011 dt_msg_send_outside_query(outnet->dtenv, &w->sq->addr,
1012 &pend_tcp->pi->addr, comm_tcp, NULL, w->sq->zone,
1013 w->sq->zonelen, &tmp);
1238 * the callbacks remove references in sq->pending to the waiting_tcp
1447 log_assert(!pend->sq->busy);
1448 pend->sq->busy = 1;
1459 pend->sq->busy = 0;
1823 struct serviced_query* sq = (struct serviced_query*)node;
1824 alloc_reg_release(sq->alloc, sq->region);
1825 if(sq->timer)
1826 comm_timer_delete(sq->timer);
1827 free(sq);
2203 struct outside_network* outnet = pend->sq->outnet;
2252 pend->sq->zone, pend->sq->zonelen, packet);
2259 pending_udp_query(struct serviced_query* sq, struct sldns_buffer* packet,
2264 pend->outnet = sq->outnet;
2265 pend->sq = sq;
2266 pend->addrlen = sq->addrlen;
2267 memmove(&pend->addr, &sq->addr, sq->addrlen);
2271 pend->timer = comm_timer_create(sq->outnet->base, pending_udp_timer_cb,
2278 if(sq->outnet->unused_fds == NULL) {
2291 if(sq->outnet->udp_wait_last)
2292 sq->outnet->udp_wait_last->next_waiting = pend;
2294 sq->outnet->udp_wait_first = pend;
2295 sq->outnet->udp_wait_last = pend;
2298 log_assert(!sq->busy);
2299 sq->busy = 1;
2301 pending_delete(sq->outnet, pend);
2304 sq->busy = 0;
2419 pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
2422 struct pending_tcp* pend = sq->outnet->tcp_free;
2434 reuse = reuse_tcp_find(sq->outnet, &sq->addr, sq->addrlen,
2435 sq->ssl_upstream);
2440 reuse_tcp_lru_touch(sq->outnet, reuse);
2449 reuse_tcp_close_oldest(sq->outnet);
2450 pend = sq->outnet->tcp_free;
2460 if(!(w->timer = comm_timer_create(sq->outnet->base, outnet_tcptimer, w))) {
2467 w->id = tcp_select_id(sq->outnet, reuse);
2469 memcpy(&w->addr, &sq->addr, sq->addrlen);
2470 w->addrlen = sq->addrlen;
2471 w->outnet = sq->outnet;
2476 w->ssl_upstream = sq->ssl_upstream;
2477 w->tls_auth_name = sq->tls_auth_name;
2485 w->sq = NULL;
2516 memcpy(&pend->reuse.addr, &sq->addr, sq->addrlen);
2517 pend->reuse.addrlen = sq->addrlen;
2524 if(sq->outnet->dtenv &&
2525 (sq->outnet->dtenv->log_resolver_query_messages ||
2526 sq->outnet->dtenv->log_forwarder_query_messages)) {
2530 dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr,
2531 &pend->pi->addr, comm_tcp, NULL, sq->zone,
2532 sq->zonelen, &tmp);
2541 w->sq = sq;
2543 outnet_waiting_tcp_list_add(sq->outnet, w, 1);
2587 struct serviced_query* sq = (struct serviced_query*)arg;
2588 struct outside_network* outnet = sq->outnet;
2592 if(!sq->cblist)
2595 if(outnet->do_udp && !(sq->tcp_upstream || sq->ssl_upstream)) {
2596 if(!serviced_udp_send(sq, outnet->udp_buff))
2599 if(!serviced_tcp_send(sq, outnet->udp_buff))
2607 serviced_callbacks(sq, NETEVENT_CLOSED, NULL, NULL);
2619 struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
2624 if(!sq) {
2628 sq->node.key = sq;
2629 sq->alloc = alloc;
2630 sq->region = region;
2631 sq->qbuf = regional_alloc_init(region, sldns_buffer_begin(buff),
2633 if(!sq->qbuf) {
2635 free(sq);
2638 sq->qbuflen = sldns_buffer_limit(buff);
2639 sq->zone = regional_alloc_init(region, zone, zonelen);
2640 if(!sq->zone) {
2642 free(sq);
2645 sq->zonelen = zonelen;
2646 sq->qtype = qtype;
2647 sq->dnssec = dnssec;
2648 sq->want_dnssec = want_dnssec;
2649 sq->nocaps = nocaps;
2650 sq->tcp_upstream = tcp_upstream;
2651 sq->ssl_upstream = ssl_upstream;
2653 sq->tls_auth_name = regional_strdup(region, tls_auth_name);
2654 if(!sq->tls_auth_name) {
2656 free(sq);
2660 sq->tls_auth_name = NULL;
2662 memcpy(&sq->addr, addr, addrlen);
2663 sq->addrlen = addrlen;
2664 sq->opt_list = opt_list;
2665 sq->busy = 0;
2666 sq->timer = comm_timer_create(outnet->base, serviced_timer_cb, sq);
2667 if(!sq->timer) {
2669 free(sq);
2673 comm_timer_set(sq->timer, &t);
2674 sq->outnet = outnet;
2675 sq->cblist = NULL;
2676 sq->pending = NULL;
2677 sq->status = serviced_initial;
2678 sq->retry = 0;
2679 sq->to_be_deleted = 0;
2680 sq->padding_block_size = pad_queries_block_size;
2686 rbtree_insert(outnet->serviced, &sq->node);
2688 return sq;
2695 struct serviced_query* sq)
2720 if(pend_tcp->c->fd != -1 && sq->outnet->tcp_reuse.count <
2721 sq->outnet->tcp_reuse_max) {
2724 if(!reuse_tcp_insert(sq->outnet, pend_tcp)) {
2727 reuse_tcp_setup_timeout(pend_tcp, sq->outnet->tcp_reuse_timeout);
2735 serviced_delete(struct serviced_query* sq)
2738 if(sq->pending) {
2740 if(sq->status == serviced_query_UDP_EDNS ||
2741 sq->status == serviced_query_UDP ||
2742 sq->status == serviced_query_UDP_EDNS_FRAG ||
2743 sq->status == serviced_query_UDP_EDNS_fallback) {
2744 struct pending* p = (struct pending*)sq->pending;
2747 portcomm_loweruse(sq->outnet, p->pc);
2748 pending_delete(sq->outnet, p);
2751 outnet_send_wait_udp(sq->outnet);
2754 sq->pending;
2776 if(!reuse_tcp_remove_serviced_keep(w, sq)) {
2778 reuse_cb_and_decommission(sq->outnet,
2780 use_free_buffer(sq->outnet);
2782 sq->pending = NULL;
2785 outnet_waiting_tcp_list_remove(sq->outnet, w);
2792 serviced_node_del(&sq->node, NULL);
2835 serviced_query_udp_size(struct serviced_query* sq, enum serviced_query_status status) {
2838 if(addr_is_ip6(&sq->addr, sq->addrlen)) {
2855 serviced_encode(struct serviced_query* sq, sldns_buffer* buff, int with_edns)
2858 if(sq->outnet->use_caps_for_id && !sq->nocaps) {
2859 serviced_perturb_qname(sq->outnet->rnd, sq->qbuf, sq->qbuflen);
2864 sldns_buffer_write(buff, sq->qbuf, sq->qbuflen);
2874 edns.opt_list_out = sq->opt_list;
2876 edns.udp_size = serviced_query_udp_size(sq, sq->status);
2878 if(sq->dnssec & EDNS_DO)
2880 if(sq->dnssec & BIT_CD)
2882 if (sq->ssl_upstream && sq->padding_block_size) {
2888 edns.padding_block_size = sq->padding_block_size;
2897 * @param sq: query to send.
2902 serviced_udp_send(struct serviced_query* sq, sldns_buffer* buff)
2906 time_t now = *sq->outnet->now_secs;
2908 if(!infra_host(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone,
2909 sq->zonelen, now, &vs, &edns_lame_known, &rtt))
2911 sq->last_rtt = rtt;
2913 if(sq->status == serviced_initial) {
2915 sq->status = serviced_query_UDP_EDNS;
2917 sq->status = serviced_query_UDP;
2920 serviced_encode(sq, buff, (sq->status == serviced_query_UDP_EDNS) ||
2921 (sq->status == serviced_query_UDP_EDNS_FRAG));
2922 sq->last_sent_time = *sq->outnet->now_tv;
2923 sq->edns_lame_known = (int)edns_lame_known;
2925 sq->pending = pending_udp_query(sq, buff, rtt,
2926 serviced_udp_callback, sq);
2927 if(!sq->pending)
2984 serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c,
2988 int dobackup = (sq->cblist && sq->cblist->next); /* >1 cb*/
2999 rbtree_delete(sq->outnet->serviced, sq);
3001 sq->to_be_deleted = 1;
3003 if(sq->outnet->use_caps_for_id && error == NETEVENT_NOERROR && c &&
3004 !sq->nocaps && sq->qtype != LDNS_RR_TYPE_PTR) {
3016 &sq->addr, sq->addrlen);
3021 !serviced_check_qname(c->buffer, sq->qbuf,
3022 sq->qbuflen)) {
3025 &sq->addr, sq->addrlen);
3044 backup_p = regional_alloc_init(sq->region,
3051 sq->outnet->svcd_overhead = backlen;
3053 /* test the actual sq->cblist, because the next elem could be deleted*/
3054 while((p=sq->cblist) != NULL) {
3055 sq->cblist = p->next; /* remove this element */
3065 sq->outnet->svcd_overhead = 0;
3068 log_assert(sq->cblist == NULL);
3069 serviced_delete(sq);
3076 struct serviced_query* sq = (struct serviced_query*)arg;
3079 struct waiting_tcp* w = (struct waiting_tcp*)sq->pending;
3087 sq->pending = NULL; /* removed after this callback */
3090 &sq->addr, sq->addrlen);
3092 infra_update_tcp_works(sq->outnet->infra, &sq->addr,
3093 sq->addrlen, sq->zone, sq->zonelen);
3098 if(error==NETEVENT_NOERROR && pi && sq->outnet->dtenv &&
3099 (sq->outnet->dtenv->log_resolver_response_messages ||
3100 sq->outnet->dtenv->log_forwarder_response_messages)) {
3101 log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen);
3103 dt_msg_send_outside_response(sq->outnet->dtenv, &sq->addr,
3104 &pi->addr, c->type, c->ssl, sq->zone, sq->zonelen, sq->qbuf,
3105 sq->qbuflen, &sq->last_sent_time, sq->outnet->now_tv,
3109 if(error==NETEVENT_NOERROR && sq->status == serviced_query_TCP_EDNS &&
3114 sq->status = serviced_query_TCP_EDNS_fallback;
3115 serviced_tcp_initiate(sq, c->buffer);
3118 sq->status == serviced_query_TCP_EDNS_fallback &&
3127 if(!sq->want_dnssec)
3128 if(!infra_edns_update(sq->outnet->infra, &sq->addr,
3129 sq->addrlen, sq->zone, sq->zonelen, -1,
3130 *sq->outnet->now_secs))
3132 sq->status = serviced_query_TCP;
3134 if(sq->tcp_upstream || sq->ssl_upstream) {
3135 struct timeval now = *sq->outnet->now_tv;
3137 if(!infra_rtt_update(sq->outnet->infra, &sq->addr,
3138 sq->addrlen, sq->zone, sq->zonelen, sq->qtype,
3139 -1, sq->last_rtt, (time_t)now.tv_sec))
3141 } else if(now.tv_sec > sq->last_sent_time.tv_sec ||
3142 (now.tv_sec == sq->last_sent_time.tv_sec &&
3143 now.tv_usec > sq->last_sent_time.tv_usec)) {
3145 int roundtime = ((int)(now.tv_sec - sq->last_sent_time.tv_sec))*1000
3146 + ((int)now.tv_usec - (int)sq->last_sent_time.tv_usec)/1000;
3152 if(!infra_rtt_update(sq->outnet->infra, &sq->addr,
3153 sq->addrlen, sq->zone, sq->zonelen, sq->qtype,
3154 roundtime, sq->last_rtt, (time_t)now.tv_sec))
3165 memcpy(&rep->remote_addr, &sq->addr, sq->addrlen);
3166 rep->remote_addrlen = sq->addrlen;
3167 serviced_callbacks(sq, error, c, rep);
3172 serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff)
3175 sq->status==serviced_query_TCP_EDNS?"EDNS":"");
3176 serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS);
3177 sq->last_sent_time = *sq->outnet->now_tv;
3178 log_assert(!sq->busy);
3179 sq->busy = 1;
3180 sq->pending = pending_tcp_query(sq, buff, sq->outnet->tcp_auth_query_timeout,
3181 serviced_tcp_callback, sq);
3182 sq->busy = 0;
3183 if(!sq->pending) {
3187 serviced_callbacks(sq, NETEVENT_CLOSED, NULL, NULL);
3193 serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff)
3197 if(!infra_host(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone,
3198 sq->zonelen, *sq->outnet->now_secs, &vs, &edns_lame_known,
3201 sq->last_rtt = rtt;
3203 sq->status = serviced_query_TCP_EDNS;
3204 else sq->status = serviced_query_TCP;
3205 serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS);
3206 sq->last_sent_time = *sq->outnet->now_tv;
3207 if(sq->tcp_upstream || sq->ssl_upstream) {
3209 if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < sq->outnet->tcp_auth_query_timeout)
3210 timeout = sq->outnet->tcp_auth_query_timeout;
3212 timeout = sq->outnet->tcp_auth_query_timeout;
3214 log_assert(!sq->busy);
3215 sq->busy = 1;
3216 sq->pending = pending_tcp_query(sq, buff, timeout,
3217 serviced_tcp_callback, sq);
3218 sq->busy = 0;
3219 return sq->pending != NULL;
3264 struct serviced_query* sq = (struct serviced_query*)arg;
3265 struct outside_network* outnet = sq->outnet;
3266 struct timeval now = *sq->outnet->now_tv;
3268 struct pending* p = (struct pending*)sq->pending;
3271 sq->pending = NULL; /* removed after callback */
3273 if(sq->status == serviced_query_UDP_EDNS && sq->last_rtt < 5000 &&
3274 (serviced_query_udp_size(sq, serviced_query_UDP_EDNS_FRAG) < serviced_query_udp_size(sq, serviced_query_UDP_EDNS))) {
3276 sq->status = serviced_query_UDP_EDNS_FRAG;
3277 log_name_addr(VERB_ALGO, "try edns1xx0", sq->qbuf+10,
3278 &sq->addr, sq->addrlen);
3279 if(!serviced_udp_send(sq, c->buffer)) {
3280 serviced_callbacks(sq, NETEVENT_CLOSED, c, rep);
3284 if(sq->status == serviced_query_UDP_EDNS_FRAG) {
3286 sq->status = serviced_query_UDP_EDNS;
3288 sq->retry++;
3289 if(!infra_rtt_update(outnet->infra, &sq->addr, sq->addrlen,
3290 sq->zone, sq->zonelen, sq->qtype, -1, sq->last_rtt,
3293 if(sq->retry < OUTBOUND_UDP_RETRY) {
3294 log_name_addr(VERB_ALGO, "retry query", sq->qbuf+10,
3295 &sq->addr, sq->addrlen);
3296 if(!serviced_udp_send(sq, c->buffer)) {
3297 serviced_callbacks(sq, NETEVENT_CLOSED, c, rep);
3304 serviced_callbacks(sq, error, c, rep);
3314 log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen);
3317 dt_msg_send_outside_response(outnet->dtenv, &sq->addr,
3318 &p->pc->pif->addr, c->type, c->ssl, sq->zone, sq->zonelen,
3319 sq->qbuf, sq->qbuflen, &sq->last_sent_time,
3320 sq->outnet->now_tv, c->buffer);
3323 if( (sq->status == serviced_query_UDP_EDNS
3324 ||sq->status == serviced_query_UDP_EDNS_FRAG)
3328 || packet_edns_malformed(c->buffer, sq->qtype)
3332 sq->status = serviced_query_UDP_EDNS_fallback;
3333 sq->retry = 0;
3334 if(!serviced_udp_send(sq, c->buffer)) {
3335 serviced_callbacks(sq, NETEVENT_CLOSED, c, rep);
3338 } else if(sq->status == serviced_query_UDP_EDNS &&
3339 !sq->edns_lame_known) {
3342 &sq->addr, sq->addrlen);
3343 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
3344 sq->zone, sq->zonelen, 0, (time_t)now.tv_sec)) {
3347 sq->edns_lame_known = 1;
3348 } else if(sq->status == serviced_query_UDP_EDNS_fallback &&
3349 !sq->edns_lame_known && (LDNS_RCODE_WIRE(
3357 if(!sq->want_dnssec) {
3359 &sq->addr, sq->addrlen);
3360 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
3361 sq->zone, sq->zonelen, -1, (time_t)now.tv_sec)) {
3366 "not stored because need DNSSEC for", &sq->addr,
3367 sq->addrlen);
3369 sq->status = serviced_query_UDP;
3371 if(now.tv_sec > sq->last_sent_time.tv_sec ||
3372 (now.tv_sec == sq->last_sent_time.tv_sec &&
3373 now.tv_usec > sq->last_sent_time.tv_usec)) {
3375 int roundtime = ((int)(now.tv_sec - sq->last_sent_time.tv_sec))*1000
3376 + ((int)now.tv_usec - (int)sq->last_sent_time.tv_usec)/1000;
3382 if(!infra_rtt_update(outnet->infra, &sq->addr, sq->addrlen,
3383 sq->zone, sq->zonelen, sq->qtype, roundtime,
3384 sq->last_rtt, (time_t)now.tv_sec))
3393 if(sq->status == serviced_query_UDP_EDNS ||
3394 sq->status == serviced_query_UDP_EDNS_FRAG ||
3395 sq->status == serviced_query_UDP_EDNS_fallback)
3397 sq->status = serviced_query_TCP_EDNS;
3398 else sq->status = serviced_query_TCP;
3399 serviced_tcp_initiate(sq, c->buffer);
3403 serviced_callbacks(sq, error, c, rep);
3416 struct serviced_query* sq;
3461 sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen,
3463 if(!sq) {
3488 sq = serviced_create(outnet, buff, dnssec, want_dnssec, nocaps,
3495 if(!sq) {
3503 sq->region, sizeof(*cb)))) {
3508 (void)rbtree_delete(outnet->serviced, sq);
3509 serviced_node_del(&sq->node, NULL);
3521 sq->region, sizeof(*cb)))) {
3528 cb->next = sq->cblist;
3529 sq->cblist = cb;
3530 return sq;
3535 callback_list_remove(struct serviced_query* sq, void* cb_arg)
3537 struct service_callback** pp = &sq->cblist;
3548 void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
3550 if(!sq)
3552 callback_list_remove(sq, cb_arg);
3554 if(!sq->cblist && !sq->busy && !sq->to_be_deleted) {
3555 (void)rbtree_delete(sq->outnet->serviced, sq);
3556 serviced_delete(sq);
3880 struct serviced_query* sq;
3911 RBTREE_FOR(sq, struct serviced_query*, outnet->serviced) {
3912 s += sizeof(*sq) + sq->qbuflen;
3913 for(sb = sq->cblist; sb; sb = sb->next)
3920 serviced_get_mem(struct serviced_query* sq)
3924 s = sizeof(*sq) + sq->qbuflen;
3925 for(sb = sq->cblist; sb; sb = sb->next)
3927 if(sq->status == serviced_query_UDP_EDNS ||
3928 sq->status == serviced_query_UDP ||
3929 sq->status == serviced_query_UDP_EDNS_FRAG ||
3930 sq->status == serviced_query_UDP_EDNS_fallback) {