Module: sip-router
Branch: tmp/k3.0_sr_backports
Commit: c80f76803d771997d33a4b26f7249e6888103c12
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c80f768…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Feb 11 22:22:12 2010 +0200
modules/mediaproxy: properly fix the IP in the RTCP line
- Properly fix the IP in the RTCP line (if present in the SDP). Patch
provided by Saul Ibarra Corretge.
(cherry picked from commit 2a95f9bf915cfc3cf11374f9b8f0f547d4eb4955)
(cherry picked from commit ef10212404b9bc5489683fc7429fee40b3495994)
---
modules/mediaproxy/mediaproxy.c | 37 +++++++++++++++++++++++++++++++++++++
1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/modules/mediaproxy/mediaproxy.c b/modules/mediaproxy/mediaproxy.c
index acedf5b..ff633ba 100644
--- a/modules/mediaproxy/mediaproxy.c
+++ b/modules/mediaproxy/mediaproxy.c
@@ -127,6 +127,7 @@ typedef struct {
str type; // stream type (`audio', `video', `image', ...)
str ip;
str port;
+ str rtcp_ip; // pointer to the rtcp IP if explicitly specified by stream
str rtcp_port; // pointer to the rtcp port if explicitly specified by stream
str direction;
Bool local_ip; // true if the IP is locally defined inside this media stream
@@ -827,6 +828,34 @@ get_rtcp_port_attribute(str *block)
}
+// will return the rtcp IP of the stream in the given block
+// if defined by the stream, otherwise will return {NULL, 0}.
+static str
+get_rtcp_ip_attribute(str *block)
+{
+ str zone, tokens[4], undefined = {NULL, 0};
+ char *ptr;
+ int count;
+
+ ptr = find_line_starting_with(block, "a=rtcp:", False);
+
+ if (!ptr)
+ return undefined;
+
+ zone.s = ptr + 7;
+ zone.len = findendline(zone.s, block->s + block->len - zone.s) - zone.s;
+
+ count = get_str_tokens(&zone, tokens, 4);
+
+ if (count != 4) {
+ LM_ERR("invalid `a=rtcp' line in SDP body\n");
+ return undefined;
+ }
+
+ return tokens[3];
+}
+
+
// will return the ip address present in a `c=' line in the given block
// returns: -1 on error, 0 if not found, 1 if found
static int
@@ -1073,6 +1102,7 @@ get_session_info(str *sdp, SessionInfo *session)
session->streams[i].local_ip = 1;
}
+ session->streams[i].rtcp_ip = get_rtcp_ip_attribute(&block);
session->streams[i].rtcp_port = get_rtcp_port_attribute(&block);
session->streams[i].direction = get_direction_attribute(&block,
&session->direction);
}
@@ -1491,6 +1521,13 @@ use_media_proxy(struct sip_msg *msg, char *dialog_id)
}
}
+ if (stream.rtcp_ip.len > 0) {
+ if (!replace_element(msg, &stream.rtcp_ip, &tokens[0])) {
+ LM_ERR("failed to replace RTCP IP in media stream number %d\n",
i+1);
+ return -1;
+ }
+ }
+
if (stream.local_ip && !isnulladdr(stream.ip)) {
if (!replace_element(msg, &stream.ip, &tokens[0])) {
LM_ERR("failed to replace IP address in media stream number
%d\n", i+1);