[asterisk-bugs] [JIRA] (ASTERISK-24894) iax2_poke_noanswer expiration timer too short
Y Ateya (JIRA)
noreply at issues.asterisk.org
Mon Mar 23 12:27:35 CDT 2015
[ https://issues.asterisk.org/jira/browse/ASTERISK-24894?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=225566#comment-225566 ]
Y Ateya edited comment on ASTERISK-24894 at 3/23/15 12:26 PM:
--------------------------------------------------------------
Patch to set timer with enough time to allow for multiple retries in case of POKE packet loss.
was (Author: yateya):
Patch to set timer with enough long time to allow for retries.
> iax2_poke_noanswer expiration timer too short
> ---------------------------------------------
>
> Key: ASTERISK-24894
> URL: https://issues.asterisk.org/jira/browse/ASTERISK-24894
> Project: Asterisk
> Issue Type: Bug
> Security Level: None
> Components: Channels/chan_iax2
> Affects Versions: 13.2.0
> Reporter: Y Ateya
> Assignee: Y Ateya
> Attachments: poke_noanswer_duration.diff
>
>
> POKE is used to check for peer availability, but it is not given enough time to retry in case of packet loss (if qualify time is high).
> If qualify time is set to 10 seconds ({{qualify = 1000}} in iax.conf); peer will be UNREACHABLE due to single packet loss.
> Here is the code snippet which start timer for poke_noasnwer
> {code}
> /* Speed up retransmission times for this qualify call */
> iaxs[peer->callno]->pingtime = peer->maxms / 4 + 1;
> iaxs[peer->callno]->peerpoke = peer;
> if (peer->pokeexpire > -1) {
> if (!AST_SCHED_DEL(sched, peer->pokeexpire)) {
> peer->pokeexpire = -1;
> peer_unref(peer);
> }
> }
> /* Queue up a new task to handle no reply */
> /* If the host is already unreachable then use the unreachable interval instead */
> if (peer->lastms < 0)
> peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_noanswer, peer_ref(peer));
> else
> peer->pokeexpire = iax2_sched_add(sched, DEFAULT_MAXMS * 2, iax2_poke_noanswer, peer_ref(peer));
> {code}
> In this code, if {{peer->lastms}} is more than 0 (i.e last ping or poke succeeded), {{iax2_poke_noanswer}} will be called if we didn't get POKE reply before {{DEFAULT_MAXMS * 2}} (i.e. 4 seconds).
> ping time value {noformat}iaxs[peer->callno]->pingtime = peer->maxms / 4 + 1;{noformat} will be {{10000 / 4 + 1}} (i.e 2.5 seconds).
> Since IAX frames are retried {{fr->retrytime = pvt->pingtime * 2;}}, so POKE frame will be retried every 5 seconds!
> So a single POKE packet loss will make the peer UNREACHABLE.
> To fix this, iax2_poke_noanswer timer shall be {{iaxs[peer->callno]->pingtime * 2 * max_retries}} to allow for proper retries for POKE packet.
--
This message was sent by Atlassian JIRA
(v6.2#6252)
More information about the asterisk-bugs
mailing list