core: Make sure that responses to requests received on a WebSocket are sent on existi...
[sip-router] / tcp_stats.h
1 /* 
2  * $Id$
3  * 
4  * Copyright (C) 2009 iptelorg GmbH
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 /*
19  * tcp_stats.h - tcp statistics macros
20  */
21 /*
22  * History:
23  * --------
24  *  2009-04-08  initial version (andrei)
25 */
26
27 #ifndef __tcp_stats_h
28 #define __tcp_stats_h
29
30 /* enable tcp stats by default */
31 #ifndef NO_TCP_STATS
32 #define USE_TCP_STATS
33 #endif
34
35 #ifndef USE_TCP_STATS
36
37 #define INIT_TCP_STATS() 0 /* success */
38 #define DESTROY_TCP_STATS()
39
40 #define TCP_STATS_ESTABLISHED(state)
41 #define TCP_STATS_CONNECT_FAILED()
42 #define TCP_STATS_LOCAL_REJECT()
43 #define TCP_STATS_CON_TIMEOUT()
44 #define TCP_STATS_CON_RESET()
45 #define TCP_STATS_SEND_TIMEOUT()
46 #define TCP_STATS_SENDQ_FULL()
47
48 #else /* USE_TCP_STATS */
49
50 #include "counters.h"
51
52 struct tcp_counters_h {
53         counter_handle_t established;
54         counter_handle_t passive_open;
55         counter_handle_t connect_success;
56         counter_handle_t connect_failed;
57         counter_handle_t local_reject;
58         counter_handle_t con_timeout;
59         counter_handle_t con_reset;
60         counter_handle_t send_timeout;
61         counter_handle_t sendq_full;
62 };
63
64 extern struct tcp_counters_h tcp_cnts_h;
65
66 int tcp_stats_init(void);
67 void tcp_stats_destroy(void);
68
69 #define INIT_TCP_STATS() tcp_stats_init()
70
71 #define DESTROY_TCP_STATS() tcp_stats_destroy()
72
73
74 /** called each time a new tcp connection is established.
75  *  @param state - S_CONN_ACCEPT if it was the result of an accept()
76  *               - S_CONN_CONNECT if it was the result of a connect()
77  * Note: in general it will be called when the first packet was received or
78  *   sent on the new connection and not immediately after accept() or 
79  *   connect()
80  */
81 #define TCP_STATS_ESTABLISHED(state) \
82         do { \
83                 counter_inc(tcp_cnts_h.established); \
84                 if (state == S_CONN_ACCEPT) \
85                         counter_inc(tcp_cnts_h.passive_open); \
86                 else \
87                         counter_inc(tcp_cnts_h.connect_success); \
88         }while(0)
89
90 /** called each time a new outgoing connection fails.  */
91 #define TCP_STATS_CONNECT_FAILED() \
92         counter_inc(tcp_cnts_h.connect_failed)
93
94 /** called each time a new incoming connection is rejected.
95  * (accept() denied due to maximum number of TCP connections being exceeded)
96  */
97 #define TCP_STATS_LOCAL_REJECT() \
98         counter_inc(tcp_cnts_h.local_reject)
99
100
101 /** called each time a connection lifetime expires.
102   * (the connection is closed for being idle for too long)
103   */
104 #define TCP_STATS_CON_TIMEOUT() \
105         counter_inc(tcp_cnts_h.con_timeout)
106
107
108 /** called each time a TCP RST is received on an established connection.  */
109 #define TCP_STATS_CON_RESET() \
110         counter_inc(tcp_cnts_h.con_reset)
111
112 /** called each time a send operation fails due to a timeout.
113   * FIXME: it works only in async mode (in sync. mode a send might timeout
114   *  but the stats won't be increased).
115   */
116 #define TCP_STATS_SEND_TIMEOUT() \
117         counter_inc(tcp_cnts_h.send_timeout)
118
119 /** called each time a send fails due to the buffering capacity being exceeded.
120   * (used only in tcp async mode)
121   */
122 #define TCP_STATS_SENDQ_FULL() \
123         counter_inc(tcp_cnts_h.sendq_full)
124
125 #endif /* USE_TCP_STATS */
126
127 #endif /*__tcp_stats_h*/
128
129 /* vi: set ts=4 sw=4 tw=79:ai:cindent: */