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

jacky jacklyman at sohu.com
Tue Dec 7 08:12:30 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