The previous solution won't work because you can't call t_was_cancelled() in the main route... You should:

1) set $T_fr_timeout and $T_fr_inv_timeout to 1
2) t_on_failure(...) [1]
3) t_relay() to a bogus gateway [2]
4) catch the 408 timeout in the failure route. Using an $avp counter, go back to step 1) until 30 tries have been done. In this failure route, you may now also use t_was_cancelled().

[1] : http://www.opensips.org/Documentation/Script-Routes-2-1#toc3
[2] : http://www.opensips.org/html/docs/modules/2.1.x/tm.html#trelay-1

On 03.03.2015 14:57, Liviu Chircu wrote:
Hello merlin,

First of all, from a user's perspective, a Post-Dial Delay of up to 30 seconds should be quite annoying. Your SIP logic will also increase the amount of traffic received by your platform, due to lots of retransmissions for all failed calls.

That being said, here is what you should add in order to make it work:

t_newtran();
...
while (...) {
    if (t_was_cancelled()) {
        t_reply("487", "Request Cancelled");
        exit;
    }
    ...
}

Best regards,
Liviu Chircu
OpenSIPS Developer
http://www.opensips-solutions.com
On 03.03.2015 10:45, [email protected] wrote:
Hi,

Or is there a way i can break the while loop in the route block when i receive the CANCEL request?

------------------------------------------------------------------------
[email protected]

    *From:* [email protected] <mailto:[email protected]>
    *Date:* 2015-03-03 16:14
    *To:* users <mailto:[email protected]>
    *Subject:* how to cancel an INVITE before the callee receive it?
    Hi all,

    Let me describe my scenario first.

    if the callee is not online, opensips will wait for 30s.
    During the 30s, if the callee be online, opensips will send the
    invite to it.

         $avp(timeout) = 30 ;
                            while( !lookup("location","m") ){
                                   if( $avp(timeout)==0 ){
                                   send_reply("420","Can not find the callee!");
                                    exit;
                                }
                                sleep("1");
                                $avp(timeout) = $avp(timeout)-1;
                            }

    This works well, the only problem is the caller can not cancel it
    during that 30s
    t_cancel_branch() only can be used in onreply_route, but at that
    time, callee is offline.

    My question is :
    Is it possible that terminate a request in route block?


    ------------------------------------------------------------------------
    [email protected]



_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users



_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

Reply via email to