Hoola:
Sorry por mandar este mail a las 2 listas, es por si alguien todavía
no se ha cambiado...
He implementado un sistema de call forward con OpenSER bajo los 3
tipicos supuestos (blind, busy y no answer). Me funciona, pero tengo
una dudilla respecto a la función append_branch: según yo entiendo, lo
que hace es "abir" un nuevo call leg (o algo asi) hacia el ruri
indicado y luego conectarme.
Pues bien, yo lo he utilizado porque me daba error y me decia que no
quedaban branches... y al ponerlo voila! La cuestion es: es esto
correcto?
Por otro lado, al implementar la cosa esta me ha venido la siguiente duda:
Cuando el desvío es blind, simplemente cojo el uri que tengo
almacenado en la tabla usr_preferences hago relay hacia alli, por lo
que si soy yo mismo no hay problema, la llamada iria saltando y
saltando hasta llegar a destino.
En cambio, el control del desvio si ocupado o si no contesta lo hago
en el on_failure, y por lo tanto, no puedo hacer ese "bucle", es
decir, si el usuario destino tambien se encuentra desviado, yo no lo
se. Pregunta: como puedo volver a meter la llamada en el route central
(con el ruri alterado) para asi poder tener un forwarding "recursivo"?
Ahora mismo lo tengo tal que asi:
# -----------------------------------------------------------------
# failure_route[1] -- Cuando falla un INVITE - 486 busy o 408 no
answer, le mandamos al buzon o desviamos
# -----------------------------------------------------------------
failure_route[1]
{
if(!t_was_cancelled()) {
if (t_check_status("(486)|(408)")) {
## Miramos si tiene el Voicemail activado
if (avp_db_load("$ruri/username", "$avp(s:vm)")) {
xlog("L_INFO","$Cbx--- Voicemail ACTIVADO ---$Cxx\n");
revert_uri();
rewritehostport("10.68.42.134:5070");
append_branch();
## Activamos el flag 10 para evitar bucles
xlog("L_INFO","$Cbx---> Redirigiendo al Voicemail...$Cxx\n");
setflag(10);
route(1);
exit;
}
}
## Si devuelve BUSY comprobamos su hay desvio
if (isflagset(21) && t_check_status("486")) {
if (avp_pushto("$ruri", "$avp(s:cfb)")) {
avp_delete("$avp(s:cfb)");
resetflag(21);
route(6);
exit;
}
}
## Si devuelve NO ANSWER comprobamos su hay desvio
if (isflagset(22) && t_check_status("408")) {
if (avp_pushto("$ruri", "$avp(s:cfna)")) {
avp_delete("$avp(s:cfna)");
resetflag(22);
xlog("L_INFO","$Cbx Estoy en el failure donde noanswer $Cxx\n");
route(6);
exit;
}
}
}
}
--
Saúl -- "Some people say why, other just say, why not."
----------------------------------------------------------------
http://www.saghul.net/