aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authoroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-01 20:28:54 +0000
committeroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-01 20:28:54 +0000
commit95adb96a836361d152fd9aeccfca846000986e38 (patch)
tree8846adf4aa951486021a630d66a0e341a10df7af /channels
parent244c20d708fdff0fc50e433cfaefedd5e8614aa4 (diff)
Cleaning up the devicestate callback function
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@53079 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c52
1 files changed, 32 insertions, 20 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 00c253ce5..aa76a18c3 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -15114,9 +15114,13 @@ static int sip_poke_peer(struct sip_peer *peer)
- not registered AST_DEVICE_UNAVAILABLE
- registered AST_DEVICE_NOT_INUSE
- fixed IP (!dynamic) AST_DEVICE_NOT_INUSE
+
+ Peers that does not have a known call and can't be reached by OPTIONS
+ - unreachable AST_DEVICE_UNAVAILABLE
If we return AST_DEVICE_UNKNOWN, the device state engine will try to find
out a state by walking the channel list.
+
*/
static int sip_devicestate(void *data)
{
@@ -15140,27 +15144,35 @@ static int sip_devicestate(void *data)
if ((p = find_peer(host, NULL, 1))) {
if (p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) {
/* we have an address for the peer */
- /* if qualify is turned on, check the status */
- if (p->maxms && (p->lastms > p->maxms)) {
- res = AST_DEVICE_UNAVAILABLE;
- } else {
- /* qualify is not on, or the peer is responding properly */
- /* check call limit */
- if (p->call_limit && (p->inUse == p->call_limit))
- res = AST_DEVICE_BUSY;
- else if (p->call_limit && p->inUse)
- res = AST_DEVICE_INUSE;
+
+ /* Check status in this order
+ - Hold
+ - Ringing
+ - Busy (enforced only by call limit)
+ - Inuse (we have a call)
+ - Unreachable (qualify)
+ If we don't find any of these state, report AST_DEVICE_NOT_INUSE
+ for registered devices */
+
+ if (p->onHold)
+ /* First check for hold or ring states */
+ res = AST_DEVICE_ONHOLD;
+ else if (p->inRinging) {
+ if (p->inRinging == p->inUse)
+ res = AST_DEVICE_RINGING;
else
- res = AST_DEVICE_NOT_INUSE;
- if (p->onHold)
- res = AST_DEVICE_ONHOLD;
- else if (p->inRinging) {
- if (p->inRinging == p->inUse)
- res = AST_DEVICE_RINGING;
- else
- res = AST_DEVICE_RINGINUSE;
- }
- }
+ res = AST_DEVICE_RINGINUSE;
+ } else if (p->call_limit && (p->inUse == p->call_limit))
+ /* check call limit */
+ res = AST_DEVICE_BUSY;
+ else if (p->call_limit && p->inUse)
+ /* Not busy, but we do have a call */
+ res = AST_DEVICE_INUSE;
+ else if (p->maxms && (p->lastms > p->maxms))
+ /* We don't have a call. Are we reachable at all? Requires qualify= */
+ res = AST_DEVICE_UNAVAILABLE;
+ else /* Default reply if we're registered and have no other data */
+ res = AST_DEVICE_NOT_INUSE;
} else {
/* there is no address, it's unavailable */
res = AST_DEVICE_UNAVAILABLE;