[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?
Mark
More information about the asterisk-dev
mailing list