<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
<br>
On 12/30/10 6:42 PM, Tim King wrote:
<blockquote
cite="mid:AANLkTi=JX1p+Z_bUyYGaGA_Xt1UHwRBAw2tq=BVe-2VH@mail.gmail.com"
type="cite">Below is my current code and my calls are just getting
100 trying -- your call is important to us even between to locally
registered extension. Any guidance as to how to simplify
troubleshooting this routing?<br>
</blockquote>
<br>
100 trying is send automatically by t_relay(). If you want to skip
that, see the tm module parameters and functions.<br>
<br>
The 100 is intended to stop retransmissions from sender and it is
recommended to have.<br>
<br>
Cheers,<br>
Daniel<br>
<br>
<blockquote
cite="mid:AANLkTi=JX1p+Z_bUyYGaGA_Xt1UHwRBAw2tq=BVe-2VH@mail.gmail.com"
type="cite"><br>
<br>
####### Routing Logic ########<br>
<br>
<br>
# Main SIP request routing logic<br>
# - processing of any incoming SIP request starts with this route<br>
route {<br>
<br>
# per request initial checks<br>
route(REQINIT);<br>
<br>
# NAT detection<br>
route(NAT);<br>
<br>
# handle requests within SIP dialogs<br>
route(WITHINDLG);<br>
<br>
### only initial requests (no To tag)<br>
<br>
# CANCEL processing<br>
if (is_method("CANCEL"))<br>
{<br>
if (t_check_trans())<br>
t_relay();<br>
exit;<br>
}<br>
<br>
t_check_trans();<br>
<br>
# authentication<br>
route(AUTH);<br>
<br>
# record routing for dialog forming requests (in case they
are routed)<br>
# - remove preloaded route headers<br>
remove_hf("Route");<br>
if (is_method("INVITE|SUBSCRIBE")
<div id=":1y4">
)<br>
record_route();<br>
<br>
# account only INVITEs<br>
if (is_method("INVITE"))<br>
{<br>
setflag(FLT_ACC); # do accounting<br>
}<br>
<br>
# dispatch requests to foreign domains<br>
route(SIPOUT);<br>
<br>
### requests for my local domains<br>
<br>
# handle presence related requests<br>
route(PRESENCE);<br>
<br>
# handle registrations<br>
route(REGISTRAR);<br>
<br>
if ($rU==$null)<br>
{<br>
# request with no Username in RURI<br>
sl_send_reply("484","Address Incomplete");<br>
exit;<br>
}<br>
<br>
<br>
#!ifdef WITH_FREESWITCH<br>
# save callee ID<br>
$avp(callee) = $rU;<br>
route(FSDISPATCH);<br>
#!endif<br>
<br>
# user location service<br>
route(LOCATION);<br>
<br>
route(RELAY);<br>
}<br>
<br>
<br>
route[RELAY] {<br>
#!ifdef WITH_NAT<br>
if (check_route_param("nat=yes")) {<br>
setbflag(FLB_NATB);<br>
}<br>
if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {<br>
route(RTPPROXY);<br>
}<br>
#!endif<br>
<br>
#!ifdef WITH_CFGSAMPLES<br>
/* example how to enable some additional event routes */<br>
if (is_method("INVITE")) {<br>
#t_on_branch("BRANCH_ONE");<br>
t_on_reply("REPLY_ONE");<br>
t_on_failure("FAIL_ONE");<br>
}<br>
#!endif<br>
<br>
if (!t_relay()) {<br>
sl_reply_error();<br>
}<br>
exit;<br>
}<br>
<br>
# Per SIP request initial checks<br>
route[REQINIT] {<br>
#!ifdef WITH_ANTIFLOOD<br>
# flood dection from same IP and traffic ban for a while<br>
# be sure you exclude checking trusted peers, such as
pstn gateways<br>
# - local host excluded (e.g., loop to self)<br>
if(src_ip!=myself)<br>
{<br>
if($sht(ipban=>$si)!=$null)<br>
{<br>
# ip is already blocked<br>
xdbg("request from blocked IP - $rm from
$fu (IP:$si:$sp)\n");<br>
exit;<br>
}<br>
if (!pike_check_req())<br>
{<br>
xlog("L_ALERT","ALERT: pike blocking $rm
from $fu (IP:$si:$sp)\n");<br>
$sht(ipban=>$si) = 1;<br>
exit;<br>
}<br>
}<br>
#!endif<br>
<br>
if (!mf_process_maxfwd_header("10")) {<br>
sl_send_reply("483","Too Many Hops");<br>
exit;<br>
}<br>
<br>
if(!sanity_check("1511", "7"))<br>
{<br>
xlog("Malformed SIP message from $si:$sp\n");<br>
exit;<br>
}<br>
}<br>
<br>
# Handle requests within SIP dialogs<br>
route[WITHINDLG] {<br>
if (has_totag()) {<br>
# sequential request withing a dialog should<br>
# take the path determined by record-routing<br>
if (loose_route()) {<br>
if (is_method("BYE")) {<br>
setflag(FLT_ACC); # do
accounting ...<br>
setflag(FLT_ACCFAILED); # ...
even if the transaction fails<br>
}<br>
route(RELAY);<br>
} else {<br>
if (is_method("SUBSCRIBE") &&
uri == myself) {<br>
# in-dialog subscribe requests<br>
route(PRESENCE);<br>
exit;<br>
}<br>
if ( is_method("ACK") ) {<br>
if ( t_check_trans() ) {<br>
# no loose-route, but
stateful ACK;<br>
# must be an ACK after a
487<br>
# or e.g. 404 from
upstream server<br>
t_relay();<br>
exit;<br>
} else {<br>
# ACK without matching
transaction ... ignore and discard<br>
exit;<br>
}<br>
}<br>
sl_send_reply("404","Not here");<br>
}<br>
exit;<br>
}<br>
}<br>
<br>
# Handle SIP registrations<br>
route[REGISTRAR] {<br>
if (is_method("REGISTER"))<br>
{<br>
if(isflagset(FLT_NATS))<br>
{<br>
setbflag(FLB_NATB);<br>
# uncomment next line to do SIP NAT
pinging<br>
## setbflag(FLB_NATSIPPING);<br>
}<br>
if (!save("location"))<br>
sl_reply_error();<br>
<br>
exit;<br>
}<br>
}<br>
<br>
# USER location service<br>
route[LOCATION] {<br>
<br>
#!ifdef WITH_ALIASDB<br>
# search in DB-based aliases<br>
alias_db_lookup("dbaliases");<br>
#!endif<br>
<br>
if (!lookup("location")) {<br>
switch ($rc) {<br>
case -1:<br>
case -3:<br>
t_newtran();<br>
t_reply("404", "Not Found");<br>
exit;<br>
case -2:<br>
sl_send_reply("405", "Method Not
Allowed");<br>
exit;<br>
}<br>
}<br>
<br>
# when routing via usrloc, log the missed calls also<br>
if (is_method("INVITE"))<br>
{<br>
setflag(FLT_ACCMISSED);<br>
}<br>
}<br>
<br>
# Presence server route<br>
route[PRESENCE] {<br>
if(!is_method("PUBLISH|SUBSCRIBE"))<br>
return;<br>
<br>
#!ifdef WITH_PRESENCE<br>
if (!t_newtran())<br>
{<br>
sl_reply_error();<br>
exit;<br>
};<br>
<br>
if(is_method("PUBLISH"))<br>
{<br>
handle_publish();<br>
t_release();<br>
}<br>
else<br>
if( is_method("SUBSCRIBE"))<br>
{<br>
handle_subscribe();<br>
t_release();<br>
}<br>
exit;<br>
#!endif<br>
<br>
# if presence enabled, this part will not be executed<br>
if (is_method("PUBLISH") || $rU==$null)<br>
{<br>
sl_send_reply("404", "Not here");<br>
exit;<br>
}<br>
return;<br>
}<br>
<br>
# Authentication route<br>
route[AUTH] {<br>
#!ifdef WITH_AUTH<br>
if (is_method("REGISTER"))<br>
{<br>
# authenticate the REGISTER requests (uncomment
to enable auth)<br>
if (!www_authorize("$td", "subscriber"))<br>
{<br>
www_challenge("$td", "0");<br>
exit;<br>
}<br>
<br>
if ($au!=$tU)<br>
{<br>
sl_send_reply("403","Forbidden auth
ID");<br>
exit;<br>
}<br>
} else {<br>
<br>
#!ifdef WITH_FREESWITCH<br>
if(route(FSINBOUND))<br>
return;<br>
#!endif<br>
<br>
#!ifdef WITH_IPAUTH<br>
if(allow_source_address())<br>
{<br>
# source IP allowed<br>
return;<br>
}<br>
#!endif<br>
<br>
# authenticate if from local subscriber<br>
if (from_uri==myself)<br>
{<br>
if (!proxy_authorize("$fd",
"subscriber")) {<br>
proxy_challenge("$fd", "0");<br>
exit;<br>
}<br>
if (is_method("PUBLISH"))<br>
{<br>
if ($au!=$tU) {<br>
sl_send_reply("403","Forbidden auth ID");<br>
exit;<br>
}<br>
} else {<br>
if ($au!=$fU) {<br>
sl_send_reply("403","Forbidden auth ID");<br>
exit;<br>
}<br>
}<br>
<br>
consume_credentials();<br>
# caller authenticated<br>
} else {<br>
# caller is not local subscriber, then
check if it calls<br>
# a local destination, otherwise deny,
not an open relay here<br>
if (!uri==myself)<br>
{<br>
sl_send_reply("403","Not
relaying");<br>
exit;<br>
}<br>
}<br>
}<br>
#!endif<br>
return;<br>
}<br>
<br>
# Caller NAT detection route<br>
route[NAT] {<br>
#!ifdef WITH_NAT<br>
force_rport();<br>
if (nat_uac_test("19")) {<br>
if (method=="REGISTER") {<br>
fix_nated_register();<br>
} else {<br>
fix_nated_contact();<br>
}<br>
setflag(FLT_NATS);<br>
}<br>
#!endif<br>
return;<br>
}<br>
<br>
# RTPProxy control<br>
route[RTPPROXY] {<br>
#!ifdef WITH_NAT<br>
if (is_method("BYE")) {<br>
unforce_rtp_proxy();<br>
} else if (is_method("INVITE")){<br>
force_rtp_proxy();<br>
}<br>
if (!has_totag()) add_rr_param(";nat=yes");<br>
#!endif<br>
return;<br>
}<br>
<br>
# Routing to foreign domains<br>
route[SIPOUT] {<br>
if (!uri==myself)<br>
{<br>
append_hf("P-hint: outbound\r\n");<br>
route(RELAY);<br>
}<br>
}<br>
<br>
<br>
#!ifdef WITH_FREESWITCH<br>
# FreeSWITCH routing blocks<br>
route[FSINBOUND] {<br>
if($si== $sel(cfg_get.freeswitch.bindip)<br>
&&
$sp==$sel(cfg_get.freeswitch.bindport))<br>
return 1;<br>
return -1;<br>
}<br>
<br>
route[FSDISPATCH] {<br>
if(!is_method("INVITE"))<br>
return;<br>
if(route(FSINBOUND))<br>
return;<br>
<br>
# dial number selection<br>
switch($rU) {<br>
case /"^41$":<br>
# 41 - voicebox menu<br>
# allow only authenticated users<br>
if($au==$null)<br>
{<br>
sl_send_reply("403", "Not
allowed");<br>
exit;<br>
}<br>
$rU = "vm-" + $au;<br>
break;<br>
case /"^441[0-9][0-9]$":<br>
# starting with 44 folowed by 1XY -
direct call to voice box<br>
strip(2);<br>
route(FSVBOX);<br>
break;<br>
case /"^433[01][0-9][0-9]$":<br>
# starting with 433 folowed by (0|1)XY -
conference<br>
strip(2);<br>
break;<br>
case /"^45[0-9]+$":<br>
strip(2);<br>
break;<br>
default:<br>
# offline - send to voicebox<br>
if (!registered("location"))<br>
{<br>
route(FSVBOX);<br>
exit;<br>
}<br>
# online - do bridging<br>
prefix("kb-");<br>
if(is_method("INVITE"))<br>
{<br>
# in case of failure - re-route
to FreeSWITCH VoiceMail<br>
t_on_failure("FAIL_FSVBOX");<br>
}<br>
}<br>
route(FSRELAY);<br>
exit;<br>
}<br>
<br>
route[FSVBOX] {<br>
if(!($rU=~"^1[0-9][0-9]+$"))<br>
return;<br>
prefix("vb-");<br>
route(FSRELAY);<br>
}<br>
<br>
# Send to FreeSWITCH<br>
route[FSRELAY] {<br>
$du = "sip:" + $sel(cfg_get.freeswitch.bindip) + ":"<br>
+ $sel(cfg_get.freeswitch.bindport);<br>
if($var(newbranch)==1)<br>
{<br>
append_branch();<br>
$var(newbranch) = 0;<br>
}<br>
route(RELAY);<br>
exit;<br>
}<br>
<br>
#!endif<br>
<br>
<br>
#!ifdef WITH_FREESWITCH<br>
failure_route[FAIL_FSVBOX] {<br>
#!ifdef WITH_NAT<br>
if (is_method("INVITE")<br>
&& (isbflagset(FLB_NATB) ||
isflagset(FLT_NATS))) {<br>
unforce_rtp_proxy();<br>
}<br>
#!endif<br>
<br>
if (t_is_canceled()) {<br>
exit;<br>
}<br>
<br>
if (t_check_status("486|408")) {<br>
# re-route to FreeSWITCH VoiceMail<br>
$rU = $avp(callee);<br>
$var(newbranch) = 1;<br>
route(FSVBOX);<br>
}<br>
}<br>
#!endif<br>
<br>
# sample config file for dispatcher module<br>
<br>
#!ifdef WITH_DISPATCHER<br>
<br>
modparam("dispatcher", "db_url",
"mysql://openser:password@localhost/openser")<br>
<br>
route{<br>
if ( !mf_process_maxfwd_header("10") )<br>
{<br>
sl_send_reply("483","To Many Hops");<br>
drop();<br>
};<br>
<br>
ds_select_dst("1", "0");<br>
<br>
forward();<br>
# t_relay();<br>
}<br>
#!endif</div>
<pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:sr-users@lists.sip-router.org">sr-users@lists.sip-router.org</a>
<a class="moz-txt-link-freetext" href="http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users">http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users</a>
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
Daniel-Constantin Mierla
Kamailio (OpenSER) Advanced Training
Jan 24-26, 2011, Irvine, CA, USA
<a class="moz-txt-link-freetext" href="http://www.asipto.com">http://www.asipto.com</a></pre>
</body>
</html>