Hello everyone,
I've had the time to examine some specific serial/parallel forking
scenarios with Asterisk lately. Looking at chan_sip it appears that
anytime Asterisk wants to tear down a call before it's brought up, it
sends a 603 Declined:
} else { /* Incoming call, not up */
const char *res;
if (p->hangupcause && (res
hangup_cause2sip(p->hangupcause)))
transmit_response_reliable(p,
res, &p->initreq);
else
transmit_response_reliable(p,
"603 Declined", &p->initreq);
p->invitestate = INV_TERMINATED;
Obviously this doesn't include cases where the URI is not found, the
codec is incompatible, etc. More just general failure stuff like
executing Hangup() on an unanswered channel.
However, 6xxx responses are somewhat religious/political in the SIP
sphere... Being that they are "global responses", how could this
single Asterisk instance know that this call is unacceptable
everywhere/anywhere? From RFC3261:
21.6.2 603 Decline
The callee's machine was successfully contacted but the user
explicitly does not wish to or cannot participate. The response MAY
indicate a better time to call in the Retry-After header field. This
status response is returned only if the client knows that no other
end point will answer the request.
I suppose manually executing Hangup() justifies the first statement
but it's the last sentence that bothers me:
"returned only if the client (Asterisk) knows that no other end point
will answer the request"
That's a little presumptive of the Asterisk system, don't you think?
;) While I don't have any better alternative responses I'm just
bothered by the "global" nature of 6xx failures in the first place.
Any thoughts?
--
Kristian Kielhofner
http://www.astlinux.org
http://blog.krisk.org
http://www.star2star.com
http://www.submityoursip.com
http://www.voalte.com