Commit 9b28bca2 authored by Joanne Hugé's avatar Joanne Hugé

struct

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