[Serusers] Help when make a Call Busy Forward Failed? Does 'bestpractice' release??
Charles Wang
lazy.charles at gmail.com
Thu Feb 24 08:38:03 CET 2005
Dear Greger:
I call t_on_failure("1"); on my route[2] (this is SIP to SIP route).
If I make a SIP to SIP call failed, it should go to another route.
For example:
UA 1011 call 1022, and 1022 setting busy forward to PSTN(0939749xxx).
So, first route is route[2] (I setting t_on_failure("1") here), then
if busy condiction,
it will go to route[3](for PSTN).
I still can not understand where to add what you post before. So I add
my complete ser.cfg in this post.
Thank you for your kind.
Best Regard
Charles
ser.cfg:
---------------------------------------------------------------------------------------------------------
#
# $Id: ser.cfg,v 1.25 2004/11/30 16:28:24 andrei Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=10 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
/* Uncomment these lines to enter debugging mode
fork=no
log_stderror=yes
*/
listen=xxx.xxx.190.248
alias=ser.xxx.net.tw
alias=ser
alias=xxx.xxx.190.248
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=4
fifo_mode=0666
fifo="/tmp/ser_fifo"
fifo_db_url="mysql://ser:heslo@localhost/ser"
# mhomed -- enable calculation of outbound interface.
# useful on multihomed servers.
mhomed=0
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/lib/ser/modules/exec.so"
loadmodule "/usr/local/lib/ser/modules/avpops.so"
loadmodule "/usr/local/lib/ser/modules/domain.so"
loadmodule "/usr/local/lib/ser/modules/group.so"
loadmodule "/usr/local/lib/ser/modules/uri.so"
loadmodule "/usr/local/lib/ser/modules/uri_db.so"
loadmodule "/usr/local/lib/ser/modules/permissions.so"
loadmodule "/usr/local/lib/ser/modules/speeddial.so"
loadmodule "/usr/local/lib/ser/modules/acc.so"
loadmodule "/usr/local/lib/ser/modules/pdt.so"
loadmodule "/usr/local/lib/ser/modules/options.so"
loadmodule "/usr/local/lib/ser/modules/mediaproxy.so"
loadmodule "/usr/local/lib/ser/modules/xlog.so"
# ----------------- setting module-specific parameters ---------------
# -- mediaproxy params --
modparam("mediaproxy", "natping_interval", 30)
modparam("mediaproxy", "sip_asymmetrics",
"/usr/local/etc/ser/sip-asymmetric-clients")
modparam("mediaproxy", "rtp_asymmetrics",
"/usr/local/etc/ser/rtp-asymmetric-clients")
# -- usrloc params --
#
# 0 = disable
# 1 = write-through
# 2 = write-back
#
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "timer_interval", 60)
modparam("usrloc", "desc_time_order", 1)
# -- auth params --
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
# -- db_url params --
modparam("acc|auth_db|domain|group|permissions|speeddial|uri_db|usrloc|pdt",
"db_url", "mysql://ser:heslo@localhost/ser")
# -- use_domain params --
modparam("auth_db|group|registrar|speeddial|uri_db|usrloc", "use_domain", 0)
# -- permissions params --
modparam("permissions", "db_mode", 1)
modparam("permissions", "trusted_table", "trusted")
# -- accounting params --
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 1)
modparam("acc", "log_fmt", "cdfimorstup")
modparam("acc", "log_level", 1)
modparam("acc", "failed_transactions", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "report_ack", 0)
# -- domain params --
modparam("domain", "db_mode", 1)
# ------------- exec parameters
modparam("exec", "setvars", 1)
modparam("exec", "time_to_kill", 10)
# -- registration params --
modparam("registrar", "nat_flag", 2)
modparam("registrar", "min_expires", 60)
modparam("registrar", "max_expires", 86400)
modparam("registrar", "default_expires", 3600)
modparam("registrar", "append_branches", 1)
# -- avp params --
modparam("avpops", "avp_url", "mysql://ser:heslo@localhost/ser")
modparam("avpops", "avp_table", "usr_preferences")
#modparam("avpops", "use_domain", "1")
modparam("avpops", "uuid_column", "uuid")
modparam("avpops", "username_column", "username")
modparam("avpops", "domain_column", "domain")
modparam("avpops", "attribute_column", "attribute")
modparam("avpops", "value_column", "value")
modparam("avpops", "type_column", "type")
modparam("avpops", "avp_aliases",
"voicemail=i:500;calltype=i:700;fwd_no_answer_type=i:701;fwd_busy_type=i:702")
# To use more than one tables example
#modparam("avpops", "db_scheme",
"scheme1:table=subscriber;uuid_column=uuid;value_column=first_name")
# -- tm params --
modparam("tm", "fr_timer", 15)
modparam("tm", "fr_inv_timer", 22)
modparam("tm", "wt_timer", 5)
modparam("tm", "fr_inv_timer_avp", "inv_timeout")
# -- pdt params --
modparam("pdt", "db_table", "prefix_domain")
modparam("pdt", "prefix", "")
modparam("pdt", "hsize_2pow", 2)
modparam("pdt", "sync_time", 300)
modparam("pdt", "clean_time", 600)
# -- logging params
modparam("xlog", "buf_size", 8192)
# -- group params --
modparam("group", "table", "grp")
modparam("group", "user_column", "username")
modparam("group", "domain_column", "domain")
modparam("group", "group_column", "grp")
# -- speeddial params --
modparam("speeddial", "user_column", "username")
modparam("speeddial", "domain_column", "domain")
modparam("speeddial", "sd_user_column", "username_from_req_uri")
modparam("speeddial", "sd_domain_column", "domain_from_req_uri")
modparam("speeddial", "new_uri_column", "new_request_uri")
modparam("speeddial", "domain_prefix", "tel")
#modparam("auth", "rpid_prefix", "Antek SIP <sip:")
#modparam("auth", "rpid_suffix",
"@ser.xxx.net.tw;user=phone>;party=calling;screen=no;privacy=on")
# ------------------------- request routing logic -------------------
# main routing logic
route {
# ------------------------------------------------------------------------
# Sanity Check Section
# ------------------------------------------------------------------------
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483", "Too Many Hops");
break;
};
if (msg:len > max_len) {
sl_send_reply("513", "Message Overflow");
break;
};
# ------------------------------------------------------------------------
# NOTIFY Keep-Alive Section
# ------------------------------------------------------------------------
if ((method=="NOTIFY") && search("^Event: keep-alive")) {
sl_send_reply("200", "OK");
break;
};
#if ((method=="NOTIFY") && (uri=~"^sip:700@")) {
# sl_send_reply("200", "OK");
# break;
#};
# ------------------------------------------------------------------------
# NOTIFY Message-Summary Section
#
# Event: Message-Summary is used to control the message waiting indicator
# ------------------------------------------------------------------------
#if ((method=="NOTIFY") && (src_ip=="99.99.99.100") &&
search("^Event: message-summary")) {
# if (lookup("location")) {
# t_relay();
# };
# break;
#};
# ------------------------------------------------------------------------
# OPTIONS Section
# ------------------------------------------------------------------------
if (method=="OPTIONS") {
options_reply();
break;
};
# ------------------------------------------------------------------------
# NAT Test Section #1
# ------------------------------------------------------------------------
if (method=="REGISTER" && client_nat_test("3")) {
fix_contact();
force_rport();
setflag(2);
};
# ------------------------------------------------------------------------
# Click2Dial Section # 14
# ------------------------------------------------------------------------
#if (src_ip=="99.99.99.99" && (search("^From: <sip:700@") ||
search("^To: <sip:700@"))) {
# setflag(14);
#};
# ------------------------------------------------------------------------
# Registration Section
# ------------------------------------------------------------------------
if (method=="REGISTER") {
# allow all requests from user 700 - the Click2Dial controller
if (!isflagset(14)) {
if (!is_from_local()) {
sl_send_reply("403", "Unknown Domain");
break;
};
if (!www_authorize("", "subscriber")) {
www_challenge("", "0");
break;
};
if (!check_to()) {
sl_send_reply("401", "Unauthorized");
break;
};
# To - Use To username and (optionally) domain to check
if (is_user_in("To", "demo-disabled")) {
sl_send_reply("403", "Your evaluation period has expired");
break;
};
# To - Use To username and (optionally) domain to check
if (is_user_in("To", "disabled")) {
sl_send_reply("403", "Your account has been disabled");
break;
};
};
# snom sip phones use this header to start their
# keep-alive mechanism for NAT bindings
append_to_reply("P-NAT-Refresh: 15\r\n");
if (!save("location")) {
sl_reply_error();
};
break;
};
# ------------------------------------------------------------------------
# Accounting Section # 1
#
# NOTE: We test for flag 14 because we do not want to record Click2Dial
# entries
# ------------------------------------------------------------------------
if ((method=="INVITE" || method=="BYE") && !isflagset(14)) {
setflag(1);
};
# ------------------------------------------------------------------------
# NAT Tear-Down Section
# ------------------------------------------------------------------------
if ((method == "BYE" || method == "CANCEL")) {
end_media_session();
};
# ------------------------------------------------------------------------
# Record Route Section
#
# 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 (!method=="REGISTER") {
record_route();
};
# ------------------------------------------------------------------------
# Loose Route Section
#
# Grant route routing if route headers present
# ------------------------------------------------------------------------
if (loose_route()) {
route(2);
break;
};
# ------------------------------------------------------------------------
# Prefix To Domain Section
#
# Convert the prefix defined on grp table to its own domain name
# ------------------------------------------------------------------------
prefix2domain();
# ------------------------------------------------------------------------
# Message Waiting Indicator SUBSCRIBE Section
#
# Make sure all SUBSCRIBE messages with header "Event: message-summary"
# are sent to the voicemail server
# ------------------------------------------------------------------------
if ((method=="SUBSCRIBE") && search("^Event: message-summary")) {
rewritehostport("xxx.xxx.190.243:5060");
t_relay();
break;
};
# ------------------------------------------------------------------------
# NAT Test Section #1
# ------------------------------------------------------------------------
if (client_nat_test("3") && !search("^Record-Route:")) {
force_rport();
fix_contact();
};
# ------------------------------------------------------------------------
# Enhanced Voicemail Applications Section
#
# Access additional Asterisk applications at extension 701 and 702
# ------------------------------------------------------------------------
#if (uri=~"^sip:70[1|2]@") {
# route(5);
# break;
#};
# ------------------------------------------------------------------------
# PSTN Section
# ------------------------------------------------------------------------
#
# This is an example of US phone call.
#
#if (method=="INVITE") {
# if (uri=~"^sip:1[0-9]{10}@") {
# strip(1);
# };
# if ((uri=~"^sip:911 at .*") || (uri=~"^sip:900[0-9]{7}@") ||
(uri=~"^sip:976[0-9]{7}@")) {
# sl_send_reply("503", "Service Unavailable");
# break;
# };
#};
if (method=="INVITE") { ## Deny PSTN to 0204 and 095 on Tawan
if ((uri=~"^sip:0204[0-9]*@") || (uri=~"^sip:095[0-9]*@")) {
sl_send_reply("503", "Service Unavailable");
break;
};
};
# ------------------------------------------------------------------------
# Alias Routing Section
# ------------------------------------------------------------------------
lookup("aliases");
if (!uri==myself) {
route(2);
break;
};
# ------------------------------------------------------------------------
# Load ACL Section
# ------------------------------------------------------------------------
if (method=="INVITE" && !isflagset(14)) {
xlog("L_ERR", "Time:[%Tf] Method:<%rm> r-uri:<%ru>\n");
xlog("L_ERR", "IP:<%is> From:<%fu> To:<%tu> %ct\n");
#if (is_user_in("Request-URI", "voicemail")) {
# setflag(31);
#};
if (is_from_local() || is_uri_host_local()) {
#if (is_user_in("From", "411")) {
# setflag(30); ## some call from directory service
#};
# Check user from grp table
if (is_user_in("From", "int")) {
log(1, "SER: a INT user\n");
setflag(29);
};
if (is_user_in("From", "free-pstn")) {
log(1, "SER: a FREE-PSTN user\n");
setflag(28);
};
if (avp_db_load("$from/username", "s:callidblock")) {
if (avp_check("s:callidblock", "eq/y/i")) {
setflag(25);
};
};
};
if (avp_db_load("$ruri/username", "s:anoncallrej")) {
if (avp_check("s:anoncallrej", "eq/y/i")) {
log(1, "SER: a ANON-CALL-REJ user\n");
setflag(24);
};
};
};
# ------------------------------------------------------------------------
# Anonymous Call Rejection Section # 24
# ------------------------------------------------------------------------
if (isflagset(24) && (method=="INVITE") &&
search("^(f|F)rom:.*(a|A)nonymous")) {
route(8);
break;
};
# ------------------------------------------------------------------------
# 411 Directory Assistance Section # 30
# ------------------------------------------------------------------------
#if (method=="INVITE" && uri=~"^sip:411 at .*") {
# if (isflagset(30)) {
# avp_write("$from", "i:34");
# avp_pushto("$ruri", "i:34");
# strip_tail(7);
# subst_uri('/^sip:([0-9]+)@(.*)$/sip:\15551212@\2/i');
# avp_delete("i:34");
# route(3);
# break;
# };
# sl_send_reply("503", "Service Unavailable");
# break;
#};
# ------------------------------------------------------------------------
# Speed Dialing Section
# ------------------------------------------------------------------------
if ((method=="INVITE") && (uri=~"^sip:[0-9]{2}@.*")) {
sd_lookup("speed_dial");
};
# ------------------------------------------------------------------------
# 011 International Call Section # 29
# ------------------------------------------------------------------------
#if (method=="INVITE" && uri=~"^sip:011[0-9]*@") {
# if (isflagset(29)) {
# route(6);
# } else {
# sl_send_reply("503", "Service Unavailable");
# };
# break;
#};
# ------------------------------------------------------------------------
# 002 International Call Section # 29
# ------------------------------------------------------------------------
if (method=="INVITE" && uri=~"^sip:002[0-9]*@") {
if (isflagset(29)) {
log(1, "SER: an International Call route(6)\n");
route(6);
} else {
sl_send_reply("503", "Service Unavailable");
};
break;
};
# ------------------------------------------------------------------------
# 0XXXXXXXXX Domestic Call Section # 29
# ------------------------------------------------------------------------
if (method=="INVITE" && uri=~"^sip:0[0-9]{9}@") {
if (isflagset(29)) {
log(1, "SER: a Domestic Call route(6)\n");
route(6);
} else {
sl_send_reply("503", "Service Unavailable");
};
break;
};
# ------------------------------------------------------------------------
# URI Compare Section
#
# Here we compare the "from" and "to" to see if the caller is dialing
# their own extension. If so then we route to voicemail(31) if needed
# ------------------------------------------------------------------------
if (method=="INVITE") {
avp_write("$from", "i:34");
if (avp_check("i:34", "eq/$ruri/i")) {
if (isflagset(31)) {
route(5);
break;
} else {
sl_send_reply("486", "Busy");
break;
};
};
};
# ------------------------------------------------------------------------
# Call Block Section
# ------------------------------------------------------------------------
#if (is_caller_blocked()) {
# route(7);
# break;
#};
# ------------------------------------------------------------------------
# Do Not Disturb Section
# ------------------------------------------------------------------------
if (avp_db_load("$ruri/username", "s:donotdisturb")) {
if (avp_check("s:donotdisturb", "eq/y/i")) {
route(5);
break;
};
};
# ------------------------------------------------------------------------
# Blind Call Forwarding Section
# ------------------------------------------------------------------------
if (method=="INVITE") {
log(1, "SER: BLIND CALL FORWARDING\n");
# here we must store the current (aka original) R-URI because if
# we set call forwarding and the forwarded number is busy then we
# need to use this original R-URI to determine which voicemail
# box we should go to
if (isflagset(31)) {
avp_write("$ruri", "$voicemail");
};
if (avp_db_load("$ruri/username", "s:callfwd")) {
avp_pushto("$ruri", "s:callfwd");
# lookup the call fowarding number to see if it is a served
# sip number or a PSTN number
# check forwarding number rules
log(1, "SER: Check Forwarding Number Rules\n");
route(1);
#if (avp_check("$calltype", "eq/-/i")) {
# log(1, "SER: 503 Service Unavailable 1\n");
# sl_send_reply("503", "Service Unavailable");
# break;
#};
# test for domestic PSTN gateway
if (uri=~"^sip:0[1-9]{9}@") {
#if (avp_check("$calltype", "eq/dom/i")) {
log(1, "SER: Start a domestic PSTN call route(3)\n");
route(3);
break;
};
# test for international PSTN gateway
if (uri=~"^sip:002[1-9]*@") {
# if (avp_check("$calltype", "eq/int/i")) {
log(1, "SER: Start an international PSTN call route(6)\n");
route(6);
break;
};
};
};
# ------------------------------------------------------------------------
# Call Routing Section
# ------------------------------------------------------------------------
if (!lookup("location")) {
# if flag 31 (ie voicemail) is set and we made it here this means
# the user's phone is not registered anywhere. We'll forward to
# voicemail after this block because we need to check the call
# forward settings first
if (isflagset(31)) {
# flag 19 means the user has voicemail but is not online
# so we need to remember to send to voicemail if call
# forwarding is not enabled
setflag(19);
};
if (method=="INVITE") {
if (does_uri_exist()) {
# subscriber record found, but they're offline
log(1, "SER: Temporarily Unavailable\n");
sl_send_reply("480", "Temporarily Unavailable");
break;
};
if (uri=~"^sip:0[0-9]{9}@") {
# Send to PSTN Gateway
if (isflagset(28) || (is_user_in("From", "int")) ||
(is_user_in("From", "free-pstn"))) {
log(1, "SER: Start a PSTN call\n");
route(3);
} else {
log(1, "SER: 503 Service Unavailable 2\n");
sl_send_reply("503", "Service Unavailable");
};
break;
};
sl_send_reply("404", "User Not Found");
break;
};
};
# ------------------------------------------------------------------------
# Call Forwarding Section
# ------------------------------------------------------------------------
if (method=="INVITE") {
# save R-URI in a temp AVP for later use
avp_write("$ruri", "i:99");
# only load the forward no answer option if voice mail is not enabled
if (!isflagset(31)) {
if (avp_db_load("$ruri/username", "s:fwdnoanswer")) {
route(1);
#if (!avp_check("$calltype", "eq/-/i")) {
# if (avp_check("$calltype", "eq/dom/i")) {
# avp_write("dom", "$fwd_no_answer_type");
# } else if (avp_check("$calltype", "eq/int/i")) {
# avp_write("int", "$fwd_no_answer_type");
# } else {
# avp_write("sip", "$fwd_no_answer_type");
# }
setflag(27);
#};
};
};
if (avp_db_load("$ruri/username", "s:fwdbusy")) {
route(1);
#if (!avp_check("$calltype", "eq/-/i")) {
# if (avp_check("$calltype", "eq/dom/i")) {
# avp_write("dom", "$fwd_busy_type");
# } else if (avp_check("$calltype", "eq/int/i")) {
# avp_write("int", "$fwd_busy_type");
# } else {
# avp_write("sip", "$fwd_busy_type");
# }
setflag(26);
#};
};
avp_pushto("$ruri", "i:99");
};
if (isflagset(19)) {
# send to voicemail
route(5);
} else {
route(2);
};
}
route[1] {
# Here we have route checks for all the call forwarding stuff.
# The return values are passed as AVP $calltype as follows:
#
# "-" = R-URI is not allowed
# "dom" = R-RURI is a domestic call
# "int" = R-RURI is an international call
# "sip" = R-RURI is a sip call
avp_write("sip", "$calltype");
# US international call
#if (uri=~"^sip:1[0-9]{10}@") {
# strip(1);
#};
# Call rejected
#if ((uri=~"^sip:70[1|2]@") || (uri=~"^sip:411 at .*") ||
# (uri=~"^sip:911 at .*") || (uri=~"^sip:900[0-9]{7}@") ||
# (uri=~"^sip:976[0-9]{7}@")) {
# break;
#};
if ((uri=~"^sip:0204[0-9]*@") ||
(uri=~"^sip:095[0-9]*@") ||
(uri=~"^sip:[0-9]{3}@")) {
break;
};
log(1, "SER: Look aliases\n");
lookup("aliases");
log(1, "SER: Look location\n");
if (!lookup("location")) {
if (uri=~"^sip:0[0-9]{9}@") {
# test for domestic PSTN number
if (isflagset(28)) {
log(1, "SER isflagset 28 (domestic)\n");
avp_write("dom", "$calltype");
};
} else if (uri=~"^sip:002[0-9]*@") {
# test for international PSTN number
if (isflagset(29)) {
log(1, "SER isflagset 29 (int)\n");
avp_write("int", "$calltype");
};
};
break;
};
log(1, "SER isflagset (sip)\n");
avp_write("sip", "$calltype");
}
route[2] {
log(1, "SER: SIP Call On-Net section route(2)\n");
if ((method=="INVITE") && !allow_trusted()) {
if (!proxy_authorize("", "subscriber")) {
proxy_challenge("", "0");
break;
} else if (!check_from()) {
log(1, "Spoofed SIP call attempt");
sl_send_reply("403", "Use From=ID");
break;
} else if (!(is_from_local() || is_uri_host_local())) {
sl_send_reply("403", "Please register to use our service");
break;
};
};
if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)" &&
!search("^Route:")){
sl_send_reply("479", "We don't forward to private IP addresses");
break;
};
if (isflagset(25)) {
replace("^From:(.*)>" , "From: \"Anonymous\"
<sip:someone at anonymous.invalid>");
};
if (method=="INVITE" || method=="ACK") {
use_media_proxy();
};
t_on_failure("1");
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
route[3] {
log(1, "SER: International Call Off-Net section route(3)\n");
# All Domestic Calls Go To CISCO 5300
if (method=="INVITE") {
if (!proxy_authorize("", "subscriber")) {
proxy_challenge("", "0");
break;
} else if (!check_from()) {
log(1, "Spoofed SIP call attempt");
sl_send_reply("403", "Use From=ID");
break;
} else if (!(is_from_local() || is_uri_host_local())) {
sl_send_reply("403", "Please register to use our service");
break;
};
# enable caller id blocking for PSTN calls
if (isflagset(25)) {
append_rpid_hf();
};
};
# SIP->PSTN calls get 45 seconds to timeout
log(1, "SER: Connecting to PSTN.....\n");
avp_write("i:45", "inv_timeout");
rewritehost("xxx.xxx.190.243");
#rewritehostport("xxx.xxx.190.248:5065");
if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)" &&
!search("^Route:")){
sl_send_reply("479", "We don't forward to private IP addresses");
break;
};
if (method=="INVITE" || method=="ACK") {
use_media_proxy();
};
if (isflagset(31)) { # is voice mail?
t_on_failure("1");
};
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
route[4] {
log(1, "SER: Voice Mail section route(4)\n");
# voicemail route #1
#
# this path this executed during these conditions:
#
# cond 1) the called number is in the location table
# but the callee did not answer the phone
# (ie, failover to voicemail)
if (isflagset(25)) {
replace("^From:(.*)>" , "From: \"Anonymous\"
<sip:someone at anonymous.invalid>");
};
rewritehostport("99.99.99.100:5060");
append_branch();
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
route[5] {
log(1, "SER: Voice Mail section route(5)\n");
# voicemail route #2
#
# this path this executed during these conditions:
#
# cond 1) the called number is not in the location table
# cond 2) the from_uri == to_uri (ie, caller==callee)
if (method=="INVITE" || method=="ACK") {
use_media_proxy();
};
rewritehostport("99.999.100:5060");
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
route[6] {
log(1, "SER: Domestic Call Off-Net section route(6)\n");
# All International Calls Go To CISCO 5300
if (method=="INVITE") {
if (!proxy_authorize("", "subscriber")) {
proxy_challenge("", "0");
break;
} else if (!check_from()) {
log(1, "Spoofed SIP call attempt");
sl_send_reply("403", "Use From=ID");
break;
} else if (!(is_from_local() || is_uri_host_local())) {
sl_send_reply("403", "Please register to use our service");
break;
};
# enable caller id blocking for PSTN calls
if (isflagset(25)) {
append_rpid_hf();
};
};
# SIP->PSTN calls get 45 seconds to timeout
avp_write("i:45", "inv_timeout");
rewritehost("xxx.xxx.190.243");
#rewritehostport("xxx.xxx.190.248:5065");
if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)" &&
!search("^Route:")){
sl_send_reply("479", "We don't forward to private IP addresses");
break;
};
if (method=="INVITE" || method=="ACK") {
use_media_proxy();
};
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
route[7] {
log(1, "SER: Caller Blocked section route(7)\n");
# caller blocked announcment
#
# this path this executed if a caller has been blocked
if (method=="INVITE" || method=="ACK") {
use_media_proxy();
};
rewriteuri("sip:699 at 99.99.99.100:5060");
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
route[8] {
log(1, "SER: Anonymous Call Rejection section route(8)\n");
# anonymous call rejection announcment
#
# this path this executed for anonymous callers
if (method=="INVITE" || method=="ACK") {
use_media_proxy();
};
rewriteuri("sip:698 at 99.99.99.100:5060");
t_on_reply("1");
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
sl_reply_error();
};
}
onreply_route[1] {
# Not all 2xx messages have a content body so here we
# make sure our Content-Length > 0 to avoid a parse error
if (status=~"(180)|(183)|2[0-9][0-9]") {
if (!search("^Content-Length:\ 0")) {
use_media_proxy();
};
};
if (client_nat_test("1")) {
fix_contact();
};
}
failure_route[1] {
log(1, "SER: Failure Route section failure_route(1)\n");
# if caller hung up then don't sent to voicemail
if (t_check_status("487")) {
break;
};
if (isflagset(26) && t_check_status("486")) {
# forward busy is flag 26
if (avp_pushto("$ruri", "s:fwdbusy")) {
log(1, "SER: fork to fwdbusy\n");
avp_delete("s:fwdbusy");
append_branch();
resetflag(26);
# test for domestic PSTN gateway
if (uri=~"^sip:0[0-9]{9}@") {
# if (avp_check("$fwd_busy_type", "eq/dom/i")) {
# test for domestic PSTN gateway
log(1, "SER: Busy Failure and Jump to route(6)\n");
route(6);
} else if (uri=~"^sip:002[1-9][0-9]*@") {
# } else if (avp_check("$fwd_busy_type", "eq/int/i")) {
# test for international PSTN gateway
log(1, "SER: Busy Failure and Jump to route(3)\n");
route(3);
} else {
# default to sip call
log(1, "SER: Busy Failure and Jump to route(2)\n");
route(2);
};
break;
};
};
# here we can have either voicemail __OR__ forward no answer
if (isflagset(27) && t_check_status("408")) {
# forward no answer is flag 27
if (avp_db_load("$ruri/username", "s:fwdnoanswer")) {
avp_pushto("$ruri", "s:fwdnoanswer");
log(1, "SER: fork to fwdnoanswer\n");
avp_delete("s:fwdnoanswer");
append_branch();
resetflag(27);
if (uri=~"^sip:0[0-9]{9}@") {
# if (avp_check("$fwd_no_answer_type", "eq/dom/i")) {
# test for domestic PSTN gateway
log(1, "SER: No Answer Failure and Jump to route(3)\n");
route(3);
} else if (uri=~"^sip:002[1-9][0-9]*@") {
# } else if (avp_check("$fwd_no_answer_type", "eq/int/i")) {
# test for international PSTN gateway
log(1, "SER: No Answer Failure and Jump to route(6)\n");
route(6);
} else {
# default to sip call
log(1, "SER: No Answer Failure and Jump to route(2)\n");
route(2);
};
break;
};
} else if (isflagset(31) && avp_pushto("$ruri", "$voicemail")) {
avp_delete("$voicemail");
log(1, "SER: No Answer Failure and Jump to route(4)\n");
route(4);
break;
};
}
More information about the sr-users
mailing list