Set the flag 2 and 3 in the loose route for BYE requests.
----- Mensagem original ----
De: MagoDaViola <magodaviola@ig.com.br>
Para: users@lists.openser.org
Enviadas: Sábado, 5 de Abril de 2008 16:50:56
Assunto: [OpenSER-Users] Openser with freeradius not accounting BYE method
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();
}
}