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