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