<div dir="ltr"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Hello,</div><div><br></div><div>I'm setting up a Kamailio MSFT Teams SBC that is connected to our SIP trunk provider. This server is directly connected to the Internet and not behind a NAT routing. </div><div><br></div><div>It is successfully processing invites from both sides (MSFT Teams and SIP trunk). Unfortunately the ACKs and CANCEL messages are not relaying to Teams. In the sipdump i can't find these messages. </div><div><br></div><div>Does anyone see what I am doing wrong? Below you can find my config</div><div><br></div><div>#!KAMAILIO<br><br>####### Defined Values #########<br><br>#!define MULTIDOMAIN 0<br><br># - flags<br>#   FLT_ - per transaction (message) flags<br># FLB_ - per branch flags<br>#!define FLT_ACC 1<br>#!define FLT_ACCMISSED 2<br>#!define FLT_ACCFAILED 3<br>#!define FLT_NATS 5<br><br>#!define FLB_NATB 6<br>#!define FLB_NATSIPPING 7<br><br>#!define FROM_TEAMS 11<br>#!define FROM_PBX 12<br><br>######## Define Modules ###########<br>#!define WITH_RTPENGINE<br>#!define WITH_TLS<br>#!define WITH_SIPDUMP<br>#!define WITH_DISPATCH<br><br>####### Global Parameters #########<br><br>### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR<br>debug=2<br>log_stderror=no<br><br>memdbg=5<br>memlog=5<br><br>log_facility=LOG_LOCAL0<br>log_prefix="{$mt $hdr(CSeq) $ci} "<br><br>/* number of SIP routing processes */<br>children=2<br><br>/* uncomment the next line to disable TCP (default on) */<br># disable_tcp=yes<br><br>alias=SBC_FQDN<br><br>/* listen addresses */<br>listen=udp:PUBLIC_IP:5060 advertise SBC_FQDN:5060<br>#!ifdef WITH_TLS<br>listen=tls:PUBLIC_IP:5061 advertise SBC_FQDN:5061<br>#!endif<br><br>server_header= "Server: ABC SBC"<br>user_agent_header= "User-Agent: ABC SBC"<br><br><br>###### TLS Enable ######<br>#!ifdef WITH_TLS<br>enable_tls=yes<br>#tcp_connect_timeout=1000<br><br>tcp_accept_no_cl=yes<br>tcp_async = yes<br>tcp_connection_lifetime=600<br><br>/* upper limit for TLS connections */<br>tls_max_connections=2048<br>#!endif<br><br><br>####### Custom Parameters #########<br><br>/* These parameters can be modified runtime via RPC interface<br> * - see the documentation of 'cfg_rpc' module.<br> *<br> * Format: <a href="http://group.id/" target="_blank">group.id</a> = value 'desc' description<br> * Access: $sel(<a href="http://cfg_get.group.id/" target="_blank">cfg_get.group.id</a>) or @<a href="http://cfg_get.group.id/" target="_blank">cfg_get.group.id</a> */<br><br>####### Modules Section ########<br><br>/* set paths to location of modules */<br>loadmodule "jsonrpcs.so"<br>loadmodule "kex.so"<br>loadmodule "corex.so"<br>loadmodule "tm.so"<br>loadmodule "tmx.so"<br>loadmodule "sl.so"<br>loadmodule "rr.so"<br>loadmodule "pv.so"<br>loadmodule "maxfwd.so"<br>loadmodule "textops.so"<br>loadmodule "siputils.so"<br>loadmodule "xlog.so"<br>loadmodule "sanity.so"<br>loadmodule "ctl.so"<br>loadmodule "cfg_rpc.so"<br>loadmodule "acc.so"<br>loadmodule "counters.so"<br><br>#!ifdef WITH_RTPENGINE<br>loadmodule "rtpengine.so"<br>#!endif<br><br>#!ifdef WITH_TLS<br>loadmodule "tls.so"<br>#!endif<br><br>#!ifdef WITH_SIPDUMP<br>loadmodule "sipdump.so"<br>#!endif<br><br>#!ifdef WITH_DISPATCH<br>loadmodule "dispatcher.so"<br>#!endif<br><br># ----------------- setting module-specific parameters ---------------<br><br>#!ifdef WITH_RTPENGINE<br># ----- rtpengine params -----+<br>modparam("rtpengine", "rtpengine_sock", "udp:<a href="http://127.0.0.1:12222/" target="_blank">127.0.0.1:12222</a>")<br>#!endif<br><br>#!ifdef WITH_TLS<br># ----- tls params -----+<br>modparam("tls", "xavp_cfg", "tls")<br>modparam("tls", "config", "/etc/kamailio/tls.cfg")<br>modparam("tls", "connection_timeout", 10)<br>modparam("tls", "ssl_release_buffers", 1)<br>modparam("tls", "send_close_notify", 1)<br>modparam("tls", "session_cache", 0)<br><br>#!endif<br><br>#!ifdef WITH_SIPDUMP<br>modparam("sipdump", "enable", 1)<br>#!endif<br><br>#!ifdef WITH_DISPATCH<br>#---------- dispatch<br>modparam("dispatcher", "ds_probing_mode", 1)<br>modparam("dispatcher", "ds_ping_interval", 300)<br>#!endif<br><br><br># ----- jsonrpcs params -----<br>modparam("jsonrpcs", "pretty_format", 1)<br>/* set the path to RPC fifo control file */<br># modparam("jsonrpcs", "fifo_name", "/run/kamailio/kamailio_rpc.fifo")<br>/* set the path to RPC unix socket control file */<br># modparam("jsonrpcs", "dgram_socket", "/run/kamailio/kamailio_rpc.sock")<br><br># ----- ctl params -----<br>/* set the path to RPC unix socket control file */<br># modparam("ctl", "binrpc", "unix:/run/kamailio/kamailio_ctl")<br><br># ----- tm params -----<br># auto-discard branches from previous serial forking leg<br>modparam("tm", "failure_reply_mode", 3)<br># default retransmission timeout: 30sec<br>modparam("tm", "fr_timer", 30000)<br># default invite retransmission timeout after 1xx: 120sec<br>modparam("tm", "fr_inv_timer", 120000)<br><br># ----- rr params -----<br># set next param to 1 to add value to ;lr param (helps with some UAs)<br>modparam("rr", "enable_full_lr", 0)<br># do not append from tag to the RR (no need for this script)<br>modparam("rr", "append_fromtag", 0)<br><br># ----- acc params -----<br>/* what special events should be accounted ? */<br>modparam("acc", "early_media", 0)<br>modparam("acc", "report_ack", 0)<br>modparam("acc", "report_cancels", 0)<br>/* by default ww do not adjust the direct of the sequential requests.<br> * if you enable this parameter, be sure the enable "append_fromtag"<br> * in "rr" module */<br>modparam("acc", "detect_direction", 0)<br>/* account triggers (flags) */<br>modparam("acc", "log_flag", FLT_ACC)<br>modparam("acc", "log_missed_flag", FLT_ACCMISSED)<br>modparam("acc", "log_extra",<br>  "src_user=$fU;src_domain=$fd;src_ip=$si;"<br>  "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<br>modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)<br><br>####### Routing Logic ########<br><br><br>/* Main SIP request routing logic<br> * - processing of any incoming SIP request starts with this route<br> * - note: this is the same as route { ... } */<br>request_route {<br>  # per request initial checks<br>  route(REQINIT);<br><br>  #check who is the sender<br>  route(INITCHECK);<br><br>  # CANCEL processing<br>  if (is_method("CANCEL")) {<br>    if (t_check_trans()) {<br>      route(RELAY);<br>    }<br>    exit;<br>  }<br><br>  # handle retransmissions<br>  if (!is_method("ACK")) {<br>    if(t_precheck_trans()) {<br>      t_check_trans();<br>      exit;<br>    }<br>    t_check_trans();<br>  }<br><br>  # handle requests within SIP dialogs<br>  route(WITHINDLG);<br><br>  ### only initial requests (no To tag)<br><br>  # record routing for dialog forming requests (in case they are routed)<br>  # - remove preloaded route headers<br>  remove_hf("Route");<br>  if (is_method("INVITE|SUBSCRIBE")) {<br>    record_route();<br>  }<br><br>  # account only INVITEs<br>  if (is_method("INVITE")) {<br>    setflag(FLT_ACC); # do accounting<br>  }<br><br>  if ($rU==$null) {<br>    # request with no Username in RURI<br>    sl_send_reply("484","Address Incomplete");<br>    exit;<br>  }<br><br>  # update $du to set the destination address for proxying<br>  #$du = "sip:" + $rd + ":9";<br> <br>  route(RELAY);<br>  exit;<br>}<br><br>route[INITCHECK] {<br>  if(from_uri =~ ".*<a href="http://microsoft.com/" target="_blank">microsoft.com</a>")<br>  {  <br>    setflag(FROM_TEAMS);<br>    $du = "sip:" + "PBX_IP";<br>    route(HANDLE_RTP_FROM_TEAMS);<br>  } else if(from_uri =~ ".*" + "PBX_IP")<br>  {<br>    setflag(FROM_PBX);<br>    $du="sip:<a href="http://sip.pstnhub.microsoft.com/" target="_blank">sip.pstnhub.microsoft.com</a>;transport=tls";<br>    route(HANDLE_RTP_FROM_PBX);<br>  } else {<br>    exit;<br>  }<br>}<br><br>#Manage RTP & transcoding comming from Teams to PBX<br>route[HANDLE_RTP_FROM_TEAMS] {<br> <br>  if (has_body("application/sdp"))<br>  {<br>    t_on_reply("PBX_REPLY_TO_TEAMS");<br>    rtpengine_manage("RTP codec-mask=all codec-transcode=PCMA replace-origin replace-session-connection ICE=remove");<br>    record_route();<br>    t_relay_to_udp("PBX_IP","5060");<br>  }<br> <br><br>}<br><br>#Manage RTP & transcoding comming from PBX to Teams<br>route[HANDLE_RTP_FROM_PBX] {<br> <br>    if (has_body("application/sdp"))<br>    {<br>      t_on_reply("TEAMS_REPLY_TO_PBX");<br>     <br>      rtpengine_manage("SRTP codec-mask=all ICE=force codec-transcode=PCMA replace-origin replace-session-connection");<br>      record_route_preset("SBC_FQDN:5061;transport=tls");<br>      add_rr_param(";r2=on");<br><br>      $rd = "<a href="http://sip.pstnhub.microsoft.com/" target="_blank">sip.pstnhub.microsoft.com</a>";<br>      $td = "SBC_FQDN";<br>      $fd = "SBC_FQDN";<br><br><br>      #Set TLS SNI (server name & server id)<br>      $xavp(tls=>server_name) = "SBC_FQDN";<br>      $xavp(tls=>server_id) = "SBC_FQDN";<br><br>      t_relay();<br>    }<br>}<br><br><br># Wrapper for relaying requests<br>route[RELAY] {<br><br>  # enable additional event routes for forwarded requests<br>  # - serial forking, RTP relaying handling, a.s.o.<br>  if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {<br>    if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");<br>  }<br>  if (is_method("INVITE|SUBSCRIBE|UPDATE")) {<br>    if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");<br>  }<br>  if (is_method("INVITE")) {<br>    if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");<br>  }<br><br>  if (!t_relay()) {<br>    sl_reply_error();<br>  }<br>  exit;<br>}<br><br># Per SIP request initial checks<br>route[REQINIT] {<br>  if($ua =~ "friendly-scanner|sipcli|VaxSIPUserAgent") {<br>    # silent drop for scanners - uncomment next line if want to reply<br>    # sl_send_reply("200", "OK");<br>    exit;<br>  }<br><br>  if (!mf_process_maxfwd_header("10")) {<br>    sl_send_reply("483","Too Many Hops");<br>    exit;<br>  }<br><br>  if(is_method("OPTIONS")) {<br>    sl_send_reply("200","Keepalive");<br>    exit;<br>  }<br><br>  if(!sanity_check("1511", "7")) {<br>    xlog("Malformed SIP message from $si:$sp\n");<br>    exit;<br>  }<br>}<br><br># Handle requests within SIP dialogs<br>route[WITHINDLG] {<br>  if (!has_totag()) return;<br><br>  #Teams reINVITEs<br>  if(isflagset(FROM_TEAMS)) {<br>    t_relay_to_udp("PBX_IP","5060");<br>    exit;<br>  }<br><br>  # sequential request withing a dialog should<br>  # take the path determined by record-routing<br>  if (loose_route()) {<br>    if (is_method("BYE")) {<br>      setflag(FLT_ACC); # do accounting ...<br>      setflag(FLT_ACCFAILED); # ... even if the transaction fails<br><br>      #set coresponding cert on transactions<br>      if($fd == "SBC_FQDN") {<br>        $xavp(tls=>server_name) = "SBC_FQDN";<br>        $xavp(tls=>server_id) = "SBC_FQDN";<br>      }<br><br>    } else if ( is_method("NOTIFY") ) {<br>      # Add Record-Route for in-dialog NOTIFY as per RFC 6665.<br>      record_route();<br>    }<br><br>    route(RELAY);<br>    exit;<br>  }<br><br>  if ( is_method("ACK") ) {<br>    if ( t_check_trans() ) {<br>      # no loose-route, but stateful ACK;<br>      # must be an ACK after a 487<br>      # or e.g. 404 from upstream server<br>      route(RELAY);<br>      exit;<br>    } else {<br>      # ACK without matching transaction ... ignore and discard<br>      exit;<br>    }<br>  }<br>  sl_send_reply("404","Not here");<br>  exit;<br>}<br><br># Manage outgoing branches<br>branch_route[MANAGE_BRANCH] {<br>  xdbg("new branch [$T_branch_idx] to $ru\n");<br>}<br><br># Manage incoming replies<br>onreply_route[MANAGE_REPLY] {<br>  xdbg("incoming reply\n");<br>}<br><br>#PBX On Reply<br>onreply_route[PBX_REPLY_TO_TEAMS]<br>{<br>    if (has_body("application/sdp"))<br>  {<br>        rtpengine_manage("SRTP codec-mask=all codec-transcode=PCMA replace-origin replace-session-connection media-address=PUBLIC_IP");<br>  }<br>}<br><br><br>#From Teams On Reply<br>onreply_route[TEAMS_REPLY_TO_PBX]<br>{<br>    if (has_body("application/sdp"))<br>  {<br>        rtpengine_manage("RTP codec-mask=all codec-transcode=PCMA replace-origin replace-session-connection media-address=PUBLIC_IP");<br>  }<br>}<br><br># Manage failure routing cases<br>failure_route[MANAGE_FAILURE] {<br>  if (t_is_canceled()) exit;<br>}<br><br>event_route[tm:local-request] {<br>        if(is_method("OPTIONS") && $ru =~ "<a href="http://pstnhub.microsoft.com/" target="_blank">pstnhub.microsoft.com</a>") {<br>               append_hf("Contact: <sip:SBC_FQDN:5061;transport=tls>\r\n");<br>        }<br>        xlog("L_INFO", "Sent out tm request: $mb\n");<br>}</div></div></div></div></div>