Hi,
I am using Kamailio as my ACC, Dispatcher, far end nat and presence server in front of a farm of asterisk boxes.
Most calls are being properly added into my acc table and using a join between the INVITEs, CANCELs, and BYEs I am able to get what seems like accurate call detail records.
The trouble is that every so often a BYE does not make it back to my server. In my simulation this morning, I simply unplugged ( electric ) the two phones that were having a pleasant conversation. Now I have asterisk that thinks the call is still running and I have Kamailio which has no ending 'BYE' message. For the most part this is not a big deal, but when I can a cellular phone in European countries, my provider thinks I am still talking. At 30 cents a minute, that's a lot.
Here are some snippets from my code :
loadmodule("dialog.so") loadmodule("acc.so") loadmodule("sst.so")
modparam("acc", "early_media", 1) modparam("acc", "report_ack", 1) modparam("acc", "report_cancels", 1) modparam("acc", "failed_transaction_flag", 3) modparam("acc", "log_flag", 1) modparam("acc", "log_missed_flag", 2) modparam("acc", "db_flag", 1) modparam("acc", "db_missed_flag", 2) # There is also a parameter for the DB, but I can't give you my password modparam("acc", "db_url", "some://valid:url@to/db")
# Note $avp(i:10) always ends up being 14400 ( less than the value on the help page ) modparam("dialog", "timeout_avp", "$avp(i:10)") modparam("sst", "timeout_avp", "$avp(i:10)") modparam("sst", "sst_flag", 5)
Relevant snippets from my routing :
if ( has_totag()) { if ( loose_route() ) { if ( is_method("CANCEL|BYE") { setflag(1); setflag(3);
} }
# Routing of INVITEs setflag(2) if ( !is_method("ACK")) { setflag(1); }
setflag(4);
setflag(5);
For invites, I have a onreply_route and failure_route which I use only for RTP Stuff.
On reply route checks if rtpproxy is needed, if it is it is activated. failure_route checks if rtpproxy was activated and if it was deactives it. The only other code in the failure route is this :
if ( t_was_cancelled() ){ exit ; }
So, the problem is, when phones do not send BYE, what do I do? I need resources freed up from Asterisk, RTP Proxy, and Kamailio Dialog, and I need the call to be canceled with my provider and I need for my ACC to recieve some indication as to when the call ended. Obviously it won't be exact to the second, but I kind of thought that the SIP Session Timers would notice the phone was gone and would generate a BYE or something?
What do I do?
Thanks,
David