Add initial codes
[it/test.git] / simulators / workload_generator / src / ric_receiver.c
diff --git a/simulators/workload_generator/src/ric_receiver.c b/simulators/workload_generator/src/ric_receiver.c
new file mode 100644 (file)
index 0000000..4daf649
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+======================================================================
+        Copyright (c) 2019 Nokia
+        Copyright (c) 2018-2019 AT&T Intellectual Property.
+
+   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 andlimitations under the License.
+======================================================================
+*/
+
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#define UTA_COMPAT
+#include <rmr/rmr.h>
+#include "ric_wg.h"
+
+//array to save ts for each transaction
+time_t ts_array[MAX_TRANS];
+//array to save tns for each transaction
+long int tns_array[MAX_TRANS];
+//array to save latency for each transaction
+double latency_array[MAX_TRANS]={0};
+//array to save time passed for each transaction
+double elapse_array[MAX_TRANS]={0};
+//array to save typeid for each transaction
+int type_array[MAX_TRANS]={0};
+
+//they are used to track time in order to get msg rate
+time_t ts_start_rcv;
+long int tns_start_rcv;
+
+int main( int argc, char** argv ) {
+  
+  void* mr;
+  char*        proto_port = "tcp:4560";
+  uta_mbuf_t* msg = NULL;
+  msg_t* pm;
+  struct timespec ts;
+  long long delta;
+  long long elapse;
+  double ms_delta;
+  double ms_elapse;
+  double total_ms_delta = 0.0;
+  double ave_latency = 0.0;
+  double rcv_rate = 0.0;
+  long long rcv_count = 0;
+  
+  if((mr = uta_init( proto_port,
+                    UTA_MAX_RCV_BYTES, UTAFL_NONE )) == NULL) {
+    fprintf(stderr,
+           "abort: unable to initialize the message lib: %s\n",
+           strerror(errno));
+    exit(1);
+  }
+  
+  while(rcv_count <= MAX_RCV_COUNT) {
+
+    msg = uta_rcv_msg(mr, msg);
+   
+    if(msg) {
+      type_array[rcv_count] = msg->mtype;
+      pm = (msg_t *) msg->payload;
+      clock_gettime(CLOCK_REALTIME, &ts);
+      //record the time when the first msg is recieved 
+      if(rcv_count == 0) {
+       ts_start_rcv = ts.tv_sec;
+       tns_start_rcv = ts.tv_nsec;
+      }
+       
+      delta = (ts.tv_sec - (pm->ts).tv_sec) * 1000000000 +
+       ts.tv_nsec - (pm->ts).tv_nsec;
+         
+      ms_delta = (double) delta / 1000000;
+      elapse = (ts.tv_sec - ts_start_rcv) * 1000000000
+       + ts.tv_nsec - tns_start_rcv;
+      ms_elapse = (double) elapse / 1000000;
+      elapse_array[rcv_count] = ms_elapse;
+      total_ms_delta += ms_delta;
+      latency_array[rcv_count] = ms_delta;
+      rcv_count++;
+    }
+   
+  }
+  //when test ends dump memory into file
+  total_ms_delta -= latency_array[rcv_count - 1];
+  ms_elapse = elapse_array[rcv_count - 2];
+  rcv_count--;
+  ave_latency = total_ms_delta/rcv_count;
+  rcv_rate = (rcv_count/ms_elapse)*1000.0;
+  char fname[256];
+  snprintf(fname, sizeof fname, "report/xAPP_counters.csv");
+  FILE *fptr = fopen(fname, "w");
+  fprintf(fptr, "average latency %.3fmillisec\n", ave_latency);
+  for(int i = 0; i < rcv_count; i++)
+    fprintf(fptr, "%d %.3fmillisec \n", i, latency_array[i]);
+  return 0;
+}
+