1b7579f77SDag-Erling Smørgrav /* 2b7579f77SDag-Erling Smørgrav * util/netevent.h - event notification 3b7579f77SDag-Erling Smørgrav * 4b7579f77SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5b7579f77SDag-Erling Smørgrav * 6b7579f77SDag-Erling Smørgrav * This software is open source. 7b7579f77SDag-Erling Smørgrav * 8b7579f77SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9b7579f77SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10b7579f77SDag-Erling Smørgrav * are met: 11b7579f77SDag-Erling Smørgrav * 12b7579f77SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14b7579f77SDag-Erling Smørgrav * 15b7579f77SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17b7579f77SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18b7579f77SDag-Erling Smørgrav * 19b7579f77SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20b7579f77SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21b7579f77SDag-Erling Smørgrav * specific prior written permission. 22b7579f77SDag-Erling Smørgrav * 23b7579f77SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2417d15b25SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2517d15b25SDag-Erling Smørgrav * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2617d15b25SDag-Erling Smørgrav * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2717d15b25SDag-Erling Smørgrav * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2817d15b25SDag-Erling Smørgrav * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2917d15b25SDag-Erling Smørgrav * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 3017d15b25SDag-Erling Smørgrav * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3117d15b25SDag-Erling Smørgrav * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3217d15b25SDag-Erling Smørgrav * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3317d15b25SDag-Erling Smørgrav * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34b7579f77SDag-Erling Smørgrav */ 35b7579f77SDag-Erling Smørgrav 36b7579f77SDag-Erling Smørgrav /** 37b7579f77SDag-Erling Smørgrav * \file 38b7579f77SDag-Erling Smørgrav * 39b7579f77SDag-Erling Smørgrav * This file contains event notification functions. 40b7579f77SDag-Erling Smørgrav * 41b7579f77SDag-Erling Smørgrav * There are three types of communication points 42b7579f77SDag-Erling Smørgrav * o UDP socket - perthread buffer. 43b7579f77SDag-Erling Smørgrav * o TCP-accept socket - array of TCP-sockets, socketcount. 44b7579f77SDag-Erling Smørgrav * o TCP socket - own buffer, parent-TCPaccept, read/write state, 45b7579f77SDag-Erling Smørgrav * number of bytes read/written, timeout. 46b7579f77SDag-Erling Smørgrav * 47b7579f77SDag-Erling Smørgrav * There are sockets aimed towards our clients and towards the internet. 48b7579f77SDag-Erling Smørgrav * o frontside - aimed towards our clients, queries come in, answers back. 49b7579f77SDag-Erling Smørgrav * o behind - aimed towards internet, to the authoritative DNS servers. 50b7579f77SDag-Erling Smørgrav * 51b7579f77SDag-Erling Smørgrav * Several event types are available: 52b7579f77SDag-Erling Smørgrav * o comm_base - for thread safety of the comm points, one per thread. 53b7579f77SDag-Erling Smørgrav * o comm_point - udp and tcp networking, with callbacks. 54b7579f77SDag-Erling Smørgrav * o comm_timer - a timeout with callback. 55b7579f77SDag-Erling Smørgrav * o comm_signal - callbacks when signal is caught. 56b7579f77SDag-Erling Smørgrav * o comm_reply - holds reply info during networking callback. 57b7579f77SDag-Erling Smørgrav * 58b7579f77SDag-Erling Smørgrav */ 59b7579f77SDag-Erling Smørgrav 60b7579f77SDag-Erling Smørgrav #ifndef NET_EVENT_H 61b7579f77SDag-Erling Smørgrav #define NET_EVENT_H 62b7579f77SDag-Erling Smørgrav 6365b390aaSDag-Erling Smørgrav #include "dnscrypt/dnscrypt.h" 6465b390aaSDag-Erling Smørgrav 6517d15b25SDag-Erling Smørgrav struct sldns_buffer; 66b7579f77SDag-Erling Smørgrav struct comm_point; 67b7579f77SDag-Erling Smørgrav struct comm_reply; 68*4c75e3aaSDag-Erling Smørgrav struct tcl_list; 69e2d15004SDag-Erling Smørgrav struct ub_event_base; 70b7579f77SDag-Erling Smørgrav 71b7579f77SDag-Erling Smørgrav /* internal event notification data storage structure. */ 72b7579f77SDag-Erling Smørgrav struct internal_event; 73b7579f77SDag-Erling Smørgrav struct internal_base; 74e2d15004SDag-Erling Smørgrav struct internal_timer; /* A sub struct of the comm_timer super struct */ 75b7579f77SDag-Erling Smørgrav 76b7579f77SDag-Erling Smørgrav /** callback from communication point function type */ 773005e0a3SDag-Erling Smørgrav typedef int comm_point_callback_type(struct comm_point*, void*, int, 78b7579f77SDag-Erling Smørgrav struct comm_reply*); 79b7579f77SDag-Erling Smørgrav 80b7579f77SDag-Erling Smørgrav /** to pass no_error to callback function */ 81b7579f77SDag-Erling Smørgrav #define NETEVENT_NOERROR 0 82b7579f77SDag-Erling Smørgrav /** to pass closed connection to callback function */ 83b7579f77SDag-Erling Smørgrav #define NETEVENT_CLOSED -1 84b7579f77SDag-Erling Smørgrav /** to pass timeout happened to callback function */ 85b7579f77SDag-Erling Smørgrav #define NETEVENT_TIMEOUT -2 86b7579f77SDag-Erling Smørgrav /** to pass fallback from capsforID to callback function; 0x20 failed */ 87b7579f77SDag-Erling Smørgrav #define NETEVENT_CAPSFAIL -3 8857bddd21SDag-Erling Smørgrav /** to pass done transfer to callback function; http file is complete */ 8957bddd21SDag-Erling Smørgrav #define NETEVENT_DONE -4 90b7579f77SDag-Erling Smørgrav 91b7579f77SDag-Erling Smørgrav /** timeout to slow accept calls when not possible, in msec. */ 92b7579f77SDag-Erling Smørgrav #define NETEVENT_SLOW_ACCEPT_TIME 2000 93b7579f77SDag-Erling Smørgrav 94b7579f77SDag-Erling Smørgrav /** 95b7579f77SDag-Erling Smørgrav * A communication point dispatcher. Thread specific. 96b7579f77SDag-Erling Smørgrav */ 97b7579f77SDag-Erling Smørgrav struct comm_base { 98b7579f77SDag-Erling Smørgrav /** behind the scenes structure. with say libevent info. alloced */ 99b7579f77SDag-Erling Smørgrav struct internal_base* eb; 100b7579f77SDag-Erling Smørgrav /** callback to stop listening on accept sockets, 101b7579f77SDag-Erling Smørgrav * performed when accept() will not function properly */ 102b7579f77SDag-Erling Smørgrav void (*stop_accept)(void*); 103b7579f77SDag-Erling Smørgrav /** callback to start listening on accept sockets, performed 104b7579f77SDag-Erling Smørgrav * after stop_accept() then a timeout has passed. */ 105b7579f77SDag-Erling Smørgrav void (*start_accept)(void*); 106b7579f77SDag-Erling Smørgrav /** user argument for stop_accept and start_accept functions */ 107b7579f77SDag-Erling Smørgrav void* cb_arg; 108b7579f77SDag-Erling Smørgrav }; 109b7579f77SDag-Erling Smørgrav 110b7579f77SDag-Erling Smørgrav /** 111b7579f77SDag-Erling Smørgrav * Reply information for a communication point. 112b7579f77SDag-Erling Smørgrav */ 113b7579f77SDag-Erling Smørgrav struct comm_reply { 114b7579f77SDag-Erling Smørgrav /** the comm_point with fd to send reply on to. */ 115b7579f77SDag-Erling Smørgrav struct comm_point* c; 116b7579f77SDag-Erling Smørgrav /** the address (for UDP based communication) */ 117b7579f77SDag-Erling Smørgrav struct sockaddr_storage addr; 118b7579f77SDag-Erling Smørgrav /** length of address */ 119b7579f77SDag-Erling Smørgrav socklen_t addrlen; 120b7579f77SDag-Erling Smørgrav /** return type 0 (none), 4(IP4), 6(IP6) */ 121b7579f77SDag-Erling Smørgrav int srctype; 12265b390aaSDag-Erling Smørgrav /* DnsCrypt context */ 12365b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT 12465b390aaSDag-Erling Smørgrav uint8_t client_nonce[crypto_box_HALF_NONCEBYTES]; 12565b390aaSDag-Erling Smørgrav uint8_t nmkey[crypto_box_BEFORENMBYTES]; 126c7f4d7adSDag-Erling Smørgrav const dnsccert *dnsc_cert; 12765b390aaSDag-Erling Smørgrav int is_dnscrypted; 12865b390aaSDag-Erling Smørgrav #endif 129b7579f77SDag-Erling Smørgrav /** the return source interface data */ 130b7579f77SDag-Erling Smørgrav union { 131b7579f77SDag-Erling Smørgrav #ifdef IPV6_PKTINFO 132b7579f77SDag-Erling Smørgrav struct in6_pktinfo v6info; 133b7579f77SDag-Erling Smørgrav #endif 134b7579f77SDag-Erling Smørgrav #ifdef IP_PKTINFO 135b7579f77SDag-Erling Smørgrav struct in_pktinfo v4info; 136b7579f77SDag-Erling Smørgrav #elif defined(IP_RECVDSTADDR) 137b7579f77SDag-Erling Smørgrav struct in_addr v4addr; 138b7579f77SDag-Erling Smørgrav #endif 139b7579f77SDag-Erling Smørgrav } 140b7579f77SDag-Erling Smørgrav /** variable with return source data */ 141b7579f77SDag-Erling Smørgrav pktinfo; 14265b390aaSDag-Erling Smørgrav /** max udp size for udp packets */ 14365b390aaSDag-Erling Smørgrav size_t max_udp_size; 144b7579f77SDag-Erling Smørgrav }; 145b7579f77SDag-Erling Smørgrav 146b7579f77SDag-Erling Smørgrav /** 147b7579f77SDag-Erling Smørgrav * Communication point to the network 148b7579f77SDag-Erling Smørgrav * These behaviours can be accomplished by setting the flags 149b7579f77SDag-Erling Smørgrav * and passing return values from the callback. 150b7579f77SDag-Erling Smørgrav * udp frontside: called after readdone. sendafter. 151b7579f77SDag-Erling Smørgrav * tcp frontside: called readdone, sendafter. close. 152b7579f77SDag-Erling Smørgrav * udp behind: called after readdone. No send after. 153b7579f77SDag-Erling Smørgrav * tcp behind: write done, read done, then called. No send after. 154b7579f77SDag-Erling Smørgrav */ 155b7579f77SDag-Erling Smørgrav struct comm_point { 156b7579f77SDag-Erling Smørgrav /** behind the scenes structure, with say libevent info. alloced. */ 157b7579f77SDag-Erling Smørgrav struct internal_event* ev; 158b7579f77SDag-Erling Smørgrav 159b7579f77SDag-Erling Smørgrav /** file descriptor for communication point */ 160b7579f77SDag-Erling Smørgrav int fd; 161b7579f77SDag-Erling Smørgrav 162b7579f77SDag-Erling Smørgrav /** timeout (NULL if it does not). Malloced. */ 163b7579f77SDag-Erling Smørgrav struct timeval* timeout; 164b7579f77SDag-Erling Smørgrav 165b7579f77SDag-Erling Smørgrav /** buffer pointer. Either to perthread, or own buffer or NULL */ 16617d15b25SDag-Erling Smørgrav struct sldns_buffer* buffer; 167b7579f77SDag-Erling Smørgrav 168b7579f77SDag-Erling Smørgrav /* -------- TCP Handler -------- */ 169b7579f77SDag-Erling Smørgrav /** Read/Write state for TCP */ 170b7579f77SDag-Erling Smørgrav int tcp_is_reading; 171b7579f77SDag-Erling Smørgrav /** The current read/write count for TCP */ 172b7579f77SDag-Erling Smørgrav size_t tcp_byte_count; 173b7579f77SDag-Erling Smørgrav /** parent communication point (for TCP sockets) */ 174b7579f77SDag-Erling Smørgrav struct comm_point* tcp_parent; 175b7579f77SDag-Erling Smørgrav /** sockaddr from peer, for TCP handlers */ 176b7579f77SDag-Erling Smørgrav struct comm_reply repinfo; 177b7579f77SDag-Erling Smørgrav 178b7579f77SDag-Erling Smørgrav /* -------- TCP Accept -------- */ 179b7579f77SDag-Erling Smørgrav /** the number of TCP handlers for this tcp-accept socket */ 180b7579f77SDag-Erling Smørgrav int max_tcp_count; 18109a3aaf3SDag-Erling Smørgrav /** current number of tcp handler in-use for this accept socket */ 18209a3aaf3SDag-Erling Smørgrav int cur_tcp_count; 183b7579f77SDag-Erling Smørgrav /** malloced array of tcp handlers for a tcp-accept, 184b7579f77SDag-Erling Smørgrav of size max_tcp_count. */ 185b7579f77SDag-Erling Smørgrav struct comm_point** tcp_handlers; 186b7579f77SDag-Erling Smørgrav /** linked list of free tcp_handlers to use for new queries. 187b7579f77SDag-Erling Smørgrav For tcp_accept the first entry, for tcp_handlers the next one. */ 188b7579f77SDag-Erling Smørgrav struct comm_point* tcp_free; 189b7579f77SDag-Erling Smørgrav 190b7579f77SDag-Erling Smørgrav /* -------- SSL TCP DNS ------- */ 191b7579f77SDag-Erling Smørgrav /** the SSL object with rw bio (owned) or for commaccept ctx ref */ 192b7579f77SDag-Erling Smørgrav void* ssl; 193b7579f77SDag-Erling Smørgrav /** handshake state for init and renegotiate */ 194b7579f77SDag-Erling Smørgrav enum { 195b7579f77SDag-Erling Smørgrav /** no handshake, it has been done */ 196b7579f77SDag-Erling Smørgrav comm_ssl_shake_none = 0, 197b7579f77SDag-Erling Smørgrav /** ssl initial handshake wants to read */ 198b7579f77SDag-Erling Smørgrav comm_ssl_shake_read, 199b7579f77SDag-Erling Smørgrav /** ssl initial handshake wants to write */ 200b7579f77SDag-Erling Smørgrav comm_ssl_shake_write, 201b7579f77SDag-Erling Smørgrav /** ssl_write wants to read */ 202b7579f77SDag-Erling Smørgrav comm_ssl_shake_hs_read, 203b7579f77SDag-Erling Smørgrav /** ssl_read wants to write */ 204b7579f77SDag-Erling Smørgrav comm_ssl_shake_hs_write 205b7579f77SDag-Erling Smørgrav } ssl_shake_state; 206b7579f77SDag-Erling Smørgrav 20757bddd21SDag-Erling Smørgrav /* -------- HTTP ------- */ 20857bddd21SDag-Erling Smørgrav /** Currently reading in http headers */ 20957bddd21SDag-Erling Smørgrav int http_in_headers; 21057bddd21SDag-Erling Smørgrav /** Currently reading in chunk headers, 0=not, 1=firstline, 2=unused 21157bddd21SDag-Erling Smørgrav * (more lines), 3=trailer headers after chunk */ 21257bddd21SDag-Erling Smørgrav int http_in_chunk_headers; 21357bddd21SDag-Erling Smørgrav /** chunked transfer */ 21457bddd21SDag-Erling Smørgrav int http_is_chunked; 21557bddd21SDag-Erling Smørgrav /** http temp buffer (shared buffer for temporary work) */ 21657bddd21SDag-Erling Smørgrav struct sldns_buffer* http_temp; 21757bddd21SDag-Erling Smørgrav /** http stored content in buffer */ 21857bddd21SDag-Erling Smørgrav size_t http_stored; 21957bddd21SDag-Erling Smørgrav 220ff825849SDag-Erling Smørgrav /* -------- dnstap ------- */ 221ff825849SDag-Erling Smørgrav /** the dnstap environment */ 222ff825849SDag-Erling Smørgrav struct dt_env* dtenv; 223ff825849SDag-Erling Smørgrav 224b7579f77SDag-Erling Smørgrav /** is this a UDP, TCP-accept or TCP socket. */ 225b7579f77SDag-Erling Smørgrav enum comm_point_type { 226b7579f77SDag-Erling Smørgrav /** UDP socket - handle datagrams. */ 227b7579f77SDag-Erling Smørgrav comm_udp, 228b7579f77SDag-Erling Smørgrav /** TCP accept socket - only creates handlers if readable. */ 229b7579f77SDag-Erling Smørgrav comm_tcp_accept, 230b7579f77SDag-Erling Smørgrav /** TCP handler socket - handle byteperbyte readwrite. */ 231b7579f77SDag-Erling Smørgrav comm_tcp, 23257bddd21SDag-Erling Smørgrav /** HTTP handler socket */ 23357bddd21SDag-Erling Smørgrav comm_http, 234b7579f77SDag-Erling Smørgrav /** AF_UNIX socket - for internal commands. */ 235b7579f77SDag-Erling Smørgrav comm_local, 236b7579f77SDag-Erling Smørgrav /** raw - not DNS format - for pipe readers and writers */ 237b7579f77SDag-Erling Smørgrav comm_raw 238b7579f77SDag-Erling Smørgrav } 239b7579f77SDag-Erling Smørgrav /** variable with type of socket, UDP,TCP-accept,TCP,pipe */ 240b7579f77SDag-Erling Smørgrav type; 241b7579f77SDag-Erling Smørgrav 242b7579f77SDag-Erling Smørgrav /* ---------- Behaviour ----------- */ 243b7579f77SDag-Erling Smørgrav /** if set the connection is NOT closed on delete. */ 244b7579f77SDag-Erling Smørgrav int do_not_close; 245b7579f77SDag-Erling Smørgrav 246b7579f77SDag-Erling Smørgrav /** if set, the connection is closed on error, on timeout, 247b7579f77SDag-Erling Smørgrav and after read/write completes. No callback is done. */ 248b7579f77SDag-Erling Smørgrav int tcp_do_close; 249b7579f77SDag-Erling Smørgrav 250b7579f77SDag-Erling Smørgrav /** if set, read/write completes: 251b7579f77SDag-Erling Smørgrav read/write state of tcp is toggled. 252b7579f77SDag-Erling Smørgrav buffer reset/bytecount reset. 253b7579f77SDag-Erling Smørgrav this flag cleared. 254b7579f77SDag-Erling Smørgrav So that when that is done the callback is called. */ 255b7579f77SDag-Erling Smørgrav int tcp_do_toggle_rw; 256b7579f77SDag-Erling Smørgrav 257b5663de9SDag-Erling Smørgrav /** timeout in msec for TCP wait times for this connection */ 258b5663de9SDag-Erling Smørgrav int tcp_timeout_msec; 259b5663de9SDag-Erling Smørgrav 260*4c75e3aaSDag-Erling Smørgrav /** if set, tcp keepalive is enabled on this connection */ 261*4c75e3aaSDag-Erling Smørgrav int tcp_keepalive; 262*4c75e3aaSDag-Erling Smørgrav 263b7579f77SDag-Erling Smørgrav /** if set, checks for pending error from nonblocking connect() call.*/ 264b7579f77SDag-Erling Smørgrav int tcp_check_nb_connect; 265b7579f77SDag-Erling Smørgrav 266*4c75e3aaSDag-Erling Smørgrav /** if set, check for connection limit on tcp accept. */ 267*4c75e3aaSDag-Erling Smørgrav struct tcl_list* tcp_conn_limit; 268*4c75e3aaSDag-Erling Smørgrav /** the entry for the connection. */ 269*4c75e3aaSDag-Erling Smørgrav struct tcl_addr* tcl_addr; 270*4c75e3aaSDag-Erling Smørgrav 271b5663de9SDag-Erling Smørgrav #ifdef USE_MSG_FASTOPEN 272b5663de9SDag-Erling Smørgrav /** used to track if the sendto() call should be done when using TFO. */ 273b5663de9SDag-Erling Smørgrav int tcp_do_fastopen; 274b5663de9SDag-Erling Smørgrav #endif 275b5663de9SDag-Erling Smørgrav 27665b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT 27765b390aaSDag-Erling Smørgrav /** Is this a dnscrypt channel */ 27865b390aaSDag-Erling Smørgrav int dnscrypt; 27965b390aaSDag-Erling Smørgrav /** encrypted buffer pointer. Either to perthread, or own buffer or NULL */ 28065b390aaSDag-Erling Smørgrav struct sldns_buffer* dnscrypt_buffer; 28165b390aaSDag-Erling Smørgrav #endif 282b7579f77SDag-Erling Smørgrav /** number of queries outstanding on this socket, used by 283b7579f77SDag-Erling Smørgrav * outside network for udp ports */ 284b7579f77SDag-Erling Smørgrav int inuse; 285b7579f77SDag-Erling Smørgrav 286b7579f77SDag-Erling Smørgrav /** callback when done. 287b7579f77SDag-Erling Smørgrav tcp_accept does not get called back, is NULL then. 288b7579f77SDag-Erling Smørgrav If a timeout happens, callback with timeout=1 is called. 289b7579f77SDag-Erling Smørgrav If an error happens, callback is called with error set 290b7579f77SDag-Erling Smørgrav nonzero. If not NETEVENT_NOERROR, it is an errno value. 291b7579f77SDag-Erling Smørgrav If the connection is closed (by remote end) then the 292b7579f77SDag-Erling Smørgrav callback is called with error set to NETEVENT_CLOSED=-1. 293b7579f77SDag-Erling Smørgrav If a timeout happens on the connection, the error is set to 294b7579f77SDag-Erling Smørgrav NETEVENT_TIMEOUT=-2. 295b7579f77SDag-Erling Smørgrav The reply_info can be copied if the reply needs to happen at a 296b7579f77SDag-Erling Smørgrav later time. It consists of a struct with commpoint and address. 297b7579f77SDag-Erling Smørgrav It can be passed to a msg send routine some time later. 298b7579f77SDag-Erling Smørgrav Note the reply information is temporary and must be copied. 299b7579f77SDag-Erling Smørgrav NULL is passed for_reply info, in cases where error happened. 300b7579f77SDag-Erling Smørgrav 301b7579f77SDag-Erling Smørgrav declare as: 302b7579f77SDag-Erling Smørgrav int my_callback(struct comm_point* c, void* my_arg, int error, 303b7579f77SDag-Erling Smørgrav struct comm_reply *reply_info); 304b7579f77SDag-Erling Smørgrav 305b7579f77SDag-Erling Smørgrav if the routine returns 0, nothing is done. 306b7579f77SDag-Erling Smørgrav Notzero, the buffer will be sent back to client. 307b7579f77SDag-Erling Smørgrav For UDP this is done without changing the commpoint. 308b7579f77SDag-Erling Smørgrav In TCP it sets write state. 309b7579f77SDag-Erling Smørgrav */ 3103005e0a3SDag-Erling Smørgrav comm_point_callback_type* callback; 311b7579f77SDag-Erling Smørgrav /** argument to pass to callback. */ 312b7579f77SDag-Erling Smørgrav void *cb_arg; 313b7579f77SDag-Erling Smørgrav }; 314b7579f77SDag-Erling Smørgrav 315b7579f77SDag-Erling Smørgrav /** 316b7579f77SDag-Erling Smørgrav * Structure only for making timeout events. 317b7579f77SDag-Erling Smørgrav */ 318b7579f77SDag-Erling Smørgrav struct comm_timer { 319e2d15004SDag-Erling Smørgrav /** the internal event stuff (derived) */ 320b7579f77SDag-Erling Smørgrav struct internal_timer* ev_timer; 321b7579f77SDag-Erling Smørgrav 322b7579f77SDag-Erling Smørgrav /** callback function, takes user arg only */ 323b7579f77SDag-Erling Smørgrav void (*callback)(void*); 324b7579f77SDag-Erling Smørgrav 325b7579f77SDag-Erling Smørgrav /** callback user argument */ 326b7579f77SDag-Erling Smørgrav void* cb_arg; 327b7579f77SDag-Erling Smørgrav }; 328b7579f77SDag-Erling Smørgrav 329b7579f77SDag-Erling Smørgrav /** 330b7579f77SDag-Erling Smørgrav * Structure only for signal events. 331b7579f77SDag-Erling Smørgrav */ 332b7579f77SDag-Erling Smørgrav struct comm_signal { 333b7579f77SDag-Erling Smørgrav /** the communication base */ 334b7579f77SDag-Erling Smørgrav struct comm_base* base; 335b7579f77SDag-Erling Smørgrav 336b7579f77SDag-Erling Smørgrav /** the internal event stuff */ 337b7579f77SDag-Erling Smørgrav struct internal_signal* ev_signal; 338b7579f77SDag-Erling Smørgrav 339b7579f77SDag-Erling Smørgrav /** callback function, takes signal number and user arg */ 340b7579f77SDag-Erling Smørgrav void (*callback)(int, void*); 341b7579f77SDag-Erling Smørgrav 342b7579f77SDag-Erling Smørgrav /** callback user argument */ 343b7579f77SDag-Erling Smørgrav void* cb_arg; 344b7579f77SDag-Erling Smørgrav }; 345b7579f77SDag-Erling Smørgrav 346b7579f77SDag-Erling Smørgrav /** 347b7579f77SDag-Erling Smørgrav * Create a new comm base. 348b7579f77SDag-Erling Smørgrav * @param sigs: if true it attempts to create a default loop for 349b7579f77SDag-Erling Smørgrav * signal handling. 350b7579f77SDag-Erling Smørgrav * @return: the new comm base. NULL on error. 351b7579f77SDag-Erling Smørgrav */ 352b7579f77SDag-Erling Smørgrav struct comm_base* comm_base_create(int sigs); 353b7579f77SDag-Erling Smørgrav 354b7579f77SDag-Erling Smørgrav /** 355e2d15004SDag-Erling Smørgrav * Create comm base that uses the given ub_event_base (underlying pluggable 356e2d15004SDag-Erling Smørgrav * event mechanism pointer). 357e2d15004SDag-Erling Smørgrav * @param base: underlying pluggable event base. 35817d15b25SDag-Erling Smørgrav * @return: the new comm base. NULL on error. 35917d15b25SDag-Erling Smørgrav */ 360e2d15004SDag-Erling Smørgrav struct comm_base* comm_base_create_event(struct ub_event_base* base); 36117d15b25SDag-Erling Smørgrav 36217d15b25SDag-Erling Smørgrav /** 36317d15b25SDag-Erling Smørgrav * Delete comm base structure but not the underlying lib event base. 36417d15b25SDag-Erling Smørgrav * All comm points must have been deleted. 36517d15b25SDag-Erling Smørgrav * @param b: the base to delete. 36617d15b25SDag-Erling Smørgrav */ 36717d15b25SDag-Erling Smørgrav void comm_base_delete_no_base(struct comm_base* b); 36817d15b25SDag-Erling Smørgrav 36917d15b25SDag-Erling Smørgrav /** 370b7579f77SDag-Erling Smørgrav * Destroy a comm base. 371b7579f77SDag-Erling Smørgrav * All comm points must have been deleted. 372b7579f77SDag-Erling Smørgrav * @param b: the base to delete. 373b7579f77SDag-Erling Smørgrav */ 374b7579f77SDag-Erling Smørgrav void comm_base_delete(struct comm_base* b); 375b7579f77SDag-Erling Smørgrav 376b7579f77SDag-Erling Smørgrav /** 377b7579f77SDag-Erling Smørgrav * Obtain two pointers. The pointers never change (until base_delete()). 378b7579f77SDag-Erling Smørgrav * The pointers point to time values that are updated regularly. 379b7579f77SDag-Erling Smørgrav * @param b: the communication base that will update the time values. 380b7579f77SDag-Erling Smørgrav * @param tt: pointer to time in seconds is returned. 381b7579f77SDag-Erling Smørgrav * @param tv: pointer to time in microseconds is returned. 382b7579f77SDag-Erling Smørgrav */ 38317d15b25SDag-Erling Smørgrav void comm_base_timept(struct comm_base* b, time_t** tt, struct timeval** tv); 384b7579f77SDag-Erling Smørgrav 385b7579f77SDag-Erling Smørgrav /** 386b7579f77SDag-Erling Smørgrav * Dispatch the comm base events. 387b7579f77SDag-Erling Smørgrav * @param b: the communication to perform. 388b7579f77SDag-Erling Smørgrav */ 389b7579f77SDag-Erling Smørgrav void comm_base_dispatch(struct comm_base* b); 390b7579f77SDag-Erling Smørgrav 391b7579f77SDag-Erling Smørgrav /** 392b7579f77SDag-Erling Smørgrav * Exit from dispatch loop. 393b7579f77SDag-Erling Smørgrav * @param b: the communication base that is in dispatch(). 394b7579f77SDag-Erling Smørgrav */ 395b7579f77SDag-Erling Smørgrav void comm_base_exit(struct comm_base* b); 396b7579f77SDag-Erling Smørgrav 397b7579f77SDag-Erling Smørgrav /** 398b7579f77SDag-Erling Smørgrav * Set the slow_accept mode handlers. You can not provide these if you do 399b7579f77SDag-Erling Smørgrav * not perform accept() calls. 400b7579f77SDag-Erling Smørgrav * @param b: comm base 401b7579f77SDag-Erling Smørgrav * @param stop_accept: function that stops listening to accept fds. 402b7579f77SDag-Erling Smørgrav * @param start_accept: function that resumes listening to accept fds. 403b7579f77SDag-Erling Smørgrav * @param arg: callback arg to pass to the functions. 404b7579f77SDag-Erling Smørgrav */ 405b7579f77SDag-Erling Smørgrav void comm_base_set_slow_accept_handlers(struct comm_base* b, 406b7579f77SDag-Erling Smørgrav void (*stop_accept)(void*), void (*start_accept)(void*), void* arg); 407b7579f77SDag-Erling Smørgrav 408b7579f77SDag-Erling Smørgrav /** 409b7579f77SDag-Erling Smørgrav * Access internal data structure (for util/tube.c on windows) 410b7579f77SDag-Erling Smørgrav * @param b: comm base 411e2d15004SDag-Erling Smørgrav * @return ub_event_base. 412b7579f77SDag-Erling Smørgrav */ 413e2d15004SDag-Erling Smørgrav struct ub_event_base* comm_base_internal(struct comm_base* b); 414b7579f77SDag-Erling Smørgrav 415b7579f77SDag-Erling Smørgrav /** 416b7579f77SDag-Erling Smørgrav * Create an UDP comm point. Calls malloc. 417b7579f77SDag-Erling Smørgrav * setups the structure with the parameters you provide. 418b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 419b7579f77SDag-Erling Smørgrav * @param fd : file descriptor of open UDP socket. 420b7579f77SDag-Erling Smørgrav * @param buffer: shared buffer by UDP sockets from this thread. 421b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer. 422b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 423b7579f77SDag-Erling Smørgrav * @return: returns the allocated communication point. NULL on error. 424b7579f77SDag-Erling Smørgrav * Sets timeout to NULL. Turns off TCP options. 425b7579f77SDag-Erling Smørgrav */ 426b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_udp(struct comm_base* base, 42717d15b25SDag-Erling Smørgrav int fd, struct sldns_buffer* buffer, 4283005e0a3SDag-Erling Smørgrav comm_point_callback_type* callback, void* callback_arg); 429b7579f77SDag-Erling Smørgrav 430b7579f77SDag-Erling Smørgrav /** 431b7579f77SDag-Erling Smørgrav * Create an UDP with ancillary data comm point. Calls malloc. 432b7579f77SDag-Erling Smørgrav * Uses recvmsg instead of recv to get udp message. 433b7579f77SDag-Erling Smørgrav * setups the structure with the parameters you provide. 434b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 435b7579f77SDag-Erling Smørgrav * @param fd : file descriptor of open UDP socket. 436b7579f77SDag-Erling Smørgrav * @param buffer: shared buffer by UDP sockets from this thread. 437b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer. 438b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 439b7579f77SDag-Erling Smørgrav * @return: returns the allocated communication point. NULL on error. 440b7579f77SDag-Erling Smørgrav * Sets timeout to NULL. Turns off TCP options. 441b7579f77SDag-Erling Smørgrav */ 442b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, 44317d15b25SDag-Erling Smørgrav int fd, struct sldns_buffer* buffer, 4443005e0a3SDag-Erling Smørgrav comm_point_callback_type* callback, void* callback_arg); 445b7579f77SDag-Erling Smørgrav 446b7579f77SDag-Erling Smørgrav /** 447b7579f77SDag-Erling Smørgrav * Create a TCP listener comm point. Calls malloc. 448b7579f77SDag-Erling Smørgrav * Setups the structure with the parameters you provide. 449b7579f77SDag-Erling Smørgrav * Also Creates TCP Handlers, pre allocated for you. 450b7579f77SDag-Erling Smørgrav * Uses the parameters you provide. 451b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 452b7579f77SDag-Erling Smørgrav * @param fd: file descriptor of open TCP socket set to listen nonblocking. 453b7579f77SDag-Erling Smørgrav * @param num: becomes max_tcp_count, the routine allocates that 454b7579f77SDag-Erling Smørgrav * many tcp handler commpoints. 455*4c75e3aaSDag-Erling Smørgrav * @param idle_timeout: TCP idle timeout in ms. 456*4c75e3aaSDag-Erling Smørgrav * @param tcp_conn_limit: TCP connection limit info. 457b7579f77SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 458b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for TCP handlers. 459b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 460b7579f77SDag-Erling Smørgrav * @return: returns the TCP listener commpoint. You can find the 461b7579f77SDag-Erling Smørgrav * TCP handlers in the array inside the listener commpoint. 462b7579f77SDag-Erling Smørgrav * returns NULL on error. 463b7579f77SDag-Erling Smørgrav * Inits timeout to NULL. All handlers are on the free list. 464b7579f77SDag-Erling Smørgrav */ 465b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_tcp(struct comm_base* base, 466*4c75e3aaSDag-Erling Smørgrav int fd, int num, int idle_timeout, struct tcl_list* tcp_conn_limit, 467*4c75e3aaSDag-Erling Smørgrav size_t bufsize, comm_point_callback_type* callback, void* callback_arg); 468b7579f77SDag-Erling Smørgrav 469b7579f77SDag-Erling Smørgrav /** 470b7579f77SDag-Erling Smørgrav * Create an outgoing TCP commpoint. No file descriptor is opened, left at -1. 471b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 472b7579f77SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 473b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 474b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 475b7579f77SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 476b7579f77SDag-Erling Smørgrav */ 477b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_tcp_out(struct comm_base* base, 4783005e0a3SDag-Erling Smørgrav size_t bufsize, comm_point_callback_type* callback, void* callback_arg); 479b7579f77SDag-Erling Smørgrav 480b7579f77SDag-Erling Smørgrav /** 48157bddd21SDag-Erling Smørgrav * Create an outgoing HTTP commpoint. No file descriptor is opened, left at -1. 48257bddd21SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 48357bddd21SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 48457bddd21SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 48557bddd21SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 48657bddd21SDag-Erling Smørgrav * @param temp: sldns buffer, shared between other http_out commpoints, for 48757bddd21SDag-Erling Smørgrav * temporary data when performing callbacks. 48857bddd21SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 48957bddd21SDag-Erling Smørgrav */ 49057bddd21SDag-Erling Smørgrav struct comm_point* comm_point_create_http_out(struct comm_base* base, 49157bddd21SDag-Erling Smørgrav size_t bufsize, comm_point_callback_type* callback, 49257bddd21SDag-Erling Smørgrav void* callback_arg, struct sldns_buffer* temp); 49357bddd21SDag-Erling Smørgrav 49457bddd21SDag-Erling Smørgrav /** 495b7579f77SDag-Erling Smørgrav * Create commpoint to listen to a local domain file descriptor. 496b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 497b7579f77SDag-Erling Smørgrav * @param fd: file descriptor of open AF_UNIX socket set to listen nonblocking. 498b7579f77SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 499b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 500b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 501b7579f77SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 502b7579f77SDag-Erling Smørgrav */ 503b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_local(struct comm_base* base, 504b7579f77SDag-Erling Smørgrav int fd, size_t bufsize, 5053005e0a3SDag-Erling Smørgrav comm_point_callback_type* callback, void* callback_arg); 506b7579f77SDag-Erling Smørgrav 507b7579f77SDag-Erling Smørgrav /** 508b7579f77SDag-Erling Smørgrav * Create commpoint to listen to a local domain pipe descriptor. 509b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 510b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 511b7579f77SDag-Erling Smørgrav * @param writing: true if you want to listen to writes, false for reads. 512b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 513b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 514b7579f77SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 515b7579f77SDag-Erling Smørgrav */ 516b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_raw(struct comm_base* base, 517b7579f77SDag-Erling Smørgrav int fd, int writing, 5183005e0a3SDag-Erling Smørgrav comm_point_callback_type* callback, void* callback_arg); 519b7579f77SDag-Erling Smørgrav 520b7579f77SDag-Erling Smørgrav /** 521b7579f77SDag-Erling Smørgrav * Close a comm point fd. 522b7579f77SDag-Erling Smørgrav * @param c: comm point to close. 523b7579f77SDag-Erling Smørgrav */ 524b7579f77SDag-Erling Smørgrav void comm_point_close(struct comm_point* c); 525b7579f77SDag-Erling Smørgrav 526b7579f77SDag-Erling Smørgrav /** 527b7579f77SDag-Erling Smørgrav * Close and deallocate (free) the comm point. If the comm point is 528b7579f77SDag-Erling Smørgrav * a tcp-accept point, also its tcp-handler points are deleted. 529b7579f77SDag-Erling Smørgrav * @param c: comm point to delete. 530b7579f77SDag-Erling Smørgrav */ 531b7579f77SDag-Erling Smørgrav void comm_point_delete(struct comm_point* c); 532b7579f77SDag-Erling Smørgrav 533b7579f77SDag-Erling Smørgrav /** 534b7579f77SDag-Erling Smørgrav * Send reply. Put message into commpoint buffer. 535b7579f77SDag-Erling Smørgrav * @param repinfo: The reply info copied from a commpoint callback call. 536b7579f77SDag-Erling Smørgrav */ 537b7579f77SDag-Erling Smørgrav void comm_point_send_reply(struct comm_reply* repinfo); 538b7579f77SDag-Erling Smørgrav 539b7579f77SDag-Erling Smørgrav /** 540b7579f77SDag-Erling Smørgrav * Drop reply. Cleans up. 541b7579f77SDag-Erling Smørgrav * @param repinfo: The reply info copied from a commpoint callback call. 542b7579f77SDag-Erling Smørgrav */ 543b7579f77SDag-Erling Smørgrav void comm_point_drop_reply(struct comm_reply* repinfo); 544b7579f77SDag-Erling Smørgrav 545b7579f77SDag-Erling Smørgrav /** 546b7579f77SDag-Erling Smørgrav * Send an udp message over a commpoint. 547b7579f77SDag-Erling Smørgrav * @param c: commpoint to send it from. 548b7579f77SDag-Erling Smørgrav * @param packet: what to send. 549b7579f77SDag-Erling Smørgrav * @param addr: where to send it to. 550b7579f77SDag-Erling Smørgrav * @param addrlen: length of addr. 551b7579f77SDag-Erling Smørgrav * @return: false on a failure. 552b7579f77SDag-Erling Smørgrav */ 55317d15b25SDag-Erling Smørgrav int comm_point_send_udp_msg(struct comm_point* c, struct sldns_buffer* packet, 554b7579f77SDag-Erling Smørgrav struct sockaddr* addr, socklen_t addrlen); 555b7579f77SDag-Erling Smørgrav 556b7579f77SDag-Erling Smørgrav /** 557b7579f77SDag-Erling Smørgrav * Stop listening for input on the commpoint. No callbacks will happen. 558b7579f77SDag-Erling Smørgrav * @param c: commpoint to disable. The fd is not closed. 559b7579f77SDag-Erling Smørgrav */ 560b7579f77SDag-Erling Smørgrav void comm_point_stop_listening(struct comm_point* c); 561b7579f77SDag-Erling Smørgrav 562b7579f77SDag-Erling Smørgrav /** 563b7579f77SDag-Erling Smørgrav * Start listening again for input on the comm point. 564b7579f77SDag-Erling Smørgrav * @param c: commpoint to enable again. 565b7579f77SDag-Erling Smørgrav * @param newfd: new fd, or -1 to leave fd be. 566b5663de9SDag-Erling Smørgrav * @param msec: timeout in milliseconds, or -1 for no (change to the) timeout. 567b5663de9SDag-Erling Smørgrav * So seconds*1000. 568b7579f77SDag-Erling Smørgrav */ 569b5663de9SDag-Erling Smørgrav void comm_point_start_listening(struct comm_point* c, int newfd, int msec); 570b7579f77SDag-Erling Smørgrav 571b7579f77SDag-Erling Smørgrav /** 572b7579f77SDag-Erling Smørgrav * Stop listening and start listening again for reading or writing. 573b7579f77SDag-Erling Smørgrav * @param c: commpoint 574b7579f77SDag-Erling Smørgrav * @param rd: if true, listens for reading. 575b7579f77SDag-Erling Smørgrav * @param wr: if true, listens for writing. 576b7579f77SDag-Erling Smørgrav */ 577b7579f77SDag-Erling Smørgrav void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr); 578b7579f77SDag-Erling Smørgrav 579b7579f77SDag-Erling Smørgrav /** 580b7579f77SDag-Erling Smørgrav * Get size of memory used by comm point. 581b7579f77SDag-Erling Smørgrav * For TCP handlers this includes subhandlers. 582b7579f77SDag-Erling Smørgrav * For UDP handlers, this does not include the (shared) UDP buffer. 583b7579f77SDag-Erling Smørgrav * @param c: commpoint. 584b7579f77SDag-Erling Smørgrav * @return size in bytes. 585b7579f77SDag-Erling Smørgrav */ 586b7579f77SDag-Erling Smørgrav size_t comm_point_get_mem(struct comm_point* c); 587b7579f77SDag-Erling Smørgrav 588b7579f77SDag-Erling Smørgrav /** 589b7579f77SDag-Erling Smørgrav * create timer. Not active upon creation. 590b7579f77SDag-Erling Smørgrav * @param base: event handling base. 591b7579f77SDag-Erling Smørgrav * @param cb: callback function: void myfunc(void* myarg); 592b7579f77SDag-Erling Smørgrav * @param cb_arg: user callback argument. 593b7579f77SDag-Erling Smørgrav * @return: the new timer or NULL on error. 594b7579f77SDag-Erling Smørgrav */ 595b7579f77SDag-Erling Smørgrav struct comm_timer* comm_timer_create(struct comm_base* base, 596b7579f77SDag-Erling Smørgrav void (*cb)(void*), void* cb_arg); 597b7579f77SDag-Erling Smørgrav 598b7579f77SDag-Erling Smørgrav /** 599b7579f77SDag-Erling Smørgrav * disable timer. Stops callbacks from happening. 600b7579f77SDag-Erling Smørgrav * @param timer: to disable. 601b7579f77SDag-Erling Smørgrav */ 602b7579f77SDag-Erling Smørgrav void comm_timer_disable(struct comm_timer* timer); 603b7579f77SDag-Erling Smørgrav 604b7579f77SDag-Erling Smørgrav /** 605b7579f77SDag-Erling Smørgrav * reset timevalue for timer. 606b7579f77SDag-Erling Smørgrav * @param timer: timer to (re)set. 607b7579f77SDag-Erling Smørgrav * @param tv: when the timer should activate. if NULL timer is disabled. 608b7579f77SDag-Erling Smørgrav */ 609b7579f77SDag-Erling Smørgrav void comm_timer_set(struct comm_timer* timer, struct timeval* tv); 610b7579f77SDag-Erling Smørgrav 611b7579f77SDag-Erling Smørgrav /** 612b7579f77SDag-Erling Smørgrav * delete timer. 613b7579f77SDag-Erling Smørgrav * @param timer: to delete. 614b7579f77SDag-Erling Smørgrav */ 615b7579f77SDag-Erling Smørgrav void comm_timer_delete(struct comm_timer* timer); 616b7579f77SDag-Erling Smørgrav 617b7579f77SDag-Erling Smørgrav /** 618b7579f77SDag-Erling Smørgrav * see if timeout has been set to a value. 619b7579f77SDag-Erling Smørgrav * @param timer: the timer to examine. 620b7579f77SDag-Erling Smørgrav * @return: false if disabled or not set. 621b7579f77SDag-Erling Smørgrav */ 622b7579f77SDag-Erling Smørgrav int comm_timer_is_set(struct comm_timer* timer); 623b7579f77SDag-Erling Smørgrav 624b7579f77SDag-Erling Smørgrav /** 625b7579f77SDag-Erling Smørgrav * Get size of memory used by comm timer. 626b7579f77SDag-Erling Smørgrav * @param timer: the timer to examine. 627b7579f77SDag-Erling Smørgrav * @return size in bytes. 628b7579f77SDag-Erling Smørgrav */ 629b7579f77SDag-Erling Smørgrav size_t comm_timer_get_mem(struct comm_timer* timer); 630b7579f77SDag-Erling Smørgrav 631b7579f77SDag-Erling Smørgrav /** 632b7579f77SDag-Erling Smørgrav * Create a signal handler. Call signal_bind() later to bind to a signal. 633b7579f77SDag-Erling Smørgrav * @param base: communication base to use. 634b7579f77SDag-Erling Smørgrav * @param callback: called when signal is caught. 635b7579f77SDag-Erling Smørgrav * @param cb_arg: user argument to callback 636b7579f77SDag-Erling Smørgrav * @return: the signal struct or NULL on error. 637b7579f77SDag-Erling Smørgrav */ 638b7579f77SDag-Erling Smørgrav struct comm_signal* comm_signal_create(struct comm_base* base, 639b7579f77SDag-Erling Smørgrav void (*callback)(int, void*), void* cb_arg); 640b7579f77SDag-Erling Smørgrav 641b7579f77SDag-Erling Smørgrav /** 642b7579f77SDag-Erling Smørgrav * Bind signal struct to catch a signal. A signle comm_signal can be bound 643b7579f77SDag-Erling Smørgrav * to multiple signals, calling comm_signal_bind multiple times. 644b7579f77SDag-Erling Smørgrav * @param comsig: the communication point, with callback information. 645b7579f77SDag-Erling Smørgrav * @param sig: signal number. 646b7579f77SDag-Erling Smørgrav * @return: true on success. false on error. 647b7579f77SDag-Erling Smørgrav */ 648b7579f77SDag-Erling Smørgrav int comm_signal_bind(struct comm_signal* comsig, int sig); 649b7579f77SDag-Erling Smørgrav 650b7579f77SDag-Erling Smørgrav /** 651b7579f77SDag-Erling Smørgrav * Delete the signal communication point. 652b7579f77SDag-Erling Smørgrav * @param comsig: to delete. 653b7579f77SDag-Erling Smørgrav */ 654b7579f77SDag-Erling Smørgrav void comm_signal_delete(struct comm_signal* comsig); 655b7579f77SDag-Erling Smørgrav 656b7579f77SDag-Erling Smørgrav /** 657b7579f77SDag-Erling Smørgrav * perform accept(2) with error checking. 658b7579f77SDag-Erling Smørgrav * @param c: commpoint with accept fd. 659b7579f77SDag-Erling Smørgrav * @param addr: remote end returned here. 660b7579f77SDag-Erling Smørgrav * @param addrlen: length of remote end returned here. 661b7579f77SDag-Erling Smørgrav * @return new fd, or -1 on error. 662b7579f77SDag-Erling Smørgrav * if -1, error message has been printed if necessary, simply drop 663b7579f77SDag-Erling Smørgrav * out of the reading handler. 664b7579f77SDag-Erling Smørgrav */ 665b7579f77SDag-Erling Smørgrav int comm_point_perform_accept(struct comm_point* c, 666b7579f77SDag-Erling Smørgrav struct sockaddr_storage* addr, socklen_t* addrlen); 667b7579f77SDag-Erling Smørgrav 668b7579f77SDag-Erling Smørgrav /**** internal routines ****/ 669b7579f77SDag-Erling Smørgrav 670b7579f77SDag-Erling Smørgrav /** 671b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 672b7579f77SDag-Erling Smørgrav * handle libevent callback for udp comm point. 673b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 674b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 675b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 676b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 677b7579f77SDag-Erling Smørgrav */ 678b7579f77SDag-Erling Smørgrav void comm_point_udp_callback(int fd, short event, void* arg); 679b7579f77SDag-Erling Smørgrav 680b7579f77SDag-Erling Smørgrav /** 681b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 682b7579f77SDag-Erling Smørgrav * handle libevent callback for udp ancillary data comm point. 683b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 684b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 685b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 686b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 687b7579f77SDag-Erling Smørgrav */ 688b7579f77SDag-Erling Smørgrav void comm_point_udp_ancil_callback(int fd, short event, void* arg); 689b7579f77SDag-Erling Smørgrav 690b7579f77SDag-Erling Smørgrav /** 691b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 692b7579f77SDag-Erling Smørgrav * handle libevent callback for tcp accept comm point 693b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 694b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 695b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 696b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 697b7579f77SDag-Erling Smørgrav */ 698b7579f77SDag-Erling Smørgrav void comm_point_tcp_accept_callback(int fd, short event, void* arg); 699b7579f77SDag-Erling Smørgrav 700b7579f77SDag-Erling Smørgrav /** 701b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 702b7579f77SDag-Erling Smørgrav * handle libevent callback for tcp data comm point 703b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 704b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 705b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 706b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 707b7579f77SDag-Erling Smørgrav */ 708b7579f77SDag-Erling Smørgrav void comm_point_tcp_handle_callback(int fd, short event, void* arg); 709b7579f77SDag-Erling Smørgrav 710b7579f77SDag-Erling Smørgrav /** 711b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 71257bddd21SDag-Erling Smørgrav * handle libevent callback for tcp data comm point 71357bddd21SDag-Erling Smørgrav * @param fd: file descriptor. 71457bddd21SDag-Erling Smørgrav * @param event: event bits from libevent: 71557bddd21SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 71657bddd21SDag-Erling Smørgrav * @param arg: the comm_point structure. 71757bddd21SDag-Erling Smørgrav */ 71857bddd21SDag-Erling Smørgrav void comm_point_http_handle_callback(int fd, short event, void* arg); 71957bddd21SDag-Erling Smørgrav 72057bddd21SDag-Erling Smørgrav /** 72157bddd21SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 722b7579f77SDag-Erling Smørgrav * handle libevent callback for timer comm. 723b7579f77SDag-Erling Smørgrav * @param fd: file descriptor (always -1). 724b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 725b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 726b7579f77SDag-Erling Smørgrav * @param arg: the comm_timer structure. 727b7579f77SDag-Erling Smørgrav */ 728b7579f77SDag-Erling Smørgrav void comm_timer_callback(int fd, short event, void* arg); 729b7579f77SDag-Erling Smørgrav 730b7579f77SDag-Erling Smørgrav /** 731b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 732b7579f77SDag-Erling Smørgrav * handle libevent callback for signal comm. 733b7579f77SDag-Erling Smørgrav * @param fd: file descriptor (used for the signal number). 734b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 735b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 736b7579f77SDag-Erling Smørgrav * @param arg: the internal commsignal structure. 737b7579f77SDag-Erling Smørgrav */ 738b7579f77SDag-Erling Smørgrav void comm_signal_callback(int fd, short event, void* arg); 739b7579f77SDag-Erling Smørgrav 740b7579f77SDag-Erling Smørgrav /** 741b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 742b7579f77SDag-Erling Smørgrav * libevent callback for AF_UNIX fds 743b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 744b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 745b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 746b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 747b7579f77SDag-Erling Smørgrav */ 748b7579f77SDag-Erling Smørgrav void comm_point_local_handle_callback(int fd, short event, void* arg); 749b7579f77SDag-Erling Smørgrav 750b7579f77SDag-Erling Smørgrav /** 751b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 752b7579f77SDag-Erling Smørgrav * libevent callback for raw fd access. 753b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 754b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 755b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 756b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 757b7579f77SDag-Erling Smørgrav */ 758b7579f77SDag-Erling Smørgrav void comm_point_raw_handle_callback(int fd, short event, void* arg); 759b7579f77SDag-Erling Smørgrav 760b7579f77SDag-Erling Smørgrav /** 761b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 762b7579f77SDag-Erling Smørgrav * libevent callback for timeout on slow accept. 763b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 764b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 765b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 766b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 767b7579f77SDag-Erling Smørgrav */ 768b7579f77SDag-Erling Smørgrav void comm_base_handle_slow_accept(int fd, short event, void* arg); 769b7579f77SDag-Erling Smørgrav 770b7579f77SDag-Erling Smørgrav #ifdef USE_WINSOCK 771b7579f77SDag-Erling Smørgrav /** 772b7579f77SDag-Erling Smørgrav * Callback for openssl BIO to on windows detect WSAEWOULDBLOCK and notify 773b7579f77SDag-Erling Smørgrav * the winsock_event of this for proper TCP nonblocking implementation. 774b7579f77SDag-Erling Smørgrav * @param c: comm_point, fd must be set its struct event is registered. 775b7579f77SDag-Erling Smørgrav * @param ssl: openssl SSL, fd must be set so it has a bio. 776b7579f77SDag-Erling Smørgrav */ 777b7579f77SDag-Erling Smørgrav void comm_point_tcp_win_bio_cb(struct comm_point* c, void* ssl); 778b7579f77SDag-Erling Smørgrav #endif 779b7579f77SDag-Erling Smørgrav 780b7579f77SDag-Erling Smørgrav /** see if errno for tcp connect has to be logged or not. This uses errno */ 781b7579f77SDag-Erling Smørgrav int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen); 782b7579f77SDag-Erling Smørgrav 783b7579f77SDag-Erling Smørgrav #endif /* NET_EVENT_H */ 784