Преглед изворни кода

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 година
родитељ
комит
2750e03d49

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

@@ -57,6 +57,14 @@
 			<email>[email protected]</email>
 		</address>
 		</editor>
+		<editor>
+		<firstname>Carsten</firstname>
+		<surname>Bock</surname>
+		<affiliation><orgname>ng-voice GmbH</orgname></affiliation>
+		<address>
+			<email>[email protected]</email>
+		</address>
+		</editor>
 	</authorgroup>
 	<copyright>
 		<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!
 				</para></listitem>
 				<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
 				inserted by another rtpproxy in transit to indicate that the
 				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 */
 	};
 	int iovec_param_count;
+	int autobridge_ipv4v6;
 
 	char *c1p, *c2p, *bodylimit, *o1p;
 	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");
 		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++) {
 		switch (*cp) {
 		case '1':
@@ -2076,6 +2077,11 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 			orgip = 1;
 			break;
 
+		case 'x':
+		case 'X':
+			autobridge_ipv4v6 = 1;
+			break;
+
 		case 'w':
 		case 'W':
 			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 */
 			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) {
 					LM_ERR("out of pkg memory\n");
 					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. */
 				v[1].iov_base = opts.s.s;
 				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(oldport, v[11]);
 #ifdef EXTRA_DEBUG