summaryrefslogtreecommitdiff
path: root/doc/technical/network.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/technical/network.txt')
-rw-r--r--doc/technical/network.txt99
1 files changed, 99 insertions, 0 deletions
diff --git a/doc/technical/network.txt b/doc/technical/network.txt
new file mode 100644
index 0000000..520adc0
--- /dev/null
+++ b/doc/technical/network.txt
@@ -0,0 +1,99 @@
+Overview of the network subsystem
+Adrian Chadd <adrian@creative.net.au>
+
+$Id$
+
+This document is an overview of the new and hopefully improved network
+subsystem.
+
+The code is based loosely upon the network core found in the Squid web cache
+server, with some optimizations for ircd-specific IO patterns.
+
+Filedescriptor IO
+-----------------
+
+Filedescriptor IO is initiated using comm_setselect(). comm_setselect()
+registers interest in reading from or writing to a file descriptor.
+When a filedescriptor is ready for the required IO a callback is called
+from the IO loop.
+
+The comm_setselect() usage is:
+
+void
+comm_setselect(int fd, fdlist_t list, int type, PF *callback, void *cbdata,
+ int timeout)
+
+where:
+ fd filedescriptor
+ list Which list the FD should be put on
+ type IO type. Can currently include:
+ COMM_SELECT_READ - register for read
+ COMM_SELECT_WRITE - register for write
+ callback Function to call when the FD is ready
+ cbdata Data to be passed to above function
+ timeout Update the timeout value. 0 is "don't update".
+
+
+A typical use is:
+
+..
+
+/* Register interest in the FD for a read event */
+comm_setselect(fd, FDLIST_SERVICE, COMM_SELECT_READ, read_callback, read_data,
+ 0);
+
+..
+
+(FD becomes ready for read in the IO loop)
+
+void
+read_callback(int fd, void *data)
+{
+ /* called when the FD becomes ready for read */
+ retval = read(fd, buf, len);
+
+ ..
+ /* Ok, we need to read some more when its ready */
+ comm_setselect(fd, FDLIST_SERVICE, COMM_SELECT_READ, read_callback, data,
+ 0);
+}
+
+Socket timeouts
+---------------
+
+A "socket timeout" is a callback registered to be called when a certain
+amount of time has elapsed. Think of it as an event, but against a FD.
+
+A good example of socket timeouts is in the comm_connect_tcp() code.
+When the connect() begins, comm_settimeout() is called to call
+comm_connect_timeout() if the timeout occurs. Once the connect() completes,
+comm_settimeout() is called with a timeout of 0 and callback of NULL
+to deregister the timeout. If the timeout occurs, comm_connect_timeout()
+is called and the connection attempt is aborted.
+
+
+
+
+Functions
+---------
+
+comm_open() - a socket() wrapper, enforcing fd limitations and tagging the
+ file descriptor with a note
+
+comm_accept() - an accept() wrapper, enforcing fd limitations and tagging
+ the file descriptor with a note
+
+comm_connect_tcp() - attempt an async connect(). Handles DNS lookups if
+ required, and will call the given callback at completion or error
+
+comm_settimeout() - set a callback to be called after a given time period.
+ This is good to implement things like PING checks and connect() timeouts.
+
+Notes:
+
+* All socket creation should go through comm_open() / comm_accept().
+* All socket closing should go through fd_close(). comm_close() isn't
+ implemented yet.
+* comm_connect_tcp() is your best friend. :-)
+* *ALL* network sockets should be non-blocking. If your OS doesn't support
+ non-blocking sockets, you shouldn't be here.