Построение TDM access сервера на базе open-source технологий.

Обычно подсистему Zaptel справедливо рассматривают как низкоуровневую часть open source проекта Asterisk. Однако кроме передачи голосовых и сигнализационных данных с интерфейсов цифровых и аналоговых телефонных линий связи в высокоуровневую часть Asterisk, zaptel предоставляет ряд возможностей, позволяющих рассматривать его в качестве программного ядра сервера доступа к TDM каналам. С помощью Zaptel можно использовать таймслоты TDM потоков для передачи данных с инкапсуляцией в HDLC или PPP протоколы.

[Хелик Михаил (mixel.net{at}gmail.com)]

Публикация данного материала допускается только с указанием имени автора и ссылки на оригинальную статью.

Обычно подсистему Zaptel справедливо рассматривают как низкоуровневую часть open source проекта Asterisk. Однако кроме передачи голосовых и сигнализационных данных с интерфейсов цифровых и аналоговых телефонных линий связи в высокоуровневую часть Asterisk, zaptel предоставляет ряд возможностей,  позволяющих рассматривать его в качестве программного ядра сервера доступа к TDM каналам. С помощью Zaptel можно использовать таймслоты TDM потоков для передачи данных с инкапсуляцией в HDLC или PPP протоколы.

По мере развития проекта Asterisk появляется всё большее количество относительно недорогих устройств с интерфейсами E1, имеющих поддержку работы с zaptel. При использовании Zaptel, open source коллектора статистики типа ipcad и недорогой интерфейсной платы может быть создана система более дешёвая, чем устройства с аналогичными параметрами от известных брендов.

Подсистема Zaptel имеет модульную архитектуру. Ядро системы - модуль zaptel.ko, предоставляющий интерфейс для стыковки остальных модулей, отвечающих за взаимодействие с аппаратной частью.

Несколько слов об устройствах, которые можно использовать совместно с zaptel для создания access сервера. На данный момент существует два класса таких устройств. Наиболее распространены интерфейсные платы с одним или несколькими TDM портами, подключаемые к PCI шине, типичные представители - плата производства Digium TE410P или Quasar от Parabel. Другой класс - это внешнее оборудование, подключаемое к серверу по Ethernet, например: RedFone Communications foneBridge. Такие устройства являются конверторами TDM потока в Ethernet. Сервер и конвертор обмениваются Ethernet пакетами с данными, используя несложный протокол, реализующий концепцию TDMoE. В сетевом стеке сервера эти пакеты перехватываются модулем ztd-eth.ko и передаются для обработки модулю ztdynamic.ko, который в свою очередь стыкуется с zaptel.ko. В терминах Zaptel интерфейсы, подключенные через ztdynamic.ko, называются dynamic spans.

Постоянно дополняемый список zaptel совместимых устройств можно найти на странице http://voip-info.org/wiki/view/Asterisk+hardware.

Перейдём к практической части нашей статьи. Здесь нами будет показано, как сконфигурировать Zaptel для работы с интерфейсной платой и создать hdlc интерфейсы для передачи данных в заданных таймслотах. Автор использовал Debian Etch систему с ядром 2.6.15, восьмиканальную интерфейсную плату Quasar производства Parabel, svn\trunk версию zaptel.

Предпочтительно использовать свежую версии zaptel из svn, получаемую по команде:

svn checkout http://svn.digium.com/svn/zaptel/trunk zaptel

Для создания с помощью zaptel сетевых hdlc интерфейсов, необходимо перед компиляцией проекта найти и раскомментировать в файле zconfig.h строку:

#define CONFIG_ZAPATA_NET

После этого как обычно выполняются в каталоге с исходными текстами make и make install.

Далее собирается zaptel драйвер для интерфейсной платы. Драйвера для плат Digium находятся в директории с кодом проекта и собираются вместе с zaptel. Исходный код драйвера для платы Quasar скачивается с сайта проекта http://quasar.sourceforge.net, компилируется и устанавливается совместно с zaptel согласно инструкции.

 

Теперь загружаем драйвер.

modprobe qua-zap

 

При помощи команды lsmod убеждаемся, что также произошла загрузка модулей zaptel, hdlc, crc_ccitt и т.д.

 

Теперь приступаем к конфигурации.

 

Для конфигурации zaptel используется конфигурационный файл zaptel.conf, который по умолчанию находится в /etc директории. Предварительно необходимо создать или отредактировать этот файл. В данной статье нами не будут рассматриваться опции zaptel.conf, используемые для работы с голосовыми данными.

Прежде чем описывать синтаксис конфигурационного файла, дожна быть оговорена система нумерации TDM интерфейсов (spans) и таймслотов (zaptel channels), принятая в Zaptel.

TDM интерфейсы нумеруются последовательно с единицы. Если в системе присутствует несколько zaptel устройств, то интерфейсы устройства, зарегистрированного ранее, имеют номера меньшие, чем интерфейсы последующих, зарегистрированных для работы с zaptel устройств.

Zaptel channels нумеруются по правилу, аналогичному для spans, последовательно с единицы с возрастанием по мере увеличения номера интерфейса. Для иллюстрации правил нумерации рассмотрим систему, в которой установлены две интерфейсные платы Quasar c восьмью E1 каналами.

Таблица соответствия Канал zaptel/span - Номер Платы/Номер интерфейса/номер таймслота.

Номер zaptel канала.

Номер span.

Номер интерфейсной платы

Номер E1 интерфейса на плате.

Номер таймслота E1 интерфейса

1

1

1

1

1

31

1

1

1

31

32

2

1

2

1

:

:

:

:

:

248

8

1

8

31

249

9

2

1

1

:

:

:

:

:

496

16

2

8

31

 

Примечание: Доступ к нулевому таймслоту E1 не предусмотрен.

 

Синтаксис:

Строки, начинающиеся с #, игнорируются конфигуратором.

В первую очередь описываются параметры E1 интерфейсов:

span=<span num>,<timing>,<LBO>,<framing>,<coding> [, optional ]

span num - номер E1 канала в соответствии с соглашением;

timing - при передаче отличного от нуля значения в данном параметре, будет разрешено использовать сигналы с данного E1 интерфейса для синхронизации внутренней частоты платы. Для плат Digium чем меньше передаваемая цифра, тем выше приоритет источника синхронизации. Для используемой платы Quasar Parabel при разрешении синхронизироваться от нескольких E1 интерфейсов плата синхронизируется с интерфейсом, имеющим меньший номер. В случае неполадок на данном интерфейсе плата автоматически пересинхронизируется со следующим разрешённым интерфейсом, имеющим меньший номер.

LBO - line build out - это параметр, в платах Digium использующийся для указания параметров линии. Допустимые значения можно найти в файле zaptel.conf.sample. Для плат Parabel Quasar значения данного параметра игнорируются. E1 фреймеры автоматически определяют оптимальные параметры для передачи.

Framing - в случае E1 допустимые значения cas и ccs, при передаче параметра cas 16 таймслот данного E1 интерфейса будет использован как выделенный сигнальный канал, с помощью которого передаются значения четвёрки ABCD битов для каждого из оставшихся таймслотов. Чтобы использовать 16 таймслот для передачи данных, необходимо передать значение cсs

Coding - в случае E1 допустимые значения: ami, hdb3.

Optional - данный параметр является опциональным и может использоваться для включения CRC4 мультифрейма на данном E1 интерфейсе, для чего необходимо передать значение crc4.

Допустимые значения некоторых параметров таких, как framing, coding могут различаться для интерфейсных плат. Например, некоторые платы не поддерживают ami кодирование, чего нельзя оставить без внимания при выборе платы.

 

После того как E1 интерфейсы сконфигурированы, можно приступать к конфигурации таймслотов (таймслоты в терминах zaptel каналов):

 

<device> = <channel list>[:options]

channel list - список каналов, в списке могут использоваться символы "-", "," и ":".

Допустимые значения device:

nethdlc - объединить таймслоты перечисленные channel list в hdlc канал. В качестве параметра можно передать имя, которое получит данный сетевой интерфейс;

clear - объединить таймслоты, перечисленные в channel list в неструктурированный поток данных, данный режим может использоваться для передачи потока на обработку в PPP стек;

unused - таймслоты, перечисленные в channel list, не используются;

dacs - коммутация таймслотов, перечисленных в channel list до символа ":" в таймслоты начиная с первого после двоеточия.

Пример: dacs=1-20:45

В приведённом примере канал один будет коммутирован с каналом 45, канал 2 с 46 и т.д.

Данная функция может поддерживаться не всеми интерфейсными платами.

dacsrbs - коммутация таймслотов с учётом поканальной сигнализации.

 

Будем использовать zaptel.conf следующего содержания:

 

#Конфигурируем первый E1 интерфейс, разрешаем использовать сигнал с него для #синхронизатора платы, выключаем ccs мультифрейм, устанавливаем тип кодирования #сигнала hdb3, включаем проверку crc4.

span=1,1,0,ccs,hdb3,crc4

#Конфигурируем второй E1 интерфейс:

span=2,0,0,ccs,ami,crc4

#Переходим к назначению таймслотов:

#Cобираем в hdlc интерфейс pri-hdlc таймслоты первого E1 канала.

nethdlc=1-31:pri-hdlc

#Собираем в hdlc интерфейс sec-hdlc 1,2,5 таймслоты второго E1 интерфейса.

nethdlc=32,33,36:sec-hdlc

#Остальные тайслоты второго E1 интерфейса не используются, хотя можно это и не #указывать:

unused=34,35,37-62

 

Если все необходимые модули загружены, файлы устройств, необходимые для конфигурации Zaptel (располагаются в /dev/zap) созданы, файл zaptel.conf не содержит ошибок, то после выполнения команды

 

#ztcfg

 

система Zaptel должна успешно стартовать. Для того чтобы убедиться в этом выполняем несколько раз команду cat /proc/interrupts : плата должна генерировать тысячу прерываний в секунду. Плата Quasar в списке источников прерываний значится, как e1_N, где N порядковый номер платы в системе в соответствии с позицией на PCI шине.

 

Теперь выполняем команду

#ifconfig -a

После чего видим два новых hdlc интерфейса pri-hdlc, sec-hdlc.

Для настройки этих интерфейсов нужно использовать утилиту sethdlc.

Пример:

sethdlc pri-hdlc cisco

sethdlc sec-hdlc hdlc

ifconfig pri-hdlc 10.0.0.1 pointopoint 10.0.0.2

ifconfig sec-hdlc 10.0.0.3 pointopoint 10.0.0.4

ifconfig

В результате:

pri-hdlc  Link encap:(Cisco)-HDLC

          inet addr:10.0.0.1  P-t-P:10.0.0.2  Mask:255.255.255.255

          UP POINTOPOINT NOARP  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:60 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:50

          RX bytes:0 (0.0 b)  TX bytes:1440 (1.4 KiB)

 

sec-hdlc  Link encap:UNSPEC  HWaddr 00-00-FF-FF-FF-FF-00-00-00-00-00-00-00-00-00-00

          inet addr:10.0.0.3  P-t-P:10.0.0.4  Mask:255.255.255.255

          UP POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:50

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

 

Если устройства на другом конце линий сконфигурированы верно, то можно устанавливать соединение и тестировать линию связи.

 

Поговорим о проблемах, которые могут возникнуть:

 

ztcfg возвращает сообщения об ошибках.

 

Ещё раз проверяем содержимое zaptel.conf, убеждаемся в том, что отсутствуют синтаксические ошибки в конфигурации и что zaptel был скомпилирован с опцией CONFIG_ZAPATA_NET. Проверяем наличие специальных файлов устройств, необходимых для конфигурации Zaptel в директории /dev/zap.

 

После выполнения ztcfg компьютер завис.

Такое может случиться на машине с медленным процессором, поскольку при запуске нескольких E1 каналов в некоторых конфигурациях может потребоваться достаточно много ресурсов.

 

Связь установлена, однако линия нестабильна, счётчик ошибок на hdlc интерфейсе периодически инкрементируется.

 

Наличие ошибок может быть связано с потерей данных из-за задержек на PCI шине или из-за отключения какой-либо подсистемой ядра на относительно длительный период обработки прерываний.

Для минимизации задержек на PCI шине можно предпринять следующее:

Назначить интерфейсной плате выделенное прерывание на PCI шине с помощью, например, настроек BIOS, отключения неиспользуемых устройств и выбора PCI слота. Снизить загрузку PCI шины со стороны HDD устройств, например, разместить ОС на RAMDISK и отказаться от HDD.

На production сервере обязательно отключение системы Xfree.

 

Кроме того, такая ситуация может возникнуть из-за отсутствия синхронизации на E1 линии, следует проверить конфигурацию master-slave на E1.

 

На системе автора с двумя восьмиканальными E1 платами после отключения <X-ов> ошибки не наблюдались. Тестирование проводилось при интенсивном обмене данными на двух Ethernet интерфейсах.

[ опубликовано 05/09/2006 ]

Хелик Михаил (mixel.net{at}gmail.com) - Построение TDM access сервера на базе open-source технологий.   Версия для печати