openSIPSに少なくとも必要なモジュール

前回はopenSIPSのパッケージを一つだけインストールしたと書いたのですが、configのサンプルのパッケージをインストールしようとしたらいろいろと依存関係があったので、それらもインストールしてみました。

で、configファイル/etc/opensips/opensips.cfgを開いてみました。
loadmoduleでmoduleの読み込みをしているのですが、一体何を読み込んでいるのかなー?と思ったので、調べてみました。
grep loadmodule /etc/opensips/opensips.cfgした結果です。

#loadmodule "db_mysql.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri_db.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"
#loadmodule "auth.so"
#loadmodule "auth_db.so"
#loadmodule "alias_db.so"
#loadmodule "domain.so"
#loadmodule "presence.so"
#loadmodule "presence_xml.so"

#で始まる行はコメントですね。言わずもがな。

signaling.so

公式ドキュメントより。

The SIGNALING module comes as a wrapper over tm and sl modules and offers one function to be called by the modules that want to send a reply.

SIGNALINGモジュールはtmとslモジュールのラッパー。replyを送信したいモジュールから呼び出される機能を一つ提供している。

何を言っているのかいまいちピンときませんが、調べることは3つ?
tmモジュール、slモジュールが何者か?提供される一つの機能とは?

ドキュメントには確かに機能(function)は一つでした。
send_reply(code, reason)
あぁ、なるほど。
send_reply("404", "Not Found");
などのように使うみたいです。

モジュールについては次とその次に出てきます。

sl.so

slというのはStatelessのことだそうです。
状態を持たないやり取り、つまり、質問に答えてハイおしまい、な会話ですね。

function名にはsl_がくっついていました。

tm.so

slに対してこちらはTransaction moduleのことだそうで、SIPのやり取りの情報をある程度覚えて、そのやり取りが完結するまで忘れないという性質のやつですね。

function名にはt_がくっつくようです。

rr.so

RRとはRecord-Routingのことらしいです。
SIPヘッダにRecord-Routeフィールドを設けることでUA同士がやり取りするSIPメッセージがすべてProxy経由になります。
Call statefullなProxyには必須になりますね。

maxfwd.so

こちらはSIPのMax-Forwardsフィールドのことですね。
Loopの検出に必要です。値としては70が良いようです。
もしも、目的地に到着する前にMax-Forwardsの値が0になったら"483 Too Many Hops"を返す決まりになっています。

ちなみに、RFC3261にはTo, From, CSeq, Call-ID, Max-Forwards, Viaフィールドが必須だと書かれています。

usrloc.so

User Locationの中心となるモジュールのようです。公式ドキュメントには「user location tableを保持し、他のモジュールからテーブルにアクセスする手段を提供する。scriptから直接アクセスするためのfunctionは提供されない。」とあります。
つまり、私にできるのは、moduleを読み込むときにパラメータを与えてあげるくらいということですね。

registrar.so

REGISTRARに関するモジュールなのは見たまんまですね。
PathヘッダフィールドとGRUUのことが書かれていました。
PathフィールドはUAに隣接していないREGISTRARにREGISTERするときに使うもので(私は実は詳しくないのですが)Record-Routeのように経由するProxyを(Proxy自身が)次々と記録していって、登録するもののようです。読み出されるときにはRouteヘッダフィールドに名を連ねる、という解釈でよいのでしょうか。

GRUUはGlobally Routable User Agent (UA) URIsの略だと書いてありました(RFC5627)が、なんのことやらさっぱりわかりません。
一意のURIを生成するのでしょうか?UUIDとかがちらっと見えた気がします。

textops.so

これは文字列処理に特化したモジュールのようです。SIPがテキストベースのプロトコルである以上、文字列処理は必須ですよね。

mi_fifo.so

FIFO経由でManagement Interfaceへアクセスするモジュールだそうです。

uri.so, uri_db.so

SIP URIに対していろいろなチェックができるそうです。
URI_DBはURIに統合されたようです。

xlog.so

COREモジュールに統合されたようですが、logに書き出す機能を提供してくれてます。

acc.so

Accounting、つまり利用事実の記録を行うためのモジュールでsyslogやRDBMSなどに記録を行えるようです。

ひとまずは

デフォルトで有効になっていたモジュールだけをざっと調べてみましたが、とりあえずこれだけあれば何とかなりそうですし、これらは最低限必要だと思います。

次回は擬似変数とかについて調べてみようと思います。