[Asterisk-Dev] IAX2 Transfer Message Sequence?

Mark Spencer markster at digium.com
Sat Jan 17 16:11:22 MST 2004

> > Can anyone summarize the sequence of messages that need to be
> > sent/received in order to execute an IAX2 native transfer?
> >  I just asked on IRC and was dutifully told "read the
> > source". Duh.  I have read the source. And googled the
> > archive.  The source tells me what all of the command are,
> > and how Asterisk processes each of them.  It just doesn't
> > tell me anything about the sequence that Asterisk is
> > expecting in order to execute either a blind or a
> > consultative transfer.

I would say that "read the iax2 debug" is perhaps a more helpful mantra in
this case than "read the source".

Essentially it works like this (a little simplified):

A -> B      "NEW"           (A sets up a call to B)
A <- B      "ACK"           (B acknowledges)
     B -> C "NEW"           (B sets up call to C)
     B <- C "ACK"           (C acks)
     B <- C "RINGING"       (C informs B of ringing if applicable)
A <- B      "RINGING"       (B informs A of ringing if applicable)
     B <- C "ANSWER"        (C informs B of answer condition)
A <- B      "ANSWER"        (B informs A of answer condition)

At this point, there are two calls setup, one from A->B and one from B->C.
Audio is passing both directions via "B".  "B" then decides to complete
the transfer so that "A" and "C" talk directly:

A <- B      "TXREQ"         (B requests A test connectivity to C)
     B -> C "TXREQ"         (B requests C test connectivity to A)
A    ->   C "TXCNT"         (A attempts contact with C)
A    <-   C "TXCNT"         (C attempts contact with A)
A    <-   C "TXACC"         (C verifies connectivity with A)
A    ->   C "TXACC"         (A verifies connectivity with C)

Note that if A can't see C or C can't see A, this the end...  audio
continues to be bridged through B, and the user is none-the-wiser.  This
keeps IAX transfer robust across even the penultimately worst routers
(although the ulitimately worst routers crash when you try to send to two
different destinations from the same source).

A -> B      "TXREADY"       (A informs B that everything looks good)
     B <- C "TXREADY"       (C informs B that everything looks good)
A <- B      "TXREL"         (B releases A to talk to C)
     B -> C "TXREL"         (B releases C to talk to A)

And at this point, the sequence numbers and jitter buffer timers are
reset, and A and C now talk happily ever after until HANGUP do them part.

Was that helpful?


More information about the asterisk-dev mailing list