From 9b28bca2ca62ad3a40f50b179ea81c8ebc4e357e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joanne=20Hug=C3=A9?= <joanne.huge@nexedi.com>
Date: Tue, 28 Jan 2025 09:23:26 +0000
Subject: [PATCH] struct

---
 trx_ecpri.c | 117 ++++++++++++++++++++++------------------------------
 1 file changed, 50 insertions(+), 67 deletions(-)

diff --git a/trx_ecpri.c b/trx_ecpri.c
index d6b72f7..f2844d8 100644
--- a/trx_ecpri.c
+++ b/trx_ecpri.c
@@ -150,23 +150,25 @@ typedef struct {
 typedef struct {
   uint8_t  mac_dst[6];
   uint8_t  mac_src[6];
-  uint16_t ethertype;
+  uint16_t ether_type;
   uint8_t  ecpri_version;
   uint8_t  ecpri_type;
   uint16_t payload_size;
   uint16_t antenna_id;
-  uint16_t seq_id;
+  uint8_t seq_id;
+  uint8_t seq_id_fixed;
 } ecpri_header;
 
 typedef struct {
   uint8_t  mac_dst[6];
   uint8_t  mac_src[6];
-  uint16_t ethertype;
+  uint16_t ether_type;
   uint8_t  ecpri_version;
   uint8_t  ecpri_type;
   uint16_t payload_size;
   uint16_t antenna_id;
-  uint16_t seq_id;
+  uint8_t seq_id;
+  uint8_t seq_id_fixed;
   uint8_t  oran_header[ORAN_HEADER];
   uint8_t  iq_samples[IQ_PAYLOAD];
 } ecpri_iq_packet;
@@ -174,12 +176,13 @@ typedef struct {
 typedef struct {
   uint8_t  mac_dst[6];
   uint8_t  mac_src[6];
-  uint16_t ethertype;
+  uint16_t ether_type;
   uint8_t  ecpri_version;
   uint8_t  ecpri_type;
   uint16_t payload_size;
   uint16_t antenna_id;
-  uint16_t seq_id;
+  uint8_t seq_id;
+  uint8_t seq_id_fixed;
   uint8_t  oran_header[ORAN_HEADER];
   uint8_t  gps_time[10];
 } ecpri_timing_packet;
@@ -208,8 +211,6 @@ static int send_sockfd;
 static int recv_sockfd;
 static struct sockaddr_ll connect_sk_addr;
 static struct sockaddr_ll recv_connect_sk_addr;
-static uint8_t ecpri_iq_header[ECPRI_IQ_HEADER + ORAN_HEADER];
-static uint8_t packet_header[PACKET_HEADER]; // ethernet + ecpri + iq header
 
 static void print_debug(FILE * f, int print_header) {
   char buffer[200];
@@ -372,33 +373,24 @@ static void update_counter(counter_stat_t * c, int64_t v) {
   c->counter += v;
 }
 
-void print_bytes(const char * str, uint8_t * data, int * offset, int count) {
-  int i;
+void print_bytes(const char * str, uint8_t * data, int count) {
   printf("%s", str);
-  for(i = *offset; i < (*offset + count); i++)
+  for(int i = 0; i < count; i++)
     printf("%02x", data[i]);
-  *offset += count;
   printf("\n");
 }
-void print_packet(uint8_t * data, int length) {
-  int offset = 0;
-  int j;
-  uint16_t antenna_id;
-  int seq_id;
-  print_bytes("MAC DST: ", data, &offset, 6);
-  print_bytes("MAC SRC: ", data, &offset, 6);
-  print_bytes("Ethertype: ", data, &offset, 2);
-  print_bytes("eCPRI Common Header: ", data, &offset, 4);
-  print_bytes("IQ DATA Header: ", data, &offset, 4);
-  //print_bytes("IQ payload:\n", data, &offset, length - offset);
-  j = ETHERNET_HEADER + ECPRI_COMMON_HEADER;
-  antenna_id = ntohs(*((uint16_t *) (data + j + 0)));
-  seq_id = data[j + 2];
-  printf("Antenna ID: %d\n", antenna_id);
-  printf("Seq ID: %d\n", _seq_id);
+void print_packet(ecpri_header * header) {
+  print_bytes("mac_dst: "      , (uint8_t *) &header->mac_dst,       6);
+  print_bytes("mac_src: "      , (uint8_t *) &header->mac_src,       6);  
+  print_bytes("ethertype: "    , (uint8_t *) &header->ether_type,     2);
+  print_bytes("ecpri_version: ", (uint8_t *) &header->ecpri_version, 1);
+  print_bytes("ecpri_type: "   , (uint8_t *) &header->ecpri_type,    1);
+  print_bytes("payload_size: " , (uint8_t *) &header->payload_size,  2);
+  print_bytes("antenna_id: "   , (uint8_t *) &header->antenna_id,    2);
+  print_bytes("seq_id: "       , (uint8_t *) &header->seq_id,        1);
+  print_bytes("seq_id_fixed: " , (uint8_t *) &header->seq_id_fixed,  1);
 }
 
-
 static void *recv_thread(void *p) {
 #ifdef DISABLE_RECV
   pthread_exit(EXIT_SUCCESS);
@@ -407,7 +399,6 @@ static void *recv_thread(void *p) {
   cpu_set_t mask;
   int stop = 0;
   int prev_seq_id = -1;
-  int offset;
   struct mmsghdr msgh[MAX_RX_BURST];
   struct iovec msgv[MAX_RX_BURST];
   ecpri_header * header;
@@ -444,7 +435,7 @@ static void *recv_thread(void *p) {
       header = (ecpri_header*) (rx_buf + j * PACKET_SIZE);
 
       // Discard packet if it is not eCPRI
-      if(header->ethertype != 0xfeae)
+      if(header->ether_type != 0xfeae)
         continue;
       // Stop if packet has unexpected size
       if((msgh + j)->msg_len != PACKET_SIZE) {
@@ -499,8 +490,8 @@ static void *recv_thread(void *p) {
     }
     if(stop) {
       for(int j = 0; j < ret; j++) {
-        data = rx_buf + j * PACKET_SIZE;
-        print_packet(data, (msgh + j)->msg_len);
+        header = (ecpri_header*) (rx_buf + j * PACKET_SIZE);
+        print_packet(header);
       }
       log_exit("DECODE_THREAD", "Exiting");
     }
@@ -518,7 +509,7 @@ static void *send_thread(void *p) {
   struct timespec initial;
   struct mmsghdr msgh[MAX_TX_BURST];
   struct iovec msgv[MAX_TX_BURST];
-  uint8_t * data;
+  ecpri_iq_packet * iq_packet;
   TRXEcpriState * s = (TRXEcpriState *) p;
 
   log_info("SEND_THREAD", "Thread init");
@@ -554,27 +545,25 @@ static void *send_thread(void *p) {
 
     for(int encoded = 0; encoded < to_send;) {
       for(uint16_t antenna_id = 0 ; antenna_id < s->tx_n_channel; antenna_id++) {
-        data = tx_buf + encoded * PACKET_SIZE;
+        iq_packet = (ecpri_iq_packet*) (tx_buf + encoded * PACKET_SIZE);
 
-        int j = ETHERNET_HEADER + ECPRI_COMMON_HEADER;
         // PC_ID
-        *((uint16_t *) (data + j + 0)) = ntohs(antenna_id);
+        iq_packet->antenna_id = ntohs(antenna_id);
         // SEQ_ID
-        data[j + 2] = (uint8_t) tx_seq_id;
+        iq_packet->seq_id = (uint8_t) tx_seq_id;
         tx_seq_id = (tx_seq_id + 1) % 256;
-        data[j + 3] = 0x80;
-        j = ETHERNET_HEADER + ECPRI_IQ_HEADER;
         // ORAN counters
-        data[j + 1] = frame_id;
-        uint16_t * word = (uint16_t *) (data + j + 2);
+        iq_packet->oran_header[1] = frame_id;
+        iq_packet->oran_header[1] = frame_id;
+        uint16_t * word = (uint16_t *) (iq_packet->oran_header + 2);
         *word  = sub_frame_id << 8;
         *word |= slot_id << 4 ;
         *word |= symbol_id;
 
         // Add IQ_PAYLOAD to the current packet
-        memcpy(data + PACKET_HEADER,
-            rbuf_read(&trxw_rbuf[antenna_id]),
-            IQ_PAYLOAD);
+        memcpy(iq_packet->iq_samples,
+               rbuf_read(&trxw_rbuf[antenna_id]),
+               IQ_PAYLOAD);
         rbuf_increment_read(&trxw_rbuf[antenna_id], IQ_PAYLOAD);
         check_rbuf_read(&trxw_rbuf[antenna_id], log_exit);
         encoded++;
@@ -713,7 +702,7 @@ static int start_threads(TRXEcpriState * s) {
 int start(TRXEcpriState * s) {
   uint8_t dst_mac[6];
   uint8_t src_mac[6];
-  struct ether_header *eh = (struct ether_header *) packet_header;
+  ecpri_iq_packet iq_packet;
   int if_index;
 
   log_debug("TRX_ECPRI", "raw socket setup");
@@ -739,9 +728,6 @@ int start(TRXEcpriState * s) {
     init_rbuf(&trxr_rbuf[i], name, s->trx_buf_size, IQ_PAYLOAD);
   }
 
-  memset((uint8_t *) packet_header,   0, PACKET_HEADER);
-  memset((uint8_t *) ecpri_iq_header, 0, ECPRI_IQ_HEADER + ORAN_HEADER);
-
   if (!(if_index = if_nametoindex(s->bbu_if))) {
     perror("if_nametoindex");
     return 1;
@@ -784,7 +770,8 @@ int start(TRXEcpriState * s) {
   for(int i = 0; i < 6; i++)
     connect_sk_addr.sll_addr[i] = src_mac[i];
   // Only receive packets on configured BBU Ethernet interface
-  if((bind(recv_sockfd , (struct sockaddr *)&recv_connect_sk_addr , sizeof(recv_connect_sk_addr))) ==-1)
+  if((bind(recv_sockfd , (struct sockaddr *) &recv_connect_sk_addr ,
+      sizeof(recv_connect_sk_addr))) ==-1)
   {
     perror("bind: ");
     return 1;
@@ -797,33 +784,29 @@ int start(TRXEcpriState * s) {
   for(int i = 0; i < 6; i++)
     connect_sk_addr.sll_addr[i] = dst_mac[i];
 
+  memset(&iq_packet, 0, sizeof(ecpri_iq_packet));
   for(int i = 0; i < 6; i++)
-    eh->ether_shost[i] = src_mac[i];
+    iq_packet.mac_src[i] = src_mac[i];
   for(int i = 0; i < 6; i++)
-    eh->ether_dhost[i] = dst_mac[i];
+    iq_packet.mac_dst[i] = dst_mac[i];
 
   /* Ethertype field */
-  eh->ether_type = htons(0xaefe);
+  iq_packet.ether_type = htons(0xaefe);
 
   /* Common Header */
-  ecpri_iq_header[0] = 0x10; // Version 0x1, Reserved = 0, C = 0
-  ecpri_iq_header[1] = 0x00; // Message type (IQ data)
-  /* IQ message header */
-  *((uint16_t *) (ecpri_iq_header + ECPRI_COMMON_HEADER)) = htons(s->flow_id);
+  iq_packet.ecpri_version = 0x10; // Version 0x1, Reserved = 0, C = 0
+  iq_packet.ecpri_type    = 0x00; // Message type (IQ data)
+  iq_packet.seq_id_fixed  = 0x80;
 
   /* ORAN HEADER */
-  ecpri_iq_header[ECPRI_IQ_HEADER] = 0x90;
-  ecpri_iq_header[ECPRI_IQ_HEADER + 3] = 0x00;
-  ecpri_iq_header[ECPRI_IQ_HEADER + 4] = 0x00;
-  ecpri_iq_header[ECPRI_IQ_HEADER + 5] = 0x00;
-  ecpri_iq_header[ECPRI_IQ_HEADER + 6] = 0x00;
-
-  memcpy(packet_header + ETHERNET_HEADER,
-      ecpri_iq_header,
-      ECPRI_IQ_HEADER + ORAN_HEADER);
+  iq_packet.oran_header[0] = 0x90;
+  iq_packet.oran_header[3] = 0x00;
+  iq_packet.oran_header[4] = 0x00;
+  iq_packet.oran_header[5] = 0x00;
+  iq_packet.oran_header[6] = 0x00;
 
   for(int i = 0; i < MAX_TX_BURST; i++)
-    memcpy(tx_buf + i * PACKET_SIZE, packet_header, PACKET_HEADER);
+    memcpy(tx_buf + i * PACKET_SIZE, (uint8_t*) &iq_packet, PACKET_SIZE);
 
   start_threads(s);
   return 0;
-- 
2.30.9