blob: 3dcb2e7400c5227ee5098cb24ca068d231a93984 [file] [log] [blame]
Willy Tarreaudd815982007-10-16 12:25:14 +02001/*
2 include/types/protocols.h
3 This file defines the structures used by generic network protocols.
4
Willy Tarreau2c9f5b12009-08-16 19:12:36 +02005 Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu
Willy Tarreau55a8d0e2008-11-30 18:47:21 +01006
Willy Tarreaudd815982007-10-16 12:25:14 +02007 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation, version 2.1
10 exclusively.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22#ifndef _TYPES_PROTOCOLS_H
23#define _TYPES_PROTOCOLS_H
24
25#include <sys/types.h>
26#include <sys/socket.h>
Willy Tarreaue6ad2b12007-10-18 12:45:54 +020027#include <sys/stat.h>
28#include <sys/un.h>
Willy Tarreaudd815982007-10-16 12:25:14 +020029
30#include <common/config.h>
31#include <common/mini-clist.h>
Willy Tarreau45cb4fb2009-10-26 21:10:04 +010032#include <eb32tree.h>
Willy Tarreaudd815982007-10-16 12:25:14 +020033
Krzysztof Piotr Oledzkiaeebf9b2009-10-04 15:43:17 +020034#include <types/counters.h>
Willy Tarreau55a8d0e2008-11-30 18:47:21 +010035#include <types/task.h>
36
Willy Tarreaudd815982007-10-16 12:25:14 +020037/* max length of a protcol name, including trailing zero */
38#define PROTO_NAME_LEN 16
39
Willy Tarreaudd815982007-10-16 12:25:14 +020040/* listener state */
41#define LI_NEW 0 /* not initialized yet */
Willy Tarreaudabf2e22007-10-28 21:59:24 +010042#define LI_INIT 1 /* all parameters filled in, but not assigned yet */
43#define LI_ASSIGNED 2 /* assigned to the protocol, but not listening yet */
44#define LI_LISTEN 3 /* started, listening but not enabled */
45#define LI_READY 4 /* started, listening and enabled */
46#define LI_FULL 5 /* reached its connection limit */
47
48/* Listener transitions
49 * calloc() set() add_listener() bind()
50 * -------> NEW ----> INIT ----------> ASSIGNED -----> LISTEN
51 * <------- <---- <---------- <-----
52 * free() bzero() del_listener() unbind()
53 *
54 * The file descriptor is valid only during these three states :
55 *
56 * disable()
57 * LISTEN <------------ READY
58 * A| ------------> |A
59 * || !max & enable() ||
60 * || ||
61 * || max ||
62 * || max & enable() V| !max
63 * |+---------------> FULL
64 * +-----------------
65 * disable()
66 *
67 */
Willy Tarreaudd815982007-10-16 12:25:14 +020068
Willy Tarreau6fb42e02007-10-28 17:02:33 +010069/* listener socket options */
70#define LI_O_NONE 0x0000
71#define LI_O_NOLINGER 0x0001 /* disable linger on this socket */
Willy Tarreaub1e52e82008-01-13 14:49:51 +010072#define LI_O_FOREIGN 0x0002 /* permit listening on foreing addresses */
Willy Tarreau9ea05a72009-06-14 12:07:01 +020073#define LI_O_NOQUICKACK 0x0004 /* disable quick ack of immediate data (linux) */
Willy Tarreaucb6cd432009-10-13 07:34:14 +020074#define LI_O_DEF_ACCEPT 0x0008 /* wait up to 1 second for data before accepting */
Willy Tarreaua5c0ab22010-05-31 10:30:33 +020075#define LI_O_TCP_RULES 0x0010 /* run TCP rules checks on the incoming connection */
Willy Tarreaude3041d2010-05-31 10:56:17 +020076#define LI_O_CHK_MONNET 0x0020 /* check the source against a monitor-net rule */
Willy Tarreau8a956912010-10-15 14:27:08 +020077#define LI_O_ACC_PROXY 0x0040 /* find the proxied address in the first request line */
Willy Tarreau6fb42e02007-10-28 17:02:33 +010078
Willy Tarreaudd815982007-10-16 12:25:14 +020079/* The listener will be directly referenced by the fdtab[] which holds its
80 * socket. The listener provides the protocol-specific accept() function to
81 * the fdtab.
82 */
83struct listener {
84 int fd; /* the listen socket */
Krzysztof Piotr Oledzki052d4fd2009-10-04 14:52:57 +020085 char *name; /* */
86 int luid; /* listener universally unique ID, used for SNMP */
Willy Tarreaudabf2e22007-10-28 21:59:24 +010087 int state; /* state: NEW, INIT, ASSIGNED, LISTEN, READY, FULL */
Willy Tarreau6fb42e02007-10-28 17:02:33 +010088 int options; /* socket options : LI_O_* */
Krzysztof Piotr Oledzkiaeebf9b2009-10-04 15:43:17 +020089 struct licounters *counters; /* statistics counters */
Willy Tarreaudd815982007-10-16 12:25:14 +020090 struct sockaddr_storage addr; /* the address we listen to */
91 struct protocol *proto; /* protocol this listener belongs to */
92 int nbconn; /* current number of connections on this listener */
93 int maxconn; /* maximum connections allowed on this listener */
Willy Tarreauc73ce2b2008-01-06 10:55:10 +010094 unsigned int backlog; /* if set, listen backlog */
Willy Tarreaudd815982007-10-16 12:25:14 +020095 struct listener *next; /* next address for the same proxy, or NULL */
96 struct list proto_list; /* list in the protocol header */
Willy Tarreaueb472682010-05-28 18:46:57 +020097 int (*accept)(struct listener *l, int fd, struct sockaddr_storage *addr); /* upper layer's accept() */
Willy Tarreau26c25062009-03-08 09:38:41 +010098 struct task * (*handler)(struct task *t); /* protocol handler. It is a task */
Willy Tarreau0c303ee2008-07-07 00:09:58 +020099 int *timeout; /* pointer to client-side timeout */
Willy Tarreaueb472682010-05-28 18:46:57 +0200100 struct proxy *frontend; /* the frontend this listener belongs to, or NULL */
Willy Tarreau3bc13772008-12-07 11:50:35 +0100101 unsigned int analysers; /* bitmap of required protocol analysers */
Willy Tarreau2c9f5b12009-08-16 19:12:36 +0200102 int nice; /* nice value to assign to the instanciated tasks */
Willy Tarreaue6ad2b12007-10-18 12:45:54 +0200103 union { /* protocol-dependant access restrictions */
104 struct { /* UNIX socket permissions */
105 uid_t uid; /* -1 to leave unchanged */
106 gid_t gid; /* -1 to leave unchanged */
107 mode_t mode; /* 0 to leave unchanged */
Willy Tarreau6162db22009-10-10 17:13:00 +0200108 int level; /* access level (ACCESS_LVL_*) */
Willy Tarreaue6ad2b12007-10-18 12:45:54 +0200109 } ux;
110 } perm;
Willy Tarreau5e6e2042009-02-04 17:19:29 +0100111 char *interface; /* interface name or NULL */
Willy Tarreaube1b9182009-06-14 18:48:19 +0200112 int maxseg; /* for TCP, advertised MSS */
Willy Tarreau90a570f2009-10-04 20:54:54 +0200113
114 struct {
115 const char *file; /* file where the section appears */
116 int line; /* line where the section appears */
Willy Tarreau53fb4ae2009-10-04 23:04:08 +0200117 struct eb32_node id; /* place in the tree of used IDs */
Willy Tarreau90a570f2009-10-04 20:54:54 +0200118 } conf; /* config information */
Willy Tarreaudd815982007-10-16 12:25:14 +0200119};
120
121/* This structure contains all information needed to easily handle a protocol.
122 * Its primary goal is to ease listeners maintenance. Specifically, the
123 * bind_all() primitive must be used before any fork(), and the enable_all()
124 * primitive must be called after the fork() to enable all fds. Last, the
125 * unbind_all() primitive closes all listeners.
126 */
127struct protocol {
128 char name[PROTO_NAME_LEN]; /* protocol name, zero-terminated */
129 int sock_domain; /* socket domain, as passed to socket() */
130 int sock_type; /* socket type, as passed to socket() */
131 int sock_prot; /* socket protocol, as passed to socket() */
132 sa_family_t sock_family; /* socket family, for sockaddr */
Willy Tarreau106bf272007-10-28 12:09:45 +0100133 socklen_t sock_addrlen; /* socket address length, used by bind() */
134 int l3_addrlen; /* layer3 address length, used by hashes */
Willy Tarreaueb472682010-05-28 18:46:57 +0200135 int (*accept)(int fd); /* generic accept function */
Willy Tarreaudd815982007-10-16 12:25:14 +0200136 int (*read)(int fd); /* generic read function */
137 int (*write)(int fd); /* generic write function */
Emeric Bruncf20bf12010-10-22 16:06:11 +0200138 int (*bind)(struct listener *l, char *errmsg, int errlen); /* bind a listener */
139 int (*bind_all)(struct protocol *proto, char *errmsg, int errlen); /* bind all unbound listeners */
Willy Tarreaudd815982007-10-16 12:25:14 +0200140 int (*unbind_all)(struct protocol *proto); /* unbind all bound listeners */
141 int (*enable_all)(struct protocol *proto); /* enable all bound listeners */
Willy Tarreaudabf2e22007-10-28 21:59:24 +0100142 int (*disable_all)(struct protocol *proto); /* disable all bound listeners */
Willy Tarreaudd815982007-10-16 12:25:14 +0200143 struct list listeners; /* list of listeners using this protocol */
144 int nb_listeners; /* number of listeners */
145 struct list list; /* list of registered protocols */
146};
147
148#endif /* _TYPES_PROTOCOLS_H */
149
150/*
151 * Local variables:
152 * c-indent-level: 8
153 * c-basic-offset: 8
154 * End:
155 */