Configurazione di Asterisk con una scheda ISDN BRI (driver Zaptel)

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).

Importante: Leggete fino in fondo perche` quasi sicuramente avrete bisogno delle patch per i problemi di timing.

Installazione pacchetto dei driver Zaptel

Questa installazione e` per Debian, se usate altro, installateveli come meglio e` opportuno.

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

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
;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 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

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:

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

Problemi di interrupt e patches relative

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 (attachment:zaphfc_0.2.0-RC7j_florz-4.diff.gz), con la seguente procedura: