Hi,
What you are trying to do it not logically correct ; even more, it is
not SIP wise correct (a proxy must not mess up with the final replies as
the end points will get de-syncronized .
This a well know race in SIP - caller canceling versus callee answering
the call. The RFC says that the proxy must pass the 200 OK INVITE back
to caller and let the caller device to decide what to do. If the device
really wants to terminate, it will generate a BYE on the spot. If not,
it can keep the call and ignore the fact it sent the cancel.
And you accounting must follow the caller's decision, by simply
accounting the call as normal.
Regards,
Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
http://www.opensips-solutions.com
OpenSIPS Bootcamp 2018
http://opensips.org/training/OpenSIPS_Bootcamp_2018/
On 08/01/2018 05:20 PM, [email protected] wrote:
Hello everyone! Need your help.
Scheme: A <---> opensips <----> B, simple scheme of call:
1) INVITE A ---> opensips ----> B
2) 100 A <--- opensips <---- B
3) 183 A <--- opensips <---- B
4) CANCEL A ---> opensips ----> B
5) 200 Cancelling A <--- opensips <---- B
6) 200 ok A <--- opensips <---- B
When customer B received CANCEL request, he answers "200 Cancelling" (Cseq: CANCEL) and
"200 ok" (Cseq: INVITE) at the same time. This behavior generates is wrong CDR - i use
accounting. For resolve this situation i trying to use this code in route BRANCH_REPLY, in snippet
below you may see routes initializing chain:
```
route {
...
t_on_failure("GETDATA");
...
}
failure_route[GETDATA] {
...
route("TRYING");
...
}
route[TRYING] {
...
t_on_branch("BRANCH_CARRIER");
...
}
branch_route[BRANCH_CARRIER] {
...
t_on_reply("BRANCH_REPLY");
...
}
onreply_route[BRANCH_REPLY] {
...
xlog("L_INFO", "DEBUG OUT rs=$rs rr=$rr si=$si DLG_status=$DLG_status\n");
if ((t_check_status("18[0-9]|200")) && (t_was_cancelled())) { # Don't
allow continue cancelled call
xlog("L_INFO", "DEBUG IN rs=$rs rr=$rr si=$si
DLG_status=$DLG_status\n");
$DLG_timeout = 1;
change_reply_status("487", "Request Terminated");
$var(local_sip_code) = "487";
exit;
}
...
}
```
Reply "200 ok" falls into the route "BRANCH_REPLY" and block "Don't allow continue
cancelled call", but change_reply_status() do not change rr and rs.
One more question about accounting, any chance use function drop_accounting()
in this scheme? I want drop accounting if opensips receives 200ok AFTER
processing CANCEL.
Thanks!
opensips version:
```
version: opensips 2.3.4 (x86_64/linux)
flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, HP_MALLOC,
FAST_LOCK-FUTEX-ADAPTIVE_WAIT
ADAPTIVE_WAIT_LOOPS=1024, MAX_RECV_BUFFER_SIZE 262144, MAX_LISTEN 16,
MAX_URI_SIZE 1024, BUF_SIZE 65535
poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
main.c compiled on 16:48:49 Jul 5 2018 with gcc 5.4.0
```
The same ticket in git: https://github.com/OpenSIPS/opensips/issues/1435
_______________________________________________
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