Modificar la cabecera From de un INVITE saliente

446 views
Skip to first unread message

Raúl Alexis Betancor Santana

unread,
Sep 25, 2007, 3:49:29 PM9/25/07
to asterisk-es

¿Permite Asterisk este nivel de control, tal como lo permite OpenSer?, estoy
buscando la forma de añadir un par de tag's extras en las llamadas que genera
un Asterisk y no encuentro información al respecto.

¿Alguna indicación?

--
Raúl Alexis Betancor Santana
Dimensión Virtual S.L.

Julian J. M.

unread,
Sep 25, 2007, 4:13:05 PM9/25/07
to aster...@googlegroups.com
Prueba a asignar la variable SIP_URI_OPTIONS con lo que quieras
añadir, antes del Dial...

No se si es lo que andas buscando exactamente.

Julián J. M.

Raúl Alexis Betancor Santana

unread,
Sep 25, 2007, 7:34:46 PM9/25/07
to aster...@googlegroups.com
El Tuesday 25 September 2007 20:13:05 Julian J. M. escribió:
> Prueba a asignar la variable SIP_URI_OPTIONS con lo que quieras
> añadir, antes del Dial...
>
> No se si es lo que andas buscando exactamente.

Si, pero nó, es una variable de solo lectura, no se puede setear.

¿Alguna sugerencia de como setearla?

--
Saludos.

Julian J. M.

unread,
Sep 25, 2007, 7:44:27 PM9/25/07
to aster...@googlegroups.com
No es una función, es una variable, r/w.

exten => _X.,1,Set(SIP_URI_OPTIONS="loquesea")
exten => _X.,2,Dial(SIP/proveedor/${EXTEN})

No lo he probado, pero viendo el código de chan_sip.c:

/* If custom URI options have been provided, append them */
if (p->options && p->options->uri_options)
ast_build_string(&invite, &invite_max, ";%s",
p->options->uri_options);


Es decir, añade a uri un punto y coma, seguido de lo que contenga la
variable SIP_URI_OPTIONS.

Julian J. M.

Raúl Alexis Betancor Santana

unread,
Sep 25, 2007, 8:00:35 PM9/25/07
to aster...@googlegroups.com
El Tuesday 25 September 2007 23:44:27 Julian J. M. escribió:
> No es una función, es una variable, r/w.

Yo no dije que fuera función, dije que era una variable de solo lectura

> exten => _X.,1,Set(SIP_URI_OPTIONS="loquesea")
> exten => _X.,2,Dial(SIP/proveedor/${EXTEN})
>
> No lo he probado, pero viendo el código de chan_sip.c:

Yo si lo he probado y es de solo lectura, además de estar marcada en el
AstVar.html como variable de canal de solo lectura.

>
> /* If custom URI options have been provided, append them */
> if (p->options && p->options->uri_options)
> ast_build_string(&invite, &invite_max, ";%s",
> p->options->uri_options);
>
>
> Es decir, añade a uri un punto y coma, seguido de lo que contenga la
> variable SIP_URI_OPTIONS.

Si, pero a que no encuentras la parte del código que setea la variable
¿? ;-) , es que no existe.

Julian J. M.

unread,
Sep 26, 2007, 4:22:31 AM9/26/07
to aster...@googlegroups.com
On 9/26/07, Raúl Alexis Betancor Santana <ra...@dimension-virtual.com> wrote:
>
> El Tuesday 25 September 2007 23:44:27 Julian J. M. escribió:
> > No es una función, es una variable, r/w.
>
> Yo no dije que fuera función, dije que era una variable de solo lectura

Las variables de solo lectura no existen. No hay nada que te impida
asignarle un valor a una variable.

>
> > exten => _X.,1,Set(SIP_URI_OPTIONS="loquesea")
> > exten => _X.,2,Dial(SIP/proveedor/${EXTEN})
> >
> > No lo he probado, pero viendo el código de chan_sip.c:
>
> Yo si lo he probado y es de solo lectura, además de estar marcada en el
> AstVar.html como variable de canal de solo lectura.

Reconozco que hay un error en el ejemplo anterior, pero no es el que
crees. La variable SIP_URI_OPTIONS no se está copiando al nuevo canal.
Y por eso no se tiene en cuenta su valor. Si le añadimos un guión bajo
(_) delante de SIP_URI_OPTIONS, la variable pasa al nuevo canal
(SIP/proveedor-3b3b3b3), y cuando hace el invite, añade su contenido
al uri. Ejemplo:
exten => 205,1,Set(_SIP_URI_OPTIONS="PRUEBA")
exten => 205,2,Dial(SIP/${EXTEN})

Reliably Transmitting (no NAT) to 10.200.0.2:41522:
INVITE sip:2...@10.200.0.2:41522;rinstance=2ffb445bc1c20491;transport=udp;PRUEBA
SIP/2.0
Via: SIP/2.0/UDP 10.200.0.1:5060;branch=z9hG4bK0769ac19
From: "device" <sip:2...@10.200.0.1>;tag=as5daf31ed
To: <sip:2...@10.200.0.2:41522;rinstance=2ffb445bc1c20491;transport=udp;PRUEBA>
Contact: <sip:2...@10.200.0.1>
[...]

> > /* If custom URI options have been provided, append them */
> > if (p->options && p->options->uri_options)
> > ast_build_string(&invite, &invite_max, ";%s",
> > p->options->uri_options);
> >
> >
> > Es decir, añade a uri un punto y coma, seguido de lo que contenga la
> > variable SIP_URI_OPTIONS.
>
> Si, pero a que no encuentras la parte del código que setea la variable
> ¿? ;-) , es que no existe.

Esa variable la asignas tú desde el dialplan. La parte en la que el
canal "lee" esa variable, está aproximadamente en la línea 2914 de
chan_sip:
} else if (!p->options->uri_options &&
!strcasecmp(ast_var_name(current), "SIP_URI_OPTIONS")) {
p->options->uri_options = ast_var_value(current);
}

Y luego, más adelante, en la función initreqprep(), es cuando utiliza
el valor de options->uri_options.


Saludos
Julián J. Menéndez

Raúl Alexis Betancor Santana

unread,
Sep 26, 2007, 9:08:23 AM9/26/07
to aster...@googlegroups.com
On Wednesday 26 September 2007 09:22:31 Julian J. M. wrote:
> On 9/26/07, Raúl Alexis Betancor Santana <ra...@dimension-virtual.com> wrote:
> > El Tuesday 25 September 2007 23:44:27 Julian J. M. escribió:
> > > No es una función, es una variable, r/w.
> >
> > Yo no dije que fuera función, dije que era una variable de solo lectura
>
> Las variables de solo lectura no existen. No hay nada que te impida
> asignarle un valor a una variable.

Extraido de la documentacion de AstVar:

...
Variables marked with a * are builtin functions and can't be set,
only read in the dialplan. Writes to such variables are silently
ignored.
...
${SIP_URI_OPTIONS} * additional options to add to the URI for an outgoing call
...

Con un Set(SIP_URI_OPTIONS= ...) no pasa nada.

> Reconozco que hay un error en el ejemplo anterior, pero no es el que
> crees. La variable SIP_URI_OPTIONS no se está copiando al nuevo canal.
> Y por eso no se tiene en cuenta su valor. Si le añadimos un guión bajo
> (_) delante de SIP_URI_OPTIONS, la variable pasa al nuevo canal
> (SIP/proveedor-3b3b3b3), y cuando hace el invite, añade su contenido
> al uri. Ejemplo:
> exten => 205,1,Set(_SIP_URI_OPTIONS="PRUEBA")
> exten => 205,2,Dial(SIP/${EXTEN})

Umm, no había pensado en la malicia de la herencia de variables, voy a
probarlo.

> Reliably Transmitting (no NAT) to 10.200.0.2:41522:
> INVITE
> sip:2...@10.200.0.2:41522;rinstance=2ffb445bc1c20491;transport=udp;PRUEBA
> SIP/2.0
> Via: SIP/2.0/UDP 10.200.0.1:5060;branch=z9hG4bK0769ac19
> From: "device" <sip:2...@10.200.0.1>;tag=as5daf31ed
> To:
> <sip:2...@10.200.0.2:41522;rinstance=2ffb445bc1c20491;transport=udp;PRUEBA>
> Contact: <sip:2...@10.200.0.1>

En realidad yo necesito añadir cosas al From: (from-spec)

> Esa variable la asignas tú desde el dialplan. La parte en la que el
> canal "lee" esa variable, está aproximadamente en la línea 2914 de
> chan_sip:
> } else if (!p->options->uri_options &&
> !strcasecmp(ast_var_name(current), "SIP_URI_OPTIONS")) {
> p->options->uri_options = ast_var_value(current);
> }
>
> Y luego, más adelante, en la función initreqprep(), es cuando utiliza
> el valor de options->uri_options.

Ok, volveré a probar con lo de la herencia.


--

Julian J. M.

unread,
Sep 26, 2007, 9:06:21 AM9/26/07
to aster...@googlegroups.com
On 9/26/07, Raúl Alexis Betancor Santana <ra...@dimension-virtual.com> wrote:
> > Las variables de solo lectura no existen. No hay nada que te impida
> > asignarle un valor a una variable.
>
> Extraido de la documentacion de AstVar:
> ...
> Variables marked with a * are builtin functions and can't be set,
> only read in the dialplan. Writes to such variables are silently
> ignored.
> ...
> ${SIP_URI_OPTIONS} * additional options to add to the URI for an outgoing call
> ...

La documentación dice una cosa, y el código otra... Seguramente en
algún momento, SIP_URI_OPTIONS fuese una función, o estuviese en
proceso de serlo.

> > Reliably Transmitting (no NAT) to 10.200.0.2:41522:
> > INVITE
> > sip:2...@10.200.0.2:41522;rinstance=2ffb445bc1c20491;transport=udp;PRUEBA
> > SIP/2.0
> > Via: SIP/2.0/UDP 10.200.0.1:5060;branch=z9hG4bK0769ac19
> > From: "device" <sip:2...@10.200.0.1>;tag=as5daf31ed
> > To:
> > <sip:2...@10.200.0.2:41522;rinstance=2ffb445bc1c20491;transport=udp;PRUEBA>
> > Contact: <sip:2...@10.200.0.1>
>
> En realidad yo necesito añadir cosas al From: (from-spec)

He revisado el código, y no hay forma de añadirle nada. Solo es
cuestión de un miniparche de 4 a 6 líneas ;)

Julián J. Menéndez

Adrià Vidal

unread,
Sep 26, 2007, 11:38:23 AM9/26/07
to aster...@googlegroups.com
Creo que ${SIP_HEADER(headername)}) es lo que estas buscando.

Adrià Vidal
Adam Telefonia IP



http://www.voip-info.org/wiki/index.php?page=Asterisk+func+sip_header

El día 26/09/07, Julian J. M. <juli...@gmail.com> escribió:

Raúl Alexis Betancor Santana

unread,
Sep 26, 2007, 12:52:16 PM9/26/07
to aster...@googlegroups.com
El Wednesday 26 September 2007 13:06:21 Julian J. M. escribió:

> > En realidad yo necesito añadir cosas al From: (from-spec)
>
> He revisado el código, y no hay forma de añadirle nada. Solo es
> cuestión de un miniparche de 4 a 6 líneas ;)

Si, ya he visto donde ... joder .. cada vez que tengo que leer algo del código
de chan_sip me dan mareos .. XDD

--
Saludos.

Raúl Alexis Betancor Santana

unread,
Sep 26, 2007, 12:54:00 PM9/26/07
to aster...@googlegroups.com
El Wednesday 26 September 2007 15:38:23 Adrià Vidal escribió:
> Creo que ${SIP_HEADER(headername)}) es lo que estas buscando.

Eso sirve para "extraer" cabeceras y ponerlas en variables, dice textualmente
la documentación:

...
Bugs and limitations
Contrary to previously claimed,SIP_HEADER is read-only.
This example does "not" work!
exten => s,1,Set(SIP_HEADER(headername)=Foo Fighters)

De todas formas creo que voy a terminar pasando bastante de Asterisk para lo
que estaba montando y usaré sippy o algún otro software que actúe de b2bua y
me permita hacer "marranadas" con los paquetes.

--
Saludos.

Adrià Vidal

unread,
Sep 27, 2007, 3:11:06 AM9/27/07
to aster...@googlegroups.com
Ya te digo yo que con este parametro inserto headers personalizados.

El día 26/09/07, Raúl Alexis Betancor Santana < ra...@dimension-virtual.com> escribió:

Saúl Ibarra

unread,
Sep 27, 2007, 3:37:33 AM9/27/07
to aster...@googlegroups.com
Parece que modificando el valor de la variable SIPADDHEADER puedes
añadir cabeceras... Te sirve?

02899 } else if (!p->options->addsipheaders &&
!strncasecmp(ast_var_name(current), "SIPADDHEADER",
strlen("SIPADDHEADER"))) {
02900 /* Check whether there is a variable with a name
starting with SIPADDHEADER */

El 27/09/07, Adrià Vidal <adria...@gmail.com> escribió:


--
Saúl -- "Nunca subestimes el ancho de banda de un camión lleno de disketes."
----------------------------------------------------------------
http://www.saghul.net/

Julian J. M.

unread,
Sep 27, 2007, 3:58:47 AM9/27/07
to aster...@googlegroups.com
De hecho, si quieres añadir varias cabeceras, lo puedes hacer
asignando añadiendo un contador al final de la variable:
SIPADDHEADER1
SIPADDHEADER2
SIPADDHEADER3
...

Julian J. M.

On 9/27/07, Saúl Ibarra <sag...@gmail.com> wrote:
> Parece que modificando el valor de la variable SIPADDHEADER puedes

> a�adir cabeceras... Te sirve?

Reply all
Reply to author
Forward
0 new messages