return ZAP_SUCCESS;
}
+static ZIO_SIGNAL_CB_FUNCTION(on_common_signal)
+{
+ switch_event_t *event = NULL;
+
+ switch (sigmsg->event_id) {
+
+ case ZAP_SIGEVENT_ALARM_CLEAR:
+ case ZAP_SIGEVENT_ALARM_TRAP:
+ {
+ if (zap_channel_get_alarms(sigmsg->channel) != ZAP_SUCCESS) {
+ zap_log(ZAP_LOG_ERROR, "failed to retrieve alarms\n");
+ return ZAP_FAIL;
+ }
+ if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) {
+ zap_log(ZAP_LOG_ERROR, "failed to create alarms events\n");
+ return ZAP_FAIL;
+ }
+ if (sigmsg->event_id == ZAP_SIGEVENT_ALARM_CLEAR) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "zap-alarm-clear");
+ } else {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "zap-alarm-trap");
+ }
+ }
+ break;
+ default:
+ return ZAP_SUCCESS;
+ break;
+ }
+
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_RECOVER)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "recover");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_LOOPBACK)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "loopback");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_YELLOW)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "yellow");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_RED)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_BLUE)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "blue");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_NOTOPEN)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "notopen");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_AIS)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "ais");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_RAI)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "rai");
+ }
+ if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_GENERAL)) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general");
+ }
+ switch_event_fire(&event);
+
+ return ZAP_BREAK;
+}
static ZIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
{
zap_log(ZAP_LOG_DEBUG, "Got R2 channel sig [%s] in channel %d\n", zap_signal_event2str(sigmsg->event_id), sigmsg->channel->physical_chan_id);
+ if (on_common_signal(sigmsg) == ZAP_BREAK) {
+ return ZAP_SUCCESS;
+ }
+
switch(sigmsg->event_id) {
/* on_call_disconnect from the R2 side */
case ZAP_SIGEVENT_STOP:
return status;
}
-static ZIO_SIGNAL_CB_FUNCTION(on_common_signal)
-{
- switch_event_t *event = NULL;
-
- switch (sigmsg->event_id) {
-
- case ZAP_SIGEVENT_ALARM_CLEAR:
- case ZAP_SIGEVENT_ALARM_TRAP:
- {
- if (zap_channel_get_alarms(sigmsg->channel) != ZAP_SUCCESS) {
- zap_log(ZAP_LOG_ERROR, "failed to retrieve alarms\n");
- return ZAP_FAIL;
- }
- if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) {
- zap_log(ZAP_LOG_ERROR, "failed to create alarms events\n");
- return ZAP_FAIL;
- }
- if (sigmsg->event_id == ZAP_SIGEVENT_ALARM_CLEAR) {
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "zap-alarm-clear");
- } else {
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "zap-alarm-trap");
- }
- }
- break;
- default:
- return ZAP_SUCCESS;
- break;
- }
-
- if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_RED)) {
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red");
- }
- if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_YELLOW)) {
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "yellow");
- }
- if (zap_test_alarm_flag(sigmsg->channel, ZAP_ALARM_BLUE)) {
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "blue");
- }
- switch_event_fire(&event);
-
- return ZAP_BREAK;
-}
-
static ZIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
{
switch_core_session_t *session = NULL;
{
switch_status_t status = SWITCH_STATUS_FALSE;
+ if (on_common_signal(sigmsg) == ZAP_BREAK) {
+ return ZAP_SUCCESS;
+ }
+
switch (sigmsg->channel->type) {
case ZAP_CHAN_TYPE_FXO:
case ZAP_CHAN_TYPE_EM:
}
alarms = tdm_api.wp_tdm_cmd.fe_alarms;
#endif
+ zchan->alarm_flags = ZAP_ALARM_NONE;
-
- zchan->alarm_flags = alarms ? ZAP_ALARM_RED : ZAP_ALARM_NONE;
+ if (alarms & WAN_TE_BIT_ALARM_RED) {
+ zchan->alarm_flags |= ZAP_ALARM_RED;
+ alarms &= ~WAN_TE_BIT_ALARM_RED;
+ }
+
+ if (alarms & WAN_TE_BIT_ALARM_AIS) {
+ zchan->alarm_flags |= ZAP_ALARM_AIS;
+ zchan->alarm_flags |= ZAP_ALARM_BLUE;
+ alarms &= ~WAN_TE_BIT_ALARM_AIS;
+ }
+
+ if (alarms & WAN_TE_BIT_ALARM_RAI) {
+ zchan->alarm_flags |= ZAP_ALARM_RAI;
+ zchan->alarm_flags |= ZAP_ALARM_YELLOW;
+ alarms &= ~WAN_TE_BIT_ALARM_RAI;
+ }
+
+ /* still missing to map:
+ * ZAP_ALARM_RECOVER
+ * ZAP_ALARM_LOOPBACK
+ * ZAP_ALARM_NOTOPEN
+ * */
- return ZAP_SUCCESS;
+ /* if we still have alarms that we did not map, set the general alarm */
+ if (alarms) {
+ zap_log(ZAP_LOG_DEBUG, "Unmapped wanpipe alarms: %d\n", alarms);
+ zchan->alarm_flags |= ZAP_ALARM_GENERAL;
+ }
+
+ return ZAP_SUCCESS;
}
/**
}
break;
case WP_TDMAPI_EVENT_ALARM:
- event_id = ZAP_OOB_NOOP;
+ zap_log(ZAP_LOG_DEBUG, "Got wanpipe alarms %d\n", tdm_api.wp_tdm_cmd.event.wp_api_event_alarm);
+ zap_sigmsg_t sigmsg;
+ memset(&sigmsg, 0, sizeof(sigmsg));
+ event_id = ZAP_OOB_ALARM_TRAP;
+ sigmsg.chan_id = zchan->chan_id;
+ sigmsg.span_id = zchan->span_id;
+ sigmsg.channel = zchan;
+ sigmsg.event_id = (event_id == ZAP_OOB_ALARM_CLEAR) ? ZAP_SIGEVENT_ALARM_CLEAR : ZAP_SIGEVENT_ALARM_TRAP;
+ zap_span_send_signal(zchan->span, &sigmsg);
break;
default:
{