I sent the complete cfg file earlier and didn't want to duplicate it if it was unnecessary.. and as I've been reading.. statefull ransactions are required for acc .. yes?
Here is my config.. a work in progress now..
# ----------- global configuration parameters ------------------------
debug=4 # 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=4 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"
# ----------------- 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", 2) modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "password_column", "password") modparam("rr", "enable_full_lr", 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", 11) modparam("acc", "db_missed_flag", 12) 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(11); setflag(12);
record_route(); if (loose_route()) { t_relay(); break; };
# decide if callee has voicemail if (is_user_in("Request-URI", "voicemail")) { setflag(4); };
# decide if caller is allowed long distance if (is_user_in("From", "ld")) { setflag(5); };
# 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; };
if (lookup("location")) { t_relay(); break; } else { if ((method=="INVITE" || method=="ACK") && t_newtran() ) { # new call to offline user with voicemail flag if (isflagset(4)) { route(4); break; } else { route(5); break; }; }; sl_reply_error(); break; };
#if (!t_relay()) { # sl_reply_error(); # break; #};
} else { t_reply("404","UA Configuration error - Incorrect domain"); break; }; # end uri==myself
} # end main route
route[4] {
# 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[5] {
# protect the pstn from having to bother with calls to out local blocks if (uri=~"^sip:303993") { t_reply("404", "no such user"); break; };
# dial plan routing - long distance or local lata/tandem transit if ((uri=~"^sip:1") && (isflagset(5))) { rewritehostport("172.16.0.7:5060"); t_relay(); break; };
if (uri=~"^sip:720") { rewritehostport("172.16.0.5:5060"); t_relay(); break; };
if (uri=~"^sip:303") { rewritehostport("172.16.0.5:5060"); t_relay(); break; };
t_reply("404","Not Found"); break;
}
failure_route[1] { t_relay(); }
Jiri Kuthan wrote:
At 09:20 PM 1/29/2004, Matt Hess wrote:
Ok here's another question:
off the same ser.cfg I sent earlier when dialing a number that would go to a pstn.. ie: route(5) and then rewritehostport("172.16.0.5:5060"); t_relay(); break; I get the following error messages:
Jan 29 06:06:31 tranquility /usr/local/ser/sbin/ser[22664]: ERROR: t_newtran: transaction already in process 0x7c1ad7f0 Jan 29 06:06:31 tranquility /usr/local/ser/sbin/ser[22664]: ERROR: t_newtran: transaction already in process 0x7c1ad7f0
You can't create a transaction for a message twice. You probably call some of t_newtran or t_relay_* in a row for a single request somewhere in your script.
I must have a hole in my logic somewhere..?
Oh and I did move the setflag to be before record_route(); and I do get invites in the database but don't receive any bye's.. I've got to be able to get both to do proper cdr and billing.. yes?
I also get when placing a call to another registered user:
Jan 29 06:11:43 tranquility /usr/local/ser/sbin/ser[5017]: WARNING: t_reply: ACKs are not replied Jan 29 06:11:45 tranquility /usr/local/ser/sbin/ser[14527]: WARNING: t_reply: ACKs are not replied Jan 29 06:11:48 tranquility /usr/local/ser/sbin/ser[25400]: WARNING: t_reply: ACKs are not replied Jan 29 06:11:48 tranquility /usr/local/ser/sbin/ser[14527]: ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established Jan 29 06:11:48 tranquility /usr/local/ser/sbin/ser[14527]: ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established Jan 29 06:11:50 tranquility /usr/local/ser/sbin/ser[6559]: ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established Jan 29 06:11:50 tranquility /usr/local/ser/sbin/ser[6559]: ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established Jan 29 06:11:53 tranquility /usr/local/ser/sbin/ser[5017]: ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established Jan 29 06:11:53 tranquility /usr/local/ser/sbin/ser[5017]: ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established
I suppose that the thing happened which the log tells you: you tried to generate a stateful reply (t_reply action) without having decided to process the transaction statefuly before (t_newtran action).
I suppose you did not have a specific reason to use stateful replying, in which case you will be better off with stateless replies. They take easier scripts and consume less memory, so they ought to be the default choice. Simply replace t_reply with sl_send_reply.
It is hard to tell details without seeing the complete script though.
-jiri