[sr-dev] git:master: kamailio.cfg: reworked nat traversal config

Daniel-Constantin Mierla miconda at gmail.com
Sat May 28 23:32:32 CEST 2011


Module: sip-router
Branch: master
Commit: cf598f3229b7b381fd4d2a381bafbb8f7c0be0d1
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=cf598f3229b7b381fd4d2a381bafbb8f7c0be0d1

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Sat May 28 23:30:43 2011 +0200

kamailio.cfg: reworked nat traversal config

- groupped the nat traversal login in NATDETECT and NATMANAGE route
  blocks, simplifying by using rtpproxy_manage() function
- nat traversal logic for requests is applied in branch_route for proper
  optimization of serial/parallel forking

---

 etc/kamailio.cfg |   90 ++++++++++++++++++++++++++++--------------------------
 1 files changed, 47 insertions(+), 43 deletions(-)

diff --git a/etc/kamailio.cfg b/etc/kamailio.cfg
index 77cdce9..3ee11e4 100644
--- a/etc/kamailio.cfg
+++ b/etc/kamailio.cfg
@@ -423,7 +423,7 @@ route {
 	route(REQINIT);
 
 	# NAT detection
-	route(NAT);
+	route(NATDETECT);
 
 	# handle requests within SIP dialogs
 	route(WITHINDLG);
@@ -484,20 +484,15 @@ route {
 
 
 route[RELAY] {
-#!ifdef WITH_NAT
-	if (check_route_param("nat=yes")) {
-		setbflag(FLB_NATB);
-	}
-	if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {
-		route(RTPPROXY);
-	}
-#!endif
 
-	/* example how to enable some additional event routes */
+	# enable additional event routes for forwarded requests
+	# - serial forking, RTP relaying handling, a.s.o.
+	if (is_method("INVITE|SUBSCRIBE")) {
+		t_on_branch("MANAGE_BRANCH");
+		t_on_reply("MANAGE_REPLY");
+	}
 	if (is_method("INVITE")) {
-		#t_on_branch("BRANCH_ONE");
-		t_on_reply("REPLY_ONE");
-		t_on_failure("FAIL_ONE");
+		t_on_failure("MANAGE_FAILURE");
 	}
 
 	if (!t_relay()) {
@@ -551,6 +546,10 @@ route[WITHINDLG] {
 				setflag(FLT_ACC); # do accounting ...
 				setflag(FLT_ACCFAILED); # ... even if the transaction fails
 			}
+			if ( is_method("ACK") ) {
+				# ACK is forwarded statelessy
+				route(NATMANAGE);
+			}
 			route(RELAY);
 		} else {
 			if (is_method("SUBSCRIBE") && uri == myself) {
@@ -733,11 +732,11 @@ route[AUTH] {
 }
 
 # Caller NAT detection route
-route[NAT] {
+route[NATDETECT] {
 #!ifdef WITH_NAT
 	force_rport();
 	if (nat_uac_test("19")) {
-		if (method=="REGISTER") {
+		if (is_method("REGISTER")) {
 			fix_nated_register();
 		} else {
 			fix_nated_contact();
@@ -749,14 +748,30 @@ route[NAT] {
 }
 
 # RTPProxy control
-route[RTPPROXY] {
+route[NATMANAGE] {
 #!ifdef WITH_NAT
-	if (is_method("BYE")) {
-		unforce_rtp_proxy();
-	} else if (is_method("INVITE")){
-		rtpproxy_offer();
+	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();
+
+	if (is_request()) {
+		if (!has_totag()) {
+			add_rr_param(";nat=yes");
+		}
+	}
+	if (is_reply()) {
+		if(isbflagset(FLB_NATB)) {
+			fix_nated_contact();
+		}
 	}
-	if (!has_totag()) add_rr_param(";nat=yes");
 #!endif
 	return;
 }
@@ -842,33 +857,22 @@ route[TOVOICEMAIL] {
 	return;
 }
 
-# Sample branch router
-branch_route[BRANCH_ONE] {
-	xdbg("new branch at $ru\n");
+# manage outgoing branches
+branch_route[MANAGE_BRANCH] {
+	xdbg("new branch [$T_branch_idx] to $ru\n");
+	route(NATMANAGE);
 }
 
-# Sample onreply route
-onreply_route[REPLY_ONE] {
+# manage incoming replies
+onreply_route[MANAGE_REPLY] {
 	xdbg("incoming reply\n");
-#!ifdef WITH_NAT
-	if ((isflagset(FLT_NATS) || isbflagset(FLB_NATB))
-			&& status=~"(183)|(2[0-9][0-9])") {
-		rtpproxy_answer();
-	}
-	if (isbflagset("6")) {
-		fix_nated_contact();
-	}
-#!endif
+	if(status=~"[12][0-9][0-9]")
+		route(NATMANAGE);
 }
 
-# Sample failure route
-failure_route[FAIL_ONE] {
-#!ifdef WITH_NAT
-	if (is_method("INVITE")
-			&& (isbflagset(FLB_NATB) || isflagset(FLT_NATS))) {
-		unforce_rtp_proxy();
-	}
-#!endif
+# manage failure routing cases
+failure_route[MANAGE_FAILURE] {
+	route(NATMANAGE);
 
 	if (t_is_canceled()) {
 		exit;




More information about the sr-dev mailing list