Lines Matching full:channel
74 static void write_tcp_data(ares_channel channel, fd_set *write_fds,
76 static void read_tcp_data(ares_channel channel, fd_set *read_fds,
78 static void read_udp_packets(ares_channel channel, fd_set *read_fds,
80 static void advance_tcp_send_queue(ares_channel channel, int whichserver,
82 static void process_timeouts(ares_channel channel, struct timeval *now);
83 static void process_broken_connections(ares_channel channel,
85 static void process_answer(ares_channel channel, unsigned char *abuf,
88 static void handle_error(ares_channel channel, int whichserver,
90 static void skip_server(ares_channel channel, struct query *query,
92 static void next_server(ares_channel channel, struct query *query,
94 static int open_tcp_socket(ares_channel channel, struct server_state *server);
95 static int open_udp_socket(ares_channel channel, struct server_state *server);
99 static void end_query(ares_channel channel, struct query *query, int status,
144 static void processfds(ares_channel channel,
150 write_tcp_data(channel, write_fds, write_fd, &now);
151 read_tcp_data(channel, read_fds, read_fd, &now);
152 read_udp_packets(channel, read_fds, read_fd, &now);
153 process_timeouts(channel, &now);
154 process_broken_connections(channel, &now);
160 void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
162 processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD);
168 void ares_process_fd(ares_channel channel,
173 processfds(channel, NULL, read_fd, NULL, write_fd);
206 static void write_tcp_data(ares_channel channel,
223 for (i = 0; i < channel->nservers; i++)
227 server = &channel->servers[i];
271 handle_error(channel, i, now);
276 advance_tcp_send_queue(channel, i, wcount);
287 handle_error(channel, i, now);
292 advance_tcp_send_queue(channel, i, scount);
298 static void advance_tcp_send_queue(ares_channel channel, int whichserver,
302 struct server_state *server = &channel->servers[whichserver];
312 SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 0);
331 static void read_tcp_data(ares_channel channel, fd_set *read_fds,
342 for (i = 0; i < channel->nservers; i++)
345 server = &channel->servers[i];
377 handle_error(channel, i, now);
391 handle_error(channel, i, now);
404 handle_error(channel, i, now);
414 process_answer(channel, server->tcp_buffer, server->tcp_length,
427 static void read_udp_packets(ares_channel channel, fd_set *read_fds,
447 for (i = 0; i < channel->nservers; i++)
450 server = &channel->servers[i];
488 handle_error(channel, i, now);
497 process_answer(channel, buf, (int)count, i, 0, now);
503 static void process_timeouts(ares_channel channel, struct timeval *now)
516 for (t = channel->last_timeout_processed; t <= now->tv_sec; t++)
518 list_head = &(channel->queries_by_timeout[t % ARES_TIMEOUT_TABLE_SIZE]);
527 next_server(channel, query, now);
531 channel->last_timeout_processed = now->tv_sec;
535 static void process_answer(ares_channel channel, unsigned char *abuf,
563 list_head = &(channel->queries_by_qid[id % ARES_QID_TABLE_SIZE]);
581 if ((tc || alen > PACKETSZ) && !tcp && !(channel->flags & ARES_FLAG_IGNTC))
586 ares__send_query(channel, query, now);
600 if (!(channel->flags & ARES_FLAG_NOCHECKRESP))
604 skip_server(channel, query, whichserver);
606 next_server(channel, query, now);
611 end_query(channel, query, ARES_SUCCESS, abuf, alen);
615 static void process_broken_connections(ares_channel channel,
619 for (i = 0; i < channel->nservers; i++)
621 struct server_state *server = &channel->servers[i];
624 handle_error(channel, i, now);
629 static void handle_error(ares_channel channel, int whichserver,
637 server = &channel->servers[whichserver];
640 ares__close_sockets(channel, server);
656 skip_server(channel, query, whichserver);
657 next_server(channel, query, now);
665 static void skip_server(ares_channel channel, struct query *query,
675 if (channel->nservers > 1)
681 static void next_server(ares_channel channel, struct query *query,
684 /* We need to try each server channel->tries times. We have channel->nservers
685 * servers to try. In total, we need to do channel->nservers * channel->tries
688 while (++(query->try_count) < (channel->nservers * channel->tries))
693 query->server = (query->server + 1) % channel->nservers;
694 server = &channel->servers[query->server];
708 ares__send_query(channel, query, now);
721 end_query(channel, query, query->error_status, NULL, 0);
724 void ares__send_query(ares_channel channel, struct query *query,
731 server = &channel->servers[query->server];
739 if (open_tcp_socket(channel, server) == -1)
741 skip_server(channel, query, query->server);
742 next_server(channel, query, now);
749 end_query(channel, query, ARES_ENOMEM, NULL, 0);
767 SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 1);
778 if (open_udp_socket(channel, server) == -1)
780 skip_server(channel, query, query->server);
781 next_server(channel, query, now);
788 skip_server(channel, query, query->server);
789 next_server(channel, query, now);
793 timeplus = channel->timeout << (query->try_count / channel->nservers);
804 &(channel->queries_by_timeout[query->timeout.tv_sec %
871 static int configure_socket(ares_socket_t s, int family, ares_channel channel)
888 if ((channel->socket_send_buffer_size > 0) &&
890 (void *)&channel->socket_send_buffer_size,
891 sizeof(channel->socket_send_buffer_size)) == -1)
894 if ((channel->socket_receive_buffer_size > 0) &&
896 (void *)&channel->socket_receive_buffer_size,
897 sizeof(channel->socket_receive_buffer_size)) == -1)
901 if (channel->local_dev_name[0]) {
903 channel->local_dev_name, sizeof(channel->local_dev_name))) {
911 if (channel->local_ip4) {
914 local.sa4.sin_addr.s_addr = htonl(channel->local_ip4);
920 if (memcmp(channel->local_ip6, &ares_in6addr_any, sizeof(channel->local_ip6)) != 0) {
923 memcpy(&local.sa6.sin6_addr, channel->local_ip6, sizeof(channel->local_ip6));
932 static int open_tcp_socket(ares_channel channel, struct server_state *server)
950 saddr.sa4.sin_port = (unsigned short)(channel->tcp_port & 0xffff);
959 saddr.sa6.sin6_port = (unsigned short)(channel->tcp_port & 0xffff);
973 if (configure_socket(s, server->addr.family, channel) < 0)
1007 if (channel->sock_create_cb)
1009 int err = channel->sock_create_cb(s, SOCK_STREAM,
1010 channel->sock_create_cb_data);
1018 SOCK_STATE_CALLBACK(channel, s, 1, 0);
1021 server->tcp_connection_generation = ++channel->tcp_connection_generation;
1025 static int open_udp_socket(ares_channel channel, struct server_state *server)
1042 saddr.sa4.sin_port = (unsigned short)(channel->udp_port & 0xffff);
1051 saddr.sa6.sin6_port = (unsigned short)(channel->udp_port & 0xffff);
1065 if (configure_socket(s, server->addr.family, channel) < 0)
1083 if (channel->sock_create_cb)
1085 int err = channel->sock_create_cb(s, SOCK_DGRAM,
1086 channel->sock_create_cb_data);
1094 SOCK_STATE_CALLBACK(channel, s, 1, 0);
1207 static void end_query (ares_channel channel, struct query *query, int status,
1215 for (i = 0; i < channel->nservers; i++)
1217 struct server_state *server = &channel->servers[i];
1273 if (!(channel->flags & ARES_FLAG_STAYOPEN) &&
1274 ares__is_list_empty(&(channel->all_queries)))
1276 for (i = 0; i < channel->nservers; i++)
1277 ares__close_sockets(channel, &channel->servers[i]);