/*
** Copyright 2017-present Open Networking Foundation
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

#include "bal_indications_hdlr.h"
#include "bal_indications_queue.h"

/*global variables*/

/*extern variables*/


/*static bcmos_mutex bal_ind_lock; - Need to define bcm independent mutex*/
/********************************************************************\
 * Function    : bal_acc_term_indication_cb                         *
 * Description : This function will handle the indications for      *
 *               Access Terminal Indication                         *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_acc_term_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_ACCESS_TERMINAL != obj->obj_type ||
      bcmbal_access_terminal_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_ACCESS_TERM_IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_access_terminal_ind *acc_term_ind = (bcmbal_access_terminal_ind *)obj;

      balIndCfg->access_term_ind = malloc(sizeof(BalAccessTerminalInd));
      memset(balIndCfg->access_term_ind, 0, sizeof(BalAccessTerminalInd));
      bal_access_terminal_ind__init(balIndCfg->access_term_ind);

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->access_term_ind->hdr = hdr;

      BalAccessTerminalKey *accessTermkey;
      accessTermkey = malloc(sizeof(BalAccessTerminalKey));
      memset(accessTermkey, 0, sizeof(BalAccessTerminalKey));
      bal_access_terminal_key__init(accessTermkey);
      balIndCfg->access_term_ind->key = accessTermkey;
      balIndCfg->access_term_ind->key->has_access_term_id = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->key->access_term_id = acc_term_ind->key.access_term_id;

      BalAccessTerminalIndData *accessTermIndData;
      accessTermIndData = malloc(sizeof(BalAccessTerminalIndData));
      memset(accessTermIndData, 0, sizeof(BalAccessTerminalIndData));
      bal_access_terminal_ind_data__init(accessTermIndData);
      balIndCfg->access_term_ind->data = accessTermIndData;
      balIndCfg->access_term_ind->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->admin_state = acc_term_ind->data.admin_state;
      balIndCfg->access_term_ind->data->has_oper_status = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->oper_status = acc_term_ind->data.oper_status;
      balIndCfg->access_term_ind->data->has_iwf_mode = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->iwf_mode = acc_term_ind->data.iwf_mode;

      BalTopology *balTop;
      balTop = malloc(sizeof(BalTopology));
      memset(balTop, 0, sizeof(BalTopology));
      bal_topology__init(balTop);
      balIndCfg->access_term_ind->data->topology = balTop;

      balIndCfg->access_term_ind->data->topology->has_num_of_nni_ports = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->topology->num_of_nni_ports =
                                            acc_term_ind->data.topology.num_of_nni_ports;
      balIndCfg->access_term_ind->data->topology->has_num_of_pon_ports = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->topology->num_of_pon_ports =
                                            acc_term_ind->data.topology.num_of_pon_ports;
      balIndCfg->access_term_ind->data->topology->has_num_of_mac_devs = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->topology->num_of_mac_devs =
                                             acc_term_ind->data.topology.num_of_mac_devs;
      balIndCfg->access_term_ind->data->topology->has_num_of_pons_per_mac_dev = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->topology->num_of_pons_per_mac_dev =
                                      acc_term_ind->data.topology.num_of_pons_per_mac_dev;
      balIndCfg->access_term_ind->data->topology->has_pon_family = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->topology->pon_family =
                                                   acc_term_ind->data.topology.pon_family;
      balIndCfg->access_term_ind->data->topology->has_pon_sub_family = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->topology->pon_sub_family =
                                                acc_term_ind->data.topology.pon_sub_family;

      BalSwVersion *balsv;
      balsv = malloc(sizeof(BalSwVersion));
      memset(balsv, 0, sizeof(BalSwVersion));
      bal_sw_version__init(balsv);
      balIndCfg->access_term_ind->data->sw_version = balsv;

      balIndCfg->access_term_ind->data->sw_version->has_version_type = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->sw_version->version_type =
                                                acc_term_ind->data.sw_version.version_type;
      balIndCfg->access_term_ind->data->sw_version->has_major_rev = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->sw_version->major_rev =
                                                   acc_term_ind->data.sw_version.major_rev;
      balIndCfg->access_term_ind->data->sw_version->has_minor_rev = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->sw_version->minor_rev =
                                                   acc_term_ind->data.sw_version.minor_rev;
      balIndCfg->access_term_ind->data->sw_version->has_patch_rev = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->sw_version->patch_rev =
                                                   acc_term_ind->data.sw_version.patch_rev;
      balIndCfg->access_term_ind->data->sw_version->has_om_version = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->sw_version->om_version =
                                                  acc_term_ind->data.sw_version.om_version;
      balIndCfg->access_term_ind->data->sw_version->has_dev_point = BAL_GRPC_PRES;
      balIndCfg->access_term_ind->data->sw_version->dev_point =
                                                   acc_term_ind->data.sw_version.dev_point;

      bal_register_indication_cbs();

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);

      is_reboot = BAL_REBOOT_STATUS__BAL_OLT_UP_AFTER_ACTIVATION;
   }

   return result;
}

/********************************************************************\
 * Function    : bal_acc_term_osc_indication_cb                     *
 * Description : This function will handle the indications for      *
 *               Access Terminal Operational State Change           *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_acc_term_osc_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_ACCESS_TERMINAL != obj->obj_type ||
      bcmbal_access_terminal_auto_id_oper_status_change != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->u_case = BAL_INDICATIONS__U_ACCESS_TERM_IND_OP_STATE;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_access_terminal_oper_status_change *acc_term_osc =
                                  (bcmbal_access_terminal_oper_status_change *)obj;

      BalAccessTerminalOperStatusChange *acessTermOSC;
      acessTermOSC = malloc(sizeof(BalAccessTerminalOperStatusChange));
      memset(acessTermOSC, 0, sizeof(BalAccessTerminalOperStatusChange));
      bal_access_terminal_oper_status_change__init(acessTermOSC);
      balIndCfg->access_term_ind_op_state = acessTermOSC;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->access_term_ind_op_state->hdr = hdr;

      BalAccessTerminalKey *accessTermkey;
      accessTermkey = malloc(sizeof(BalAccessTerminalKey));
      memset(accessTermkey, 0, sizeof(BalAccessTerminalKey));
      bal_access_terminal_key__init(accessTermkey);
      balIndCfg->access_term_ind_op_state->key = accessTermkey;
      balIndCfg->access_term_ind_op_state->key->has_access_term_id = BAL_GRPC_PRES;
      balIndCfg->access_term_ind_op_state->key->access_term_id =
                                                  acc_term_osc->key.access_term_id;

      BalAccessTerminalOperStatusChangeData *accessTermOscData;
      accessTermOscData = malloc(sizeof(BalAccessTerminalOperStatusChangeData));
      memset(accessTermOscData, 0, sizeof(BalAccessTerminalOperStatusChangeData));
      bal_access_terminal_oper_status_change_data__init(accessTermOscData);
      balIndCfg->access_term_ind_op_state->data = accessTermOscData;
      balIndCfg->access_term_ind_op_state->data->has_new_oper_status = BAL_GRPC_PRES;
      balIndCfg->access_term_ind_op_state->data->new_oper_status =
                                                 acc_term_osc->data.new_oper_status;
      balIndCfg->access_term_ind_op_state->data->has_old_oper_status = BAL_GRPC_PRES;
      balIndCfg->access_term_ind_op_state->data->old_oper_status =
                                                 acc_term_osc->data.old_oper_status;
      balIndCfg->access_term_ind_op_state->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->access_term_ind_op_state->data->admin_state =
                                                 acc_term_osc->data.admin_state;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_flow_osc_indication_cb                         *
 * Description : This function will handle the indications for      *
 *               Flow Operational State Change                      *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_flow_osc_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_FLOW != obj->obj_type ||
      bcmbal_flow_auto_id_oper_status_change != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_FLOW_OP_STATE;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_flow_oper_status_change *flow_osc = (bcmbal_flow_oper_status_change *)obj;

      BalFlowOperStatusChange *flowOscInd;
      flowOscInd = malloc(sizeof(BalFlowOperStatusChange));
      memset(flowOscInd, 0, sizeof(BalFlowOperStatusChange));
      bal_flow_oper_status_change__init(flowOscInd);
      balIndCfg->flow_op_state = flowOscInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->flow_op_state->hdr = hdr;

      BalFlowKey *flowkey;
      flowkey = malloc(sizeof(BalFlowKey));
      memset(flowkey, 0, sizeof(BalFlowKey));
      bal_flow_key__init(flowkey);
      balIndCfg->flow_op_state->key = flowkey;

      balIndCfg->flow_op_state->key->has_flow_id = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->key->flow_id = flow_osc->key.flow_id;
      balIndCfg->flow_op_state->key->has_flow_type = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->key->flow_type = flow_osc->key.flow_type;

      BalFlowOperStatusChangeData *flowOscIndData;
      flowOscIndData = malloc(sizeof(BalFlowOperStatusChangeData));
      memset(flowOscIndData, 0, sizeof(BalFlowOperStatusChangeData));
      bal_flow_oper_status_change_data__init(flowOscIndData);
      balIndCfg->flow_op_state->data = flowOscIndData;

      balIndCfg->flow_op_state->data->has_new_oper_status = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->data->new_oper_status = flow_osc->data.new_oper_status;
      balIndCfg->flow_op_state->data->has_old_oper_status = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->data->old_oper_status = flow_osc->data.old_oper_status;
      balIndCfg->flow_op_state->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->data->admin_state = flow_osc->data.admin_state;
      balIndCfg->flow_op_state->data->has_svc_port_id = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->data->svc_port_id = flow_osc->data.svc_port_id;
      balIndCfg->flow_op_state->data->has_dba_tm_sched_id = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->data->dba_tm_sched_id = flow_osc->data.dba_tm_sched_id;
      balIndCfg->flow_op_state->data->has_cookie = BAL_GRPC_PRES;
      balIndCfg->flow_op_state->data->cookie = flow_osc->data.cookie;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_flow_indication_cb                             *
 * Description : This function will handle the indications for      *
 *               Flow Indication                                    *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_flow_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_FLOW != obj->obj_type ||
      bcmbal_flow_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_FLOW_IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_flow_ind *flow_ind = (bcmbal_flow_ind *)obj;

      BalFlowInd *flowInd;
      flowInd = malloc(sizeof(BalFlowInd));
      memset(flowInd, 0, sizeof(BalFlowInd));
      bal_flow_ind__init(flowInd);
      balIndCfg->flow_ind = flowInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->flow_ind->hdr = hdr;

      BalFlowKey *flowkey;
      flowkey = malloc(sizeof(BalFlowKey));
      memset(flowkey, 0, sizeof(BalFlowKey));
      bal_flow_key__init(flowkey);
      balIndCfg->flow_ind->key = flowkey;

      balIndCfg->flow_ind->key->has_flow_id = BAL_GRPC_PRES;
      balIndCfg->flow_ind->key->flow_id = flow_ind->key.flow_id;
      balIndCfg->flow_ind->key->has_flow_type = BAL_GRPC_PRES;
      balIndCfg->flow_ind->key->flow_type = flow_ind->key.flow_type;

      BalFlowIndData *flowIndData;
      flowIndData = malloc(sizeof(BalFlowIndData));
      memset(flowIndData, 0, sizeof(BalFlowIndData));
      bal_flow_ind_data__init(flowIndData);
      balIndCfg->flow_ind->data = flowIndData;

      balIndCfg->flow_ind->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->admin_state = flow_ind->data.admin_state;
      balIndCfg->flow_ind->data->has_oper_status= BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->oper_status= flow_ind->data.oper_status;
      balIndCfg->flow_ind->data->has_access_int_id = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->access_int_id = flow_ind->data.access_int_id;
      balIndCfg->flow_ind->data->has_network_int_id = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->network_int_id = flow_ind->data.network_int_id;
      balIndCfg->flow_ind->data->has_sub_term_id = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->sub_term_id = flow_ind->data.sub_term_id;
      balIndCfg->flow_ind->data->has_sub_term_uni_idx = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->sub_term_uni_idx = flow_ind->data.sub_term_uni_idx;
      balIndCfg->flow_ind->data->has_svc_port_id = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->svc_port_id = flow_ind->data.svc_port_id;
      balIndCfg->flow_ind->data->has_resolve_mac = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->resolve_mac = flow_ind->data.resolve_mac;
      balIndCfg->flow_ind->data->has_cookie = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->cookie = flow_ind->data.cookie;

      BalClassifier *balClassifier;
      balClassifier = malloc(sizeof(BalClassifier));
      memset(balClassifier, 0, sizeof(BalClassifier));
      bal_classifier__init(balClassifier);
      balIndCfg->flow_ind->data->classifier = balClassifier;

      balIndCfg->flow_ind->data->classifier->has_presence_mask = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->presence_mask = flow_ind->data.classifier.presence_mask;
      balIndCfg->flow_ind->data->classifier->has_o_tpid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->o_tpid = flow_ind->data.classifier.o_tpid;
      balIndCfg->flow_ind->data->classifier->has_o_vid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->o_vid = flow_ind->data.classifier.o_vid;
      balIndCfg->flow_ind->data->classifier->has_i_tpid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->i_tpid = flow_ind->data.classifier.i_tpid;
      balIndCfg->flow_ind->data->classifier->has_i_vid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->i_vid = flow_ind->data.classifier.i_vid;
      balIndCfg->flow_ind->data->classifier->has_o_pbits = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->o_pbits = flow_ind->data.classifier.o_pbits;
      balIndCfg->flow_ind->data->classifier->has_i_pbits = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->i_pbits = flow_ind->data.classifier.i_pbits;
      balIndCfg->flow_ind->data->classifier->has_ether_type = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->ether_type = flow_ind->data.classifier.ether_type;
      balIndCfg->flow_ind->data->classifier->has_dst_mac = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->dst_mac.len =
                            (BCMOS_ETH_ALEN)*sizeof(flow_ind->data.classifier.dst_mac.u8);
      balIndCfg->flow_ind->data->classifier->dst_mac.data =
           (uint8_t *)malloc((balIndCfg->flow_ind->data->classifier->dst_mac.len)*sizeof(uint8_t));
      memcpy(balIndCfg->flow_ind->data->classifier->dst_mac.data,
             flow_ind->data.classifier.dst_mac.u8,
             balIndCfg->flow_ind->data->classifier->dst_mac.len);
      balIndCfg->flow_ind->data->classifier->has_src_mac = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->src_mac.len =
                            (BCMOS_ETH_ALEN)*sizeof(flow_ind->data.classifier.src_mac.u8);
      balIndCfg->flow_ind->data->classifier->src_mac.data =
           (uint8_t *)malloc((balIndCfg->flow_ind->data->classifier->src_mac.len)*sizeof(uint8_t));
      memcpy(balIndCfg->flow_ind->data->classifier->src_mac.data,
             flow_ind->data.classifier.src_mac.u8,
             balIndCfg->flow_ind->data->classifier->src_mac.len);
      balIndCfg->flow_ind->data->classifier->has_ip_proto = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->ip_proto = flow_ind->data.classifier.ip_proto;
      balIndCfg->flow_ind->data->classifier->has_dst_ip = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->dst_ip = flow_ind->data.classifier.dst_ip.u32;
      balIndCfg->flow_ind->data->classifier->has_src_ip = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->src_ip = flow_ind->data.classifier.src_ip.u32;
      balIndCfg->flow_ind->data->classifier->has_src_port = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->src_port = flow_ind->data.classifier.src_port;
      balIndCfg->flow_ind->data->classifier->has_dst_port = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->dst_port = flow_ind->data.classifier.dst_port;
      balIndCfg->flow_ind->data->classifier->has_pkt_tag_type = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->classifier->pkt_tag_type = flow_ind->data.classifier.pkt_tag_type;

      BalAction *balAction;
      balAction = malloc(sizeof(BalAction));
      memset(balAction, 0, sizeof(BalAction));
      bal_action__init(balAction);
      balIndCfg->flow_ind->data->action = balAction;

      balIndCfg->flow_ind->data->action->has_presence_mask = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->presence_mask = flow_ind->data.action.presence_mask;
      balIndCfg->flow_ind->data->action->has_cmds_bitmask = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->cmds_bitmask = flow_ind->data.action.cmds_bitmask;
      balIndCfg->flow_ind->data->action->has_o_vid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->o_vid = flow_ind->data.action.o_vid;
      balIndCfg->flow_ind->data->action->has_o_pbits = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->o_pbits = flow_ind->data.action.o_pbits;
      balIndCfg->flow_ind->data->action->has_o_tpid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->o_tpid = flow_ind->data.action.o_tpid;
      balIndCfg->flow_ind->data->action->has_i_vid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->i_vid = flow_ind->data.action.i_vid;
      balIndCfg->flow_ind->data->action->has_i_pbits = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->i_pbits = flow_ind->data.action.i_pbits;
      balIndCfg->flow_ind->data->action->has_i_tpid = BAL_GRPC_PRES;
      balIndCfg->flow_ind->data->action->i_tpid = flow_ind->data.action.i_tpid;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_group_indication_cb                            *
 * Description : This function will handle the indications for      *
 *               Group Indication                                   *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_group_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;
   unsigned int i = 0;

   if(BCMBAL_OBJ_ID_GROUP != obj->obj_type ||
      bcmbal_group_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_GROUP_IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_group_ind *group_ind = (bcmbal_group_ind *)obj;

      BalGroupInd *groupInd;
      groupInd = malloc(sizeof(BalGroupInd));
      memset(groupInd, 0, sizeof(BalGroupInd));
      bal_group_ind__init(groupInd);
      balIndCfg->group_ind = groupInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->group_ind->hdr = hdr;

      BalGroupKey *groupkey;
      groupkey = malloc(sizeof(BalGroupKey));
      memset(groupkey, 0, sizeof(BalGroupKey));
      bal_group_key__init(groupkey);
      balIndCfg->group_ind->key = groupkey;

      balIndCfg->group_ind->key->has_group_id = BAL_GRPC_PRES;
      balIndCfg->group_ind->key->group_id = group_ind->key.group_id;

      BalGroupIndData *groupIndData;
      groupIndData = malloc(sizeof(BalGroupIndData));
      memset(groupIndData, 0, sizeof(BalGroupIndData));
      bal_group_ind_data__init(groupIndData);
      balIndCfg->group_ind->data = groupIndData;

      balIndCfg->group_ind->data->has_members_cmd = BAL_GRPC_PRES;
      balIndCfg->group_ind->data->members_cmd = group_ind->data.members_cmd;
      balIndCfg->group_ind->data->has_cookie = BAL_GRPC_PRES;
      balIndCfg->group_ind->data->cookie = group_ind->data.cookie;
      balIndCfg->group_ind->data->has_owner = BAL_GRPC_PRES;
      balIndCfg->group_ind->data->owner = group_ind->data.owner;

      BalGroupMemberInfoList *balMembers;
      balMembers = malloc(sizeof(BalGroupMemberInfoList));
      memset(balMembers, 0, sizeof(BalGroupMemberInfoList));
      bal_group_member_info_list__init(balMembers);
      balIndCfg->group_ind->data->members = balMembers;

      balIndCfg->group_ind->data->members->n_val = group_ind->data.members.len;

      BalGroupMemberInfo *balMemberInfo;
      BalAction *balAction;
      BalTmQueueRef *balQueue;
      for (i = 0; i < balIndCfg->group_ind->data->members->n_val; i++)
      {
         balMemberInfo = malloc(sizeof(BalGroupMemberInfo));
         memset(balMemberInfo, 0, sizeof(BalGroupMemberInfo));
         bal_group_member_info__init(balMemberInfo);

         balMemberInfo->has_intf_id = BAL_GRPC_PRES;
         balMemberInfo->intf_id = group_ind->data.members.val->intf_id;
         balMemberInfo->has_svc_port_id = BAL_GRPC_PRES;
         balMemberInfo->svc_port_id = group_ind->data.members.val->svc_port_id;

         balAction = malloc(sizeof(BalAction));
         memset(balAction, 0, sizeof(BalAction));
         bal_action__init(balAction);
         balMemberInfo->action = balAction;

         balMemberInfo->action->has_presence_mask = BAL_GRPC_PRES;
         balMemberInfo->action->presence_mask = group_ind->data.members.val->action.presence_mask;
         balMemberInfo->action->has_cmds_bitmask = BAL_GRPC_PRES;
         balMemberInfo->action->cmds_bitmask = group_ind->data.members.val->action.cmds_bitmask;
         balMemberInfo->action->has_o_vid = BAL_GRPC_PRES;
         balMemberInfo->action->o_vid = group_ind->data.members.val->action.o_vid;
         balMemberInfo->action->has_o_pbits = BAL_GRPC_PRES;
         balMemberInfo->action->o_pbits = group_ind->data.members.val->action.o_pbits;
         balMemberInfo->action->has_o_tpid = BAL_GRPC_PRES;
         balMemberInfo->action->o_tpid = group_ind->data.members.val->action.o_tpid;
         balMemberInfo->action->has_i_vid = BAL_GRPC_PRES;
         balMemberInfo->action->i_vid = group_ind->data.members.val->action.i_vid;
         balMemberInfo->action->has_i_pbits = BAL_GRPC_PRES;
         balMemberInfo->action->i_pbits = group_ind->data.members.val->action.i_pbits;
         balMemberInfo->action->has_i_tpid = BAL_GRPC_PRES;
         balMemberInfo->action->i_tpid = group_ind->data.members.val->action.i_tpid;

         balQueue = malloc(sizeof(BalTmQueueRef));
         memset(balQueue, 0, sizeof(BalTmQueueRef));
         bal_tm_queue_ref__init(balQueue);
         balMemberInfo->queue = balQueue;

         balMemberInfo->queue->has_sched_id = BAL_GRPC_PRES;
         balMemberInfo->queue->sched_id = group_ind->data.members.val->queue.sched_id;
         balMemberInfo->queue->has_queue_id = BAL_GRPC_PRES;
         balMemberInfo->queue->queue_id = group_ind->data.members.val->queue.queue_id;

         balIndCfg->group_ind->data->members->val[i] = balMemberInfo;
      }


      BalIdList *balFlows;
      balFlows = malloc(sizeof(BalIdList));
      memset(balFlows, 0, sizeof(BalIdList));
      bal_id_list__init(balFlows);
      balIndCfg->group_ind->data->flows = balFlows;

      balIndCfg->group_ind->data->flows->n_val =  group_ind->data.flows.len;
      balIndCfg->group_ind->data->flows->val =
           (uint32_t *)malloc((balIndCfg->group_ind->data->flows->n_val)*sizeof(uint32_t));
      memcpy(balIndCfg->group_ind->data->flows->val, group_ind->data.flows.val,
             balIndCfg->group_ind->data->flows->n_val);

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_interface_osc_indication_cb                    *
 * Description : This function will handle the indications for      *
 *               Interface Operational State Change                 *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_interface_osc_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_INTERFACE != obj->obj_type ||
      bcmbal_interface_auto_id_oper_status_change != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_INTERFACE_OP_STATE;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_interface_oper_status_change *int_osc_ind =
                                 (bcmbal_interface_oper_status_change *)obj;

      BalInterfaceOperStatusChange *ifOsc;
      ifOsc = malloc(sizeof(BalInterfaceOperStatusChange));
      memset(ifOsc, 0, sizeof(BalInterfaceOperStatusChange));
      bal_interface_oper_status_change__init(ifOsc);
      balIndCfg->interface_op_state = ifOsc;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->interface_op_state->hdr = hdr;

      BalInterfaceKey *ifkey;
      ifkey = malloc(sizeof(BalInterfaceKey));
      memset(ifkey, 0, sizeof(BalInterfaceKey));
      bal_interface_key__init(ifkey);
      balIndCfg->interface_op_state->key = ifkey;

      balIndCfg->interface_op_state->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->interface_op_state->key->intf_id = int_osc_ind->key.intf_id;
      balIndCfg->interface_op_state->key->has_intf_type = BAL_GRPC_PRES;
      balIndCfg->interface_op_state->key->intf_type = int_osc_ind->key.intf_type;

      BalInterfaceOperStatusChangeData *ifOscIndData;
      ifOscIndData = malloc(sizeof(BalInterfaceOperStatusChangeData));
      memset(ifOscIndData, 0, sizeof(BalInterfaceOperStatusChangeData));
      bal_interface_oper_status_change_data__init(ifOscIndData);
      balIndCfg->interface_op_state->data = ifOscIndData;

      balIndCfg->interface_op_state->data->has_new_oper_status = BAL_GRPC_PRES;
      balIndCfg->interface_op_state->data->new_oper_status = int_osc_ind->data.new_oper_status;
      balIndCfg->interface_op_state->data->has_old_oper_status = BAL_GRPC_PRES;
      balIndCfg->interface_op_state->data->old_oper_status = int_osc_ind->data.old_oper_status;
      balIndCfg->interface_op_state->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->interface_op_state->data->admin_state = int_osc_ind->data.admin_state;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_interface_los_indication_cb                    *
 * Description : This function will handle the indications for      *
 *               Interface los Indication                           *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_interface_los_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_INTERFACE != obj->obj_type ||
      bcmbal_interface_auto_id_los != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_INTERFACE_LOS;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_interface_los *int_los_ind =
                                 (bcmbal_interface_los *)obj;

      BalInterfaceLos *ifLos;
      ifLos = malloc(sizeof(BalInterfaceLos));
      memset(ifLos, 0, sizeof(BalInterfaceLos));
      bal_interface_los__init(ifLos);
      balIndCfg->interface_los = ifLos;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->interface_los->hdr = hdr;

      BalInterfaceKey *ifkey;
      ifkey = malloc(sizeof(BalInterfaceKey));
      memset(ifkey, 0, sizeof(BalInterfaceKey));
      bal_interface_key__init(ifkey);
      balIndCfg->interface_los->key = ifkey;

      balIndCfg->interface_los->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->interface_los->key->intf_id = int_los_ind->key.intf_id;
      balIndCfg->interface_los->key->has_intf_type = BAL_GRPC_PRES;
      balIndCfg->interface_los->key->intf_type = int_los_ind->key.intf_type;

      BalInterfaceLosData *ifLosIndData;
      ifLosIndData = malloc(sizeof(BalInterfaceLosData));
      memset(ifLosIndData, 0, sizeof(BalInterfaceLosData));
      bal_interface_los_data__init(ifLosIndData);
      balIndCfg->interface_los->data = ifLosIndData;

      balIndCfg->interface_los->data->has_status = BAL_GRPC_PRES;
      balIndCfg->interface_los->data->status = int_los_ind->data.status;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_interface_indication_cb                        *
 * Description : This function will handle the indications for      *
 *               Interface Indication                           *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_interface_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_INTERFACE != obj->obj_type ||
      bcmbal_interface_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_INTERFACE_IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_interface_ind *interface_ind = (bcmbal_interface_ind *)obj;

      BalInterfaceInd *ifInd;
      ifInd = malloc(sizeof(BalInterfaceInd));
      memset(ifInd, 0, sizeof(BalInterfaceInd));
      bal_interface_ind__init(ifInd);
      balIndCfg->interface_ind = ifInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->interface_ind->hdr = hdr;

      BalInterfaceKey *ifkey;
      ifkey = malloc(sizeof(BalInterfaceKey));
      memset(ifkey, 0, sizeof(BalInterfaceKey));
      bal_interface_key__init(ifkey);
      balIndCfg->interface_ind->key = ifkey;

      balIndCfg->interface_ind->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->interface_ind->key->intf_id = interface_ind->key.intf_id;
      balIndCfg->interface_ind->key->has_intf_type = BAL_GRPC_PRES;
      balIndCfg->interface_ind->key->intf_type = interface_ind->key.intf_type;

      BalInterfaceIndData *ifIndData;
      ifIndData = malloc(sizeof(BalInterfaceIndData));
      memset(ifIndData, 0, sizeof(BalInterfaceIndData));
      bal_interface_ind_data__init(ifIndData);
      balIndCfg->interface_ind->data = ifIndData;

      balIndCfg->interface_ind->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->admin_state = interface_ind->data.admin_state;
      balIndCfg->interface_ind->data->has_oper_status = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->oper_status = interface_ind->data.oper_status;
      balIndCfg->interface_ind->data->has_min_data_agg_port_id = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->min_data_agg_port_id = interface_ind->data.min_data_agg_port_id;
      balIndCfg->interface_ind->data->has_min_data_svc_port_id = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->min_data_svc_port_id = interface_ind->data.min_data_svc_port_id;
      balIndCfg->interface_ind->data->has_transceiver_type = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->transceiver_type = interface_ind->data.transceiver_type;
      balIndCfg->interface_ind->data->has_ds_miss_mode = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->ds_miss_mode = interface_ind->data.ds_miss_mode;
      balIndCfg->interface_ind->data->has_mtu = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->mtu = interface_ind->data.mtu;
      balIndCfg->interface_ind->data->has_flow_control = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->flow_control = interface_ind->data.flow_control;
      balIndCfg->interface_ind->data->has_ds_tm = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->ds_tm = interface_ind->data.ds_tm;
      balIndCfg->interface_ind->data->has_us_tm = BAL_GRPC_PRES;
      balIndCfg->interface_ind->data->us_tm = interface_ind->data.us_tm;

      BalIdList *balFlows;
      balFlows = malloc(sizeof(BalIdList));
      memset(balFlows, 0, sizeof(BalIdList));
      bal_id_list__init(balFlows);
      balIndCfg->interface_ind->data->sub_term_id_list = balFlows;

      balIndCfg->interface_ind->data->sub_term_id_list->n_val =  interface_ind->data.sub_term_id_list.len;
      balIndCfg->interface_ind->data->sub_term_id_list->val =
           (uint32_t *)malloc((balIndCfg->interface_ind->data->sub_term_id_list->n_val)*sizeof(uint32_t));
      memcpy(balIndCfg->interface_ind->data->sub_term_id_list->val, interface_ind->data.sub_term_id_list.val,
             balIndCfg->interface_ind->data->sub_term_id_list->n_val);

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_sub_term_osc_indication_cb                     *
 * Description : This function will handle the indications for      *
 *               Subscriber term Operational State Change           *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_sub_term_osc_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL != obj->obj_type ||
      bcmbal_subscriber_terminal_auto_id_oper_status_change != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_TERMINAL_OP_STATE;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_subscriber_terminal_oper_status_change *sub_osc_ind =
                           (bcmbal_subscriber_terminal_oper_status_change *)obj;

      BalSubscriberTerminalOperStatusChange *subOscInd;
      subOscInd = malloc(sizeof(BalSubscriberTerminalOperStatusChange));
      memset(subOscInd, 0, sizeof(BalSubscriberTerminalOperStatusChange));
      bal_subscriber_terminal_oper_status_change__init(subOscInd);
      balIndCfg->terminal_op_state = subOscInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->terminal_op_state->hdr = hdr;

      BalSubscriberTerminalKey *subkey;
      subkey = malloc(sizeof(BalSubscriberTerminalKey));
      memset(subkey, 0, sizeof(BalSubscriberTerminalKey));
      bal_subscriber_terminal_key__init(subkey);
      balIndCfg->terminal_op_state->key = subkey;

      balIndCfg->terminal_op_state->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->terminal_op_state->key->intf_id = sub_osc_ind->key.intf_id;
      balIndCfg->terminal_op_state->key->has_sub_term_id = BAL_GRPC_PRES;
      balIndCfg->terminal_op_state->key->sub_term_id = sub_osc_ind->key.sub_term_id;

      BalSubscriberTerminalOperStatusChangeData *subOscIndData;
      subOscIndData = malloc(sizeof(BalSubscriberTerminalOperStatusChangeData));
      memset(subOscIndData, 0, sizeof(BalSubscriberTerminalOperStatusChangeData));
      bal_subscriber_terminal_oper_status_change_data__init(subOscIndData);
      balIndCfg->terminal_op_state->data = subOscIndData;

      balIndCfg->terminal_op_state->data->has_new_oper_status = BAL_GRPC_PRES;
      balIndCfg->terminal_op_state->data->new_oper_status =
                                           sub_osc_ind->data.new_oper_status;
      balIndCfg->terminal_op_state->data->has_old_oper_status = BAL_GRPC_PRES;
      balIndCfg->terminal_op_state->data->old_oper_status =
                                           sub_osc_ind->data.old_oper_status;
      balIndCfg->terminal_op_state->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->terminal_op_state->data->admin_state =
                                               sub_osc_ind->data.admin_state;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_sub_term_disc_indication_cb                    *
 * Description : This function will handle the indications for      *
 *               Subscriber term disc indication                    *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_sub_term_disc_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL != obj->obj_type ||
      bcmbal_subscriber_terminal_auto_id_sub_term_disc != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_TERMINAL_DISC;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_subscriber_terminal_sub_term_disc *sub_disc_ind =
                           (bcmbal_subscriber_terminal_sub_term_disc *)obj;

      BalSubscriberTerminalSubTermDisc *subDiscInd;
      subDiscInd = malloc(sizeof(BalSubscriberTerminalSubTermDisc));
      memset(subDiscInd, 0, sizeof(BalSubscriberTerminalSubTermDisc));
      bal_subscriber_terminal_sub_term_disc__init(subDiscInd);
      balIndCfg->terminal_disc = subDiscInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->terminal_disc->hdr = hdr;

      BalSubscriberTerminalKey *subkey;
      subkey = malloc(sizeof(BalSubscriberTerminalKey));
      memset(subkey, 0, sizeof(BalSubscriberTerminalKey));
      bal_subscriber_terminal_key__init(subkey);
      balIndCfg->terminal_disc->key = subkey;

      balIndCfg->terminal_disc->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->terminal_disc->key->intf_id = sub_disc_ind->key.intf_id;
      balIndCfg->terminal_disc->key->has_sub_term_id = BAL_GRPC_PRES;
      balIndCfg->terminal_disc->key->sub_term_id = sub_disc_ind->key.sub_term_id;

      BalSubscriberTerminalSubTermDiscData *subDiscIndData;
      subDiscIndData = malloc(sizeof(BalSubscriberTerminalSubTermDiscData));
      memset(subDiscIndData, 0, sizeof(BalSubscriberTerminalSubTermDiscData));
      bal_subscriber_terminal_sub_term_disc_data__init(subDiscIndData);
      balIndCfg->terminal_disc->data = subDiscIndData;

      BalSerialNumber *serial_number;
      serial_number = malloc(sizeof(BalSerialNumber));
      memset(serial_number, 0, sizeof(BalSerialNumber));
      bal_serial_number__init(serial_number);

      balIndCfg->terminal_disc->data->serial_number = serial_number;

      ASFVOLT_LOG(ASFVOLT_INFO, "Discovered ONU serial number "
                "%c%c%c%c%02X%02X%02X%02X",
                sub_disc_ind->data.serial_number.vendor_id[0],
                sub_disc_ind->data.serial_number.vendor_id[1],
                sub_disc_ind->data.serial_number.vendor_id[2],
                sub_disc_ind->data.serial_number.vendor_id[3],
                sub_disc_ind->data.serial_number.vendor_specific[0],
                sub_disc_ind->data.serial_number.vendor_specific[1],
                sub_disc_ind->data.serial_number.vendor_specific[2],
                sub_disc_ind->data.serial_number.vendor_specific[3]);

      //ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Discovery:Before decoding:Vendor id is %s", sub_disc_ind->data.serial_number.vendor_id);
      //ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Discovery:Before decoding:Vendor specific is %s", sub_disc_ind->data.serial_number.vendor_specific);

      char *vendor_id = malloc(sizeof(char)*MAX_CHAR_LENGTH);
      memset(vendor_id, 0, MAX_CHAR_LENGTH);
      sprintf(vendor_id,"%c%c%c%c",
		      sub_disc_ind->data.serial_number.vendor_id[0],
		      sub_disc_ind->data.serial_number.vendor_id[1],
		      sub_disc_ind->data.serial_number.vendor_id[2],
		      sub_disc_ind->data.serial_number.vendor_id[3]);
      balIndCfg->terminal_disc->data->serial_number->vendor_id = vendor_id;
      ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Discovery:After decoding:Vendor id is %s", balIndCfg->terminal_disc->data->serial_number->vendor_id);
      char *vendor_specific = malloc(sizeof(char)*MAX_CHAR_LENGTH);
      memset(vendor_specific, 0, MAX_CHAR_LENGTH);
      sprintf(vendor_specific,"%1X%1X%1X%1X%1X%1X%1X%1X",
		      sub_disc_ind->data.serial_number.vendor_specific[0]>>4 & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[0] & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[1]>>4 & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[1] & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[2]>>4 & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[2] & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[3]>>4 & 0x0f,
		      sub_disc_ind->data.serial_number.vendor_specific[3] & 0x0f);
      balIndCfg->terminal_disc->data->serial_number->vendor_specific = vendor_specific;
      ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Discovery:After decoding:Vendor specific is %s", balIndCfg->terminal_disc->data->serial_number->vendor_specific);

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_sub_term_alarm_indication_cb                   *
 * Description : This function will handle the indications for      *
 *               Subscriber term alarm indication                   *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_sub_term_alarm_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL != obj->obj_type ||
      bcmbal_subscriber_terminal_auto_id_sub_term_alarm != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API \'%s\' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      balIndCfg->u_case = BAL_INDICATIONS__U_TERMINAL_ALARM;
      bcmbal_subscriber_terminal_sub_term_alarm *sub_term_alarm  =
                           (bcmbal_subscriber_terminal_sub_term_alarm *)obj;

      BalSubscriberTerminalSubTermAlarm *subTermAlarm;
      subTermAlarm = malloc(sizeof(BalSubscriberTerminalSubTermAlarm));
      memset(subTermAlarm, 0, sizeof(BalSubscriberTerminalSubTermAlarm));
      bal_subscriber_terminal_sub_term_alarm__init(subTermAlarm);
      balIndCfg->terminal_alarm = subTermAlarm;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->terminal_alarm->hdr = hdr;

      BalSubscriberTerminalKey *subkey;
      subkey = malloc(sizeof(BalSubscriberTerminalKey));
      memset(subkey, 0, sizeof(BalSubscriberTerminalKey));
      bal_subscriber_terminal_key__init(subkey);
      balIndCfg->terminal_alarm->key = subkey;

      balIndCfg->terminal_alarm->key->has_sub_term_id = BAL_GRPC_PRES;
      balIndCfg->terminal_alarm->key->sub_term_id = sub_term_alarm->key.sub_term_id;
      balIndCfg->terminal_alarm->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->terminal_alarm->key->intf_id = sub_term_alarm->key.intf_id;

      BalsubscriberTerminalSubTermAlarmData *subTermAlarmData;
      subTermAlarmData = malloc(sizeof(BalsubscriberTerminalSubTermAlarmData));
      memset(subTermAlarmData, 0, sizeof(BalsubscriberTerminalSubTermAlarmData));
      balsubscriber_terminal_sub_term_alarm_data__init(subTermAlarmData);
      balIndCfg->terminal_alarm->data = subTermAlarmData;

      BalSubscriberTerminalAlarms *balSubAlarms;
      balSubAlarms = malloc(sizeof(BalSubscriberTerminalAlarms));
      memset(balSubAlarms, 0, sizeof(BalSubscriberTerminalAlarms));
      bal_subscriber_terminal_alarms__init(balSubAlarms);
      balIndCfg->terminal_alarm->data->alarm = balSubAlarms;

      balIndCfg->terminal_alarm->data->alarm->has_los = BAL_GRPC_PRES;
      balIndCfg->terminal_alarm->data->alarm->los = sub_term_alarm->data.alarm.los;
      balIndCfg->terminal_alarm->data->alarm->has_lob = BAL_GRPC_PRES;
      balIndCfg->terminal_alarm->data->alarm->lob = sub_term_alarm->data.alarm.lob;
      balIndCfg->terminal_alarm->data->alarm->has_lopc_miss = BAL_GRPC_PRES;
      balIndCfg->terminal_alarm->data->alarm->lopc_miss = sub_term_alarm->data.alarm.lopc_miss;
      balIndCfg->terminal_alarm->data->alarm->has_lopc_mic_error = BAL_GRPC_PRES;
      balIndCfg->terminal_alarm->data->alarm->lopc_mic_error = sub_term_alarm->data.alarm.lopc_mic_error;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_sub_term_dgi_indication_cb                     *
 * Description : This function will handle the indications for      *
 *               Subscriber term dgi indication                     *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_sub_term_dgi_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL != obj->obj_type ||
      bcmbal_subscriber_terminal_auto_id_dgi != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_TERMINAL_DGI;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_subscriber_terminal_dgi *sub_dgi_ind =
                           (bcmbal_subscriber_terminal_dgi *)obj;

      BalSubscriberTerminalDgi *subDgiInd;
      subDgiInd = malloc(sizeof(BalSubscriberTerminalDgi));
      memset(subDgiInd, 0, sizeof(BalSubscriberTerminalDgi));
      bal_subscriber_terminal_dgi__init(subDgiInd);
      balIndCfg->terminal_dgi= subDgiInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->terminal_dgi->hdr = hdr;

      BalSubscriberTerminalKey *subkey;
      subkey = malloc(sizeof(BalSubscriberTerminalKey));
      memset(subkey, 0, sizeof(BalSubscriberTerminalKey));
      bal_subscriber_terminal_key__init(subkey);
      balIndCfg->terminal_dgi->key = subkey;

      balIndCfg->terminal_dgi->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->terminal_dgi->key->intf_id = sub_dgi_ind->key.intf_id;
      balIndCfg->terminal_dgi->key->has_sub_term_id = BAL_GRPC_PRES;
      balIndCfg->terminal_dgi->key->sub_term_id = sub_dgi_ind->key.sub_term_id;

      BalSubscriberTerminalDgiData *subDgiIndData;
      subDgiIndData = malloc(sizeof(BalSubscriberTerminalDgiData));
      memset(subDgiIndData, 0, sizeof(BalSubscriberTerminalDgiData));
      bal_subscriber_terminal_dgi_data__init(subDgiIndData);
      balIndCfg->terminal_dgi->data = subDgiIndData;

      balIndCfg->terminal_dgi->data->has_dgi_status = BAL_GRPC_PRES;
      balIndCfg->terminal_dgi->data->dgi_status = sub_dgi_ind->data.dgi_status;

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_sub_term_indication_cb                         *
 * Description : This function will handle the indications for      *
 *               Subscriber term indication                         *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_sub_term_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL != obj->obj_type ||
      bcmbal_subscriber_terminal_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_TERMINAL_IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_subscriber_terminal_ind *sub_ind = (bcmbal_subscriber_terminal_ind *)obj;

      BalSubscriberTerminalInd *subInd;
      subInd = malloc(sizeof(BalSubscriberTerminalInd));
      memset(subInd, 0, sizeof(BalSubscriberTerminalInd));
      bal_subscriber_terminal_ind__init(subInd);
      balIndCfg->terminal_ind = subInd;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->terminal_ind->hdr = hdr;

      BalSubscriberTerminalKey *subkey;
      subkey = malloc(sizeof(BalSubscriberTerminalKey));
      memset(subkey, 0, sizeof(BalSubscriberTerminalKey));
      bal_subscriber_terminal_key__init(subkey);
      balIndCfg->terminal_ind->key = subkey;

      balIndCfg->terminal_ind->key->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->key->intf_id = sub_ind->key.intf_id;
      balIndCfg->terminal_ind->key->has_sub_term_id = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->key->sub_term_id = sub_ind->key.sub_term_id;

      BalSubscriberTerminalIndData *subIndData;
      subIndData = malloc(sizeof(BalSubscriberTerminalIndData));
      memset(subIndData, 0, sizeof(BalSubscriberTerminalIndData));
      bal_subscriber_terminal_ind_data__init(subIndData);
      balIndCfg->terminal_ind->data = subIndData;

      balIndCfg->terminal_ind->data->has_admin_state = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->admin_state = sub_ind->data.admin_state;
      balIndCfg->terminal_ind->data->has_oper_status = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->oper_status = sub_ind->data.oper_status;
      balIndCfg->terminal_ind->data->has_svc_port_id = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->svc_port_id = sub_ind->data.svc_port_id;
      balIndCfg->terminal_ind->data->has_ds_tm = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->ds_tm = sub_ind->data.ds_tm;
      balIndCfg->terminal_ind->data->has_us_tm = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->us_tm = sub_ind->data.us_tm;
      balIndCfg->terminal_ind->data->has_sub_term_rate = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->sub_term_rate = sub_ind->data.sub_term_rate;
      char *password = malloc(sizeof(char)*MAX_CHAR_LENGTH*2);
      memset(password, 0, MAX_CHAR_LENGTH*2);
      strcpy(password,(const char *)sub_ind->data.password.arr);
      balIndCfg->terminal_ind->data->password = password;
      char *registration_id = malloc(sizeof(char)*MAX_CHAR_LENGTH*8);
      memset(registration_id, 0, MAX_CHAR_LENGTH*8);
      strcpy(registration_id,(const char *)sub_ind->data.registration_id.arr);
      balIndCfg->terminal_ind->data->registration_id =  registration_id;

#if 0
      balIndCfg->terminal_ind->data->has_mac_address = BAL_GRPC_PRES;
      balIndCfg->terminal_ind->data->mac_address.len =
                            (BCMOS_ETH_ALEN)*sizeof(sub_ind->data.mac_address.u8);
      uint8_t mac_address[balIndCfg->terminal_ind->data->mac_address.len];
      memset(&mac_address, 0 ,balIndCfg->terminal_ind->data->mac_address.len);
      strcpy((char *)mac_address,(const char *)sub_ind->data.mac_address.u8);
      balIndCfg->terminal_ind->data->mac_address.data = mac_address;
#endif

      BalSerialNumber *serialNum;
      serialNum = malloc(sizeof(BalSerialNumber));
      memset(serialNum, 0, sizeof(BalSerialNumber));
      bal_serial_number__init(serialNum);
      balIndCfg->terminal_ind->data->serial_number = serialNum;

      //ASFVOLT_LOG(ASFVOLT_ERROR, "ONU Activation:Before decoding:Vendor id is %s", sub_ind->data.serial_number.vendor_id);
      //ASFVOLT_LOG(ASFVOLT_ERROR, "ONU Activation:Before decoding:Vendor specific is %s", sub_ind->data.serial_number.vendor_specific);

      char *vendor_id = malloc(sizeof(char)*MAX_CHAR_LENGTH);
      memset(vendor_id, 0, MAX_CHAR_LENGTH);
      sprintf(vendor_id,"%c%c%c%c",
		      sub_ind->data.serial_number.vendor_id[0],
		      sub_ind->data.serial_number.vendor_id[1],
		      sub_ind->data.serial_number.vendor_id[2],
		      sub_ind->data.serial_number.vendor_id[3]);
      balIndCfg->terminal_ind->data->serial_number->vendor_id = vendor_id;
      ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Activation:After decoding:Vendor id is %s",
                  balIndCfg->terminal_ind->data->serial_number->vendor_id);
      char *vendor_specific = malloc(sizeof(char)*MAX_CHAR_LENGTH);
      memset(vendor_specific, 0, MAX_CHAR_LENGTH);
      sprintf(vendor_specific,"%1X%1X%1X%1X%1X%1X%1X%1X",
		      sub_ind->data.serial_number.vendor_specific[0]>>4 & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[0] & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[1]>>4 & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[1] & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[2]>>4 & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[2] & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[3]>>4 & 0x0f,
		      sub_ind->data.serial_number.vendor_specific[3] & 0x0f);
      balIndCfg->terminal_ind->data->serial_number->vendor_specific = vendor_specific;
      ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Activation:After decoding:Vendor specific is %s",
                  balIndCfg->terminal_ind->data->serial_number->vendor_specific);
      ASFVOLT_LOG(ASFVOLT_DEBUG, "ONU Activation:After decoding:Registration ID is %s",
                  balIndCfg->terminal_ind->data->registration_id);

      BalIdList *balAggportList;
      balAggportList = malloc(sizeof(BalIdList));
      memset(balAggportList, 0, sizeof(BalIdList));
      bal_id_list__init(balAggportList);
      balIndCfg->terminal_ind->data->agg_port_id_list = balAggportList;

#if 0
      balIndCfg->terminal_ind->data->agg_port_id_list->n_val =  sub_ind->data.agg_port_id_list.len;
      uint32_t agg_port_id_list[balIndCfg->terminal_ind->data->agg_port_id_list->n_val];
      memset(&agg_port_id_list, 0, balIndCfg->terminal_ind->data->agg_port_id_list->n_val);
      strcpy((char *)agg_port_id_list,(const char *)sub_ind->data.agg_port_id_list.val);
      balIndCfg->terminal_ind->data->agg_port_id_list->val = agg_port_id_list;
#endif

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : fill_bal_tm_red                                    *
 * Description : This function will fill grpc-BalTmred struture     *
 *               from bal-bcmbal_tm_red structure                   *
 *                                                                  *
 ********************************************************************/
void fill_bal_tm_red(BalTmred *grpc_red, bcmbal_tm_red *bal_red)
{
   grpc_red->has_min_threshold = BAL_GRPC_PRES;
   grpc_red->min_threshold = bal_red->min_threshold;
   grpc_red->has_max_threshold = BAL_GRPC_PRES;
   grpc_red->max_threshold = bal_red->max_threshold;
   grpc_red->has_max_probability = BAL_GRPC_PRES;
   grpc_red->max_probability = bal_red->max_probability;
   return;
}

/********************************************************************\
 * Function    : bal_tm_queue_indication_cb                         *
 * Description : This function will handle the indications for      *
 *               TM Queue indication                                *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_tm_queue_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_TM_QUEUE != obj->obj_type ||
      bcmbal_tm_queue_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_TM_QUEUE__IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_tm_queue_ind *tm_que_ind = (bcmbal_tm_queue_ind *)obj;

      BalTmQueueInd *tmQueInd;
      tmQueInd = malloc(sizeof(BalTmQueueInd));
      memset(tmQueInd, 0, sizeof(BalTmQueueInd));
      bal_tm_queue_ind__init(tmQueInd);
      balIndCfg->tm_queue_ind = tmQueInd;

      BalTmQueueKey *tmQkey;
      tmQkey = malloc(sizeof(BalTmQueueKey));
      memset(tmQkey, 0, sizeof(BalTmQueueKey));
      bal_tm_queue_key__init(tmQkey);
      balIndCfg->tm_queue_ind->key = tmQkey;

      balIndCfg->tm_queue_ind->key->has_sched_id = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->key->sched_id = tm_que_ind->key.sched_id;
      balIndCfg->tm_queue_ind->key->has_sched_dir = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->key->sched_dir = tm_que_ind->key.sched_dir;
      balIndCfg->tm_queue_ind->key->has_id = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->key->id = tm_que_ind->key.id;

      BalTmQueueIndData *tmQIndData;
      tmQIndData = malloc(sizeof(BalTmQueueIndData));
      memset(tmQIndData, 0, sizeof(BalTmQueueIndData));
      bal_tm_queue_ind_data__init(tmQIndData);
      balIndCfg->tm_queue_ind->data = tmQIndData;

      balIndCfg->tm_queue_ind->data->has_priority = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->priority = tm_que_ind->data.priority;
      balIndCfg->tm_queue_ind->data->has_weight = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->weight = tm_que_ind->data.weight;
      balIndCfg->tm_queue_ind->data->has_create_mode = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->create_mode = tm_que_ind->data.create_mode;
      balIndCfg->tm_queue_ind->data->has_ref_count = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->ref_count = tm_que_ind->data.ref_count;

      BalTmShaping *balShape;
      balShape = malloc(sizeof(BalTmShaping));
      memset(balShape, 0, sizeof(BalTmShaping));
      bal_tm_shaping__init(balShape);
      balIndCfg->tm_queue_ind->data->rate = balShape;

      balIndCfg->tm_queue_ind->data->rate->has_presence_mask = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->rate->presence_mask = tm_que_ind->data.rate.presence_mask;
      balIndCfg->tm_queue_ind->data->rate->has_cir = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->rate->cir = tm_que_ind->data.rate.cir;
      balIndCfg->tm_queue_ind->data->rate->has_pir = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->rate->pir = tm_que_ind->data.rate.pir;
      balIndCfg->tm_queue_ind->data->rate->has_burst = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->rate->burst = tm_que_ind->data.rate.burst;

      BalTmBac *balBac;
      balBac = malloc(sizeof(BalTmBac));
      memset(balBac, 0, sizeof(BalTmBac));
      bal_tm_bac__init(balBac);
      balIndCfg->tm_queue_ind->data->bac = balBac;

      balIndCfg->tm_queue_ind->data->bac->has_type = BAL_GRPC_PRES;
      balIndCfg->tm_queue_ind->data->bac->type = tm_que_ind->data.bac.type;
      switch(tm_que_ind->data.bac.type)
      {
         case BCMBAL_TM_BAC_TYPE_TAILDROP:
         {
            balIndCfg->tm_queue_ind->data->bac->u_case = BAL_TM_BAC__U_TAILDROP;
            BalTMBacTaildrop *balTaildrop;
            balTaildrop = malloc(sizeof(BalTMBacTaildrop));
            memset(balTaildrop, 0, sizeof(BalTMBacTaildrop));
            bal_tmbac_taildrop__init(balTaildrop);
            balIndCfg->tm_queue_ind->data->bac->taildrop = balTaildrop;

            balIndCfg->tm_queue_ind->data->bac->taildrop->has_max_size = BAL_GRPC_PRES;
            balIndCfg->tm_queue_ind->data->bac->taildrop->max_size =
                                               tm_que_ind->data.bac.u.taildrop.max_size;
         }
         break;
         case BCMBAL_TM_BAC_TYPE_WTAILDROP:
         {
           /* No bal/grpc structure was defined */
         }
         break;
         case BCMBAL_TM_BAC_TYPE_RED:
         {
            balIndCfg->tm_queue_ind->data->bac->u_case = BAL_TM_BAC__U_RED;
            BalTMBacRed *balBacRed;
            balBacRed = malloc(sizeof(BalTMBacRed));
            memset(balBacRed, 0, sizeof(BalTMBacRed));
            bal_tmbac_red__init(balBacRed);
            balIndCfg->tm_queue_ind->data->bac->red = balBacRed;

            BalTmred *balRed;
            balRed = malloc(sizeof(BalTmred));
            memset(balRed, 0, sizeof(BalTmred));
            bal_tmred__init(balRed);
            balIndCfg->tm_queue_ind->data->bac->red->red = balRed;
            fill_bal_tm_red(balIndCfg->tm_queue_ind->data->bac->red->red, &tm_que_ind->data.bac.u.red.red);
         }
         break;
         case BCMBAL_TM_BAC_TYPE_WRED:
         {
            balIndCfg->tm_queue_ind->data->bac->u_case = BAL_TM_BAC__U_WRED;
            BalTMBacWred *balBacWred;
            balBacWred = malloc(sizeof(BalTMBacWred));
            memset(balBacWred, 0, sizeof(BalTMBacWred));
            bal_tmbac_wred__init(balBacWred);
            balIndCfg->tm_queue_ind->data->bac->wred = balBacWred;

            BalTmred *balGreen;
            balGreen = malloc(sizeof(BalTmred));
            memset(balGreen, 0, sizeof(BalTmred));
            bal_tmred__init(balGreen);
            balIndCfg->tm_queue_ind->data->bac->wred->green = balGreen;
            fill_bal_tm_red(balIndCfg->tm_queue_ind->data->bac->wred->green, &tm_que_ind->data.bac.u.wred.green);

            BalTmred *balYellow;
            balYellow = malloc(sizeof(BalTmred));
            memset(balYellow, 0, sizeof(BalTmred));
            bal_tmred__init(balYellow);
            balIndCfg->tm_queue_ind->data->bac->wred->yellow = balYellow;
            fill_bal_tm_red(balIndCfg->tm_queue_ind->data->bac->wred->yellow, &tm_que_ind->data.bac.u.wred.yellow);

            BalTmred *balRed;
            balRed = malloc(sizeof(BalTmred));
            memset(balRed, 0, sizeof(BalTmred));
            bal_tmred__init(balRed);
            balIndCfg->tm_queue_ind->data->bac->wred->red = balRed;
            fill_bal_tm_red(balIndCfg->tm_queue_ind->data->bac->wred->red, &tm_que_ind->data.bac.u.wred.red);
         }
         break;
         default:
         {
            balIndCfg->tm_queue_ind->data->bac->u_case = BAL_TM_BAC__U__NOT_SET;
         }
         break;

      }

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_tm_sched_indication_cb                         *
 * Description : This function will handle the indications for      *
 *               TM Sched indication                                *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_tm_sched_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_TM_SCHED != obj->obj_type ||
      bcmbal_tm_sched_auto_id_ind != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_TM_SCHED__IND;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      bcmbal_tm_sched_ind *tm_sched_ind = (bcmbal_tm_sched_ind *)obj;

      BalTmSchedInd *tmSchedInd;
      tmSchedInd = malloc(sizeof(BalTmSchedInd));
      memset(tmSchedInd, 0, sizeof(BalTmSchedInd));
      bal_tm_sched_ind__init(tmSchedInd);
      balIndCfg->tm_sched_ind = tmSchedInd;

      BalTmSchedKey *tmSchedkey;
      tmSchedkey = malloc(sizeof(BalTmSchedKey));
      memset(tmSchedkey, 0, sizeof(BalTmSchedKey));
      bal_tm_sched_key__init(tmSchedkey);
      balIndCfg->tm_sched_ind->key = tmSchedkey;

      balIndCfg->tm_sched_ind->key->has_dir = BAL_GRPC_PRES;
      balIndCfg->tm_sched_ind->key->dir = tm_sched_ind->key.dir;
      balIndCfg->tm_sched_ind->key->has_id = BAL_GRPC_PRES;
      balIndCfg->tm_sched_ind->key->id = tm_sched_ind->key.id;

      BalTmSchedIndData *tmSIndData;
      tmSIndData = malloc(sizeof(BalTmSchedIndData));
      memset(tmSIndData, 0, sizeof(BalTmSchedIndData));
      bal_tm_sched_ind_data__init(tmSIndData);
      balIndCfg->tm_sched_ind->data = tmSIndData;
      /* TODO: data should be populate */

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_packet_data_indication_cb                      *
 * Description : This function will handle the indications for      *
 *               Packet Data indication                             *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_packet_data_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_PACKET != obj->obj_type ||
      bcmbal_packet_auto_id_bearer_channel_rx != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      /*bcmos_mutex_lock(&bal_ind_lock);-- Need to define bcm independent mutex*/

      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_PKT_DATA;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      BalPacketBearerChannelRx *rxChannel;
      rxChannel = malloc(sizeof(BalPacketBearerChannelRx));
      memset(rxChannel, 0, sizeof(BalPacketBearerChannelRx));
      bal_packet_bearer_channel_rx__init(rxChannel);
      balIndCfg->pktdata = rxChannel;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->pktdata->hdr = hdr;

      BalPacketKey *packetkey;
      packetkey = malloc(sizeof(BalPacketKey));
      memset(packetkey, 0, sizeof(BalPacketKey));
      bal_packet_key__init(packetkey);
      balIndCfg->pktdata->key = packetkey;

      bcmbal_packet_bearer_channel_rx *rx_channel =
                                  (bcmbal_packet_bearer_channel_rx *)obj;

      balIndCfg->pktdata->key->has_reserved = BAL_GRPC_PRES;
      balIndCfg->pktdata->key->reserved = rx_channel->key.reserved;

      BalDest *PktSndDest;
      PktSndDest = malloc(sizeof(BalDest));
      memset(PktSndDest, 0, sizeof(BalDest));
      bal_dest__init(PktSndDest);
      balIndCfg->pktdata->key->packet_send_dest = PktSndDest;

      balIndCfg->pktdata->key->packet_send_dest->has_type = BAL_GRPC_PRES;
      balIndCfg->pktdata->key->packet_send_dest->type =
                                          rx_channel->key.packet_send_dest.type;
      switch( rx_channel->key.packet_send_dest.type)
      {
         case BCMBAL_DEST_TYPE_NNI:
         {
            balIndCfg->pktdata->key->packet_send_dest->u_case = BAL_DEST__U_NNI;
            BalDestNni *balNni;
            balNni = malloc(sizeof(BalDestNni));
            memset(balNni, 0, sizeof(BalDestNni));
            bal_dest_nni__init(balNni);
            balIndCfg->pktdata->key->packet_send_dest->nni = balNni;
            balIndCfg->pktdata->key->packet_send_dest->nni->has_intf_id = BAL_GRPC_PRES;
            balIndCfg->pktdata->key->packet_send_dest->nni->intf_id =
                                          rx_channel->key.packet_send_dest.u.nni.intf_id;
         }
         break;
         case BCMBAL_DEST_TYPE_SUB_TERM:
         {
            balIndCfg->pktdata->key->packet_send_dest->u_case = BAL_DEST__U_SUB_TERM;
            BalDestSubTerm *balSubTerm;
            balSubTerm = malloc(sizeof(BalDestSubTerm));
            memset(balSubTerm, 0, sizeof(BalDestSubTerm));
            bal_dest_sub_term__init(balSubTerm);
            balIndCfg->pktdata->key->packet_send_dest->sub_term = balSubTerm;
            balIndCfg->pktdata->key->packet_send_dest->sub_term->has_sub_term_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->pktdata->key->packet_send_dest->sub_term->sub_term_id =
                                 rx_channel->key.packet_send_dest.u.sub_term.sub_term_id;
            balIndCfg->pktdata->key->packet_send_dest->sub_term->has_sub_term_uni =
                                                                            BAL_GRPC_PRES;
            balIndCfg->pktdata->key->packet_send_dest->sub_term->sub_term_uni =
                                rx_channel->key.packet_send_dest.u.sub_term.sub_term_uni;
            balIndCfg->pktdata->key->packet_send_dest->sub_term->has_intf_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->pktdata->key->packet_send_dest->sub_term->intf_id =
                                      rx_channel->key.packet_send_dest.u.sub_term.intf_id;
         }
         break;
         case BCMBAL_DEST_TYPE_SVC_PORT:
         {
            balIndCfg->pktdata->key->packet_send_dest->u_case = BAL_DEST__U_SVC_PORT;
            BalDestSvcPort *balSvcPort;
            balSvcPort = malloc(sizeof(BalDestSvcPort));
            memset(balSvcPort, 0, sizeof(BalDestSvcPort));
            bal_dest_svc_port__init(balSvcPort);
            balIndCfg->pktdata->key->packet_send_dest->svc_port = balSvcPort;
            balIndCfg->pktdata->key->packet_send_dest->svc_port->has_svc_port_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->pktdata->key->packet_send_dest->svc_port->svc_port_id =
                                 rx_channel->key.packet_send_dest.u.svc_port.svc_port_id;
            balIndCfg->pktdata->key->packet_send_dest->svc_port->has_intf_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->pktdata->key->packet_send_dest->svc_port->has_intf_id =
                                      rx_channel->key.packet_send_dest.u.svc_port.intf_id;
         }
         break;
         default:
         {
            balIndCfg->pktdata->key->packet_send_dest->u_case = BAL_DEST__U__NOT_SET;
         }
         break;
      }

      BalPacketBearerChannelRxData *pkdData;
      pkdData = malloc(sizeof(BalPacketBearerChannelRxData));
      memset(pkdData, 0, sizeof(BalPacketBearerChannelRxData));
      bal_packet_bearer_channel_rx_data__init(pkdData);
      balIndCfg->pktdata->data = pkdData;

      balIndCfg->pktdata->data->has_flow_id = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->flow_id = rx_channel->data.flow_id;
      balIndCfg->pktdata->data->has_flow_type = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->flow_type = rx_channel->data.flow_type;
      balIndCfg->pktdata->data->has_intf_id = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->intf_id = rx_channel->data.intf_id;
      balIndCfg->pktdata->data->has_intf_type = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->intf_type = rx_channel->data.intf_type;
      balIndCfg->pktdata->data->has_svc_port = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->svc_port = rx_channel->data.svc_port;
      balIndCfg->pktdata->data->has_flow_cookie = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->flow_cookie = rx_channel->data.flow_cookie;
      balIndCfg->pktdata->data->has_pkt = BAL_GRPC_PRES;
      balIndCfg->pktdata->data->pkt.len = rx_channel->data.pkt.len;
      balIndCfg->pktdata->data->pkt.data = (uint8_t *)malloc((balIndCfg->pktdata->data->pkt.len)*sizeof(uint8_t));
      memcpy(balIndCfg->pktdata->data->pkt.data,  rx_channel->data.pkt.val, balIndCfg->pktdata->data->pkt.len);

      /*bcmos_mutex_unlock(&bal_ind_lock);-- Need to define bcm independent mutex*/

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_omci_data_indication_cb                        *
 * Description : This function will handle the indications for      *
 *               OMCI Data Response                                 *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_omci_data_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_PACKET != obj->obj_type ||
      bcmbal_packet_auto_id_itu_omci_channel_rx != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "Received OMCI response via BAL APIs");
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_BAL_OMCI_RESP;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      BalPacketItuOmciChannelRx *omciChannel;
      omciChannel = malloc(sizeof(BalPacketItuOmciChannelRx));
      memset(omciChannel, 0, sizeof(BalPacketItuOmciChannelRx));
      bal_packet_itu_omci_channel_rx__init(omciChannel);
      balIndCfg->balomciresp = omciChannel;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->balomciresp->hdr = hdr;

      BalPacketKey *packetkey;
      packetkey = malloc(sizeof(BalPacketKey));
      memset(packetkey, 0, sizeof(BalPacketKey));
      bal_packet_key__init(packetkey);
      balIndCfg->balomciresp->key = packetkey;

      BalPacketItuOmciChannelRxData *omciData;
      omciData = malloc(sizeof(BalPacketItuOmciChannelRxData));
      memset(omciData, 0, sizeof(BalPacketItuOmciChannelRxData));
      bal_packet_itu_omci_channel_rx_data__init(omciData);
      balIndCfg->balomciresp->data = omciData;

      bcmbal_packet_itu_omci_channel_rx *omci_channel =
                                  (bcmbal_packet_itu_omci_channel_rx *)obj;

      balIndCfg->balomciresp->data->has_pkt =  BAL_GRPC_PRES;
      balIndCfg->balomciresp->data->pkt.len =  omci_channel->data.pkt.len;
      balIndCfg->balomciresp->data->pkt.data = (uint8_t *)malloc((omci_channel->data.pkt.len)*sizeof(uint8_t));
      memcpy(balIndCfg->balomciresp->data->pkt.data, omci_channel->data.pkt.val,
             balIndCfg->balomciresp->data->pkt.len);

      balIndCfg->balomciresp->key->has_reserved = BAL_GRPC_PRES;
      balIndCfg->balomciresp->key->reserved = omci_channel->key.reserved;

      BalDest *PktSndDest;
      PktSndDest = malloc(sizeof(BalDest));
      memset(PktSndDest, 0, sizeof(BalDest));
      bal_dest__init(PktSndDest);
      balIndCfg->balomciresp->key->packet_send_dest = PktSndDest;

      balIndCfg->balomciresp->key->packet_send_dest->has_type = BAL_GRPC_PRES;
      balIndCfg->balomciresp->key->packet_send_dest->type =
                                          omci_channel->key.packet_send_dest.type;
      switch( omci_channel->key.packet_send_dest.type)
      {
         case BCMBAL_DEST_TYPE_ITU_OMCI_CHANNEL:
         {
            balIndCfg->balomciresp->key->packet_send_dest->u_case = BAL_DEST__U_ITU_OMCI_CHANNEL;
            BalItuOmciChannel *balOmci;
            balOmci = malloc(sizeof(BalItuOmciChannel));
            memset(balOmci, 0, sizeof(BalItuOmciChannel));
            bal_itu_omci_channel__init(balOmci);
            balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel = balOmci;
            balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel->has_sub_term_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel->sub_term_id =
                            omci_channel->key.packet_send_dest.u.itu_omci_channel.sub_term_id;
            balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel->has_intf_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel->intf_id =
                                 omci_channel->key.packet_send_dest.u.itu_omci_channel.intf_id;
            ASFVOLT_LOG(ASFVOLT_DEBUG, "OMCI Response for ONU id %d",
                 balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel->sub_term_id);
         }
         break;
         default:
         {
            balIndCfg->balomciresp->key->packet_send_dest->u_case = BAL_DEST__U__NOT_SET;
         }
         break;
      }

      ASFVOLT_HEX2LOG(ASFVOLT_DEBUG, "OMCI Response with %zd bytes is ",
         balIndCfg->balomciresp->data->pkt.data, balIndCfg->balomciresp->data->pkt.len);

      ASFVOLT_LOG(ASFVOLT_DEBUG, "OMCI Response for ONU id %d",
		      balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel->sub_term_id);

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}

/********************************************************************\
 * Function    : bal_oam_data_indication_cb                         *
 * Description : This function will handle the indications for      *
 *               OAM Data Response                                 *
 *                                                                  *
 ********************************************************************/
bcmos_errno bal_oam_data_indication_cb(bcmbal_obj *obj)
{
   bcmos_errno result = BCM_ERR_OK;

   if(BCMBAL_OBJ_ID_PACKET != obj->obj_type ||
      bcmbal_packet_auto_id_ieee_oam_channel_rx != obj->subgroup)
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Processing BAL API '%s' IND callback (status is %s)",
				  bcmbal_objtype_str(obj->obj_type), bcmos_strerror(obj->status));
      result = BCM_ERR_INTERNAL;
   }
   else
   {
      BalIndications *balIndCfg;
      balIndCfg = malloc(sizeof(BalIndications));
      memset(balIndCfg, 0, sizeof(BalIndications));
      bal_indications__init(balIndCfg);
      balIndCfg->u_case = BAL_INDICATIONS__U_BAL_OAM_RESP;
      balIndCfg->has_objtype = BAL_GRPC_PRES;
      balIndCfg->objtype = obj->obj_type;
      balIndCfg->has_sub_group = BAL_GRPC_PRES;
      balIndCfg->sub_group = obj->subgroup;
      balIndCfg->device_id = voltha_device_id;

      BalPacketIeeeOamChannelRx *oamChannel;
      oamChannel = malloc(sizeof(BalPacketIeeeOamChannelRx));
      memset(oamChannel, 0, sizeof(BalPacketIeeeOamChannelRx));
      bal_packet_ieee_oam_channel_rx__init(oamChannel);
      balIndCfg->baloamresp = oamChannel;

      BalObj *hdr;
      hdr = malloc(sizeof(BalObj));
      memset(hdr, 0, sizeof(BalObj));
      bal_obj__init(hdr);
      balIndCfg->baloamresp->hdr = hdr;

      BalPacketKey *packetkey;
      packetkey = malloc(sizeof(BalPacketKey));
      memset(packetkey, 0, sizeof(BalPacketKey));
      bal_packet_key__init(packetkey);
      balIndCfg->baloamresp->key = packetkey;

      bcmbal_packet_ieee_oam_channel_rx *oam_channel =
                                  (bcmbal_packet_ieee_oam_channel_rx *)obj;

      balIndCfg->baloamresp->key->has_reserved = BAL_GRPC_PRES;
      balIndCfg->baloamresp->key->reserved = oam_channel->key.reserved;

      BalDest *PktSndDest;
      PktSndDest = malloc(sizeof(BalDest));
      memset(PktSndDest, 0, sizeof(BalDest));
      bal_dest__init(PktSndDest);
      balIndCfg->baloamresp->key->packet_send_dest = PktSndDest;

      balIndCfg->baloamresp->key->packet_send_dest->has_type = BAL_GRPC_PRES;
      balIndCfg->baloamresp->key->packet_send_dest->type =
                                          oam_channel->key.packet_send_dest.type;
      switch( oam_channel->key.packet_send_dest.type)
      {
         case BCMBAL_DEST_TYPE_IEEE_OAM_CHANNEL:
         {
            balIndCfg->baloamresp->key->packet_send_dest->u_case = BAL_DEST__U_IEEE_OAM_CHANNEL;
            BalIeeeOamChannel *balOam;
            balOam = malloc(sizeof(BalIeeeOamChannel));
            memset(balOam, 0, sizeof(BalIeeeOamChannel));
            bal_ieee_oam_channel__init(balOam);
            balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel = balOam;
            balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->has_intf_id =
                                                                            BAL_GRPC_PRES;
            balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->intf_id =
                                 oam_channel->key.packet_send_dest.u.ieee_oam_channel.intf_id;
            balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->has_mac_address = BAL_GRPC_PRES;
            balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->mac_address.len =
               (BCMOS_ETH_ALEN)*sizeof(oam_channel->key.packet_send_dest.u.ieee_oam_channel.mac_address.u8);
            balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->mac_address.data =
             (uint8_t *)malloc((balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->mac_address.len)*sizeof(uint8_t));
            memcpy(balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->mac_address.data,
                   oam_channel->key.packet_send_dest.u.ieee_oam_channel.mac_address.u8,
                   balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel->mac_address.len);

         }
         break;
         default:
         {
            balIndCfg->baloamresp->key->packet_send_dest->u_case = BAL_DEST__U__NOT_SET;
         }
         break;
      }

      BalPacketIeeeOamChannelRxData *oamData;
      oamData = malloc(sizeof(BalPacketIeeeOamChannelRxData));
      memset(oamData, 0, sizeof(BalPacketIeeeOamChannelRxData));
      bal_packet_ieee_oam_channel_rx_data__init(oamData);
      balIndCfg->baloamresp->data = oamData;

      balIndCfg->baloamresp->data->pkt.len =  oam_channel->data.pkt.len;
      balIndCfg->baloamresp->data->pkt.data = (uint8_t *)malloc((balIndCfg->baloamresp->data->pkt.len)*sizeof(uint8_t));
      memcpy(balIndCfg->baloamresp->data->pkt.data, oam_channel->data.pkt.val,
             balIndCfg->baloamresp->data->pkt.len);

      list_node *bal_indication_node = malloc(sizeof(list_node));
      bal_indication_node->bal_indication = balIndCfg;

      pthread_mutex_lock(&bal_ind_queue_lock);
      add_bal_indication_node(bal_indication_node);
      pthread_mutex_unlock(&bal_ind_queue_lock);
   }

   return result;
}
