listen_dnsport.c File Reference

This file has functions to get queries from clients. More...

#include "services/listen_dnsport.h"
#include "services/outside_network.h"
#include "util/netevent.h"
#include "util/log.h"
#include "util/config_file.h"
#include "util/net_help.h"
#include <sys/types.h>
#include <netdb.h>
#include <fcntl.h>

Defines

#define TCP_BACKLOG   5
 number of queued TCP connections for listen()

Functions

static void verbose_print_addr (struct addrinfo *addr)
 Debug print of the getaddrinfo returned address.
int create_udp_sock (int family, int socktype, struct sockaddr *addr, socklen_t addrlen, int v6only, int *inuse, int *noproto)
 Create and bind nonblocking UDP socket.
static int create_tcp_accept_sock (struct addrinfo *addr, int v6only, int *noproto)
 Create and bind TCP listening socket.
static int make_sock (int stype, const char *ifname, const char *port, struct addrinfo *hints, int v6only, int *noip6)
 Create socket from getaddrinfo results.
static int port_insert (struct listen_port **list, int s, enum listen_type ftype)
 Add port to open ports list.
static int set_recvpktinfo (int s, int family)
 set fd to receive source address packet info
static int ports_create_if (const char *ifname, int do_auto, int do_udp, int do_tcp, struct addrinfo *hints, const char *port, struct listen_port **list)
 Helper for ports_open.
static int listen_cp_insert (struct comm_point *c, struct listen_dnsport *front)
 Add items to commpoint list in front.
struct listen_dnsportlisten_create (struct comm_base *base, struct listen_port *ports, size_t bufsize, int tcp_accept_count, comm_point_callback_t *cb, void *cb_arg)
 Create commpoints with for this thread for the shared ports.
void listen_delete (struct listen_dnsport *front)
 delete the listening structure
void listen_pushback (struct listen_dnsport *listen)
 Stop listening to the dnsports.
void listen_resume (struct listen_dnsport *listen)
 Start listening again to the dnsports.
struct listen_portlistening_ports_open (struct config_file *cfg)
 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.
void listening_ports_free (struct listen_port *list)
 Close and delete the (list of) listening ports.
size_t listen_get_mem (struct listen_dnsport *listen)
 get memory size used by the listening structs


Detailed Description

This file has functions to get queries from clients.


Function Documentation

static void verbose_print_addr ( struct addrinfo *  addr  )  [static]

Debug print of the getaddrinfo returned address.

Parameters:
addr,: the address returned.

References VERB_ALGO, verbose(), and verbosity.

Referenced by create_tcp_accept_sock(), and make_sock().

int create_udp_sock ( int  family,
int  socktype,
struct sockaddr *  addr,
socklen_t  addrlen,
int  v6only,
int *  inuse,
int *  noproto 
)

Create and bind nonblocking UDP socket.

Parameters:
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.
Returns:
: the socket. -1 on error.

References fd_set_nonblock(), and log_err().

Referenced by make_sock(), and udp_sockport().

static int create_tcp_accept_sock ( struct addrinfo *  addr,
int  v6only,
int *  noproto 
) [static]

Create and bind TCP listening socket.

Parameters:
addr,: address info ready to make socket.
v6only,: enable ip6 only flag on ip6 sockets.
noproto,: if error caused by lack of protocol support.
Returns:
: the socket. -1 on error.

References fd_set_nonblock(), log_err(), TCP_BACKLOG, and verbose_print_addr().

Referenced by make_sock().

static int port_insert ( struct listen_port **  list,
int  s,
enum listen_type  ftype 
) [static]

Add port to open ports list.

Parameters:
list,: list head. changed.
s,: fd.
ftype,: if fd is UDP.
Returns:
false on failure. list in unchanged then.

References listen_port::fd, listen_port::ftype, and listen_port::next.

Referenced by ports_create_if().

static int ports_create_if ( const char *  ifname,
int  do_auto,
int  do_udp,
int  do_tcp,
struct addrinfo *  hints,
const char *  port,
struct listen_port **  list 
) [static]

Helper for ports_open.

Creates one interface (or NULL for default).

Parameters:
ifname,: The interface ip address.
do_auto,: use automatic interface detection. If enabled, then ifname must be the wildcard name.
do_udp,: if udp should be used.
do_tcp,: if udp should be used.
hints,: for getaddrinfo. family and flags have to be set by caller.
port,: Port number to use (as string).
list,: list of open ports, appended to, changed to point to list head.
Returns:
: returns false on error.

References listen_type_tcp, listen_type_udp, listen_type_udpancil, log_warn(), make_sock(), port_insert(), and set_recvpktinfo().

Referenced by listening_ports_open().

static int listen_cp_insert ( struct comm_point c,
struct listen_dnsport front 
) [static]

Add items to commpoint list in front.

Parameters:
c,: commpoint to add.
front,: listen struct.
Returns:
: false on failure.

References listen_list::com, listen_dnsport::cps, and listen_list::next.

Referenced by listen_create().

struct listen_dnsport* listen_create ( struct comm_base base,
struct listen_port ports,
size_t  bufsize,
int  tcp_accept_count,
comm_point_callback_t cb,
void *  cb_arg 
) [read]

Create commpoints with for this thread for the shared ports.

Parameters:
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.
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.
Returns:
: the malloced listening structure, ready for use. NULL on error.

Referenced by worker_init().

void listen_delete ( struct listen_dnsport listen  ) 

delete the listening structure

Parameters:
listen,: listening structure.

Referenced by listen_create(), and worker_delete().

void listen_pushback ( struct listen_dnsport listen  ) 

Stop listening to the dnsports.

Ports are still open but not checked for readability - performs pushback of the load.

Parameters:
listen,: the listening structs to stop listening on. Note that udp and tcp-accept handlers stop, but ongoing tcp-handlers are kept going, since its rude to 'reset connection by peer' them, instead, we keep them and the callback will be called when its ready. It can be dropped at that time. New tcp and udp queries can be served by other threads.

void listen_resume ( struct listen_dnsport listen  ) 

Start listening again to the dnsports.

Call after the listen_pushback has been called.

Parameters:
listen,: the listening structs to stop listening on.

struct listen_port* listening_ports_open ( struct config_file cfg  )  [read]

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.

Parameters:
cfg,: settings on what ports to open.
Returns:
: linked list of ports or NULL on error.

Referenced by daemon_open_shared_ports().

size_t listen_get_mem ( struct listen_dnsport listen  ) 

get memory size used by the listening structs

Parameters:
listen,: listening structure.
Returns:
: size in bytes.

Referenced by worker_mem_report().


Generated on Sun Sep 21 16:24:55 2008 for unbound by  doxygen 1.5.6