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

struct

parent bcc89588
......@@ -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,25 +545,23 @@ 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,
memcpy(iq_packet->iq_samples,
rbuf_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) {
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;
......
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