Lines Matching defs:outnet

84 /** remove waiting tcp from the outnet waiting list */
85 static void waiting_list_remove(struct outside_network* outnet,
155 num = w->outnet->num_ip6;
158 num = w->outnet->num_ip4;
171 pi = &w->outnet->ip6_ifs[ub_random_max(w->outnet->rnd, num)];
174 pi = &w->outnet->ip4_ifs[ub_random_max(w->outnet->rnd, num)];
203 struct pending_tcp* pend = w->outnet->tcp_free;
249 if(w->outnet->sslctx && w->ssl_upstream) {
250 pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s);
264 w->outnet->num_tcp_outgoing++;
265 w->outnet->tcp_free = pend->next_free;
281 use_free_buffer(struct outside_network* outnet)
284 while(outnet->tcp_free && outnet->tcp_wait_first
285 && !outnet->want_to_quit) {
286 w = outnet->tcp_wait_first;
287 outnet->tcp_wait_first = w->next_waiting;
288 if(outnet->tcp_wait_last == w)
289 outnet->tcp_wait_last = NULL;
302 decomission_pending_tcp(struct outside_network* outnet,
313 pend->next_free = outnet->tcp_free;
314 outnet->tcp_free = pend;
317 use_free_buffer(outnet);
325 struct outside_network* outnet = pend->query->outnet;
342 decomission_pending_tcp(outnet, pend);
348 portcomm_loweruse(struct outside_network* outnet, struct port_comm* pc)
364 pc->next = outnet->unused_fds;
365 outnet->unused_fds = pc;
370 outnet_send_wait_udp(struct outside_network* outnet)
374 while(outnet->udp_wait_first && outnet->unused_fds
375 && !outnet->want_to_quit) {
376 pend = outnet->udp_wait_first;
377 outnet->udp_wait_first = pend->next_waiting;
378 if(!pend->next_waiting) outnet->udp_wait_last = NULL;
379 sldns_buffer_clear(outnet->udp_buff);
380 sldns_buffer_write(outnet->udp_buff, pend->pkt, pend->pkt_len);
381 sldns_buffer_flip(outnet->udp_buff);
385 if(!randomize_and_send_udp(pend, outnet->udp_buff,
390 (void)(*pend->cb)(outnet->unused_fds->cp, pend->cb_arg,
393 pending_delete(outnet, pend);
402 struct outside_network* outnet = (struct outside_network*)arg;
426 verbose(VERB_ALGO, "lookup size is %d entries", (int)outnet->pending->count);
427 p = (struct pending*)rbtree_search(outnet->pending, &key);
431 outnet->unwanted_replies++;
432 if(outnet->unwanted_threshold && ++outnet->unwanted_total
433 >= outnet->unwanted_threshold) {
437 (unsigned)outnet->unwanted_threshold);
439 outnet->unwanted_action));
440 (*outnet->unwanted_action)(outnet->unwanted_param);
441 outnet->unwanted_total = 0;
451 outnet->unwanted_replies++;
452 if(outnet->unwanted_threshold && ++outnet->unwanted_total
453 >= outnet->unwanted_threshold) {
457 (unsigned)outnet->unwanted_threshold);
459 outnet->unwanted_action));
460 (*outnet->unwanted_action)(outnet->unwanted_param);
461 outnet->unwanted_total = 0;
466 verbose(VERB_ALGO, "outnet handle udp reply");
468 (void)rbtree_delete(outnet->pending, p->node.key);
473 portcomm_loweruse(outnet, p->pc);
475 outnet_send_wait_udp(outnet);
511 struct outside_network* outnet = p->outnet;
513 portcomm_loweruse(outnet, p->pc);
514 pending_delete(outnet, p);
515 outnet_send_wait_udp(outnet);
522 struct outside_network* outnet = p->outnet;
533 if(outnet->delayclose && !outnet->udp_wait_first) {
536 comm_timer_set(p->timer, &outnet->delay_tv);
539 portcomm_loweruse(outnet, p->pc);
540 pending_delete(outnet, p);
541 outnet_send_wait_udp(outnet);
546 create_pending_tcp(struct outside_network* outnet, size_t bufsize)
549 if(outnet->num_tcp == 0)
551 if(!(outnet->tcp_conns = (struct pending_tcp **)calloc(
552 outnet->num_tcp, sizeof(struct pending_tcp*))))
554 for(i=0; i<outnet->num_tcp; i++) {
555 if(!(outnet->tcp_conns[i] = (struct pending_tcp*)calloc(1,
558 outnet->tcp_conns[i]->next_free = outnet->tcp_free;
559 outnet->tcp_free = outnet->tcp_conns[i];
560 outnet->tcp_conns[i]->c = comm_point_create_tcp_out(
561 outnet->base, bufsize, outnet_tcp_cb,
562 outnet->tcp_conns[i]);
563 if(!outnet->tcp_conns[i]->c)
597 struct outside_network* outnet = (struct outside_network*)
600 if(!outnet) {
604 comm_base_timept(base, &outnet->now_secs, &outnet->now_tv);
605 outnet->base = base;
606 outnet->num_tcp = num_tcp;
607 outnet->num_tcp_outgoing = 0;
608 outnet->infra = infra;
609 outnet->rnd = rnd;
610 outnet->sslctx = sslctx;
612 outnet->dtenv = dtenv;
616 outnet->svcd_overhead = 0;
617 outnet->want_to_quit = 0;
618 outnet->unwanted_threshold = unwanted_threshold;
619 outnet->unwanted_action = unwanted_action;
620 outnet->unwanted_param = unwanted_param;
621 outnet->use_caps_for_id = use_caps_for_id;
622 outnet->do_udp = do_udp;
625 outnet->delayclose = 1;
626 outnet->delay_tv.tv_sec = delayclose/1000;
627 outnet->delay_tv.tv_usec = (delayclose%1000)*1000;
632 outside_network_delete(outnet);
639 &outnet->num_ip4, &outnet->num_ip6);
640 if(outnet->num_ip4 != 0) {
641 if(!(outnet->ip4_ifs = (struct port_if*)calloc(
642 (size_t)outnet->num_ip4, sizeof(struct port_if)))) {
644 outside_network_delete(outnet);
648 if(outnet->num_ip6 != 0) {
649 if(!(outnet->ip6_ifs = (struct port_if*)calloc(
650 (size_t)outnet->num_ip6, sizeof(struct port_if)))) {
652 outside_network_delete(outnet);
656 if( !(outnet->udp_buff = sldns_buffer_new(bufsize)) ||
657 !(outnet->pending = rbtree_create(pending_cmp)) ||
658 !(outnet->serviced = rbtree_create(serviced_cmp)) ||
659 !create_pending_tcp(outnet, bufsize)) {
661 outside_network_delete(outnet);
671 outside_network_delete(outnet);
674 pc->cp = comm_point_create_udp(outnet->base, -1,
675 outnet->udp_buff, outnet_udp_cb, outnet);
679 outside_network_delete(outnet);
682 pc->next = outnet->unused_fds;
683 outnet->unused_fds = pc;
688 if(do_ip4 && !setup_if(&outnet->ip4_ifs[0], "0.0.0.0",
691 outside_network_delete(outnet);
694 if(do_ip6 && !setup_if(&outnet->ip6_ifs[0], "::",
697 outside_network_delete(outnet);
705 if(!setup_if(&outnet->ip6_ifs[done_6], ifs[i],
708 outside_network_delete(outnet);
714 if(!setup_if(&outnet->ip4_ifs[done_4], ifs[i],
717 outside_network_delete(outnet);
724 return outnet;
732 struct outside_network* outnet = (struct outside_network*)arg;
733 pending_delete(outnet, pend);
753 outside_network_quit_prepare(struct outside_network* outnet)
755 if(!outnet)
758 outnet->want_to_quit = 1;
762 outside_network_delete(struct outside_network* outnet)
764 if(!outnet)
766 outnet->want_to_quit = 1;
768 if(outnet->pending) {
770 traverse_postorder(outnet->pending, pending_node_del, NULL);
771 free(outnet->pending);
773 if(outnet->serviced) {
774 traverse_postorder(outnet->serviced, serviced_node_del, NULL);
775 free(outnet->serviced);
777 if(outnet->udp_buff)
778 sldns_buffer_free(outnet->udp_buff);
779 if(outnet->unused_fds) {
780 struct port_comm* p = outnet->unused_fds, *np;
787 outnet->unused_fds = NULL;
789 if(outnet->ip4_ifs) {
791 for(i=0; i<outnet->num_ip4; i++) {
792 for(k=0; k<outnet->ip4_ifs[i].inuse; k++) {
793 struct port_comm* pc = outnet->ip4_ifs[i].
798 free(outnet->ip4_ifs[i].avail_ports);
799 free(outnet->ip4_ifs[i].out);
801 free(outnet->ip4_ifs);
803 if(outnet->ip6_ifs) {
805 for(i=0; i<outnet->num_ip6; i++) {
806 for(k=0; k<outnet->ip6_ifs[i].inuse; k++) {
807 struct port_comm* pc = outnet->ip6_ifs[i].
812 free(outnet->ip6_ifs[i].avail_ports);
813 free(outnet->ip6_ifs[i].out);
815 free(outnet->ip6_ifs);
817 if(outnet->tcp_conns) {
819 for(i=0; i<outnet->num_tcp; i++)
820 if(outnet->tcp_conns[i]) {
821 comm_point_delete(outnet->tcp_conns[i]->c);
822 waiting_tcp_delete(outnet->tcp_conns[i]->query);
823 free(outnet->tcp_conns[i]);
825 free(outnet->tcp_conns);
827 if(outnet->tcp_wait_first) {
828 struct waiting_tcp* p = outnet->tcp_wait_first, *np;
835 if(outnet->udp_wait_first) {
836 struct pending* p = outnet->udp_wait_first, *np;
843 free(outnet);
847 pending_delete(struct outside_network* outnet, struct pending* p)
851 if(outnet && outnet->udp_wait_first &&
852 (p->next_waiting || p == outnet->udp_wait_last) ) {
854 struct pending* prev = NULL, *x = outnet->udp_wait_first;
863 else outnet->udp_wait_first = p->next_waiting;
864 if(outnet->udp_wait_last == p)
865 outnet->udp_wait_last = prev;
868 if(outnet) {
869 (void)rbtree_delete(outnet->pending, p->node.key);
909 select_id(struct outside_network* outnet, struct pending* pend,
913 pend->id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff;
918 while(!rbtree_insert(outnet->pending, &pend->node)) {
920 pend->id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff;
935 select_ifport(struct outside_network* outnet, struct pending* pend,
946 log_assert(outnet->unused_fds);
949 my_if = ub_random_max(outnet->rnd, num_if);
951 my_port = ub_random_max(outnet->rnd, pif->avail_total);
971 pend->pc = outnet->unused_fds;
972 outnet->unused_fds = pend->pc->next;
1007 struct outside_network* outnet = pend->sq->outnet;
1010 if(!select_id(outnet, pend, packet)) {
1016 if(!select_ifport(outnet, pend,
1017 outnet->num_ip6, outnet->ip6_ifs))
1020 if(!select_ifport(outnet, pend,
1021 outnet->num_ip4, outnet->ip4_ifs))
1029 portcomm_loweruse(outnet, pend->pc);
1042 if(outnet->dtenv &&
1043 (outnet->dtenv->log_resolver_query_messages ||
1044 outnet->dtenv->log_forwarder_query_messages))
1045 dt_msg_send_outside_query(outnet->dtenv, &pend->addr, comm_udp,
1057 pend->outnet = sq->outnet;
1064 pend->timer = comm_timer_create(sq->outnet->base, pending_udp_timer_cb,
1071 if(sq->outnet->unused_fds == NULL) {
1084 if(sq->outnet->udp_wait_last)
1085 sq->outnet->udp_wait_last->next_waiting = pend;
1087 sq->outnet->udp_wait_first = pend;
1088 sq->outnet->udp_wait_last = pend;
1092 pending_delete(sq->outnet, pend);
1102 struct outside_network* outnet = w->outnet;
1107 waiting_list_remove(outnet, w);
1113 pend->next_free = outnet->tcp_free;
1114 outnet->tcp_free = pend;
1121 use_free_buffer(outnet);
1128 struct pending_tcp* pend = sq->outnet->tcp_free;
1138 if(!(w->timer = comm_timer_create(sq->outnet->base, outnet_tcptimer, w))) {
1144 id = ((unsigned)ub_random(sq->outnet->rnd)>>8) & 0xffff;
1148 w->outnet = sq->outnet;
1165 if(sq->outnet->dtenv &&
1166 (sq->outnet->dtenv->log_resolver_query_messages ||
1167 sq->outnet->dtenv->log_forwarder_query_messages))
1168 dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr,
1177 if(sq->outnet->tcp_wait_last)
1178 sq->outnet->tcp_wait_last->next_waiting = w;
1179 else sq->outnet->tcp_wait_first = w;
1180 sq->outnet->tcp_wait_last = w;
1205 lookup_serviced(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
1215 key.outnet = outnet;
1216 return (struct serviced_query*)rbtree_search(outnet->serviced, &key);
1221 serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
1254 sq->outnet = outnet;
1265 rbtree_insert(outnet->serviced, &sq->node);
1270 /** remove waiting tcp from the outnet waiting list */
1272 waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w)
1274 struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL;
1280 else outnet->tcp_wait_first = w->next_waiting;
1281 if(outnet->tcp_wait_last == w)
1282 outnet->tcp_wait_last = prev;
1303 portcomm_loweruse(sq->outnet, p->pc);
1304 pending_delete(sq->outnet, p);
1307 outnet_send_wait_udp(sq->outnet);
1312 decomission_pending_tcp(sq->outnet,
1315 waiting_list_remove(sq->outnet, p);
1367 if(sq->outnet->use_caps_for_id && !sq->nocaps) {
1368 serviced_perturb_qname(sq->outnet->rnd, sq->qbuf, sq->qbuflen);
1415 time_t now = *sq->outnet->now_secs;
1417 if(!infra_host(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone,
1439 sq->last_sent_time = *sq->outnet->now_tv;
1509 rbtree_delete(sq->outnet->serviced, sq);
1513 if(sq->outnet->use_caps_for_id && error == NETEVENT_NOERROR && c) {
1556 sq->outnet->svcd_overhead = backlen;
1572 sq->outnet->svcd_overhead = 0;
1590 infra_update_tcp_works(sq->outnet->infra, &sq->addr,
1593 if(sq->outnet->dtenv &&
1594 (sq->outnet->dtenv->log_resolver_response_messages ||
1595 sq->outnet->dtenv->log_forwarder_response_messages))
1596 dt_msg_send_outside_response(sq->outnet->dtenv, &sq->addr,
1598 &sq->last_sent_time, sq->outnet->now_tv, c->buffer);
1619 if(!infra_edns_update(sq->outnet->infra, &sq->addr,
1621 *sq->outnet->now_secs))
1626 struct timeval now = *sq->outnet->now_tv;
1638 if(!infra_rtt_update(sq->outnet->infra, &sq->addr,
1663 sq->last_sent_time = *sq->outnet->now_tv;
1680 if(!infra_host(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone,
1681 sq->zonelen, *sq->outnet->now_secs, &vs, &edns_lame_known,
1688 sq->last_sent_time = *sq->outnet->now_tv;
1699 struct outside_network* outnet = sq->outnet;
1700 struct timeval now = *sq->outnet->now_tv;
1727 if(!(rto=infra_rtt_update(outnet->infra, &sq->addr, sq->addrlen,
1752 if(outnet->dtenv &&
1753 (outnet->dtenv->log_resolver_response_messages ||
1754 outnet->dtenv->log_forwarder_response_messages))
1755 dt_msg_send_outside_response(outnet->dtenv, &sq->addr, c->type,
1757 &sq->last_sent_time, sq->outnet->now_tv, c->buffer);
1780 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
1790 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
1807 if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
1829 if(!infra_rtt_update(outnet->infra, &sq->addr, sq->addrlen,
1856 outnet_serviced_query(struct outside_network* outnet,
1867 sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen);
1875 sq = serviced_create(outnet, buff, dnssec, want_dnssec, nocaps,
1883 if(outnet->do_udp && !(tcp_upstream || ssl_upstream)) {
1885 (void)rbtree_delete(outnet->serviced, sq);
1894 (void)rbtree_delete(outnet->serviced, sq);
1939 rbtree_delete(sq->outnet->serviced, sq);
1980 size_t outnet_get_mem(struct outside_network* outnet)
1989 size_t s = sizeof(*outnet) + sizeof(*outnet->base) +
1990 sizeof(*outnet->udp_buff) +
1991 sldns_buffer_capacity(outnet->udp_buff);
1993 for(pc = outnet->unused_fds; pc; pc = pc->next) {
1996 for(k=0; k<outnet->num_ip4; k++)
1997 s += if_get_mem(&outnet->ip4_ifs[k]);
1998 for(k=0; k<outnet->num_ip6; k++)
1999 s += if_get_mem(&outnet->ip6_ifs[k]);
2000 for(u=outnet->udp_wait_first; u; u=u->next_waiting)
2003 s += sizeof(struct pending_tcp*)*outnet->num_tcp;
2004 for(i=0; i<outnet->num_tcp; i++) {
2006 s += comm_point_get_mem(outnet->tcp_conns[i]->c);
2007 if(outnet->tcp_conns[i]->query)
2008 s += waiting_tcp_get_mem(outnet->tcp_conns[i]->query);
2010 for(w=outnet->tcp_wait_first; w; w = w->next_waiting)
2012 s += sizeof(*outnet->pending);
2014 outnet->pending->count;
2015 s += sizeof(*outnet->serviced);
2016 s += outnet->svcd_overhead;
2017 RBTREE_FOR(sq, struct serviced_query*, outnet->serviced) {