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