[Serusers] BYE / CANCEL Problem

Ricardo Martinez rmartinez at redvoiss.net
Tue Oct 26 23:32:05 CEST 2004


Hello list
	Beside the BYE problem that i post in a past mail, i detected
another weird behaivor of SER.  When i made a call from a registered
endpoint (64.76.148.242) to a PSTN-number through a PSTN-Gateway.  The
destination devices keep ringing even if i send a CANCEL message.  I don't
understand why.  Here is the debug

U 64.76.148.242:5060 -> sersip.mydomain.com:5060
  CANCEL sip:005622408196 at sersip.mydomain.com SIP/2.0
Via: SIP/2.0/UDP 64.76.148.242:5060;branch=z9hG4bK1f42736da4462
From: <sip:5555832351 at sersip.mydomain.com>;tag=1f42736da4
To: <sip:005622408196 at sersip.mydomain.com>
Call-ID: 1f629d42-2d9e-73aa-826d-0002a400f1e9 at 64.76.148.242
CSeq: 462 CANCEL
Date: Wed, 01 Jun 2005 07:22:16 GMT
User-Agent: AddPac SIP Gateway
Content-Length: 0
Max-Forwards: 70
 

#
U sersip.mydomain.com:5060 -> 64.76.148.242:5060
  SIP/2.0 404 Not Found IT!
Via: SIP/2.0/UDP 64.76.148.242:5060;branch=z9hG4bK1f42736da4462
From: <sip:5555832351 at sersip.mydomain.com>;tag=1f42736da4
To:
<sip:005622408196 at sersip.mydomain.com>;tag=a6a1c5f60faecf035a1ae5b6e96e979a-
3932
Call-ID: 1f629d42-2d9e-73aa-826d-0002a400f1e9 at 64.76.148.242
CSeq: 462 CANCEL
Server: Sip EXpress router (0.8.14 (i386/linux))
Content-Length: 0
Warning:392 sersip.mydomain.com:5060 "Noisy feedback tells:  pid=16760
req_src_ip=64.76.148.242 req_src_port=5060
in_uri=sip:005622408196 at sersip.mydomain.com
out_uri=sip:005622408196 at sersip.mydomain.com via_cnt==1"


It seems to be related with my past message.  Can someone help me here, i'm
very confused.  Here is my ser.cfg.
Thanks in advance.

#
# $Id: ser.cfg,v 1.21.2.2 2003/10/13 22:53:06 jiri Exp $
#
# simple quick-start config script
#

# ----------- global configuration parameters ------------------------

debug=0    # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=yes        # (cmd line: -E)

#Uncomment these lines to enter debugging mode 
#fork=no
#log_stderror=yes


check_via=yes   # (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


# ------------------ 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/exec.so"

# Para trabajar con NAT
loadmodule "/usr/local//lib/ser/modules/mediaproxy.so"
loadmodule "/usr/local//lib/ser/modules/domain.so"
loadmodule "/usr/local//lib/ser/modules/dbtext.so"


# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/local/lib/ser/modules/auth.so"
 #loadmodule "/usr/local/lib/ser/modules/auth_db.so"

loadmodule "/usr/local/lib/ser/modules/auth_radius.so"
loadmodule "/usr/local/lib/ser/modules/group_radius.so"
loadmodule "/usr/local/lib/ser/modules/acc.so"

# ----------------- setting module-specific parameters ---------------

# ----------------- setting module-specific parameters ---------------
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)

# module authorization
modparam("auth_radius","radius_config","/usr/local/etc/radiusclient/radiuscl
ient.conf")
modparam("auth_radius","service_type",15)

#module accounting
modparam("acc","radius_config","/usr/local/etc/radiusclient/radiusclient.con
f")
modparam("acc","log_level",1)
modparam("acc", "service_type", 15)
modparam("acc", "radius_flag", 1)
modparam("acc", "radius_missed_flag", 3)
modparam("acc", "failed_transactions", 1)
modparam("acc", "report_ack", 0)

#group radius
modparam("group_radius","radius_config","/usr/local/etc/radiusclient/radiusc
lient.conf")
modparam("group_radius", "use_domain", 1)
 
#module mediaproxy
modparam("mediaproxy", "natping_interval", 60)
modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy.sock")
#modparam("mediaproxy", "sip_asymmetrics",
"/usr/local/etc/ser/sip-asymmetrics-clients")
#modparam("mediaproxy", "rtp_asymmetrics",
"/usr/local/etc/ser/rtp-asymmetrics-clients")
modparam("registrar", "nat_flag", 5)

#module domain
modparam("domain", "db_url", "/usr/local/etc/ser/domaintables")
modparam("domain", "domain_table", "domain")
modparam("domain", "domain_col", "domain")


# -------------------------  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;
        };

        # subsequent messages withing a dialog should take the
        # path determined by record-routing
        record_route();
        
        if (loose_route()) {
                if (method=="BYE" || method=="CANCEL")  {
                        log(1, "NAT: BYE o CANCEL recibido --> terminando la
sesion de media\n");
                        end_media_session();
                        setflag(1);
                };
                t_relay();
                break;
        };


        # Maracamos las llamadas para accounting
        setflag(1);

        if (client_nat_test("1")) {
                log(1, "NAT: Requerimiento de IP privada --> fixed contact
(en rutina principal)\n");
                setflag(5);
                force_rport();
                fix_contact();
                append_hf("P-hint: fixed NAT contact for request\r\n");
        };

        # (in case, it does not work, use the following command
        # with proper names and addresses in it)

if (uri==myself) {
        if (method=="REGISTER") {
                # Challenge/Response 
                if ( !radius_www_authorize("")) {
                        www_challenge("", "1");
                        break;
                };

                # Mandamos un mensaje de Log si es que un cliente NATEADO se
registro.
                if (isflagset(5))  {
                        log(1, "NAT: Cliente NAT'eado registrado (dentro del
chequeo de REGISTER)\n");
                };

                save("location");
                break;
        }; # FIN DE CHEQUEO DE REGISTRO

        # lookup("aliases");

        # CHEQUEO EL INVITE DE LA LLAMADA A REALIZARSE SOLO SI ES DE MI
DOMINIO SIPPROXY.MAGENTA.CL
        if (method=="INVITE" && search("^From: <sip:.*@64.76.148.231>")) {
                if ( !radius_proxy_authorize("")) {
                        proxy_challenge("", "1");
                        log (1, "LOG: Llamada no AUTORIZADA\n");
                        break;
                };
        };

        if ( (uri=~"^sip:0.*@.*") ){
                if (method=="INVITE")  {
                        log(1,"FORWARDING : Llamada hacia plataforma
H.323\n");
                        route(3);
                        break;
                };
        };
        # Llamadas hacia dominio H.323 (todo lo que comienza con 111, 777,
333 y 00xxxxxxxx)
        if ( (uri=~"^sip:111.*@.*") | (uri=~"^sip:777.*@.*") |
(uri=~"^sip:333.*@.*") ){
                if (method=="INVITE")  {
                        log(1,"FORWARDING : Llamada hacia plataforma
H.323\n");
                        route(1);
                        break;
                };
        };

        # Llamadas SIP locales
        if (!lookup("location")) { #Usuarios que no estan en "location"
database.
                route(4);
                break;
        };

        setflag(3);

        # Manejo para llamadas NAT'das
        if (method=="INVITE") {
                log(1, "ROUTING: Reply processing (online user) enabled to
handle NAT'd resonses\n");
                t_on_reply("1");
                        if ( (isflagset(5)) && (method=="INVITE" ||
method=="ACK") )  {
                                log(1, "NAT: Invite received --> enabling
media proxy (else del lookup 2do if)\n");
                                use_media_proxy();
                                append_hf("P-hint: request forced to media
proxy\r\n");
                        };
        };

        # Do it ? (Ricardo Martinez)
};
        append_hf("P-hint: USRLOC\r\n");

        if (!t_relay()) {
                sl_reply_error();
                break;
        };

} /* end of initial routing logic */

#--------- Route 1 hacia SIPQUEST -------------------------------
route[1] 
{
        # send it out now; use stateful forwarding as it works reliably
        # even for UDP2TCP

        # Esta NATEADO?
        if (isflagset(5))  {
                log(1, "NAT: At least one participant NAT'd --> enable reply
processing (hacia GW)\n");
                t_on_reply("1");
                if (method=="INVITE")  {
                        log(1, "NAT: Invite received --> enabling proxied
media session (hacia GW)\n");
                        setflag(1);
                        use_media_proxy();
                };                      
        };

        rewritehostport("sipquest.mydomain.com:5060");
        append_hf("P-hint: GATEWAY\r\n");
        
        if (!t_relay()) {
                sl_reply_error();
                break;
        };
        
}


#------- Route 3 : Trafico de Internet hacia la PSTN -------------------

route[3] {
        setflag(1);

        #Esta NETEADO?

        if (isflagset(5))  {
                log(1, "NAT: At least one participant NAT'd --> enable reply
processing (hacia GW)\n");
                t_on_reply("1");
                if (method=="INVITE")  {
                        log(1, "NAT: Invite received --> enabling proxied
media session (hacia GW)\n");
                        #setflag(1);
                        use_media_proxy();
                };
        };


        rewritehostport("gw1.mydomain.com:5060");
        append_hf("P-hint: GATEWAY\r\n");

        t_relay();
        break;


}


#------ Route 4 : Llamadas a usuarios Off-line ------------------------

route[4] {

        if (!t_newtran()) {
                sl_reply_error();
        };

        if (!t_reply("404", "Not Found IT!")) {
                sl_reply_error();
        };
        break;
}

# ---------------------------- Begin On-Reply Routes
--------------------------

onreply_route[1] {
     #  If we've got here, it's because we've previously passed through a
block
     #  which handles NAT requests and has set a t_on_reply condition. DB
03-08-2004
      if (status =~ "(183)|(2[0-9][0-9])")  {
        if (client_nat_test("1") || isflagset(5))  {
          log(1, "NAT: Reply from NAT'd client --> fixing contact
(onreply_route)\n");
          fix_contact();
        use_media_proxy();
        setflag(5);
        };
        log(1, "NAT: NAT'd transaction answered --> enabling media proxy
(onreply_route)\n");
      #  use_media_proxy();
      };

}

# ------------------------------ End On-Reply Routes
--------------------------

Ricardo.-




More information about the sr-users mailing list