2015年2月3日 星期二

kamailio 簡易 proxy

kamailio 執行時透過命令檔載入需要的模組、設定模組的參數、以及提供 SIP 封包的處理方式。SIP 封包處理語法類似 C 語言,使用 kamailio 核心內建及外掛模組的函數及變數。

下面是一個簡易的 stateless proxy,含免認證 REGISTRAR,可給 SIP 話機註冊後互撥,不用建立帳號。
#!KAMAILIO

# 載入模組
loadmodule "sl.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"

# 處理 SIP 請求,預設是丟棄
route {
    # REGISTER 則 save() 執行 SIP 註冊動作後結束。
    if (method=="REGISTER") {
        if (!save("location"))
            sl_reply_error();
        exit;
    }

    # 其它則 lookup() 查是否有註冊。
    if (!lookup("location")) {
        # 查詢失敗,回 404 等之後結束。
        switch ($rc) {
        case -1:
        # 查不到
        case -3:
        # 內部錯誤
            sl_send_reply("404", "Not Found");
            exit;
        case -2:
        # 有查到,但 Method 不支援
            sl_send_reply("405", "Method Not Allowed");
            exit;
        }
    }

    # 如有查到會置換 uri,呼叫內建函數 forward() 將封包轉送。
    forward();
}

# SIP 回應預設依 Via 轉送,所以不需要回應處理區塊。
載入的模組說明
  • sl:stateless replier,提供 sl_send_reply(code, reason) 及 sl_send_error() 等回覆 SIP status code 的函數。
    • sl_send_reply(code, reason):送 SIP 回覆
    • sl_send_error():依據錯誤碼送 SIP 回覆
    • sl_forward_reply([ code [, reason ] ]):轉送 SIP 回覆,可更改 code 或 reason
    • send_reply(code, reason):取決是否是在 tm 的 transaction 中而 stateful 或 stateless 送 SIP 回覆。
  • usrloc:提供 location database 給 registrar 等其它模組使用
  • registrar:使用 usrloc database 來提供 SIP 註冊功能,這裡用到下列兩個函數
    • save(domain[, flag[, uri]]):儲存註冊資料到 usrloc database,並回 200 OK
    • lookup(domain[, uri]):查詢 usrloc database 取代 uri
問題
  • 如果 INVITE 收到多個不同 To tag 的回應會怎樣?可以怎樣處理?
延伸閱讀

沒有留言:

張貼留言

SIP header Via

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