Modifying the return value of cfg_set* functions, in order to make
[sip-router] / tcp_options.c
1 /* 
2  * $Id$
3  * 
4  * Copyright (C) 2007 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 options
20  *
21  * History:
22  * --------
23  *  2007-11-28  created by andrei
24  */
25
26 #include "tcp_options.h"
27 #include "dprint.h"
28 #include "globals.h"
29 #include "timer_ticks.h"
30
31
32 struct tcp_cfg_options tcp_options;
33
34
35 /* set defaults */
36 void init_tcp_options()
37 {
38 #ifdef TCP_BUF_WRITE
39         tcp_options.tcp_buf_write=0;
40         tcp_options.tcpconn_wq_max=32*1024; /* 32 k */
41         tcp_options.tcp_wq_max=10*1024*1024; /* 10 MB */
42         tcp_options.tcp_wq_timeout=S_TO_TICKS(tcp_send_timeout);
43 #endif
44 #ifdef TCP_FD_CACHE
45         tcp_options.fd_cache=1;
46 #endif
47 #ifdef HAVE_SO_KEEPALIVE
48         tcp_options.keepalive=1;
49 #endif
50 /*
51 #if defined HAVE_TCP_DEFER_ACCEPT || defined HAVE_TCP_ACCEPT_FILTER
52         tcp_options.defer_accept=1;
53 #endif
54 */
55 #ifdef HAVE_TCP_QUICKACK
56         tcp_options.delayed_ack=1;
57 #endif
58 }
59
60
61
62 #define W_OPT_NC(option) \
63         if (tcp_options.option){\
64                 WARN("tcp_options: tcp_" #option \
65                                 "cannot be enabled (recompile needed)\n"); \
66                 tcp_options.option=0; \
67         }
68
69
70
71 #define W_OPT_NS(option) \
72         if (tcp_options.option){\
73                 WARN("tcp_options: tcp_" #option \
74                                 "cannot be enabled (no OS support)\n"); \
75                 tcp_options.option=0; \
76         }
77
78
79 /* checks & warns if some tcp_option cannot be enabled */
80 void tcp_options_check()
81 {
82 #ifndef TCP_FD_CACHE
83         W_OPT_NC(defer_accept);
84 #endif
85
86 #ifndef TCP_BUF_WRITE
87         W_OPT_NC(tcp_buf_write);
88         W_OPT_NC(tcpconn_wq_max);
89         W_OPT_NC(tcp_wq_max);
90         W_OPT_NC(tcp_wq_timeout);
91 #endif /* TCP_BUF_WRITE */
92
93 #if ! defined HAVE_TCP_DEFER_ACCEPT && ! defined HAVE_TCP_ACCEPT_FILTER
94         W_OPT_NS(defer_accept);
95 #endif
96 #ifndef HAVE_TCP_SYNCNT
97         W_OPT_NS(syncnt);
98 #endif
99 #ifndef HAVE_TCP_LINGER2
100         W_OPT_NS(linger2);
101 #endif
102 #ifndef HAVE_TCP_KEEPINTVL
103         W_OPT_NS(keepintvl);
104 #endif
105 #ifndef HAVE_TCP_KEEPIDLE
106         W_OPT_NS(keepidle);
107 #endif
108 #ifndef HAVE_TCP_KEEPCNT
109         W_OPT_NS(keepcnt);
110 #endif
111         if (tcp_options.keepintvl || tcp_options.keepidle || tcp_options.keepcnt){
112                 tcp_options.keepalive=1; /* force on */
113         }
114 #ifndef HAVE_SO_KEEPALIVE
115         W_OPT_NS(keepalive);
116 #endif
117 #ifndef HAVE_TCP_QUICKACK
118         W_OPT_NS(delayed_ack);
119 #endif
120 }
121
122
123
124 void tcp_options_get(struct tcp_cfg_options* t)
125 {
126         *t=tcp_options;
127 }