Lines Matching defs:w
192 * @param w: to delete.
195 waiting_tcp_delete(struct waiting_tcp* w)
197 if(!w) return;
198 if(w->timer)
199 comm_timer_delete(w->timer);
200 free(w);
208 * @param w: tcp structure with destination address.
213 pick_outgoing_tcp(struct pending_tcp* pend, struct waiting_tcp* w, int s)
219 if(addr_is_ip6(&w->addr, w->addrlen))
220 num = w->outnet->num_ip6;
223 num = w->outnet->num_ip4;
226 log_addr(VERB_OPS, "for addr", &w->addr, w->addrlen);
231 if(addr_is_ip6(&w->addr, w->addrlen))
232 pi = &w->outnet->ip6_ifs[ub_random_max(w->outnet->rnd, num)];
235 pi = &w->outnet->ip4_ifs[ub_random_max(w->outnet->rnd, num)];
374 struct waiting_tcp* w = reuse->write_wait_first;
375 if(!w)
377 log_assert(w->write_wait_queued);
378 log_assert(!w->write_wait_prev);
379 reuse->write_wait_first = w->write_wait_next;
380 if(w->write_wait_next)
381 w->write_wait_next->write_wait_prev = NULL;
383 w->write_wait_queued = 0;
384 w->write_wait_next = NULL;
385 w->write_wait_prev = NULL;
386 return w;
391 reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w)
393 log_assert(w);
394 log_assert(w->write_wait_queued);
395 if(!w)
397 if(!w->write_wait_queued)
399 if(w->write_wait_prev)
400 w->write_wait_prev->write_wait_next = w->write_wait_next;
401 else reuse->write_wait_first = w->write_wait_next;
402 log_assert(!w->write_wait_prev ||
403 w->write_wait_prev->write_wait_next != w->write_wait_prev);
404 if(w->write_wait_next)
405 w->write_wait_next->write_wait_prev = w->write_wait_prev;
406 else reuse->write_wait_last = w->write_wait_prev;
407 log_assert(!w->write_wait_next
408 || w->write_wait_next->write_wait_prev != w->write_wait_next);
409 w->write_wait_queued = 0;
410 w->write_wait_next = NULL;
411 w->write_wait_prev = NULL;
416 reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w)
418 if(!w) return;
419 log_assert(!w->write_wait_queued);
421 reuse->write_wait_last->write_wait_next = w;
424 w->write_wait_prev = reuse->write_wait_last;
426 reuse->write_wait_first = w;
427 w->write_wait_prev = NULL;
429 w->write_wait_next = NULL;
430 reuse->write_wait_last = w;
431 w->write_wait_queued = 1;
436 reuse_tree_by_id_insert(struct reuse_tcp* reuse, struct waiting_tcp* w)
441 log_assert(w->id_node.key == NULL);
442 w->id_node.key = w;
448 rbtree_insert(&reuse->tree_by_id, &w->id_node);
470 struct waiting_tcp* w = (struct waiting_tcp*)node->key;
471 return w->id;
605 struct waiting_tcp* w)
610 (int)w->pkt_len, w->timeout);
611 pend->c->tcp_write_pkt = w->pkt;
612 pend->c->tcp_write_pkt_len = w->pkt_len;
621 tv.tv_sec = w->timeout/1000;
622 tv.tv_usec = (w->timeout%1000)*1000;
627 comm_timer_set(w->timer, &tv);
632 outnet_tcp_take_into_use(struct waiting_tcp* w)
634 struct pending_tcp* pend = w->outnet->tcp_free;
637 log_assert(w->pkt);
638 log_assert(w->pkt_len > 0);
639 log_assert(w->addrlen > 0);
646 if (w->ssl_upstream && !w->outnet->sslctx) {
652 s = outnet_get_tcp_fd(&w->addr, w->addrlen, w->outnet->tcp_mss, w->outnet->ip_dscp);
657 if(!pick_outgoing_tcp(pend, w, s))
665 struct sockaddr_in *addr_in = (struct sockaddr_in *)&w->addr;
666 addr_in->sin_len = w->addrlen;
671 endpoints.sae_dstaddr = (struct sockaddr *)&w->addr;
672 endpoints.sae_dstaddrlen = w->addrlen;
682 if(connect(s, (struct sockaddr*)&w->addr, w->addrlen) == -1) {
689 if (w->outnet->sslctx && w->ssl_upstream) {
690 if(connect(s, (struct sockaddr*)&w->addr, w->addrlen) == -1) {
692 if(connect(s, (struct sockaddr*)&w->addr, w->addrlen) == -1) {
702 (struct sockaddr*)&w->addr, w->addrlen))
704 strerror(errno), &w->addr, w->addrlen);
721 if(w->outnet->sslctx && w->ssl_upstream) {
722 pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s);
729 (w->tls_auth_name?w->tls_auth_name:"an unauthenticated connection"));
734 if(!set_auth_name_on_ssl(pend->c->ssl, w->tls_auth_name,
735 w->outnet->tls_use_sni)) {
745 w->next_waiting = (void*)pend;
746 w->outnet->num_tcp_outgoing++;
747 w->outnet->tcp_free = pend->next_free;
749 pend->query = w;
750 pend->reuse.outnet = w->outnet;
751 pend->c->repinfo.remote_addrlen = w->addrlen;
756 memcpy(&pend->c->repinfo.remote_addr, &w->addr, w->addrlen);
764 reuse_tcp_remove_tree_list(w->outnet, &pend->reuse);
770 (void)reuse_tcp_insert(w->outnet, pend);
771 reuse_tree_by_id_insert(&pend->reuse, w);
772 outnet_tcp_take_query_setup(s, pend, w);
842 outnet_waiting_tcp_list_remove(struct outside_network* outnet, struct waiting_tcp* w)
845 w->on_tcp_waiting_list = 0;
847 if(p == w) {
848 /* remove w */
850 prev->next_waiting = w->next_waiting;
851 else outnet->tcp_wait_first = w->next_waiting;
852 if(outnet->tcp_wait_last == w)
854 w->next_waiting = NULL;
869 struct waiting_tcp* w = outnet->tcp_wait_first;
871 log_assert(w->on_tcp_waiting_list);
872 outnet->tcp_wait_first = w->next_waiting;
873 if(outnet->tcp_wait_last == w)
875 w->on_tcp_waiting_list = 0;
876 w->next_waiting = NULL;
877 return w;
883 struct waiting_tcp* w, int set_timer)
886 log_assert(!w->on_tcp_waiting_list);
887 if(w->on_tcp_waiting_list)
889 w->next_waiting = NULL;
891 outnet->tcp_wait_last->next_waiting = w;
892 else outnet->tcp_wait_first = w;
893 outnet->tcp_wait_last = w;
894 w->on_tcp_waiting_list = 1;
897 tv.tv_sec = w->timeout/1000;
898 tv.tv_usec = (w->timeout%1000)*1000;
900 comm_timer_set(w->timer, &tv);
907 struct waiting_tcp* w, int reset_timer)
910 log_assert(!w->on_tcp_waiting_list);
911 if(w->on_tcp_waiting_list)
913 w->next_waiting = outnet->tcp_wait_first;
914 log_assert(w->next_waiting != w);
916 outnet->tcp_wait_last = w;
917 outnet->tcp_wait_first = w;
918 w->on_tcp_waiting_list = 1;
921 tv.tv_sec = w->timeout/1000;
922 tv.tv_usec = (w->timeout%1000)*1000;
924 comm_timer_set(w->timer, &tv);
933 waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error,
936 if(w && w->cb) {
937 fptr_ok(fptr_whitelist_pending_tcp(w->cb));
938 (void)(*w->cb)(c, w->cb_arg, error, reply_info);
946 struct waiting_tcp* w;
952 w = outnet_waiting_tcp_list_pop(outnet);
956 reuse = reuse_tcp_find(outnet, &w->addr, w->addrlen,
957 w->ssl_upstream);
959 w->id = tcp_select_id(outnet, reuse);
960 LDNS_ID_SET(w->pkt, w->id);
968 comm_timer_disable(w->timer);
969 w->next_waiting = (void*)reuse->pending;
970 reuse_tree_by_id_insert(reuse, w);
973 reuse_write_wait_push_back(reuse, w);
978 reuse->pending->query = w;
981 w);
984 struct pending_tcp* pend = w->outnet->tcp_free;
987 memcpy(&pend->reuse.addr, &w->addr, w->addrlen);
988 pend->reuse.addrlen = w->addrlen;
989 if(!outnet_tcp_take_into_use(w)) {
990 waiting_tcp_callback(w, NULL, NETEVENT_CLOSED,
992 waiting_tcp_delete(w);
994 w = NULL;
1002 outnet_waiting_tcp_list_add_first(outnet, w, 0);
1006 if(outnet->dtenv && pend_tcp && w && w->sq &&
1010 sldns_buffer_init_frm_data(&tmp, w->pkt, w->pkt_len);
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);
1021 reuse_tree_by_id_delete(struct reuse_tcp* reuse, struct waiting_tcp* w)
1026 log_assert(w->id_node.key != NULL);
1032 rbtree_delete(&reuse->tree_by_id, w);
1034 w->id_node.key = NULL;
1048 struct waiting_tcp* w;
1068 w = pend->query;
1074 w->error_count ++;
1075 reuse_tree_by_id_delete(&pend->reuse, w);
1076 outnet_waiting_tcp_list_add(outnet, w, 1);
1078 while((w = reuse_write_wait_pop(&pend->reuse)) != NULL) {
1079 if(verbosity >= VERB_CLIENT && w->pkt_len > 12+2+2 &&
1080 LDNS_QDCOUNT(w->pkt) > 0 &&
1081 dname_valid(w->pkt+12, w->pkt_len-12)) {
1083 dname_str(w->pkt+12, buf);
1086 reuse_tree_by_id_delete(&pend->reuse, w);
1087 outnet_waiting_tcp_list_add(outnet, w, 1);
1156 struct waiting_tcp* w = (struct waiting_tcp*)node->key;
1157 waiting_tcp_delete(w);
1215 struct waiting_tcp* w = (struct waiting_tcp*)node->key;
1216 waiting_tcp_callback(w, NULL, err, NULL);
1225 struct waiting_tcp* w = (struct waiting_tcp*)node->key;
1229 w->in_cb_and_decommission = 1;
1233 if(w->cb)
1234 ((struct serviced_query*)w->cb_arg)->to_be_deleted = 1;
1285 struct waiting_tcp* w = NULL;
1351 w = reuse_tcp_by_id_find(&pend->reuse, id);
1356 if(w && (w->on_tcp_waiting_list || w->write_wait_queued))
1357 w = NULL;
1360 if(error == NETEVENT_NOERROR && !w) {
1374 if(w) {
1375 log_assert(!w->on_tcp_waiting_list);
1376 log_assert(!w->write_wait_queued);
1377 reuse_tree_by_id_delete(&pend->reuse, w);
1380 waiting_tcp_callback(w, c, error, reply_info);
1381 waiting_tcp_delete(w);
2311 struct waiting_tcp* w = (struct waiting_tcp*)arg;
2312 struct outside_network* outnet = w->outnet;
2314 if(w->on_tcp_waiting_list) {
2316 outnet_waiting_tcp_list_remove(outnet, w);
2317 waiting_tcp_callback(w, NULL, NETEVENT_TIMEOUT, NULL);
2318 waiting_tcp_delete(w);
2321 struct pending_tcp* pend=(struct pending_tcp*)w->next_waiting;
2424 struct waiting_tcp* w;
2455 w = (struct waiting_tcp*)malloc(sizeof(struct waiting_tcp)
2457 if(!w) {
2460 if(!(w->timer = comm_timer_create(sq->outnet->base, outnet_tcptimer, w))) {
2461 free(w);
2464 w->pkt = (uint8_t*)w + sizeof(struct waiting_tcp);
2465 w->pkt_len = sldns_buffer_limit(packet);
2466 memmove(w->pkt, sldns_buffer_begin(packet), w->pkt_len);
2467 w->id = tcp_select_id(sq->outnet, reuse);
2468 LDNS_ID_SET(w->pkt, w->id);
2469 memcpy(&w->addr, &sq->addr, sq->addrlen);
2470 w->addrlen = sq->addrlen;
2471 w->outnet = sq->outnet;
2472 w->on_tcp_waiting_list = 0;
2473 w->next_waiting = NULL;
2474 w->cb = callback;
2475 w->cb_arg = callback_arg;
2476 w->ssl_upstream = sq->ssl_upstream;
2477 w->tls_auth_name = sq->tls_auth_name;
2478 w->timeout = timeout;
2479 w->id_node.key = NULL;
2480 w->write_wait_prev = NULL;
2481 w->write_wait_next = NULL;
2482 w->write_wait_queued = 0;
2483 w->error_count = 0;
2485 w->sq = NULL;
2487 w->in_cb_and_decommission = 0;
2495 w->next_waiting = (void*)pend;
2496 reuse_tree_by_id_insert(&pend->reuse, w);
2502 pend->query = w;
2504 w);
2508 reuse_write_wait_push_back(&pend->reuse, w);
2518 if(!outnet_tcp_take_into_use(w)) {
2519 waiting_tcp_delete(w);
2527 /* use w->pkt, because it has the ID value */
2529 sldns_buffer_init_frm_data(&tmp, w->pkt, w->pkt_len);
2541 w->sq = sq;
2543 outnet_waiting_tcp_list_add(sq->outnet, w, 1);
2545 return w;
2694 reuse_tcp_remove_serviced_keep(struct waiting_tcp* w,
2697 struct pending_tcp* pend_tcp = (struct pending_tcp*)w->next_waiting;
2703 w->cb = NULL;
2753 struct waiting_tcp* w = (struct waiting_tcp*)
2756 log_assert(!(w->write_wait_queued && w->on_tcp_waiting_list));
2759 if(w->write_wait_queued) {
2761 (struct pending_tcp*)w->next_waiting;
2763 if(!w->in_cb_and_decommission)
2764 reuse_tree_by_id_delete(&pend->reuse, w);
2765 reuse_write_wait_remove(&pend->reuse, w);
2766 if(!w->in_cb_and_decommission)
2767 waiting_tcp_delete(w);
2768 } else if(!w->on_tcp_waiting_list) {
2770 (struct pending_tcp*)w->next_waiting;
2772 /* w needs to stay on tree_by_id to not assign
2775 w->cb = NULL;
2776 if(!reuse_tcp_remove_serviced_keep(w, sq)) {
2777 if(!w->in_cb_and_decommission)
2785 outnet_waiting_tcp_list_remove(sq->outnet, w);
2786 if(!w->in_cb_and_decommission)
2787 waiting_tcp_delete(w);
3079 struct waiting_tcp* w = (struct waiting_tcp*)sq->pending;
3082 if(w && !w->on_tcp_waiting_list && w->next_waiting) {
3083 pend_tcp = (struct pending_tcp*)w->next_waiting;
3838 waiting_tcp_get_mem(struct waiting_tcp* w)
3841 if(!w) return 0;
3842 s = sizeof(*w) + w->pkt_len;
3843 if(w->timer)
3844 s += comm_timer_get_mem(w->timer);
3867 waiting_udp_get_mem(struct pending* w)
3870 s = sizeof(*w) + comm_timer_get_mem(w->timer) + w->pkt_len;
3878 struct waiting_tcp* w;
3904 for(w=outnet->tcp_wait_first; w; w = w->next_waiting)
3905 s += waiting_tcp_get_mem(w);