不適用 PRI_SWITCH_GR303_TMC、SIG_BRI_PTMP
Asterisk 作法:每輪依序找一個非使用中的 B channel 送 Q.931 RESTART,收到 ACK 後再找下一個送。找不到下一個時,則結束這一輪,停止一段時間,再重頭進行下一輪。如果送 Q.931 RESTART 一直沒收到 ACK,例如有些沒實作,則以收到此 channel 的 Q.931 SETUP 來當作完成。
另外有一種情況也可以送 RESTART:要 Q.931 SETUP 建立通話,但收到原因是 PRI_CAUSE_REQUESTED_CHAN_UNAVAIL 的掛斷 (可能是 Q.931 RELEASE 等)。會發生的一個可能是建立呼叫時,對方用戶端剛好也提出偏好此 channel 來建立呼叫,雖然最用後哪個 channel 還要局端確認,但對方還不知道而先回 channel unavail。
相關變數
- resetinterval:上輪 RESTART 完成後經過多久開始下一輪。預設 = -1 = 不進行,至少 60 秒以上。
- lastreset:上輪 RESTART 完成的時間。
- span's resetting:span 是否目前正在進行一輪 RESTART。
- resetpos:這一輪 RESTART 進行到哪個 channel。
- channel's resetting:channel 的 RESTART 狀態。進行 RESTART 也算在使用中。狀態有
- SIG_PRI_RESET_IDLE:非進行 RESTART 中。
- SIG_PRI_RESET_ACTIVE:進行 RESTART 中,等候 Q.931 RESTART ACK
- SIG_PRI_RESET_NO_ACK:進行 RESTART 中,沒等到 Q.931 RESTART ACK,卻收到 Q.931 SETUP。在此狀態再次收到 Q.931 SETUP 表示RESTART 完成,找下個非使用中的 B channel 進行 RESTART。
D channel 處理的無限迴圈:
- span 在 resetting 狀態且有 D channel 起來:如果還沒開始 RESTART,執行 pri_check_restart()。
- span 不在 resetting 狀態且離 lastreset 有 resetinterval 時間,進入 resetting 狀態
- PRI_EVENT_RESTART:進行砍 call
- PRI_EVENT_RESTART_ACK:
- 收到 Q.931 SETUP
- hangup PRI_CAUSE_REQUESTED_CHAN_UNAVAIL
- D channel 起來的時候,設為 5 秒後進入 resetting 狀態