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?
Hola Raúl,
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.
[...]
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?
¿Qué hay en el route(12)?. Según lo que sea, ese ACK no llegará al route(19).
Saludos JesusR.
On Thursday 16 August 2007 10:27:24 Jesus Rodriguez wrote:
Hola Raúl,
Gracias por contestar Jesus.
¿Qué hay en el route(12)?. Según lo que sea, ese ACK no llegará al route(19).
######################################################################## # Request route 'base-outbound' ######################################################################## route[12] { if(is_present_hf("P-Asserted-Identity")) { remove_hf("P-Asserted-Identity"); } if(is_present_hf("Remote-Party-ID")) { remove_hf("Remote-Party-ID"); } if(is_avp_set("$avp(s:caller_cli)/s")) { if(!isflagset(28)) {
xlog("L_INFO", "Set caller CLI '$avp(s:caller_cli)' - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); append_hf("P-Asserted-Identity: <$avp(s:caller_cli)>\r\n"); } }
route(9); if(isbflagset(6)) { if(!isflagset(22) && !search("^Content-Length:[ ]*0")) { setflag(22); xlog("L_INFO", "Use media proxy\r\n"); use_media_proxy(); }
t_on_reply("2"); } else {
t_on_reply("1"); } if(!isflagset(21)) {
t_on_failure("2"); if(!isflagset(26)) { $avp(s:acc_callee_user) = $rU; $avp(s:acc_callee_domain) = $rd;
route(5); route(6); } } if(isflagset(29)) { append_branch(); } if(is_present_hf("Proxy-Authorization")) { consume_credentials(); }
xlog("L_INFO", "Route[12]: Request leaving server, D-URI='$du' - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); # no 100 (we already sent it) and no DNS blacklisting ds_select_dst("00","4"); #if(!t_relay("0x05")) if(!t_relay()) { sl_reply_error(); if(is_method("INVITE") && isbflagset(6)) { end_media_session(); } } exit;
}
Hola Raúl,
Gracias por contestar Jesus.
De nada :)
¿Qué hay en el route(12)?. Según lo que sea, ese ACK no llegará al route(19).
[...]
xlog("L_INFO", "Route[12]: Request leaving server, D-URI='$du' - M=$rm
RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); # no 100 (we already sent it) and no DNS blacklisting ds_select_dst("00","4"); #if(!t_relay("0x05")) if(!t_relay()) { sl_reply_error(); if(is_method("INVITE") && isbflagset(6)) { end_media_session(); } } exit;
}
El ACK debería ser tratado por el loose_route() que tienes en el route principal y de ahí saltar al route(12) y éste se encarga de enviarlo con t_relay() sin entrar en el route(19).
Prueba a poner un xlog() en el route(12) para ver si los ACK se envían desde ahí y por eso no llegan al route(19).
También, si puedes enviar el ngrep que comentaba Iñaki ayudará.
Saludos JesusR.
sr-users-es@lists.kamailio.org