cfg_core.c
7ac069af
 /*
  * $Id$
  *
  * Copyright (C) 2007 iptelorg GmbH
  *
5a03489e
  * This file is part of SIP-router, a free SIP server.
7ac069af
  *
5a03489e
  * SIP-router is free software; you can redistribute it and/or modify
7ac069af
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version
  *
5a03489e
  * SIP-router is distributed in the hope that it will be useful,
7ac069af
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * History
  * -------
  *  2007-12-03	Initial version (Miklos)
2cfcc6bb
  *  2008-01-31  added DNS resolver parameters (Miklos)
7ac069af
  */
1d0661db
 /*!
  * \file
3c86cd25
  * \brief SIP-router core ::  Core configuration parser
1d0661db
  * \ingroup core
  * Module: \ref core
3c86cd25
  *
  * See 
  * - \ref ConfigCoreDoc
  * - \ref ConfigEngine
  * - \ref cfg_core.h
  */
 /*!
  * \page ConfigCoreDoc Documentation of configuration parser
  * \section ConfigParser Configuration parser
  * Further information
  * - \ref ConfigEngine
  * - \ref cfg_core.h
  * \verbinclude cfg.txt
  *
1d0661db
  */
7ac069af
 
 #include "dprint.h"
2cfcc6bb
 #ifdef USE_DST_BLACKLIST
a4d17f82
 #include "dst_blacklist.h"
2cfcc6bb
 #endif
 #include "resolve.h"
 #ifdef USE_DNS_CACHE
 #include "dns_cache.h"
 #endif
b4c9f986
 #if defined PKG_MALLOC || defined SHM_MEM
 #include "pt.h"
 #endif
bf8dfee3
 #include "msg_translator.h" /* fix_global_req_flags() */
7ac069af
 #include "cfg/cfg.h"
 #include "cfg_core.h"
 
 struct cfg_group_core default_core_cfg = {
5a03489e
 	L_WARN, 	/*!<  print only msg. < L_WARN */
 	LOG_DAEMON,	/*!< log_facility -- see syslog(3) */
 	L_DBG,  /*!< memdbg */
a4d17f82
 #ifdef USE_DST_BLACKLIST
2cfcc6bb
 	/* blacklist */
5a03489e
 	0, /*!< dst blacklist is disabled by default */
a4d17f82
 	DEFAULT_BLST_TIMEOUT,
 	DEFAULT_BLST_MAX_MEM,
0f9e9908
 	0, /* blst_udp_imask */
 	0, /* blst_tcp_imask */
 	0, /* blst_tls_imask */
 	0, /* blst_sctp_imask */
a4d17f82
 #endif
2cfcc6bb
 	/* resolver */
 #ifdef USE_IPV6
5a03489e
 	1,  /*!< dns_try_ipv6 -- on by default */
2cfcc6bb
 #else
5a03489e
 	0,  /*!< dns_try_ipv6 -- off, if no ipv6 support */
2cfcc6bb
 #endif
5a03489e
 	0,  /*!< dns_try_naptr -- off by default */
 	30,  /*!< udp transport preference (for naptr) */
 	20,  /*!< tcp transport preference (for naptr) */
 	10,  /*!< tls transport preference (for naptr) */
 	20,  /*!< sctp transport preference (for naptr) */
 	-1, /*!< dns_retr_time */
 	-1, /*!< dns_retr_no */
 	-1, /*!< dns_servers_no */
 	1,  /*!< dns_search_list */
 	1,  /*!< dns_search_fmatch */
 	0,  /*!< dns_reinit */
2cfcc6bb
 	/* DNS cache */
 #ifdef USE_DNS_CACHE
5a03489e
 	1,  /*!< use_dns_cache -- on by default */
 	0,  /*!< dns_cache_flags */
 	0,  /*!< use_dns_failover -- off by default */
 	0,  /*!< dns_srv_lb -- off by default */
 	DEFAULT_DNS_NEG_CACHE_TTL, /*!< neg. cache ttl */
 	DEFAULT_DNS_CACHE_MIN_TTL, /*!< minimum ttl */
 	DEFAULT_DNS_CACHE_MAX_TTL, /*!< maximum ttl */
 	DEFAULT_DNS_MAX_MEM, /*!< dns_cache_max_mem */
 	0, /*!< dns_cache_del_nonexp -- delete only expired entries by default */
2cfcc6bb
 #endif
b4c9f986
 #ifdef PKG_MALLOC
5a03489e
 	0, /*!< mem_dump_pkg */
b4c9f986
 #endif
 #ifdef SHM_MEM
5a03489e
 	0, /*!< mem_dump_shm */
b4c9f986
 #endif
5a03489e
 	DEFAULT_MAX_WHILE_LOOPS, /*!< max_while_loops */
 	0, /*!< udp_mtu (disabled by default) */
 	0, /*!< udp_mtu_try_proto -> default disabled */
 	0,  /*!< force_rport */
 	L_DBG, /*!< memlog */
 	1 /*!< mem_summary -flags: 0 off, 1 shm/pkg_status, 2 shm/pkg_sums */
7ac069af
 };
 
 void	*core_cfg = &default_core_cfg;
 
 cfg_def_t core_cfg_def[] = {
0d09b88d
 	{"debug",		CFG_VAR_INT|CFG_ATOMIC,	0, 0, 0, 0,
 		"debug level"},
 	{"log_facility",	CFG_VAR_INT|CFG_INPUT_STRING,	0, 0, log_facility_fixup, 0,
 		"syslog facility, see \"man 3 syslog\""},
e4f42ce1
 	{"memdbg",		CFG_VAR_INT|CFG_ATOMIC,	0, 0, 0, 0,
 		"log level for memory debugging messages"},
a4d17f82
 #ifdef USE_DST_BLACKLIST
2cfcc6bb
 	/* blacklist */
7905e2d6
 	{"use_dst_blacklist",	CFG_VAR_INT,	0, 1, use_dst_blacklist_fixup, 0,
a4d17f82
 		"enable/disable destination blacklisting"},
 	{"dst_blacklist_expire",	CFG_VAR_INT,	0, 0, 0, 0,
 		"how much time (in s) a blacklisted destination is kept in the list"},
 	{"dst_blacklist_mem",	CFG_VAR_INT,	0, 0, blst_max_mem_fixup, 0,
0f9e9908
 		"maximum shared memory amount (in KB) used for keeping the blacklisted"
 			" destinations"},
 	{"dst_blacklist_udp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
 		"blacklist event ignore mask for UDP"},
 	{"dst_blacklist_tcp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
 		"blacklist event ignore mask for TCP"},
 	{"dst_blacklist_tls_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
 		"blacklist event ignore mask for TLS"},
 	{"dst_blacklist_sctp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
 		"blacklist event ignore mask for SCTP"},
a4d17f82
 #endif
2cfcc6bb
 	/* resolver */
 #ifdef USE_DNS_CACHE
 	{"dns_try_ipv6",	CFG_VAR_INT,	0, 1, dns_try_ipv6_fixup, fix_dns_flags,
 #else
 	{"dns_try_ipv6",	CFG_VAR_INT,	0, 1, dns_try_ipv6_fixup, 0,
 #endif
 		"enable/disable IPv6 DNS lookups"},
 #ifdef USE_DNS_CACHE
 	{"dns_try_naptr",	CFG_VAR_INT,	0, 1, 0, fix_dns_flags,
 #else
 	{"dns_try_naptr",	CFG_VAR_INT,	0, 1, 0, 0,
 #endif
 		"enable/disable NAPTR DNS lookups"},
 	{"dns_udp_pref",	CFG_VAR_INT,	0, 0, 0, reinit_naptr_proto_prefs,
 		"udp protocol preference when doing NAPTR lookups"},
 	{"dns_tcp_pref",	CFG_VAR_INT,	0, 0, 0, reinit_naptr_proto_prefs,
 		"tcp protocol preference when doing NAPTR lookups"},
 	{"dns_tls_pref",	CFG_VAR_INT,	0, 0, 0, reinit_naptr_proto_prefs,
 		"tls protocol preference when doing NAPTR lookups"},
7d11cc0c
 	{"dns_sctp_pref",	CFG_VAR_INT,	0, 0, 0, reinit_naptr_proto_prefs,
 		"sctp protocol preference when doing NAPTR lookups"},
2cfcc6bb
 	{"dns_retr_time",	CFG_VAR_INT,	0, 0, 0, resolv_reinit,
 		"time in s before retrying a dns request"},
 	{"dns_retr_no",		CFG_VAR_INT,	0, 0, 0, resolv_reinit,
 		"number of dns retransmissions before giving up"},
 	{"dns_servers_no",	CFG_VAR_INT,	0, 0, 0, resolv_reinit,
 		"how many dns servers from the ones defined in "
 		"/etc/resolv.conf will be used"},
 	{"dns_use_search_list",	CFG_VAR_INT,	0, 1, 0, resolv_reinit,
 		"if set to 0, the search list in /etc/resolv.conf is ignored"},
 	{"dns_search_full_match",	CFG_VAR_INT,	0, 1, 0, 0,
 		"enable/disable domain name checks against the search list "
 		"in DNS answers"},
 	{"dns_reinit",		CFG_VAR_INT|CFG_INPUT_INT,	1, 1, dns_reinit_fixup, resolv_reinit,
 		"set to 1 in order to reinitialize the DNS resolver"},
 	/* DNS cache */
 #ifdef USE_DNS_CACHE
7905e2d6
 	{"use_dns_cache",	CFG_VAR_INT,	0, 1, use_dns_cache_fixup, 0,
 		"enable/disable the dns cache"},
2cfcc6bb
 	{"dns_cache_flags",	CFG_VAR_INT,	0, 4, 0, fix_dns_flags,
 		"dns cache specific resolver flags "
 		"(1=ipv4 only, 2=ipv6 only, 4=prefer ipv6"},
 	{"use_dns_failover",	CFG_VAR_INT,	0, 1, use_dns_failover_fixup, 0,
 		"enable/disable dns failover in case the destination "
 		"resolves to multiple ip addresses and/or multiple SRV records "
 		"(depends on use_dns_cache)"},
 	{"dns_srv_lb",		CFG_VAR_INT,	0, 1, 0, fix_dns_flags,
 		"enable/disable load balancing to different srv records "
 		"of the same priority based on the srv records weights "
 		"(depends on dns_failover)"},
 	{"dns_cache_negative_ttl",	CFG_VAR_INT,	0, 0, 0, 0,
 		"time to live for negative results (\"not found\") "
 		"in seconds. Use 0 to disable"},
 	{"dns_cache_min_ttl",	CFG_VAR_INT,	0, 0, 0, 0,
 		"minimum accepted time to live for a record, in seconds"},
 	{"dns_cache_max_ttl",	CFG_VAR_INT,	0, 0, 0, 0,
 		"maximum accepted time to live for a record, in seconds"},
 	{"dns_cache_mem",	CFG_VAR_INT,	0, 0, dns_cache_max_mem_fixup, 0,
 		"maximum memory used for the dns cache in Kb"},
 	{"dns_cache_del_nonexp",	CFG_VAR_INT,	0, 1, 0, 0,
 		"allow deletion of non-expired records from the cache when "
 		"there is no more space left for new ones"},
 #endif
b4c9f986
 #ifdef PKG_MALLOC
 	{"mem_dump_pkg",	CFG_VAR_INT,	0, 0, 0, mem_dump_pkg_cb,
 		"dump process memory status, parameter: pid_number"},
 #endif
 #ifdef SHM_MEM
 	{"mem_dump_shm",	CFG_VAR_INT,	0, 0, mem_dump_shm_fixup, 0,
 		"dump shared memory status"},
 #endif
dfda974c
 	{"max_while_loops",	CFG_VAR_INT|CFG_ATOMIC,	0, 0, 0, 0,
 		"maximum iterations allowed for a while loop" },
bf8dfee3
 	{"udp_mtu",	CFG_VAR_INT|CFG_ATOMIC,	0, 65535, 0, 0,
 		"fallback to a congestion controlled protocol if send size"
 			" exceeds udp_mtu"},
 	{"udp_mtu_try_proto", CFG_VAR_INT, 1, 4, 0, fix_global_req_flags,
 		"if send size > udp_mtu use proto (1 udp, 2 tcp, 3 tls, 4 sctp)"},
 	{"force_rport",     CFG_VAR_INT, 0, 1,  0, fix_global_req_flags,
 		"force rport for all the received messages" },
e4f42ce1
 	{"memlog",		CFG_VAR_INT|CFG_ATOMIC,	0, 0, 0, 0,
 		"log level for memory status/summary information"},
d740c34e
 	{"mem_summary",	CFG_VAR_INT|CFG_ATOMIC,	0, 3, 0, 0,
 		"memory debugging information displayed on exit (flags): "
e4f42ce1
 		" 0 - off, 1 - dump all the used blocks (status),"
 		" 2 - summary of used blocks" },
7ac069af
 	{0, 0, 0, 0, 0, 0}
 };