[Users] Configurable nathelper nortpproxy string

Jeremie Le Hen jeremie at le-hen.org
Fri Sep 1 20:56:34 CEST 2006


Hi list,

I have made a small patch to the nathelper module, that allows to
configure the "a=nortpproxy:yes\r\n" string.

Basically, as noticed in user documentation, you can add this to your
configuration file, once the patch is applied and OpenSER recompiled :

% modparam("nathelper", "nortpproxy_str", "a=sdpmangled:yes")


I needed to do this because I have the following setup:

SoftPhone1_
           \____
            ____NATing Proxy_______Registrar Proxy_______(outside)
          _/
SoftPhone2


For some reason, the registrar also uses nathelper/rtpproxy.  I first used
the "f" flag for force_rtp_proxy() in my NATing proxy, in order to
circumvent the nortpproxy flag that the registrar proxy has set.  This
worked perfectly except if softphone1 tries to call softphone2.  In this
case my NATing proxy would replace the SDP twice.  With my patch, I simply
turn the nortpproxy string to something else that only my NATing proxy
cares about.

Please, commit it if you find it worth enough.

Thank you.
Best regards,
-- 
Jeremie Le Hen
< jeremie at le-hen dot org >< ttz at chchile dot org >
-------------- next part --------------
diff -urNp openser-1.1.0-notls/modules/nathelper/doc/nathelper_user.sgml openser-1.1.0-notls-nortpproxy_str/modules/nathelper/doc/nathelper_user.sgml
--- openser-1.1.0-notls/modules/nathelper/doc/nathelper_user.sgml	2006-06-07 15:29:07.000000000 +0200
+++ openser-1.1.0-notls-nortpproxy_str/modules/nathelper/doc/nathelper_user.sgml	2006-09-01 20:31:53.000000000 +0200
@@ -344,6 +344,26 @@ modparam("nathelper", "sipping_method", 
 </programlisting>
 		</example>
 	</section>
+	<section>
+		<title><varname>nortpproxy_str</varname> (string)</title>
+		<para>
+		The parameter sets the SDP attribute used by nathelper to mark
+		the packet SDP informations have already been mangled.
+		</para>
+		<para>
+		<emphasis>
+			Default value is <quote>a=nortpproxy:yes\r\n</quote>.
+		</emphasis>
+		</para>
+		<example>
+		<title>Set <varname>nortpproxy_str</varname> parameter</title>
+		<programlisting format="linespecific">
+...
+modparam("nathelper", "nortpproxy_str", "a=sdpmangled:yes")
+...
+</programlisting>
+		</example>
+	</section>
 	</section>
 
 
diff -urNp openser-1.1.0-notls/modules/nathelper/nathelper.c openser-1.1.0-notls-nortpproxy_str/modules/nathelper/nathelper.c
--- openser-1.1.0-notls/modules/nathelper/nathelper.c	2006-06-07 15:52:44.000000000 +0200
+++ openser-1.1.0-notls-nortpproxy_str/modules/nathelper/nathelper.c	2006-09-01 20:31:47.000000000 +0200
@@ -286,6 +286,15 @@ static pid_t mypid;
 static unsigned int myseqn = 0;
 static int rcv_avp_no = 42;
 
+/*
+ * This should have been defined right above replace_sdp_ip() but
+ * it is needed here.
+ */
+#define	ANORTPPROXY	"a=nortpproxy:yes\r\n"
+#define	ANORTPPROXY_LEN	(sizeof(ANORTPPROXY) - 1)
+static str nortpproxy_str = { ANORTPPROXY, ANORTPPROXY_LEN };
+static char *nortpproxy = NULL;
+
 
 struct rtpp_head {
 	struct rtpp_node	*rn_first;
@@ -336,6 +345,7 @@ static cmd_export_t cmds[] = {
 static param_export_t params[] = {
 	{"natping_interval",      INT_PARAM, &natping_interval      },
 	{"ping_nated_only",       INT_PARAM, &ping_nated_only       },
+	{"nortpproxy_str",        STR_PARAM, &nortpproxy            },
 	{"rtpproxy_sock",         STR_PARAM, &rtpproxy_sock         },
 	{"rtpproxy_disable",      INT_PARAM, &rtpproxy_disable      },
 	{"rtpproxy_disable_tout", INT_PARAM, &rtpproxy_disable_tout },
@@ -400,6 +410,11 @@ mod_init(void)
 		force_socket=grep_sock_info(&socket_str,0,0);
 	}
 
+	if (nortpproxy != NULL) {
+		nortpproxy_str.s = nortpproxy;
+		nortpproxy_str.len = strlen(nortpproxy);
+	}
+
 	if (natping_interval > 0) {
 		bind_usrloc = (bind_usrloc_t)find_export("ul_bind_usrloc", 1, 0);
 		if (!bind_usrloc) {
@@ -936,9 +951,6 @@ nat_uac_test_f(struct sip_msg* msg, char
 #define	AOLDMEDPRT	"a=oldmediaport:"
 #define	AOLDMEDPRT_LEN	(sizeof(AOLDMEDPRT) - 1)
 
-#define	ANORTPPROXY	"a=nortpproxy:yes\r\n"
-#define	ANORTPPROXY_LEN	(sizeof(ANORTPPROXY) - 1)
-
 
 static inline int 
 replace_sdp_ip(struct sip_msg* msg, str *org_body, char *line, str *ip)
@@ -1031,13 +1043,13 @@ fix_nated_sdp_f(struct sip_msg* msg, cha
 			}
 		}
 		if (level & ADD_ANORTPPROXY) {
-			buf = pkg_malloc(ANORTPPROXY_LEN * sizeof(char));
+			buf = pkg_malloc(nortpproxy_str.len * sizeof(char));
 			if (buf == NULL) {
 				LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
 				return -1;
 			}
-			memcpy(buf, ANORTPPROXY, ANORTPPROXY_LEN);
-			if (insert_new_lump_after(anchor, buf, ANORTPPROXY_LEN, 0)==NULL) {
+			memcpy(buf, nortpproxy_str.s, nortpproxy_str.len);
+			if (insert_new_lump_after(anchor, buf, nortpproxy_str.len, 0)==NULL) {
 				LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after "
 					"failed\n");
 				pkg_free(buf);
@@ -1811,15 +1823,15 @@ force_rtp_proxy2_f(struct sip_msg* msg, 
 		to_tag = tmp;
 	}
 	proxied = 0;
-	for (cp = body.s; (len = body.s + body.len - cp) >= ANORTPPROXY_LEN;) {
-		cp1 = ser_memmem(cp, ANORTPPROXY, len, ANORTPPROXY_LEN);
+	for (cp = body.s; (len = body.s + body.len - cp) >= nortpproxy_str.len;) {
+		cp1 = ser_memmem(cp, nortpproxy_str.s, len, nortpproxy_str.len);
 		if (cp1 == NULL)
 			break;
 		if (cp1[-1] == '\n' || cp1[-1] == '\r') {
 			proxied = 1;
 			break;
 		}
-		cp = cp1 + ANORTPPROXY_LEN;
+		cp = cp1 + nortpproxy_str.len;
 	}
 	if (proxied != 0 && force == 0)
 		return -1;
@@ -2037,7 +2049,7 @@ force_rtp_proxy2_f(struct sip_msg* msg, 
 	} /* Iterate sessions */
 
 	if (proxied == 0) {
-		cp = pkg_malloc(ANORTPPROXY_LEN * sizeof(char));
+		cp = pkg_malloc(nortpproxy_str.len * sizeof(char));
 		if (cp == NULL) {
 			LOG(L_ERR, "ERROR: force_rtp_proxy2: out of memory\n");
 			return -1;
@@ -2048,8 +2060,8 @@ force_rtp_proxy2_f(struct sip_msg* msg, 
 			pkg_free(cp);
 			return -1;
 		}
-		memcpy(cp, ANORTPPROXY, ANORTPPROXY_LEN);
-		if (insert_new_lump_after(anchor, cp, ANORTPPROXY_LEN, 0) == NULL) {
+		memcpy(cp, nortpproxy_str.s, nortpproxy_str.len);
+		if (insert_new_lump_after(anchor, cp, nortpproxy_str.len, 0) == NULL) {
 			LOG(L_ERR, "ERROR: force_rtp_proxy2: insert_new_lump_after failed\n");
 			pkg_free(cp);
 			return -1;


More information about the Users mailing list