*/
typedef enum {
SFLAG_FREE_REQ_ID = (1 << 0),
- SFLAG_SENT_FINAL_RESPONSE = (1 << 1)
+ SFLAG_SENT_FINAL_MSG = (1 << 1)
} sflag_t;
typedef uint16_t sangoma_boost_request_id_t;
zap_log(ZAP_LOG_CRIT, "START PROGRESS CANT FIND A CHAN %d:%d\n", event->span+1,event->chan+1);
+
+ zap_set_sflag(zchan, SFLAG_SENT_FINAL_MSG);
+
sangomabc_exec_command(mcon,
event->span,
event->chan,
//printf("WTF BAD ACK2 %d:%d (%d:%d) CSid=%d xtra_id=%d out=%d state=%s\n", zchan->span_id, zchan->chan_id, event->span+1,event->chan+1, event->call_setup_id, zchan->extra_id, zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND), zap_channel_state2str(zchan->state));
}
-
+ zap_set_sflag(zchan, SFLAG_SENT_FINAL_MSG);
zap_log(ZAP_LOG_CRIT, "START ACK CANT FIND A CHAN %d:%d\n", event->span+1,event->chan+1);
sangomabc_exec_command(mcon,
event->span,
}
if (zchan) {
- zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_RESPONSE);
+ zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_MSG);
}
-
/* nobody else will do it so we have to do it ourselves */
sangomabc_exec_command(mcon,
event->span,
}
zap_mutex_unlock(zchan->mutex);
-
if (r) {
return;
}
} /* else we have to do it ourselves.... */
- if (zchan) {
- zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_RESPONSE);
- }
-
- sangomabc_exec_command(mcon,
- event->span,
- event->chan,
- 0,
- SIGBOOST_EVENT_CALL_STOPPED_ACK,
- 0);
+ zap_log(ZAP_LOG_WARNING, "We could not find chan: s%dc%d\n", event->span, event->chan);
release_request_id_span_chan(event->span, event->chan);
}
}
zchan->sflags = 0;
- zap_channel_done(zchan);
+
+ if (!zap_test_sflag(zchan, SFLAG_SENT_FINAL_MSG)) {
+ zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_MSG);
+
+ sangomabc_exec_command(mcon,
+ zchan->physical_span_id-1,
+ zchan->physical_chan_id-1,
+ 0,
+ SIGBOOST_EVENT_CALL_STOPPED_ACK,
+ 0);
+ }
+ zap_channel_done(zchan);
}
break;
case ZAP_CHANNEL_STATE_PROGRESS_MEDIA:
{
sig.event_id = ZAP_SIGEVENT_RESTART;
status = sangoma_boost_data->signal_cb(&sig);
- zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_RESPONSE);
+ zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_MSG);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
-
}
break;
case ZAP_CHANNEL_STATE_UP:
if (!(zap_test_flag(zchan, ZAP_CHANNEL_PROGRESS) || zap_test_flag(zchan, ZAP_CHANNEL_MEDIA))) {
sangomabc_exec_command(mcon,
zchan->physical_span_id-1,
- zchan->physical_chan_id-1,
+ zchan->physical_chan_id-1,
0,
SIGBOOST_EVENT_CALL_START_ACK,
0);
sangomabc_exec_command(mcon,
zchan->physical_span_id-1,
- zchan->physical_chan_id-1,
+ zchan->physical_chan_id-1,
0,
SIGBOOST_EVENT_CALL_ANSWERED,
0);
break;
case ZAP_CHANNEL_STATE_HANGUP:
{
- if (zap_test_sflag(zchan, SFLAG_SENT_FINAL_RESPONSE)) {
- zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
+ if (zchan->last_state == ZAP_CHANNEL_STATE_TERMINATING ||
+ zap_test_sflag(zchan, SFLAG_SENT_FINAL_MSG)) {
+ zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP_COMPLETE);
} else {
-
- zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_RESPONSE);
+ zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_MSG);
if (zap_test_flag(zchan, ZAP_CHANNEL_ANSWERED) || zap_test_flag(zchan, ZAP_CHANNEL_PROGRESS) || zap_test_flag(zchan, ZAP_CHANNEL_MEDIA)) {
sangomabc_exec_command(mcon,
zchan->physical_span_id-1,
sig.event_id = ZAP_SIGEVENT_STOP;
status = sangoma_boost_data->signal_cb(&sig);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
- zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_RESPONSE);
+ zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_MSG);
sangomabc_exec_command(mcon,
zchan->physical_span_id-1,
zchan->physical_chan_id-1,
break;
case ZAP_CHANNEL_STATE_TERMINATING:
{
+
sig.event_id = ZAP_SIGEVENT_STOP;
status = sangoma_boost_data->signal_cb(&sig);
- zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP_COMPLETE);
- zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_RESPONSE);
- sangomabc_exec_command(mcon,
- zchan->physical_span_id-1,
- zchan->physical_chan_id-1,
- 0,
- SIGBOOST_EVENT_CALL_STOPPED_ACK,
- 0);
-
}
break;
default:
ZSD_OUTBOUND,
ZSM_UNACCEPTABLE,
{ZAP_CHANNEL_STATE_HANGUP, ZAP_CHANNEL_STATE_TERMINATING, ZAP_END},
- {ZAP_CHANNEL_STATE_HANGUP_COMPLETE, ZAP_END}
+ {ZAP_CHANNEL_STATE_HANGUP_COMPLETE, ZAP_CHANNEL_STATE_HANGUP, ZAP_END}
},
{
ZSD_OUTBOUND,
ZSD_INBOUND,
ZSM_UNACCEPTABLE,
{ZAP_CHANNEL_STATE_HANGUP, ZAP_CHANNEL_STATE_TERMINATING, ZAP_END},
- {ZAP_CHANNEL_STATE_HANGUP_COMPLETE, ZAP_END},
+ {ZAP_CHANNEL_STATE_HANGUP_COMPLETE, ZAP_CHANNEL_STATE_HANGUP, ZAP_END},
},
{
ZSD_INBOUND,