Dear ALL:
I think it is a very good chance to study Paul's ser.cfg file.
I use the 0.9.0 sample cfg and try to implement a call forward, busy
forward, no answer forward function.
But I got a 503 message when I use make a call from UA 1011 to UA
1022(registed on the same ser) with callforward to a PSTN .
But I have no voicemail option supported. So I must modify it.
In usr_preferences table:
username domain attribute value
-------------------------------------------------------------------------------------------------------------------
1022 ser.xxx.net.tw donotdisturb n
1022 ser.xxx.net.tw voicemail n
1022 ser.xxx.net.tw anoncallrej n
1022 ser.xxx.net.tw callidblock n
1022 ser.xxx.net.tw callfwd
0939749xxx(a)ser.xxx.net.tw
1022 ser.xxx.net.tw fwdnoanswer 0939749xxx(a)ser.xxx.net.tw
1022 ser.xxx.net.tw fwdbusy
0939749xxx(a)ser.xxx.net.tw
In grp table:
username domain grp
---------------------------------------------------
1022 ser.xxx.net.tw int
1011 ser.xxx.net.tw int
I don't know where to defind the 'dom' and 'int' or '-'
setting at DB table.
What is its table name?
domain ==> ser.xxx.net.tw (the same as caller and machine)
When I test this call forward, a UA 1011 call to 1022. It
It should be forward to a PSTN and use route(3) or route(6).
But when I do it, it seems failed at lookup("aliases") and
lookup("location") function.
Log list below:
---------------------------------------------------------------------------------------------------------
ser /usr/local/sbin/ser[9232]: SER: BLIND CALL FORWARDING
ser /usr/local/sbin/ser[9232]: SER: Check Forwarding Number Rules
ser /usr/local/sbin/ser[9232]: SER: Look aliases
ser /usr/local/sbin/ser[9232]: ERROR: parse_uri: bad uri, state 0
parsed: <0939> (4) / <0939749xxx(a)ser.xxx.net.tw> (27)
ser /usr/local/sbin/ser[9232]: extract_aor(): Error while parsing
Address of Record
ser /usr/local/sbin/ser[9232]: lookup(): Error while extracting
address of record
ser /usr/local/sbin/ser[9232]: SER: Look location
ser /usr/local/sbin/ser[9232]: ERROR: parse_uri: bad uri, state 0
parsed: <0939> (4) / <0939749xxx(a)ser.xxx.net.tw> (27)
ser /usr/local/sbin/ser[9232]: extract_aor(): Error while parsing
Address of Record
ser /usr/local/sbin/ser[9232]: lookup(): Error while extracting
address of record
ser /usr/local/sbin/ser[9232]: SER: 503 Service Unavailable
---------------------------------------------------------------------------------------------------------
If I delete the record callfwd of 1022 and want to test call noanswer forward.
It seems can not forward to a PSTN number and jump to route(3) or route(6).
It always keep the orginial rule and use route(2).
Also the error message "error: mediaproxy/sendMediaproxyCommand():
can't connect to MediaProxy" always displays at log file whether the
call is connected or failed call.
Log list below:
---------------------------------------------------------------------------------------------------------ser
/usr/local/sbin/ser[9233]: SER: BLIND CALL FORWARDING
ser /usr/local/sbin/ser[9233]: SER: Look aliases
ser /usr/local/sbin/ser[9233]: SER: Look location
ser /usr/local/sbin/ser[9233]: SER isflagset (sip)
ser /usr/local/sbin/ser[9233]: SER: Look aliases
ser /usr/local/sbin/ser[9233]: SER: Look location
ser /usr/local/sbin/ser[9233]: SER isflagset (sip)
ser /usr/local/sbin/ser[9233]: SER: SIP Call On-Net section route(2)
ser /usr/local/sbin/ser[9233]: error:
mediaproxy/sendMediaproxyCommand(): can't connect to MediaProxy
ser /usr/local/sbin/ser[9231]: error:
mediaproxy/sendMediaproxyCommand(): can't connect to MediaProxy
ser /usr/local/sbin/ser[9231]: SER: SIP Call On-Net section route(2)
ser /usr/local/sbin/ser[9234]: SER: Failure Route section failure_route(1)
ser /usr/local/sbin/ser[9234]: SER: fork to fwdnoanswer
ser /usr/local/sbin/ser[9234]: SER: No Answer Failure and Jump to route(2)
ser /usr/local/sbin/ser[9234]: SER: SIP Call On-Net section route(2)
ser /usr/local/sbin/ser[9234]: ERROR: parse_uri: bad uri, state 0
parsed: <0939> (4) / <0939749xxx(a)ser.xxx.net.tw> (27)
ser /usr/local/sbin/ser[9234]: ERROR: parse_sip_msg_uri: bad uri
<0939749xxx(a)ser.xxx.net.tw>
ser /usr/local/sbin/ser[9234]: error:
mediaproxy/getDestinationDomain(): error parsing destination URI
ser /usr/local/sbin/ser[9234]: ERROR: parse_uri: bad uri, state 0
parsed: <0939> (4) / <0939749xxx(a)ser.xxx.net.tw> (27)
ser /usr/local/sbin/ser[9234]: ERROR: parse_sip_msg_uri: bad uri
<0939749xxx(a)ser.xxx.net.tw>
ser /usr/local/sbin/ser[9234]: is_uri_host_local(): Error while parsing URI
ser /usr/local/sbin/ser[9234]: error:
mediaproxy/sendMediaproxyCommand(): can't connect to MediaProxy
ser /usr/local/sbin/ser[9234]: ERROR: parse_uri: bad uri, state 0
parsed: <0939> (4) / <0939749xxx(a)ser.xxx.net.tw> (27)
ser /usr/local/sbin/ser[9234]: ERROR: uri2proxy: bad_uri:
0939749xxx(a)ser.xxx.net.tw
ser /usr/local/sbin/ser[9234]: ERROR: t_forward_nonack: failure to add branches
ser /usr/local/sbin/ser[9234]: ERROR: w_t_relay (failure mode):
forwarding failed
ser /usr/local/sbin/ser[9234]: error:
mediaproxy/sendMediaproxyCommand(): can't connect to MediaProxy
ser /usr/local/sbin/ser[9234]: ERROR: sl_reply_error used: I'm
terribly sorry, server error occurred (1/SL)
ser /usr/local/sbin/ser[9231]: SER: SIP Call On-Net section route(2)
---------------------------------------------------------------------------------------------------------
My ser.cfg list below:
---------------------------------------------------------------------------------------------------------
debug=10 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
listen=99.99.99.99
alias=ser.xxx.net.tw
alias=ser
alias=99.99.99.99
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"
# ------------------ module loading ----------------------------------
..............(skip)
# ----------------- 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 --
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")
# ------------------------- 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;
};
# ------------------------------------------------------------------------
# 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);
};
# ------------------------------------------------------------------------
# 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;
};
# ------------------------------------------------------------------------
# NAT Test Section #1
# ------------------------------------------------------------------------
if (client_nat_test("3") && !search("^Record-Route:"))
{
force_rport();
fix_contact();
};
# ------------------------------------------------------------------------
# PSTN Section
# ------------------------------------------------------------------------
if (method=="INVITE") { ## Deny PSTN to 0204 and 095 of Taiwan
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()) {
# 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;
};
# ------------------------------------------------------------------------
# Speed Dialing Section
# ------------------------------------------------------------------------
if ((method=="INVITE") && (uri=~"^sip:[0-9]{2}@.*")) {
sd_lookup("speed_dial");
};
# ------------------------------------------------------------------------
# 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;
};
};
};
# ------------------------------------------------------------------------
# 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\n");
sl_send_reply("503", "Service
Unavailable");
break;
};
# test for domestic PSTN gateway
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 (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)) {
log(1, "SER: Start a PSTN call\n");
route(3);
} else {
log(1, "SER: 503 Service Unavailable\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("-", "$calltype");
# US international call
#if (uri=~"^sip:1[0-9]{10}@") {
# strip(1);
#};
# Call rejected
#if ((uri=~"^sip:70[1|2]@") || (uri=~"^sip:411@.*") ||
# (uri=~"^sip:911@.*") || (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;
};
# Error Message from this <================== ERROR
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:011[0-9]*@") {
} 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@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: Demestic 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
avp_write("i:45", "inv_timeout");
rewritehost("99.99.99.250");
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)) {
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@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.99.99.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: International 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("99.99.99.240");
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@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@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 (avp_check("$fwd_busy_type", "eq/dom/i")) {
# test for domestic PSTN gateway
log(1, "SER: Busy Failure and Jump to
route(3)\n");
route(3);
} else if (avp_check("$fwd_busy_type",
"eq/int/i")) {
# test for international PSTN gateway
log(1, "SER: Busy Failure and Jump to
route(6)\n");
route(6);
} 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_pushto("$ruri", "s:fwdnoanswer")) {
log(1, "SER: fork to fwdnoanswer\n");
avp_delete("s:fwdnoanswer");
append_branch();
resetflag(27);
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 (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;
};
}