This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
cookbooks:devel:core [2016/06/22 19:17] miconda [loadpath] |
cookbooks:devel:core [2020/09/30 09:23] miconda [ip_free_bind] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== Core Cookbook ====== |
+ | Version: Kamailio SIP Server v5.5.x (devel) | ||
===== Overview ===== | ===== Overview ===== | ||
Line 9: | Line 10: | ||
===== Structure ===== | ===== Structure ===== | ||
- | The structure of the kamailio.cfg can be seen as thee parts: | + | The structure of the kamailio.cfg can be seen as three parts: |
* global parameters | * global parameters | ||
Line 47: | Line 48: | ||
</ | </ | ||
+ | Usually setting a parameter is ended by end of line, but it can be also ended with **;** (semicolon). This should be used when the grammar of a parameter allows values on multiple lines (like **listen** or **alias**) and the next line creates a conflict by being swallowed as part of value for previous parameter. | ||
+ | |||
+ | <code c> | ||
+ | alias=" | ||
+ | </ | ||
+ | |||
+ | If you want to use a reserved config keyword as part of a parameter, you need to enclose it in quotes. See the example below for the keyword " | ||
+ | |||
+ | <code c> | ||
+ | listen=tcp: | ||
+ | </ | ||
==== Modules Settings Section ==== | ==== Modules Settings Section ==== | ||
Line 125: | Line 137: | ||
"this is a string value" | "this is a string value" | ||
- | 'this is another string value" | + | 'this is another string value' |
// next is a boolean | // next is a boolean | ||
Line 198: | Line 210: | ||
The path_to_file can be relative or absolute. If it is not absolute path, first attempt is to locate it relative to current directory, and if fails, relative to directory of the file that includes it. There is no restriction where include can be used or what can contain - any part of config file is ok. There is a limit of maximum 10 includes in depth, otherwise you can use as many includes as you want. Reporting of the cfg file syntax errors prints now the file name for easier troubleshooting. | The path_to_file can be relative or absolute. If it is not absolute path, first attempt is to locate it relative to current directory, and if fails, relative to directory of the file that includes it. There is no restriction where include can be used or what can contain - any part of config file is ok. There is a limit of maximum 10 includes in depth, otherwise you can use as many includes as you want. Reporting of the cfg file syntax errors prints now the file name for easier troubleshooting. | ||
- | If the included file is not found, the config file parser throws error. | + | If the included file is not found, the config file parser throws error. You can find this error message at the logging destination, |
You can use also the syntax **# | You can use also the syntax **# | ||
Line 234: | Line 246: | ||
Available directives: | Available directives: | ||
- | * #!define NAME - define a keyword | + | |
- | * #!define NAME VALUE - define a keyword with value | + | |
- | * #!ifdef NAME - check if a keyword is defined | + | |
- | * #!ifndef - check if a keyword is not defined | + | |
- | * #!else - swtich | + | |
- | * #!endif - end ifdef/ | + | |
- | * #!trydef - add a define if not already defined | + | |
- | * #!redefine - force redefinition even if already defined | + | |
+ | |||
+ | Predefined keywords: | ||
+ | * **KAMAILIO_X[_Y[_Z]]** - Kamailio versions | ||
+ | * **MOD_X** - when module X has been loaded | ||
+ | See ' | ||
Among benefits: | Among benefits: | ||
- | * easy way to enable/ | + | * easy way to enable/ |
* switch control for parts where conditional statements were not possible (e.g., global parameters, module settings) | * switch control for parts where conditional statements were not possible (e.g., global parameters, module settings) | ||
* faster by not using conditional statements inside routing blocks when switching between running environments | * faster by not using conditional statements inside routing blocks when switching between running environments | ||
Line 269: | Line 286: | ||
#!ifdef TESTBED_MODE | #!ifdef TESTBED_MODE | ||
modparam(" | modparam(" | ||
- | " | + | " |
#!else | #!else | ||
modparam(" | modparam(" | ||
- | " | + | " |
#!endif | #!endif | ||
Line 370: | Line 387: | ||
Similar to **subst**, but in addition it adds a **#!define ID subst**. | Similar to **subst**, but in addition it adds a **#!define ID subst**. | ||
+ | ==== substdefs ==== | ||
+ | |||
+ | <code c> | ||
+ | #!substdefs "/ | ||
+ | </ | ||
+ | |||
+ | Similar to **subst**, but in addition it adds a **#!define ID " | ||
===== Core Keywords ===== | ===== Core Keywords ===== | ||
- | Keywords specific to SIP messages which can be used mainly in ''' | + | Keywords specific to SIP messages which can be used mainly in '' |
==== af ==== | ==== af ==== | ||
Line 666: | Line 690: | ||
==== advertised_address ==== | ==== advertised_address ==== | ||
- | It can be an IP address or string and represents the address advertised in Via header | + | It can be an IP address or string and represents the address advertised in Via header. If empty or not set (default value) the socket |
- | other destination lumps (e.g RR header). If empty or not set (default value) the socket | + | |
address from where the request will be sent is used. | address from where the request will be sent is used. | ||
Line 679: | Line 702: | ||
advertised_address=" | advertised_address=" | ||
+ | Note: this option may be deprecated and removed in the near future, it is recommended to set **advertise** option for **listen** parameter. | ||
==== advertised_port ==== | ==== advertised_port ==== | ||
- | The port advertised in Via header | + | The port advertised in Via header. If empty or not set (default value) the port from where the message will be sent is used. Same warnings as for ' |
Example of usage: | Example of usage: | ||
Line 687: | Line 711: | ||
advertised_port=5080 | advertised_port=5080 | ||
+ | Note: this option may be deprecated and removed in the near future, it is recommended to set **advertise** option for **listen** parameter. | ||
==== alias ==== | ==== alias ==== | ||
Line 700: | Line 725: | ||
</ | </ | ||
+ | Note: the hostname has to be enclosed in between quotes if it has reserved tokens such as **forward**, | ||
==== async_workers ==== | ==== async_workers ==== | ||
Line 723: | Line 749: | ||
==== auto_bind_ipv6 ==== | ==== auto_bind_ipv6 ==== | ||
- | When turned on, Kamailio will automatically bind to all IPv6 addresses (much like the default behaviour for IPv4). | + | When turned on, Kamailio will automatically bind to all IPv6 addresses (much like the default behaviour for IPv4). Default is 0. |
Example: | Example: | ||
Line 729: | Line 755: | ||
< | < | ||
auto_bind_ipv6=1 | auto_bind_ipv6=1 | ||
+ | </ | ||
+ | |||
+ | ==== bind_ipv6_link_local ==== | ||
+ | |||
+ | If set to 1, try to bind also IPv6 link local addresses by discovering the scope of the interface. This apply for UDP socket for now, to be added for the other protocols. Default is 0. | ||
+ | |||
+ | Example: | ||
+ | |||
+ | < | ||
+ | bind_ipv6_link_local=1 | ||
</ | </ | ||
==== check_via ==== | ==== check_via ==== | ||
Line 790: | Line 826: | ||
Examples of usage: | Examples of usage: | ||
- | * debug=3: print all log messages. This is only usefull | + | * debug=3: print all log messages. This is only useful |
* debug=0: This will only log warning, errors and more critical messages. | * debug=0: This will only log warning, errors and more critical messages. | ||
* debug=-6: This will disable all log messages. | * debug=-6: This will disable all log messages. | ||
Line 799: | Line 835: | ||
kamcmd cfg.set_now_int core debug -- -1 | kamcmd cfg.set_now_int core debug -- -1 | ||
- | Note: There is a difference in log-levels between Kamailio 3.x and Kamailio< | + | Note: There is a difference in log-levels between Kamailio 3.x and Kamailio< |
For configuration of logging of the memory manager see the parameters [[#memlog]] and [[# | For configuration of logging of the memory manager see the parameters [[#memlog]] and [[# | ||
- | Further information can also be bound at: http:// | + | Further information can also be found at: https:// |
==== description ==== | ==== description ==== | ||
Line 853: | Line 889: | ||
==== flags ==== | ==== flags ==== | ||
- | **Alias name: bool** | + | SIP message (transaction) flags can have string names. |
+ | The //name// for flags cannot be used for **branch** or **script flags**(*) | ||
+ | |||
+ | |||
+ | <code c> | ||
+ | ... | ||
+ | flags | ||
+ | FLAG_ONE | ||
+ | FLAG_TWO | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | (*) The named flags feature was propagated from the source code merge back in 2008 and is not extensively tested. The recommended way of defining flags is using [[cookbooks: | ||
+ | <code c> | ||
+ | #!define FLAG_NAME FLAG_BIT | ||
+ | </ | ||
+ | |||
==== force_rport ==== | ==== force_rport ==== | ||
Line 904: | Line 957: | ||
http_reply_parse=yes | http_reply_parse=yes | ||
+ | ==== ip_free_bind ==== | ||
+ | |||
+ | Alias: ipfreebind, ip_nonlocal_bind | ||
+ | |||
+ | Control if Kamailio should attempt to bind to non local ip. This option is the per-socket equivalent of the system **ip_nonlocal_bind**. | ||
+ | |||
+ | Default is 0 (do not bind to non local ip). | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | <code c> | ||
+ | ip_free_bind = 1 | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== ipv6_hex_style ==== | ||
+ | |||
+ | Can be set to " | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | <code c> | ||
+ | ipv6_hex_style = " | ||
+ | </ | ||
+ | ==== kemi.onsend_route_callback ==== | ||
+ | |||
+ | Set the name of callback function in the KEMI script to be executed as the equivalent of `onsend_route` block (from the native configuration file). | ||
+ | |||
+ | Default value: ksr_onsend_route | ||
+ | |||
+ | Set it to empty string or " | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | kemi.onsend_route_callback=" | ||
+ | </ | ||
+ | |||
+ | ==== kemi.received_route_callback ==== | ||
+ | |||
+ | Set the name of callback function in the KEMI script to be executed as the equivalent of `event_route[core: | ||
+ | |||
+ | Default value: none | ||
+ | |||
+ | Set it to empty string or " | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | kemi.received_route_callback=" | ||
+ | </ | ||
+ | |||
+ | ==== kemi.reply_route_callback ==== | ||
+ | |||
+ | Set the name of callback function in the KEMI script to be executed as the equivalent of `reply_route` block (from the native configuration file). | ||
+ | |||
+ | Default value: ksr_reply_route | ||
+ | |||
+ | Set it to empty string or " | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | kemi.onsend_route_callback=" | ||
+ | </ | ||
==== latency_cfg_log ==== | ==== latency_cfg_log ==== | ||
Line 918: | Line 1036: | ||
==== latency_limit_action ==== | ==== latency_limit_action ==== | ||
- | Limit of latency in ms for config actions. If a config action executed by cfg interpreter takes longer than its value, a message is printed in the logs, showing config path, line and action name when it is a module function, as well as internal action id. | + | Limit of latency in us (micro-seconds) |
Default value is 0 (disabled). | Default value is 0 (disabled). | ||
Line 928: | Line 1046: | ||
==== latency_limit_db ==== | ==== latency_limit_db ==== | ||
- | Limit of latency in ms for db operations. If a db operation executed via DB API v1 takes longer that its value, a message is printed in the logs, showing the first 50 characters of the db query. | + | Limit of latency in us (micro-seconds) |
Line 951: | Line 1069: | ||
==== listen ==== | ==== listen ==== | ||
- | Set the network addresses the SIP server should listen to. It can be an IP address, hostname or network | + | Set the network addresses the SIP server should listen to. It can be an IP address, hostname or network |
Example of usage: | Example of usage: | ||
Line 966: | Line 1084: | ||
<code c> | <code c> | ||
- | listen=udp: | + | listen=udp: |
</ | </ | ||
Line 972: | Line 1090: | ||
<code c> | <code c> | ||
- | listen=udp: | + | listen=udp: |
</ | </ | ||
Line 978: | Line 1096: | ||
A typical use case for advertise address is when running SIP server behind a NAT/ | A typical use case for advertise address is when running SIP server behind a NAT/ | ||
+ | |||
+ | A unique name can be set for sockets to simplify the selection of the socket for sending out. For example, the rr and path modules can use the socket name to advertise it in header URI parameter and use it as a shortcut to select the corresponding socket for routing subsequent requests. | ||
+ | |||
+ | The name has to be provided as a string enclosed in between quotes after the **name** identifier. | ||
+ | |||
+ | <code c> | ||
+ | listen=udp: | ||
+ | listen=udp: | ||
+ | listen=udp: | ||
+ | listen=udp: | ||
+ | ... | ||
+ | $fsn = " | ||
+ | t_relay(); | ||
+ | </ | ||
+ | |||
+ | Note that there is no internal check for uniqueness of the socket names, the admin has to ensure it in order to be sure the desired socket is selected, otherwise the first socket with a matching name is used. | ||
==== loadmodule ==== | ==== loadmodule ==== | ||
Line 984: | Line 1118: | ||
Prototype: **loadmodule " | Prototype: **loadmodule " | ||
- | If modulepath is only modulename or modulename.so, | + | If modulepath is only modulename or modulename.so, |
Example of usage: | Example of usage: | ||
Line 1054: | Line 1188: | ||
==== log_name ==== | ==== log_name ==== | ||
- | Allows to configure a log_name prefix which will be used when printing to syslog. This is useful to filter log messages when running many instances of Kamailio on same server | + | Allows to configure a log_name prefix which will be used when printing to syslog |
< | < | ||
- | log_name=" | + | log_name=" |
</ | </ | ||
==== log_prefix ==== | ==== log_prefix ==== | ||
- | Specify the text to be prefixed to the log messages printed by Kamailio while processing a SIP message. It can contain script variables that are evaluated at runtime | + | Specify the text to be prefixed to the log messages printed by Kamailio while processing a SIP message |
+ | See [[#log_prefix_mode]] about when/how evaluation is done. | ||
+ | |||
+ | |||
+ | If a log message is printed from a part of the code executed out of routing blocks actions (e.g., can be timer, evapi worker process, ...), there is no log prefix set, because this one requires a valid SIP message structure to work with. | ||
Example - prefix with message type (1 - request, 2 - response), CSeq and Call-ID: | Example - prefix with message type (1 - request, 2 - response), CSeq and Call-ID: | ||
Line 1072: | Line 1210: | ||
==== log_prefix_mode ==== | ==== log_prefix_mode ==== | ||
- | If set to 0 (default), then log_prefix | + | Control if [[# |
+ | |||
+ | If set to 0 (default), then log prefix | ||
- | If set to 1, then the log prefix is evaluated before/ | + | If set to 1, then the log prefix is evaluated before/ |
Example: | Example: | ||
Line 1096: | Line 1236: | ||
log_stderror=yes | log_stderror=yes | ||
+ | |||
+ | ==== cfgengine ==== | ||
+ | |||
+ | Set the config interpreter engine for execution of the routing logic inside the configuration file. Default is the native interpreter. | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | cfgengine=" | ||
+ | cfgengine " | ||
+ | |||
+ | If name is " | ||
+ | | ||
+ | The name can be the identifier of an embedded language interpreter, | ||
+ | |||
+ | cfgengine " | ||
==== maxbuffer ==== | ==== maxbuffer ==== | ||
Line 1135: | Line 1290: | ||
max_while_loops=200 | max_while_loops=200 | ||
+ | |||
+ | ==== mcast ==== | ||
+ | |||
+ | This parameter can be used to set the interface that should join the multicast group. This is useful if you want to **listen** on a multicast address and don't want to depend on the kernel routing table for choosing an interface. | ||
+ | |||
+ | The parameter is reset after each **listen** parameter, so you can join the right multicast group on each interface without having to modify kernel routing beforehand. | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | mcast=" | ||
+ | listen=udp: | ||
==== mcast_loopback ==== | ==== mcast_loopback ==== | ||
Line 1194: | Line 1360: | ||
It can be set via config reload framework. | It can be set via config reload framework. | ||
- | Default is 0 (disabled). | + | Default is 1 (enabled). |
<code c> | <code c> | ||
Line 1209: | Line 1375: | ||
==== mem_safety ==== | ==== mem_safety ==== | ||
- | If set to 1, memory free operation does not call abort() for double freeing a pointer or freeing an invalid address. The server still prints the alerting log messages. | + | If set to 1, memory free operation does not call abort() for double freeing a pointer or freeing an invalid address. The server still prints the alerting log messages. If set to 0, the SIP server stops by calling abort() to generate a core file. |
It can be set via config reload framework. | It can be set via config reload framework. | ||
- | Default is 0 (disabled). | + | Default is 1 (enabled). |
+ | |||
+ | <code c> | ||
+ | mem_safety=0 | ||
+ | </ | ||
+ | |||
+ | ==== mem_status_mode ==== | ||
+ | |||
+ | If set to 1, memory status dump for qm allocator will print details about used fragments. If set to 0, the dump contains only free fragments. It can be set at runtime via cfg param framework | ||
+ | |||
+ | Default is 0. | ||
<code c> | <code c> | ||
- | mem_safety=1 | + | mem_status_mode=1 |
</ | </ | ||
Line 1307: | Line 1483: | ||
==== pv_buffer_size ==== | ==== pv_buffer_size ==== | ||
- | The size in bytes of internal buffer to print dynamic strings with pseudo-variables inside. The default value is 8192 (8kB). | + | The size in bytes of internal buffer to print dynamic strings with pseudo-variables inside. The default value is 8192 (8kB). Please keep in mind that for xlog messages, there is a dedicated module parameter to set the internal buffer size. |
Example of usage: | Example of usage: | ||
Line 1323: | Line 1499: | ||
< | < | ||
pv_buffer_slots=12 | pv_buffer_slots=12 | ||
+ | </ | ||
+ | |||
+ | ==== pv_cache_limit ==== | ||
+ | |||
+ | The limit how many pv declarations in the cache after which an action is taken. Default value is 2048. | ||
+ | |||
+ | < | ||
+ | pv_cache_limit=1024 | ||
+ | </ | ||
+ | |||
+ | ==== pv_cache_action ==== | ||
+ | |||
+ | Specify what action to be done when the size of pv cache is exceeded. If 0, print an warning log message when the limit is exceeded. If 1, warning log messages is printed and the cache systems tries to drop a $sht(...) declaration. Default is 0. | ||
+ | |||
+ | < | ||
+ | pv_cache_action=1 | ||
</ | </ | ||
Line 1337: | Line 1529: | ||
< | < | ||
rundir="/ | rundir="/ | ||
+ | </ | ||
+ | |||
+ | ==== received_route_mode ==== | ||
+ | |||
+ | Enable or disable the execution of event_route[core: | ||
+ | |||
+ | Default value: 0 (disabled) | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | <code c> | ||
+ | received_route_mode=1 | ||
</ | </ | ||
Line 1346: | Line 1550: | ||
reply_to_via=0 | reply_to_via=0 | ||
+ | | ||
+ | |||
+ | ==== route_locks_size ==== | ||
+ | |||
+ | Set the number of mutex locks to be used for synchronizing the execution of config script for messages sharing the same Call-Id. In other words, enables Kamailio to execute the config script sequentially for the requests and replies received within the same dialog -- a new message received within the same dialog waits until the previous one is routed out. | ||
+ | |||
+ | For smaller impact on parallel processing, its value it should be at least twice the number of Kamailio processes (all children processes). | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | route_locks_size = 256 | ||
+ | </ | ||
+ | |||
+ | Note that ordering of the SIP messages can still be changed by network transmission (quite likely for UDP, especially on long distance paths) or CPU allocation for processes when executing pre-config and post-config tasks (very low chance, but not to be ruled out completely). | ||
==== server_id ==== | ==== server_id ==== | ||
- | A configurable unique server id that can be used to discriminate server instances within a cluster of servers when all other information, | + | A configurable unique server id that can be used to discriminate server instances within a cluster of servers when all other information, |
<code c> | <code c> | ||
Line 1380: | Line 1599: | ||
shm_force_alloc = yes | no (default no) | shm_force_alloc = yes | no (default no) | ||
+ | |||
+ | ==== shm_mem_size ==== | ||
+ | |||
+ | Set shared memory size (in Mb). | ||
+ | |||
+ | shm_mem_size = 64 (default 64) | ||
+ | |||
==== sip_warning (noisy feedback) ==== | ==== sip_warning (noisy feedback) ==== | ||
- | Can be 0 or 1. If set to 1 (default value) a ' | + | Can be 0 or 1. If set to 1 (default value is 0) a ' |
The header contains several details that help troubleshooting using the network traffic dumps, but might reveal details of your network infrastructure and internal SIP routing. | The header contains several details that help troubleshooting using the network traffic dumps, but might reveal details of your network infrastructure and internal SIP routing. | ||
Line 1465: | Line 1691: | ||
+ | ==== stats_name_separator ==== | ||
+ | Specify the character used as a separator for the internal statistics' | ||
+ | Default value is " | ||
+ | Example of usage: | ||
+ | |||
+ | stats_name_separator = " | ||
==== tos ==== | ==== tos ==== | ||
Line 1496: | Line 1728: | ||
udp_mtu_try_proto = TCP|TLS|SCTP|UDP | udp_mtu_try_proto = TCP|TLS|SCTP|UDP | ||
+ | |||
+ | |||
+ | ==== uri_host_extra_chars ==== | ||
+ | |||
+ | Specify additional chars that should be allowed in the host part of URI. | ||
+ | |||
+ | <code c> | ||
+ | uri_host_extra_chars = " | ||
+ | </ | ||
==== user ==== | ==== user ==== | ||
Line 1516: | Line 1757: | ||
</ | </ | ||
+ | ==== verbose_startup ==== | ||
+ | |||
+ | Control if printing routing tree and udp probing buffer debug messages should be printed at startup. | ||
+ | |||
+ | Default is 0 (don't print); set to 1 to get those debug messages. | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | <code c> | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== version_table ==== | ||
+ | |||
+ | Set the name of the table holding the table version. Useful if the proxy is sharing a database within a project and during upgrades. Default value is " | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | <code c> | ||
+ | | ||
+ | </ | ||
==== workdir ==== | ==== workdir ==== | ||
Line 1527: | Line 1789: | ||
or | or | ||
| | ||
+ | |||
+ | ==== xavp_via_params ==== | ||
+ | |||
+ | Set the name of the XAVP of which subfields will be added as local //Via// -header parameters. | ||
+ | |||
+ | If not set, XAVP to Via header parameter manipulation is not applied (default behaviour). | ||
+ | |||
+ | If set, local Via header gets additional parameters from defined XAVP. Core flag FL_ADD_XAVP_VIA_PARAMS needs to be set¹. | ||
+ | |||
+ | Example: | ||
+ | | ||
+ | [1] See function // | ||
+ | |||
+ | ==== xavp_via_fields ==== | ||
+ | |||
+ | Set the name of xavp from where to take Via header field: address and port. | ||
+ | Use them to build local Via header. | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | xavp_via_fields=" | ||
+ | |||
+ | request_route { | ||
+ | ... | ||
+ | $xavp(customvia=> | ||
+ | $xavp(customvia=> | ||
+ | via_use_xavp_fields(" | ||
+ | t_relay(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | See function // | ||
===== DNS Parameters ===== | ===== DNS Parameters ===== | ||
Line 1550: | Line 1845: | ||
Kamailio also allows you to finetune the DNS resolver settings. | Kamailio also allows you to finetune the DNS resolver settings. | ||
- | The maximum time a dns request can take (before failing) is (if dns_try_ipv6 is yes, mutliply | + | The maximum time a dns request can take (before failing) is (if dns_try_ipv6 is yes, multiply |
(dns_retr_time*(dns_retr_no+1)*dns_servers_no)*(search_list_domains) | (dns_retr_time*(dns_retr_no+1)*dns_servers_no)*(search_list_domains) | ||
Line 1708: | Line 2003: | ||
Can be ' | Can be ' | ||
- | HINT: even if you don't have a search list defined, setting this option to ' | + | HINT: even if you don't have a search list defined, setting this option to ' |
Example of usage: | Example of usage: | ||
Line 1716: | Line 2011: | ||
==== use_dns_cache ==== | ==== use_dns_cache ==== | ||
- | Tells if DNS responses are cached - this means that the internal DNS resolver (instead of the system' | + | Tells if DNS responses are cached - this means that the internal DNS resolver (instead of the system' |
==== use_dns_failover ==== | ==== use_dns_failover ==== | ||
Line 1746: | Line 2041: | ||
| | ||
+ | |||
+ | ==== tcp_accept_haproxy ==== | ||
+ | Enable the internal TCP stack to expect a PROXY-protocol-formatted header as the first message of the connection. Both the human-readable (v1) and binary-encoded (v2) variants of the protocol are supported. This option is typically useful if you are behind a TCP load-balancer, | ||
+ | |||
+ | Please note that enabling this option will reject any inbound TCP connection that does not conform to the PROXY-protocol spec. | ||
+ | |||
+ | For reference: A PROXY protocol - https:// | ||
+ | |||
+ | Default value is **no**. | ||
+ | |||
+ | <code c> | ||
+ | tcp_accept_haproxy=yes | ||
+ | </ | ||
+ | |||
+ | ==== tcp_accept_hep3 ==== | ||
+ | |||
+ | Enable internal TCP receiving stack to accept HEP3 packets. This option has to be set to **yes** on a Kamailio instance acting as Homer SIPCapture server that is supposed to receive HEP3 packets over TCP/TLS. | ||
+ | |||
+ | Default value is **no**. | ||
+ | |||
+ | <code c> | ||
+ | tcp_accept_hep3=yes | ||
+ | </ | ||
==== tcp_accept_no_cl ==== | ==== tcp_accept_no_cl ==== | ||
Line 1758: | Line 2076: | ||
</ | </ | ||
+ | ==== tcp_accept_unique ==== | ||
+ | |||
+ | If set to 1, reject duplicate connections coming from same source IP and port. | ||
+ | |||
+ | Default set to 0. | ||
+ | |||
+ | <code c> | ||
+ | tcp_accept_unique = 1 | ||
+ | </ | ||
==== tcp_async ==== | ==== tcp_async ==== | ||
Line 1796: | Line 2123: | ||
tcp_connection_lifetime=3605 | tcp_connection_lifetime=3605 | ||
+ | ==== tcp_connection_match ==== | ||
+ | |||
+ | If set to 1, try to be more strict in matching outbound TCP connections, | ||
+ | |||
+ | Default is 0. | ||
+ | |||
+ | <code c> | ||
+ | tcp_connection_match=1 | ||
+ | </ | ||
==== tcp_connect_timeout ==== | ==== tcp_connect_timeout ==== | ||
Line 1806: | Line 2142: | ||
==== tcp_conn_wq_max ==== | ==== tcp_conn_wq_max ==== | ||
- | Maximum bytes queued for write allowed per connection. Attempting to queue more bytes would result in an error and in the connection being closed (too slow). If tcp_write_buf | + | Maximum bytes queued for write allowed per connection. Attempting to queue more bytes would result in an error and in the connection being closed (too slow). If tcp_buf_write |
tcp_conn_wq_max = bytes (default 32 K) | tcp_conn_wq_max = bytes (default 32 K) | ||
Line 1867: | Line 2203: | ||
==== tcp_max_connections ==== | ==== tcp_max_connections ==== | ||
- | Maximum number of tcp connections (if the number is exceeded no new tcp connections will be accepted). Default is defined in tcp_conn.h: #define DEFAULT_TCP_MAX_CONNECTIONS 2048 | + | Maximum number of tcp connections (if the number is exceeded no new tcp connections will be accepted). Default is defined in tcp_init.h: #define DEFAULT_TCP_MAX_CONNECTIONS 2048 |
Example of usage: | Example of usage: | ||
Line 1925: | Line 2261: | ||
==== tcp_wq_max ==== | ==== tcp_wq_max ==== | ||
- | Maximum bytes queued for write allowed globally. It has no effect if tcp_write_buf | + | Maximum bytes queued for write allowed globally. It has no effect if tcp_buf_write |
tcp_wq_max = bytes (default 10 Mb) | tcp_wq_max = bytes (default 10 Mb) | ||
+ | | ||
+ | ==== tcp_reuse_port ==== | ||
+ | |||
+ | Allows reuse of TCP ports. This means,for example, that the same TCP ports on which Kamailio is listening on, can be used as source ports of new TCP connections when acting as an UAC. Kamailio must have been compiled in a system implementing SO_REUSEPORT (Linux > 3.9.0, FreeBSD, OpenBSD, NetBSD, MacOSX). This parameter takes effect only if also the system on which Kamailio is running on supports SO_REUSEPORT. | ||
+ | |||
+ | tcp_reuse_port = yes (default no) | ||
===== TLS Parameters ===== | ===== TLS Parameters ===== | ||
Line 2329: | Line 2671: | ||
Force to send the message from the specified socket (it _must_ be one of the sockets specified with the " | Force to send the message from the specified socket (it _must_ be one of the sockets specified with the " | ||
+ | |||
+ | This function does not support pseudo-variables, | ||
Example of usage: | Example of usage: | ||
Line 2343: | Line 2687: | ||
adds a tcp port alias for the current connection (if tcp). | adds a tcp port alias for the current connection (if tcp). | ||
- | Usefull | + | Useful |
the same connection this request came from [it could help | the same connection this request came from [it could help | ||
for firewall or nat traversal]. | for firewall or nat traversal]. | ||
Line 2373: | Line 2717: | ||
Test if a flag is set for current processed message (if the flag value is 1). The value of the parameter can be in range of 0..31. | Test if a flag is set for current processed message (if the flag value is 1). The value of the parameter can be in range of 0..31. | ||
- | For more see http:// | + | For more see: https:// |
Example of usage: | Example of usage: | ||
Line 2518: | Line 2862: | ||
Example of usage: | Example of usage: | ||
- | rewriteuri(" | + | rewriteuri(" |
==== rewriteuserpass ==== | ==== rewriteuserpass ==== | ||
Line 2556: | Line 2900: | ||
Example of usage: | Example of usage: | ||
- | set_advertised_address(" | + | set_advertised_address(" |
==== set_advertised_port ==== | ==== set_advertised_port ==== | ||
Line 2570: | Line 2914: | ||
The message will be forwarded only if there is already an existing connection to the destination. It applies only to connection oriented protocols like TCP and TLS (TODO: SCTP), for UDP it will be ignored. The behavior depends in which route block the function is called: | The message will be forwarded only if there is already an existing connection to the destination. It applies only to connection oriented protocols like TCP and TLS (TODO: SCTP), for UDP it will be ignored. The behavior depends in which route block the function is called: | ||
- | * normal request route: affects stateless forwards and tm. For tm it affects all the branches and the possible retransmissions (in fact there are no retransission | + | * normal request route: affects stateless forwards and tm. For tm it affects all the branches and the possible retransmissions (in fact there are no retransmission |
* onreply_route[0] (stateless): | * onreply_route[0] (stateless): | ||
Line 2649: | Line 2993: | ||
Set a flag for current processed message. The value of the parameter can be in range of 0..31. The flags are used to mark the message for special processing (e.g., accounting) or to keep some state (e.g., message authenticated). | Set a flag for current processed message. The value of the parameter can be in range of 0..31. The flags are used to mark the message for special processing (e.g., accounting) or to keep some state (e.g., message authenticated). | ||
- | For more see http:// | + | For more see: https:// |
Example of usage: | Example of usage: | ||
Line 2683: | Line 3027: | ||
==== userphone ==== | ==== userphone ==== | ||
+ | |||
+ | Add " | ||
===== Custom Global Parameters ===== | ===== Custom Global Parameters ===== | ||
Line 2694: | Line 3040: | ||
</ | </ | ||
+ | |||
+ | The value can be a quoted string or integer number. | ||
Example: | Example: | ||
Line 2712: | Line 3060: | ||
$ru = " | $ru = " | ||
</ | </ | ||
+ | |||
+ | **Note:** Some words cannot be used as (part of) names for custom variables or groups, and if they are used a syntax error is logged | ||
===== Routing Blocks ===== | ===== Routing Blocks ===== | ||
Line 2830: | Line 3180: | ||
} | } | ||
branch_route[OUT] { | branch_route[OUT] { | ||
- | if(uri=~" | + | if(uri=~" |
# discard branches that go to 10.10.10.10 | # discard branches that go to 10.10.10.10 | ||
drop(); | drop(); | ||
Line 2878: | Line 3228: | ||
<code c> | <code c> | ||
reply_route { | reply_route { | ||
- | if(status==" | + | if(status==" |
drop; | drop; | ||
} | } | ||
Line 2889: | Line 3239: | ||
- | SIP reply routing block executed by **tm** module. It contains a set of actions to be taken for SIP replies in the contect of an active transaction.. | + | SIP reply routing block executed by **tm** module. It contains a set of actions to be taken for SIP replies in the contect of an active transaction. |
The ' | The ' | ||
- | Main 'onreply_route' block is executed before a possible tm ' | + | Core 'reply_route' block is executed before a possible |
<code c> | <code c> | ||
Line 2920: | Line 3270: | ||
The route is executed in when a SIP request is sent out. Only a limited number of commands are allowed (drop, if + all the checks, msg flag manipulations, | The route is executed in when a SIP request is sent out. Only a limited number of commands are allowed (drop, if + all the checks, msg flag manipulations, | ||
- | In this route the final destination of the message is available | + | In this route the final destination of the message is available |
This route is executed only when forwarding requests - it is not executed for replies, retransmissions, | This route is executed only when forwarding requests - it is not executed for replies, retransmissions, | ||
Line 2947: | Line 3297: | ||
* groupid - should be the name of the module that triggers the event | * groupid - should be the name of the module that triggers the event | ||
* eventid - some meaningful short text describing the event | * eventid - some meaningful short text describing the event | ||
+ | |||
+ | === Core Event Routes === | ||
Implementations: | Implementations: | ||
+ | |||
+ | * **event_route[core: | ||
+ | * note that due to forking, other sip workers can get faster to listening for sip traffic | ||
+ | |||
+ | <code c> | ||
+ | event_route[core: | ||
+ | xlog(" | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * **event_route[core: | ||
+ | * it has to be enabled with received_route_mode global parameter. For usage via Kemi, set kemi.received_route_callback global parameter. | ||
+ | * if drop is executed, the received message is no longer processed | ||
+ | |||
+ | <code c> | ||
+ | event_route[core: | ||
+ | xlog(" | ||
+ | if($rcv(srcip) == " | ||
+ | drop; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | === Module Event Routes === | ||
+ | |||
+ | Here are only a few examples, to see if a module exports event_route blocks and when they are executed, check the readme of the module. | ||
+ | |||
+ | |||
* **event_route[htable: | * **event_route[htable: | ||
<code c> | <code c> | ||
Line 2988: | Line 3367: | ||
* **event_route [tm: | * **event_route [tm: | ||
<code c> | <code c> | ||
- | event_route [tm:failure-branch] { # Handle failure response | + | request_route { |
+ | ... | ||
+ | t_on_branch_failure(" | ||
+ | t_relay(); | ||
+ | } | ||
+ | |||
+ | event_route[tm: | ||
xlog(" | xlog(" | ||
if (t_check_status(" | if (t_check_status(" | ||
Line 2997: | Line 3382: | ||
} | } | ||
} | } | ||
+ | |||
</ | </ | ||
Line 3171: | Line 3557: | ||
* ^ : bitwise XOR | * ^ : bitwise XOR | ||
* ~ : bitwise NOT | * ~ : bitwise NOT | ||
- | * << : bitwise left shift | + | * <nowiki><<</ |
- | * >> : bitwise right shift | + | * <nowiki>>></ |
Example: | Example: | ||
Line 3224: | Line 3611: | ||
| | ||
Example: if (defined $v && !strempty($v)) $len=strlen($v); | Example: if (defined $v && !strempty($v)) $len=strlen($v); | ||
+ | |||
+ | ===== Command Line Parameters ===== | ||
+ | |||
+ | Kamailio can be started with a set of command line parameters, providing more flexibility to control what is doing at runtime. Some of them can be quite useful when running on containerised environments. | ||
+ | |||
+ | To see the the available command line parameters, run **kamailio -h**: | ||
+ | |||
+ | < | ||
+ | # kamailio -h | ||
+ | |||
+ | version: kamailio 5.4.0-dev4 (x86_64/ | ||
+ | Usage: kamailio [options] | ||
+ | Options: | ||
+ | -a mode Auto aliases mode: enable with yes or on, | ||
+ | disable with no or off | ||
+ | --alias=val | ||
+ | (like for ' | ||
+ | -A define | ||
+ | -A ' | ||
+ | -b nr Maximum receive buffer size which will not be exceeded by | ||
+ | auto-probing procedure even if OS allows | ||
+ | -c Check configuration file for syntax errors | ||
+ | -d | ||
+ | -D | ||
+ | -D..do not fork (almost) anyway; | ||
+ | -DD..do not daemonize creator; | ||
+ | -DDD..daemonize (default) | ||
+ | -e Log messages printed in terminal colors (requires -E) | ||
+ | -E Log to stderr | ||
+ | -f file Configuration file (default: / | ||
+ | -g gid | ||
+ | -G file Create a pgid file | ||
+ | -h This help message | ||
+ | --help | ||
+ | -I Print more internal compile flags and options | ||
+ | -K Turn on " | ||
+ | -l address | ||
+ | mean listening on more addresses). The address format is | ||
+ | [proto: | ||
+ | where proto=udp|tcp|tls|sctp, | ||
+ | addr_lst= addr|(addr, addr_lst), | ||
+ | addr=host|ip_address|interface_name and | ||
+ | advaddr=addr[: | ||
+ | E.g: -l localhost, -l udp: | ||
+ | -l udp: | ||
+ | -l " | ||
+ | The default behaviour is to listen on all the interfaces. | ||
+ | --loadmodule=name load the module specified by name | ||
+ | --log-engine=log engine name and data | ||
+ | -L path Modules search path (default: / | ||
+ | -m nr Size of shared memory allocated in Megabytes | ||
+ | --modparam=modname: | ||
+ | type has to be ' | ||
+ | example: --modparam=corex: | ||
+ | -M nr Size of private memory allocated, in Megabytes | ||
+ | -n processes Number of child processes to fork per interface | ||
+ | (default: 8) | ||
+ | -N | ||
+ | -O nr Script optimization level (debugging option) | ||
+ | -P file Create a pid file | ||
+ | -Q | ||
+ | -r Use dns to check if is necessary to add a " | ||
+ | field to a via | ||
+ | -R Same as `-r` but use reverse dns; | ||
+ | (to use both use `-rR`) | ||
+ | --server-id=num set the value for server_id | ||
+ | --subst=exp set a subst preprocessor directive | ||
+ | --substdef=exp set a substdef preprocessor directive | ||
+ | --substdefs=exp set a substdefs preprocessor directive | ||
+ | -S | ||
+ | -t dir | ||
+ | -T | ||
+ | -u uid | ||
+ | -v | ||
+ | --version | ||
+ | -V | ||
+ | -x name Specify internal manager for shared memory (shm) | ||
+ | - can be: fm, qm or tlsf | ||
+ | -X name Specify internal manager for private memory (pkg) | ||
+ | - if omitted, the one for shm is used | ||
+ | -Y dir | ||
+ | -w dir | ||
+ | -W type poll method (depending on support in OS, it can be: poll, | ||
+ | epoll_lt, epoll_et, sigio_rt, select, kqueue, /dev/poll) | ||
+ | </ | ||
+ | |||
+ | ==== Log Engine CLI Parameter ==== | ||
+ | |||
+ | The **--log-engine** parameter allows to specify what logging engine to be used, which is practically about the format of the log messages. If not set at all, then Kamailio does the classic style of line-based plain text log messages. | ||
+ | |||
+ | The value of this parameter can be **--log-engine=name** or **--log-engine=name: | ||
+ | |||
+ | The name of the log engine can be: | ||
+ | |||
+ | * **json** - write logs in structured JSON format | ||
+ | * the **data** for **json** log engine can be a set of character flags: | ||
+ | * **a** - add log prefix as a special field | ||
+ | * **A** - do not add log prefix | ||
+ | * **c** - add Call-ID (when available) as a dedicated JSON attribute | ||
+ | * **M** - strip EOL (' | ||
+ | * **N** - do not add EOL at the end of JSON document | ||
+ | |||
+ | Example of JSON logs when running Kamailio with " | ||
+ | |||
+ | < | ||
+ | { " | ||
+ | |||
+ | { " | ||
+ | |||
+ | </ |