I´m has a problem that my openser sometimes not accounting bye method and this cause a call without pay. See the openser.cfg:
#
# $Id: ser.cfg,v 1.25.2.1 2005/02/18 14:30:44 andrei Exp $
#
# simple quick-start config script
#    
 
# ----------- global configuration parameters ------------------------
 
debug=4         # debug level (cmd line: -dddddddddd)
##--
#
# Uncomment these lines to daemonize
fork=yes
log_stderror=no # (cmd line: -E)
##--
#
# Uncomment these lines to enter debugging mode
#fork=no
#log_stderror=yes
##--
 
alias=sip.processavoip.net
listen=201.32.70.20
#syn_branch=1
memlog=3
sip_warning=1
server_signature=yes
reply_to_via=0
mhomed=0
disable_dns_blacklist=yes
 
unix_sock="/tmp/openser.sock"
 
check_via=0     # (cmd. line: -v)
dns=no           # (cmd. line: -r)
rev_dns=no      # (cmd. line: -R)
port=5060
children=4
mpath="/usr/local/lib/openser/modules/"
 
# ------------------ module loading ----------------------------------
 
# Uncomment this if you want to use SQL database
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "auth.so"    
loadmodule "auth_radius.so"
loadmodule "uri.so"
loadmodule "domain.so"
loadmodule "permissions.so"
loadmodule "mediaproxy.so"
loadmodule "nathelper.so" 
loadmodule "acc.so"
loadmodule "xlog.so"
loadmodule "dbtext.so"
loadmodule "uri_db.so"
loadmodule "mi_fifo.so"
loadmodule "group.so" 
# ----------------- setting module-specific parameters ---------------
 
# -- mi-fifo params --
modparam("mi_fifo", "fifo_name", "/tmp/openser_fifo")
 
# -- usrloc params --
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "nat_bflag", 6)
modparam("usrloc", "domain_column", "fk_domains")
modparam("usrloc", "user_column", "fk_accounts")
 
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
 
## -- database params --
modparam("acc|usrloc|group|domain|uri_db|permissions", "db_url", "mysql://root:master@localhost/openser")
 
# -- radius params --
modparam("acc|auth_radius", "radius_config", "/etc/radiusclient-ng/radiusclient.conf")
 
# -- radius permissions --
modparam("permissions", "db_mode", 1)
modparam("permissions", "trusted_table", "trusted")
 
# -- group params --
modparam("group", "table", "accounts_groups")
modparam("group", "user_column", "fk_accounts")
modparam("group", "domain_column", "fk_domains")
modparam("group", "group_column", "pk_accounts_groups")
modparam("group", "use_domain", 0)
 
## -- acc params --
modparam("acc", "radius_missed_flag", 3)
modparam("acc", "radius_flag", 2)
#modparam("acc", "radius_extra", "via=$hdr(Via[*]); email=$avp(s:email)")
modparam("acc", "log_level", 2)
modparam("acc", "log_extra", "src_user=$fU;src_domain=$fd;dst_user=$rU;dst_domain=$rd")
modparam("acc", "radius_extra", "User-Name=$fU;Suffix=$fd;Sip-Translated-Request-URI=$ru")
modparam("acc", "service_type", 15)
modparam("acc", "failed_transaction_flag", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "log_flag", 1)
## -- acc params without radius --
#modparam("acc", "db_missed_flag", 3)
#modparam("acc", "db_flag", 2)
#modparam("acc", "db_table_acc", "call_history")
#modparam("acc", "db_table_missed_calls", "call_history_missed")
 
# -- uri_db params --
modparam("uri_db", "subscriber_table", "accounts")
modparam("uri_db", "subscriber_domain_column", "fk_domains")
modparam("uri_db", "subscriber_user_column", "pk_accounts")
 
# -- domain params  --
modparam("domain", "domain_table", "domains")
modparam("domain", "domain_col", "pk_domains")
 
# -- nathelper, mediaproxy nd registrar params --
modparam("nathelper", "sipping_bflag", 7)
modparam("nathelper", "sipping_from", "sip:pinger@openser.org")
modparam("nathelper", "rtpproxy_disable", 1)
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)   # Ping only clients behind NAT
modparam("registrar|nathelper", "received_avp", "$avp(i:42)") # to configure nat at openser 1.2, 1.3 or 1.4
modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy.sock")
modparam("mediaproxy", "natping_interval", 30)
#modparam("mediaproxy", "sip_asymmetrics", "/etc/openser/sip-clients")
#modparam("mediaproxy", "rtp_asymmetrics", "/etc/openser/rtp-clients")
#modparam("registrar", "received_avp", "$avp(s:rcv)") # to configure nat at openser 1.2, 1.3 or 1.4
 

# -- tm params --
# set time for which ser will be waiting for a final response;
# fr_inv_timer sets value for INVITE transactions, fr_timer  
# for all others
#modparam("tm", "fr_inv_timer", 15 ) #Tempo maximo do ring antes de atender
#modparam("tm", "fr_timer", 1)
#modparam("tm", "wt_timer", 1)
 

# -------------------------  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","Muitos Hops");
    log(1, "486: Muitos Hops\n");
    exit;
  };
  if (msg:len >=  2048 ) {
    sl_send_reply("513", "Message to big");
    log(1, "513: Message too bi \n");
    exit;
  };
  ##--
  # Eh feita a gravacao de todas as mensagens para se certificar que todas as mensagens
  # passem pelo proxy o que eh importante particularmente se as entidades estao usando
  # um protocolo de transporte diferente
  ##--
  if (method!="REGISTER") {
    record_route();
  };
  route(6);
  ##--
  # Secao de finalizacao da chamada
  ##--
  if (method=="BYE" || method=="CANCEL") {
    end_media_session();
  };
  ##--
  # mensagens subsequentes dentro de um dialogo deveriam tomar um caminho pre-determinado
  # pela gravacao das rotas (record route)
  ##--
  if (loose_route()) {
    # marca a logica de roteamento no pedido
    append_hf("P-hint: rr_enforced\r\n");  
    if (has_totag() && (method=="INVITE" || method=="ACK")) {
      xlog("L_ERR", "Main Route: Fixing SDP to $fu $rm (loose route)\n");
      if (client_nat_test("3") || isflagset(5)) {
        setbflag(6);
        use_media_proxy();
      };
    }; 
    xlog("L_ERR", "Main Route: Loose Route relaying\n");
    route(1);
    exit;
  };
  if (!uri==myself) {
    # marca a logica de roteamento no pedido
    append_hf("P-hint: rr_enforced\r\n");  
    xlog("L_ERR", "Main Route: Relaing mesage to proxy destination \n");
    route(4);
    route(1);
  };
  ##--
  # Verifica baseado na tabela de dominios se a parte host da R-URI comtem um dos dominios
  # quais o proxy eh responsavel
  ##--
  if (!is_uri_host_local()) {
    if (is_from_local() || allow_trusted()) {
      route(4);
      route(1);
    } else {  
      sl_send_reply("403", "Forbinden...");
    }
    exit;
  };
  ##--
  # A rotina abixo eh chamada para marcar o registro com NAT
  ##--
  if (method=="CANCEL") {
    route(1);
    exit;
  } else if (method=="REGISTER") {
    route(2);
    exit;
  } else if (method=="INVITE") {
    route(3);
    exit;
  };
  ##--
  # Verifica se existem aliases para este endereco e se eles nao pertencem
  # a teste dominio encaminhamos para frente
  ##--
  lookup("aliases");
  if (uri!=myself) {
    xlog("L_ERR", "Main Route: aliases relayin to other domain proxy\n");
    route(4);
    route(1);
    exit;
  };
  ##--
  # Verifica se encontra o usuario na base de localizacao
  ##--
  if (!lookup("location")) {
    sl_send_reply("404", "Usuario nao encontrado");
    exit;
  };
  route(1);
  exit;
}
   
route[1] {
  ##--
  # Envie isto agora; use "statefull fowarding" pois funciona de forma confiavel de UDP para TCP
  # Ativa a contabilizacao das chamadas
  ##--
  xlog("L_ERR", "Route[1]: Relaying message\r\n");
  setflag(2);
  ##--
  # Ativa a contabilizacao das chamadas perdidas
  ##--
  setflag(3);
  t_on_reply("1");
  if (!t_relay()) {
    if (method=="INVITE" || method=="ACK") {
      end_media_session();
    };
    sl_reply_error();
  };
}   
    
route[2] {
  ##--
  # Tratamento padrao para as mensagens de Register
  ##--
  sl_send_reply("100", "Registrando....");
  xlog("L_ERR", "Route[2]: Trying Auth: $fu $si\n");
  if (isflagset(5) && client_nat_test("7")) {
    xlog("L_ERR", "Route[2]: Client behind NAT - flag(6)\n");
    setbflag(6);
    fix_nated_register();
    force_rport();
    # se quiser usar natping options descomente a linha abaixo
    # setbflag(7);
  };
  if (!radius_www_authorize("")) {
    www_challenge("", "0");
    xlog("L_ERR", "Route[2]: Client Unauthorized: $fu $si\r\n");
    sl_send_reply("401", "Unauthorized");
    exit;
  };
  if (!check_to()) {
    xlog("L_ERR", "Route[2]: Client Unauthorized: $fu $si\r\n");
    sl_send_reply("401", "Unauthorized");
    exit;
  } else {
    xlog("L_ERR", "Route[2]: Authenticate: $fu $si\r\n");
  };
  consume_credentials();
  if (!save("location")) {
    xlog("L_ERR", "Route[2]: Can't save register location\r\n");
    sl_reply_error();
  };
}
route[3] {
  ##--
  # Tratamento padrao para as mensagens de INVITE
  ##--
  xlog("L_ERR", "Route[3]: INVITE: $fu -> $tu $ci\r\n");
#  setflag(1);
  if (!allow_trusted()) {
    if (!radius_proxy_authorize("")) {
      proxy_challenge("", "0");  # Realm will be autogenerated
      exit;
    } else if (!check_from()) {
      sl_send_reply("403", "Usue from=ID");
      xlog("L_ERR", "Route[3]: Error 403 $fu -> $tu\r\n");
      exit;
    };
  }
  consume_credentials();
  ##--
  # Verifica se existem aliases para este endereco e se eles nao pertencem
  # a teste dominio encaminhamos para frente
  ##--
  lookup("aliases");
  if (uri!=myself) {
    xlog("L_ERR", "Main Route: aliases relayin to other domain proxy\n");
    route(4);
    route(1);
  }; 
  ##--
  # VoIP Local
  ##--
  if (uri=~"sip:[1-9][0-9]+@.*") {
    xlog("L_NOTICE", "OpenSER: Ligacao VoIP local: $fU -> $tu\n");
  } else {
    ##--
    # Nacional
    ##--
    if (uri=~"sip:0[1-9][0-9]+@.*") {
      xlog("L_NOTICE", "OpenSER: Ligacao Nacional: $fU -> $tu\n");
    } else {
      ##--
      # Internacional
      ##--
      if (uri=~"sip:00[1-9][0-9]+@.*") {
        xlog("L_NOTICE", "OpenSER: Ligacao Interacional: $fU -> $tu\n");
      };
    };
    route(5);
    exit;
  };
  if (!lookup("location")) {
    append_hf("P-hint: usuario nao encontrado\r\n");
    sl_send_reply("404", "Usuario nao encontrado");
    exit;
  };
  append_hf("P_hint: usrloc applied\r\n");
  t_on_failure("1");
  route(4);
  route(1);
}
 
route[4] {
  ##--
  # Secao de travessia do nat
  ##--
  if (isflagset(5)) {
    setbflag(6);
  };
  if (isflagset(5) || isbflagset(6) || isbflagset(7)) {
    use_media_proxy();
    xlog("L_ERR", "Rota[4]: Travessia de NAT mediaproxy\n");
  };
}  
   
route[5] {
  ##--
  # Encaminhamento para a rede publica (PSTN)
  ##--
  xlog("L_ERR", "Route[5]: Relaying to PSTN\n");
  rewritehostport("201.32.70.21");
  route(4);
  route(1);
}
 
route[6] {
  force_rport();
  if (nat_uac_test("19")) {
    if (method=="REGISTER") {
      fix_nated_register(); 
    } else {
      fix_nated_contact();
    };
    setflag(5);
  };
}  
   
failure_route[1] {
  if (t_check_status("487")) {
    exit;
  };
  if (isbflagset(6) || isflagset(5)) {
    end_media_session();
  };
onreply_route[1] {
  ##--
  # Bloco de tratamento de respostas
  ##--
  if ((isflagset(5) || isbflagset(6)) && status=~"(180)|(183)|(2[0-9][0-9])") {
    use_media_proxy();
#    search_append('Contact:.*sip:[^>[:cntrl:]]*', ';nat=yes');
  }
  if (isbflagset(6)) {
    fix_nated_contact();
  }
}

Alcindo Schleder
  • MSN: a_schleder@hotmail.com
  • Skipe: alcindo_schleder
Demétrio P. dos Santos, 705 - 95670-000 - Gramado-RS-Brasil
Celular + 55 54 9966 7591 alcindo@processa.org
Fone +55 54 3286-1738 comercial@processa.org