Hi all!
I'm testing some redirect scenarios with Kamailio 5.7.4 and using
Astterisk 13 and SIPp for unit testing.
The kamailio's script is simple and uses TM, HTTP_ASYNC_MODULE, JSONRPC,
JANSSON, RTJSON and XLog modules.
Request route is simple:
request_route {
route(HANDLE_OPTIONS);
route(HANDLE_RETRANS);
route(HANDLE_CANCEL);
route(REQINIT);
route(HANDLE_INVITE);
}
where HANDLE_RETRANS is:
route[HANDLE_RETRANS]{
# handle retransmissions
xlog("L_INFO","HANDLE_RETRANS - message type is $mt for method
$rm");
if (!is_method("ACK")) {
if(t_precheck_trans()) {
xlog("L_INFO","HANDLE_RETRANS - Precheck
Trans");
t_check_trans();
xlog("L_INFO", "HANDLE_RETRANS - Exiting after
Retransmission check - method $rm");
exit;
}
xlog("L_INFO","HANDLE_RETRANS - Check Trans");
t_check_trans();
}
}
and HANDLE INVITE is:
route[HANDLE_INVITE]{
if (is_method("INVITE"))
{
xlog("L_INFO","MAIN - calling TO_CARRIER");
setflag(FLT_ACC);
route(TO_CARRIER);
exit;
}
}
The HTTP requests call a REST API returning a JSON object, that is iterated
and produces a CONTACT header containing multiple choices using
the append_branch() command.
The RELAY route is :
route[RELAY] {
# Sends a 300 Multiple Choices back to the proxy that requested the
routing lookup
xlog("L_INFO","REPLY_302 - send reply");
send_reply("300", "Multiple Choices");
xlog("L_INFO","REPLY_302 - exit");
exit;
}
Which returns indeed a Contact header with multiple contact choices.
When using Asterisk to originate a call to Kamailio, the SIP call flow is
as follows and terminates (SNGrep and TCPDump do not detect anything else):
SRC DST
INVITE (SDP)
──────────────────────────>
100 trying -- your call is
<──────────────────────────
300 Multiple Choices
<──────────────────────────
ACK
──────────────────────────>
However when using SIPp I get some retransmissions after the final ACK.
SRC DST
INVITE (SDP)
──────────────────────────>
100 trying -- your call is
<──────────────────────────
300 Multiple Choices
<──────────────────────────
ACK
──────────────────────────>
300 Multiple Choices
<<<────────────────────────
300 Multiple Choices
<<<────────────────────────
300 Multiple Choices
<<<────────────────────────
SIPp scenario is :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="Basic Sipstone UAC">
<!-- In client mode (sipp placing calls), the Call-ID MUST be -->
<!-- generated by sipp. To do so, use [call_id] keyword.
-->
<send retrans="500" start_rtd="true" rrs="true">
<![CDATA[
INVITE sip:[call_number]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
Max-Forwards: 70
From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: <sip:[call_number]@[remote_ip]:[remote_port]>
Contact: sip:sipp@[local_ip]:[local_port];transport=[transport]>
Call-ID: [call_id]
CSeq: 102 INVITE
User-Agent: SIPp
Supported: replaces, timer
Content-Type: application/sdp
Subject: Performance Test
Session-Expires: 3600;refresher=uas
Content-Length: [len]
v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=SIPp
c=IN IP[media_ip_type] [media_ip]
t=0 0
m=audio [media_port] RTP/AVP 0
a=rtpmap:0 PCMU/8000
]]>
</send>
<recv response="100" rss="true"> </recv>
<recv response="300" rtd="true" rss="true">
<action>
<ereg regexp="\<([a-zA-Z0-9@.=;]+)[^>]+"
search_in="hdr"
header="Contact: "
assign_to="1"/>
<log message="INFO: 300 Contact Header: [$1]" />
<exec command="echo [$1] >> ./300_ContactHeader.txt" />
</action>
<action>
<ereg regexp="sip:.*@([0-9A-Za-z\.]+):([0-9]+);transport=([A-Z]+)"
search_in="hdr" header="Contact:" check_it="true"
assign_to="dummy,host,port,transport" />
</action>
</recv>
<!-- Reference variables="dummy" /-->
<!-- Send ACK for 180 Ringing
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0 -->
<send rrs="true">
<![CDATA[
ACK sip:[call_number]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
Max-Forwards: 70
From: <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: <sip:[call_number]@[remote_ip]:[remote_port]>[peer_tag_param]
Contact: <sip:sipp@[local_ip]:[local_port]>
Call-ID: [call_id]
CSeq: 102 ACK
User-Agent: SIPp
Content-Length: 0
]]>
</send>
<!-- definition of the response time repartition table (unit is ms) -->
<!-- ResponseTimeRepartition value="10, 50, 100, 150, 200, 500, 1000"/
-->
</scenario>
The question is : is there anything wrong with my kamailio script? or with
SIPp scenario? why does kamailio have different behaviours between Asterisk
and SIPp?
Any option to disable retransmissions on Kamailio ? (using UDP)
Thanks in advance,
*Sérgio Charrua*