all: updated FSF address in GPL text
[sip-router] / cfg_core.c
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2007 iptelorg GmbH
5  *
6  * This file is part of SIP-router, a free SIP server.
7  *
8  * SIP-router is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * SIP-router is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  * History
23  * -------
24  *  2007-12-03  Initial version (Miklos)
25  *  2008-01-31  added DNS resolver parameters (Miklos)
26  */
27 /** core runtime config.
28  * @file cfg_core.c
29  * @ingroup core
30  * Module: @ref core
31  *
32  * See
33  * - @ref ConfigCoreDoc
34  * - @ref ConfigEngine
35  * - @ref cfg_core.h
36  */
37 /*!
38  * \page ConfigCoreDoc Documentation of configuration parser
39  * \section ConfigParser Configuration parser
40  * Further information
41  * - \ref ConfigEngine
42  * - \ref cfg_core.h
43  * \verbinclude cfg.txt
44  *
45  */
46
47 #include "dprint.h"
48 #ifdef USE_DST_BLACKLIST
49 #include "dst_blacklist.h"
50 #endif
51 #include "resolve.h"
52 #ifdef USE_DNS_CACHE
53 #include "dns_cache.h"
54 #endif
55 #if defined PKG_MALLOC || defined SHM_MEM
56 #include "pt.h"
57 #endif
58 #include "msg_translator.h" /* fix_global_req_flags() */
59 #include "globals.h"
60 #include "sock_ut.h"
61 #include "cfg/cfg.h"
62 #include "cfg_core.h"
63
64 struct cfg_group_core default_core_cfg = {
65         L_WARN,         /*!<  print only msg. < L_WARN */
66         LOG_DAEMON,     /*!< log_facility -- see syslog(3) */
67         L_DBG,  /*!< memdbg */
68 #ifdef USE_DST_BLACKLIST
69         /* blacklist */
70         0, /*!< dst blacklist is disabled by default */
71         DEFAULT_BLST_TIMEOUT,
72         DEFAULT_BLST_MAX_MEM,
73         0, /* blst_udp_imask */
74         0, /* blst_tcp_imask */
75         0, /* blst_tls_imask */
76         0, /* blst_sctp_imask */
77 #endif
78         /* resolver */
79         1,  /*!< dns_try_ipv6 -- on by default */
80         0,  /*!< dns_try_naptr -- off by default */
81         30,  /*!< udp transport preference (for naptr) */
82         20,  /*!< tcp transport preference (for naptr) */
83         10,  /*!< tls transport preference (for naptr) */
84         20,  /*!< sctp transport preference (for naptr) */
85         -1, /*!< dns_retr_time */
86         -1, /*!< dns_retr_no */
87         -1, /*!< dns_servers_no */
88         1,  /*!< dns_search_list */
89         1,  /*!< dns_search_fmatch */
90         0,  /*!< dns_reinit */
91         1,  /*!< dns_naptr_ignore_rfc */
92         /* DNS cache */
93 #ifdef USE_DNS_CACHE
94         1,  /*!< use_dns_cache -- on by default */
95         0,  /*!< dns_cache_flags */
96         0,  /*!< use_dns_failover -- off by default */
97         0,  /*!< dns_srv_lb -- off by default */
98         DEFAULT_DNS_NEG_CACHE_TTL, /*!< neg. cache ttl */
99         DEFAULT_DNS_CACHE_MIN_TTL, /*!< minimum ttl */
100         DEFAULT_DNS_CACHE_MAX_TTL, /*!< maximum ttl */
101         DEFAULT_DNS_MAX_MEM, /*!< dns_cache_max_mem */
102         0, /*!< dns_cache_del_nonexp -- delete only expired entries by default */
103         0, /*!< dns_cache_rec_pref -- 0 by default, do not check the existing entries. */
104 #endif
105 #ifdef PKG_MALLOC
106         0, /*!< mem_dump_pkg */
107 #endif
108 #ifdef SHM_MEM
109         0, /*!< mem_dump_shm */
110 #endif
111         DEFAULT_MAX_WHILE_LOOPS, /*!< max_while_loops */
112         0, /*!< udp_mtu (disabled by default) */
113         0, /*!< udp_mtu_try_proto -> default disabled */
114         0, /**< udp4_raw (disabled by default) */
115         1500, /**< udp4_raw_mtu (1500 by default) */
116         -1,  /**< udp4_raw_ttl (auto detect by default) */
117         0,  /*!< force_rport */
118         L_DBG, /*!< memlog */
119         3, /*!< mem_summary -flags: 0 off, 1 pkg_status, 2 shm_status,
120                 4 pkg_sums, 8 shm_sums, 16 short_status */
121         0, /*!< mem_safety - 0 disabled */
122         0, /*!< mem_join - 0 disabled */
123         L_ERR, /*!< corelog */
124         L_ERR, /*!< latency log */
125         0, /*!< latency limit db */
126         0 /*!< latency limit action */
127 };
128
129 void    *core_cfg = &default_core_cfg;
130
131
132 static int check_raw_sock_support(void* cfg_h, str* gname, str* name,
133                                                                         void** v)
134 {
135         int val;
136         
137         val = (int)(long)(*v);
138 #ifndef USE_RAW_SOCKS
139         if (val > 0) {
140                 ERR("no RAW_SOCKS support, please recompile with it enabled\n");
141                 return -1;
142         }
143         return 0;
144 #else /* USE_RAW_SOCKS */
145         if (raw_udp4_send_sock < 0) {
146                 if (val > 0) {
147                         ERR("could not intialize raw socket on startup, please "
148                                         "restart as root or with CAP_NET_RAW\n");
149                         return -1;
150                 } else if (val < 0) {
151                         /* auto and no socket => disable */
152                         *v = (void*)(long)0;
153                 }
154         } else if (val < 0) {
155                 /* auto and socket => enable */
156                 *v = (void*)(long)1;
157         }
158         return 0;
159 #endif /* USE_RAW_SOCKS */
160 }
161
162
163
164 static int  udp4_raw_ttl_fixup(void* cfg_h, str* gname, str* name, void** val)
165 {
166         int v;
167         v = (int)(long)(*val);
168         if (v < 0) {
169                 if (sendipv4)
170                         v = sock_get_ttl(sendipv4->socket);
171         }
172         if (v < 0) {
173                 /* some error => use a reasonable default */
174                 v = 63;
175         }
176         *val = (void*)(long)v;
177         return 0;
178 }
179
180
181
182 cfg_def_t core_cfg_def[] = {
183         {"debug",               CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
184                 "debug level"},
185         {"log_facility",        CFG_VAR_INT|CFG_INPUT_STRING,   0, 0, log_facility_fixup, 0,
186                 "syslog facility, see \"man 3 syslog\""},
187         {"memdbg",              CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
188                 "log level for memory debugging messages"},
189 #ifdef USE_DST_BLACKLIST
190         /* blacklist */
191         {"use_dst_blacklist",   CFG_VAR_INT,    0, 1, use_dst_blacklist_fixup, 0,
192                 "enable/disable destination blacklisting"},
193         {"dst_blacklist_expire",        CFG_VAR_INT,    0, 0, 0, 0,
194                 "how much time (in s) a blacklisted destination is kept in the list"},
195         {"dst_blacklist_mem",   CFG_VAR_INT,    0, 0, blst_max_mem_fixup, 0,
196                 "maximum shared memory amount (in KB) used for keeping the blacklisted"
197                         " destinations"},
198         {"dst_blacklist_udp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
199                 "blacklist event ignore mask for UDP"},
200         {"dst_blacklist_tcp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
201                 "blacklist event ignore mask for TCP"},
202         {"dst_blacklist_tls_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
203                 "blacklist event ignore mask for TLS"},
204         {"dst_blacklist_sctp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
205                 "blacklist event ignore mask for SCTP"},
206 #endif
207         /* resolver */
208 #ifdef USE_DNS_CACHE
209         {"dns_try_ipv6",        CFG_VAR_INT,    0, 1, dns_try_ipv6_fixup, fix_dns_flags,
210 #else
211         {"dns_try_ipv6",        CFG_VAR_INT,    0, 1, dns_try_ipv6_fixup, 0,
212 #endif
213                 "enable/disable IPv6 DNS lookups"},
214 #ifdef USE_DNS_CACHE
215         {"dns_try_naptr",       CFG_VAR_INT,    0, 1, 0, fix_dns_flags,
216 #else
217         {"dns_try_naptr",       CFG_VAR_INT,    0, 1, 0, 0,
218 #endif
219                 "enable/disable NAPTR DNS lookups"},
220         {"dns_udp_pref",        CFG_VAR_INT,    0, 0, 0, reinit_proto_prefs,
221                 "udp protocol preference when doing NAPTR lookups"},
222         {"dns_tcp_pref",        CFG_VAR_INT,    0, 0, 0, reinit_proto_prefs,
223                 "tcp protocol preference when doing NAPTR lookups"},
224         {"dns_tls_pref",        CFG_VAR_INT,    0, 0, 0, reinit_proto_prefs,
225                 "tls protocol preference when doing NAPTR lookups"},
226         {"dns_sctp_pref",       CFG_VAR_INT,    0, 0, 0, reinit_proto_prefs,
227                 "sctp protocol preference when doing NAPTR lookups"},
228         {"dns_retr_time",       CFG_VAR_INT,    0, 0, 0, resolv_reinit,
229                 "time in s before retrying a dns request"},
230         {"dns_retr_no",         CFG_VAR_INT,    0, 0, 0, resolv_reinit,
231                 "number of dns retransmissions before giving up"},
232         {"dns_servers_no",      CFG_VAR_INT,    0, 0, 0, resolv_reinit,
233                 "how many dns servers from the ones defined in "
234                 "/etc/resolv.conf will be used"},
235         {"dns_use_search_list", CFG_VAR_INT,    0, 1, 0, resolv_reinit,
236                 "if set to 0, the search list in /etc/resolv.conf is ignored"},
237         {"dns_search_full_match",       CFG_VAR_INT,    0, 1, 0, 0,
238                 "enable/disable domain name checks against the search list "
239                 "in DNS answers"},
240         {"dns_reinit",          CFG_VAR_INT|CFG_INPUT_INT,      1, 1, dns_reinit_fixup,
241                 resolv_reinit,
242                 "set to 1 in order to reinitialize the DNS resolver"},
243         {"dns_naptr_ignore_rfc",        CFG_VAR_INT,    0, 0, 0, reinit_proto_prefs,
244                 "ignore the Order field required by RFC 2915"},
245         /* DNS cache */
246 #ifdef USE_DNS_CACHE
247         {"use_dns_cache",       CFG_VAR_INT,    0, 1, use_dns_cache_fixup, 0,
248                 "enable/disable the dns cache"},
249         {"dns_cache_flags",     CFG_VAR_INT,    0, 4, 0, fix_dns_flags,
250                 "dns cache specific resolver flags "
251                 "(1=ipv4 only, 2=ipv6 only, 4=prefer ipv6"},
252         {"use_dns_failover",    CFG_VAR_INT,    0, 1, use_dns_failover_fixup, 0,
253                 "enable/disable dns failover in case the destination "
254                 "resolves to multiple ip addresses and/or multiple SRV records "
255                 "(depends on use_dns_cache)"},
256         {"dns_srv_lb",          CFG_VAR_INT,    0, 1, 0, fix_dns_flags,
257                 "enable/disable load balancing to different srv records "
258                 "of the same priority based on the srv records weights "
259                 "(depends on dns_failover)"},
260         {"dns_cache_negative_ttl",      CFG_VAR_INT,    0, 0, 0, 0,
261                 "time to live for negative results (\"not found\") "
262                 "in seconds. Use 0 to disable"},
263         {"dns_cache_min_ttl",   CFG_VAR_INT,    0, 0, 0, 0,
264                 "minimum accepted time to live for a record, in seconds"},
265         {"dns_cache_max_ttl",   CFG_VAR_INT,    0, 0, 0, 0,
266                 "maximum accepted time to live for a record, in seconds"},
267         {"dns_cache_mem",       CFG_VAR_INT,    0, 0, dns_cache_max_mem_fixup, 0,
268                 "maximum memory used for the dns cache in Kb"},
269         {"dns_cache_del_nonexp",        CFG_VAR_INT,    0, 1, 0, 0,
270                 "allow deletion of non-expired records from the cache when "
271                 "there is no more space left for new ones"},
272         {"dns_cache_rec_pref",  CFG_VAR_INT,    0, 3, 0, 0,
273                 "DNS cache record preference: "
274                 " 0 - do not check duplicates"
275                 " 1 - prefer old records"
276                 " 2 - prefer new records"
277                 " 3 - prefer records with longer lifetime"},
278 #endif
279 #ifdef PKG_MALLOC
280         {"mem_dump_pkg",        CFG_VAR_INT,    0, 0, 0, mem_dump_pkg_cb,
281                 "dump process memory status, parameter: pid_number"},
282 #endif
283 #ifdef SHM_MEM
284         {"mem_dump_shm",        CFG_VAR_INT,    0, 0, mem_dump_shm_fixup, 0,
285                 "dump shared memory status"},
286 #endif
287         {"max_while_loops",     CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
288                 "maximum iterations allowed for a while loop" },
289         {"udp_mtu",     CFG_VAR_INT|CFG_ATOMIC, 0, 65535, 0, 0,
290                 "fallback to a congestion controlled protocol if send size"
291                         " exceeds udp_mtu"},
292         {"udp_mtu_try_proto", CFG_VAR_INT, 1, 4, 0, fix_global_req_flags,
293                 "if send size > udp_mtu use proto (1 udp, 2 tcp, 3 tls, 4 sctp)"},
294         {"udp4_raw", CFG_VAR_INT | CFG_ATOMIC, -1, 1, check_raw_sock_support, 0,
295                 "enable/disable using a raw socket for sending UDP IPV4 packets."
296                 " Should be  faster on multi-CPU linux running machines."},
297         {"udp4_raw_mtu", CFG_VAR_INT | CFG_ATOMIC, 28, 65535, 0, 0,
298                 "set the MTU used when using raw sockets for udp sending."
299                 " This  value will be used when deciding whether or not to fragment"
300                 " the packets."},
301         {"udp4_raw_ttl", CFG_VAR_INT | CFG_ATOMIC, -1, 255, udp4_raw_ttl_fixup, 0,
302                 "set the IP TTL used when using raw sockets for udp sending."
303                 " -1 will use the same value as for normal udp sockets."},
304         {"force_rport",     CFG_VAR_INT, 0, 1,  0, fix_global_req_flags,
305                 "force rport for all the received messages" },
306         {"memlog",              CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
307                 "log level for memory status/summary information"},
308         {"mem_summary", CFG_VAR_INT|CFG_ATOMIC, 0, 31, 0, 0,
309                 "memory debugging information displayed on exit (flags): "
310                 " 0 - off,"
311                 " 1 - dump all the pkg used blocks (status),"
312                 " 2 - dump all the shm used blocks (status),"
313                 " 4 - summary of pkg used blocks,"
314                 " 8 - summary of shm used blocks,"
315                 " 16 - short status instead of dump" },
316         {"mem_safety",          CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
317                 "safety level for memory operations"},
318         {"mem_join",            CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
319                 "join free memory fragments"},
320         {"corelog",             CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
321                 "log level for non-critical core error messages"},
322         {"latency_log",         CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
323                 "log level for latency limits alert messages"},
324         {"latency_limit_db",            CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
325                 "limit is ms for alerting on time consuming db commands"},
326         {"latency_limit_action",                CFG_VAR_INT|CFG_ATOMIC, 0, 0, 0, 0,
327                 "limit is ms for alerting on time consuming config actions"},
328         {0, 0, 0, 0, 0, 0}
329 };