VOL-513: Support ASFVOLT16 Adapter in Swarm Mode -VOL-467 Phase 1 - Polling Mode

Change-Id: Idce390108905e76d77dd854fcecbba4900656242
diff --git a/device_simulator/voltha_bal_driver.c b/device_simulator/voltha_bal_driver.c
index 796c755..83a83ef 100755
--- a/device_simulator/voltha_bal_driver.c
+++ b/device_simulator/voltha_bal_driver.c
@@ -33,12 +33,19 @@
 
 #include <unistd.h>
 #include <sys/reboot.h>
+#include "bal_indications_queue.h"
 
 /* Global varibles */
 balCoreIpInfo coreIpPortInfo;
 
-static grpc_c_server_t *test_server;
+/* extern variables*/
+list_node *bal_ind_queue_tail = NULL;
+list_node *bal_ind_queue_head = NULL;
+pthread_mutex_t bal_ind_queue_lock;
+unsigned int num_of_nodes = 0;
 
+/* static variables*/
+static grpc_c_server_t *test_server;
 static void sigint_handler (int x) {
    grpc_c_server_destroy(test_server);
    exit(0);
@@ -149,7 +156,7 @@
         ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
     }
 
-   system("shutdown -r now");
+   ret_val = system("shutdown -r now");
    sleep(30);  /* allow system to shutdown gracefully */
    sync();  /* force shutdown if graceful did not work */
    reboot(RB_AUTOBOOT);
@@ -444,43 +451,412 @@
 
 }
 
+void bal_get_ind__free_mem_access_term_ind(BalIndications *balIndCfg)
+{
+   free(balIndCfg->access_term_ind->data->sw_version);
+   free(balIndCfg->access_term_ind->data->topology);
+   free(balIndCfg->access_term_ind->data);
+   free(balIndCfg->access_term_ind->key);
+   free(balIndCfg->access_term_ind->hdr);
+   free(balIndCfg->access_term_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_access_term_ind_op_state(BalIndications *balIndCfg)
+{
+   free(balIndCfg->access_term_ind_op_state->data);
+   free(balIndCfg->access_term_ind_op_state->key);
+   free(balIndCfg->access_term_ind_op_state->hdr);
+   free(balIndCfg->access_term_ind_op_state);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_flow_op_state(BalIndications *balIndCfg)
+{
+   free(balIndCfg->flow_op_state->data);
+   free(balIndCfg->flow_op_state->key);
+   free(balIndCfg->flow_op_state->hdr);
+   free(balIndCfg->flow_op_state);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_flow_ind(BalIndications *balIndCfg)
+{
+   free(balIndCfg->flow_ind->data->action);
+   free(balIndCfg->flow_ind->data->classifier->src_mac.data);
+   free(balIndCfg->flow_ind->data->classifier->dst_mac.data);
+   free(balIndCfg->flow_ind->data->classifier);
+   free(balIndCfg->flow_ind->data);
+   free(balIndCfg->flow_ind->key);
+   free(balIndCfg->flow_ind->hdr);
+   free(balIndCfg->flow_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_group_ind(BalIndications *balIndCfg)
+{
+   int i = 0;
+   free(balIndCfg->group_ind->data->flows->val);
+   free(balIndCfg->group_ind->data->flows);
+   for (i = 0; i < balIndCfg->group_ind->data->members->n_val; i++)
+   {
+      free(balIndCfg->group_ind->data->members->val[i]->queue);
+      free(balIndCfg->group_ind->data->members->val[i]->action);
+   }
+   free(balIndCfg->group_ind->data->members->val);
+   free(balIndCfg->group_ind->data->members);
+   free(balIndCfg->group_ind->data);
+   free(balIndCfg->group_ind->key);
+   free(balIndCfg->group_ind->hdr);
+   free(balIndCfg->group_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_interface_op_state(BalIndications *balIndCfg)
+{
+   free(balIndCfg->interface_op_state->data);
+   free(balIndCfg->interface_op_state->key);
+   free(balIndCfg->interface_op_state->hdr);
+   free(balIndCfg->interface_op_state);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_interface_los(BalIndications *balIndCfg)
+{
+   free(balIndCfg->interface_los->data);
+   free(balIndCfg->interface_los->hdr);
+   free(balIndCfg->interface_los); 
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_interface_ind(BalIndications *balIndCfg)
+{
+   free(balIndCfg->interface_ind->data->sub_term_id_list->val);
+   free(balIndCfg->interface_ind->data->sub_term_id_list);
+   free(balIndCfg->interface_ind->data);
+   free(balIndCfg->interface_ind->key);
+   free(balIndCfg->interface_ind->hdr);
+   free(balIndCfg->interface_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_terminal_op_state(BalIndications *balIndCfg)
+{
+   free(balIndCfg->terminal_op_state->data);
+   free(balIndCfg->terminal_op_state->key);
+   free(balIndCfg->terminal_op_state->hdr);
+   free(balIndCfg->terminal_op_state);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_terminal_disc(BalIndications *balIndCfg)
+{
+   free(balIndCfg->terminal_disc->data->serial_number->vendor_specific);
+   free(balIndCfg->terminal_disc->data->serial_number->vendor_id);
+   free(balIndCfg->terminal_disc->data->serial_number);
+   free(balIndCfg->terminal_disc->data);
+   free(balIndCfg->terminal_disc->key);
+   free(balIndCfg->terminal_disc->hdr);
+   free(balIndCfg->terminal_disc);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_terminal_alarm(BalIndications *balIndCfg)
+{
+   free(balIndCfg->terminal_alarm->data->alarm);
+   free(balIndCfg->terminal_alarm->data);
+   free(balIndCfg->terminal_alarm->key);
+   free(balIndCfg->terminal_alarm->hdr);
+   free(balIndCfg->terminal_alarm);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_terminal_dgi(BalIndications *balIndCfg)
+{
+   free(balIndCfg->terminal_dgi->data);
+   free(balIndCfg->terminal_dgi->key);
+   free(balIndCfg->terminal_dgi->hdr);
+   free(balIndCfg->terminal_dgi);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_terminal_ind(BalIndications *balIndCfg)
+{
+   free(balIndCfg->terminal_ind->data->agg_port_id_list);
+   free(balIndCfg->terminal_ind->data->serial_number->vendor_specific);
+   free(balIndCfg->terminal_ind->data->serial_number->vendor_id);
+   free(balIndCfg->terminal_ind->data->serial_number);
+   free(balIndCfg->terminal_ind->data->registration_id);
+   free(balIndCfg->terminal_ind->data->password);
+   free(balIndCfg->terminal_ind->data);
+   free(balIndCfg->terminal_ind->key);
+   free(balIndCfg->terminal_ind->hdr);
+   free(balIndCfg->terminal_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_tm_queue_ind(BalIndications *balIndCfg)
+{
+   switch (balIndCfg->tm_queue_ind->data->bac->type)
+   {
+      case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_TAILDROP:
+        free(balIndCfg->tm_queue_ind->data->bac->taildrop);
+	break;
+      case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WTAILDROP:
+        /*Nothing to do*/
+        break;
+      case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_RED:
+        free(balIndCfg->tm_queue_ind->data->bac->red->red);
+        free(balIndCfg->tm_queue_ind->data->bac->red);
+	break;
+      case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WRED:
+        free(balIndCfg->tm_queue_ind->data->bac->wred->red);
+	free(balIndCfg->tm_queue_ind->data->bac->wred->yellow);
+	free(balIndCfg->tm_queue_ind->data->bac->wred->green);
+	free(balIndCfg->tm_queue_ind->data->bac->wred);
+      default:
+        /*Nothing to do*/
+         break;
+   }
+   free(balIndCfg->tm_queue_ind->data->bac);
+   free(balIndCfg->tm_queue_ind->data->rate);
+   free(balIndCfg->tm_queue_ind->data);
+   free(balIndCfg->tm_queue_ind->key);
+   free(balIndCfg->tm_queue_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_u_tm_sched_ind(BalIndications *balIndCfg)
+{
+   free(balIndCfg->tm_sched_ind->data);
+   free(balIndCfg->tm_sched_ind->key);
+   free(balIndCfg->tm_sched_ind);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_u_pkt_data(BalIndications *balIndCfg)
+{
+   free(balIndCfg->pktdata->data->pkt.data);
+   free(balIndCfg->pktdata->data);
+   switch(balIndCfg->pktdata->key->packet_send_dest->type)
+   {
+      case BAL_DEST_TYPE__BAL_DEST_TYPE_NNI:
+         free(balIndCfg->pktdata->key->packet_send_dest->nni);
+         break;
+      case BAL_DEST_TYPE__BAL_DEST_TYPE_SUB_TERM:
+         free(balIndCfg->pktdata->key->packet_send_dest->sub_term);
+	 break;
+      case BAL_DEST_TYPE__BAL_DEST_TYPE_SVC_PORT:
+         free(balIndCfg->pktdata->key->packet_send_dest->svc_port);
+	 break;
+      default:
+         /*Nothing to do*/
+         break;
+   }
+   free(balIndCfg->pktdata->key->packet_send_dest);
+   free(balIndCfg->pktdata->key);
+   free(balIndCfg->pktdata->hdr);
+   free(balIndCfg->pktdata);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_u_bal_omci_resp(BalIndications *balIndCfg)
+{
+   switch(balIndCfg->balomciresp->key->packet_send_dest->type)
+   {
+      case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
+         free(balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel);
+         break;
+      default:
+         /*Nothing to do*/
+         break;
+   }
+   free(balIndCfg->balomciresp->key->packet_send_dest);
+   free(balIndCfg->balomciresp->data->pkt.data);
+   free(balIndCfg->balomciresp->data);
+   free(balIndCfg->balomciresp->key);
+   free(balIndCfg->balomciresp->hdr);
+   free(balIndCfg->balomciresp);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem_u_bal_oam_resp(BalIndications *balIndCfg)
+{
+   free(balIndCfg->baloamresp->data->pkt.data);
+   free(balIndCfg->baloamresp->data);
+   switch(balIndCfg->baloamresp->key->packet_send_dest->type)
+   {
+      case BAL_DEST_TYPE__BAL_DEST_TYPE_IEEE_OAM_CHANNEL:
+         free(balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel);
+         break;
+      default:
+         /*Nothing to do*/
+         break;
+   }
+   free(balIndCfg->baloamresp->key->packet_send_dest);
+   free(balIndCfg->baloamresp->key);
+   free(balIndCfg->baloamresp->hdr);
+   free(balIndCfg->baloamresp);
+   free(balIndCfg);
+}
+
+void bal_get_ind__free_mem(BalIndications *balIndCfg)
+{
+    switch (balIndCfg->u_case)
+    {
+       case BAL_INDICATIONS__U_ACCESS_TERM_IND:
+          bal_get_ind__free_mem_access_term_ind(balIndCfg);
+          break;
+ 
+       case BAL_INDICATIONS__U_ACCESS_TERM_IND_OP_STATE:
+          bal_get_ind__free_mem_access_term_ind_op_state(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_FLOW_OP_STATE:
+          bal_get_ind__free_mem_flow_op_state(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_FLOW_IND:
+          bal_get_ind__free_mem_flow_ind(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_GROUP_IND:
+          bal_get_ind__free_mem_group_ind(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_INTERFACE_OP_STATE:
+          bal_get_ind__free_mem_interface_op_state(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_INTERFACE_LOS:
+          bal_get_ind__free_mem_interface_los(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_INTERFACE_IND:
+          bal_get_ind__free_mem_interface_ind(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TERMINAL_OP_STATE:
+          bal_get_ind__free_mem_terminal_op_state(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TERMINAL_DISC:
+          bal_get_ind__free_mem_terminal_disc(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TERMINAL_ALARM:
+          bal_get_ind__free_mem_terminal_alarm(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TERMINAL_DGI:
+          bal_get_ind__free_mem_terminal_dgi(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TERMINAL_IND:
+          bal_get_ind__free_mem_terminal_ind(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TM_QUEUE__IND:
+          bal_get_ind__free_mem_tm_queue_ind(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_TM_SCHED__IND:
+          bal_get_ind__free_mem_u_tm_sched_ind(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_PKT_DATA:
+          bal_get_ind__free_mem_u_pkt_data(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_BAL_OMCI_RESP:
+          bal_get_ind__free_mem_u_bal_omci_resp(balIndCfg);
+          break;
+
+       case BAL_INDICATIONS__U_BAL_OAM_RESP:
+          bal_get_ind__free_mem_u_bal_oam_resp(balIndCfg);
+          break;
+
+       default:
+          ASFVOLT_LOG(ASFVOLT_ERROR, "Unknown case %lu\n", balIndCfg->u_case);
+          break;
+    }
+}
+
+void bal_get_ind__bal_get_ind_from_device_cb(grpc_c_context_t *context)
+{
+   BalDefault *dummy;
+   BalIndications *bal_indication;
+   list_node *node = NULL;
+   int ret_val = 0;
+
+   /*
+    * Read incoming message into set_cfg
+    */
+   if (context->gcc_payload) {
+      context->gcc_stream->read(context, (void **)&dummy, 0);
+   }
+
+   /*
+    * send it to BAL
+    */
+
+   pthread_mutex_lock(&bal_ind_queue_lock);
+   node = get_bal_indication_node();
+   pthread_mutex_unlock(&bal_ind_queue_lock);
+     
+   if(node != NULL)
+   {
+      bal_indication = node->bal_indication;
+      bal_indication->ind_present = true;
+      bal_indication->has_ind_present = true;
+   }
+   else
+   {
+      bal_indication = malloc(sizeof(BalIndications));
+      memset(bal_indication, 0, sizeof(BalIndications));
+      bal_indications__init(bal_indication);
+      bal_indication->ind_present = false;
+      bal_indication->has_ind_present = true;
+   }
+
+   /*
+    * Write reply back to the client
+    */
+
+   ret_val = context->gcc_stream->write(context, bal_indication, 0);
+   is_grpc_write_pending(ret_val);
+
+   grpc_c_status_t status;
+   status.gcs_code = 0;
+
+   /*
+    * Finish response for RPC
+    */
+   if (context->gcc_stream->finish(context, &status))
+   {
+      ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
+   }
+   
+   /*Free memory for 'bal_indication' and 'node'*/
+   if (bal_indication->ind_present)
+   {
+      bal_get_ind__free_mem(bal_indication);
+      free(node);
+   }
+   else
+   {
+      free(bal_indication);
+   }
+}
 
 /*
  * This functions gets invoked whenever bal finish RPC gets called
  */
 void bal__bal_api_finish_cb(grpc_c_context_t *context)
 {
-#if 0
-   void *finish_init;
 
-   /*
-    * Read incoming message into set_cfg
-    */
-   if (context->gcc_payload) {
-      context->gcc_stream->read(context, (void **)&finish_init);
-   }
-#endif
 }
 
-#if 0
-/*
- * This functions gets invoked whenever bal finish RPC gets called
- */
-void bal_ind__bal_ind_info_cb(grpc_c_context_t *context)
-{
-#if 0
-   void *finish_init;
-
-   /*
-    * Read incoming message into set_cfg
-    */
-   if (context->gcc_payload) {
-      context->gcc_stream->read(context, (void **)&finish_init);
-   }
-#endif
-}
-#endif
-
 void bal_ind__bal_acc_term_ind_cb(grpc_c_context_t *context)
 {
 }
@@ -581,6 +957,7 @@
     */
    ASFVOLT_LOG(ASFVOLT_INFO, "\nvoltha_bal_driver running.....\n");
    bal__service_init(test_server);
+   bal_get_ind__service_init(test_server);
 
    /*
     * Start server
@@ -598,5 +975,5 @@
 
    /* code added for example Makefile to compile grpc-c along with edgecore driver */
    bal__service_init(server);
-
+   bal_get_ind__service_init(server);
 }