Lines Matching refs:tp
81 setup_ssl(struct xfrd_tcp_pipeline* tp, struct xfrd_tcp_set* tcp_set, in setup_ssl() argument
90 tp->ssl = SSL_new((SSL_CTX*)tcp_set->ssl_ctx); in setup_ssl()
91 if(!tp->ssl) { in setup_ssl()
95 SSL_set_connect_state(tp->ssl); in setup_ssl()
96 (void)SSL_set_mode(tp->ssl, SSL_MODE_AUTO_RETRY); in setup_ssl()
97 if(!SSL_set_fd(tp->ssl, tp->tcp_w->fd)) { in setup_ssl()
99 SSL_free(tp->ssl); in setup_ssl()
100 tp->ssl = NULL; in setup_ssl()
104 SSL_set_verify(tp->ssl, SSL_VERIFY_PEER, tls_verify_callback); in setup_ssl()
105 if(!SSL_set1_host(tp->ssl, auth_domain_name)) { in setup_ssl()
108 SSL_free(tp->ssl); in setup_ssl()
109 tp->ssl = NULL; in setup_ssl()
116 ssl_handshake(struct xfrd_tcp_pipeline* tp) in ssl_handshake() argument
121 ret = SSL_do_handshake(tp->ssl); in ssl_handshake()
124 tp->handshake_done = 1; in ssl_handshake()
127 tp->handshake_want = SSL_get_error(tp->ssl, ret); in ssl_handshake()
128 if(tp->handshake_want == SSL_ERROR_WANT_READ in ssl_handshake()
129 || tp->handshake_want == SSL_ERROR_WANT_WRITE) in ssl_handshake()
247 clear_pipeline_entry(struct xfrd_tcp_pipeline* tp, rbnode_type* node) in clear_pipeline_entry() argument
252 clear_pipeline_entry(tp, node->left); in clear_pipeline_entry()
254 clear_pipeline_entry(tp, node->right); in clear_pipeline_entry()
258 n->next_free = tp->pipe_id_free_list; in clear_pipeline_entry()
259 tp->pipe_id_free_list = n; in clear_pipeline_entry()
263 xfrd_tcp_pipeline_cleanup(struct xfrd_tcp_pipeline* tp) in xfrd_tcp_pipeline_cleanup() argument
266 clear_pipeline_entry(tp, tp->zone_per_id->root); in xfrd_tcp_pipeline_cleanup()
268 tp->zone_per_id->count = 0; in xfrd_tcp_pipeline_cleanup()
269 tp->zone_per_id->root = RBTREE_NULL; in xfrd_tcp_pipeline_cleanup()
273 xfrd_tcp_pipeline_init(struct xfrd_tcp_pipeline* tp) in xfrd_tcp_pipeline_init() argument
275 tp->key.node.key = tp; in xfrd_tcp_pipeline_init()
276 tp->key.num_unused = tp->pipe_num; in xfrd_tcp_pipeline_init()
277 tp->key.num_skip = 0; in xfrd_tcp_pipeline_init()
278 tp->tcp_send_first = NULL; in xfrd_tcp_pipeline_init()
279 tp->tcp_send_last = NULL; in xfrd_tcp_pipeline_init()
280 xfrd_tcp_pipeline_cleanup(tp); in xfrd_tcp_pipeline_init()
281 pick_id_values(tp->unused, tp->pipe_num, 65536); in xfrd_tcp_pipeline_init()
288 struct xfrd_tcp_pipeline* tp = (struct xfrd_tcp_pipeline*) in xfrd_tcp_pipeline_create() local
289 region_alloc_zero(region, sizeof(*tp)); in xfrd_tcp_pipeline_create()
294 tp->pipe_num = tcp_pipeline; in xfrd_tcp_pipeline_create()
295 tp->key.num_unused = tp->pipe_num; in xfrd_tcp_pipeline_create()
296 tp->zone_per_id = rbtree_create(region, &pipeline_id_compare); in xfrd_tcp_pipeline_create()
297 tp->pipe_id_free_list = NULL; in xfrd_tcp_pipeline_create()
298 for(i=0; i<tp->pipe_num; i++) { in xfrd_tcp_pipeline_create()
301 n->next_free = tp->pipe_id_free_list; in xfrd_tcp_pipeline_create()
302 tp->pipe_id_free_list = n; in xfrd_tcp_pipeline_create()
304 tp->unused = (uint16_t*)region_alloc_zero(region, in xfrd_tcp_pipeline_create()
305 sizeof(tp->unused[0])*tp->pipe_num); in xfrd_tcp_pipeline_create()
306 tp->tcp_r = xfrd_tcp_create(region, QIOBUFSZ); in xfrd_tcp_pipeline_create()
307 tp->tcp_w = xfrd_tcp_create(region, 512); in xfrd_tcp_pipeline_create()
308 xfrd_tcp_pipeline_init(tp); in xfrd_tcp_pipeline_create()
309 return tp; in xfrd_tcp_pipeline_create()
313 xfrd_tcp_pipeline_lookup_id(struct xfrd_tcp_pipeline* tp, uint16_t id) in xfrd_tcp_pipeline_lookup_id() argument
320 n = rbtree_search(tp->zone_per_id, &key); in xfrd_tcp_pipeline_lookup_id()
328 xfrd_tcp_pipeline_insert_id(struct xfrd_tcp_pipeline* tp, uint16_t id, in xfrd_tcp_pipeline_insert_id() argument
334 assert(tp->pipe_id_free_list != NULL); in xfrd_tcp_pipeline_insert_id()
336 n = tp->pipe_id_free_list; in xfrd_tcp_pipeline_insert_id()
337 tp->pipe_id_free_list = n->next_free; in xfrd_tcp_pipeline_insert_id()
343 rbtree_insert(tp->zone_per_id, &n->node); in xfrd_tcp_pipeline_insert_id()
347 xfrd_tcp_pipeline_remove_id(struct xfrd_tcp_pipeline* tp, uint16_t id) in xfrd_tcp_pipeline_remove_id() argument
354 node = rbtree_delete(tp->zone_per_id, &key); in xfrd_tcp_pipeline_remove_id()
358 n->next_free = tp->pipe_id_free_list; in xfrd_tcp_pipeline_remove_id()
359 tp->pipe_id_free_list = n; in xfrd_tcp_pipeline_remove_id()
364 xfrd_tcp_pipeline_skip_id(struct xfrd_tcp_pipeline* tp, uint16_t id) in xfrd_tcp_pipeline_skip_id() argument
371 n = rbtree_search(tp->zone_per_id, &key); in xfrd_tcp_pipeline_skip_id()
558 tcp_pipe_sendlist_remove(struct xfrd_tcp_pipeline* tp, xfrd_zone_type* zone) in tcp_pipe_sendlist_remove() argument
563 else tp->tcp_send_first=zone->tcp_send_next; in tcp_pipe_sendlist_remove()
566 else tp->tcp_send_last=zone->tcp_send_prev; in tcp_pipe_sendlist_remove()
573 tcp_pipe_sendlist_popfirst(struct xfrd_tcp_pipeline* tp, xfrd_zone_type* zone) in tcp_pipe_sendlist_popfirst() argument
575 tp->tcp_send_first = zone->tcp_send_next; in tcp_pipe_sendlist_popfirst()
576 if(tp->tcp_send_first) in tcp_pipe_sendlist_popfirst()
577 tp->tcp_send_first->tcp_send_prev = NULL; in tcp_pipe_sendlist_popfirst()
578 else tp->tcp_send_last = NULL; in tcp_pipe_sendlist_popfirst()
584 tcp_pipe_id_remove(struct xfrd_tcp_pipeline* tp, xfrd_zone_type* zone, in tcp_pipe_id_remove() argument
587 assert(tp->key.num_unused < tp->pipe_num && tp->key.num_unused >= 0); in tcp_pipe_id_remove()
589 xfrd_tcp_pipeline_remove_id(tp, zone->query_id); in tcp_pipe_id_remove()
590 tp->unused[tp->key.num_unused] = zone->query_id; in tcp_pipe_id_remove()
592 (void)rbtree_delete(xfrd->tcp_set->pipetree, &tp->key.node); in tcp_pipe_id_remove()
593 tp->key.num_unused++; in tcp_pipe_id_remove()
594 (void)rbtree_insert(xfrd->tcp_set->pipetree, &tp->key.node); in tcp_pipe_id_remove()
599 xfrd_tcp_pipe_stop(struct xfrd_tcp_pipeline* tp) in xfrd_tcp_pipe_stop() argument
603 assert(tp->key.num_unused < tp->pipe_num); /* at least one 'in-use' */ in xfrd_tcp_pipe_stop()
604 assert(tp->pipe_num - tp->key.num_unused > tp->key.num_skip); /* at least one 'nonskip' */ in xfrd_tcp_pipe_stop()
607 RBTREE_FOR(zid, struct xfrd_tcp_pipeline_id*, tp->zone_per_id) { in xfrd_tcp_pipe_stop()
614 tcp_pipe_sendlist_remove(tp, zone); in xfrd_tcp_pipe_stop()
615 tcp_pipe_id_remove(tp, zone, 0); in xfrd_tcp_pipe_stop()
619 xfrd_tcp_pipeline_cleanup(tp); in xfrd_tcp_pipe_stop()
622 xfrd_tcp_pipe_release(xfrd->tcp_set, tp, conn); in xfrd_tcp_pipe_stop()
626 tcp_pipe_reset_timeout(struct xfrd_tcp_pipeline* tp) in tcp_pipe_reset_timeout() argument
628 int fd = tp->handler.ev_fd; in tcp_pipe_reset_timeout()
632 if(tp->handler_added) in tcp_pipe_reset_timeout()
633 event_del(&tp->handler); in tcp_pipe_reset_timeout()
634 memset(&tp->handler, 0, sizeof(tp->handler)); in tcp_pipe_reset_timeout()
635 event_set(&tp->handler, fd, EV_PERSIST|EV_TIMEOUT|EV_READ| in tcp_pipe_reset_timeout()
637 ( tp->ssl in tcp_pipe_reset_timeout()
638 ? ( tp->handshake_done ? ( tp->tcp_send_first ? EV_WRITE : 0 ) in tcp_pipe_reset_timeout()
639 : tp->handshake_want == SSL_ERROR_WANT_WRITE ? EV_WRITE : 0 ) in tcp_pipe_reset_timeout()
640 : tp->tcp_send_first ? EV_WRITE : 0 ), in tcp_pipe_reset_timeout()
642 ( tp->tcp_send_first ? EV_WRITE : 0 ), in tcp_pipe_reset_timeout()
644 xfrd_handle_tcp_pipe, tp); in tcp_pipe_reset_timeout()
645 if(event_base_set(xfrd->event_base, &tp->handler) != 0) in tcp_pipe_reset_timeout()
647 if(event_add(&tp->handler, &tv) != 0) in tcp_pipe_reset_timeout()
649 tp->handler_added = 1; in tcp_pipe_reset_timeout()
656 struct xfrd_tcp_pipeline* tp = (struct xfrd_tcp_pipeline*)arg; in xfrd_handle_tcp_pipe() local
658 tcp_pipe_reset_timeout(tp); in xfrd_handle_tcp_pipe()
659 if(tp->tcp_send_first) { in xfrd_handle_tcp_pipe()
661 tp->tcp_send_first->apex_str)); in xfrd_handle_tcp_pipe()
662 xfrd_tcp_write(tp, tp->tcp_send_first); in xfrd_handle_tcp_pipe()
665 if((event & EV_READ) && tp->handler_added) { in xfrd_handle_tcp_pipe()
667 tcp_pipe_reset_timeout(tp); in xfrd_handle_tcp_pipe()
668 xfrd_tcp_read(tp); in xfrd_handle_tcp_pipe()
670 if((event & EV_TIMEOUT) && tp->handler_added) { in xfrd_handle_tcp_pipe()
673 xfrd_tcp_pipe_stop(tp); in xfrd_handle_tcp_pipe()
679 pipeline_setup_new_zone(struct xfrd_tcp_set* set, struct xfrd_tcp_pipeline* tp, in pipeline_setup_new_zone() argument
684 assert(tp->key.num_unused > 0); in pipeline_setup_new_zone()
686 idx = random_generate(tp->key.num_unused); in pipeline_setup_new_zone()
687 zone->query_id = tp->unused[idx]; in pipeline_setup_new_zone()
688 tp->unused[idx] = tp->unused[tp->key.num_unused-1]; in pipeline_setup_new_zone()
689 xfrd_tcp_pipeline_insert_id(tp, zone->query_id, zone); in pipeline_setup_new_zone()
691 (void)rbtree_delete(set->pipetree, &tp->key.node); in pipeline_setup_new_zone()
692 tp->key.num_unused--; in pipeline_setup_new_zone()
693 (void)rbtree_insert(set->pipetree, &tp->key.node); in pipeline_setup_new_zone()
697 zone->tcp_send_prev = tp->tcp_send_last; in pipeline_setup_new_zone()
699 if(tp->tcp_send_last) in pipeline_setup_new_zone()
700 tp->tcp_send_last->tcp_send_next = zone; in pipeline_setup_new_zone()
701 else tp->tcp_send_first = zone; in pipeline_setup_new_zone()
702 tp->tcp_send_last = zone; in pipeline_setup_new_zone()
705 if(tp->tcp_send_first == zone) { in pipeline_setup_new_zone()
706 xfrd_tcp_setup_write_packet(tp, zone); in pipeline_setup_new_zone()
708 tcp_pipe_reset_timeout(tp); in pipeline_setup_new_zone()
715 struct xfrd_tcp_pipeline* tp; in xfrd_tcp_obtain() local
735 tp = set->tcp_state[zone->tcp_conn]; in xfrd_tcp_obtain()
742 if(!xfrd_tcp_open(set, tp, zone)) { in xfrd_tcp_obtain()
749 xfrd_tcp_pipeline_init(tp); in xfrd_tcp_obtain()
752 (void)rbtree_insert(set->pipetree, &tp->key.node); in xfrd_tcp_obtain()
755 pipeline_setup_new_zone(set, tp, zone); in xfrd_tcp_obtain()
759 if((tp = pipeline_find(set, zone))!= NULL) { in xfrd_tcp_obtain()
764 if(set->tcp_state[i] == tp) in xfrd_tcp_obtain()
769 pipeline_setup_new_zone(set, tp, zone); in xfrd_tcp_obtain()
791 xfrd_tcp_open(struct xfrd_tcp_set* set, struct xfrd_tcp_pipeline* tp, in xfrd_tcp_open() argument
807 tp->tcp_r->is_reading = 1; in xfrd_tcp_open()
808 tp->tcp_r->total_bytes = 0; in xfrd_tcp_open()
809 tp->tcp_r->msglen = 0; in xfrd_tcp_open()
810 buffer_clear(tp->tcp_r->packet); in xfrd_tcp_open()
811 tp->tcp_w->is_reading = 0; in xfrd_tcp_open()
812 tp->tcp_w->total_bytes = 0; in xfrd_tcp_open()
813 tp->tcp_w->msglen = 0; in xfrd_tcp_open()
814 tp->connection_established = 0; in xfrd_tcp_open()
856 tp->key.ip_len = xfrd_acl_sockaddr_to(zone->master, &tp->key.ip); in xfrd_tcp_open()
866 conn = connect(fd, (struct sockaddr*)&tp->key.ip, tp->key.ip_len); in xfrd_tcp_open()
874 tp->tcp_r->fd = fd; in xfrd_tcp_open()
875 tp->tcp_w->fd = fd; in xfrd_tcp_open()
882 if (!setup_ssl(tp, set, zone->master->tls_auth_options->auth_domain_name)) { in xfrd_tcp_open()
908 tp->handshake_done = 0; in xfrd_tcp_open()
909 if(!ssl_handshake(tp)) { in xfrd_tcp_open()
910 if(tp->handshake_want == SSL_ERROR_SYSCALL) { in xfrd_tcp_open()
916 } else if(tp->handshake_want == SSL_ERROR_SSL) { in xfrd_tcp_open()
927 tp->handshake_want); in xfrd_tcp_open()
944 if(tp->handler_added) in xfrd_tcp_open()
945 event_del(&tp->handler); in xfrd_tcp_open()
946 memset(&tp->handler, 0, sizeof(tp->handler)); in xfrd_tcp_open()
947 event_set(&tp->handler, fd, EV_PERSIST|EV_TIMEOUT|EV_READ| in xfrd_tcp_open()
949 ( !tp->ssl in xfrd_tcp_open()
950 || tp->handshake_done in xfrd_tcp_open()
951 || tp->handshake_want == SSL_ERROR_WANT_WRITE ? EV_WRITE : 0), in xfrd_tcp_open()
955 xfrd_handle_tcp_pipe, tp); in xfrd_tcp_open()
956 if(event_base_set(xfrd->event_base, &tp->handler) != 0) in xfrd_tcp_open()
960 if(event_add(&tp->handler, &tv) != 0) in xfrd_tcp_open()
962 tp->handler_added = 1; in xfrd_tcp_open()
967 xfrd_tcp_setup_write_packet(struct xfrd_tcp_pipeline* tp, xfrd_zone_type* zone) in xfrd_tcp_setup_write_packet() argument
969 struct xfrd_tcp* tcp = tp->tcp_w; in xfrd_tcp_setup_write_packet()
1158 xfrd_tcp_write(struct xfrd_tcp_pipeline* tp, xfrd_zone_type* zone) in xfrd_tcp_write() argument
1161 struct xfrd_tcp* tcp = tp->tcp_w; in xfrd_tcp_write()
1163 assert(zone == tp->tcp_send_first); in xfrd_tcp_write()
1165 if(!tp->connection_established) { in xfrd_tcp_write()
1179 xfrd_tcp_pipe_stop(tp); in xfrd_tcp_write()
1184 if (tp->ssl) { in xfrd_tcp_write()
1185 if(tp->handshake_done) { in xfrd_tcp_write()
1186 ret = conn_write_ssl(tcp, tp->ssl); in xfrd_tcp_write()
1188 } else if(ssl_handshake(tp)) { in xfrd_tcp_write()
1189 tcp_pipe_reset_timeout(tp); /* reschedule */ in xfrd_tcp_write()
1193 if(tp->handshake_want == SSL_ERROR_SYSCALL) { in xfrd_tcp_write()
1197 } else if(tp->handshake_want == SSL_ERROR_SSL) { in xfrd_tcp_write()
1201 "with value: %d", tp->handshake_want); in xfrd_tcp_write()
1203 xfrd_tcp_pipe_stop(tp); in xfrd_tcp_write()
1211 xfrd_tcp_pipe_stop(tp); in xfrd_tcp_write()
1214 if(tcp->total_bytes != 0 && !tp->connection_established) in xfrd_tcp_write()
1215 tp->connection_established = 1; in xfrd_tcp_write()
1222 tcp_pipe_sendlist_popfirst(tp, zone); in xfrd_tcp_write()
1226 while(tp->tcp_send_first) { in xfrd_tcp_write()
1228 xfrd_tcp_setup_write_packet(tp, tp->tcp_send_first); in xfrd_tcp_write()
1231 if (tp->ssl) in xfrd_tcp_write()
1232 ret = conn_write_ssl(tcp, tp->ssl); in xfrd_tcp_write()
1238 xfrd_tcp_pipe_stop(tp); in xfrd_tcp_write()
1243 tcp_pipe_sendlist_popfirst(tp, tp->tcp_send_first); in xfrd_tcp_write()
1249 assert(tp->tcp_send_first == NULL); in xfrd_tcp_write()
1250 tcp_pipe_reset_timeout(tp); in xfrd_tcp_write()
1438 xfrd_tcp_read(struct xfrd_tcp_pipeline* tp) in xfrd_tcp_read() argument
1441 struct xfrd_tcp* tcp = tp->tcp_r; in xfrd_tcp_read()
1445 if(tp->ssl) { in xfrd_tcp_read()
1446 if(tp->handshake_done) { in xfrd_tcp_read()
1447 ret = conn_read_ssl(tcp, tp->ssl); in xfrd_tcp_read()
1449 } else if(ssl_handshake(tp)) { in xfrd_tcp_read()
1450 tcp_pipe_reset_timeout(tp); /* reschedule */ in xfrd_tcp_read()
1454 if(tp->handshake_want == SSL_ERROR_SYSCALL) { in xfrd_tcp_read()
1458 } else if(tp->handshake_want == SSL_ERROR_SSL) { in xfrd_tcp_read()
1462 "with value: %d", tp->handshake_want); in xfrd_tcp_read()
1464 xfrd_tcp_pipe_stop(tp); in xfrd_tcp_read()
1475 xfrd_tcp_pipe_stop(tp); in xfrd_tcp_read()
1490 zone = xfrd_tcp_pipeline_lookup_id(tp, ID(tcp->packet)); in xfrd_tcp_read()
1511 xfrd_tcp_pipeline_skip_id(tp, zone->query_id); in xfrd_tcp_read()
1512 tp->key.num_skip++; in xfrd_tcp_read()
1534 xfrd_tcp_pipeline_skip_id(tp, zone->query_id); in xfrd_tcp_read()
1535 tp->key.num_skip++; in xfrd_tcp_read()
1547 struct xfrd_tcp_pipeline* tp = set->tcp_state[conn]; in xfrd_tcp_release() local
1556 tcp_pipe_sendlist_remove(tp, zone); in xfrd_tcp_release()
1558 if(xfrd_tcp_pipeline_lookup_id(tp, zone->query_id) != TCP_NULL_SKIP) in xfrd_tcp_release()
1559 tcp_pipe_id_remove(tp, zone, 1); in xfrd_tcp_release()
1561 tp->key.num_unused)); in xfrd_tcp_release()
1564 if(tp->key.num_unused == 1 && set->tcp_waiting_first) { in xfrd_tcp_release()
1572 if(to_len == tp->key.ip_len && memcmp(&to, &tp->key.ip, to_len) == 0) { in xfrd_tcp_release()
1581 pipeline_setup_new_zone(set, tp, zone); in xfrd_tcp_release()
1588 if(tp->key.num_unused >= tp->pipe_num || tp->key.num_skip >= tp->pipe_num - tp->key.num_unused) in xfrd_tcp_release()
1589 xfrd_tcp_pipe_release(set, tp, conn); in xfrd_tcp_release()
1593 xfrd_tcp_pipe_release(struct xfrd_tcp_set* set, struct xfrd_tcp_pipeline* tp, in xfrd_tcp_pipe_release() argument
1598 if(tp->handler_added) in xfrd_tcp_pipe_release()
1599 event_del(&tp->handler); in xfrd_tcp_pipe_release()
1600 tp->handler_added = 0; in xfrd_tcp_pipe_release()
1604 if (tp->ssl) { in xfrd_tcp_pipe_release()
1606 SSL_shutdown(tp->ssl); in xfrd_tcp_pipe_release()
1607 SSL_free(tp->ssl); in xfrd_tcp_pipe_release()
1608 tp->ssl = NULL; in xfrd_tcp_pipe_release()
1613 if(tp->tcp_r->fd != -1) in xfrd_tcp_pipe_release()
1614 close(tp->tcp_r->fd); in xfrd_tcp_pipe_release()
1615 tp->tcp_r->fd = -1; in xfrd_tcp_pipe_release()
1616 tp->tcp_w->fd = -1; in xfrd_tcp_pipe_release()
1619 (void)rbtree_delete(xfrd->tcp_set->pipetree, &tp->key.node); in xfrd_tcp_pipe_release()
1635 if(!xfrd_tcp_open(set, tp, zone)) { in xfrd_tcp_pipe_release()
1643 xfrd_tcp_pipeline_init(tp); in xfrd_tcp_pipe_release()
1646 (void)rbtree_insert(set->pipetree, &tp->key.node); in xfrd_tcp_pipe_release()
1649 pipeline_setup_new_zone(set, tp, zone); in xfrd_tcp_pipe_release()