[Serusers] please help cpl-c from CVS about forwarding no answer

jacky jia jacky at solexen.com
Tue Dec 7 08:10:45 CET 2004


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 at 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 at 192.168.2.77:16800">
       <redirect/>
     </location>
   </incoming>
 </cpl>

| 100002 at 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 at 192.168.2.77:16800"> 
          <proxy/> 
       </location> 
   </subaction> 
   <incoming> 
      <location url="sip:100003 at 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();
                };
        };
}
―――――――――――――――――――


More information about the sr-users mailing list