summaryrefslogtreecommitdiff
path: root/channels/chan_motif.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2012-10-11 16:06:28 +0000
committerJoshua Colp <jcolp@digium.com>2012-10-11 16:06:28 +0000
commitcd9745be1b76bef26a811c45094bc8bda14a97d2 (patch)
treed2567b5cf2129b137d422f2ee02ac788b1326a2f /channels/chan_motif.c
parent825607e09b022ce56f7b5ccac03cd0dbf042396c (diff)
Fix an issue where outgoing calls would fail to establish audio due to ICE negotiation failures.
This change removes the requirement for ufrag and pwd in the transport stanza and also makes us the controlling agent. (closes issue ASTERISK-20554) Reported by: mmichelson ........ Merged revisions 374850 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@374852 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_motif.c')
-rw-r--r--channels/chan_motif.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/channels/chan_motif.c b/channels/chan_motif.c
index 972abdb7b..432685bd5 100644
--- a/channels/chan_motif.c
+++ b/channels/chan_motif.c
@@ -1738,6 +1738,7 @@ static struct ast_channel *jingle_request(const char *type, struct ast_format_ca
struct jingle_session *session;
struct ast_channel *chan;
enum jingle_transport transport = JINGLE_TRANSPORT_NONE;
+ struct ast_rtp_engine_ice *ice;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(name);
AST_APP_ARG(target);
@@ -1841,6 +1842,15 @@ static struct ast_channel *jingle_request(const char *type, struct ast_format_ca
jingle_enable_video(session);
}
+ /* As this is outgoing set ourselves as controlling */
+ if (session->rtp && (ice = ast_rtp_instance_get_ice(session->rtp))) {
+ ice->ice_lite(session->rtp);
+ }
+
+ if (session->vrtp && (ice = ast_rtp_instance_get_ice(session->vrtp))) {
+ ice->ice_lite(session->vrtp);
+ }
+
/* We purposely don't decrement the session here as there is a reference on the channel */
ao2_link(endpoint->state->sessions, session);
@@ -1948,14 +1958,10 @@ static int jingle_interpret_ice_udp_transport(struct jingle_session *session, ik
return -1;
}
- if (ast_strlen_zero(ufrag) || ast_strlen_zero(pwd)) {
- jingle_queue_hangup_with_cause(session, AST_CAUSE_PROTOCOL_ERROR);
- ast_log(LOG_ERROR, "Invalid ICE-UDP transport information received on session '%s', ufrag or pwd not present\n", session->sid);
- return -1;
+ if (!ast_strlen_zero(ufrag) && !ast_strlen_zero(pwd)) {
+ ice->set_authentication(rtp, ufrag, pwd);
}
- ice->set_authentication(rtp, ufrag, pwd);
-
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");