[VOL-5452]: Disable/Enable Onu OLT agent

Change-Id: I99855e5627fd683cd5310b887be65133813ddbe9
Signed-off-by: balaji.nagarajan <balaji.nagarajan@radisys.com>
diff --git a/agent/src/indications.cc b/agent/src/indications.cc
index f24dca9..681ed99 100644
--- a/agent/src/indications.cc
+++ b/agent/src/indications.cc
@@ -340,6 +340,77 @@
     bcmolt_msg_free(msg);
 }
 
+static void OnuDisableIndication(bcmolt_devid olt, bcmolt_msg *msg) {
+    openolt::Indication ind;
+    openolt::OnuDisabledIndication* onu_disable_ind = new openolt::OnuDisabledIndication;
+    openolt::SerialNumber* serial_number = new openolt::SerialNumber;
+
+    switch (msg->obj_type) {
+        case BCMOLT_OBJ_ID_ONU:
+            switch (msg->subgroup) {
+                case BCMOLT_ONU_AUTO_SUBGROUP_ONU_DISABLE_COMPLETED:
+                {
+                    bcmolt_onu_onu_disable_completed* onu = (bcmolt_onu_onu_disable_completed *)msg;
+                    bcmolt_onu_key *key = &((bcmolt_onu_onu_disable_completed *)msg)->key;
+
+                    int port_no = interface_key_to_port_no(key->pon_ni, BCMOLT_INTERFACE_TYPE_PON);
+
+                    bcmolt_serial_number *in_serial_number = &(onu->data.serial_number);
+
+
+                    OPENOLT_LOG(INFO, openolt_log_id, "onu disable indication, pon_ni %d, onu_id %d, port_no %d, status %s, serial_number %s\n",
+                        key->pon_ni, key->onu_id, port_no, bcmolt_result_to_string(onu->data.status).c_str(),serial_number_to_str(in_serial_number).c_str());
+
+                    onu_disable_ind->set_intf_id(key->pon_ni);
+                    onu_disable_ind->set_onu_id(key->onu_id);
+                    serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id.arr), 4);
+                    serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific.arr), 8);
+                    onu_disable_ind->set_allocated_serial_number(serial_number);
+                    ind.set_allocated_onu_disabled_ind(onu_disable_ind);
+                    break;
+                }
+            }
+    }
+
+    oltIndQ.push(ind);
+    bcmolt_msg_free(msg);
+}
+
+static void OnuEnableIndication(bcmolt_devid olt, bcmolt_msg *msg) {
+    openolt::Indication ind;
+    openolt::OnuEnabledIndication* onu_enable_ind = new openolt::OnuEnabledIndication;
+    openolt::SerialNumber* serial_number = new openolt::SerialNumber;
+
+    switch (msg->obj_type) {
+        case BCMOLT_OBJ_ID_ONU:
+            switch (msg->subgroup) {
+                case BCMOLT_ONU_AUTO_SUBGROUP_ONU_ENABLE_COMPLETED:
+                {
+                    bcmolt_onu_onu_enable_completed* onu = (bcmolt_onu_onu_enable_completed *)msg;
+                    bcmolt_onu_key *key = &((bcmolt_onu_onu_enable_completed *)msg)->key;
+
+                    int port_no = interface_key_to_port_no(key->pon_ni, BCMOLT_INTERFACE_TYPE_PON);
+                    bcmolt_serial_number *in_serial_number = &(onu->data.serial_number);
+
+                    OPENOLT_LOG(INFO, openolt_log_id, "onu enable indication, pon_ni %d, onu_id %d, port_no %d, serial_number %s\n",
+                        key->pon_ni, key->onu_id, port_no,serial_number_to_str(in_serial_number).c_str());
+
+                    onu_enable_ind->set_intf_id(key->pon_ni);
+                    onu_enable_ind->set_onu_id(key->onu_id);
+                    serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id.arr), 4);
+                    serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific.arr), 8);
+                    onu_enable_ind->set_allocated_serial_number(serial_number);
+
+                    ind.set_allocated_onu_enabled_ind(onu_enable_ind);
+                    break;
+                }
+            }
+    }
+
+    oltIndQ.push(ind);
+    bcmolt_msg_free(msg);
+}
+
 static void OnuAlarmIndication(bcmolt_devid olt, bcmolt_msg *msg) {
     openolt::Indication ind;
     openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
@@ -1340,6 +1411,22 @@
     if(rc != BCM_ERR_OK)
         return Status(grpc::StatusCode::INTERNAL, "onu dying-gasp indication subscribe failed");
 
+    rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
+    rx_cfg.rx_cb = OnuDisableIndication;
+    rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
+    rx_cfg.subgroup = bcmolt_onu_auto_subgroup_onu_disable_completed;
+    rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
+    if(rc != BCM_ERR_OK)
+        return Status(grpc::StatusCode::INTERNAL, "onu disable indication subscribe failed");
+
+    rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
+    rx_cfg.rx_cb = OnuEnableIndication;
+    rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
+    rx_cfg.subgroup = bcmolt_onu_auto_subgroup_onu_enable_completed;
+    rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
+    if(rc != BCM_ERR_OK)
+        return Status(grpc::StatusCode::INTERNAL, "onu enable indication subscribe failed"); 
+
     rx_cfg.obj_type = BCMOLT_OBJ_ID_PON_INTERFACE;
     rx_cfg.rx_cb = OnuDiscoveryIndication;
     rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;