node function interfaces via function pointers. Suggestions from L. Thomas, B. Mongazon, C. Roux.

This commit is contained in:
Raymond Knopp
2016-07-31 10:28:56 +02:00
parent f33e9a7027
commit 025f56d28b
18 changed files with 788 additions and 724 deletions
+10 -10
View File
@@ -1167,7 +1167,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
frame_parms->phich_config_common.phich_duration); frame_parms->phich_config_common.phich_duration);
LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", eNB->Mod_id); LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", eNB->Mod_id);
if (eNB->node_function != NGFI_RRU_IF4) { if (eNB->node_function != NGFI_RRU_IF4p5) {
lte_gold(frame_parms,eNB->lte_gold_table,frame_parms->Nid_cell); lte_gold(frame_parms,eNB->lte_gold_table,frame_parms->Nid_cell);
generate_pcfich_reg_mapping(frame_parms); generate_pcfich_reg_mapping(frame_parms);
generate_phich_reg_mapping(frame_parms); generate_phich_reg_mapping(frame_parms);
@@ -1191,12 +1191,12 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
if (abstraction_flag==0) { if (abstraction_flag==0) {
// TX vars // TX vars
if (eNB->node_function != NGFI_RCC_IF4) if (eNB->node_function != NGFI_RCC_IF4p5)
common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) );
common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) );
for (i=0; i<frame_parms->nb_antennas_tx; i++) { for (i=0; i<frame_parms->nb_antennas_tx; i++) {
if (eNB->node_function != NGFI_RCC_IF4) if (eNB->node_function != NGFI_RCC_IF4p5)
common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) );
common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) );
#ifdef DEBUG_PHY #ifdef DEBUG_PHY
@@ -1208,14 +1208,14 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
} }
// RX vars // RX vars
if (eNB->node_function != NGFI_RCC_IF4) { if (eNB->node_function != NGFI_RCC_IF4p5) {
common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) );
common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) );
} }
common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) );
for (i=0; i<frame_parms->nb_antennas_rx; i++) { for (i=0; i<frame_parms->nb_antennas_rx; i++) {
if (eNB->node_function != NGFI_RCC_IF4) { if (eNB->node_function != NGFI_RCC_IF4p5) {
common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) );
common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) ); common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) );
} }
@@ -1227,7 +1227,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
#endif #endif
} }
if (eNB->node_function != NGFI_RRU_IF4) { if (eNB->node_function != NGFI_RRU_IF4p5) {
// Channel estimates for SRS // Channel estimates for SRS
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
@@ -1250,7 +1250,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
if (abstraction_flag==0) { if (abstraction_flag==0) {
if (eNB->node_function != NGFI_RRU_IF4) { if (eNB->node_function != NGFI_RRU_IF4p5) {
generate_ul_ref_sigs_rx(); generate_ul_ref_sigs_rx();
// SRS // SRS
@@ -1264,7 +1264,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
// ULSCH VARS, skip if NFGI_RRU_IF4 // ULSCH VARS, skip if NFGI_RRU_IF4
if (eNB->node_function!=NGFI_RRU_IF4) if (eNB->node_function!=NGFI_RRU_IF4p5)
prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) );
/* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */
@@ -1277,7 +1277,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
#endif #endif
} }
if (eNB->node_function != NGFI_RRU_IF4) { if (eNB->node_function != NGFI_RRU_IF4p5) {
AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]), AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]),
"nb_antennas_rx too large"); "nb_antennas_rx too large");
for (i=0; i<frame_parms->nb_antennas_rx; i++) { for (i=0; i<frame_parms->nb_antennas_rx; i++) {
@@ -1399,7 +1399,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration
init_prach_tables(839); init_prach_tables(839);
} // node_function != NGFI_RRU_IF4 } // node_function != NGFI_RRU_IF4p5
return (0); return (0);
} }
+52 -46
View File
@@ -42,9 +42,9 @@
#include "PHY/TOOLS/alaw_lut.h" #include "PHY/TOOLS/alaw_lut.h"
#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) {
void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) {
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **txdataF = eNB->common_vars.txdataF[0];
int32_t **rxdataF = eNB->common_vars.rxdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0];
@@ -57,16 +57,18 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type,
uint16_t *data_block=NULL, *i=NULL; uint16_t *data_block=NULL, *i=NULL;
if (packet_type == IF4_PDLFFT) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );
if (packet_type == IF4p5_PDLFFT) {
db_fulllength = 12*fp->N_RB_DL; db_fulllength = 12*fp->N_RB_DL;
db_halflength = (db_fulllength)>>1; db_halflength = (db_fulllength)>>1;
slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1;
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
IF4_header_t *dl_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); IF4p5_header_t *dl_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
gen_IF4_dl_header(dl_header, frame, subframe); gen_IF4p5_dl_header(dl_header, frame, subframe);
for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) { for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) {
@@ -86,23 +88,23 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type,
&tx_buffer, &tx_buffer,
db_fulllength, db_fulllength,
1, 1,
IF4_PDLFFT)) < 0) { IF4p5_PDLFFT)) < 0) {
perror("ETHERNET write for IF4_PDLFFT\n"); perror("ETHERNET write for IF4p5_PDLFFT\n");
} }
slotoffsetF += fp->ofdm_symbol_size; slotoffsetF += fp->ofdm_symbol_size;
blockoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size;
} }
} else if (packet_type == IF4_PULFFT) { } else if (packet_type == IF4p5_PULFFT) {
db_fulllength = 12*fp->N_RB_UL; db_fulllength = 12*fp->N_RB_UL;
db_halflength = (db_fulllength)>>1; db_halflength = (db_fulllength)>>1;
slotoffsetF = 1; slotoffsetF = 1;
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
IF4_header_t *ul_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); IF4p5_header_t *ul_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
gen_IF4_ul_header(ul_header, frame, subframe); gen_IF4p5_ul_header(ul_header, frame, subframe);
for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) { for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) {
@@ -122,23 +124,23 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type,
&tx_buffer, &tx_buffer,
db_fulllength, db_fulllength,
1, 1,
IF4_PULFFT)) < 0) { IF4p5_PULFFT)) < 0) {
perror("ETHERNET write for IF4_PULFFT\n"); perror("ETHERNET write for IF4p5_PULFFT\n");
} }
slotoffsetF += fp->ofdm_symbol_size; slotoffsetF += fp->ofdm_symbol_size;
blockoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size;
} }
} else if (packet_type == IF4_PRACH) { } else if (packet_type == IF4p5_PRACH) {
// FIX: hard coded prach samples length // FIX: hard coded prach samples length
db_fulllength = 839*2; db_fulllength = 839*2;
IF4_header_t *prach_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); IF4p5_header_t *prach_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
gen_IF4_prach_header(prach_header, frame, subframe); gen_IF4p5_prach_header(prach_header, frame, subframe);
memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t), memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t),
(&rxsigF[0][k]), (&rxsigF[0][k]),
db_fulllength*sizeof(int16_t)); db_fulllength*sizeof(int16_t));
@@ -147,18 +149,19 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type,
&tx_buffer, &tx_buffer,
db_fulllength, db_fulllength,
1, 1,
IF4_PRACH)) < 0) { IF4p5_PRACH)) < 0) {
perror("ETHERNET write for IF4_PRACH\n"); perror("ETHERNET write for IF4p5_PRACH\n");
} }
} else { } else {
AssertFatal(1==0, "send_IF4 - Unknown packet_type %x", packet_type); AssertFatal(1==0, "send_IF4p5 - Unknown packet_type %x", packet_type);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
return; return;
} }
void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) { void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) {
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **txdataF = eNB->common_vars.txdataF[0];
int32_t **rxdataF = eNB->common_vars.rxdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0];
@@ -168,15 +171,17 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ
uint16_t element_id; uint16_t element_id;
uint16_t db_fulllength, db_halflength; uint16_t db_fulllength, db_halflength;
int slotoffsetF=0, blockoffsetF=0; int slotoffsetF=0, blockoffsetF=0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );
if (eNB->node_function == NGFI_RRU_IF4) { if (eNB->node_function == NGFI_RRU_IF4p5) {
db_fulllength = (12*fp->N_RB_DL); db_fulllength = (12*fp->N_RB_DL);
} else { } else {
db_fulllength = (12*fp->N_RB_UL); db_fulllength = (12*fp->N_RB_UL);
} }
db_halflength = db_fulllength>>1; db_halflength = db_fulllength>>1;
IF4_header_t *packet_header=NULL; IF4p5_header_t *packet_header=NULL;
uint16_t *data_block=NULL, *i=NULL; uint16_t *data_block=NULL, *i=NULL;
if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, if (eNB->ifdevice.trx_read_func(&eNB->ifdevice,
@@ -187,13 +192,13 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ
perror("ETHERNET read"); perror("ETHERNET read");
} }
packet_header = (IF4_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES);
data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t); data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t);
*frame = ((packet_header->frame_status)>>6)&0xffff; *frame = ((packet_header->frame_status)>>6)&0xffff;
*subframe = ((packet_header->frame_status)>>22)&0x000f; *subframe = ((packet_header->frame_status)>>22)&0x000f;
if (*packet_type == IF4_PDLFFT) { if (*packet_type == IF4p5_PDLFFT) {
*symbol_number = ((packet_header->frame_status)>>26)&0x000f; *symbol_number = ((packet_header->frame_status)>>26)&0x000f;
slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1;
@@ -209,7 +214,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ
*(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ]; *(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ];
} }
} else if (*packet_type == IF4_PULFFT) { } else if (*packet_type == IF4p5_PULFFT) {
*symbol_number = ((packet_header->frame_status)>>26)&0x000f; *symbol_number = ((packet_header->frame_status)>>26)&0x000f;
slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1; slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1;
@@ -225,25 +230,26 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ
*(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ]; *(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ];
} }
} else if (*packet_type == IF4_PRACH) { } else if (*packet_type == IF4p5_PRACH) {
// FIX: hard coded prach samples length // FIX: hard coded prach samples length
db_fulllength = 839*2; db_fulllength = 839*2;
memcpy((&rxsigF[0][0]), memcpy((&rxsigF[0][0]),
(int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t), (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t),
db_fulllength*sizeof(int16_t)); db_fulllength*sizeof(int16_t));
} else { } else {
AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );
return; return;
} }
void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { void gen_IF4p5_dl_header(IF4p5_header_t *dl_packet, int frame, int subframe) {
dl_packet->type = IF4_PACKET_TYPE; dl_packet->type = IF4p5_PACKET_TYPE;
dl_packet->sub_type = IF4_PDLFFT; dl_packet->sub_type = IF4p5_PDLFFT;
dl_packet->rsvd = 0; dl_packet->rsvd = 0;
@@ -254,9 +260,9 @@ void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) {
} }
void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, int frame, int subframe) {
ul_packet->type = IF4_PACKET_TYPE; ul_packet->type = IF4p5_PACKET_TYPE;
ul_packet->sub_type = IF4_PULFFT; ul_packet->sub_type = IF4p5_PULFFT;
ul_packet->rsvd = 0; ul_packet->rsvd = 0;
@@ -267,9 +273,9 @@ void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) {
} }
void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) { void gen_IF4p5_prach_header(IF4p5_header_t *prach_packet, int frame, int subframe) {
prach_packet->type = IF4_PACKET_TYPE; prach_packet->type = IF4p5_PACKET_TYPE;
prach_packet->sub_type = IF4_PRACH; prach_packet->sub_type = IF4p5_PRACH;
prach_packet->rsvd = 0; prach_packet->rsvd = 0;
@@ -280,8 +286,8 @@ void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) {
} }
void malloc_IF4_buffer(PHY_VARS_eNB *eNB) { void malloc_IF4p5_buffer(PHY_VARS_eNB *eNB) {
// Keep the size large enough // Keep the size large enough
eNB->ifbuffer.tx = malloc(RAW_IF4_PRACH_SIZE_BYTES); eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES);
eNB->ifbuffer.rx = malloc(RAW_IF4_PRACH_SIZE_BYTES); eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES);
} }
+13 -13
View File
@@ -41,12 +41,12 @@
#include "PHY/defs.h" #include "PHY/defs.h"
/// Macro for IF4 packet type /// Macro for IF4 packet type
#define IF4_PACKET_TYPE 0x080A #define IF4p5_PACKET_TYPE 0x080A
#define IF4_PULFFT 0x0019 #define IF4p5_PULFFT 0x0019
#define IF4_PDLFFT 0x0020 #define IF4p5_PDLFFT 0x0020
#define IF4_PRACH 0x0021 #define IF4p5_PRACH 0x0021
struct IF4_header { struct IF4p5_header {
/// Type /// Type
uint16_t type; uint16_t type;
/// Sub-Type /// Sub-Type
@@ -58,17 +58,17 @@ struct IF4_header {
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
typedef struct IF4_header IF4_header_t; typedef struct IF4p5_header IF4p5_header_t;
#define sizeof_IF4_header_t 12 #define sizeof_IF4p5_header_t 12
void gen_IF4_dl_header(IF4_header_t*, int, int); void gen_IF4p5_dl_header(IF4p5_header_t*, int, int);
void gen_IF4_ul_header(IF4_header_t*, int, int); void gen_IF4p5_ul_header(IF4p5_header_t*, int, int);
void gen_IF4_prach_header(IF4_header_t*, int, int); void gen_IF4p5_prach_header(IF4p5_header_t*, int, int);
void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); void send_IF4p5(PHY_VARS_eNB*, int, int, uint16_t, int);
void recv_IF4(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*); void recv_IF4p5(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*);
void malloc_IF4_buffer(PHY_VARS_eNB*); void malloc_IF4p5_buffer(PHY_VARS_eNB*);
+9 -1
View File
@@ -41,7 +41,7 @@
#include "PHY/defs.h" #include "PHY/defs.h"
#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) { void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) {
@@ -54,6 +54,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe
uint32_t spp_eth = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_packet; uint32_t spp_eth = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_packet;
uint32_t spsf = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; uint32_t spsf = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );
if (packet_type == IF5_RRH_GW_DL) { if (packet_type == IF5_RRH_GW_DL) {
for (i=0; i < fp->nb_antennas_tx; i++) for (i=0; i < fp->nb_antennas_tx; i++)
@@ -143,6 +145,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe
} }
free(tx_buffer); free(tx_buffer);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );
return; return;
} }
@@ -158,6 +162,8 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram
int32_t spsf = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; int32_t spsf = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10;
openair0_timestamp timestamp[spsf / spp_eth]; openair0_timestamp timestamp[spsf / spp_eth];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 );
if (packet_type == IF5_RRH_GW_DL) { if (packet_type == IF5_RRH_GW_DL) {
@@ -205,6 +211,8 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram
} else { } else {
AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type); AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 );
return; return;
} }
+2 -3
View File
@@ -1424,8 +1424,7 @@ void rx_phich(PHY_VARS_UE *ue,
void generate_phich_top(PHY_VARS_eNB *eNB, void generate_phich_top(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc, eNB_rxtx_proc_t *proc,
int16_t amp, int16_t amp,
uint8_t sect_id, uint8_t sect_id)
uint8_t abstraction_flag)
{ {
@@ -1486,7 +1485,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
ulsch[UE_id]->harq_processes[harq_pid]->first_rb); ulsch[UE_id]->harq_processes[harq_pid]->first_rb);
} }
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
generate_phich(frame_parms, generate_phich(frame_parms,
amp,//amp*2, amp,//amp*2,
nseq_PHICH, nseq_PHICH,
+4 -4
View File
@@ -190,7 +190,7 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par
return(0); return(0);
} }
void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx, int abstraction_flag) void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx)
{ {
LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH; LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH;
@@ -227,7 +227,7 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx, int abstrac
break; break;
} }
if (abstraction_flag) { if (eNB->abstraction_flag) {
eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1; eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1;
eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF
eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0; eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0;
@@ -286,13 +286,13 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id)
} }
} }
void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a,int abstraction_flag) void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a)
{ {
int G; int G;
int subframe = proc->subframe_tx; int subframe = proc->subframe_tx;
if (abstraction_flag != 0) { if (eNB->abstraction_flag != 0) {
if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0) if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0)
printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]); printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]);
+5 -7
View File
@@ -1183,7 +1183,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
if ((eNB->node_function == eNodeB_3GPP) || if ((eNB->node_function == eNodeB_3GPP) ||
(eNB->node_function == NGFI_RRU_IF4)) { // compute the DFTs of the PRACH temporal resources (eNB->node_function == NGFI_RRU_IF4p5)) { // compute the DFTs of the PRACH temporal resources
// Do forward transform // Do forward transform
for (aa=0; aa<nb_ant_rx; aa++) { for (aa=0; aa<nb_ant_rx; aa++) {
prach2 = prach[aa] + (Ncp<<1); prach2 = prach[aa] + (Ncp<<1);
@@ -1269,7 +1269,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
} }
} }
if (eNB->node_function == NGFI_RRU_IF4) { if (eNB->node_function == NGFI_RRU_IF4p5) {
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
if (k<0) { if (k<0) {
@@ -1281,12 +1281,10 @@ void rx_prach(PHY_VARS_eNB *eNB,
k*=2; k*=2;
/// **** send_IF4 of rxsigF to RCC **** /// /// **** send_IF4 of rxsigF to RCC **** ///
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4p5(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4p5_PRACH, k);
send_IF4(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4_PRACH, k);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
return; return;
} else if (eNB->node_function == NGFI_RCC_IF4) { } else if (eNB->node_function == NGFI_RCC_IF4p5) {
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
if (k<0) { if (k<0) {
@@ -1305,7 +1303,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
// in case of RCC and prach received rx_thread wakes up prach // in case of RCC and prach received rx_thread wakes up prach
// here onwards is for eNodeB_3GPP or NGFI_RCC_IF4 // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4p5
preamble_offset_old = 99; preamble_offset_old = 99;
+3 -6
View File
@@ -232,7 +232,7 @@ int mch_modulation(int32_t **txdataF,
@param abstraction_flag @param abstraction_flag
*/ */
void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a,int abstraction_flag); void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a);
/** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
@param phy_vars_eNB Pointer to eNB variables @param phy_vars_eNB Pointer to eNB variables
@@ -240,10 +240,8 @@ void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a,in
@param mcs MCS for MBSFN @param mcs MCS for MBSFN
@param ndi new data indicator @param ndi new data indicator
@param rdvix @param rdvix
@param abstraction_flag
*/ */
void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx,int abstraction_flag); void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx);
/** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
@param phy_vars_ue Pointer to UE variables @param phy_vars_ue Pointer to UE variables
@@ -1546,8 +1544,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB,
void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
eNB_rxtx_proc_t *proc, eNB_rxtx_proc_t *proc,
int16_t amp, int16_t amp,
uint8_t sect_id, uint8_t sect_id);
uint8_t abstraction_flag);
/* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters. /* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
@param phy_vars_ue Pointer to UE variables @param phy_vars_ue Pointer to UE variables
+26 -14
View File
@@ -161,8 +161,9 @@ typedef enum {
eNodeB_3GPP=0, // classical eNodeB function eNodeB_3GPP=0, // classical eNodeB function
eNodeB_3GPP_BBU, // eNodeB with NGFI IF5 eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
NGFI_RRU_IF5, // NGFI_RRU with IF5 NGFI_RRU_IF5, // NGFI_RRU with IF5
NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) NGFI_RRU_IF4p5, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4p5)
NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4p5)
NGFI_RAU_IF4p5
} eNB_func_t; } eNB_func_t;
typedef enum { typedef enum {
@@ -187,6 +188,20 @@ typedef struct ral_threshold_phy_s {
} ral_threshold_phy_t; } ral_threshold_phy_t;
#endif #endif
/// Top-level PHY Data Structure for RN
typedef struct {
/// Module ID indicator for this instance
uint8_t Mod_id;
uint32_t frame;
// phy_vars_eNB
// phy_vars ue
// cuurently only used to store and forward the PMCH
uint8_t mch_avtive[10];
uint8_t sync_area[10]; // num SF
LTE_UE_DLSCH_t *dlsch_rn_MCH[10];
} PHY_VARS_RN;
/// Context data structure for RX/TX portion of subframe processing /// Context data structure for RX/TX portion of subframe processing
typedef struct { typedef struct {
/// Component Carrier index /// Component Carrier index
@@ -340,6 +355,15 @@ typedef struct PHY_VARS_eNB_s {
eNB_proc_t proc; eNB_proc_t proc;
eNB_func_t node_function; eNB_func_t node_function;
eNB_timing_t node_timing; eNB_timing_t node_timing;
int abstraction_flag;
void (*do_prach)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc);
void (*fep)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc);
void (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type);
void (*proc_tx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *rn);
void (*tx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc);
void (*rx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc,int *frame, int *subframe);
int (*start_rf)(struct PHY_VARS_eNB_s *eNB);
int (*start_if)(struct PHY_VARS_eNB_s *eNB);
uint8_t local_flag; uint8_t local_flag;
uint32_t rx_total_gain_dB; uint32_t rx_total_gain_dB;
LTE_DL_FRAME_PARMS frame_parms; LTE_DL_FRAME_PARMS frame_parms;
@@ -785,19 +809,7 @@ typedef struct {
#endif #endif
} PHY_VARS_UE; } PHY_VARS_UE;
/// Top-level PHY Data Structure for RN
typedef struct {
/// Module ID indicator for this instance
uint8_t Mod_id;
uint32_t frame;
// phy_vars_eNB
// phy_vars ue
// cuurently only used to store and forward the PMCH
uint8_t mch_avtive[10];
uint8_t sync_area[10]; // num SF
LTE_UE_DLSCH_t *dlsch_rn_MCH[10];
} PHY_VARS_RN;
#include "PHY/INIT/defs.h" #include "PHY/INIT/defs.h"
#include "PHY/LTE_REFSIG/defs.h" #include "PHY/LTE_REFSIG/defs.h"
+6 -11
View File
@@ -164,20 +164,18 @@ void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abst
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
@param phy_vars_rn pointer to the RN variables @param phy_vars_rn pointer to the RN variables
*/ */
void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
/*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes. /*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes.
@param phy_vars_eNB Pointer to eNB variables on which to act @param phy_vars_eNB Pointer to eNB variables on which to act
@param proc Pointer to RXn-TXnp4 proc information @param proc Pointer to RXn-TXnp4 proc information
@param abstraction_flag Indicator of PHY abstraction
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
*/ */
void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type); void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type);
/*! \brief Scheduling for eNB TX procedures in TDD S-subframes. /*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
@param phy_vars_eNB Pointer to eNB variables on which to act @param phy_vars_eNB Pointer to eNB variables on which to act
@param proc Pointer to RXn-TXnp4 proc information @param proc Pointer to RXn-TXnp4 proc information
@param abstraction_flag Indicator of PHY abstraction
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
*/ */
@@ -185,29 +183,26 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *pr
@param phy_vars_eNB Pointer to eNB variables on which to act @param phy_vars_eNB Pointer to eNB variables on which to act
@param abstraction_flag Indicator of PHY abstraction @param abstraction_flag Indicator of PHY abstraction
*/ */
void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag); void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB);
/*! \brief Scheduling for eNB TX procedures in TDD S-subframes. /*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
@param phy_vars_eNB Pointer to eNB variables on which to act @param phy_vars_eNB Pointer to eNB variables on which to act
@param abstraction_flag Indicator of PHY abstraction
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
*/ */
void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,relaying_type_t r_type);
/*! \brief Scheduling for eNB RX procedures in TDD S-subframes. /*! \brief Scheduling for eNB RX procedures in TDD S-subframes.
@param phy_vars_eNB Pointer to eNB variables on which to act @param phy_vars_eNB Pointer to eNB variables on which to act
@param abstraction_flag Indicator of PHY abstraction
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
*/ */
void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type); void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type);
/*! \brief Scheduling for eNB PRACH RX procedures /*! \brief Scheduling for eNB PRACH RX procedures
@param phy_vars_eNB Pointer to eNB variables on which to act @param phy_vars_eNB Pointer to eNB variables on which to act
@param proc Pointer to RXn-TXnp4 proc information @param proc Pointer to RXn-TXnp4 proc information
@param abstraction_flag Indicator of PHY abstraction
*/ */
void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag); void prach_procedures(PHY_VARS_eNB *eNB);
/*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index.
@param frame_parms Pointer to DL frame parameter descriptor @param frame_parms Pointer to DL frame parameter descriptor
+137 -151
View File
@@ -180,7 +180,7 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *eNB)
int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
uint8_t i; uint8_t i;
int j,CC_id; int CC_id;
PHY_VARS_eNB *eNB; PHY_VARS_eNB *eNB;
for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
@@ -295,7 +295,7 @@ void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *eNB)
void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type) void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type)
{ {
UNUSED(r_type); UNUSED(r_type);
int subframe = proc->subframe_rx; int subframe = proc->subframe_rx;
@@ -305,7 +305,7 @@ void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t abs
#endif #endif
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
lte_eNB_I0_measurements(eNB, lte_eNB_I0_measurements(eNB,
subframe, subframe,
0, 0,
@@ -392,7 +392,7 @@ unsigned int taus(void);
DCI_PDU DCI_pdu_tmp; DCI_PDU DCI_pdu_tmp;
void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, int abstraction_flag,relaying_type_t r_type) { void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,relaying_type_t r_type) {
#ifdef Rel10 #ifdef Rel10
@@ -403,7 +403,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, in
int subframe = proc->subframe_tx; int subframe = proc->subframe_tx;
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
// This is DL-Cell spec pilots in Control region // This is DL-Cell spec pilots in Control region
generate_pilots_slot(eNB, generate_pilots_slot(eNB,
eNB->common_vars.txdataF[0], eNB->common_vars.txdataF[0],
@@ -464,9 +464,9 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, in
}// switch }// switch
if (mch_pduP) { if (mch_pduP) {
fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0);
// Generate PMCH // Generate PMCH
generate_mch(eNB,proc,(uint8_t*)mch_pduP->payload,abstraction_flag); generate_mch(eNB,proc,(uint8_t*)mch_pduP->payload);
} else { } else {
LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe); LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe);
} }
@@ -474,7 +474,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, in
#endif #endif
} }
void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstraction_flag) { void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
int **txdataF = eNB->common_vars.txdataF[0]; int **txdataF = eNB->common_vars.txdataF[0];
@@ -483,7 +483,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
int frame = proc->frame_tx; int frame = proc->frame_tx;
// generate Cell-Specific Reference Signals for both slots // generate Cell-Specific Reference Signals for both slots
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
generate_pilots_slot(eNB, generate_pilots_slot(eNB,
txdataF, txdataF,
@@ -502,7 +502,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
// First half of PSS/SSS (FDD, slot 0) // First half of PSS/SSS (FDD, slot 0)
if (subframe == 0) { if (subframe == 0) {
if ((fp->frame_type == FDD) && if ((fp->frame_type == FDD) &&
(abstraction_flag==0)) { (eNB->abstraction_flag==0)) {
generate_pss(txdataF, generate_pss(txdataF,
AMP, AMP,
fp, fp,
@@ -585,7 +585,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
/// First half of SSS (TDD, slot 1) /// First half of SSS (TDD, slot 1)
if ((fp->frame_type == TDD)&& if ((fp->frame_type == TDD)&&
(abstraction_flag==0)){ (eNB->abstraction_flag==0)){
generate_sss(txdataF, generate_sss(txdataF,
AMP, AMP,
fp, fp,
@@ -594,7 +594,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
} }
/// generate PBCH /// generate PBCH
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
generate_pbch(&eNB->pbch, generate_pbch(&eNB->pbch,
txdataF, txdataF,
AMP, AMP,
@@ -611,7 +611,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
} }
else if ((subframe == 1) && else if ((subframe == 1) &&
(fp->frame_type == TDD)&& (fp->frame_type == TDD)&&
(abstraction_flag==0)) { (eNB->abstraction_flag==0)) {
generate_pss(txdataF, generate_pss(txdataF,
AMP, AMP,
fp, fp,
@@ -622,7 +622,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
// Second half of PSS/SSS (FDD, slot 10) // Second half of PSS/SSS (FDD, slot 10)
else if ((subframe == 5) && else if ((subframe == 5) &&
(fp->frame_type == FDD) && (fp->frame_type == FDD) &&
(abstraction_flag==0)) { (eNB->abstraction_flag==0)) {
generate_pss(txdataF, generate_pss(txdataF,
AMP, AMP,
&eNB->frame_parms, &eNB->frame_parms,
@@ -639,7 +639,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
// Second-half of SSS (TDD, slot 11) // Second-half of SSS (TDD, slot 11)
else if ((subframe == 5) && else if ((subframe == 5) &&
(fp->frame_type == TDD) && (fp->frame_type == TDD) &&
(abstraction_flag==0)) { (eNB->abstraction_flag==0)) {
generate_sss(txdataF, generate_sss(txdataF,
AMP, AMP,
fp, fp,
@@ -650,7 +650,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr
// Second half of PSS (TDD, slot 12) // Second half of PSS (TDD, slot 12)
else if ((subframe == 6) && else if ((subframe == 6) &&
(fp->frame_type == TDD) && (fp->frame_type == TDD) &&
(abstraction_flag==0)) { (eNB->abstraction_flag==0)) {
generate_pss(txdataF, generate_pss(txdataF,
AMP, AMP,
fp, fp,
@@ -867,7 +867,7 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
} }
void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) { void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols) {
int frame=proc->frame_tx; int frame=proc->frame_tx;
int subframe=proc->subframe_tx; int subframe=proc->subframe_tx;
@@ -1025,7 +1025,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *d
#endif #endif
} }
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag); LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag);
// 36-212 // 36-212
@@ -1083,7 +1083,6 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *d
void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc, eNB_rxtx_proc_t *proc,
uint8_t abstraction_flag,
relaying_type_t r_type, relaying_type_t r_type,
PHY_VARS_RN *rn) PHY_VARS_RN *rn)
{ {
@@ -1145,7 +1144,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
} }
// clear the transmit data array for the current subframe // clear the transmit data array for the current subframe
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
for (aa=0; aa<fp->nb_antennas_tx_eNB; aa++) { for (aa=0; aa<fp->nb_antennas_tx_eNB; aa++) {
memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)],
0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t));
@@ -1153,11 +1152,11 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
} }
if (is_pmch_subframe(frame,subframe,fp)) { if (is_pmch_subframe(frame,subframe,fp)) {
pmch_procedures(eNB,proc,rn,abstraction_flag,r_type); pmch_procedures(eNB,proc,rn,r_type);
} }
else { else {
// this is not a pmch subframe, so generate PSS/SSS/PBCH // this is not a pmch subframe, so generate PSS/SSS/PBCH
common_signal_procedures(eNB,proc,abstraction_flag); common_signal_procedures(eNB,proc);
} }
#if defined(SMBV) #if defined(SMBV)
@@ -1283,7 +1282,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
eNB->num_common_dci[(subframe)&1]=0; eNB->num_common_dci[(subframe)&1]=0;
} }
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) { if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) {
LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,frame, subframe, LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,frame, subframe,
@@ -1316,7 +1315,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
if ((eNB->dlsch_SI) && (eNB->dlsch_SI->active == 1)) { if ((eNB->dlsch_SI) && (eNB->dlsch_SI->active == 1)) {
pdsch_procedures(eNB,proc,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols,abstraction_flag); pdsch_procedures(eNB,proc,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols);
#if defined(SMBV) #if defined(SMBV)
@@ -1349,7 +1348,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, eNB->ulsch[(uint32_t)UE_id]->Msg3_frame,
eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe);
pdsch_procedures(eNB,proc,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols,abstraction_flag); pdsch_procedures(eNB,proc,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols);
eNB->dlsch_ra->active = 0; eNB->dlsch_ra->active = 0;
@@ -1362,7 +1361,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
(eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&&
(eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) { (eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) {
pdsch_procedures(eNB,proc,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols,abstraction_flag); pdsch_procedures(eNB,proc,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols);
} }
@@ -1385,8 +1384,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
generate_phich_top(eNB, generate_phich_top(eNB,
proc, proc,
AMP, AMP,
0, 0);
abstraction_flag);
} }
@@ -1395,24 +1393,6 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
phy_procedures_emos_eNB_TX(subframe, eNB); phy_procedures_emos_eNB_TX(subframe, eNB);
#endif #endif
#if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW))
if (abstraction_flag==0)
{
start_meas(&eNB->ofdm_mod_stats);
do_OFDM_mod(eNB->common_vars.txdataF[0],
eNB->common_vars.txdata[0],
frame,subframe<<1,
fp);
do_OFDM_mod(eNB->common_vars.txdataF[0],
eNB->common_vars.txdata[0],
frame,1+(subframe<<1),
fp);
stop_meas(&eNB->ofdm_mod_stats);
}
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),0);
stop_meas(&eNB->phy_proc_tx); stop_meas(&eNB->phy_proc_tx);
@@ -1869,8 +1849,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB,
} }
} }
void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) void prach_procedures(PHY_VARS_eNB *eNB) {
{
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
uint16_t preamble_energy_list[64],preamble_delay_list[64]; uint16_t preamble_energy_list[64],preamble_delay_list[64];
@@ -1881,10 +1860,11 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag)
int frame = eNB->proc.frame_prach; int frame = eNB->proc.frame_prach;
uint8_t CC_id = eNB->CC_id; uint8_t CC_id = eNB->CC_id;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); memset(&preamble_energy_list[0],0,64*sizeof(uint16_t));
memset(&preamble_delay_list[0],0,64*sizeof(uint16_t)); memset(&preamble_delay_list[0],0,64*sizeof(uint16_t));
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id, LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id,
frame,subframe,dB_fixed(signal_energy(&eNB->common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_dB); frame,subframe,dB_fixed(signal_energy(&eNB->common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_dB);
@@ -1984,9 +1964,10 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag)
eNB->Mod_id,frame, subframe); eNB->Mod_id,frame, subframe);
} }
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
} }
void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid,const uint8_t abstraction_flag) { void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid) {
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0};
@@ -2059,7 +2040,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
eNB->UE_stats[UE_id].sr_total++; eNB->UE_stats[UE_id].sr_total++;
if (abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric0_SR = rx_pucch(eNB, metric0_SR = rx_pucch(eNB,
pucch_format1, pucch_format1,
UE_id, UE_id,
@@ -2115,7 +2096,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
@@ -2160,7 +2141,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
@@ -2236,7 +2217,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
#endif #endif
if (abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric0_SR = rx_pucch(eNB, metric0_SR = rx_pucch(eNB,
format, format,
UE_id, UE_id,
@@ -2268,7 +2249,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
// Check n1_pucch0 metric // Check n1_pucch0 metric
if (n1_pucch0 != -1) { if (n1_pucch0 != -1) {
if (abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric0 = rx_pucch(eNB, metric0 = rx_pucch(eNB,
format, format,
UE_id, UE_id,
@@ -2293,7 +2274,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
// Check n1_pucch1 metric // Check n1_pucch1 metric
if (n1_pucch1 != -1) { if (n1_pucch1 != -1) {
if (abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric1 = rx_pucch(eNB, metric1 = rx_pucch(eNB,
format, format,
UE_id, UE_id,
@@ -2350,7 +2331,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
} }
void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid,const uint8_t abstraction_flag) { void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid) {
uint8_t access_mode; uint8_t access_mode;
int num_active_cba_groups; int num_active_cba_groups;
@@ -2375,7 +2356,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p
UE_id, (uint16_t)eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->UE_stats[UE_id].mode]); UE_id, (uint16_t)eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->UE_stats[UE_id].mode]);
#endif #endif
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
rx_ulsch(eNB,proc, rx_ulsch(eNB,proc,
eNB->UE_stats[UE_id].sector, // this is the effective sector id eNB->UE_stats[UE_id].sector, // this is the effective sector id
UE_id, UE_id,
@@ -2392,7 +2373,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p
#endif #endif
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
ret = ulsch_decoding(eNB,proc, ret = ulsch_decoding(eNB,proc,
UE_id, UE_id,
0, // control_only_flag 0, // control_only_flag
@@ -2509,116 +2490,121 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p
} }
void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc) {
void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) {
int l; int l;
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
remove_7_5_kHz(eNB,proc->subframe_rx<<1);
remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1));
for (l=0; l<fp->symbols_per_tti/2; l++) {
slot_fep_ul(fp,
&eNB->common_vars,
l,
proc->subframe_rx<<1,
0,
0
);
slot_fep_ul(fp,
&eNB->common_vars,
l,
1+(proc->subframe_rx<<1),
0,
0
);
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0);
if (eNB->node_function == NGFI_RRU_IF4p5) {
/// **** send_IF4 of rxdataF to RCC (no prach now) **** ///
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );
send_IF4p5(eNB, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT, 0);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
}
}
void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc) {
uint8_t seqno=0;
/// **** 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);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );
}
void do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc) {
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
// check if we have to detect PRACH first
if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) {
/* accept some delay in processing - up to 5ms */
int i;
for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) {
LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach);
usleep(500);
}
if (proc->instance_cnt_prach == 0) {
exit_fun( "PRACH thread busy" );
return;
}
// wake up thread for PRACH RX
if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach );
exit_fun( "error locking mutex_prach" );
return;
}
++proc->instance_cnt_prach;
// set timing for prach thread
proc->frame_prach = proc->frame_rx;
proc->subframe_prach = proc->subframe_rx;
// the thread can now be woken up
if (pthread_cond_signal(&proc->cond_prach) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index);
exit_fun( "ERROR pthread_cond_signal" );
return;
}
pthread_mutex_unlock( &proc->mutex_prach );
}
}
void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){
eNB_proc_t *proc = &eNB->proc; eNB_proc_t *proc = &eNB->proc;
const int subframe = proc->subframe_rx; const int subframe = proc->subframe_rx;
const int frame = proc->frame_rx; const int frame = proc->frame_rx;
uint8_t seqno=0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 1 );
start_meas(&eNB->phy_proc_rx); start_meas(&eNB->phy_proc_rx);
#ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe); LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe);
#endif
if (abstraction_flag==0) {
if ((eNB->node_function == NGFI_RRU_IF4) || if (eNB->fep) eNB->fep(eNB,proc);
(eNB->node_function == eNodeB_3GPP) ||
(eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing
// now do common RX processing for first slot in subframe if (eNB->do_prach) eNB->do_prach(eNB,proc);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
remove_7_5_kHz(eNB,proc->subframe_rx<<1);
remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1));
for (l=0; l<fp->symbols_per_tti/2; l++) {
slot_fep_ul(fp,
&eNB->common_vars,
l,
proc->subframe_rx<<1,
0,
0
);
slot_fep_ul(fp,
&eNB->common_vars,
l,
1+(proc->subframe_rx<<1),
0,
0
);
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0);
if (eNB->node_function == NGFI_RRU_IF4) {
/// **** send_IF4 of rxdataF to RCC (no prach now) **** ///
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );
send_IF4(eNB, proc->frame_rx, proc->subframe_rx, IF4_PULFFT, 0);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
}
}
else if (eNB->node_function == NGFI_RRU_IF5) {
/// **** 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);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );
}
/// **** send_IF4 of prach to RCC **** /// done in prach thread (below)
// check if we have to detect PRACH first
if ((eNB->node_function != NGFI_RRU_IF5) &&
(is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0)) { // any other node must call prach procedure
/* accept some delay in processing - up to 5ms */
int i;
for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) {
LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach);
usleep(500);
}
if (proc->instance_cnt_prach == 0) {
exit_fun( "PRACH thread busy" );
return;
}
// wake up thread for PRACH RX
if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach );
exit_fun( "error locking mutex_prach" );
return;
}
++proc->instance_cnt_prach;
// set timing for prach thread
proc->frame_prach = proc->frame_rx;
proc->subframe_prach = proc->subframe_rx;
// the thread can now be woken up
if (pthread_cond_signal(&proc->cond_prach) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index);
exit_fun( "ERROR pthread_cond_signal" );
return;
}
pthread_mutex_unlock( &proc->mutex_prach );
}
} else { // grab transport channel information from network interface
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 0 );
} }
void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const uint8_t abstraction_flag,const relaying_type_t r_type) void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type)
{ {
//RX processing for ue-specific resources (i //RX processing for ue-specific resources (i
UNUSED(r_type); UNUSED(r_type);
@@ -2664,7 +2650,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
// Do PUCCH processing first // Do PUCCH processing first
for (i=0; i<NUMBER_OF_UE_MAX; i++) { for (i=0; i<NUMBER_OF_UE_MAX; i++) {
pucch_procedures(eNB,proc,i,harq_pid,abstraction_flag); pucch_procedures(eNB,proc,i,harq_pid);
} }
for (i=0; i<NUMBER_OF_UE_MAX; i++) { for (i=0; i<NUMBER_OF_UE_MAX; i++) {
@@ -2749,7 +2735,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch[i]->harq_processes[harq_pid]->mcs; eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch[i]->harq_processes[harq_pid]->mcs;
start_meas(&eNB->ulsch_demodulation_stats); start_meas(&eNB->ulsch_demodulation_stats);
if (abstraction_flag==0) { if (eNB->abstraction_flag==0) {
rx_ulsch(eNB,proc, rx_ulsch(eNB,proc,
eNB->UE_stats[i].sector, // this is the effective sector id eNB->UE_stats[i].sector, // this is the effective sector id
i, i,
@@ -2770,7 +2756,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
start_meas(&eNB->ulsch_decoding_stats); start_meas(&eNB->ulsch_decoding_stats);
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
ret = ulsch_decoding(eNB,proc, ret = ulsch_decoding(eNB,proc,
i, i,
0, // control_only_flag 0, // control_only_flag
@@ -3082,7 +3068,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
} // Msg3_flag == 0 } // Msg3_flag == 0
// estimate timing advance for MAC // estimate timing advance for MAC
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
sync_pos = lte_est_timing_advance_pusch(eNB,i); sync_pos = lte_est_timing_advance_pusch(eNB,i);
eNB->UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check eNB->UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check
} }
@@ -3169,10 +3155,10 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
} }
// CBA (non-LTE) // CBA (non-LTE)
cba_procedures(eNB,proc,i,harq_pid,abstraction_flag); cba_procedures(eNB,proc,i,harq_pid);
} // loop i=0 ... NUMBER_OF_UE_MAX-1 } // loop i=0 ... NUMBER_OF_UE_MAX-1
if (abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
lte_eNB_I0_measurements(eNB, lte_eNB_I0_measurements(eNB,
subframe, subframe,
0, 0,
+6 -4
View File
@@ -887,10 +887,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP; enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP;
} else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) { } else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) {
enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP_BBU; enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP_BBU;
} else if (strcmp(cc_node_function, "NGFI_RCC_IF4") == 0) { } else if (strcmp(cc_node_function, "NGFI_RCC_IF4p5") == 0) {
enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RCC_IF4; enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RCC_IF4p5;
} else if (strcmp(cc_node_function, "NGFI_RRU_IF4") == 0) { } else if (strcmp(cc_node_function, "NGFI_RAU_IF4p5") == 0) {
enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF4; enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RAU_IF4p5;
} else if (strcmp(cc_node_function, "NGFI_RRU_IF4p5") == 0) {
enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF4p5;
} else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) { } else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) {
enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF5; enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF5;
} else { } else {
+16 -16
View File
@@ -201,7 +201,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi
int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
int nblocks = nsamps; int nblocks = nsamps;
int bytes_sent = 0; int bytes_sent = 0;
@@ -211,14 +211,14 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp,
ssize_t packet_size; ssize_t packet_size;
if (flags == IF4_PDLFFT) { if (flags == IF4p5_PDLFFT) {
packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks);
} else if (flags == IF4_PULFFT) { } else if (flags == IF4p5_PULFFT) {
packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks);
} else if (flags == IF5_MOBIPASS) { } else if (flags == IF5_MOBIPASS) {
packet_size = RAW_IF5_MOBIPASS_SIZE_BYTES; packet_size = RAW_IF5_MOBIPASS_SIZE_BYTES;
} else { } else {
packet_size = RAW_IF4_PRACH_SIZE_BYTES; packet_size = RAW_IF4p5_PRACH_SIZE_BYTES;
} }
eth->tx_nsamps = nblocks; eth->tx_nsamps = nblocks;
@@ -304,7 +304,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi
int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) {
// Read nblocks info from packet itself // Read nblocks info from packet itself
int nblocks = nsamps; int nblocks = nsamps;
@@ -312,8 +312,8 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp,
eth_state_t *eth = (eth_state_t*)device->priv; eth_state_t *eth = (eth_state_t*)device->priv;
int Mod_id = device->Mod_id; int Mod_id = device->Mod_id;
ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t; ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t;
IF4_header_t *test_header = (IF4_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES);
bytes_received = recv(eth->sockfd[Mod_id], bytes_received = recv(eth->sockfd[Mod_id],
buff[0], buff[0],
@@ -327,12 +327,12 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp,
*timestamp = test_header->sub_type; *timestamp = test_header->sub_type;
if (test_header->sub_type == IF4_PDLFFT) { if (test_header->sub_type == IF4p5_PDLFFT) {
packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks);
} else if (test_header->sub_type == IF4_PULFFT) { } else if (test_header->sub_type == IF4p5_PULFFT) {
packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks);
} else { } else {
packet_size = RAW_IF4_PRACH_SIZE_BYTES; packet_size = RAW_IF4p5_PRACH_SIZE_BYTES;
} }
while(bytes_received < packet_size) { while(bytes_received < packet_size) {
@@ -387,7 +387,7 @@ int eth_set_dev_conf_raw(openair0_device *device) {
int eth_set_dev_conf_raw_IF4(openair0_device *device) { int eth_set_dev_conf_raw_IF4p5(openair0_device *device) {
// use for cc_id info // use for cc_id info
int Mod_id = device->Mod_id; int Mod_id = device->Mod_id;
@@ -448,7 +448,7 @@ int eth_get_dev_conf_raw(openair0_device *device) {
} }
int eth_get_dev_conf_raw_IF4(openair0_device *device) { int eth_get_dev_conf_raw_IF4p5(openair0_device *device) {
// use for cc_id info // use for cc_id info
eth_state_t *eth = (eth_state_t*)device->priv; eth_state_t *eth = (eth_state_t*)device->priv;
@@ -73,27 +73,27 @@ 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_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1;
} else if (eth->flags == ETH_RAW_IF4_MODE) { } else if (eth->flags == ETH_RAW_IF4p5_MODE) {
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*/
if (device->host_type == BBU_HOST) { if (device->host_type == BBU_HOST) {
if(eth_set_dev_conf_raw_IF4(device)!=0) return -1; if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1;
} else { } else {
if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; if(eth_get_dev_conf_raw_IF4p5(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_IF4_PRACH_SIZE_BYTES)!=0) return -1; if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1;
} else if (eth->flags == ETH_UDP_IF4_MODE) { } else if (eth->flags == ETH_UDP_IF4p5_MODE) {
} else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) {
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*/
//if (device->host_type == BBU_HOST) { //if (device->host_type == BBU_HOST) {
//if(eth_set_dev_conf_raw_IF4(device)!=0) return -1; //if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1;
//} else { //} else {
//if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; //if(eth_get_dev_conf_raw_IF4p5(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(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1;
@@ -339,9 +339,9 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth
} else if (eth_params->transp_preference == 0) { } else if (eth_params->transp_preference == 0) {
eth->flags = ETH_UDP_MODE; eth->flags = ETH_UDP_MODE;
} else if (eth_params->transp_preference == 3) { } else if (eth_params->transp_preference == 3) {
eth->flags = ETH_RAW_IF4_MODE; eth->flags = ETH_RAW_IF4p5_MODE;
} else if (eth_params->transp_preference == 2) { } else if (eth_params->transp_preference == 2) {
eth->flags = ETH_UDP_IF4_MODE; eth->flags = ETH_UDP_IF4p5_MODE;
} else if (eth_params->transp_preference == 4) { } else if (eth_params->transp_preference == 4) {
eth->flags = ETH_RAW_IF5_MOBIPASS; eth->flags = ETH_RAW_IF5_MOBIPASS;
} else { } else {
@@ -368,15 +368,15 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth
} else if (eth->flags == ETH_UDP_MODE) { } else if (eth->flags == ETH_UDP_MODE) {
device->trx_write_func = trx_eth_write_udp; device->trx_write_func = trx_eth_write_udp;
device->trx_read_func = trx_eth_read_udp; device->trx_read_func = trx_eth_read_udp;
} else if (eth->flags == ETH_RAW_IF4_MODE) { } else if (eth->flags == ETH_RAW_IF4p5_MODE) {
device->trx_write_func = trx_eth_write_raw_IF4; device->trx_write_func = trx_eth_write_raw_IF4p5;
device->trx_read_func = trx_eth_read_raw_IF4; device->trx_read_func = trx_eth_read_raw_IF4p5;
} else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) {
device->trx_write_func = trx_eth_write_raw_IF4; device->trx_write_func = trx_eth_write_raw_IF4p5;
device->trx_read_func = trx_eth_read_raw_IF4; device->trx_read_func = trx_eth_read_raw_IF4p5;
} else { } else {
//device->trx_write_func = trx_eth_write_udp_IF4; //device->trx_write_func = trx_eth_write_udp_IF4p5;
//device->trx_read_func = trx_eth_read_udp_IF4; //device->trx_read_func = trx_eth_read_udp_IF4p5;
} }
eth->if_name[device->Mod_id] = eth_params->local_if_name; eth->if_name[device->Mod_id] = eth_params->local_if_name;
@@ -222,11 +222,11 @@ int eth_set_dev_conf_udp(openair0_device *device);
int eth_socket_init_raw(openair0_device *device); int eth_socket_init_raw(openair0_device *device);
int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
int eth_get_dev_conf_raw(openair0_device *device); int eth_get_dev_conf_raw(openair0_device *device);
int eth_set_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device);
int eth_get_dev_conf_raw_IF4(openair0_device *device); int eth_get_dev_conf_raw_IF4p5(openair0_device *device);
int eth_set_dev_conf_raw_IF4(openair0_device *device); int eth_set_dev_conf_raw_IF4p5(openair0_device *device);
#endif #endif
@@ -47,8 +47,8 @@
// ETH transport preference modes // ETH transport preference modes
#define ETH_UDP_MODE 0 #define ETH_UDP_MODE 0
#define ETH_RAW_MODE 1 #define ETH_RAW_MODE 1
#define ETH_UDP_IF4_MODE 2 #define ETH_UDP_IF4p5_MODE 2
#define ETH_RAW_IF4_MODE 3 #define ETH_RAW_IF4p5_MODE 3
#define ETH_RAW_IF5_MOBIPASS 4 #define ETH_RAW_IF5_MOBIPASS 4
// Time domain RRH packet sizes // Time domain RRH packet sizes
@@ -58,13 +58,13 @@
#define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) #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 RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps))
// Packet sizes for IF4 interface format // Packet sizes for IF4p5 interface format
#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks)
#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed) #define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed)
#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks))
#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks))
#define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + PRACH_BLOCK_SIZE_BYTES) #define RAW_IF4p5_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES)
// Mobipass packet sizes // Mobipass packet sizes
#define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280 #define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280
+469 -408
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -1056,9 +1056,9 @@ static void get_options (int argc, char **argv)
if (enb_properties->properties[i]->rrh_gw_config[j].raw == 1) { if (enb_properties->properties[i]->rrh_gw_config[j].raw == 1) {
(eth_params+j)->transp_preference = ETH_RAW_MODE; (eth_params+j)->transp_preference = ETH_RAW_MODE;
} else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4 == 1) { } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4 == 1) {
(eth_params+j)->transp_preference = ETH_RAW_IF4_MODE; (eth_params+j)->transp_preference = ETH_RAW_IF4p5_MODE;
} else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) { } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) {
(eth_params+j)->transp_preference = ETH_UDP_IF4_MODE; (eth_params+j)->transp_preference = ETH_UDP_IF4p5_MODE;
} else if (enb_properties->properties[i]->rrh_gw_config[j].rawif5_mobipass == 1) { } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif5_mobipass == 1) {
(eth_params+j)->transp_preference = ETH_RAW_IF5_MOBIPASS; (eth_params+j)->transp_preference = ETH_RAW_IF5_MOBIPASS;
} else { } else {
@@ -1645,7 +1645,7 @@ int main( int argc, char **argv )
if (UE_flag == 0) { if (UE_flag == 0) {
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
if (node_function[CC_id] == NGFI_RRU_IF4 || node_function[CC_id] == NGFI_RRU_IF5) { if (node_function[CC_id] == NGFI_RRU_IF4p5 || node_function[CC_id] == NGFI_RRU_IF5) {
PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = RRH_HOST; PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = RRH_HOST;
PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST;
} else { } else {
@@ -1667,7 +1667,7 @@ int main( int argc, char **argv )
// Load RF device and initialize // Load RF device and initialize
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
if (node_function[CC_id] == NGFI_RRU_IF5 || node_function[CC_id] == NGFI_RRU_IF4 || node_function[CC_id] == eNodeB_3GPP) { if (node_function[CC_id] == NGFI_RRU_IF5 || node_function[CC_id] == NGFI_RRU_IF4p5 || node_function[CC_id] == eNodeB_3GPP) {
if (mode!=loop_through_memory) { if (mode!=loop_through_memory) {
returns= (UE_flag == 0) ? returns= (UE_flag == 0) ?
openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]) : openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]) :