You want to trade concurrent call scripts?  I have one to and sometimes run
into issues where it thinks there is an existing call for a user so it
sends a reached max calls limit.




On Thu, Nov 3, 2011 at 3:36 PM, Ryan Revels <[email protected]> wrote:

> I've run into an issue where *very* rarely, dialogs will "hang", that is,
> the dialog will continue to exist even though the call never connected. In
> the example I managed to track down, the proxy should reject the call
> (because a limit of concurrent calls has been reached) and at first, it
> seems like it's going to... but then it sends a 100 Trying and continues to
> route the call to the destination. From there, everything spirals and the
> dialog doesn't die until it hits the global timeout.
>
> The relevant portion of my script looks like:
>
> # Check gateway calls total
> if ($avp(custgwtotal_limit) != "0" && $avp(custgwtotal_limit) != NULL &&
> $avp(custgwtotal_limit) != "")
> {
>    get_profile_size("custgwtotal","$rd","$avp(custgwtotal_count)");
>    if (!$avp(custgwtotal_count) < $avp(custgwtotal_limit))
>    {
>       sl_send_reply("486","Endpoint Session Limit");
>       exit;
>    }
> }
> set_dlg_profile("custgwtotal","$rd"); #count total calls to customer's IP
>
> I've attached a pcap example of what the signaling looks like when the
> dialog hangs. For this example, the output in dlg_list looks like:
>
> dialog::  hash=629:349156783
> state:: 3
>  user_flags:: 0
> timestart:: 1320336333
>  timeout:: 1320357957
> callid:: did2.139.1120741
>  from_uri:: sip:[email protected]
>  to_uri:: sip:[email protected]
>  caller_tag:: 1ae26ee84c61df6b84baef371d2bf5e4
> caller_contact:: sip:184.106.219.203:5060;transport=udp
>  callee_cseq:: 0
> caller_route_set::
>  caller_bind_addr:: udp:184.106.218.8:5060
>  callee_tag:: as58f4e19a
> callee_contact:: sip:[email protected]
>  caller_cseq:: 2
> callee_route_set::
>  callee_bind_addr:: udp:184.106.218.8:5060
>
> Any help would be appreciated.
>
> Thanks,
> Ryan
>
> _______________________________________________
> Users mailing list
> [email protected]
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
>


-- 
--
*--*--*--*--*--*
Duane
*--*--*--*--*--*
--
route[ConcurrentCallLimiter]
{

xlog("L_INFO", "Route ConCurrentCall: Call [$rm] du [$du] rd [$rd] td [$td] ds 
[$ds] Ri [$Ri] rU[$rU] fU[$fU] ru[$ru] fu[$fu] tu[$tu] od[$od] fd[$fd]\n");


        ## have we done our checking on this call?
        if(!isflagset(31) && $hdr(User-Agent)!~ "ipcom.at")
        {

                #This will keep up with concurrent calls for Caller (fu)
                #The td != aethercommunications is to keep the internal callee 
from having double concurrent calls due to a hunt group call
                #If this wasn't here then if [email protected] called 
[email protected] and 444 was the callee from huntgroup then he
                #would be considered the caller and callee because of the SIP 
INVITE coming from the asterisk server
                if(avp_db_load("$fu/username", "$avp(channels)") && $td != 
"aethercommunications.com" ) {

                        # user has max channel limit set as preference
                        if(is_avp_set("$avp(channels)/n") && 
avp_check("$avp(channels)", "gt/i:0"))
                        {
                                # get current calls for uuid
                                
get_profile_size("ConcurrentCalls","$fU","$var(CallerCalls)");

                                # check within limit
                                if($avp(channels) > $var(CallerCalls))
                                {
                                        xlog("L_INFO", "Call control: Caller 
'$fU' currently has '$var(CallerCalls)' of '$avp(channels)' active calls before 
this one\n");
                                        $var(setprofileCaller) = 1;
                                }
                                else
                                {
                                        xlog("L_INFO", "Call control: Caller 
channel limit exceeded [$var(CallerCalls)/$avp(channels)]\n");
                                        sl_send_reply("487","Request 
Terminated: Channel limit exceeded");
                                        exit;
                                }
                        }
                        else
                        {
                                $var(setprofileCaller) = 0;
                        }



                        if($var(setprofileCaller) > 0)
                        {
                                if ( !match_dialog() )
                                {
                                        create_dialog();
                                }
                                set_dlg_profile("ConcurrentCalls","$fU");
                                
get_profile_size("ConcurrentCalls","$fU","$var(CallerCalls)");
                                xlog("L_INFO", "Call control: Caller '$fU' now 
has '$var(CallerCalls)' of '$avp(channels)' active calls\n");
                        }
                }




                #This will keep up with concurrent calls for Callee (ru)
                #if(is_domain_local("$rd")) {
                if(avp_db_load("$ru/username", "$avp(channels)") ) {        

                        # user has max channel limit set as preference
                        if(is_avp_set("$avp(channels)/n") && 
avp_check("$avp(channels)", "gt/i:0"))
                        {
                                # get current calls for uuid
                                
get_profile_size("ConcurrentCalls","$rU","$var(CalleeCalls)");                

                                # check within limit
                                if($avp(channels) > $var(CalleeCalls))
                                {
                                        xlog("L_INFO", "Call control: Callee 
'$rU' currently has '$var(CalleeCalls)' of '$avp(channels)' active calls before 
this one\n");                
                                        $var(setprofileCallee) = 1;
                                }                
                                else             
                                {
                                        xlog("L_INFO", "Call control: user 
channel limit exceeded [$var(CalleeCalls)/$avp(channels)]\n");

                                        route(MEDIASERVER);

                                }
                        }
                        else
                        {
                                $var(setprofileCallee) = 0;
                        }              



                        if($var(setprofileCallee) > 0) 
                        {
                                if ( !match_dialog() )
                                {
                                        create_dialog();
                                }
                                set_dlg_profile("ConcurrentCalls","$rU");
                                
get_profile_size("ConcurrentCalls","$rU","$var(CalleeCalls)");                
                                xlog("L_INFO", "Call control: Callee '$rU' now 
has '$var(CalleeCalls)' of '$avp(channels)' active calls\n");
                        }

                }




                #We need to set restrictions on how many calls a Customer can 
have
                #go out to the PSTN or other customers
                #
                #Each customer has an AVPOP called LANSite that tells us if the 
domain users are 
                #located behind the same WAN router or not.  So if the Caller 
and Callee's LANSite
                #AVPOP doesn't equal each other then that means the RTP traffic 
is going to traverse
                #the WAN router

                avp_db_load("$ru/username", "$avp(LANSite)");
                        if($avp(LANSite) != null)
                        {
                                $var(ToLANSite) = $avp(LANSite);
                        }
                avp_db_load("$fu/username", "$avp(LANSite)");
                        if($avp(LANSite) != null)
                        {
                                $var(FromLANSite) = $avp(LANSite);
                        }

                xlog("L_INFO", "Call Control: Before IF statement ToLANSite 
[$var(ToLANSite)] FromLANSite [$var(FromLANSite)] \n");


                #We need to check and make sure the To and From DID are not the 
same.  If they are then
                #that means it is a Hunt Group Call from an internal user to 
their companies own huntgroup
                #We don't want to consider that a WAN Call even though it could 
be possible it is if the customer
                #has multiple remote sites.  But there is no way to tell if the 
two internal users are at two different locations
                if( $rU != $fU) {

                if( ($var(ToLANSite) != $var(FromLANSite)) || ( $si != $dd || 
$dd==null) || $rU == $fU) {
                        xlog("L_INFO", "Call control: ru [$ru] and fu [$fu] 
\n");
                        xlog("L_INFO", "Call control: si [$si] and dd [$dd] 
\n");
                        xlog("L_INFO", "Call control: rd [$rd] and fd [$fd] 
\n");
                        xlog("L_INFO", "Call control: ToLANSite 
[$var(ToLANSite)] and FromLANSite [$var(FromLANSite)] \n");


                        if(is_domain_local("$fd")) {
                                #This will keep up with concurrent calls for 
the whole domain
                                #This is a customer calling Out to PSTN or 
another customer
                                avp_db_load("$fu/domain", "$avp(channels)");

                                # Domain has max channel limit set as preference
                                if(is_avp_set("$avp(channels)/n") && 
avp_check("$avp(channels)", "gt/i:0"))
                                {
                                        # get current calls for From Domain fd
                                        
get_profile_size("ConcurrentCalls","$fd","$var(DomainCallerCalls)");

                                        # check within limit
                                        if($avp(channels) > 
$var(DomainCallerCalls))
                                        {
                                                xlog("L_INFO", "Call control: 
Domain '$fd' currently has '$var(DomainCallerCalls)' of '$avp(channels)' active 
calls before this one\n");
                                                $var(setprofileDomainCaller) = 
1;
                                        }
                                        else
                                        {
                                                xlog("L_INFO", "Call control: 
user channel limit exceeded [$var(DomainCallerCalls)/$avp(channels)]\n");
                                                sl_send_reply("487","Request 
Terminated: Channel limit exceeded");
                                                exit;
                                        }
                                }
                                else
                                {
                                        $var(setprofileDomainCaller) = 0;
                                }



                                if($var(setprofileDomainCaller) > 0)
                                {
                                        if ( !match_dialog() )
                                        {
                                                create_dialog();
                                        }
                                        
set_dlg_profile("ConcurrentCalls","$fd");
                                        
get_profile_size("ConcurrentCalls","$fd","$var(DomainCallerCalls)");
                                        xlog("L_INFO", "Call control: Domain 
'$fd' now has '$var(DomainCallerCalls)' of '$avp(channels)' active calls\n");
                                }

                        }

                        # We have to use $var(callee_domain) because if the 
callee is a customer then when we did the lookup("location") function in 
route(10)
                        # the domain part got changed from the actual domain 
(ex. irock.com) to the actual public IP address that is in the location 
database.
                        # At the very beginning of Route(10) we set 
$var(callee_domain) = $rd so we are good with using it here.

                        if(is_domain_local("$var(callee_domain)") && 
$rd!="sip22.vitelity.net") {
                                #This will keep up with concurrent calls for 
the whole domain
                                #This is a customer being called by PSTN or 
another customer
                                avp_db_load("$ru/domain", "$avp(channels)");

                                # user has max channel limit set as preference
                                if(is_avp_set("$avp(channels)/n") && 
avp_check("$avp(channels)", "gt/i:0"))
                                {
                                        # get current calls for uuid
                                        
get_profile_size("ConcurrentCalls","$var(callee_domain)","$var(DomainCalleeCalls)");

                                        # check within limit
                                        if($avp(channels) > 
$var(DomainCalleeCalls))
                                        {
                                                xlog("L_INFO", "Call control: 
Domain '$var(callee_domain)' currently has '$var(DomainCalleeCalls)' of 
'$avp(channels)' active calls before this one\n");
                                                $var(setprofileDomainCallee) = 
1;
                                        }
                                        else
                                        {
                                                xlog("L_INFO", "Call control: 
user channel limit exceeded [$var(DomainCalleeCalls)/$avp(channels)]\n");

                                                route(MEDIASERVER);             
  

                                        }
                                }
                                else
                                {
                                        $var(setprofileDomainCallee) = 0;
                                }



                                if($var(setprofileDomainCallee) > 0)
                                {
                                        if ( !match_dialog() )
                                        {
                                                create_dialog();
                                        }
                                        
set_dlg_profile("ConcurrentCalls","$var(callee_domain)");
                                        
get_profile_size("ConcurrentCalls","$var(callee_domain)","$var(DomainCalleeCalls)");
                                        xlog("L_INFO", "Call control: Domain 
var(callee)[$var(callee_domain)] td[$td] now has '$var(DomainCalleeCalls)' of 
'$avp(channels)' active calls\n");
                                }

                        }

                }

                }

                #Cleanup AVPs
                avp_delete("$avp(LANSite)");
                avp_delete("$avp(channels)");

                ## mark checking done
                setflag(31);
        }
}
_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

Reply via email to