Configurazione di Asterisk con una scheda ISDN BRI (driver Zaptel) In Debian Etch (obsoleto ma contiene informazioni utili)
Il driver Zaptel consente di pilotare schede ISDN PRI, BRI e multiBRI. Questa configurazione e` fatta per una scheda ISDN BRI con chipset HFC configurata come TE P2MP. (dio, *adoro* le sigle!) Per dirla in termini umani, si tratta di una configurazione in cui Asterisk si comporta come un centralino a cui e` connessa una linea telefonica ISDN configurata come punto-multipunto (la configurazione classica della singola linea ISDN).
Vale la pena di notare che in Etch esistono due versioni di asterisk, una delle due e` "bristuffed" e l'altra no. Credo (ma non ne sono sicuro, c'e` chi sostiene il contrario) che per poter usare delle schede ISDN BRI con chipset HFC (con il driver ZAPHFC) occorra necessariamente la versione "bristuffed".
In Etch ci sono due moduli per gestire le schede con chipset HFC: zaphcf e vzaphfc. Apparentemente (da provare) il secondo e` fatto per eliminare i problemi di interrupt. In ogni caso, in etch occorre necessariamente eseguire "ztcfg" una volta dopo aver caricato il modulo, altrimenti questo non si inizializza e non va. Se si prova a vederne lo stato con "zttool" prima e dopo, si nota che prima non e` inizializzato e dopo si`. Se il modulo non si inizializza, non genera il timing, quindi non solo non va l'isdn, ma nemmeno il voip (asterisk non manda fuori pacchetti RTP, quindi niente audio).
Installazione pacchetto dei driver Zaptel
Questa installazione e` per Debian Etch, se usate altro, installateveli come meglio e` opportuno.
E` possibile installarsi il pacchetto dei drivers Zaptel sia usando il kernel stock che compilandoselo.
Se ci si compila il proprio kernel, la procedura e`:
- Installare i seguenti pacchetti:
- Kernel source
- Dpatch
- Zaptel
- Zaptel-source
- Compilare il kernel custom, avendo cura di abilitare nella sezione "Library" la voce "CRC-CCITT functions". Non e` necessario configurare nulla che riguarda l' ISDN.
- installare il kernel cosi` compilato e ribootare
Eseguire il comando magico module-assistant a-i zaptel per compilare e installare i moduli Zaptel in una sola mossa
Eseguire depmod -a
Caricare il modulo zaphfc oppure vzaphfc il quale dovrebbe caricare anche zaptel
Vedere dmesg per verificare se la scheda e` stata vista
Eseguire cat /proc/interrupts per vedere se la scheda condivide un interrupt (vedansi le note in fondo)
- Prima di poter usare il driver, occorrera` modificarne le configurazioni (vedi sotto)
Se si installa sul kernel stock, la procedura e`:
- Installare i seguenti pacchetti (con le dipendenze che seguono):
- zaptel
- zaptel-source
Eseguire il comando magico module-assistant a-i zaptel per compilare e installare i moduli Zaptel in una sola mossa
Eseguire depmod -a
Caricare il modulo zaphfc oppure vzaphfc il quale dovrebbe caricare anche zaptel
Vedere dmesg per verificare se la scheda e` stata vista
Eseguire cat /proc/interrupts per vedere se la scheda condivide un interrupt (vedansi le note in fondo)
- Prima di poter usare il driver, occorrera` modificarne le configurazioni (vedi sotto)
Configurazione del modulo zaphfc
Al momento del caricamento, il modulo zaphfc fa riferimento al file /etc/zaptel.conf per impostare alcuni suoi parametri. Queste sono le impostazioni necessarie per una singola scheda HFC BRI, usata in Italia. Se si cambia qualcosa qui, occorre ricaricare il modulo zaphfc, oppure eseguire ztcfg che passa al modulo la nuova configurazione.
# hfc-s pci a span definition # most of the values should be bogus because we are not really zaptel loadzone=it defaultzone=it span=1,1,3,ccs,ami bchan=1-2 dchan=3 ## eventuale seconda scheda HFC #span=2,1,3,ccs,ami #bchan=4-5 #dchan=6
Configurazione di Asterisk
Tutte le configurazioni del driver Zaptel in Asterisk sono in /etc/zapata.conf. Il modulo che asterisk deve caricare (vedi /etc/asterisk/modules.conf e` /usr/lib/asterisk/modules/chan_zap.so.
Questa e` una configurazione che sto testando, quindi prendetela con le pinze. Quelle lunghe.
; file /etc/asterisk/zapata.conf ; Zapata telephony interface Configuration file ; Per le schede ISDN con zapata e zaphfc [channels] ; Default language language=it ; Tipo di centrale (per l'italia e` euroisdn) switchtype = euroisdn ; p2mp TE mode signalling = bri_cpe_ptmp ; p2p TE mode (da usare se abbiamo linee PTP ovvero punto-punto) ;signalling = bri_cpe ; p2mp NT mode ;signalling = bri_net_ptmp ; p2p NT mode ;signalling = bri_net ; Queste dicono che per la Telecom vanno messe cosi`. Io non lo so. pridialplan = unknown prilocaldialplan = unknown nationalprefix = 0 internationalprefix = 00 ; Cancellazione dell'eco. Secondo me non serve su ISDN, dovro` provare a disattivarla. echocancel=yes echotraining = 100 echocancelwhenbridged=yes ; se ci sono problemi di eco vale la pena di provare a giocare con i gain in tx e rx... ; rxgain=-6.0 ; txgain=4.0 ; Per leggere i valori audio sulla linea, usare ; ztmonitor 1 -vv (1 e` il canale), usando un terminale piu` grande di 80x25 per vedere ; correttamente i livelli. Vedi http://www.voip-info.org/wiki/view/Asterisk+zapata+gain+adjustment ; Se voglio poter discernere gli MSN (se ne ho) sulle chiamate entranti, allora ; immeditate deve essere "no", e nel file estensions.conf dovro` discernere cosa fare per ogni MSN chiamato. ; Altrimenti lo metto a "yes" e nel file extensions.conf ricevero` sempre chiamate alla extension "s" di start. immediate=no ; Gruppo 1 (al gruppo 1 faro` apparetenere tutti e due i canali B, in modo da usarli in maniera indifferenziata) group = 1 ; Context a cui arriveranno le chiamate in extensions.conf context=isdn ; Per finire, tutto quello che e` stato detto sopra lo applico ai canali 1 e 2 (i due canali B della mia BRI) channel => 1-2 ; se ho due schede, la riga sopra deve contenere anche gli altri canali B, e diventa: ; channel => 1,2,4,5
Riporto qui un esempio di configurazione di extensions.conf per usare le linee ISDN per chiamare e ricevere, con e senza la distinzione degli MSN chiamati (cioe` dei numeri aggiuntivi, se ne ho, a cui vengo chiamato).
; context "isdn", cosi` come definito in zapata.conf, per le chiamate entranti. [isdn] ; se ho impostato "immediate=yes" in zapata.conf, tutte le chiamate arrivano ; all'extension "s" di start, quindi per esempio per far suonare ; un telefono SIP quando mi chiamano sulla ISDN usero`: exten => s,1,Dial(SIP/Int101) ; se ho impostato "immediate=no" in zapata.conf, le chiamate entrano su ; extensions che hanno il numero corrispondente all' MSN chiamato. ; supponendo che io abbia i numeri "051555555" e "051666666", posso discernere ; le chiamate in ingresso ed assegnarne una ad un telefono SIP e una all'altro. exten => 051555555,1,Dial(SIP/Int101) exten => 051666666,1,Dial(SIP/Int102)
Per verificare con che numero di estension entrano le chiamate dalla linea ISDN, e` sufficiente abilitare abbastanza debug su Asterisk (con il comando "asterisk -rvvv") e provare a chiamarsi sulla ISDN.
Comandi in userspace
Il sistema "zaptel" dispone di alcuni comandi in userspace, essi sono:
- ztcfg (ricarica la configurazione da /etc/zaptel.conf nel modulo gia` in esecuzione)
- ztmonitor (mostra i livelli audio sulle linee delle interfacce zaptel per il fine-tuning)
- ztspeed (boh? fa un test di alcuni secondi e mostra un risultato numerico)
- zttest (Misura l'accuracy di qualcosa?)
- zttool (mostra lo stato delle interfacce Zaptel installate)
Di questi, ztcfg sicuramente funziona con le schede HFC, secondo me gli altri malfunzionano o riportano valori errati in quanto il driver ZapHFC non e` veramente un driver completo come quelli delle schede Digium originali.
Note varie
- In Italia l' ISDN usa la codifica A-law, quindi per limitare il carico di transcodifica fra ISDN e telefoni IP, qualora la banda non sia un problema, e` conveniente configurare i telefoni IP per usare anche essi la codifica "alaw" in sip.conf.
- Se la scheda ISDN condivide l'interrupt, Asterisk puo` dare di matto, perche` usa il timing della scheda ISDN, e in condizioni di interrupt condiviso il sistema non riesce piu` a stare dietro alla montagna di interrupt tirati dalla scheda. Occorre spostare la scheda fino a ottenere una configurazione in cui la scheda ISDN ha un interrupt da sola. In caso di problemi i sintomi sono principalmente due: una montagna di errori nel syslog da parte del driver zaphfc e tutto l'audio generato da Asterisk che si sente a scatti tipo CD che salta.
- In Italia, in una configurazione BRI PTMP, e` normale che nel log di asterisk (con verbosita` alta) si leggano continuamente messaggi come questi:
== Primary D-Channel on span 1 down == Primary D-Channel on span 1 up
Questi sono causati dal fatto che la centrale quando la linea e` idle mette down i layer 1 e 2, e Asterisk li ritira su al volo. L'importante e` che a un messaggio di down ne segua immediatamente uno di up, se cosi` non fosse, significa che il canale D resta down e quindi non si chiama ne` riceve.
Problemi di interrupt e patches relative - DOVREBBERO ESSERE OBSOLETI IN ETCH!!!
In tutte e due le mie installazioni di prova si verificano, apparentemente a caso (una race condition?) errori di interrupt persi, sincronizzazione, persa, eccetera. Per esempio:
zaphfc: sync lost, pci performance too low. you might have some cpu throtteling enabled. zaphfc: bchan rx fifo not enough bytes to receive! (z1=3631, z2=3624, wanted 8 got 7), probably a buffer overrun.
Oltre ad avere milioni di righe di log come queste, succede che la voce si sente a tratti, distorta e con delle micro-interruzioni in mezzo.
Il problema e` che il driver zaphfc e` sensibilissimo al timing, e se si perde un solo interrupt e` la fine del mondo, da li` in poi va tutto da schifo ed occorre scaricare e ricaricare il modulo, il che e` ovviamente un problema enorme.
La soluzione consigliata e` quella di installare la scheda ISDN in modo che non condivida l'interrupt con nessun'altra scheda, ma la cosa non e` affatto banale, e inoltre in condizioni di carico la macchina puo` perdere comunque interrupts.
In seconda istanza, esiste una patch qui: http://zaphfc.florz.dyndns.org/ per il driver zaphfc che ha lo scopo di renderlo meno sensibile ai problemi di interrupt persi.
Io per patchare il driver versione Debian ho usato la versione allegata (zaphfc_0.2.0-RC7j_florz-4.diff.gz), con la seguente procedura:
- dopo aver scaricato i sorgenti Debian (vedi sopra) occorre scompattare il file /usr/src/zaptel.tar.bz2 il che crea la directory /usr/src/modules/zaptel e tutto quello che ci sta sotto.
- prendere la patch allegata a questa pagina (o dal sito dell'autore) e scompattarla dove volete
- entrare in /usr/src/modules/zaptel ed eseguire
patch -p1 < zaphfc_0.2.0-RC7j_florz-4.dif
- La patch dara` errori su Makefile ma patchera` correttamente zaphfc.c e zaphfc.h
- Ora, per fare felice il sistema Debian, occorre ricreare il file zaptel.tar.bz2 con dentro i files modificati, (disponibile gia` patchato da me qui: attachment:zaptel.tar.bz2, pero` consiglio di farsi la patch a mano) quindi, da dentro la direcotory /usr/src, eseguire:
tar cvjf zaptel.tar.bz2 modules/*
- Se si e` gia` compilato il file deb di installazione dei moduli, cancellarlo perche` altrimenti il module-assistant non lo ricrea
- Ora, creare il file di installazione deb con:
module-assistant build zaptel
- Per finire, installare i moduli con il comando
dpkg -i zaptel-modules-<quello che e`>.deb