[prev in list] [next in list] [prev in thread] [next in thread]
List: openser-users
Subject: [SR-Users] Routing error
From: Tim King <tim () compnetwork ! net>
Date: 2010-12-30 15:11:03
Message-ID: AANLkTikgLtrwgSpfKj4LtMDBQ8Be-jY2RY9DyJd8bKCb () mail ! gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
My calls are not making it to the dispatcher and I am not sure what I am
doing wrong. Can anyone see what I need to modify so that my calls can be
distributed to my free switch boxes via the dispatcher module?
cat /usr/local/etc/kamailio/kamailio.cfg
#!KAMAILIO
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
#!define WITH_FREESWITCH
#!define WITH_ANTIFLOOD
#!define WITH_DISPATCHER
#!ifdef ACCDB_COMMENT
ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT
'';
ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL
DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT
'';
ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT
'';
ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL
DEFAULT '';
#!endif
####### Defined Values #########
# *** Value defines - IDs used later in config
#!ifdef WITH_MYSQL
# - database URL - used to connect to database server by modules such
# as: auth_db, acc, usrloc, a.s.o.
#!define DBURL "mysql://openser:password@localhost/openser"
#!endif
#!ifdef WITH_MULTIDOMAIN
# - the value for 'use_domain' parameters
#!define MULTIDOMAIN 1
#!else
#!define MULTIDOMAIN 0
#!endif
# - flags
# FLT_ - per transaction (message) flags
# FLB_ - per branch flags
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_NATS 5
#!define FLB_NATB 6
#!define FLB_NATSIPPING 7
####### Global Parameters #########
#!ifdef WITH_DEBUG
debug=4
log_stderror=yes
#!else
debug=2
log_stderror=no
#!endif
memdbg=5
memlog=5
log_facility=LOG_LOCAL0
fork=yes
children=4
/* uncomment the next line to disable TCP (default on) */
#disable_tcp=yes
/* uncomment the next line to disable the auto discovery of local aliases
based on reverse DNS on IPs (default on) */
#auto_aliases=no
/* add local domain aliases */
#alias="sip.mydomain.com"
/* uncomment and configure the following line if you want Kamailio to
bind on a specific interface/port/proto (default bind on all available)
*/
#listen=udp:10.0.0.10:5060
/* port to listen to
* - can be specified more than once if needed to listen on many ports */
port=5060
#!ifdef WITH_TLS
enable_tls=yes
#!endif
#!ifdef WITH_FREESWITCH
freeswitch.bindip = "127.0.0.1" desc "FreeSWITCH IP Address"
freeswitch.bindport = "5090" desc "FreeSWITCH Port"
#!endif
####### Modules Section ########
# set paths to location of modules
#!ifdef LOCAL_TEST_RUN
mpath="modules_k:modules"
#!else
mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
#!endif
#!ifdef WITH_MYSQL
loadmodule "db_mysql.so"
#!endif
loadmodule "mi_fifo.so"
loadmodule "kex.so"
loadmodule "tm.so"
loadmodule "tmx.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "mi_rpc.so"
loadmodule "acc.so"
loadmodule "dispatcher.so"
# loadmodule "modules/tm/tm.so"
#!ifdef WITH_AUTH
loadmodule "auth.so"
loadmodule "auth_db.so"
#!ifdef WITH_IPAUTH
loadmodule "permissions.so"
#!endif
#!endif
#!ifdef WITH_ALIASDB
loadmodule "alias_db.so"
#!endif
#!ifdef WITH_MULTIDOMAIN
loadmodule "domain.so"
#!endif
#!ifdef WITH_PRESENCE
loadmodule "presence.so"
loadmodule "presence_xml.so"
#!endif
#!ifdef WITH_NAT
loadmodule "nathelper.so"
loadmodule "rtpproxy.so"
#!endif
#!ifdef WITH_TLS
loadmodule "tls.so"
#!endif
#!ifdef WITH_ANTIFLOOD
loadmodule "htable.so"
loadmodule "pike.so"
#!endif
#!ifdef WITH_XMLRPC
loadmodule "xmlrpc.so"
#!endif
# ----------------- setting module-specific parameters ---------------
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
# ----- tm params -----
# auto-discard branches from previous serial forking leg
modparam("tm", "failure_reply_mode", 3)
# default retransmission timeout: 30sec
modparam("tm", "fr_timer", 30000)
# default invite retransmission timeout after 1xx: 120sec
modparam("tm", "fr_inv_timer", 120000)
# ----- rr params -----
# add value to ;lr param to cope with most of the UAs
modparam("rr", "enable_full_lr", 1)
# do not append from tag to the RR (no need for this script)
modparam("rr", "append_fromtag", 0)
# ----- registrar params -----
modparam("registrar", "method_filtering", 1)
/* uncomment the next line to disable parallel forking via location */
# modparam("registrar", "append_branches", 0)
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)
# ----- acc params -----
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_ack", 0)
modparam("acc", "report_cancels", 0)
/* by default ww do not adjust the direct of the sequential requests.
if you enable this parameter, be sure the enable "append_fromtag"
in "rr" module */
modparam("acc", "detect_direction", 0)
/* account triggers (flags) */
modparam("acc", "log_flag", FLT_ACC)
modparam("acc", "log_missed_flag", FLT_ACCMISSED)
modparam("acc", "log_extra",
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
/* enhanced DB accounting */
#!ifdef WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC)
modparam("acc", "db_missed_flag", FLT_ACCMISSED)
modparam("acc", "db_url", DBURL)
modparam("acc", "db_extra",
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
#!endif
# ----- usrloc params -----
/* enable DB persistency for location entries */
#!ifdef WITH_USRLOCDB
modparam("usrloc", "db_url", DBURL)
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "use_domain", MULTIDOMAIN)
#!endif
# ----- auth_db params -----
#!ifdef WITH_AUTH
modparam("auth_db", "db_url", DBURL)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")
modparam("auth_db", "use_domain", MULTIDOMAIN)
# ----- permissions params -----
#!ifdef WITH_IPAUTH
modparam("permissions", "db_url", DBURL)
modparam("permissions", "db_mode", 1)
#!endif
#!endif
# ----- alias_db params -----
#!ifdef WITH_ALIASDB
modparam("alias_db", "db_url", DBURL)
modparam("alias_db", "use_domain", MULTIDOMAIN)
#!endif
# ----- domain params -----
#!ifdef WITH_MULTIDOMAIN
modparam("domain", "db_url", DBURL)
# use caching
modparam("domain", "db_mode", 1)
# register callback to match myself condition with domains list
modparam("domain", "register_myself", 1)
#!endif
#!ifdef WITH_PRESENCE
# ----- presence params -----
modparam("presence", "db_url", DBURL)
# ----- presence_xml params -----
modparam("presence_xml", "db_url", DBURL)
modparam("presence_xml", "force_active", 1)
#!endif
#!ifdef WITH_NAT
# ----- rtpproxy params -----
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
# ----- nathelper params -----
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
modparam("nathelper", "sipping_from",
"sip:pinger@kamailio.org<sip%3Apinger@kamailio.org>
")
# params needed for NAT traversal in other modules
modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
modparam("usrloc", "nat_bflag", FLB_NATB)
#!endif
#!ifdef WITH_TLS
# ----- tls params -----
modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
#!endif
#!ifdef WITH_ANTIFLOOD
# ----- pike params -----
modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 16)
modparam("pike", "remove_latency", 4)
# ----- htable params -----
# ip ban htable with autoexpire after 5 minutes
modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
#!endif
#!ifdef WITH_XMLRPC
# ----- xmlrpc params -----
modparam("xmlrpc", "route", "XMLRPC");
modparam("xmlrpc", "url_match", "^/RPC")
#!endif
####### Routing Logic ########
# Main SIP request routing logic
# - processing of any incoming SIP request starts with this route
route {
# per request initial checks
route(REQINIT);
# NAT detection
route(NAT);
# handle requests within SIP dialogs
route(WITHINDLG);
### only initial requests (no To tag)
# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}
t_check_trans();
# authentication
route(AUTH);
# record routing for dialog forming requests (in case they are
routed)
# - remove preloaded route headers
remove_hf("Route");
if (is_method("INVITE|SUBSCRIBE"))
record_route();
# account only INVITEs
if (is_method("INVITE"))
{
setflag(FLT_ACC); # do accounting
}
# dispatch requests to foreign domains
route(SIPOUT);
### requests for my local domains
# handle presence related requests
route(PRESENCE);
# handle registrations
route(REGISTRAR);
if ($rU==$null)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
#!ifdef WITH_FREESWITCH
# save callee ID
$avp(callee) = $rU;
route(FSDISPATCH);
#!endif
# user location service
route(LOCATION);
route(RELAY);
}
route[RELAY] {
#!ifdef WITH_NAT
if (check_route_param("nat=yes")) {
setbflag(FLB_NATB);
}
if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {
route(RTPPROXY);
}
#!endif
#!ifdef WITH_CFGSAMPLES
/* example how to enable some additional event routes */
if (is_method("INVITE")) {
#t_on_branch("BRANCH_ONE");
t_on_reply("REPLY_ONE");
t_on_failure("FAIL_ONE");
}
#!endif
if (!t_relay()) {
sl_reply_error();
}
exit;
}
# Per SIP request initial checks
route[REQINIT] {
#!ifdef WITH_ANTIFLOOD
# flood dection from same IP and traffic ban for a while
# be sure you exclude checking trusted peers, such as pstn gateways
# - local host excluded (e.g., loop to self)
if(src_ip!=myself)
{
if($sht(ipban=>$si)!=$null)
{
# ip is already blocked
xdbg("request from blocked IP - $rm from $fu
(IP:$si:$sp)\n");
exit;
}
if (!pike_check_req())
{
xlog("L_ALERT","ALERT: pike blocking $rm from $fu
(IP:$si:$sp)\n");
$sht(ipban=>$si) = 1;
exit;
}
}
#!endif
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
}
if(!sanity_check("1511", "7"))
{
xlog("Malformed SIP message from $si:$sp\n");
exit;
}
}
# Handle requests within SIP dialogs
route[WITHINDLG] {
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if (is_method("BYE")) {
setflag(FLT_ACC); # do accounting ...
setflag(FLT_ACCFAILED); # ... even if the
transaction fails
}
route(RELAY);
} else {
if (is_method("SUBSCRIBE") && uri == myself) {
# in-dialog subscribe requests
route(PRESENCE);
exit;
}
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
# no loose-route, but stateful ACK;
# must be an ACK after a 487
# or e.g. 404 from upstream server
t_relay();
exit;
} else {
# ACK without matching transaction
... ignore and discard
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}
}
# Handle SIP registrations
route[REGISTRAR] {
if (is_method("REGISTER"))
{
if(isflagset(FLT_NATS))
{
setbflag(FLB_NATB);
# uncomment next line to do SIP NAT pinging
## setbflag(FLB_NATSIPPING);
}
if (!save("location"))
sl_reply_error();
exit;
}
}
# USER location service
route[LOCATION] {
#!ifdef WITH_ALIASDB
# search in DB-based aliases
alias_db_lookup("dbaliases");
#!endif
if (!lookup("location")) {
switch ($rc) {
case -1:
case -3:
t_newtran();
t_reply("404", "Not Found");
exit;
case -2:
sl_send_reply("405", "Method Not Allowed");
exit;
}
}
# when routing via usrloc, log the missed calls also
if (is_method("INVITE"))
{
setflag(FLT_ACCMISSED);
}
}
# Presence server route
route[PRESENCE] {
if(!is_method("PUBLISH|SUBSCRIBE"))
return;
#!ifdef WITH_PRESENCE
if (!t_newtran())
{
sl_reply_error();
exit;
};
if(is_method("PUBLISH"))
{
handle_publish();
t_release();
}
else
if( is_method("SUBSCRIBE"))
{
handle_subscribe();
t_release();
}
exit;
#!endif
# if presence enabled, this part will not be executed
if (is_method("PUBLISH") || $rU==$null)
{
sl_send_reply("404", "Not here");
exit;
}
return;
}
# Authentication route
route[AUTH] {
#!ifdef WITH_AUTH
if (is_method("REGISTER"))
{
# authenticate the REGISTER requests (uncomment to enable
auth)
if (!www_authorize("$td", "subscriber"))
{
www_challenge("$td", "0");
exit;
}
if ($au!=$tU)
{
sl_send_reply("403","Forbidden auth ID");
exit;
}
} else {
#!ifdef WITH_FREESWITCH
if(route(FSINBOUND))
return;
#!endif
#!ifdef WITH_IPAUTH
if(allow_source_address())
{
# source IP allowed
return;
}
#!endif
# authenticate if from local subscriber
if (from_uri==myself)
{
if (!proxy_authorize("$fd", "subscriber")) {
proxy_challenge("$fd", "0");
exit;
}
if (is_method("PUBLISH"))
{
if ($au!=$tU) {
sl_send_reply("403","Forbidden auth
ID");
exit;
}
} else {
if ($au!=$fU) {
sl_send_reply("403","Forbidden auth
ID");
exit;
}
}
consume_credentials();
# caller authenticated
} else {
# caller is not local subscriber, then check if it
calls
# a local destination, otherwise deny, not an open
relay here
if (!uri==myself)
{
sl_send_reply("403","Not relaying");
exit;
}
}
}
#!endif
return;
}
# Caller NAT detection route
route[NAT] {
#!ifdef WITH_NAT
force_rport();
if (nat_uac_test("19")) {
if (method=="REGISTER") {
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(FLT_NATS);
}
#!endif
return;
}
# RTPProxy control
route[RTPPROXY] {
#!ifdef WITH_NAT
if (is_method("BYE")) {
unforce_rtp_proxy();
} else if (is_method("INVITE")){
force_rtp_proxy();
}
if (!has_totag()) add_rr_param(";nat=yes");
#!endif
return;
}
# Routing to foreign domains
route[SIPOUT] {
if (!uri==myself)
{
append_hf("P-hint: outbound\r\n");
route(RELAY);
}
}
#!ifdef WITH_FREESWITCH
# FreeSWITCH routing blocks
route[FSINBOUND] {
if($si== $sel(cfg_get.freeswitch.bindip)
&& $sp==$sel(cfg_get.freeswitch.bindport))
return 1;
return -1;
}
route[FSDISPATCH] {
if(!is_method("INVITE"))
return;
if(route(FSINBOUND))
return;
# dial number selection
switch($rU) {
case /"^41$":
# 41 - voicebox menu
# allow only authenticated users
if($au==$null)
{
sl_send_reply("403", "Not allowed");
exit;
}
$rU = "vm-" + $au;
break;
case /"^441[0-9][0-9]$":
# starting with 44 folowed by 1XY - direct call to
voice box
strip(2);
route(FSVBOX);
break;
case /"^433[01][0-9][0-9]$":
# starting with 433 folowed by (0|1)XY - conference
strip(2);
break;
case /"^45[0-9]+$":
strip(2);
break;
default:
# offline - send to voicebox
if (!registered("location"))
{
route(FSVBOX);
exit;
}
# online - do bridging
prefix("kb-");
if(is_method("INVITE"))
{
# in case of failure - re-route to
FreeSWITCH VoiceMail
t_on_failure("FAIL_FSVBOX");
}
}
route(FSRELAY);
exit;
}
route[FSVBOX] {
if(!($rU=~"^1[0-9][0-9]+$"))
return;
prefix("vb-");
route(FSRELAY);
}
# Send to FreeSWITCH
route[FSRELAY] {
$du = "sip:" + $sel(cfg_get.freeswitch.bindip) + ":"
+ $sel(cfg_get.freeswitch.bindport);
if($var(newbranch)==1)
{
append_branch();
$var(newbranch) = 0;
}
route(RELAY);
exit;
}
#!endif
#!ifdef WITH_FREESWITCH
failure_route[FAIL_FSVBOX] {
#!ifdef WITH_NAT
if (is_method("INVITE")
&& (isbflagset(FLB_NATB) || isflagset(FLT_NATS))) {
unforce_rtp_proxy();
}
#!endif
if (t_is_canceled()) {
exit;
}
if (t_check_status("486|408")) {
# re-route to FreeSWITCH VoiceMail
$rU = $avp(callee);
$var(newbranch) = 1;
route(FSVBOX);
}
}
#!endif
# sample config file for dispatcher module
#!ifdef WITH_DISPATCHER
modparam("dispatcher", "db_url", "mysql://openser:password@localhost
/openser")
route{
if ( !mf_process_maxfwd_header("10") )
{
sl_send_reply("483","To Many Hops");
drop();
};
ds_select_dst("1", "0");
forward();
# t_relay();
}
#!endif
[Attachment #5 (text/html)]
My calls are not making it to the dispatcher and I am not sure what I am doing wrong. \
Can anyone see what I need to modify so that my calls can be distributed to my free \
switch boxes via the dispatcher module?<br><br>cat \
/usr/local/etc/kamailio/kamailio.cfg<br> <br>#!KAMAILIO<br><br>#!define \
WITH_MYSQL<br>#!define WITH_AUTH<br>#!define WITH_USRLOCDB<br>#!define \
WITH_FREESWITCH<br>#!define WITH_ANTIFLOOD<br>#!define WITH_DISPATCHER<br><br>#!ifdef \
ACCDB_COMMENT<br> ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT \
'';<br> ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT \
'';<br> ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT \
'';<br> ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT \
'';<br> ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT \
'';<br> ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL \
DEFAULT '';<br> ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) \
NOT NULL DEFAULT '';<br> ALTER TABLE missed_calls ADD COLUMN dst_ouser \
VARCHAR(64) NOT NULL DEFAULT '';<br> ALTER TABLE missed_calls ADD COLUMN \
dst_user VARCHAR(64) NOT NULL DEFAULT '';<br> ALTER TABLE missed_calls ADD \
COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';<br> \
#!endif<br><br>####### Defined Values #########<br><br># *** Value defines - IDs used \
later in config<br>#!ifdef WITH_MYSQL<br># - database URL - used to connect to \
database server by modules such<br># as: auth_db, acc, usrloc, a.s.o.<br> \
#!define DBURL "mysql://openser:password@localhost/openser"<br>#!endif<br>#!ifdef \
WITH_MULTIDOMAIN<br># - the value for 'use_domain' parameters<br>#!define \
MULTIDOMAIN 1<br>#!else<br>#!define MULTIDOMAIN 0<br> #!endif<br><br># - flags<br># \
FLT_ - per transaction (message) flags<br># FLB_ - per branch flags<br>#!define \
FLT_ACC 1<br>#!define FLT_ACCMISSED 2<br>#!define FLT_ACCFAILED 3<br>#!define \
FLT_NATS 5<br><br>#!define FLB_NATB 6<br> #!define FLB_NATSIPPING 7<br><br>####### \
Global Parameters #########<br><br>#!ifdef \
WITH_DEBUG<br>debug=4<br>log_stderror=yes<br>#!else<br>debug=2<br>log_stderror=no<br>#!endif<br><br>memdbg=5<br>memlog=5<br><br>log_facility=LOG_LOCAL0<br>
<br>fork=yes<br>children=4<br><br>/* uncomment the next line to disable TCP (default \
on) */<br>#disable_tcp=yes<br><br>/* uncomment the next line to disable the auto \
discovery of local aliases<br> based on reverse DNS on IPs (default on) */<br> \
#auto_aliases=no<br><br>/* add local domain aliases */<br>#alias="<a \
href="http://sip.mydomain.com">sip.mydomain.com</a>"<br><br>/* uncomment and \
configure the following line if you want Kamailio to<br> bind on a specific \
interface/port/proto (default bind on all available) */<br> #listen=udp:<a \
href="http://10.0.0.10:5060">10.0.0.10:5060</a><br><br>/* port to listen to<br> * - \
can be specified more than once if needed to listen on many ports \
*/<br>port=5060<br><br>#!ifdef WITH_TLS<br>enable_tls=yes<br> #!endif<br><br>#!ifdef \
WITH_FREESWITCH<br>freeswitch.bindip = "127.0.0.1" desc "FreeSWITCH IP \
Address"<br>freeswitch.bindport = "5090" desc "FreeSWITCH \
Port"<br>#!endif<br><br><br>####### Modules Section ########<br> <br># set paths \
to location of modules<br>#!ifdef \
LOCAL_TEST_RUN<br>mpath="modules_k:modules"<br>#!else<br>mpath="/usr/lo \
cal/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"<br>#!endif<br><br> \
#!ifdef WITH_MYSQL<br>loadmodule "db_mysql.so"<br>#!endif<br><br>loadmodule \
"mi_fifo.so"<br>loadmodule "kex.so"<br>loadmodule \
"tm.so"<br>loadmodule "tmx.so"<br>loadmodule \
"sl.so"<br> loadmodule "rr.so"<br>loadmodule \
"pv.so"<br>loadmodule "maxfwd.so"<br>loadmodule \
"usrloc.so"<br>loadmodule "registrar.so"<br>loadmodule \
"textops.so"<br>loadmodule "siputils.so"<br> loadmodule \
"xlog.so"<br>loadmodule "sanity.so"<br>loadmodule \
"ctl.so"<br>loadmodule "mi_rpc.so"<br>loadmodule \
"acc.so"<br>loadmodule "dispatcher.so"<br># loadmodule \
"modules/tm/tm.so"<br> <br>#!ifdef WITH_AUTH<br>loadmodule \
"auth.so"<br>loadmodule "auth_db.so"<br>#!ifdef \
WITH_IPAUTH<br>loadmodule \
"permissions.so"<br>#!endif<br>#!endif<br><br>#!ifdef \
WITH_ALIASDB<br>loadmodule "alias_db.so"<br> #!endif<br><br>#!ifdef \
WITH_MULTIDOMAIN<br>loadmodule "domain.so"<br>#!endif<br><br>#!ifdef \
WITH_PRESENCE<br>loadmodule "presence.so"<br>loadmodule \
"presence_xml.so"<br>#!endif<br><br>#!ifdef WITH_NAT<br> loadmodule \
"nathelper.so"<br>loadmodule \
"rtpproxy.so"<br>#!endif<br><br>#!ifdef WITH_TLS<br>loadmodule \
"tls.so"<br>#!endif<br><br>#!ifdef WITH_ANTIFLOOD<br>loadmodule \
"htable.so"<br> loadmodule "pike.so"<br>#!endif<br><br>#!ifdef \
WITH_XMLRPC<br>loadmodule "xmlrpc.so"<br>#!endif<br><br># ----------------- \
setting module-specific parameters ---------------<br><br><br># ----- mi_fifo params \
-----<br> modparam("mi_fifo", "fifo_name", \
"/tmp/kamailio_fifo")<br><br><br># ----- tm params -----<br># auto-discard \
branches from previous serial forking leg<br>modparam("tm", \
"failure_reply_mode", 3)<br> # default retransmission timeout: \
30sec<br>modparam("tm", "fr_timer", 30000)<br># default invite \
retransmission timeout after 1xx: 120sec<br>modparam("tm", \
"fr_inv_timer", 120000)<br> <br><br># ----- rr params -----<br># add value \
to ;lr param to cope with most of the UAs<br>modparam("rr", \
"enable_full_lr", 1)<br># do not append from tag to the RR (no need for \
this script)<br>modparam("rr", "append_fromtag", 0)<br> <br><br># \
----- registrar params -----<br>modparam("registrar", \
"method_filtering", 1)<br>/* uncomment the next line to disable parallel \
forking via location */<br># modparam("registrar", \
"append_branches", 0)<br> /* uncomment the next line not to allow more than \
10 contacts per AOR */<br>#modparam("registrar", "max_contacts", \
10)<br><br><br># ----- acc params -----<br>/* what special events should be accounted \
? */<br> modparam("acc", "early_media", \
0)<br>modparam("acc", "report_ack", \
0)<br>modparam("acc", "report_cancels", 0)<br>/* by default ww do \
not adjust the direct of the sequential requests.<br> if you enable this parameter, \
be sure the enable "append_fromtag"<br> in "rr" module \
*/<br>modparam("acc", "detect_direction", 0)<br>/* account \
triggers (flags) */<br>modparam("acc", "log_flag", FLT_ACC)<br> \
modparam("acc", "log_missed_flag", \
FLT_ACCMISSED)<br>modparam("acc", "log_extra",<br> \
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<br>modparam("acc", \
"failed_transaction_flag", FLT_ACCFAILED)<br> /* enhanced DB accounting \
*/<br>#!ifdef WITH_ACCDB<br>modparam("acc", "db_flag", \
FLT_ACC)<br>modparam("acc", "db_missed_flag", \
FLT_ACCMISSED)<br>modparam("acc", "db_url", DBURL)<br> \
modparam("acc", "db_extra",<br> \
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<br>#!endif<br><br><br># \
----- usrloc params -----<br>/* enable DB persistency for location entries */<br> \
#!ifdef WITH_USRLOCDB<br>modparam("usrloc", "db_url", \
DBURL)<br>modparam("usrloc", "db_mode", \
2)<br>modparam("usrloc", "use_domain", \
MULTIDOMAIN)<br>#!endif<br><br> <br># ----- auth_db params -----<br>#!ifdef \
WITH_AUTH<br>modparam("auth_db", "db_url", \
DBURL)<br>modparam("auth_db", "calculate_ha1", \
yes)<br>modparam("auth_db", "password_column", \
"password")<br> modparam("auth_db", "load_credentials", \
"")<br>modparam("auth_db", "use_domain", \
MULTIDOMAIN)<br><br># ----- permissions params -----<br>#!ifdef \
WITH_IPAUTH<br>modparam("permissions", "db_url", DBURL)<br> \
modparam("permissions", "db_mode", \
1)<br>#!endif<br><br>#!endif<br><br><br># ----- alias_db params -----<br>#!ifdef \
WITH_ALIASDB<br>modparam("alias_db", "db_url", \
DBURL)<br>modparam("alias_db", "use_domain", MULTIDOMAIN)<br> \
#!endif<br><br><br># ----- domain params -----<br>#!ifdef \
WITH_MULTIDOMAIN<br>modparam("domain", "db_url", DBURL)<br># use \
caching<br>modparam("domain", "db_mode", 1)<br># register \
callback to match myself condition with domains list<br> modparam("domain", \
"register_myself", 1)<br>#!endif<br><br><br>#!ifdef WITH_PRESENCE<br># \
----- presence params -----<br>modparam("presence", "db_url", \
DBURL)<br><br># ----- presence_xml params -----<br> \
modparam("presence_xml", "db_url", \
DBURL)<br>modparam("presence_xml", "force_active", \
1)<br>#!endif<br><br><br>#!ifdef WITH_NAT<br># ----- rtpproxy params \
-----<br>modparam("rtpproxy", "rtpproxy_sock", "udp:<a \
href="http://127.0.0.1:7722">127.0.0.1:7722</a>")<br> <br># ----- nathelper \
params -----<br>modparam("nathelper", "natping_interval", \
30)<br>modparam("nathelper", "ping_nated_only", \
1)<br>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)<br> \
modparam("nathelper", "sipping_from", "<a \
href="mailto:sip%3Apinger@kamailio.org">sip:pinger@kamailio.org</a>")<br><br># \
params needed for NAT traversal in other \
modules<br>modparam("nathelper|registrar", "received_avp", \
"$avp(RECEIVED)")<br> modparam("usrloc", "nat_bflag", \
FLB_NATB)<br>#!endif<br><br><br>#!ifdef WITH_TLS<br># ----- tls params \
-----<br>modparam("tls", "config", \
"/usr/local/etc/kamailio/tls.cfg")<br> #!endif<br><br>#!ifdef \
WITH_ANTIFLOOD<br># ----- pike params -----<br>modparam("pike", \
"sampling_time_unit", 2)<br>modparam("pike", \
"reqs_density_per_unit", 16)<br>modparam("pike", \
"remove_latency", 4)<br> <br># ----- htable params -----<br># ip ban htable \
with autoexpire after 5 minutes<br>modparam("htable", "htable", \
"ipban=>size=8;autoexpire=300;")<br>#!endif<br><br>#!ifdef \
WITH_XMLRPC<br> # ----- xmlrpc params -----<br>modparam("xmlrpc", \
"route", "XMLRPC");<br>modparam("xmlrpc", \
"url_match", "^/RPC")<br>#!endif<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"))<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 \
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<br><br>
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic