Module: sip-router Branch: master Commit: 4f68c5626530a1bfe2c7ce72eb3de24b3e7e73dc URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4f68c562...
Author: Peter Dunkley peter.dunkley@crocodile-rcs.com Committer: Peter Dunkley peter.dunkley@crocodile-rcs.com Date: Wed Apr 24 21:06:36 2013 +0100
examples: added outbound edge proxy and registrar example configurations
---
examples/outbound/edge.cfg | 172 +++++++++++++++++++++++++++++++++ examples/outbound/registrar.cfg | 202 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 374 insertions(+), 0 deletions(-)
diff --git a/examples/outbound/edge.cfg b/examples/outbound/edge.cfg new file mode 100644 index 0000000..2bdf93b --- /dev/null +++ b/examples/outbound/edge.cfg @@ -0,0 +1,172 @@ +#!KAMAILIO +# +# Edge proxy configuration +# + +#!substdef "!REGISTRAR_IP!a.b.c.d!g" +#!substdef "!REGISTRAR_PORT!5060!g" +#!substdef "!FLOW_TIMER!20!g" + +####### Global Parameters ######### + +debug=2 +log_stderror=no +log_facility=LOG_LOCAL0 +fork=yes +children=4 +alias="example.com" +mpath="/usr/lib64/kamailio/modules" +tcp_connection_lifetime=30 # FLOW_TIMER + 10 +force_rport=yes + + +####### Modules Section ######## + +loadmodule "tm.so" +loadmodule "sl.so" +loadmodule "outbound.so" +loadmodule "rr.so" +loadmodule "path.so" +loadmodule "pv.so" +loadmodule "maxfwd.so" +loadmodule "xlog.so" +loadmodule "sanity.so" +loadmodule "ctl.so" +loadmodule "mi_rpc.so" +loadmodule "mi_fifo.so" +loadmodule "textops.so" +loadmodule "siputils.so" +loadmodule "stun.so" + +# ----------------- setting module-specific parameters --------------- + +# ----- mi_fifo params ----- +modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo") + +# ----- tm params ----- +modparam("tm", "failure_reply_mode", 3) + +# ----- rr params ----- +modparam("rr", "append_fromtag", 0) + + +####### Routing Logic ######## + +request_route { + route(REQINIT); + + if (is_method("CANCEL")) { + if (t_check_trans()) { + route(RELAY); + } + exit; + } + + route(WITHINDLG); + + t_check_trans(); + + if (is_method("REGISTER")) { + remove_hf("Route"); + add_path(); + $du = "sip:REGISTRAR_IP:REGISTRAR_PORT"; + } else { + if (is_method("INVITE|SUBSCRIBE")) + record_route(); + + if (@via[2] == "") { + # From client so route to registrar... + + if ($rU == $null) { + sl_send_reply("484", "Address Incomplete"); + exit; + } + remove_hf("Route"); + $du = "sip:REGISTRAR_IP:REGISTRAR_PORT"; + } else { + # From registrar so route using "Route:" headers... + + if (!loose_route()) { + switch($rc) { + case -2: + sl_send_reply("403", "Forbidden"); + exit; + default: + xlog("L_ERR", "in request_route\n"); + sl_reply_error(); + exit; + } + } + + t_on_failure("FAIL_OUTBOUND"); + } + } + + route(RELAY); +} + +route[RELAY] { + if (!t_relay()) { + sl_reply_error(); + } + exit; +} + +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; + } +} + +route[WITHINDLG] { + if (has_totag()) { + if (!loose_route()) { + switch($rc) { + case -2: + sl_send_reply("403", "Forbidden"); + exit; + default: + if (is_method("ACK")) { + if ( t_check_trans() ) { + route(RELAY); + exit; + } else { + exit; + } + } + sl_send_reply("404","Not Found"); + } + } else { + if (is_method("NOTIFY")) { + record_route(); + } + route(RELAY); + } + exit; + } +} + +onreply_route { + if (!t_check_trans()) { + drop; + } + + if ($rm == "REGISTER" && $rs >= 200 && $rs <= 299) { + remove_hf("Flow-Timer"); + if ($(hdr(Require)[*])=~"outbound") + insert_hf("Flow-Timer: FLOW_TIMER\r\n", "Call-ID"); + } +} + +failure_route[FAIL_OUTBOUND] { + if (t_branch_timeout() || !t_branch_replied()) { + send_reply("430", "Flow Failed"); + } +} diff --git a/examples/outbound/registrar.cfg b/examples/outbound/registrar.cfg new file mode 100644 index 0000000..db920fa --- /dev/null +++ b/examples/outbound/registrar.cfg @@ -0,0 +1,202 @@ +#!KAMAILIO +# +# Registrar configuration +# + + +####### Global Parameters ######### + +debug=2 +log_stderror=no +log_facility=LOG_LOCAL0 +fork=yes +children=4 +alias="example.com" +mpath="/usr/lib64/kamailio/modules" + + +####### Modules Section ######## + +loadmodule "tm.so" +loadmodule "tmx.so" +loadmodule "sl.so" +loadmodule "rr.so" +loadmodule "pv.so" +loadmodule "maxfwd.so" +loadmodule "xlog.so" +loadmodule "sanity.so" +loadmodule "ctl.so" +loadmodule "mi_rpc.so" +loadmodule "mi_fifo.so" +loadmodule "textops.so" +loadmodule "siputils.so" +loadmodule "usrloc.so" +loadmodule "registrar.so" + +# ----------------- setting module-specific parameters --------------- + +# ----- mi_fifo params ----- +modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo") + + +# ----- tm params ----- +modparam("tm", "failure_reply_mode", 3) +modparam("tm", "restart_fr_on_each_reply", 0) +modparam("tm", "contact_flows_avp", "tm_contact_flows") +modparam("tm", "contacts_avp", "tm_contacts") + +# ----- rr params ----- +modparam("rr", "append_fromtag", 0) + +# ----- registrar params ----- +modparam("registrar", "use_path", 1) +modparam("registrar", "gruu_enabled", 1) +modparam("registrar", "outbound_mode", 1) + + +####### Routing Logic ######## + +request_route { + route(REQINIT); + + if (is_method("CANCEL")) { + if (t_check_trans()) { + route(RELAY); + } + exit; + } + + route(WITHINDLG); + + t_check_trans(); + + remove_hf("Route"); + if (is_method("INVITE|SUBSCRIBE")) + record_route(); + + route(REGISTRAR); + + if ($rU==$null) { + xlog("L_INFO", "Address Incomplete\n"); + send_reply("484","Address Incomplete"); + exit; + } + + route(LOCATION); +} + + +route[RELAY] { + if (!t_relay()) { + xlog("L_ERR", "t_relay() failed\n"); + sl_reply_error(); + } + exit; +} + +route[REQINIT] { + if (!mf_process_maxfwd_header("10")) { + xlog("L_INFO", "Too Many Hops\n"); + send_reply("483","Too Many Hops"); + exit; + } + + if(!sanity_check("1511", "7")) + { + xlog("Malformed SIP message from $si:$sp\n"); + exit; + } +} + +route[WITHINDLG] { + if (has_totag()) { + if (loose_route()) { + if (is_method("NOTIFY")) { + record_route(); + } + route(RELAY); + } else { + if (is_method("ACK")) { + if (t_check_trans()) { + route(RELAY); + exit; + } else { + exit; + } + } + xlog("L_INFO", "Not Found"); + send_reply("404","Not Found"); + } + exit; + } +} + +route[REGISTRAR] { + if (is_method("REGISTER")) + { + if (!save("location")) { + xlog("L_ERR", "Unable to save location\n"); + sl_reply_error(); + } + exit; + } +} + +route[LOCATION] { + if (!lookup("location")) { + $var(rc) = $rc; + t_newtran(); + switch ($var(rc)) { + case -1: + case -3: + send_reply("404", "Not Found"); + exit; + case -2: + send_reply("405", "Method Not Allowed"); + exit; + } + } + + if (!t_load_contacts() || !t_next_contacts()) { + xlog("L_ERR", "t_(load|next)_contacts() failed\n"); + sl_reply_error(); + exit; + } + + t_on_failure("FAIL_TRANSACTION"); + t_on_branch_failure("FAIL-BRANCH"); + route(RELAY); + exit; +} + +onreply_route { + if (!t_check_trans()) { + drop; + } +} + +failure_route[FAIL_TRANSACTION] { + if (!t_check_status("6[0-9][0-9]")) { + if (t_next_contacts()) { + t_relay(); + exit; + } + } + + if (t_check_status("430")) { + t_reply("480", "Temporarily Unavailable"); + exit; + } +} + +event_route[tm:branch-failure:FAIL-BRANCH] { + if (t_check_status("403|430") + || (t_branch_timeout() && !t_branch_replied())) { + unregister("location", "$tu", "$T_reply_ruid"); + + if (t_next_contact_flow()) { + t_on_branch_failure("FAIL-BRANCH"); + t_relay(); + } + } +}