|
@@ -1,990 +1 @@
|
|
|
-COREX Module
|
|
|
|
|
|
-Daniel-Constantin Mierla
|
|
|
-
|
|
|
- <[email protected]>
|
|
|
-
|
|
|
-Edited by
|
|
|
-
|
|
|
-Daniel-Constantin Mierla
|
|
|
-
|
|
|
- <[email protected]>
|
|
|
-
|
|
|
-Muhammad Shahzad Shafi
|
|
|
-
|
|
|
- <[email protected]>
|
|
|
-
|
|
|
- Copyright © 2012 asipto.com
|
|
|
- __________________________________________________________________
|
|
|
-
|
|
|
- Table of Contents
|
|
|
-
|
|
|
- 1. Admin Guide
|
|
|
-
|
|
|
- 1. Overview
|
|
|
- 2. Dependencies
|
|
|
-
|
|
|
- 2.1. Kamailio Modules
|
|
|
- 2.2. External Libraries or Applications
|
|
|
-
|
|
|
- 3. Parameters
|
|
|
-
|
|
|
- 3.1. alias_subdomains (string)
|
|
|
- 3.2. dns_cache (string)
|
|
|
- 3.3. evcb_reply_out (string)
|
|
|
- 3.4. nio_intercept (int)
|
|
|
- 3.5. nio_min_msg_len (int)
|
|
|
- 3.6. nio_msg_avp (string)
|
|
|
-
|
|
|
- 4. Functions
|
|
|
-
|
|
|
- 4.1. append_branch([ uri, [ q ] ])
|
|
|
- 4.2. send_udp([ host [ :port ] ])
|
|
|
- 4.3. send_tcp([ host [ :port ] ])
|
|
|
- 4.4. send_data(uri, data)
|
|
|
- 4.5. sendx(uri, sock, data)
|
|
|
- 4.6. is_incoming()
|
|
|
- 4.7. msg_iflag_set(flagname)
|
|
|
- 4.8. msg_iflag_reset(flagname)
|
|
|
- 4.9. msg_iflag_is_set(flagname)
|
|
|
- 4.10. file_read(fpath, var)
|
|
|
- 4.11. file_write(fpath, content)
|
|
|
- 4.12. setxflag(flag)
|
|
|
- 4.13. isxflagset(flag)
|
|
|
- 4.14. resetxflag(flag)
|
|
|
- 4.15. set_send_socket(saddr)
|
|
|
- 4.16. set_send_socket_name(sname)
|
|
|
- 4.17. set_recv_socket(saddr)
|
|
|
- 4.18. set_recv_socket_name(sname)
|
|
|
- 4.19. set_source_address(saddr)
|
|
|
- 4.20. via_add_srvid(flags)
|
|
|
- 4.21. via_add_xavp_params(flags)
|
|
|
- 4.22. via_use_xavp_fields(flags)
|
|
|
- 4.23. is_faked_msg()
|
|
|
- 4.24. is_socket_name(sockname)
|
|
|
- 4.25. forward_reply()
|
|
|
-
|
|
|
- 5. RPC Commands
|
|
|
-
|
|
|
- 5.1. corex.debug
|
|
|
- 5.2. corex.list_sockets
|
|
|
- 5.3. corex.list_aliases
|
|
|
- 5.4. corex.shm_status
|
|
|
- 5.5. corex.shm_summary
|
|
|
- 5.6. corex.pkg_summary
|
|
|
- 5.7. corex.shm.info
|
|
|
- 5.8. corex.shm.report
|
|
|
- 5.9. corex.shm.stats
|
|
|
-
|
|
|
- 6. Event Routes
|
|
|
-
|
|
|
- 6.1. event_route[network:msg]
|
|
|
- 6.2. event_route[corex:reply-out]
|
|
|
-
|
|
|
- 7. Examples of Usage
|
|
|
-
|
|
|
- List of Examples
|
|
|
-
|
|
|
- 1.1. Set alias_subdomains parameter
|
|
|
- 1.2. Set dns_cache parameter
|
|
|
- 1.3. Set evcb_reply_out parameter
|
|
|
- 1.4. Set nio_intercept parameter
|
|
|
- 1.5. Set nio_min_msg_len parameter
|
|
|
- 1.6. Set nio_msg_avp parameter
|
|
|
- 1.7. append_branch usage
|
|
|
- 1.8. send_udp usage
|
|
|
- 1.9. send_tcp usage
|
|
|
- 1.10. send_data usage
|
|
|
- 1.11. sendx usage
|
|
|
- 1.12. is_incoming usage
|
|
|
- 1.13. msg_iflag_set usage
|
|
|
- 1.14. msg_iflag_reset usage
|
|
|
- 1.15. msg_iflag_is_set usage
|
|
|
- 1.16. file_read usage
|
|
|
- 1.17. file_write usage
|
|
|
- 1.18. setxflag usage
|
|
|
- 1.19. isxflagset usage
|
|
|
- 1.20. resetxflag usage
|
|
|
- 1.21. set_send_socket usage
|
|
|
- 1.22. set_send_socket_name usage
|
|
|
- 1.23. set_recv_socket usage
|
|
|
- 1.24. set_recv_socket_name usage
|
|
|
- 1.25. set_source_address usage
|
|
|
- 1.26. via_add_srvid usage
|
|
|
- 1.27. via_add_xavp_params usage
|
|
|
- 1.28. via_use_xavp_fields usage
|
|
|
- 1.29. is_faked_msg usage
|
|
|
- 1.30. is_socket_name usage
|
|
|
- 1.31. forward_reply usage
|
|
|
- 1.32. event_route[network:msg] use cases
|
|
|
- 1.33. Sample PERL code for do_compress and do_uncompress
|
|
|
-
|
|
|
-Chapter 1. Admin Guide
|
|
|
-
|
|
|
- Table of Contents
|
|
|
-
|
|
|
- 1. Overview
|
|
|
- 2. Dependencies
|
|
|
-
|
|
|
- 2.1. Kamailio Modules
|
|
|
- 2.2. External Libraries or Applications
|
|
|
-
|
|
|
- 3. Parameters
|
|
|
-
|
|
|
- 3.1. alias_subdomains (string)
|
|
|
- 3.2. dns_cache (string)
|
|
|
- 3.3. evcb_reply_out (string)
|
|
|
- 3.4. nio_intercept (int)
|
|
|
- 3.5. nio_min_msg_len (int)
|
|
|
- 3.6. nio_msg_avp (string)
|
|
|
-
|
|
|
- 4. Functions
|
|
|
-
|
|
|
- 4.1. append_branch([ uri, [ q ] ])
|
|
|
- 4.2. send_udp([ host [ :port ] ])
|
|
|
- 4.3. send_tcp([ host [ :port ] ])
|
|
|
- 4.4. send_data(uri, data)
|
|
|
- 4.5. sendx(uri, sock, data)
|
|
|
- 4.6. is_incoming()
|
|
|
- 4.7. msg_iflag_set(flagname)
|
|
|
- 4.8. msg_iflag_reset(flagname)
|
|
|
- 4.9. msg_iflag_is_set(flagname)
|
|
|
- 4.10. file_read(fpath, var)
|
|
|
- 4.11. file_write(fpath, content)
|
|
|
- 4.12. setxflag(flag)
|
|
|
- 4.13. isxflagset(flag)
|
|
|
- 4.14. resetxflag(flag)
|
|
|
- 4.15. set_send_socket(saddr)
|
|
|
- 4.16. set_send_socket_name(sname)
|
|
|
- 4.17. set_recv_socket(saddr)
|
|
|
- 4.18. set_recv_socket_name(sname)
|
|
|
- 4.19. set_source_address(saddr)
|
|
|
- 4.20. via_add_srvid(flags)
|
|
|
- 4.21. via_add_xavp_params(flags)
|
|
|
- 4.22. via_use_xavp_fields(flags)
|
|
|
- 4.23. is_faked_msg()
|
|
|
- 4.24. is_socket_name(sockname)
|
|
|
- 4.25. forward_reply()
|
|
|
-
|
|
|
- 5. RPC Commands
|
|
|
-
|
|
|
- 5.1. corex.debug
|
|
|
- 5.2. corex.list_sockets
|
|
|
- 5.3. corex.list_aliases
|
|
|
- 5.4. corex.shm_status
|
|
|
- 5.5. corex.shm_summary
|
|
|
- 5.6. corex.pkg_summary
|
|
|
- 5.7. corex.shm.info
|
|
|
- 5.8. corex.shm.report
|
|
|
- 5.9. corex.shm.stats
|
|
|
-
|
|
|
- 6. Event Routes
|
|
|
-
|
|
|
- 6.1. event_route[network:msg]
|
|
|
- 6.2. event_route[corex:reply-out]
|
|
|
-
|
|
|
- 7. Examples of Usage
|
|
|
-
|
|
|
-1. Overview
|
|
|
-
|
|
|
- This module provides reimplementation of a few very old functions that
|
|
|
- used to be in the core and supported only static string or integer
|
|
|
- parameters. The new versions bring support for dynamic parameters
|
|
|
- (allowing variables inside the parameters).
|
|
|
-
|
|
|
- There are also brand new features, related to core internals, but
|
|
|
- controlled from configuration file or via control interfaces.
|
|
|
-
|
|
|
- Contributions to this module must be done under the BSD license, to
|
|
|
- follow the requirements of the core contributions.
|
|
|
-
|
|
|
- This module now also provides access to network input / output (nio)
|
|
|
- data through event_route[network:msg]. The raw data received from a
|
|
|
- remote host or about to be sent to a remote host is available in
|
|
|
- variable $mb. The script writer may manipulate this data and save the
|
|
|
- final result in an AVP defined by msg_avp module parameter. The content
|
|
|
- of this AVP will then be processed by SIP worker as normal, i.e. a
|
|
|
- received message will be parsed and sent to appropriate route block
|
|
|
- while a sent message is forwarded to remote host.
|
|
|
-
|
|
|
-2. Dependencies
|
|
|
-
|
|
|
- 2.1. Kamailio Modules
|
|
|
- 2.2. External Libraries or Applications
|
|
|
-
|
|
|
-2.1. Kamailio Modules
|
|
|
-
|
|
|
- The following modules must be loaded before this module:
|
|
|
- * None.
|
|
|
-
|
|
|
-2.2. External Libraries or Applications
|
|
|
-
|
|
|
- The following libraries or applications must be installed before
|
|
|
- running Kamailio with this module loaded:
|
|
|
- * None
|
|
|
-
|
|
|
-3. Parameters
|
|
|
-
|
|
|
- 3.1. alias_subdomains (string)
|
|
|
- 3.2. dns_cache (string)
|
|
|
- 3.3. evcb_reply_out (string)
|
|
|
- 3.4. nio_intercept (int)
|
|
|
- 3.5. nio_min_msg_len (int)
|
|
|
- 3.6. nio_msg_avp (string)
|
|
|
-
|
|
|
-3.1. alias_subdomains (string)
|
|
|
-
|
|
|
- Register a domain and all its sub-domains to match the “myself”
|
|
|
- condition. It can be set many times. Its full format is:
|
|
|
- 'proto:domain:port', allowing to set restrictions on protocol and port
|
|
|
- as well. Protocol and port are optional.
|
|
|
-
|
|
|
- Default value is “NULL”.
|
|
|
-
|
|
|
- Example 1.1. Set alias_subdomains parameter
|
|
|
-...
|
|
|
-modparam("corex", "alias_subdomains", "kamailio.org")
|
|
|
-modparam("corex", "alias_subdomains", "udp:sip-router.org:5060")
|
|
|
-...
|
|
|
-
|
|
|
-3.2. dns_cache (string)
|
|
|
-
|
|
|
- Add A or AAAA records to internal DNS cache at startup. It can be set
|
|
|
- many times to add more than one record.
|
|
|
-
|
|
|
- The format of the value follows the SIP params style:
|
|
|
- "attr1=val1;attr2=val2;...". The attributes can be:
|
|
|
- * type - it can be "A" (IPv4), "AAAA" (IPv6) or "SRV"
|
|
|
- * name - the domain name
|
|
|
- * addr - the IP address
|
|
|
- * ttl - TTL value
|
|
|
- * priority - priority value for SRV record
|
|
|
- * weight - weight value for SRV record
|
|
|
- * port - port value for SRV record
|
|
|
- * flags - can be: 1 - the domain is unresolvable (like blocklisted);
|
|
|
- 2 - the record is permanent (never times out, never deleted, never
|
|
|
- overwritten)
|
|
|
-
|
|
|
- Default value is “NULL”.
|
|
|
-
|
|
|
- Example 1.2. Set dns_cache parameter
|
|
|
-...
|
|
|
-modparam("corex", "dns_cache", "type=A;name=kamailio.org;addr=193.22.119.66;ttl=
|
|
|
-3600000;flags=0")
|
|
|
-modparam("corex", "dns_cache", "type=AAAA;name=kamailio.org;addr=2a00:d60:0:400:
|
|
|
-:2;ttl=3600000;flags=0")
|
|
|
-...
|
|
|
-
|
|
|
-3.3. evcb_reply_out (string)
|
|
|
-
|
|
|
- Name of KEMI callback function to be executed instead of
|
|
|
- event_route[corex:reply-out].
|
|
|
-
|
|
|
- Default value is “NULL”.
|
|
|
-
|
|
|
- Example 1.3. Set evcb_reply_out parameter
|
|
|
-...
|
|
|
-modparam("corex", "evcb_reply_out", "ksr_corex_reply_out")
|
|
|
-...
|
|
|
-
|
|
|
-3.4. nio_intercept (int)
|
|
|
-
|
|
|
- If set to non-zero then raw data received from a remote host or about
|
|
|
- to be sent to a remote host is made available in
|
|
|
- event_route[network:msg]. The script writer may modify this and save to
|
|
|
- msg_avp, which will then be processed by SIP worker as normal.
|
|
|
-
|
|
|
- Default value is 0, i.e. do not allow access to network io data.
|
|
|
-
|
|
|
- Example 1.4. Set nio_intercept parameter
|
|
|
-...
|
|
|
-modparam("corex", "nio_intercept", 1)
|
|
|
-...
|
|
|
-
|
|
|
-3.5. nio_min_msg_len (int)
|
|
|
-
|
|
|
- Minimum content length of the packet to execute the
|
|
|
- event_route[network:msg]. This only works if nio_intercept parameter is
|
|
|
- set to non-zero.
|
|
|
-
|
|
|
- Default value is 0.
|
|
|
-
|
|
|
- Example 1.5. Set nio_min_msg_len parameter
|
|
|
-...
|
|
|
-modparam("corex", "nio_min_msg_len", 32)
|
|
|
-...
|
|
|
-
|
|
|
-3.6. nio_msg_avp (string)
|
|
|
-
|
|
|
- AVP name to store modified content to be set in the packet. If not set
|
|
|
- in event_route[network:msg], then all changes are lost and original
|
|
|
- contents are used. This only works if nio_intercept parameter is to set
|
|
|
- non-zero.
|
|
|
-
|
|
|
- Default value is empty.
|
|
|
-
|
|
|
- Example 1.6. Set nio_msg_avp parameter
|
|
|
-...
|
|
|
-modparam("corex", "nio_msg_avp", "$avp(msg)")
|
|
|
-...
|
|
|
-
|
|
|
-4. Functions
|
|
|
-
|
|
|
- 4.1. append_branch([ uri, [ q ] ])
|
|
|
- 4.2. send_udp([ host [ :port ] ])
|
|
|
- 4.3. send_tcp([ host [ :port ] ])
|
|
|
- 4.4. send_data(uri, data)
|
|
|
- 4.5. sendx(uri, sock, data)
|
|
|
- 4.6. is_incoming()
|
|
|
- 4.7. msg_iflag_set(flagname)
|
|
|
- 4.8. msg_iflag_reset(flagname)
|
|
|
- 4.9. msg_iflag_is_set(flagname)
|
|
|
- 4.10. file_read(fpath, var)
|
|
|
- 4.11. file_write(fpath, content)
|
|
|
- 4.12. setxflag(flag)
|
|
|
- 4.13. isxflagset(flag)
|
|
|
- 4.14. resetxflag(flag)
|
|
|
- 4.15. set_send_socket(saddr)
|
|
|
- 4.16. set_send_socket_name(sname)
|
|
|
- 4.17. set_recv_socket(saddr)
|
|
|
- 4.18. set_recv_socket_name(sname)
|
|
|
- 4.19. set_source_address(saddr)
|
|
|
- 4.20. via_add_srvid(flags)
|
|
|
- 4.21. via_add_xavp_params(flags)
|
|
|
- 4.22. via_use_xavp_fields(flags)
|
|
|
- 4.23. is_faked_msg()
|
|
|
- 4.24. is_socket_name(sockname)
|
|
|
- 4.25. forward_reply()
|
|
|
-
|
|
|
-4.1. append_branch([ uri, [ q ] ])
|
|
|
-
|
|
|
- Append a new branch to the destination set, useful to build the set of
|
|
|
- destination addresses for parallel forking or redirect replies.
|
|
|
-
|
|
|
- Both parameters are optional, If no uri parameter is provided, then the
|
|
|
- address from request URI (r-uri) is used to build the new branch.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * uri - SIP address of the branch to be used as R-URI in the outgoing
|
|
|
- request.
|
|
|
- * q - the Q value to set the priority of the branch based on Contact
|
|
|
- address specifications
|
|
|
-
|
|
|
- This function can be used from REQUEST_ROUTE or FAILURE_ROUTE.
|
|
|
-
|
|
|
- Example 1.7. append_branch usage
|
|
|
-...
|
|
|
- append_branch();
|
|
|
- append_branch("$avp(uri)", "0.5");
|
|
|
-...
|
|
|
-
|
|
|
-4.2. send_udp([ host [ :port ] ])
|
|
|
-
|
|
|
- Send the original SIP message to a specific destination in stateless
|
|
|
- mode. No changes are applied to received message, no Via header is
|
|
|
- added. Host can be an IP address or hostname. Port is optional and
|
|
|
- defaults to 5060. Used protocol: UDP.
|
|
|
-
|
|
|
- The parameter is optional and defaults to the destination URI from the
|
|
|
- SIP message if left out. Otherwise it's a string parameter (supporting
|
|
|
- pseudo-variables) in format "hostname" or "hostname:port", where
|
|
|
- hostname" can also be a numeric IP address.
|
|
|
-
|
|
|
- This function can be used from REQUEST_ROUTE or FAILURE_ROUTE.
|
|
|
-
|
|
|
- Example 1.8. send_udp usage
|
|
|
-...
|
|
|
- send_udp();
|
|
|
- send_udp("10.20.15.10");
|
|
|
- send_udp("sip.example.com:5070");
|
|
|
- send_udp("$var(res)");
|
|
|
-...
|
|
|
-
|
|
|
-4.3. send_tcp([ host [ :port ] ])
|
|
|
-
|
|
|
- This function is identical to send_udp() described above, except that
|
|
|
- it sends the SIP message using the TCP protocol instead of UDP.
|
|
|
-
|
|
|
- Example 1.9. send_tcp usage
|
|
|
-...
|
|
|
- send_tcp();
|
|
|
- send_tcp("10.20.15.10");
|
|
|
- send_tcp("sip.example.com:5070");
|
|
|
- send_tcp("$var(res)");
|
|
|
-...
|
|
|
-
|
|
|
-4.4. send_data(uri, data)
|
|
|
-
|
|
|
- Send the data to address specified by uri. Both parameters can contain
|
|
|
- pseudo-variables. The uri parameter has to be a valid SIP URI. The data
|
|
|
- parameter can by any arbitrary content.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.10. send_data usage
|
|
|
-...
|
|
|
- send_data("sip:example.com:5070;transport=sctp", "Message at $Ts");
|
|
|
-...
|
|
|
-
|
|
|
-4.5. sendx(uri, sock, data)
|
|
|
-
|
|
|
- Send the data to address specified by uri using a specific local
|
|
|
- socket. All parameters can contain pseudo-variables. The uri parameter
|
|
|
- has to be a valid SIP URI. The sock parameter has to be a valid socket
|
|
|
- specifier (like values assigned to $fs). The data parameter can by any
|
|
|
- arbitrary content.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.11. sendx usage
|
|
|
-...
|
|
|
-sendx("sip:example.com:5070;transport=sctp", "sctp:2.3.4.5:5060", "Message at $T
|
|
|
-s");
|
|
|
-...
|
|
|
-
|
|
|
-4.6. is_incoming()
|
|
|
-
|
|
|
- Returns true if contents of message buffer $mb are the data received
|
|
|
- from remote host, otherwise false indicating that the contents of $mb
|
|
|
- are data that is about to be sent out to remote host. This only works
|
|
|
- if nio_intercept parameter is set to non-zero.
|
|
|
-
|
|
|
- This function can be used from event_route[network:msg].
|
|
|
-
|
|
|
- Example 1.12. is_incoming usage
|
|
|
-...
|
|
|
-event_route[network:msg] {
|
|
|
- if (is_incoming()) {
|
|
|
- xlog("L_INFO", "Received message '$mb' \n");
|
|
|
- $avp(msg) = $mb;
|
|
|
- } else {
|
|
|
- xlog("L_INFO", "Sending message '$mb' \n");
|
|
|
- $avp(msg) = $mb;
|
|
|
- };
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
-4.7. msg_iflag_set(flagname)
|
|
|
-
|
|
|
- Set internal SIP message flag. The parameter flagname can be:
|
|
|
- USE_UAC_FROM, USE_UAC_TO or UAC_AUTH.
|
|
|
-
|
|
|
- This functions should not be used in configuration file for (re)setting
|
|
|
- the internal flags, those are done by various functions internally,
|
|
|
- however, in very particular cases they might be useful (e.g., changing
|
|
|
- From/To via textops functions).
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.13. msg_iflag_set usage
|
|
|
-...
|
|
|
- msg_iflag_set("UAC_AUTH");
|
|
|
-...
|
|
|
-
|
|
|
-4.8. msg_iflag_reset(flagname)
|
|
|
-
|
|
|
- Reset the internal flag given as parameter.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.14. msg_iflag_reset usage
|
|
|
-...
|
|
|
- msg_iflag_reset("UAC_AUTH");
|
|
|
-...
|
|
|
-
|
|
|
-4.9. msg_iflag_is_set(flagname)
|
|
|
-
|
|
|
- Test if the internal flag given as parameter is set.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.15. msg_iflag_is_set usage
|
|
|
-...
|
|
|
- if(msg_iflag_is_set("UAC_AUTH")) { ... }
|
|
|
-...
|
|
|
-
|
|
|
-4.10. file_read(fpath, var)
|
|
|
-
|
|
|
- Read content of a text file into a variable.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.16. file_read usage
|
|
|
-...
|
|
|
-if(file_read("/tmp/data.txt", "$var(data)")) { ... }
|
|
|
-...
|
|
|
-
|
|
|
-4.11. file_write(fpath, content)
|
|
|
-
|
|
|
- Write content of parameter to a text file.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.17. file_write usage
|
|
|
-...
|
|
|
-if(file_write("/tmp/data.txt", "Data is: $var(data)")) { ... }
|
|
|
-...
|
|
|
-
|
|
|
-4.12. setxflag(flag)
|
|
|
-
|
|
|
- Set the extended message (transaction) flag.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * flag - the index of the flag to be set. Can be integer or
|
|
|
- pseudo-variable with integer value (range 0-63).
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.18. setxflag usage
|
|
|
-...
|
|
|
-setxflag("1");
|
|
|
-...
|
|
|
-$var(flag) = 11;
|
|
|
-setxflag("$var(flag)");
|
|
|
-...
|
|
|
-
|
|
|
-4.13. isxflagset(flag)
|
|
|
-
|
|
|
- Return true if the extended message (transaction) flag is set.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * flag - the index of the flag to be tested. Can be integer or
|
|
|
- pseudo-variable with integer value (range 0-63).
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.19. isxflagset usage
|
|
|
-...
|
|
|
-if(isxflagset("1"))
|
|
|
-{
|
|
|
- ...
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
-4.14. resetxflag(flag)
|
|
|
-
|
|
|
- Reset the extended message (transaction) flag.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * flag - the index of the flag to be reset. Can be integer or
|
|
|
- pseudo-variable with integer value (range 0-63).
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.20. resetxflag usage
|
|
|
-...
|
|
|
-resetxflag("1");
|
|
|
-...
|
|
|
-
|
|
|
-4.15. set_send_socket(saddr)
|
|
|
-
|
|
|
- Set the socket for sending out.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * saddr - the address of the local socket (listen address). Can be a
|
|
|
- static string or contain pseudo-variable.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.21. set_send_socket usage
|
|
|
-...
|
|
|
-set_send_socket("udp:127.0.0.1:5060");
|
|
|
-...
|
|
|
-
|
|
|
-4.16. set_send_socket_name(sname)
|
|
|
-
|
|
|
- Set the socket for sending out.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * sname - the name of the local socket (listen address). Can be a
|
|
|
- static string or contain pseudo-variable.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.22. set_send_socket_name usage
|
|
|
-...
|
|
|
-set_send_socket_name("sock1");
|
|
|
-...
|
|
|
-
|
|
|
-4.17. set_recv_socket(saddr)
|
|
|
-
|
|
|
- Switch local socket used for receiving the message.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * saddr - the address of the local socket (listen address). Can be a
|
|
|
- static string or contain pseudo-variable.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.23. set_recv_socket usage
|
|
|
-...
|
|
|
-set_recv_socket("udp:127.0.0.1:5060");
|
|
|
-...
|
|
|
-
|
|
|
-4.18. set_recv_socket_name(sname)
|
|
|
-
|
|
|
- Switch local socket used for receiving the message.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * sname - the name of the local socket (listen address). Can be a
|
|
|
- static string or contain pseudo-variable.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.24. set_recv_socket_name usage
|
|
|
-...
|
|
|
-set_recv_socket_name("sock1");
|
|
|
-...
|
|
|
-
|
|
|
-4.19. set_source_address(saddr)
|
|
|
-
|
|
|
- Set the source address for the message.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * saddr - the source address in socket format. Can be a static string
|
|
|
- or contain pseudo-variable.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.25. set_source_address usage
|
|
|
-...
|
|
|
-set_source_address("udp:127.0.0.1:5080");
|
|
|
-...
|
|
|
-
|
|
|
-4.20. via_add_srvid(flags)
|
|
|
-
|
|
|
- Control if srvid parameter is added or not to local Via. If yes, the
|
|
|
- value is server_id, added only if it is different than 0.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * flags: 1 - add srvid parameter; 0 - do not add srvid parameter.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.26. via_add_srvid usage
|
|
|
-...
|
|
|
-via_add_srv("1");
|
|
|
-...
|
|
|
-
|
|
|
-4.21. via_add_xavp_params(flags)
|
|
|
-
|
|
|
- Control if fields of the xavp with the name specified by
|
|
|
- xavp_via_params global parameter are added or not to local Via.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * flags: 1 - add xavp parameters; 0 - do not add xavp parameters.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.27. via_add_xavp_params usage
|
|
|
-...
|
|
|
-xavp_via_params="xvia"
|
|
|
-...
|
|
|
-request_route {
|
|
|
- ...
|
|
|
- $xavp(xvia=>srvid) = "1";
|
|
|
- $xavp(xvia[0]=>myval) = "xyz";
|
|
|
- via_add_xavp_params("1");
|
|
|
- ...
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
-4.22. via_use_xavp_fields(flags)
|
|
|
-
|
|
|
- Control if fields of the xavp with the name specified by
|
|
|
- xavp_via_fields global parameter are used or not to build local Via.
|
|
|
-
|
|
|
- Meaning of the parameters is as follows:
|
|
|
- * flags: 1 - use xavp fields; 0 - do not use xavp fields.
|
|
|
-
|
|
|
- This function can be used from ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.28. via_use_xavp_fields usage
|
|
|
-...
|
|
|
-xavp_via_fields="mvia"
|
|
|
-...
|
|
|
-request_route {
|
|
|
- ...
|
|
|
- $xavp(mvia=>address) = "10.10.10.10";
|
|
|
- $xavp(mvia[0]=>port) = "5060";
|
|
|
- via_use_xavp_fields("1");
|
|
|
- ...
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
-4.23. is_faked_msg()
|
|
|
-
|
|
|
- Returns 1 (native config true) if the SIP message under processing is
|
|
|
- the internal faked msg structure. Returns -1 (native config false) if
|
|
|
- the SIP message under processing is received from the network.
|
|
|
-
|
|
|
- The function should be useful in event route blocks or async route
|
|
|
- blocks where it can be processed either a message from the network or
|
|
|
- the internal faked message.
|
|
|
-
|
|
|
- This function can be used in ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.29. is_faked_msg usage
|
|
|
-...
|
|
|
-event_route[dispatcher:dst-down] {
|
|
|
- if (is_faked_msg()) {
|
|
|
- xinfo("Running with faked message\n");
|
|
|
- }
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
-4.24. is_socket_name(sockname)
|
|
|
-
|
|
|
- Returns 1 (native config true) if the parameter matches a local socket
|
|
|
- name, otherwise -1 (native config false). The parameter can contain
|
|
|
- variables.
|
|
|
-
|
|
|
- This function can be used in ANY_ROUTE.
|
|
|
-
|
|
|
- Example 1.30. is_socket_name usage
|
|
|
-...
|
|
|
- if (is_socket_name("socktls")) {
|
|
|
- xinfo("matched local socket name\n");
|
|
|
- }
|
|
|
-...
|
|
|
-
|
|
|
-4.25. forward_reply()
|
|
|
-
|
|
|
- Forward received reply on demand.
|
|
|
-
|
|
|
- This function can be used in CORE_ONREPLY_ROUTE.
|
|
|
-
|
|
|
- Example 1.31. forward_reply usage
|
|
|
-...
|
|
|
-route[reply] {
|
|
|
- forward_reply();
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
-5. RPC Commands
|
|
|
-
|
|
|
- 5.1. corex.debug
|
|
|
- 5.2. corex.list_sockets
|
|
|
- 5.3. corex.list_aliases
|
|
|
- 5.4. corex.shm_status
|
|
|
- 5.5. corex.shm_summary
|
|
|
- 5.6. corex.pkg_summary
|
|
|
- 5.7. corex.shm.info
|
|
|
- 5.8. corex.shm.report
|
|
|
- 5.9. corex.shm.stats
|
|
|
-
|
|
|
-5.1. corex.debug
|
|
|
-
|
|
|
- Set or get the global log level (the value for global parameter
|
|
|
- 'debug'). To set the debug, provide an integer parameter. If no
|
|
|
- parameter is provided, then the current value is returned.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcmd corex.debug
|
|
|
- kamcmd corex.debug 2
|
|
|
-
|
|
|
-5.2. corex.list_sockets
|
|
|
-
|
|
|
- Print the list of sockets the application is listening on.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcmd corex.list_sockets
|
|
|
-
|
|
|
-5.3. corex.list_aliases
|
|
|
-
|
|
|
- Print the list of hostname aliases used to match the myself condition.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcmd corex.list_aliases
|
|
|
-
|
|
|
-5.4. corex.shm_status
|
|
|
-
|
|
|
- Trigger shm status dump to syslog.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcmd corex.shm_status
|
|
|
-
|
|
|
-5.5. corex.shm_summary
|
|
|
-
|
|
|
- Trigger shm summary dump to syslog.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcmd corex.shm_summary
|
|
|
-
|
|
|
-5.6. corex.pkg_summary
|
|
|
-
|
|
|
- Trigger pkg summary dump to syslog for a specific pid or process index.
|
|
|
- It has two parameters: first to specify what matching type is desired
|
|
|
- (can be 'pid' or 'idx'); second to specify the value for desired match.
|
|
|
-
|
|
|
- The dump is happening when the selected process is doing a runtime
|
|
|
- handling (e.g., processing a sip message).
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcmd corex.pkg_summary pid 2345
|
|
|
- kamcmd corex.pkg_summary idx 1
|
|
|
-
|
|
|
-5.7. corex.shm.info
|
|
|
-
|
|
|
- Return shared memory manager details.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcli rpc shm.info
|
|
|
-
|
|
|
-5.8. corex.shm.report
|
|
|
-
|
|
|
- Return shared memory manager usage report.
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcli rpc shm.report
|
|
|
-
|
|
|
-5.9. corex.shm.stats
|
|
|
-
|
|
|
- Return shared memory statistics (values are in bytes).
|
|
|
-
|
|
|
- Example:
|
|
|
- kamcli rpc shm.stats
|
|
|
-
|
|
|
-6. Event Routes
|
|
|
-
|
|
|
- 6.1. event_route[network:msg]
|
|
|
- 6.2. event_route[corex:reply-out]
|
|
|
-
|
|
|
-6.1. event_route[network:msg]
|
|
|
-
|
|
|
- Event route block to be executed when new data is received from network
|
|
|
- or the data that is about to be sent to a remote host by a SIP worker
|
|
|
- process.
|
|
|
-
|
|
|
- The kamailio script writer can check which type of data triggered this
|
|
|
- event route using is_incoming method.
|
|
|
-
|
|
|
- After executing of this event route, if msg_avp was defined and set
|
|
|
- then its value is used for further processing, otherwise, original
|
|
|
- value of $mb is used. If message was received from remote host, then it
|
|
|
- is parsed and proceeds to appropriate route. Otherwise if message set
|
|
|
- to send out, then is sent to remote host per configured SIP timers in
|
|
|
- config script.
|
|
|
-
|
|
|
- Please note this event route is meant to prepare the message for
|
|
|
- on-wire communication, e.g. to do custom encryption or decryption,
|
|
|
- compression/decompression etc. of the message sent to or received from
|
|
|
- remote host. Therefore, except text operations, no module functions or
|
|
|
- pseudo variables are available in this event route.
|
|
|
-
|
|
|
-6.2. event_route[corex:reply-out]
|
|
|
-
|
|
|
- Event route block to be executed when a SIP reply is sent out.
|
|
|
-
|
|
|
-7. Examples of Usage
|
|
|
-
|
|
|
- To use network event_route[network:msg] the remote SIP UA must also
|
|
|
- implement and understand the encoding / decoding done in this event
|
|
|
- route. It is up to Kamailio config script writer to define and
|
|
|
- implement how encoding and decoding is done. Any language module such
|
|
|
- as app_perl or app_lua can be called in in event_route[network:msg] to
|
|
|
- implement desired logic.
|
|
|
-
|
|
|
- The most simple use case is to compress the SIP packet on-wire. As SIP
|
|
|
- is a text based protocol, so it is highly compressable. Using this
|
|
|
- module, one can compress entire SIP message, including headers and
|
|
|
- message body before sending it to remote host using any compression
|
|
|
- algorithm of choice, thus saving significant bandwidth on mobile data
|
|
|
- networks.
|
|
|
-
|
|
|
- A useful case is to use this function between SIP edge proxy and SIP
|
|
|
- application server. The SIP messages received from end-user at SIP edge
|
|
|
- proxy may be decrypted and sent to SIP application server at remote
|
|
|
- location unencrypted, where they are processed as normal. One the way
|
|
|
- back, the messages received from SIP application server at edge proxy
|
|
|
- can be encrypted before being sent to actual destination. The edge
|
|
|
- proxy can check whether received message came from end-user or SIP
|
|
|
- application server by using simple regular expressions.
|
|
|
-
|
|
|
- Another use case is to implement a virtual HTTP tunnel for SIP
|
|
|
- messages. The SIP client app can convert SIP message to binary e.g. by
|
|
|
- doing XOR, Base64 etc., then prepend some fake HTTP headers to make it
|
|
|
- look like an HTTP request before sending it to kamailio over SIP TCP
|
|
|
- socket. At kamailio, the fake headers are removed and data is decoded
|
|
|
- back to normal SIP and processed per config script logic. For the data
|
|
|
- that is to be sent to SIP client app, one can prepend fake HTTP reply
|
|
|
- headers to encoded data before sending it to client app.
|
|
|
-
|
|
|
- More advance use cases may involve custom encryption algorithms such as
|
|
|
- ITV encryption algorithm, https://github.com/mshary/itv
|
|
|
-
|
|
|
- For example, the client app running on Android or iPhone, may send
|
|
|
- device UUID along with ITV key, encrypted using RSA or AES256 with
|
|
|
- pre-shared secret, as first packet, which is set as cookie by server in
|
|
|
- e.g. memcache. This cookie is referred by client app in each next
|
|
|
- packet, so server can retrieve encryption key from cache and use that
|
|
|
- for decryption. Same can be done for server at client app side, so
|
|
|
- messages encrypted by server can be decrypted at client app.
|
|
|
-
|
|
|
- Next is a basic usage example where encoding and decoding is done using
|
|
|
- PERL.
|
|
|
-
|
|
|
- Example 1.32. event_route[network:msg] use cases
|
|
|
-...
|
|
|
-loadmodule "app_perl.so"
|
|
|
-loadmodule "corex.so"
|
|
|
-...
|
|
|
-# ----- app_perl params -----
|
|
|
-modparam("app_perl", "filename", "/usr/local/etc/kamailio/custom_compress.pl")
|
|
|
-modparam("app_perl", "modpath", "/usr/local/lib64/kamailio/perl")
|
|
|
-
|
|
|
-# ----- corex params -----
|
|
|
-modparam("corex", "nio_intercept", 32)
|
|
|
-modparam("corex", "nio_min_msg_len", 32)
|
|
|
-modparam("corex", "nio_msg_avp", "$avp(msg)")
|
|
|
-...
|
|
|
-event_route[network:msg] {
|
|
|
- if (is_incoming()) {
|
|
|
- if (perl_exec_simple("do_uncompress", "" + $mb + "")) {
|
|
|
- xlog("L_INFO", "Received message '$avp(msg)' \n");
|
|
|
- } else {
|
|
|
- xlog("L_INFO", "Received message '$mb' \n");
|
|
|
- $avp(msg) = $mb;
|
|
|
- };
|
|
|
- } else {
|
|
|
- xlog("L_INFO", "Sending message '$mb' \n");
|
|
|
- if (!perl_exec_simple("do_compress", "" + $mb + "")) {
|
|
|
- $avp(msg) = $mb;
|
|
|
- };
|
|
|
- };
|
|
|
-}
|
|
|
-...
|
|
|
-
|
|
|
- Example 1.33. Sample PERL code for do_compress and do_uncompress
|
|
|
-...
|
|
|
-use strict;
|
|
|
-use warnings;
|
|
|
-use IO::Compress::Gzip qw(gzip $GzipError) ;
|
|
|
-use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
|
|
|
-
|
|
|
-sub do_compress() {
|
|
|
- my $input = shift;
|
|
|
- my $output;
|
|
|
-
|
|
|
- gzip \$input => \$output
|
|
|
- or eval {
|
|
|
- Kamailio::log(L_WARN, "GZIP failed: $GzipError\n");
|
|
|
- $output = $input;
|
|
|
- };
|
|
|
-
|
|
|
- Kamailio::AVP::add("msg", $output);
|
|
|
-}
|
|
|
-
|
|
|
-sub do_uncompress() {
|
|
|
- my $input = shift;
|
|
|
- my $output;
|
|
|
-
|
|
|
- gunzip \$input => \$output
|
|
|
- or eval {
|
|
|
- Kamailio::log(L_WARN, "GUNZIP failed: $GzipError\n");
|
|
|
- $output = $input;
|
|
|
- };
|
|
|
-
|
|
|
- Kamailio::AVP::add("msg", $output);
|
|
|
-}
|
|
|
-...
|