<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi there,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’m having an issue in a SBC (ACME) -> KAMAILIO -> Asterisk scenario with an ACK that gets ignored in Kamailio because it does not match any transaction.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The INVITE coming from the SBC looks like this (only relevant headers and hidden numbers for simplicity – SBC has IP .12 , Kamailio .30 and Asterisk .34)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">INVITE sip:mynumber@10.15.1.30:5060 SIP/2.0
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">Via: SIP/2.0/UDP 10.15.1.12:5060;branch=z9hG4bKdd1m7b00aom47rggc700.1
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">To: <sip: mynumber@10.15.1.30:5060>
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">From: <sip:a-number@10.15.1.12;user=phone>;tag=SDkbo9901-42090
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">P-Asserted-Identity: <sip: a-number @10.15.1.12>
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">Call-ID: SDkbo9901-71a1d17456b829b4c422af61de9eee7e-ao32g50
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">CSeq: 1 INVITE
<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">Contact: <sip:41754112601@10.15.1.12:5060;transport=udp>
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">And its forwarded to Asterisk with the Record-Route header:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> INVITE sip: mynumber @10.15.1.30:5060 SIP/2.0<o:p></o:p></p>
<p class="MsoNormal"> *Record-Route: <sip:10.15.1.30;lr=on;ftag=SDkbo9901-42090><o:p></o:p></p>
<p class="MsoNormal"> *Via: SIP/2.0/UDP 10.15.1.30;branch=z9hG4bK1c02.7dc1b94be22d8780df5141f9ba3c5b7b.0<o:p></o:p></p>
<p class="MsoNormal"> Via: SIP/2.0/UDP 10.15.1.12:5060;branch=z9hG4bKdd1m7b00aom47rggc700.1<o:p></o:p></p>
<p class="MsoNormal"> To: <sip:mynumber@10.15.1.30:5060><o:p></o:p></p>
<p class="MsoNormal"> From: <sip:a-number@10.15.1.12;user=phone>;tag=SDkbo9901-42090<o:p></o:p></p>
<p class="MsoNormal"> P-Asserted-Identity: <sip:a-number@10.15.1.12><o:p></o:p></p>
<p class="MsoNormal"> Call-ID: SDkbo9901-71a1d17456b829b4c422af61de9eee7e-ao32g50<o:p></o:p></p>
<p class="MsoNormal"> CSeq: 1 INVITE<o:p></o:p></p>
<p class="MsoNormal"><span lang="FR"> Contact: <sip:a-number@10.15.1.12:5060;transport=udp><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR"><o:p> </o:p></span></p>
<p class="MsoNormal">Then, 200 OK from Asterisk:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> SIP/2.0 200 OK<o:p></o:p></p>
<p class="MsoNormal"> *Via: SIP/2.0/UDP 10.15.1.30;rport=5060;received=10.15.1.30;branch=z9hG4bK1c02.7dc1b94be22d8780df5141f9ba3c5b7b.0<o:p></o:p></p>
<p class="MsoNormal"> Via: SIP/2.0/UDP 10.15.1.12:5060;branch=z9hG4bKdd1m7b00aom47rggc700.1<o:p></o:p></p>
<p class="MsoNormal"> *Record-Route: <sip:10.15.1.30;lr;ftag=SDkbo9901-42090><o:p></o:p></p>
<p class="MsoNormal"> Call-ID: SDkbo9901-71a1d17456b829b4c422af61de9eee7e-ao32g50<o:p></o:p></p>
<p class="MsoNormal"> From: <sip:a-number@10.15.1.12;user=phone>;tag=SDkbo9901-42090<o:p></o:p></p>
<p class="MsoNormal"> To: <sip:mynumber@10.15.1.30>;tag=2e3c2071-c895-4069-afc2-37a19b20637a<o:p></o:p></p>
<p class="MsoNormal"> CSeq: 1 INVITE<o:p></o:p></p>
<p class="MsoNormal"> Server: Asterisk PBX 13.8.0<o:p></o:p></p>
<p class="MsoNormal"> Contact: <sip:10.15.1.34:5060><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Which is sent to the SBC like this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> SIP/2.0 200 OK<o:p></o:p></p>
<p class="MsoNormal"> Via: SIP/2.0/UDP 10.15.1.12:5060;branch=z9hG4bKdd1m7b00aom47rggc700.1<o:p></o:p></p>
<p class="MsoNormal"> *Record-Route: <sip:10.15.1.30;lr;ftag=SDkbo9901-42090><o:p></o:p></p>
<p class="MsoNormal"> Call-ID: SDkbo9901-71a1d17456b829b4c422af61de9eee7e-ao32g50<o:p></o:p></p>
<p class="MsoNormal"> From: <sip:a-number@10.15.1.12;user=phone>;tag=SDkbo9901-42090<o:p></o:p></p>
<p class="MsoNormal"> To: <sip:mynumber@10.15.1.30>;tag=2e3c2071-c895-4069-afc2-37a19b20637a<o:p></o:p></p>
<p class="MsoNormal"> CSeq: 1 INVITE<o:p></o:p></p>
<p class="MsoNormal"> Server: Asterisk PBX 13.8.0<o:p></o:p></p>
<p class="MsoNormal"> Contact: <sip:10.15.1.34:5060><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">And finally the SBC sends the ACK:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> ACK sip:10.15.1.30:5060 SIP/2.0<o:p></o:p></p>
<p class="MsoNormal"> Via: SIP/2.0/UDP 10.15.1.12:5060;branch=z9hG4bKdt7p9k00dounet8ic600.1<o:p></o:p></p>
<p class="MsoNormal"> To: <sip:mynumber@10.15.1.30>;tag=2e3c2071-c895-4069-afc2-37a19b20637a<o:p></o:p></p>
<p class="MsoNormal"> From: <sip:a-number@10.15.1.12;user=phone>;tag=SDkbo9901-42090<o:p></o:p></p>
<p class="MsoNormal"> Call-ID: SDkbo9901-71a1d17456b829b4c422af61de9eee7e-ao32g50<o:p></o:p></p>
<p class="MsoNormal"> CSeq: 1 ACK<o:p></o:p></p>
<p class="MsoNormal"><span lang="FR"> Contact: <sip:a-number@10.15.1.12:5060;transport=udp><o:p></o:p></span></p>
<p class="MsoNormal"> *Route: <a href="sip:10.15.1.30;lr;ftag=SDkbo9901-42090">
sip:10.15.1.30;lr;ftag=SDkbo9901-42090</a><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The problem: this ACK gets not retransmitted to Asterisk<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">At first, I thought it was some sanity check but after disabling that I realized that it was in the WITHINDLG route.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">For the incoming ACK I get in the logs:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Jun 8 11:56:47 tone-0866-fe-2-qa /usr/local/sbin/kamailio[53240]: ALERT: <script>: Inside LOOSE route for ACK proto=UDP trans=4194304 from=sip:00754112601@10.15.1.12;user=phone route=sip:10.15.1.30;lr;ftag=SDkbo9901-42090 src_ip=10.15.1.12<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">And once the ACK is ready to be sent to Asterisk, the Route header has been removed and no Record-Route has been added so it fails.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Jun 8 11:56:44 tone-0866-fe-2-qa /usr/local/sbin/kamailio[53238]: INFO: rr [rr_mod.c:402]:
<span style="background:yellow;mso-highlight:yellow">pv_get_route_uri_f(): No route header present.</span><o:p></o:p></p>
<p class="MsoNormal">Jun 8 11:56:44 tone-0866-fe-2-qa /usr/local/sbin/kamailio[53238]: ALERT: <script>: ACK does not match transaction!! proto=UDP trans=4194304 from=sip:00754112601@10.15.1.12;user=phone route= src_ip=10.15.1.30<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">My WITHINDLG route looks like this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Handle requests within SIP dialogs
<o:p></o:p></p>
<p class="MsoNormal">route[WITHINDLG] { <o:p></o:p></p>
<p class="MsoNormal"> if (has_totag()) {
<o:p></o:p></p>
<p class="MsoNormal"> # sequential request withing a dialog should
<o:p></o:p></p>
<p class="MsoNormal"> # take the path determined by record-routing
<o:p></o:p></p>
<p class="MsoNormal"> if (loose_route()) {
<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("BYE")) {
<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_ALERT","Inside LOOSE route\n");
<o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_ACC); # do accounting ... <o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_ACCFAILED); # ... even if the transaction fails
<o:p></o:p></p>
<p class="MsoNormal"> } <o:p></o:p></p>
<p class="MsoNormal"> if ( is_method("ACK") ) {
<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_ALERT","<span style="background:yellow;mso-highlight:yellow">Inside LOOSE route for ACK</span> proto=$rP trans=$mf from=$fu route=$route_uri src_ip=$si \n");
<o:p></o:p></p>
<p class="MsoNormal"> # ACK is forwarded statelessy
<o:p></o:p></p>
<p class="MsoNormal"> route(NATMANAGE); <o:p></o:p></p>
<p class="MsoNormal"> }
<o:p></o:p></p>
<p class="MsoNormal"> route(RELAY); <o:p></o:p></p>
<p class="MsoNormal"> } else {
<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("SUBSCRIBE") && uri == myself) {
<o:p></o:p></p>
<p class="MsoNormal"> # in-dialog subscribe requests <o:p></o:p></p>
<p class="MsoNormal"> route(PRESENCE);
<o:p></o:p></p>
<p class="MsoNormal"> exit; <o:p></o:p></p>
<p class="MsoNormal"> }
<o:p></o:p></p>
<p class="MsoNormal"> if ( is_method("ACK") ) { <o:p></o:p></p>
<p class="MsoNormal"> if ( t_check_trans() ) {
<o:p></o:p></p>
<p class="MsoNormal"> # no loose-route, but stateful ACK; <o:p></o:p></p>
<p class="MsoNormal"> # must be an ACK after a 487
<o:p></o:p></p>
<p class="MsoNormal"> # or e.g. 404 from upstream server <o:p></o:p></p>
<p class="MsoNormal"> t_relay();
<o:p></o:p></p>
<p class="MsoNormal"> exit; <o:p></o:p></p>
<p class="MsoNormal"> } else {
<o:p></o:p></p>
<p class="MsoNormal"> # ACK without matching transaction ... ignore and discard
<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_ALERT","<span style="background:yellow;mso-highlight:yellow">ACK does not match transaction</span>!! proto=$rP trans=$mf from=$fu route=$route_uri src_ip=$si \n");
<o:p></o:p></p>
<p class="MsoNormal"> exit;
<o:p></o:p></p>
<p class="MsoNormal"> }
<o:p></o:p></p>
<p class="MsoNormal"> }
<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("404","Not here"); <o:p></o:p></p>
<p class="MsoNormal"> }
<o:p></o:p></p>
<p class="MsoNormal"> exit; <o:p></o:p></p>
<p class="MsoNormal"> }
<o:p></o:p></p>
<p class="MsoNormal">} <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks for reading this <span style="font-family:Wingdings">
J</span> Any idea about how to validate the transaction? t_check_trans is not being validated…<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Cheers, Francisco.<o:p></o:p></p>
</div>
</body>
</html>