*/
typedef enum {
SFLAG_FREE_REQ_ID = (1 << 0),
- SFLAG_SENT_FINAL_MSG = (1 << 1)
+ SFLAG_SENT_FINAL_MSG = (1 << 1),
+ SFLAG_SENT_ACK = (1 << 2)
} sflag_t;
typedef uint16_t sangoma_boost_request_id_t;
}
zap_set_state_r(zchan, ZAP_CHANNEL_STATE_HANGUP_COMPLETE, 0, r);
-
if (r) {
zap_set_sflag(zchan, SFLAG_FREE_REQ_ID);
zap_mutex_unlock(zchan->mutex);
release_request_id_span_chan(zchan->physical_span_id-1, zchan->physical_chan_id-1);
}
- zchan->sflags = 0;
-
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,
SIGBOOST_EVENT_CALL_STOPPED_ACK,
0);
}
+ zchan->sflags = 0;
zap_channel_done(zchan);
}
break;
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
- sangomabc_exec_command(mcon,
- zchan->physical_span_id-1,
- zchan->physical_chan_id-1,
- 0,
- SIGBOOST_EVENT_CALL_START_ACK,
- 0);
+ if (!zap_test_sflag(zchan, SFLAG_SENT_ACK)) {
+ zap_set_sflag(zchan, SFLAG_SENT_ACK);
+ sangomabc_exec_command(mcon,
+ zchan->physical_span_id-1,
+ zchan->physical_chan_id-1,
+ 0,
+ SIGBOOST_EVENT_CALL_START_ACK,
+ 0);
+ }
}
}
break;
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
}
-
}
break;
case ZAP_CHANNEL_STATE_RESTART:
} else {
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,
zchan->physical_chan_id-1,
ZSD_INBOUND,
ZSM_UNACCEPTABLE,
{ZAP_CHANNEL_STATE_PROGRESS, ZAP_CHANNEL_STATE_PROGRESS_MEDIA, ZAP_END},
- {ZAP_CHANNEL_STATE_HANGUP, ZAP_CHANNEL_STATE_CANCEL, ZAP_CHANNEL_STATE_TERMINATING, ZAP_CHANNEL_STATE_UP, ZAP_END},
+ {ZAP_CHANNEL_STATE_HANGUP, ZAP_CHANNEL_STATE_CANCEL, ZAP_CHANNEL_STATE_TERMINATING, ZAP_CHANNEL_STATE_UP, ZAP_CHANNEL_STATE_PROGRESS_MEDIA, ZAP_END},
},
{
ZSD_INBOUND,