<head><title></title></head>
<body><div class="iw_mail" dir="ltr">Thanks Bogdan,<div><br></div>
<div>I was able to make it work by making the decision to end the call prior to calling the branch.  Works like a charm.<br><br><div class="signature">
<div style="font-family: arial, helvetica, sans-serif; font-size: 16px;"><span data-mce-style="color: #808080; font-family: arial,helvetica,sans-serif; font-size: 11pt;" style="color: rgb(128, 128, 128); font-size: 11pt;">Regards,</span></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 16px;">
<span data-mce-style="color: #808080; font-family: arial,helvetica,sans-serif; font-size: 11pt;" style="color: rgb(128, 128, 128); font-size: 11pt;"><strong>Pat Burke</strong></span><br><div><br></div>
</div>
</div>
<br><blockquote class="reply_block" dir="ltr" style="border-left: 2px solid blue; margin: 5pt 0 5pt 10pt; padding: 0 0 0 5pt; font-size: 13px; font-family: tahoma,helvetica,sans-serif;">
<hr size="1">-----Original Message-----<br>From: "Bogdan-Andrei Iancu" <<a href="mailto:bogdan@opensips.org">bogdan@opensips.org</a>><br>To: "OpenSIPS users mailling list" <<a href="mailto:users@lists.opensips.org">users@lists.opensips.org</a>>, "Pat Burke" <<a href="mailto:pat@voxtelesys.com">pat@voxtelesys.com</a>><br>Date: 01/26/17 08:20<br>Subject: Re: [OpenSIPS-Users] send_reply from branch_route<br><br><tt>Hi Pat,<br><br>In the branch route you cannot use any signaling function - the branch route is there just for exploring and changing the SIP message (in a per branch manner). What you can do is to drop a branch (to tell OpenSIPS not to send that branch out) by using the "drop()" function.<br><br>Still, you can do parallel forking without the need of branch route - again, the branch route is optionally there if you want to individually changes the branches (like for the branch going to a GW to add the RPID hdr, but not for the branch going to a user). If you deal with the branches in the same way, there is no need for a branch route.<br><br>Regards,<br></tt><pre class="moz-signature" cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer<a class="moz-txt-link-freetext" href="http://www.opensips-solutions.com">http://www.opensips-solutions.com</a></pre>
<div class="moz-cite-prefix">On 01/26/2017 05:08 AM, Pat Burke wrote:<br>
</div>
<blockquote cite="mid:1483b0bc32bcb3024971a5da985683d8@voxtelesys.com" type="cite">
<div class="iw_mail" dir="ltr">Hello,<div><br></div>
<div>I have an opensips server that I use for routing. I receive a call and will attempt multiple carriers to complete the call. My understanding is that in 2.2 I had to use branch_route to be able to make multiple attempts. What I am running into now is that when I get a SIP response that indicates that I don't want to try another carrier, or I have tried as many as I want to try, then I want to send a SIP response (ether the response from the last carrier or a response of my own) and end the call. When I t_reply I get the following error</div>
<div>"CRITICAL:tm:w_t_reply: unsupported route_type (8)".</div>
<div><br></div>
<div>In a nutshell, the flow is</div>
<div><br></div>
<div>1) Call flow leads to RELAY_TO_EGRESS to make the first call.</div>
<div>2) RELAY_TO_EGRESS sets up the call information by calling OUTBOUND_SETUP (which will attempt to terminate the call if there are errors or no more carriers) and then creates a branch to handle the attempt (BRANCH_TO_EGRESS)</div>
<div>3) BRANCH_TO_EGRESS does some final setup (setting up headers, etc) and sets the t_on_failure to "egress_failed"</div>
<div>4) If the call attempt fails, "egress_failed" is called which may want to terminate the call (send_reply...) or attempt again by calling TRY_CARRIER_FAILOVER</div>
<div>5) TRY_CARRIER_FAILOVER will start the process again by calling RELAY_TO_EGRESS (which usually ends in the call to OUTBOUND_SETUP because that is where it determines when no more attempts are going to be made).</div>
<div><br></div>
<div>In 1.11 without branching this worked fine.</div>
<div><br></div>
<div>
<div>What is the correct way to architect the code. Here is the general structure I have now.</div>
<div><br></div>
</div>
<div>...</div>
<div><br></div>
<div>
<div>route[RELAY_TO_EGRESS] {</div>
<div>route(OUTBOUND_SETUP);</div>
<div>t_on_branch("BRANCH_TO_EGRESS");</div>
<div><br></div>
<div>if (!t_relay("0x01")) {</div>
<div>send_reply("500","Internal Error");</div>
<div>exit;</div>
<div>}</div>
<div>}</div>
<div><br></div>
<div>
<div>route[OUTBOUND_SETUP] {</div>
<div>...</div>
<div>if ($avp(current_carrier_idx) == $avp(out_routes_no)) {</div>
<div>route(NO_ROUTES_AVAILABLE, "No more routes available.");</div>
<div>}</div>
<div>...</div>
</div>
<div>if (!route(VALIDATE_CARRIER)) {</div>
<div>route(TRY_CARRIER_FAILOVER, "503", "In supplemental exclusion.");</div>
<div>return(1);</div>
<div>}</div>
<div>}</div>
<div><br></div>
<div><div>branch_route[BRANCH_TO_EGRESS] {</div></div>
<div>...</div>
<div>t_on_failure("egress_failed");</div>
<div>...</div>
<div>}</div>
<div><br></div>
<div>route[NO_ROUTES_AVAILABLE] {</div>
<div>xlog("L_WARN", "$rU SCRIPT:EGRESS:WARN: No carriers to route to. Ending the call \n");</div>
<div>$avp(error_reason) := $avp(error_reason) + $param(1);</div>
<div>t_reply("503","Service not available.");</div>
<div>exit;</div>
<div>}</div>
<div><br></div>
<div>
<div>failure_route[egress_failed] {</div>
<div>...</div>
<div>if (t_was_cancelled()) {</div>
<div>route(ADD_STATUS_ERROR_REASON_TO_HISTORY, $(<reply>rs), $(<reply>rr));</div>
<div>xlog("L_WARN", "$rU SCRIPT:RADVANCE:WARN: Do not route advance replying with $(<reply>rs) - $(<reply>rr) \n");</div>
<div>$avp(error_reason) := $avp(error_reason) + "Call Terminated with " + $(<reply>rs) + ".";</div>
<div>t_reply("487","Request cancelled");</div>
<div>exit;</div>
<div>}</div>
<div><br></div>
<div>if ($(<reply>rs) != null) {</div>
<div>route(TRY_CARRIER_FAILOVER, $(<reply>rs), $(<reply>rr));</div>
<div>} else {</div>
<div>$avp(error_reason) := $avp(error_reason) + "Server Error V2 - empty response (rs).";</div>
<div>route(TRY_CARRIER_FAILOVER, "503", "Server Error");</div>
<div>}</div>
<div><br></div>
<div>exit;</div>
<div>}</div>
</div>
<div><br></div>
<div><div>route[TRY_CARRIER_FAILOVER] {</div></div>
<div>....</div>
<div>
<div>route(RELAY_TO_EGRESS);</div>
<div>}</div>
</div>
<div>}</div>
<div><br></div>
<div>Thanks,</div>
<div>Pat Burke</div>
<div><div style="font-family: arial, helvetica, sans-serif; font-size: 16px;">
<br><div><br></div>
</div></div>
</div>
</div>
<br><fieldset class="mimeAttachmentHeader"></fieldset>
<br><pre wrap="">_______________________________________________
Users mailing list<a class="moz-txt-link-abbreviated" href="mailto:Users@lists.opensips.org">Users@lists.opensips.org</a><a class="moz-txt-link-freetext" href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a></pre>
</blockquote>
<br>
</blockquote>
</div>
</div></body>