Change in osmo-dev[master]: Support osmo-sip-connector with kamailio

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

osmith gerrit-no-reply at lists.osmocom.org
Fri Sep 28 10:16:19 UTC 2018


osmith has uploaded this change for review. ( https://gerrit.osmocom.org/11144


Change subject: Support osmo-sip-connector with kamailio
......................................................................

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
---
M net/config_2g3g
A net/tmpl_std/kamailio.cfg
A net/tmpl_std/osmo-sip-connector.cfg
M net/tmpl_std/run.sh
4 files changed, 462 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-dev refs/changes/44/11144/1

diff --git a/net/config_2g3g b/net/config_2g3g
index 266997f..05e82ea 100644
--- a/net/config_2g3g
+++ b/net/config_2g3g
@@ -30,6 +30,7 @@
 HLR_IP="127.0.0.1"
 
 MSC_PC="0.23.1"
+MSC_MNCC_SOCKET="/tmp/bsc_mncc"
 
 AUTH=optional
 ENCR_A5=0
@@ -71,3 +72,9 @@
 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..070ca55
--- /dev/null
+++ b/net/tmpl_std/kamailio.cfg
@@ -0,0 +1,418 @@
+#!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
+
+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 at 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 at iptel.org";
+	route(RELAY);
+	exit;
+}
+
+route[TEST] {
+	$ru = "sip:music at 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 4d45686..1d4d8d3 100755
--- a/net/tmpl_std/run.sh
+++ b/net/tmpl_std/run.sh
@@ -60,6 +60,24 @@
 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 (sudo because Debian won't find it otherwise)
+  kamailio="$(sudo 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"
+
+  # Create /var/run/kamailio
+  sudo mkdir -p /var/run/kamailio
+  sudo chown -R $(id -u) /var/run/kamailio
+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 &
 
@@ -83,6 +101,13 @@
 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 &
 
@@ -90,6 +115,12 @@
 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

-- 
To view, visit https://gerrit.osmocom.org/11144
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-dev
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia5c4e9992eab390bc6d26ada7564223ff41a01b2
Gerrit-Change-Number: 11144
Gerrit-PatchSet: 1
Gerrit-Owner: osmith <osmith at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180928/3c679193/attachment.htm>


More information about the gerrit-log mailing list