Module: sip-router
Branch: master
Commit: 2750e03d4977d4a8f59ca0d2d0f59e1caec96b2d
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2750e03…
Author: Carsten Bock <carsten(a)ng-voice.com>
Committer: Carsten Bock <carsten(a)ng-voice.com>
Date: Mon Sep 17 17:25:38 2012 +0200
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.
---
modules/rtpproxy/doc/rtpproxy.xml | 8 ++++++++
modules/rtpproxy/doc/rtpproxy_admin.xml | 7 +++++++
modules/rtpproxy/rtpproxy.c | 22 +++++++++++++++++++++-
3 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/modules/rtpproxy/doc/rtpproxy.xml b/modules/rtpproxy/doc/rtpproxy.xml
index d5a15ee..741a4d9 100644
--- a/modules/rtpproxy/doc/rtpproxy.xml
+++ b/modules/rtpproxy/doc/rtpproxy.xml
@@ -57,6 +57,14 @@
<email>osas(a)voipembedded.com</email>
</address>
</editor>
+ <editor>
+ <firstname>Carsten</firstname>
+ <surname>Bock</surname>
+ <affiliation><orgname>ng-voice GmbH</orgname></affiliation>
+ <address>
+ <email>carsten(a)ng-voice.com</email>
+ </address>
+ </editor>
</authorgroup>
<copyright>
<year>2003-2008</year>
diff --git a/modules/rtpproxy/doc/rtpproxy_admin.xml
b/modules/rtpproxy/doc/rtpproxy_admin.xml
index a245d73..d6a9dc5 100644
--- a/modules/rtpproxy/doc/rtpproxy_admin.xml
+++ b/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
diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c
index 9a0fd14..59e7092 100644
--- a/modules/rtpproxy/rtpproxy.c
+++ b/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