Module: sip-router Branch: master Commit: 2750e03d4977d4a8f59ca0d2d0f59e1caec96b2d URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2750e03d...
Author: Carsten Bock carsten@ng-voice.com Committer: Carsten Bock carsten@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@voipembedded.com</email> </address> </editor> + <editor> + <firstname>Carsten</firstname> + <surname>Bock</surname> + <affiliation><orgname>ng-voice GmbH</orgname></affiliation> + <address> + <email>carsten@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