<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:"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;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am wondering if someone can please help us? We are struggling to get the BYE packet to go back to MS Teams when the call is initiated by Teams.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Our setup is as follows: <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">MS Teams < --- > SBC External 64.x.x.x < --- > SBC Internal 10.11.250.3 < --- > FreePBX (internal only) 10.11.250.1 < --- > SIP Provider < --- > Mobile (external number)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Now we are getting calls routed both ways with audio. The problem when the MS Teams calls the Mobile and the Mobile ends the call, the BYE doesn’t go back to MS Teams and FreePBX looks like it tries to send the BYE to the external IP address
 of the SBC, instead of via the internal then external.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This is what happens the mobile ends the call and the BYE packet is routed as follows:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Mobile --- > SIP Provider --- > FreePBX 10.11.250.1 ---> SBC External 64.x.x.x ---> LOST<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">How do we get the BYE packet to route correctly back through the SBC and onto MS?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Chris<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here is our script if that helps:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/* comment the next line to enable the auto discovery of local aliases<o:p></o:p></p>
<p class="MsoNormal">   based on reverse DNS on IPs */<o:p></o:p></p>
<p class="MsoNormal">auto_aliases=no<o:p></o:p></p>
<p class="MsoNormal">alias=tls:sbc01.froneri.com:5061<o:p></o:p></p>
<p class="MsoNormal">alias=udp:sbc01.froneri.com:5060<o:p></o:p></p>
<p class="MsoNormal">alias=tcp:sbc01.froneri.com:5060<o:p></o:p></p>
<p class="MsoNormal">#alias=tls:62.54.11.4:5061<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">listen=udp:10.11.250.3:5060 #as 62.54.11.41<o:p></o:p></p>
<p class="MsoNormal">listen=tcp:10.11.250.3:5060 #as 62.54.11.41<o:p></o:p></p>
<p class="MsoNormal">listen=tls:10.11.250.3:5061 #as 62.54.11.41<o:p></o:p></p>
<p class="MsoNormal"># listen=hep_tcp:10.11.250.3:9060<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#advertised_address=62.54.11.4<o:p></o:p></p>
<p class="MsoNormal">advertised_address=sbc01.froneri.com<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#### NAT module<o:p></o:p></p>
<p class="MsoNormal">loadmodule "nathelper.so"<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "natping_interval", 10)<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "ping_nated_only", 1)<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "sipping_bflag", "SIP_PING_FLAG")<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "sipping_from", "<a href="sip:pinger@62.54.11.4">sip:pinger@62.54.11.4</a>") #CUSTOMIZE ME<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "received_avp", "$avp(received_nh)")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####### Routing Logic ########<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># main request routing logic<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">route{<o:p></o:p></p>
<p class="MsoNormal">    #sip_trace("tid");<o:p></o:p></p>
<p class="MsoNormal">    force_rport();<o:p></o:p></p>
<p class="MsoNormal">    if (nat_uac_test("23")) {<o:p></o:p></p>
<p class="MsoNormal">                if (is_method("REGISTER")) {<o:p></o:p></p>
<p class="MsoNormal">                        fix_nated_register();<o:p></o:p></p>
<p class="MsoNormal">                        setbflag(NAT);<o:p></o:p></p>
<p class="MsoNormal">                } else {<o:p></o:p></p>
<p class="MsoNormal">                        fix_nated_contact();<o:p></o:p></p>
<p class="MsoNormal">                        setflag(NAT);<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">    if (!mf_process_maxfwd_header("10")) {<o:p></o:p></p>
<p class="MsoNormal">        sl_send_reply("483","Too Many Hops");<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">    if(is_method("OPTIONS")) {<o:p></o:p></p>
<p class="MsoNormal">          # xlog("L_INFO", "[MS TEAMS] OPTIONS In\n");<o:p></o:p></p>
<p class="MsoNormal">                  set_advertised_address("62.54.11.41");<o:p></o:p></p>
<p class="MsoNormal">                  set_advertised_port("5061");<o:p></o:p></p>
<p class="MsoNormal">          sl_send_reply("200", "OK");<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">     # CANCEL processing<o:p></o:p></p>
<p class="MsoNormal">        if (is_method("CANCEL")) {<o:p></o:p></p>
<p class="MsoNormal">                if (t_check_trans())<o:p></o:p></p>
<p class="MsoNormal">                                                sip_trace("tid");<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">        }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    # absorb retransmissions, but do not create transaction<o:p></o:p></p>
<p class="MsoNormal">    t_check_trans();<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    if (has_totag()) {<o:p></o:p></p>
<p class="MsoNormal">                sip_trace("tid");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                # handle hop-by-hop ACK (no routing required)<o:p></o:p></p>
<p class="MsoNormal">                if ( is_method("ACK") && t_check_trans() ) {                       
<o:p></o:p></p>
<p class="MsoNormal">                        xlog("[INFO] has totag & transaction id ACK pass straight out RURI=$ruri, SI=$si, M=$rm\n");<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">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        # sequential request within 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(is_method("INVITE") && !check_source_address("0")) {<o:p></o:p></p>
<p class="MsoNormal">            xlog("[INFO] In dialog Method=$rm, RURI=$ruri, SI=$si ,DU=$du\n");<o:p></o:p></p>
<p class="MsoNormal">                    xlog("[ROUTE] t_relay Route SIP Message \n$mb\n");<o:p></o:p></p>
<p class="MsoNormal">            t_relay();<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        if ( !loose_route() ) {<o:p></o:p></p>
<p class="MsoNormal">            # we do record-routing for all our traffic, so we should not<o:p></o:p></p>
<p class="MsoNormal">            # receive any sequential requests without Route hdr.<o:p></o:p></p>
<p class="MsoNormal">            sl_send_reply("404", "Not here");<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">        # route it out to whatever destination was set by loose_route()<o:p></o:p></p>
<p class="MsoNormal">        # in $du (destination URI).<o:p></o:p></p>
<p class="MsoNormal">                #xlog("[INFO] sequential requests Route SIP Message \n$mb\n");<o:p></o:p></p>
<p class="MsoNormal">                xlog("[INFO] has totag RURI=$ruri, SI=$si, M=$rm\n");<o:p></o:p></p>
<p class="MsoNormal">        route(relay);<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">    # record routing<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (is_method("INVITE") && ! has_totag() && check_source_address("0")) {<o:p></o:p></p>
<p class="MsoNormal">        xlog("[ROUTE] Incoming call from PBX to MS TEAMS: RURI=$ruri, SI=$si, M=$rm\n");<o:p></o:p></p>
<p class="MsoNormal">                sip_trace("tid");<o:p></o:p></p>
<p class="MsoNormal">        strip(1);<o:p></o:p></p>
<p class="MsoNormal">        do_routing("1");<o:p></o:p></p>
<p class="MsoNormal">        #prefix("+49");<o:p></o:p></p>
<p class="MsoNormal">                record_route_preset("sbc01.froneri.com:5061;transport=tls;r2=on", "10.11.250.3:5060;r2=on");<o:p></o:p></p>
<p class="MsoNormal">                #record_route_preset("sbc01.froneri.com:5061;transport=tls");<o:p></o:p></p>
<p class="MsoNormal">        #add_rr_param(";r2=on");<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("INVITE") && ! has_totag() && !check_source_address("0")) {<o:p></o:p></p>
<p class="MsoNormal">                    sip_trace("tid");<o:p></o:p></p>
<p class="MsoNormal">                    create_dialog();<o:p></o:p></p>
<p class="MsoNormal">                    t_on_reply("handle_nat");<o:p></o:p></p>
<p class="MsoNormal">                    #record_route_preset("10.11.250.3:5060;r2=on", "sbc01.froneri.com:5061;transport=tls;r2=on");<o:p></o:p></p>
<p class="MsoNormal">                    record_route();<o:p></o:p></p>
<p class="MsoNormal">                    xlog("[ROUTE] Incoming call from MS TEAMS to PBX: RURI=$ruri, SI=$si, M=$rm\n");<o:p></o:p></p>
<p class="MsoNormal">                    rewritehostport("10.11.250.1:5060");<o:p></o:p></p>
<p class="MsoNormal">                    force_send_socket(udp:10.11.250.3:5060);<o:p></o:p></p>
<p class="MsoNormal">       route(relay);<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (check_route_param("nat=yes")){<o:p></o:p></p>
<p class="MsoNormal">                setflag(NAT);<o:p></o:p></p>
<p class="MsoNormal">                #route it out to whatever destination was set by loose_route()<o:p></o:p></p>
<p class="MsoNormal">                #in $du (destination URI).<o:p></o:p></p>
<p class="MsoNormal">                record_route();<o:p></o:p></p>
<p class="MsoNormal">                route(relay);<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    record_route();<o:p></o:p></p>
<p class="MsoNormal">    route(relay);<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">route[relay] {<o:p></o:p></p>
<p class="MsoNormal">        if (isflagset(NAT)) {<o:p></o:p></p>
<p class="MsoNormal">                add_rr_param(";nat=yes");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">                xlog("[ON ROUTE] route[relay]: Method=$rm, RURI=$ruri, SI=$si, M=$rm\n");<o:p></o:p></p>
<p class="MsoNormal">                if (is_method("INVITE") && ! has_totag() ) {<o:p></o:p></p>
<p class="MsoNormal">                                t_newtran();  <o:p></o:p></p>
<p class="MsoNormal">                t_on_reply("handle_nat");<o:p></o:p></p>
<p class="MsoNormal">               t_on_failure("missed_call");<o:p></o:p></p>
<p class="MsoNormal">                                # if we have an application/sdp on our body, so we execute<o:p></o:p></p>
<p class="MsoNormal">                # the rtpproxy_offer<o:p></o:p></p>
<p class="MsoNormal">                if(has_body("application/sdp")){<o:p></o:p></p>
<p class="MsoNormal">                        xlog("[RTPPROXY] route[relay] we have sdp on this message\n$rm\n");<o:p></o:p></p>
<p class="MsoNormal">                        rtpproxy_offer("co", "62.54.11.4");<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                if(is_method("ACK") && has_body("application/sdp")){<o:p></o:p></p>
<p class="MsoNormal">                                xlog("[RTPPROXY] onreply_route[handle_nat] ACK rtpproxy_answer\n");<o:p></o:p></p>
<p class="MsoNormal">                                rtpproxy_answer("co", "62.54.11.4");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                xlog("[INFO] Method=$rm, RURI=$ruri, SI=$si ,DU=$du\n");<o:p></o:p></p>
<p class="MsoNormal">        if (!t_relay()) {<o:p></o:p></p>
<p class="MsoNormal">                send_reply("500","Internal Error");<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">branch_route[per_branch_ops] {<o:p></o:p></p>
<p class="MsoNormal">                xlog("[INFO] New branch at $ru\n");<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">onreply_route[handle_nat] {<o:p></o:p></p>
<p class="MsoNormal">                xlog("[INFO] onreply_route[handle_nat]: RR=$rr, RS=$rs, SI=$si\n$mb\n");<o:p></o:p></p>
<p class="MsoNormal">        # we receive a reply, we need to check about application/sdp<o:p></o:p></p>
<p class="MsoNormal">        # on our body, if we have, we answer that<o:p></o:p></p>
<p class="MsoNormal">        if(is_method("ACK") && has_body("application/sdp")){<o:p></o:p></p>
<p class="MsoNormal">                xlog("[RTPPROXY] onreply_route[handle_nat] ACK rtpproxy_answer\n");<o:p></o:p></p>
<p class="MsoNormal">                rtpproxy_answer("co", "62.54.11.4");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        if (nat_uac_test("1")){<o:p></o:p></p>
<p class="MsoNormal">                xlog("[INFO] nat_uac_test=1: RR=$rr, RS=$rs, SI=$si\n$mb\n");<o:p></o:p></p>
<p class="MsoNormal">         fix_nated_contact();<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        if ( isflagset(NAT) && has_body("application/sdp") ){<o:p></o:p></p>
<p class="MsoNormal">                xlog("[INFO] isflagset[NAT] && has_body sdp RR=$rr, RS=$rs, SI=$si\n$mb\n");<o:p></o:p></p>
<p class="MsoNormal">                rtpproxy_answer("co", "62.54.11.4");<o:p></o:p></p>
<p class="MsoNormal">        xlog("incoming reply\n");<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">failure_route[missed_call] {<o:p></o:p></p>
<p class="MsoNormal">        if (t_was_cancelled()) {<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">local_route {<o:p></o:p></p>
<p class="MsoNormal">                $var(dst) = "pstnhub.microsoft.com";<o:p></o:p></p>
<p class="MsoNormal">                if (is_method("OPTIONS") && ($(ru{s.index, $var(dst)}) != NULL)){<o:p></o:p></p>
<p class="MsoNormal">                set_advertised_address("62.54.11.41");<o:p></o:p></p>
<p class="MsoNormal">                set_advertised_port("5061");<o:p></o:p></p>
<p class="MsoNormal">                append_hf("Contact: <<a href="sip:sbc01.froneri.com:5061;transport=tls">sip:sbc01.froneri.com:5061;transport=tls</a>>\r\n");<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</body>
</html>