aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-30 22:22:49 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-30 22:22:49 +0000
commit2e83d5fcce96d059cd931ab61048572626446c05 (patch)
treec6831f5f65018504666d693412c96a4d297e03d4 /channels/chan_iax2.c
parent09ab426af7d3d1ad561cfbe8782ad7b80e95f0fc (diff)
Fix lag in diverging clocks (bug #1696)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3115 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-xchannels/chan_iax2.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 447dcd810..b0c1aa2d6 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1109,21 +1109,14 @@ static int __do_deliver(void *data)
/* Just deliver the packet by using queueing. This is called by
the IAX thread with the iaxsl lock held. */
struct iax_frame *fr = data;
- unsigned int ts;
fr->retrans = -1;
if (iaxs[fr->callno] && !iaxs[fr->callno]->alreadygone) {
- if (fr->af.frametype == AST_FRAME_IAX) {
- /* We have to treat some of these packets specially because
- they're LAG measurement packets */
- if (fr->af.subclass == IAX_COMMAND_LAGRQ) {
- /* If we got a queued request, build a reply and send it */
+ if (fr->af.frametype == AST_FRAME_IAX &&
+ fr->af.subclass == IAX_COMMAND_LAGRQ) {
+ /* send a lag response to a lag request that has
+ * gone through our jitter buffer */
fr->af.subclass = IAX_COMMAND_LAGRP;
iax2_send(iaxs[fr->callno], &fr->af, fr->ts, -1, 0, 0, 0);
- } else if (fr->af.subclass == IAX_COMMAND_LAGRP) {
- /* This is a reply we've been given, actually measure the difference */
- ts = calc_timestamp(iaxs[fr->callno], 0, &fr->af);
- iaxs[fr->callno]->lag = ts - fr->ts;
- }
} else {
iax2_queue_frame(fr->callno, &fr->af);
}
@@ -5234,15 +5227,22 @@ retryowner2:
forward_command(iaxs[fr.callno], AST_FRAME_IAX, f.subclass, fr.ts, NULL, 0, -1);
} else {
#endif
- /* A little strange -- We have to actually go through the motions of
- delivering the packet. In the very last step, it will be properly
- handled by do_deliver */
f.src = "LAGRQ";
f.mallocd = 0;
f.offset = 0;
f.samples = 0;
iax_frame_wrap(&fr, &f);
- schedule_delivery(iaxfrdup2(&fr), 1, updatehistory);
+ if(f.subclass == IAX_COMMAND_LAGRQ) {
+ /* A little strange -- We have to actually go through the motions of
+ delivering the packet. In the very last step, it will be properly
+ handled by do_deliver */
+ schedule_delivery(iaxfrdup2(&fr), 1, updatehistory);
+ } else {
+ unsigned int ts;
+ /* This is a reply we've been given, actually measure the difference */
+ ts = calc_timestamp(iaxs[fr.callno], 0, &fr.af);
+ iaxs[fr.callno]->lag = ts - fr.ts;
+ }
#ifdef BRIDGE_OPTIMIZATION
}
#endif