[asterisk-dev] Call Forwarding Detail Needed
Leif Madsen
leif.madsen at asteriskdocs.org
Sun Apr 1 05:17:58 MST 2007
On Sunday 01 April 2007 03:34:53 Arpit Mehta wrote:
> I just want to know if Asterisk handles a looping case and where does it
> handle that .
>
> A--> B --> C--> D --> B
>
> If A calls B ,
> B call fwds to C ,
> C call fwds to D ,
> D call fwds to B . Now there is a loop .
> How does asterisk prevent this loop? I just to know where (as in which
> module in the Asterisk source code) and how is this prevented (that is if a
> data structure of all the numbers that it has call fwded to is passed on to
> B,C,D so that it can detect a loop)?
>
> Thanks. I hope you understand my scenario. Any suggestions are welcome.
As far I might understand it, Asterisk would basically parse the Via: headers
to determine where the call was coming from, and if it detected a loop,
*should* handle that (this does seem like a loop, and not a spiral).
I'll have to defer this to the SIP experts and C experts, but basically here
is the code that chan_sip.c (at line 13185 of my chan_sip.c file) that checks
for the loop:
/* Check if this is a loop */
if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && p->owner &&
(p->owner->_state != AST_STATE_UP)) {
/* This is a call to ourself. Send ourselves an error code
and stop
processing immediately, as SIP really has no good mechanism
for
being able to call yourself */
/* If pedantic is on, we need to check the tags. If they're
different, this is
in fact a forked call through a SIP proxy somewhere. */
transmit_response(p, "482 Loop Detected", req);
p->invitestate = INV_COMPLETED;
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
return 0;
}
Leif Madsen.
More information about the asterisk-dev
mailing list