aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Smith <osmith@sysmocom.de>2018-09-26 16:29:00 +0200
committerOliver Smith <osmith@sysmocom.de>2018-10-31 14:12:28 +0100
commitd9f3d34443b45ccfe53ab9a47061195270efac7d (patch)
tree8690413bfad9e89d532b8c4f0c00e0daef222e6b
parentfd7446fcab239b8c92de5b58ac7a62153bbe6864 (diff)
support osmo-sip-connector with kamailio
Kamailio is a SIP server, that is relatively easy to configure, in contrary to asterisk it only has one config file. The config file here is based on the example config provided in the wiki: <http://osmocom.org/projects/osmo-sip-conector/wiki/Howto> To enable the osmo-sip-connector, build it, install kamailio and then set SIPCON_ENABLE=true in your copy of config_2g_3g. Change-Id: Ia5c4e9992eab390bc6d26ada7564223ff41a01b2
-rw-r--r--net/config_2g3g7
-rw-r--r--net/tmpl_std/kamailio.cfg419
-rw-r--r--net/tmpl_std/osmo-sip-connector.cfg6
-rwxr-xr-xnet/tmpl_std/run.sh33
4 files changed, 462 insertions, 3 deletions
diff --git a/net/config_2g3g b/net/config_2g3g
index c4545a4..622a4be 100644
--- a/net/config_2g3g
+++ b/net/config_2g3g
@@ -30,6 +30,7 @@ BTS1_BVCI="${BTS1_NSVCI}"
HLR_IP="127.0.0.1"
MSC_PC="0.23.1"
+MSC_MNCC_SOCKET="${NET_DIR}/msc_mncc_socket"
AUTH=optional
ENCR_A5=0
@@ -72,3 +73,9 @@ UARFCN2=4358
SCRAMBLE2=258
LAC2=2${UARFCN2}
RAC2=22
+
+SIPCON_ENABLE="false"
+SIPCON_LOCAL="${PUBLIC_IP}"
+SIPCON_LOCAL_PORT="5069"
+SIPCON_REMOTE="${PUBLIC_IP}"
+SIPCON_REMOTE_PORT="5060"
diff --git a/net/tmpl_std/kamailio.cfg b/net/tmpl_std/kamailio.cfg
new file mode 100644
index 0000000..c5b0bf2
--- /dev/null
+++ b/net/tmpl_std/kamailio.cfg
@@ -0,0 +1,419 @@
+#!KAMAILIO
+
+#!define WITH_DEBUG
+#!define WITH_PSTN
+
+####### Defined Values #########
+
+# - 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 #########
+
+### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
+#!ifdef WITH_DEBUG
+debug=2
+log_stderror=yes
+#!else
+debug=2
+log_stderror=no
+#!endif
+
+memdbg=5
+memlog=5
+
+log_facility=LOG_LOCAL0
+rundir="${NET_DIR}/kamailio_rundir"
+
+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=${SIPCON_REMOTE}:${SIPCON_REMOTE_PORT}
+
+/* port to listen to
+ * - can be specified more than once if needed to listen on many ports */
+port=${SIPCON_REMOTE_PORT}
+
+# life time of TCP connection when there is no traffic
+# - a bit higher than registration expires to cope with UA behind NAT
+tcp_connection_lifetime=3605
+
+####### Custom Parameters #########
+
+# These parameters can be modified runtime via RPC interface
+# - see the documentation of 'cfg_rpc' module.
+#
+# Format: group.id = value 'desc' description
+# Access: $sel(cfg_get.group.id) or @cfg_get.group.id
+#
+
+#!ifdef WITH_PSTN
+# PSTN GW Routing
+#
+# - pstn.gw_ip: valid IP or hostname as string value, example:
+# pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
+#
+# - by default is empty to avoid misrouting
+pstn.gw_ip = "${SIPCON_LOCAL}:${SIPCON_LOCAL_PORT}" desc "osmo-sip-connector Address"
+#!endif
+
+
+####### Modules Section ########
+
+# set paths to location of modules (to sources or installation folders)
+#!ifdef WITH_SRCPATH
+mpath="modules"
+#!else
+mpath="/usr/lib/x86_64-linux-gnu/kamailio/modules/"
+#!endif
+
+# loadmodule "mi_fifo.so"
+loadmodule "kex.so"
+loadmodule "corex.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 "cfg_rpc.so"
+loadmodule "mi_rpc.so"
+loadmodule "acc.so"
+
+#!ifdef WITH_NAT
+loadmodule "nathelper.so"
+loadmodule "rtpproxy.so"
+#!endif
+
+#!ifdef WITH_DEBUG
+loadmodule "debugger.so"
+#!endif
+
+# ----------------- setting module-specific parameters ---------------
+
+# ----- mi_fifo params -----
+#modparam("mi_fifo", "fifo_name", "/var/run/kamailio/kamailio_fifo")
+
+# ----- ctl params -----
+#modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
+
+# ----- 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)
+# max value for expires of registrations
+modparam("registrar", "max_expires", 3600)
+# set it to 1 to enable GRUU
+modparam("registrar", "gruu_enabled", 0)
+
+# ----- 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;src_ip=$si;"
+ "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
+modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
+
+
+#!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")
+
+# params needed for NAT traversal in other modules
+modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
+modparam("usrloc", "nat_bflag", FLB_NATB)
+#!endif
+
+
+#!ifdef WITH_DEBUG
+# ----- debugger params -----
+modparam("debugger", "cfgtrace", 0)
+#!endif
+
+####### Routing Logic ########
+
+
+# Main SIP request routing logic
+# - processing of any incoming SIP request starts with this route
+# - note: this is the same as route { ... }
+request_route {
+
+ xlog("GOT SIP $rm from $fu: $ru\n");
+ # per request initial checks
+ route(REQINIT);
+
+ # CANCEL processing
+ if (is_method("CANCEL")) {
+ if (t_check_trans()) {
+ route(RELAY);
+ }
+ exit;
+ }
+ # handle requests within SIP dialogs
+ route(WITHINDLG);
+
+ ### only initial requests (no To tag)
+
+ # handle retransmissions
+ if(t_precheck_trans()) {
+ t_check_trans();
+ exit;
+ }
+ t_check_trans();
+
+ if ("600" == $rU) {
+ route(ECHO);
+ }
+
+ if ("500" == $rU) {
+ route(TEST);
+ }
+
+ route(PSTN);
+}
+
+
+route[RELAY] {
+ # enable additional event routes for forwarded requests
+ # - serial forking, RTP relaying handling, a.s.o.
+ if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
+ if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
+ }
+ if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
+ if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
+ }
+ if (is_method("INVITE")) {
+ if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
+ }
+
+ 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("2")) {
+ sl_send_reply("483","Too Many Hops");
+ exit;
+ }
+
+ if(is_method("OPTIONS") && uri==myself && $rU==$null) {
+ sl_send_reply("200","Keepalive");
+ 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()) return;
+
+ # 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
+ }
+ else if ( is_method("ACK") ) {
+ # ACK is forwarded statelessy
+ route(NATMANAGE);
+ }
+ else if ( is_method("NOTIFY") ) {
+ # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
+ record_route();
+ }
+ route(RELAY);
+ 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
+ route(RELAY);
+ exit;
+ } else {
+ # ACK without matching transaction ... ignore and discard
+ exit;
+ }
+ }
+ sl_send_reply("404", "Not here");
+ exit;
+}
+
+# RTPProxy control
+route[NATMANAGE] {
+#!ifdef WITH_NAT
+ if (is_request()) {
+ if(has_totag()) {
+ if(check_route_param("nat=yes")) {
+ setbflag(FLB_NATB);
+ }
+ }
+ }
+ if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
+ return;
+
+ rtpproxy_manage("co");
+
+ if (is_request()) {
+ if (!has_totag()) {
+ if(t_is_branch_route()) {
+ add_rr_param(";nat=yes");
+ }
+ }
+ }
+ if (is_reply()) {
+ if(isbflagset(FLB_NATB)) {
+ set_contact_alias();
+ }
+ }
+#!endif
+ return;
+}
+
+# PSTN GW routing
+route[PSTN] {
+#!ifdef WITH_PSTN
+ # check if PSTN GW IP is defined
+ if (strempty($sel(cfg_get.pstn.gw_ip))) {
+ xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
+ return;
+ }
+
+ # route to PSTN dialed numbers starting with '+' or '00'
+ # (international format)
+ # - update the condition to match your dialing rules for PSTN routing
+ #if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
+ # return;
+
+ # only local users allowed to call
+ #if(from_uri!=myself) {
+ # sl_send_reply("403", "Not Allowed");
+ # exit;
+ #}
+
+ $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
+
+ route(RELAY);
+ exit;
+#!endif
+
+ return;
+}
+
+route[ECHO] {
+ $ru = "sip:echo@iptel.org";
+ route(RELAY);
+ exit;
+}
+
+route[TEST] {
+ $ru = "sip:music@iptel.org";
+ route(RELAY);
+ exit;
+}
+
+# Manage outgoing branches
+branch_route[MANAGE_BRANCH] {
+ xdbg("new branch [$T_branch_idx] to $ru\n");
+ route(NATMANAGE);
+}
+
+# Manage incoming replies
+onreply_route[MANAGE_REPLY] {
+ xdbg("incoming reply\n");
+ if(status=~"[12][0-9][0-9]")
+ route(NATMANAGE);
+}
+
+# Manage failure routing cases
+failure_route[MANAGE_FAILURE] {
+ route(NATMANAGE);
+
+ if (t_is_canceled()) {
+ exit;
+ }
+}
diff --git a/net/tmpl_std/osmo-sip-connector.cfg b/net/tmpl_std/osmo-sip-connector.cfg
new file mode 100644
index 0000000..953eccd
--- /dev/null
+++ b/net/tmpl_std/osmo-sip-connector.cfg
@@ -0,0 +1,6 @@
+app
+mncc
+ socket-path ${MSC_MNCC_SOCKET}
+sip
+ local ${SIPCON_LOCAL} ${SIPCON_LOCAL_PORT}
+ remote ${SIPCON_REMOTE} ${SIPCON_REMOTE_PORT}
diff --git a/net/tmpl_std/run.sh b/net/tmpl_std/run.sh
index cca7a75..829c236 100755
--- a/net/tmpl_std/run.sh
+++ b/net/tmpl_std/run.sh
@@ -58,9 +58,6 @@ term() {
find_term
-sudo tcpdump -i $dev -n -w current_log/$dev.single.pcap -U not port 22 &
-sudo tcpdump -i lo -n -w current_log/lo.single.pcap -U not port 22 &
-
hnbgw="osmo-hnbgw"
msc="gdb -ex run --args $(which osmo-msc)"
gbproxy="osmo-gbproxy"
@@ -74,6 +71,23 @@ hlr="LD_LIBRARY_PATH=/usr/local/lib gdb -ex run --args osmo-hlr"
stp="osmo-stp"
bsc="LD_LIBRARY_PATH=/usr/local/lib gdb -ex run --args osmo-bsc -c osmo-bsc.cfg"
+if [ "${SIPCON_ENABLE}" == "true" ]; then
+ sipcon="osmo-sip-connector -c osmo-sip-connector.cfg"
+ msc="$msc -M ${MSC_MNCC_SOCKET}"
+
+ # Require kamailio (PATH hack is needed for Debian)
+ kamailio="$(PATH="$PATH:/usr/sbin:/sbin" which kamailio)"
+ if [ -z "$kamailio" ]; then
+ echo "ERROR: kamailio is not installed, but it's required for SIPCON_ENABLE."
+ echo "After installing it, make sure that it does *not* run as daemon."
+ exit 1
+ fi
+ kamailio="$kamailio -f kamailio.cfg -D -e -E"
+fi
+
+sudo tcpdump -i $dev -n -w current_log/$dev.single.pcap -U not port 22 &
+sudo tcpdump -i lo -n -w current_log/lo.single.pcap -U not port 22 &
+
term "$ggsn" GGSN &
sleep .2
term "$stp" STP &
@@ -94,6 +108,13 @@ term "$hnbgw" HNBGW &
sleep .2
term "$bsc" BSC &
+if [ "${SIPCON_ENABLE}" == "true" ]; then
+ sleep .2
+ term "$sipcon" SIPCON &
+ sleep .2
+ term "$kamailio" KAMAILIO &
+fi
+
#ssh bts rm /tmp/bts.log /tmp/pcu.log
#ssh bts neels/run_remote.sh &
@@ -101,6 +122,12 @@ echo enter to close
read enter_to_close
echo Closing...
+if [ "${SIPCON_ENABLE}" == "true" ]; then
+ kill %13 %14
+ killall osmo-sip-connector
+ killall kamailio
+fi
+
#ssh bts neels/stop_remote.sh
kill %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12