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 [2018/06/24 22:30] mslehto [define] remove reference to 3.0.0 |
cookbooks:devel:core [2021/12/06 10:54] miconda [defenv] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Kamailio SIP Server v5.2.x (devel): Core Cookbook ====== | + | ====== |
+ | |||
+ | Version: | ||
===== Overview ===== | ===== Overview ===== | ||
Line 9: | Line 11: | ||
===== 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 49: | ||
</ | </ | ||
+ | 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 138: | ||
"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 211: | ||
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 247: | ||
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 - switch to false branch of ifdef/ | + | |
- | * #!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: | ||
Line 342: | Line 360: | ||
* text on the same line as the directive will cause problems. Keep the directive lines clean and only comment on a line before or after. | * text on the same line as the directive will cause problems. Keep the directive lines clean and only comment on a line before or after. | ||
+ | ==== defenv ==== | ||
+ | |||
+ | Preprocessor directive to define an ID to the value of an environment variable with the name ENVVAR. | ||
+ | |||
+ | <code c> | ||
+ | #!defenv ID=ENVVAR | ||
+ | </ | ||
+ | |||
+ | It can also be just **$!defenv ENVVAR** and the defined ID is the ENVVAR name. | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | #!defenv SHELL | ||
+ | </ | ||
+ | |||
+ | If environment variable $SHELL is '/ | ||
+ | |||
+ | <code c> | ||
+ | #!define SHELL /bin/bash | ||
+ | </ | ||
+ | |||
+ | Full expression variant: | ||
+ | |||
+ | <code c> | ||
+ | #!defenv ENVSHELL=SHELL | ||
+ | </ | ||
+ | |||
+ | Then it is like: | ||
+ | |||
+ | <code c> | ||
+ | #!define ENVSHELL /bin/bash | ||
+ | </ | ||
+ | |||
+ | It is a simplified alternative of using **# | ||
+ | |||
+ | ==== defenvs ==== | ||
+ | |||
+ | Similar to **# | ||
+ | |||
+ | <code c> | ||
+ | #!defenvs ENVVAR | ||
+ | #!defenvs ID=ENVVAR | ||
+ | </ | ||
==== subst ==== | ==== subst ==== | ||
Line 370: | Line 432: | ||
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 704: | Line 773: | ||
==== async_workers ==== | ==== async_workers ==== | ||
- | Specify how many child processes to create for asynchronous execution. These are processes that can receive tasks from various components and execute them locally, which is different process than the task sender. | + | Specify how many child processes |
Default: 0 (asynchronous framework is disabled). | Default: 0 (asynchronous framework is disabled). | ||
Line 713: | Line 782: | ||
async_workers=4 | async_workers=4 | ||
</ | </ | ||
+ | |||
+ | ==== async_nonblock ==== | ||
+ | |||
+ | Set the non-block mode for the internal sockets used by default group of async workers. | ||
+ | |||
+ | Default: 0 | ||
+ | |||
+ | Example: | ||
+ | |||
+ | < | ||
+ | async_nonblock=1 | ||
+ | </ | ||
+ | |||
+ | ==== async_usleep ==== | ||
+ | |||
+ | Set the number of microseconds to sleep before trying to receive next task (can be useful when async_nonblock=1). | ||
+ | |||
+ | Default: 0 | ||
+ | |||
+ | Example: | ||
+ | |||
+ | < | ||
+ | async_usleep=100 | ||
+ | </ | ||
+ | |||
+ | ==== async_workers_group ==== | ||
+ | |||
+ | Define groups of asynchronous worker processes. | ||
+ | |||
+ | Prototype: | ||
+ | |||
+ | < | ||
+ | async_workers_group=" | ||
+ | </ | ||
+ | |||
+ | The attributes are: | ||
+ | |||
+ | * **name** - the group name (used by functions such as **sworker_task(name)**) | ||
+ | * **workers** - the number of processes to create for this group | ||
+ | * **nonblock** - set or not set the non-block flag for internal communication socket | ||
+ | * **usleep** - the number of microseconds to sleep before trying to receive next task (can be useful if nonblock=1) | ||
+ | |||
+ | Default: "" | ||
+ | |||
+ | Example: | ||
+ | |||
+ | < | ||
+ | async_workers_group=" | ||
+ | </ | ||
+ | |||
+ | If the **name** is default, then it overwrites the value set by **async_workers**. | ||
+ | |||
+ | See also **event_route[core: | ||
==== auto_aliases ==== | ==== auto_aliases ==== | ||
Line 725: | Line 847: | ||
==== 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 731: | Line 853: | ||
< | < | ||
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 792: | Line 924: | ||
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 855: | Line 987: | ||
==== 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 920: | Line 1069: | ||
</ | </ | ||
+ | |||
+ | ==== ipv6_hex_style ==== | ||
+ | |||
+ | Can be set to " | ||
+ | |||
+ | Default is " | ||
+ | |||
+ | " | ||
+ | |||
+ | Example of usage: | ||
+ | |||
+ | <code c> | ||
+ | ipv6_hex_style = " | ||
+ | </ | ||
==== kemi.onsend_route_callback ==== | ==== kemi.onsend_route_callback ==== | ||
Line 932: | Line 1095: | ||
<code c> | <code c> | ||
kemi.onsend_route_callback=" | 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=" | ||
</ | </ | ||
Line 947: | Line 1124: | ||
kemi.onsend_route_callback=" | kemi.onsend_route_callback=" | ||
</ | </ | ||
+ | |||
+ | ==== kemi.pre_routing_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.pre_routing_callback=" | ||
+ | </ | ||
+ | |||
==== latency_cfg_log ==== | ==== latency_cfg_log ==== | ||
Line 961: | Line 1153: | ||
==== 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 971: | Line 1163: | ||
==== 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 994: | Line 1186: | ||
==== 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 1009: | Line 1201: | ||
<code c> | <code c> | ||
- | listen=udp: | + | listen=udp: |
</ | </ | ||
Line 1015: | Line 1207: | ||
<code c> | <code c> | ||
- | listen=udp: | + | listen=udp: |
</ | </ | ||
Line 1021: | Line 1213: | ||
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 1038: | Line 1246: | ||
loadmodule " | loadmodule " | ||
</ | </ | ||
+ | |||
+ | ==== loadmodulex ==== | ||
+ | |||
+ | Similar to **loadmodule** with the ability to evaluate variables in its parameter. | ||
==== loadpath ==== | ==== loadpath ==== | ||
Line 1061: | Line 1273: | ||
The proxy tries to find the modules in a smart way, e.g: loadmodule " | The proxy tries to find the modules in a smart way, e.g: loadmodule " | ||
+ | ==== local_rport ==== | ||
+ | |||
+ | Similar to **add_local_rport()** function, but done in a global scope, so the function does not have to be executed for each request. | ||
+ | |||
+ | Default: off | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | local_rport = on | ||
+ | </ | ||
==== log_engine_data ==== | ==== log_engine_data ==== | ||
Line 1105: | Line 1328: | ||
==== 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 1115: | Line 1342: | ||
==== log_prefix_mode ==== | ==== log_prefix_mode ==== | ||
- | If set to 0 (default), then log_prefix is evaluated | + | Control if [[#log_prefix|log prefix]] |
- | If set to 1, then the log prefix is evaluated before/ | + | If set to 0 (default), then log prefix is evaluated when the sip message is received and then reused (recommended if the **log_prefix** has only variables that have same value for same message). This is the current behaviour of **log_prefix** evaluation. |
+ | |||
+ | If set to 1, then the log prefix is evaluated before/ | ||
Example: | Example: | ||
Line 1139: | Line 1368: | ||
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 ==== | ||
- | The size in bytes not to be exceeded during the auto-probing procedure of descovering | + | The size in bytes not to be exceeded during the auto-probing procedure of discovering and increasing |
Example of usage: | Example of usage: | ||
Line 1148: | Line 1392: | ||
maxbuffer=65536 | maxbuffer=65536 | ||
+ | Note: it is not the size of the internal SIP message receive buffer. | ||
==== max_branches ==== | ==== max_branches ==== | ||
Line 1248: | Line 1493: | ||
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 1325: | Line 1570: | ||
==== modparam ==== | ==== modparam ==== | ||
+ | |||
The modparam command will be used to set the options of the modules. | The modparam command will be used to set the options of the modules. | ||
Line 1334: | Line 1580: | ||
See the documenation of the respective module to find out the available options. | See the documenation of the respective module to find out the available options. | ||
+ | ==== modparamx ==== | ||
+ | |||
+ | Similar to **modparam**, | ||
==== onsend_route_reply ==== | ==== onsend_route_reply ==== | ||
Line 1371: | Line 1620: | ||
==== 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 1387: | Line 1636: | ||
< | < | ||
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 1401: | Line 1666: | ||
< | < | ||
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 1410: | Line 1687: | ||
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 1450: | Line 1742: | ||
shm_mem_size = 64 (default 64) | shm_mem_size = 64 (default 64) | ||
+ | |||
+ | ==== sip_parser_log ==== | ||
+ | |||
+ | Log level for printing debug messages for some of the SIP parsing errors. | ||
+ | |||
+ | Default: 0 (L_WARN) | ||
+ | |||
+ | <code c> | ||
+ | sip_parser_log = 1 | ||
+ | </ | ||
+ | |||
+ | ==== sip_parser_mode ==== | ||
+ | |||
+ | Control sip parser behaviour. | ||
+ | |||
+ | If set to 1, the parser is more strict in accepting messages that have invalid headers (e.g., duplicate To or From). It can make the system safer, but loses the flexibility to be able to fix invalid messages with config operations. | ||
+ | |||
+ | If set to 0, the parser is less strict on checking validity of headers. | ||
+ | |||
+ | Default: 1 | ||
+ | |||
+ | <code c> | ||
+ | sip_parser_mode = 0 | ||
+ | </ | ||
==== 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 1536: | Line 1852: | ||
+ | ==== 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 1567: | Line 1889: | ||
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 1601: | Line 1932: | ||
==== version_table ==== | ==== version_table ==== | ||
- | Set the name of the table holding the table version. | + | Set the name of the table holding the table version. |
Example of usage: | Example of usage: | ||
Line 1608: | Line 1939: | ||
| | ||
</ | </ | ||
+ | |||
+ | ==== wait_worker1_mode ==== | ||
+ | |||
+ | Enable waiting for child SIP worker one to complete initialization, | ||
+ | |||
+ | Default: 0 (do not wait for child worker one to complete initialization). | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | wait_worker1_mode = 1 | ||
+ | </ | ||
+ | |||
+ | ==== wait_worker1_time ==== | ||
+ | |||
+ | How long to wait for child worker one to complete the initialization. In micro-seconds. | ||
+ | |||
+ | Default: 4000000 (micro-seconds = 4 seconds). | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | wait_worker1_time = 1000000 | ||
+ | </ | ||
+ | |||
+ | ==== wait_worker1_usleep ==== | ||
+ | |||
+ | How long to wait for child worker one to complete the initialization. In micro-seconds. | ||
+ | |||
+ | Default: 100000 (micro-seconds = 0.1 seconds). | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | wait_worker1_usleep = 50000 | ||
+ | </ | ||
+ | |||
==== workdir ==== | ==== workdir ==== | ||
Line 1619: | Line 1987: | ||
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 ===== | ||
- | Note: See also file doc/dns.txt for details about Kamailio' | + | Note: See also file doc/tutorials/dns.txt for details about Kamailio' |
Kamailio has an internal DNS resolver with caching capabilities. If this caching resolver is activated (default setting) then the system' | Kamailio has an internal DNS resolver with caching capabilities. If this caching resolver is activated (default setting) then the system' | ||
Line 1642: | Line 2043: | ||
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 1765: | Line 2166: | ||
**Alias name: dns_srv_loadbalancing** | **Alias name: dns_srv_loadbalancing** | ||
- | Enable dns srv weight based load balancing (see doc/ | + | Enable dns srv weight based load balancing (see doc/tutorials/dns.txt) |
dns_srv_lb = yes | no (default no) | dns_srv_lb = yes | no (default no) | ||
Line 1781: | Line 2182: | ||
==== dns_try_naptr ==== | ==== dns_try_naptr ==== | ||
- | Enable NAPTR support according to RFC 3263 (see doc/dns.txt for more info) | + | Enable NAPTR support according to RFC 3263 (see doc/tutorials/dns.txt for more info) |
| | ||
dns_try_naptr = yes | no (default no) | dns_try_naptr = yes | no (default no) | ||
Line 1792: | Line 2193: | ||
dns_tls_pref=10 and dns_sctp_pref=20. To use the remote site preferences set all dns_*_pref to the same positive value (e.g. dns_udp_pref=1, | dns_tls_pref=10 and dns_sctp_pref=20. To use the remote site preferences set all dns_*_pref to the same positive value (e.g. dns_udp_pref=1, | ||
dns_tcp_pref=1, | dns_tcp_pref=1, | ||
- | preference to -1 (or any other negative number). (see doc/dns.txt for more info) | + | preference to -1 (or any other negative number). (see doc/tutorials/dns.txt for more info) |
dns_{udp, | dns_{udp, | ||
Line 1838: | Line 2239: | ||
| | ||
+ | |||
+ | ==== 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 ==== | ==== tcp_accept_hep3 ==== | ||
Line 1860: | Line 2274: | ||
</ | </ | ||
+ | ==== 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 1898: | Line 2321: | ||
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 1908: | Line 2340: | ||
==== 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 2027: | Line 2459: | ||
==== 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) | ||
Line 2261: | Line 2693: | ||
- | ===== Blacklist | + | ===== Blocklist |
- | ==== dst_blacklist_expire | + | ==== dst_blocklist_expire |
- | **Alias name: dst_blacklist_ttl** | + | **Alias name: dst_blocklist_ttl** |
- | How much time a blacklisted | + | How much time a blocklisted |
- | | + | |
- | ==== dst_blacklist_gc_interval | + | ==== dst_blocklist_gc_interval |
How often the garbage collection will run (eliminating old, expired entries). | How often the garbage collection will run (eliminating old, expired entries). | ||
- | | + | |
- | ==== dst_blacklist_init | + | ==== dst_blocklist_init |
- | If off, the blacklist | + | If off, the blocklist |
- | | + | |
- | ==== dst_blacklist_mem | + | ==== dst_blocklist_mem |
- | Maximum shared memory amount used for keeping the blacklisted | + | Maximum shared memory amount used for keeping the blocklisted |
- | | + | |
- | ==== use_dst_blacklist | + | ==== use_dst_blocklist |
- | Enable the destination | + | Enable the destination |
- | Note: using the blacklist | + | Note: using the blocklist |
- | See also doc/dst_blacklist.txt. | + | See also doc/dst_blocklist.txt. |
- | | + | |
===== Real-Time Parameters ===== | ===== Real-Time Parameters ===== | ||
Line 2437: | Line 2869: | ||
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 2451: | Line 2885: | ||
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 2570: | Line 3004: | ||
</ | </ | ||
+ | See also the FAQ for how the function return code is evaluated: | ||
+ | |||
+ | * https:// | ||
==== revert_uri ==== | ==== revert_uri ==== | ||
Line 2657: | Line 3094: | ||
+ | ==== selval ==== | ||
+ | Select a value based on conditional expression. | ||
+ | |||
+ | Prototype: | ||
+ | |||
+ | <code c> | ||
+ | selval(evalexpr, | ||
+ | </ | ||
+ | |||
+ | This is a core statement that return the 2nd parameter if the 1st parameter is evaluated to true, or 3rd parameter if the 1st parameter is evaluated to false. It can be considered a core function that is equivalent of ternary condition/ | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | $var(x) = selval($Ts mod 2, " | ||
+ | </ | ||
+ | |||
+ | The first parameter is a conditional expression, like those used for IF, the 2nd and 3rd parameters can be expressions like those used in the right side of assignments. | ||
==== set_advertised_address ==== | ==== set_advertised_address ==== | ||
Line 2793: | Line 3248: | ||
Add " | Add " | ||
+ | |||
===== Custom Global Parameters ===== | ===== Custom Global Parameters ===== | ||
Line 2803: | Line 3259: | ||
</ | </ | ||
+ | |||
+ | The value can be a quoted string or integer number. | ||
Example: | Example: | ||
Line 2989: | Line 3447: | ||
<code c> | <code c> | ||
reply_route { | reply_route { | ||
- | if(status==" | + | if(status==" |
drop; | drop; | ||
} | } | ||
Line 3000: | Line 3458: | ||
- | 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 3031: | Line 3489: | ||
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 3058: | Line 3516: | ||
* 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: | ||
Line 3069: | Line 3529: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | * **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; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * **event_route[core: | ||
+ | * if drop is used, then the message is not processed further with request_route or reply_route in the same process. This can be useful together with sworker module which can delegate the processing to another worker. | ||
+ | |||
+ | <code c> | ||
+ | async_workers_group=" | ||
+ | ... | ||
+ | event_route[core: | ||
+ | xinfo(" | ||
+ | if(is_method(" | ||
+ | # delegate processing of REGISTERs to a special group of workers | ||
+ | if(sworker_task(" | ||
+ | drop; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * ** event_route[core: | ||
+ | * note that the SIP message is broken in this case, but it gets access to source and local socket addresses (ip, port, proto, af) as well as the whole message buffer and its size | ||
+ | |||
+ | <code c> | ||
+ | event_route[core: | ||
+ | xlog(" | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | === 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: | ||
Line 3109: | Line 3614: | ||
* **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 3118: | Line 3629: | ||
} | } | ||
} | } | ||
+ | |||
</ | </ | ||
Line 3151: | Line 3663: | ||
|| logical OR | || logical OR | ||
! | ! | ||
- | [ ... ] test operator - inside can be any arithmetic expression | ||
</ | </ | ||
Line 3163: | Line 3674: | ||
} | } | ||
+ | See also the FAQ for how the function return code is evaluated: | ||
+ | * https:// | ||
==== switch ==== | ==== switch ==== | ||
Line 3292: | Line 3805: | ||
* ^ : bitwise XOR | * ^ : bitwise XOR | ||
* ~ : bitwise NOT | * ~ : bitwise NOT | ||
- | * << : bitwise left shift | + | * <nowiki><<</ |
- | * >> : bitwise right shift | + | * <nowiki>>></ |
Example: | Example: | ||
Line 3345: | Line 3859: | ||
| | ||
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 | ||
+ | * **j** - the log prefix and message fields are printed in JSON structure format, detecting if they are enclosed in between **{ }** or adding them as a **text** field | ||
+ | * **M** - strip EOL (' | ||
+ | * **N** - do not add EOL at the end of JSON document | ||
+ | * **p** - the log prefix is printed as it is in the root json document, it has to start with comma (**,**) and be a valid set of json fields | ||
+ | * **U** - CEE (Common Event Expression) schema format - https:// | ||
+ | |||
+ | Example of JSON logs when running Kamailio with " | ||
+ | |||
+ | < | ||
+ | { " | ||
+ | |||
+ | { " | ||
+ | </ | ||
+ | |||
+ | Example config for printing log message with **j** flag: | ||
+ | |||
+ | < | ||
+ | xinfo(" | ||
+ | </ | ||
+ | |||
+ | Example config for printing log messages with **p** flag: | ||
+ | |||
+ | < | ||
+ | log_prefix=", | ||
+ | </ |