> On Feb. 24, 2014, 4:51 p.m., Joshua Colp wrote:
> > /branches/11/res/res_rtp_asterisk.c, lines 554-560
> > <https://reviewboard.asterisk.org/r/3256/diff/1/?file=54416#file54416line554>
> >
> >     Agreed, and pjnath does not provide a mechanism to do just that without 
> > destroying/re-creating as Matt says.
> >     
> >     What would also be useful is to further look at the SDPs involved - are 
> > the candidates really changing? Do we really need to restart the ICE 
> > negotiation?
> 
> Jonathan Rose wrote:
>     No, the candidates offered aren't changing. I think the reason it tries 
> to add them anyway is because we never reached a point where the ICE session 
> was tracked as having started (because the check list compliation is failing).
>     
>     
>     First Invite (SIPML5 client to desk phone)
>     
>     <--- SIP read from WS:10.24.16.82:60366 --->
>     INVITE sip:1201@10.24.18.246 SIP/2.0
>     Via: SIP/2.0/WS 
> df7jal23ls0d.invalid;branch=z9hG4bKMKg6LeUkDugGr9B1CnyHICANfn8JwRVR;rport
>     From: "sipml_bot"<sip:sipml_bot@10.24.18.246>;tag=W42MEkWLdFTUiIaaw8iy
>     To: <sip:1201@10.24.18.246>
>     Contact: 
> "sipml_bot"<sip:sipml_bot@df7jal23ls0d.invalid;rtcweb-breaker=no;click2call=no;transport=ws>;+g.oma.sip-im;+sip.ice;language="en,fr"
>     Call-ID: 97982d1a-15e5-cd55-9122-07b3cc20cb7d
>     CSeq: 20907 INVITE
>     Content-Type: application/sdp
>     Content-Length: 1840
>     Max-Forwards: 70
>     User-Agent: IM-client/OMA1.0 sipML5-v1.2014.01.27
>     Organization: Doubango Telecom
>     
>     v=0
>     o=- 3044420497219628500 2 IN IP4 127.0.0.1
>     s=Doubango Telecom - chrome
>     t=0 0
>     a=group:BUNDLE audio
>     a=msid-semantic: WMS nqy2BUfoo7yn1YeWLNBeED2rqMGSb1y8Ypv3
>     m=audio 56984 RTP/SAVPF 111 103 104 0 8 106 105 13 126
>     c=IN IP4 216.207.245.1
>     a=rtcp:56984 IN IP4 216.207.245.1
>     a=candidate:474352566 1 udp 2113937151 10.24.16.82 56984 typ host 
> generation 0
>     a=candidate:474352566 2 udp 2113937151 10.24.16.82 56984 typ host 
> generation 0
>     a=candidate:3038348387 1 udp 1845501695 216.207.245.1 56984 typ srflx 
> raddr 10.24.16.82 rport 56984 generation 0
>     a=candidate:3038348387 2 udp 1845501695 216.207.245.1 56984 typ srflx 
> raddr 10.24.16.82 rport 56984 generation 0
>     a=candidate:1388705606 1 tcp 1509957375 10.24.16.82 0 typ host generation > 0
>     a=candidate:1388705606 2 tcp 1509957375 10.24.16.82 0 typ host generation > 0
>     a=ice-ufrag:LeGzZojC7gQNvl7o
>     a=ice-pwd:VfqsY2VVKr3xg/mgvdPtcxhp
>     a=ice-options:google-ice
>     a=fingerprint:sha-256 
> 3A:BA:F5:44:53:CD:99:6C:D1:32:9F:80:53:D4:B5:BA:AE:CF:98:54:71:7F:D6:CB:14:7F:D8:94:30:98:89:62
>     a=setup:actpass
>     a=mid:audio
>     a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
>     a=sendrecv
>     a=rtcp-mux
>     a=crypto:0 AES_CM_128_HMAC_SHA1_32 
> inline:ZQQ2MjApfbPlEAmWe52FRkbKUVH4rXt5p5QnpObB
>     a=crypto:1 AES_CM_128_HMAC_SHA1_80 
> inline:JljeDW3NiakHNYn+bu+vje3cD77nNPytUW79J2Vz
>     a=rtpmap:111 opus/48000/2
>     a=fmtp:111 minptime=10
>     a=rtpmap:103 ISAC/16000
>     a=rtpmap:104 ISAC/32000
>     a=rtpmap:0 PCMU/8000
>     a=rtpmap:8 PCMA/8000
>     a=rtpmap:106 CN/32000
>     a=rtpmap:105 CN/16000
>     a=rtpmap:13 CN/8000
>     a=rtpmap:126 telephone-event/8000
>     a=maxptime:60
>     a=ssrc:3822531142 cname:YE/Lm1aHvDjHxwH0
>     a=ssrc:3822531142 msid:nqy2BUfoo7yn1YeWLNBeED2rqMGSb1y8Ypv3 
> b50d1acc-19eb-455c-8a4b-40263a2d1a9b
>     a=ssrc:3822531142 mslabel:nqy2BUfoo7yn1YeWLNBeED2rqMGSb1y8Ypv3
>     a=ssrc:3822531142 label:b50d1acc-19eb-455c-8a4b-40263a2d1a9b
>     
>     
>     
>     
>     second invite (SIPML5 client putting the call on hold)
>     
>     INVITE sip:1201@10.24.18.246:5060;transport=WS SIP/2.0
>     Via: SIP/2.0/WS 
> df7jal23ls0d.invalid;branch=z9hG4bK6QhlVcXuVSUNyTewJBtU0KIZzL9mMqCE;rport
>     From: "sipml_bot"<sip:sipml_bot@10.24.18.246>;tag=W42MEkWLdFTUiIaaw8iy
>     To: <sip:1201@10.24.18.246>;tag=as269c229d
>     Contact: 
> "sipml_bot"<sip:sipml_bot@df7jal23ls0d.invalid;rtcweb-breaker=no;click2call=no;transport=ws>;+g.oma.sip-im;+sip.ice;language="en,fr"
>     Call-ID: 97982d1a-15e5-cd55-9122-07b3cc20cb7d
>     CSeq: 20908 INVITE
>     Content-Type: application/sdp
>     Content-Length: 1840
>     Max-Forwards: 70
>     User-Agent: IM-client/OMA1.0 sipML5-v1.2014.01.27
>     Organization: Doubango Telecom
>     
>     v=0
>     o=- 3044420497219628500 3 IN IP4 127.0.0.1
>     s=Doubango Telecom - chrome
>     t=0 0
>     a=group:BUNDLE audio
>     a=msid-semantic: WMS nqy2BUfoo7yn1YeWLNBeED2rqMGSb1y8Ypv3
>     m=audio 56984 RTP/SAVPF 111 103 104 0 8 106 105 13 126
>     c=IN IP4 216.207.245.1
>     a=rtcp:56984 IN IP4 216.207.245.1
>     a=candidate:474352566 1 udp 2113937151 10.24.16.82 56984 typ host 
> generation 0
>     a=candidate:474352566 2 udp 2113937151 10.24.16.82 56984 typ host 
> generation 0
>     a=candidate:3038348387 1 udp 1845501695 216.207.245.1 56984 typ srflx 
> raddr 10.24.16.82 rport 56984 generation 0
>     a=candidate:3038348387 2 udp 1845501695 216.207.245.1 56984 typ srflx 
> raddr 10.24.16.82 rport 56984 generation 0
>     a=candidate:1388705606 1 tcp 1509957375 10.24.16.82 0 typ host generation > 0
>     a=candidate:1388705606 2 tcp 1509957375 10.24.16.82 0 typ host generation > 0
>     a=ice-ufrag:LeGzZojC7gQNvl7o
>     a=ice-pwd:VfqsY2VVKr3xg/mgvdPtcxhp
>     a=ice-options:google-ice
>     a=fingerprint:sha-256 
> 3A:BA:F5:44:53:CD:99:6C:D1:32:9F:80:53:D4:B5:BA:AE:CF:98:54:71:7F:D6:CB:14:7F:D8:94:30:98:89:62
>     a=setup:actpass
>     a=mid:audio
>     a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
>     a=sendonly
>     a=rtcp-mux
>     a=crypto:0 AES_CM_128_HMAC_SHA1_32 
> inline:ZQQ2MjApfbPlEAmWe52FRkbKUVH4rXt5p5QnpObB
>     a=crypto:1 AES_CM_128_HMAC_SHA1_80 
> inline:JljeDW3NiakHNYn+bu+vje3cD77nNPytUW79J2Vz
>     a=rtpmap:111 opus/48000/2
>     a=fmtp:111 minptime=10
>     a=rtpmap:103 ISAC/16000
>     a=rtpmap:104 ISAC/32000
>     a=rtpmap:0 PCMU/8000
>     a=rtpmap:8 PCMA/8000
>     a=rtpmap:106 CN/32000
>     a=rtpmap:105 CN/16000
>     a=rtpmap:13 CN/8000
>     a=rtpmap:126 telephone-event/8000
>     a=maxptime:60
>     a=ssrc:3822531142 cname:YE/Lm1aHvDjHxwH0
>     a=ssrc:3822531142 msid:nqy2BUfoo7yn1YeWLNBeED2rqMGSb1y8Ypv3 
> b50d1acc-19eb-455c-8a4b-40263a2d1a9b
>     a=ssrc:3822531142 mslabel:nqy2BUfoo7yn1YeWLNBeED2rqMGSb1y8Ypv3
>     a=ssrc:3822531142 label:b50d1acc-19eb-455c-8a4b-40263a2d1a9b
>     
>     
>     
>     
>     third invite (SIMPL5 resumes the call)
>     
>     INVITE sip:1201@10.24.18.246:5060;transport=WS SIP/2.0
>     Via: SIP/2.0/WS 
> df7jal23ls0d.invalid;branch=z9hG4bKGAwGP8mOJ7Kd9TuUw4Ac7T1Pc3eVTQgE;rport
>     From: "sipml_bot"<sip:sipml_bot@10.24.18.246>;tag=W42MEkWLdFTUiIaaw8iy
>     To: <sip:1201@10.24.18.246>;tag=as269c229d
>     Contact: 
> "sipml_bot"<sip:sipml_bot@df7jal23ls0d.invalid;rtcweb-breaker=no;click2call=no;transport=ws>;+g.oma.sip-im;+sip.ice;language="en,fr"
>     Call-ID: 97982d1a-15e5-cd55-9122-07b3cc20cb7d
>     CSeq: 20909 INVITE
>     Content-Type: application/sdp
>     Content-Length: 1838
>     Max-Forwards: 70
>     User-Agent: IM-client/OMA1.0 sipML5-v1.2014.01.27
>     Organization: Doubango Telecom
>     
>     v=0
>     o=- 11625312205988492 4 IN IP4 127.0.0.1
>     s=Doubango Telecom - chrome
>     t=0 0
>     a=group:BUNDLE audio
>     a=msid-semantic: WMS HpcmWGwoVidQ57oRzreLCtEzVKYzRkuGXCzS
>     m=audio 43821 RTP/SAVPF 111 103 104 0 8 106 105 13 126
>     c=IN IP4 216.207.245.1
>     a=rtcp:43821 IN IP4 216.207.245.1
>     a=candidate:474352566 1 udp 2113937151 10.24.16.82 43821 typ host 
> generation 0
>     a=candidate:474352566 2 udp 2113937151 10.24.16.82 43821 typ host 
> generation 0
>     a=candidate:3038348387 1 udp 1845501695 216.207.245.1 43821 typ srflx 
> raddr 10.24.16.82 rport 43821 generation 0
>     a=candidate:3038348387 2 udp 1845501695 216.207.245.1 43821 typ srflx 
> raddr 10.24.16.82 rport 43821 generation 0
>     a=candidate:1388705606 1 tcp 1509957375 10.24.16.82 0 typ host generation > 0
>     a=candidate:1388705606 2 tcp 1509957375 10.24.16.82 0 typ host generation > 0
>     a=ice-ufrag:bBLoaKGIBC2OBJK/
>     a=ice-pwd:zJD7a+9Pd54bh3WuLfQEiJRx
>     a=ice-options:google-ice
>     a=fingerprint:sha-256 
> 3A:BA:F5:44:53:CD:99:6C:D1:32:9F:80:53:D4:B5:BA:AE:CF:98:54:71:7F:D6:CB:14:7F:D8:94:30:98:89:62
>     a=setup:actpass
>     a=mid:audio
>     a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
>     a=sendrecv
>     a=rtcp-mux
>     a=crypto:0 AES_CM_128_HMAC_SHA1_32 
> inline:4QyVPss3/XPkqz2AcnDioqOwLO+BLQe1T41L8POW
>     a=crypto:1 AES_CM_128_HMAC_SHA1_80 
> inline:dNDtygwacR+DTEppJTmZR4sjLQ/99yIDCBXbZwvJ
>     a=rtpmap:111 opus/48000/2
>     a=fmtp:111 minptime=10
>     a=rtpmap:103 ISAC/16000
>     a=rtpmap:104 ISAC/32000
>     a=rtpmap:0 PCMU/8000
>     a=rtpmap:8 PCMA/8000
>     a=rtpmap:106 CN/32000
>     a=rtpmap:105 CN/16000
>     a=rtpmap:13 CN/8000
>     a=rtpmap:126 telephone-event/8000
>     a=maxptime:60
>     a=ssrc:1421740875 cname:vyMP5//bMmdw/mZH
>     a=ssrc:1421740875 msid:HpcmWGwoVidQ57oRzreLCtEzVKYzRkuGXCzS 
> d99b2db8-4043-427e-b5b6-6a608f186190
>     a=ssrc:1421740875 mslabel:HpcmWGwoVidQ57oRzreLCtEzVKYzRkuGXCzS
>     a=ssrc:1421740875 label:d99b2db8-4043-427e-b5b6-6a608f186190
>     
>
> 
> Matt Jordan wrote:
>     Ah ha. They do change on the third INVITE request.
>     
>     We could do this one of two ways:
>     
>     (1) Compare the candidates that were received to what we currently have. 
> If any differ, destroy the ICE session and re-create it.
>     (2) Say damn the torpedoes, full speed ahead - and always destroy the ICE 
> session and re-create it.
>     
>     I'd actually lean to (2), since (1) feels like an optimization you make 
> when you're spending a lot of time destroy/re-creating things.
> 
> Joshua Colp wrote:
>     WELL... it depends if in the case of (1) the ICE negotiation was actually 
> done again with the same candidates. If not and you destroy/re-create I'm not 
> sure how the other side will handle the ICE negotiation.
> 
> Jonathan Rose wrote:
>     Well, the candidates aren't changing on the second INVITE which is the 
> one that is actually causing the assertion. If nothing else, if the ice 
> session hasn't started yet we should probably be destroying/recreating it as 
> well.
> 
> Joshua Colp wrote:
>     Was it not started?
> 
> Jonathan Rose wrote:
>     ast_rtp_ice_start was ran on the first INVITE, but failed during 
> pj_ice_sess_create_check_list and returned PJNATH_EICENOHOSTCAND instead of 
> PJ_SUCCESS:
>     
>       if (pj_ice_sess_create_check_list(rtp->ice, &ufrag, &passwd, 
> ao2_container_count(rtp->remote_candidates), &candidates[0]) == PJ_SUCCESS) {
>               pj_ice_sess_start_check(rtp->ice);
>               pj_timer_heap_poll(timerheap, NULL);
>               rtp->ice_started = 1;
>               rtp->strict_rtp_state = STRICT_RTP_OPEN;
>               return;
>       }
>     
>     As I was saying before, we don't finish getting ICE started in this case. 
> With kharwell's patch in place, we also blow out the remote candidates list 
> in the RTP instance and that has caused the one way audio issue.
> 
> Matt Jordan wrote:
>     Right. So what needs to be determined is why 
> pj_ice_sess_create_check_list is returning PJNATH_EICENOHOSTCAND.
>     
>     Looking at that particular code, that would occur in prune_checklist when 
> there is no local candidate that has the same address as the SRFLX 
> candidate's base address:
>     
>       if (clist->checks[i].lcand->type == PJ_ICE_CAND_TYPE_SRFLX) {
>           /* Find the base for this candidate */
>           unsigned j;
>           for (j=0; j<ice->lcand_cnt; ++j) {
>               pj_ice_sess_cand *host = &ice->lcand[j];
>     
>               if (host->type != PJ_ICE_CAND_TYPE_HOST)
>                   continue;
>     
>               if (sockaddr_cmp(&srflx->base_addr, &host->addr) == 0) {
>                   /* Replace this SRFLX with its BASE */
>                   clist->checks[i].lcand = host;
>                   break;
>               }
>           }
>     
>           if (j==ice->lcand_cnt) {
>               /* Host candidate not found this this srflx! */
>               LOG4((ice->obj_name, 
>                     "Base candidate %s:%d not found for srflx candidate %d",
>                     pj_inet_ntoa(srflx->base_addr.ipv4.sin_addr),
>                     pj_ntohs(srflx->base_addr.ipv4.sin_port),
>                     GET_LCAND_ID(clist->checks[i].lcand)));
>               return PJNATH_EICENOHOSTCAND;
>           }
>       }
>     
>     When this occurs, what are your local candidates? Is there a local 
> candidate that should match?
> 
> Jonathan Rose wrote:
>     From my debug of the local candidate list, I got the following:
>     
>     0 - host address: 10.24.18.246 (type host)
>     1 - host address: 216.207.245.1 (type srflx)
>     2 - host address: 10.24.18.246 (type host)
>     3 - host address: 216.207.245.1 (type srflx)
>     
>     And the check list addresses they are being compared to:
>     
>     0 - 10.24.18.246 (type host)
>     1 - 10.24.18.246 (type host)
>     2 - 10.24.18.246 (type host)
>     3 - 10.24.18.246 (type host)
>     4 - 216.207.245.1 (type srflx)
>     5 - 216.207.245.1 (type srflx)
>     6 - 216.207.245.1 (type srflx)
>     7 - 216.207.245.1 (type srflx)
>     8 - 10.24.18.246 (type host)
>     9 - 10.24.18.246 (type host)
>     10 - 216.207.245.1 (type srflx)
>     11 - 216.207.245.1 (type srflx)
>     
>     All of the ones that would match against the clist members are of type 
> srflx and get ignored by:
>               if (host->type != PJ_ICE_CAND_TYPE_HOST)
>                   continue;
>     
>     The base_addr for each local candidate is the same as addr.

Let me ammend that data to include port numbers...

Local Candidates:
0 - host address: 10.24.18.246:3640 (type host)
1 - host address: 216.207.245.1:3896 (type srflx)
2 - host address: 10.24.18.246:3640 (type host)
3 - host address: 216.207.245.1:3896 (type srflx)

Check List:
0 - 10.24.18.246:3640 (type host)
1 - 10.24.18.246:3896 (type host)
2 - 10.24.18.246:3640 (type host)
3 - 10.24.18.246:3896 (type host)
4 - 216.207.245.1:3640 (type srflx)
5 - 216.207.245.1:3640 (type srflx)
6 - 216.207.245.1:3640 (type srflx)
7 - 216.207.245.1:3640 (type srflx)
8 - 10.24.18.246:3640 (type host)
9 - 10.24.18.246:3896 (type host)
10 - 216.207.245.1:3640 (type srflx)
11 - 216.207.245.1:3640 (type srflx)


- Jonathan


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/3256/#review10937
-----------------------------------------------------------


On Feb. 24, 2014, 12:36 p.m., Jonathan Rose wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/3256/
> -----------------------------------------------------------
> 
> (Updated Feb. 24, 2014, 12:36 p.m.)
> 
> 
> Review request for Asterisk Developers, Joshua Colp, Kevin Harwell, and Matt 
> Jordan.
> 
> 
> Bugs: ASTERISK-22911 and ASTERISK-23213
>     https://issues.asterisk.org/jira/browse/ASTERISK-22911
>     https://issues.asterisk.org/jira/browse/ASTERISK-23213
> 
> 
> Repository: Asterisk
> 
> 
> Description
> -------
> 
> Let me start by saying this is almost certainly not the complete answer to 
> solving these problems. This patch is simply an alternative to backing out 
> the patch from r405234 and leaving the existing aborts in place. I've written 
> a test to make sure the new patch (and likely a later patch which can resolve 
> these problems with ICE more comprehensively) does not crash Asterisk and 
> that can be view here: https://reviewboard.asterisk.org/r/3255/
> 
> In my reproduction of this regression, I noticed a few things. The first was 
> that when starting a call with ICE from SIPML5 that Asterisk would not be 
> able to full initialize the ICE session. Instead when creating the candidate 
> checklist via pj_ice_sess_create_check_list, PJNATH would be unable to 
> associate the srflx candidates with any host pairs when pruning the 
> checklist. The SRFLX candidates would have the addresses used internally on 
> my LAN while the addresses it would be matched up against would mirror those 
> of my external IP (in other words, they just didn't match by address). The 
> overall return from pj_ice_sess_create_check_list would be 
> PJNATH_EICENOHOSTCAND and while the ICE session wouldn't get flagged as 
> started, I still continued to receive two way audio on both ends in Asterisk 
> 11.7
> 
> Asterisk 11.8 however would clear the candidate lists at this point and I 
> would get one way audio instead.
> 
> The crash in 11.7 from holding was caused because upon holding the call, the 
> SDP would contain the same list of ICE candidates, so Asterisk would attempt 
> to start the ICE session again. This time when it entered the create check 
> list function, the maximum ICE candidates in the session would be exhausted 
> causing PJNATH to assert and abort (which visibly appears more or less the 
> same as a crash). This work around patch checks to see if a create checklist 
> call will cause that value to expand above the maximum and if it would, we 
> abandon starting ICE back up and we clear the current candidate list on the 
> ICE session. In my own tests this seemed to work quite well (I had two way 
> audio, Asterisk didn't terminate suddenly, and I was able to hold and resume 
> the call while still maintaining two way audio and music on hold for all 
> expected ends). According to Vytis though, neither this patch nor the 
> original patch to resolve ASTERISK-22911 by kharwell actually fixed his audio 
> problems anyway
 . Kharwell's patch fixed the assertions that were occurring because the 
candidate list would be cleared on any error including the 
PJNATH_EICENOHOSTCAND which most of the people in ASTERISK-23213 were most 
likely experiencing as well. I draw that conclusion because when they used this 
patch they reported that it fixed their issues without introducing any new 
crashes.
> 
> At this point, I'm not entirely sure that audio actually should be allowed to 
> work when building the ICE session check list fails like it has been in this 
> scenario. But we need to finalize a new Asterisk 11 release soon and we can't 
> have this apparent regression in when we do so. In the future we need to find 
> out more comprehensively why pj_ice_sess_create_check_list is failing and how 
> to fix that.
> 
> 
> Props to Lott Caskey for providing some improvements to the patch that I 
> wrote.
> 
> 
> Diffs
> -----
> 
>   /branches/11/res/res_rtp_asterisk.c 408284 
> 
> Diff: https://reviewboard.asterisk.org/r/3256/diff/
> 
> 
> Testing
> -------
> 
> Tested calls and holds with a SIPML5 call to a desk phone. Confirmed two way 
> audio and music on hold.
> Requested that the reporter and participants of ASTERISK-23213 test the 
> patch. Everyone who tested it confirmed that it fixed their problems.
> Ran https://reviewboard.asterisk.org/r/3255/ and checked the log files to see 
> what was happening
> 
> 
> Thanks,
> 
> Jonathan Rose
> 
>

-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to