Sangoma Wanpipe DAHDI¶
- Table of contents
- Sangoma Wanpipe DAHDI
some random notes on bulding DAHDI drivers for Sangoma AFT104 cards on a modern Debian 11 / buster
- wanpipe 7.0.34 (e.g. via https://gitea.osmocom.org/retronetworking/wanpipe)
- dahdi-linux (e.g. https://gitea.osmocom.org/retronetworking/dahdi-linux)
the offiial way¶
some incredible convolution of shell scripts, c programs, perl script and other bits and pieces, which all fail in various ways.
the manual way¶
- build + install dahdi-linux
- usual make + sudo make install
building sangoma wanpipe drivers¶
$ make -j4 dahdi DAHDI_DIR=/home/laforge/dahdi-linux KBUILD_EXTRA_SYMBOLS=/home/laforge/dahdi-linux/drivers/dahdi/Module.symvers
the importance is to pass the correct Module.symvers from the DAHDI build as KBUILD_EXTRA_SYMBOLS, as otherwise the wanpipe drivers will fail to load with errors like this:
This somehow fails, the Module.symvers gets overwritten and the module fails with various related errors:
[ 4874.442680] wanpipe: no symbol version for dahdi_hdlc_putbuf [ 4874.442702] wanpipe: Unknown symbol dahdi_hdlc_putbuf (err -22) [ 4874.442754] wanpipe: no symbol version for _dahdi_ec_span [ 4874.442760] wanpipe: Unknown symbol _dahdi_ec_span (err -22) ..
Building (using Makefile.debian11)¶
In the osmocom wanpipe git repo at https://gitea.osmocom.org/retronetworking/wanpipe/ we've added a
Makefile.debian which will help you in building + installing a lean/minimal driver set.
build(default, compiles kernel driver and minimal userspae lib+tool)
install(installs the kernel driver, library and userspace tool)
Loading of kernel drivers¶
This assumes that you have installed the kernel modules (both DAHDI and wanpipe) and exeuted depmod.
you should then see something like this below (my system has two AFT-104-SH cards installed):
[ 5890.715722] WANPIPE(tm) Multi-Protocol WAN Driver Module 18.104.22.168 (c) 1994-2016 Sangoma Technologies Inc [ 5890.715732] wanpipe: Probing for WANPIPE hardware. [ 5890.716232] wanpipe: AFT-A104-SH PCI T1/E1 card found (HDLC rev.26), cpu(s) 1, line(s) 4, bus #2, slot #0, irq #25 [ 5890.716524] wanpipe: AFT-A104-SH PCI T1/E1 card found (HDLC rev.26), cpu(s) 1, line(s) 4, bus #2, slot #1, irq #27 [ 5890.716665] wanpipe: Allocating maximum 8 devices: wanpipe1 - wanpipe8. [ 5890.719054] WANPIPE: TDM Codecs Initialized
equally there should now be a lot of /proc/net/wanrouter/ files
$ cat /proc/net/wanrouter/hwprobe ------------------------------- | Wanpipe Hardware Probe Info | ------------------------------- 1 . AFT-A104-SH : SLOT=0 : BUS=2 : IRQ=25 : CPU=A : PORT=1 : HWEC=128 : V=26 2 . AFT-A104-SH : SLOT=0 : BUS=2 : IRQ=25 : CPU=A : PORT=2 : HWEC=128 : V=26 3 . AFT-A104-SH : SLOT=0 : BUS=2 : IRQ=25 : CPU=A : PORT=3 : HWEC=128 : V=26 4 . AFT-A104-SH : SLOT=0 : BUS=2 : IRQ=25 : CPU=A : PORT=4 : HWEC=128 : V=26 5 . AFT-A104-SH : SLOT=1 : BUS=2 : IRQ=27 : CPU=A : PORT=1 : HWEC=128 : V=26 6 . AFT-A104-SH : SLOT=1 : BUS=2 : IRQ=27 : CPU=A : PORT=2 : HWEC=128 : V=26 7 . AFT-A104-SH : SLOT=1 : BUS=2 : IRQ=27 : CPU=A : PORT=3 : HWEC=128 : V=26 8 . AFT-A104-SH : SLOT=1 : BUS=2 : IRQ=27 : CPU=A : PORT=4 : HWEC=128 : V=26 Sangoma Card Count: A104=2
Configuration of wanpipe kernel drivers¶
The sangoma wanpipe tarballs ship a bizarre combination of C++ code that generates shell scripts which call perl code which generates config files (then parsed by C code). It's a nightmare, and I'm not sure why anyone would want to bother with this. All I want is some kind of clear documentation which ioctl()s (or a C command line tool executing those) are required to bring the device up.
After some reading of the kernel sources, it tunrs out that the ROUTER_IFNEW ioctl is really all that's needed to get a sangoma wanpipe card exposed to dahdi.
util/wanconfig program that can drive this ioctl. You can specify a plethora of command line arguments or put all of those in a config file. Those configs are usually located in
/etc/wanpipe/wanpipeX.conf where X is for each of your wanpipe cards.
I'm using the following example for
[devices] wanpipe1 = WAN_AFT_TE1, Comment [interfaces] w1g1 = wanpipe1, , TDM_VOICE, Comment [wanpipe1] CARD_TYPE = AFT S514CPU = A CommPort = PRI AUTO_PCISLOT = NO PCISLOT = 0 PCIBUS = 2 FE_MEDIA = E1 FE_LCODE = HDB3 FE_FRAME = CRC4 FE_LINE = 1 TE_CLOCK = NORMAL TE_REF_CLOCK = 0 ACTIVE_CH = ALL TE_HIGHIMPEDANCE = NO LBO = NONE FE_TXTRISTATE = NO MTU = 1500 UDPPORT = 9000 TTL = 255 IGNORE_FRONT_END = NO TDMV_SPAN = 1 TDMV_DCHAN = 15 [w1g1] ACTIVE_CH = ALL TDMV_ECHO_OFF = NO
Note: You will need to fill the PCISLOT, PCIBUS etc. parameters according to your output pf /proc/net/wanrouter/hwprobe.
Applying the configuration to the kernel¶
wanconfig -f /etc/wanpipe/wanpipe1.conf will put together the ioctl() to the kernel and should ideally succeed. If it does, you will get something like this in your dmesg:
[42799.010236] Processing WAN device wanpipe1... [42799.010249] wanpipe1: Locating: A101/1D/2/2D/4/4D/8/8D/16/16D card, CPU A, PciBus=2, PciSlot=0 [42799.010266] wanpipe1: Found: A101/1D/2/2D/4/4D/8/8D/16/16D card, CPU A, PciBus=2, PciSlot=0, Port=0 [42799.010379] wanpipe1: AFT PCI memory at 0xFE500000 [42799.010386] wanpipe1: IRQ 25 allocated to the AFT PCI card [42799.010465] wanpipe1: Starting AFT 2/4/8 Hardware Init. [42799.010506] wanpipe1: Enabling front end link monitor [42799.010516] wanpipe1: Global Chip Configuration: used=1 used_type=1 [42799.013910] wanpipe1: AFT Data Mux Bit Map: 0x01234567 [42799.013946] wanpipe1: Defaulting E1 LBO = 120 OH [42799.013951] wanpipe1: Defaulting E1 Signalling = CCS [42799.013957] wanpipe1: Configuring PMC COMET-QUAD E1 FE [42799.013965] wanpipe1: Port 1,HDB3,CRC4,120OH [42799.013972] wanpipe1: Clk Normal:0, Ch FFFFFFFF [42799.013977] wanpipe1: Sig Mode CCS [42799.182498] wanpipe1: Front end successful [42799.182506] wanpipe1: Configuring FE Line=1 Clock Source: Line=1 Normal [42799.182741] wanpipe1: Front End Interface Ready 0x40000000 [42799.182756] wanpipe1: Register EC interface wanec1 (usage 1, max ec chans 128)! [42799.182774] wanpipe1: Configuring Device :wanpipe1 FrmVr=26 [42799.182777] wanpipe1: Global MTU = 1500 [42799.182780] wanpipe1: Global MRU = 1500 [42799.182784] wanpipe1: Data Mux Map = 0x01234567 [42799.182786] wanpipe1: Rx CRC Bytes = 0 [42799.182789] wanpipe1: RBS Signalling = Off [42799.182793] wanpipe1: Global TDM Int = Enabled [42799.182796] wanpipe1: Global TDM Ring= HW Ring [42799.182799] wanpipe1: Global SPAN IRQ= RX/TX [42799.182802] wanpipe1: TDM HW TONE = Disabled [42799.182806] wanpipe1: Fifo Trigger = rx:50 tx:50 (events per sec) [42799.182809] wanpipe1: TDMV Span = 1 : Enabled [42799.182812] wanpipe1: TDMV Dummy = Disabled [42799.182816] wanpipe1: RTP TAP = Disabled [42799.182915] wanpipe1: Initializing TE1 Voice functions [42799.183149] wanpipe1: Global Poll IRQ= Disabled [42799.183157] wanpipe1: Configuring Interface: w1g1 [42799.183173] wanpipe1: w1g1 Running in TDM Voice Zaptel Mode. [42799.183180] wanpipe1: Fifo Level Map:0x01041040 [42799.183188] wanpipe1: MRU :8 (Chunk/Period=80/10) [42799.183192] wanpipe1: MTU :8 (Chunk/Period=80/10) [42799.183196] wanpipe1: HDLC Eng :Off (Transparent) | N/A [42799.183203] wanpipe1: Data Mux Ctrl :On [42799.183206] wanpipe1: Active Ch Map :0x00000002 [42799.183210] wanpipe1: First TSlot :1 [42799.183257] wanpipe1: DMA/Len/Idle/ChainR/ChainT/EC :65/1024/8/Off/Off/Off [42799.183263] wanpipe1: Memory: Chan=5680 [42799.183504] wanpipe1: Configuring Interface: w1g1 (log supress) [42799.183519] wanpipe1: Active Ch Map :0x00000004 [42799.183523] wanpipe1: First TSlot :2 [42799.183756] wanpipe1: Configuring Interface: w1g1 (log supress) [42799.183772] wanpipe1: Active Ch Map :0x00000008 [42799.183775] wanpipe1: First TSlot :3 ... [42799.192799] wanpipe1: Configuring Interface: w1g1 (log supress) [42799.192858] wanpipe1: Configuring TDMV Master dev w1g1 [42799.192868] wanpipe1: Active Ch Map :0x80000000 [42799.192872] wanpipe1: First TSlot :31 [42799.202242] wanpipe1: Wanpipe device is registered to Zaptel span # 1! [42799.209532] wanpipe1: TDM Timing Enabled 1 ms [42800.205759] wanpipe1: E1 disconnected!
Equally, you will get a
/proc/dahdi/1 device for that first E1 span.
Once your E1 link is up, you will get:
[42995.786699] wanpipe1: E1 connected! [42995.789324] wanpipe1: AFT communications enabled [42995.791333] wanpipe1: AFT Global TDM Intr [42995.791410] wanpipe1: TDM Timing Disabled! [42996.811333] wanpipe1: Enable E1 Interrupts