Merge remote-tracking branch 'origin/develop' into develop-nos1-fixes
Conflicts: cmake_targets/CMakeLists.txt openair1/PHY/LTE_TRANSPORT/dci_tools.c openair2/RRC/LITE/rrc_UE.c
This commit is contained in:
@@ -1,121 +0,0 @@
|
||||
# command line flags are automatically exported and thus passed down to any sub-make.
|
||||
# here we set the default flags in case on command line flags are provided
|
||||
# these flags have to be explicitely exported so that the sub-make is aware of them
|
||||
|
||||
|
||||
include $(OPENAIR_DIR)/common/utils/Makefile.inc
|
||||
ifndef OPENAIR_LTE
|
||||
export OPENAIR_LTE=1
|
||||
endif
|
||||
|
||||
ifndef OPENAIR1
|
||||
export OPENAIR1=1
|
||||
endif
|
||||
|
||||
ifndef OPENAIR2
|
||||
export OPENAIR2=0
|
||||
endif
|
||||
|
||||
ifndef EMOS
|
||||
export EMOS=0
|
||||
endif
|
||||
|
||||
ifndef FIRMWARE2010
|
||||
export FIRMWARE2010=0
|
||||
endif
|
||||
|
||||
all: openair_rf_cbmimo1_softmodem.ko asn1_msg_kern.ko
|
||||
|
||||
openair_rf_cbmimo1_softmodem.ko:
|
||||
(cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 && mv openair_rf.ko openair_rf_softmodem.ko)
|
||||
|
||||
oai_user_cbmimo1.ko:
|
||||
(cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 BIT8_TX=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko openair_rf_softmodem.ko)
|
||||
|
||||
oai_user_exmimo.ko:
|
||||
(cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko openair_rf_softmodem.ko)
|
||||
|
||||
asn1_msg_kern.ko:
|
||||
(cd ../openair2/RRC/LITE/MESSAGES && $(MAKE) -C $(KERNEL_DIR) V=0 M=`pwd` RTAI=1 -j2)
|
||||
|
||||
#Remove all but source files
|
||||
cleanall:
|
||||
find -name '*.o' -delete -print; \
|
||||
find -name '*.ko' -delete -print; \
|
||||
find -name '*.bak' -delete -print; \
|
||||
find -name '*.cmd' -delete -print; \
|
||||
find -name '*~' -delete -print; \
|
||||
find -name octave-core -delete -print; \
|
||||
|
||||
#Remove files created by SVN, dangerous!!! DO NOT RUN ON YOUR WORKING REPOSITORY!
|
||||
#FK: Don't do this! Use svn export instead.
|
||||
#cleansvn:
|
||||
# rm -rf `find -name *.svn* -print`; \
|
||||
# find -name *.svn* -delete -print
|
||||
|
||||
tgz:
|
||||
mkdir /tmp/openair1_tmp; \
|
||||
$(MAKE) cleanall; \
|
||||
cp -r . /tmp/openair1_tmp; \
|
||||
(cd /tmp/openair1_tmp && $(MAKE) cleansvn && cd .. && tar czfv openair1.tgz openair1_tmp) ; \
|
||||
cp /tmp/openair1.tgz . ;\
|
||||
rm -rf /tmp/openair1_tmp
|
||||
|
||||
fifos:
|
||||
@for i in `seq 0 64`;\
|
||||
do \
|
||||
have_rtfX=`ls /dev/ |grep -c rtf$$i`;\
|
||||
if [ "$$have_rtfX" -eq 0 ] ;then \
|
||||
mknod -m 666 /dev/rtf$$i c 150 $$i; \
|
||||
fi;\
|
||||
done
|
||||
|
||||
openair0:
|
||||
mknod /dev/openair0 c 127 0
|
||||
chmod a+rw /dev/openair0
|
||||
|
||||
install_oai_user:
|
||||
make fifos
|
||||
insmod ARCH/CBMIMO1/DEVICE_DRIVER/openair_rf_softmodem.ko
|
||||
|
||||
updatefw:
|
||||
USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr_exmimo2/main -s 0x43fffff0
|
||||
|
||||
boot_exmimo:
|
||||
sudo make install_oai_user
|
||||
USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0
|
||||
sudo rmmod openair_rf
|
||||
sudo make install_oai_user
|
||||
|
||||
reboot_exmimo:
|
||||
USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 -b
|
||||
rmmod openair_rf
|
||||
make install_oai_user
|
||||
USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0
|
||||
rmmod openair_rf
|
||||
make install_oai_user
|
||||
|
||||
install_softmodem:
|
||||
make fifos
|
||||
ifeq ($(OPENAIR2),1)
|
||||
insmod ../openair2/RRC/LITE/MESSAGES/asn1_msg_kern.ko
|
||||
endif
|
||||
insmod ARCH/CBMIMO1/DEVICE_DRIVER/openair_rf_softmodem.ko ; \
|
||||
|
||||
remove:
|
||||
rmmod openair_rf
|
||||
ifeq ($(OPENAIR2),1)
|
||||
rmmod asn1_msg_kern
|
||||
endif
|
||||
|
||||
test:
|
||||
(cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) test RTAI=1 CBMIMO1=1)
|
||||
(cd ../openair2/RRC/LITE/MESSAGES && $(MAKE) test)
|
||||
|
||||
clean: clean_l1
|
||||
|
||||
clean_l1:
|
||||
(cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) clean RTAI=1 CBMIMO1=1)
|
||||
|
||||
clean_asn1:
|
||||
(cd ../openair2/RRC/LITE/MESSAGES && $(MAKE) clean)
|
||||
@@ -5,7 +5,7 @@ RATE12CC_SRC = ccoding_byte.c viterbi.c crc_byte.c
|
||||
all: 3gpplte_sse
|
||||
|
||||
3gpplte_sse: $(TURBO_SRC)
|
||||
gcc -O3 -gdwarf-2 -mfloat-abi=hard -mfpu=neon -lm -lgcc -lrt ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DTC_MAIN -DNB_ANTENNAS_RX=1 -o 3gpplte_sse 3gpplte_sse.c -Wall -g -ggdb -DTC_MAIN
|
||||
gcc -O3 -gdwarf-2 -mfloat-abi=hard -mfpu=neon -lm -lgcc -lrt ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DTC_MAIN -DNB_ANTENNAS_RX=1 -o 3gpplte_sse 3gpplte_sse.c -Wall -g -ggdb -DTC_MAIN
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
|
||||
CFLAGS += -DNODE_RG -DUSER_MODE -DPC_TARGET -DNO_UL_REF -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DOPENAIR_LTE -DMAX_NUM_CCs=1
|
||||
CFLAGS += -DNODE_RG -DNO_UL_REF -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DOPENAIR_LTE -DMAX_NUM_CCs=1
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
|
||||
@@ -31,13 +31,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifndef USER_MODE
|
||||
#define __NO_VERSION__
|
||||
|
||||
#endif
|
||||
|
||||
//#include "PHY/types.h"
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
|
||||
|
||||
@@ -29,11 +29,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef NO_OPENAIR1
|
||||
#include "PHY/defs.h"
|
||||
#else
|
||||
#include "PHY/TOOLS/time_meas.h"
|
||||
#endif
|
||||
|
||||
#define CRC24_A 0
|
||||
#define CRC24_B 1
|
||||
|
||||
@@ -28,10 +28,6 @@
|
||||
date: 21.10.2009
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#ifndef TEST_DEBUG
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
@@ -126,7 +122,7 @@ void print_shorts(__m128i x,char *s) {
|
||||
|
||||
}
|
||||
*/
|
||||
#endif // USER_MODE
|
||||
#endif // DEBUG_VITERBI
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
*/
|
||||
|
||||
/*!\brief Initilization and reconfiguration routines for LTE PHY */
|
||||
#ifndef USER_MODE
|
||||
#define __NO_VERSION__
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "MAC_INTERFACE/extern.h"
|
||||
|
||||
@@ -23,12 +23,6 @@
|
||||
#define __LTE_ESTIMATION_DEFS__H__
|
||||
|
||||
#include "PHY/defs.h"
|
||||
/*
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
*/
|
||||
|
||||
/** @addtogroup _PHY_PARAMETER_ESTIMATION_BLOCKS_
|
||||
* @{
|
||||
*/
|
||||
@@ -136,18 +130,6 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
int subframe,
|
||||
unsigned char l);
|
||||
|
||||
/*
|
||||
#ifdef EMOS
|
||||
int lte_dl_channel_estimation_emos(int dl_ch_estimates_emos[NB_ANTENNAS_RX*NB_ANTENNAS_TX][N_RB_DL_EMOS*N_PILOTS_PER_RB*N_SLOTS_EMOS],
|
||||
int **rxdataF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
unsigned char l,
|
||||
unsigned char sector);
|
||||
#endif
|
||||
*/
|
||||
|
||||
/*!
|
||||
\brief Frequency offset estimation for LTE
|
||||
We estimate the frequency offset by calculating the phase difference between channel estimates for symbols carrying pilots (l==0 or l==3/4). We take a moving average of the phase difference.
|
||||
|
||||
@@ -149,10 +149,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int temp, i, aa, max_pos = 0,ind;
|
||||
int max_val=0;
|
||||
short Re,Im,ncoef;
|
||||
#ifdef USER_MODE
|
||||
#ifdef DEBUG_PHY
|
||||
char fname[100],vname[100];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
ncoef = 32768 - coef;
|
||||
@@ -187,12 +185,10 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
1);
|
||||
break;
|
||||
}
|
||||
#ifdef USER_MODE
|
||||
#ifdef DEBUG_PHY
|
||||
sprintf(fname,"srs_ch_estimates_time_%d%d.m",ind,aa);
|
||||
sprintf(vname,"srs_time_%d%d",ind,aa);
|
||||
write_output(fname,vname,lte_eNB_srs->srs_ch_estimates_time[aa],frame_parms->ofdm_symbol_size*2,2,1);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -19,9 +19,7 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "filt16_32.h"
|
||||
|
||||
@@ -19,9 +19,7 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
#include "SCHED/defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
|
||||
// TODO: make channel estimation possible for multiple sectors (Gold sequences for pilots)
|
||||
|
||||
//#define DEBUG_CH
|
||||
int lte_dl_channel_estimation_emos(int dl_ch_estimates_emos[NB_ANTENNAS_RX*NB_ANTENNAS_TX][N_RB_DL_EMOS*N_PILOTS_PER_RB*N_SLOTS_EMOS],
|
||||
int **rxdataF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
unsigned char l,
|
||||
unsigned char sector)
|
||||
{
|
||||
|
||||
int pilot[2][200] __attribute__((aligned(16)));
|
||||
unsigned char nu,aarx;
|
||||
unsigned short k;
|
||||
unsigned int rb,pilot_cnt;
|
||||
short ch[2],*pil,*rxF,*dl_ch,*dl_ch_prev; //*f,*f2,*fl,*f2l2,*fr,*f2r2;
|
||||
int ch_offset,symbol_offset;
|
||||
unsigned int n;
|
||||
int i;
|
||||
|
||||
unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame
|
||||
|
||||
if ((p==0) && (l==0) )
|
||||
nu = 0;
|
||||
else if ((p==0) && (l>0))
|
||||
nu = 3;
|
||||
else if ((p==1) && (l==0))
|
||||
nu = 3;
|
||||
else if ((p==1) && (l>0))
|
||||
nu = 0;
|
||||
else {
|
||||
msg("lte_dl_channel_estimation_emos: p %d, l %d -> ERROR\n",p,l);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if (sector > 2) {
|
||||
msg("lte_dl_channel_estimation_emos: sector must be 0,1, or 2\n");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
switch (Ns) {
|
||||
case 0:
|
||||
ch_offset = ((l==0)?0:1)*2*frame_parms->N_RB_DL;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
ch_offset = ((l==0)?2:3)*2*frame_parms->N_RB_DL;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
ch_offset = ((l==0)?4:5)*2*frame_parms->N_RB_DL;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
ch_offset = ((l==0)?6:7)*2*frame_parms->N_RB_DL;
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("lte_dl_channel_estimation_emos: Ns must be 0, 1, 12, or 13\n");
|
||||
return(-1);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
symbol_offset = symbol*frame_parms->ofdm_symbol_size; // offset within rxdataF
|
||||
|
||||
k = nu + sector;
|
||||
|
||||
if (k > 6)
|
||||
k -=6;
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
printf("Channel Estimation : ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d, symbol=%d\n",ch_offset,frame_parms->ofdm_symbol_size,frame_parms->Ncp,l,Ns,k,symbol);
|
||||
#endif
|
||||
|
||||
// generate pilot
|
||||
lte_dl_cell_spec_rx(&pilot[p][0],
|
||||
frame_parms,
|
||||
Ns,
|
||||
(l==0)?0:1,
|
||||
p);
|
||||
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
pil = (short *)&pilot[p][0];
|
||||
rxF = (short *)&rxdataF[aarx][((symbol_offset+k+frame_parms->first_carrier_offset)<<1)];
|
||||
dl_ch = (short *)&dl_ch_estimates_emos[(p<<1)+aarx][ch_offset];
|
||||
memset(dl_ch,0,frame_parms->N_RB_DL);
|
||||
|
||||
for (pilot_cnt=0; pilot_cnt<frame_parms->N_RB_DL; pilot_cnt++) {
|
||||
|
||||
dl_ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
dl_ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
|
||||
pil+=2; // Re Im
|
||||
rxF+=24; // remember replicated format (Re0 Im0 Re0 Im0) !!!
|
||||
dl_ch+=2;
|
||||
|
||||
}
|
||||
|
||||
// printf("Second half\n");
|
||||
// Second half of RBs
|
||||
rxF = (short *)&rxdataF[aarx][((symbol_offset+1+k)<<1)];
|
||||
|
||||
for (pilot_cnt=0; pilot_cnt<frame_parms->N_RB_DL; pilot_cnt++) {
|
||||
|
||||
|
||||
dl_ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
dl_ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
|
||||
pil+=2;
|
||||
rxF+=24;
|
||||
dl_ch+=2;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -19,9 +19,7 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
|
||||
@@ -578,30 +578,3 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
|
||||
|
||||
}
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
#include "SIMULATION/TOOLS/defs.h"
|
||||
#include "SIMULATION/RF/defs.h"
|
||||
//extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
|
||||
|
||||
int lte_sync_time_eNB_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t sect_id,
|
||||
int32_t *sync_val)
|
||||
{
|
||||
|
||||
uint8_t UE_id;
|
||||
uint8_t CC_id = phy_vars_eNB->CC_id;
|
||||
|
||||
LOG_E(PHY,"[PHY] EMUL lte_sync_time_eNB_emul eNB %d, sect_id %d\n",phy_vars_eNB->Mod_id,sect_id);
|
||||
*sync_val = 0;
|
||||
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
//LOG_E(PHY,"[PHY] EMUL : eNB %d checking UE %d (PRACH %d) PL %d dB\n",phy_vars_eNB->Mod_id,UE_id,PHY_vars_UE_g[UE_id]->generate_prach,UE2eNB[UE_id][phy_vars_eNB->Mod_id]->path_loss_dB);
|
||||
if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach == 1) && (phy_vars_eNB->Mod_id == (UE_id % NB_eNB_INST))) {
|
||||
*sync_val = 1;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
return(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
|
||||
int16_t cond_num_threshold = 0;
|
||||
|
||||
#ifdef USER_MODE
|
||||
void print_shorts(char *s,short *x)
|
||||
{
|
||||
|
||||
@@ -57,8 +56,6 @@ void print_ints(char *s,int *x)
|
||||
);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
|
||||
{
|
||||
|
||||
@@ -91,7 +91,6 @@ int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32)));
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+Ns]) % 12;
|
||||
|
||||
#if defined(USER_MODE)
|
||||
Msc_idx_ptr = (uint16_t*) bsearch(&Msc_RS, dftsizes, 33, sizeof(uint16_t), compareints);
|
||||
|
||||
if (Msc_idx_ptr)
|
||||
@@ -101,26 +100,14 @@ int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32)));
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#else
|
||||
uint8_t b;
|
||||
|
||||
for (b=0; b<33; b++)
|
||||
if (Msc_RS==dftsizes[b])
|
||||
Msc_RS_idx = b;
|
||||
|
||||
#endif
|
||||
|
||||
// LOG_I(PHY,"subframe %d, Ns %d, l %d, Msc_RS = %d, Msc_RS_idx = %d, u %d, v %d, cyclic_shift %d\n",subframe,Ns,l,Msc_RS, Msc_RS_idx,u,v,cyclic_shift);
|
||||
#ifdef DEBUG_CH
|
||||
|
||||
#ifdef USER_MODE
|
||||
|
||||
if (Ns==0)
|
||||
write_output("drs_seq0.m","drsseq0",ul_ref_sigs_rx[u][v][Msc_RS_idx],2*Msc_RS,2,1);
|
||||
else
|
||||
write_output("drs_seq1.m","drsseq1",ul_ref_sigs_rx[u][v][Msc_RS_idx],2*Msc_RS,2,1);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -489,12 +476,10 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
15,
|
||||
0);
|
||||
|
||||
#ifdef USER_MODE
|
||||
#ifdef DEBUG_SRS
|
||||
sprintf(fname,"srs_ch_est%d.m",aa);
|
||||
sprintf(vname,"srs_est%d",aa);
|
||||
write_output(fname,vname,srs_vars->srs_ch_estimates[aa],frame_parms->ofdm_symbol_size,1,1);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -19,10 +19,8 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
@@ -21,10 +21,8 @@
|
||||
|
||||
// 6.10.2.2 MBSFN reference signals Mapping to resource elements
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
@@ -30,10 +30,8 @@
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
@@ -29,11 +29,9 @@
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "SCHED/defs.h"
|
||||
@@ -4240,33 +4238,3 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
|
||||
return(dci_cnt);
|
||||
}
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **pdcch_vars,
|
||||
uint8_t num_ue_spec_dci,
|
||||
uint8_t num_common_dci,
|
||||
DCI_ALLOC_t *dci_alloc_tx,
|
||||
DCI_ALLOC_t *dci_alloc_rx,
|
||||
int16_t eNB_id)
|
||||
{
|
||||
|
||||
uint8_t dci_cnt=0,i;
|
||||
|
||||
memcpy(dci_alloc_rx,dci_alloc_tx,num_common_dci*sizeof(DCI_ALLOC_t));
|
||||
dci_cnt = num_common_dci;
|
||||
LOG_D(PHY,"[DCI][EMUL] : num_common_dci %d\n",num_common_dci);
|
||||
|
||||
for (i=num_common_dci; i<(num_ue_spec_dci+num_common_dci); i++) {
|
||||
LOG_D(PHY,"[DCI][EMUL] Checking dci %d => %x format %d (bit 0 %d)\n",i,pdcch_vars[eNB_id]->crnti,dci_alloc_tx[i].format,
|
||||
dci_alloc_tx[i].dci_pdu[0]&0x80);
|
||||
|
||||
if (dci_alloc_tx[i].rnti == pdcch_vars[eNB_id]->crnti) {
|
||||
memcpy(dci_alloc_rx+dci_cnt,dci_alloc_tx+i,sizeof(DCI_ALLOC_t));
|
||||
dci_cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(dci_cnt);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -247,6 +247,7 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
|
||||
Mdlharq = dlsch->Mdlharq;
|
||||
dlsch->rnti = 0;
|
||||
dlsch->active = 0;
|
||||
dlsch->harq_mask = 0;
|
||||
|
||||
for (i=0; i<10; i++)
|
||||
dlsch->harq_ids[i] = Mdlharq;
|
||||
|
||||
@@ -758,318 +758,3 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
#include "SIMULATION/TOOLS/defs.h"
|
||||
#ifdef OPENAIR2
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#endif
|
||||
|
||||
int dlsch_abstraction_EESM(double* sinr_dB, uint8_t TM, uint32_t rb_alloc[4], uint8_t mcs, uint8_t dl_power_off)
|
||||
{
|
||||
|
||||
int ii;
|
||||
double sinr_eff = 0;
|
||||
int rb_count = 0;
|
||||
int offset;
|
||||
double bler = 0;
|
||||
|
||||
if(TM==5 && dl_power_off==1) {
|
||||
//do nothing -- means there is no second UE and TM 5 is behaving like TM 6 for a singal user
|
||||
} else
|
||||
TM = TM-1;
|
||||
|
||||
for (offset = 0; offset <= 24; offset++) {
|
||||
if (rb_alloc[0] & (1<<offset)) {
|
||||
rb_count++;
|
||||
|
||||
for(ii=0; ii<12; ii++) {
|
||||
sinr_eff += exp(-(pow(10, 0.1*(sinr_dB[(offset*12)+ii])))/beta1_dlsch[TM][mcs]);
|
||||
//printf("sinr_eff1 = %f, power %lf\n",sinr_eff, exp(-pow(10,6.8)));
|
||||
|
||||
// sinr_eff += exp(-(pow(10, (sinr_dB[offset*2+1])/10))/beta1_dlsch[TM][mcs]);
|
||||
//printf("sinr_dB[%d]=%f\n",offset,sinr_dB[offset*2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LOG_D(OCM,"sinr_eff (lin, unweighted) = %f\n",sinr_eff);
|
||||
sinr_eff = -beta2_dlsch[TM][mcs]*log((sinr_eff)/(12*rb_count));
|
||||
LOG_D(OCM,"sinr_eff (lin, weighted) = %f\n",sinr_eff);
|
||||
sinr_eff = 10 * log10(sinr_eff);
|
||||
LOG_D(OCM,"sinr_eff (dB) = %f\n",sinr_eff);
|
||||
|
||||
bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]);
|
||||
|
||||
#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
|
||||
|
||||
if (uniformrandom() < bler) {
|
||||
LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM);
|
||||
return(1);
|
||||
} else {
|
||||
LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM);
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
int dlsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint32_t rb_alloc[4], uint8_t mcs,uint8_t dl_power_off)
|
||||
{
|
||||
int ii;
|
||||
double sinr_eff = 0;
|
||||
double x = 0;
|
||||
double I =0;
|
||||
double qpsk_max=12.2;
|
||||
double qam16_max=19.2;
|
||||
double qam64_max=25.2;
|
||||
double sinr_min = -20;
|
||||
int rb_count = 0;
|
||||
int offset=0;
|
||||
double bler = 0;
|
||||
|
||||
if(TM==5 && dl_power_off==1) {
|
||||
//do nothing -- means there is no second UE and TM 5 is behaving like TM 6 for a singal user
|
||||
} else
|
||||
TM = TM-1;
|
||||
|
||||
|
||||
for (offset = 0; offset <= 24; offset++) {
|
||||
if (rb_alloc[0] & (1<<offset)) {
|
||||
rb_count++;
|
||||
|
||||
for(ii=0; ii<12; ii++) {
|
||||
//x is the sinr_dB in dB
|
||||
x = sinr_dB[(offset*12)+ii] - 10*log10(beta1_dlsch_MI[TM][mcs]);
|
||||
|
||||
if(x<sinr_min)
|
||||
I +=0;
|
||||
else {
|
||||
if(mcs<10) {
|
||||
if(x>qpsk_max)
|
||||
I += 1;
|
||||
else
|
||||
I += (q_qpsk[0]*pow(x,7) + q_qpsk[1]*pow(x,6) + q_qpsk[2]*pow(x,5) + q_qpsk[3]*pow(x,4) + q_qpsk[4]*pow(x,3) + q_qpsk[5]*pow(x,2) + q_qpsk[6]*x + q_qpsk[7]);
|
||||
} else if(mcs>9 && mcs<17) {
|
||||
if(x>qam16_max)
|
||||
I += 1;
|
||||
else
|
||||
I += (q_qam16[0]*pow(x,7) + q_qam16[1]*pow(x,6) + q_qam16[2]*pow(x,5) + q_qam16[3]*pow(x,4) + q_qam16[4]*pow(x,3) + q_qam16[5]*pow(x,2) + q_qam16[6]*x + q_qam16[7]);
|
||||
} else if(mcs>16 && mcs<23) {
|
||||
|
||||
if(x>qam64_max)
|
||||
I += 1;
|
||||
else
|
||||
I += (q_qam64[0]*pow(x,7) + q_qam64[1]*pow(x,6) + q_qam64[2]*pow(x,5) + q_qam64[3]*pow(x,4) + q_qam64[4]*pow(x,3) + q_qam64[5]*pow(x,2) + q_qam64[6]*x + q_qam64[7]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// averaging of accumulated MI
|
||||
I = I/(12*rb_count);
|
||||
//Now I->SINR_effective Mapping
|
||||
|
||||
if(mcs<10) {
|
||||
sinr_eff = (p_qpsk[0]*pow(I,7) + p_qpsk[1]*pow(I,6) + p_qpsk[2]*pow(I,5) + p_qpsk[3]*pow(I,4) + p_qpsk[4]*pow(I,3) + p_qpsk[5]*pow(I,2) + p_qpsk[6]*I + p_qpsk[7]);
|
||||
} else if(mcs>9 && mcs<17) {
|
||||
sinr_eff = (p_qam16[0]*pow(I,7) + p_qam16[1]*pow(I,6) + p_qam16[2]*pow(I,5) + p_qam16[3]*pow(I,4) + p_qam16[4]*pow(I,3) + p_qam16[5]*pow(I,2) + p_qam16[6]*I + p_qam16[7]);
|
||||
} else if(mcs>16 && mcs<23) {
|
||||
sinr_eff = (p_qam64[0]*pow(I,7) + p_qam64[1]*pow(I,6) + p_qam64[2]*pow(I,5) + p_qam64[3]*pow(I,4) + p_qam64[4]*pow(I,3) + p_qam64[5]*pow(I,2) + p_qam64[6]*I + p_qam64[7]);
|
||||
}
|
||||
|
||||
//sinr_eff = sinr_eff + 10*log10(beta2_dlsch_MI[TM][mcs]);
|
||||
LOG_D(OCM,"SINR_Eff = %e\n",sinr_eff);
|
||||
|
||||
bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]);
|
||||
|
||||
#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
|
||||
|
||||
if (uniformrandom() < bler) {
|
||||
LOG_N(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
|
||||
return(0);
|
||||
} else {
|
||||
LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t subframe,
|
||||
PDSCH_t dlsch_id,
|
||||
uint8_t eNB_id)
|
||||
{
|
||||
|
||||
LTE_UE_DLSCH_t *dlsch_ue;
|
||||
LTE_eNB_DLSCH_t *dlsch_eNB;
|
||||
uint8_t harq_pid;
|
||||
uint32_t eNB_id2;
|
||||
uint32_t ue_id;
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
uint16_t i;
|
||||
#endif
|
||||
uint8_t CC_id = phy_vars_ue->CC_id;
|
||||
|
||||
// may not be necessary for PMCH??
|
||||
for (eNB_id2=0; eNB_id2<NB_eNB_INST; eNB_id2++) {
|
||||
if (RC.eNB[eNB_id2][CC_id]->frame_parms.Nid_cell == phy_vars_ue->frame_parms.Nid_cell)
|
||||
break;
|
||||
}
|
||||
|
||||
AssertFatal(eNB_id2!=NB_eNB_INST,
|
||||
"FATAL : Could not find attached eNB for DLSCH emulation !!!!\n");
|
||||
|
||||
LOG_D(PHY,"[UE] dlsch_decoding_emul : subframe %d, eNB_id %d, dlsch_id %d\n",subframe,eNB_id2,dlsch_id);
|
||||
|
||||
// printf("dlsch_eNB_ra->harq_processes[0] %p\n",PHY_vars_eNB_g[eNB_id]->dlsch_eNB_ra->harq_processes[0]);
|
||||
|
||||
|
||||
switch (dlsch_id) {
|
||||
case SI_PDSCH: // SI
|
||||
dlsch_ue = phy_vars_ue->dlsch_SI[eNB_id];
|
||||
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch_SI;
|
||||
// printf("Doing SI: TBS %d\n",dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
LOG_D(PHY,"SI Decoded\n");
|
||||
|
||||
for (i=0; i<dlsch_ue->harq_processes[0]->TBS>>3; i++)
|
||||
LOG_T(PHY,"%x.",dlsch_eNB->harq_processes[0]->b[i]);
|
||||
|
||||
LOG_T(PHY,"\n");
|
||||
#endif
|
||||
return(1);
|
||||
break;
|
||||
|
||||
case RA_PDSCH: // RA
|
||||
dlsch_ue = phy_vars_ue->dlsch_ra[eNB_id];
|
||||
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch_ra;
|
||||
memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
LOG_D(PHY,"RA Decoded\n");
|
||||
|
||||
for (i=0; i<dlsch_ue->harq_processes[0]->TBS>>3; i++)
|
||||
LOG_T(PHY,"%x.",dlsch_eNB->harq_processes[0]->b[i]);
|
||||
|
||||
LOG_T(PHY,"\n");
|
||||
#endif
|
||||
return(1);
|
||||
break;
|
||||
|
||||
case PDSCH: // TB0
|
||||
dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0];
|
||||
harq_pid = dlsch_ue->current_harq_pid;
|
||||
ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][(uint32_t)eNB_id]->crnti,RC.eNB[eNB_id2][CC_id]);
|
||||
DevAssert( ue_id != (uint32_t)-1 );
|
||||
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch[ue_id][0];
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
|
||||
for (i=0; i<dlsch_ue->harq_processes[harq_pid]->TBS>>3; i++)
|
||||
LOG_T(PHY,"%x.",dlsch_eNB->harq_processes[harq_pid]->b[i]);
|
||||
|
||||
LOG_T(PHY,"\n current harq pid is %d ue id %d \n", harq_pid, ue_id);
|
||||
#endif
|
||||
|
||||
if (dlsch_abstraction_MIESM(phy_vars_ue->sinr_dB,
|
||||
phy_vars_ue->transmission_mode[eNB_id],
|
||||
dlsch_eNB->harq_processes[harq_pid]->rb_alloc,
|
||||
dlsch_eNB->harq_processes[harq_pid]->mcs,
|
||||
RC.eNB[eNB_id][CC_id]->mu_mimo_mode[ue_id].dl_pow_off) == 1) {
|
||||
// reset HARQ
|
||||
dlsch_ue->harq_processes[harq_pid]->status = SCH_IDLE;
|
||||
dlsch_ue->harq_processes[harq_pid]->round = 0;
|
||||
dlsch_ue->harq_ack[subframe].ack = 1;
|
||||
dlsch_ue->harq_ack[subframe].harq_id = harq_pid;
|
||||
dlsch_ue->harq_ack[subframe].send_harq_status = 1;
|
||||
|
||||
if (dlsch_ue->harq_processes[harq_pid]->round == 0)
|
||||
memcpy(dlsch_ue->harq_processes[harq_pid]->b,
|
||||
dlsch_eNB->harq_processes[harq_pid]->b,
|
||||
dlsch_ue->harq_processes[harq_pid]->TBS>>3);
|
||||
|
||||
return(1);
|
||||
} else {
|
||||
// retransmission
|
||||
dlsch_ue->harq_processes[harq_pid]->status = ACTIVE;
|
||||
dlsch_ue->harq_processes[harq_pid]->round++;
|
||||
dlsch_ue->harq_ack[subframe].ack = 0;
|
||||
dlsch_ue->harq_ack[subframe].harq_id = harq_pid;
|
||||
dlsch_ue->harq_ack[subframe].send_harq_status = 1;
|
||||
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
|
||||
return(1+dlsch_ue->max_turbo_iterations);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PDSCH1: { // TB1
|
||||
dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1];
|
||||
harq_pid = dlsch_ue->current_harq_pid;
|
||||
int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->crnti, RC.eNB[eNB_id2][CC_id] );
|
||||
|
||||
DevAssert( UE_id != -1 );
|
||||
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch[UE_id][1];
|
||||
// reset HARQ
|
||||
dlsch_ue->harq_processes[harq_pid]->status = SCH_IDLE;
|
||||
dlsch_ue->harq_processes[harq_pid]->round = 0;
|
||||
dlsch_ue->harq_ack[subframe].ack = 1;
|
||||
dlsch_ue->harq_ack[subframe].harq_id = harq_pid;
|
||||
dlsch_ue->harq_ack[subframe].send_harq_status = 1;
|
||||
|
||||
if (dlsch_ue->harq_processes[harq_pid]->round == 0)
|
||||
memcpy(dlsch_eNB->harq_processes[harq_pid]->b,dlsch_ue->harq_processes[harq_pid]->b,dlsch_ue->harq_processes[harq_pid]->TBS>>3);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case PMCH: // PMCH
|
||||
|
||||
dlsch_ue = phy_vars_ue->dlsch_MCH[eNB_id];
|
||||
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch_MCH;
|
||||
|
||||
LOG_D(PHY,"decoding pmch emul (size is %d, enb %d %d)\n", dlsch_ue->harq_processes[0]->TBS>>3, eNB_id, eNB_id2);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
|
||||
for (i=0; i<dlsch_ue->harq_processes[0]->TBS>>3; i++)
|
||||
printf("%x.",dlsch_eNB->harq_processes[0]->b[i]);
|
||||
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
|
||||
// if (dlsch_abstraction_MIESM(phy_vars_ue->sinr_dB, phy_vars_ue->transmission_mode[eNB_id], dlsch_eNB->rb_alloc,
|
||||
// dlsch_eNB->harq_processes[0]->mcs,RC.eNB[eNB_id]->mu_mimo_mode[ue_id].dl_pow_off) == 1) {
|
||||
|
||||
if (1) {
|
||||
// reset HARQ
|
||||
dlsch_ue->harq_processes[0]->status = SCH_IDLE;
|
||||
dlsch_ue->harq_processes[0]->round = 0;
|
||||
memcpy(dlsch_ue->harq_processes[0]->b,
|
||||
dlsch_eNB->harq_processes[0]->b,
|
||||
dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
dlsch_ue->last_iteration_cnt = 1;
|
||||
return(1);
|
||||
} else {
|
||||
// retransmission
|
||||
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
|
||||
return(1+dlsch_ue->max_turbo_iterations);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0];
|
||||
LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id);
|
||||
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
|
||||
return(1+dlsch_ue->max_turbo_iterations);
|
||||
}
|
||||
|
||||
LOG_E(PHY,"[FATAL] dlsch_decoding.c: Should never exit here ...\n");
|
||||
return(0);
|
||||
}*/
|
||||
#endif
|
||||
|
||||
|
||||
@@ -37,11 +37,7 @@
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include "T.h"
|
||||
|
||||
#ifndef USER_MODE
|
||||
#define NOCYGWIN_STATIC static
|
||||
#else
|
||||
#define NOCYGWIN_STATIC
|
||||
#endif
|
||||
|
||||
/* dynamic shift for LLR computation for TM3/4
|
||||
* set as command line argument, see lte-softmodem.c
|
||||
@@ -6029,9 +6025,6 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
|
||||
|
||||
//==============================================================================================
|
||||
|
||||
#ifdef USER_MODE
|
||||
|
||||
|
||||
void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid)
|
||||
{
|
||||
unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
|
||||
@@ -6121,7 +6114,6 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *c
|
||||
|
||||
// printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DLSCH_DEMOD
|
||||
/*
|
||||
|
||||
@@ -81,7 +81,6 @@ int generate_drs_pusch(PHY_VARS_UE *ue,
|
||||
// cyclic_shift1 = 0;
|
||||
Msc_RS = 12*nb_rb;
|
||||
|
||||
#ifdef USER_MODE
|
||||
Msc_idx_ptr = (uint16_t*) bsearch(&Msc_RS, dftsizes, 33, sizeof(uint16_t), compareints);
|
||||
|
||||
if (Msc_idx_ptr)
|
||||
@@ -91,20 +90,6 @@ int generate_drs_pusch(PHY_VARS_UE *ue,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#else
|
||||
uint8_t b;
|
||||
|
||||
for (b=0; b<33; b++)
|
||||
if (Msc_RS==dftsizes[b])
|
||||
Msc_RS_idx = b;
|
||||
|
||||
#endif
|
||||
#ifdef DEBUG_DRS
|
||||
printf("[PHY] drs_modulation: Msc_RS = %d, Msc_RS_idx = %d,cyclic_shift %d, u0 %d, v0 %d, u1 %d, v1 %d,cshift0 %d,cshift1 %d\n",Msc_RS, Msc_RS_idx,cyclic_shift,u0,v0,u1,v1,cyclic_shift0,cyclic_shift1);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
for (l = (3 - frame_parms->Ncp),u=u0,v=v0,cyclic_shift=cyclic_shift0;
|
||||
l<frame_parms->symbols_per_tti;
|
||||
l += (7 - frame_parms->Ncp),u=u1,v=v1,cyclic_shift=cyclic_shift1) {
|
||||
|
||||
@@ -29,11 +29,9 @@
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "SCHED/defs.h"
|
||||
|
||||
@@ -237,10 +237,6 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
|
||||
ue->proc.proc_rxtx[i].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
|
||||
ue->proc.proc_rxtx[i].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
|
||||
|
||||
#ifndef USER_MODE
|
||||
// one frame delay
|
||||
ue->proc.proc_rxtx[i].frame_rx ++;
|
||||
#endif
|
||||
ue->proc.proc_rxtx[i].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
|
||||
}
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
|
||||
@@ -37,11 +37,6 @@
|
||||
#include "PHY/extern.h"
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
#include "SIMULATION/TOOLS/defs.h"
|
||||
#endif
|
||||
|
||||
|
||||
//#define DEBUG_PBCH 1
|
||||
//#define DEBUG_PBCH_ENCODING
|
||||
//#define INTERFERENCE_MITIGATION 1
|
||||
@@ -260,13 +255,11 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_PBCH
|
||||
#ifdef USER_MODE
|
||||
write_output("pbch_encoded_output2.m","pbch_encoded_out2",
|
||||
pbch_coded_data2,
|
||||
pbch_coded_bits,
|
||||
1,
|
||||
4);
|
||||
#endif //USER_MODE
|
||||
#endif //DEBUG_PBCH
|
||||
*/
|
||||
#ifdef DEBUG_PBCH_ENCODING
|
||||
@@ -288,8 +281,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
|
||||
|
||||
#ifdef DEBUG_PBCH
|
||||
#ifdef USER_MODE
|
||||
|
||||
if (frame_mod4==0) {
|
||||
write_output("pbch_e.m","pbch_e",
|
||||
eNB_pbch->pbch_e,
|
||||
@@ -300,8 +291,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
for (i=0; i<16; i++)
|
||||
printf("e[%d] %d\n",i,eNB_pbch->pbch_e[i]);
|
||||
}
|
||||
|
||||
#endif //USER_MODE
|
||||
#endif //DEBUG_PBCH
|
||||
// scrambling
|
||||
|
||||
@@ -309,8 +298,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
eNB_pbch->pbch_e,
|
||||
pbch_E);
|
||||
#ifdef DEBUG_PBCH
|
||||
#ifdef USER_MODE
|
||||
|
||||
if (frame_mod4==0) {
|
||||
write_output("pbch_e_s.m","pbch_e_s",
|
||||
eNB_pbch->pbch_e,
|
||||
@@ -321,8 +308,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
for (i=0; i<16; i++)
|
||||
printf("e_s[%d] %d\n",i,eNB_pbch->pbch_e[i]);
|
||||
}
|
||||
|
||||
#endif //USER_MODE
|
||||
#endif //DEBUG_PBCH
|
||||
} // frame_mod4==0
|
||||
|
||||
@@ -1028,44 +1013,3 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
|
||||
|
||||
|
||||
}
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t pbch_phase)
|
||||
{
|
||||
|
||||
double bler=0.0;//, x=0.0;
|
||||
double sinr=0.0;
|
||||
uint16_t nb_rb = phy_vars_ue->frame_parms.N_RB_DL;
|
||||
int16_t f;
|
||||
uint8_t CC_id=phy_vars_ue->CC_id;
|
||||
int frame_rx = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
|
||||
|
||||
// compute effective sinr
|
||||
// TODO: adapt this to varible bandwidth
|
||||
for (f=(nb_rb*6-3*12); f<(nb_rb*6+3*12); f++) {
|
||||
if (f!=0) //skip DC
|
||||
sinr += pow(10, 0.1*(phy_vars_ue->sinr_dB[f]));
|
||||
}
|
||||
|
||||
sinr = 10*log10(sinr/(6*12));
|
||||
|
||||
bler = pbch_bler(sinr);
|
||||
|
||||
LOG_D(PHY,"EMUL UE rx_pbch_emul: eNB_id %d, pbch_phase %d, sinr %f dB, bler %f \n",
|
||||
eNB_id,
|
||||
pbch_phase,
|
||||
sinr,
|
||||
bler);
|
||||
|
||||
if (pbch_phase == (frame_rx % 4)) {
|
||||
if (uniformrandom() >= bler) {
|
||||
memcpy(phy_vars_ue->pbch_vars[eNB_id]->decoded_output,RC.eNB[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE);
|
||||
return(RC.eNB[eNB_id][CC_id]->frame_parms.nb_antenna_ports_eNB);
|
||||
} else
|
||||
return(-1);
|
||||
} else
|
||||
return(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -38,10 +38,6 @@
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
|
||||
#ifndef USER_MODE
|
||||
#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
|
||||
#endif
|
||||
|
||||
#include "T.h"
|
||||
|
||||
//#define DEBUG_PHICH 1
|
||||
|
||||
@@ -342,7 +342,6 @@ uint16_t prach_root_sequence_map4[138] = { 1,138,2,137,3,136,4,135,5,134,6,133,
|
||||
61,78,62,77,63,76,64,75,65,74,66,73,67,72,68,71,69,70
|
||||
};
|
||||
|
||||
#ifdef USER_MODE
|
||||
void dump_prach_config(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
|
||||
{
|
||||
|
||||
@@ -363,7 +362,6 @@ void dump_prach_config(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
|
||||
fclose(fd);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
// This function computes the du
|
||||
void fill_du(uint8_t prach_fmt)
|
||||
|
||||
@@ -2151,9 +2151,13 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,RU_t *ru,
|
||||
uint16_t *max_preamble,
|
||||
uint16_t *max_preamble_energy,
|
||||
uint16_t *max_preamble_delay,
|
||||
#ifdef Rel14
|
||||
uint16_t Nf, uint8_t tdd_mapindex,
|
||||
uint8_t br_flag);
|
||||
|
||||
uint8_t br_flag
|
||||
#else
|
||||
uint16_t Nf, uint8_t tdd_mapindex
|
||||
#endif
|
||||
);
|
||||
/*!
|
||||
\brief Helper for MAC, returns number of available PRACH in TDD for a particular configuration index
|
||||
@param frame_parms Pointer to LTE_DL_FRAME_PARMS structure
|
||||
|
||||
@@ -180,7 +180,6 @@ int32_t generate_srs(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#ifdef USER_MODE
|
||||
Msc_idx_ptr = (uint16_t*) bsearch((uint16_t*) &Msc_RS, (uint16_t*) dftsizes, 33, sizeof(uint16_t), compareints);
|
||||
|
||||
if (Msc_idx_ptr)
|
||||
@@ -190,19 +189,6 @@ int32_t generate_srs(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#else //stdlib not availiable in RTAI
|
||||
|
||||
if (Msc_RS==216)
|
||||
Msc_RS_idx = 12;
|
||||
else if (Msc_RS==144)
|
||||
Msc_RS_idx = 9;
|
||||
else {
|
||||
LOG_E(PHY,"generate_srs: index for Msc_RS=%d not implemented\n",Msc_RS);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SRS
|
||||
LOG_D(PHY,"generate_srs_tx: Msc_RS = %d, Msc_RS_idx = %d, k0 = %d\n",Msc_RS, Msc_RS_idx,k0);
|
||||
#endif
|
||||
@@ -279,7 +265,6 @@ int generate_srs_rx(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#ifdef USER_MODE
|
||||
Msc_idx_ptr = (uint16_t*) bsearch((uint16_t*) &Msc_RS, (uint16_t*) dftsizes, 33, sizeof(uint16_t), compareints);
|
||||
|
||||
if (Msc_idx_ptr)
|
||||
@@ -289,19 +274,6 @@ int generate_srs_rx(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#else //stdlib not availiable in RTAI
|
||||
|
||||
if (Msc_RS==216)
|
||||
Msc_RS_idx = 12;
|
||||
else if (Msc_RS==144)
|
||||
Msc_RS_idx = 9;
|
||||
else {
|
||||
LOG_E(PHY,"generate_srs: index for Msc_RS=%d not implemented\n",Msc_RS);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SRS
|
||||
LOG_I(PHY,"generate_srs_rx: Msc_RS = %d, Msc_RS_idx = %d, k0=%d\n",Msc_RS, Msc_RS_idx,k0);
|
||||
#endif
|
||||
|
||||
@@ -953,77 +953,3 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
#ifdef OPENAIR2
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#endif
|
||||
int ulsch_encoding_emul(uint8_t *ulsch_buffer,
|
||||
PHY_VARS_UE *ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t subframe_rx,
|
||||
uint8_t harq_pid,
|
||||
uint8_t control_only_flag)
|
||||
{
|
||||
|
||||
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
uint8_t tmode = ue->transmission_mode[eNB_id];
|
||||
uint16_t rnti=ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
|
||||
LOG_D(PHY,"EMUL UE ulsch_encoding for eNB %d,mod_id %d, harq_pid %d rnti %x, ACK(%d,%d) \n",
|
||||
eNB_id,ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]);
|
||||
|
||||
if (ulsch->O>0) {
|
||||
/*
|
||||
if(flag_LA==1)
|
||||
sinr_eff = sinr_eff_cqi_calc(ue, eNB_id);
|
||||
else
|
||||
sinr_eff = meas->wideband_cqi_avg[eNB_id];
|
||||
*/
|
||||
|
||||
fill_CQI(ulsch,meas,eNB_id,harq_pid,ue->frame_parms.N_RB_DL,rnti,tmode,ue->sinr_eff);
|
||||
//LOG_D(PHY,"UE CQI\n");
|
||||
// print_CQI(ulsch->o,ulsch->uci_format,eNB_id);
|
||||
|
||||
// save PUSCH pmi for later (transmission modes 4,5,6)
|
||||
// printf("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
|
||||
// if (ulsch->uci_format != HLC_subband_cqi_mcs_CBA)
|
||||
dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
|
||||
}
|
||||
|
||||
memcpy(ue->ulsch[eNB_id]->harq_processes[harq_pid]->b,
|
||||
ulsch_buffer,
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
|
||||
|
||||
|
||||
//memcpy(&UE_transport_info[ue->Mod_id].transport_blocks[UE_transport_info_TB_index[ue->Mod_id]],
|
||||
memcpy(&UE_transport_info[ue->Mod_id][ue->CC_id].transport_blocks,
|
||||
ulsch_buffer,
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
|
||||
//UE_transport_info_TB_index[ue->Mod_id]+=ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3;
|
||||
// navid: currently more than one eNB is not supported in the code
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].num_eNB = 1;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].rnti[0] = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][0]->crnti;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].eNB_id[0] = eNB_id;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].harq_pid[0] = harq_pid;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].tbs[0] = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3 ;
|
||||
// printf("\nue->Mod_id%d\n",ue->Mod_id);
|
||||
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_flag = 1;
|
||||
//UE_transport_info[ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o;
|
||||
memcpy(UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_uci,
|
||||
ulsch->o,
|
||||
MAX_CQI_BYTES);
|
||||
// printf("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1);
|
||||
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.length_uci = ulsch->O;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.uci_format = ulsch->uci_format;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1);
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1);
|
||||
//printf("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1);
|
||||
return(0);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -44,11 +44,6 @@
|
||||
#include "PHY_INTERFACE/extern.h"
|
||||
#endif
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
#include "UTIL/OCG/OCG.h"
|
||||
#include "UTIL/OCG/OCG_extern.h"
|
||||
#endif
|
||||
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
//#define DEBUG_ULSCH_DECODING
|
||||
|
||||
@@ -170,6 +165,7 @@ void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch)
|
||||
//ulsch = (LTE_eNB_ULSCH_t *)malloc16(sizeof(LTE_eNB_ULSCH_t));
|
||||
if (ulsch) {
|
||||
ulsch->rnti = 0;
|
||||
ulsch->harq_mask = 0;
|
||||
|
||||
for (i=0; i<8; i++) {
|
||||
if (ulsch->harq_processes[i]) {
|
||||
@@ -178,9 +174,26 @@ void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch)
|
||||
//ulsch->harq_processes[i]->phich_active = 0; //this will be done later after transmission of PHICH
|
||||
ulsch->harq_processes[i]->phich_ACK = 0;
|
||||
ulsch->harq_processes[i]->round = 0;
|
||||
ulsch->harq_processes[i]->rar_alloc = 0;
|
||||
ulsch->harq_processes[i]->first_rb = 0;
|
||||
ulsch->harq_processes[i]->nb_rb = 0;
|
||||
ulsch->harq_processes[i]->TBS = 0;
|
||||
ulsch->harq_processes[i]->Or1 = 0;
|
||||
ulsch->harq_processes[i]->Or2 = 0;
|
||||
for ( int j = 0; j < 2; j++ ) {
|
||||
ulsch->harq_processes[i]->o_RI[j] = 0;
|
||||
}
|
||||
ulsch->harq_processes[i]->O_ACK = 0;
|
||||
ulsch->harq_processes[i]->srs_active = 0;
|
||||
ulsch->harq_processes[i]->rvidx = 0;
|
||||
ulsch->harq_processes[i]->Msc_initial = 0;
|
||||
ulsch->harq_processes[i]->Nsymb_initial = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ulsch->beta_offset_cqi_times8 = 0;
|
||||
ulsch->beta_offset_ri_times8 = 0;
|
||||
ulsch->beta_offset_harqack_times8 = 0;
|
||||
ulsch->Msg3_active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1587,460 +1600,3 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
int ulsch_abstraction(double* sinr_dB, uint8_t TM, uint8_t mcs,uint16_t nrb, uint16_t frb)
|
||||
{
|
||||
|
||||
int index,ii;
|
||||
double sinr_eff = 0;
|
||||
int rb_count = 0;
|
||||
int offset;
|
||||
double bler = 0;
|
||||
TM = TM-1;
|
||||
sinr_eff = sinr_dB[frb]; //the single sinr_eff value we calculated with MMSE FDE formula in init_snr_up function
|
||||
|
||||
|
||||
sinr_eff *= 10;
|
||||
sinr_eff = floor(sinr_eff);
|
||||
sinr_eff /= 10;
|
||||
|
||||
LOG_D(PHY,"[ABSTRACTION] sinr_eff after rounding = %f\n",sinr_eff);
|
||||
|
||||
for (index = 0; index < 16; index++) {
|
||||
if(index == 0) {
|
||||
if (sinr_eff < sinr_bler_map_up[mcs][0][index]) {
|
||||
bler = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (sinr_eff == sinr_bler_map_up[mcs][0][index]) {
|
||||
bler = sinr_bler_map_up[mcs][1][index];
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
|
||||
|
||||
if (uniformrandom() < bler) {
|
||||
LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
|
||||
return(0);
|
||||
} else {
|
||||
LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb, uint16_t frb)
|
||||
{
|
||||
int index;
|
||||
double sinr_eff = 0;
|
||||
double sinr_db1 = 0;
|
||||
double sinr_db2 = 0;
|
||||
double SI=0;
|
||||
double RBIR=0;
|
||||
int rb_count = 0;
|
||||
int offset, M=0;
|
||||
double bler = 0;
|
||||
int start,middle,end;
|
||||
TM = TM-1;
|
||||
|
||||
for (offset = frb; offset <= (frb + nrb -1); offset++) {
|
||||
|
||||
rb_count++;
|
||||
|
||||
//we need to do the table lookups here for the mutual information corresponding to the certain sinr_dB.
|
||||
|
||||
sinr_db1 = sinr_dB[offset*2];
|
||||
sinr_db2 = sinr_dB[offset*2+1];
|
||||
|
||||
printf("sinr_db1=%f\n,sinr_db2=%f\n",sinr_db1,sinr_db2);
|
||||
|
||||
//rounding up for the table lookup
|
||||
sinr_db1 *= 10;
|
||||
sinr_db2 *= 10;
|
||||
|
||||
sinr_db1 = floor(sinr_db1);
|
||||
sinr_db2 = floor(sinr_db2);
|
||||
|
||||
if ((int)sinr_db1%2) {
|
||||
sinr_db1 += 1;
|
||||
}
|
||||
|
||||
if ((int)sinr_db2%2) {
|
||||
sinr_db2 += 1;
|
||||
}
|
||||
|
||||
sinr_db1 /= 10;
|
||||
sinr_db2 /= 10;
|
||||
|
||||
if(mcs<10) {
|
||||
//for sinr_db1
|
||||
for (index = 0; index < 162; index++) {
|
||||
if (sinr_db1 < MI_map_4qam[0][0]) {
|
||||
SI += (MI_map_4qam[1][0]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db1 > MI_map_4qam[0][161]) {
|
||||
SI += (MI_map_4qam[1][161]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db1 == MI_map_4qam[0][index]) {
|
||||
SI += (MI_map_4qam[1][index]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//for sinr_db2
|
||||
for (index = 0; index < 162; index++) {
|
||||
if (sinr_db2 < MI_map_4qam[0][0]) {
|
||||
SI += (MI_map_4qam[1][0]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db2 > MI_map_4qam[0][161]) {
|
||||
SI += (MI_map_4qam[1][161]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db2 == MI_map_4qam[0][index]) {
|
||||
SI += (MI_map_4qam[1][index]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} else if(mcs>9 && mcs<17) {
|
||||
//for sinr_db1
|
||||
for (index = 0; index < 197; index++) {
|
||||
if (sinr_db1 < MI_map_16qam[0][0]) {
|
||||
SI += (MI_map_16qam[1][0]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db1 > MI_map_16qam[0][196]) {
|
||||
SI += (MI_map_16qam[1][196]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db1 == MI_map_16qam[0][index]) {
|
||||
SI += (MI_map_16qam[1][index]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//for sinr_db2
|
||||
for (index = 0; index < 197; index++) {
|
||||
if (sinr_db2 < MI_map_16qam[0][0]) {
|
||||
SI += (MI_map_16qam[1][0]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db2 > MI_map_16qam[0][196]) {
|
||||
SI += (MI_map_16qam[1][196]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db2 == MI_map_16qam[0][index]) {
|
||||
SI += (MI_map_16qam[1][index]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} else if(mcs>16 && mcs<22) {
|
||||
//for sinr_db1
|
||||
for (index = 0; index < 227; index++) {
|
||||
if (sinr_db1 < MI_map_64qam[0][0]) {
|
||||
SI += (MI_map_64qam[1][0]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=6;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db1 > MI_map_64qam[0][226]) {
|
||||
SI += (MI_map_64qam[1][226]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=6;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db1 == MI_map_64qam[0][index]) {
|
||||
SI += (MI_map_64qam[1][index]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=6;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//for sinr_db2
|
||||
for (index = 0; index < 227; index++) {
|
||||
if (sinr_db2 < MI_map_64qam[0][0]) {
|
||||
SI += (MI_map_64qam[1][0]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=6;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db2 > MI_map_64qam[0][226]) {
|
||||
SI += (MI_map_64qam[1][226]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=6;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sinr_db2 == MI_map_64qam[0][index]) {
|
||||
SI += (MI_map_64qam[1][index]/beta1_dlsch_MI[TM][mcs]);
|
||||
M +=6;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// }
|
||||
|
||||
RBIR = SI/M;
|
||||
|
||||
//Now RBIR->SINR_effective Mapping
|
||||
//binary search method is performed here
|
||||
if(mcs<10) {
|
||||
start = 0;
|
||||
end = 161;
|
||||
middle = end/2;
|
||||
|
||||
if (RBIR <= MI_map_4qam[2][start]) {
|
||||
sinr_eff = MI_map_4qam[0][start];
|
||||
} else {
|
||||
if (RBIR >= MI_map_4qam[2][end])
|
||||
sinr_eff = MI_map_4qam[0][end];
|
||||
else {
|
||||
//while((end-start > 1) && (RBIR >= MI_map_4qam[2]))
|
||||
if (RBIR < MI_map_4qam[2][middle]) {
|
||||
end = middle;
|
||||
middle = end/2;
|
||||
} else {
|
||||
start = middle;
|
||||
middle = (end-middle)/2;
|
||||
}
|
||||
}
|
||||
|
||||
for (; end>start; end--) {
|
||||
if ((RBIR < MI_map_4qam[2][end]) && (RBIR > MI_map_4qam[2][end-2])) {
|
||||
sinr_eff = MI_map_4qam[0][end-1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs];
|
||||
}
|
||||
|
||||
|
||||
|
||||
else if (mcs>9 && mcs<17) {
|
||||
|
||||
start = 0;
|
||||
end = 196;
|
||||
middle = end/2;
|
||||
|
||||
if (RBIR <= MI_map_16qam[2][start]) {
|
||||
sinr_eff = MI_map_16qam[0][start];
|
||||
} else {
|
||||
if (RBIR >= MI_map_16qam[2][end])
|
||||
sinr_eff = MI_map_16qam[0][end];
|
||||
else {
|
||||
//while((end-start > 1) && (RBIR >= MI_map_4qam[2]))
|
||||
if (RBIR < MI_map_16qam[2][middle]) {
|
||||
end = middle;
|
||||
middle = end/2;
|
||||
} else {
|
||||
start = middle;
|
||||
middle = (end-middle)/2;
|
||||
}
|
||||
}
|
||||
|
||||
for (; end>start; end--) {
|
||||
if ((RBIR < MI_map_16qam[2][end]) && (RBIR > MI_map_16qam[2][end-2])) {
|
||||
sinr_eff = MI_map_16qam[0][end-1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs];
|
||||
} else if (mcs>16) {
|
||||
start = 0;
|
||||
end = 226;
|
||||
middle = end/2;
|
||||
|
||||
if (RBIR <= MI_map_64qam[2][start]) {
|
||||
sinr_eff = MI_map_64qam[0][start];
|
||||
} else {
|
||||
if (RBIR >= MI_map_64qam[2][end])
|
||||
sinr_eff = MI_map_64qam[0][end];
|
||||
else {
|
||||
//while((end-start > 1) && (RBIR >= MI_map_4qam[2]))
|
||||
if (RBIR < MI_map_64qam[2][middle]) {
|
||||
end = middle;
|
||||
middle = end/2;
|
||||
} else {
|
||||
start = middle;
|
||||
middle = (end-middle)/2;
|
||||
}
|
||||
}
|
||||
|
||||
for (; end>start; end--) {
|
||||
if ((RBIR < MI_map_64qam[2][end]) && (RBIR > MI_map_64qam[2][end-2])) {
|
||||
sinr_eff = MI_map_64qam[0][end-1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs];
|
||||
}
|
||||
|
||||
printf("SINR_Eff = %e\n",sinr_eff);
|
||||
|
||||
sinr_eff *= 10;
|
||||
sinr_eff = floor(sinr_eff);
|
||||
// if ((int)sinr_eff%2) {
|
||||
// sinr_eff += 1;
|
||||
// }
|
||||
sinr_eff /= 10;
|
||||
printf("sinr_eff after rounding = %f\n",sinr_eff);
|
||||
|
||||
for (index = 0; index < 16; index++) {
|
||||
if(index == 0) {
|
||||
if (sinr_eff < sinr_bler_map_up[mcs][0][index]) {
|
||||
bler = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (sinr_eff == sinr_bler_map_up[mcs][0][index]) {
|
||||
bler = sinr_bler_map_up[mcs][1][index];
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
|
||||
|
||||
if (uniformrandom() < bler) {
|
||||
printf("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
|
||||
return(0);
|
||||
} else {
|
||||
printf("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc,
|
||||
uint8_t UE_index,
|
||||
uint16_t *crnti)
|
||||
{
|
||||
|
||||
uint8_t UE_id;
|
||||
uint16_t rnti;
|
||||
int subframe = proc->subframe_rx;
|
||||
uint8_t harq_pid;
|
||||
uint8_t CC_id = eNB->CC_id;
|
||||
|
||||
harq_pid = subframe2harq_pid(&eNB->frame_parms,proc->frame_rx,subframe);
|
||||
|
||||
rnti = eNB->ulsch[UE_index]->rnti;
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"[eNB %d] ulsch_decoding_emul : subframe %d UE_index %d harq_pid %d rnti %x\n",eNB->Mod_id,subframe,UE_index,harq_pid,rnti);
|
||||
#endif
|
||||
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
if (rnti == PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[PHY_vars_UE_g[UE_id][CC_id]->current_thread_id[subframe]][0]->crnti)
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (UE_id==NB_UE_INST) {
|
||||
LOG_W(PHY,"[eNB %d] ulsch_decoding_emul: FATAL, didn't find UE with rnti %x (UE index %d)\n",
|
||||
eNB->Mod_id, rnti, UE_index);
|
||||
return(1+eNB->ulsch[UE_id]->max_turbo_iterations);
|
||||
} else {
|
||||
LOG_D(PHY,"[eNB %d] Found UE with rnti %x => UE_id %d\n",eNB->Mod_id, rnti, UE_id);
|
||||
}
|
||||
|
||||
if (PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->harq_processes[harq_pid]->status == CBA_ACTIVE) {
|
||||
*crnti = rnti;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->harq_processes[harq_pid]->status=IDLE;
|
||||
} else
|
||||
*crnti = 0x0;
|
||||
|
||||
if (1) {
|
||||
LOG_D(PHY,"ulsch_decoding_emul abstraction successful\n");
|
||||
|
||||
memcpy(eNB->ulsch[UE_index]->harq_processes[harq_pid]->b,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->harq_processes[harq_pid]->b,
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->TBS>>3);
|
||||
|
||||
// get local ue's ack
|
||||
if ((UE_index >= oai_emulation.info.first_ue_local) ||(UE_index <(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local))) {
|
||||
get_ack(&eNB->frame_parms,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->dlsch[0][0][0]->harq_ack,
|
||||
proc->subframe_tx,
|
||||
proc->subframe_rx,
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK,0);
|
||||
} else { // get remote UEs' ack
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[0] = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o_ACK[0];
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[1] = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o_ACK[1];
|
||||
}
|
||||
|
||||
// Do abstraction of PUSCH feedback
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"[eNB %d][EMUL] ue index %d UE_id %d: subframe %d : o_ACK (%d %d), cqi (val %d, len %d)\n",
|
||||
eNB->Mod_id,UE_index, UE_id, subframe,eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[0],
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[1],
|
||||
((HLC_subband_cqi_rank1_2A_5MHz *)PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o)->cqi1,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->O);
|
||||
#endif
|
||||
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->Or1 = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->O;
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->Or2 = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->O;
|
||||
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->uci_format = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->uci_format;
|
||||
memcpy(eNB->ulsch[UE_index]->harq_processes[harq_pid]->o,PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o,MAX_CQI_BYTES);
|
||||
memcpy(eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_RI,PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o_RI,2);
|
||||
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 1;
|
||||
|
||||
return(1);
|
||||
} else {
|
||||
LOG_W(PHY,"[eNB %d] ulsch_decoding_emul abstraction failed for UE %d\n",eNB->Mod_id,UE_index);
|
||||
|
||||
eNB->ulsch[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 0;
|
||||
|
||||
// retransmission
|
||||
return(1+eNB->ulsch[UE_index]->max_turbo_iterations);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1360,7 +1360,6 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB,
|
||||
subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS,eNB->ulsch[UE_id]->harq_processes[harq_pid]->Qm,
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch);
|
||||
//#ifndef OAI_EMU
|
||||
write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96],
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
|
||||
if (eNB->common_vars.rxdata) write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
|
||||
@@ -23,11 +23,7 @@
|
||||
#include "PHY/extern.h"
|
||||
#include "extern.h"
|
||||
#include "kHz_7_5.h"
|
||||
#ifdef USER_MODE
|
||||
#include <math.h>
|
||||
#else
|
||||
#include "rtai_math.h"
|
||||
#endif
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
short conjugate75[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
lte_dfts_sse4: lte_dfts.c
|
||||
gcc -O2 -msse4.1 -g -ggdb -o lte_dfts_sse4 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
gcc -O2 -msse4.1 -g -ggdb -o lte_dfts_sse4 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
|
||||
lte_dfts_avx2: lte_dfts.c
|
||||
gcc -O2 -mavx2 -g -ggdb -o lte_dfts_avx2 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
gcc -O2 -mavx2 -g -ggdb -o lte_dfts_avx2 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
|
||||
lte_dfts_avx2.s: lte_dfts.c
|
||||
gcc -O2 -mavx2 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
gcc -O2 -mavx2 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
|
||||
lte_dfts_sse4.s: lte_dfts.c
|
||||
gcc -O2 -msse4.1 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
gcc -O2 -msse4.1 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
|
||||
|
||||
dft_cycles_avx2: lte_dfts_avx2
|
||||
./lte_dfts_avx2 | egrep cycles
|
||||
|
||||
@@ -20,10 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
//#include "MAC_INTERFACE/extern.h"
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
int16_t conjug[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
|
||||
@@ -267,4 +264,4 @@ int multadd_cpx_vector(int16_t *x1,
|
||||
_mm_empty();
|
||||
_m_empty();
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,13 +34,10 @@
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
|
||||
//defined in rtai_math.h
|
||||
#ifndef _RTAI_MATH_H
|
||||
struct complex {
|
||||
double x;
|
||||
double y;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct complexf {
|
||||
float r;
|
||||
@@ -286,7 +283,6 @@ void bit8_txmux(int32_t length,int32_t offset);
|
||||
|
||||
void bit8_rxdemux(int32_t length,int32_t offset);
|
||||
|
||||
#ifdef USER_MODE
|
||||
/*!\fn int32_t write_output(const char *fname, const char *vname, void *data, int length, int dec, char format);
|
||||
\brief Write output file from signal data
|
||||
@param fname output file name
|
||||
@@ -297,7 +293,6 @@ void bit8_rxdemux(int32_t length,int32_t offset);
|
||||
@param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit)
|
||||
*/
|
||||
int32_t write_output(const char *fname, const char *vname, void *data, int length, int dec, char format);
|
||||
#endif
|
||||
|
||||
void Zero_Buffer(void *,uint32_t);
|
||||
void Zero_Buffer_nommx(void *buf,uint32_t length);
|
||||
@@ -361,17 +356,6 @@ int16_t dB_fixed_times10(uint32_t x);
|
||||
int32_t phy_phase_compensation_top (uint32_t pilot_type, uint32_t initial_pilot,
|
||||
uint32_t last_pilot, int32_t ignore_prefix);
|
||||
|
||||
/*!\fn void phy_phase_compensation (int16_t *ref_sch, int16_t *tgt_sch, int16_t *out_sym, int32_t ignore_prefix, int32_t aa, struct complex16 *perror_out);
|
||||
This function is used by the EMOS to compensate the phase rotation of the RF. It has been designed for symbols of type CHSCH or SCH, but cannot be used for the data channels.
|
||||
@param ref_sch reference symbol
|
||||
@param tgt_sch target symbol
|
||||
@param out_sym output of the operation
|
||||
@param ignore_prefix set to 1 if cyclic prefix has not been removed (by the hardware)
|
||||
@param aa antenna index
|
||||
@param perror_out phase error (output parameter)
|
||||
*/
|
||||
void phy_phase_compensation (int16_t *ref_sch, int16_t *tgt_sch, int16_t *out_sym, int32_t ignore_prefix, int32_t aa, struct complex16 *perror_out );
|
||||
|
||||
int32_t dot_product(int16_t *x,
|
||||
int16_t *y,
|
||||
uint32_t N, //must be a multiple of 8
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -180,5 +178,3 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // USER_MODE
|
||||
|
||||
@@ -19,11 +19,9 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
@@ -989,6 +989,7 @@ typedef struct PHY_VARS_eNB_s {
|
||||
LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA
|
||||
LTE_eNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p;
|
||||
LTE_eNB_DLSCH_t *dlsch_MCH;
|
||||
LTE_eNB_DLSCH_t *dlsch_PCH;
|
||||
LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX];
|
||||
|
||||
|
||||
@@ -153,7 +153,9 @@ typedef struct {
|
||||
/// prach_Config_enabled=1 means enabled. \vr{[0..1]}
|
||||
uint8_t prach_Config_enabled;
|
||||
/// PRACH Configuration Information
|
||||
#ifdef Rel14
|
||||
PRACH_eMTC_CONFIG_INFO prach_ConfigInfo;
|
||||
#endif
|
||||
} PRACH_eMTC_CONFIG_COMMON;
|
||||
|
||||
/// Enumeration for parameter \f$N_\text{ANRep}\f$ \ref PUCCH_CONFIG_DEDICATED::repetitionFactor.
|
||||
|
||||
@@ -125,10 +125,6 @@
|
||||
#define FIRST_CARRIER_OFFSET (HALF_NUMBER_OF_USEFUL_CARRIERS+NUMBER_OF_ZERO_CARRIERS)
|
||||
#define NUMBER_OF_OFDM_SYMBOLS_PER_SLOT (NUMBER_OF_SYMBOLS_PER_FRAME/LTE_SLOTS_PER_FRAME)
|
||||
|
||||
#ifdef EMOS
|
||||
#define EMOS_SCH_INDEX 1
|
||||
#endif //EMOS
|
||||
|
||||
#define EXTENSION_TYPE (PHY_config->PHY_framing.Extension_type)
|
||||
|
||||
#define NUMBER_OF_OFDM_CARRIERS_BYTES NUMBER_OF_OFDM_CARRIERS*4
|
||||
|
||||
@@ -22,11 +22,7 @@
|
||||
#ifndef __openair_TYPES_H__
|
||||
#define __openair_TYPES_H__
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*__openair_TYPES_H__ */
|
||||
|
||||
+11
-3
@@ -208,11 +208,19 @@ void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,re
|
||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||
@param br_flag indicator for eMTC PRACH
|
||||
*/
|
||||
void prach_procedures(PHY_VARS_eNB *eNB,
|
||||
#ifdef Rel14
|
||||
int br_flag
|
||||
void prach_procedures(PHY_VARS_eNB *eNB,
|
||||
int br_flag);
|
||||
#else
|
||||
void prach_procedures(PHY_VARS_eNB *eNB);
|
||||
#endif
|
||||
);
|
||||
|
||||
/*! \brief Function to compute subframe Number(DL and S) as a function of Frame type and TDD Configuration
|
||||
@param frame_parms Pointer to DL frame parameter descriptor
|
||||
@returns Subframe Number (DL,S)
|
||||
*/
|
||||
int subframe_num(LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
/*! \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 subframe Subframe index
|
||||
|
||||
@@ -24,40 +24,6 @@
|
||||
#ifndef __SCHED_EXTERN_H__
|
||||
#define __SCHED_EXTERN_H__
|
||||
|
||||
#ifndef USER_MODE
|
||||
#define __NO_VERSION__
|
||||
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
#include <rtai.h>
|
||||
//#include <rtai_posix.h>
|
||||
#include <rtai_fifos.h>
|
||||
#include <rtai_sched.h>
|
||||
#include <rtai_sem.h>
|
||||
//#include "rt_compat.h"
|
||||
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#endif /* USER_MODE */
|
||||
|
||||
#include "defs.h"
|
||||
//#include "dlc_engine.h"
|
||||
|
||||
@@ -71,11 +37,5 @@ extern int synch_wait_cnt;
|
||||
|
||||
extern int16_t hundred_times_delta_TF[100];
|
||||
extern uint16_t hundred_times_log10_NPRB[100];
|
||||
/*
|
||||
#ifdef EMOS
|
||||
extern fifo_dump_emos_UE emos_dump_UE;
|
||||
extern fifo_dump_emos_eNB emos_dump_eNB;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#endif /*__SCHED_EXTERN_H__ */
|
||||
|
||||
@@ -62,6 +62,7 @@ void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
||||
LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci);
|
||||
}
|
||||
|
||||
#ifdef Rel14
|
||||
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
||||
@@ -75,6 +76,7 @@ void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
|
||||
// copy dci configuration into eNB structure
|
||||
fill_mdci_and_dlsch(eNB,proc,&mpdcch_vars->mdci_alloc[mpdcch_vars->num_dci],pdu);
|
||||
}
|
||||
#endif
|
||||
|
||||
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
||||
@@ -760,10 +762,12 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||
case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
|
||||
// handle_nfapi_epdcch_pdu(eNB,dl_config_pdu);
|
||||
break;
|
||||
#ifdef Rel14
|
||||
case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
|
||||
handle_nfapi_mpdcch_pdu(eNB,proc,dl_config_pdu);
|
||||
eNB->mpdcch_vars[subframe&1].num_dci++;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,10 +36,6 @@
|
||||
#include "SCHED/extern.h"
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
|
||||
/* SYRTEM */
|
||||
uint8_t dci_ndi_toggle_even[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint8_t dci_ndi_toggle_odd[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
@@ -733,181 +729,3 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
|
||||
{
|
||||
|
||||
//uint8_t cooperation_flag = eNB->cooperation_flag;
|
||||
uint8_t transmission_mode = eNB->transmission_mode[0];
|
||||
|
||||
//uint32_t rballoc = 0x00F0;
|
||||
//uint32_t rballoc2 = 0x000F;
|
||||
/*
|
||||
uint32_t rand = taus();
|
||||
if ((subframe==8) || (subframe==9) || (subframe==0))
|
||||
rand = (rand%5)+5;
|
||||
else
|
||||
rand = (rand%4)+5;
|
||||
*/
|
||||
|
||||
DCI_pdu->Num_dci = 0;
|
||||
|
||||
switch (subframe) {
|
||||
case 5:
|
||||
DCI_pdu->Num_dci = 1;
|
||||
|
||||
if (transmission_mode<3) {
|
||||
//user 1
|
||||
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
|
||||
DCI_pdu->dci_alloc[0].L = 2;
|
||||
DCI_pdu->dci_alloc[0].rnti = 0x1235;
|
||||
DCI_pdu->dci_alloc[0].format = format1;
|
||||
DCI_pdu->dci_alloc[0].ra_flag = 0;
|
||||
DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
|
||||
|
||||
DLSCH_alloc_pdu.rballoc = eNB->ue_dl_rb_alloc;
|
||||
DLSCH_alloc_pdu.TPC = 0;
|
||||
DLSCH_alloc_pdu.dai = 0;
|
||||
DLSCH_alloc_pdu.harq_pid = 1;
|
||||
DLSCH_alloc_pdu.mcs = eNB->target_ue_dl_mcs;
|
||||
DLSCH_alloc_pdu.ndi = 1;
|
||||
DLSCH_alloc_pdu.rv = 0;
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
|
||||
|
||||
/*
|
||||
//user2
|
||||
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
|
||||
DCI_pdu->dci_alloc[1].L = 2;
|
||||
DCI_pdu->dci_alloc[1].rnti = 0x1236;
|
||||
DCI_pdu->dci_alloc[1].format = format1;
|
||||
DCI_pdu->dci_alloc[1].ra_flag = 0;
|
||||
DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE;
|
||||
|
||||
DLSCH_alloc_pdu.rballoc = rballoc2;
|
||||
DLSCH_alloc_pdu.TPC = 0;
|
||||
DLSCH_alloc_pdu.dai = 0;
|
||||
DLSCH_alloc_pdu.harq_pid = 1;
|
||||
DLSCH_alloc_pdu.mcs = eNB->target_ue_dl_mcs;
|
||||
DLSCH_alloc_pdu.ndi = 1;
|
||||
DLSCH_alloc_pdu.rv = 0;
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
|
||||
*/
|
||||
} else if (transmission_mode==5) {
|
||||
DCI_pdu->Num_dci = 2;
|
||||
// user 1
|
||||
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
|
||||
DCI_pdu->dci_alloc[0].L = 2;
|
||||
DCI_pdu->dci_alloc[0].rnti = 0x1235;
|
||||
DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
|
||||
DCI_pdu->dci_alloc[0].ra_flag = 0;
|
||||
DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
|
||||
|
||||
DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
|
||||
DLSCH_alloc_pdu1E.rv = 0;
|
||||
DLSCH_alloc_pdu1E.ndi = 1;
|
||||
DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs;
|
||||
DLSCH_alloc_pdu1E.harq_pid = 1;
|
||||
DLSCH_alloc_pdu1E.dai = 0;
|
||||
DLSCH_alloc_pdu1E.TPC = 0;
|
||||
DLSCH_alloc_pdu1E.rballoc = eNB->ue_dl_rb_alloc;
|
||||
DLSCH_alloc_pdu1E.rah = 0;
|
||||
DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
|
||||
|
||||
//user 2
|
||||
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
|
||||
DCI_pdu->dci_alloc[1].L = 2;
|
||||
DCI_pdu->dci_alloc[1].rnti = 0x1236;
|
||||
DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
|
||||
DCI_pdu->dci_alloc[1].ra_flag = 0;
|
||||
DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE;
|
||||
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
|
||||
|
||||
// set the precoder of the second UE orthogonal to the first
|
||||
eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 7:
|
||||
DCI_pdu->Num_dci = 1;
|
||||
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
|
||||
DCI_pdu->dci_alloc[0].L = 2;
|
||||
DCI_pdu->dci_alloc[0].rnti = 0xbeef;
|
||||
DCI_pdu->dci_alloc[0].format = format1A;
|
||||
DCI_pdu->dci_alloc[0].ra_flag = 1;
|
||||
DCI_pdu->dci_alloc[0].search_space = DCI_COMMON_SPACE;
|
||||
|
||||
RA_alloc_pdu.type = 1;
|
||||
RA_alloc_pdu.vrb_type = 0;
|
||||
RA_alloc_pdu.rballoc = computeRIV(25,12,3);
|
||||
RA_alloc_pdu.ndi = 1;
|
||||
RA_alloc_pdu.rv = 1;
|
||||
RA_alloc_pdu.mcs = 4;
|
||||
RA_alloc_pdu.harq_pid = 0;
|
||||
RA_alloc_pdu.TPC = 1;
|
||||
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
|
||||
break;
|
||||
|
||||
case 9:
|
||||
DCI_pdu->Num_dci = 1;
|
||||
|
||||
//user 1
|
||||
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
|
||||
DCI_pdu->dci_alloc[0].L = 2;
|
||||
DCI_pdu->dci_alloc[0].rnti = 0x1235;
|
||||
DCI_pdu->dci_alloc[0].format = format0;
|
||||
DCI_pdu->dci_alloc[0].ra_flag = 0;
|
||||
DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
|
||||
|
||||
UL_alloc_pdu.type = 0;
|
||||
UL_alloc_pdu.hopping = 0;
|
||||
UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb);
|
||||
UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs;
|
||||
UL_alloc_pdu.ndi = 1;
|
||||
UL_alloc_pdu.TPC = 0;
|
||||
UL_alloc_pdu.cshift = 0;
|
||||
UL_alloc_pdu.dai = 0;
|
||||
UL_alloc_pdu.cqi_req = 1;
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
|
||||
|
||||
/*
|
||||
//user 2
|
||||
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
|
||||
DCI_pdu->dci_alloc[1].L = 2;
|
||||
DCI_pdu->dci_alloc[1].rnti = 0x1236;
|
||||
DCI_pdu->dci_alloc[1].format = format0;
|
||||
DCI_pdu->dci_alloc[1].ra_flag = 0;
|
||||
|
||||
UL_alloc_pdu.type = 0;
|
||||
UL_alloc_pdu.hopping = 0;
|
||||
if (cooperation_flag==0)
|
||||
UL_alloc_pdu.rballoc = computeRIV(25,2+eNB->ue_ul_nb_rb,eNB->ue_ul_nb_rb);
|
||||
else
|
||||
UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb);
|
||||
UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs;
|
||||
UL_alloc_pdu.ndi = 1;
|
||||
UL_alloc_pdu.TPC = 0;
|
||||
if ((cooperation_flag==0) || (cooperation_flag==1))
|
||||
UL_alloc_pdu.cshift = 0;
|
||||
else
|
||||
UL_alloc_pdu.cshift = 1;
|
||||
UL_alloc_pdu.dai = 0;
|
||||
UL_alloc_pdu.cqi_req = 1;
|
||||
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
|
||||
*/
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/*
|
||||
DCI_pdu->nCCE = 0;
|
||||
|
||||
for (i=0; i<DCI_pdu->Num_dci; i++) {
|
||||
DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef __PHY_PROCEDURES_EMOS_H__
|
||||
#define __PHY_PROCEDURES_EMOS_H__
|
||||
|
||||
/*
|
||||
#ifndef RTAI
|
||||
typedef uint64_t RTIME;
|
||||
#else
|
||||
*/
|
||||
#ifdef RTAI
|
||||
#include <rtai.h>
|
||||
#include <rtai_fifos.h>
|
||||
#endif
|
||||
|
||||
//#include "PHY/TOOLS/defs.h"
|
||||
#include "PHY/defs.h"
|
||||
#define CHANSOUNDER_FIFO_SIZE 10485760 // 10 Mbytes FIFO
|
||||
//#define CHANSOUNDER_FIFO_SIZE 20971520 // 20 Mbytes FIFO
|
||||
#define CHANSOUNDER_FIFO_MINOR 4 // minor of the FIFO device - this is /dev/rtf3
|
||||
#define CHANSOUNDER_FIFO_DEV "/dev/rtf4"
|
||||
|
||||
#define NUMBER_OF_OFDM_CARRIERS_EMOS 512 // the number of OFDM carriers used for channel sounding
|
||||
#define NUMBER_OF_USEFUL_CARRIERS_EMOS 300 // the number of OFDM carriers that contain data
|
||||
|
||||
#define N_RB_UL_EMOS 25
|
||||
#define N_PILOTS_DL_EMOS 2 // ofdm symbols with pilots per slot
|
||||
#define N_PILOTS_UL_EMOS 2 // ofdm symbols with pilots per subframe
|
||||
#define N_SLOTS_DL_EMOS 2 // we take slots 14,15
|
||||
#define N_SUBFRAMES_UL_EMOS 1 // we take subframes 4
|
||||
#define NB_ANTENNAS_TX_EMOS 2
|
||||
#define NB_ANTENNAS_RX_EMOS 2
|
||||
|
||||
struct fifo_dump_emos_struct_UE {
|
||||
// RX
|
||||
uint64_t timestamp; //! Timestamp of the receiver
|
||||
unsigned int frame_tx; //! Framenumber of the TX (encoded in the BCH)
|
||||
unsigned int frame_rx; //! Framenumber of the RX
|
||||
UE_MODE_t UE_mode;
|
||||
PHY_MEASUREMENTS PHY_measurements; //! Structure holding all PHY measurements (one for every slot)
|
||||
unsigned int pbch_errors; /// Total number of errors on PBCH
|
||||
unsigned int pbch_errors_last; /// Total number of errors on PBCH 100 frames ago
|
||||
unsigned int pbch_errors_conseq; /// Total number of consecutive errors on PBCH
|
||||
unsigned int pbch_fer; /// PBCH FER (in percent)
|
||||
unsigned int dlsch_errors; /// Total number of error on the DLSCH (data)
|
||||
unsigned int dlsch_errors_last;
|
||||
unsigned int dlsch_received;
|
||||
unsigned int dlsch_received_last;
|
||||
unsigned int dlsch_fer;
|
||||
unsigned int dlsch_cntl_errors; /// Total number of error on the DLSCH (control)
|
||||
unsigned int dlsch_ra_errors; /// Total number of error on the DLSCH (random access)
|
||||
unsigned int total_TBS;
|
||||
unsigned int total_TBS_last;
|
||||
unsigned int bitrate;
|
||||
unsigned int total_received_bits;
|
||||
int timing_offset; /// Timing offset
|
||||
int timing_advance; /// Timing advance
|
||||
int freq_offset; /// Frequency offset
|
||||
int use_ia_receiver;
|
||||
unsigned short pmi_saved;
|
||||
unsigned short mcs;
|
||||
unsigned int rx_total_gain_dB; /// Total gain
|
||||
unsigned char eNb_id; /// eNb_id UE is synched to
|
||||
unsigned char mimo_mode; /// Transmission mode
|
||||
#ifdef EMOS_CHANNEL
|
||||
int channel[NB_ANTENNAS_RX_EMOS][NB_ANTENNAS_TX_EMOS][NUMBER_OF_OFDM_CARRIERS_EMOS*N_PILOTS_DL_EMOS*N_SLOTS_DL_EMOS];
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct fifo_dump_emos_struct_UE fifo_dump_emos_UE;
|
||||
|
||||
|
||||
struct fifo_dump_emos_struct_eNB {
|
||||
// TX
|
||||
uint64_t timestamp; //! Timestamp of the receiver
|
||||
unsigned int frame_tx; //! Framenumber of the TX
|
||||
unsigned char mimo_mode; /// Transmission mode
|
||||
// RX
|
||||
PHY_MEASUREMENTS_eNB PHY_measurements_eNB; /// UL measurements
|
||||
LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX]; /// Contains received feedback
|
||||
unsigned int rx_total_gain_dB; /// Total gain
|
||||
#ifdef EMOS_CHANNEL
|
||||
int channel[NB_ANTENNAS_RX_EMOS][N_RB_UL_EMOS*12*N_PILOTS_UL_EMOS*N_SUBFRAMES_UL_EMOS]; ///UL channel estimate
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct fifo_dump_emos_struct_eNB fifo_dump_emos_eNB;
|
||||
|
||||
#endif
|
||||
@@ -709,6 +709,26 @@ uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1)
|
||||
return(Np[0+plus1]);
|
||||
}
|
||||
|
||||
int subframe_num(LTE_DL_FRAME_PARMS *frame_parms){
|
||||
if (frame_parms->frame_type == FDD)
|
||||
return 10;
|
||||
|
||||
switch (frame_parms->tdd_config) {
|
||||
case 1:
|
||||
return 6;
|
||||
case 3:
|
||||
return 7;
|
||||
case 4:
|
||||
return 8;
|
||||
case 5:
|
||||
return 9;
|
||||
default:
|
||||
LOG_E(PHY,"Unsupported TDD configuration %d\n",frame_parms->tdd_config);
|
||||
AssertFatal(frame_parms->tdd_config==1 || frame_parms->tdd_config==3 || frame_parms->tdd_config==4 || frame_parms->tdd_config==5,"subframe x Unsupported TDD configuration");
|
||||
return(255);
|
||||
}
|
||||
}
|
||||
|
||||
lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe)
|
||||
{
|
||||
|
||||
|
||||
@@ -578,11 +578,12 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||
}
|
||||
|
||||
|
||||
void prach_procedures(PHY_VARS_eNB *eNB,
|
||||
#ifdef Rel14
|
||||
int br_flag
|
||||
void prach_procedures(PHY_VARS_eNB *eNB,
|
||||
int br_flag) {
|
||||
#else
|
||||
void prach_procedures(PHY_VARS_eNB *eNB) {
|
||||
#endif
|
||||
) {
|
||||
uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4];
|
||||
uint16_t i;
|
||||
int frame,subframe;
|
||||
@@ -890,10 +891,10 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
||||
if (uci->type == SR) {
|
||||
if (SR_payload == 1) {
|
||||
fill_sr_indication(eNB,uci->rnti,frame,subframe,metric_SR);
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
case HARQ:
|
||||
|
||||
@@ -51,10 +51,6 @@
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos_UE emos_dump_UE;
|
||||
#endif
|
||||
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
|
||||
@@ -68,6 +64,8 @@ fifo_dump_emos_UE emos_dump_UE;
|
||||
|
||||
#include "T.h"
|
||||
|
||||
#include "PHY/TOOLS/defs.h"
|
||||
|
||||
#define DLSCH_RB_ALLOC 0x1fbf // skip DC RB (total 23/25 RBs)
|
||||
#define DLSCH_RB_ALLOC_12 0x0aaa // skip DC RB (total 23/25 RBs)
|
||||
|
||||
@@ -1194,38 +1192,6 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
|
||||
}
|
||||
|
||||
|
||||
#ifdef EMOS
|
||||
/*
|
||||
void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
|
||||
uint8_t harq_pid;
|
||||
|
||||
|
||||
if (next_slot%2==0) {
|
||||
// get harq_pid from subframe relationship
|
||||
harq_pid = subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1));
|
||||
if (harq_pid==255) {
|
||||
LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n",
|
||||
0,ue->frame);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
|
||||
emos_dump_UE.uci_cnt[next_slot>>1] = 1;
|
||||
memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char));
|
||||
emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O;
|
||||
memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char));
|
||||
emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI;
|
||||
memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char));
|
||||
emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK;
|
||||
}
|
||||
else {
|
||||
emos_dump_UE.uci_cnt[next_slot>>1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empty_subframe) {
|
||||
|
||||
int aa;
|
||||
@@ -1425,9 +1391,6 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
||||
ue->prach_cnt=0;
|
||||
#ifdef SMBV
|
||||
ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
|
||||
#endif
|
||||
#ifdef OAI_EMU
|
||||
ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
||||
#endif
|
||||
LOG_I(PHY,"mode %d\n",mode);
|
||||
|
||||
@@ -1835,12 +1798,6 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PHY_ABSTRACTION
|
||||
else {
|
||||
ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,proc->subframe_rx,harq_pid,0);
|
||||
}
|
||||
|
||||
#endif
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(&ue->ulsch_encoding_stats);
|
||||
#endif
|
||||
@@ -2392,10 +2349,6 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
|
||||
start_meas(&ue->phy_proc_tx);
|
||||
#endif
|
||||
|
||||
#ifdef EMOS
|
||||
//phy_procedures_emos_UE_TX(next_slot);
|
||||
#endif
|
||||
|
||||
ue->tx_power_dBm[subframe_tx]=-127;
|
||||
|
||||
|
||||
@@ -2678,11 +2631,6 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
|
||||
ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
|
||||
}
|
||||
|
||||
#ifdef EMOS
|
||||
//emos_dump_UE.frame_tx = frame_tx;
|
||||
//emos_dump_UE.mimo_mode = ue->pbch_vars[eNB_id]->decoded_output[1];
|
||||
#endif
|
||||
|
||||
if (first_run) {
|
||||
first_run = 0;
|
||||
|
||||
@@ -4680,11 +4628,6 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *pr
|
||||
|
||||
}
|
||||
|
||||
#ifdef EMOS
|
||||
phy_procedures_emos_UE_RX(ue,slot,eNB_id);
|
||||
#endif
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
@@ -5164,11 +5107,6 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
|
||||
printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
|
||||
#endif
|
||||
|
||||
#ifdef EMOS
|
||||
phy_procedures_emos_UE_RX(ue,slot,eNB_id);
|
||||
#endif
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
|
||||
|
||||
#if UE_TIMING_TRACE
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/* Header file for making PLATON work on both RTLinux and RTAI using pthreads
|
||||
* Copyright Frank Wartena, 2004
|
||||
* Version: 0.1 January 28th, 2004 ## First version for scheduling test
|
||||
* 0.2 February 20th, 2004 ## All PLATON functions added
|
||||
* It is mostly a conversion from RTLinux to RTAI, because PLATON was written
|
||||
* for RTLinux.
|
||||
* Not all necessary conversions can be done in this header file, other
|
||||
* adjustments in the code are also necessary.
|
||||
*/
|
||||
|
||||
#ifndef _RT_COMPAT_H_
|
||||
#define _RT_COMPAT_H_
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
//the conversions from RTLinux to RTAI
|
||||
|
||||
//variable for containing times
|
||||
#define hrtime_t RTIME
|
||||
|
||||
//function for making a thread periodic
|
||||
#define pthread_make_periodic_np(x,y,z) rt_task_make_periodic(x,rt_get_time(),nano2count(z))
|
||||
|
||||
//function for printing to the kernel log
|
||||
#define rtl_printf printk
|
||||
|
||||
//function for determining the current cpu
|
||||
#define rtl_getcpuid hard_cpu_id
|
||||
|
||||
//function for initialising a mutex
|
||||
#define pthread_mutex_init pthread_mutex_init_rt
|
||||
|
||||
//function for initialising a mutex attribute
|
||||
#define pthread_mutexattr_init pthread_mutexattr_init_rt
|
||||
|
||||
//function for setting a mutex protocol, does not exist in RTAI
|
||||
#define pthread_mutexattr_setprotocol(x,y);
|
||||
|
||||
//function for locking a mutex
|
||||
#define pthread_mutex_lock pthread_mutex_lock_rt
|
||||
|
||||
//function for unlocking a mutex
|
||||
#define pthread_mutex_unlock pthread_mutex_unlock_rt
|
||||
|
||||
//function for destroying a mutex
|
||||
#define pthread_mutex_destroy pthread_mutex_destroy_rt
|
||||
|
||||
//function for getting the current time
|
||||
#define clock_gethrtime(x) rt_get_time_ns()
|
||||
#define gethrtime rt_get_time_ns
|
||||
|
||||
//function for initialising a condition
|
||||
#define pthread_cond_init pthread_cond_init_rt
|
||||
|
||||
//function for waiting on a condition
|
||||
#define pthread_cond_wait pthread_cond_wait_rt
|
||||
|
||||
//function for signalling a condition
|
||||
#define pthread_cond_signal pthread_cond_signal_rt
|
||||
|
||||
//function for destroying a condition
|
||||
#define pthread_cond_destroy pthread_cond_destroy_rt
|
||||
|
||||
//function for waking up a thread
|
||||
#define pthread_wakeup_np rt_task_resume
|
||||
|
||||
//function for getting the current thread
|
||||
#define pthread_self rt_whoami
|
||||
|
||||
//function for initialising an attribute
|
||||
#define pthread_attr_init pthread_attr_init_rt
|
||||
|
||||
//function for setting a schedparam
|
||||
#define pthread_attr_setschedparam pthread_attr_setschedparam_rt
|
||||
|
||||
//funcion for setting a schedpolicy
|
||||
#define pthread_attr_setschedpolicy pthread_attr_setschedpolicy_rt
|
||||
|
||||
//function for creating a thread
|
||||
#define pthread_create pthread_create_rt
|
||||
|
||||
//function for cancelling a thread
|
||||
#define pthread_cancel pthread_cancel_rt
|
||||
|
||||
//function for deleting a thread, in RTAI both by calling cancel
|
||||
#define pthread_delete_np pthread_cancel_rt
|
||||
|
||||
//testing if a cpuid exists
|
||||
#define rtl_cpu_exists(x) x<NR_RT_CPUS
|
||||
|
||||
//function for flushing a fifo does not exist in RTAI
|
||||
#define rtf_flush(x);
|
||||
|
||||
//function for setting the stacksize
|
||||
#define pthread_attr_setstacksize pthread_attr_setstacksize_rt
|
||||
|
||||
//function for sleeping the indicated amount in nanoseconds
|
||||
//#define rtl_delay(x) rt_sleep(nano2count(x))
|
||||
//#define udelay(x) rt_sleep(nano2count(1000*x))
|
||||
//#define usleep(x) rt_sleep(nano2count(1000*x))
|
||||
|
||||
#define pthread_exit pthread_exit_rt
|
||||
|
||||
//function for indicating that a thread uses the FPU
|
||||
#define pthread_setfp_np rt_task_use_fpu
|
||||
|
||||
//function for freeing a soft irq
|
||||
#define rtl_free_soft_irq(x) rt_free_linux_irq(x,NULL)
|
||||
|
||||
//function for triggering a soft irq
|
||||
#define rtl_global_pend_irq rt_pend_linux_irq
|
||||
|
||||
//function for setting the thread scheduling, does not exist in RTAI
|
||||
#define pthread_setschedparam(x,y,z);
|
||||
|
||||
#endif /* RTAI_ENABLED */
|
||||
|
||||
#endif /* _RT_COMPAT_H_ */
|
||||
@@ -38,10 +38,6 @@
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
#include "PHY/LTE_TRANSPORT/if5_tools.h"
|
||||
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
@@ -38,10 +38,7 @@
|
||||
#include "UTIL/OCG/OCG_extern.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
#ifdef USER_MODE
|
||||
# include "multicast_link.h"
|
||||
# include "pgm_link.h"
|
||||
#endif
|
||||
#include "multicast_link.h"
|
||||
|
||||
char rx_bufferP[BYPASS_RX_BUFFER_SIZE];
|
||||
unsigned int num_bytesP = 0;
|
||||
@@ -51,10 +48,6 @@ static unsigned int byte_tx_count;
|
||||
unsigned int Master_list_rx;
|
||||
static uint64_t seq_num_tx = 0;
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
extern unsigned int pgm_would_block;
|
||||
#endif
|
||||
|
||||
mapping transport_names[] = {
|
||||
{"WAIT PM TRANSPORT INFO", EMU_TRANSPORT_INFO_WAIT_PM},
|
||||
{"WAIT SM TRANSPORT INFO", EMU_TRANSPORT_INFO_WAIT_SM},
|
||||
@@ -62,9 +55,6 @@ mapping transport_names[] = {
|
||||
{"ENB_TRANSPORT INFO", EMU_TRANSPORT_INFO_ENB},
|
||||
{"UE TRANSPORT INFO", EMU_TRANSPORT_INFO_UE},
|
||||
{"RELEASE TRANSPORT INFO", EMU_TRANSPORT_INFO_RELEASE},
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
{"NACK TRANSPORT INFO", EMU_TRANSPORT_NACK},
|
||||
#endif
|
||||
{NULL, -1}
|
||||
};
|
||||
|
||||
@@ -79,9 +69,6 @@ void init_bypass (void)
|
||||
pthread_mutex_init (&emul_low_mutex, NULL);
|
||||
pthread_cond_init (&emul_low_cond, NULL);
|
||||
emul_low_mutex_var = 1;
|
||||
#endif
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
pgm_oai_init(oai_emulation.info.multicast_ifname);
|
||||
#endif
|
||||
bypass_init (emul_tx_handler, emul_rx_handler);
|
||||
}
|
||||
@@ -90,10 +77,8 @@ void init_bypass (void)
|
||||
void bypass_init (tx_handler_t tx_handlerP, rx_handler_t rx_handlerP)
|
||||
{
|
||||
/***************************************************************************/
|
||||
#if defined(USER_MODE)
|
||||
multicast_link_start (bypass_rx_handler, oai_emulation.info.multicast_group,
|
||||
oai_emulation.info.multicast_ifname);
|
||||
#endif //USER_MODE
|
||||
tx_handler = tx_handlerP;
|
||||
rx_handler = rx_handlerP;
|
||||
Master_list_rx=0;
|
||||
@@ -322,20 +307,12 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot,
|
||||
frame, next_slot, is_master);
|
||||
|
||||
#if defined(ENABLE_NEW_MULTICAST)
|
||||
# if defined(ENABLE_PGM_TRANSPORT)
|
||||
num_bytesP = pgm_recv_msg(oai_emulation.info.multicast_group,
|
||||
(uint8_t *)&rx_bufferP[0], sizeof(rx_bufferP),
|
||||
frame, next_slot);
|
||||
|
||||
DevCheck(num_bytesP > 0, num_bytesP, 0, 0);
|
||||
# else
|
||||
|
||||
if (multicast_link_read_data_from_sock(is_master) == 1) {
|
||||
/* We got a timeout */
|
||||
return -1;
|
||||
}
|
||||
|
||||
# endif
|
||||
#else
|
||||
pthread_mutex_lock(&emul_low_mutex);
|
||||
|
||||
@@ -363,10 +340,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot,
|
||||
num_bytesP, map_int_to_str(transport_names, messg->Message_type),
|
||||
messg->master_id,
|
||||
messg->seq_num);
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
|
||||
if (messg->Message_type != EMU_TRANSPORT_NACK)
|
||||
#endif
|
||||
DevCheck4((messg->frame == frame) && (messg->subframe == (next_slot>>1)),
|
||||
messg->frame, frame, messg->subframe, next_slot>>1);
|
||||
|
||||
@@ -409,20 +382,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot,
|
||||
Master_list_rx = oai_emulation.info.master_list;
|
||||
LOG_E(EMU, "RX EMU_TRANSPORT_INFO_RELEASE\n");
|
||||
break;
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
|
||||
case EMU_TRANSPORT_NACK:
|
||||
if (messg->failing_master_id == oai_emulation.info.master_id) {
|
||||
/* We simply re-send the last message */
|
||||
pgm_link_send_msg(oai_emulation.info.multicast_group,
|
||||
(uint8_t *)bypass_tx_buffer, byte_tx_count);
|
||||
} else {
|
||||
/* Sleep awhile till other peers have recovered data */
|
||||
usleep(500);
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
LOG_E(EMU, "[MAC][BYPASS] ERROR RX UNKNOWN MESSAGE\n");
|
||||
@@ -448,35 +407,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot,
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
/******************************************************************************************************/
|
||||
#ifndef USER_MODE
|
||||
int bypass_rx_handler(unsigned int fifo, int rw)
|
||||
{
|
||||
/******************************************************************************************************/
|
||||
int bytes_read;
|
||||
int bytes_processed=0;
|
||||
int header_bytes; //, elapsed_time;
|
||||
//printk("[BYPASS] BYPASS_RX_HANDLER IN...\n");
|
||||
header_bytes= rtf_get(fifo_bypass_phy_user2kern, rx_bufferP,
|
||||
sizeof(bypass_proto2multicast_header_t) );
|
||||
|
||||
if (header_bytes> 0) {
|
||||
bytes_read = rtf_get(fifo_bypass_phy_user2kern, &rx_bufferP[header_bytes],
|
||||
((bypass_proto2multicast_header_t *) (&rx_bufferP[0]))->size);
|
||||
|
||||
// printk("BYTES_READ=%d\n",bytes_read);
|
||||
if (bytes_read > 0) {
|
||||
num_bytesP=header_bytes+bytes_read;
|
||||
emul_low_mutex_var=0;
|
||||
//printk("BYPASS_PHY SIGNAL MAC_LOW...\n");
|
||||
pthread_cond_signal(&emul_low_cond);
|
||||
}
|
||||
}
|
||||
|
||||
// }
|
||||
return 0;
|
||||
}
|
||||
#else //USER_MODE
|
||||
/******************************************************************************************************/
|
||||
void bypass_rx_handler(unsigned int Num_bytes,char *Rx_buffer)
|
||||
{
|
||||
@@ -503,7 +433,6 @@ void bypass_rx_handler(unsigned int Num_bytes,char *Rx_buffer)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif //USER_MODE
|
||||
|
||||
/******************************************************************************************************/
|
||||
void bypass_signal_mac_phy(unsigned int frame, unsigned int last_slot,
|
||||
@@ -511,57 +440,12 @@ void bypass_signal_mac_phy(unsigned int frame, unsigned int last_slot,
|
||||
{
|
||||
/******************************************************************************************************/
|
||||
if (Master_list_rx != oai_emulation.info.master_list) {
|
||||
#ifndef USER_MODE
|
||||
rtf_put(fifo_mac_bypass, &tt, 1);
|
||||
/* the Rx window is still opened (Re)signal bypass_phy (emulate MAC signal) */
|
||||
#endif
|
||||
bypass_rx_data(frame, last_slot, next_slot, is_master);
|
||||
} else {
|
||||
Master_list_rx = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef USER_MODE
|
||||
/***************************************************************************/
|
||||
int multicast_link_write_sock (int groupP, char *dataP, unsigned int sizeP)
|
||||
{
|
||||
/***************************************************************************/
|
||||
int tx_bytes=0;
|
||||
|
||||
pthread_mutex_lock(&Tx_mutex);
|
||||
|
||||
while(!Tx_mutex_var) {
|
||||
pthread_cond_wait(&Tx_cond,&Tx_mutex);
|
||||
}
|
||||
|
||||
Tx_mutex_var=0;
|
||||
N_P=(int)((sizeP-sizeof (bypass_proto2multicast_header_t))/1000)+2;
|
||||
tx_bytes += rtf_put (fifo_bypass_phy_kern2user, &dataP[tx_bytes],
|
||||
sizeof (bypass_proto2multicast_header_t));
|
||||
|
||||
while(tx_bytes<sizeP) {
|
||||
if(sizeP-tx_bytes<=1000) {
|
||||
tx_bytes += rtf_put (fifo_bypass_phy_kern2user, &dataP[tx_bytes],
|
||||
sizeP-tx_bytes);
|
||||
} else {
|
||||
tx_bytes += rtf_put (fifo_bypass_phy_kern2user, &dataP[tx_bytes],1000);
|
||||
}
|
||||
}
|
||||
|
||||
//RG_tx_mutex_var=0;
|
||||
pthread_mutex_unlock(&Tx_mutex);
|
||||
|
||||
return tx_bytes;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
void bypass_tx_nack(unsigned int frame, unsigned int next_slot)
|
||||
{
|
||||
bypass_tx_data(NACK_TRANSPORT, frame, next_slot);
|
||||
}
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
void bypass_tx_data(emu_transport_info_t Type, unsigned int frame, unsigned int next_slot)
|
||||
{
|
||||
@@ -591,26 +475,6 @@ void bypass_tx_data(emu_transport_info_t Type, unsigned int frame, unsigned int
|
||||
byte_tx_count = sizeof (bypass_msg_header_t) + sizeof (
|
||||
bypass_proto2multicast_header_t);
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
|
||||
if (Type == NACK_TRANSPORT) {
|
||||
int i;
|
||||
messg->Message_type = EMU_TRANSPORT_NACK;
|
||||
|
||||
for (i = 0; i < oai_emulation.info.nb_master; i++) {
|
||||
/* Skip our id */
|
||||
if (i == oai_emulation.info.master_id)
|
||||
continue;
|
||||
|
||||
if ((Master_list_rx & (1 << i)) == 0) {
|
||||
messg->failing_master_id = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_T(EMU,"[TX_DATA] NACK TRANSPORT\n");
|
||||
} else
|
||||
#endif
|
||||
if (Type == WAIT_PM_TRANSPORT) {
|
||||
messg->Message_type = EMU_TRANSPORT_INFO_WAIT_PM;
|
||||
LOG_T(EMU,"[TX_DATA] WAIT SYNC PM TRANSPORT\n");
|
||||
@@ -702,32 +566,11 @@ void bypass_tx_data(emu_transport_info_t Type, unsigned int frame, unsigned int
|
||||
((bypass_proto2multicast_header_t *) bypass_tx_buffer)->size = byte_tx_count -
|
||||
sizeof (bypass_proto2multicast_header_t);
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
pgm_link_send_msg(oai_emulation.info.multicast_group,
|
||||
(uint8_t *)bypass_tx_buffer, byte_tx_count);
|
||||
#else
|
||||
multicast_link_write_sock(oai_emulation.info.multicast_group,
|
||||
bypass_tx_buffer, byte_tx_count);
|
||||
#endif
|
||||
|
||||
LOG_D(EMU, "Frame %d, subframe %d (%d): Sent %d bytes [%s] with master_id %d and seq %"PRIuMAX"\n",
|
||||
frame, next_slot>>1, next_slot,byte_tx_count, map_int_to_str(transport_names, Type),
|
||||
messg->master_id, messg->seq_num);
|
||||
}
|
||||
|
||||
#ifndef USER_MODE
|
||||
/*********************************************************************************************************************/
|
||||
int bypass_tx_handler(unsigned int fifo, int rw)
|
||||
{
|
||||
/***************************************************************************/
|
||||
if(++N_R==N_P) {
|
||||
rtf_reset(fifo_bypass_phy_kern2user);
|
||||
|
||||
Tx_mutex_var=1;
|
||||
N_R=0;
|
||||
|
||||
pthread_cond_signal(&Tx_cond);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -41,9 +41,6 @@ typedef enum emu_transport_info_e {
|
||||
EMU_TRANSPORT_INFO_ENB,
|
||||
EMU_TRANSPORT_INFO_UE,
|
||||
EMU_TRANSPORT_INFO_RELEASE
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
,EMU_TRANSPORT_NACK
|
||||
#endif
|
||||
} emu_transport_info_t;
|
||||
|
||||
#define WAIT_PM_TRANSPORT 1
|
||||
@@ -52,9 +49,6 @@ typedef enum emu_transport_info_e {
|
||||
#define ENB_TRANSPORT 4
|
||||
#define UE_TRANSPORT 5
|
||||
#define RELEASE_TRANSPORT 6
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
# define NACK_TRANSPORT 7
|
||||
#endif
|
||||
|
||||
#define WAIT_SYNC_TRANSPORT 1
|
||||
#define SYNCED_TRANSPORT 2
|
||||
|
||||
@@ -40,49 +40,17 @@
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
#include "pgm_link.h"
|
||||
|
||||
extern unsigned int Master_list_rx;
|
||||
|
||||
extern unsigned char NB_INST;
|
||||
//#define DEBUG_CONTROL 1
|
||||
//#define DEBUG_EMU 1
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
extern unsigned int pgm_would_block;
|
||||
#endif
|
||||
|
||||
void emu_transport_sync(void)
|
||||
{
|
||||
LOG_D(EMU, "Entering EMU transport SYNC is primary master %d\n",
|
||||
oai_emulation.info.is_primary_master);
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
|
||||
if (oai_emulation.info.is_primary_master == 0) {
|
||||
bypass_tx_data(WAIT_SM_TRANSPORT,0,0);
|
||||
// just wait to recieve the master 0 msg
|
||||
Master_list_rx = oai_emulation.info.master_list - 1;
|
||||
bypass_rx_data(0,0,0,1);
|
||||
} else {
|
||||
bypass_rx_data(0,0,0,0);
|
||||
bypass_tx_data(WAIT_PM_TRANSPORT,0,0);
|
||||
}
|
||||
|
||||
if (oai_emulation.info.master_list != 0) {
|
||||
bypass_tx_data(SYNC_TRANSPORT,0,0);
|
||||
bypass_rx_data(0,0,0,0);
|
||||
|
||||
// i received the sync from all secondary masters
|
||||
if (emu_rx_status == SYNCED_TRANSPORT) {
|
||||
emu_tx_status = SYNCED_TRANSPORT;
|
||||
}
|
||||
|
||||
LOG_D(EMU,"TX secondary master SYNC_TRANSPORT state \n");
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (oai_emulation.info.is_primary_master == 0) {
|
||||
retry:
|
||||
bypass_tx_data(WAIT_SM_TRANSPORT,0,0);
|
||||
@@ -115,8 +83,6 @@ retry2:
|
||||
LOG_D(EMU,"TX secondary master SYNC_TRANSPORT state \n");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
LOG_D(EMU, "Leaving EMU transport SYNC is primary master %d\n",
|
||||
oai_emulation.info.is_primary_master);
|
||||
}
|
||||
@@ -154,9 +120,6 @@ void emu_transport(unsigned int frame, unsigned int last_slot,
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
pgm_would_block = 0;
|
||||
#endif
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_EMU_TRANSPORT, VCD_FUNCTION_OUT);
|
||||
}
|
||||
|
||||
@@ -31,11 +31,7 @@
|
||||
#ifndef __BYPASS_SESSION_LAYER_EXTERN_H__
|
||||
# define __BYPASS_SESSION_LAYER_EXTERN_H__
|
||||
|
||||
#ifndef USER_MODE
|
||||
#include <rtai_posix.h>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#endif //RTAI_ENABLED
|
||||
|
||||
extern unsigned char Emulation_status;
|
||||
extern unsigned char emu_tx_status;
|
||||
|
||||
@@ -54,9 +54,7 @@
|
||||
#include "socket.h"
|
||||
#include "multicast_link.h"
|
||||
|
||||
#ifdef USER_MODE
|
||||
# include "UTIL/LOG/log.h"
|
||||
#endif //USER_MODE
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
extern unsigned short Master_id;
|
||||
|
||||
@@ -316,9 +314,7 @@ void multicast_link_start(void (*rx_handlerP) (unsigned int, char *),
|
||||
LOG_I(EMU, "[MULTICAST] LINK START on interface=%s for group=%d: handler=%p\n",
|
||||
(multicast_if == NULL) ? "not specified" : multicast_if, multicast_group,
|
||||
rx_handler);
|
||||
#if !defined(ENABLE_PGM_TRANSPORT)
|
||||
multicast_link_init ();
|
||||
#endif
|
||||
#if ! defined(ENABLE_NEW_MULTICAST)
|
||||
LOG_D(EMU, "[MULTICAST] multicast link start thread\n");
|
||||
|
||||
|
||||
@@ -1,417 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file pgm_link.c
|
||||
* \brief implementation a warpper for openpgm for reliable multicast transmission
|
||||
* \author Navid Nikaein and S. Roux
|
||||
* \date 2013 - 2014
|
||||
* \version 1.0
|
||||
* \company Eurecom
|
||||
* \email: navid.nikaein@eurecom.fr
|
||||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
|
||||
#include <pgm/pgm.h>
|
||||
|
||||
#include "assertions.h"
|
||||
|
||||
#include "pgm_link.h"
|
||||
#include "multicast_link.h"
|
||||
|
||||
#include "UTIL/OCG/OCG.h"
|
||||
#include "UTIL/OCG/OCG_extern.h"
|
||||
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
// #define ENABLE_PGM_DEBUG
|
||||
|
||||
typedef struct {
|
||||
pgm_sock_t *sock;
|
||||
uint16_t port;
|
||||
uint8_t rx_buffer[40000];
|
||||
} pgm_multicast_group_t;
|
||||
|
||||
pgm_multicast_group_t pgm_multicast_group[MULTICAST_LINK_NUM_GROUPS];
|
||||
|
||||
static
|
||||
int pgm_create_socket(int index, const char *if_addr);
|
||||
|
||||
unsigned int pgm_would_block = 1;
|
||||
|
||||
#if defined(ENABLE_PGM_DEBUG)
|
||||
static void
|
||||
log_handler (
|
||||
const int log_level,
|
||||
const char* message,
|
||||
void* closure
|
||||
)
|
||||
{
|
||||
printf("%s\n", message);
|
||||
}
|
||||
#endif
|
||||
|
||||
int pgm_oai_init(char *if_addr)
|
||||
{
|
||||
pgm_error_t* pgm_err = NULL;
|
||||
|
||||
memset(pgm_multicast_group, 0,
|
||||
MULTICAST_LINK_NUM_GROUPS * sizeof(pgm_multicast_group_t));
|
||||
|
||||
#if defined(ENABLE_PGM_DEBUG)
|
||||
pgm_messages_init();
|
||||
pgm_min_log_level = PGM_LOG_LEVEL_DEBUG;
|
||||
pgm_log_mask = 0xFFF;
|
||||
|
||||
pgm_log_set_handler(log_handler, NULL);
|
||||
#endif
|
||||
|
||||
if (!pgm_init(&pgm_err)) {
|
||||
LOG_E(EMU, "Unable to start PGM engine: %s\n", pgm_err->message);
|
||||
pgm_error_free (pgm_err);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return pgm_create_socket(oai_emulation.info.multicast_group, if_addr);
|
||||
}
|
||||
|
||||
int pgm_recv_msg(int group, uint8_t *buffer, uint32_t length,
|
||||
unsigned int frame, unsigned int next_slot)
|
||||
{
|
||||
size_t num_bytes = 0;
|
||||
int status = 0;
|
||||
pgm_error_t* pgm_err = NULL;
|
||||
struct pgm_sockaddr_t from;
|
||||
socklen_t fromlen = sizeof(from);
|
||||
uint32_t timeout = 0;
|
||||
int flags = 0;
|
||||
|
||||
if (pgm_would_block == 0) {
|
||||
flags = MSG_DONTWAIT;
|
||||
}
|
||||
|
||||
DevCheck((group <= MULTICAST_LINK_NUM_GROUPS) && (group >= 0),
|
||||
group, MULTICAST_LINK_NUM_GROUPS, 0);
|
||||
|
||||
#ifdef DEBUG_EMU
|
||||
LOG_I(EMU, "[PGM] Entering recv function for group %d\n", group);
|
||||
#endif
|
||||
|
||||
do {
|
||||
status = pgm_recvfrom(pgm_multicast_group[group].sock,
|
||||
buffer,
|
||||
length,
|
||||
flags,
|
||||
&num_bytes,
|
||||
&from,
|
||||
&fromlen,
|
||||
&pgm_err);
|
||||
|
||||
if (PGM_IO_STATUS_NORMAL == status) {
|
||||
#ifdef DEBUG_EMU
|
||||
LOG_D(EMU, "[PGM] Received %d bytes for group %d\n", num_bytes, group);
|
||||
#endif
|
||||
return num_bytes;
|
||||
} else if (PGM_IO_STATUS_TIMER_PENDING == status) {
|
||||
if (pgm_would_block == 0) {
|
||||
/* We sleep for 50 usec */
|
||||
usleep(50);
|
||||
|
||||
timeout ++;
|
||||
|
||||
if (timeout == (1000000 / 50)) {
|
||||
LOG_W(EMU, "[PGM] A packet has been lost -> ask for retransmit\n");
|
||||
/* If we do not receive a packet after 10000usec
|
||||
* -> send a NACK */
|
||||
bypass_tx_nack(frame, next_slot);
|
||||
timeout = 0;
|
||||
}
|
||||
}
|
||||
} else if (PGM_IO_STATUS_RESET == status) {
|
||||
LOG_W(EMU, "[PGM] Got session reset\n");
|
||||
} else {
|
||||
#ifdef DEBUG_EMU
|
||||
LOG_D(EMU, "[PGM] Got status %d\n", status);
|
||||
#endif
|
||||
|
||||
if (pgm_err) {
|
||||
LOG_E(EMU, "[PGM] recvform failed: %s", pgm_err->message);
|
||||
pgm_error_free (pgm_err);
|
||||
pgm_err = NULL;
|
||||
}
|
||||
}
|
||||
} while(status != PGM_IO_STATUS_NORMAL);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pgm_link_send_msg(int group, uint8_t *data, uint32_t len)
|
||||
{
|
||||
int status;
|
||||
size_t bytes_written = 0;
|
||||
|
||||
do {
|
||||
status = pgm_send(pgm_multicast_group[group].sock, data, len, &bytes_written);
|
||||
} while(status == PGM_IO_STATUS_WOULD_BLOCK);
|
||||
|
||||
if (status != PGM_IO_STATUS_NORMAL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
static
|
||||
int pgm_create_socket(int index, const char *if_addr)
|
||||
{
|
||||
struct pgm_addrinfo_t* res = NULL;
|
||||
pgm_error_t* pgm_err = NULL;
|
||||
sa_family_t sa_family = AF_INET;
|
||||
int udp_encap_port = 46014 + index;
|
||||
int max_tpdu = 1500;
|
||||
int sqns = 100;
|
||||
int port = 0;
|
||||
struct pgm_sockaddr_t addr;
|
||||
int blocking = 1;
|
||||
int multicast_loop = 0;
|
||||
int multicast_hops = 0;
|
||||
int dscp, i;
|
||||
|
||||
port = udp_encap_port;
|
||||
|
||||
/* Use PGM */
|
||||
udp_encap_port = 0;
|
||||
|
||||
LOG_D(EMU, "[PGM] Preparing socket for group %d and address %s\n",
|
||||
index, if_addr);
|
||||
|
||||
if (!pgm_getaddrinfo(if_addr, NULL, &res, &pgm_err)) {
|
||||
LOG_E(EMU, "Parsing network parameter: %s\n", pgm_err->message);
|
||||
goto err_abort;
|
||||
}
|
||||
|
||||
if (udp_encap_port) {
|
||||
LOG_I(EMU, "[PGM] Creating PGM/UDP socket for encapsulated port %d\n",
|
||||
udp_encap_port);
|
||||
|
||||
if (!pgm_socket (&pgm_multicast_group[index].sock, sa_family,
|
||||
SOCK_SEQPACKET, IPPROTO_UDP, &pgm_err)) {
|
||||
LOG_E(EMU, "[PGM] Socket: %s\n", pgm_err->message);
|
||||
goto err_abort;
|
||||
}
|
||||
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port,
|
||||
sizeof(udp_encap_port));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port,
|
||||
sizeof(udp_encap_port));
|
||||
} else {
|
||||
LOG_I(EMU, "[PGM] Creating PGM/IP socket\n");
|
||||
|
||||
if (!pgm_socket(&pgm_multicast_group[index].sock, sa_family,
|
||||
SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) {
|
||||
LOG_E(EMU, "Creating PGM/IP socket: %s\n", pgm_err->message);
|
||||
goto err_abort;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
/* Use RFC 2113 tagging for PGM Router Assist */
|
||||
const int no_router_assist = 0;
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_IP_ROUTER_ALERT, &no_router_assist,
|
||||
sizeof(no_router_assist));
|
||||
}
|
||||
|
||||
// pgm_drop_superuser();
|
||||
|
||||
{
|
||||
/* set PGM parameters */
|
||||
const int recv_only = 0,
|
||||
passive = 0,
|
||||
peer_expiry = pgm_secs (300),
|
||||
spmr_expiry = pgm_msecs (250),
|
||||
nak_bo_ivl = pgm_msecs (10),
|
||||
nak_rpt_ivl = pgm_secs (2),
|
||||
nak_rdata_ivl = pgm_secs (2),
|
||||
nak_data_retries = 50,
|
||||
nak_ncf_retries = 50,
|
||||
ambient_spm = pgm_secs(30);
|
||||
const int heartbeat_spm[] = {
|
||||
pgm_msecs (100),
|
||||
pgm_msecs (100),
|
||||
pgm_msecs (100),
|
||||
pgm_msecs (100),
|
||||
pgm_msecs (1300),
|
||||
pgm_secs (7),
|
||||
pgm_secs (16),
|
||||
pgm_secs (25),
|
||||
pgm_secs (30)
|
||||
};
|
||||
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_RECV_ONLY, &recv_only, sizeof(recv_only));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_PASSIVE, &passive, sizeof(passive));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_MTU, &max_tpdu, sizeof(max_tpdu));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_RXW_SQNS, &sqns, sizeof(sqns));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_TXW_SQNS, &sqns, sizeof(sqns));
|
||||
}
|
||||
|
||||
/* create global session identifier */
|
||||
memset (&addr, 0, sizeof(addr));
|
||||
/* sa_port should be in host byte order */
|
||||
addr.sa_port = port;
|
||||
addr.sa_addr.sport = DEFAULT_DATA_SOURCE_PORT + index;
|
||||
|
||||
if (!pgm_gsi_create_from_hostname(&addr.sa_addr.gsi, &pgm_err)) {
|
||||
LOG_E(EMU, "[PGM] Creating GSI: %s\n", pgm_err->message);
|
||||
goto err_abort;
|
||||
}
|
||||
|
||||
LOG_D(EMU, "[PGM] Created GSI %s\n", pgm_tsi_print(&addr.sa_addr));
|
||||
|
||||
/* assign socket to specified address */
|
||||
{
|
||||
struct pgm_interface_req_t if_req;
|
||||
memset (&if_req, 0, sizeof(if_req));
|
||||
if_req.ir_interface = res->ai_recv_addrs[0].gsr_interface;
|
||||
if_req.ir_scope_id = 0;
|
||||
|
||||
if (AF_INET6 == sa_family) {
|
||||
struct sockaddr_in6 sa6;
|
||||
memcpy (&sa6, &res->ai_recv_addrs[0].gsr_group, sizeof(sa6));
|
||||
if_req.ir_scope_id = sa6.sin6_scope_id;
|
||||
}
|
||||
|
||||
if (!pgm_bind3(pgm_multicast_group[index].sock, &addr, sizeof(addr),
|
||||
&if_req, sizeof(if_req), /* tx interface */
|
||||
&if_req, sizeof(if_req), /* rx interface */
|
||||
&pgm_err)) {
|
||||
LOG_E(EMU, "[PGM] Error: %s\n", pgm_err->message);
|
||||
goto err_abort;
|
||||
}
|
||||
}
|
||||
|
||||
/* join IP multicast groups */
|
||||
{
|
||||
struct group_req req;
|
||||
struct sockaddr_in addr_in;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
/* Interface index */
|
||||
req.gr_interface = res->ai_recv_addrs[0].gsr_interface;
|
||||
|
||||
addr_in.sin_family = AF_INET;
|
||||
addr_in.sin_port = htons(port);
|
||||
|
||||
for (i = 0; i < MULTICAST_LINK_NUM_GROUPS; i++) {
|
||||
addr_in.sin_addr.s_addr = inet_addr(multicast_group_list[i]);
|
||||
memcpy(&req.gr_group, &addr_in, sizeof(addr_in));
|
||||
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_JOIN_GROUP, &req,
|
||||
sizeof(struct group_req));
|
||||
}
|
||||
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_SEND_GROUP, &req,
|
||||
sizeof(struct group_req));
|
||||
}
|
||||
|
||||
pgm_freeaddrinfo(res);
|
||||
res = NULL;
|
||||
|
||||
/* set IP parameters */
|
||||
multicast_hops = 64;
|
||||
dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */
|
||||
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop));
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM,
|
||||
PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops));
|
||||
|
||||
if (AF_INET6 != sa_family)
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, PGM_TOS,
|
||||
&dscp, sizeof(dscp));
|
||||
|
||||
pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, PGM_NOBLOCK,
|
||||
&blocking, sizeof(blocking));
|
||||
|
||||
if (!pgm_connect(pgm_multicast_group[index].sock, &pgm_err)) {
|
||||
LOG_E(EMU, "[PGM] Connecting socket: %s\n", pgm_err->message);
|
||||
goto err_abort;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_abort:
|
||||
|
||||
if (NULL != pgm_multicast_group[index].sock) {
|
||||
pgm_close(pgm_multicast_group[index].sock, FALSE);
|
||||
pgm_multicast_group[index].sock = NULL;
|
||||
}
|
||||
|
||||
if (NULL != res) {
|
||||
pgm_freeaddrinfo(res);
|
||||
res = NULL;
|
||||
}
|
||||
|
||||
if (NULL != pgm_err) {
|
||||
pgm_error_free(pgm_err);
|
||||
pgm_err = NULL;
|
||||
}
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef PGM_LINK_H_
|
||||
#define PGM_LINK_H_
|
||||
|
||||
/* Define prototypes only if enabled */
|
||||
#if defined(ENABLE_PGM_TRANSPORT)
|
||||
void bypass_tx_nack(unsigned int frame, unsigned int next_slot);
|
||||
|
||||
int pgm_oai_init(char *if_name);
|
||||
|
||||
int pgm_recv_msg(int group, uint8_t *buffer, uint32_t length,
|
||||
unsigned int frame, unsigned int next_slot);
|
||||
|
||||
int pgm_link_send_msg(int group, uint8_t *data, uint32_t len);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* PGM_LINK_H_ */
|
||||
@@ -39,14 +39,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot,
|
||||
unsigned int next_slot, uint8_t is_master);
|
||||
void bypass_signal_mac_phy(unsigned int frame, unsigned int last_slot,
|
||||
unsigned int next_slot, uint8_t is_master);
|
||||
#ifndef USER_MODE
|
||||
int multicast_link_write_sock (int groupP, char *dataP, unsigned int sizeP);
|
||||
int bypass_tx_handler(unsigned int fifo, int rw);
|
||||
int bypass_rx_handler(unsigned int fifo, int rw);
|
||||
#else
|
||||
void bypass_rx_handler(unsigned int Num_bytes,char *Rx_buffer);
|
||||
#endif
|
||||
|
||||
void bypass_tx_data (emu_transport_info_t Type, unsigned int frame, unsigned int next_slot);
|
||||
|
||||
void emulation_tx_rx(void);
|
||||
|
||||
@@ -41,9 +41,7 @@
|
||||
//#include "openair_defs.h"
|
||||
#include "socket.h"
|
||||
|
||||
#ifdef USER_MODE
|
||||
#define msg printf
|
||||
#endif
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
socket_setnonblocking (int sockP)
|
||||
|
||||
@@ -28,11 +28,7 @@
|
||||
* \email: navid.nikaein@eurecom.fr
|
||||
*/
|
||||
|
||||
#ifndef USER_MODE
|
||||
#include <rtai_posix.h>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
|
||||
#ifndef __BYPASS_SESSION_LAYER_VARS_H__
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
include $(OPENAIR_DIR)/common/utils/Makefile.inc
|
||||
|
||||
COMMON_UTILS_DIR = $(OPENAIR_DIR)/common/utils
|
||||
TOP_DIR = $(OPENAIR1_DIR)
|
||||
OPENAIR1_TOP = $(OPENAIR1_DIR)
|
||||
OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
CFLAGS += -DMAX_NUM_CCs=1 -Wall -DPHYSIM -DNODE_RG -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 -DMALLOC_CHECK_=1 -DENABLE_VCD_FIFO -DLOG_NO_THREAD # -Wno-packed-bitfield-compat
|
||||
|
||||
# enable C99 mode
|
||||
CFLAGS += -std=gnu99
|
||||
|
||||
# DCI Debug
|
||||
# CFLAGS += -DDEBUG_DCI_ENCODING
|
||||
# TODO: only for framegen
|
||||
#CFLAGS += -DOPENAIR2
|
||||
#CFLAGS += -DDEBUG_PHY_PROC
|
||||
#CFLAGS += -DDEBUG_GROUPHOP
|
||||
|
||||
ifdef OMP
|
||||
CFLAGS += -DOMP -fopenmp
|
||||
endif
|
||||
ifdef LLR8
|
||||
CFLAGS += -DLLR8
|
||||
endif
|
||||
CFLAGS += -DNEW_FFT
|
||||
|
||||
LFLAGS = -lm -lblas -lxml2 -lrt -lpthread $(LFDS_DIR)/bin/liblfds611.a
|
||||
|
||||
ifdef GPIB
|
||||
LFLAGS += -lgpib
|
||||
endif
|
||||
|
||||
CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH #-DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
#CFLAGS += -DTBS_FIX
|
||||
CFLAGS += -DCELLULAR
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
ifdef EMOS
|
||||
CFLAGS += -DEMOS
|
||||
endif
|
||||
|
||||
ifdef DEBUG_PHY
|
||||
CFLAGS += -DDEBUG_PHY
|
||||
endif
|
||||
|
||||
ifdef MeNBMUE
|
||||
CFLAGS += -DMeNBMUE
|
||||
endif
|
||||
|
||||
ifdef MU_RECEIVER
|
||||
CFLAGS += -DMU_RECEIVER
|
||||
endif
|
||||
|
||||
ifdef ZBF_ENABLED
|
||||
CFLAGS += -DNULL_SHAPE_BF_ENABLED
|
||||
endif
|
||||
|
||||
ifdef RANDOM_BF
|
||||
CFLAGS += -DRANDOM_BF
|
||||
endif
|
||||
|
||||
ifdef PBS_SIM
|
||||
CFLAGS += -DPBS_SIM
|
||||
endif
|
||||
|
||||
ifdef XFORMS
|
||||
CFLAGS += -DXFORMS
|
||||
LFLAGS += -lforms
|
||||
endif
|
||||
|
||||
ifdef SMBV
|
||||
CFLAGS += -DSMBV
|
||||
endif
|
||||
|
||||
ifdef PERFECT_CE
|
||||
CFLAGS += -DPERFECT_CE
|
||||
endif
|
||||
|
||||
ifdef BIT8_TX
|
||||
CFLAGS += -DBIT8_TX
|
||||
endif
|
||||
|
||||
CFLAGS += -DNO_RRM -DOPENAIR1 -DPHY_ABSTRACTION #-DOPENAIR2
|
||||
|
||||
CFLAGS += -I/usr/include/X11 -I/usr/X11R6/include
|
||||
|
||||
ifdef RTAI
|
||||
CFLAGS += -DRTAI_ENABLED -D__IN_RTAI__ $(shell rtai-config --lxrt-cflags)
|
||||
LFLAGS += $(shell rtai-config --lxrt-ldflags) -llxrt
|
||||
endif
|
||||
|
||||
include $(COMMON_UTILS_DIR)/Makefile.inc
|
||||
include $(TOP_DIR)/PHY/Makefile.inc
|
||||
include $(TOP_DIR)/SCHED/Makefile.inc
|
||||
include $(TOP_DIR)/SIMULATION/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/UTIL/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc
|
||||
|
||||
#LOG_OBJS += $(LOG_DIR)/vcd_signal_dumper.o
|
||||
|
||||
CFLAGS += $(L2_incl) -I$(ASN1_MSG_INC) -I$(TOP_DIR) -I$(OPENAIR2_DIR) -I$(OPENAIR3) $(UTIL_incl) $(UTILS_incl)
|
||||
# EXTRA_CFLAGS =
|
||||
|
||||
#STATS_OBJS += $(TOP_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_proc.o
|
||||
|
||||
#LAYER2_OBJ += $(OPENAIR2_DIR)/LAYER2/MAC/rar_tools.o
|
||||
#LAYER2_OBJ = $(OPENAIR2_DIR)/LAYER2/MAC/lte_transport_init.o
|
||||
|
||||
OBJ = $(PHY_OBJS) $(SIMULATION_OBJS) $(TOOLS_OBJS) $(SCHED_OBJS) $(LAYER2_OBJ) $(LOG_OBJS) $(ITTI_DIR)/backtrace.o
|
||||
ifdef GPIB
|
||||
OBJ += LTE_Configuration.o
|
||||
endif
|
||||
#OBJ2 = $(PHY_OBJS) $(SIMULATION_OBJS) $(TOOLS_OBJS)
|
||||
|
||||
ifdef XFORMS
|
||||
OBJ += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o
|
||||
endif
|
||||
|
||||
ifdef STATIC
|
||||
LFLAGS += -static -L/usr/lib/libblas
|
||||
endif
|
||||
|
||||
all: dlsim pbchsim pdcchsim ulsim pucchsim prachsim mbmssim scansim
|
||||
|
||||
$(LFDS_DIR)/bin/liblfds611.a:
|
||||
$(MAKE) -C $(LFDS_DIR) -f makefile.linux
|
||||
|
||||
test: $(SIMULATION_OBJS) $(TOOLS_OBJS) $(TOP_DIR)/PHY/INIT/lte_init.o test.c
|
||||
$(CC) test.c -I$(TOP_DIR) -o test $(CFLAGS) $(SIMULATION_OBJS) $(TOOLS_OBJS) -lm
|
||||
|
||||
OBJ += $(LIST_OBJ)
|
||||
OBJ += $(MEM_OBJ)
|
||||
$(OBJ) : %.o : %.c
|
||||
@echo Compiling $< ...
|
||||
@$(CC) -c $(CFLAGS) -o $@ $<
|
||||
|
||||
dlsim : $(OBJ) dlsim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling dlsim.c ..."
|
||||
@$(CC) dlsim.c -o dlsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
dlsim2 : $(OBJ) dlsim2.c
|
||||
@echo "Compiling dlsim2.c ..."
|
||||
@$(CC) dlsim2.c -o dlsim2 $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
framegen: $(OBJ) framegen.c
|
||||
@echo "Compiling framegen.c"
|
||||
@$(CC) framegen.c -o framegen $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
pbchsim : $(OBJ) pbchsim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling pbchsim.c"
|
||||
@$(CC) pbchsim.c -o pbchsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
scansim : $(OBJ) scansim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling scansim.c"
|
||||
@$(CC) scansim.c -o scansim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
mbmssim : $(OBJ) mbmssim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling mbmssim.c"
|
||||
@$(CC) mbmssim.c -o mbmssim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
pdcchsim : $(OBJ) pdcchsim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling pdcchsim.c"
|
||||
@$(CC) pdcchsim.c -o pdcchsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
pucchsim : $(OBJ) pucchsim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling pucchsim.c"
|
||||
@$(CC) pucchsim.c -o pucchsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
prachsim : $(OBJ) prachsim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling prachsim.c"
|
||||
@$(CC) prachsim.c -o prachsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
ulsim : $(OBJ) ulsim.c $(LFDS_DIR)/bin/liblfds611.a #ulsim_form.c
|
||||
@echo "Compiling [ulsim.c]"
|
||||
@$(CC) ulsim.c -o ulsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
syncsim : $(OBJ) syncsim.c $(LFDS_DIR)/bin/liblfds611.a
|
||||
@echo "Compiling syncsim.c"
|
||||
@$(CC) syncsim.c -o syncsim $(CFLAGS) $(OBJ) $(LFLAGS)
|
||||
|
||||
clean :
|
||||
rm -f $(OBJ)
|
||||
rm -f *.o
|
||||
|
||||
cleanall : clean
|
||||
rm -f dlsim pbchsim pdcchsim ulsim pucchsim mbmssim prachsim
|
||||
rm -f *.exe*
|
||||
|
||||
showflags :
|
||||
@echo $(CFLAGS)
|
||||
@echo $(LFLAGS)
|
||||
|
||||
showobj:
|
||||
@echo $(SCHED_OBJS)
|
||||
|
||||
cppcheck:
|
||||
@echo "cppcheck ..."
|
||||
cppcheck $(INCLUDES) ${OBJ:.o=.c} ${OAISIM_OBJS,.o=.c} ${ASN1_RRC_MSG_OBJS1,.o=.c}
|
||||
@@ -31,9 +31,6 @@
|
||||
#include "PHY/types.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/vars.h"
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
|
||||
@@ -32,9 +32,6 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/vars.h"
|
||||
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
@@ -91,9 +88,6 @@ int main(int argc, char **argv)
|
||||
uint8_t extended_prefix_flag=0;
|
||||
int8_t interf1=-21,interf2=-21;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos emos_dump;
|
||||
#endif
|
||||
|
||||
FILE *input_fd=NULL,*pbch_file_fd=NULL;
|
||||
char input_val_str[50],input_val_str2[50];
|
||||
|
||||
@@ -28,9 +28,6 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/vars.h"
|
||||
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
|
||||
@@ -27,9 +27,6 @@
|
||||
#include "PHY/types.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/vars.h"
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
@@ -76,10 +73,6 @@ int main(int argc, char **argv)
|
||||
uint8_t extended_prefix_flag=0;
|
||||
// int8_t interf1=-19,interf2=-19;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos emos_dump;
|
||||
#endif
|
||||
|
||||
|
||||
SCM_t channel_model=Rayleigh1;
|
||||
|
||||
|
||||
@@ -27,9 +27,6 @@
|
||||
#include "PHY/types.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/vars.h"
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
@@ -77,9 +74,6 @@ int main(int argc, char **argv)
|
||||
uint8_t extended_prefix_flag=0;
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos emos_dump;
|
||||
#endif
|
||||
|
||||
SCM_t channel_model=Rayleigh1_corr;
|
||||
|
||||
|
||||
@@ -33,9 +33,6 @@
|
||||
#include "PHY/vars.h"
|
||||
#include "MAC_INTERFACE/vars.h"
|
||||
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
@@ -91,9 +88,6 @@ int main(int argc, char **argv)
|
||||
uint32_t nsymb,tx_lev,tx_lev1,tx_lev2;
|
||||
uint8_t extended_prefix_flag=0;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos emos_dump;
|
||||
#endif
|
||||
|
||||
FILE *input_fd=NULL,*pbch_file_fd=NULL;
|
||||
char input_val_str[50],input_val_str2[50];
|
||||
|
||||
@@ -30,11 +30,6 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
#include <rtai_mbx.h>
|
||||
#include <rtai_msg.h>
|
||||
#endif
|
||||
|
||||
#include "SIMULATION/TOOLS/defs.h"
|
||||
#include "SIMULATION/RF/defs.h"
|
||||
#include "PHY/types.h"
|
||||
@@ -44,9 +39,6 @@
|
||||
#ifdef IFFT_FPGA
|
||||
#include "PHY/LTE_REFSIG/mod_table.h"
|
||||
#endif
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/vars.h"
|
||||
#include "ARCH/CBMIMO1/DEVICE_DRIVER/vars.h"
|
||||
@@ -381,9 +373,6 @@ int main(int argc, char **argv)
|
||||
uint8_t extended_prefix_flag=0,frame_type=1;
|
||||
int8_t interf1=-21,interf2=-21;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos emos_dump;
|
||||
#endif
|
||||
|
||||
FILE *input_fd=NULL,*pbch_file_fd=NULL;
|
||||
char input_val_str[50],input_val_str2[50];
|
||||
@@ -430,13 +419,6 @@ int main(int argc, char **argv)
|
||||
|
||||
int rx_offset_mod;
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
int period;
|
||||
RTIME expected;
|
||||
RT_TASK *task;
|
||||
#define PERIOD 1000000000
|
||||
#endif
|
||||
|
||||
logInit();
|
||||
|
||||
number_of_cards = 1;
|
||||
@@ -694,23 +676,6 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
|
||||
if (!(task = rt_task_init_schmod(nam2num("SYNCSIM"), 0, 0, 0, SCHED_FIFO, 0xF))) {
|
||||
printf("CANNOT INIT MASTER TASK\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
rt_set_periodic_mode();
|
||||
|
||||
period = start_rt_timer(nano2count(PERIOD));
|
||||
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
rt_make_hard_real_time();
|
||||
rt_task_make_periodic(task, expected = rt_get_time() + 10*period, period);
|
||||
#endif
|
||||
|
||||
#ifdef XFORMS
|
||||
|
||||
if (do_forms==1) {
|
||||
@@ -1374,11 +1339,6 @@ int main(int argc, char **argv)
|
||||
|
||||
for (trial=0; trial<n_frames; trial++) {
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
ret = rt_task_wait_period();
|
||||
printf("rt_task_wait_period() returns %d, time %llu\n",ret, rt_get_time());
|
||||
#endif
|
||||
|
||||
if (oai_hw_input == 0) {
|
||||
|
||||
if (awgn_flag == 0) {
|
||||
@@ -1752,11 +1712,6 @@ int main(int argc, char **argv)
|
||||
ioctl(openair_fd,openair_START_TX_SIG,(void *)NULL);
|
||||
}
|
||||
|
||||
#ifdef RTAI_ENABLED
|
||||
rt_make_soft_real_time();
|
||||
rt_task_delete(task);
|
||||
#endif
|
||||
|
||||
#ifdef XFORMS
|
||||
|
||||
if (do_forms==1) {
|
||||
|
||||
@@ -30,9 +30,6 @@
|
||||
#ifdef IFFT_FPGA
|
||||
#include "PHY/LTE_REFSIG/mod_table.h"
|
||||
#endif
|
||||
#ifdef EMOS
|
||||
#include "SCHED/phy_procedures_emos.h"
|
||||
#endif
|
||||
|
||||
#define BW 10.0
|
||||
#define Td 1.0
|
||||
@@ -69,12 +66,6 @@ int main(int argc, char **argv)
|
||||
double ip =0.0;
|
||||
double N0W, path_loss, path_loss_dB;
|
||||
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos emos_dump;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
if (argc>1)
|
||||
sigma2_dB = atoi(argv[1]);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
include $(OPENAIR_DIR)/common/utils/Makefile.inc
|
||||
OBJS = rf.o ../../PHY/TOOLS/file_output.o ../TOOLS/rangen_double.o
|
||||
CFLAGS += -DRF_MAIN -DUSER_MODE -DDEBUG_PHY
|
||||
CFLAGS += -DRF_MAIN -DDEBUG_PHY
|
||||
|
||||
all: $(OBJS)
|
||||
gcc -o rf $(OBJS) -lm
|
||||
|
||||
@@ -19,12 +19,10 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
|
||||
@@ -19,18 +19,8 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#include <asm/io.h>
|
||||
#include <asm/rtai.h>
|
||||
#endif
|
||||
#ifdef RTAI_ENABLED
|
||||
#include <rtai.h>
|
||||
#include <rtai_sched.h>
|
||||
#define time(x) (unsigned int)(rt_get_time_ns())
|
||||
#endif
|
||||
|
||||
unsigned int s0, s1, s2, b;
|
||||
|
||||
@@ -55,21 +45,14 @@ unsigned int taus(void)
|
||||
void set_taus_seed(unsigned int seed_init)
|
||||
{
|
||||
|
||||
#ifdef USER_MODE
|
||||
struct drand48_data buffer;
|
||||
unsigned long result = 0;
|
||||
#endif
|
||||
|
||||
if (seed_init == 0) {
|
||||
s0 = (unsigned int)time(NULL);
|
||||
s1 = (unsigned int)time(NULL);
|
||||
s2 = (unsigned int)time(NULL);
|
||||
} else {
|
||||
#ifndef USER_MODE
|
||||
s0 = (unsigned int)0x1e23d852;
|
||||
s1 = (unsigned int)0x81f38a1c;
|
||||
s2 = (unsigned int)0xfe1a133e;
|
||||
#else
|
||||
/* Use reentrant version of rand48 to ensure that no conflicts with other generators occur */
|
||||
srand48_r((long int)seed_init, &buffer);
|
||||
mrand48_r(&buffer, (long int *)&result);
|
||||
@@ -78,7 +61,6 @@ void set_taus_seed(unsigned int seed_init)
|
||||
s1 = result;
|
||||
mrand48_r(&buffer, (long int *)&result);
|
||||
s2 = result;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -87,10 +69,8 @@ void set_taus_seed(unsigned int seed_init)
|
||||
void set_taus_seed(unsigned int seed_init)
|
||||
{
|
||||
|
||||
#ifdef USER_MODE
|
||||
struct drand48_data buffer;
|
||||
unsigned long result = 0;
|
||||
#endif
|
||||
s0 = (unsigned int)0x1e23d852;
|
||||
s1 = (unsigned int)0x81f38a1c;
|
||||
s2 = (unsigned int)0xfe1a133e;
|
||||
@@ -102,11 +82,6 @@ void set_taus_seed(unsigned int seed_init)
|
||||
s1 = (unsigned int)time(NULL);
|
||||
s2 = (unsigned int)time(NULL);
|
||||
} else {
|
||||
#ifndef USER_MODE
|
||||
s0 = (unsigned int)0x1e23d852;
|
||||
s1 = (unsigned int)0x81f38a1c;
|
||||
s2 = (unsigned int)0xfe1a133e;
|
||||
#else
|
||||
// Use reentrant version of rand48 to ensure that no conflicts with other generators occur */
|
||||
srand48_r((long int)seed_init, &buffer);
|
||||
mrand48_r(&buffer, (long int *)&result);
|
||||
@@ -115,7 +90,6 @@ void set_taus_seed(unsigned int seed_init)
|
||||
s1 = result;
|
||||
mrand48_r(&buffer, (long int *)&result);
|
||||
s2 = result;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user