bal packet indication bug fix, heartbeat and reboot procedures

Change-Id: If798c1802c488dd6b4a73595c72245b7d5daa8d7
diff --git a/src/asfvolt16_driver.c b/src/asfvolt16_driver.c
index 1178ff2..24bca9d 100755
--- a/src/asfvolt16_driver.c
+++ b/src/asfvolt16_driver.c
@@ -95,6 +95,12 @@
     cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler )bal_omci_data_indication_cb;
     bcmbal_subscribe_ind(0, &cb_cfg);
 
+    /* Bearer Channel Data */
+    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_packet_data_indication_cb;
+    ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
+    cb_cfg.p_subgroup = &ind_subgroup;
+    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);
+
 #if 0
     /* Access Terminal Operational State Change */
     cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_acc_term_osc_indication_cb;
@@ -166,11 +172,6 @@
     cb_cfg.p_subgroup = &ind_subgroup;
     err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);
     
-    /* Bearer Channel Data */
-    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_packet_data_indication_cb;
-    ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
-    cb_cfg.p_subgroup = &ind_subgroup;
-    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);
     
     /* OAM Channel Data - oam response indication */
     cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_oam_data_indication_cb;
@@ -186,7 +187,7 @@
 /********************************************************************
  *                                                                  *
  *     gRPC service RPC function implementation                     *
- *                                                                  *   
+ *                                                                  *
  ********************************************************************/
 
 /********************************************************************\
@@ -215,7 +216,7 @@
     argv[2] = coreInfo->bal_core_ip_port;
     argv[3] = coreInfo->bal_core_arg2;
     argv[4] = coreInfo->bal_shared_lib_ip_port;
-    int argc = 5; 
+    int argc = 5;
     client = grpc_c_client_init(ip_and_port, "bal_client", NULL);
 
     /* Init BAL */
@@ -237,7 +238,7 @@
     }
 #endif
 
-    /* Register the call back functions to handle any 
+    /* Register the call back functions to handle any
      * indications from the BAL */
     bcmbal_cb_cfg cb_cfg = {};
     uint16_t ind_subgroup;
@@ -282,7 +283,7 @@
  *               1) Access Terminal Cfg                             *
  *               2) Interface(PON & NNI) Cfg                        *
  *               3) Subscriber Terminal (ONU) cfg                   *
- *               4) Flow Cfg                                        *             
+ *               4) Flow Cfg                                        *
  *               5) Group Cfg (In case of Multicast)                *
  ********************************************************************/
 uint32_t asfvolt16_bal_cfg_set(BalCfg *cfg)
@@ -349,7 +350,7 @@
  *               1) Access Terminal Cfg                             *
  *               2) Interface(PON & NNI) Cfg                        *
  *               3) Subscriber Terminal (ONU) cfg                   *
- *               4) Flow Cfg                                        *             
+ *               4) Flow Cfg                                        *
  *               5) Group Cfg (In case of Multicast)                *
  ********************************************************************/
 uint32_t asfvolt16_bal_cfg_clear(BalKey *key)
@@ -419,7 +420,7 @@
  *               1) Access Terminal Cfg                             *
  *               2) Interface(PON & NNI) Cfg                        *
  *               3) Subscriber Terminal (ONU) cfg                   *
- *               4) Flow Cfg                                        *             
+ *               4) Flow Cfg                                        *
  *               5) Group Cfg (In case of Multicast)                *
  ********************************************************************/
 uint32_t asfvolt16_bal_cfg_get(BalKey *key, BalCfg *cfg)
diff --git a/src/bal_indications_hdlr.c b/src/bal_indications_hdlr.c
index 1c34d6e..44c4620 100755
--- a/src/bal_indications_hdlr.c
+++ b/src/bal_indications_hdlr.c
@@ -18,7 +18,7 @@
 
 /*static bcmos_mutex bal_ind_lock; - Need to define bcm independent mutex*/
 /********************************************************************\
- * Function    : bal_acc_term_indication_cb                         * 
+ * Function    : bal_acc_term_indication_cb                         *
  * Description : This function will handle the indications for      *
  *               Access Terminal Indication                         *
  *                                                                  *
@@ -27,7 +27,7 @@
 {
    bcmos_errno result = BCM_ERR_OK;
 
-   if(BCMBAL_OBJ_ID_ACCESS_TERMINAL != obj->obj_type || 
+   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)\n",
@@ -49,7 +49,6 @@
       balIndCfg.device_id = voltha_device_id;
 
       bcmbal_access_terminal_ind *acc_term_ind = (bcmbal_access_terminal_ind *)obj;
-      
 
       BalAccessTerminalInd acessTermInd;
       memset(&acessTermInd, 0, sizeof(BalAccessTerminalInd));
@@ -61,61 +60,61 @@
       bal_obj__init(&hdr);
       balIndCfg.access_term_ind->hdr = &hdr;
 
-      BalAccessTerminalKey accessTermkey; 
+      BalAccessTerminalKey accessTermkey;
       memset(&accessTermkey, 0, sizeof(BalAccessTerminalKey));
       bal_access_terminal_key__init(&accessTermkey);
-      balIndCfg.access_term_ind->key = &accessTermkey; 
+      balIndCfg.access_term_ind->key = &accessTermkey;
 
-      balIndCfg.access_term_ind->key->has_access_term_id = BAL_GRPC_PRES; 
+      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;
       memset(&accessTermIndData, 0, sizeof(BalAccessTerminalIndData));
       bal_access_terminal_ind_data__init(&accessTermIndData);
-      balIndCfg.access_term_ind->data = &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; 
+      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;
       memset(&balTop, 0, sizeof(BalTopology));
       bal_topology__init(&balTop);
-      balIndCfg.access_term_ind->data->topology = &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; 
+      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;
       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 = &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_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; 
@@ -1487,6 +1486,8 @@
       /*bcmos_mutex_lock(&bal_ind_lock);-- Need to define bcm independent mutex*/
 
       BalIndications balIndCfg;
+      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;
@@ -1596,6 +1597,7 @@
       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*/