[asterisk-dev] Guidance required

Matthew Jordan mjordan at digium.com
Thu Dec 5 11:56:15 CST 2013


On Thu, Dec 5, 2013 at 6:14 AM, Vytis Valentinavičius
<xytis2000 at gmail.com>wrote:

> Hello,
>
> I am trying to resolve asterisk bug
> https://issues.asterisk.org/jira/browse/ASTERISK-22911, but I have some
> questions regarding existing code:
>
> [ I am working on 11.5.1 version ]
>

Hey Vytis -

For the patch that you're developing, feel free to attach it as a diff on
the actual issue. You'll need to sign a license contributor agreement, but
having the code on the issue would be the appropriate next step. I
commented on the issue to that extent as well.


> Currently ICE session is initialised on first SDP INVITE, during
> initialisation it pairs received remote candidates with known local
> candidates and effectively establishes a route from asterisk to requesting
> client.
> When WebRTC client issues unhold reinvite, ICE session is not altered,
> thus rendering connection from asterisk to client broken.
>
> How should I alter the ICE session?
> Things I already tried:
> 1. Force asterisk to provide PJICE with completely fresh copy of remote
> candidates (not a concat of newly received and old candidates) (I think
> this is a separate bug.)
> 2. Force ICE session to recheck all available candidates by either
> reseting the check container or by removing them altogether. Both of these
> approaches failed, and I suspect the failures are related to async STUN
> checking, that use previously registered checks. I could not find any
> documentation/methods/help within PJSIP.
>

Hm. Reading Section 9.1.1.1 of RFC 5245:

These rules imply that setting the IP address in the c line to
   0.0.0.0 will cause an ICE restart.  Consequently, ICE implementations
   MUST NOT utilize this mechanism for call hold, and instead MUST use
   a=inactive and a=sendonly as described in [RFC3264
<http://tools.ietf.org/html/rfc3264>].


When you get a call hold, how is it indicating the media restriction?

In general, looking through section 9.1.2, I would suspect that any serious
modification of the media streams would require ICE to be restarted
completely.


> Things I would like to try, yet may not find a logical approach to them:
> 1. Scrap the whole ICE session and reinitiate a new one. That was my first
> idea yet I can not determine where the ICE session was created in the first
> place. All the places I suspected were not executed over the whole lifetime
> of asterisk application.
> 2. Just forget the session when receiving and SDP reinvite and build a new
> one. This seems logical, yet I can not determine will it work for all
> cases, since I know only my own little case.
>
> Please help me, I am struggling for over a week...
>

So, the rtp_engine already has methods to start/stop the RTP instance in
certain situations. This should include when chan_sip (or other channel
drivers) need to hold the media. See ast_rtp_start/ast_rtp_stop in
res_rtp_asterisk, which is what the virtual table for res_rtp_asterisk will
use when the start/stop methods are called from the engine.

In those methods, have you tried stopping ICE and starting it using
ast_rtp_ice_stop/ast_rtp_ice_start?

-- 
Matthew Jordan
Digium, Inc. | Engineering Manager
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
Check us out at: http://digium.com & http://asterisk.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20131205/30a4ec40/attachment.html>


More information about the asterisk-dev mailing list