1 /*
2  * include/proto/connection.h
3  * This file contains connection function prototypes
4  *
5  * Copyright (C) 2000-2012 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 _PROTO_CONNECTION_H
23 #define _PROTO_CONNECTION_H
24 
25 #include <common/config.h>
26 #include <common/memory.h>
27 #include <types/connection.h>
28 #include <types/listener.h>
29 #include <proto/fd.h>
30 #include <proto/obj_type.h>
31 
32 extern struct pool_head *pool2_connection;
33 
34 /* perform minimal intializations, report 0 in case of error, 1 if OK. */
35 int init_connection();
36 
37 /* I/O callback for fd-based connections. It calls the read/write handlers
38  * provided by the connection's sock_ops.
39  */
40 void conn_fd_handler(int fd);
41 
42 /* receive a PROXY protocol header over a connection */
43 int conn_recv_proxy(struct connection *conn, int flag);
44 int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connection *remote);
45 int make_proxy_line_v1(char *buf, int buf_len, struct sockaddr_storage *src, struct sockaddr_storage *dst);
46 int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct connection *remote);
47 
48 /* receive a NetScaler Client IP insertion header over a connection */
49 int conn_recv_netscaler_cip(struct connection *conn, int flag);
50 
51 /* raw send() directly on the socket */
52 int conn_sock_send(struct connection *conn, const void *buf, int len, int flags);
53 
54 /* drains any pending bytes from the socket */
55 int conn_sock_drain(struct connection *conn);
56 
57 /* returns true is the transport layer is ready */
conn_xprt_ready(const struct connection * conn)58 static inline int conn_xprt_ready(const struct connection *conn)
59 {
60 	return (conn->flags & CO_FL_XPRT_READY);
61 }
62 
63 /* returns true is the control layer is ready */
conn_ctrl_ready(const struct connection * conn)64 static inline int conn_ctrl_ready(const struct connection *conn)
65 {
66 	return (conn->flags & CO_FL_CTRL_READY);
67 }
68 
69 /* Calls the init() function of the transport layer if any and if not done yet,
70  * and sets the CO_FL_XPRT_READY flag to indicate it was properly initialized.
71  * Returns <0 in case of error.
72  */
conn_xprt_init(struct connection * conn)73 static inline int conn_xprt_init(struct connection *conn)
74 {
75 	int ret = 0;
76 
77 	if (!conn_xprt_ready(conn) && conn->xprt && conn->xprt->init)
78 		ret = conn->xprt->init(conn);
79 
80 	if (ret >= 0)
81 		conn->flags |= CO_FL_XPRT_READY;
82 
83 	return ret;
84 }
85 
86 /* Calls the close() function of the transport layer if any and if not done
87  * yet, and clears the CO_FL_XPRT_READY flag. However this is not done if the
88  * CO_FL_XPRT_TRACKED flag is set, which allows logs to take data from the
89  * transport layer very late if needed.
90  */
conn_xprt_close(struct connection * conn)91 static inline void conn_xprt_close(struct connection *conn)
92 {
93 	if ((conn->flags & (CO_FL_XPRT_READY|CO_FL_XPRT_TRACKED)) == CO_FL_XPRT_READY) {
94 		if (conn->xprt->close)
95 			conn->xprt->close(conn);
96 		conn->flags &= ~CO_FL_XPRT_READY;
97 	}
98 }
99 
100 /* Initializes the connection's control layer which essentially consists in
101  * registering the file descriptor for polling and setting the CO_FL_CTRL_READY
102  * flag. The caller is responsible for ensuring that the control layer is
103  * already assigned to the connection prior to the call.
104  */
conn_ctrl_init(struct connection * conn)105 static inline void conn_ctrl_init(struct connection *conn)
106 {
107 	if (!conn_ctrl_ready(conn)) {
108 		int fd = conn->t.sock.fd;
109 
110 		fd_insert(fd);
111 		/* mark the fd as ready so as not to needlessly poll at the beginning */
112 		fd_may_recv(fd);
113 		fd_may_send(fd);
114 		fdtab[fd].owner = conn;
115 		fdtab[fd].iocb = conn_fd_handler;
116 		conn->flags |= CO_FL_CTRL_READY;
117 	}
118 }
119 
120 /* Deletes the FD if the transport layer is already gone. Once done,
121  * it then removes the CO_FL_CTRL_READY flag.
122  */
conn_ctrl_close(struct connection * conn)123 static inline void conn_ctrl_close(struct connection *conn)
124 {
125 	if ((conn->flags & (CO_FL_XPRT_READY|CO_FL_CTRL_READY)) == CO_FL_CTRL_READY) {
126 		fd_delete(conn->t.sock.fd);
127 		conn->flags &= ~CO_FL_CTRL_READY;
128 	}
129 }
130 
131 /* If the connection still has a transport layer, then call its close() function
132  * if any, and delete the file descriptor if a control layer is set. This is
133  * used to close everything at once and atomically. However this is not done if
134  * the CO_FL_XPRT_TRACKED flag is set, which allows logs to take data from the
135  * transport layer very late if needed.
136  */
conn_full_close(struct connection * conn)137 static inline void conn_full_close(struct connection *conn)
138 {
139 	conn_xprt_close(conn);
140 	conn_ctrl_close(conn);
141 }
142 
143 /* Force to close the connection whatever the tracking state. This is mainly
144  * used on the error path where the tracking does not make sense, or to kill
145  * an idle connection we want to abort immediately.
146  */
conn_force_close(struct connection * conn)147 static inline void conn_force_close(struct connection *conn)
148 {
149 	if (conn_xprt_ready(conn) && conn->xprt->close)
150 		conn->xprt->close(conn);
151 
152 	if (conn_ctrl_ready(conn))
153 		fd_delete(conn->t.sock.fd);
154 
155 	conn->t.sock.fd = DEAD_FD_MAGIC;
156 	conn->flags &= ~(CO_FL_XPRT_READY|CO_FL_CTRL_READY);
157 }
158 
159 /* Update polling on connection <c>'s file descriptor depending on its current
160  * state as reported in the connection's CO_FL_CURR_* flags, reports of EAGAIN
161  * in CO_FL_WAIT_*, and the sock layer expectations indicated by CO_FL_SOCK_*.
162  * The connection flags are updated with the new flags at the end of the
163  * operation. Polling is totally disabled if an error was reported.
164  */
165 void conn_update_sock_polling(struct connection *c);
166 
167 /* Update polling on connection <c>'s file descriptor depending on its current
168  * state as reported in the connection's CO_FL_CURR_* flags, reports of EAGAIN
169  * in CO_FL_WAIT_*, and the data layer expectations indicated by CO_FL_DATA_*.
170  * The connection flags are updated with the new flags at the end of the
171  * operation. Polling is totally disabled if an error was reported.
172  */
173 void conn_update_data_polling(struct connection *c);
174 
175 /* Refresh the connection's polling flags from its file descriptor status.
176  * This should be called at the beginning of a connection handler.
177  */
conn_refresh_polling_flags(struct connection * conn)178 static inline void conn_refresh_polling_flags(struct connection *conn)
179 {
180 	conn->flags &= ~(CO_FL_WAIT_ROOM | CO_FL_WAIT_DATA);
181 
182 	if (conn_ctrl_ready(conn)) {
183 		unsigned int flags = conn->flags & ~(CO_FL_CURR_RD_ENA | CO_FL_CURR_WR_ENA);
184 
185 		if (fd_recv_active(conn->t.sock.fd))
186 			flags |= CO_FL_CURR_RD_ENA;
187 		if (fd_send_active(conn->t.sock.fd))
188 			flags |= CO_FL_CURR_WR_ENA;
189 		conn->flags = flags;
190 	}
191 }
192 
193 /* inspects c->flags and returns non-zero if DATA ENA changes from the CURR ENA
194  * or if the WAIT flags are set with their respective ENA flags. Additionally,
195  * non-zero is also returned if an error was reported on the connection. This
196  * function is used quite often and is inlined. In order to proceed optimally
197  * with very little code and CPU cycles, the bits are arranged so that a change
198  * can be detected by a few left shifts, a xor, and a mask. These operations
199  * detect when W&D are both enabled for either direction, when C&D differ for
200  * either direction and when Error is set. The trick consists in first keeping
201  * only the bits we're interested in, since they don't collide when shifted,
202  * and to perform the AND at the end. In practice, the compiler is able to
203  * replace the last AND with a TEST in boolean conditions. This results in
204  * checks that are done in 4-6 cycles and less than 30 bytes.
205  */
conn_data_polling_changes(const struct connection * c)206 static inline unsigned int conn_data_polling_changes(const struct connection *c)
207 {
208 	unsigned int f = c->flags;
209 	f &= CO_FL_DATA_WR_ENA | CO_FL_DATA_RD_ENA | CO_FL_CURR_WR_ENA |
210 	     CO_FL_CURR_RD_ENA | CO_FL_ERROR;
211 
212 	f = (f ^ (f << 1)) & (CO_FL_CURR_WR_ENA|CO_FL_CURR_RD_ENA);    /* test C ^ D */
213 	return f & (CO_FL_CURR_WR_ENA | CO_FL_CURR_RD_ENA | CO_FL_ERROR);
214 }
215 
216 /* inspects c->flags and returns non-zero if SOCK ENA changes from the CURR ENA
217  * or if the WAIT flags are set with their respective ENA flags. Additionally,
218  * non-zero is also returned if an error was reported on the connection. This
219  * function is used quite often and is inlined. In order to proceed optimally
220  * with very little code and CPU cycles, the bits are arranged so that a change
221  * can be detected by a few left shifts, a xor, and a mask. These operations
222  * detect when W&S are both enabled for either direction, when C&S differ for
223  * either direction and when Error is set. The trick consists in first keeping
224  * only the bits we're interested in, since they don't collide when shifted,
225  * and to perform the AND at the end. In practice, the compiler is able to
226  * replace the last AND with a TEST in boolean conditions. This results in
227  * checks that are done in 4-6 cycles and less than 30 bytes.
228  */
conn_sock_polling_changes(const struct connection * c)229 static inline unsigned int conn_sock_polling_changes(const struct connection *c)
230 {
231 	unsigned int f = c->flags;
232 	f &= CO_FL_SOCK_WR_ENA | CO_FL_SOCK_RD_ENA | CO_FL_CURR_WR_ENA |
233 	     CO_FL_CURR_RD_ENA | CO_FL_ERROR;
234 
235 	f = (f ^ (f << 2)) & (CO_FL_CURR_WR_ENA|CO_FL_CURR_RD_ENA);    /* test C ^ S */
236 	return f & (CO_FL_CURR_WR_ENA | CO_FL_CURR_RD_ENA | CO_FL_ERROR);
237 }
238 
239 /* Automatically updates polling on connection <c> depending on the DATA flags
240  * if no handshake is in progress.
241  */
conn_cond_update_data_polling(struct connection * c)242 static inline void conn_cond_update_data_polling(struct connection *c)
243 {
244 	if (!(c->flags & CO_FL_POLL_SOCK) && conn_data_polling_changes(c))
245 		conn_update_data_polling(c);
246 }
247 
248 /* Automatically updates polling on connection <c> depending on the SOCK flags
249  * if a handshake is in progress.
250  */
conn_cond_update_sock_polling(struct connection * c)251 static inline void conn_cond_update_sock_polling(struct connection *c)
252 {
253 	if ((c->flags & CO_FL_POLL_SOCK) && conn_sock_polling_changes(c))
254 		conn_update_sock_polling(c);
255 }
256 
257 /* Stop all polling on the fd. This might be used when an error is encountered
258  * for example.
259  */
conn_stop_polling(struct connection * c)260 static inline void conn_stop_polling(struct connection *c)
261 {
262 	c->flags &= ~(CO_FL_CURR_RD_ENA | CO_FL_CURR_WR_ENA |
263 		      CO_FL_SOCK_RD_ENA | CO_FL_SOCK_WR_ENA |
264 		      CO_FL_DATA_RD_ENA | CO_FL_DATA_WR_ENA);
265 	if (conn_ctrl_ready(c))
266 		fd_stop_both(c->t.sock.fd);
267 }
268 
269 /* Automatically update polling on connection <c> depending on the DATA and
270  * SOCK flags, and on whether a handshake is in progress or not. This may be
271  * called at any moment when there is a doubt about the effectiveness of the
272  * polling state, for instance when entering or leaving the handshake state.
273  */
conn_cond_update_polling(struct connection * c)274 static inline void conn_cond_update_polling(struct connection *c)
275 {
276 	if (unlikely(c->flags & CO_FL_ERROR))
277 		conn_stop_polling(c);
278 	else if (!(c->flags & CO_FL_POLL_SOCK) && conn_data_polling_changes(c))
279 		conn_update_data_polling(c);
280 	else if ((c->flags & CO_FL_POLL_SOCK) && conn_sock_polling_changes(c))
281 		conn_update_sock_polling(c);
282 }
283 
284 /***** Event manipulation primitives for use by DATA I/O callbacks *****/
285 /* The __conn_* versions do not propagate to lower layers and are only meant
286  * to be used by handlers called by the connection handler. The other ones
287  * may be used anywhere.
288  */
__conn_data_want_recv(struct connection * c)289 static inline void __conn_data_want_recv(struct connection *c)
290 {
291 	c->flags |= CO_FL_DATA_RD_ENA;
292 }
293 
__conn_data_stop_recv(struct connection * c)294 static inline void __conn_data_stop_recv(struct connection *c)
295 {
296 	c->flags &= ~CO_FL_DATA_RD_ENA;
297 }
298 
__conn_data_want_send(struct connection * c)299 static inline void __conn_data_want_send(struct connection *c)
300 {
301 	c->flags |= CO_FL_DATA_WR_ENA;
302 }
303 
__conn_data_stop_send(struct connection * c)304 static inline void __conn_data_stop_send(struct connection *c)
305 {
306 	c->flags &= ~CO_FL_DATA_WR_ENA;
307 }
308 
__conn_data_stop_both(struct connection * c)309 static inline void __conn_data_stop_both(struct connection *c)
310 {
311 	c->flags &= ~(CO_FL_DATA_WR_ENA | CO_FL_DATA_RD_ENA);
312 }
313 
conn_data_want_recv(struct connection * c)314 static inline void conn_data_want_recv(struct connection *c)
315 {
316 	__conn_data_want_recv(c);
317 	conn_cond_update_data_polling(c);
318 }
319 
conn_data_stop_recv(struct connection * c)320 static inline void conn_data_stop_recv(struct connection *c)
321 {
322 	__conn_data_stop_recv(c);
323 	conn_cond_update_data_polling(c);
324 }
325 
conn_data_want_send(struct connection * c)326 static inline void conn_data_want_send(struct connection *c)
327 {
328 	__conn_data_want_send(c);
329 	conn_cond_update_data_polling(c);
330 }
331 
conn_data_stop_send(struct connection * c)332 static inline void conn_data_stop_send(struct connection *c)
333 {
334 	__conn_data_stop_send(c);
335 	conn_cond_update_data_polling(c);
336 }
337 
conn_data_stop_both(struct connection * c)338 static inline void conn_data_stop_both(struct connection *c)
339 {
340 	__conn_data_stop_both(c);
341 	conn_cond_update_data_polling(c);
342 }
343 
344 /***** Event manipulation primitives for use by handshake I/O callbacks *****/
345 /* The __conn_* versions do not propagate to lower layers and are only meant
346  * to be used by handlers called by the connection handler. The other ones
347  * may be used anywhere.
348  */
__conn_sock_want_recv(struct connection * c)349 static inline void __conn_sock_want_recv(struct connection *c)
350 {
351 	c->flags |= CO_FL_SOCK_RD_ENA;
352 }
353 
__conn_sock_stop_recv(struct connection * c)354 static inline void __conn_sock_stop_recv(struct connection *c)
355 {
356 	c->flags &= ~CO_FL_SOCK_RD_ENA;
357 }
358 
__conn_sock_want_send(struct connection * c)359 static inline void __conn_sock_want_send(struct connection *c)
360 {
361 	c->flags |= CO_FL_SOCK_WR_ENA;
362 }
363 
__conn_sock_stop_send(struct connection * c)364 static inline void __conn_sock_stop_send(struct connection *c)
365 {
366 	c->flags &= ~CO_FL_SOCK_WR_ENA;
367 }
368 
__conn_sock_stop_both(struct connection * c)369 static inline void __conn_sock_stop_both(struct connection *c)
370 {
371 	c->flags &= ~(CO_FL_SOCK_WR_ENA | CO_FL_SOCK_RD_ENA);
372 }
373 
conn_sock_want_recv(struct connection * c)374 static inline void conn_sock_want_recv(struct connection *c)
375 {
376 	__conn_sock_want_recv(c);
377 	conn_cond_update_sock_polling(c);
378 }
379 
conn_sock_stop_recv(struct connection * c)380 static inline void conn_sock_stop_recv(struct connection *c)
381 {
382 	__conn_sock_stop_recv(c);
383 	conn_cond_update_sock_polling(c);
384 }
385 
conn_sock_want_send(struct connection * c)386 static inline void conn_sock_want_send(struct connection *c)
387 {
388 	__conn_sock_want_send(c);
389 	conn_cond_update_sock_polling(c);
390 }
391 
conn_sock_stop_send(struct connection * c)392 static inline void conn_sock_stop_send(struct connection *c)
393 {
394 	__conn_sock_stop_send(c);
395 	conn_cond_update_sock_polling(c);
396 }
397 
conn_sock_stop_both(struct connection * c)398 static inline void conn_sock_stop_both(struct connection *c)
399 {
400 	__conn_sock_stop_both(c);
401 	conn_cond_update_sock_polling(c);
402 }
403 
404 /* shutdown management */
conn_sock_read0(struct connection * c)405 static inline void conn_sock_read0(struct connection *c)
406 {
407 	c->flags |= CO_FL_SOCK_RD_SH;
408 	__conn_sock_stop_recv(c);
409 	/* we don't risk keeping ports unusable if we found the
410 	 * zero from the other side.
411 	 */
412 	if (conn_ctrl_ready(c))
413 		fdtab[c->t.sock.fd].linger_risk = 0;
414 }
415 
conn_sock_shutw(struct connection * c)416 static inline void conn_sock_shutw(struct connection *c)
417 {
418 	c->flags |= CO_FL_SOCK_WR_SH;
419 	__conn_sock_stop_send(c);
420 	if (conn_ctrl_ready(c))
421 		shutdown(c->t.sock.fd, SHUT_WR);
422 }
423 
conn_data_shutw(struct connection * c)424 static inline void conn_data_shutw(struct connection *c)
425 {
426 	c->flags |= CO_FL_DATA_WR_SH;
427 	__conn_data_stop_send(c);
428 
429 	/* clean data-layer shutdown */
430 	if (c->xprt && c->xprt->shutw)
431 		c->xprt->shutw(c, 1);
432 }
433 
conn_data_shutw_hard(struct connection * c)434 static inline void conn_data_shutw_hard(struct connection *c)
435 {
436 	c->flags |= CO_FL_DATA_WR_SH;
437 	__conn_data_stop_send(c);
438 
439 	/* unclean data-layer shutdown */
440 	if (c->xprt && c->xprt->shutw)
441 		c->xprt->shutw(c, 0);
442 }
443 
444 /* detect sock->data read0 transition */
conn_data_read0_pending(struct connection * c)445 static inline int conn_data_read0_pending(struct connection *c)
446 {
447 	return (c->flags & CO_FL_SOCK_RD_SH) != 0;
448 }
449 
450 /* detect data->sock shutw transition */
conn_sock_shutw_pending(struct connection * c)451 static inline int conn_sock_shutw_pending(struct connection *c)
452 {
453 	return (c->flags & (CO_FL_DATA_WR_SH | CO_FL_SOCK_WR_SH)) == CO_FL_DATA_WR_SH;
454 }
455 
456 /* prepares a connection to work with protocol <proto> and transport <xprt>.
457  * The transport's context is initialized as well.
458  */
conn_prepare(struct connection * conn,const struct protocol * proto,const struct xprt_ops * xprt)459 static inline void conn_prepare(struct connection *conn, const struct protocol *proto, const struct xprt_ops *xprt)
460 {
461 	conn->ctrl = proto;
462 	conn->xprt = xprt;
463 	conn->xprt_st = 0;
464 	conn->xprt_ctx = NULL;
465 }
466 
467 /* Initializes all required fields for a new connection. Note that it does the
468  * minimum acceptable initialization for a connection that already exists and
469  * is about to be reused. It also leaves the addresses untouched, which makes
470  * it usable across connection retries to reset a connection to a known state.
471  */
conn_init(struct connection * conn)472 static inline void conn_init(struct connection *conn)
473 {
474 	conn->obj_type = OBJ_TYPE_CONN;
475 	conn->flags = CO_FL_NONE;
476 	conn->data = NULL;
477 	conn->owner = NULL;
478 	conn->send_proxy_ofs = 0;
479 	conn->t.sock.fd = DEAD_FD_MAGIC;
480 	conn->err_code = CO_ER_NONE;
481 	conn->target = NULL;
482 	conn->proxy_netns = NULL;
483 	LIST_INIT(&conn->list);
484 }
485 
486 /* Tries to allocate a new connection and initialized its main fields. The
487  * connection is returned on success, NULL on failure. The connection must
488  * be released using pool_free2() or conn_free().
489  */
conn_new()490 static inline struct connection *conn_new()
491 {
492 	struct connection *conn;
493 
494 	conn = pool_alloc2(pool2_connection);
495 	if (likely(conn != NULL))
496 		conn_init(conn);
497 	return conn;
498 }
499 
500 /* Releases a connection previously allocated by conn_new() */
conn_free(struct connection * conn)501 static inline void conn_free(struct connection *conn)
502 {
503 	pool_free2(pool2_connection, conn);
504 }
505 
506 
507 /* Retrieves the connection's source address */
conn_get_from_addr(struct connection * conn)508 static inline void conn_get_from_addr(struct connection *conn)
509 {
510 	if (conn->flags & CO_FL_ADDR_FROM_SET)
511 		return;
512 
513 	if (!conn_ctrl_ready(conn) || !conn->ctrl->get_src)
514 		return;
515 
516 	if (conn->ctrl->get_src(conn->t.sock.fd, (struct sockaddr *)&conn->addr.from,
517 	                        sizeof(conn->addr.from),
518 	                        obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
519 		return;
520 	conn->flags |= CO_FL_ADDR_FROM_SET;
521 }
522 
523 /* Retrieves the connection's original destination address */
conn_get_to_addr(struct connection * conn)524 static inline void conn_get_to_addr(struct connection *conn)
525 {
526 	if (conn->flags & CO_FL_ADDR_TO_SET)
527 		return;
528 
529 	if (!conn_ctrl_ready(conn) || !conn->ctrl->get_dst)
530 		return;
531 
532 	if (conn->ctrl->get_dst(conn->t.sock.fd, (struct sockaddr *)&conn->addr.to,
533 	                        sizeof(conn->addr.to),
534 	                        obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
535 		return;
536 	conn->flags |= CO_FL_ADDR_TO_SET;
537 }
538 
539 /* Attaches a connection to an owner and assigns a data layer */
conn_attach(struct connection * conn,void * owner,const struct data_cb * data)540 static inline void conn_attach(struct connection *conn, void *owner, const struct data_cb *data)
541 {
542 	conn->data = data;
543 	conn->owner = owner;
544 }
545 
546 /* returns a human-readable error code for conn->err_code, or NULL if the code
547  * is unknown.
548  */
conn_err_code_str(struct connection * c)549 static inline const char *conn_err_code_str(struct connection *c)
550 {
551 	switch (c->err_code) {
552 	case CO_ER_NONE:          return "Success";
553 
554 	case CO_ER_CONF_FDLIM:    return "Reached configured maxconn value";
555 	case CO_ER_PROC_FDLIM:    return "Too many sockets on the process";
556 	case CO_ER_SYS_FDLIM:     return "Too many sockets on the system";
557 	case CO_ER_SYS_MEMLIM:    return "Out of system buffers";
558 	case CO_ER_NOPROTO:       return "Protocol or address family not supported";
559 	case CO_ER_SOCK_ERR:      return "General socket error";
560 	case CO_ER_PORT_RANGE:    return "Source port range exhausted";
561 	case CO_ER_CANT_BIND:     return "Can't bind to source address";
562 	case CO_ER_FREE_PORTS:    return "Out of local source ports on the system";
563 	case CO_ER_ADDR_INUSE:    return "Local source address already in use";
564 
565 	case CO_ER_PRX_EMPTY:     return "Connection closed while waiting for PROXY protocol header";
566 	case CO_ER_PRX_ABORT:     return "Connection error while waiting for PROXY protocol header";
567 	case CO_ER_PRX_TIMEOUT:   return "Timeout while waiting for PROXY protocol header";
568 	case CO_ER_PRX_TRUNCATED: return "Truncated PROXY protocol header received";
569 	case CO_ER_PRX_NOT_HDR:   return "Received something which does not look like a PROXY protocol header";
570 	case CO_ER_PRX_BAD_HDR:   return "Received an invalid PROXY protocol header";
571 	case CO_ER_PRX_BAD_PROTO: return "Received an unhandled protocol in the PROXY protocol header";
572 
573 	case CO_ER_CIP_EMPTY:     return "Connection closed while waiting for NetScaler Client IP header";
574 	case CO_ER_CIP_ABORT:     return "Connection error while waiting for NetScaler Client IP header";
575 	case CO_ER_CIP_TRUNCATED: return "Truncated NetScaler Client IP header received";
576 	case CO_ER_CIP_BAD_MAGIC: return "Received an invalid NetScaler Client IP magic number";
577 	case CO_ER_CIP_BAD_PROTO: return "Received an unhandled protocol in the NetScaler Client IP header";
578 
579 	case CO_ER_SSL_EMPTY:     return "Connection closed during SSL handshake";
580 	case CO_ER_SSL_ABORT:     return "Connection error during SSL handshake";
581 	case CO_ER_SSL_TIMEOUT:   return "Timeout during SSL handshake";
582 	case CO_ER_SSL_TOO_MANY:  return "Too many SSL connections";
583 	case CO_ER_SSL_NO_MEM:    return "Out of memory when initializing an SSL connection";
584 	case CO_ER_SSL_RENEG:     return "Rejected a client-initiated SSL renegociation attempt";
585 	case CO_ER_SSL_CA_FAIL:   return "SSL client CA chain cannot be verified";
586 	case CO_ER_SSL_CRT_FAIL:  return "SSL client certificate not trusted";
587 	case CO_ER_SSL_HANDSHAKE: return "SSL handshake failure";
588 	case CO_ER_SSL_HANDSHAKE_HB: return "SSL handshake failure after heartbeat";
589 	case CO_ER_SSL_KILLED_HB: return "Stopped a TLSv1 heartbeat attack (CVE-2014-0160)";
590 	case CO_ER_SSL_NO_TARGET: return "Attempt to use SSL on an unknown target (internal error)";
591 	}
592 	return NULL;
593 }
594 
conn_get_ctrl_name(const struct connection * conn)595 static inline const char *conn_get_ctrl_name(const struct connection *conn)
596 {
597 	if (!conn_ctrl_ready(conn))
598 		return "NONE";
599 	return conn->ctrl->name;
600 }
601 
conn_get_xprt_name(const struct connection * conn)602 static inline const char *conn_get_xprt_name(const struct connection *conn)
603 {
604 	if (!conn_xprt_ready(conn))
605 		return "NONE";
606 	return conn->xprt->name;
607 }
608 
conn_get_data_name(const struct connection * conn)609 static inline const char *conn_get_data_name(const struct connection *conn)
610 {
611 	if (!conn->data)
612 		return "NONE";
613 	return conn->data->name;
614 }
615 
616 
617 #endif /* _PROTO_CONNECTION_H */
618 
619 /*
620  * Local variables:
621  *  c-indent-level: 8
622  *  c-basic-offset: 8
623  * End:
624  */
625