In doing the dumps the bye messages were being sent to ser from the
client but they were not passing through ser.. this was using 2 x-lite
free clients.. in using a cisco ata and x-lite if the cisco hung up
first the x-lite would hang up no problem but if the x-lite hung up
first the cisco wouldnt see the termination.. I knew it was my config
because with the default ser sample config the clients behaved normally.
So I re-did my config yet again with a bit more logic and a good night's
rest and everything works now.. this has been one heck of a thing to
configure as the docs are so spread out and out of date as to
functionality and module usages.. but I should shutup since I haven't
volunteered my time to fix them yet.
Below is my complete (seemingly working) config so others in the future
may benefit from my strugle and hopefully not ask for other examples on
here thus saving mailing list traffic and repeat questions
Jan Janak wrote:
Make sure that BYE really passes through ser. If not
then the phones are
broken because you have record-routing enabled. Anyway, SIP message
dumps would help to diagnose the problem.
Jan.
# ----------- global configuration parameters ------------------------
debug=3 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=10
fifo="/tmp/ser_fifo"
fifo_mode=0666
alias="voip.livewirenet.com"
# ------------------ module loading ----------------------------------
loadmodule "/usr/local/ser/lib/ser/modules/mysql.so"
loadmodule "/usr/local/ser/lib/ser/modules/sl.so"
loadmodule "/usr/local/ser/lib/ser/modules/tm.so"
loadmodule "/usr/local/ser/lib/ser/modules/acc.so"
loadmodule "/usr/local/ser/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/ser/lib/ser/modules/rr.so"
loadmodule "/usr/local/ser/lib/ser/modules/textops.so"
loadmodule "/usr/local/ser/lib/ser/modules/vm.so"
loadmodule "/usr/local/ser/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/ser/lib/ser/modules/registrar.so"
loadmodule "/usr/local/ser/lib/ser/modules/auth.so"
loadmodule "/usr/local/ser/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/ser/lib/ser/modules/group.so"
loadmodule "/usr/local/ser/lib/ser/modules/uri.so"
# ----------------- setting module-specific parameters ---------------
modparam("voicemail",
"db_url","mysql://ser:heslo@localhost/ser")
modparam("voicemail", "email_column", "email_address")
modparam("voicemail", "subscriber_table", "subscriber")
modparam("voicemail", "user_column", "username")
modparam("usrloc", "db_mode", 1)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 1)
modparam("acc", "log_level", 1)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_url",
"mysql://ser:heslo@localhost/ser")
modparam("acc", "db_flag", 3)
modparam("acc", "db_missed_flag", 4)
modparam("acc", "failed_transactions", 1)
modparam("group", "db_url",
"mysql://ser:heslo@localhost/ser")
modparam("group", "table", "grp")
modparam("group", "user_column", "username")
modparam("group", "domain_column", "domain")
modparam("group", "group_column", "grp")
# If set to 1 then username@domain will be used for lookup, if
# set to 0 then only username will be used.
modparam("group", "use_domain", 0)
# ------------------------- request routing logic -------------------
# main routing logic
route {
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
t_reply("483","Too Many Hops");
break;
};
if ( msg:len > max_len ) {
t_reply("513", "Message too big");
break;
};
# label all transactions for accounting
setflag(3);
setflag(4);
record_route();
if (loose_route()) {
t_relay();
break;
};
if (!search("(f|From): .*(a)voip.livewirenet.com")) {
sl_send_reply("603","Transaction Declined");
break;
};
# callee should be on this system
if (does_uri_exist()) {
setflag(5);
};
# decide if caller is allowed local calls
if (is_user_in("From", "local")) {
setflag(6);
};
# decide if callee has voicemail
if (is_user_in("Request-URI", "voicemail")) {
setflag(7);
};
# decide if caller is allowed long distance
if (is_user_in("From", "ld")) {
setflag(8);
};
# only process for our sip domain
if (uri==myself) {
# authorize and save location
if (method=="REGISTER") {
if (!www_authorize("voip.livewirenet.com", "subscriber")) {
www_challenge("voip.livewirenet.com", "1");
break;
};
save("location");
break;
};
# handle for users on our system first as all users should be in database
if (isflagset(5)) {
if (!lookup("location")) {
# if we can't lookup the location and the callee has voicemail
if (isflagset(7)) {
route(7);
break;
} else {
sl_send_reply("404", "subscriber not online");
break;
};
};
# end localuser handling
} else {
# protect the pstn from having to bother with calls to local blocks
if (uri=~"^sip:303993") {
sl_send_reply("404", "no such user");
break;
} else {
# must have local perms to dial local or ld
if (isflagset(6)) {
route(6);
} else {
sl_send_reply("403","Not allowed to call out");
break;
};
};
}; # end local or pstn logic
}; # end uri==myself
if (!t_relay()) {
sl_reply_error();
};
} # end main route
route[7] {
# Voicemail specific configuration - begin
if(method=="ACK" || method=="INVITE" || method=="BYE" ||
method=="REFER"){
if(t_newtran()){
t_reply("100","Trying -- just wait a minute !");
if(method=="INVITE" || method=="REFER"){
log("**************** vm start - begin ******************\n");
if( uri =~ "conference" ){
if(!vm("/tmp/am_fifo","conference")){
log("could not contact conference server\n");
t_reply("500","could not contact conference server");
};
} else if( uri =~ "echo" ){
if(!vm("/tmp/am_fifo","echo")){
log("could not contact echo\n");
t_reply("500","could not contact echo");
};
} else {
if(!vm("/tmp/am_fifo","voicemail")){
log("could not contact voicemail\n");
t_reply("500","could not contact voicemail");
};
};
log("**************** vm start - end ******************\n");
break;
};
if(method=="BYE"){
log("**************** vm end/refer - begin
******************\n"); if(!vm("/tmp/am_fifo","bye")){
log("could not contact the media server\n");
t_reply("500","could not contact the media server");
};
log("**************** vm end/refer - end
********************\n");
break;
};
} else {
log("could not create new transaction\n");
t_reply("500","could not create new transaction");
};
};
# Voicemail specific configuration - end
}
route[6] {
# dial plan routing - long distance or local lata/tandem transit
if (uri=~"^sip:1") {
if (isflagset(8)) {
rewritehostport("172.16.0.7:5060");
} else {
sl_send_reply("403","Not allowed to call long distance");
break;
};
};
if (uri=~"^sip:720") {
rewritehostport("172.16.0.5:5060");
};
if (uri=~"^sip:303") {
rewritehostport("172.16.0.5:5060");
};
} # end pstn routing