Dear Kamailio Team,
I hope this email finds you well.
I am currently working on a project where Kamailio is being utilized as a
load balancer to distribute calls across multiple FreeSWITCH instances. I
am using the round-robin technique for load distribution, and it is working
perfectly for regular call scenarios.
However, I am encountering an issue when handling attended transfer calls.
Specifically, for a normal call, Kamailio assigns one FreeSWITCH instance,
but during the attended transfer call, it assigns another FreeSWITCH
instance. This behavior disrupts the continuity of the call handling.
My requirement is for Kamailio to use the same FreeSWITCH instance for the
entire call, including any attended transfers. I believe maintaining the
same FreeSWITCH instance for the entire call flow would ensure consistency
and avoid potential issues.
Could you please guide me on how to configure Kamailio to achieve this
behavior? I would greatly appreciate any suggestions, configurations, or
modules that can help resolve this issue.
Thank you for your time and assistance.
Looking forward to your response.
Best regards,
Kotappa Y Gandudi
Hi List
To handle CPE which can only handle a limited number of route header
(PacketCable SIP specification), I need to store and restore the route
header (limited topology hiding only affecting Route Header) to present
the CPE only one Route or RR header.
I pass the ID of the stored route-set via RR param.
So when I get a message back from the CPE is:
* Take ID from RR param and pull stored route set from cache.
* remove_hf("Route");
* insert_hf("Route: $avp(stored-routeset)\r\n");
* msg_apply_changes();
* loose_route();
I found loose_route() only to be able to correctly determine the next
hop, if I first did apply the changes.
But after adding rtpengine to the mix, I got back into the known
situation that calling rtpengine (on the branch route) after calling
msg_apply_changes() results in duplicate SDP.
Is there a way to get loose_route() to operate on freshly added header
without calling msg_apply_changes?
--
Mit freundlichen Grüssen
-Benoît Panizzon- @ HomeOffice und normal erreichbar
--
I m p r o W a r e A G - Leiter Commerce Kunden
______________________________________________________
Zurlindenstrasse 29 Tel +41 61 826 93 00
CH-4133 Pratteln Fax +41 61 826 93 01
Schweiz Web http://www.imp.ch
______________________________________________________
Hi all!
still struggling with Async HTTP Client ...
My current configuration is very simple:
#!define HTTP_API_ROUTING_ENDPOINT_MAIN "
http://MY_HTTP_REST_API:18085/Endpoint"
include_file "listen.cfg"
loadmodule "pv"
loadmodule "tm"
loadmodule "http_async_client"
loadmodule "xlog"
loadmodule "tmx"
loadmodule "sl"
loadmodule "textops"
loadmodule "cfgutils"
loadmodule "siputils"
loadmodule "rr"
loadmodule "ctl"
loadmodule "jsonrpcs.so"
loadmodule "jansson.so"
modparam("pv", "shvset", "http_async=i:8");
modparam("http_async_client", "workers", 1);
modparam("http_async_client", "connection_timeout", 500)
modparam("http_async_client", "curl_verbose", 1) # for debug purpose
#modparam("tm", "fr_timer", 750)
#modparam("tm", "fr_inv_timer", 20000)
#modparam("tm", "remap_503_500", 0)
modparam("tm", "failure_reply_mode", 3)
modparam("tm", "max_inv_lifetime",5000)
# ----- jsonrpcs params -----
modparam("jsonrpcs", "pretty_format", 1)
/* set the path to RPC fifo control file */
modparam("jsonrpcs", "fifo_name", "/tmp/kamailio_rpc.fifo")
/* set the path to RPC unix socket control file */
modparam("jsonrpcs", "dgram_socket", "/tmp/kamailio_rpc.sock")
debug=2
children=16
log_facility=LOG_LOCAL0
log_prefix="{$mt $hdr(CSeq) $ci} "
disable_sctp = yes
force_rport = yes
rundir="/tmp"
request_route {
$avp(REQUEST_URL) = HTTP_API_ROUTING_ENDPOINT_MAIN;
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
t_relay();
}
exit;
}
if(is_method("OPTIONS")){
sl_reply("200", "OK");
exit;
}
if(is_method("CANCEL")){
sl_reply("200","OK");
sl_reply("487","Request Terminated");
exit;
}
jansson_set("string","from" , $hdr(From) , "$var(req)");
jansson_set("string","to" , $hdr(To) , "$var(req)");
jansson_set("string","r-uri" , $ru , "$var(req)");
jansson_set("string","contact" , $hdr(Contact) , "$var(req)");
jansson_set("string","call-id" , $ci , "$var(req)");
xinfo("MAIN-ROUTE - Setting From=$hdr(From) To=$hdr(To)
Contact=$hdr(Contact) ci=$ci \n");
if ( is_present_hf("Identity") )
jansson_set("string","identity" ,
$hdr(Identity) , "$var(req)");
if ( is_present_hf("P-Identity-Bypass") )
jansson_set("string","p-identity-bypass" ,
$hdr(P-Identity-Bypass) , "$var(req)");
if ( is_present_hf("P-Asserted-Identity") )
jansson_set("string","p-asserted-identity" ,
$hdr(P-Asserted-Identity) , "$var(req)");
if ( is_present_hf("P-STSH-UC") )
jansson_set("string","p-stsh-uc" ,
$hdr(P-STSH-UC) , "$var(req)");
jansson_set("string", "request-time" , $avp(requestTime),
"$var(req)");
## Create transaction before http_async_query;
if (is_method("INVITE")){
t_newtran();
xinfo("MAIN-ROUTE - Sending request [$var(req)]\n");
route(HTTP_ASYNC_REQUEST);
}
exit;
}
route[HTTP_ASYNC_REQUEST] {
xinfo("HTTP_ASYNC_REQUEST - Sending request [$var(req)]\n");
$http_req(all) = $null;
$http_req(suspend) = 1;
$http_req(timeout) = 1500; # 1 second timeout
$http_req(method) = "POST";
$http_req(hdr) = "Content-Type: application/json";
$http_req(body) = $var(req);
if ( !http_async_query($avp(REQUEST_URL), "HTTP_REPLY") ) {
xinfo("HTTP_ASYNC_REQUEST - http_async_query $ci FAILED. Return is
[$rc]\n");
}else{
send_reply("503", "Server Error");
exit;
}
}
route[HTTP_REPLY] {
xinfo("HTTP_REPLY - Xphere Response Code $http_rs - $ci\n");
if ( $http_ok && $http_rs==200) {
xinfo("HTTP_REPLY - $ci reply ok\n");
jansson_xdecode($http_rb, "json");
xinfo("HTTP_REPLY - HTTP JSON Response: $http_rb \n");
if ( $xavp(json=>sip-response-code) == 300 ){
remove_hf("Contact");
append_to_reply("Contact: $xavp(json=>contact)\r\n");
## "touch" the ruri to add the contact header for 3xx:
$ru = $ru;
send_reply("300", "Multiple Choice");
exit;
}else{
xinfo("HTTP_REPLY - $ci Error Replied
$xavp(json=>sip-response-code) - $xavp(json=>sip-response-text) \n");
send_reply("$xavp(json=>sip-response-code)","$xavp(json=>sip-response-text)");
exit;
}
}
else {
xinfo("HTTP_REPLY - HTTP Response Code $ci - $http_rs and
error $http_err \n");
if (!$http_ok){
sl_reply("503", "No Connection to HTTP");
exit;
}else if ($http_rs>=500){
sl_reply("503", "HTTP Processing Error");
exit;
}
else{
sl_reply("503", "Cannot Connect to HTTP");
exit;
}
}
exit;
}
The configuration is based on Ben Kaufman's kamailio_http_async
<https://github.com/whosgonna/kamailio_http_async> example, but I have
extended it a bit.
Currently all the requests are being sent to the HTTP REST API. I can't
find queue/buffering issues...
What I am experiencing is that , using SNGREP, I get this flow:
10.240.12.209:5060 10.242.17.146:5060
----------*---------- ----------*----------
17:33:46.689852 x INVITE (SDP) x
+0.000530 x --------------------------> x
17:33:46.690382 x 100 trying -- your call is x
+1.499822 x <-------------------------- x
17:33:48.190204 x 503 No Connection to HTTP x
+0.000029 x <-------------------------- x
17:33:48.190233 x 500 I'm terribly sorry, se x
+0.002130 x <-------------------------- x
17:33:48.192363 x ACK x
+0.485836 x --------------------------> x
17:33:48.678199 x 500 I'm terribly sorry, se x
+0.004881 x <<<------------------------ x
17:33:48.683080 x ACK x
+0.973295 x ------------------------>>> x
17:33:49.656375 x 500 I'm terribly sorry, se x
+0.004105 x <<<------------------------ x
17:33:49.660480 x ACK x
+1.995420 x ------------------------>>> x
17:33:51.655900 x 500 I'm terribly sorry, se x
+0.005361 x <<<-------------------------x
17:33:51.661261 x ACK x
x ------------------------>>> x
I suspected issues with the HTTP REST service, but when using tcpdump, I
can find the Request from Kamailio and a reply back from the REST API
service, so doesn't seem to be a problem on the HTTP REST service
So my questions are:
- why is Kamailio sending a "SIP 500 I'm terribly sorry..." error after a
503 No Connection to HTTP is sent and an "exit" command is executed?
- how can I get rid of these messages?
- Why Kamailio keeps sending responses back to SBC after the ACK when it is
set to just "exit"?
- Why is Kamailio not processing the response from HTTP REST API when it is
correctly received?
Logs are also weird:
- I find a lot of these warnings:
"Dec 29 17:38:34 ire-nprod-sip1 /usr/local/sbin/kamailio[590864]: WARNING:
http_async_client [http_async_client_mod.c:529]: ah_get_status(): an async
variable was read after http error, use $http_ok to check the request's
status"
and
"Dec 29 17:38:34 ire-nprod-sip1 /usr/local/sbin/kamailio[590864]: ERROR:
http_async_client [http_multi.c:621]: check_multi_info(): handle
0x7f375f786b30 returned error 7:"
(I am still not using EVAPI module, that will be my next step, after the
holiday season)
(I suspect, however, that the REST API is not being able to handle the load
in this test environment (between 400 to 600 CAPS), but that is another
matter.)
In attach, TCPDUMP, if anyone wishes to analyse.
Atenciosamente / Kind Regards / Cordialement / Un saludo,
*Sérgio Charrua*
Just to share, and thanks for your valuable help. My conclusion after tests (on my scenario) is
http backend:
is a golang http server with a 250ms delay to answer, and answering back a json, running in 10 replicas inside a K8 with 4 nodes.
test (from kamailio perspective):
receive INVITE
send 100
call the http, get the result, get a key from the result and set it as the value of Contact header
send 302
receive ACK (discard on sync scenario because it’s stateless, use it in async to end transaction)
Kamailio host:
1vcpu
kamailio 3.8.4 bookworm running inside containerd (with podman)
16GB RAM
sipp:
run from the K8 nodes hosts (directly from OS) (everything is LAN connected on 2 different physical servers, hypervisor is VMWare i guess 7.0.3)
using http_client (sync with stateless):
8 children -M8 -m64 no more than 60 calls/sec (15cps on each sipp instance) until sipp start to retransmit the INVITES
using async_http_client:
8 children -M8 -m2048 it’s been ~36 hours now at 250cps each sipp instance with 0 errors 0 retransmission and the kamailio host is
userlab@sblb1:~$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 10285460 364684 5444240 0 0 0 22 36 68 0 0 100 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5284 6822 27 14 58 0 0
4 0 0 10285460 364684 5444240 0 0 0 0 5306 6752 29 15 57 0 0
3 0 0 10285460 364684 5444240 0 0 0 0 5304 6823 26 16 57 0 0
2 0 0 10285460 364684 5444240 0 0 0 12 5287 6761 26 16 57 0 0
2 0 0 10285460 364684 5444240 0 0 0 0 5337 6838 27 14 58 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5101 6724 25 17 59 0 0
3 0 0 10285460 364684 5444240 0 0 0 0 5066 6650 26 14 60 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5306 6829 23 17 59 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5219 6725 23 19 58 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5274 6770 26 13 61 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5295 6756 26 18 56 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5235 6786 22 16 62 0 0
1 0 0 10285460 364684 5444240 0 0 0 0 5315 6833 21 20 59 0 0
at least for my scenario, it worths to pay the price of the memory tradeoff.
again, Ben, Alex, Sergio, all, thanks for your help.
regards
Hello all, moving just a bit aside of the http and async_http.
After all the real useful and interesting thread on that topic what helped me, im facing a problem i cant deal with and need a hint at least.
Scenario
INVITE -> Kamailio
on request_route
...
if(is_method("INVITE")){
t_newtran();
http_async_query("http://nuc:8080", "HTTP_REPLY");
}
…
Kamailio -> 100 - Trying
then
route[HTTP_REPLY] {
if ($http_ok) {
xlog("L_INFO", "route[HTTP_REPLY]: status $http_rs\n");
xlog("L_INFO", "route[HTTP_REPLY]: body $http_rb\n");
t_reply(302,"Redirect");
} else {
xlog("L_INFO", "route[HTTP_REPLY]: error $http_err)\n");
}
}
Kamailio -> 302 Redirect
ACK -> Kamailio
This last ACK, how can i read it and use it to terminate the transaction? because Kamailio keeps transmitting the 302 message 3 more times until the transaction is finished by a timer
42(44) DEBUG: tm [t_reply.c:1723]: t_retransmit_reply(): reply retransmitted. buf=0x7f4c44f9d680: SIP/2.0 3..., shmem=0x7f4c3fce7900: SIP/2.0 3
42(44) DEBUG: tm [t_reply.c:1723]: t_retransmit_reply(): reply retransmitted. buf=0x7f4c44f9d680: SIP/2.0 3..., shmem=0x7f4c3fce7900: SIP/2.0 3
42(44) DEBUG: tm [t_reply.c:1723]: t_retransmit_reply(): reply retransmitted. buf=0x7f4c44f9d680: SIP/2.0 3..., shmem=0x7f4c3fce7900: SIP/2.0 3
42(44) DEBUG: tm [timer.c:642]: wait_handler(): finished transaction: 0x7f4c3fcd35a0 (p:0x7f4c3fad85d0/n:0x7f4c3fad85d0)
42(44) DEBUG: tm [h_table.c:133]: free_cell_helper(): freeing transaction 0x7f4c3fcd35a0 from timer.c:651
in request_route i have
if(is_method("ACK")){
if(!t_check_trans()){
t_release();
}
exit;
}
Hello all, how can avoid to append_branch do this call to call
SIP/2.0 302 Redirect
Via: SIP/2.0/UDP 192.168.86.250:5060;branch=z9hG4bK-65665-5-0
From: sipp <sip:sipp@192.168.86.250:5060>;tag=65665SIPpTag005
To: 123456 <sip:123456@192.168.86.128:5060>;tag=a6a1c5f60faecf035a1ae5b6e96e979a-deb8da2e
Call-ID: 5-65665(a)192.168.86.250
CSeq: 1 INVITE
Contact: <sip:4093823670@otherdomain.com>, <sip:8888576523@otherdomain.com>, <sip:9719533197@otherdomain.com>, <sip:5302579529@otherdomain.com>, <sip:4972010218@otherdomain.com>
Server: kamailio (5.8.4 (x86_64/linux))
Content-Length: 0
What i mean with “avoid”, call to call, contact should have only 1 branch, no a stack of previous.
thanks
Hello, after the discussion regarding http and http_async, I started some labs to make a comparison and see what’s the trade off and the associated cost.
Main problem (to me) is im not clear on how transactions behave. Im running some fast tests now before I start to deploy the final scenarios and
1. A new transaction is created before the http_async call (as the module example shows for http_async_query function
2. The http_async_query call is executed, receives a response and the HTTP_REPLY route for http_async_query is executed.
3. As we need to redirect the call, im adding Contact information with append_to_reply and then calling t_reply(302,”Redirect)
Up to here INVITE is received, a 100 is answered and then the 302 with the expected Contact information (collected and built from the http_async_query response), problem is that the 302 is retransmitted 3 more times.
So, im not even sure that im doing the correct actions to process the call this way. Is there a document/book/reference I can read to understand transactions better?
By now I can not handle the call to be processed correctly (without the retransmissions) and finish the transaction the correct way.
Any help, link, guide, will be appreciated.
Regards.
Hello!
for this ST/SH project, we are using Kamailio 5.8.4 in stateless mode,
making HTTP requests to a REST API (Java Spring) that will reply with a
JSON object, and then Kamailio replaces the Contact header and sends a SIP
300 Multiple Choice reply to the SBC that sent the initial INVITE.
Kamailio is running on a VM with 4vCPUs and 4GB RAM and 2 NICs.
On NIC ens224 there is a Virtual IP managed by Keepalived.
Kamailio is listening on port 5060 on ens224 and set with 32 children
process (tried with 8, 16, 24 and also 64, but with this value it was a lot
worst).
We are doing load performance tests on our PreProd environment. With the
SBC we are sending 450 to 600 CAPS to Kamailio, and what we noticed is that
above 450 CAPS, and after less than 1 minute, Kamailio only replies SIP 100
to some INVITEs. We also could figure out that Kamailio is not receiving
all the INVITES, despite having proved that ALL invites are sent to the
server.
It seems to me that, for some reason, the OS is somehow not able to deliver
*all* SIP packets to Kamailio, because:
- sngrep does capture all the SIP packets and shows the flows
- though the flow shows SIP invite coming from SBC to Kamailio Server,
there is no SIP 100 replied back to SBC, even though this is the 1st thing
kamailio does, so, for me, Kamailio did not received the SIP Invite
- picking a call with reinvites, which after some seconds, SBC cancels, if
I copy the Call-ID value and grep on kamailio's logs, I just do not find
any content!
I have read some "network tuning" articles, including Linux Tune Network
Stack (Buffers Size) To Increase Networking Performance - nixCraft
<https://www.cyberciti.biz/faq/linux-tcp-tuning/> and Tuning Kamailio for
high throughput and performance | Evariste Systems Blog
<https://blog.evaristesys.com/2016/02/15/tuning-kamailio-for-high-throughput…>
and
when running the following command I get:
$ ss -4 -n -l | grep 5060
udp UNCONN 0 0 10.242.17.125:5060 0.0.0.0:*
udp UNCONN 324224 0 10.242.17.146:5060 0.0.0.0:*
According to the article, the 3rd column should be as near 0 as possible,
ideally 0.
While I am waiting for some sysadmin with root permissions to be available
and modify some of the network parameters on this VM, I wonder if anyone
has some tips to share on how to solve this behaviour. I'm not sure,
either, what parameters to change or if they should be changed! The goal is
to have a minimum 750 CAPS.
Lastly, some parts of the code:
Kamailio.cfg:
> ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
> debug=1
> log_stderror=no
> rundir="/tmp"
> memdbg=5
> memlog=5
> log_facility=LOG_LOCAL0
> # configure the prefix for all log messages
> log_prefix_mode = 1
> log_prefix="{$mt $hdr(CSeq) $ci} "
> /* number of SIP routing processes */
> children=32 # ------------- ALREADY TRIED WITH 8,16,24... no results.....
> /* uncomment the next line to disable TCP (default on) */
> disable_tcp=no
> /* uncomment the next line to disable the auto discovery of local aliases
> * based on reverse DNS on IPs (default on) */
> # auto_aliases=no
> /* add local domain aliases */
> # alias="sip.mydomain.com"
>
####### Custom Parameters #########
/* These parameters can be modified runtime via RPC interface
* - see the documentation of 'cfg_rpc' module.
*
* Format: group.id = value 'desc' description
* Access: $sel(cfg_get.group.id) or @cfg_get.group.id */
####### Modules Section ########
/* set paths to location of modules */
loadmodule "db_mysql.so"
loadmodule "db_cluster.so"
loadmodule "http_client.so"
loadmodule "jsonrpcs.so"
loadmodule "kex.so"
loadmodule "corex.so"
loadmodule "sl.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "jansson.so"
loadmodule "snmpstats.so"
loadmodule "file_out.so"
loadmodule "ctl.so"
loadmodule "permissions.so"
loadmodule "xhttp.so"
loadmodule "xhttp_rpc.so"
####### Other Args and Env Vars #########
/* listen addresses */
include_file "listen.cfg"
include_file "db_conn.cfg"
# ----------------- setting module-specific parameters --------------
# --- DB Cluster params ---
# minimum requirement is to have DBURL1 defined
#!ifdef DBURL1
modparam("db_cluster", "connection" , DBURL1)
#!endif
#!ifdef DBURL2
modparam("db_cluster", "connection" , DBURL2)
#!endif
#!ifdef DBURL3
modparam("db_cluster", "connection" , DBURL3)
#!endif
#!ifdef DBURL4
modparam("db_cluster", "connection" , DBURL4)
#!endif
#!ifdef DBURL5
modparam("db_cluster", "connection" , DBURL5)
#!endif
modparam("db_cluster", "cluster", DBCLUSTER)
# --- Permissions params ---
modparam("permissions", "db_url", "cluster://k1")
modparam("permissions", "db_mode", 1)
#modparam("permissions", "reload_delta", 30)
# ----- jsonrpcs params -----
modparam("jsonrpcs", "pretty_format", 1)
/* set the path to RPC fifo control file */
modparam("jsonrpcs", "fifo_name", "/tmp/kamailio_rpc.fifo")
/* set the path to RPC unix socket control file */
modparam("jsonrpcs", "dgram_socket", "/tmp/kamailio_rpc.sock")
modparam("jsonrpcs", "transport", 0)
# ----- ctl params -----
/* set the path to RPC unix socket control file */
modparam("ctl", "binrpc", "unix:/tmp/kamailio_ctl")
# ----- http_async_client params -----
modparam("http_client", "query_result", 0)
modparam("http_client", "keep_connections", 0)
modparam("http_client", "connection_timeout",2)
modparam("http_client", "timeout_mode",2)
modparam("http_client", "config_file",
"/usr/local/etc/kamailio/http_client.cfg")
# ---- SNMP Stats params ----
modparam("snmpstats", "sipEntityType", "proxyServer")
modparam("snmpstats", "sipEntityType", "redirectServer")
modparam("snmpstats", "sipEntityType", "other")
modparam("snmpstats", "snmpgetPath", "/usr/bin/")
modparam("snmpstats", "MsgQueueMinorThreshold", 20)
modparam("snmpstats", "MsgQueueMajorThreshold", 100)
modparam("snmpstats", "dlg_minor_threshold", 20)
modparam("snmpstats", "dlg_major_threshold", 100)
modparam("snmpstats", "snmpCommunity", "kamailio")
# ---- File_Out params ----
modparam("file_out", "base_folder", "/data/sabire002/log/kamailio/")
modparam("file_out", "file",
"name=stsh_requests;interval=1440;extension=.log")
modparam("file_out", "file", "name=cdr;interval=1440;extension=.log")
modparam("file_out", "file", "name=http;interval=1440;extension=.log")
####### Routing Logic ########
include_file "includes/reqinit.cfg"
include_file "includes/handle_options.cfg"
include_file "includes/handle_cancel.cfg"
include_file "includes/handle_stir_shaken_stateless.cfg"
include_file "includes/handle_http_rpc.cfg"
request_route {
$avp(START_TIME)=$utimef(%Y-%m-%d %H:%M:%S);
$avp(GROUPID) = allow_address_group($si, $sp);
if ( $avp(GROUPID) == 100 || !allow_address_group($si, $sp) ) {
xlog("L_INFO", "INIT - $si:$sp is not in the allowed ACL Group ID
!\n");
#sl_reply("401", "Address not allowed");
exit;
};
if (is_method("ACK") ) { #&& t_check_trans() ){
exit;
}
if (is_method("INVITE")) {
file_out("cdr","$rm|$ft|$tt|$ci|$rs|$rr|$Ts|$avp(START_TIME)|$fU|$fd|$si|$tU|$rU|$rd|$utimef(%Y-%m-%d
%H:%M:%S)");
send_reply("100","Trying");
}
route(HANDLE_OPTIONS);
route(REQINIT);
xlog("L_INFO"," ********** Route START ***********");
# log the basic info regarding this call
xlog("L_INFO","=================================================== \n");
xlog("L_INFO","New SIP message $rm with call-ID $ci received $pr request
$rm $ou source $si:$sp from $fu to $tu \n");
xlog("L_INFO","=================================================== \n");
route(HANDLE_STIRSHAKEN);
route(HANDLE_CANCEL);
if (method == "INVITE"){
route(RELAY);
}
}
route[RELAY] {
# Sends a 300 Multiple Choices back to the proxy that requested the
routing lookup
xlog("L_INFO","RELAY - send reply \n");
file_out("cdr","RELAY|$ft|$tt|$ci|$rs|$rr|$Ts|$avp(START_TIME)|$fU|$fd|$si|$tU|$rU|$rd|$utimef(%Y-%m-%d
%H:%M:%S)");
send_reply("300", "Multiple Choices");
exit;
}
As for the HANDLE_STIRSHAKEN route, where the main process is:
route[HANDLE_STIRSHAKEN]
{
if (!is_method("INVITE")) {
return;
}
$xavp(requestTime) = $utimef(%s);
$var(post) = $null; // resets and makes sure the $var(post) variable is
null before usage
[.... get some header values ...]
$var(res) = http_connect("api1", "/stsh", "application/json",
"$var(post)", "$var(result)");
jansson_xdecode($var(result), "json");
if ( $xavp(json=>sip-response-code) == 300 )
{
remove_hf("Contact");
append_to_reply("Contact: $xavp(json=>contact)\r\n");
}
else
{
# add error message to reply
sl_reply("$xavp(json=>sip-response-code)","$xavp(json=>sip-response-text)");
exit;
}
}
Atenciosamente / Kind Regards / Cordialement / Un saludo,
*Sérgio Charrua*
Hi
https://www.kamailio.org/wikidocs/cookbooks/5.7.x/pseudovariables/#selname-…https://www.kamailio.org/wikidocs/cookbooks/5.7.x/selects/#viaihost
I'm trying to list all via hosts:
$var(dooh) = @via[1].host;
xlog("L_INFO","******** VIA HOST 1: $var(dooh) \n");
This above works as expected I get the 2nd entry.
$var(i) = 0;
while ($var(i) < $hflc(Via)) {
$var(dooh) = @via[$var(i)].host;
xlog("L_INFO","******** VIA HOST: $var(dooh) \n");
$var(i) = $var(i) + 1;
}
This fails with syntax error.
How do I specify the index of the via header I want to extract the host
from?
I also attempted $sel(via[$var(i)].host) or via[$var(i)] or
$sel(hfl(via[$var(i)])).host but I found no variant not throwing an
error.
PS: Is there maybe another nice function to figure out if we have
already seen (and how many times we have) this same message?
Mit freundlichen Grüssen
-Benoît Panizzon-
--
I m p r o W a r e A G - Leiter Commerce Kunden
______________________________________________________
Zurlindenstrasse 29 Tel +41 61 826 93 00
CH-4133 Pratteln Fax +41 61 826 93 01
Schweiz Web http://www.imp.ch
______________________________________________________