VOL-253: grpc-c was crashed if we configured wrong VOLTHA IP address
Fix for grpc-c crash, dying gas alarm, kpis and packet data

Change-Id: I172e64afa0f9e9c1492f4871b6fa7ae3152065cd
diff --git a/device_simulator/client.c.patch b/device_simulator/client.c.patch
index 7de4dd1..c77a281 100644
--- a/device_simulator/client.c.patch
+++ b/device_simulator/client.c.patch
@@ -35,3 +35,15 @@
   
       context = gc_client_prepare_ops(client, mdarray, 1, input, NULL, 
   				    client_streaming, server_streaming, NULL, 
+***************
+--- grpc-c_orig/lib/client.c    2017-09-19 21:08:29.506546198 +0530
++++ grpc-c/lib/client.c 2017-09-19 21:10:52.137702783 +0530
+@@ -967,7 +967,6 @@
+
+     if (*output == NULL) {
+        grpc_c_context_free(context);
+-       gpr_log(GPR_ERROR, "No output to return");
+        rc = GRPC_C_FAIL;
+        goto cleanup;
+     }
+
diff --git a/device_simulator/voltha_bal_driver.c b/device_simulator/voltha_bal_driver.c
index afdb73e..2d59e0e 100755
--- a/device_simulator/voltha_bal_driver.c
+++ b/device_simulator/voltha_bal_driver.c
@@ -51,7 +51,7 @@
 {
    BalHeartbeat *bal_hb;
    BalErr bal_err;
-
+   int ret_val;
    /*
     * Read incoming message into set_cfg
     */
@@ -69,11 +69,18 @@
    /*
     * Write reply back to the client
     */
-    if (!context->gcc_stream->write(context, &bal_err, 0)) {
-    } else {
-              printf("Failed to write\n");
-	      exit(1);
-    }
+   ret_val = context->gcc_stream->write(context, &bal_err, 0);
+   if (ret_val != GRPC_C_WRITE_OK) {
+      if(ret_val == GRPC_C_WRITE_PENDING) {
+         printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+         sleep(5);
+      }
+      else {
+         printf("Failed to write %d \n", ret_val);
+         printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+         sleep(5);
+      }
+   }
 
     grpc_c_status_t status;
     status.gcs_code = 0;
@@ -97,6 +104,8 @@
 {
    BalReboot *read_device;
    BalErr bal_err;
+   int ret_val;
+
    /*
     * Read incoming message into get_cfg
     */
@@ -122,10 +131,17 @@
    /*
     * Write reply back to the client
     */
-   if (!context->gcc_stream->write(context, &bal_err, 0)) {
-   } else {
-      printf("Bal Server - Reboot Failed to write\n");
-      exit(1);
+   ret_val = context->gcc_stream->write(context, &bal_err, 0);
+   if (ret_val != GRPC_C_WRITE_OK) {
+      if(ret_val == GRPC_C_WRITE_PENDING) {
+         printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+         sleep(5);
+      }
+      else {
+         printf("Failed to write %d \n", ret_val);
+         printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+         sleep(5);
+      }
    }
 
    grpc_c_status_t status;
@@ -146,6 +162,7 @@
 void bal__bal_cfg_stat_get_cb(grpc_c_context_t *context)
 {
     BalInterfaceKey *read_stats;
+    int ret_val;
 
     /*
     * Read incoming message into get_cfg
@@ -180,8 +197,18 @@
     if (!context->gcc_stream->write(context, &get_stats, 0)) {
 	   printf("Successfully Written Stats\n");
     } else {
-       printf("Stats Failed to write\n");
-	   exit(1);
+	    if (ret_val != GRPC_C_WRITE_OK) {
+		    if(ret_val == GRPC_C_WRITE_PENDING) {
+			    printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+			    sleep(5);
+		    }
+		    else {
+			    printf("Failed to write %d \n", ret_val);
+			    printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+			    sleep(5);
+		    }
+	    }
+
     }
 
     grpc_c_status_t status;
@@ -195,8 +222,8 @@
         exit(1);
     }
 
-    sleep(1);
     printf("============ Returning from Stats Function============\n");
+    sleep(1);
 }
 
 /*
@@ -249,13 +276,13 @@
    ret_val = context->gcc_stream->write(context, &bal_err, 0);
    if (ret_val != GRPC_C_WRITE_OK) {
       if(ret_val == GRPC_C_WRITE_PENDING) {
-         printf("write is pending, sleep for 10 sec %d \n", ret_val);
-         sleep(10);
+         printf("write(%d) is pending, sleep for 5 sec \n", ret_val);
+         sleep(5);
       }
       else {
          printf("Failed to write %d \n", ret_val);
-         printf("write is pending, sleep for 10 sec: %d\n", ret_val);
-         sleep(10);
+         printf("write(%d) is pending, sleep for 5 sec \n", ret_val);
+         sleep(5);
       }
    }
 
@@ -338,7 +365,7 @@
                 break;
              default:
                 {
-                   ("\n*****************************************************\n");
+                   printf("\n*****************************************************\n");
                    printf("Dest type invalid\n");
                    printf("*****************************************************\n");
                 }
@@ -348,7 +375,7 @@
        break;
     default:
        {
-          ("\n*****************************************************\n");
+          printf("\n*****************************************************\n");
           printf("Received Invalid msg type === %d \n", set_cfg->hdr->obj_type);
           printf("*****************************************************\n");
                     pthread_mutex_unlock(&lock);
@@ -431,7 +458,7 @@
     */
 
 
-   ("\n*****************************************************\n");
+   printf("\n*****************************************************\n");
    printf("Received API Init msg\n");
    printf("*****************************************************\n");
 
@@ -445,13 +472,13 @@
    ret_val = context->gcc_stream->write(context, &bal_err, 0);
    if (ret_val != GRPC_C_WRITE_OK) {
       if(ret_val == GRPC_C_WRITE_PENDING) {
-         printf("write is pending, sleep for 10 sec %d \n", ret_val);
-         sleep(10);
+         printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+         sleep(5);
       }
       else {
          printf("Failed to write %d \n", ret_val);
-         printf("write is pending, sleep for 10 sec: %d\n", ret_val);
-         sleep(10);
+         printf("write(%d) is pending, sleep for 5 sec\n", ret_val);
+         sleep(5);
       }
    }