или Как я долбился в DAHDI.
Мысль поднять транк на ISDN BRI потоке мне вообще не приходила. Я просто хотел сконфигурировать SIP аплинк, и тут понеслось.
Короче, жил-был Trixbox с ISDN платой, воткнутой в NT по S/T интерфейсу. А потом хозяину этого триксбокса захотелось чего-то большего, и он позвал меня.
Триксбокс был страшен. Он жил на HP ML 110 G5 на пятой центоси с 2.6.18-м ведром. Не, я понимаю, что телефонистские интерфейсы могли бы и с 0.99pl12 жить не тужить, если бы оно их поддерживало, ничего в них за это время не поменялось. Но так как оно плохо понимало во всяких новомодных SATA-интерфейсах, то, например, HP-шный 7200RPM винт оно читало со скоростью 2-2.5 мегабайта в секунду, и пляски с hdparm'ом особого успеха не имели.
Поэтому, не мудрствуя лукаво, я сказал: «Ехать на VoIP? Есть ещё такая же машина и такая же ISDN плата для устрашения врага? Да нефик делать!» И всё заверте.
Так как Trixbox — это FreePBX, то и поднимать на новом месте решил тоже FreePBX — привычный заказчику функционал проще переносить. Ставил на Ubuntu 14.04LTS по мануалу с FreePBX'ного сайта, то есть asterisk, dahdi и libpri собирал из исходников. Ну, собралось, взлетаем!
Взлетели. Астериск работает, морда управляет. Хозяин, ставь свою плату! Поставили плату, и привет. Плата не видна в астериске: pri show spans ничего не выводит. Пошёл читать интернетов. Оказывается, плате в обед сто лет, когда-то, давным-давно, её поддерживал zaptel, потом кто-то портировал драйвера в DAHDI, но как-то патчей, совместимых с текущим DAHDI и ядром, на просторах не сохранилось. Попробовал ткнуться через mISDN — увы: та libmISDN, которая собралась, оказалась v2, у которой API не понимаемо астериском, а v1 собираться с ядром 3.19 наотрез отказалась.
Херня! — сказал я и поставил dahdi и dahdi-asterisk из репозитория убунты. «Вжик!» сказала японская лесопилка и показала, что модуль платы теперь загружен тот самый, который нужно (zaphfc, а не hfcpci, который идёт со штатным ядром, но не нравится DAHDI ни в какую). Более того, в морде FreePBX'а показалась некая интерфейсина, которую можно было сконфигурировать. Правда, после поступления первого же входящего звонка консоль астериска заполнилась бегущими сообщениями про short write и invalid argument.
Херня! — сказал я и снёс поставленный из исходников астериск и поставил штатный из репы и старенький FreePBX. Но не тут-то было. Сообщения не исчезали, звонки не шли.
В результате после многочасовой долбёжки выяснилось, что dahdi, идущий в штатном комплекте убунты 14.04 LTS, несовместим с ядром 3.16 (и позднее), также идущими в штатном комплекте убунты 14.04 LTS в части поддержки этой самой HFC BRI. После даунгрейда ядра на 3.13-lowlatency (есть в репозитории) проблемы с канальной частью разрешились практически полностью. Мелочи вроде непонимания телефонной компанией набираемых номеров, если pridialplan установлен в national, а не в unknown — это уже сущие мелочи.
Итого рабочая конфигурация:
- Cologne Chip Designs GmbH ISDN network controller [HFC-PCI] (vendor id 1397, device id 2bd0, 1397:2bd0 (that's for google));
- Ядро 3.13.0-77-lowlatency #121-Ubuntu SMP PREEMPT
- Asterisk 11.7.0~dfsg-1ubuntu1
- DAHDI 2.7.0-1ubuntu1
- asterisk-dahdi 11.7.0~dfsg-1ubuntu1
- dahdi-dkms 2.5.0.1+dfsg-1ubuntu4~14.04.4
- FreePBX 2.11 с сайта freepbx.org обновлён на месте.
- NT: неизвестен.
Конфиги DAHDI и chan_dahdi.conf приводить не буду, их FreePBX регулярно перерисовывает, да и сильно зависят они от телефонной компании.