El Friday 15 February 2008 03:03:08 Raúl Alexis Betancor Santana escribió:
Buenas a todos, os planteo una duda ...
Ante un INVITE que llega a un OpenSer, para un usuario que tiene n contacs
(se ha registrado desde varios sitios), el comportamiento de TM y
REGISTRANT es hacer branching y paralel forking, hasta ahi todo ok.
Ahora resulta que uno o varios de los n contacs tiene Path y esto
hace "saltar" las branches a otro proxy.
Lo que tienes que hacer es tratar todos esos temas dentro de
un "branch_route[ ]". Es decir, tras hacer el lookup("location") no
hagas "nada" más dentro de ese "route",
Algo así:
route {
[...]
t_on_branch("ON_BRANCH_TO_USER");
if (! lookup("location")
sl_send_error(;
exit;
}
t_relay()
}
branch_route[ON_BRANCH_TO_USER] {
Tratar aquí cada nuevo branch por separado. Por ejemplo:
ifbflagset(BFLAG_NATTED_USER)
use_media_proxy();
}
Todos los contact reciben su INVITE, al que contestan
con sus respectivos
100 Trying, 180 Ringing, etc ...
Si un contact contesta (genera un 200 Ok), el OpenSer "autogenera" (desde
el proxy que ha recibido el 200 OK) un 487 para el resto de los branches,
incluidos los que van con PATH, hasta aqui todo ok
Problema: algunos de los contacs estaban detrás de NAT, lo que hico que el
INVITE generase peticiones de sesion a un MediaProxy,
Eso es porque llamas a "use_media_proxy()" desde el route. Por ejemplo,
supongamos que un AoR está registrado desde NAT y desde una IP pública.
Si tras el "lookup(location)" haces en el mismo route un:
ifbflagset(BFLAG_NATTED_USER)
entonces es una lotería:
- Si el primer contanto que aparece en location está tras NAT entonces se esa
función "ifbflagset" devuelve TRUE.
- Si el primer contanto que aparece en location está tras IP pública entonces
se esa función "ifbflagset" devuelve FALSE.
Es decir, no hay forma de hacer distinción.
En cambio si haces esa comprobación dentro de un branch_route sí que se
actuará por separado, pues dentro de un branch_route se actua sobre cada
branch por separado, y cada branch tiene su RURI, sus flags...
pero cuando los
branches que no contestaron reciben su 487, cortan, pero es que el OpenSer
tambien me llama a end_media_session, jodiendome el invento, porque el
usuario se queda con una llamada con el canal de señalización abierto, pero
sin RTP.
No te debería pasar eso si haces lo que te comento, garantizado.
Saludos.
--
Iñaki Baz Castillo
ibc(a)in.ilimit.es