--- chan_dahdi.c 2010-01-26 16:10:33.000000000 -0300 +++ chan_dahdi.c 2010-01-25 18:23:29.000000000 -0300 @@ -417,6 +417,10 @@ static int mwilevel = 512; static int dtmfcid_level = 256; +#define REPORT_CHANNEL_ALARMS 1 +#define REPORT_SPAN_ALARMS 2 +static int report_alarms = REPORT_CHANNEL_ALARMS; + #ifdef HAVE_PRI #ifdef PRI_GETSET_TIMERS static int pritimers[PRI_MAX_TIMERS]; @@ -965,6 +969,12 @@ * \note Applies to SS7 and MFCR2 channels. */ unsigned int remotelyblocked:1; + /*! + * \brief TRUE if the channel alarms will be managed also as Span ones + * \note Applies to all channels + */ + unsigned int manages_span_alarms:1; + #if defined(HAVE_PRI) struct sig_pri_pri *pri; int prioffset; @@ -3112,8 +3122,14 @@ res = get_alarms(p); handle_alarms(p, res); } else { - ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", p->channel); - manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", "Channel: %d\r\n", p->channel); + if(report_alarms & REPORT_CHANNEL_ALARMS) { + ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", p->channel); + manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", "Channel: %d\r\n", p->channel); + } + if(report_alarms & REPORT_SPAN_ALARMS && p->manages_span_alarms) { + ast_log(LOG_NOTICE, "Alarm cleared on span %d\n", p->span); + manager_event(EVENT_FLAG_SYSTEM, "SpanAlarmClear", "Span: %d\r\n", p->span); + } } ast_mutex_unlock(&p->lock); } @@ -6953,11 +6969,21 @@ { const char *alarm_str = alarm2str(alms); - ast_log(LOG_WARNING, "Detected alarm on channel %d: %s\n", p->channel, alarm_str); - manager_event(EVENT_FLAG_SYSTEM, "Alarm", - "Alarm: %s\r\n" - "Channel: %d\r\n", - alarm_str, p->channel); + if(report_alarms & REPORT_CHANNEL_ALARMS) { + ast_log(LOG_WARNING, "Detected alarm on channel %d: %s\n", p->channel, alarm_str); + manager_event(EVENT_FLAG_SYSTEM, "Alarm", + "Alarm: %s\r\n" + "Channel: %d\r\n", + alarm_str, p->channel); + } + + if(report_alarms & REPORT_SPAN_ALARMS && p->manages_span_alarms) { + ast_log(LOG_WARNING, "Detected alarm on span %d: %s\n", p->span, alarm_str); + manager_event(EVENT_FLAG_SYSTEM, "SpanAlarm", + "Alarm: %s\r\n" + "Span: %d\r\n", + alarm_str, p->span); + } } static struct ast_frame *dahdi_handle_event(struct ast_channel *ast) @@ -7464,9 +7490,15 @@ } #endif p->inalarm = 0; - ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", p->channel); - manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", - "Channel: %d\r\n", p->channel); + if(report_alarms & REPORT_CHANNEL_ALARMS) { + ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", p->channel); + manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", + "Channel: %d\r\n", p->channel); + } + if(report_alarms & REPORT_SPAN_ALARMS && p->manages_span_alarms) { + ast_log(LOG_NOTICE, "Alarm cleared on span %d\n", p->span); + manager_event(EVENT_FLAG_SYSTEM, "SpanAlarmClear", "Span: %d\r\n", p->span); + } break; case DAHDI_EVENT_WINKFLASH: if (p->inalarm) break; @@ -9974,9 +10006,15 @@ break; case DAHDI_EVENT_NOALARM: mtd->pvt->inalarm = 0; - ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", mtd->pvt->channel); - manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", - "Channel: %d\r\n", mtd->pvt->channel); + if(report_alarms & REPORT_CHANNEL_ALARMS) { + ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", mtd->pvt->channel); + manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", + "Channel: %d\r\n", mtd->pvt->channel); + } + if(report_alarms & REPORT_SPAN_ALARMS && mtd->pvt->manages_span_alarms) { + ast_log(LOG_NOTICE, "Alarm cleared on span %d\n", mtd->pvt->span); + manager_event(EVENT_FLAG_SYSTEM, "SpanAlarmClear", "Span: %d\r\n", mtd->pvt->span); + } break; case DAHDI_EVENT_ALARM: mtd->pvt->inalarm = 1; @@ -10390,9 +10428,17 @@ break; case DAHDI_EVENT_NOALARM: i->inalarm = 0; - ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", i->channel); - manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", - "Channel: %d\r\n", i->channel); + if(report_alarms & REPORT_CHANNEL_ALARMS) { + ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", i->channel); + manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", + "Channel: %d\r\n", i->channel); + } + + if(report_alarms & REPORT_SPAN_ALARMS && i->manages_span_alarms) { + ast_log(LOG_NOTICE, "Alarm cleared on span %d\n", i->span); + manager_event(EVENT_FLAG_SYSTEM, "SpanAlarmClear", + "Span: %d\r\n", i->span); + } break; case DAHDI_EVENT_ALARM: i->inalarm = 1; @@ -15685,6 +15731,16 @@ } } + /* Mark the first channels of each Span to watch for their Span alarms */ + for (tmp = iflist, x=-1; tmp; tmp = tmp->next) { + if (!tmp->destroy && tmp->span != x) { + tmp->manages_span_alarms = 1; + x = tmp->span; + } else { + tmp->manages_span_alarms = 0; + } + } + return 0; } @@ -16685,7 +16741,16 @@ mwilevel = atoi(v->value); } else if (!strcasecmp(v->name, "dtmfcidlevel")) { dtmfcid_level = atoi(v->value); - } + } else if (!strcasecmp(v->name, "reportalarms")) { + if (!strcasecmp(v->value, "all")) + report_alarms = REPORT_CHANNEL_ALARMS | REPORT_SPAN_ALARMS; + if (!strcasecmp(v->value, "none")) + report_alarms = 0; + else if (!strcasecmp(v->value, "channels")) + report_alarms = REPORT_CHANNEL_ALARMS; + else if (!strcasecmp(v->value, "spans")) + report_alarms = REPORT_SPAN_ALARMS; + } } else if (!(options & PROC_DAHDI_OPT_NOWARN) ) ast_log(LOG_WARNING, "Ignoring any changes to '%s' (on reload) at line %d.\n", v->name, v->lineno); }