mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
5.8 KiB
280 lines
5.8 KiB
#!KAMAILIO
|
|
#
|
|
# sample config file for dispatcher module
|
|
# - load balancing of VoIP calls with round robin
|
|
# - no TPC listening
|
|
# - don't dispatch REGISTER and presence requests
|
|
#
|
|
# Kamailio SIP Server
|
|
# - web: http://www.kamailio.org
|
|
# - git: http://github.com/kamailio/
|
|
#
|
|
# Direct your questions about this file to: sr-users@lists.sip-router.org
|
|
#
|
|
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
|
|
# for an explanation of possible statements, functions and parameters.
|
|
#
|
|
# Several features can be enabled using '#!define WITH_FEATURE' directives:
|
|
#
|
|
# *** To run in debug mode:
|
|
# - define WITH_DEBUG
|
|
#
|
|
|
|
#!ifndef DBURL
|
|
#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
|
|
#!endif
|
|
|
|
# - flags
|
|
# FLT_ - per transaction (message) flags
|
|
# FLB_ - per branch flags
|
|
#!define FLT_ACC 1
|
|
#!define FLT_ACCMISSED 2
|
|
#!define FLT_ACCFAILED 3
|
|
|
|
####### 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
|
|
|
|
/* comment the next line to enable TCP */
|
|
disable_tcp=yes
|
|
|
|
/* uncomment the next line to disable the auto discovery of local aliases
|
|
based on revers DNS on IPs (default on) */
|
|
auto_aliases=no
|
|
|
|
/* add local domain aliases */
|
|
# alias="mysipserver.com"
|
|
|
|
port=5060
|
|
|
|
/* 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:127.0.0.1:5060
|
|
|
|
sip_warning=no
|
|
|
|
####### Modules Section ########
|
|
|
|
# set module path
|
|
mpath="/usr/local/lib/kamailio/modules/"
|
|
|
|
loadmodule "db_mysql.so"
|
|
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 "textops.so"
|
|
loadmodule "siputils.so"
|
|
loadmodule "xlog.so"
|
|
loadmodule "sanity.so"
|
|
loadmodule "ctl.so"
|
|
loadmodule "mi_rpc.so"
|
|
loadmodule "acc.so"
|
|
loadmodule "dispatcher.so"
|
|
|
|
|
|
# ----------------- setting module-specific parameters ---------------
|
|
|
|
|
|
# ----- 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)
|
|
|
|
|
|
# ----- acc params -----
|
|
modparam("acc", "log_flag", FLT_ACC)
|
|
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
|
|
modparam("acc", "log_extra",
|
|
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd;src_ip=$si")
|
|
|
|
# ----- tm params -----
|
|
modparam("tm", "fr_timer", 2000)
|
|
modparam("tm", "fr_inv_timer", 40000)
|
|
|
|
# ----- dispatcher params -----
|
|
modparam("dispatcher", "db_url", DBURL)
|
|
modparam("dispatcher", "table_name", "dispatcher")
|
|
modparam("dispatcher", "flags", 2)
|
|
modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")
|
|
modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")
|
|
modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")
|
|
modparam("dispatcher", "sock_avp", "$avp(AVP_SOCK)")
|
|
|
|
####### Routing Logic ########
|
|
|
|
|
|
# main request routing logic
|
|
|
|
request_route {
|
|
|
|
# per request initial checks
|
|
route(REQINIT);
|
|
|
|
# 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;
|
|
}
|
|
|
|
# handle retransmissions
|
|
if(t_precheck_trans()) {
|
|
t_check_trans();
|
|
exit;
|
|
}
|
|
t_check_trans();
|
|
|
|
# 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
|
|
}
|
|
|
|
# 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;
|
|
}
|
|
|
|
# dispatch destinations
|
|
route(DISPATCH);
|
|
}
|
|
|
|
|
|
route[RELAY] {
|
|
if (!t_relay()) {
|
|
sl_reply_error();
|
|
}
|
|
exit;
|
|
}
|
|
|
|
# Per SIP request initial checks
|
|
route[REQINIT] {
|
|
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() ) {
|
|
# non loose-route, but stateful ACK;
|
|
# must be 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"))
|
|
return;
|
|
sl_send_reply("404", "No registrar");
|
|
exit;
|
|
}
|
|
|
|
# Presence server route
|
|
route[PRESENCE] {
|
|
if(!is_method("PUBLISH|SUBSCRIBE"))
|
|
return;
|
|
|
|
sl_send_reply("404", "Not here");
|
|
exit;
|
|
}
|
|
|
|
# Dispatch requests
|
|
route[DISPATCH] {
|
|
# round robin dispatching on gateways group '1'
|
|
if(!ds_select_dst("1", "4")) {
|
|
send_reply("404", "No destination");
|
|
exit;
|
|
}
|
|
xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");
|
|
t_on_failure("RTF_DISPATCH");
|
|
route(RELAY);
|
|
exit;
|
|
}
|
|
|
|
# Try next destionations in failure route
|
|
failure_route[RTF_DISPATCH] {
|
|
if (t_is_canceled()) {
|
|
exit;
|
|
}
|
|
# next DST - only for 500 or local timeout
|
|
if (t_check_status("500")
|
|
or (t_branch_timeout() and !t_branch_replied())) {
|
|
if(ds_next_dst()) {
|
|
t_on_failure("RTF_DISPATCH");
|
|
route(RELAY);
|
|
exit;
|
|
}
|
|
}
|
|
}
|