Hi,

Check this commitdiff [1], it has some subtle lines of code that remove the deadlock.

Rtimer is not required, it is only used in the sample configuration file to display the amount of concurrent calls and to grant more time when needed, but strictly in the business logic sense. Internally, dialog is the only module that is a dependency.

[1] http://git.sip-router.org/cgi-bin/gitweb.cgi?p=sip-router;a=commitdiff;h=d0f0ba702bd44524bc9f52e07341db03267b15f7

Regards,
Carlos



On Sun, May 11, 2014 at 9:57 AM, Kelvin Chua <kelchy@gmail.com> wrote:
hi carlos,

i'm looking at the commitdiff, seems like it's just indentations
http://git.sip-router.org/cgi-bin/gitweb.cgi?p=sip-router;a=commitdiff;h=d0f0ba702bd44524bc9f52e07341db03267b15f7
is there something i am missing?

by the way, based on the module documentation, the only dependency is the dialog module, shouldn't it include the rtimer module?
is it really required? what if i would only use CNXCC_MONEY and not CNXCC_TIME or CNXCC_CHANNEL? should i still load
rtimer.so before loading cnxcc.so?

Kelvin Chua


On Mon, Apr 28, 2014 at 9:13 PM, Carlos Ruiz Díaz <carlos.ruizdiaz@gmail.com> wrote:
I'm glad that it worked.

Please don't forget to "git pull" to update your cnxcc copy.

Regards,
Carlos


On Mon, Apr 28, 2014 at 3:17 AM, Andrzej Ciupek <andrzej.ciupek@hotmail.com> wrote:
Hello again

It works perfect, I was missing "setflag(DLG_FLAG);" in my main route.

Thank You very much for help.

Greetings
Andrzej Ciupek


From: andrzej.ciupek@hotmail.com
To: carlos.ruizdiaz@gmail.com
CC: sr-users@lists.sip-router.org
Subject: RE: [SR-Users] cnxcc
Date: Mon, 28 Apr 2014 09:54:30 +0200


Hello

You are amazing !!

Your example work perfect, but I have to work with mine cfg, because when I use part of Your route into my config it doesn't work like it should.
I think I have some problems with dialog module, because when I start Your script I get:

Apr 28 09:47:31 kamailio /usr/local/sbin/kamailio[3060]: INFO: <script>: dialog started

I don't see it using my config, so it looks like dialog module doesn't work in my config file in proper way.
I will let You know when I find a bug in my script.

Now when I have working example it will be easier.

Greetings
Andrzej Ciupek


Date: Sun, 27 Apr 2014 21:29:34 -0500
Subject: Re: [SR-Users] cnxcc
From: carlos.ruizdiaz@gmail.com
To: andrzej.ciupek@hotmail.com
CC: sr-users@lists.sip-router.org

Kelvin,

can you update your copy and try again? Maybe your problem was related to this, or maybe not. In either case, I will try to reproduce your issue later this week :).

Regards,


On Sun, Apr 27, 2014 at 9:27 PM, Carlos Ruiz Díaz <carlos.ruizdiaz@gmail.com> wrote:
Hi Andrzej,

I found a deadlock situation using the script you posted, thanks to an unusual way of using the functions that the module exports. 

About the script itself: I found a few inconsistencies that would have caused a problem with handing the calls even if there was no bug in the software. For example:

- if you want to set the maximum amount of calls per user, use the function "cnxcc_set_max_channel"

- the "call-shutdown" event route is only executed if the call runs out of credit, never for "normal call clearing". For that, use "dialog:end" or "dialog:failed" instead.

- you cannot access "$var(client)" from outside the process that created it. This means that when the call is killed, "$var(client)" will have a NULL value since this event is processed by a completely different process. If you want to have this information available everywhere, use a shared memory variable instead ($sht).

I created a sample script [1] that applies your requirements in a slightly different way:

- it authorizes the call by checking the balance
- it kills the call when the credit is over
- it doesn't allow more than one call per customer


In this example I used a shared memory variable, to give you an idea of how to persist the customer's ID across processes. 

Regards,
Carlos





On Sat, Apr 26, 2014 at 10:34 AM, Carlos Ruiz Díaz <carlos.ruizdiaz@gmail.com> wrote:
I did find a bug, using your config script, I will fix it this weekend. Try with this configuration file [1].


In summary, you can't use more than one check mechanisms. It has to be credit, time or channels, exclusively. 

Also, I need to test your config with Kam 4.1. I am using the trunk version.

Regards,


On Sat, Apr 26, 2014 at 10:23 AM, Andrzej Ciupek <andrzej.ciupek@hotmail.com> wrote:
Yes. I want prepaid subscribers be able to create only one channel to prevent frauds for simultaneous calls.

Greetings
Andrzej Ciupek

Od: Carlos Ruiz Díaz
Wysłano: ‎2014-‎04-‎26 16:42
Do: Andrzej Ciupek
DW: Kamailio (SER) - Users Mailing List
Temat: Re: [SR-Users] cnxcc

Hi Andrzej,

are you trying to setup cnxcc to check both credit and maximum simultaneous calls?

Regards,



On Sat, Apr 26, 2014 at 9:26 AM, Andrzej Ciupek <andrzej.ciupek@hotmail.com> wrote:
Hello

I’am using default config with options from an example. It looks like event route isn’t execuded after hangup.

Apr 26 16:26:14 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:15 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:16 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:17 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:18 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:19 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:20 kamailio /usr/local/sbin/kamailio[4611]: INFO: <script>: 1000 has 1 call(s)
Apr 26 16:26:20 kamailio /usr/local/sbin/kamailio[4604]: INFO: <script>: Setting up money based credit control
Apr 26 16:26:20 kamailio /usr/local/sbin/kamailio[4604]: INFO: <script>: Setting up channel based credit control
Apr 26 16:26:20 kamailio /usr/local/sbin/kamailio[4604]: INFO: <script>: CNXCC ROUTE: 1000 has 2 call(s)

kamailio.cfg
# ----- prepaid call controll -----

#!define DLG_FLAG 28
#!define CC_FLAG 29

loadmodule "dialog.so"

modparam("dialog", "hash_size", 2048)
modparam("dialog", "default_timeout", 3600)
modparam("dialog", "db_mode", 0)
modparam("dialog", "dlg_flag", DLG_FLAG)

modparam("rtimer", "timer", "name=ta;interval=1;mode=1;")
modparam("rtimer", "exec", "timer=ta;route=SHOW_CHANNEL_COUNT")

loadmodule "cnxcc.so"

modparam("cnxcc", "dlg_flag", CC_FLAG)
modparam("cnxcc", "credit_check_period", 1) #check every 1 second

route {
 if (!allow_source_address("2") and !allow_source_address("1")){
        route(CNXCC);
        route(PSTN);
        }
}

route[CNXCC]
{

        $var(client)            = "1000";

        xlog("L_INFO", "Setting up money based credit control");

        $var(credit)            = "10"; # 10$ of credit
        $var(cost_per_sec)      = "1";  # 1$ per sec
        $var(i_pulse)           = "1";  # 1$ to establish the call
        $var(f_pulse)           = "1";  # 1$ per second

        # if only one call is established, that call should last 9 seconds.

        if (!cnxcc_set_max_credit("$var(client)",
                                  "$var(credit)",
                                  "$var(cost_per_sec)",
                                  "$var(i_pulse)",
                                  "$var(f_pulse)")) {
                xlog("Error setting up credit control");
                return;
        }
        $var(count)     = -1;

        if (!cnxcc_get_channel_count("$var(client)", "$var(count)")) {
                xlog("Error getting customer's channel count");
        }

        xlog("L_INFO", "CNXCC ROUTE: $var(client) has $var(count) call(s)");

        if ($var(retcode) < -1) {
                xlog("Too many channels for customer");
                sl_send_reply(403, "Forbidden");

                if (!cnxcc_terminate_all("$var(client)")) {
                        xlog("Error terminating customer's calls");
                } else {
                        xlog("Terminating customer's call");
                }

                exit;
        }
}

route[SHOW_CHANNEL_COUNT]
{
        $var(count) = @cnxcc.channels["1000"].count;
        xlog("L_INFO", "1000 has $var(count) call(s)");
}

event_route[dialog:failed]
{
        xlog("dialog failed");
}

event_route[cnxcc:call-shutdown]
{
        xlog("L_INFO", "Shutting down channel by callcontroll");
        xlog("L_INFO", "[$ci]: call killed");
        $var(count)     = $var(count)-1;
        if (!cnxcc_get_channel_count("$var(client)", "$var(count)")) {
                xlog("Error getting customer's channel count");
        }
        xlog("L_INFO", "CNXCC ROUTE: $var(client) has $var(count) call(s)");
        # perform some kind of notification, database update, email sending, etc
}

Greetings
Andrzej Ciupek

Od: Carlos Ruiz Díaz
Wysłano: ‎sobota‎, ‎26‎ ‎kwietnia‎ ‎2014 ‎15‎:‎19
Do: Kamailio (SER) - Users Mailing List, Andrzej Ciupek

Hi,

sorry guys, I forgot about this. I will make my own tests and post the results.

Andrzej, can you post the configuration file you are using?

Regards,
Carlos


On Sat, Apr 26, 2014 at 4:15 AM, Kelvin Chua <kelchy@gmail.com> wrote:

No, I have not yet found the solution for this issue on my setup.

Maybe Carlos can help us out

On Apr 26, 2014 5:10 PM, "Andrzej Ciupek" <andrzej.ciupek@hotmail.com> wrote:
Hello
 
Have You solved this issue ?
I’am using Kamailio 4.1.3 and I’am getting the same results.
 
Greetings
Andrzej Ciupek

_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users




--



--



--



--



--



--

_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users



_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users




--
Carlos
http://caruizdiaz.com
http://ngvoice.com
+52 55 3048 3303