Browse Source

New Option: "x" for automatic bridging between IPv4 and IPv6.
Based on the following assumption: "i" is the IPv4 interface
and "e" is the IPv6 interface on the RTPProxy (tested with both
RTPProxy and Sipwise's ngcp-mediaproxy-ng).

Mechanism is as follows:
- IP in SDP is IPv4: Do bridging "ie"
- IP in SDP is IPv6: Do bridging "ei"

Not a big deal, but makes the configuration much more easier.

Carsten Bock 13 years ago
parent
commit
2750e03d49

+ 8 - 0
modules/rtpproxy/doc/rtpproxy.xml

@@ -57,6 +57,14 @@
 			<email>[email protected]</email>
 			<email>[email protected]</email>
 		</address>
 		</address>
 		</editor>
 		</editor>
+		<editor>
+		<firstname>Carsten</firstname>
+		<surname>Bock</surname>
+		<affiliation><orgname>ng-voice GmbH</orgname></affiliation>
+		<address>
+			<email>[email protected]</email>
+		</address>
+		</editor>
 	</authorgroup>
 	</authorgroup>
 	<copyright>
 	<copyright>
 		<year>2003-2008</year>
 		<year>2003-2008</year>

+ 7 - 0
modules/rtpproxy/doc/rtpproxy_admin.xml

@@ -344,6 +344,13 @@ rtpproxy_offer();
 				the 'w' flag for clients behind NAT! See also above notes!
 				the 'w' flag for clients behind NAT! See also above notes!
 				</para></listitem>
 				</para></listitem>
 				<listitem><para>
 				<listitem><para>
+				<emphasis>x</emphasis> - this flag will do automatic bridging between IPv4 on the
+				"internal network" and IPv6 on the "external network". The distinction is done by
+				the given IP in the SDP, e.g. a IPv4 Address will always call "ie" to the RTPProxy
+				(IPv4(i) to IPv6(e)) and an IPv6Address will always call "ei" to the RTPProxy (IPv6(e)
+				to IPv4(i)).
+				</para></listitem>
+				<listitem><para>
 				<emphasis>f</emphasis> - instructs rtpproxy to ignore marks
 				<emphasis>f</emphasis> - instructs rtpproxy to ignore marks
 				inserted by another rtpproxy in transit to indicate that the
 				inserted by another rtpproxy in transit to indicate that the
 				session is already goes through another proxy. Allows creating
 				session is already goes through another proxy. Allows creating

+ 21 - 1
modules/rtpproxy/rtpproxy.c

@@ -1993,6 +1993,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 		{NULL, 0},	/* Timeout-Socket */
 		{NULL, 0},	/* Timeout-Socket */
 	};
 	};
 	int iovec_param_count;
 	int iovec_param_count;
+	int autobridge_ipv4v6;
 
 
 	char *c1p, *c2p, *bodylimit, *o1p;
 	char *c1p, *c2p, *bodylimit, *o1p;
 	char itoabuf_buf[20];
 	char itoabuf_buf[20];
@@ -2012,7 +2013,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 		LM_ERR("out of pkg memory\n");
 		LM_ERR("out of pkg memory\n");
 		FORCE_RTP_PROXY_RET (-1);
 		FORCE_RTP_PROXY_RET (-1);
 	}
 	}
-	flookup = force = real = orgip = commip = via = 0;
+	flookup = force = real = orgip = commip = via = autobridge_ipv4v6 = 0;
 	for (cp = str1; cp != NULL && *cp != '\0'; cp++) {
 	for (cp = str1; cp != NULL && *cp != '\0'; cp++) {
 		switch (*cp) {
 		switch (*cp) {
 		case '1':
 		case '1':
@@ -2076,6 +2077,11 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 			orgip = 1;
 			orgip = 1;
 			break;
 			break;
 
 
+		case 'x':
+		case 'X':
+			autobridge_ipv4v6 = 1;
+			break;
+
 		case 'w':
 		case 'w':
 		case 'W':
 		case 'W':
 			if (append_opts(&opts, 'S') == -1) {
 			if (append_opts(&opts, 'S') == -1) {
@@ -2253,6 +2259,12 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 			}
 			}
 			/* XXX must compare address families in all addresses */
 			/* XXX must compare address families in all addresses */
 			if (pf == AF_INET6) {
 			if (pf == AF_INET6) {
+				if (autobridge_ipv4v6 != 0) {
+					if ((append_opts(&opts, 'E') == -1) && (append_opts(&opts, 'I') == -1))  {
+						LM_ERR("out of pkg memory\n");
+						FORCE_RTP_PROXY_RET (-1);
+					}
+				}
 				if (append_opts(&opts, '6') == -1) {
 				if (append_opts(&opts, '6') == -1) {
 					LM_ERR("out of pkg memory\n");
 					LM_ERR("out of pkg memory\n");
 					FORCE_RTP_PROXY_RET (-1);
 					FORCE_RTP_PROXY_RET (-1);
@@ -2260,7 +2272,15 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 				/* We need to update the pointers and the length here, it has changed. */
 				/* We need to update the pointers and the length here, it has changed. */
 				v[1].iov_base = opts.s.s;
 				v[1].iov_base = opts.s.s;
 				v[1].iov_len = opts.oidx;
 				v[1].iov_len = opts.oidx;
+			} else {
+				if (autobridge_ipv4v6 != 0) {
+					if ((append_opts(&opts, 'I') == -1) && (append_opts(&opts, 'E') == -1))  {
+						LM_ERR("out of pkg memory\n");
+						FORCE_RTP_PROXY_RET (-1);
+					}
+				}
 			}
 			}
+
 			STR2IOVEC(newip, v[9]);
 			STR2IOVEC(newip, v[9]);
 			STR2IOVEC(oldport, v[11]);
 			STR2IOVEC(oldport, v[11]);
 #ifdef EXTRA_DEBUG
 #ifdef EXTRA_DEBUG