]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_rtp_asterisk: Fails to resume WebRTC call from hold
authorKevin Harwell <kharwell@digium.com>
Thu, 9 Jan 2014 16:52:57 +0000 (16:52 +0000)
committerKevin Harwell <kharwell@digium.com>
Thu, 9 Jan 2014 16:52:57 +0000 (16:52 +0000)
In ast_rtp_ice_start if the ice session create check list failed, start check
was never initiated and ice_started was never set to true.  Upon re-entering
the function (for instance, [un]hold) it would try to create the check list
again with duplicate remote candidates.

Fixed so that if the create check list fails the necessary data structures
are properly re-initialized for any subsequent retries.

Note, it was decided to not stop ice support (by calling ast_rtp_ice_stop) on a
check list failure because it possible things might still work.  However, a
debug message was added to help with any future troubleshooting.

(closes issue ASTERISK-22911)
Reported by: Vytis Valentinavičius
Patches:
     works_on_my_machine.patch uploaded by xytis (license 6558)
........

Merged revisions 405234 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 405235 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@405236 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_rtp_asterisk.c

index 14dbe24ee799b3af258bd180310c18c61f7ce633..b2f11dc37028418207df12dac0d374f831cde003 100644 (file)
@@ -555,7 +555,17 @@ static void ast_rtp_ice_start(struct ast_rtp_instance *instance)
                pj_timer_heap_poll(timerheap, NULL);
                rtp->ice_started = 1;
                rtp->strict_rtp_state = STRICT_RTP_OPEN;
+               return;
        }
+
+       /* even though create check list failed don't stop ice as
+          it might still work */
+       ast_debug(1, "Failed to create ICE session check list\n");
+       /* however we do need to reset remote candidates since
+          this function may be re-entered */
+       ao2_ref(rtp->remote_candidates, -1);
+       rtp->remote_candidates = NULL;
+       rtp->ice->rcand_cnt = rtp->ice->clist.count = 0;
 }
 
 static void ast_rtp_ice_stop(struct ast_rtp_instance *instance)