El Domingo, 17 de Febrero de 2008, Raúl Alexis Betancor Santana escribió:
El Saturday 16 February 2008 22:58:33 Iñaki Baz
Castillo escribió:
El Sábado, 16 de Febrero de 2008, Raúl Alexis
Betancor Santana escribió:
Me contesto yo mismo ..., parece haber un bug
desde el año 2006 y no se
puede usar t_on_reply "per branch", pues bendita putada ... menos mal
que los flags si se respetan.
Yo no sabía que eso era un bug, siempre he pensado que es lo lógico. Me
explico:
Usar t_on_reply, t_on_branch o t_on_failure implica que una vez creada la
transacción (t_relay) cada branch pasará por onbranch_route, las
respuestas pasarán, individualmente claro, por onreply_route, y si el
resultado final (la mejor de las respuestas) es un error ([3456]XX),
entonces se puede haceralgo al respecto en onfailure_route (como por
ejemplo crear un nuevo branch con "append_branch" y poner la URI al
voicemail...).
Es decir, sólo tiene sentido poner t_on_reply antes de un t_relay, pero
da igual que se ponga antes o después de generar los branches. Ejemplo:
No, tiene mucho sentido poder decidir a que onreply_route va cada branch
Sí sí, claro que tiene sentido. Me refería a que yo pensaba que no se podía
hacer a nivel de branch.
... y que se pudiese fijar los branchflags de un
branch concreto sin tener
que especificarlo en setbflag, me explico con un ejemplo:
branch_route[2]
{
if(isbflagset(NAT)) # Ver nota2
{
t_on_reply(2); # Ver nota1
}
else
{
t_on_reply(1);
}
}
Nota1: quiero poder tratar los replies de NAT de forma diferente, con el
código actual no se puede y has de volver a hacer los nat_uac_test en un
ÚNICO onreply_route
No, podrías usar un único t_on_reply en el cual miras haces:
on_replyroute(1) {
ifbflagset(NAT) {
use_media_proxy();
...
}
}
Recuerda que un bflag persiste durante toda la transacción de su branch, lo
cual incluye las respuestas. O sea, si envías un INVITE en cuyo branch tenía
activado el bflag(NAT) verás ese bflag activo en el on_replyroute
correspondiente.
Nota2: esto peta que da gusto, porque solo comprueba si para TODOS los
branches esta seteado el flag, si quieres hacer una comprobación individual
por branch, simplemente no puedes, porque nisiquiera soporta la sintaxis
isbflagset($T_branch_idx,NAT), que para mí entender debería de ser el
comportamiento implícito de isbflagset dentro de un branch_route, porque si
estás tratando cada branch por separado, ¿que demonios me importa el flag
global de todos los branches?, me importa el del branch que estoy tratando.
No te entiendo. Si haces:
branch_route[2]
{
if(isbflagset(NAT))
Sencillamente comprobarás para cada branch si está activo ese bflag, no sé a
qué te refieres con "solo comprueba si para TODOS los branches esta seteado
el flag". Por ejemplo:
branch_route[2]
{
if(isbflagset(NAT)) {
xlog("bflag(NAT) activado para este branch con RURI $ru \n");
}
}
Ese xlog sólo lo verás para los branches pertenecientes a localizaciones del
usuario tras NAT.
--
Iñaki Baz Castillo