Commit 3dd1faad authored by pyroclaste's avatar pyroclaste

Add the compression for IF5 and RTT measurements for FH and RF

parent 9e55f8eb
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -59,3 +59,5 @@ typedef struct IF5_mobipass_header IF5_mobipass_header_t; ...@@ -59,3 +59,5 @@ typedef struct IF5_mobipass_header IF5_mobipass_header_t;
void send_IF5(PHY_VARS_eNB*, openair0_timestamp, int, uint8_t*, uint16_t); void send_IF5(PHY_VARS_eNB*, openair0_timestamp, int, uint8_t*, uint16_t);
void recv_IF5(PHY_VARS_eNB*, openair0_timestamp*, int, uint16_t); void recv_IF5(PHY_VARS_eNB*, openair0_timestamp*, int, uint16_t);
void malloc_IF5_buffer(PHY_VARS_eNB*);
This diff is collapsed.
...@@ -78,7 +78,8 @@ ...@@ -78,7 +78,8 @@
void exit_fun(const char* s); void exit_fun(const char* s);
extern int exit_openair; extern int exit_openair;
struct timespec start_fh, start_fh_prev;
int start_fh_sf, start_fh_prev_sf;
// Fix per CC openair rf/if device update // Fix per CC openair rf/if device update
// extern openair0_device openair0; // extern openair0_device openair0;
...@@ -2751,6 +2752,10 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) { ...@@ -2751,6 +2752,10 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) {
if (eNB->node_function == NGFI_RRU_IF4p5) { if (eNB->node_function == NGFI_RRU_IF4p5) {
/// **** send_IF4 of rxdataF to RCC (no prach now) **** /// /// **** send_IF4 of rxdataF to RCC (no prach now) **** ///
send_IF4p5(eNB, proc_rxtx->frame_rx, proc_rxtx->subframe_rx, IF4p5_PULFFT, 0); send_IF4p5(eNB, proc_rxtx->frame_rx, proc_rxtx->subframe_rx, IF4p5_PULFFT, 0);
start_fh_prev = start_fh;
start_fh_prev_sf = start_fh_sf;
clock_gettime( CLOCK_MONOTONIC, &start_fh);
start_fh_sf = proc_rxtx->subframe_rx;
} }
} }
...@@ -2762,6 +2767,10 @@ void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) { ...@@ -2762,6 +2767,10 @@ void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) {
/// **** send_IF5 of rxdata to BBU **** /// /// **** send_IF5 of rxdata to BBU **** ///
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );
send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL);
start_fh_prev = start_fh;
start_fh_prev_sf = start_fh_sf;
clock_gettime( CLOCK_MONOTONIC, &start_fh);
start_fh_sf = proc->subframe_rx;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );
} }
......
This diff is collapsed.
...@@ -85,6 +85,7 @@ typedef struct rrh_gw_config_s { ...@@ -85,6 +85,7 @@ typedef struct rrh_gw_config_s {
uint8_t udpif4p5; uint8_t udpif4p5;
uint8_t rawif4p5; uint8_t rawif4p5;
uint8_t rawif5_mobipass; uint8_t rawif5_mobipass;
uint8_t if_compress;
int tx_scheduling_advance; int tx_scheduling_advance;
int tx_sample_advance; int tx_sample_advance;
int iq_txshift; int iq_txshift;
......
...@@ -181,6 +181,10 @@ const char* eurecomVariablesNames[] = { ...@@ -181,6 +181,10 @@ const char* eurecomVariablesNames[] = {
"ue0_trx_write_ns", "ue0_trx_write_ns",
"ue0_trx_read_ns_missing", "ue0_trx_read_ns_missing",
"ue0_trx_write_ns_missing" "ue0_trx_write_ns_missing"
"send_if4_symbol",
"recv_if4_symbol",
"send_if5_pkt_id",
"recv_if5_pkt_id"
}; };
const char* eurecomFunctionsNames[] = { const char* eurecomFunctionsNames[] = {
...@@ -375,7 +379,10 @@ const char* eurecomFunctionsNames[] = { ...@@ -375,7 +379,10 @@ const char* eurecomFunctionsNames[] = {
"send_if4", "send_if4",
"recv_if4", "recv_if4",
"send_if5", "send_if5",
"recv_if5" "recv_if5",
"compress_if",
"decompress_if"
}; };
struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = { struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = {
......
...@@ -147,6 +147,10 @@ typedef enum { ...@@ -147,6 +147,10 @@ typedef enum {
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN5, VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN5,
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN6, VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN6,
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN7, VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN7,
VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF4_SYMBOL,
VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF4_SYMBOL,
VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID,
VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF5_PKT_ID,
VCD_SIGNAL_DUMPER_VARIABLES_UE_PDCP_FLUSH_SIZE, VCD_SIGNAL_DUMPER_VARIABLES_UE_PDCP_FLUSH_SIZE,
VCD_SIGNAL_DUMPER_VARIABLES_UE_PDCP_FLUSH_ERR, VCD_SIGNAL_DUMPER_VARIABLES_UE_PDCP_FLUSH_ERR,
VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS,
...@@ -354,6 +358,9 @@ typedef enum { ...@@ -354,6 +358,9 @@ typedef enum {
VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5,
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5,
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF,
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF,
VCD_SIGNAL_DUMPER_FUNCTIONS_LAST, VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
VCD_SIGNAL_DUMPER_FUNCTIONS_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST, VCD_SIGNAL_DUMPER_FUNCTIONS_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
} vcd_signal_dump_functions; } vcd_signal_dump_functions;
......
...@@ -242,6 +242,8 @@ typedef struct { ...@@ -242,6 +242,8 @@ typedef struct {
uint8_t iq_txshift; uint8_t iq_txshift;
//! transport type preference (RAW/UDP) //! transport type preference (RAW/UDP)
uint8_t transp_preference; uint8_t transp_preference;
//! compression enable (0: No comp/ 1: A-LAW)
uint8_t if_compress;
//! radio front end preference (EXMIMO,USRP, BALDERF,LMSSDR) //! radio front end preference (EXMIMO,USRP, BALDERF,LMSSDR)
uint8_t rf_preference; uint8_t rf_preference;
} eth_params_t; } eth_params_t;
......
...@@ -145,21 +145,28 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi ...@@ -145,21 +145,28 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi
memcpy(buff2,(void*)&eth->eh,MAC_HEADER_SIZE_BYTES); memcpy(buff2,(void*)&eth->eh,MAC_HEADER_SIZE_BYTES);
*(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t))=1+(i<<1); *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t))=1+(i<<1);
*(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = timestamp; *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = timestamp;
int sent_byte;
if (eth->compression = ALAW_COMPRESS) {
sent_byte = RAW_PACKET_SIZE_BYTES_ALAW(nsamps);
} else {
sent_byte = RAW_PACKET_SIZE_BYTES(nsamps);
}
/*printf("[RRH]write mod_%d %d , len %d, buff %p \n", /*printf("[RRH]write mod_%d %d , len %d, buff %p \n",
Mod_id,eth->sockfd[Mod_id],RAW_PACKET_SIZE_BYTES(nsamps), buff2);*/ Mod_id,eth->sockfd[Mod_id],RAW_PACKET_SIZE_BYTES(nsamps), buff2);*/
while(bytes_sent < RAW_PACKET_SIZE_BYTES(nsamps)) { while(bytes_sent < sent_byte) {
#if DEBUG #if DEBUG
printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n",
(void *)(buff2+bytes_sent), (void *)(buff2+bytes_sent),
RAW_PACKET_SIZE_BYTES(nsamps) - bytes_sent, sent_byte - bytes_sent,
bytes_sent); bytes_sent);
#endif #endif
/* Send packet */ /* Send packet */
bytes_sent += send(eth->sockfd, bytes_sent += send(eth->sockfd,
buff2, buff2,
RAW_PACKET_SIZE_BYTES(nsamps), sent_byte,
sendto_flag); sendto_flag);
if ( bytes_sent == -1) { if ( bytes_sent == -1) {
eth->num_tx_errors++; eth->num_tx_errors++;
...@@ -172,7 +179,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi ...@@ -172,7 +179,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi
*(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)), *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)),
bytes_sent); bytes_sent);
dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, RAW_PACKET_SIZE_BYTES(nsamps), TX_FLAG); dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, sent_byte, TX_FLAG);
#endif #endif
eth->tx_actual_nsamps=bytes_sent>>2; eth->tx_actual_nsamps=bytes_sent>>2;
eth->tx_count++; eth->tx_count++;
...@@ -240,6 +247,8 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi ...@@ -240,6 +247,8 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi
int i=0; int i=0;
eth_state_t *eth = (eth_state_t*)device->priv; eth_state_t *eth = (eth_state_t*)device->priv;
int rcvfrom_flag =0; int rcvfrom_flag =0;
int block_cnt=0;
int again_cnt=0;
eth->rx_nsamps=nsamps; eth->rx_nsamps=nsamps;
...@@ -247,25 +256,54 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi ...@@ -247,25 +256,54 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi
/* buff[i] points to the position in rx buffer where the payload to be received will be placed /* buff[i] points to the position in rx buffer where the payload to be received will be placed
buff2 points to the position in rx buffer where the packet header will be placed */ buff2 points to the position in rx buffer where the packet header will be placed */
void *buff2 = (void*)(buff[i]-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES); void *buff2 = (void*)(buff[i]-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES);
/* we don't want to ovewrite with the header info the previous rx buffer data so we store it*/ /* we don't want to ovewrite with the header info the previous rx buffer data so we store it*/
struct ether_header temp = *(struct ether_header *)buff2; struct ether_header temp = *(struct ether_header *)buff2;
int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES); int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES);
openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t));
bytes_received=0; bytes_received=0;
int receive_bytes;
if (eth->compression == ALAW_COMPRESS) {
receive_bytes = RAW_PACKET_SIZE_BYTES_ALAW(nsamps);
} else {
receive_bytes = RAW_PACKET_SIZE_BYTES(nsamps);
}
while(bytes_received < RAW_PACKET_SIZE_BYTES(nsamps)) { while(bytes_received < receive_bytes) {
again:
bytes_received +=recv(eth->sockfd, bytes_received +=recv(eth->sockfd,
buff2, buff2,
RAW_PACKET_SIZE_BYTES(nsamps), receive_bytes,
rcvfrom_flag); rcvfrom_flag);
if (bytes_received ==-1) { if (bytes_received ==-1) {
eth->num_rx_errors++; eth->num_rx_errors++;
perror("ETHERNET IF5 READ: "); if (errno == EAGAIN) {
if (errno == EAGAIN) continue; again_cnt++;
exit(-1); usleep(10);
if (again_cnt == 1000) {
perror("ETHERNET IF5 READ (EAGAIN): ");
exit(-1);
} else {
printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n");
goto again;
}
} else if (errno == EWOULDBLOCK) {
block_cnt++;
usleep(10);
if (block_cnt == 1000) {
perror("ETHERNET IF5 READ (EWOULDBLOCK): ");
exit(-1);
} else {
printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n");
goto again;
}
} else {
perror("ETHERNET IF5 READ");
printf("(%s):\n", strerror(errno));
exit(-1);
}
} else { } else {
/* store the timestamp value from packet's header */ /* store the timestamp value from packet's header */
*timestamp = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); *timestamp = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t));
...@@ -280,7 +318,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi ...@@ -280,7 +318,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi
*(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)), *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)),
bytes_received); bytes_received);
dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, RAW_PACKET_SIZE_BYTES(nsamps),RX_FLAG); dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, receive_bytes, RX_FLAG);
#endif #endif
...@@ -303,19 +341,43 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam ...@@ -303,19 +341,43 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam
ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t; ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t;
IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES);
int block_cnt=0;
int again_cnt=0;
#ifdef DEBUG while (bytes_received < packet_size) {
printf("Reading from device %p, eth %p, sockfd %d\n",device,eth,eth->sockfd); again:
#endif bytes_received = recv(eth->sockfd,
buff[0],
bytes_received = recv(eth->sockfd, packet_size,
buff[0], MSG_PEEK);
packet_size, if (bytes_received ==-1) {
MSG_PEEK); eth->num_rx_errors++;
if (bytes_received ==-1) { if (errno == EAGAIN) {
eth->num_rx_errors++; again_cnt++;
perror("ETHERNET IF4p5 READ (header): "); usleep(10);
exit(-1); if (again_cnt == 1000) {
perror("ETHERNET IF4p5 READ (EAGAIN): ");
exit(-1);
} else {
printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n");
goto again;
}
} else if (errno == EWOULDBLOCK) {
block_cnt++;
usleep(10);
if (block_cnt == 1000) {
perror("ETHERNET IF4p5 READ (EWOULDBLOCK): ");
exit(-1);
} else {
printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n");
goto again;
}
} else {
perror("ETHERNET IF4p5 READ");
printf("(%s):\n", strerror(errno));
exit(-1);
}
}
} }
#ifdef DEBUG #ifdef DEBUG
for (int i=0;i<packet_size;i++) for (int i=0;i<packet_size;i++)
...@@ -331,8 +393,7 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam ...@@ -331,8 +393,7 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam
packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks); packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks);
} else { } else {
packet_size = RAW_IF4p5_PRACH_SIZE_BYTES; packet_size = RAW_IF4p5_PRACH_SIZE_BYTES;
} }
while(bytes_received < packet_size) { while(bytes_received < packet_size) {
bytes_received = recv(eth->sockfd, bytes_received = recv(eth->sockfd,
......
...@@ -260,22 +260,30 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi ...@@ -260,22 +260,30 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
// eth->pck_header.seq_num = pck_seq_num; // eth->pck_header.seq_num = pck_seq_num;
//eth->pck_header.antenna_id = 1+(i<<1); //eth->pck_header.antenna_id = 1+(i<<1);
//eth->pck_header.timestamp = timestamp; //eth->pck_header.timestamp = timestamp;
*(uint16_t *)buff2 = pck_seq_num; *(uint16_t *)buff2 = eth->pck_seq_num;
*(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1); *(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1);
*(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, pck_seq_num); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, eth->pck_seq_num);
int sent_byte;
if (eth->compression == ALAW_COMPRESS) {
sent_byte = UDP_PACKET_SIZE_BYTES_ALAW(nsamps);
} else {
sent_byte = UDP_PACKET_SIZE_BYTES(nsamps);
}
while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) { //while(bytes_sent < sent_byte) {
//printf("eth->pck_seq_num: %d\n", eth->pck_seq_num);
#if DEBUG #if DEBUG
printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n",
(void *)(buff2+bytes_sent), (void *)(buff2+bytes_sent),
UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent, sent_byte - bytes_sent,
bytes_sent); bytes_sent);
#endif #endif
/* Send packet */ /* Send packet */
bytes_sent += sendto(eth->sockfd, bytes_sent += sendto(eth->sockfd,
buff2, buff2,
UDP_PACKET_SIZE_BYTES(nsamps), sent_byte,
sendto_flag, sendto_flag,
(struct sockaddr*)&eth->dest_addr, (struct sockaddr*)&eth->dest_addr,
eth->addr_len); eth->addr_len);
...@@ -291,14 +299,15 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi ...@@ -291,14 +299,15 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
*(int16_t *)(buff2 + sizeof(int16_t)), *(int16_t *)(buff2 + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + sizeof(int32_t)), *(openair0_timestamp *)(buff2 + sizeof(int32_t)),
bytes_sent); bytes_sent);
dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, sent_byte, TX_FLAG);
#endif #endif
eth->tx_actual_nsamps=bytes_sent>>2; eth->tx_actual_nsamps=bytes_sent>>2;
eth->tx_count++; eth->tx_count++;
pck_seq_num++; eth->pck_seq_num++;
if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) pck_seq_num = 1; if ( eth->pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) eth->pck_seq_num = 1;
} }
} //}
/* tx buffer values restored */ /* tx buffer values restored */
*(int32_t *)buff2 = temp0; *(int32_t *)buff2 = temp0;
*(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1;
...@@ -332,19 +341,24 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi ...@@ -332,19 +341,24 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi
bytes_received=0; bytes_received=0;
block_cnt=0; block_cnt=0;
int receive_bytes;
if (eth->compression == ALAW_COMPRESS) {
receive_bytes = UDP_PACKET_SIZE_BYTES_ALAW(nsamps);
} else {
receive_bytes = UDP_PACKET_SIZE_BYTES(nsamps);
}
while(bytes_received < receive_bytes) {
while(bytes_received < UDP_PACKET_SIZE_BYTES(nsamps)) {
again: again:
#if DEBUG #if DEBUG
printf("------- RX------: buff2 current position=%d remaining_bytes=%d bytes_recv=%d \n", printf("------- RX------: buff2 current position=%d remaining_bytes=%d bytes_recv=%d \n",
(void *)(buff2+bytes_received), (void *)(buff2+bytes_received),
UDP_PACKET_SIZE_BYTES(nsamps) - bytes_received, receive_bytes - bytes_received,
bytes_received); bytes_received);
#endif #endif
bytes_received +=recvfrom(eth->sockfd, bytes_received +=recvfrom(eth->sockfd,
buff2, buff2,
UDP_PACKET_SIZE_BYTES(nsamps), receive_bytes,
rcvfrom_flag, rcvfrom_flag,
(struct sockaddr *)&eth->dest_addr, (struct sockaddr *)&eth->dest_addr,
(socklen_t *)&eth->addr_len); (socklen_t *)&eth->addr_len);
...@@ -379,28 +393,29 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi ...@@ -379,28 +393,29 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi
*(int16_t *)(buff2 + sizeof(int16_t)), *(int16_t *)(buff2 + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + sizeof(int32_t)), *(openair0_timestamp *)(buff2 + sizeof(int32_t)),
bytes_received); bytes_received);
dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, receive_bytes, RX_FLAG);
#endif #endif
/* store the timestamp value from packet's header */ /* store the timestamp value from packet's header */
*timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); *timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t));
/* store the sequence number of the previous packet received */ /* store the sequence number of the previous packet received */
if (pck_seq_num_cur == 0) { if (eth->pck_seq_num_cur == 0) {
pck_seq_num_prev = *(uint16_t *)buff2; eth->pck_seq_num_prev = *(uint16_t *)buff2;
} else { } else {
pck_seq_num_prev = pck_seq_num_cur; eth->pck_seq_num_prev = eth->pck_seq_num_cur;
} }
/* get the packet sequence number from packet's header */ /* get the packet sequence number from packet's header */
pck_seq_num_cur = *(uint16_t *)buff2; eth->pck_seq_num_cur = *(uint16_t *)buff2;
//printf("cur=%d prev=%d buff=%d\n",pck_seq_num_cur,pck_seq_num_prev,*(uint16_t *)(buff2)); if ( ( eth->pck_seq_num_cur != (eth->pck_seq_num_prev + 1) ) && !((eth->pck_seq_num_prev==MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame)) && (eth->pck_seq_num_cur==1 )) && !((eth->pck_seq_num_prev==1) && (eth->pck_seq_num_cur==1))) {
if ( ( pck_seq_num_cur != (pck_seq_num_prev + 1) ) && !((pck_seq_num_prev==MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame)) && (pck_seq_num_cur==1 )) && !((pck_seq_num_prev==1) && (pck_seq_num_cur==1))) { //#if DEBUG
printf("out of order packet received1! %d|%d|%d\n",pck_seq_num_cur,pck_seq_num_prev,(int)*timestamp); printf("Out of order packet received: current_packet=%d previous_packet=%d timestamp=%llu\n",eth->pck_seq_num_cur,eth->pck_seq_num_prev,*timestamp);
//#endif
} }
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM,pck_seq_num_cur); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM,eth->pck_seq_num_cur);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,eth->pck_seq_num_prev);
eth->rx_actual_nsamps=bytes_received>>2; eth->rx_actual_nsamps=bytes_received>>2;
eth->rx_count++; eth->rx_count++;
} }
} }
/* tx buffer values restored */ /* tx buffer values restored */
......
...@@ -41,16 +41,24 @@ ...@@ -41,16 +41,24 @@
#include <netinet/ether.h> #include <netinet/ether.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <linux/sysctl.h>
#include <sys/sysctl.h>
#include "common_lib.h" #include "common_lib.h"
#include "ethernet_lib.h" #include "ethernet_lib.h"
int num_devices_eth = 0;
struct sockaddr_in dest_addr[MAX_INST];
int dest_addr_len[MAX_INST];
int trx_eth_start(openair0_device *device) { int trx_eth_start(openair0_device *device) {
eth_state_t *eth = (eth_state_t*)device->priv; eth_state_t *eth = (eth_state_t*)device->priv;
/* initialize socket */ /* initialize socket */
if (eth->flags == ETH_RAW_MODE) { if (eth->flags == ETH_RAW_MODE) {
printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n");
if (eth_socket_init_raw(device)!=0) return -1; if (eth_socket_init_raw(device)!=0) return -1;
/* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/
...@@ -60,10 +68,14 @@ int trx_eth_start(openair0_device *device) { ...@@ -60,10 +68,14 @@ int trx_eth_start(openair0_device *device) {
if(eth_get_dev_conf_raw(device)!=0) return -1; if(eth_get_dev_conf_raw(device)!=0) return -1;
} }
/* adjust MTU wrt number of samples per packet */ /* adjust MTU wrt number of samples per packet */
if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; if(eth->compression == ALAW_COMPRESS) {
if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES_ALAW(device->openair0_cfg->samples_per_packet))!=0) return -1;
} else {
if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1;
}
if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1;
} else if (eth->flags == ETH_RAW_IF4p5_MODE) { } else if (eth->flags == ETH_RAW_IF4p5_MODE) {
printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n");
if (eth_socket_init_raw(device)!=0) return -1; if (eth_socket_init_raw(device)!=0) return -1;
/* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/
...@@ -74,11 +86,11 @@ int trx_eth_start(openair0_device *device) { ...@@ -74,11 +86,11 @@ int trx_eth_start(openair0_device *device) {
} }
/* adjust MTU wrt number of samples per packet */ /* adjust MTU wrt number of samples per packet */
if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1;
if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1;
} else if (eth->flags == ETH_UDP_IF4p5_MODE) { } else if (eth->flags == ETH_UDP_IF4p5_MODE) {
printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); printf("Setting ETHERNET to UDP_IF4p5_MODE\n");
if (eth_socket_init_udp(device)!=0) return -1; if (eth_socket_init_udp(device)!=0) return -1;
if (device->host_type == BBU_HOST) { if (device->host_type == BBU_HOST) {
if(eth_set_dev_conf_udp(device)!=0) return -1; if(eth_set_dev_conf_udp(device)!=0) return -1;
} else { } else {
...@@ -102,7 +114,9 @@ int trx_eth_start(openair0_device *device) { ...@@ -102,7 +114,9 @@ int trx_eth_start(openair0_device *device) {
/* apply additional configuration */ /* apply additional configuration */
if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1;
if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1; if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1;
if(ethernet_tune (device, KERNEL_SND_BUF_MAX_SIZE, 200000000)!=0) return -1;
if(ethernet_tune (device, KERNEL_RCV_BUF_MAX_SIZE, 200000000)!=0) return -1;
return 0; return 0;
} }
...@@ -183,10 +197,12 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { ...@@ -183,10 +197,12 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) {
eth_state_t *eth = (eth_state_t*)device->priv; eth_state_t *eth = (eth_state_t*)device->priv;
struct timeval timeout; struct timeval timeout;
struct ifreq ifr; struct ifreq ifr;
char system_cmd[256]; char system_cmd[256];
// char* if_name=DEFAULT_IF; int rname[] = { CTL_NET, NET_CORE, NET_CORE_RMEM_MAX };
// struct in_addr ia; int wname[] = { CTL_NET, NET_CORE, NET_CORE_WMEM_MAX };
// struct if_nameindex *ids; int namelen=3;
int newval[1];
int newlen=sizeof(newval);
int ret=0; int ret=0;
// int i=0; // int i=0;
...@@ -309,7 +325,25 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { ...@@ -309,7 +325,25 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) {
perror("[ETHERNET] Can't set ring parameters\n"); perror("[ETHERNET] Can't set ring parameters\n");
} }
break; break;
case KERNEL_RCV_BUF_MAX_SIZE:
newval[0] = value;
ret=sysctl(rname, namelen, NULL, 0, newval, newlen);
if (ret) {
fprintf(stderr,"[ETHERNET] Error using sysctl():%s\n",strerror(errno));
} else{
printf("[ETHERNET] Kernel network receive buffer max size is set to %u\n",newval[0]);
}
break;