Accidently replied directly to clause. So here is a summary:
Sent core dump and system spec info like openser ver.
Klaus suggested upgrading to the latest openser 1.2 svn code, trying again, include pert part of openser.cfg
, sip packet capture, and making a bug report.
So I'm now using latest svn of openser 1.2 as of 11/12/07 on a different server (the backup server)
Problem still persists.
gdb of one of the core dumps is included below.
Below that is a nuterized (my personal server and gateway info cleaned out) openser.cfg
Thanks
Dave
Below is the gdb of one of the cores:
Using host libthread_db library "/lib/libthread_db.so.1".
warning: Can't read pathname for load map: Input/output error.
Core was generated by `/usr/local/sbin/openser'.
Program terminated with signal 11, Segmentation fault.
#0 0x0808f152 in comp_scriptvar (msg=<value optimized out>,
op=<value optimized out>, left=<value optimized out>, right=0x817ab9c)
at route.c:748
748 backup = s1->s[s1->len]; s1->s[s1->len] = '\0';
openser.cfg:
#
# $Id: openser.cfg,v 1.6 2006/02/15 18:23:46 bogdan_iancu Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=3 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
log_facility=LOG_LOCAL7
log_name="openser"
# Uncomment these lines to enter debugging mode
#fork=no
#log_stderror=yes
#listen=eth0
#
check_via=no # (cmd. line: -v)
dns=yes # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=4
disable_dns_blacklist=yes
#listen=udp:eth0
#fifo="/tmp/openser_fifo"
#fifo_db_url="postgres://seronstar:garney@208.76.152.52/seronstar"
#
# uncomment the following lines for TLS support
#disable_tls = 0
#listen = tls:your_IP:5061
#tls_verify = 1
#tls_require_certificate = 0
#tls_method = TLSv1
#tls_certificate = "/var/tmp/portage/net-misc/openser-
1.1.0/image///etc/openser/tls/user/user-cert.pem"
#tls_private_key = "/var/tmp/portage/net-misc/openser-1.1.0/image///etc/openser/tls/user/user-privkey.pem"
#tls_ca_list = "/var/tmp/portage/net-misc/openser-
1.1.0/image///etc/openser/tls/user/user-calist.pem"
#
# ------------------ module loading ----------------------------------
mpath="/usr/local/lib/openser/modules/"
# Uncomment this if you want to use MySQL database
#loadmodule "mysql.so"
loadmodule "postgres.so"
loadmodule "mysql.so"
loadmodule "mi_fifo.so"
loadmodule "xlog.so"
loadmodule "sl.so"
loadmodule "
tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "avpops.so
"
loadmodule "group.so"
loadmodule "uri.so"
loadmodule "uri_db.so"
loadmodule "alias_db.so"
# Uncomment this if you want digest authentication
# postgres.so must be loaded !
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "acc.so"
loadmodule "uac.so"
loadmodule "diversion.so"
loadmodule "mediaproxy.so"
loadmodule "
domain.so"
loadmodule "lcr.so"
# ----------------- setting module-specific parameters ---------------
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "nat_bflag", 6)
#modparam("usrloc|avpops|auth_db|group|acc|uri_db|alias_db",
#modparam("usrloc|auth_db|group|acc|uri_db|alias_db|avpops",
modparam("usrloc|auth_db|group|acc|uri_db|alias_db|avpops|domain|lcr",
"db_url","mysql://openser:openser@dbserver.myserver.net/openser")
# "db_url","
postgres://openser:openser@dbserver.myserver.net/openser")
#modparam("avpops", "avp_table", "avp_table")
modparam("avpops", "avp_table", "usr_preferences")
# UAC (User Agent Client) module provides some basic UAC functionalities like FROM header manipulation (anonymization) or client authentication.
modparam("uac", "rr_store_param", "vsf")
modparam("uac", "from_restore_mode", "auto")
# -- auth params --
# Uncomment if you are using auth module
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "load_credentials", "$avp(s:rpid)=rpid;email_address")
modparam("auth", "rpid_avp", "$avp(s:rpid)")
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
modparam("auth_db", "password_column", "password")
modparam("tm", "fr_inv_timer_avp", "$avp(i:25)")
modparam("tm", "fr_timer", 2)
# -- rr params --
# add value to ;lr param to make some broken UAs happy
#modparam("rr", "enable_full_lr", 1)
#modparam("rr", "append_fromtag", 1)
# -- FIFO options starting with openser
1.2
modparam("mi_fifo", "fifo_name", "/tmp/openser_fifo")
modparam("mi_fifo", "fifo_mode", 0600)
#modparam("mi_fifo", "fifo_group", 0)
#modparam("mi_fifo", "fifo_group", "root")
#modparam("mi_fifo", "fifo_user", 0)
#modparam("mi_fifo", "fifo_user", "root")
modparam("mi_fifo", "reply_dir", "/tmp/")
modparam("mediaproxy", "mediaproxy_socket", "/var/run/proxydispatcher.sock")
modparam("domain", "db_mode", 1)
modparam("acc", "early_media", 0)
modparam("acc", "failed_transaction_flag", 24)
modparam("acc", "report_ack", 0)
modparam("acc", "report_cancels", 0)
modparam("acc", "log_flag", 0)
modparam("acc", "log_missed_flag", 0)
modparam("acc", "log_level", 2)
modparam("acc", "db_flag", 25)
modparam("acc", "db_missed_flag", 0)
modparam("acc", "db_table_acc", "acc")
modparam("acc", "db_table_missed_calls", "missed_calls")
modparam("acc", "detect_direction", 1)
modparam("acc", "db_extra", "src_user=$fU;src_domain=$fd;dst_user=$rU;dst_domain=$rd")
#modparam("acc", "multi_leg_info", "diversion_user=$di{url.user};diversion_domain=$di{
uri.domain}")
modparam("acc", "multi_leg_info", "diversion_user=$avp(s:diversion_user);diversion_domain=$avp(s:diversion_domain)")
modparam("lcr","gw_uri_avp","gw_uri_avp")
modparam("lcr", "gw_table", "gw")
modparam("lcr", "gw_name_column", "gw_name")
modparam("lcr", "ip_addr_column", "ip_addr")
modparam("lcr", "port_column", "port")
modparam("lcr", "uri_scheme_column", "uri_scheme")
modparam("lcr", "transport_column", "transport")
modparam("lcr", "grp_id_column", "grp_id")
modparam("lcr", "lcr_table", "lcr")
modparam("lcr", "strip_column", "strip")
modparam("lcr", "prefix_column", "prefix")
modparam("lcr", "from_uri_column", "from_uri")
modparam("lcr", "priority_column", "priority")
#modparam("lcr", "gw_uri_avp", "1400")
modparam("lcr", "ruri_user_avp", "1402")
modparam("lcr", "contact_avp", "1401")
modparam("lcr", "fr_inv_timer_avp", "s:fr_inv_timer_avp")
modparam("lcr", "fr_inv_timer", 90)
modparam("lcr", "fr_inv_timer_next", 30)
modparam("lcr", "rpid_avp", "s:rpid")
# ------------------------- what set?flags mean --------------------
## General Flags ##
# setflag(1); # from PSTN gateway
# setflag(2); # from local user
# setflag(3); # user NOT allowed to make pstn calls
# setflag(4); # user account IS disabled
# setflag(24); # account failed transactions
# setflag(25); # account successful transactions
## Branch Flags
# setbflag(22); # mark media proxy as started
# ------------------------- request routing logic -------------------
# main routing logic
route{
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
xlog("L_INFO", "Sanity Check: Too Many Hops\n");
exit;
xlog("L_INFO", "ignored break\n");
};
if (msg:len >= 2048 ) {
sl_send_reply("513", "Message too big");
xlog("L_INFO", "Sanity Check: Message too big\n");
exit;
};
# we record-route all messages -- to make sure that
# subsequent messages will go through our proxy; that's
# particularly good if upstream and downstream entities
# use different transport protocol
if (is_method("OPTIONS") || is_method("NOTIFY"))
{
exit;
}
if (method!="REGISTER" && method!="ACK") {
record_route();
xlog("L_INFO", "start route logic: r-uri <$ru> f-uri <$fu> f-Usr <$fU> FromDisplay $fn\n");
xlog("L_INFO", "Recording Route: r-uri <$ru>\n");
setflag(24); # account failed transactions
setflag(25); # account successful transactions
};
# subsequent messages withing a dialog should take the
# path determined by record-routing
if (loose_route()) {
# mark routing logic in request
append_hf("P-hint: rr-enforced\r\n");
xlog("L_INFO", "following previous route: r-uri <$ru>\n");
if(is_method("BYE"))
{
setflag(24); # account failed transactions
setflag(25); # account successful transactions
}
route(1);
exit;
};
if (uri==myself)
{
xlog("L_INFO", "message to me, Req Meth $rm\n");
if (method=="REGISTER") {
route(5);
};
setflag(24); # account failed transactions
setflag(25); # account successful transactions
if(is_method("CANCEL") || is_method("ACK"))
{
if(t_check_trans())
{
route(1);
}
else
{
xlog("L_INFO", "Dropping mis-routed request - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
}
exit;
}
# if(from_uri==myself)
# {
# # need to make this detect an infinite loop, sometimes simulring may send to loop to call other phone numbers
# xlog("L_INFO", "Dropping local loop-back oops - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
# drop();
# }
# guilty until proven innocent... don't let call go to PSTN unless the server or user is authorized for that through later checks.
setflag(3) ; # user not allowed to make pstn calls
#if ( from_gw("1") )
if ( uri =~ "sip.myserver.net" && is_present_hf("Remote-Party-ID") )
{
xlog("L_INFO", "Looks like it came from a verizon gateway server, aka PSTN\n");
setflag(1); # from PSTN Gateway
}
else
{
xlog("L_INFO", "Its NOT from a verizon gateway server, aka PSTN\n");
}
if ( ! isflagset(1) ) # if not from PSTN
{
route(9) ; # load settings for calling user.
if ( ! isflagset(2) ) # if NOT local user
{
route(10) ; # check for and load settings for calling domain.
}
}
if ($rP=~"tcp")
{
avp_printf("$avp(s:DestURI)", "sip:$rU@$rd;transport=UDP" );
avp_pushto("$ru", "$avp(s:DestURI)" );
}
route(3); # Clean it up and send it our user if appropriate.
route(4); # Send our little one to the world and hope it survives :'(
}
}
error_route {
xlog("L_INFO", "--- error route class=$(
err.class) level=$(err.level) info=$(err.info) rcode=$(err.rcode) rreason=$(err.rreason) ---\n");
xlog("L_INFO", "--- error from [$si:$sp]\n+++++\n$mb\n++++\n");
#sl_send_reply("$err.rcode", "$err.rreason");
route(7); # stop media proxy
exit;
}
route[1] {
xlog("L_INFO", "Request leaving server - M=$rm RURI=$ru Proto=$dP F=$fu T=$tu IP=$si ID=$ci\n");
# for TC51 ( when device unreachable proper 403 is not returned )
#sl_send_reply("100", "Giving a try");
#sl_send_reply("403", "Not Reachable");
#drop() ;
#t_on_failure("1");
if ( ! uri==myself )
{
if ( is_method("INVITE"))
route(6); # start media proxy
if ( is_method("CANCEL"))
route(7); # stop media proxy
}
t_on_reply("1");
if(isflagset(24) || isflagset(25))
route(8); # populate accounting info
$avp(i:25)=5000 ;
if (!t_relay()) {
# This section doesn't seem to be reached even on failures.
xlog("L_INFO", "Failed sending to: $ru\n");
xlog("L_INFO", "--- error route class=$(err.class) level=$(err.level) info=$(err.info
) rcode=$(err.rcode) rreason=$(err.rreason) ---\n");
xlog("L_INFO", "--- error from [$si:$sp] \n +++++\n$mb\n++++\n");
sl_send_reply("$err.rcode", "$err.rreason");
route(7); # stop media proxy
}
exit;
}
route[2] {
xlog("Now in route_2\n");
xlog("L_INFO", "Checking if $rU is one of our numbers\n");
$avp(s:Original_User) = $rU ;
# ok to load avps for potential TO user,
# If the user doesn't exist the avp's for the from user won't be over writen
# and we are not pulling the from specific user preferences.
if ( avp_db_load("$ru/username","*/usr_preferences_to") )
{
xlog("L_INFO", "avp_db_load was successfull\n");
}
else
{
xlog("L_INFO", "avp_db_load failed with return code: $rc\n");
}
if (is_avp_set("$avp(s:call_forward)"))
{
# hard forward to new user/number
xlog("L_INFO", "$rU is hard forwarded to $avp(s:call_forward) \n");
add_diversion("user-unavailable");
# set user that we will load new from user preferences for.
$avp(s:from_usr_tmp) = $ru;
route(9); # load from user preferences
avp_pushto("$ru/username", "$avp(s:call_forward)");
rewritehost("127.0.0.1");
avp_delete("$avp(s:via)/g");
# look up for if new number is one of ours and has settings
avp_db_load("$ru{
uri.user}/username","*/usr_preferences_to");
route(8); # set vars for accounting diversion info.
#avp_db_load("$avp(s:call_forward)/username","*/usr_preferences_to");
# TODO: should do a loop to check for new num forwarding and make sure not infinite loop.
}
if (alias_db_lookup("dbaliases"))
{
if (!uri==myself) {
avp_pushto("$ru/username", "$avp(s:Original_User)");
xlog("L_INFO", "routing for gateway_dbaliases: r-uri <$ru>\n");
route(1);
}
else
{
xlog("L_INFO", "dbaliases changed user to $rU>\n");
}
}
else
{
xlog("L_INFO", "dbaliases lookup failed w/ return code=$rc for r-uri <$ru>\n");
}
if ( is_avp_set("$avp(s:num_alias)"))
{
avp_pushto("$ru/username", "$avp(s:num_alias)");
xlog("L_INFO", "redirecting to another number: $avp(s:num_alias)\n");
}
if ( is_avp_set("$avp(s:via)")) {
avp_pushto("$ru/domain", "$avp(s:via)");
xlog("L_INFO", "$rU is reached through server: $avp(s:via)\n");
}
if (!uri==myself)
{
xlog("L_INFO", "routing to default server: $rd\n");
route(1);
}
xlog("L_INFO", "checking devices registered here in location table: r-uri <$ru>\n");
#lookup("location");
if (!uri==myself) {
xlog("L_INFO", "routing from info in location table\n");
avp_pushto("$ru/username", "$avp(s:Original_User)");
route(1);
}
}
route[3] {
xlog("Now in route_3\n");
# Check if it belongs to us first
if ( uri=~"sip:[0-9]{7}@" ) {
# Handle 7 digit numbers
# by temp adding areacode from calling num
# and run it against databases with our nums.
xlog("L_INFO", "Caller dialed 7 digits. Checking if callers area code + $rU is one of our numbers\n");
$avp(s:FromUser)=$fU;
$avp(s:OriginalDestinationNumber)=$rU;
xlog("L_INFO", "avp-cid $avp(s:FromUser) avp-ariacode $avp(s:AreaCode) f-uri <$fu>\n");
avp_subst("$avp(s:FromUser)/$avp(s:AreaCode)","/^([0-9]{3}).*/\1/");
xlog("L_INFO", "avp-fU $avp(s:FromUser) avp-ariacode $avp(s:AreaCode) f-uri <$fu>\n");
avp_printf("$avp(s:NewTenDigDest)","$avp(s:AreaCode)$rU");
xlog("about to push avp NewTenDigDest: $avp(s:NewTenDigDest)");
avp_pushto("$ru/username","$avp(s:NewTenDigDest)");
} else if ( uri=~"sip:\+" || uri=~"sip:\+{0,1}1[0-9]{10}@" )
{ # clean num to 10 digit
# Remove "+" from front of incoming number.
# it must have come in from verizon
$avp(s:OriginalDestinationNumber)=$rU;
xlog("L_INFO", "Requested number starts with +1, clean it off: $rU\n");
$avp(s:OriginalDestinationNumber)=$rU;
#xlog("L_INFO", "avp-cid $avp(s:OriginalDestinationNumber) avp-ariacode $avp(s:NewTenDigDest) f-uri <$fu>\n");
avp_subst("$avp(s:OriginalDestinationNumber)/$avp(s:NewTenDigDest)","/.*([0-9]{10})$/\1/");
avp_pushto("$ru/username","$avp(s:NewTenDigDest)");
xlog("L_INFO", "avp-NewTenDigDest $avp(s:NewTenDigDest) avp-cleaned $avp(s:OriginalDestinationNumber) r-uri <$ru>\n");
}
route(2); # Check db if Dest num is for us.
xlog("Back from route_2\n");
if (is_avp_set("$avp(s:call_forward)") )
{
xlog("Forwarding call and new num is not ours.. out to the world you go! Ha Ha Ha!\n");
route(4);
}
if ( is_avp_set("$avp(s:OriginalDestinationNumber)") && ! is_avp_set("$avp(s:call_forward)") )
{
# restore original num incase there is more processing needed by calling process.
avp_pushto("$ru/username","$avp(s:OriginalDestinationNumber)");
xlog("Restored original num: ru -> $ru");
}
route(4); # Send our little one to the world and hope it survives :'(
}
route[4] {
xlog("L_INFO", "In route-4: r-uri <$ru>\n");
# routing to world.
xlog("L_INFO", "no location defined for uri: r-uri <$ru>\n");
#Call destination is PSTN, so send it to the gateway
xlog("L_INFO", "CALL: PSTN gateway\n");
xlog("Before set: avp-rpid is $avp(s:rpid)");
if ( ! from_uri=~"sip:\+" )
{
avp_printf("$avp(s:rpid)","sip:+1$fU@sip.myserver.net");
xlog("NOT from ser test phone. setting avp-rpid to $avp(s:rpid)");
}
else
{
avp_printf("$avp(s:rpid)","sip:$fU@sip.myserver.net");
xlog("NOT from ser test phone. setting avp-i13 to $avp(s:rpid)");
}
if(is_present_hf("P-Asserted-Identity")) {
remove_hf("P-Asserted-Identity");
}
# if( ! (is_present_hf("Remote-Party-ID") && $re =~ "sip:\+[1-9]+" ) )
# {
if ( is_present_hf("Remote-Party-ID") )
{
remove_hf("Remote-Party-ID");
}
append_hf("Remote-Party-ID: <$avp(s:rpid)>;privacy=$avp(s:privacy)\r\n") ; # Append Remote-Party-ID header field
# }
xlog("L_INFO", ": f-uri before with +1: f-uri <$fu>\n");
uac_replace_from("$avp(s:rpid)") ;
# if (!load_gws("1"))
# {
# #sl_send_reply("500", "Server Internal Error - Cannot load gateways from group 1");
# #exit;
# xlog("L_INFO", ": Gateways failed to load from group 1\n");
# }
avp_printf("$avp(s:first_gw)","sip:$rU@<first-gw-addr>");
avp_printf("$avp(s:first_gw)","sip:$rU@<second-gw-addr>");
# xlog("L_INFO", ": Gateways loaded -- gw_uri_avp = $avp(s:gw_uri_avp)\n");
# xlog("L_INFO", ": Added entry to Gateways avp gw_uri_avp = $avp(s:gw_uri_avp)\n");
# if ( next_gw() )
# {
# xlog("L_INFO", ": Gateways loaded, gw_uri_avp = $avp(s:gw_uri_avp)\n");
# }
# else
# {
# xlog("L_INFO", ": Gateway query returned nothing, gw_uri_avp = $avp(s:gw_uri_avp)\n");
# }
#t_on_branch("1");
t_on_failure("1");
avp_pushto("$ru","$avp(s:first_gw)"); # new branch for this uri
xlog("L_INFO", ": first_gw branching -- $avp(s:first_gw)\n");
avp_delete("$avp(s:first_gw)");
xlog("L_INFO", ": first_gw 'next-time' branch to -- $avp(s:first_gw)\n");
route(1) ;
}
route[5] {
# useing digest authentication
if (!www_authorize("", "subscriber")) {
xlog("L_INFO", "user didn't send credentials: f-uri <$fu> r-uri <$ru>\n");
www_challenge("", "0");
exit;
};
xlog("L_INFO", "user registered: f-uri <$fu>\n");
if (!src_ip==<other-loadballance-host-ip>) {
t_replicate("sip:<other-loadballance-host-ip>:5060");
};
save("location");
exit;
}
route[6] {
# force media proxy start
xlog("L_INFO", "in route 6: Start Media Proxy\n");
setbflag(22); # mark media proxy as started
if(! isbflagset(22))
{
xlog("L_INFO", "Starting Media Proxy\n");
if(use_media_proxy())
{
xlog("L_INFO", "Started Media Proxy\n");
}
else
{
xlog("L_INFO", "FAILED to start Media Proxy\n");
}
}
# setbflag(22); # mark media proxy as started.
# use_media_proxy();
}
route[7] {
# force media proxy stop
if (isbflagset(22))
end_media_session();
}
route[8]
{
#modparam("acc", "multi_leg_info", "diversion_user=$avp(s:diversion_user);diversion_domain=$avp(s:diversion_domain)")
if ( is_present_hf("Diversion"))
{
$avp(s:diversion_user)=$di{url.user};
$avp(s:diversion_domain)=$di{uri.domain};
}
}
route[9]
{
xlog("L_INFO", "In Route 9.\n");
if ( ! is_avp_set("$avp(s:from_usr_tmp)" ) )
#if ( $var(from_usr_tmp){s.len} == 0 )
{
$avp(s:from_usr_tmp) = $fu;
}
xlog("L_INFO", "Loading AVPs for from user $avp(s:from_usr_tmp) if they exist\n");
#if(avp_db_load("$fu{uri.user}/username","*/usr_preferences_from"))
if(avp_db_load("$avp(s:from_usr_tmp)/username","*/usr_preferences_from"))
{
xlog("L_INFO", "Loaded AVPs for from user $fU\n");
setflag(2) ; # from local user
# is user account set to disabled or not allowed to make calls to pstn?
if ( ! is_avp_set("$avp(s:allow_call_pstn)") || avp_check("$avp(s:allow_call_pstn)", "re/yes/i") )
{
resetflag(3) ; # user IS allowed to make pstn calls
}
else
{
setflag(3) ; # user IS NOT allowed to make pstn calls
}
if ( ! is_avp_set("$avp(s:acct_status)") || ! avp_check("$avp(s:acct_status)", "re/disabled/i") )
{
resetflag(4) ; # user account IS NOT disabled
}
else
{
setflag(4) ; # user account IS disabled
setflag(3) ; # user IS NOT allowed to make pstn calls
}
}
avp_delete("$avp(s:from_usr_tmp)");
}
route[10] # check for and load settings for calling domain.
{
xlog("L_INFO", "In Route 10.\n");
}
onreply_route[1]
{
xlog("L_INFO", "Reply - S=$rs D=$rr F=$fu T=$tu IP=$si ID=$ci\n");
if(! isbflagset(22) && status=~"(180)|(183)|2[0-9][0-9]")
if ( is_method("CANCEL"))
route(7); # stop media proxy
# if ( is_method("INVITE"))
# route(6);
# {
# xlog("L_INFO", "Starting Media Proxy\n");
# if(use_media_proxy())
# {
# setbflag(22); # mark media proxy as started
# xlog("L_INFO", "Started Media Proxy\n");
# }
# else
# {
# xlog("L_INFO", "FAILED to start Media Proxy\n");
# }
# }
exit;
}
failure_route[1] {
xlog("L_INFO", "Failure route for PSTN entered - S=$T_reply_code M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
# avp_pushto("$br","$avp(s:first_gw)"); # new branch for this uri
# xlog("L_INFO", ": first_gw branching -- $avp(s:first_gw)\n");
# avp_delete("$avp(s:first_gw)");
# xlog("L_INFO", ": first_gw 'next-time' branch to -- $avp(s:first_gw)\n");
if (t_check_status("(403)|(Forbiden)"))
{
xlog("L_INFO", "Status $T_reply_code\n");
xlog("L_INFO", "Rejected by this gateway group, skip to next group if it exists.\n");
avp_delete("$avp(s:first_gw)/g");
}
if ( ! is_avp_set("$avp(s:first_gw)") )
{
if ( is_avp_set("$avp(s:second_gw)"))
{
avp_copy("$avp(s:second_gw)", "$avp(s:first_gw)/gd");
if ( is_avp_set("$avp(s:third_gw)"))
{
avp_copy("$avp(s:third_gw)", "$avp(s:second_gw)/gd");
}
}
else
{
xlog("L_INFO", "Out of gateways to try, dropping call.\n");
drop();
}
}
t_on_failure("1");
t_on_branch("1");
avp_pushto("$br","$avp(s:first_gw)"); # new branch for this uri
avp_delete("$avp(s:first_gw)");
# t_on_failure("2");
# t_on_branch("2");
# rewritehost("65.217.40.219");
xlog("L_INFO", "Now R-URI=$ru\n");
# append_branch();
route(1);
}
branch_route[1]
{
xlog("L_INFO", "In Branch_Route 1\n");
if(uri==myself)
{
xlog("L_INFO", "Dropping local branch - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
drop();
} else {
xlog("L_INFO", "In Branch_Route 1, Sending to=$ru\n");
if ( is_method("INVITE"))
route(6); # start media proxy
if ( is_method("CANCEL"))
route(7); # stop media proxy
}
}
branch_route[2]
{
xlog("L_INFO", "In Br_Rt2, Failed Domain=$avp(s:FailedAddr)\n");
if(uri==myself )
{
xlog("L_INFO", "Dropping local branch - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
drop();
} else {
xlog("L_INFO", "In Br_Rt2, Sending to=$ru Proto=$dP\n");
if ( is_method("INVITE"))
route(6); # start media proxy
if ( is_method("CANCEL"))
route(7); # stop media proxy
}
}