He estado experimentando con una configuración de las que genera sipwise y no
llego a entender porque falla.
La config:
Teléfono IP <-> OpenSer <-> Asterisk (echo Test)
El teléfono se registra sin problemas en el OpenSer y lanza una llamada, que
OpenSer distribuye al Asterisk mediante el módulo dispatch, en el Asterisk
solo hay un dialplan con un EchoTest.
Todo el dialogo SIP es correcto hasta que el Asterisk hace el Answer() y en
ese momento, cuando el SIP-ACK llega al OpenSer desde el asterisk, el openser
lo toma como una nueva sesion SIP y lo descarta, cortandose la comunicación.
No añado el archivo del openser.cfg porque es un tostón de 1026 lineas de
script, pero vamos, es de los autogenerados de sipwise, osea que no hay mucha
miga, lo único que he cambiado, es que no uso rtpproxy ni mediaproxy .. sino
el módulo dispatch, para enviar a Asterisk.
Pego solo el main route y la ruta implicada:
########################################################################
# Request route 'main'
########################################################################
route[0]
{
xlog("L_INFO", "New request - M=$rm RURI=$ru F=$fu T=$tu IP=$si
ID=$ci\n");
force_rport();
if(msg:len > max_len)
{
xlog("L_INFO", "Message too big - M=$rm RURI=$ru F=$fu
T=$tu
IP=$si ID=$ci\n");
sl_send_reply("513", "Message Too Big");
exit;
}
if (!mf_process_maxfwd_header("10"))
{
xlog("L_INFO", "Too many hops - M=$rm RURI=$ru F=$fu T=$tu
IP=$si ID=$ci\n");
sl_send_reply("483", "Too Many Hops");
exit;
}
if(!is_method("REGISTER"))
{
if(nat_uac_test("19"))
{
record_route(";nat=yes");
}
else
{
record_route();
}
}
if(is_method("CANCEL") || is_method("BYE"))
{
end_media_session();
}
if(loose_route())
{
if(!has_totag())
{
xlog("L_INFO", "Initial loose-routing rejected -
M=$rm
RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
sl_send_reply("403", "Initial Loose-Routing
Rejected");
exit;
}
if(nat_uac_test("19") || search("^Route:.*;nat=yes"))
{
fix_nated_contact();
setbflag(6);
}
if(is_method("BYE"))
{
setflag(24); # account failed transactions
setflag(25); # account successful transactions
}
# mark as loose-routed for acc
setflag(26);
route(12);
}
if(is_method("REGISTER"))
{
route(11);
}
setflag(24); # account failed transactions
setflag(25); # account successful transactions
if(is_method("INVITE"))
{
route(13);
}
if(is_method("CANCEL") || is_method("ACK"))
{
route(19);
}
route(20);
}
[...]
########################################################################
# Request route 'base-route-local'
########################################################################
route[19]
{
t_on_reply("1");
if(t_check_trans())
{
xlog("L_INFO", "Request leaving server - M=$rm RURI=$ru
F=$fu
T=$tu IP=$si ID=$ci\n");
if(!t_relay())
{
sl_reply_error();
}
}
else
{
xlog("L_INFO", "Dropping mis-routed request - M=$rm
RURI=$ru
F=$fu T=$tu IP=$si ID=$ci\n");
}
exit;
}
----------------
El problema es que cuando llega un ACK desde el Asterisk indicando que el
Invite que OpenSer reenvio al Asterisk ha pasado a Answer, la función
t_check_trans() parece no enterarse, y se trata el ACK como si fuese una
sesion nueva, tira por otra parte del script de openser y falla.
¿Alguna cosa evidente que me estoy saltando?
--
Raúl Alexis Betancor Santana
Dimensión Virtual S.L.