====== Scheda VoIP Sangoma A200 ======
**ATTENZIONE! Non comprate le schede Sangoma! Il software necessario a farle funzionare semplicemente fa schifo e per giunta non è libero!**
La mia esperienza con questa scheda è pessima e non la consiglierei a nessuno, neanche se fosse gratis.
===== Caratteristiche =====
* **[[http://www.sangoma.com/products/telecom_boards/analog/a200/overview.html|Presentazione della scheda A200]]**
* **[[http://wiki.sangoma.com/A200-2-Port-24-Port-Expandable-Analog-Voice-Card|A200 Support Wiki]]**
* **{{sangoma_a200.pdf|Caratteristiche hardware}}**
From **[[http://www.freepbx.org/support/documentation/installation/first-steps-after-installation/installing-and-configuring-a-sango|www.freepbx.org]]**: Sangoma's A200 cards can support up to four FXO or FXS Ports (minimum 2, maximum 4) as sold. They are sold in a variety of different configurations, ranging from bare boards (with no ports) which can have daughter boards installed on them later, to boards that have 4 FXOs or boards that have 4 FXS ports pre-installed.
You can add up to five REMORA cards to an A200 card. Each Remora card takes up an additional PCI Slot inside your computer case, but connects only to the main A200 Card. Each Remora card will give you an additional 4 ports.
===== Caso d'uso =====
Si vuole utilizzare Asterisk per connettere alcuni telefoni IP con una linea telefonica analogica. La scheda Sangoma è equipaggiata con un modulo FXO che fornisce due porte analogiche da collegarsi ad altrettante linee telefoniche
Pacchetti Debian Wheezy installati:
* **dahdi-source** Sorgenti per modulo kernel dahdi, consente di dialogare con hardware telefonico.
* **module-assistant** Semplifica la compilazione di moduli kernel aggiuntivi, come ''dahdi-source''.
* **linux-headers-3.2.0-3-amd64**
I pacchetti **module-assistant** e **linux-headers** servono per la compilazione dei **moduli kernel dahdi**.
===== Usare module-assistant per creare il pacchetto Debian dahdi-modules (moduli kernel) =====
Verificare di aver installato il pacchetto **''linux-headers''** relativo alla versione del kernel in uso.
È possibile eseguire la compilazione come utente non privilegiato, ridirigendo tutto nella directory corrente:
cd /usr/local/src
mkdir dahdi-2.6.1+dfsg2-1
cd dahdi-2.6.1+dfsg2-1
module-assistant --userdir . --text-mode build dahdi
Quindi, da root, si installa il pacchetto .deb risultante:
dpkg -i dahdi-modules-3.2.0-4-amd64_2.6.1+dfsg2-1+3.2.51-1_amd64.deb
La procedura //module-assistant// effettua un clean nella directory di compilazione, sfortunatamente questo impedisce la compilazione dei driver Wanpipe di Sangoma (vedi avanti). Per questo dopo aver eseguito //module-assistant// conviene eseguire nuovamente il ''make'', per evitare problemi riportati più avanti:
cd /usr/local/src/dahdi-2.6.1+dfsg2-1/usr_src/modules/dahdi/
make
===== Installare i programmi DAHDI user-space =====
Adesso si possono installare i pacchetti:
* **dahdi-linux** Script user-space per i moduli kernel dahdi.
* **dahdi** Programmi user-space per le configurazione dei moduli kernel dahdi.
Perché il modulo kernel ''dahdi'' venga caricato bisogna creare un file di configurazione **''/etc/dahdi/system.conf''** con almeno queste direttive:
loadzone = it
defaultzone = it
All'esecuzione di **''/etc/init.d/dahdi start''** viene caricato il modulo kernel **''dahdi''**, il kernel logga:
[22710.527986] dahdi: Telephony Interface Registered on major 196
[22710.527991] dahdi: Version: 2.6.1
[22710.639833] dahdi_ioctl_chanconfig: No channel for number 1
Dopo aver caricato il modulo compaiono dei nuovi device:
# ls -l /dev/dahdi/
crw-rw---T 1 root dialout 196, 254 Sep 15 21:52 channel
crw-rw---T 1 root dialout 196, 0 Sep 15 21:52 ctl
crw-rw---T 1 root dialout 196, 255 Sep 15 21:52 pseudo
crw-rw---T 1 root dialout 196, 253 Sep 15 21:52 timer
Il comando **''dahdi_hardware''** conferma che l'hardware è stato riconosciuto:
# dahdi_hardware
pci:0000:03:04.0 wanpipe- 1923:0040 Sangoma Technologies Corp. A200/Remora FXO/FXS Analog AFT card
===== Compilazione di Wanpipe =====
**[[http://wiki.sangoma.com/Wanpipe-Driver|Wanpipe]]** è la suite software necessaria ad usare la scheda Sangoma A200. Wanpipe ingloba in un unico code base il supporto per quasi tutto l'hardware Sangoma, includendo programmi di configurazione, supporto e debug, moduli kernel per Linux e driver per Windows. Insomma un blob mostruoso e per giunta non libero, che fa a pugni con qualunque principio di efficienza e qualità del software. Per questo motivo **sconsiglio vivamente l'acquisto di schede Sangoma!**
L'installazione avviene dai sorgenti: **[[ftp://ftp.sangoma.com/linux/current_wanpipe/wanpipe-3.5.28.tgz|wanpipe-3.5.28.tgz]]**. Qui sono indicati i [[http://wiki.sangoma.com/Wanpipe-Requirements|requisiti per l'installazione]] e qui la procedura [[http://wiki.sangoma.com/wanpipe-linux-asterisk-dahdi|General Installation]]. Anche questo riferimento potrebbe essere utile: [[https://gist.github.com/1223525|Automate installation of dahdi, libpri, sangoma, and all deps on debian]].
Per compilare Wanpipe servono alcuni pacchetti di sviluppo:
apt-get install gcc g++ automake autoconf libtool make libncurses5-dev flex bison \
patch linux-headers-$(uname -r) sqlite3 libsqlite3-dev
Inoltre bisogna installare la libreria //Primary Rate ISDN//, anche se non useremo mai una linea ISDN:
* **libpri1.4**
* **libpri-dev**
**La compilazione non va a buon fine su Debian Wheezy**, d'altra parte non c'era da aspettarsi altro, vista l'architettura del software! Wanpipe non gradisce che DAHDI sia stato compilato e installato alla Debian way (con //module-assistant//, ecc.).
Preparare la directory con i sorgenti:
cd /usr/local/src/
tar zxvf wanpipe-3.5.28.tgz
Gli impazienti possono andare direttamente al paragrafo **[[#Soluzione con pacchetto Debian]]**.
Chi volesse ripetere il percorso pieno di ostacoli esegua invece:
cd /usr/local/src/wanpipe-3.5.28
./Setup dahdi
==== Problema #1: privilegi di root e inquinamento del filesystem ====
Il comando ''Setup'' accetta anche un'opzione del tipo ''%%--builddir=/tmp/wanpipe_build%%'', ma comunque **ha bisogno dei privilegi di root** perché **installa file in diverse directory di sistema**. Tentando l'esecuzione come utente non privilegiato si finisce con un bel **Segmentation fault**!
Un software con queste caratteristiche non soddisfa i criteri minimi neanche della decenza: il classico ''**make**'' e ''**make install**'' è il minimo che si dovrebbe pretendere al giorno d'oggi!
Queste le directory infestate dal Setup:
* ''/etc/wanpipe/'' (viene creata, contiene di tutto: file di configurazione, script, firmware,...)
* ''/etc/asterisk/'' (se esiste)
* ''/usr/include/{libsangoma|libhpsangoma|wanec_api|libstelephony}.h''
* ''/usr/include/wanpipe/''
* ''/usr/lib/libstelephony.*''
* ''/usr/lib/libsangoma.*''
* ''/usr/share/doc/wanpipe/''
* ''/usr/local/sbin/setup-sangoma''
* ''/usr/sbin/wan_aftup''
* ''/usr/sbin/wancfg*''
* ''/usr/sbin/wanconfig''
* ''/usr/sbin/wan_ec_client''
* ''/usr/sbin/wanpipe_lxdialog''
* ''/usr/sbin/wanpipemon''
* ''/usr/sbin/wanpipemon_legacy''
* ''/usr/sbin/wan_plxup''
* ''/usr/sbin/wanrouter''
* ''/usr/sbin/wpbwm''
* ''/usr/sbin/wp_pppconfig''
* ''/lib/modules/$(uname -r)/build/wanpipe''
* ''/lib/modules/$(uname -r)/kernel/net/wanrouter/{wan_aften|af_wanpipe|wanec}.ko''
* ''/lib/modules/$(uname -r)/kernel/drivers/net/wan/{wanpipe|sdladrv}.ko''
Per rimuovere tutta questa babele, almeno in teoria, dovrebbe bastare **''./Setup remove''**.
==== Problema #2: percorso dei sorgenti DAHDI ====
Durante il setup **non vengono trovati i sorgenti di ''zaptel''**, in realtà noi abbiamo il più moderno **''dahdi''** che lo sostituisce, ma Wanpipe continua ad utilizzare l'obsoleto nome ''zaptel''. Scegliendo l'opzione **m** è possibile indicarne il percorso:
Please enter zaptel dir: [Default: /usr/src/zaptel]
#> /usr/local/src/dahdi-2.6.1+dfsg-1/usr_src/modules/dahdi
==== Problema #3: versione DAHDI e versione kernel ====
Anche con i privilegi di root la compilazione fallisce:
make[4]: *** [/usr/local/src/wanpipe-3.5.28/kdrvtmp/sdla_tdmv.o] Error 1
make[3]: *** [_module_/usr/local/src/wanpipe-3.5.28/kdrvtmp] Error 2
make[2]: *** [sub-make] Error 2
make[1]: *** [all] Error 2
Wanpipe dovrebbe supportare DAHDI 2.6 e il kernel 3.2.6 a partire dalla versione 3.5.25 (vedere il [[ftp://ftp.sangoma.com/linux/current_wanpipe/ChangeLog.3.5|changelog]]), ma nel nostro caso **non riesce l'autodetect della versione di DAHDI né quella del kernel** (si conferma un software scritto con i piedi!).
Per far riconoscere la versione kernel la strada più rapida è modificare lo script ''Setup'', circa alla riga 935, dentro la funzione **''get_kernel_ver()''**, prima della definizione di **''KERNEL_VERSION''**. Poiché nel nostro caso **''uname -r''** restituisce **''3.2.0-3-amd64''**, mettiamo:
KVER=3
KPATCH=2
KLVL=0
KEVER="-3-amd64"
KERNEL_VERSION=$KVER"."$KPATCH"."$KLVL$KEVER
L'autodetect della versione DAHDI si basa sulla presenza di un file **''usr_src/modules/dahdi/include/dahdi/version.h''** autogenerato durante la compilazione, ma che la procedura guidata da //module-assistant// ha rimosso. Come contenuto basterebbe questo:
#define DAHDI_VERSION "2.6.1"
ma non basta, mancano altri file che portano al problema seguente.
==== Problema #4: no symbol version ====
Il modulo kernel ''wanpipe'' compila con errori e quando si tenta di caricarlo con ''modprobe'' fallisce:
[ 551.916941] wanpipe: no symbol version for dahdi_hdlc_putbuf
[ 551.916947] wanpipe: Unknown symbol dahdi_hdlc_putbuf (err -22)
[ 551.916968] wanpipe: no symbol version for _dahdi_ec_span
[ 551.916972] wanpipe: Unknown symbol _dahdi_ec_span (err -22)
[ 551.916998] wanpipe: no symbol version for dahdi_alarm_notify
[ 551.917001] wanpipe: Unknown symbol dahdi_alarm_notify (err -22)
[ 551.917015] wanpipe: no symbol version for dahdi_hdlc_getbuf
[ 551.917019] wanpipe: Unknown symbol dahdi_hdlc_getbuf (err -22)
...
Gli errori di compilazione sono loggati in ''/usr/local/src/wanpipe-3.5.28/setup_drv_compile.log'':
WARNING: "dahdi_hdlc_putbuf" [/usr/local/src/wanpipe-3.5.28/kdrvtmp/wanpipe.ko] undefined!
...
Anche in questo caso è la procedura guidata di //module-assistant// che ha rimosso il file **''Module.symvers''** generato durante la compilazione. Vedere la soluzione al paragrafo seguente.
==== Soluzione non Debian ====
La soluzione rapida ai problemi #3 e #4 è eseguire:
cd /usr/local/src/dahdi-2.6.1+dfsg-1/usr_src/modules/dahdi/
make
va bene l'utente non privilegiato, come quando si è eseguita la procedura di compilazione con //module-assistant//. Al termine **non** rimuovere i file autogenerati: ''include/dahdi/version.h'' e ''drivers/dahdi/Module.symvers''.
Modificare lo script Setup come indicato al problema #3.
Fatto questo il ''./Setup dahdi'' funziona e il modulo kernel **wanpipe** risultante si carica con successo:
[ 8383.502960] WANPIPE(tm) Multi-Protocol WAN Driver Module 3.5.28.0 (c) 1994-2010 Sangoma Technologies Inc
[ 8383.502966] wanpipe: Probing for WANPIPE hardware.
[ 8383.503015] pci 0000:03:04.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[ 8383.515036] wanpipe: AFT-A200-SH PCIe FXO/FXS card found (HDLC rev.13), cpu(s) 1, bus #3, slot #4, irq #15
[ 8383.515053] wanpipe: Allocating maximum 1 devices: wanpipe1 - wanpipe1.
[ 8383.515644] WANPIPE: TDM Codecs Initialized
==== Soluzione con pacchetto Debian ====
Il comando ''Setup'' di Wanpipe supporta lo switch **''builddeb''** che, **senza usare i privilegi di root**, compila tutti i moduli kernel e gli eseguibili, installandoli in una directory chroot e infine **compilando un pacchetto .deb**.
Ma non vi eccitate: **la soluzione fa comunque schifo!** La compilazione funziona da utente non privilegiato, ma i file risultanti messi nel pacchetto deb appartengono a tale utente (non viene usato ''fakeroot''), quindi **bisogna compilare come root**. Sangoma: dilettanti allo sbaraglio!
* Compilare i **dahdi-modules** con ''module-assistant'' (vedi [[#usare_module-assistant_per_creare_il_pacchetto_debian_dahdi-modules_moduli_kernel|paragrafo sopra]]). In breve si deve creare e installare il pacchetto Debian ed eseguire subito dopo il ''make'' nella directory ''dahdi''.
* Scompattare wanpipe-3.5.28.tgz.
* Modificare ''Setup'' in modo da includere la versione del kernel (vedi problema #3).
* **Prima di installare il pacchetto** fare una copia dell'eventuale configurazione funzionante!!! (Tutta la **''/etc/wanpipe/''**, in particolare ''/etc/wanpipe/wanrouter.rc'').
cd /usr/local/src/
tar zcvf wanpipe_etc.tgz /etc/wanpipe/
tar zxvf wanpipe-3.5.28.tgz
cd wanpipe-3.5.28
vi Setup
./Setup builddeb --with-zaptel=/usr/local/src/dahdi-2.6.1+dfsg2-1/usr_src/modules/dahdi --protocol=TDM
dpkg --force-overwrite -i wanpipe_3528-k320-4-amd64_x86_64.deb
- Il **protocollo TDM** è sufficiente per la scheda A200 con modulo FXO.
- Il **''%%--force-overwrite%%''** è necessario per sovrascrivere il file **''wanrouter.ko''** fornito anche dal pacchetto ''linux-image-3.2.0-3-amd64'': una porcheria dopo l'altra! FIXME Forse con il kernel 3.2.0-4-amd64 non esiste più il problema.
- Il file **''/etc/init.d/wanrouter''** installato dal pacchetto genera dei warning perché non contiene le necessarie voci LSB: di bene in meglio!
- Il **postinst** potrebbe fallire perché non riesce a caricare e scaricare il modulo wanrouter, in tal caso editare ''/var/lib/dpkg/info/wanpipe.postinst'', cercare le righe con ''modprobe'' e mettere **''%%eval "modprobe wanrouter" || true%%''**; eseguire nuovamente il ''%%dpkg --configure wanpipe%%'': la galleria degli orrori!
===== Aggiornamento del kernel =====
Nel caso in cui venga aggiornato il kernel è necessario ripetere i seguenti passaggi:
- Compilazione dei **''[[sangoma_a200?#usare_module-assistant_per_creare_il_pacchetto_debian_dahdi-modules_moduli_kernel|dahdi-modules]]''** con ''module-assistant'' e installazione del risultante pacchetto .deb.
- Esecuzione di **''make''** nella directory ''/usr/local/src/dahdi-/usr_src/modules/dahdi/''.
- Compilazione di **[[sangoma_a200?#soluzione_con_pacchetto_debian|wanpipe]]** con l'opzione ''builddeb'' e installazione del pacchetto .deb risultante.
- Ripristino della configurazione **''/etc/wanpipe/wanrouter.rc''** e **''/etc/init.d/wanrouter''** (in realtà un link a ''/usr/sbin/wanrouter'').
===== Configurazione e caricamento stack software =====
Questo è l'ordine con cui deve essere caricato il software:
- **''/etc/init.d/dahdi start''** Carica il modulo kernel **dahdi**.
- **''/etc/init.d/wanrouter start''** In realtà è una copia del comando ''/usr/sbin/wanrouter''. Carica il modulo kernel **wanpipe**.
- **''/usr/sbin/dahdi_cfg''** FIXME Viene eseguito all'avvio di ''dahdi'', ma deve essere eseguito nuovamente dopo che è stato avviato ''wanrouter'' altrimenti Asterisk non trova i canali DAHDI.
- **''/etc/init.d/asterisk start''** Avvia il centralino VoIP Asterisk.
La configurazione può essere fatta in modo guidato con il tool **''setup-sangoma''** che fa l'autodetect dell'hardware ed esegue i sottoprogrammi necessari. Nel nostro caso è equivalente ad eseguire **''wancfg_dahdi''**. Fare attenzione che questa procedura (è software Sangoma: siete avvertiti!) vuole **riscrivere tutti i file di configurazione** Dahdi, Wanpipe e Asterisk, quindi ogni personalizzazione viene persa.
Esiste anche il tool **''dahdi_cfg''** (software Debian) che genera la configurazione per dahdi e quindi si sovrappone parzialmente per funzionalità ai tool ''setup-sangoma'' e ''wancfg_dahdi''.
Dopo aver configurato e caricato dahdi e wanpipe si può vedere se i canali vengono riconosciuti e se è presente la linea telefonica sul primo canale:
wanpipemon -i w1g1 -c astats -m 1
------- Voltage Status (FXO,port 0) -------
VOLTAGE : 49 Volts
------- Line Status (FXO,port 0) -------
Line : connected
===== Configurazione di DAHDI =====
**NOTA 1** Debian include il modulo kernel per la cancellazione echo OSLEC, oltre al predefinito MG2. Di conseguenza i vari tool sono stati patchati per utilizzarlo.
**NOTA 2** La documentazione spesso fa riferimento al modulo ''ztdummy'' o al più moderno ''dahdi_dummy''. Debian ha applicato una patch accettata upstream per cui il modulo non è più necessario e viene usato il timing interno.
**NOTA 3** Una porta FXO viene collegata alla linea telefonica, su di essa la scheda telefonica deve attivare la segnalazione FXS.
=== /etc/dahdi/system.conf ===
File di configurazione letto dal tool **''dahdi_cfg''** per configurare a run-time il modulo kernel ''dahdi''.
Il file può essere scritto a mano oppure generato (sovrascritto) dall'esecuzione di **''setup-sangoma''** oppure dall'esecuzione di **''wancfg_dahdi''** (entrambi installati con il software Wanpipe di Sangoma) oppure dall'esecuzione di **''dahdi_genconf''** (installato con il pacchetto Debian dahdi).
Il tool **''setup-sangoma''** fa l'autodetect dell'hardware installato e fa alcune domande per determinare la configurazione finale.
Il tool **''dahdi_genconf''** fa l'autodetect dell'hardware (solo se il modulo kernel ''wanpipe'' è caricato correttamente) e legge alcune impostazioni da **''/etc/dahdi/genconf_parameters''**. Ad esempio con questo ''genconf_parameters'':
# Set tone zone values. This is used for playing tones (busy, dial-tone and such).
# The default is us. This sets the value for both loadzone and defaultzone in system.conf.
lc_country it
# For FXO (analog lines) - use KS or LS? KS is the default and is normally the
# better choice as it allows detecting hang-ups on many lines.
fxo_default_start ks
# The dialplan context into which to send trunks in chan_dahdi.conf or users.conf.
context_lines from-pstn
# The echo canceler to use. If you have a hardware echo canceler, just leave it be,
# as this one won’t be used anyway. Debian dahdi-linux provides the OSLEC kernel module.
echo_can oslec
produce il seguente ''/etc/dahdi/system.conf'':
# Span 1: WRTDM/0 "wrtdm Board 1" (MASTER)
fxsks=1
echocanceller=oslec,1
fxsks=2
echocanceller=oslec,2
# Global data
loadzone = it
defaultzone = it
La zona indica quali convensioni nazionali usare per le segnalazione sulla linea (segnale di libero, occupato, squillo, ecc.), se un canale non indica una zona particolare verrà usata quella di default.
La parola chiave **''fxsks''** indica che sul quel canale viene attivata la segnalazione FXS (quindi è una porta FXO da collegare a una linea telefonica) e che si userà il meccanismo //Kewlstart// per richiedere il segnale di libero. La nostra scheda Sangoma ha due porte FXO, ma useremo solo la prima.
Con un file di configurazione corretto e **dopo aver caricato correttamente anche Wanpipe** (vedi paragrafo successivo) è possibile eseguire **''dahdi_cfg''** e verificare con ''dmesg'' che i canali DAHDI siano stati configurati:
[160213.897210] wanpipe1: Open (usecount=1, channo=1, chanpos=1)...
[160213.897226] wanpipe1: Open (usecount=1, channo=2, chanpos=2)...
Se non si esegue **''dahdi_cfg''** i canali DAHDI non sono disponibili, Asterisk ad esempio non carica neanche il modulo ''chan_dahdi'':
ERROR[4384] chan_dahdi.c: Unable to open channel 1: No such device or address here = 0, tmp->channel = 1, channel = 1
ERROR[4384] chan_dahdi.c: Unable to register channel '1'
=== /etc/dahdi/modules ===
Elnco dei moduli kernel da caricare al boot. Non serve nel nostro caso.
=== /etc/dahdi/init.conf ===
Modifica il comportamento di default di ''/etc/init.d/dahdi''. Non serve nel nostro caso.
===== Configurazione di Wanpipe =====
Se tutto è stato configurato correttamente, eseguendo **''/etc/init.d/wanrouter start''** il kernel logga:
WANPIPE(tm) Interface Support Module 3.5.28.0 (c) 1994-2010 Sangoma Technologies Inc
WANPIPE(tm) Multi-Protocol WAN Driver Module 3.5.28.0 (c) 1994-2010 Sangoma Technologies Inc
wanpipe: Probing for WANPIPE hardware.
wanpipe: AFT-A200-SH PCIe FXO/FXS card found (HDLC rev.13), cpu(s) 1, bus #3, slot #4, irq #16
...
wanpipe1: Starting WAN Setup
Processing WAN device wanpipe1...
wanpipe1: Locating: A200/A400/B600/B700/B800/B610 card, CPU A, PciBus=3, PciSlot=4
wanpipe1: Found: A200/A400/B600/B700/B800/B610 card, CPU A, PciBus=3, PciSlot=4, Port=0
wanpipe1: AFT PCI memory at 0xDF9F0000
...
wanpipe1: Configuring FXS/FXO Front End ...
wanpipe1: Module 1: Installed -- Auto FXO (FCC mode)!
wanpipe1: Module 2: Installed -- Auto FXO (FCC mode)!
...
wanpipe1: Configuring Device :wanpipe1 FrmVr=13
wanpipe1: Global MTU = 1500
wanpipe1: Global MRU = 1500
...
wanpipe1: Configuring Interface: w1g1
wanpipe1:w1g1: Running in TDM Voice Zaptel Mode.
wanpipe1: Registering TDMV FXO iface to module 1!
...
wanpipe1: Configuring Interface: w1g1 (log supress)
wanpipe1: Configuring TDMV Master dev w1g1
wanpipe1: Registering TDMV FXO iface to module 2!
...
wanpipe1: ALAW override parameter detected. Device will be operating in ALAW
wanpipe1: Wanpipe device is registered to Zaptel span # 1!
wanpipe1: AFT communications enabled!
wanpipe1: AFT Per Port TDM Intr (swring)
wanpipe1: Module 1: FXO Line is connected!
=== /etc/wanpipe/wanpipe1.conf ===
Definisce i device e le interfacce disponibili con il software Wanpipe. Nel nostro caso il device è la scheda A200 e le interfacce sono le due porte FXO installate.
Può essere scritto a mano oppure generato automaticamente dallo script **''setup-sangoma''** o dallo script **''wancfg_dahdi''**. Nel nostro caso abbiamo accettato tutte le impostazioni predefinite scegliendo il **codec ALAW (Europe)**. Questo il risultato:
[devices]
wanpipe1 = WAN_AFT_ANALOG, Comment
[interfaces]
w1g1 = wanpipe1, , TDM_VOICE, Comment
[wanpipe1]
CARD_TYPE = AFT
S514CPU = A
CommPort = PRI
AUTO_PCISLOT = NO
PCISLOT = 4
PCIBUS = 3
FE_MEDIA = FXO/FXS
TDMV_LAW = ALAW
TDMV_OPERMODE = FCC
RM_BATTTHRESH = 3
RM_BATTDEBOUNCE = 16
FE_NETWORK_SYNC = NO
MTU = 1500
UDPPORT = 9000
TTL = 255
IGNORE_FRONT_END = NO
TDMV_SPAN = 1
TE_AIS_MAINTENANCE = NO
TDMV_HW_DTMF = NO
TDMV_HW_FAX_DETECT = NO
HWEC_OPERATION_MODE = OCT_NORMAL
HWEC_DTMF_REMOVAL = NO
HWEC_NOISE_REDUCTION = NO
HWEC_ACUSTIC_ECHO = NO
HWEC_NLP_DISABLE = NO
HWEC_TX_AUTO_GAIN = 0
HWEC_RX_AUTO_GAIN = 0
HWEC_TX_GAIN = 0
HWEC_RX_GAIN = 0
[w1g1]
ACTIVE_CH = ALL
MTU = 8
TDMV_HWEC = NO
=== /etc/wanpipe/wanrouter.rc ===
File di configurazione utilizzato dagli script Wanpipe che indica le directory da utilizzare, alcuni parametri di funzionamento, ecc.
Viene generato (sovrascritto) all'esecuzione di **''wancfg_dahdi''**.
=== /etc/init.d/wanrouter ===
Script che esegue lo start/stop del tool **''wanrouter''**, scopo principale dello script è caricare il modulo kernel **''wanpipe''** e le sue dipendenze.
Lo script viene abilitato ai vari runlevel quando si esegue la procedura di setup **''setup-sangoma''** o **''wancfg_dahdi''**.
Anche questo script di Sangoma fa schifo: non contiene i tag LSB (Linux Standard Base) per organizzare la sequenza di bootstrap e ''insserv'' giustamente si lamenta:
insserv: warning: script 'K01wanrouter' missing LSB tags and overrides
insserv: warning: script 'wanrouter' missing LSB tags and overrides
Questi i tag LSB che abbiamo aggiunto dentro allo script:
### BEGIN INIT INFO
# Provides: wanrouter
# Required-Start: dahdi
# Required-Stop: dahdi
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: WANPIPE WAN Router Initialization Script
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
=== /etc/wanpipe/scripts/start ===
Come spiegato nella FAQ **[[http://wiki.sangoma.com/wanpipe-asterisk-operation#AutoStartZaptel|Auto-start Zaptel after Wanpipe]]**, è indispensabile eseguire ''dhadi_cfg'' dopo aver avviato ''wanrouter''. Lo script **''/etc/wanpipe/scripts/start''** qui è stato adattato a DAHDI e ad una shell diversa da Bash:
#!/bin/sh
# Make sure that udev/devfs DAHDI device has come up.
cnt=1
max_delay=10
while [ "$cnt" -le "$max_delay" ]; do
if [ -e /dev/dahdi/ctl ]; then
break;
fi
echo "Waiting for DAHDI device /dev/dahdi/ctl ($cnt/$max_delay)..."
sleep 1
cnt=$(($cnt + 1))
done
if [ ! -e /dev/dahdi/ctl ]; then
echo
echo "Error: DAHDI device failed to come up";
echo "Possible Cause: UDEV not installed!";
echo
exit 1
fi
sleep 1
dahdi_cfg -vvvv
exit 0
===== Configurazione di Asterisk =====
Installare i pacchetti Debian:
* **asterisk**
* **asterisk-dahdi**
* **asterisk-prompt-it-menardi-gsm**
**asterisk-dahdi** serve ad interfacciare Asterisk con i canali DAHDI, **asterisk-prompt-it-menardi-gsm** contiene i messaggi del centralino in italiano. Quando tutto è configurato correttamente ed Asterisk si è avviato, è possibile connettersi alla console e verificare i canali DAHDI:
asterisk -vr
Asterisk 1.8.13.1~dfsg-1, Copyright (C) 1999 - 2012 Digium, Inc. and others.
...
=========================================================================
Connected to Asterisk 1.8.13.1~dfsg-1 currently running on naxos (pid = 11482)
*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
*CLI>
Invece eventuali messaggi di errore vengono loggati in **''/var/log/asterisk/messages''**.
==== Terminologia ====
^ Canale | Percorso attraverso il quale instradare delle chiamate, può essere ad esempio FXO (linea telefonica), FXS (apparecchio telefonico), SIP (voce su IP, standard usato da molti device), IAX (voce su IP, standard proposto da Asterisk). |
^ Estensione | |
^ Contesto | |
==== Principali file di configurazione ====
=== /etc/asterisk/chan_dahdi.conf ===
Il file può essere scritto a mano oppure generato (sovrascritto) dall'esecuzione di **''setup-sangoma''** oppure dall'esecuzione di **''wancfg_dahdi''** (entrambi installati con il software Wanpipe di Sangoma). Contiene la configurazione globale DAHDI e dei canali.
Questa è la parte relativa ai due canali FXO della scheda A200:
;Sangoma AFT-A200 [slot:4 bus:3 span:1]
; Span 1: WRTDM/0 "wrtdm Board 1" (MASTER)
;;; line="1 WRTDM/0/0"
context=from-pstn
group=0
echocancel=yes
signalling=fxs_ks
callerid=asreceived
channel => 1
;;; line="2 WRTDM/0/1"
context=from-pstn
group=0
echocancel=yes
signalling=fxs_ks
callerid=asreceived
channel => 2
=== /etc/asterisk/dahdi-channels.conf ===
Il file può essere scritto a mano oppure generato (sovrascritto) dall'esecuzione di **''setup-sangoma''** oppure dall'esecuzione di **''wancfg_dahdi''** (entrambi installati con il software Wanpipe di Sangoma) oppure dall'esecuzione di **''dahdi_genconf chandahdi''** (installato con il pacchetto Debian dahdi). Questo file dovrebbe contenere solo la configurazione dei canali DAHDI e dovrebbe essere incluso (con una direttiva ''#include'') dal file di configurazione vero e proprio **''chan_dahdi.conf''**.
=== /etc/asterisk/modules.conf ===
In questo file si può disabilitare il caricamento di moduli Asterisk che non servono. Abbiamo disabilitato il modulo [[https://wiki.asterisk.org/wiki/display/AST/LDAP+Realtime+Driver|LDAP Realtime Driver]] e altri:
; No LDAP database for RealTime Configuration.
noload => res_config_ldap.so
; No DAHDI transcoding cards installed.
noload => codec_dahdi.so
; No Voicetronix cards installed.
noload => chan_vpb.so
; No FreeTDS library to log to Microsoft SQL Server.
noload => cel_tds.so
; No AIS (Application Interface Specification) for clustering.
noload => res_ais.so
; We don't want Asterisk Extension Language and dialplan in extensions.ael
noload => pbx_ael.so
; We don't want dialplan written in Lua (extensions.lua).
noload => pbx_lua.so
; We don't store Call Detail Records into PostgreSQL.
noload => cdr_pgsql.so
Iil caricamento di moduli non necessari causava messaggi di errore o di warning e un **asterisk general protection** che impediva ad Asterisk di partire (anche Asterisk lascia a desiderare: una configurazione sbagliata che genera un general protection è sintomo di software scritto male!):
ERROR[22971] res_config_ldap.c: No directory URL or host found.
ERROR[22971] res_config_ldap.c: Cannot load LDAP RealTime driver.
NOTICE[11891] cel_tds.c: cel_tds has no global category, nothing to configure.
WARNING[11891] cel_tds.c: cel_tds module had config problems; declining load
ERROR[11891] codec_dahdi.c: Failed to open /dev/dahdi/transcode: No such file or directory
ERROR[11891] chan_vpb.cc: No Voicetronix cards detected
ERROR[11891] ais/clm.c: Could not initialize cluster membership service: Try Again
asterisk[11418] general protection ip:7f637a77fee2 sp:7fffc2e658d0 error:0 in libc-2.13.so[7f637a748000+17d000]
=== /etc/asterisk/asterisk.conf ===
Per avere le voci del centralino in italiano:
defaultlanguage = it
=== /etc/asterisk/extensions.conf ===
Contiene il **dialplan** del centralino Asterisk.
==== Client SIP ====
Per consentire la registrazione a un client SIP (softphone tipo CSipSimple per Android oppure un telefono IP) si aggiunge al file di configurazione **''/etc/asterisk/sip.conf''** una sezione del tipo:
;---------------------------------------------------------------
; SIP channel: mobile softphone
; It receives and places calls: it is a friend.
;---------------------------------------------------------------
[niccolo]
callerid=Niccolo <100>
type=friend
context=sip-phones
host=dynamic
secret=MySipSecret
Il client SIP va inserito come estensione in un opportuno contesto, ad esempio in **''/etc/asterisk/extensions.conf''** si definisce il contesto **sip-phones** con l'estensione (interno) **100**:
[sip-phones]
exten => 100,1,Verbose(1,Dialling extension 100: Niccolo SIP phone)
exten => 100,n,Dial(SIP/niccolo,45)
exten => 100,n,Hangup()
=== Wind: operatore bastardo che filtra le porte ===
Asterisk sta in ascolto sulla porta **5060 UDP** e **TCP**, eventualmente anche sulla porta 5061 per il TLS. Acluni operatori di connettività (3G oppure ADSL) potrebbero filtrare tale traffico, in uscita o in ingresso. Ad esempio **con una connessione 3G Wind verso una ADSL Wind Infostrada, la porta 5060 risulta totalmente filtrata!**
Ovviamente è possibile mettere Asterisk in ascolto su altra porta (riconfigurando Asterisk oppure con regole iptables è possibile ridirigere una o più porte alternative sulla 5060), ma ancora non ho potuto verificare che la soluzione sia affidabile. Oltre al traffico SIP infatti c'è da verificare che anche il traffico voce (RTP) passi correttamente, con tutti i problemi connessi al NAT, ecc.
==== Problemi NAT e firewall ====
* [[http://www.smartvox.co.uk/sipfaq_natproblem_explained.htm|SIP and NAT: Why is it a problem?]]
* [[http://www.smartvox.co.uk/sipfaq_natsolutions_explained.htm|Using SIP Devices behind NAT]]
==== Debug ====
Con una configurazione di DAHDI sbagliata Asterisk può non partire proprio. Ecco cosa succede lanciando il programma in modo interattivo:
# asterisk -cvvvvv
...
== Registered application 'DAHDIBarge'
app_dahdibarge.so => (Barge in on DAHDI channel application)
Segmentation fault
Se invece il programma si avvia, è possibile uscire dalla linea di comando con:
*CLI> core stop now
===== TODO =====
FIXME Verificare se c'è da [[http://wiki.sangoma.com/wanpipe-linux-aft-firmware-update|aggiornare il firmware]].