
私は Digium T1 カードを搭載した Asterisk 1.8 電話スイッチを持っています。現在の電話プロバイダーを通じて 5ESS PRI を使用して問題なく動作しています。しかし、Time Warner の光ファイバー サービス (TWTelecom ではありません) への切り替えを検討していますが、ISDN プロトコル エラーで失敗します。
彼らのサービスは基本的に VOIP であり、Asterisk で問題なく動作するにもかかわらず、直接触れることはできません。試してみたので、わかっています。代わりに、Cisco 2430 ルーターを使用して公開されており、サポートされている唯一のオプションは、何らかの T1 インターフェイスを提供することです。したがって、PRI が最も賢明なオプションです。既存の電話プロバイダーの T1 境界ポイントから Cisco ルーターにプラグを転送するとすぐに、発信も着信も通話ができなくなります。
集中的な pri デバッグを有効にすると、着信コールでも発信コールでも、libpri が送信する最初のパケットで問題が発生していることがわかります。着信コールの例 (最初の 3 つのパケット) を次に示します。Cisco ルータは、libpri が送信しているものに対してエラーを出力します。問題は、何が原因で、どのように修正するかです。
Cisco ルータはファームウェアを実行しますc2430-ik9o3s-mz.124-15.T9.bin
。これはどうやら TWC の企業標準であり、変更することはできません。
< TEI: 0 State 7(Multi-frame established)
< V(A)=2, V(S)=2, V(R)=2
< K=7, RC=0, l3_initiated=0, reject_except=0, ack_pend=0
< T200_id=0, N200=3, T203_id=8192
< [ 02 01 04 04 08 02 00 91 05 .... ]
< 59 bytes of data
< Protocol Discriminator: Q.931 (8) len=59
< TEI=0 Call Ref: len= 2 (reference 145/0x91) (Sent from originator)
< Message Type: SETUP (5)
< [04 03 80 90 a2]
< Bearer Capability (len= 5) [ Ext: 1 Coding-Std: 0 Info transfer capability: Speech (0)
< Ext: 1 Trans mode/rate: 64kbps, circuit-mode (16)
< User information layer 1: u-Law (34)
< [18 03 a9 83 81]
< Channel ID (len= 5) [ Ext: 1 IntID: Implicit Other(PRI) Spare: 0 Exclusive Dchan: 0
< ChanSel: As indicated in following octets
< Ext: 1 Coding: 0 Number Specified Channel Type: 3
< Ext: 1 Channel: 1 Type: CPE]
< [28 0f ...]
< Display (len=15) [ ... ]
< [6c 0c 21 80 ...]
< Calling Party Number (len=14) [ Ext: 0 TON: National Number (2) NPI: ISDN/Telephony Numbering Plan (E.164/E.163) (1)
< Presentation: Presentation allowed, User-provided, not screened (0) '...' ]
< [70 0b a1 ...]
< Called Party Number (len=13) [ Ext: 1 TON: National Number (2) NPI: ISDN/Telephony Numbering Plan (E.164/E.163) (1) '...' ]
> DL-DATA request
> Protocol Discriminator: Q.931 (8) len=11
> TEI=0 Call Ref: len= 2 (reference 145/0x91) (Sent to originator)
> Message Type: CALL PROCEEDING (2)
TEI=0 Transmitting N(S)=2, window is open V(A)=2 K=7
> TEI: 0 State 7(Multi-frame established)
> V(A)=2, V(S)=2, V(R)=3
> K=7, RC=0, l3_initiated=0, reject_except=0, ack_pend=0
> T200_id=0, N200=3, T203_id=8192
> [ 00 01 04 06 08 02 80 91 02 18 04 e9 81 83 81 ]
> Informational frame:
> SAPI: 00 C/R: 0 EA: 0
> TEI: 000 EA: 1
> N(S): 002 0: 0
> N(R): 003 P: 0
> 11 bytes of data
> Protocol Discriminator: Q.931 (8) len=11
> TEI=0 Call Ref: len= 2 (reference 145/0x91) (Sent to originator)
> Message Type: CALL PROCEEDING (2)
> [18 04 e9 81 83 81]
> Channel ID (len= 6) [ Ext: 1 IntID: Explicit Other(PRI) Spare: 0 Exclusive Dchan: 0
> ChanSel: As indicated in following octets
> Ext: 1 DS1 Identifier: 1
> Ext: 1 Coding: 0 Number Specified Channel Type: 3
> Ext: 1 Channel: 1 Type: CPE]
< TEI: 0 State 7(Multi-frame established)
< V(A)=3, V(S)=4, V(R)=3
< K=7, RC=0, l3_initiated=0, reject_except=0, ack_pend=0
< T200_id=8192, N200=3, T203_id=0
< [ 02 01 06 06 08 02 00 91 7d 08 03 80 e4 18 14 01 01 ]
< Informational frame:
< SAPI: 00 C/R: 1 EA: 0
< TEI: 000 EA: 1
< N(S): 003 0: 0
< N(R): 003 P: 0
< 13 bytes of data
< Protocol Discriminator: Q.931 (8) len=13
< TEI=0 Call Ref: len= 2 (reference 145/0x91) (Sent from originator)
< Message Type: STATUS (125)
< [08 03 80 e4 18]
< Cause (len= 5) [ Ext: 1 Coding: CCITT (ITU) standard (0) Spare: 0 Location: User (0)
< Ext: 1 Cause: Invalid information element contents (100), class = Protocol Error (e.g. unknown message) (6) ]
< Cause data 1: 18 (24)
< [14 01 01]
< Call State (len= 3) [ Ext: 0 Coding: CCITT (ITU) standard (0) Call state: Call Initiated (1)
答え1
原因データ?原因データ!
libpriは原因情報要素(IE)の原因データが何を意味するかを示すのにあまり賢明ではありません。実際、1.4.13の時点では、100のケースのうち2つのケースしか処理しません。850問! ありがたいことに、これは単なるランダムな独自の診断データではありません。
参照Q.850 原因と場所の使い方表1では、原因100にどのような診断が存在するかを確認する必要があります。情報要素の内容が無効ですなんと、それは情報要素識別子! つまり、libpri によって送信された Call Proceeding メッセージの IE 0x18 (24) に問題がありました。偶然にも、IE 0x18 はチャネル ID 要素です。したがって、少なくとも、その特定の要素に問題があることはわかっています。参考までに、Cisco から受け取った原因 IE を以下に示します。
< [08 03 80 e4 18]
< Cause (len= 5) [ Ext: 1 Coding: CCITT (ITU) standard (0) Spare: 0 Location: User (0)
< Ext: 1 Cause: Invalid information element contents (100), class = Protocol Error (e.g. unknown message) (6) ]
< Cause data 1: 18 (24)
チャネル識別 IE - 識別するかどうか
IEに絞り込んだので、931問、4.5.13 チャネル識別 [IE] では、ここでの場合のように、ユーザー機器がネットワーク (ここでは Cisco ルータ) によって明示的に要求された唯一のチャネルのみを使用する場合、コール セットアップに応答するときに要素全体がオプションであることに注意してください。
q931_call_proceeding
残念なことに、libpriのコール進行メッセージを送信するための内部APIは、q931.c、完全なチャネル ID IE を送信しないことは実際には簡単ではありません。実際、libpri はstruct q931_call
最後に受信したチャネル ID を明示的に保持しないため、チャネル ID IE を送信することが適切かどうかを判断する方法がありません。実際、これはエラーでありcall_proceeding_ies[]
、Q931_CHANNEL_IDENT
コール プロシージャ メッセージには必ずしもこの IE が必要というわけではありません。
したがって、1 つの修正方法は、単にチャネル ID を送信しないことです。
しかし、は内部の問題?
残念ながら、さらに深く掘り下げて、IE が Cisco のファームウェアを混乱させたチャネル ID の何が原因かを調べてみる必要があるかもしれません。
Cisco から受信したチャネル ID IE と、返信されたチャネル ID IE を比較してみましょう。
< [18 03 a9 83 81]
< Channel ID (len= 5) [ Ext: 1 IntID: Implicit Other(PRI) Spare: 0 Exclusive Dchan: 0
< ChanSel: As indicated in following octets
< Ext: 1 Coding: 0 Number Specified Channel Type: 3
< Ext: 1 Channel: 1 Type: CPE]
> [18 04 e9 81 83 81]
> Channel ID (len= 6) [ Ext: 1 IntID: Explicit Other(PRI) Spare: 0 Exclusive Dchan: 0
> ChanSel: As indicated in following octets
> Ext: 1 DS1 Identifier: 1
> Ext: 1 Coding: 0 Number Specified Channel Type: 3
> Ext: 1 Channel: 1 Type: CPE]
違いは明らかです。libpri は、まったく不要な DS1 識別子オクテットで応答します。DS1 識別子は、複数のリンクを使用するシステムで使用される特定の PRI スパンの識別子です。libpri と Cisco ルータの間には T1 スパンは 1 つしかないため、ここではまったく必要ありません。
これは Cisco ファームウェアのバグのようです。DS1 識別子を受け入れない理由はありません。これはオプションですが、標準では許可されています。もちろん、DS1 識別子が何らかの理由で間違っている場合を除きます。その点については調査していません。
libpri を機能させるために必要なハックは、 の 1 行のコードですtransmit_channel_id
。必要なのは、DS1 識別子であるオクテット 3.1 の送信を抑制することだけです。このパッチはそれを実行します。
--- libpri-1.4.14/q931.c.org 2013-04-16 15:22:24.910001979 -0400
+++ libpri-1.4.14/q931.c 2013-04-16 15:22:49.454001959 -0400
@@ -1441,7 +1441,7 @@
return 0;
}
- if (!ctrl->bri && (((ctrl->switchtype != PRI_SWITCH_QSIG) && (call->ds1no > 0)) || call->ds1explicit)) {
+ if (0 && !ctrl->bri && (((ctrl->switchtype != PRI_SWITCH_QSIG) && (call->ds1no > 0)) || call->ds1explicit)) {
/* We are specifying the interface. Octet 3.1 */
ie->data[pos++] |= 0x40;
ie->data[pos++] = 0x80 | call->ds1no;
なお、これは決して libpri に組み込むことを目的とした恒久的な修正ではなく、適切に修正するには libpri に広範囲にわたる調整が必要となる一時的なハックにすぎないことを付け加えておきます。