【opensips学习笔记】【三】变量生命周期

2021-02-20  本文已影响0人  安安爸Chris

下面通过一个具体的例子来看一下Opensips 脚本中各个变量的生命周期是怎么样的

组网和信令设计

信令图

我们通过例子来观察在5个route阶段中,以下各个变量值的生命周期

注意:通过设置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
上一篇 下一篇

猜你喜欢

热点阅读