Asterisk Masquerade

Durante el desarrollo de nuestro framework para la construccion de modulos de ruteo para Asterisk (Y en un futuro FreeeSwitch), he tenido que crear algunos parches para nuevos eventos necesarios en Asterisk. Uno de ellos es este:

http://bugs.digium.com/view.php?id=7840

Este nuevo evento reporta cuando Asterisk hace masquerading sobre un canal. Pero esto trae la pregunta que es masquerade? Que son los canales de Asterisk? Para quienes deseen entenderlo, la siguiente es una breve descripcion:

Asterisk es, en primera instancia, un conmutador. Y que hace un conmutador?, efectivamente “conmuta”, sin embargo se han puesto a pensar que es lo que conmuta?? Si nos vamos a http://www.rae.es/ encontraremos que las definiciones son:

1. adj. Que conmuta.

2. m. Fís. Dispositivo de los aparatos eléctricos que sirve para que una corriente cambie de conductor.

3. m. Arg., Col., El Salv., Guat. y Méx. centralita (ǁ telefónica).

Efectivamente, las 3 definiciones aplican a Asterisk, excepto por un detalle de la segunda. La segunda definición Asume que lo que se desea conmutar es el circuito portador de corriente electrica. Por que eso es lo que efectivamente sucede en un conmutador analógico. Veamos un ejemplo rudimentario de como funcionaria una llamada desde un domicilio particular, hasta la extensión.

1. El telefono particular es descolgado y la compañia telefónica (p.e Telmex) nos provee de tono de marcado, que no es mas que la consecuente corriente electrica debido al voltaje de la línea.

2. Marcamos numeros (DTMF, Dual Tone Multi Frequency), enviados como pulsos de corriente electrica de diferentes frequencias. Telmex rutea nuestra llamada hasta el número destino.

3. La llamada es recibida por el conmutador de la compañia X, hasta el momento, el conmutador solo conoce 1 circuito (por donde llego la llamada desde telmex) , muy posiblemente nos contestará el conmutador y pedira marquemos el número de extension.

4. Cuando marquemos el número de extensión, el conmutador abrira otro circuito para enviar la señal a la extension destino y conectará los dos circuitos.

En sintesis, un conmutador analógico conmuta circuitos. Pero dado que Asterisk no solo conecta circuitos de corriente, sino también “circuitos” de protocolos sobre IP (H323, IAX2, SIP), se nombra a los circuitos, canales (o sesiones en el lingo de FreeSwitch). Asi que cuando en Asterisk se recibe una llamada por una tarjeta Zaptel, se crea un canal especial de tipo Zap (o tal vez Unicall), si esta llamada desea ser terminada en una extensión SIP, entonces Asterisk crea un segundo canal, pero esta vez de tipo SIP, y los conecta!, igual que el conmutador analógico, permitirá que el audio fluya de SIP a Zap y viceversa.

Ahora, que es “Channel Masquerading”?
En realidad es un truco “sucio” de software para poder implementar funcionalidad como transferencias, pickup call y otras cosas que un PBX debe poder hacer. Para explicarlo veremos el ejemplo de como se implementa la funcionalidad de “pickup”. Esta funcionalidad implica que cuando una extension esta “sonando”, otra extensión puede marcar un número especial, comunmente “*8” para “levantar” la llamada. Para esto Asterisk involucra al menos 2 canales, el de la extension que esta sonando, y el de la extensión que marco “*8”. Sin embargo, para que una extension este sonando usualmente es necesario que otro usuario haya marcado el numero de la extension, lo que involucraría un 3er canal, aqui asumiremos eso. Utilizaremos 3 personajes ficticios, Juanito, Pepito y Roberta.

Juanito marca desde su extensión el número de la extension de pepito, asi que Asterisk primero creo el canal para recibir la llamada de Juanito, quien tiene una extension IAX, asi que el primer canal creado es IAX, al interpretar el número marcado por Juanito, Asterisk decide que el número corresponde a la extensión de Pepito, la cual es una extensión SIP, asi que Asterisk crea un segundo canal, esta vez tipo SIP, este nuevo canal es el que se encarga de hacer que la extensión de Pepito timbre, mientras timbra, Asterisk envia al canal IAX el sonido del timbrado de la extension SIP. Sin embargo, como pepito no contesta, entra Roberta, la secretaría, en acción.

Roberta decide que levantará la llamada, asi que marca “*8”, Asterisk crea un nuevo canal de acuerdo a la extensión de roberta, que es tipo H323. Al recibir el número, Asterisk decide que es el código usado para levantar llamadas, asi que busca dentro de todos los canales activos, el primer canal que se encuentre en estado “Ringing”, encuentra la extensión de pepito, sin embargo, la arquitectura de Asterisk no permite, de forma sencilla, “cortar” el flujo de una aplicación, en este caso la aplicación es Dial() y esta aplicación es la que tiene el control del canal de Juanito y el de Pepito, en un solo hilo de ejecución (thread), la llamada de Roberta entro a Asterisk en otro thread, como hacemos entonces para que el canal de Roberta remplace el canal de Pepito??, usamos “channel masquerading”!.

Esto es, Asterisk intercambiará rapida, y suciamente, un monton de apuntadores y valores pertenecientes al canal de Pepito para que ahora apunten a el canal de Roberta (a pesar de ser de diferentes tipos, gran cantidad de datos son genéricos) y entonces Roberta pueda hablar con Juanito!, el canal de pepito es “flageado” como “zombie” y es finalmente colgado por Asterisk.

Espero haber sido lo suficientemente claro. Y bueno, el pequeño parche que hice reporta este evento al manager para que nuestro sistema daemon se entere de este cambio y haga exactamente lo mismo (intercambiar los canales), pero mucho mas sencillo, desde PHP 🙂

se ven…

This entry was posted in asterisk, voip. Bookmark the permalink.

4 Responses to Asterisk Masquerade

  1. Pingback: Best VOIP Place

  2. Moises Silva says:

    Sorry Dev, no english version, at the time of this post I only posted in Spanish. You can google translate.

  3. Dev says:

    Could this be available in clean English ?
    Thx

  4. Giovanni F. says:

    Te complicas en parte del post,
    la comutacion por circuitos es a nivel analogico /digital
    sin embargo a nivel IP la comutacion es de paquetes.

    Saludos.

    Giovanni.

Leave a Reply

Your email address will not be published. Required fields are marked *

*