VOL-886, VOL-887, VOL-891, VOL-894 ONU alarms

Change-Id: I06ce649566318b52bac06197cf9e9224f3d55717
diff --git a/protos/openolt.proto b/protos/openolt.proto
index d5a83f2..56d87f4 100644
--- a/protos/openolt.proto
+++ b/protos/openolt.proto
@@ -83,6 +83,15 @@
     oneof data {
         LosIndication los_ind = 1;
         DyingGaspIndication dying_gasp_ind = 2;
+        OnuAlarmIndication onu_alarm_ind = 3;
+        OnuStartupFailureIndication onu_startup_fail_ind = 4;
+        OnuSignalDegradeIndication onu_signal_degrade_ind = 5;
+        OnuDriftOfWindowIndication onu_drift_of_window_ind = 6;
+        OnuLossOfOmciChannelIndication onu_loss_omci_ind = 7;
+        OnuSignalsFailureIndication onu_signals_fail_ind = 8;
+        OnuTransmissionInterferenceWarning onu_tiwi_ind = 9;
+        OnuActivationFailureIndication onu_activation_fail_ind = 10;
+        OnuProcessingErrorIndication onu_processing_error_ind = 11;
     }
 }
 
@@ -243,4 +252,65 @@
     string status = 3;
 }
 
+message OnuAlarmIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string los_status = 3;
+    string lob_status = 4;
+    string lopc_miss_status = 5;
+    string lopc_mic_error_status = 6;
+}
+
+message OnuStartupFailureIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+}
+
+message OnuSignalDegradeIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 inverse_bit_error_rate = 4;
+}
+
+message OnuDriftOfWindowIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 drift = 4;
+    fixed32 new_eqd = 5;
+}
+
+message OnuLossOfOmciChannelIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+}
+
+message OnuSignalsFailureIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 inverse_bit_error_rate = 4;
+}
+
+message OnuTransmissionInterferenceWarning {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 drift = 4;
+}
+
+message OnuActivationFailureIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+}
+
+message OnuProcessingErrorIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+}
+
+
 message Empty {}
diff --git a/src/indications.cc b/src/indications.cc
index df60fcb..adac6ad 100644
--- a/src/indications.cc
+++ b/src/indications.cc
@@ -158,7 +158,33 @@
 
 bcmos_errno OnuAlarmIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
-    std::cout << "onu alarm indication" << std::endl;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuAlarmIndication* onu_alarm_ind = new openolt::OnuAlarmIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &((bcmbal_subscriber_terminal_sub_term_alarm*)obj)->key;
+
+    bcmbal_subscriber_terminal_alarms *alarms =
+        &(((bcmbal_subscriber_terminal_sub_term_alarm*)obj)->data.alarm);
+
+    std::cout << "onu alarm indication intf_id:" << key->intf_id
+        << ", onu_id:"
+        << key->sub_term_id
+        << ", alarm: los " << alarms->los << ", lob " << alarms->lob
+        << ", lopc_miss " << alarms->lopc_miss << ", lopc_mic_error "
+        << alarms->lopc_mic_error << std::endl;
+
+    onu_alarm_ind->set_intf_id(key->intf_id);
+    onu_alarm_ind->set_onu_id(key->sub_term_id);
+    onu_alarm_ind->set_los_status(alarm_status_to_string(alarms->los));
+    onu_alarm_ind->set_lob_status(alarm_status_to_string(alarms->lob));
+    onu_alarm_ind->set_lopc_miss_status(alarm_status_to_string(alarms->lopc_miss));
+    onu_alarm_ind->set_lopc_mic_error_status(alarm_status_to_string(alarms->lopc_mic_error));
+
+    alarm_ind->set_allocated_onu_alarm_ind(onu_alarm_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
     return BCM_ERR_OK;
 }
 
@@ -365,6 +391,240 @@
     return BCM_ERR_OK;
 }
 
+bcmos_errno OnuStartupFailureIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuStartupFailureIndication* sufi_ind = new openolt::OnuStartupFailureIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_sufi*)obj)->key);
+
+    bcmbal_subscriber_terminal_sufi_data *data =
+        &(((bcmbal_subscriber_terminal_sufi*)obj)->data);
+
+    std::cout << "onu startup failure indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id
+         << ", alarm: "
+         << data->sufi_status << std::endl;
+
+    sufi_ind->set_intf_id(key->intf_id);
+    sufi_ind->set_onu_id(key->sub_term_id);
+    sufi_ind->set_status(alarm_status_to_string(data->sufi_status));
+
+    alarm_ind->set_allocated_onu_startup_fail_ind(sufi_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuSignalDegradeIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuSignalDegradeIndication* sdi_ind = new openolt::OnuSignalDegradeIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_sdi*)obj)->key);
+
+    bcmbal_subscriber_terminal_sdi_data *data =
+        &(((bcmbal_subscriber_terminal_sdi*)obj)->data);
+
+    std::cout << "onu signal degrade indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id
+         << ", alarm: "
+         << data->sdi_status
+         << ", BER : " << data->ber << std::endl;
+
+    sdi_ind->set_intf_id(key->intf_id);
+    sdi_ind->set_onu_id(key->sub_term_id);
+    sdi_ind->set_status(alarm_status_to_string(data->sdi_status));
+    sdi_ind->set_inverse_bit_error_rate(data->ber);
+
+    alarm_ind->set_allocated_onu_signal_degrade_ind(sdi_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuDriftOfWindowIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuDriftOfWindowIndication* dowi_ind = new openolt::OnuDriftOfWindowIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_dowi*)obj)->key);
+
+    bcmbal_subscriber_terminal_dowi_data *data =
+        &(((bcmbal_subscriber_terminal_dowi*)obj)->data);
+
+    std::cout << "onu drift of window indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id
+         << ", alarm: "
+         << data->dowi_status
+         << ", drift : " << data->drift_value
+         << "new_eqd : " << data->new_eqd << std::endl;
+
+    dowi_ind->set_intf_id(key->intf_id);
+    dowi_ind->set_onu_id(key->sub_term_id);
+    dowi_ind->set_status(alarm_status_to_string(data->dowi_status));
+    dowi_ind->set_drift(data->drift_value);
+    dowi_ind->set_new_eqd(data->new_eqd);
+
+    alarm_ind->set_allocated_onu_drift_of_window_ind(dowi_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuLossOfOmciChannelIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuLossOfOmciChannelIndication* looci_ind = new openolt::OnuLossOfOmciChannelIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_looci*)obj)->key);
+
+    bcmbal_subscriber_terminal_looci_data *data =
+        &(((bcmbal_subscriber_terminal_looci*)obj)->data);
+
+    std::cout << "onu loss of OMCI channel indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id
+         << ", alarm: "
+         << data->looci_status << std::endl;
+
+
+    looci_ind->set_intf_id(key->intf_id);
+    looci_ind->set_onu_id(key->sub_term_id);
+    looci_ind->set_status(alarm_status_to_string(data->looci_status));
+
+    alarm_ind->set_allocated_onu_loss_omci_ind(looci_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuSignalsFailureIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuSignalsFailureIndication* sfi_ind = new openolt::OnuSignalsFailureIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_sfi*)obj)->key);
+
+    bcmbal_subscriber_terminal_sfi_data *data =
+        &(((bcmbal_subscriber_terminal_sfi*)obj)->data);
+
+    std::cout << "onu signals failure indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id
+         << ", alarm: "
+         << data->sfi_status
+         << ", BER: " << data->ber << std::endl;
+
+
+    sfi_ind->set_intf_id(key->intf_id);
+    sfi_ind->set_onu_id(key->sub_term_id);
+    sfi_ind->set_status(alarm_status_to_string(data->sfi_status));
+    sfi_ind->set_inverse_bit_error_rate(data->ber);
+
+    alarm_ind->set_allocated_onu_signals_fail_ind(sfi_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuTransmissionInterferenceWarningIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuTransmissionInterferenceWarning* tiwi_ind = new openolt::OnuTransmissionInterferenceWarning;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_tiwi*)obj)->key);
+
+    bcmbal_subscriber_terminal_tiwi_data *data =
+        &(((bcmbal_subscriber_terminal_tiwi*)obj)->data);
+
+    std::cout << "onu transmission interference warning indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id
+         << ", alarm: "
+         << data->tiwi_status
+         << ", drift: " << data->drift_value << std::endl;
+
+    tiwi_ind->set_intf_id(key->intf_id);
+    tiwi_ind->set_onu_id(key->sub_term_id);
+    tiwi_ind->set_status(alarm_status_to_string(data->tiwi_status));
+    tiwi_ind->set_drift(data->drift_value);
+
+    alarm_ind->set_allocated_onu_tiwi_ind(tiwi_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuActivationFailureIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuActivationFailureIndication* activation_fail_ind = new openolt::OnuActivationFailureIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_sub_term_act_fail*)obj)->key);
+
+    std::cout << "onu activation failure indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id << std::endl;
+
+
+    activation_fail_ind->set_intf_id(key->intf_id);
+    activation_fail_ind->set_onu_id(key->sub_term_id);
+
+    alarm_ind->set_allocated_onu_activation_fail_ind(activation_fail_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
+bcmos_errno OnuProcessingErrorIndication(bcmbal_obj *obj) {
+    openolt::Indication ind;
+    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
+    openolt::OnuProcessingErrorIndication* onu_proc_error_ind = new openolt::OnuProcessingErrorIndication;
+
+    bcmbal_subscriber_terminal_key *key =
+        &(((bcmbal_subscriber_terminal_processing_error*)obj)->key);
+
+    std::cout << "onu processing error indication, intf_id:"
+         << key->intf_id
+         << ", onu_id:"
+         << key->sub_term_id << std::endl;
+
+
+    onu_proc_error_ind->set_intf_id(key->intf_id);
+    onu_proc_error_ind->set_onu_id(key->sub_term_id);
+
+    alarm_ind->set_allocated_onu_processing_error_ind(onu_proc_error_ind);
+    ind.set_allocated_alarm_ind(alarm_ind);
+
+    oltIndQ.push(ind);
+    return BCM_ERR_OK;
+}
+
 Status SubscribeIndication() {
     bcmbal_cb_cfg cb_cfg = {};
     uint16_t ind_subgroup;
@@ -513,6 +773,79 @@
     }
 #endif
 
+
+    /* ONU startup failure indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sufi;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuStartupFailureIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu startup failure indication subscribe failed");
+    }
+
+    /* SDI indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sdi;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuSignalDegradeIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu sdi indication subscribe failed");
+    }
+
+    /* DOWI indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_dowi;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDriftOfWindowIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu dowi indication subscribe failed");
+    }
+
+    /* LOOCI indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_looci;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuLossOfOmciChannelIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu looci indication subscribe failed");
+    }
+
+    /* SFI indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sfi;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuSignalsFailureIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu sfi indication subscribe failed");
+    }
+
+    /* TIWI indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_tiwi;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuTransmissionInterferenceWarningIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu tiwi indication subscribe failed");
+    }
+
+    /* TIWI indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_act_fail;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuActivationFailureIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu activation falaire indication subscribe failed");
+    }
+
+    /* ONU processing error indication */
+    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
+    ind_subgroup = bcmbal_subscriber_terminal_auto_id_processing_error;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuProcessingErrorIndication;
+    if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
+        return Status(grpc::StatusCode::INTERNAL, "onu processing error indication subscribe failed");
+    }
+
     subscribed = true;
 
     return Status::OK;