[GITLAB] - UPGRADE TO v12 on Wednesday the 18th of December at 11.30AM

Commit e62f569b authored by Cedric Roux's avatar Cedric Roux

Merge remote-tracking branch 'origin/various-l2-fixes-187' into develop_integration_w07

parents f9b5dafe 1b417979
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;
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 malloc_IF5_buffer(PHY_VARS_eNB*);
This diff is collapsed.
......@@ -78,7 +78,8 @@
void exit_fun(const char* s);
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
// extern openair0_device openair0;
......@@ -2751,6 +2752,10 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) {
/// **** send_IF4 of rxdataF to RCC (no prach now) **** ///
LOG_D(PHY,"send_IF4p5 (PULFFT): frame %d, subframe %d\n",proc_rxtx->frame_rx,proc_rxtx->subframe_rx);
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) {
/// **** send_IF5 of rxdata to BBU **** ///
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);
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 );
}
......
This diff is collapsed.
......@@ -85,6 +85,7 @@ typedef struct rrh_gw_config_s {
uint8_t udpif4p5;
uint8_t rawif4p5;
uint8_t rawif5_mobipass;
uint8_t if_compress;
int tx_scheduling_advance;
int tx_sample_advance;
int iq_txshift;
......
......@@ -3432,7 +3432,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
)
//-----------------------------------------------------------------------------
{
int i;
int i, drb_id;
#ifdef PDCP_USE_NETLINK
int oip_ifup = 0;
int dest_ip_offset = 0;
......@@ -3564,6 +3564,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
if (DRB_configList != NULL) {
for (i = 0; i < DRB_configList->list.count; i++) { // num max DRB (11-3-8)
if (DRB_configList->list.array[i]) {
drb_id = (int)DRB_configList->list.array[i]->drb_Identity;
LOG_I(RRC,
"[eNB %d] Frame %d : Logical Channel UL-DCCH, Received RRCConnectionReconfigurationComplete from UE rnti %x, reconfiguring DRB %d/LCID %d\n",
ctxt_pP->module_id,
......@@ -3580,7 +3581,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
(int)DRB_configList->list.array[i]->drb_Identity,
(int)*DRB_configList->list.array[i]->logicalChannelIdentity);
if (ue_context_pP->ue_context.DRB_active[i] == 0) {
if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) {
/*
rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_ADD,
(ue_mod_idP * NB_RB_MAX) + *DRB_configList->list.array[i]->logicalChannelIdentity,UNDEF_SECURITY_MODE);
......@@ -3588,7 +3589,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
(ue_mod_idP * NB_RB_MAX) + (int)*eNB_rrc_inst[ctxt_pP->module_id].DRB_config[ue_mod_idP][i]->logicalChannelIdentity,
RADIO_ACCESS_BEARER,Rlc_info_um);
*/
ue_context_pP->ue_context.DRB_active[i] = 1;
ue_context_pP->ue_context.DRB_active[drb_id] = 1;
LOG_D(RRC,
"[eNB %d] Frame %d: Establish RLC UM Bidirectional, DRB %d Active\n",
......@@ -3673,7 +3674,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
} else { // remove LCHAN from MAC/PHY
if (ue_context_pP->ue_context.DRB_active[i] == 1) {
if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) {
// DRB has just been removed so remove RLC + PDCP for DRB
/* rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_REMOVE,
(ue_mod_idP * NB_RB_MAX) + DRB2LCHAN[i],UNDEF_SECURITY_MODE);
......@@ -3687,7 +3688,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
Rlc_info_um);
}
ue_context_pP->ue_context.DRB_active[i] = 0;
ue_context_pP->ue_context.DRB_active[drb_id] = 0;
LOG_D(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
......
......@@ -181,6 +181,10 @@ const char* eurecomVariablesNames[] = {
"ue0_trx_write_ns",
"ue0_trx_read_ns_missing",
"ue0_trx_write_ns_missing"
"send_if4_symbol",
"recv_if4_symbol",
"send_if5_pkt_id",
"recv_if5_pkt_id"
};
const char* eurecomFunctionsNames[] = {
......@@ -375,7 +379,10 @@ const char* eurecomFunctionsNames[] = {
"send_if4",
"recv_if4",
"send_if5",
"recv_if5"
"recv_if5",
"compress_if",
"decompress_if"
};
struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = {
......
......@@ -147,6 +147,10 @@ typedef enum {
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN5,
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN6,
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_ERR,
VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS,
......@@ -354,6 +358,9 @@ typedef enum {
VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_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_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
} vcd_signal_dump_functions;
......
......@@ -242,6 +242,8 @@ typedef struct {
uint8_t iq_txshift;
//! transport type preference (RAW/UDP)
uint8_t transp_preference;
//! compression enable (0: No comp/ 1: A-LAW)
uint8_t if_compress;
//! radio front end preference (EXMIMO,USRP, BALDERF,LMSSDR)
uint8_t rf_preference;
} eth_params_t;
......
......@@ -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);
*(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t))=1+(i<<1);
*(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",
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
printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n",
(void *)(buff2+bytes_sent),
RAW_PACKET_SIZE_BYTES(nsamps) - bytes_sent,
sent_byte - bytes_sent,
bytes_sent);
#endif
/* Send packet */
bytes_sent += send(eth->sockfd,
buff2,
RAW_PACKET_SIZE_BYTES(nsamps),
sent_byte,
sendto_flag);
if ( bytes_sent == -1) {
eth->num_tx_errors++;
......@@ -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)),
*(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)),
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
eth->tx_actual_nsamps=bytes_sent>>2;
eth->tx_count++;
......@@ -240,6 +247,8 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi
int i=0;
eth_state_t *eth = (eth_state_t*)device->priv;
int rcvfrom_flag =0;
int block_cnt=0;
int again_cnt=0;
eth->rx_nsamps=nsamps;
......@@ -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
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);
/* 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;
int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES);
openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t));
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,
buff2,
RAW_PACKET_SIZE_BYTES(nsamps),
receive_bytes,
rcvfrom_flag);
if (bytes_received ==-1) {
eth->num_rx_errors++;
perror("ETHERNET IF5 READ: ");
if (errno == EAGAIN) continue;
exit(-1);
if (errno == EAGAIN) {
again_cnt++;
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 {
/* store the timestamp value from packet's header */
*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
*(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)),
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
......@@ -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;
IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES);
int block_cnt=0;
int again_cnt=0;
#ifdef DEBUG
printf("Reading from device %p, eth %p, sockfd %d\n",device,eth,eth->sockfd);
#endif
bytes_received = recv(eth->sockfd,
buff[0],
packet_size,
MSG_PEEK);
if (bytes_received ==-1) {
eth->num_rx_errors++;
perror("ETHERNET IF4p5 READ (header): ");
exit(-1);
while (bytes_received < packet_size) {
again:
bytes_received = recv(eth->sockfd,
buff[0],
packet_size,
MSG_PEEK);
if (bytes_received ==-1) {
eth->num_rx_errors++;
if (errno == EAGAIN) {
again_cnt++;
usleep(10);
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
for (int i=0;i<packet_size;i++)
......@@ -331,8 +393,7 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam
packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks);
} else {
packet_size = RAW_IF4p5_PRACH_SIZE_BYTES;
}
}
while(bytes_received < packet_size) {
bytes_received = recv(eth->sockfd,
......
......@@ -262,23 +262,30 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
// eth->pck_header.seq_num = pck_seq_num;
//eth->pck_header.antenna_id = 1+(i<<1);
//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);
*(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);
while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) {
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 < sent_byte) {
//printf("eth->pck_seq_num: %d\n", eth->pck_seq_num);
#if DEBUG
printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n",
(void *)(buff2+bytes_sent),
UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent,
sent_byte - bytes_sent,
bytes_sent);
#endif
/* Send packet */
bytes_sent += sendto(eth->sockfd,
buff2,
UDP_PACKET_SIZE_BYTES(nsamps),
sent_byte,
sendto_flag,
(struct sockaddr*)&eth->dest_addr,
eth->addr_len);
......@@ -294,14 +301,15 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
*(int16_t *)(buff2 + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + sizeof(int32_t)),
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
eth->tx_actual_nsamps=bytes_sent>>2;
eth->tx_count++;
pck_seq_num++;
if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) pck_seq_num = 1;
eth->pck_seq_num++;
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 */
*(int32_t *)buff2 = temp0;
*(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1;
......@@ -335,19 +343,24 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi
bytes_received=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 < UDP_PACKET_SIZE_BYTES(nsamps)) {
while(bytes_received < receive_bytes) {
again:
#if DEBUG
printf("------- RX------: buff2 current position=%d remaining_bytes=%d bytes_recv=%d \n",
(void *)(buff2+bytes_received),
UDP_PACKET_SIZE_BYTES(nsamps) - bytes_received,
receive_bytes - bytes_received,
bytes_received);
#endif
bytes_received +=recvfrom(eth->sockfd,
buff2,
UDP_PACKET_SIZE_BYTES(nsamps),
receive_bytes,
rcvfrom_flag,
(struct sockaddr *)&eth->dest_addr,
(socklen_t *)&eth->addr_len);
......@@ -382,28 +395,29 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi
*(int16_t *)(buff2 + sizeof(int16_t)),
*(openair0_timestamp *)(buff2 + sizeof(int32_t)),
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
/* store the timestamp value from packet's header */
*timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t));
/* store the sequence number of the previous packet received */
if (pck_seq_num_cur == 0) {
pck_seq_num_prev = *(uint16_t *)buff2;
if (eth->pck_seq_num_cur == 0) {
eth->pck_seq_num_prev = *(uint16_t *)buff2;
} 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 */
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 ( ( 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))) {
printf("out of order packet received1! %d|%d|%d\n",pck_seq_num_cur,pck_seq_num_prev,(int)*timestamp);
eth->pck_seq_num_cur = *(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 DEBUG
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_PRV,pck_seq_num_prev);
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,eth->pck_seq_num_prev);
eth->rx_actual_nsamps=bytes_received>>2;
eth->rx_count++;
}
}
}
/* tx buffer values restored */
......
......@@ -41,16 +41,24 @@
#include <netinet/ether.h>
#include <unistd.h>
#include <errno.h>
#include <linux/sysctl.h>
#include <sys/sysctl.h>
#include "common_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) {
eth_state_t *eth = (eth_state_t*)device->priv;
/* initialize socket */
if (eth->flags == ETH_RAW_MODE) {
if (eth->flags == ETH_RAW_MODE) {
printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n");
if (eth_socket_init_raw(device)!=0) return -1;
/* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/
......@@ -60,10 +68,14 @@ int trx_eth_start(openair0_device *device) {
if(eth_get_dev_conf_raw(device)!=0) return -1;
}
/* 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;
} else if (eth->flags == ETH_RAW_IF4p5_MODE) {
printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n");
if (eth_socket_init_raw(device)!=0) return -1;
/* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/
......@@ -74,11 +86,11 @@ int trx_eth_start(openair0_device *device) {
}
/* 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,RCV_TIMEOUT,999999)!=0) return -1;
} else if (eth->flags == ETH_UDP_IF4p5_MODE) {
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(eth_set_dev_conf_udp(device)!=0) return -1;
} else {
......@@ -113,7 +125,9 @@ int trx_eth_start(openair0_device *device) {
/* apply additional configuration */
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, KERNEL_SND_BUF_MAX_SIZE, 200000000)!=0) return -1;
if(ethernet_tune (device, KERNEL_RCV_BUF_MAX_SIZE, 200000000)!=0) return -1;
return 0;
}
......@@ -194,10 +208,12 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) {
eth_state_t *eth = (eth_state_t*)device->priv;
struct timeval timeout;
struct ifreq ifr;
char system_cmd[256];
// char* if_name=DEFAULT_IF;
// struct in_addr ia;
// struct if_nameindex *ids;
char system_cmd[256];
int rname[] = { CTL_NET, NET_CORE, NET_CORE_RMEM_MAX };
int wname[] = { CTL_NET, NET_CORE, NET_CORE_WMEM_MAX };
int namelen=3;
int newval[1];
int newlen=sizeof(newval);
int ret=0;
// int i=0;
......@@ -320,7 +336,25 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) {
perror("[ETHERNET] Can't set ring parameters\n");
}
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;
case KERNEL_SND_BUF_MAX_SIZE:
newval[0] = value;
ret=sysctl(wname, namelen, NULL, 0, newval, newlen);
if (ret) {
fprintf(stderr,"[ETHERNET] Error using sysctl():%s\n",strerror(errno));
} else{
printf("[ETHERNET] Kernel network send buffer max size is set to %u\n",newval[0]);
}
break;
default:
break;
}
......@@ -348,6 +382,15 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth
printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference);
eth->flags = ETH_RAW_MODE;
}
if (eth_params->if_compress == 0) {
eth->compression = NO_COMPRESS;
} else if (eth_params->if_compress == 1) {
eth->compression = ALAW_COMPRESS;
} else {
printf("transport_init: Unknown compression scheme %d - default to ALAW", eth_params->if_compress);
eth->compression = ALAW_COMPRESS;
}
printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH"));
device->Mod_id = 0;//num_devices_eth++;
......
......@@ -78,6 +78,8 @@ typedef struct {
unsigned int tx_timeout_ms;
/*!\brief runtime flags */
uint32_t flags;
/*!\compression enalbe */
uint32_t compression;
/*!\ time offset between transmiter timestamp and receiver timestamp */
double tdiff;
/*!\ calibration */
......@@ -98,7 +100,7 @@ typedef struct {
int num_seq_errors;
/*!\brief number of errors in interface's receiver */
int num_rx_errors;
/*!\brief umber of errors in interface's transmitter */
/*!\brief number of errors in interface's transmitter */
int num_tx_errors;
/*!\brief current TX timestamp */
......@@ -117,6 +119,12 @@ typedef struct {
uint64_t tx_count;
/*!\brief number of packets received */
uint64_t rx_count;
/*!\brief TX sequence number*/
uint16_t pck_seq_num;
/*!\brief Current RX sequence number*/
uint16_t pck_seq_num_cur;
/*!\brief Previous RX sequence number */
uint16_t pck_seq_num_prev;
struct ether_header eh;
......@@ -155,6 +163,10 @@ typedef enum {
COALESCE_PAR,
/*!\brief pause parameters of ethernet device */
PAUSE_PAR,
/*!\brief kernel network receive buffer maximun size */
KERNEL_RCV_BUF_MAX_SIZE,
/*!\brief kernel network send buffer maximun size */
KERNEL_SND_BUF_MAX_SIZE,
MAX_OPT
} eth_opt_t;
......
......@@ -49,6 +49,9 @@
// COMMOM HEADER LENGTHS
#define NO_COMPRESS 0
#define ALAW_COMPRESS 1
#define UDP_HEADER_SIZE_BYTES 8
#define IPV4_HEADER_SIZE_BYTES 60 // This is the maximum IPv4 header length
......@@ -59,6 +62,10 @@
#define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps))
#define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps))
#define PAYLOAD_SIZE_BYTES_ALAW(nsamps) (nsamps<<1)
#define UDP_PACKET_SIZE_BYTES_ALAW(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES_ALAW(nsamps))
#define RAW_PACKET_SIZE_BYTES_ALAW(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES_ALAW(nsamps))
// Packet sizes for IF4p5 interface format
#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks)
#define PRACH_HARD_CODED_NUM_SAMPLES (839*4)
......
......@@ -254,6 +254,7 @@ eNBs =
iq_txshift = 4;
tx_sample_advance = 80;
tx_scheduling_advance = 9;
if_compression = "alaw";
},
//second config for Ercom
{
......
......@@ -166,7 +166,8 @@ eNBs =
rf_preference = "usrp_b200";
iq_txshift = 4;
tx_sample_advance = 80;
tx_scheduling_advance = 9;
tx_scheduling_advance = 9;
if_compression = "alaw";
}
);
......
......@@ -168,6 +168,7 @@ eNBs =
iq_txshift = 4;
tx_sample_advance = 80;
tx_scheduling_advance = 9;
if_compression = "alaw";
}
);
......
......@@ -167,6 +167,7 @@ eNBs =
iq_txshift = 4;
tx_sample_advance = 80;
tx_scheduling_advance = 9;
if_compression = "alaw";
}
);
......