2
* include/proto/channel.h
3
* Channel management definitions, macros and inline functions.
5
* Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
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
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.
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
22
#ifndef _PROTO_CHANNEL_H
23
#define _PROTO_CHANNEL_H
29
#include <common/config.h>
30
#include <common/chunk.h>
31
#include <common/memory.h>
32
#include <common/ticks.h>
33
#include <common/time.h>
35
#include <types/global.h>
37
extern struct pool_head *pool2_channel;
39
/* perform minimal intializations, report 0 in case of error, 1 if OK. */
42
unsigned long long __channel_forward(struct channel *chn, unsigned long long bytes);
44
/* SI-to-channel functions working with buffers */
45
int bi_putblk(struct channel *chn, const char *str, int len);
46
int bi_putchr(struct channel *chn, char c);
47
int bo_inject(struct channel *chn, const char *msg, int len);
48
int bo_getline(struct channel *chn, char *str, int len);
49
int bo_getblk(struct channel *chn, char *blk, int len, int offset);
51
/* Initialize all fields in the channel. */
52
static inline void channel_init(struct channel *chn)
56
chn->buf->p = chn->buf->data;
58
chn->last_read = now_ms;
59
chn->xfer_small = chn->xfer_large = 0;
67
/* Schedule up to <bytes> more bytes to be forwarded via the channel without
68
* notifying the owner task. Any data pending in the buffer are scheduled to be
69
* sent as well, in the limit of the number of bytes to forward. This must be
70
* the only method to use to schedule bytes to be forwarded. If the requested
71
* number is too large, it is automatically adjusted. The number of bytes taken
72
* into account is returned. Directly touching ->to_forward will cause lockups
73
* when buf->o goes down to zero if nobody is ready to push the remaining data.
75
static inline unsigned long long channel_forward(struct channel *chn, unsigned long long bytes)
77
/* hint: avoid comparisons on long long for the fast case, since if the
78
* length does not fit in an unsigned it, it will never be forwarded at
82
unsigned int bytes32 = bytes;
84
if (bytes32 <= chn->buf->i) {
85
/* OK this amount of bytes might be forwarded at once */
86
b_adv(chn->buf, bytes32);
90
return __channel_forward(chn, bytes);
93
/*********************************************************************/
94
/* These functions are used to compute various channel content sizes */
95
/*********************************************************************/
97
/* Reports non-zero if the channel is empty, which means both its
98
* buffer and pipe are empty. The construct looks strange but is
99
* jump-less and much more efficient on both 32 and 64-bit than
102
static inline unsigned int channel_is_empty(struct channel *c)
104
return !(c->buf->o | (long)c->pipe);
107
/* Returns non-zero if the buffer input has all of its reserve available. This
108
* is used to decide when a request or response may be parsed when some data
109
* from a previous exchange might still be present.
111
static inline int channel_reserved(const struct channel *chn)
113
int rem = chn->buf->size;
117
rem -= global.tune.maxrewrite;
121
/* Returns non-zero if the buffer input is considered full. This is used to
122
* decide when to stop reading into a buffer when we want to ensure that we
123
* leave the reserve untouched after all pending outgoing data are forwarded.
124
* The reserved space is taken into account if ->to_forward indicates that an
125
* end of transfer is close to happen. Note that both ->buf->o and ->to_forward
126
* are considered as available since they're supposed to leave the buffer. The
127
* test is optimized to avoid as many operations as possible for the fast case
128
* and to be used as an "if" condition.
130
static inline int channel_full(const struct channel *chn)
132
int rem = chn->buf->size;
137
return 1; /* buffer already full */
139
if (chn->to_forward >= chn->buf->size ||
140
(CHN_INFINITE_FORWARD < MAX_RANGE(typeof(chn->buf->size)) && // just there to ensure gcc
141
chn->to_forward == CHN_INFINITE_FORWARD)) // avoids the useless second
142
return 0; // test whenever possible
144
rem -= global.tune.maxrewrite;
146
rem += chn->to_forward;
150
/* Returns true if the channel's input is already closed */
151
static inline int channel_input_closed(struct channel *chn)
153
return ((chn->flags & CF_SHUTR) != 0);
156
/* Returns true if the channel's output is already closed */
157
static inline int channel_output_closed(struct channel *chn)
159
return ((chn->flags & CF_SHUTW) != 0);
162
/* Check channel timeouts, and set the corresponding flags. The likely/unlikely
163
* have been optimized for fastest normal path. The read/write timeouts are not
164
* set if there was activity on the channel. That way, we don't have to update
165
* the timeout on every I/O. Note that the analyser timeout is always checked.
167
static inline void channel_check_timeouts(struct channel *chn)
169
if (likely(!(chn->flags & (CF_SHUTR|CF_READ_TIMEOUT|CF_READ_ACTIVITY|CF_READ_NOEXP))) &&
170
unlikely(tick_is_expired(chn->rex, now_ms)))
171
chn->flags |= CF_READ_TIMEOUT;
173
if (likely(!(chn->flags & (CF_SHUTW|CF_WRITE_TIMEOUT|CF_WRITE_ACTIVITY))) &&
174
unlikely(tick_is_expired(chn->wex, now_ms)))
175
chn->flags |= CF_WRITE_TIMEOUT;
177
if (likely(!(chn->flags & CF_ANA_TIMEOUT)) &&
178
unlikely(tick_is_expired(chn->analyse_exp, now_ms)))
179
chn->flags |= CF_ANA_TIMEOUT;
182
/* Erase any content from channel <buf> and adjusts flags accordingly. Note
183
* that any spliced data is not affected since we may not have any access to
186
static inline void channel_erase(struct channel *chn)
191
chn->buf->p = chn->buf->data;
194
/* marks the channel as "shutdown" ASAP for reads */
195
static inline void channel_shutr_now(struct channel *chn)
197
chn->flags |= CF_SHUTR_NOW;
200
/* marks the channel as "shutdown" ASAP for writes */
201
static inline void channel_shutw_now(struct channel *chn)
203
chn->flags |= CF_SHUTW_NOW;
206
/* marks the channel as "shutdown" ASAP in both directions */
207
static inline void channel_abort(struct channel *chn)
209
chn->flags |= CF_SHUTR_NOW | CF_SHUTW_NOW;
210
chn->flags &= ~CF_AUTO_CONNECT;
213
/* allow the consumer to try to establish a new connection. */
214
static inline void channel_auto_connect(struct channel *chn)
216
chn->flags |= CF_AUTO_CONNECT;
219
/* prevent the consumer from trying to establish a new connection, and also
220
* disable auto shutdown forwarding.
222
static inline void channel_dont_connect(struct channel *chn)
224
chn->flags &= ~(CF_AUTO_CONNECT|CF_AUTO_CLOSE);
227
/* allow the producer to forward shutdown requests */
228
static inline void channel_auto_close(struct channel *chn)
230
chn->flags |= CF_AUTO_CLOSE;
233
/* prevent the producer from forwarding shutdown requests */
234
static inline void channel_dont_close(struct channel *chn)
236
chn->flags &= ~CF_AUTO_CLOSE;
239
/* allow the producer to read / poll the input */
240
static inline void channel_auto_read(struct channel *chn)
242
chn->flags &= ~CF_DONT_READ;
245
/* prevent the producer from read / poll the input */
246
static inline void channel_dont_read(struct channel *chn)
248
chn->flags |= CF_DONT_READ;
252
/*************************************************/
253
/* Buffer operations in the context of a channel */
254
/*************************************************/
257
/* Return the number of reserved bytes in the channel's visible
258
* buffer, which ensures that once all pending data are forwarded, the
259
* buffer still has global.tune.maxrewrite bytes free. The result is
260
* between 0 and global.tune.maxrewrite, which is itself smaller than
263
static inline int buffer_reserved(const struct channel *chn)
265
int ret = global.tune.maxrewrite - chn->to_forward - chn->buf->o;
267
if (chn->to_forward == CHN_INFINITE_FORWARD)
274
/* Return the max number of bytes the buffer can contain so that once all the
275
* pending bytes are forwarded, the buffer still has global.tune.maxrewrite
276
* bytes free. The result sits between chn->size - maxrewrite and chn->size.
278
static inline int buffer_max_len(const struct channel *chn)
280
return chn->buf->size - buffer_reserved(chn);
283
/* Returns the amount of space available at the input of the buffer, taking the
284
* reserved space into account if ->to_forward indicates that an end of transfer
285
* is close to happen. The test is optimized to avoid as many operations as
286
* possible for the fast case.
288
static inline int bi_avail(const struct channel *chn)
290
int rem = chn->buf->size;
296
return rem; /* buffer already full */
298
if (chn->to_forward >= chn->buf->size ||
299
(CHN_INFINITE_FORWARD < MAX_RANGE(typeof(chn->buf->size)) && // just there to ensure gcc
300
chn->to_forward == CHN_INFINITE_FORWARD)) // avoids the useless second
301
return rem; // test whenever possible
303
rem2 = rem - global.tune.maxrewrite;
305
rem2 += chn->to_forward;
314
/* Cut the "tail" of the channel's buffer, which means strip it to the length
315
* of unsent data only, and kill any remaining unsent data. Any scheduled
316
* forwarding is stopped. This is mainly to be used to send error messages
317
* after existing data.
319
static inline void bi_erase(struct channel *chn)
322
return channel_erase(chn);
332
* Advance the channel buffer's read pointer by <len> bytes. This is useful
333
* when data have been read directly from the buffer. It is illegal to call
334
* this function with <len> causing a wrapping at the end of the buffer. It's
335
* the caller's responsibility to ensure that <len> is never larger than
336
* chn->o. Channel flag WRITE_PARTIAL is set.
338
static inline void bo_skip(struct channel *chn, int len)
342
if (buffer_empty(chn->buf))
343
chn->buf->p = chn->buf->data;
345
/* notify that some data was written to the SI from the buffer */
346
chn->flags |= CF_WRITE_PARTIAL;
349
/* Tries to copy chunk <chunk> into the channel's buffer after length controls.
350
* The chn->o and to_forward pointers are updated. If the channel's input is
351
* closed, -2 is returned. If the block is too large for this buffer, -3 is
352
* returned. If there is not enough room left in the buffer, -1 is returned.
353
* Otherwise the number of bytes copied is returned (0 being a valid number).
354
* Channel flag READ_PARTIAL is updated if some data can be transferred. The
355
* chunk's length is updated with the number of bytes sent.
357
static inline int bi_putchk(struct channel *chn, struct chunk *chunk)
361
ret = bi_putblk(chn, chunk->str, chunk->len);
367
/* Tries to copy string <str> at once into the channel's buffer after length
368
* controls. The chn->o and to_forward pointers are updated. If the channel's
369
* input is closed, -2 is returned. If the block is too large for this buffer,
370
* -3 is returned. If there is not enough room left in the buffer, -1 is
371
* returned. Otherwise the number of bytes copied is returned (0 being a valid
372
* number). Channel flag READ_PARTIAL is updated if some data can be
375
static inline int bi_putstr(struct channel *chn, const char *str)
377
return bi_putblk(chn, str, strlen(str));
381
* Return one char from the channel's buffer. If the buffer is empty and the
382
* channel is closed, return -2. If the buffer is just empty, return -1. The
383
* buffer's pointer is not advanced, it's up to the caller to call bo_skip(buf,
384
* 1) when it has consumed the char. Also note that this function respects the
387
static inline int bo_getchr(struct channel *chn)
389
/* closed or empty + imminent close = -2; empty = -1 */
390
if (unlikely((chn->flags & CF_SHUTW) || channel_is_empty(chn))) {
391
if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW))
395
return *buffer_wrap_sub(chn->buf, chn->buf->p - chn->buf->o);
399
#endif /* _PROTO_CHANNEL_H */