diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6626d12c62..6c0644d5af 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -10226,7 +10226,7 @@ static int expire_register(const void *data) manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Unregistered\r\nCause: Expired\r\n", peer->name); register_peer_exten(peer, FALSE); /* Remove regexten */ - ast_devstate_changed(AST_DEVICE_UNAVAILABLE, "SIP/%s", peer->name); + ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name); /* Do we need to release this peer from memory? Only for realtime peers and autocreated peers @@ -10888,7 +10888,7 @@ static void sip_peer_hold(struct sip_pvt *p, int hold) ast_atomic_fetchadd_int(&peer->onHold, (hold ? +1 : -1)); /* Request device state update */ - ast_devstate_changed(hold ? AST_DEVICE_ONHOLD : AST_DEVICE_INUSE, "SIP/%s", peer->name); + ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name); unref_peer(peer, "sip_peer_hold: from find_peer operation"); return; @@ -15966,7 +15966,7 @@ static void handle_response_peerpoke(struct sip_pvt *p, int resp, struct sip_req ast_log(LOG_NOTICE, "Peer '%s' is now %s. (%dms / %dms)\n", peer->name, s, pingtime, peer->maxms); - ast_devstate_changed(is_reachable ? AST_DEVICE_NOT_INUSE : AST_DEVICE_UNAVAILABLE, "SIP/%s", peer->name); + ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name); manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: %s\r\nTime: %d\r\n", peer->name, s, pingtime); @@ -20182,7 +20182,7 @@ static int sip_poke_noanswer(const void *data) } peer->lastms = -1; - ast_devstate_changed(AST_DEVICE_UNAVAILABLE, "SIP/%s", peer->name); + ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name); /* Try again quickly */ AST_SCHED_REPLACE_UNREF(peer->pokeexpire, sched, diff --git a/main/channel.c b/main/channel.c index 6e20be7b7c..34e5c1fd8e 100644 --- a/main/channel.c +++ b/main/channel.c @@ -4153,7 +4153,12 @@ int ast_setstate(struct ast_channel *chan, enum ast_channel_state state) } chan->_state = state; - ast_devstate_changed_literal(ast_state_chan2dev(state), name); + + /* We have to pass AST_DEVICE_UNKNOWN here because it is entirely possible that the channel driver + * for this channel is using the callback method for device state. If we pass in an actual state here + * we override what they are saying the state is and things go amuck. */ + ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, name); + /* setstate used to conditionally report Newchannel; this is no more */ manager_event(EVENT_FLAG_CALL, "Newstate",