Hello, I am a fresher of ser. I try most times to use cpl-c to do call forwarding when no
answer or busy.I have got several result.I attached my ser.cfg and cpl scripts。
I got ser source code from cvs on 2004-11-30. please tell me how about debug or try! very
thanks!
my try result:
1.no error,but do forwarding as redirect(call 100004 ,call 100002)。
in my ser.cfg is:
-----------------------
if (!t_newtran()) {
# it's a retransmission
log(1,"main loop: t_newtran fail\n");
break;
};
if (!cpl_run_script("incoming","is_stateful")) {
# script execution failed
log(1,"main loop: cpl_run_script fail\n");
t_reply("500", "CPL script execution failed");
};
-----------------------
2.cpl_run_script fail when cpl script do forwarding(call 100002). ua 100002 is ringing,
caller receive 505. redirect is ok(call 100004).
Dec 7 13:52:10 localhost /usr/local/sbin/ser[15553]: ERROR: t_newtran: transaction
already in process 0xbd6da0f8
Dec 7 13:52:10 localhost /usr/local/sbin/ser[15553]: ERROR:cpl-c:run_proxy: failed to
build new transaction!
Dec 7 13:52:10 localhost /usr/local/sbin/ser[15553]: ERROR:cpl_c:cpl_run_script: runtime
error
Dec 7 13:52:10 localhost /usr/local/sbin/ser[15553]: main loop: cpl_run_script fail
now in ser.cfg is:
-----------------------
if (!t_newtran()) {
# it's a retransmission
log(1,"main loop: t_newtran fail\n");
break;
};
if (!cpl_run_script("incoming","force_stateful")) {
# script execution failed
log(1,"main loop: cpl_run_script fail\n");
t_reply("500", "CPL script execution failed");
};
-----------------------
3. as result 2.
now in ser.cfg is:
-----------------------
if (!t_newtran()) {
# it's a retransmission
log(1,"main loop: t_newtran fail\n");
break;
};
if (!cpl_run_script("incoming","is_stateless")) {
# script execution failed
log(1,"main loop: cpl_run_script fail\n");
t_reply("500", "CPL script execution failed");
};
-----------------------
4。 caller receive 500 as soon as when call, different result 3。the error is "Number
no available,call rejected 500,I'm terribly sorry, server error occurred"。(when
call any online number)
cpl_run_script("incoming","is_stateful") and
cpl_run_script("incoming","force_stateful") get same result.
-----------------------
###if (!t_newtran()) {
# it's a retransmission
### log(1,"main loop: t_newtran fail\n");
### break;
###};
if (!cpl_run_script("incoming","is_stateless")) {
# script execution failed
log(1,"main loop: cpl_run_script fail\n");
t_reply("500", "CPL script execution failed");
};
-----------------------
―――――――――――――――――――
| 100004(a)192.168.2.77 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cpl PUBLIC '-//IETF//DTD RFCxxxx CPL 1.0//EN'
'cpl.dtd'>
<cpl>
<incoming>
<location url="sip:100003@192.168.2.77:16800">
<redirect/>
</location>
</incoming>
</cpl>
| 100002(a)192.168.2.77 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cpl PUBLIC '-//IETF//DTD RFCxxxx CPL 1.0//EN' 'cpl.dtd'>
<cpl>
<subaction id="voicemail">
<location url="sip:100003@192.168.2.77:16800">
<proxy/>
</location>
</subaction>
<incoming>
<location url="sip:100003@192.168.2.77:16800">
<proxy timeout="8">
<busy>
<sub ref="voicemail"/>
</busy>
<noanswer>
<sub ref="voicemail"/>
</noanswer>
</proxy>
</location>
</incoming>
</cpl>
―――――――――――――――――――
my ser.cfg is:
―――――――――――――――――――
#
# $Id: ser.cfg,v 1.24 2003/11/11 15:32:36 andrei Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=9 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
# Uncomment these lines to enter debugging mode
#fork=no
#log_stderror=yes
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=16800
children=4
fifo="/tmp/ser_fifo"
# Additional Aliases
alias="192.168.2.77"
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/lib/ser/modules/cpl-c.so"
# ----------------- setting module-specific parameters ---------------
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
modparam("usrloc", "db_mode", 2)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
# -- cpl-c module --
modparam("cpl-c","cpl_db","mysql://ser:heslo@localhost/ser")
modparam("cpl-c","cpl_table","cpl")
modparam("cpl-c","cpl_dtd_file","/usr/local/etc/ser/cpl-06.dtd")
modparam("cpl-c","log_dir","/var/log/ser/cpl")
modparam("cpl-c","proxy_recurse",2)
modparam("cpl-c","lookup_domain","location")
# ------------------------- 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")) {
sl_send_reply("483","Too Many Hops");
break;
};
if (msg:len >= max_len ) {
sl_send_reply("513", "Message too big");
break;
};
# we record-route all messages -- to make sure that
# subsequent messages will go through our proxy; that's
# particularly good if upstream and downstream entities
# use different transport protocol
if (!method=="REGISTER") record_route();
# subsequent messages withing a dialog should take the
# path determined by record-routing
if (loose_route()) {
t_relay();
break;
};
lookup("aliases");
setflag(1);
# if the request is for other domain use UsrLoc
# (in case, it does not work, use the following command
# with proper names and addresses in it)
if (uri==myself) {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication
if (!www_authorize("192.168.2.77",
"subscriber")) {
www_challenge("192.168.2.77", "0");
break;
};
# handle REGISTER messages with CPL script
cpl_process_register();
save("location");
break;
};
# process INVITE
if (method=="INVITE") {
# cpl interpreter requires a pre-created transaction for the
processed INVITE
if (!t_newtran()) {
# it's a retransmission
log(1,"main loop: t_newtran fail\n");
break;
};
if (!cpl_run_script("incoming","is_stateful"))
{
# script execution failed
log(1,"main loop: cpl_run_script fail\n");
t_reply("500", "CPL script execution
failed");
};
# we get here only if the CPL interpreter decided that server
# should follow it default behavior
# mark that there is already a created transaction for current
INVITE
setflag(3);
};
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
break;
};
};
# forward current uri now
if (!isflagset(3)) {
# build a new fresh transaction and forward
if (!t_relay()) {
sl_reply_error();
};
}
else {
# transaction exists -> do just forward
if (!t_forward_nonack_uri()) {
sl_reply_error();
};
};
}
―――――――――――――――――――