[OpenSIPS-Users] send_reply from branch_route

Bogdan-Andrei Iancu bogdan at opensips.org
Thu Jan 26 09:20:11 EST 2017


Hi Pat,

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.

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.

Regards,

Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
http://www.opensips-solutions.com

On 01/26/2017 05:08 AM, Pat Burke wrote:
> Hello,
>
> 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
>             "CRITICAL:tm:w_t_reply: unsupported route_type (8)".
>
> In a nutshell, the flow is
>
> 1)  Call flow leads to RELAY_TO_EGRESS to make the first call.
> 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)
> 3)  BRANCH_TO_EGRESS does some final setup (setting up headers, etc) 
> and sets the t_on_failure to "egress_failed"
> 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
> 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).
>
> In 1.11 without branching this worked fine.
>
> What is the correct way to architect the code.  Here is the general 
> structure I have now.
>
> ...
>
> route[RELAY_TO_EGRESS] {
>     route(OUTBOUND_SETUP);
>     t_on_branch("BRANCH_TO_EGRESS");
>
>     if (!t_relay("0x01")) {
>         send_reply("500","Internal Error");
>         exit;
>     }
> }
>
> route[OUTBOUND_SETUP] {
> ...
>                 if ($avp(current_carrier_idx) == $avp(out_routes_no)) {
>                     route(NO_ROUTES_AVAILABLE, "No more routes 
> available.");
>                 }
> ...
>     if (!route(VALIDATE_CARRIER)) {
>         route(TRY_CARRIER_FAILOVER, "503", "In supplemental exclusion.");
>         return(1);
>     }
> }
>
> branch_route[BRANCH_TO_EGRESS] {
> ...
>     t_on_failure("egress_failed");
> ...
> }
>
> route[NO_ROUTES_AVAILABLE] {
>     xlog("L_WARN", "$rU SCRIPT:EGRESS:WARN: No carriers to route to. 
>  Ending the call \n");
>     $avp(error_reason) := $avp(error_reason) + $param(1);
>     t_reply("503","Service not available.");
>     exit;
> }
>
> failure_route[egress_failed] {
> ...
>     if (t_was_cancelled()) {
>         route(ADD_STATUS_ERROR_REASON_TO_HISTORY, $(<reply>rs), 
> $(<reply>rr));
>         xlog("L_WARN", "$rU SCRIPT:RADVANCE:WARN: Do not route advance 
> replying with $(<reply>rs) - $(<reply>rr) \n");
>         $avp(error_reason) := $avp(error_reason) + "Call Terminated 
> with " + $(<reply>rs) + ".";
>         t_reply("487","Request cancelled");
>         exit;
>     }
>
>     if ($(<reply>rs) != null) {
>         route(TRY_CARRIER_FAILOVER, $(<reply>rs), $(<reply>rr));
>     } else {
>         $avp(error_reason) := $avp(error_reason) + "Server Error V2 - 
> empty response (rs).";
>         route(TRY_CARRIER_FAILOVER, "503", "Server Error");
>     }
>
>     exit;
> }
>
> route[TRY_CARRIER_FAILOVER] {
> ....
>    route(RELAY_TO_EGRESS);
> }
> }
>
> Thanks,
> Pat Burke
>
>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20170126/67364204/attachment-0001.html>


More information about the Users mailing list