blob: 2d0439b7d6cc1ddd9132fde98f1e722d2605ef32 [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 include/types/session.h
3 This file defines everything related to sessions.
4
Willy Tarreau39f7e6d2008-03-17 21:38:24 +01005 Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
Willy Tarreaubaaee002006-06-26 02:48:02 +02006
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_SESSION_H
23#define _TYPES_SESSION_H
24
25
26#include <sys/time.h>
27#include <unistd.h>
28#include <netinet/in.h>
29#include <arpa/inet.h>
30
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020031#include <common/config.h>
Willy Tarreau2dd0d472006-06-29 17:53:05 +020032#include <common/mini-clist.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020033
34#include <types/buffers.h>
Willy Tarreau3bac9ff2007-03-18 17:31:28 +010035#include <types/proto_http.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020036#include <types/proxy.h>
37#include <types/queue.h>
38#include <types/server.h>
Willy Tarreaufa7e1022008-10-19 07:30:41 +020039#include <types/stream_interface.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020040#include <types/task.h>
41
42
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +010043/* various session flags, bits values 0x01 to 0x100 (shift 0) */
Willy Tarreaubaaee002006-06-26 02:48:02 +020044#define SN_DIRECT 0x00000001 /* connection made on the server matching the client cookie */
Willy Tarreau3d300592007-03-18 18:34:41 +010045#define SN_ASSIGNED 0x00000002 /* no need to assign a server to this session */
46#define SN_ADDR_SET 0x00000004 /* this session's server address has been set */
47#define SN_BE_ASSIGNED 0x00000008 /* a backend was assigned. Conns are accounted. */
48#define SN_CONN_CLOSED 0x00000010 /* "Connection: close" was present or added */
49#define SN_MONITOR 0x00000020 /* this session comes from a monitoring system */
50#define SN_SELF_GEN 0x00000040 /* the proxy generates data for the client (eg: stats) */
Willy Tarreau14c8aac2007-05-08 19:46:30 +020051#define SN_FRT_ADDR_SET 0x00000080 /* set if the frontend address has been filled */
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +010052#define SN_REDISP 0x00000100 /* set if this session was redispatched from one server to another */
Willy Tarreau541b5c22008-01-06 23:34:21 +010053#define SN_CONN_TAR 0x00000200 /* set if this session is turning around before reconnecting */
Willy Tarreau21d2af32008-02-14 20:25:24 +010054#define SN_REDIRECTABLE 0x00000400 /* set if this session is redirectable (GET or HEAD) */
Willy Tarreau3d300592007-03-18 18:34:41 +010055/* unused: 0x00000800 */
Willy Tarreaubaaee002006-06-26 02:48:02 +020056
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +010057/* session termination conditions, bits values 0x1000 to 0x7000 (0-7 shift 12) */
58#define SN_ERR_NONE 0x00000000
59#define SN_ERR_CLITO 0x00001000 /* client time-out */
60#define SN_ERR_CLICL 0x00002000 /* client closed (read/write error) */
61#define SN_ERR_SRVTO 0x00003000 /* server time-out, connect time-out */
62#define SN_ERR_SRVCL 0x00004000 /* server closed (connect/read/write error) */
63#define SN_ERR_PRXCOND 0x00005000 /* the proxy decided to close (deny...) */
64#define SN_ERR_RESOURCE 0x00006000 /* the proxy encountered a lack of a local resources (fd, mem, ...) */
65#define SN_ERR_INTERNAL 0x00007000 /* the proxy encountered an internal error */
66#define SN_ERR_MASK 0x00007000 /* mask to get only session error flags */
67#define SN_ERR_SHIFT 12 /* bit shift */
Willy Tarreau3d300592007-03-18 18:34:41 +010068/* unused: 0x00008000 */
Willy Tarreaubaaee002006-06-26 02:48:02 +020069
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +010070/* session state at termination, bits values 0x10000 to 0x70000 (0-7 shift 16) */
71#define SN_FINST_R 0x00010000 /* session ended during client request */
72#define SN_FINST_C 0x00020000 /* session ended during server connect */
73#define SN_FINST_H 0x00030000 /* session ended during server headers */
74#define SN_FINST_D 0x00040000 /* session ended during data phase */
75#define SN_FINST_L 0x00050000 /* session ended while pushing last data to client */
76#define SN_FINST_Q 0x00060000 /* session ended while waiting in queue for a server slot */
77#define SN_FINST_T 0x00070000 /* session ended tarpitted */
78#define SN_FINST_MASK 0x00070000 /* mask to get only final session state flags */
79#define SN_FINST_SHIFT 16 /* bit shift */
80/* unused: 0x00080000 */
81
Willy Tarreau0f7562b2007-01-07 15:46:13 +010082/* WARNING: if new fields are added, they must be initialized in event_accept()
83 * and freed in session_free() !
84 */
Willy Tarreau7c669d72008-06-20 15:04:11 +020085
Willy Tarreauf8533202008-08-16 14:55:08 +020086/* Termination sequence tracing.
87 *
88 * These values have to be set into the field term_trace of a session when
89 * closing a session (half or full). They are only meant for post-mortem
90 * analysis. The value must be assigned this way :
91 * trace_term(s, TT_XXX);
92 *
93 * One TT_XXX value is assigned to each location in the code which may be
94 * involved in a connection closing. Since a full session close generally
95 * involves 4 steps, we will be able to read these steps afterwards by simply
96 * checking the code. Value TT_NONE is zero and must never be set, as it means
97 * the connection was not closed. Value TT_ANON must be used when no value was
98 * assigned to a specific code part. Never ever reuse an already assigned code
99 * as it will defeat the purpose of this trace. It is wise to use a per-file
100 * anonymous value though.
101 */
102#define TT_BIT_SHIFT 8
103enum {
104 TT_NONE = 0,
105 TT_ANON = 1,
106 TT_CLIENT = 0x10,
107 TT_CLIENT_1,
108 TT_CLIENT_2,
109 TT_HTTP_CLI = 0x20,
110 TT_HTTP_CLI_1,
111 TT_HTTP_CLI_2,
112 TT_HTTP_CLI_3,
113 TT_HTTP_CLI_4,
114 TT_HTTP_CLI_5,
115 TT_HTTP_CLI_6,
116 TT_HTTP_CLI_7,
117 TT_HTTP_CLI_8,
118 TT_HTTP_CLI_9,
119 TT_HTTP_CLI_10,
120 TT_HTTP_SRV = 0x30,
121 TT_HTTP_SRV_1,
122 TT_HTTP_SRV_2,
123 TT_HTTP_SRV_3,
124 TT_HTTP_SRV_4,
125 TT_HTTP_SRV_5,
126 TT_HTTP_SRV_6,
127 TT_HTTP_SRV_7,
128 TT_HTTP_SRV_8,
129 TT_HTTP_SRV_9,
130 TT_HTTP_SRV_10,
131 TT_HTTP_SRV_11,
132 TT_HTTP_SRV_12,
133 TT_HTTP_SRV_13,
134 TT_HTTP_SRV_14,
135 TT_HTTP_CNT = 0x40,
136 TT_HTTP_CNT_1,
137 TT_HTTP_URI = 0x50,
138 TT_HTTP_URI_1,
139};
140
141
Willy Tarreau7c669d72008-06-20 15:04:11 +0200142/*
143 * Note: some session flags have dependencies :
144 * - SN_DIRECT cannot exist without SN_ASSIGNED, because a server is
145 * immediately assigned when SN_DIRECT is determined. Both must be cleared
146 * when clearing SN_DIRECT (eg: redispatch).
147 * - ->srv has no meaning without SN_ASSIGNED and must not be checked without
148 * it. ->prev_srv should be used to check previous ->srv. If SN_ASSIGNED is
149 * set and sess->srv is NULL, then it is a dispatch or proxy mode.
150 * - a session being processed has srv_conn set.
151 * - srv_conn might remain after SN_DIRECT has been reset, but the assigned
152 * server should eventually be released.
153 */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200154struct session {
155 struct task *task; /* the task associated with this session */
156 /* application specific below */
Willy Tarreau73de9892006-11-30 11:40:23 +0100157 struct proxy *fe; /* the proxy this session depends on for the client side */
Willy Tarreau73de9892006-11-30 11:40:23 +0100158 struct proxy *be; /* the proxy this session depends on for the server side */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200159 int cli_fd; /* the client side fd */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200160 int cli_state; /* state of the client side */
161 int srv_state; /* state of the server side */
162 int conn_retries; /* number of connect retries left */
163 int flags; /* some flags describing the session */
Willy Tarreauf8533202008-08-16 14:55:08 +0200164 unsigned term_trace; /* term trace: 4*8 bits indicating which part of the code closed */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200165 struct buffer *req; /* request buffer */
166 struct buffer *rep; /* response buffer */
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200167 struct stream_interface si[2]; /* client and server stream interfaces */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200168 struct sockaddr_storage cli_addr; /* the client address */
Willy Tarreau14c8aac2007-05-08 19:46:30 +0200169 struct sockaddr_storage frt_addr; /* the frontend address reached by the client if SN_FRT_ADDR_SET is set */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200170 struct sockaddr_in srv_addr; /* the address to connect to */
Willy Tarreau7c669d72008-06-20 15:04:11 +0200171 struct server *srv; /* the server the session will be running or has been running on */
172 struct server *srv_conn; /* session already has a slot on a server and is not in queue */
173 struct server *prev_srv; /* the server the was running on, after a redispatch, otherwise NULL */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200174 struct pendconn *pend_pos; /* if not NULL, points to the position in the pending queue */
Willy Tarreaub326fcc2007-03-03 13:54:32 +0100175 struct http_txn txn; /* current HTTP transaction being processed. Should become a list. */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200176 struct {
177 int logwait; /* log fields waiting to be collected : LW_* */
Willy Tarreaub7f694f2008-06-22 17:18:02 +0200178 struct timeval accept_date; /* date of the accept() in user date */
179 struct timeval tv_accept; /* date of the accept() in internal date (monotonic) */
Willy Tarreau70089872008-06-13 21:12:51 +0200180 struct timeval tv_request; /* date the request arrives, {0,0} if never occurs */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200181 long t_queue; /* delay before the session gets out of the connect queue, -1 if never occurs */
182 long t_connect; /* delay before the connect() to the server succeeds, -1 if never occurs */
183 long t_data; /* delay before the first data byte from the server ... */
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100184 unsigned long t_close; /* total session duration */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200185 unsigned long srv_queue_size; /* number of sessions waiting for a connect slot on this server at accept() time (in direct assignment) */
186 unsigned long prx_queue_size; /* overall number of sessions waiting for a connect slot on this instance at accept() time */
Willy Tarreau35d66b02007-01-02 00:28:21 +0100187 long long bytes_in; /* number of bytes transferred from the client to the server */
188 long long bytes_out; /* number of bytes transferred from the server to the client */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200189 } logs;
190 short int data_source; /* where to get the data we generate ourselves */
191 short int data_state; /* where to get the data we generate ourselves */
192 union {
193 struct {
194 struct proxy *px;
195 struct server *sv;
196 short px_st, sv_st; /* DATA_ST_INIT or DATA_ST_DATA */
Willy Tarreau39f7e6d2008-03-17 21:38:24 +0100197 unsigned int flags; /* STAT_* */
Krzysztof Piotr Oledzki2c6962c2008-03-02 02:42:14 +0100198 int iid, type, sid; /* proxy id, type and service id if bounding of stats is enabled */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200199 } stats;
Willy Tarreau73de9892006-11-30 11:40:23 +0100200 } data_ctx; /* used by produce_content to dump the stats right now */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200201 unsigned int uniq_id; /* unique ID used for the traces */
202};
203
204
Willy Tarreaubaaee002006-06-26 02:48:02 +0200205#endif /* _TYPES_SESSION_H */
206
207/*
208 * Local variables:
209 * c-indent-level: 8
210 * c-basic-offset: 8
211 * End:
212 */