My set up

Teams <—> sbc.ip-sentinel.com <—> pbx.ip-sentinel.com

I can create a call with audio from Teams -> PBX
I can hang up that call from Teams but not the PBX
I cannot route a call from PBX to teams.  Although the initial TLS handshake 
does happen

I’m pretty sure it’s something basic to do with headers on ACK & BYE but I just 
cannot spot what I’ve done wrong

This is the initial outbound message from opensips to teams which looks OK

James Hogbin
Director 
 
IP Sentinel 
t. +44 (0)20 3011 4150
m. +44 7786910895
w. https://www.ip-sentinel.com

INVITE sip:+448435577...@sip.pstnhub.microsoft.com:5061;transport=tls SIP/2.0
 Record-Route: 
<sip:sbc.ip-sentinel.com:5091;transport=tls;ftag=eect23Z290N9p;lr;r2=on>
 Record-Route: <sip:137.117.136.143:5060;ftag=eect23Z290N9p;lr;r2=on>
 Via: SIP/2.0/TLS 137.117.136.143:5091;branch=z9hG4bK48f8.81967713.0;i=e67586f7
 Via: SIP/2.0/TLS 
13.80.245.144:5081;rport=41795;received=10.0.0.4;branch=z9hG4bKac61XQKeXDXHB
 Max-Forwards: 68
 From: "James Hogbin" <sip:opensips@10.0.0.5:5091>;tag=eect23Z290N9p
 To: <sip:08435577721@10.0.0.5:5091>
 Call-ID: 0109ad37-0b1f-1239-bdba-000d3aada04e
 CSeq: 19879884 INVITE
 Contact: 
<sip:gw+c6ff36e8-d3de-4fe0-9f1b-9da2888c43a9@13.80.245.144:5081;transport=tls;transport=tls;gw=c6ff36e8-d3de-4fe0-9f1b-9da2888c43a9>
 User-Agent: FreeSWITCH
 Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, 
REFER, NOTIFY
 Supported: timer, path, replaces
 Allow-Events: talk, hold, conference, refer
 Content-Type: application/sdp
 Content-Disposition: session
 Content-Length: 1339
 X-FS-Support: update_display,send_info
 Remote-Party-ID: "James Hogbin" 
<sip:+442030114146@10.0.0.5:5091>;party=calling;screen=yes;privacy=off
 #015
 v=0
 o=FreeSWITCH 1588835231 1588835232 IN IP4 137.117,136.143
 s=FreeSWITCH
 c=IN IP4 137.117,136.143
 t=0 0
 m=audio 10432 RTP/SAVP 9 0 8 101 13
 a=rtpmap:9 G722/8000
 a=rtpmap:0 PCMU/8000
 a=rtpmap:8 PCMA/8000
 a=rtpmap:101 telephone-event/8000
 a=fmtp:101 0-16
 a=rtpmap:13 CN/8000
[stuff removed]
 a=ptime:20
 m=audio 13446 RTP/AVP 9 0 8 101 13
 a=rtpmap:9 G722/8000
 a=rtpmap:0 PCMU/8000
 a=rtpmap:8 PCMA/8000
 a=rtpmap:101 telephone-event/8000
 a=fmtp:101 0-16
 a=rtpmap:13 CN/8000
 a=ptime:20
 a=nortpproxy:yes

opensips.cfg Source_address(0) is my PBX address= 

alias = tls:sbc.ip-sentinel.com:5091
alias = udp:sbc.ip-sentinel.com:5060
alias = tcp:sbc.ip-sentinel.com:5060
advertised_address=137.117.136.143
listen=udp:10.0.0.5:5060
listen=tcp:10.0.0.5:5060
listen=tls:10.0.0.5:5091

####### Routing Logic ########

# main request routing logic

route{
        #xlog("L_INFO", "route SIP Message $mb");
        force_rport();

        if (!mf_process_maxfwd_header(10)) {
                send_reply(483,"Too Many Hops");
                exit;
        }

        if (is_method("OPTIONS")) {
                #xlog("[MS TEAMS] OPTIONS In\n");
                send_reply(200, "OK");
                exit;
        }

        # CANCEL processing
        if (is_method("CANCEL")) {
                if (t_check_trans())
                        t_relay();
                exit;
        }

        # absorb retransmissions, but do not create transaction
        t_check_trans();

        if (has_totag()) {

        # sequential request within a dialog should
        # take the path determined by record-routing

        if(is_method("INVITE") && !check_source_address(0)) {
            xlog("[INFO] In dialog Method=$rm, RURI=$ruri, SI=$si ,DU=$du\n");
            t_relay();
        }
        if ( !loose_route() ) {
            # we do record-routing for all our traffic, so we should not
            # receive any sequential requests without Route hdr.
            send_reply(404, "Not here");
            exit;
        }
        # route it out to whatever destination was set by loose_route()
        # in $du (destination URI).
        route(relay);
        exit;
        }

        # account only INVITEs
        if (is_method("INVITE")) {
                do_accounting("log");
        }

        if (is_method("INVITE") && !has_totag() && check_source_address(0)) {
                xlog("[ROUTE]Incoming call to MS: RURI=$ruri, SI=$si, M=$rm\n");
                strip(1);
                prefix("+44");
                record_route_preset("sbc.ip-sentinel.com:5091;transport=tls", 
"137.117.136.143:5060");
                add_rr_param(";r2=on");
                $rd="sip.pstnhub.microsoft.com";
                $rp=5061;
                route(relay);
        } else if (is_method("INVITE") && ! has_totag() && 
!check_source_address(0)) {
                record_route();
                xlog("[ROUTE]Incoming call from MS: RURI=$ruri, SI=$si, 
M=$rm\n");
                $rd="pbx.ip-sentinel.com";
                $rp=5081;
                route(relay);
        }

        if (!is_myself("$rd")) {
                append_hf("P-hint: outbound\r\n");
                route(relay);
        }

        # requests for my domain
        if (is_method("PUBLISH|SUBSCRIBE")) {
                send_reply(503, "Service Unavailable");
                exit;
        }

        if ($rU==NULL) {
                # request with no Username in RURI
                send_reply(484,"Address Incomplete");
                exit;
        }

        # do lookup with method filtering
        if (!lookup("location","m")) {
                t_reply(404, "Not Found");
                exit;
        }

        # when routing via usrloc, log the missed calls also
        do_accounting("log","missed");
        route(relay);
}

route[relay] {
        xlog("[INFO] route[relay] SIP Message \n$mb\n");
        # for INVITEs enable some additional helper routes
        if (is_method("INVITE") && ! has_totag() )  {

                t_newtran();
                t_on_reply("handle_nat");
                t_on_failure("missed_call");

                # if we have an application/sdp on our body, so we execute
                # the rtpproxy_offer
                if(has_body("application/sdp")){
                        xlog("[RTPPROXY] route[relay] we have sdp on this 
message\n$rm\n");
                        rtpproxy_offer("co", "137.117,136.143");
                }

        }

        xlog("[INFO] Method=$rm, RURI=$ruri, SI=$si ,DU=$du\n");
        if (!t_relay()) {
                send_reply(500,"Internal Error");
        }
        exit;
}

onreply_route[handle_nat] {
        xlog("[INFO] onreply_route[handle_nat]: RR=$rr, RS=$rs, SI=$si\n$mb\n");
        # we receive a reply, we need to check about application/sdp
        # on our body, if we have, we answer that
        if(is_method("ACK") && has_body("application/sdp")){
                xlog("[RTPPROXY] onreply_route[handle_nat] ACK 
rtpproxy_answer\n");
                rtpproxy_answer("co", "137.117,136.143");
        }
}

failure_route[missed_call] {
        if (t_was_cancelled()) {
                exit;
        }
}

local_route {
        $var(dst) = "pstnhub.microsoft.com";
        if (is_method("OPTIONS") && ($(ru{s.index, $var(dst)}) != NULL)) {
                append_hf("Contact: 
<sip:sbc.ip-sentinel.com:5091;transport=tls>\r\n");
                #xlog("[MS TEAMS] OPTIONS Out\n");
        }
}

IP Sentinel Disclaimer 
This communication is for the information of the person to whom it has been 
delivered and neither it nor any of its contents should be passed on to or used 
by any other person. IP Sentinel Ltd is a limited company registered in England 
and Wales under Registered Number 08648097. Registered Office: Newnhams Wood, 
Horsted Keynes, West Sussex, RH17 7BT. 
Disclaimer: Q3dhRSrm_disclaimer
_______________________________________________
Users mailing list
Users@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

Reply via email to