[SR-Users] Dialog module not decrementing profile size

Grant Bagdasarian GB at cm.nl
Tue Oct 30 10:51:25 CET 2012


Hello Community,

I've recently started to use the Dialog module to manage the amount of incoming calls from our SIP provider allowed to pass through by using profiles_with_values and setting the size of these profiles to a certain amount.
Most of the time this works as it should, but sometimes the 'slots' available for a profile aren't cleared even though a dialog has finished. This seems to happen when an high amount of regular traffic is hitting kamailio.

Has anyone else experienced this? Are there perhaps any other ways to control the slots available for certain incoming SIP traffic?

Below parts of my configuration file. Perhaps I'm doing something wrong which causes this to happen.
In my route[WITHINDLG] -> loose_route -> is_method("BYE") I'm not calling dlg_manage(), could this be the problem?

Other comments are welcome too, as I'm fairly new to Kamailio.

modparam("dialog", "enable_stats", 1)
modparam("dialog", "dlg_flag", 4)
modparam("dialog", "hash_size", 4096)
modparam("dialog", "profiles_with_value", "318005004");
modparam("dialog", "default_timeout", 43200)
modparam("dialog", "dlg_match_mode",2)
modparam("dialog", "detect_spirals", 1)

request_route {

        # per request initial checks
        route(REQINIT);

        # handle requests within SIP dialogs
        route(WITHINDLG);

        ### only initial requests (no To tag)

        # CANCEL processing
        if (is_method("CANCEL"))
        {
                if (t_check_trans())
                        t_relay();
                exit;
        }

        t_check_trans();

        # record routing for dialog forming requests (in case they are routed)
        # - remove preloaded route headers
        remove_hf("Route");

       if (is_method("INVITE")) {
              xlog("L_INFO", "Incoming request for $rU from $fU");
              if ($rU == "318005004") {
                     route(DIALOG);
              }
        }

        # handle registrations
        route(REGISTRAR);

        if ($rU==$null)
        {
                # request with no Username in RURI
                sl_send_reply("484","Address Incomplete");
                exit;
        }

        # dispatch destinations
        route(DISPATCH);

        route(RELAY);
}

route[DIALOG] {
       dlg_manage();
       record_route();
       $var(SIZE) = 0;

       sql_query("vf", "exec dbo.SelectAvailableSlots '00$rU'", "ra");
       $avp(s:limit) = $dbr(ra=>[0,7]);
       xlog("L_INFO", "Maximum simultaneous calls is configured at $avp(s:limit) ....");
       sql_result_free("ra");

       if ($rU == "318005004") {
              get_profile_size("318005004", "$rU", "$var(SIZE)");
       }


       xlog("L_INFO", "There are currently $var(SIZE) calls for $rU, excluding the current call");
       if($var(SIZE) >= $avp(s:limit)) {
              xlog("L_INFO", "Simultaneous calls limit of $avp(s:limit) reached for $rU: $var(SIZE)\n");
              sl_send_reply("603", "Simultaneous calls limit reached");
              exit;
       }

       if ($rU == "318005004") {
              set_dlg_profile("318005004", "$rU");
       }


       if ($rU == "318005004") {
              if(get_profile_size("318005004", "$var(SIZE)")) {
                     xlog("L_INFO", "There are currently $var(SIZE) calls for $rU, including the current call");
              }
       }
}

route[WITHINDLG] {
        if (has_totag()) {
                # sequential request withing a dialog should
                # take the path determined by record-routing
                if (loose_route()) {
                     #Used for call transfer
                     if($fU == "318005004") {
                        if (is_method("UPDATE")) {
                            sl_send_reply("405","Method not allowed");
                            xlog("L_INFO", "Dropping UPDATE message...\n");
                            exit;
                        }
                        if (is_method("INVITE")) {
                            record_route();
                        }
                        if (is_method("BYE")) {
                            dlg_manage();
                        }
                     }
                        if (is_method("BYE")) {
                                setflag(1); # do accounting ...
                                setflag(3); # ... even if the transaction fails
                        }
                        route(RELAY);
                } else {
                        if (is_method("SUBSCRIBE") && uri == myself) {
                                # in-dialog subscribe requests
                                route(PRESENCE);
                                exit;
                        }
                        if ( is_method("ACK") ) {
                                if ( t_check_trans() ) {
                                        # non loose-route, but stateful ACK;
                                        # must be ACK after a 487 or e.g. 404 from upstream server
                                        t_relay();
                                        exit;
                                } else {
                                        # ACK without matching transaction ... ignore and discard.
                                        exit;
                                }
                        }
                        sl_send_reply("404","Not here");
                }
                exit;
        }
}


Regards,

Grant

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20121030/d45645f5/attachment-0001.htm>


More information about the sr-users mailing list