blob: aef780527e8a21d47584d630b5ab297ba505a856 [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
5 Copyright (C) 2000-2007 Willy Tarreau - w@1wt.eu
6
7 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>
32
33/* max length of a protcol name, including trailing zero */
34#define PROTO_NAME_LEN 16
35
Willy Tarreaudd815982007-10-16 12:25:14 +020036/* listener state */
37#define LI_NEW 0 /* not initialized yet */
Willy Tarreau92fb9832007-10-16 17:34:28 +020038#define LI_INIT 1 /* attached to the protocol, but not listening yet */
39#define LI_LISTEN 2 /* started, listening but not enabled */
40#define LI_READY 3 /* started, listening and enabled */
41#define LI_FULL 4 /* reached its connection limit */
Willy Tarreaudd815982007-10-16 12:25:14 +020042
Willy Tarreau6fb42e02007-10-28 17:02:33 +010043/* listener socket options */
44#define LI_O_NONE 0x0000
45#define LI_O_NOLINGER 0x0001 /* disable linger on this socket */
46
Willy Tarreaudd815982007-10-16 12:25:14 +020047/* The listener will be directly referenced by the fdtab[] which holds its
48 * socket. The listener provides the protocol-specific accept() function to
49 * the fdtab.
50 */
51struct listener {
52 int fd; /* the listen socket */
Willy Tarreau92fb9832007-10-16 17:34:28 +020053 int state; /* state: NEW, INIT, LISTEN, READY, FULL */
Willy Tarreau6fb42e02007-10-28 17:02:33 +010054 int options; /* socket options : LI_O_* */
Willy Tarreaudd815982007-10-16 12:25:14 +020055 struct sockaddr_storage addr; /* the address we listen to */
56 struct protocol *proto; /* protocol this listener belongs to */
57 int nbconn; /* current number of connections on this listener */
58 int maxconn; /* maximum connections allowed on this listener */
59 struct listener *next; /* next address for the same proxy, or NULL */
60 struct list proto_list; /* list in the protocol header */
61 int (*accept)(int fd); /* accept() function passed to fdtab[] */
62 void (*handler)(struct task *t, struct timeval *next); /* protocol handler */
63 struct timeval *timeout; /* pointer to client-side timeout */
64 void *private; /* any private data which may be used by accept() */
Willy Tarreaue6ad2b12007-10-18 12:45:54 +020065 union { /* protocol-dependant access restrictions */
66 struct { /* UNIX socket permissions */
67 uid_t uid; /* -1 to leave unchanged */
68 gid_t gid; /* -1 to leave unchanged */
69 mode_t mode; /* 0 to leave unchanged */
70 } ux;
71 } perm;
Willy Tarreaudd815982007-10-16 12:25:14 +020072};
73
74/* This structure contains all information needed to easily handle a protocol.
75 * Its primary goal is to ease listeners maintenance. Specifically, the
76 * bind_all() primitive must be used before any fork(), and the enable_all()
77 * primitive must be called after the fork() to enable all fds. Last, the
78 * unbind_all() primitive closes all listeners.
79 */
80struct protocol {
81 char name[PROTO_NAME_LEN]; /* protocol name, zero-terminated */
82 int sock_domain; /* socket domain, as passed to socket() */
83 int sock_type; /* socket type, as passed to socket() */
84 int sock_prot; /* socket protocol, as passed to socket() */
85 sa_family_t sock_family; /* socket family, for sockaddr */
Willy Tarreau106bf272007-10-28 12:09:45 +010086 socklen_t sock_addrlen; /* socket address length, used by bind() */
87 int l3_addrlen; /* layer3 address length, used by hashes */
Willy Tarreaudd815982007-10-16 12:25:14 +020088 int (*read)(int fd); /* generic read function */
89 int (*write)(int fd); /* generic write function */
90 int (*bind_all)(struct protocol *proto); /* bind all unbound listeners */
91 int (*unbind_all)(struct protocol *proto); /* unbind all bound listeners */
92 int (*enable_all)(struct protocol *proto); /* enable all bound listeners */
93 struct list listeners; /* list of listeners using this protocol */
94 int nb_listeners; /* number of listeners */
95 struct list list; /* list of registered protocols */
96};
97
98#endif /* _TYPES_PROTOCOLS_H */
99
100/*
101 * Local variables:
102 * c-indent-level: 8
103 * c-basic-offset: 8
104 * End:
105 */