【opensips学习笔记】【三】变量生命周期
2021-02-20 本文已影响0人
安安爸Chris
下面通过一个具体的例子来看一下Opensips 脚本中各个变量的生命周期是怎么样的
组网和信令设计

我们通过例子来观察在5个route阶段中,以下各个变量值的生命周期
- flag
- bflag
- var
- avp
注意:通过设置onreply_avp_mode值,可以改变var和vap的情况。
####### Global Parameters #########
log_level=3
log_stderror=no
log_facility=LOG_LOCAL0
children=4
/* comment the next line to enable the auto discovery of local aliases
based on reverse DNS on IPs */
auto_aliases=no
listen=udp:172.16.98.174:5080 # CUSTOMIZE ME
####### Modules Section ########
#set module path
mpath="/usr/local/lib64/opensips/modules/"
#### SIGNALING module
loadmodule "signaling.so"
#### StateLess module
loadmodule "sl.so"
#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timeout", 5)
modparam("tm", "fr_inv_timeout", 30)
modparam("tm", "restart_fr_on_each_reply", 0)
# NOTICE HERE!!!
#modparam("tm", "onreply_avp_mode", 1)
#### Record Route Module
loadmodule "rr.so"
/* do not append from tag to the RR (no need for this script) */
modparam("rr", "append_fromtag", 0)
#### MAX ForWarD module
loadmodule "maxfwd.so"
#### SIP MSG OPerationS module
loadmodule "sipmsgops.so"
#### FIFO Management Interface
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("mi_fifo", "fifo_mode", 0666)
#### URI module
loadmodule "uri.so"
modparam("uri", "use_uri_table", 0)
#### USeR LOCation module
loadmodule "usrloc.so"
modparam("usrloc", "nat_bflag", "NAT")
modparam("usrloc", "working_mode_preset", "single-instance-no-db")
#### ACCounting module
loadmodule "acc.so"
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_cancels", 0)
/* by default we do not adjust the direct of the sequential requests.
if you enable this parameter, be sure to enable "append_fromtag"
in "rr" module */
modparam("acc", "detect_direction", 0)
loadmodule "proto_udp.so"
####### Routing Logic ########
# main request routing logic
route{
xlog("L_INFO", "[TEST] [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
if (isflagset(FLAG)) {
xlog("L_INFO", "[TEST] FLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
if (isbflagset(BFLAG)) {
xlog("L_INFO", "[TEST] BFLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
if (!mf_process_maxfwd_header("10")) {
send_reply("483","Too Many Hops");
exit;
}
if (has_totag()) {
xlog("L_INFO", "[TEST] has to tag [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
if (isflagset(FLAG)) {
xlog("L_INFO", "[TEST] FLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
if (isbflagset(BFLAG)) {
xlog("L_INFO", "[TEST] BFLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
xlog("L_INFO", "[TEST] avp(a) = $avp(a)\n");
xlog("L_INFO", "[TEST] var(b) = $var(b)\n");
# handle hop-by-hop ACK (no routing required)
if ( is_method("ACK") && t_check_trans() ) {
t_relay();
exit;
}
# sequential request within a dialog should
# take the path determined by record-routing
if ( !loose_route() ) {
# we do record-routing for all our traffic, so we should not
# receive any sequential requests without Route hdr.
send_reply("404","Not here");
exit;
}
if (is_method("BYE")) {
# do accounting even if the transaction fails
do_accounting("log","failed");
}
# route it out to whatever destination was set by loose_route()
# in $du (destination URI).
route(relay);
exit;
}
# CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans())
t_relay();
exit;
}
# absorb retransmissions, but do not create transaction
t_check_trans();
# record routing
if (!is_method("REGISTER|MESSAGE"))
record_route();
# account only INVITEs
if (is_method("INVITE")) {
do_accounting("log");
xlog("L_INFO", "[TEST] set flag [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
setflag(FLAG);
setbflag(BFLAG);
$avp(a) = "a";
$var(b) = "b";
}
if (is_method("PUBLISH|SUBSCRIBE|REGISTER|MESSAGE|OPTIONS")) {
send_reply("503", "Service Unavailable");
exit;
}
# when routing via usrloc, log the missed calls also
do_accounting("log","missed");
#xlog("L_INFO", "[TEST] do route relay [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
$rp = "5060";
route(relay);
}
route[relay] {
xlog("L_INFO", "[TEST] route relay [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru][request ru:$<request>ru] [si:$si][Contact:$hdr(Contact)][request Contact:$<request>hdr(Contact)]\n");
# for INVITEs enable some additional helper routes
if (is_method("INVITE")) {
t_on_branch("per_branch_ops");
t_on_reply("handle_nat");
t_on_failure("missed_call");
}
if (!t_relay()) {
send_reply("500","Internal Error");
}
exit;
}
branch_route[per_branch_ops] {
xlog("L_INFO", "[TEST] new branch at $ru [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
if (isflagset(FLAG)) {
xlog("L_INFO", "[TEST] FLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
if (isbflagset(BFLAG)) {
xlog("L_INFO", "[TEST] BFLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
xlog("L_INFO", "[TEST] avp(a) = $avp(a)\n");
xlog("L_INFO", "[TEST] var(b) = $var(b)\n");
}
onreply_route[handle_nat] {
xlog("L_INFO", "[TEST] incoming reply [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
if (isflagset(FLAG)) {
xlog("L_INFO", "[TEST] FLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
if (isbflagset(BFLAG)) {
xlog("L_INFO", "[TEST] BFLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
xlog("L_INFO", "[TEST] avp(a) = $avp(a)\n");
xlog("L_INFO", "[TEST] var(b) = $var(b)\n");
}
failure_route[missed_call] {
if (t_was_cancelled()) {
exit;
}
xlog("L_INFO", "[TEST] failure route [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
if (isflagset(FLAG)) {
xlog("L_INFO", "[TEST] FLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru] [si:$si]\n");
}
if (isbflagset(BFLAG)) {
xlog("L_INFO", "[TEST] BFLAG IS SET [rm:$rm] [fu:$fu] [ou:$ou] [ru:$ru][request ru:$<request>ru] [si:$si]\n");
}
xlog("L_INFO", "[TEST] avp(a) = $avp(a)\n");
xlog("L_INFO", "[TEST] var(b) = $var(b)\n");
}
onreply_avp_mode = 0
结果如下
Feb 19 05:24:55 [20206] [TEST] [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:24:55 [20206] [TEST] set flag [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:24:55 [20206] [TEST] route relay [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060][request ru:<null>] [si:172.16.98.33][Contact:sip:sipp@192.168.2.252:5060][request Contact:<null>]
Feb 19 05:24:55 [20206] [TEST] new branch at sip:chris@172.16.98.174:5060 [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:24:55 [20206] [TEST] FLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:24:55 [20206] [TEST] BFLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:24:55 [20206] [TEST] avp(a) = a
Feb 19 05:24:55 [20206] [TEST] var(b) = b
Feb 19 05:24:55 [20207] [TEST] incoming reply [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:<null>] [ru:<null>] [si:172.16.98.174]
Feb 19 05:24:55 [20207] [TEST] FLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:<null>] [ru:<null>] [si:172.16.98.174]
Feb 19 05:24:55 [20207] [TEST] BFLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:<null>] [ru:<null>] [si:172.16.98.174]
Feb 19 05:24:55 [20207] [TEST] avp(a) = <null>
Feb 19 05:24:55 [20207] [TEST] var(b) = <null>
Feb 19 05:24:55 [20207] [TEST] failure route [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:24:55 [20207] [TEST] FLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:24:55 [20207] [TEST] BFLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060][request ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:24:55 [20207] [TEST] avp(a) = a
Feb 19 05:24:55 [20207] [TEST] var(b) = <null>
Feb 19 05:24:55 [20207] [TEST] [rm:ACK] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:24:55 [20207] [TEST] has to tag [rm:ACK] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:24:55 [20207] [TEST] avp(a) = <null>
Feb 19 05:24:55 [20207] [TEST] var(b) = <null>
结论如下
type | request route | branch route | reply route | failure route | new transaction |
---|---|---|---|---|---|
flag | INIT | Y | Y | Y | N |
bflag | INIT | Y | Y | Y | N |
var | INIT | Y | N |
N |
N |
avp | INIT | Y | N |
Y | N |
onreply_avp_mode = 1
结果如下
Feb 19 05:37:59 [20269] [TEST] [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] set flag [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] route relay [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060][request ru:<null>] [si:172.16.98.33][Contact:sip:sipp@192.168.2.252:5060][request Contact:<null>]
Feb 19 05:37:59 [20269] [TEST] new branch at sip:chris@172.16.98.174:5060 [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] FLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] BFLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] avp(a) = a
Feb 19 05:37:59 [20269] [TEST] var(b) = b
Feb 19 05:37:59 [20266] [TEST] incoming reply [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:<null>] [ru:<null>] [si:172.16.98.174]
Feb 19 05:37:59 [20266] [TEST] FLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:<null>] [ru:<null>] [si:172.16.98.174]
Feb 19 05:37:59 [20266] [TEST] BFLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:<null>] [ru:<null>] [si:172.16.98.174]
Feb 19 05:37:59 [20266] [TEST] avp(a) = a
Feb 19 05:37:59 [20266] [TEST] var(b) = <null>
Feb 19 05:37:59 [20266] [TEST] failure route [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:37:59 [20266] [TEST] FLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:37:59 [20266] [TEST] BFLAG IS SET [rm:INVITE] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5060][request ru:sip:chris@172.16.98.174:5060] [si:172.16.98.33]
Feb 19 05:37:59 [20266] [TEST] avp(a) = a
Feb 19 05:37:59 [20266] [TEST] var(b) = <null>
Feb 19 05:37:59 [20269] [TEST] [rm:ACK] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] has to tag [rm:ACK] [fu:sip:sipp@192.168.2.252:5060] [ou:sip:chris@172.16.98.174:5080] [ru:sip:chris@172.16.98.174:5080] [si:172.16.98.33]
Feb 19 05:37:59 [20269] [TEST] avp(a) = <null>
Feb 19 05:37:59 [20269] [TEST] var(b) = b
结论如下
type | request route | branch route | reply route | failure route | new transaction |
---|---|---|---|---|---|
flag | INIT | Y | Y | Y | N |
bflag | INIT | Y | Y | Y | N |
var | INIT | Y | N |
N |
Y |
avp | INIT | Y | Y | Y | N |