<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>