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/08/15 21:11] henningw |
cookbooks:devel:core [2020/04/03 09:28] henningw [sip_warning (noisy feedback)] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Kamailio SIP Server v5.2.x (devel): Core Cookbook ====== | + | ====== Kamailio SIP Server v5.4.x (devel): Core Cookbook ====== |
===== Overview ===== | ===== Overview ===== | ||
Line 9: | Line 9: | ||
===== 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 47: | ||
</ | </ | ||
+ | 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 136: | ||
"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 234: | Line 245: | ||
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 370: | Line 386: | ||
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 725: | Line 748: | ||
==== 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 754: | ||
< | < | ||
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 855: | Line 888: | ||
==== 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 932: | Line 982: | ||
<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 971: | Line 1035: | ||
==== 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 1058: | ||
==== 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 1073: | ||
<code c> | <code c> | ||
- | listen=udp: | + | listen=udp: |
</ | </ | ||
Line 1015: | Line 1079: | ||
<code c> | <code c> | ||
- | listen=udp: | + | listen=udp: |
</ | </ | ||
Line 1021: | Line 1085: | ||
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 1105: | Line 1185: | ||
==== 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 1199: | ||
==== 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 1386: | Line 1472: | ||
==== 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 1402: | Line 1488: | ||
< | < | ||
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 1416: | Line 1518: | ||
< | < | ||
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 1425: | Line 1539: | ||
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 messages sharing the same Call-Id. In other words, enables Kamailio to execute sequentially 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 (children | ||
+ | |||
+ | Example: | ||
+ | |||
+ | <code c> | ||
+ | route_locks_size = 256 | ||
+ | </ | ||
==== server_id ==== | ==== server_id ==== | ||
Line 1468: | Line 1595: | ||
==== 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 1582: | Line 1709: | ||
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 1634: | Line 1770: | ||
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 1853: | Line 2022: | ||
| | ||
+ | |||
+ | ==== 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 1875: | Line 2057: | ||
</ | </ | ||
+ | ==== 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 1913: | Line 2104: | ||
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 2452: | Line 2652: | ||
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 2808: | Line 3010: | ||
Add " | Add " | ||
+ | |||
===== Custom Global Parameters ===== | ===== Custom Global Parameters ===== | ||
Line 2818: | Line 3021: | ||
</ | </ | ||
+ | |||
+ | The value can be a quoted string or integer number. | ||
Example: | Example: | ||
Line 3004: | Line 3209: | ||
<code c> | <code c> | ||
reply_route { | reply_route { | ||
- | if(status==" | + | if(status==" |
drop; | drop; | ||
} | } | ||
Line 3015: | Line 3220: | ||
- | 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 3046: | Line 3251: | ||
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 3073: | Line 3278: | ||
* 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 3084: | Line 3291: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | * **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: | ||
Line 3124: | Line 3348: | ||
* **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 3133: | Line 3363: | ||
} | } | ||
} | } | ||
+ | |||
</ | </ | ||
Line 3307: | Line 3538: | ||
* ^ : bitwise XOR | * ^ : bitwise XOR | ||
* ~ : bitwise NOT | * ~ : bitwise NOT | ||
- | * << : bitwise left shift | + | * <nowiki><<</ |
- | * >> : bitwise right shift | + | * <nowiki>>></ |
Example: | Example: | ||
Line 3360: | Line 3592: | ||
| | ||
Example: if (defined $v && !strempty($v)) $len=strlen($v); | Example: if (defined $v && !strempty($v)) $len=strlen($v); | ||
+ |