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): .*@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