diff --git a/agent/src/indications.cc b/agent/src/indications.cc
index 8425f0b..3f1cca2 100644
--- a/agent/src/indications.cc
+++ b/agent/src/indications.cc
@@ -56,9 +56,9 @@
          state == BCMOLT_ONU_OPERATION_ACTIVE_STANDBY) ? BCMOS_TRUE : BCMOS_FALSE)
 #define ONU_STATE_IF_UP(state) \
        ((state == BCMOLT_ONU_OPERATION_ACTIVE) ? BCMOS_TRUE : BCMOS_FALSE)
-#define ONU_RANGING_STATE_IF_UP(state) \
+#define ONU_ACTIVATION_COMPLETED_SUCCESS(state) \
        ((state == BCMOLT_RESULT_SUCCESS) ? BCMOS_TRUE : BCMOS_FALSE)
-#define ONU_RANGING_STATE_IF_DOWN(state) \
+#define ONU_ACTIVATION_COMPLETED_FAIL(state) \
        ((state != BCMOLT_RESULT_SUCCESS) ? BCMOS_TRUE : BCMOS_FALSE)
 #define SET_OPER_STATE(indication,state) \
        (INTERFACE_STATE_IF_UP(state)) ? indication->set_oper_state("up") : \
@@ -199,7 +199,7 @@
                          BCMOLT_INTERFACE_TYPE_PON);
                      std::string status = alarm_status_to_string(bcm_los_ind->data.status);
 
-                     OPENOLT_LOG(INFO, openolt_log_id, "LOS indication : intf_id: %d port: %d status %s\n", 
+                     OPENOLT_LOG(INFO, openolt_log_id, "LOS indication : intf_id: %d port: %d status %s\n",
                              bcm_los_ind->key.pon_ni, intf_id, status.c_str());
 
                      los_ind->set_intf_id(intf_id);
@@ -220,14 +220,14 @@
     openolt::Indication ind;
     openolt::IntfIndication* intf_ind = new openolt::IntfIndication;
 
-    switch (msg->obj_type) { 
+    switch (msg->obj_type) {
         case BCMOLT_OBJ_ID_PON_INTERFACE:
             switch (msg->subgroup) {
                 case BCMOLT_PON_INTERFACE_AUTO_SUBGROUP_STATE_CHANGE_COMPLETED:
-                { 
-                    bcmolt_pon_interface_key *key = 
+                {
+                    bcmolt_pon_interface_key *key =
                         &((bcmolt_pon_interface_state_change_completed*)msg)->key;
-                    bcmolt_pon_interface_state_change_completed_data *data = 
+                    bcmolt_pon_interface_state_change_completed_data *data =
                         &((bcmolt_pon_interface_state_change_completed*)msg)->data;
 
                     intf_ind->set_intf_id(key->pon_ni);
@@ -243,9 +243,9 @@
                 {
                     OPENOLT_LOG(INFO, openolt_log_id, "intf indication, intf_id: %d\n",
                         ((bcmolt_nni_interface_state_change *)msg)->key.id);
-                    bcmolt_nni_interface_key *key = 
+                    bcmolt_nni_interface_key *key =
                         &((bcmolt_nni_interface_state_change *)msg)->key;
-                    bcmolt_nni_interface_state_change_data *data = 
+                    bcmolt_nni_interface_state_change_data *data =
                         &((bcmolt_nni_interface_state_change *)msg)->data;
 
                     intf_ind->set_intf_id(key->id);
@@ -290,7 +290,7 @@
                     bcmolt_interface_type intf_type = BCMOLT_INTERFACE_TYPE_NNI;
                     intf_oper_ind->set_intf_id(key->id);
                     intf_oper_ind->set_type(bcmolt_to_grpc_intf_type(BCMOLT_INTERFACE_TYPE_NNI));
-                    SET_OPER_STATE(intf_oper_ind, data->new_state);           
+                    SET_OPER_STATE(intf_oper_ind, data->new_state);
                     OPENOLT_LOG(INFO, openolt_log_id, "intf oper state indication, intf_type %s, intf_id %d, oper_state %s\n",
                         intf_oper_ind->type().c_str(), key->id, intf_oper_ind->oper_state().c_str());
                     ind.set_allocated_intf_oper_ind(intf_oper_ind);
@@ -313,7 +313,7 @@
             switch (msg->subgroup) {
                 case BCMOLT_ONU_AUTO_SUBGROUP_XGPON_ALARM:
                 {
-                    bcmolt_xgpon_onu_alarms *onu_alarms = 
+                    bcmolt_xgpon_onu_alarms *onu_alarms =
                         &((bcmolt_onu_xgpon_alarm_data *)msg)->xgpon_onu_alarm;
                     onu_alarm_ind->set_los_status(alarm_status_to_string(onu_alarms->losi));
                     onu_alarm_ind->set_lob_status(alarm_status_to_string(onu_alarms->lobi));
@@ -328,14 +328,14 @@
                 }
                 case BCMOLT_ONU_AUTO_SUBGROUP_GPON_ALARM:
                 {
-                    bcmolt_gpon_onu_alarms *onu_alarms = 
+                    bcmolt_gpon_onu_alarms *onu_alarms =
                         &((bcmolt_onu_gpon_alarm_data *)msg)->gpon_onu_alarm;
                     onu_alarm_ind->set_los_status(alarm_status_to_string(onu_alarms->losi));
-                    /* TODO: need to set lofi and loami 
+                    /* TODO: need to set lofi and loami
                         onu_alarm_ind->set_lof_status(alarm_status_to_string(onu_alarms->lofi));
                         onu_alarm_ind->set_loami_status(alarm_status_to_string(
                         onu_alarms->loami));
-                    */ 
+                    */
                     alarm_ind->set_allocated_onu_alarm_ind(onu_alarm_ind);
                     ind.set_allocated_alarm_ind(alarm_ind);
                     break;
@@ -384,7 +384,7 @@
                     bcmolt_pon_interface_key *key =
                         &((bcmolt_pon_interface_onu_discovered *)msg)->key;
 
-                    bcmolt_pon_interface_onu_discovered_data *data = 
+                    bcmolt_pon_interface_onu_discovered_data *data =
                         &((bcmolt_pon_interface_onu_discovered *)msg)->data;
 
                     bcmolt_serial_number *in_serial_number = &(data->serial_number);
@@ -406,78 +406,6 @@
     bcmolt_msg_free(msg);
 }
 
-static void OnuIndication(bcmolt_devid olt, bcmolt_msg *msg) {
-    openolt::Indication ind;
-    openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
-
-    switch (msg->obj_type) {
-        case BCMOLT_OBJ_ID_ONU:
-            switch (msg->subgroup) {
-                case BCMOLT_ONU_AUTO_SUBGROUP_RANGING_COMPLETED:
-                {
-                    bcmolt_onu_key *key = &((bcmolt_onu_ranging_completed*)msg)->key;
-                    bcmolt_onu_ranging_completed_data *data = &((bcmolt_onu_ranging_completed*)msg)->data;
-
-                    onu_ind->set_intf_id(key->pon_ni);
-                    onu_ind->set_onu_id(key->onu_id);
-                    if (ONU_RANGING_STATE_IF_UP(data->status))
-                        onu_ind->set_oper_state("up");
-                    if (ONU_RANGING_STATE_IF_DOWN(data->status))
-                        onu_ind->set_oper_state("down");
-                    (key->onu_id)?onu_ind->set_admin_state("up"):onu_ind->set_admin_state("down");
-                    ind.set_allocated_onu_ind(onu_ind);
-                    OPENOLT_LOG(INFO, openolt_log_id, "onu indication, pon_ni %d, onu_id %d, onu_state %s, onu_admin %s\n", 
-                        key->pon_ni, key->onu_id, (data->status==BCMOLT_RESULT_SUCCESS)?"up":"down",
-                        (key->onu_id)?"up":"down");
-                }
-            }
-    }
-    /*const std::string  reg_id = getOnuRegistrationId(key->intf_id,key->sub_term_id);
-    onu_ind->set_registration_id(reg_id);
-
-    BCM_LOG(INFO, openolt_log_id, "onu indication, intf_id %d, onu_id %d, oper state %s, admin_state %s,registration id %s\n",
-        onu_ind->intf_id(), onu_ind->onu_id(),onu_ind->oper_state().c_str(), onu_ind->admin_state().c_str(),onu_ind->registration_id().c_str());*/
-
-    oltIndQ.push(ind);
-    bcmolt_msg_free(msg);
-}
-
-static void OnuOperIndication(bcmolt_devid olt, bcmolt_msg *msg) {
-    openolt::Indication ind;
-    openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
-
-    switch (msg->obj_type) {
-        case BCMOLT_OBJ_ID_ONU:
-            switch (msg->subgroup) {
-                case BCMOLT_ONU_AUTO_SUBGROUP_STATE_CHANGE:
-                {
-                    bcmolt_onu_key *key = &((bcmolt_onu_state_change*)msg)->key;
-                    bcmolt_onu_state_change_data *data = &((bcmolt_onu_state_change*)msg)->data;
-
-                    onu_ind->set_intf_id(key->pon_ni);
-                    onu_ind->set_onu_id(key->onu_id);
-                    if (ONU_STATE_IF_UP(data->new_onu_state))
-                        onu_ind->set_oper_state("up");
-                    if (ONU_STATE_IF_DOWN(data->new_onu_state))
-                        onu_ind->set_oper_state("down");
-                    ind.set_allocated_onu_ind(onu_ind);
-
-                    OPENOLT_LOG(INFO, openolt_log_id, "onu oper state indication, intf_id %d, onu_id %d, old oper state %d, new oper state %s\n",
-                        key->pon_ni, key->onu_id, data->new_onu_state, onu_ind->oper_state().c_str());
-                }
-            }
-    }
-    /*const std::string  reg_id = getOnuRegistrationId(key->intf_id,key->sub_term_id);
-    onu_ind->set_registration_id(reg_id);
-    ind.set_allocated_onu_ind(onu_ind);
-
-    BCM_LOG(INFO, openolt_log_id, "onu oper state indication, intf_id %d, onu_id %d, old oper state %d, new oper state %s, admin_state %s registraion_id %s\n",
-        key->intf_id, key->sub_term_id, data->old_oper_status, onu_ind->oper_state().c_str(), onu_ind->admin_state().c_str(),onu_ind->registration_id().c_str());*/
-
-    oltIndQ.push(ind);
-    bcmolt_msg_free(msg);
-}
-
 static void OmciIndication(bcmolt_devid olt, bcmolt_msg *msg) {
     openolt::Indication ind;
     openolt::OmciIndication* omci_ind = new openolt::OmciIndication;
@@ -490,7 +418,7 @@
                     bcmolt_onu_key *key = &((bcmolt_onu_omci_packet*)msg)->key;
                     bcmolt_onu_omci_packet_data *data = &((bcmolt_onu_omci_packet*)msg)->data;
 
-                    OPENOLT_LOG(DEBUG, omci_log_id, "OMCI indication: pon_ni %d, onu_id %d\n", 
+                    OPENOLT_LOG(DEBUG, omci_log_id, "OMCI indication: pon_ni %d, onu_id %d\n",
                         key->pon_ni, key->onu_id);
 
                     omci_ind->set_intf_id(key->pon_ni);
@@ -516,9 +444,9 @@
             switch (msg->subgroup) {
                 case BCMOLT_FLOW_AUTO_SUBGROUP_RECEIVE_ETH_PACKET:
                 {
-                    bcmolt_flow_receive_eth_packet *pkt = 
+                    bcmolt_flow_receive_eth_packet *pkt =
                         (bcmolt_flow_receive_eth_packet*)msg;
-                    bcmolt_flow_receive_eth_packet_data *pkt_data = 
+                    bcmolt_flow_receive_eth_packet_data *pkt_data =
                         &((bcmolt_flow_receive_eth_packet*)msg)->data;
 
                     uint32_t port_no = GetPortNum_(pkt->key.flow_id);
@@ -532,10 +460,10 @@
                     ind.set_allocated_pkt_ind(pkt_ind);
 
                     OPENOLT_LOG(INFO, openolt_log_id, "packet indication, ingress intf_type %s, ingress intf_id %d, egress intf_type %s, egress intf_id %lu, svc_port %d, flow_type %s, flow_id %d, port_no %d, cookie %"PRIu64"\n",
-                        pkt_ind->intf_type().c_str(), pkt_ind->intf_id(), 
+                        pkt_ind->intf_type().c_str(), pkt_ind->intf_id(),
                         bcmolt_to_grpc_flow_intf_type((bcmolt_flow_interface_type)get_flow_status(pkt->key.flow_id, pkt->key.flow_type, EGRESS_INTF_TYPE)).c_str(),
                         get_flow_status(pkt->key.flow_id, pkt->key.flow_type, EGRESS_INTF_ID),
-                        pkt_ind->gemport_id(), GET_FLOW_TYPE(pkt->key.flow_type), 
+                        pkt_ind->gemport_id(), GET_FLOW_TYPE(pkt->key.flow_type),
                         pkt_ind->flow_id(), port_no, pkt_ind->cookie());
                 }
             }
@@ -707,7 +635,7 @@
             switch (msg->subgroup) {
                 case BCMOLT_ONU_AUTO_SUBGROUP_DOWI:
                 {
-                    bcmolt_onu_key *key = &((bcmolt_onu_dowi*)msg)->key; 
+                    bcmolt_onu_key *key = &((bcmolt_onu_dowi*)msg)->key;
                     bcmolt_onu_dowi_data *data = &((bcmolt_onu_dowi*)msg)->data;
 
                     OPENOLT_LOG(WARNING, openolt_log_id, "onu drift of window indication, intf_id %d, onu_id %d, alarm %d, drift %d, new_eqd %d\n",
@@ -822,33 +750,69 @@
     bcmolt_msg_free(msg);
 }
 
-static void OnuActivationFailureIndication(bcmolt_devid olt, bcmolt_msg *msg) {
+static void OnuActivationCompletedIndication(bcmolt_devid olt, bcmolt_msg *msg) {
     openolt::Indication ind;
-    openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
-    openolt::OnuActivationFailureIndication* activation_fail_ind = new openolt::OnuActivationFailureIndication;
+    openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
+
+    switch (msg->obj_type) {
+        case BCMOLT_OBJ_ID_ONU:
+            switch (msg->subgroup) {
+                case BCMOLT_ONU_AUTO_SUBGROUP_ONU_ACTIVATION_COMPLETED:
+                {
+                    bcmolt_onu_key *key = &((bcmolt_onu_onu_activation_completed*)msg)->key;
+                    bcmolt_onu_onu_activation_completed_data*data = &((bcmolt_onu_onu_activation_completed*)msg)->data;
+
+                    onu_ind->set_intf_id(key->pon_ni);
+                    onu_ind->set_onu_id(key->onu_id);
+                    if (ONU_ACTIVATION_COMPLETED_SUCCESS(data->status))
+                        onu_ind->set_oper_state("up");
+                    if (ONU_ACTIVATION_COMPLETED_FAIL(data->status))
+                        onu_ind->set_oper_state("down");
+                    // Setting the admin_state state field based on a valid onu_id does not make any sense.
+                    // The adapter too does not seem to interpret this seriously.
+                    // Legacy code, lets keep this as is for now.
+                    (key->onu_id)?onu_ind->set_admin_state("up"):onu_ind->set_admin_state("down");
+                    ind.set_allocated_onu_ind(onu_ind);
+                    OPENOLT_LOG(INFO, openolt_log_id, "onu indication, pon_ni %d, onu_id %d, onu_state %s, onu_admin %s\n",
+                        key->pon_ni, key->onu_id, (data->status==BCMOLT_RESULT_SUCCESS)?"up":"down",
+                        (key->onu_id)?"up":"down");
+                }
+            }
+    }
+
+    oltIndQ.push(ind);
+    bcmolt_msg_free(msg);
+}
+
+
+static void OnuDeactivationCompletedIndication(bcmolt_devid olt, bcmolt_msg *msg) {
+    openolt::Indication ind;
+
+    openolt::Indication onu_ind;
+    openolt::OnuIndication* onu_ind_data = new openolt::OnuIndication;
 
     switch (msg->obj_type) {
         case BCMOLT_OBJ_ID_ONU:
             switch (msg->subgroup) {
                 case BCMOLT_ONU_AUTO_SUBGROUP_ONU_DEACTIVATION_COMPLETED:
                 {
-                    bcmolt_onu_key *key = &((bcmolt_onu_onu_activation_completed*)msg)->key;
-                    bcmolt_onu_onu_activation_completed_data *data = 
-                        &((bcmolt_onu_onu_activation_completed*)msg)->data;
+                    bcmolt_onu_key *key = &((bcmolt_onu_onu_deactivation_completed*)msg)->key;
+                    bcmolt_onu_onu_deactivation_completed_data *data =
+                        &((bcmolt_onu_onu_deactivation_completed*)msg)->data;
 
-                    OPENOLT_LOG(INFO, openolt_log_id, "Got onu deactivation, intf_id %d, onu_id %d, fail_reason %d\n",
-                        key->pon_ni, key->onu_id, data->fail_reason);
+                    OPENOLT_LOG(INFO, openolt_log_id, "Got onu deactivation, intf_id %d, onu_id %d, fail_reason %d, result_status %s\n",
+                        key->pon_ni, key->onu_id, data->fail_reason, bcmolt_result_to_string(data->status).c_str());
 
-                    activation_fail_ind->set_intf_id(key->pon_ni);
-                    activation_fail_ind->set_onu_id(key->onu_id);
-                    alarm_ind->set_allocated_onu_activation_fail_ind(activation_fail_ind);
-
-                    ind.set_allocated_alarm_ind(alarm_ind);
+                    onu_ind_data->set_intf_id(key->pon_ni);
+                    onu_ind_data->set_onu_id(key->onu_id);
+                    onu_ind_data->set_oper_state("down");
+                    onu_ind_data->set_admin_state("down");
+                    onu_ind.set_allocated_onu_ind(onu_ind_data);
                 }
             }
     }
 
-    oltIndQ.push(ind);
+    oltIndQ.push(onu_ind);
     bcmolt_msg_free(msg);
 }
 
@@ -890,7 +854,7 @@
     rx_cfg.subgroup = bcmolt_device_auto_subgroup_connection_complete;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
+        return Status(grpc::StatusCode::INTERNAL,
             "Olt connection complete state indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_DEVICE;
@@ -899,7 +863,7 @@
     rx_cfg.subgroup = bcmolt_device_auto_subgroup_disconnection_complete;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
+        return Status(grpc::StatusCode::INTERNAL,
             "Olt disconnection complete state indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_DEVICE;
@@ -908,7 +872,7 @@
     rx_cfg.subgroup = bcmolt_device_auto_subgroup_connection_failure;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
+        return Status(grpc::StatusCode::INTERNAL,
             "Olt connection failure state indication subscribe failed");
 
     /* Interface LOS indication */
@@ -926,7 +890,7 @@
     rx_cfg.subgroup = bcmolt_pon_interface_auto_subgroup_state_change_completed;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
+        return Status(grpc::StatusCode::INTERNAL,
             "PON Interface operations state change indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_NNI_INTERFACE;
@@ -935,7 +899,7 @@
     rx_cfg.subgroup = bcmolt_nni_interface_auto_subgroup_state_change;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
+        return Status(grpc::StatusCode::INTERNAL,
             "NNI Interface operations state change indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
@@ -971,21 +935,12 @@
         return Status(grpc::StatusCode::INTERNAL, "onu discovery indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
-    rx_cfg.rx_cb = OnuIndication;
-    rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
-    rx_cfg.subgroup = bcmolt_onu_auto_subgroup_ranging_completed;
-
-    rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
-    if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, "onu indication subscribe failed");
-
-    rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
     rx_cfg.rx_cb = OnuStartupFailureIndication;
     rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
     rx_cfg.subgroup = bcmolt_onu_auto_subgroup_sufi;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
+        return Status(grpc::StatusCode::INTERNAL,
             "onu startup failure indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
@@ -1031,15 +986,25 @@
     if(rc != BCM_ERR_OK)
         return Status(grpc::StatusCode::INTERNAL, "onu tiwi indication subscribe failed");
 
-    /* ONU Activation Failure Indiction */
+    /* ONU Activation Completed Indication */
     rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
-    rx_cfg.rx_cb = OnuActivationFailureIndication;
+    rx_cfg.rx_cb = OnuActivationCompletedIndication;
+    rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
+    rx_cfg.subgroup = bcmolt_onu_auto_subgroup_onu_activation_completed;
+    rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
+    if(rc != BCM_ERR_OK)
+        return Status(grpc::StatusCode::INTERNAL,
+            "onu activation completed indication subscribe failed");
+
+    /* ONU Deactivation Completed Indication */
+    rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
+    rx_cfg.rx_cb = OnuDeactivationCompletedIndication;
     rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
     rx_cfg.subgroup = bcmolt_onu_auto_subgroup_onu_deactivation_completed;
     rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
     if(rc != BCM_ERR_OK)
-        return Status(grpc::StatusCode::INTERNAL, 
-            "onu activation falaire indication subscribe failed");
+        return Status(grpc::StatusCode::INTERNAL,
+            "onu deactivation indication subscribe failed");
 
     rx_cfg.obj_type = BCMOLT_OBJ_ID_FLOW;
     rx_cfg.rx_cb = PacketIndication;
diff --git a/agent/src/translation.cc b/agent/src/translation.cc
index 19e9f66..bd41b61 100644
--- a/agent/src/translation.cc
+++ b/agent/src/translation.cc
@@ -40,3 +40,14 @@
     return "unknown";
 }
 
+std::string bcmolt_result_to_string(bcmolt_result result) {
+    switch (result) {
+        case BCMOLT_RESULT_SUCCESS:
+            return "success";
+        case BCMOLT_RESULT_FAIL:
+            return "fail";
+        default:
+            return "unknown";
+    }
+}
+
diff --git a/agent/src/translation.h b/agent/src/translation.h
index b4d8b90..4a65654 100644
--- a/agent/src/translation.h
+++ b/agent/src/translation.h
@@ -25,5 +25,6 @@
 int interface_key_to_port_no(bcmolt_interface_id intf_id, 
         bcmolt_interface_type intf_type);
 std::string alarm_status_to_string(bcmolt_status status);
+std::string bcmolt_result_to_string(bcmolt_result result);
 
 #endif
