From 9a6d30d71611448e496b082e7da8edfddfaed913 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Tue, 23 Oct 2018 16:39:04 +0200
Subject: [PATCH] T: macpdu2wireshark: cleanup

- factorize
- harmonize
- simplify
---
 common/utils/T/tracer/macpdu2wireshark.c | 205 +++++++----------------
 1 file changed, 61 insertions(+), 144 deletions(-)

diff --git a/common/utils/T/tracer/macpdu2wireshark.c b/common/utils/T/tracer/macpdu2wireshark.c
index 34678c774e..f65fdf34c3 100644
--- a/common/utils/T/tracer/macpdu2wireshark.c
+++ b/common/utils/T/tracer/macpdu2wireshark.c
@@ -14,7 +14,10 @@
 #define DEFAULT_IP   "127.0.0.1"
 #define DEFAULT_PORT 9999
 
+#define NO_PREAMBLE -1
+
 int no_sib = 0;
+int no_mib = 0;
 
 typedef struct {
   int socket;
@@ -45,9 +48,9 @@ typedef struct {
   int rar_data;
 } ev_data;
 
-void ul(void *_d, event e)
+void trace(ev_data *d, int direction, int rnti_type, int rnti,
+    int frame, int subframe, void *buf, int bufsize, int preamble)
 {
-  ev_data *d = _d;
   ssize_t ret;
   int fsf;
   int i;
@@ -56,171 +59,88 @@ void ul(void *_d, event e)
 
   PUTS(&d->buf, MAC_LTE_START_STRING);
   PUTC(&d->buf, FDD_RADIO);
-  PUTC(&d->buf, DIRECTION_UPLINK);
-  PUTC(&d->buf, C_RNTI);
+  PUTC(&d->buf, direction);
+  PUTC(&d->buf, rnti_type);
 
-  PUTC(&d->buf, MAC_LTE_RNTI_TAG);
-  PUTC(&d->buf, (e.e[d->ul_rnti].i>>8) & 255);
-  PUTC(&d->buf, e.e[d->ul_rnti].i & 255);
+  if (rnti_type == C_RNTI || rnti_type == RA_RNTI) {
+    PUTC(&d->buf, MAC_LTE_RNTI_TAG);
+    PUTC(&d->buf, (rnti>>8) & 255);
+    PUTC(&d->buf, rnti & 255);
+  }
 
   /* for newer version of wireshark? */
-  fsf = (e.e[d->ul_frame].i << 4) + e.e[d->ul_subframe].i;
+  fsf = (frame << 4) + subframe;
   /* for older version? */
-  fsf = e.e[d->ul_subframe].i;
+  //fsf = subframe;
   PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
   PUTC(&d->buf, (fsf>>8) & 255);
   PUTC(&d->buf, fsf & 255);
 
+  if (preamble != NO_PREAMBLE) {
+    PUTC(&d->buf, MAC_LTE_SEND_PREAMBLE_TAG);
+    PUTC(&d->buf, preamble);
+    PUTC(&d->buf, 0); /* rach attempt - always 0 for us (not sure of this) */
+  }
+
   PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
-  for (i = 0; i < e.e[d->ul_data].bsize; i++)
-    PUTC(&d->buf, ((char*)e.e[d->ul_data].b)[i]);
+  for (i = 0; i < bufsize; i++)
+    PUTC(&d->buf, ((char*)buf)[i]);
 
   ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
       (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
   if (ret != d->buf.osize) abort();
 }
 
+void ul(void *_d, event e)
+{
+  ev_data *d = _d;
+  trace(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i,
+        e.e[d->ul_frame].i, e.e[d->ul_subframe].i,
+        e.e[d->ul_data].b, e.e[d->ul_data].bsize,
+        NO_PREAMBLE);
+}
+
 void dl(void *_d, event e)
 {
   ev_data *d = _d;
-  ssize_t ret;
-  int fsf;
-  int i;
 
   if (e.e[d->dl_rnti].i == 0xffff && no_sib) return;
 
-  d->buf.osize = 0;
-
-  PUTS(&d->buf, MAC_LTE_START_STRING);
-  PUTC(&d->buf, FDD_RADIO);
-  PUTC(&d->buf, DIRECTION_DOWNLINK);
-  if (e.e[d->dl_rnti].i != 0xffff) {
-    PUTC(&d->buf, C_RNTI);
-
-    PUTC(&d->buf, MAC_LTE_RNTI_TAG);
-    PUTC(&d->buf, (e.e[d->dl_rnti].i>>8) & 255);
-    PUTC(&d->buf, e.e[d->dl_rnti].i & 255);
-  } else {
-    PUTC(&d->buf, SI_RNTI);
-  }
-
-  /* for newer version of wireshark? */
-  fsf = (e.e[d->dl_frame].i << 4) + e.e[d->dl_subframe].i;
-  /* for older version? */
-  //fsf = e.e[d->dl_subframe].i;
-  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
-  PUTC(&d->buf, (fsf>>8) & 255);
-  PUTC(&d->buf, fsf & 255);
-
-  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
-  for (i = 0; i < e.e[d->dl_data].bsize; i++)
-    PUTC(&d->buf, ((char*)e.e[d->dl_data].b)[i]);
-
-  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
-      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
-  if (ret != d->buf.osize) abort();
+  trace(d, DIRECTION_DOWNLINK,
+        e.e[d->dl_rnti].i != 0xffff ? C_RNTI : SI_RNTI, e.e[d->dl_rnti].i,
+        e.e[d->dl_frame].i, e.e[d->dl_subframe].i,
+        e.e[d->dl_data].b, e.e[d->dl_data].bsize,
+        NO_PREAMBLE);
 }
 
 void mib(void *_d, event e)
 {
   ev_data *d = _d;
-  ssize_t ret;
-  int fsf;
-  int i;
-
-  d->buf.osize = 0;
-
-  PUTS(&d->buf, MAC_LTE_START_STRING);
-  PUTC(&d->buf, FDD_RADIO);
-  PUTC(&d->buf, DIRECTION_DOWNLINK);
-  PUTC(&d->buf, NO_RNTI);
-
-  /* for newer version of wireshark? */
-  fsf = (e.e[d->mib_frame].i << 4) + e.e[d->mib_subframe].i;
-  /* for older version? */
-  //fsf = e.e[d->mib_subframe].i;
-  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
-  PUTC(&d->buf, (fsf>>8) & 255);
-  PUTC(&d->buf, fsf & 255);
 
-  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
-  for (i = 0; i < e.e[d->mib_data].bsize; i++)
-    PUTC(&d->buf, ((char*)e.e[d->mib_data].b)[i]);
+  if (no_mib) return;
 
-  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
-      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
-  if (ret != d->buf.osize) abort();
+  trace(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
+        e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
+        e.e[d->mib_data].b, e.e[d->mib_data].bsize,
+        NO_PREAMBLE);
 }
 
 void preamble(void *_d, event e)
 {
   ev_data *d = _d;
-  ssize_t ret;
-  int fsf;
-
-  d->buf.osize = 0;
-
-  PUTS(&d->buf, MAC_LTE_START_STRING);
-  PUTC(&d->buf, FDD_RADIO);
-  PUTC(&d->buf, DIRECTION_UPLINK);
-
-  PUTC(&d->buf, NO_RNTI);
-
-  /* for newer version of wireshark? */
-  fsf = (e.e[d->preamble_frame].i << 4) + e.e[d->preamble_subframe].i;
-  /* for older version? */
-  //fsf = e.e[d->preamble_subframe].i;
-  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
-  PUTC(&d->buf, (fsf>>8) & 255);
-  PUTC(&d->buf, fsf & 255);
-
-  PUTC(&d->buf, MAC_LTE_SEND_PREAMBLE_TAG);
-  PUTC(&d->buf, e.e[d->preamble_preamble].i);
-  PUTC(&d->buf, 0); /* rach attempt - always 0 for us (not sure of this) */
-
-  /* if we don't put this (even with no data) wireshark (2.4.5) is not happy */
-  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
-
-  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
-      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
-  if (ret != d->buf.osize) abort();
+  trace(d, DIRECTION_UPLINK, NO_RNTI, 0,
+        e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i,
+        NULL, 0,
+        e.e[d->preamble_preamble].i);
 }
 
 void rar(void *_d, event e)
 {
   ev_data *d = _d;
-  ssize_t ret;
-  int fsf;
-  int i;
-
-  if (e.e[d->rar_rnti].i == 0xffff && no_sib) return;
-
-  d->buf.osize = 0;
-
-  PUTS(&d->buf, MAC_LTE_START_STRING);
-  PUTC(&d->buf, FDD_RADIO);
-  PUTC(&d->buf, DIRECTION_DOWNLINK);
-  PUTC(&d->buf, RA_RNTI);
-
-  PUTC(&d->buf, MAC_LTE_RNTI_TAG);
-  PUTC(&d->buf, (e.e[d->rar_rnti].i>>8) & 255);
-  PUTC(&d->buf, e.e[d->rar_rnti].i & 255);
-
-  /* for newer version of wireshark? */
-  fsf = (e.e[d->rar_frame].i << 4) + e.e[d->rar_subframe].i;
-  /* for older version? */
-  //fsf = e.e[d->rar_subframe].i;
-  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
-  PUTC(&d->buf, (fsf>>8) & 255);
-  PUTC(&d->buf, fsf & 255);
-
-  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
-  for (i = 0; i < e.e[d->rar_data].bsize; i++)
-    PUTC(&d->buf, ((char*)e.e[d->rar_data].b)[i]);
-
-  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
-      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
-  if (ret != d->buf.osize) abort();
+  trace(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i,
+        e.e[d->rar_frame].i, e.e[d->rar_subframe].i,
+        e.e[d->rar_data].b, e.e[d->rar_data].bsize,
+        NO_PREAMBLE);
 }
 
 void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
@@ -281,17 +201,15 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
   if (d->dl_rnti == -1 || d->dl_frame == -1 || d->dl_subframe == -1 ||
       d->dl_data == -1) goto error;
 
-  if (mib_id != -1) {
-    /* MIB: frame, subframe, data */
-    f = get_format(database, mib_id);
-    for (i = 0; i < f.count; i++) {
-      G("frame",    "int",    d->mib_frame);
-      G("subframe", "int",    d->mib_subframe);
-      G("data",     "buffer", d->mib_data);
-    }
-    if (d->mib_frame == -1 || d->mib_subframe == -1 || d->mib_data == -1)
-      goto error;
+  /* MIB: frame, subframe, data */
+  f = get_format(database, mib_id);
+  for (i = 0; i < f.count; i++) {
+    G("frame",    "int",    d->mib_frame);
+    G("subframe", "int",    d->mib_subframe);
+    G("data",     "buffer", d->mib_data);
   }
+  if (d->mib_frame == -1 || d->mib_subframe == -1 || d->mib_data == -1)
+    goto error;
 
   /* preamble: frame, subframe, preamble */
   f = get_format(database, preamble_id);
@@ -370,7 +288,6 @@ int main(int n, char **v)
   ev_data d;
   char *ip = DEFAULT_IP;
   int port = DEFAULT_PORT;
-  int do_mib = 1;
 
   memset(&d, 0, sizeof(ev_data));
 
@@ -382,7 +299,7 @@ int main(int n, char **v)
       { if (i > n-2) usage(); input_filename = v[++i]; continue; }
     if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
     if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
-    if (!strcmp(v[i], "-no-mib")) { do_mib = 0; continue; }
+    if (!strcmp(v[i], "-no-mib")) { no_mib = 1; continue; }
     if (!strcmp(v[i], "-no-sib")) { no_sib = 1; continue; }
     usage();
   }
@@ -407,14 +324,14 @@ int main(int n, char **v)
 
   ul_id = event_id_from_name(database, "ENB_MAC_UE_UL_PDU_WITH_DATA");
   dl_id = event_id_from_name(database, "ENB_MAC_UE_DL_PDU_WITH_DATA");
-  if (do_mib) mib_id = event_id_from_name(database, "ENB_PHY_MIB");
-  preamble_id=event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
+  mib_id = event_id_from_name(database, "ENB_PHY_MIB");
+  preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
   rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA");
   setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id);
 
   register_handler_function(h, ul_id, ul, &d);
   register_handler_function(h, dl_id, dl, &d);
-  if (do_mib) register_handler_function(h, mib_id, mib, &d);
+  register_handler_function(h, mib_id, mib, &d);
   register_handler_function(h, preamble_id, preamble, &d);
   register_handler_function(h, rar_id, rar, &d);
 
-- 
2.26.2