[Asterisk-Dev] IAX Calls close after 140 seconds

Derek Smithies derek at indranet.co.nz
Tue Jun 21 15:51:45 MST 2005


Hi,
  Sorry for the long post, but here is some stuff that is going to be 
useful for the iax-rfc.

 I have been using the iax client QTIAX and firefly to make iax calls to 
an * box. I have tried a couple of different * boxes, and the calls still 
get terminated.

Careful packet dumping + ethereal (0.10.10 (which includes iax decoder)) 
has provided some clue, but I wonder if someone can give an authoritative 
answer..

It appears that the iseqno used at each end is increased by 1 on receiving
each full frame.
iseqno is not increased on receiving a ACK packet.
 (code inspection suggests iseqno is not increased on receiving a INVAL 
  packet, and a couple of other transfer related packets)
iseqno is not increased on receiving a repeat transmission of the same 
  packet.

oseqno is increaed on the same rules as for increasing the iseqno. 
However, oseqno is increased after sending a packet. Thus, for the first 
packet of a call, oseqno is 0
A New packet will be sent with oseqno equal to 0

when generating a ack packet (to acknowledge receipt), or an implict ack 
packet, 
 the iseqno of the ack packet is from the counter of endpoint sending the 
           ack
 the oseqno of the ack packet is the iseqno of the packet being replied to
 the timestamp of the ack packet is the timestamp of the packet being 
   replied to.

An example of an implicit ack packet is a lagrp packet, which is sent in 
reply to a lagrq packet. - also, ping/pong - pong being an implicit ack.

An Accept packet is not am implicit ack packet. The accept is not an 
implicit ack to a new packet.

Note that The iseqno and timestamp of a full packet form a unique
identifying pair. An iax2 device will keep a record of timestamp and
iseqno of packets sent. On receipt of an ack packet, the iax2 device will
be able to determine which packet has been acknowledged.

should two packets be transmitted at the same time (say a ping and lagrq) 
then there is a very good chance that two full frames will be generated 
with the same iseqno and timestamp. This is an event that is unacceptable.
The timestamp of the second packet is raised by 3 ms, to guarantee 
uniqueness.

====================================================================

And then I tried Steve K's iaxcli - the command line version.
With this code, both ends in the iax2 call send ping and lagrq packet 
every 10 seconds. qtiax does not send ping and lagrq packets while in a 
call.

If no acknowledgement of the ping or lagrq packet is received, it will be 
sent again. However, the ping/lagrq packets are sent at the next 10second 
timeperiod.
For example, a lagrq & ping is sent at 130 seconds into the call, with a 
timestamp of 130000. if these are not replied to, they are resent at 140 
seconds into the call. The act of resending them does not increase the 
oseqno.

I do not understand one thing though. Even though a lagrq, ping or voice 
packet is resent, the retransmit bit is not set. (Retransmit bit is the 
high bit in the 3rd byte of the iax frame.)

===
Anyhow, after a couple of minutes, qtiax reports the call has ended.
packet dumps report that the remote endpoint has sent INVAL packets, with 
iseqno and oseqno and timestamp of 0  - the call is gone....
I don't understand this - no hangup packet.

My question really is:: what makes qtiax different to iaxcli - that calls 
from qtiax fail after time, but iaxcli succeed. qtiax seems to follow 
exactly the same pattern as iaxcli as far as isenqo, oseqno, and timestamp 
are concerned.

yes, qtiax does not send lagrq/ping packets every 10 seconds, but this 
seems a bit like window dressing. media packets are being received 
(typically every 20ms), so there is good evidence the remote node is 
alive.

Thanks,
 Derek.
 -- 
Derek Smithies Ph.D.                         
IndraNet Technologies Ltd.                
Email: derek at indranet.co.nz         
ph +64 3 365 6485                          
Web: http://www.indranet-technologies.com/  





More information about the asterisk-dev mailing list