Просмотр исходного кода

- fixed identation
- added modified RTP-Proxy (rtpproxy.tar.gz, based on latest git, needs some cleanup)
(please note, that you have to have libcurl-dev and libxmlrpc-client (same as for Kamailio-mi_xmlrpc) installed)
- some simple testing files (sample config, command line parameters for pjsua (used for testing) and rtpproxy)

Carsten Bock 15 лет назад
Родитель
Сommit
63bf1d6a04

+ 1 - 1
modules_k/rtpproxy/rtpproxy.c

@@ -407,7 +407,7 @@ static param_export_t params[] = {
 	{"rtpproxy_disable_tout", INT_PARAM, &rtpproxy_disable_tout },
 	{"rtpproxy_retr",         INT_PARAM, &rtpproxy_retr         },
 	{"rtpproxy_tout",         INT_PARAM, &rtpproxy_tout         },
-	{"timeout_socket",    STR_PARAM, &timeout_socket_str.s  },
+	{"timeout_socket",    	  STR_PARAM, &timeout_socket_str.s  },
 	{0, 0, 0}
 };
 

+ 3 - 0
modules_k/rtpproxy/test/exec_pjsua.txt

@@ -0,0 +1,3 @@
+./pjsua-i686-pc-linux-gnu --registrar=sip:localhost --id=sip:1@localhost --realm=localhost --username=1 --password=none --local-port=15060 --null-audio --auto-answer=200
+
+./pjsua-i686-pc-linux-gnu --registrar=sip:localhost --id=sip:2@localhost --realm=localhost --username=2 --password=none --local-port=15061 --null-audio sip:1@localhost

+ 1 - 0
modules_k/rtpproxy/test/exec_rtpproxy.txt

@@ -0,0 +1 @@
+./rtpproxy -T 10 -f -F -i -l 195.71.4.179 -s udp:*:22222 -d DBUG

+ 359 - 0
modules_k/rtpproxy/test/kamailio.cfg

@@ -0,0 +1,359 @@
+#!KAMAILIO
+
+# ----------------- Error-Logging ---------------
+debug=2
+log_stderror=no
+#configure the /etc/syslog.conf for this feature
+#log_facility=LOG_LOCAL1
+
+# ----------------- Basic-Settings ---------------
+fork=yes
+children=2
+check_via=no
+dns=no
+rev_dns=no
+listen=127.0.0.1
+
+port=5060
+
+sip_warning=0
+
+############################
+# TCP-Support
+############################
+disable_tcp=yes
+
+disable_core_dump=yes
+auto_aliases=no
+tos=0x80
+
+# ------------------ module loading ----------------------------------
+mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
+# To Check/modufy the maximum forwards
+loadmodule "maxfwd.so"
+# Transaction-Module
+loadmodule "tm.so"
+# For Stateless replies
+loadmodule "sl.so"
+# Extended Logging
+loadmodule "xlog.so"
+# Record-/Loose-Routing-Module (RFC3261)
+loadmodule "rr.so"
+# NAT-Traversal
+loadmodule "nathelper.so"
+loadmodule "rtpproxy.so"
+# Generic Utilities (formerly options.so and uri.so)
+loadmodule "siputils.so"
+# MI-FIFO-Wrapper
+loadmodule "mi_fifo.so"
+# MI-XML-RPC-Wrapper
+loadmodule "mi_rpc.so"
+loadmodule "mi_xmlrpc.so"
+
+# Module for Pseudo-Variables
+loadmodule "pv.so"
+# Module for Dialog 
+loadmodule "dialog.so"
+# Sanity: Check if request is ok by syntax
+loadmodule "sanity.so"
+# Textops provides the method "is_method"
+loadmodule "textops.so"
+# UAC provides the method "uac_replace_from"
+loadmodule "uac.so"
+loadmodule "kex.so"
+loadmodule "tmx.so"
+loadmodule "usrloc.so"
+loadmodule "registrar.so"
+
+# ----------------- Settings for Nathelper ---------------
+# Nathelper: RTP-Proxy-List
+modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:22222")
+# Nathelper: RTP-Proxy Timeout
+modparam("rtpproxy", "rtpproxy_tout", 3)
+modparam("rtpproxy", "timeout_socket", "http://localhost:8000/RPC2")
+
+# ----------------- Settings for max-fwd ---------------
+# Max-Forward-Module: Set the maximum to 20
+modparam("maxfwd", "max_limit", 20)
+
+# ----------------- Settings for rr ---------------
+# RR Module: Enable the From-Tag in RR-Header
+modparam("rr", "append_fromtag", 1)
+
+# ----------------- Settings for mi_fifo-Wrapper ---------------
+modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
+
+# ----------------- Settings for mi_XML_RPC ---------------
+# The Port for incoming XML-RPC requests
+modparam("mi_xmlrpc", "port", 8000)
+# Method-Response: A single string parameter should be replied.
+# See: http://www.openser.org/docs/modules/1.2.x/mi_xmlrpc.html#AEN102
+modparam("mi_xmlrpc", "reply_option", 1)
+# The size of the Buffer used to create the XML-RPC-Request-Node
+modparam("mi_xmlrpc", "buffer_size",  8192)
+# The logfile for the xml-rpc server 
+# #modparam("mi_xmlrpc", "log_file", "/tmp/openser_xmlrpc")
+
+# ----------------- Settings for Dialog-Module ---------------
+# The Name of the Tag in the RR-Route-Header (default "did")
+modparam("dialog", "rr_param", "rtp")
+# Flag to be used for marking if a dialog should be constructed for the current request (make sense only for initial requests).
+modparam("dialog", "dlg_flag", 1)
+# The default dialog timeout (in seconds) if no custom one is set. Default value is "43200 (12 hours)".
+modparam("dialog", "default_timeout", 7230)
+
+# How the seqential requests should be matched against the known dialogs.
+# The modes are a combination between matching based on a cookie (DID) stored as cookie in Record-Route header and the matching based on SIP elements (as in RFC3261).
+# The supported modes are:
+# 0 - DID_ONLY - the match is done exclusivly based on DID (default);
+# 1 - DID_FALLBACK - the match is first tried based on DID and if not present, it will fallback to SIP matching;
+# 2 - DID_NONE - the match is done exclusivly based on SIP elements; no DID information is added in RR.
+modparam("dialog", "dlg_match_mode", 1)
+# Describe how to push into the DB the dialogs' information from memory.
+# The supported modes are:
+# 0 - NO_DB - the memory content is not flushed into DB;
+# 1 - REALTIME - any dialog information changes will be reflected into the database immediatly.
+# 2 - DELAYED - the dialog information changes will be flushed into DB periodically, based on a timre routine.
+modparam("dialog", "db_mode", 0)
+# The interval (seconds) at which to update dialogs' information if you chose to store the dialogs' info at a given interval.
+# A too short interval will generate intensiv database operations, a too large one will not notice short dialogs.
+# Default value is "60".
+# modparam("dialog", "db_update_period", 100)
+# The number of dialogs to be fetched per loop
+#modparam("dialog", "db_fetch_rows", 120)
+
+modparam("registrar", "max_expires", 60);
+modparam("registrar", "received_avp", "$avp(i:100)");
+modparam("nathelper", "received_avp", "$avp(i:100)");
+
+route {
+	if (!is_method("REGISTER"))
+		xlog("L_ERR", "$rm from $fU to $rU ($ci)\n");
+	route(1);
+	
+	##################################################################################################################
+	# Subsequential requests
+	###############################################################################################################
+	if (has_totag() && !is_method("REGISTER")) {
+		route(2);
+	}
+
+	##################################################################################################################
+	# Record-Route, damit alle Nachrichten ueber diesen SIP-Proxy laufen
+	###############################################################################################################
+	if (!is_method("REGISTER|MESSAGE")) record_route();
+
+	if (loose_route()) {
+		# This is not from a proxy, decline the request. This is not allowed.
+		log(1, "Preloaded Route, not to ourselfs\n");
+		if (!is_method("ACK")) send_reply("403", "Preload Route denied");
+		exit;
+	}
+
+	##################################################################################################################
+	# BYE and ACK Requests should always have an To-Tag, if they follow RFC
+	###############################################################################################################
+	if (is_method("BYE")) {
+		send_reply("400", "Missing to-tag");
+		exit;
+	}
+	if (is_method("ACK")) {
+		exit;		
+	}
+
+	##################################################################################################################
+	# We only allow INVITE's towards the Class IV, no other methods allowed:
+	# RFC: 21.4.6 405 Method Not Allowed
+	# The method specified in the Request-Line is understood, but not allowed for the address identified by the Request-URI.
+	###############################################################################################################
+	if (is_method("REGISTER")) {
+		fix_nated_register();
+		save("location");
+		exit;
+	}
+
+
+	##################################################################################################################
+	# We only allow INVITE's towards the Class IV, no other methods allowed:
+	# RFC: 21.4.6 405 Method Not Allowed
+	# The method specified in the Request-Line is understood, but not allowed for the address identified by the Request-URI.
+	###############################################################################################################
+	if (!is_method("INVITE")) {
+		send_reply("405", "Method Not Allowed");
+		exit;
+	}
+	fix_nated_contact();
+
+	if (!lookup("location")) {
+		send_reply("404", "Not found");
+		exit;
+	}
+
+	##################################################################################################################
+	# The dialog module should be aware of this dialog:
+	###############################################################################################################
+	setflag(1);
+
+	##################################################################################################################
+	# Use RTP-Proxy
+	###############################################################################################################
+	if (!force_rtp_proxy("arf")) {
+		sl_send_reply("503", "No RTP-Relay available");
+		exit;
+	}
+	t_on_reply("1");
+
+	# Relay this statefully
+	t_relay();
+
+	exit;	
+}
+
+##################################################################################################################
+# Route for standard-checks (e. g. too many hops, re-transmits, CANCEL without a transaction)
+###############################################################################################################
+route[1] {
+	##################################################################################################################
+	# Sanity: Check if the syntax of the request is ok
+	# The following checks are available:
+	#
+	# * ruri sip version - (1) - checks if the SIP version in the request URI is supported, currently only 2.0.
+	# * ruri scheme - (2) - checks if the URI scheme of the request URI is supported (sip[s]|tel[s]) by Kamailio.
+	# * required headers - (4) -checks if the minimum set of required headers to, from, cseq, callid and via is 
+	#	present in the request.
+	# * via sip version - (8) - not working because parser fails already when another version then 2.0 is present.
+	# * via protocol - (16) - not working because parser fails already if an unsupported transport is present.
+	# * cseq method - (32) - checks if the method from the cseq header is equal to the request method.
+	# * cseq value - (64) - checks if the number in the cseq header is a valid unsigend integer.
+	# * content length - (128) - checks if the size of the body matches with the value from the content length header.
+	# * expires value - (256) - checks if the value of the expires header is a valid unsigned integer.
+	# * proxy require - (512) - checks if all items of the proxy require header are present in the list of the
+	#	extensions from the module parameter proxy_require.
+	# * parse uri's - (1024) - checks if the specified URIs are present and parseable by the Kamailio parsers
+	# * digest credentials (2048) Check all instances of digest credentials in a message. The test checks whether
+	#	there are all required digest parameters and have meaningful values. 
+	###############################################################################################################
+	if (is_method("INVITE")) {
+		# Checks: 1, 2, 4, 32, 64, 128, 1024 (with all URI's)
+		if (!sanity_check("1255")) {
+			xlog("malformed message from $si:$sp ($rm)\n");
+			exit;
+		}	
+	} else if (is_method("REGISTER")) {
+		# Checks: 1, 2, 4, 32, 64, 256, 1024 (with all URI's)
+		if (!sanity_check("1383")) {
+			xlog("malformed message from $si:$sp ($rm)\n");
+			exit;
+		}	
+	}
+
+	##################################################################################################################
+	# Check for too many hops
+	###############################################################################################################
+	if (!mf_process_maxfwd_header("20")) {
+	 	if (!is_method("ACK")) send_reply("483","To Many Hops");
+	 	exit;
+	};
+	
+	##################################################################################################################
+	# Standard-Options-Requests beantworten
+	###############################################################################################################
+	# xlog("L_ERR", "$rm $ru ($rU)\n");
+	if (is_method("OPTIONS")) {
+		# xlog("L_ERR", "$$rU not set or ping: $rU\n");
+		options_reply();
+		exit;
+	}	
+
+	##################################################################################################################
+	# Check for Re-Transmissions (nicht bei ACK/CANCEL)
+	###############################################################################################################
+	if (!is_method("CANCEL|ACK|PRACK")) {
+		if (t_check_trans()) {
+			# log(1, "Re-Transmission detected, message dropped.\n");
+			# Drop the message silently.
+			exit;
+		}
+	}
+
+	##################################################################################################################
+	# CANCEL without Transaction? Drop it. Otherwise: relay them.
+	###############################################################################################################
+	if (is_method("CANCEL")) {
+		# In case the INVITE is not finally processed (and so no TA is available), the SIP-UA must re-transmit.
+		if (!t_check_trans()) {
+			# No according transaction exists, just relay the cancel.
+			if (!forward()) {
+				xlog("L_ERR", "Unable to forward $rm $ru\n"); 
+			}
+			exit;
+		}
+		# There is a Transaction for this CANCEL
+		if (!t_relay()) {
+			exit;
+		}
+		exit;
+	}
+}
+
+##################################################################################################################
+# Route processing subsequential requests
+###############################################################################################################
+route[2] {
+	##################################################################################################################
+	# Record-Route, damit alle Nachrichten �ber diesen SIP-Proxy laufen
+	###############################################################################################################
+	if (!is_method("MESSAGE")) record_route();
+	
+	##################################################################################################################
+	# Loose-Routing (RFC3261)
+	###############################################################################################################
+	# Record-Route-Header entfernen
+	if (!loose_route()) {
+		##################################################################################################################
+		# Non loose, but stateful ACK: Relay.
+		###############################################################################################################
+		if (is_method("ACK") && (!t_check_trans())) {
+			forward();
+			exit;
+		}
+	}
+		
+	##################################################################################################################
+	# Retrieve NAT-Information from URI
+	# + NAT-Handling
+	###############################################################################################################
+	t_on_reply("1");
+
+	# This is a BYE? Tear down session on the RTP-Proxy.
+	if (is_method("BYE")) {
+		xlog("L_ERR", "RTP-Statistic: $rtpstat\n");
+		unforce_rtp_proxy();
+	}
+
+	# Relay this statefully
+	t_relay();
+	# Exit here.
+	exit;	
+}
+
+##################################################################################################################
+# Antwort-Route (Nathelper/RTP-Proxy)
+###############################################################################################################
+onreply_route[1] {	
+	# A Transaction from a NATed Client to a NATed Client? Use the RTP-Proxy!
+	if (status=~"(180)|(183)|(2[0-9][0-9])") {
+		fix_nated_contact();
+		# Content-Length prüfen
+		if (!search("^Content-Length:[ ]*0")) {
+			force_rtp_proxy("arf");
+                }
+        }
+}
+
+#route[XMLRPC]{
+#	if search("^User-Agent:.*xmlrpclib"))
+#		set_reply_close();
+#	set_reply_no_connect(); # optional
+#	dispatch_rpc();
+#}

BIN
modules_k/rtpproxy/test/rtpproxy.tar.gz