Posts in Category: SIP

Session Initiation Protocol

Asterisk, Sangoma A101 y OpenR2.

Instalaremos Asterisk, DAHDI, OpenR2 y WANPIPE para configurar un enlace telefónico E1 de TELMEX en México, sera la tercera guía rápida que hago cada una con distintas tarjetas, Digium y OpenVox.
El sistema operativo que utilizaremos sera Linux Red Hat Enterprise Linux 5.6 para arquitectura de 64 bits, el equipo donde desarrollaremos las pruebas es un HP Proliant ML150, una tarjeta Sangoma A101 1-port T1/E1/J1 y conectores para los coaxiales para la conversión a RJ45. Instalaremos el sistema y utilizaremos únicamente paquetes que vienen junto con los discos de instalación, no usaremos yum para instalar ni actualizar paquetes principalmente para verificar los paquetes que son necesarios para compilar asterisk, dahdi y wanpipe (puedes utilizar CentOS por aquello de la licencia de RedHat).

No cubriremos la instalación de Red Hat hay demasiada información en la red para consultar solo hacemos mención que se instala sin entorno gráfico y demás aplicaciones no necesarias para un servidor de las características mencionadas. Los paquetes los tomaremos y los instalaremos usando la imagen ISO de RHEL montándolo en un directorio para instalarlos mediante RPM, ya que tenemos instalado todo el sistema operativo y conectado adecuadamente a una red con acceso a Internet procederemos a lo siguiente:

Crearemos un directorio denominado IPBX dentro de /usr/src que sera nuestro directorio de instalación, dentro de el crearemos otro directorio denominado Disco donde montaremos la ISO de instalación de Red Hat, para acceder a los paquetes.

[root@asterisksangoma ~]# mkdir /usr/src/IPBX
[root@asterisksangoma ~]# cd /usr/src/IPBX/
[root@asterisksangoma IPBX]# mkdir Disco
[root@asterisksangoma IPBX]# mount -t iso9660 -o loop rhel-server-5.6-x86_64-dvd.iso Disco/
[root@asterisksangoma IPBX]# cd Disco/Server/

Estos son los paquetes que tuve que instalar para la compilación de wanpipe, dahdi, asterisk y openr2, hay dependencias entre ellos por lo tanto es necesario instalarlos todos, con yum o createrepo es mas automático sin embargo no son muchos paquetes y de esta manera uno se da cuenta de los necesarios.

[root@asterisksangoma Server]# rpm -ivh kernel-devel-2.6.18-238.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh ncurses-devel-5.5-24.20060715.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh ncurses-5.5-24.20060715.x86_64.rpm *
[root@asterisksangoma Server]# rpm -ivh kernel-headers-2.6.18-238.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh glibc-headers-2.5-58.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh glibc-devel-2.5-58.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh gcc-4.1.2-50.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh flex-2.5.4a-41.fc6.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh patch-2.5.4-31.el5.x86_64.rpm *
[root@asterisksangoma Server]# rpm -ivh libtermcap-devel-2.0.8-46.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh bison-2.3-2.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh imake-1.0.2-3.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh autoconf-2.59-12.noarch.rpm
[root@asterisksangoma Server]# rpm -ivh automake-1.9.6-2.3.el5.noarch.rpm
[root@asterisksangoma Server]# rpm -ivh libtool-1.5.22-7.el5_4.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh libstdc++-devel-4.1.2-50.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh gcc-c++-4.1.2-50.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh slang-devel-2.0.6-4.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh newt-devel-0.52.2-15.el5.x86_64.rpm 
[root@asterisksangoma Server]# rpm -ivh zlib-devel-1.2.3-3.x86_64.rpm 
[root@asterisksangoma Server]# rpm -ivh libxml2-devel-2.6.26-2.1.2.8.el5_5.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh e2fsprogs-devel-1.39-23.el5_5.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh keyutils-libs-devel-1.2-1.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh libsepol-devel-1.15.2-3.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh libselinux-devel-1.33.4-5.7.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh krb5-devel-1.6.1-55.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh openssl-devel-0.9.8e-12.el5_5.7.x86_64.rpm

En el directorio de IPBX descargaremos las ultimas versiones de cada una de las aplicaciones que vamos a utilizar, para este caso usaremos Wanpipe 3.5.20, Asterisk 1.8.4, DAHDI linux 2.4.1.2, DAHDI tools 2.4.1 y OpenR2 1.3.1.

[root@asterisksangoma IPBX]# wget ftp://ftp.sangoma.com/linux/current_wanpipe/wanpipe-3.5.20.tgz
[root@asterisksangoma IPBX]# wget http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/dahdi-linux-2.4.1.2.tar.gz
[root@asterisksangoma IPBX]# wget http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools-2.4.1.tar.gz
[root@asterisksangoma IPBX]# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8.4.tar.gz
[root@asterisksangoma IPBX]# wget http://openr2.googlecode.com/files/openr2-1.3.1.tar.gz

Antes que nada debemos conectar al equipo la tarjeta y verificar que se reconocida por Linux, mediante lspci verificamos que adecuadamente el sistema operativo la reconoció y nos muestra donde esta conectada físicamente.
La tarjeta en cuestión:
A102
Puerto PCI del equipo.

[root@asterisksangoma ~]# lspci | grep Net
07:00.0 Network controller: Sangoma Technologies Corp. A200/Remora FXO/FXS Analog AFT card
07:01.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5703X Gigabit Ethernet (rev 02)

Procedemos con la instalación de los módulos de DAHDI y posteriormente la instalación de Wanpipe ya que vamos a utilizar DAHDI especificamos al script de instalación el parámetro dahdi.

[root@asterisksangoma IPBX]# tar xfz dahdi-linux-2.4.1.2.tar.gz
[root@asterisksangoma IPBX]# cd dahdi-linux-2.4.1.2
[root@asterisksangoma dahdi-linux-2.4.1.2]# make
[root@asterisksangoma dahdi-linux-2.4.1.2]# make install
[root@asterisksangoma dahdi-linux-2.4.1.2]# cd ..
 
[root@asterisksangoma IPBX]# tar xfz wanpipe-3.5.20.tgz
[root@asterisksangoma IPBX]# cd wanpipe-3.5.20


El script de instalación verificara los componentes necesarios como son paquetes, librerías del kernel utilizado y el directorio de DAHDI a utilizar.

[root@asterisksangoma wanpipe-3.5.20]# ./Setup dahdi
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE INSTALLATION FOR DAHDI
 
You are about to install WANPIPE TDM Voice drivers
for Asterisk/Dahdi framework.
 
You will be prompted for path to DAHDI source.
 
Wanpipe drivers will compile into dahdi WITHOUT any
dahdi patching or need to recompile dahdi modules.
 
You must have Linux Kernel Headers along with
full development tools (i.e. GNU C compiler and utilities)
installed in order to be able to install this product.
 
If you have previoulsy installed WANPIPE, this release
will overrite/upgrade full release without the need to
uninstall first!
 
IMPORTANT:
It is always recommended to say YES to all options
prompted during the install!
 
Please visit: http://wiki.sangoma.com for more info.
 
Would you like to install WANPIPE now? [y] (y/n) y
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
Fixing file permissions...
 
Verifying files and fixing permissions ...Done
Checking for C developement tools ...(gcc) OK
Checking for C++ developement tools ...OK
Checking for Make utility ...OK
Checking for ncurses library ... OK
Checking for Perl developement tools ...OK
Checking for AWK ...OK
Checking for FLEX ...OK
Checking for Patch ...OK
Checking for libtermcap-devel...OK
Checking for bison...OK
Checking for libtool...OK
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
Installing WANPIPE Device Drivers: Linux KERNEL
 
To integrate WANPIPE Multi-Protocol Voice & WAN Router 
modules into the Linux kernel, the kernel has to be 
updated with latest wanpipe sources.  Install will only
modify existing wanpipe source that is already in the
Kernel. 
 
IMPORTANT:
It is always recommended to say YES to all options 
prompted during the install!
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
Please specify absolute path name of your linux headers/source directory
 
Press Enter for Default: /lib/modules/2.6.18-238.el5/build
 
#>Setting linux directory to /lib/modules/2.6.18-238.el5/build
 
 
 
Upgrading WANPIPE kernel documentation ...Done.
 
 
Installing WANPIPE include headers ...Done.
 
WANPIPE device drivers upgraded successfully!
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE KERNEL DRIVER COMPILATION
 
The next step in WANPIPE installation involves compiling 
WANPIPE kernel modules.  
 
This script will compile and install WANPIPE modules
into the currently running linux kernel.
 
For greater customization you will be prompted to
select which Protocol/Drivers you would like to
build into the WANPIPE kernel modules.
 
Wanpipe for Asterisk/Dahdi/Zaptel
	Default for Asterisk/Dahdi/Zaptel
Wanpipe for Wan Routing/API 
	Default for Wan/IP Routing and Data API
Wanpipe for Asterisk SMG/SS7
	Default for Asterisk SS7
Wanpipe for TDM API
	Default for FreeSwitch and Voice API 	
 
Custom Compilation:
------------------
  Customise WANPIPE driver compilation to add only the
  protocols that you need.  This way one can reduce
  the size of the WANPIPE kernel drivers.
 
Refer to http://wiki.sangoma.com for more info
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
	Please Select Compilation Mode
 
1. WAN Protocols Support 
       Protocols: Frame Relay, CHDLC, PPP, ATM, X25, ADSL, TDM API
       Default for: Wan Routing, Data & Voice API devel.
 
2. TDM Voice (Dahdi/Zaptel) Support 
       Protocols: TDMV (Dahid/Zaptel), TDM API on AFT adatpers.
       Default for: Asterisk & CallWeaver
 
3. TDM Voice (Dahid/Zaptel) + WAN Protocol Support
 
4. SMG (SS7) (Default for Asterisk SMG/SS7 install)
 
5. SMG (SS7) + TDM Voice (Dahdi/Zaptel)
       Default for: Asterisk SS7 + PRI
 
6. SMG (BRI) (Default for Asterisk SMG/BRI install)
 
7. SMG (BRI) + TDM Voice (Dahdi/Zaptel)
       Default for: Asterisk BRI + PRI + Analog
 
8. SMG (PRI) (Default for Asterisk SMG/PRI install)
 
9. SMG (PRI) + TDM Voice (Dahdi/Zaptel)
       Default for: Asterisk SMG/PRI + Analog
 
10. TDM API  
       Protocols: TDM API on AFT adapters:
       Default for: FreeSwitch, Yate, Sunrise
                    Custom voice development 
 
11. Custom Compilation Mode
       Specify protocols to be added into the WANPIPE
       kernel drivers.
 
Please select (1-11) [Default: 1]: 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
Looking for zaptel/dahdi directory in /usr/src ...
-------------------------------------------
1 : /usr/src/IPBX/dahdi-linux-2.4.1.2 
------------------------------------------ 
------------------------------------------ 
m : Enter zaptel path manually
 
(ctrl-c to Exit)
Please select working zaptel directory [1-1][m]: 1
 
Enabling the TDM Voice Asterisk Support
 
Dahdi HW HDLC Support Detected: Enabling DCHAN Feature
Native Dahdi HW HDLC Support Detected - No patch required
Dahdi source unmodified
 
Checking for UDEV Zaptel compatibility...     Dahdi installed, no need to add UDEV rules
Enabling the AFT TE1 Support
 
Checking for SMP support ...Enabled.
 
Checking current processor type ...x86_64
 
Wan Update Flags:  -DAF_WANPIPE_2612_FORCE_UPDATE -DWANPIPE_MOD_266_FORCE_UPDATE
 
 
--------------------------------------------------
CFLAGS: gcc -Wp,-MD,.wanpipe.o.d -nostdinc -iwithprefix include -D__LINUX__ -Dlinux -D__KERNEL__ -I/usr/include/wanpipe -I/lib/modules/2.6.18-238.el5/build/include  -DMODULE   -DAF_WANPIPE_2612_FORCE_UPDATE -DWANPIPE_MOD_266_FORCE_UPDATE   -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Wstrict-prototypes -Wundef -Werror-implicit-function-declaration -fno-delete-null-pointer-checks -fwrapv -Os  -mtune=generic -m64 -mno-red-zone -mcmodel=kernel -pipe -fno-reorder-blocks -Wno-sign-compare -fno-asynchronous-unwind-tables -funit-at-a-time -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fomit-frame-pointer -g  -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -D__KERNEL__ -Iinclude  -include include/linux/autoconf.h  
--------------------------------------------------
 
Checking for REGPARM kernel option ...Disabled.
 
Compiling General WANPIPE Driver for 2.6.X Kernel .....Done.
 
 
WAN HWEC module enabled and compiled!
Linking Wanpipe Driver and protocols ...Done.
 
Updating Kernel Modules ...Done.
 
Compilation Successful.
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE META CONFIGURATION
 
There are two configuration files associated with WANPIPE.  
 
1) /usr/src/IPBX/wanpipe-3.5.20/wanrouter.rc: 
	- defines locations of important files such as lock
	  and configuration files as well as start/stop 
	  order of multiple WANPIPE devices.
2) /usr/src/IPBX/wanpipe-3.5.20/wanpipe1.conf:
	- main configuration file for each WANPIPE device.
	- defines interfaces, hardware and protocol information.
	- this file can be created using the 'wancfg' GUI
	  utility or manually based on sample files located
	  in /etc/wanpipe/samples.
 
Please read the WanpipeInstallation.(pdf/txt) manual for further
information.
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE UTILITIES SETUP
 
WANPIPE utilities are used to:
	1) create configuration files: for Zaptel and Asterisk
		/usr/sbin/wancfg_zaptel	#Zaptel and Asterisk
		/usr/sbin/wancfg_dahdi	#Dahdi and Asterisk
		/usr/sbin/wancfg_smg	#BRI/SS7, Zaptel and Asterisk
		/usr/sbin/wancfg_tdmapi	#TDM API
	2) create WANPIPE WAN/IP configuration files.
		(/usr/sbin/wancfg)
	3) start,stop,restart individual/all devices and interfaces.
		(/usr/sbin/wanrouter)
	4) debug line, protocol and driver problems.
		(/usr/sbin/wanpipemon)
	5) aid in WANPIPE API development
		(/etc/wanpipe/api)
 
Refer to the WanpipeInstallation.(pdf/txt) for more information.
 
 
Compiling WANPIPE Utilities ...Done.
 
 
Compiling WANPIPE WanCfg Utility ...Done.
 
 
Compiling WANPIPE LibSangoma API library ...Done.
 
 
Compiling WANPIPE LibStelephony API library ...Done.
 
 
Compiling WANPIPE API Development Utilities ...Done.
 
Compiling WANPIPE HWEC Utilities ...Done.
 
 
	WANPIPE Environment Setup Complete !!!
 
Installing WANPIPE Files ... !
Installing  WANPIPE Utilities in /usr/sbin
Installing wanrouter.rc in /etc/wanpipe
Installing wanpipe libraries in /etc/wanpipe
Installing firmware in /etc/wanpipe/firmware
Installing documentation in /usr/share/doc/wanpipe
Installing sample api code in /etc/wanpipe/api
Installing AFT Firmware update utility in /etc/wanpipe/util
Installing driver headers in /etc/wanpipe/api/include/linux
Installing Hardware Echo Cancel Utilites
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE INSTALLATON: COMPLETE
 
WANPIPE installation is now complete. WANPIPE kernel drivers 
and configuration/debug utilities have been compiled and installed.
 
	1) Proceed to configure the WANPIPE drivers:
		Asterisk/Zaptel  : /usr/sbin/wancfg_zaptel
		Asterisk/Dahdi   : /usr/sbin/wancfg_dahdi
		TDM API          : /usr/sbin/wancfg_tdmapi
		SMG SS7/BRI/PRI  : /usr/sbin/wancfg_smg
		WAN Routing/API  : /usr/sbin/wancfg
	2) Use the /usr/sbin/wanrouter startup script to start and stop
	   the router. (eg: wanrouter start)
	3) To uninstall WANPIPE package run ./Setup remove
 
Please read http://wiki.sangoma.com for further instructions.
 
 
Wanpipe / Zaptel Configuration
==============================
 
wancfg_zaptel configurator can create all wanpipe config files
for ZAPTEL including /etc/zaptel.conf file.
Optionally: the configurator can also create Asterisk zapata.conf
-----------------------------------------------------
Would you like to configure wanpipe devices for DAHDI? (y/n) n
Wanpipe Installation Complete
-----------------------------
Please proceed to configure wanpipe user /usr/sbin/wancfg_dahdi

Hasta aquí termina la instalación le dimos la opción de que no configurara de momento los dispositivos esto lo haremos después con otro script del programa instalado aparte de que al final editaremos manualmente nuestro archivo de configuración.
Con el comando wanrouter recién instalado verificamos que nuestra tarjeta sea reconocida efectivamente por wanpipe.

[root@asterisksangoma wanpipe-3.5.20]# wanrouter hwprobe
 
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . AFT-A101-SH : SLOT=0 : BUS=7 : IRQ=7 : CPU=A : PORT=1 : HWEC=32 : V=37
 
Card Cnt: A101-2=1

Vemos que satisfactoriamente esta reconocida por la aplicación, aquí en este punto especial introduzco el siguiente error que se presento en diversos intentos de instalación con otros kernel o sin la tarjeta E1 en el puerto PCI del equipo en cuestión.

FATAL: Error inserting wanpipe (/lib/modules/2.6.18-238.el5/kernel/drivers/net/wan/wanpipe.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Would you like to generate /etc/asterisk/zapata.conf

Iniciamos el script de configuración tomando los pasos de un white paper denominado “Running MFC/R2 with Sangoma Wanpipe® using OpenR2 (libopenr2)“, para generar el archivo de configuración de wanpipe.

[root@asterisksangoma wanpipe-3.5.20]# wancfg_dahdi 
 
########################################################################
#    		           Sangoma Wanpipe                             #
#        Dahdi/Zaptel/SMG/TDMAPI/BOOT Configuration Script             #
#                             v2.39                                  #
#                     Sangoma Technologies Inc.                        #
#                        Copyright(c) 2009.                            #
########################################################################
 
Would you like to generate /etc/asterisk/chan_dahdi.conf
 1. YES
 2. NO
[1-2]:1
 
---------------------------------------------
Configuring T1/E1 cards [A101/A102/A104/A108]
---------------------------------------------
A101 detected on slot:0 bus:7
 
-----------------------------------------------------------
Configuring port 1 on A101 slot:0 bus:7.
-----------------------------------------------------------
 
Select media type for AFT-A101 on port 1 [slot:0 bus:7 span:1]
 1. T1
 2. E1
 3. Unused
 4. Exit
[1-4]:2
 
Configuring port 1 on 101 as E1, line coding:HDB3, framing:CRC4 
 1. YES - Keep these settings
 2. NO  - Configure line coding and framing
[1-2, ENTER='YES']:1
 
Select clock for AFT-A101 on port 1 [slot:0 bus:7 span:1]
 1. NORMAL
 2. MASTER
[1-2]:1
 
Select signalling type for AFT-A101 on port 1 [slot:0 bus:7 span:1]
 1. Zaptel/Dahdi - PRI CPE
 2. Zaptel/Dahdi - PRI NET
 3. Zaptel/Dahdi - E & M
 4. Zaptel/Dahdi - E & M Wink
 5. Zaptel/Dahdi - FXS - Loop Start
 6. Zaptel/Dahdi - FXS - Ground Start
 7. Zaptel/Dahdi - FXS - Kewl Start
 8. Zaptel/Dahdi - FX0 - Loop Start
 9. Zaptel/Dahdi - FX0 - Ground Start
 10. Zaptel/Dahdi - FX0 - Kewl Start
 11. Sangoma SMG/sangoma_prid- PRI CPE
 12. Sangoma SMG/sangoma_prid- PRI NET
[1-12]:5
 
 
Would you like to enable hardware DTMF detection?
 1. YES
 2. NO
[1-2, ENTER='YES']:1
 
Would you like to enable hardware fax detection?
 1. YES
 2. NO
[1-2, ENTER='NO']:1
 
Configuring port 1 on AFT-A101 as a full E1
 1. YES - Use all channels
 2. NO  - Configure for fractional
[1-2, ENTER='YES']:1
 
Select dialplan context for AFT-A101 on port 1
 1. from-pstn
 2. from-internal
 3. Custom
[1-3]:1
 
 
Port 1 on AFT-A101 configuration complete...
Press any key to continue: 
 
T1/E1 card configuration complete.
Press any key to continue: 
 
------------------------------------
Configuring analog cards [A200/A400/B600/B700/B800]
------------------------------------
 
------------------------------------
Configuring USB devices [U100]
------------------------------------
 
###################################################################
#                             SUMMARY                             #
###################################################################
 
  1 T1/E1 port(s) detected, 1 configured
  0 ISDN BRI port(s) detected, 0 configured
  0 analog card(s) detected, 0 configured
  0 usb device(s) detected, 0 configured
 
Configurator will create the following files:
	1. Wanpipe config files in /etc/wanpipe
	2. Dahdi config file /etc/dahdi/system.conf
	3. Chan-Dahdi config file /etc/asterisk/chan_dahdi.conf
 
 
Your original configuration files will be saved to:
	1. /etc/dahdi/system.conf.bak 
	2. /etc/asterisk/chan_dahdi.conf.bak 
 
 
Your configuration has been saved in /etc/wanpipe/debug-2011-05-15.tgz.
When requesting support, email this file to techdesk@sangoma.com
 
 
###################################################################
 
Configuration Complete! Please select following:
 1. YES - Continue
 2. NO - Exit
[1-2]:
 
Dahdi and Wanpipe configuration complete: choose action
 1. Save cfg: Restart Asterisk & Wanpipe now
 2. Save cfg: Restart Asterisk & Wanpipe when convenient
 3. Save cfg: Stop Asterisk & Wanpipe now
 4. Save cfg: Stop Asterisk & Wanpipe when convenient
 5. Save cfg: Save cfg only (Not Recommanded!!!)
 6. Do not save cfg: Exit
[1-6]:5
 
 
Removing old configuration files...
 
Copying new Wanpipe configuration files...
 
Copying new Dahdi configuration file (/etc/dahdi/system.conf)...
cp: cannot create regular file `/etc/dahdi/system.conf': No such file or directory
Error executing command:
cp -f /etc/wanpipe/wancfg_zaptel/tmp_cfg/zaptel.conf /etc/dahdi/system.conf
 
Would you like to continue?
 1. No - exit
 2. YES
[1-2, ENTER='No']:2
 
 
Copying new Chan-Dahdi configuration files (/etc/asterisk/chan_dahdi.conf)...
cp: cannot create regular file `/etc/asterisk/chan_dahdi.conf': No such file or directory
Error executing command:
cp -f /etc/wanpipe/wancfg_zaptel/tmp_cfg/zapata.conf /etc/asterisk/chan_dahdi.conf
 
Would you like to continue?
 1. No - exit
 2. YES
[1-2, ENTER='No']:2
 
Saving files only
Current boot level is 3
 
Wanrouter boot scripts configuration...
 
Removing existing wanrouter boot scripts...OK
Would you like wanrouter to start on system boot?
 1. YES
 2. NO
[1-2]:1
 
Verifying Dahdi boot scripts...
Verifying Dahdi boot scripts...Not installed
Verifying Dahdi shutdown scripts...Not installed
Enabling wanrouter boot scripts ...(level:8)
Enabling wanrouter shutdown scripts ...(level:91)
Remvoing old smg_ctrl boot.....OK
Remvoing old smg_ctrl_safe boot.....OK

Posteriormente realizaremos unos cambios en el archivo de configuración, vamos a verificar que wanrouter nos muestre el dispositivo.

[root@asterisksangoma wanpipe-3.5.20]# wanrouter start
 
Starting up device: wanpipe1
--> Loading ec image OCT6116-64S.ima...
Configuring interfaces: w1g1 
done.
 
[root@asterisksangoma wanpipe-3.5.20]# wanrouter list
 
Devices currently active:
	wanpipe1
 
[root@asterisksangoma wanpipe-3.5.20]# wanrouter status
 
Devices currently active:
	wanpipe1
 
 
Wanpipe Config:
 
Device name | Protocol Map | Adapter  | IRQ | Slot/IO | If's | CLK | Baud rate |
wanpipe1    | N/A          | A101/1D/A102/2D/4/4D/8| 169 | 0       | 1    | N/A | 0         |
 
Wanrouter Status:
 
Device name | Protocol | Station | Status        |
wanpipe1    | AFT TE1  | N/A     | Disconnected  |

Instalamos las herramientas de DAHDI para usar dahdi_tool.

[root@asterisksangoma wanpipe-3.5.20]# cd ..
[root@asterisksangoma IPBX]# tar xfz dahdi-tools-2.4.1.tar.gz 
[root@asterisksangoma IPBX]# cd dahdi-tools-2.4.1
[root@asterisksangoma dahdi-tools-2.4.1]# ./configure
[root@asterisksangoma dahdi-tools-2.4.1]# make
[root@asterisksangoma dahdi-tools-2.4.1]# make install
[root@asterisksangoma dahdi-tools-2.4.1]# make config
[root@asterisksangoma dahdi-tools-2.4.1]# cd ..

Compilamos e instalamos OpenR2 según las indicaciones del manual colocado en la pagina del autor.

[root@asterisksangoma IPBX]# tar xvfz openr2-1.3.1.tar.gz 
[root@asterisksangoma IPBX]# cd openr2-1.3.1
[root@asterisksangoma openr2-1.3.1]# ./configure --prefix=/usr
[root@asterisksangoma openr2-1.3.1]# make
[root@asterisksangoma openr2-1.3.1]# make install

Por ultimo compilamos e instalamos Asterisk.

[root@asterisksangoma IPBX]# tar xfz asterisk-1.8.4.tar.gz 
[root@asterisksangoma IPBX]# cd asterisk-1.8.4
[root@asterisksangoma IPBX]# ./configure
[root@asterisksangoma IPBX]# make
[root@asterisksangoma IPBX]# make install
[root@asterisksangoma IPBX]# make samples

Verificamos que el soporte de OpenR2 este correctamente instalado en Asterisk.

[root@asterisksangoma asterisk-1.8.4]# ldd channels/chan_dahdi.so | grep openr2
	libopenr2.so.3 => /usr/lib64/libopenr2.so.3 (0x00002ab1f4dbe000)

Configuraremos DAHDI con los siguientes parámetros específicos para el E1 de TELMEX, son treinta canales posibles de comunicación con el canal 16 para señalización.

[root@asterisksangoma IPBX]# vi /etc/dahdi/system.conf 
span=1,1,0,cas,hdb3
cas=1-15:1101
dchan=16
cas=17-31:1101
 
loadzone=us
defaultzone=us

Cargamos la configuración.

[root@asterisksangoma IPBX]# dahdi_cfg -vv
DAHDI Tools Version - 2.4.1
 
DAHDI Version: 2.4.1.2
Echo Canceller(s): 
Configuration
======================
 
SPAN 1: CAS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
 
Channel map:
 
Channel 01: CAS / User (Default) (Echo Canceler: none) (Slaves: 01)
Channel 02: CAS / User (Default) (Echo Canceler: none) (Slaves: 02)
Channel 03: CAS / User (Default) (Echo Canceler: none) (Slaves: 03)
Channel 04: CAS / User (Default) (Echo Canceler: none) (Slaves: 04)
Channel 05: CAS / User (Default) (Echo Canceler: none) (Slaves: 05)
Channel 06: CAS / User (Default) (Echo Canceler: none) (Slaves: 06)
Channel 07: CAS / User (Default) (Echo Canceler: none) (Slaves: 07)
Channel 08: CAS / User (Default) (Echo Canceler: none) (Slaves: 08)
Channel 09: CAS / User (Default) (Echo Canceler: none) (Slaves: 09)
Channel 10: CAS / User (Default) (Echo Canceler: none) (Slaves: 10)
Channel 11: CAS / User (Default) (Echo Canceler: none) (Slaves: 11)
Channel 12: CAS / User (Default) (Echo Canceler: none) (Slaves: 12)
Channel 13: CAS / User (Default) (Echo Canceler: none) (Slaves: 13)
Channel 14: CAS / User (Default) (Echo Canceler: none) (Slaves: 14)
Channel 15: CAS / User (Default) (Echo Canceler: none) (Slaves: 15)
Channel 16: D-channel (Default) (Echo Canceler: none) (Slaves: 16)
Channel 17: CAS / User (Default) (Echo Canceler: none) (Slaves: 17)
Channel 18: CAS / User (Default) (Echo Canceler: none) (Slaves: 18)
Channel 19: CAS / User (Default) (Echo Canceler: none) (Slaves: 19)
Channel 20: CAS / User (Default) (Echo Canceler: none) (Slaves: 20)
Channel 21: CAS / User (Default) (Echo Canceler: none) (Slaves: 21)
Channel 22: CAS / User (Default) (Echo Canceler: none) (Slaves: 22)
Channel 23: CAS / User (Default) (Echo Canceler: none) (Slaves: 23)
Channel 24: CAS / User (Default) (Echo Canceler: none) (Slaves: 24)
Channel 25: CAS / User (Default) (Echo Canceler: none) (Slaves: 25)
Channel 26: CAS / User (Default) (Echo Canceler: none) (Slaves: 26)
Channel 27: CAS / User (Default) (Echo Canceler: none) (Slaves: 27)
Channel 28: CAS / User (Default) (Echo Canceler: none) (Slaves: 28)
Channel 29: CAS / User (Default) (Echo Canceler: none) (Slaves: 29)
Channel 30: CAS / User (Default) (Echo Canceler: none) (Slaves: 30)
Channel 31: CAS / User (Default) (Echo Canceler: none) (Slaves: 31)
 
31 channels to configure.
 
Setting echocan for channel 1 to none
Setting echocan for channel 2 to none
Setting echocan for channel 3 to none
Setting echocan for channel 4 to none
Setting echocan for channel 5 to none
Setting echocan for channel 6 to none
Setting echocan for channel 7 to none
Setting echocan for channel 8 to none
Setting echocan for channel 9 to none
Setting echocan for channel 10 to none
Setting echocan for channel 11 to none
Setting echocan for channel 12 to none
Setting echocan for channel 13 to none
Setting echocan for channel 14 to none
Setting echocan for channel 15 to none
Setting echocan for channel 16 to none
Setting echocan for channel 17 to none
Setting echocan for channel 18 to none
Setting echocan for channel 19 to none
Setting echocan for channel 20 to none
Setting echocan for channel 21 to none
Setting echocan for channel 22 to none
Setting echocan for channel 23 to none
Setting echocan for channel 24 to none
Setting echocan for channel 25 to none
Setting echocan for channel 26 to none
Setting echocan for channel 27 to none
Setting echocan for channel 28 to none
Setting echocan for channel 29 to none
Setting echocan for channel 30 to none
Setting echocan for channel 31 to none

Configuramos los parámetros con respecto a MFCR2, los DNIS, el contexto y los canales a utilizar, en este caso de los canales uno al veintiuno (el 16 se usa señalización) debido a que mi E1 tiene veinte lineas disponibles.

[root@asterisksangoma ~]# cat /etc/asterisk/chan_dahdi.conf 
[channels] 
signalling=mfcr2 
mfcr2_variant=mx 
mfcr2_get_ani_first=no 
mfcr2_max_ani=10 
mfcr2_max_dnis=4 
mfcr2_category=national_subscriber 
mfcr2_mfback_timeout=-1 
mfcr2_metering_pulse_timeout=-1 
; this is for debugging purposes 
mfcr2_logdir=log 
mfcr2_logging=all 
; end debugging configuration 
context=from-pstn 
group=1 
restrictcid=yes 
hidecallerid=yes 
channel => 1-15 
channel => 17-21

Con esto ya tenemos configurada la parte de Asterisk y DAHDI para solo recibir la señal del E1, vamos a terminar de configurar Wanpipe. Conectar el E1 no basta para que nuestra tarjeta inmediatamente empiece a trabajar, en dado caso wanpipemon nos ayudara a identificar las posibles alarmas existente para lograr poner en verde el led indicador del estado de nuestra tarjeta.
Aquí cito una pagina de la wiki de sangoma donde nos muestran la descripción de cada una de estas alarmas. Aquí wanpipemon muestra las alarmas cuando no tenemos conexión alguna en la tarjeta, nota la alarma de open circuit, loss of framing y loss of frame signal.

[root@asterisksangoma IPBX]# wanpipemon -i w1g1 -c Ta
 
***** w1g1: E1 Rx Alarms (Framer) *****
 
ALOS:	OFF	| LOS:	ON
RED:	ON	| AIS:	OFF
LOF:	ON	| RAI:	OFF
 
***** w1g1: E1 Rx Alarms (LIU) *****
 
Short Circuit:	OFF
Open Circuit:	ON
Loss of Signal:	ON
 
***** w1g1: E1 Tx Alarms *****
 
AIS:	OFF	| YEL:	ON
 
 
***** w1g1: E1 Performance Monitoring Counters *****
 
Line Code Violation	: 0
Far End Block Errors	: 0
CRC4 Errors		: 0
FAS Errors		: 0
 
 
Rx Level	: < -44db

Aquí un ejemplo de la tarjeta conectada con un loop en los coaxiales, esto con el fin de comparar ciertas alarmas que van desde una mala señal enviada por el otro lado de nuestro enlace así como cables invertidos en la conexión, la alarma es la de loss of framing.

[root@asterisksangoma IPBX]# wanpipemon -i w1g1 -c Ta
 
***** w1g1: E1 Rx Alarms (Framer) *****
 
ALOS:	OFF	| LOS:	OFF
RED:	ON	| AIS:	OFF
LOF:	ON	| RAI:	OFF
 
***** w1g1: E1 Rx Alarms (LIU) *****
 
Short Circuit:	OFF
Open Circuit:	OFF
Loss of Signal:	OFF
 
***** w1g1: E1 Tx Alarms *****
 
AIS:	OFF	| YEL:	ON
 
 
***** w1g1: E1 Performance Monitoring Counters *****
 
Line Code Violation	: 725
Far End Block Errors	: 0
CRC4 Errors		: 0
FAS Errors		: 0
 
 
Rx Level	: > -2.5db

En los logs del sistema se pueden presentar mensajes similares a los siguientes haciendo referencia al reloj, en mi caso fue por que el Rx y Tx de los coaxiales estaban invertidos en el balun, sin embargo en la FAQ de Sangoma hay mas causas posibles, también nota que aparecen otras alarmas diferentes en especial la de short circuit que nos indica que los cables están cruzados, y la de remote alarm indication.

[root@asterisksangoma ~]# wanpipemon -i w1g1 -c Ta 
 
***** w1g1: E1 Rx Alarms (Framer) ***** 
 
ALOS:	OFF	| LOS:	OFF 
RED:	ON	| AIS:	OFF 
LOF:	ON	| RAI:	ON 
 
***** w1g1: E1 Rx Alarms (LIU) ***** 
 
Short Circuit:	ON 
Open Circuit:	OFF 
Loss of Signal:	OFF 
 
***** w1g1: E1 Tx Alarms ***** 
 
AIS:	OFF	| YEL:	ON 
 
 
***** w1g1: E1 Performance Monitoring Counters ***** 
 
Line Code Violation	: 826634 
Far End Block Errors	: 0 
CRC4 Errors		: 0 
FAS Errors		: 2166 
 
 
Rx Level	: -40db to -44db
[root@asterisksangoma ~]# tail -f /var/log/messages 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus!

En los casos anteriores el comando dahdi_tool nos mostrara la alarma en la tarjeta y mientras exista Asterisk no podra usarla.


La alarma RED se quitara hasta que logremos configurar adecuadamente la tarjeta y nos deje de mostrar las demás alarmas, anteriormente configuramos con el script, necesitamos cambiar en el archivo wanpipe1.conf dentro del directorio /etc/wanpipe, el tipo de framing a NCRC4 en vez de CRC4 y confirmar la configuración del reloj se encuentre en modo normal.

FE_FRAME	= NCRC4 
TE_CLOCK 	= NORMAL

Conectamos el E1 a la tarjeta y comprobamos las alarmas en ella.

[root@asterisksangoma ~]# wanpipemon -i w1g1 -c Ta 
 
***** w1g1: E1 Rx Alarms (Framer) ***** 
 
ALOS:	OFF	| LOS:	OFF 
RED:	OFF	| AIS:	OFF 
LOF:	OFF	| RAI:	OFF 
 
***** w1g1: E1 Rx Alarms (LIU) ***** 
 
Short Circuit:	OFF 
Open Circuit:	OFF 
Loss of Signal:	OFF 
 
***** w1g1: E1 Tx Alarms ***** 
 
AIS:	OFF	| YEL:	OFF 
 
 
***** w1g1: E1 Performance Monitoring Counters ***** 
 
Line Code Violation	: 2620 
Far End Block Errors	: 0 
CRC4 Errors		: 0 
FAS Errors		: 1507 
 
 
Rx Level	: > -2.5db




Satisfactoriamente no hay ninguna alarma, nuestra tarjeta se pone en verde y esta lista para recibir llamadas, confirmamos con dahdi_tool.


Entramos a la consola de Asterisk y verificamos que los canales estén listos.

asterisksangoma*CLI> mfcr2 show channels 
Chan Variant Max ANI Max DNIS ANI First Immediate Accept Tx CAS   Rx CAS  
   1 MX      10      4        No        No               IDLE     IDLE    
   2 MX      10      4        No        No               IDLE     IDLE    
   3 MX      10      4        No        No               IDLE     IDLE    
   4 MX      10      4        No        No               IDLE     IDLE    
   5 MX      10      4        No        No               IDLE     IDLE    
   6 MX      10      4        No        No               IDLE     IDLE    
   7 MX      10      4        No        No               IDLE     IDLE    
   8 MX      10      4        No        No               IDLE     IDLE    
   9 MX      10      4        No        No               IDLE     IDLE    
  10 MX      10      4        No        No               IDLE     IDLE    
  11 MX      10      4        No        No               IDLE     IDLE    
  12 MX      10      4        No        No               IDLE     IDLE    
  13 MX      10      4        No        No               IDLE     IDLE    
  14 MX      10      4        No        No               IDLE     IDLE    
  15 MX      10      4        No        No               IDLE     IDLE    
  17 MX      10      4        No        No               IDLE     IDLE    
  18 MX      10      4        No        No               IDLE     IDLE    
  19 MX      10      4        No        No               IDLE     IDLE    
  20 MX      10      4        No        No               IDLE     IDLE    
  21 MX      10      4        No        No               IDLE     IDLE    
asterisksangoma*CLI>

DAHDI también se muestra configurado adecuadamente.

asterisksangoma*CLI> dahdi show channels 
   Chan Extension  Context         Language   MOH Interpret        Blocked    State     
 pseudo            default                    default                         In Service 
      1            from-pstn                  default                         In Service 
      2            from-pstn                  default                         In Service 
      3            from-pstn                  default                         In Service 
      4            from-pstn                  default                         In Service 
      5            from-pstn                  default                         In Service 
      6            from-pstn                  default                         In Service 
      7            from-pstn                  default                         In Service 
      8            from-pstn                  default                         In Service 
      9            from-pstn                  default                         In Service 
     10            from-pstn                  default                         In Service 
     11            from-pstn                  default                         In Service 
     12            from-pstn                  default                         In Service 
     13            from-pstn                  default                         In Service 
     14            from-pstn                  default                         In Service 
     15            from-pstn                  default                         In Service 
     17            from-pstn                  default                         In Service 
     18            from-pstn                  default                         In Service 
     19            from-pstn                  default                         In Service 
     20            from-pstn                  default                         In Service 
     21            from-pstn                  default                         In Service 
asterisksangoma*CLI>

Si tenemos la tarjeta con alarma los canales se nos mostraran de la siguiente manera:

asterisksangoma*CLI> dahdi show channels 
   Chan Extension  Context         Language   MOH Interpret        Blocked    State     
 pseudo            default                    default                         In Service 
      1            from-pstn                  default               R         In Service 
      2            from-pstn                  default               R         In Service 
      3            from-pstn                  default               R         In Service 
      4            from-pstn                  default               R         In Service 
      5            from-pstn                  default               R         In Service 
      6            from-pstn                  default               R         In Service 
      7            from-pstn                  default               R         In Service 
      8            from-pstn                  default               R         In Service 
      9            from-pstn                  default               R         In Service 
     10            from-pstn                  default               R         In Service 
     11            from-pstn                  default               R         In Service 
     12            from-pstn                  default               R         In Service 
     13            from-pstn                  default               R         In Service 
     14            from-pstn                  default               R         In Service 
     15            from-pstn                  default               R         In Service 
     17            from-pstn                  default               R         In Service 
     18            from-pstn                  default               R         In Service 
     19            from-pstn                  default               R         In Service 
     20            from-pstn                  default               R         In Service 
     21            from-pstn                  default               R         In Service 
 
asterisksangoma*CLI> mfcr2 show channels 
Chan Variant Max ANI Max DNIS ANI First Immediate Accept Tx CAS   Rx CAS  
   1 MX      10      4        No        No               IDLE     BLOCK   
   2 MX      10      4        No        No               IDLE     BLOCK   
   3 MX      10      4        No        No               IDLE     BLOCK   
   4 MX      10      4        No        No               IDLE     BLOCK   
   5 MX      10      4        No        No               IDLE     BLOCK   
   6 MX      10      4        No        No               IDLE     BLOCK   
   7 MX      10      4        No        No               IDLE     BLOCK   
   8 MX      10      4        No        No               IDLE     BLOCK   
   9 MX      10      4        No        No               IDLE     BLOCK   
  10 MX      10      4        No        No               IDLE     BLOCK   
  11 MX      10      4        No        No               IDLE     BLOCK   
  12 MX      10      4        No        No               IDLE     BLOCK   
  13 MX      10      4        No        No               IDLE     BLOCK   
  14 MX      10      4        No        No               IDLE     BLOCK   
  15 MX      10      4        No        No               IDLE     BLOCK   
  17 MX      10      4        No        No               IDLE     BLOCK   
  18 MX      10      4        No        No               IDLE     BLOCK   
  19 MX      10      4        No        No               IDLE     BLOCK   
  20 MX      10      4        No        No               IDLE     BLOCK   
  21 MX      10      4        No        No               IDLE     BLOCK   
asterisksangoma*CLI>

Configuramos rápidamente un extensión SIP 1000 con el contexto from-pstn para que pueda recibir las llamadas, marcamos y vemos como la llamada entra con el primer DNI y se dirige a la extensión 1000.

asterisksangoma*CLI> 
New MFC/R2 call detected on chan 11. 
MFC/R2 call offered on chan 11. ANI = , DNIS = 5900, Category = National Priority Subscriber 
MFC/R2 call has been accepted on backward channel 11 
    -- Executing [5900@from-pstn:1] Dial("DAHDI/11-1", "SIP/1000") in new stack 
  == Using SIP RTP CoS mark 5 
    -- Called 1000 
    -- SIP/1000-00000001 is ringing 
    -- SIP/1000-00000001 answered DAHDI/11-1 
  == Spawn extension (from-pstn, 5900, 1) exited non-zero on 'DAHDI/11-1' 
    -- Hungup 'DAHDI/11-1' 
MFC/R2 call end on channel 11

Sobre esa misma extensión realizamos una llamada de salida.

asterisksangoma*CLI> 
  == Using SIP RTP CoS mark 5 
    -- Executing [46028079@pruebas:1] Dial("SIP/1000-00000007", "DAHDI/g1/46028079") in new stack 
    -- Called g1/46028079 
MFC/R2 call has been accepted on forward channel 1 
    -- DAHDI/1-1 is ringing 
    -- DAHDI/1-1 is making progress passing it to SIP/1000-00000007 
MFC/R2 call has been answered on channel 1 
    -- DAHDI/1-1 answered SIP/1000-00000007 
Chan 1 - Far end disconnected. Reason: Normal Clearing 
MFC/R2 call disconnected on channel 1 
    -- Hungup 'DAHDI/1-1' 
  == Spawn extension (pruebas, 46028079, 1) exited non-zero on 'SIP/1000-00000007'


El teléfono es un MITEL 5312, diseñados específicamente para el protocolo MINET sin embargo tiene soporte para SIP, solo es cuestión de que inicie con el protocolo, y lo podremos registrar con cualquier proxy SIP mediante su pagina web de configuración.

Utilizamos dos tipos de conectores de coaxial a RJ45 que se muestran a continuación:


Este conector lo utiliza el conmutador MITEL de donde tome el E1.


Y aquí el conector de la marca AC and E, 408809069 K162.

De momento es todo configuraciones mas especificas quedan fuera de esta guía, quedan puntos pendientes como instalar una tarjeta Digium junto con la Sangoma, la instalación de Wanpipe en Debian que esperamos abordar en otro momento. Saludos dejo las paginas de donde se tomo la información.

Referencias:
http://code.google.com/p/openr2/downloads/list
http://wiki.sangoma.com/wanpipemon-T1-E1-line-alarms-0
http://www.fonality.com/trixbox/forums/vendor-forums-certified/sangoma/sangoma-a101d-alarm-redon-lofon
http://wiki.sangoma.com/konrads-cheat-sheet
http://wiki.sangoma.com/mfcr2
http://wiki.sangoma.com/wanpipe-linux-asterisk-debugging#pri_span_debugging
http://wiki.sangoma.com/wanpipe-linux-asterisk-appendix
http://libopenr2.org
http://code.google.com/p/openr2/downloads/list
http://edocs.mitel.com/UG/EN/5312-5324_SIP7.2_UG_GA.pdf
http://sangoma.com/assets/docs/misc/MFCR2_and_Sangoma_English.pdf

Dominio y alias en OpenSIPS

Siguiendo el propósito original de estos escritos, continuamos con las configuraciones del proxy OpenSIPS. El post anterior trataba de autenticar los usuarios haciendo uso de MySQL, ahora agregaremos la función de manejar dominios y alias, por lo tanto deberemos realizar modificaciones a nuestro archivo de configuración el cual simbólicamente denominaremos opensips.cfg.3, el cual mostramos a continuación.

Tambien vamos a cambiar una linea en el archivo opensipsctlrc y modificaremos el primer parámetro definiendo el dominio que vamos a utilizar de manera predeterminada al agregar nuevos usuarios: “SIP_DOMAIN=trantor.demerzel.org”

####### Global Parameters #########
debug=3
log_stderror=no
log_facility=LOG_LOCAL0
 
fork=yes
children=4
 
port=5060
 
/* uncomment and configure the following line if you want opensips to bind on a specific interface/port/proto (default bind on all available) */
#listen=udp:192.9.200.161:5060
 
####### Modules Section ########
 
#set module path
mpath="/usr/local/lib/opensips/modules/"
 
/* uncomment next line for MySQL DB support */
loadmodule "db_mysql.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "alias_db.so"
loadmodule "domain.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"
 
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 0)
 
# ----- usrloc params -----
modparam("usrloc", "db_mode",   0)
 
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
 
 
# ----- uri params -----
modparam("uri", "use_uri_table", 0)
# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
 
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("auth_db", "load_credentials", "")
 
modparam("alias_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
 
modparam("domain", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("domain", "db_mode", 1)
 
route{
 
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}
 
	if (has_totag()) {
		if (loose_route()) {
			if (is_method("BYE")) {
				setflag(1); # do accounting ...
				setflag(3); # ... even if the transaction fails
			} else if (is_method("INVITE")) {
				record_route();
			}
			route(1);
		} else {
			/* uncomment the following lines if you want to enable presence */
			if ( is_method("ACK") ) {
				if ( t_check_trans() ) {
					t_relay();
					exit;
				} else {
					exit;
				}
			}
			sl_send_reply("404","Not here");
		}
		exit;
	}
 
	if (is_method("CANCEL"))
	{
		if (t_check_trans())
			t_relay();
		exit;
	}
 
	t_check_trans();
 
	if (!(method=="REGISTER") && is_from_local())  /*multidomain version*/
        {
              if (!proxy_authorize("", "subscriber")) {
                      proxy_challenge("", "0");
                      exit;
              }
              if (!db_check_from()) {
                      sl_send_reply("403","Forbidden auth ID");
                      exit;
              }
 
              consume_credentials();
              # caller authenticated
        }
 
 
	if (loose_route()) {
		xlog("L_ERR",
		"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
		if (!is_method("ACK"))
			sl_send_reply("403","Preload Route denied");
		exit;
	}
 
	# record routing
	if (!is_method("REGISTER|MESSAGE"))
		record_route();
 
	# account only INVITEs
	if (is_method("INVITE")) {
		setflag(1); # do accounting
	}
 
	if (!is_uri_host_local())
	{
        	if(is_from_local()) {
			route(1);
	        } else {
			sl_send_reply("403","Not here");
        	}
	}
 
	if (is_method("PUBLISH"))
	{
		sl_send_reply("503", "Service Unavailable");
		exit;
	}
 
	if (is_method("REGISTER"))
	{
                if (!www_authorize("", "subscriber"))
                {
                      www_challenge("", "0");
                      exit;
                }
 
                if (!db_check_to())
                {
                      sl_send_reply("403","Forbidden auth ID");
                      exit;
                }
 
		if (!save("location"))
			sl_reply_error();
 
		exit;
	}
 
	if ($rU==NULL) {
		# request with no Username in RURI
		sl_send_reply("484","Address Incomplete");
		exit;
	}
 
        # apply DB based aliases (uncomment to enable)
        alias_db_lookup("dbaliases");
 
	# do lookup with method filtering
	if (!lookup("location","m")) {
		switch ($retcode) {
			case -1:
			case -3:
				t_newtran();
				t_reply("404", "Not Found");
				exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}
	# when routing via usrloc, log the missed calls also
	setflag(2);
	route(1);
}
 
route[1] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
		t_on_branch("2");
		t_on_reply("2");
		t_on_failure("1");
	}
 
	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}
 
branch_route[2] {
	xlog("new branch at $run");
}
 
 
onreply_route[2] {
	xlog("incoming replyn");
}
 
 
failure_route[1] {
	if (t_was_cancelled()) {
		exit;
	}
}

Transferencia SIP

Una de las cosas mas sencillas en este mundo actual es transferir una llamada. Ya que andamos probando el proxy SIP al que hacemos mención, verificaremos que es lo que pasa cuando realizamos este procedimiento comparándolo con el que hace Asterisk.

Tenemos tres usuarios SIP, 1000, 1001 y 1002. El dispositivo asociado a cada uno respectivamente son un SPA941, SPA2102 y el softphone Zoiper, el mas importante de estos tres es el teléfono IP que gracias a su display podemos verificar el comportamiento que estamos buscando.

Vamos a poner un sencillo ejemplo para ilustrarlo, el cual de manera general sera el siguiente.

1001 recibe una llamada de 1002.
1001 inicia transferencia atendida con 1000.
1000 contesta la llamada y aparece en el CALLERID 1001.
1000 acepta la llamada.
1001 cuelga.
1000 tiene la llamada y el CALLERID cambia de 1001 a 1002.
1002 cambia su CALLERID ahora a 1000.

Vamos a realizar una primera llamada, marcamos del usuario 1002 al 1001.

Establecemos la llamada, y en la lista de contactos de nuestro Softphone se nos muestra que estamos hablando con el usuario 1001.

Ahora 1001 pone en espera a 1002, y le marca a 1000 para transferirle la llamada, en este paso en el display del teléfono asociado al usuario 1000, aparece que esta recibiendo una llamada de 1001, acepta la llamada se establece la llamada y le indican que le van a transferir al usuario 1002. 1001 transfiere la llamada y termina su participación en la llamada.

Y es aquí donde vemos el comportamiento deseado, después de un instante en el display del teléfono se muestra que estamos hablando ahora con el usuario 1002, y en el softphone de igual manera cambia de que ahora hablamos con el usuario 1000.

Con Asterisk no pasa esto, los estados de los teléfonos en su CALLERID no cambian, el teléfono 1002 se queda con el primer numero que marco y el teléfono 1000 mantiene en su pantalla el numero de donde recibió la transferencia.

¿Y cuál es el motivo de esto?,debido a detalles del protocolo SIP que esta implementado en Asterisk esta característica por el momento no se encuentra disponible. Mas información acerca de esto en un buen debate en la lista de asterisk-es en el siguiente hilo: CALLER ID en transferencias atendidas.

Y como anexo, se muestra la traza SIP de la transferencia capturada con Wireshark.

Autenticación en OpenSIPS con MySQL

En esta parte usaremos una base de datos para registrar mediante una contraseña nuestros usuarios SIP dando un tanto mas de seguridad a nuestro pequeño sistema, y de tener en tablas todas las preferencias de nuestros usuarios, dominios, direcciones y grupos como veremos consecuentemente.

Partimos del hecho de que contamos con nuestra base de datos MySQl correctamente instalada y con nuestra contraseña de root configurada. Debemos realizar ciertas modificaciones al archivo opensipsctlrc (/usr/local/etc/opensips/opensipsctlrc), el cual debe quedar de la siguiente forma:

trantor:/usr/local/etc/opensips# cat opensipsctlrc | grep -v "#" | sed -e '/^$/d'
 SIP_DOMAIN=192.168.1.161
 DBENGINE=MYSQL
 DBHOST=localhost
 DBNAME=opensips
 DBRWUSER=opensips
 DBRWPW="opensipsrw"
 DBROUSER=opensipsro
 DBROPW=opensipsro
 ALIASES_TYPE="DB"
 OSIPS_FIFO="/tmp/opensips_fifo"
trantor:/home/gabriel#

Creamos la base de datos.

trantor:/home/gabriel/SIP# opensipsdbctl create
MySQL password for root:
INFO: test server charset
INFO: creating database opensips ...
INFO: Core OpenSIPS tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into opensips ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute userblacklist? (y/n): y
INFO: creating extra tables into opensips ...
INFO: Extra tables succesfully created.
trantor:/home/gabriel/SIP#

Cambiamos la configuración de opensips.cfg por la configuración que se muestra a continuación la cual simbólicamente denominaremos opensips.cfg.1.

####### Global Parameters #########
debug=3
log_stderror=no
log_facility=LOG_LOCAL0
 
fork=yes
children=4
 
port=5060
 
/* (default bind on all available) */
#listen=udp:192.168.1.161:5060
 
####### Modules Section ########
 
#set module path
mpath="/usr/local/lib/opensips/modules/"
 
/* uncomment next line for MySQL DB support */
loadmodule "db_mysql.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"
 
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 0)
 
# ----- usrloc params -----
modparam("usrloc", "db_mode",   0)
 
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
 
 
# ----- uri params -----
modparam("uri", "use_uri_table", 0)
# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
 
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("auth_db", "load_credentials", "")
 
 
route{
 
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}
 
	if (has_totag()) {
		if (loose_route()) {
			if (is_method("BYE")) {
				setflag(1); # do accounting ...
				setflag(3); # ... even if the transaction fails
			} else if (is_method("INVITE")) {
				record_route();
			}
			route(1);
		} else {
			if ( is_method("ACK") ) {
				if ( t_check_trans() ) {
					t_relay();
					exit;
				} else {
					exit;
				}
			}
			sl_send_reply("404","Not here");
		}
		exit;
	}
 
	if (is_method("CANCEL"))
	{
		if (t_check_trans())
			t_relay();
		exit;
	}
 
	t_check_trans();
 
        if (!(method=="REGISTER") && from_uri==myself)
        {
              if (!proxy_authorize("", "subscriber")) {
                      proxy_challenge("", "0");
                      exit;
              }
              if (!db_check_from()) {
                      sl_send_reply("403","Forbidden auth ID");
                      exit;
              }
 
              consume_credentials();
              # caller authenticated
        }
 
 
	if (loose_route()) {
		xlog("L_ERR",
		"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
		if (!is_method("ACK"))
			sl_send_reply("403","Preload Route denied");
		exit;
	}
 
	# record routing
	if (!is_method("REGISTER|MESSAGE"))
		record_route();
 
	# account only INVITEs
	if (is_method("INVITE")) {
		setflag(1); # do accounting
	}
	if (!uri==myself)
	{
		append_hf("P-hint: outboundrn");
		route(1);
	}
 
	if (is_method("PUBLISH"))
	{
		sl_send_reply("503", "Service Unavailable");
		exit;
	}
 
	if (is_method("REGISTER"))
	{
                if (!www_authorize("", "subscriber"))
                {
                      www_challenge("", "0");
                      exit;
                }
 
                if (!db_check_to())
                {
                      sl_send_reply("403","Forbidden auth ID");
                      exit;
                }
 
		if (!save("location"))
			sl_reply_error();
 
		exit;
	}
 
	if ($rU==NULL) {
		# request with no Username in RURI
		sl_send_reply("484","Address Incomplete");
		exit;
	}
 
	# do lookup with method filtering
	if (!lookup("location","m")) {
		switch ($retcode) {
			case -1:
			case -3:
				t_newtran();
				t_reply("404", "Not Found");
				exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}
	# when routing via usrloc, log the missed calls also
	setflag(2);
	route(1);
}
 
route[1] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
		t_on_branch("2");
		t_on_reply("2");
		t_on_failure("1");
	}
 
	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}
 
branch_route[2] {
	xlog("new branch at $run");
}
 
 
onreply_route[2] {
	xlog("incoming replyn");
}
 
 
failure_route[1] {
	if (t_was_cancelled()) {
		exit;
	}
}

Iniciamos OpenSIPS.

trantor:~# opensipsctl start
 
INFO: Starting OpenSIPS :
INFO: started (pid: 28716)

Agregamos el par de usuarios 1000 y 1001, a la base de datos y registramos nuestros agentes SIP.

gabriel@trantor:~$ sudo opensipsctl add 1000 1000
new user '1000' added
gabriel@trantor:~$ sudo opensipsctl add 1001 1001
new user '1001' added

Mostramos la traza SIP del registro de un usuario almacenando previamente en nuestra base de datos.

U 192.168.1.162:5061 -> 192.168.1.161:5060
REGISTER sip:192.168.1.161 SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-6bdbbdbc.
From: Bozada <sip:1000@192.168.1.161>;tag=ea98cc30d70f560fo1.
To: Bozada <sip:1000@192.168.1.161>.
Call-ID: 5da1e386-fde63540@192.168.1.162.
CSeq: 32475 REGISTER.
Max-Forwards: 70.
Contact: Bozada <sip:1000@192.168.1.162:5061>;expires=3600.
User-Agent: Linksys/SPA2102-3.3.6.
Content-Length: 0.
Allow: ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER.
Supported: x-sipura.
.
U 192.168.1.161:5060 -> 192.168.1.162:5061
SIP/2.0 401 Unauthorized.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-6bdbbdbc.
From: Bozada <sip:1000@192.168.1.161>;tag=ea98cc30d70f560fo1.
To: Bozada <sip:1000@192.168.1.161>;tag=c97b4d1cb1f3d0da549e06a8d482ef63.be3a.
Call-ID: 5da1e386-fde63540@192.168.1.162.
CSeq: 32475 REGISTER.
WWW-Authenticate: Digest realm="192.168.1.161", nonce="4b85d15b000000039d8eac02cb35f405c16770fd04ba2424".
Server: OpenSIPS (1.6.1-notls (i386/linux)).
Content-Length: 0.
.
U 192.168.1.162:5061 -> 192.168.1.161:5060
REGISTER sip:192.168.1.161 SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-896f8b1c.
From: Bozada <sip:1000@192.168.1.161>;tag=ea98cc30d70f560fo1.
To: Bozada <sip:1000@192.168.1.161>.
Call-ID: 5da1e386-fde63540@192.168.1.162.
CSeq: 32476 REGISTER.
Max-Forwards: 70.
Authorization: Digest username="1000",realm="192.168.1.161",nonce="4b85d15b000000039d8eac02cb35f405c16770fd04ba2424",uri="sip:192.168.1.161",algorithm=MD5,response="5a8c46a3bd960218616aaed03240e631".
Contact: Bozada <sip:1000@192.168.1.162:5061>;expires=3600.
User-Agent: Linksys/SPA2102-3.3.6.
Content-Length: 0.
Allow: ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER.
Supported: x-sipura.
.
U 192.168.1.161:5060 -> 192.168.1.162:5061
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-896f8b1c.
From: Bozada <sip:1000@192.168.1.161>;tag=ea98cc30d70f560fo1.
To: Bozada <sip:1000@192.168.1.161>;tag=c97b4d1cb1f3d0da549e06a8d482ef63.274d.
Call-ID: 5da1e386-fde63540@192.168.1.162.
CSeq: 32476 REGISTER.
Contact: <sip:1000@192.168.1.162:5061>;expires=3600.
Server: OpenSIPS (1.6.1-notls (i386/linux)).
Content-Length: 0.
.

Y como un diagrama a veces vale mas, aquí mostramos la gráfica de la traza SIP anterior.

| 192.168.1.162     			| 192.168.1.161
|         Request: REGISTER             |
|(5061)   ------------------>  (5060)   |
|         Status: 401 Unauthorized      |
|(5061)   <------------------  (5060)   |
|         Request: REGISTER             |
|(5061)   ------------------>  (5060)   |
|         Status: 200 OK                |
|(5061)   <------------------  (5060)   |

Realizamos nuevamente una sencilla llamada del usuario 1001 al 1000, y esta es la traza SIP de la llamada, la principal diferencia respecto al esquema anterior, es la parte de la autentificación.
En este caso al realizar el INVITE de la llamada, el servidor responde con mensaje SIP 407 (autenticación requerida), nuestro agente SIP responde y si son correctos los parámetros dejara realizar el INVITE iniciando la llamada, el resto de la traza SIP es igual a la del post anterior.

| 192.168.1.163     				| 192.168.1.161 (proxy)			| 192.168.1.162
|         INVITE SDP ( h261)            	|                   			|
|(5060)   ------------------>  (5060)   	|                   			|
|         407 Proxy Authentication Required	|                   			|
|(5060)   <------------------  (5060)   	|                   			|
|         ACK       				|                   			|
|(5060)   ------------------>  (5060)   	|                   			|
|         INVITE SDP ( h261)            	|                   			|
|(5060)   ------------------>  (5060)   	|                   			|
|         100 Giving a try              	|                   			|
|(5060)   <------------------  (5060)   	|                   			|
|                   				|         INVITE SDP ( h261)            |
|                   				|(5060)   ------------------>  (5061)   |
|                   				|         100 Trying			|
|                   				|(5060)   <------------------  (5061)   |
|                   				|         180 Ringing                   |
|                   				|(5060)   <------------------  (5061)   |
|         180 Ringing                   	|                   			|
|(5060)   <------------------  (5060)   	|                   			|
|                   				|         200 OK SDP ( h261)            |
|                   				|(5060)   <------------------  (5061)   |
|         200 OK SDP ( h261)            	|                   			|
|(5060)   <------------------  (5060)   	|                   			|
|         ACK       				|                   			|
|(5060)   ------------------>  (5060)   	|                   			|
|                   				|         ACK       			|
|                   				|(5060)   ------------------>  (5061)   |
|         BYE       				|                   			|
|(5060)   ------------------>  (5060)		|                   			|
|                   				|         BYE       			|
|                   				|(5060)   ------------------>  (5061)   |
|                   				|         200 OK    			|
|                   				|(5060)   <------------------  (5061)   |
|         200 OK    				|                   			|
|(5060)   <------------------  (5060)   	|                   			|

Mediante el siguiente comando podemos observar a los usuarios registrados en el servidor.

trantor:~# opensipsctl ul show
Domain:: location table=512 records=2
        AOR:: 1000
                Contact:: sip:1000@192.168.1.162:5061 Q=
                        Expires:: 2336
                        Callid:: 5da1e386-fde63540@192.168.1.162
                        Cseq:: 32476
                        User-agent:: Linksys/SPA2102-3.3.6
                        State:: CS_SYNC
                        Flags:: 0
                        Cflag:: 0
                        Socket:: udp:192.168.1.161:5060
                        Methods:: 5183
        AOR:: 1001
                Contact:: sip:1001@192.168.1.163:5060;transport=udp Q=
                        Expires:: 3596
                        Callid:: d35fe6bb7fc5df8b6c76521a80310ba6@0.0.0.0
                        Cseq:: 2
                        User-agent:: SIP Communicator 1.0 CVS-Wed_Feb_24_19-45-25_CST_2010
                        State:: CS_NEW
                        Flags:: 0
                        Cflag:: 0
                        Socket:: udp:192.168.1.161:5060
                        Methods:: 4294967295

Instalando OpenSIPS

OpenSIPS es una proxy SIP, registra y establece llamadas entre clientes SIP a continuación se mostrara la forma de instalarlo y configurarlo poco a poco, todo esto basándome en un libro recién publicado que trata sobre este tema el cual es Building Telephony Systems with OpenSIPS 1.6 de Flavio E. Goncalves.
Mas que nada es como un ejercicio para no olvidar los pasos y procedimientos.

El equipo a utilizar es mi propia portátil con Debian Lenny. Antes que nada necesitamos los siguientes paquetes:

# aptitude install gcc bison flex make openssl libmysqlclient-dev libradiusclient-ng2 libradiusclient-ng-dev mysql-server libxmlrpc-c3-dev

Descargamos, compilamos e instalamos con los módulos correspondientes.

$ wget http://opensips.org/pub/opensips/1.6.1/src/opensips-1.6.1-tls_src.tar.gz
$ tar xfz opensips-1.6.1-tls_src.tar.gz
$ cd opensips-1.6.1-tls
$ make all include_modules=”db_mysql aaa_radius”
$ make install include_modules=”db_mysql aaa_radius”

Los módulos y archivos de configuración se encuentran en /usr/local/lib/opensips/modules/ y /usr/local/etc/opensips/ respectivamente.

Con el archivo por defecto (/usr/local/etc/opensips/opensips.cfg) ya podemos iniciar un simple registro y realizar una llamada entre dos agentes SIP, sin embargo vamos a eliminar del archivo todo el código comentado e innecesario para así poder tener un archivo base mas claro el cual nombraremos simbólicamente opensips.cfg.0 el cual se muestra a continuación:

####### Global Parameters #########
debug=3
log_stderror=no
log_facility=LOG_LOCAL0
 
fork=yes
children=4
 
port=5060
 
#listen=udp:192.168.1.161:5060
 
####### Modules Section ########
 
#set module path
mpath="/usr/local/lib/opensips/modules/"
 
/* uncomment next line for MySQL DB support */
#loadmodule "db_mysql.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"
 
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 0)
 
# ----- usrloc params -----
modparam("usrloc", "db_mode",   0)
# ----- uri params -----
modparam("uri", "use_uri_table", 0)
# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
 
route{
 
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}
 
	if (has_totag()) {
		if (loose_route()) {
			if (is_method("BYE")) {
				setflag(1); # do accounting ...
				setflag(3); # ... even if the transaction fails
			} else if (is_method("INVITE")) {
				record_route();
			}
			route(1);
		} else {
			if ( is_method("ACK") ) {
				if ( t_check_trans() ) {
					t_relay();
					exit;
				} else {
					exit;
				}
			}
			sl_send_reply("404","Not here");
		}
		exit;
	}
 
	if (is_method("CANCEL"))
	{
		if (t_check_trans())
			t_relay();
		exit;
	}
 
	t_check_trans();
 
	if (loose_route()) {
		xlog("L_ERR",
		"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
		if (!is_method("ACK"))
			sl_send_reply("403","Preload Route denied");
		exit;
	}
 
	# record routing
	if (!is_method("REGISTER|MESSAGE"))
		record_route();
 
	# account only INVITEs
	if (is_method("INVITE")) {
		setflag(1); # do accounting
	}
	if (!uri==myself)
	{
		append_hf("P-hint: outboundrn");
		route(1);
	}
 
	if (is_method("PUBLISH"))
	{
		sl_send_reply("503", "Service Unavailable");
		exit;
	}
 
	if (is_method("REGISTER"))
	{
		if (!save("location"))
			sl_reply_error();
 
		exit;
	}
 
	if ($rU==NULL) {
		# request with no Username in RURI
		sl_send_reply("484","Address Incomplete");
		exit;
	}
 
	# do lookup with method filtering
	if (!lookup("location","m")) {
		switch ($retcode) {
			case -1:
			case -3:
				t_newtran();
				t_reply("404", "Not Found");
				exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}
	# when routing via usrloc, log the missed calls also
	setflag(2);
	route(1);
}
 
route[1] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
		t_on_branch("2");
		t_on_reply("2");
		t_on_failure("1");
	}
 
	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}
 
branch_route[2] {
	xlog("new branch at $run");
}
 
 
onreply_route[2] {
	xlog("incoming replyn");
}
 
 
failure_route[1] {
	if (t_was_cancelled()) {
		exit;
	}
}

Iniciamos OpenSIPS.

# opensipsctl start
 
INFO: Starting OpenSIPS :
INFO: started (pid: 6359)

Registramos el usuario 1000 contraseña 1000 y usuario 1001 contraseña 1001 a la IP de nuestro equipo corriendo el proxy, en estos momentos aun no introducimos la autenticación de usuarios, por lo tanto debemos registrarnos sin problemas.

Aquí mostramos la traza SIP al registrar el primer usuario con un ATA de Linksys, vemos el register que realiza y el ok enviado por el servidor, esto lo capturamos con ngrep. (ngrep –p –q –W byline port 5060 > register1000C.txt)

U 192.168.1.162:5061 -> 192.168.1.161:5060
REGISTER sip:192.168.1.161 SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-37cd1d0c.
From: Bozada <sip:1000@192.168.1.161>;tag=711253242c005ba6o1.
To: Bozada <sip:1000@192.168.1.161>.
Call-ID: 3746d82e-460188b6@192.168.1.162.
CSeq: 20974 REGISTER.
Max-Forwards: 70.
Contact: Bozada <sip:1000@192.168.1.162:5061>;expires=3600.
User-Agent: Linksys/SPA2102-3.3.6.
Content-Length: 0.
Allow: ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER.
Supported: x-sipura.
.
U 192.168.1.161:5060 -> 192.168.1.162:5061
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-37cd1d0c.
From: Bozada <sip:1000@192.168.1.161>;tag=711253242c005ba6o1.
To: Bozada <sip:1000@192.168.1.161>;tag=c97b4d1cb1f3d0da549e06a8d482ef63.3318.
Call-ID: 3746d82e-460188b6@192.168.1.162.
CSeq: 20974 REGISTER.
Contact: <sip:1000@192.168.1.162:5061>;expires=3600.
Server: OpenSIPS (1.6.1-notls (i386/linux)).
Content-Length: 0.

Registrados los dos usuarios realizamos una simple llamada desde el usuario 1000 al 1001, y aquí mostramos lo que pasa mediante SIP para establecer la llamada, entre el ultimo ACK y el primer BYE esta el flujo RTP. (capturado con Wireshark)

| 192.168.1.162     			| 192.168.1.161 (proxy)			| 192.168.1.163
|         INVITE SDP ( telephone-event)	|          				|
|(5061)   ------------------>  (5060)   |                   			|
|         100 Giving a try              |                   			|
|(5061)   <------------------  (5060)   |                   			|
|                   			|         INVITE SDP ( telephone-event) |
|                   			|(5060)   ------------------>  (5060)   |
|                   			|         180 Ringing                   |
|                   			|(5060)   <------------------  (5060)   |
|         180 Ringing                   |                   			|
|(5061)   <------------------  (5060)   |                   			|
|                   			|         200 OK SDP ( 97)              |
|                   			|(5060)   <------------------  (5060)   |
|         200 OK SDP ( 97)              |                   			|
|(5061)   <------------------  (5060)   |                   			|
|         ACK       			|					|
|(5061)   ------------------>  (5060)   |                   			|
|                   			|         ACK                           |
|                   			|(5060)   ------------------>  (5060)   |
|         BYE       			|                                       |
|(5061)   ------------------>  (5060)   |                   			|
|                   			|         BYE                           |
|                   			|(5060)   ------------------>  (5060)   |
|                   			|         200 OK                        |
|                   			|(5060)   <------------------  (5060)   |
|         200 OK    			|                                       |
|(5061)   <------------------  (5060)   |                   			|

Por el momento es todo.