unbound/util/netevent.h
Wouter Wijngaards df792cc3af doc fixup.
git-svn-id: file:///svn/unbound/trunk@26 be551aaa-1e26-0410-a405-d3ace91eadb9
2007-01-22 15:30:47 +00:00

105 lines
3.1 KiB
C

/*
* util/netevent.h - event notification
*
* Copyright (c) 2007, NLnet Labs. All rights reserved.
*
* See LICENSE for the license.
*
*/
/**
* \file
*
* This file contains event notification functions.
*
* There are three types of communication points
* o UDP socket - perthread buffer.
* o TCP-accept socket - array of TCP-sockets, socketcount.
* o TCP socket - own buffer, parent-TCPaccept, read/write state,
* number of bytes read/written, timeout.
*
* There are sockets aimed towards our clients and towards the internet.
* o frontside - aimed towards our clients, queries come in, answers back.
* o behind - aimed towards internet, to the authoritative DNS servers.
*
*/
#ifndef NET_EVENT_H
#define NET_EVENT_H
#include "config.h"
struct buffer;
/** internal event notification data storage structure. */
struct internal_event;
/** Communication point to the network */
struct comm_point {
/** behind the scenes structure, with say libevent info. alloced. */
struct internal_event* ev;
/** file descriptor for communication point */
int fd;
/** timeout (NULL if it does not). Malloced. */
struct timeval *timeout;
/** buffer pointer. Either to perthread, or own buffer or NULL */
struct buffer *buffer;
/* -------- TCP Handler -------- */
/** Read/Write state for TCP */
int tcp_is_reading;
/** The current read/write count for TCP */
size_t tcp_byte_count;
/** parent communication point (for TCP sockets) */
struct comm_point tcp_parent;
/* -------- TCP Accept -------- */
/** current number of TCP connections on this socket */
int cur_tcp_count;
/** the number of TCP handlers for this tcp-accept socket */
int max_tcp_count;
/** malloced array of tcp handlers for a tcp-accept,
of size max_tcp_count. */
struct comm_point *tcp_handlers;
/** linked list of free tcp_handlers to use for new queries.
For tcp_accept the first entry, for tcp_handlers the next one. */
struct comm_point *tcp_free;
/** is this a UDP, TCP-accept or TCP socket. */
enum comm_point_type {
/** UDP socket - handle datagrams. */
comm_udp,
/** TCP accept socket - only creates handlers if readable. */
comm_tcp_accept,
/** TCP handler socket - handle byteperbyte readwrite. */
comm_tcp
} type;
/** what to do when read/write is done.
For a query this means it is read in and ready to be processed.
After that the buffer will be sent back to client.
tcp_accept does not get called back, is NULL then.
udp frontside: called after readdone. sendafter.
tcp frontside: called readdone, sendafter. close.
udp behind: called after readdone. No send after.
tcp behind: write done, read done, then called. No send after.
declare as:
int my_callback(struct comm_point*, void* cb_arg, int timeout);
if the routine returns 0, no answer is sent back.
For TCP handlers after the answer is sent back the fd is closed.
If a timeout happens, TCP handler is closed, and callback with
timeout=1 is called.
*/
int (*)(struct comm_point*, void*) callback;
/** argument to pass to callback. */
void *cb_arg;
};
#endif /* NET_EVENT_H */