This file has functions to get queries from clients. More...
#include "util/netevent.h"
#include "util/rbtree.h"
#include "util/locks.h"
#include "daemon/acl_list.h"
Data Structures | |
struct | listen_dnsport |
Listening for queries structure. More... | |
struct | listen_list |
Single linked list to store event points. More... | |
struct | unbound_socket |
struct | listen_port |
Single linked list to store shared ports that have been opened for use by all threads. More... | |
struct | tcp_req_info |
TCP request info. More... | |
struct | tcp_req_open_item |
List of open items in TCP channel. More... | |
struct | tcp_req_done_item |
List of done items in TCP channel. More... | |
Enumerations | |
enum | listen_type { listen_type_udp , listen_type_tcp , listen_type_udpancil , listen_type_ssl , listen_type_udp_dnscrypt , listen_type_tcp_dnscrypt , listen_type_udpancil_dnscrypt , listen_type_http , listen_type_doq } |
type of ports More... | |
Functions | |
struct listen_port * | listening_ports_open (struct config_file *cfg, char **ifs, int num_ifs, int *reuseport) |
Create shared listening ports Getaddrinfo, create socket, bind and listen to zero or more interfaces for IP4 and/or IP6, for UDP and/or TCP. More... | |
void | listening_ports_free (struct listen_port *list) |
Close and delete the (list of) listening ports. | |
int | resolve_interface_names (char **ifs, int num_ifs, struct config_strlist *list, char ***resif, int *num_resif) |
Resolve interface names in config and store result IP addresses. More... | |
struct listen_dnsport * | listen_create (struct comm_base *base, struct listen_port *ports, size_t bufsize, int tcp_accept_count, int tcp_idle_timeout, int harden_large_queries, uint32_t http_max_streams, char *http_endpoint, int http_notls, struct tcl_list *tcp_conn_limit, void *sslctx, struct dt_env *dtenv, struct doq_table *doq_table, struct ub_randstate *rnd, const char *ssl_service_key, const char *ssl_service_pem, struct config_file *cfg, comm_point_callback_type *cb, void *cb_arg) |
Create commpoints with for this thread for the shared ports. More... | |
void | listen_delete (struct listen_dnsport *listen) |
delete the listening structure More... | |
void | listen_setup_locks (void) |
setup the locks for the listen ports | |
void | listen_desetup_locks (void) |
desetup the locks for the listen ports | |
void | listen_list_delete (struct listen_list *list) |
delete listen_list of commpoints. More... | |
size_t | listen_get_mem (struct listen_dnsport *listen) |
get memory size used by the listening structs More... | |
void | listen_stop_accept (struct listen_dnsport *listen) |
stop accept handlers for TCP (until enabled again) More... | |
void | listen_start_accept (struct listen_dnsport *listen) |
start accept handlers for TCP (was stopped before) More... | |
int | create_udp_sock (int family, int socktype, struct sockaddr *addr, socklen_t addrlen, int v6only, int *inuse, int *noproto, int rcv, int snd, int listen, int *reuseport, int transparent, int freebind, int use_systemd, int dscp) |
Create and bind nonblocking UDP socket. More... | |
int | create_tcp_accept_sock (struct addrinfo *addr, int v6only, int *noproto, int *reuseport, int transparent, int mss, int nodelay, int freebind, int use_systemd, int dscp, const char *additional) |
Create and bind TCP listening socket. More... | |
int | create_local_accept_sock (const char *path, int *noproto, int use_systemd) |
Create and bind local listening socket. More... | |
struct tcp_req_info * | tcp_req_info_create (struct sldns_buffer *spoolbuf) |
Create tcp request info structure that keeps track of open requests on the TCP channel that are resolved at the same time, and the pending results that have to get written back to that client. More... | |
void | tcp_req_info_delete (struct tcp_req_info *req) |
Delete tcp request structure. More... | |
void | tcp_req_info_clear (struct tcp_req_info *req) |
Clear tcp request structure. More... | |
void | tcp_req_info_remove_mesh_state (struct tcp_req_info *req, struct mesh_state *m) |
Remove mesh state entry from list in tcp_req_info. More... | |
void | tcp_req_info_handle_writedone (struct tcp_req_info *req) |
Handle write done of the last result packet. More... | |
void | tcp_req_info_handle_readdone (struct tcp_req_info *req) |
Handle read done of a new request from the client. More... | |
int | tcp_req_info_add_meshstate (struct tcp_req_info *req, struct mesh_area *mesh, struct mesh_state *m) |
Add mesh state to the tcp req list of open requests. More... | |
void | tcp_req_info_send_reply (struct tcp_req_info *req) |
Send reply on tcp simultaneous answer channel. More... | |
int | tcp_req_info_handle_read_close (struct tcp_req_info *req) |
the read channel has closed More... | |
size_t | tcp_req_info_get_stream_buffer_size (void) |
get the size of currently used tcp stream wait buffers (in bytes) | |
size_t | http2_get_query_buffer_size (void) |
get the size of currently used HTTP2 query buffers (in bytes) | |
size_t | http2_get_response_buffer_size (void) |
get the size of currently used HTTP2 response buffers (in bytes) | |
int | http2_submit_dns_response (void *v) |
char * | set_ip_dscp (int socket, int addrfamily, int ds) |
void | verbose_print_unbound_socket (struct unbound_socket *ub_sock) |
for debug and profiling purposes only More... | |
void | doq_client_event_cb (int fd, short event, void *arg) |
event callback for testcode/doqclient | |
void | doq_client_timer_cb (int fd, short event, void *arg) |
timer event callback for testcode/doqclient | |
This file has functions to get queries from clients.
enum listen_type |
type of ports
struct listen_port* listening_ports_open | ( | struct config_file * | cfg, |
char ** | ifs, | ||
int | num_ifs, | ||
int * | reuseport | ||
) |
Create shared listening ports Getaddrinfo, create socket, bind and listen to zero or more interfaces for IP4 and/or IP6, for UDP and/or TCP.
On the given port number. It creates the sockets.
cfg | settings on what ports to open. |
ifs | interfaces to open, array of IP addresses, "ip[@port]". |
num_ifs | length of ifs. |
reuseport | set to true if you want reuseport, or NULL to not have it, set to false on exit if reuseport failed to apply (because of no kernel support). |
References config_file::dnscrypt_port, config_file::do_ip4, config_file::do_ip6, config_file::do_tcp, config_file::do_udp, config_file::http_nodelay, config_file::http_notls_downstream, config_file::https_port, config_file::if_automatic, config_file::if_automatic_ports, config_file::incoming_num_tcp, config_file::ip_dscp, config_file::ip_freebind, config_file::ip_transparent, listening_ports_free(), log_err(), config_file::port, ports_create_if(), config_file::proxy_protocol_port, config_file::quic_port, config_file::so_rcvbuf, config_file::so_sndbuf, config_file::sock_queue_timeout, config_file::ssl_port, str_is_ip6(), config_file::tcp_mss, config_file::tls_additional_port, and config_file::use_systemd.
Referenced by daemon_open_shared_ports().
int resolve_interface_names | ( | char ** | ifs, |
int | num_ifs, | ||
struct config_strlist * | list, | ||
char *** | resif, | ||
int * | num_resif | ||
) |
Resolve interface names in config and store result IP addresses.
ifs | array of interfaces. The list of interface names, if not NULL. |
num_ifs | length of ifs array. |
list | if not NULL, this is used as the list of interface names. |
resif | string array (malloced array of malloced strings) with result. NULL if cfg has none. |
num_resif | length of resif. Zero if cfg has zero num_ifs. |
References config_del_strarray(), log_err(), config_strlist::next, and config_strlist::str.
Referenced by contact_server(), daemon_open_shared_ports(), daemon_remote_open_ports(), read_acl_interface_tag_actions(), read_acl_interface_tag_datas(), read_acl_interface_tags(), and read_acl_interface_view().
struct listen_dnsport* listen_create | ( | struct comm_base * | base, |
struct listen_port * | ports, | ||
size_t | bufsize, | ||
int | tcp_accept_count, | ||
int | tcp_idle_timeout, | ||
int | harden_large_queries, | ||
uint32_t | http_max_streams, | ||
char * | http_endpoint, | ||
int | http_notls, | ||
struct tcl_list * | tcp_conn_limit, | ||
void * | sslctx, | ||
struct dt_env * | dtenv, | ||
struct doq_table * | doq_table, | ||
struct ub_randstate * | rnd, | ||
const char * | ssl_service_key, | ||
const char * | ssl_service_pem, | ||
struct config_file * | cfg, | ||
comm_point_callback_type * | cb, | ||
void * | cb_arg | ||
) |
Create commpoints with for this thread for the shared ports.
base | the comm_base that provides event functionality. for default all ifs. |
ports | the list of shared ports. |
bufsize | size of datagram buffer. |
tcp_accept_count | max number of simultaneous TCP connections from clients. |
tcp_idle_timeout | idle timeout for TCP connections in msec. |
harden_large_queries | whether query size should be limited. |
http_max_streams | maximum number of HTTP/2 streams per connection. |
http_endpoint | HTTP endpoint to service queries on |
http_notls | no TLS for http downstream |
tcp_conn_limit | TCP connection limit info. |
sslctx | nonNULL if ssl context. |
dtenv | nonNULL if dnstap enabled. |
doq_table | the doq connection table, with shared information. |
rnd | random state. |
ssl_service_key | the SSL service key file. |
ssl_service_pem | the SSL service pem file. |
cfg | config file struct. |
cb | callback function when a request arrives. It is passed the packet and user argument. Return true to send a reply. |
cb_arg | user data argument for callback function. |
References listen_dnsport::cps, listen_port::ftype, listen_type_udp, listen_type_udp_dnscrypt, sldns_buffer_new(), and listen_dnsport::udp_buff.
void listen_delete | ( | struct listen_dnsport * | listen | ) |
delete the listening structure
listen | listening structure. |
References listen_dnsport::cps, listen_list_delete(), sldns_buffer_free(), and listen_dnsport::udp_buff.
Referenced by worker_delete().
void listen_list_delete | ( | struct listen_list * | list | ) |
delete listen_list of commpoints.
Calls commpointdelete() on items. This may close the fds or not depending on flags.
list | to delete. |
References listen_list::com, comm_point_delete(), and listen_list::next.
Referenced by daemon_remote_clear(), and listen_delete().
size_t listen_get_mem | ( | struct listen_dnsport * | listen | ) |
get memory size used by the listening structs
listen | listening structure. |
References listen_dnsport::base, listen_dnsport::cps, listen_list::next, sldns_buffer_capacity(), and listen_dnsport::udp_buff.
void listen_stop_accept | ( | struct listen_dnsport * | listen | ) |
stop accept handlers for TCP (until enabled again)
listen | listening structure. |
References listen_list::com, listen_dnsport::cps, listen_list::next, comm_point::tcp_free, and comm_point::type.
Referenced by worker_stop_accept().
void listen_start_accept | ( | struct listen_dnsport * | listen | ) |
start accept handlers for TCP (was stopped before)
listen | listening structure. |
References listen_list::com, listen_dnsport::cps, listen_list::next, comm_point::tcp_free, and comm_point::type.
Referenced by worker_start_accept().
int create_udp_sock | ( | int | family, |
int | socktype, | ||
struct sockaddr * | addr, | ||
socklen_t | addrlen, | ||
int | v6only, | ||
int * | inuse, | ||
int * | noproto, | ||
int | rcv, | ||
int | snd, | ||
int | listen, | ||
int * | reuseport, | ||
int | transparent, | ||
int | freebind, | ||
int | use_systemd, | ||
int | dscp | ||
) |
Create and bind nonblocking UDP socket.
family | for socket call. |
socktype | for socket call. |
addr | for bind call. |
addrlen | for bind call. |
v6only | if enabled, IP6 sockets get IP6ONLY option set. if enabled with value 2 IP6ONLY option is disabled. |
inuse | on error, this is set true if the port was in use. |
noproto | on error, this is set true if cause is that the IPv6 proto (family) is not available. |
rcv | set size on rcvbuf with socket option, if 0 it is not set. |
snd | set size on sndbuf with socket option, if 0 it is not set. |
listen | if true, this is a listening UDP port, eg port 53, and set SO_REUSEADDR on it. |
reuseport | if nonNULL and true, try to set SO_REUSEPORT on listening UDP port. Set to false on return if it failed to do so. |
transparent | set IP_TRANSPARENT socket option. |
freebind | set IP_FREEBIND socket option. |
use_systemd | if true, fetch sockets from systemd. |
dscp | DSCP to use. |
References log_err(), log_warn(), sock_close(), sock_strerror(), and verbosity.
Referenced by fd_for_dest(), and make_sock().
int create_tcp_accept_sock | ( | struct addrinfo * | addr, |
int | v6only, | ||
int * | noproto, | ||
int * | reuseport, | ||
int | transparent, | ||
int | mss, | ||
int | nodelay, | ||
int | freebind, | ||
int | use_systemd, | ||
int | dscp, | ||
const char * | additional | ||
) |
Create and bind TCP listening socket.
addr | address info ready to make socket. |
v6only | enable ip6 only flag on ip6 sockets. |
noproto | if error caused by lack of protocol support. |
reuseport | if nonNULL and true, try to set SO_REUSEPORT on listening UDP port. Set to false on return if it failed to do so. |
transparent | set IP_TRANSPARENT socket option. |
mss | maximum segment size of the socket. if zero, leaves the default. |
nodelay | if true set TCP_NODELAY and TCP_QUICKACK socket options. |
freebind | set IP_FREEBIND socket option. |
use_systemd | if true, fetch sockets from systemd. |
dscp | DSCP to use. |
additional | additional log information for the socket type. |
References log_err(), log_warn(), sock_close(), sock_strerror(), VERB_ALGO, verbose(), verbose_print_addr(), and verbosity.
Referenced by add_open(), and make_sock().
int create_local_accept_sock | ( | const char * | path, |
int * | noproto, | ||
int | use_systemd | ||
) |
Create and bind local listening socket.
path | path to the socket. |
noproto | on error, this is set true if cause is that local sockets are not supported. |
use_systemd | if true, fetch sockets from systemd. |
References fd_set_nonblock(), log_err(), sock_close(), TCP_BACKLOG, VERB_ALGO, and verbose().
Referenced by add_open(), and tap_socket_setup().
struct tcp_req_info* tcp_req_info_create | ( | struct sldns_buffer * | spoolbuf | ) |
Create tcp request info structure that keeps track of open requests on the TCP channel that are resolved at the same time, and the pending results that have to get written back to that client.
spoolbuf | shared buffer |
References log_err(), and tcp_req_info::spool_buffer.
Referenced by comm_point_create_tcp_handler().
void tcp_req_info_delete | ( | struct tcp_req_info * | req | ) |
Delete tcp request structure.
Called by owning commpoint. Removes mesh entry references and stored results from the lists.
req | the tcp request info |
References tcp_req_info_clear().
Referenced by comm_point_create_tcp_handler(), and comm_point_delete().
void tcp_req_info_clear | ( | struct tcp_req_info * | req | ) |
Clear tcp request structure.
Removes list entries, sets it up ready for the next connection.
req | tcp request info structure. |
References tcp_req_done_item::buf, tcp_req_info::cp, tcp_req_info::done_req_list, tcp_req_done_item::len, tcp_req_open_item::mesh, tcp_req_open_item::mesh_state, mesh_state_remove_reply(), tcp_req_open_item::next, tcp_req_done_item::next, tcp_req_info::num_done_req, tcp_req_info::num_open_req, tcp_req_info::open_req_list, tcp_req_info::read_is_closed, stream_wait_count, and stream_wait_count_lock.
Referenced by comm_point_close(), and tcp_req_info_delete().
void tcp_req_info_remove_mesh_state | ( | struct tcp_req_info * | req, |
struct mesh_state * | m | ||
) |
Remove mesh state entry from list in tcp_req_info.
caller has to manage the mesh state reply entry in the mesh state.
req | the tcp req info that has the entry removed from the list. |
m | the state removed from the list. |
References tcp_req_open_item::mesh_state, tcp_req_open_item::next, tcp_req_info::num_open_req, and tcp_req_info::open_req_list.
void tcp_req_info_handle_writedone | ( | struct tcp_req_info * | req | ) |
Handle write done of the last result packet.
req | the tcp req info. |
References comm_point::buffer, comm_point_drop_reply(), tcp_req_info::cp, tcp_req_info::num_done_req, tcp_req_info::read_is_closed, comm_point::repinfo, sldns_buffer_clear(), comm_point::tcp_is_reading, tcp_req_info_setup_listen(), and tcp_req_pickup_next_result().
Referenced by tcp_callback_writer().
void tcp_req_info_handle_readdone | ( | struct tcp_req_info * | req | ) |
Handle read done of a new request from the client.
req | the tcp req info. |
References comm_point::callback, comm_point::cb_arg, tcp_req_info::cp, fptr_ok, fptr_whitelist_comm_point(), tcp_req_info::in_worker_handle, tcp_req_info::is_drop, tcp_req_info::is_reply, NETEVENT_NOERROR, comm_point::repinfo, sldns_buffer_set_limit(), tcp_req_info::spool_buffer, and comm_point::tcp_is_reading.
Referenced by tcp_callback_reader().
int tcp_req_info_add_meshstate | ( | struct tcp_req_info * | req, |
struct mesh_area * | mesh, | ||
struct mesh_state * | m | ||
) |
Add mesh state to the tcp req list of open requests.
So the comm_reply can be removed off the mesh reply list when the tcp channel has to be closed (for other reasons then that that request was done, eg. channel closed by client or some format error).
req | tcp req info structure. It keeps track of the simultaneous requests and results on a tcp (or TLS) channel. |
mesh | mesh area for the state. |
m | mesh state to add. |
References log_assert, tcp_req_open_item::mesh, tcp_req_open_item::mesh_state, tcp_req_open_item::next, tcp_req_info::num_open_req, and tcp_req_info::open_req_list.
void tcp_req_info_send_reply | ( | struct tcp_req_info * | req | ) |
Send reply on tcp simultaneous answer channel.
May queue it up.
req | request info structure. |
References comm_point::buffer, tcp_req_info::cp, tcp_req_info::in_worker_handle, tcp_req_info::is_reply, sldns_buffer_begin(), sldns_buffer_clear(), sldns_buffer_flip(), sldns_buffer_limit(), sldns_buffer_write(), tcp_req_info::spool_buffer, comm_point::tcp_byte_count, comm_point::tcp_is_reading, and tcp_req_info_start_write_buf().
int tcp_req_info_handle_read_close | ( | struct tcp_req_info * | req | ) |
the read channel has closed
req | request. remaining queries are looked up and answered. |
References tcp_req_info::cp, comm_point::fd, tcp_req_info::num_done_req, tcp_req_info::num_open_req, tcp_req_info::read_is_closed, comm_point::tcp_byte_count, tcp_req_info_setup_listen(), tcp_req_pickup_next_result(), VERB_ALGO, and verbose().
Referenced by comm_point_tcp_handle_read(), and ssl_handle_read().
void verbose_print_unbound_socket | ( | struct unbound_socket * | ub_sock | ) |
for debug and profiling purposes only
ub_sock | the structure containing created socket info we want to print or log for |
References unbound_socket::acl, unbound_socket::addr, addr_to_str(), unbound_socket::addrlen, unbound_socket::fam, log_info(), unbound_socket::s, VERB_ALGO, and verbosity.