2017年9月15日 星期五

Asterisk PRI RESTART

使用 Q.931 RESTART 重新開始非使用中的 B channel (例如砍 call)
不適用 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。
pri_check_restart():找下個非使用中的 B channel 進行 RESTART。channel 狀態設為 SIG_PRI_RESET_ACTIVE 並透過 pri_reset() 送 Q.931 RESTART。如果找不到下個未使用的 B channel 可進行 RESTART,結束 resetting = 0 span resetting 狀態並紀錄目前時間到 lastreset。

D channel 處理的無限迴圈:
  1. span 在 resetting 狀態且有 D channel 起來:如果還沒開始 RESTART,執行 pri_check_restart()。
  2. span 不在 resetting 狀態且離 lastreset 有 resetinterval 時間,進入 resetting 狀態
  3. PRI_EVENT_RESTART:進行砍 call
  4. PRI_EVENT_RESTART_ACK:
  5. 收到 Q.931 SETUP
  6. hangup PRI_CAUSE_REQUESTED_CHAN_UNAVAIL
  7. D channel 起來的時候,設為 5 秒後進入 resetting 狀態

2017年9月14日 星期四

Ubuntu 16.04 更新到 17.04 Ethernet 不通

sudo touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
sudo service network-manager restart

參考
  1. 依據 https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1638842 #7,目的是覆蓋 /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
  2. nmcli d

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...