[OpenSER-Users-ES] Problemas con el Paralel Forking

Iñaki Baz Castillo ibc at in.ilimit.es
Fri Feb 15 09:36:59 CET 2008


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 at in.ilimit.es




More information about the Users-es mailing list