[Users-es] append_branch y call forwarding

Saúl Ibarra saghul at gmail.com
Thu Aug 16 11:54:10 CEST 2007


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/




More information about the Users-es mailing list