Поддержка SS7 (ОКС7) протокола в Астериск

Администратор,

Описание

На данный момент существуют следующие варианты подключения Астериск к сети с использованием ОКС7

  • LIBISUP. Замена LIBPRI от Cosini technologies, доступная по коммерческой лицензии Digium.
  • Использование внешнего SS7 конвертера для подключения Asterisk к ОКС7 сети.
  • (SMG & ss7box), коммерческий продукт от Sangoma.
  • chan_ss7. Open Source ss7 реализация от Sifira A/S.
  • libss7. "Родная" реализация SS7 для Asterisk как libpri.
    Итого, первые три способа требуют покупки оборудования/лицензий, а последние два являются открытыми и бесплатными.

После изучения libpri и chan_ss7 был сделан вывод о "сырости" первого и готовности второго к коммерческому использованию. Далее речь пойдет о chan_ss7.

Драйвер SS7 chan_ss7 от Sifira

Данный драйвер был разработан для внутреннего использования и был выложен в открытый доступ по лицензии GPL в надежде на дальнейшее развитие активными участниками сообщества.

Основные функциональные возможности

  • Compatible with Asterisk 1.2.x, 1.4.x and 1.6.x.
  • MTP2 (Q.703) implementation
  • MTP3 (Q.704) implementation (subset).
  • ISUP (Q.76x) implementation (mostly complete).
  • Supports Dahdi/Zaptel compatible digital interfaces, e.g. Redfone, Sangoma, Digium or Openvox
  • Facilities for protocol analysis using e.g. wireshark
  • Supports high call volumes
  • Supports multiple linksets with different OPCs and DPCs
  • Supports linksets with multiple links.
  • Supports load sharing and MTP changeover.
  • Supports multiple hosts (cluster) configuration with load sharing and failover.
  • Flexible Dial command syntax to allow routing to different linksets.

Требования

Общие

Для работы chan_ss7 треубется работающий сервер Астериск с E1 платой Digium TE134 и драйвером Dahdi. Драйвер протестирован с оборудованием Digium, asterisk 1.4.10 и chan_ss7-0.9. Лучше всего использовать ядро версии 2.6 в связи с улучшенным временем реакции (lower latency), что позволяет избегать недогрузок буферов ОКС7 линка (MTP2 протокол является протоколом реального времени). Однако возможно запускать решение и на более старом оборудовании путем увеличения значения NUM_ZAP_BUF в mtp.c.

Zaptel

chan_ss7 работает с сигнализацией напрямую, поэтому в zaptel.conf под b-каналы нужно отдавать все таймслоты. Пример zaptel.conf:

span=1,1,0,ccs,hdb3 - got this working! 
span=1,0,0,ccs,hdb3 
bchan=1-31 
span=2,0,0,ccs,hdb3 
bchan=32-62 

Обратите внимание на отсутствующие декларации dchan!

Ядро

Часто современные Linux дистрибутивы поставляются с активированными режимами вытесняющей многозадачности (preemption), предназанченными для desktop систем для улучшенной интерактивности. Ядро должно быть пересобрано со следующими настройками:

 Processor type and features ---> 
... Preemption Model (No Forced Preemption (Server)) ---> 
[ ] Preempt The Big Kernel Lock ... Timer frequency (100 HZ) ---> 

Конфигурационный файл chan_ss7

Конфигурационный файл для канала chan_ss7 называется ss7.conf и должен находится в папке с остальными конфигурационными файлами Астериск (обычно /etc/asterisk).

Конфигурационный файл содержит несколько секций.

  • linkset-имя - параметры набора линков (linkset).
  • link-имя - параметры линков.
  • host-имя - в данной секции определяются хосты (это позволяет иметь единый файл конфигурации для разных серверов, каждый будет использовать свои настройки).
  • cluster - определяет настройки кластера.

Секция Linkset

  • hunting_policy. Алгоритм выбора каналов для исходящих звонков. Желательно выбирать подходящий алгоритм с обих сторон ОКС7 линка для минимизации риска коллизий (когда обе стороны пытаются сделать исходящий звонок по тому же самому каналу одновременно). Возможные варинты:
  • odd_lru 
    - осуществлять исходящие звонки по нечетным CICs, по каждой группе выбирать последний использованный (odd least reacently used);
  • even_mru 
    - алгоритм по умолчанию. Использовать четные CICs и выбирать последний использованный в каждой группе (even least recently used);
  • seq_lth 
    - последовательный перебор CICs снизу вверх (sequential low-to-high);
  • seq_htl 
    - последовательный перебор CICs вверху внизу (sequential high-to-low).
  • enable_st. Использовать end-of-pulsing (ST) для определения полноты номера (завершенности).
  • use_connect. Отвечать на входящий звонок сообщением CON вместо ACM и ANM.
  • context. Название контекста для входящих звонков. По умолчанию default.
  • language. Язык астериск для входящих звонков из данного линксета. По умолчанию пустая строка

Пример конфигурационного файла ss7.conf для Digium TE207P

В данном примере используются следующие настройки ОКС7:

  • 2 потока E1 по карте Digium TE210P.
  • Сигнализация на первом таймслоте на обоих потоках.
  • firstcic=1
  • opc=1, dpc=5003 (decimal)
[linkset-siuc] 
enabled => yes 
enable_st => no 
use_connect => no 
hunting_policy => even_mru 
context => ss7-in 
language => en 
subservice => auto 
 
              
[link-l1] 
linkset => siuc 
channels => 2-31 
schannel => 1 
firstcic => 1 
enabled => yes 
 
              
[link-l2] 
linkset => siuc 
channels => 2-31 
schannel => 1 
firstcic => 33 
enabled => yes 
 
              
[host-ivr] 
enabled => yes 
if-1 => 192.168.0.2 
opc => 1 
dpc => siuc:5003 
links => l1:1,l2:2 

Часто задаваемые вопросы

Может ли один Asterisk сервер поддерживать несколько ОКС7 линков, т.е. иметь несколько OPC?
Нет, в текущей реализации chan_ss7 не может. В настройках ss7.conf возможно указать только один OPC. Таким образом, даже если у вас 4-х портовая карта и провайдер может подать на нее два логических ОКС7 линка, это невозможно.

Возможно ли иметь только один сигнальный таймслот на несколько потоков?
Да, возможно. Для этого не надо указывать значения для schannel. Например:

[link-l1] 
linkset => A 
channels => 2-31 
schannel => 1 
firstcic => 1 
enabled => yes 
 
              
[link-l2] 
linkset => A 
channels => 1-31 
schannel => 
firstcic => 33 
enabled => yes 

В вышепреведенном примере 2 E1 потока, на первом потоке сигнализация на первом канале, на втором потоке сигнализации нет, все таймслоты (31) отданы под голосовые каналы.

Можно ли подключить один Asterisk сервер к нескольким ОКС7 логическим линкам?
Да, можно. chan_ss7 допускает конфигурирование нескольких DPC. В приведенном ниже конфигурационном файле используется 4-х портовая карта Digium TE405P, и потоки сгруппированы по два на каждый SS7 линк (станция HUAWEI на другой стороне не умеет использовать 16 таймслот для голосового канала, по словам специалиста со станции...)

[linkset-A] 
enabled => yes 
enable_st => no 
use_connect => no 
hunting_policy => even_mru 
subservice => auto 
language => en 
context => default 
 
              
[linkset-B] 
enabled => yes 
enable_st => no 
use_connect => no 
hunting_policy => even_mru 
subservice => auto 
language => en 
context => default 
 
              
[link-l1] 
linkset => A 
channels => 1-15,17-31 
schannel => 16 
firstcic => 1 
enabled => yes 
 
              
[link-l2] 
linkset => A 
channels => 1-15,17-31 
schannel => 
firstcic => 33
enabled => yes 
[link-l3] 
linkset => B 
channels => 1-15,17-31 
schannel => 16 
firstcic => 1 
enabled => yes 
 
              
[link-l4] 
linkset => B 
channels => 1-15,17-31 
schannel => 
firstcic => 33 
enabled => yes 
[host-ivr] 
enabled => yes 
opc => 1 
default_linkset => A 
dpc => A:1037,B:1038 
links => l1:1,l2:2,l3:3,l4:4 

В диалплане Asterisk выбор линка для исходящего звонка осуществляется при помощи названия линксета, например Dial(SS7/A/${EXTEN}).

Можно ли строить отказоустойчивые SS7 системы на базе chan_ss7?
Можно. Для этих целей chan_ss7 поддерживает режим cluster, в котором два сервера делять один логический ОКС7 линк. Оба сервера работают под единым OPC, разделяемым между ними, и с одним сигнальным линком, подключенным к одному из серверов. Сервера между собой соеденены по локальной сети. Схема подключения такая:

Astreisk_1 \--> SS7 Signalining \--> Telco ; 
Astreisk_2--/ \---> Bearer Channel \--> Telco 

Ниже представлены конфигурационные файлы серверов.

Asterisk_1 =========== 
*CLI> ss7 cluster status receiver Asterisk_1 if 1, addr 192.168.10.17, 
c:connected, p:, last try 154 msec, 23 fails, 0 forwards 
*CLI> Asterisk_2 =========== 
*CLI> ss7 cluster status receiver Asterisk_2 if 1, addr 192.168.10.16, 
c:connected, p:, last try 399 msec, 0 fails, 0 forwards 
*CLI> Here is below my config file for both the box ... 
Asterisk_1 [IP:192.168.10.16] 
======================= 
[linkset-siuc] enabled => yes enable_st => 
no use_connect => yes hunting_policy => even_mru subservice => 
auto [link-l1] linkset => siuc channels => 1-15,17-31 schannel => 
16 firstcic => 1 enabled => yes [host-Asterisk_1] enabled => yes default_linkset => 
siuc opc => 0x2 dpc => siuc:0x1 if-1 => 192.168.10.17 links => 
l1:1 [cluster] port => 5040 l1 => Asterisk_2#if-1 Asterisk_2 [IP:192.168.10.17] 
====================== 
[linkset-siuc] enabled => yes enable_st => no use_connect => no hunting_policy => 
even_mru subservice => auto [link-l2] linkset => siuc channels => 1-31 schannel => 
firstcic => 32 enabled => yes [host-Asterisk_2] enabled => yes default_linkset => 
siuc opc => 0x2 dpc => siuc:0x1 if-1 => 192.168.10.16 links => 
l2:1 [cluster] port => 5040 l2 => Asterisk_1#if-1 

Проблемы

Excessive poll delay

[Sep 19 22:30:49] NOTICE[25524] mtp.c: 
Excessive poll delay 5985! [Sep 19 22:40:49] NOTICE[25524] mtp.c: 
Excessive poll delay 5355! 

Это мистическая проблема, которую пытаются отловить наверняка. Один из авторов chan_ss7 Anders Baekgaard (ab at sifira.dk) попросил высылать ему письмо с темой "chan_ss7 statistics". Anders попросил каждого, независимо от его опыта, помочь решить данную проблему и выслать ему содержимое команд:

uname -a /sbin/lspci 
cat /proc/cpuinfo 
cat /proc/meminfo 
cat /proc/interrupts 
grep "Excessive poll delay" /var/log/asterisk/messages | tail -10 

Write buffer full on CIC=4 (wrote only 0 of 160), audio lost.

[19 18:41:08|Sep] NOTICE[10930] l4isup.c: Write buffer full on CIC=4 
(wrote only 0 of 160), audio lost. 
[19 18:41:08|Sep] NOTICE[10930] l4isup.c: 
Write buffer full on CIC=4 (wrote only 0 of 160), audio lost. [19 18:41:08|Sep] 
NOTICE[10930] l4isup.c: Write buffer full on CIC=4 (wrote only 0 of 160), audio lost.