Asterisk, Zaptel, Oslec and Ubuntu Server [Updated]
I have recently migrated my server at home from a custom Linux build to Ubuntu Server (8.10 Intrepid). The main migration went very smoothly and I learned a few new tricks on the way too.
One function the server performs is as my telephone system for work and home. It runs Asterisk. I have a couple of IAX2 trunks from our VOIP provider for mine and my wife’s businesses and I also have a cheap x100p clone analogue card for PSTN backup purposes. On my old system software, I had compiled the device drivers (zaptel) and kernel modules for the card manually and used a, frankly fantastic, echo canceller called Oslec (the Open Source Line Echo Canceller). You can read the couple of posts I made about when I first tried it out here.
On my new server OS, I installed the Asterisk server via Ubuntu’s package management system sudo apt-get install asterisk
. After some digging around on the ‘net (and it wasn’t obvious) I discovered that the zaptel drivers (for the PSTN hardware) need to be installed slightly differently:
You might have to run sudo m-a -t build zaptel
Which retrieves the zaptel package and builds it for your running kernel.m-a prepare
in advance of this to retrieve your Linux kernel headers.
The m-a (Module Assistant) command will compile and create a .deb
package in the /usr/src
directory. On my system the package was called zaptel-modules-2.6.27-11-server_1.4.11~dfsg-2+2.6.27-11.27_i386.deb
.
It can then be installed using dpkg: sudo dpkg -i zaptel-modules-2.6.27-11-server_1.4.11~dfsg-2+2.6.27-11.27_i386.deb
.
This went fine and I had read on launchpad that as of an earlier version of the zaptel package the Oslec echo canceller was now the default. Unfortunately this didn’t quite work as I expected. The zaptel module was in fact using the standard MG2 EC which is not very good with my x100p card at all.
After a bit more digging around in the source code, there is a file in the zaptel package called zconfig.h which is where the chosen EC is defined. It is specified as MG2 in the package. What I did to fix it was as follows.
Unpack thezaptel.tar.bz2
package that was in/usr/src
.Edit thekernel/zconfig.h
file so the line#define ECHO_CAN_MG2
is commented outand added in a line that reads#define ECHO_CAN_OSLEC
instead.Re-assemble the zaptel package:sudo tar jcvf zaptel.tar.bz2 modules
(“modules” is the directory name where the zaptel package extracts to).Delete the existing zaptel-blah-blah.deb file and the modules directory too.Re-run them-a -t build zaptel
command.
Thanks to Tzafir Cohen on the asterisk mailing list for this. There is a far simpler method to use for the time being although this is a known bug and is now fixed in the development tree so I guess it will be unnecessary once the package has been updated. Do please check first if you are following this in the months to come. Anyway, instead of the commands above, these commands work for me and are far simpler:
sudo m-a -f get zaptel-source
This simply gets the source package and saves it in /usr/src
.
sudo ECHO_CAN_NAME=OSLEC m-a -t a-i zaptel
And this builds and installs the modules and tells the build scripts to choose the Oslec EC by default. The -t
switch puts the command into text mode so you actually see what is going on. I find the process rather opaque and uninformative without this switch.
After rebuilding, the zaptel module now requires, and loads the Oslec EC by default. The command modinfo zaptel
is a good test. The output of it should be something like this:
filename: /lib/modules/2.6.27-11-server/misc/zaptel.ko
version: 1.4.11
license: GPL
description: Zapata Telephony Interface
author: Mark Spencer
srcversion: 4433ADDE0493C798A455677
depends: oslec,crc-ccitt
vermagic: 2.6.27-11-server SMP mod_unload modversions 686
parm: debug:int
parm: deftaps:int
Note the “depends” line.
You could also type lsmod | grep 'zaptel'
once you have reloaded your server:
zaptel 199844 5 wcfxo
oslec 16668 1 zaptel
crc_ccitt 10112 1 zaptel
This command shows the oslec ec module installed along with the the zaptel and wcfxo drivers.
One final point to note. If you just want to load a particular telephony hardware driver and not all of them, I think you need a file /etc/default/zaptel
like this with the relevant driver(s) uncommented:
TELEPHONY=yes
DEBUG=yes
# Un-comment as per your requirements; modules to load/unload
#Module Name Hardware
#MODULES="$MODULES tor2" # T400P - Quad Span T1 Card
#E400P - Quad Span E1 Card
#MODULES="$MODULES wct4xxp" # TE405P - Quad Span T1/E1 Card (5v version)
# TE410P - Quad Span T1/E1 Card (3.3v version)
#wct4xxp_ARGS="t1e1override=15" # Additional parameters for TE4xxP driver
#MODULES="$MODULES wct1xxp" # T100P - Single Span T1 Card
# E100P - Single Span E1 Card
#MODULES="$MODULES wcte11xp" # TE110P - Single Span T1/E1 Card
#MODULES="$MODULES wctdm24xxp" # TDM2400P - Modular FXS/FXO interface (1-24 ports)
MODULES="$MODULES wcfxo" # X100P - Single port FXO interface
# X101P - Single port FXO interface
#MODULES="$MODULES wctdm" # TDM400P - Modular FXS/FXO interface (1-4 ports)
I can’t recall the exact origins of this file and whether or not it is really necessary, but I had it on my old system and the Ubuntu provided zaptel init script checks for it’s presence; although it doesn’t look like it does much with its contents though…
Hopefully this will help others and also act as a bit of an aide memoir for me when I next build an Ubuntu server with Asterisk.