From 5f28931a1f876f585a1918f6bc0b0d40620852d7 Mon Sep 17 00:00:00 2001
From: Joshua Colp <jcolp@digium.com>
Date: Tue, 6 Nov 2012 12:09:45 +0000
Subject: [PATCH] Fix a bug where our Motif ICE candidates were not quite
 proper, and make us more forgiving.

An issue was reported on the mailing list where calling would result in an "Incomplete
ICE-UDP candidate received on session" error message. This is the result of the ICE-UDP
candidate code not placing a "network" attribute within the candidates. This is now done.
To increase compatibility though I have removed the requirement for the "network" attribute
to exist within ICE-UDP candidates that are received since we don't actually require the
value.

Reported on the mailing list by Jean-Denis Girard.


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@375925 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_motif.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/channels/chan_motif.c b/channels/chan_motif.c
index 4b4f36a3c4..4a2a50e22d 100644
--- a/channels/chan_motif.c
+++ b/channels/chan_motif.c
@@ -775,6 +775,7 @@ static int jingle_add_ice_udp_candidates_to_transport(struct ast_rtp_instance *r
 		snprintf(tmp, sizeof(tmp), "%d", ast_str_hash(candidate->foundation));
 		iks_insert_attrib(local_candidate, "foundation", tmp);
 		iks_insert_attrib(local_candidate, "generation", "0");
+		iks_insert_attrib(local_candidate, "network", "0");
 		snprintf(tmp, sizeof(tmp), "%04lx", ast_random() & 0xffff);
 		iks_insert_attrib(local_candidate, "id", tmp);
 		iks_insert_attrib(local_candidate, "ip", ast_sockaddr_stringify_host(&candidate->address));
@@ -1956,16 +1957,16 @@ static int jingle_interpret_ice_udp_transport(struct jingle_session *session, ik
 	for (candidate = iks_child(transport); candidate; candidate = iks_next(candidate)) {
 		char *component = iks_find_attrib(candidate, "component"), *foundation = iks_find_attrib(candidate, "foundation");
 		char *generation = iks_find_attrib(candidate, "generation"), *id = iks_find_attrib(candidate, "id");
-		char *ip = iks_find_attrib(candidate, "ip"), *network = iks_find_attrib(candidate, "network");
-		char *port = iks_find_attrib(candidate, "port"), *priority = iks_find_attrib(candidate, "priority");
-		char *protocol = iks_find_attrib(candidate, "protocol"), *type = iks_find_attrib(candidate, "type");
+		char *ip = iks_find_attrib(candidate, "ip"), *port = iks_find_attrib(candidate, "port");
+		char *priority = iks_find_attrib(candidate, "priority"), *protocol = iks_find_attrib(candidate, "protocol");
+		char *type = iks_find_attrib(candidate, "type");
 		struct ast_rtp_engine_ice_candidate local_candidate = { 0, };
 		int real_port;
 		struct ast_sockaddr remote_address = { { 0, } };
 
 		/* If this candidate is incomplete skip it */
 		if (ast_strlen_zero(component) || ast_strlen_zero(foundation) || ast_strlen_zero(generation) || ast_strlen_zero(id) ||
-		    ast_strlen_zero(ip) || ast_strlen_zero(network) || ast_strlen_zero(port) || ast_strlen_zero(priority) ||
+		    ast_strlen_zero(ip) || ast_strlen_zero(port) || ast_strlen_zero(priority) ||
 		    ast_strlen_zero(protocol) || ast_strlen_zero(type)) {
 			jingle_queue_hangup_with_cause(session, AST_CAUSE_PROTOCOL_ERROR);
 			ast_log(LOG_ERROR, "Incomplete ICE-UDP candidate received on session '%s'\n", session->sid);
-- 
GitLab