- Fix: avoid infinite loop on mulitcast read thread if no data to read

Pre-ci test passed

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Cedric Roux
2013-06-25 09:05:02 +00:00
commit 56c66c09aa
4111 changed files with 2133103 additions and 0 deletions
+462
View File
@@ -0,0 +1,462 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "PHY_INTERFACE/extern.h"
#endif
#include "../USER/oaisim.h"
#include "channel_sim_proc.h"
#include "interface.h"
#include "Tsync.h"
#include "Process.h"
#define FILENAMEMAX 255
//#define DEBUG_SIM
void Process_Func(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
if(node_id<MAX_eNB)
eNB_Inst(node_id,port,r_re0,r_im0,r_re,r_im,s_re,s_im,enb_data,abstraction_flag,frame_parms);
else
UE_Inst(node_id,port,r_re0,r_im0,r_re,r_im,s_re,s_im,ue_data,abstraction_flag,frame_parms);
}
void UE_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
int next_slot,last_slot,slot=0,UE_id=0,eNB_id=0;
lte_subframe_t direction;
printf("UE [ %d ] Starts \n",node_id-MAX_eNB);
// init_mmap(node_id,frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
init_channel_vars (frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
mmap_ue(node_id,&PHY_vars_UE_g[0]->lte_ue_common_vars.txdata,&PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata,frame_parms);
// Interface_init(port,node_id);
char p_input[FILENAMEMAX];
int fd_pipe;
int fd_channel;
mkfifo("/tmp/channel", 0666);
fd_channel=open("/tmp/channel",O_RDWR,0);
sprintf(p_input,"/tmp/pipe_%d",node_id);
mkfifo(p_input, 0666);
fd_pipe=open(p_input,O_RDWR,0);
// IntInitAll();
mac_xface->frame=0;
while(1){
// wait_4slot(&slot,&mac_xface->frame);
read(fd_pipe,&slot,sizeof(slot));
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
next_slot = (slot + 1)%20;
direction = subframe_select(frame_parms,next_slot>>1);
#ifdef DEBUG_SIM
printf("\n\n[SIM] EMU PHY procedures UE %d for frame %d, slot %d (subframe %d)\n",
UE_id,mac_xface->frame, slot, (next_slot >> 1));
#endif
if (PHY_vars_UE_g[UE_id]->UE_mode[0] != NOT_SYNCHED) {
if ((mac_xface->frame)>0) {
phy_procedures_UE_lte ((last_slot),(next_slot), PHY_vars_UE_g[UE_id], 0, abstraction_flag);
}
}
else {
if (((mac_xface->frame)>0) && ((last_slot) == (SLOTS_PER_FRAME-1))) {
initial_sync(PHY_vars_UE_g[UE_id]);
}
}
if( direction == SF_UL || (direction == SF_S && next_slot%2!=0)){
do_OFDM_mod(PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdataF,PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata,next_slot,&PHY_vars_UE_g[UE_id]->lte_frame_parms);
}
write(fd_channel,&node_id,sizeof(node_id));
// send_exec_complete(CHANNEL_PORT);
if(slot==19)
(mac_xface->frame)++;
}
}
void eNB_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
int next_slot,last_slot,slot=0,UE_id=0,eNB_id=0;
lte_subframe_t direction;
printf("eNB [ %d ] Starts \n",node_id);
// init_mmap(node_id,frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
init_channel_vars (frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
mmap_enb(node_id,PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata,PHY_vars_eNB_g[0]->lte_eNB_common_vars.rxdata,frame_parms);
// Interface_init(port,node_id);
// IntInitAll();
char p_input[FILENAMEMAX];
int fd_pipe;
int fd_channel;
mkfifo("/tmp/channel", 0666);
fd_channel=open("/tmp/channel",O_RDWR,0);
sprintf(p_input,"/tmp/pipe_%d",node_id);
mkfifo(p_input, 0666);
fd_pipe=open(p_input, O_RDWR,0);
mac_xface->frame=0;
while(1){
// wait_4slot(&slot,&mac_xface->frame);
read(fd_pipe,&slot,sizeof(slot));
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
next_slot = (slot + 1)%20;
direction = subframe_select(frame_parms,next_slot>>1);
#ifdef DEBUG_SIM
printf
("\n\n [SIM]EMU PHY procedures eNB %d for frame %d, slot %d (subframe %d) (rxdataF_ext %p) Nid_cell %d\n",
eNB_id, mac_xface->frame, slot, next_slot >> 1,
PHY_vars_eNB_g[0]->lte_eNB_ulsch_vars[0]->rxdataF_ext, PHY_vars_eNB_g[eNB_id]->lte_frame_parms.Nid_cell);
#endif
phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[eNB_id], abstraction_flag);
if( direction == SF_DL || (direction == SF_S && next_slot%2==0)){
do_OFDM_mod(PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdataF[0],
PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0],
next_slot,
&PHY_vars_eNB_g[eNB_id]->lte_frame_parms);
}
write(fd_channel,&node_id,sizeof(node_id));
// send_exec_complete(CHANNEL_PORT);
if(slot==19)
(mac_xface->frame)++;
}
}
void Channel_Inst(int node_id,int port,double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
// Interface_init(port,node_id);
// IntInitAll();
mkfifo("/tmp/channel", 0666);
fd_channel=open("/tmp/channel", O_RDWR ,0);
int next_slot,last_slot,slot=0,UE_id=0,eNB_id=0;
lte_subframe_t direction;
char in_buffer[100];
int ci,ji=0;
for(ci=0;ci<NB_eNB_INST;ci++)
{
mmap_enb(ji,tx[ci],rx[ci],frame_parms);
init_channel_vars (frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
// init_mmap_channel(ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
sprintf(in_buffer, "/tmp/pipe_%d",ji);
mkfifo(in_buffer, 0666);
fd_NB[ci]=open(in_buffer, O_RDWR ,0);
ji++;
}
ji=0;
for(ci=NB_eNB_INST;ci<(NB_eNB_INST+NB_UE_INST);ci++)
{
mmap_enb(MAX_eNB+ji,tx[ci],rx[ci],frame_parms);
init_channel_vars (frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
// init_mmap_channel(MAX_eNB+ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
sprintf(in_buffer, "/tmp/pipe_%d",MAX_eNB+ji);
mkfifo(in_buffer, 0666);
fd_NB[ci]=open(in_buffer, O_RDWR ,0);
ji++;
}
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
init_rre(frame_parms,&(r_re0_u[eNB_id][UE_id]),&(r_im0_u[eNB_id][UE_id]));
init_rre(frame_parms,&(r_re0_d[UE_id][eNB_id]),&(r_im0_d[UE_id][eNB_id]));
}
}
for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){
for(UE_id=0;UE_id<NB_UE_INST;UE_id++){
e2u_t[eNB_id][UE_id]=(ch_thread*)calloc(1,sizeof(ch_thread));
}
}
for(UE_id=0;UE_id<NB_UE_INST;UE_id++){
for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){
u2e_t[UE_id][eNB_id]=(ch_thread*)calloc(1,sizeof(ch_thread));
}
}
pthread_t cthr_u[NB_eNB_INST][NB_UE_INST];
pthread_t cthr_d[NB_UE_INST][NB_eNB_INST];
pthread_mutex_init(&downlink_mutex_channel,NULL);
pthread_mutex_init(&uplink_mutex_channel,NULL);
pthread_mutex_init(&exclusive,NULL);
if (pthread_cond_init (&downlink_cond_channel, NULL)) exit(1);
if (pthread_cond_init (&uplink_cond_channel, NULL)) exit(1);
if (pthread_mutex_lock(&downlink_mutex_channel)) exit(1);
if (pthread_mutex_lock(&uplink_mutex_channel)) exit(1);
NUM_THREAD_DOWNLINK=0;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
u2e_t[UE_id][eNB_id]->thread_id=NUM_THREAD_DOWNLINK;
u2e_t[UE_id][eNB_id]->eNB_id=eNB_id;
u2e_t[UE_id][eNB_id]->UE_id=UE_id;
u2e_t[UE_id][eNB_id]->r_re0=r_re0_d[UE_id][eNB_id];
u2e_t[UE_id][eNB_id]->r_im0=r_im0_d[UE_id][eNB_id];
u2e_t[UE_id][eNB_id]->r_re=r_re[NB_eNB_INST+UE_id];
u2e_t[UE_id][eNB_id]->r_im=r_im[NB_eNB_INST+UE_id];
u2e_t[UE_id][eNB_id]->s_im=s_im[eNB_id];
u2e_t[UE_id][eNB_id]->s_re=s_re[eNB_id];
u2e_t[UE_id][eNB_id]->eNB2UE=eNB2UE[eNB_id][UE_id];
u2e_t[UE_id][eNB_id]->UE2eNB=UE2eNB[UE_id][eNB_id];
u2e_t[UE_id][eNB_id]->enb_data=enb_data[eNB_id];
u2e_t[UE_id][eNB_id]->ue_data=ue_data[UE_id];
u2e_t[UE_id][eNB_id]->next_slot=&next_slot;
u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag;
u2e_t[UE_id][eNB_id]->frame_parms=frame_parms;
u2e_t[UE_id][eNB_id]->tx_data[3]=tx[eNB_id][3];
u2e_t[UE_id][eNB_id]->rx_data[3]=rx[NB_eNB_INST+UE_id][3];
if(pthread_cond_init (&downlink_cond[eNB_id][UE_id], NULL)) exit(1);
if(pthread_mutex_lock(&downlink_mutex[eNB_id][UE_id])) exit(1);
pthread_create (&cthr_d[UE_id][eNB_id], NULL, do_DL_sig_channel_T,(void*)(u2e_t[UE_id][eNB_id]));
NUM_THREAD_DOWNLINK++;
}
}
NUM_THREAD_UPLINK=0;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
e2u_t[eNB_id][UE_id]->thread_id=NUM_THREAD_UPLINK;
e2u_t[eNB_id][UE_id]->eNB_id=eNB_id;
e2u_t[eNB_id][UE_id]->UE_id=UE_id;
e2u_t[eNB_id][UE_id]->r_re=r_re[eNB_id];
e2u_t[eNB_id][UE_id]->r_im=r_im[eNB_id];
e2u_t[eNB_id][UE_id]->r_re0=r_re0_u[eNB_id][UE_id];
e2u_t[eNB_id][UE_id]->r_im0=r_im0_u[eNB_id][UE_id];
e2u_t[eNB_id][UE_id]->s_im=s_im[NB_eNB_INST+UE_id];
e2u_t[eNB_id][UE_id]->s_re=s_re[NB_eNB_INST+UE_id];
e2u_t[eNB_id][UE_id]->eNB2UE=eNB2UE[eNB_id][UE_id];
e2u_t[eNB_id][UE_id]->UE2eNB=UE2eNB[UE_id][eNB_id];
e2u_t[eNB_id][UE_id]->enb_data=enb_data[eNB_id];
e2u_t[eNB_id][UE_id]->ue_data=ue_data[UE_id];
e2u_t[eNB_id][UE_id]->next_slot=&next_slot;
e2u_t[eNB_id][UE_id]->abstraction_flag=&abstraction_flag;
e2u_t[eNB_id][UE_id]->frame_parms=frame_parms;
e2u_t[eNB_id][UE_id]->tx_data[3]=tx[NB_eNB_INST+UE_id][3];
e2u_t[eNB_id][UE_id]->rx_data[3]=rx[eNB_id][3];
if(pthread_cond_init (&uplink_cond[UE_id][eNB_id], NULL)) exit(1);
if(pthread_mutex_lock(&uplink_mutex[UE_id][eNB_id])) exit(1);
pthread_create (&cthr_u[eNB_id][UE_id], NULL, do_UL_sig_channel_T,(void*)e2u_t[eNB_id][UE_id]);
NUM_THREAD_UPLINK++;
}
}
}
void Channel_DL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot){
int count=0;
int next_slot,last_slot,UE_id=0,eNB_id=0;
lte_subframe_t direction;
s32 **txdata,**rxdata;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
write(fd_NB[eNB_id],&slot,sizeof(slot));
count++;
//send_exec_msg(mac_xface->frame,slot,eNB_PORT+eNB_id);
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
//wait_4Msg();
}
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
frame_parms = &PHY_vars_eNB_g[eNB_id]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
txdata =tx[eNB_id][0];
tx_pwr = dac_fixed_gain(s_re[eNB_id],
s_im[eNB_id],
txdata,
slot_offset,
frame_parms->nb_antennas_tx,
frame_parms->samples_per_tti>>1,
14,
40);
printf("[SIM][DL] eNB %d: tx_pwr %f dB for slot %d (subframe %d)\n",eNB_id,10*log10(tx_pwr),nslot,nslot>>1);
}
_COT=0;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
if(pthread_cond_signal(&downlink_cond[eNB_id][UE_id])) exit(1);
if(pthread_mutex_unlock(&downlink_mutex[eNB_id][UE_id])) exit(1);
}
}
if(pthread_cond_wait(&downlink_cond_channel, &downlink_mutex_channel)) exit(1);
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
Clean_Param(r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],frame_parms);
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
Channel_Out(SF_DL,eNB_id,UE_id,r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],r_re0_d[UE_id][eNB_id],r_im0_d[UE_id][eNB_id],frame_parms);
// adc_channel(eNB_id,UE_id,r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id]);
}
}
count=0;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++)
if (mac_xface->frame >= (UE_id * 10)) {
write(fd_NB[NB_eNB_INST+UE_id],&slot,sizeof(slot));
//send_exec_msg(mac_xface->frame,slot,UE_PORT+UE_id);
count++;
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
//wait_4Msg();
}
}
void Channel_UL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot){
int count=0;
int next_slot,last_slot,UE_id=0,eNB_id=0;
lte_subframe_t direction;
s32 **txdata,**rxdata;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++)
if (mac_xface->frame >= (UE_id * 10)) {
write(fd_NB[NB_eNB_INST+UE_id],&slot,sizeof(slot));
//send_exec_msg(mac_xface->frame,slot,UE_PORT+UE_id);
count++;
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
//wait_4Msg();
}
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
frame_parms = &PHY_vars_UE_g[UE_id]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
txdata =tx[NB_eNB_INST+UE_id][0]; //PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata;
tx_pwr = dac_fixed_gain(s_re[NB_eNB_INST+UE_id],
s_im[NB_eNB_INST+UE_id],
txdata,
slot_offset,
frame_parms->nb_antennas_tx,
frame_parms->samples_per_tti>>1,
14,
18);
printf("[SIM][UL] UE %d tx_pwr %f dB for slot %d (subframe %d)\n",UE_id,10*log10(tx_pwr),nslot,nslot>>1);
rx_pwr = signal_energy_fp(s_re[NB_eNB_INST+UE_id],s_im[NB_eNB_INST+UE_id],frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] UE %d tx_pwr %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),nslot,nslot>>1);
}
_COT_U=0;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
if ( pthread_cond_signal(&uplink_cond[UE_id][eNB_id])) exit(1);
if ( pthread_mutex_unlock(&uplink_mutex[UE_id][eNB_id])) exit(1);
}}
if ( pthread_cond_wait(&uplink_cond_channel, &uplink_mutex_channel)) exit(1);
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
Clean_Param(r_re[eNB_id],r_im[eNB_id],frame_parms);
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
Channel_Out(SF_UL,eNB_id,UE_id,r_re[eNB_id],r_im[eNB_id],r_re0_u[eNB_id][UE_id],r_im0_u[eNB_id][UE_id],frame_parms); printf("[SIM][DL] eNB %d: tx_pwr %f dB for slot %d (subframe %d)\n",eNB_id,10*log10(tx_pwr),next_slot,next_slot>>1);
}
}
count=0;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
write(fd_NB[eNB_id],&slot,sizeof(slot));
// send_exec_msg(mac_xface->frame,slot,eNB_PORT+eNB_id);
count++;
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
// wait_4Msg();
}
}
void Channel_Func(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot){
int last_slot;
lte_subframe_t direction;
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
nslot = (slot + 1)%20;
direction = subframe_select(frame_parms,nslot>>1);
if( direction == SF_DL || (direction == SF_S && nslot%2==0)){
Channel_DL(s_re,s_im,r_re,r_im,r_re0,r_im0,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot);
}
else{
Channel_UL(s_re,s_im,r_re,r_im,r_re0,r_im0,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot);
}
}
+35
View File
@@ -0,0 +1,35 @@
#ifndef __PROCESS_H__
# define __PROCESS_H__
#include "interface.h"
s32 **tx[MAX_eNB+MAX_UE][3],**rx[MAX_eNB+MAX_UE][3];
int nslot;
void Process_Func(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void UE_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void eNB_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void Channel_Inst(int node_id,int port,double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void Channel_DL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot);
void Channel_UL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot);
void Channel_Func(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot);
#endif
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env python
import subprocess
import optparse
import re
OPT=" "
TERMINAL="gnome-terminal -x "
TIME="time"
def runBash(cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out = p.stdout.read().strip()
return out
def main():
global OPT,TIME,TERMINAL
subprocess.call('ps | nawk \'/oaisim/ {system("kill " $1)}\'', shell=True)
p = optparse.OptionParser()
p.add_option('--eNB', '-b', default="1")
p.add_option('--UE', '-u', default="1")
p.add_option('--frame','-n', default="100")
p.add_option('--terminal','-t', default="1")
p.add_option('--time','--time', default="0")
options, arguments = p.parse_args()
print '---- Configuration ---- '
print 'Number of eNB : %s' % options.eNB
print 'Number of UE : %s' % options.UE
if(options.terminal=='1'):
OPT+=TERMINAL
if(options.time=='1'):
OPT+=TIME
#CHANNEL= 'valgrind --tool=callgrind --collect-bus=yes --branch-sim=yes $OPENAIR_TARGETS/SIMU/USER/oaisim -X0 -b%s -u%s -n%s' % (options.eNB,options.UE,options.frame)
CHANNEL= '$OPENAIR_TARGETS/SIMU/USER/oaisim -X0 -b%s -u%s -n%s' % (options.eNB,options.UE,options.frame)
#subprocess.call(CHANNEL, shell=True)
print CHANNEL
nb_enb=int(options.eNB)
nb_ue=int(options.UE)
frame=int(options.frame)
for x in xrange(0,nb_enb):
ENB='%s $OPENAIR_TARGETS/SIMU/USER/oaisim -X1 -i%s &' % (OPT,x)
print ENB
subprocess.call(ENB,shell=True)
subprocess.call('sleep 1', shell=True)
for x in xrange(0,nb_ue):
UE='%s $OPENAIR_TARGETS/SIMU/USER/oaisim -X2 -i%s &' % (OPT,x)
print UE
subprocess.call(UE,shell=True)
subprocess.call('sleep 1', shell=True)
# subprocess.call('sleep 2', shell=True)
subprocess.call(CHANNEL, shell=True)
# subprocess.call('ps | nawk \'/oaisim/ {system("kill " $1)}\'', shell=True)
if __name__ == '__main__':
main()
+42
View File
@@ -0,0 +1,42 @@
/*
* Tsync.h
*
*/
#include <pthread.h>
#ifndef TSYNC_H_
#define TSYNC_H_
#define COMPILER_BARRIER() __asm__ __volatile__ ("" ::: "memory")
int mycount;
pthread_mutex_t exclusive;
pthread_mutex_t downlink_mutex[MAX_eNB][MAX_UE];
pthread_mutex_t downlink_mutex_channel;
pthread_cond_t downlink_cond[MAX_eNB][MAX_UE];
pthread_cond_t downlink_cond_channel;
pthread_mutex_t uplink_mutex[MAX_UE][MAX_eNB];
pthread_mutex_t uplink_mutex_channel;
pthread_cond_t uplink_cond[MAX_UE][MAX_eNB];
pthread_cond_t uplink_cond_channel;
int COT;
int COT_U;
volatile int _COT;
volatile int _COT_U;
int NUM_THREAD_DOWNLINK;
int NUM_THREAD_UPLINK;
ch_thread *e2u_t[MAX_UE][MAX_eNB];
ch_thread *u2e_t[MAX_UE][MAX_eNB];
pthread_t cthr_u[MAX_eNB][MAX_UE];
pthread_t cthr_d[MAX_eNB][MAX_UE];
int fd_NB[MAX_eNB+MAX_UE];
int fd_channel;
#endif /* TSYNC_H_ */
+638
View File
@@ -0,0 +1,638 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "UTIL/LOG/log_if.h"
#include "RRC/LITE/extern.h"
#include "PHY_INTERFACE/extern.h"
#endif
#include "../USER/oaisim.h"
#include "channel_sim_proc.h"
#include "interface.h"
#include "Tsync.h"
#include "Process.h"
#define RF
//#define DEBUG_SIM
void init_rre(LTE_DL_FRAME_PARMS *frame_parms,double ***r_re0,double ***r_im0) {
int i;
(*r_re0) = malloc(2*sizeof(double*));
(*r_im0) = malloc(2*sizeof(double*));
for (i=0;i<2;i++) {
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
void mmap_enb(int id,int **tx_data[3],int **rx_data[3],LTE_DL_FRAME_PARMS *frame_parms) {
int i;
int fd[20];
int result;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(s32));
char buffer[100];
int j=0,k=0;
char sect=1;
for(k=0;k<sect;k++){
(*(tx_data+k)) = malloc(2*sizeof(s32*));
(*(rx_data+k)) = malloc(2*sizeof(s32*));
}
for (k=0;k<sect;k++){
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/tx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*(tx_data+k))[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/rx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*(rx_data+k))[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
}
}
void mmap_ue(int id,int ***tx_data,int ***rx_data,LTE_DL_FRAME_PARMS *frame_parms) {
int i;
int fd[20];
int result;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(s32));
char buffer[100];
int j=0,k=0;
(*tx_data) = malloc(2*sizeof(s32*));
(*rx_data) = malloc(2*sizeof(s32*));
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/tx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*tx_data)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/rx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*rx_data)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
}
void do_DL_sig_channel_T(void *param){
ch_thread* cthread = (ch_thread*)param;
int count;
u8 eNB_i,UE_i;
int thread_id;
double **r_re0,**r_re,**r_im,**r_im0,**s_re,**s_im;
channel_desc_t *eNB2UE[3][8];
node_desc_t *enb_data[3];
node_desc_t *ue_data[8];
int *next_slot,abstraction_flag;
LTE_DL_FRAME_PARMS *frame_parms;
int **tx_data[3],**rx_data[3];
node_desc_t *enb_data_2[3];
eNB_i=(cthread->eNB_id);
UE_i=(cthread->UE_id);
r_re0=cthread->r_re0;
r_re=cthread->r_re;
r_im=cthread->r_im;
r_im0=cthread->r_im0;
s_im=cthread->s_im;
s_re=cthread->s_re;
eNB2UE[eNB_i][UE_i]=cthread->eNB2UE;
enb_data[0]=(cthread->enb_data);
enb_data_2[eNB_i]=cthread->enb_data;
ue_data[UE_i]=cthread->ue_data;
frame_parms=cthread->frame_parms;
next_slot=(cthread->next_slot);
abstraction_flag=*(cthread->abstraction_flag);
thread_id=(cthread->thread_id);
tx_data[3]=cthread->tx_data[3];
rx_data[3]=cthread->rx_data[3];
s32 att_eNB_id=-1;
s32 **txdata,**rxdata;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i,aa;
u32 slot_offset;
while(1){
if(pthread_cond_wait(&downlink_cond[eNB_i][UE_i], &downlink_mutex[eNB_i][UE_i])) exit(1);
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
// pthread_mutex_lock(&exclusive);
multipath_channel(eNB2UE[eNB_i][UE_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
rx_pwr = signal_energy_fp2(eNB2UE[eNB_i][UE_i]->ch[0],eNB2UE[eNB_i][UE_i]->channel_length)*eNB2UE[eNB_i][UE_i]->channel_length;
printf("[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
eNB_i,UE_i,
enb_data_2[eNB_i]->tx_power_dBm,
eNB2UE[eNB_i][UE_i]->path_loss_dB);
printf("[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_i,UE_i,10*log10(rx_pwr),rx_pwr);
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : rx_pwr %f dB for slot %d (subframe %d)\n",UE_i,10*log10(rx_pwr),nslot,nslot>>1);
if (eNB2UE[eNB_i][UE_i]->first_run == 1)
eNB2UE[eNB_i][UE_i]->first_run = 0;
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/eNB2UE[eNB_i][UE_i]->BW, // sampling time (ns)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
ue_data[UE_i]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
110.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&eNB2UE[eNB_i][UE_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",UE_i,eNB_i,10*log10(rx_pwr),nslot,nslot>>1);
//count = __sync_add_and_fetch(&_COT, 1);
//COMPILER_BARRIER();
if (pthread_mutex_lock(&downlink_mutex_channel)) exit(1);
_COT++;
if(_COT==NUM_THREAD_DOWNLINK){
// if(count==NUM_THREAD_DOWNLINK){
if(pthread_cond_signal(&downlink_cond_channel)) exit(1);
}
if(pthread_mutex_unlock(&downlink_mutex_channel)) exit(1);
// pthread_mutex_unlock(&exclusive);
}
}
void do_UL_sig_channel_T(void *param){
ch_thread* cthread = (ch_thread*)param;
int count=0;
u8 eNB_i,UE_i;
double **r_re0,**r_re,**r_im,**r_im0,**s_re,**s_im;
channel_desc_t *UE2eNB[8][3];
node_desc_t *enb_data2[3];
node_desc_t *ue_data[8];
u16 next_slot,abstraction_flag;
LTE_DL_FRAME_PARMS *frame_parms;
int thread_id;
eNB_i=(cthread->eNB_id);
UE_i=(cthread->UE_id);
r_re0=cthread->r_re0;
r_re=cthread->r_re;
r_im=cthread->r_im;
r_im0=cthread->r_im0;
s_im=cthread->s_im;
s_re=cthread->s_re;
UE2eNB[UE_i][eNB_i]=cthread->UE2eNB;
enb_data2[eNB_i]=cthread->enb_data;
ue_data[UE_i]=cthread->ue_data;
next_slot=*(cthread->next_slot);
abstraction_flag=*(cthread->abstraction_flag);
frame_parms=cthread->frame_parms;
thread_id=(cthread->thread_id);
s32 **txdata,**rxdata;
u8 UE_id=0,eNB_id=0,aa;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
double nf = 0; //currently unused
while(1){
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
if(pthread_cond_wait(&uplink_cond[UE_i][eNB_i], &uplink_mutex[UE_i][eNB_i])) exit(1);//[UE_i][eNB_i]);
// pthread_mutex_lock(&exclusive);
multipath_channel(UE2eNB[UE_i][eNB_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] Channel UE %d => eNB %d : %f dB\n",UE_i,eNB_i,10*log10(rx_pwr));
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] eNB %d : eNB out %f dB for slot %d (subframe %d), sptti %d\n",eNB_i,10*log10(rx_pwr),nslot,nslot>>1,frame_parms->samples_per_tti);
if (UE2eNB[UE_i][eNB_i]->first_run == 1)
UE2eNB[UE_i][eNB_i]->first_run = 0;
// RF model
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
(UE_id==0) ? (1.0/7.68e6 * 1e9) : 1e9, // sampling time (ns) + set noise bandwidth to 0 for UE>0 (i.e. no noise except for first UE)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
nf, // noise_figure NOT YET IMPLEMENTED
150.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&UE2eNB[UE_i][eNB_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re,r_im,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),nslot,nslot>>1);
// count = __sync_add_and_fetch(&_COT_U, 1);
// COMPILER_BARRIER();
if (pthread_mutex_lock(&uplink_mutex_channel)) exit(1);
_COT_U++;
if(_COT_U==NUM_THREAD_UPLINK){
//if(count==NUM_THREAD_UPLINK){
if (pthread_cond_signal(&uplink_cond_channel)) exit(1);
}
if(pthread_mutex_unlock(&uplink_mutex_channel)) exit(1);
// pthread_mutex_unlock(&exclusive);
}
}
void Clean_Param(double **r_re,double **r_im,LTE_DL_FRAME_PARMS *frame_parms)
{
u32 i,aa;
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
r_re[aa][i]=0.0;
r_im[aa][i]=0.0;
}
}
}
void Channel_Out(lte_subframe_t direction,int eNB_id,int UE_id,double **r_re,double **r_im,double **r_re0,double **r_im0,LTE_DL_FRAME_PARMS *frame_parms)
{
u32 i,aa;
double alpha=0.0;
u32 slot_offset;
frame_parms = &PHY_vars_UE_g[0]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
s32 rx_pwr2;
s32 **rxdata;
if(eNB_id==(UE_id % NB_eNB_INST))
alpha=1;
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
r_re[aa][i]+=(r_re0[aa][i]*alpha);
r_im[aa][i]+=(r_im0[aa][i]*alpha);
}
}
rxdata=rx[eNB_id][0];
if (direction == SF_DL ) {
frame_parms = &PHY_vars_eNB_g[0]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
adc(r_re,
r_im,
0,
slot_offset,
rx[NB_eNB_INST+UE_id][0],
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
12);
}
else{
frame_parms = &PHY_vars_UE_g[0]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
adc(r_re,
r_im,
0,
slot_offset,
rx[eNB_id][0],
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
12);
}
rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1);
// printf("[SIM][DL/UL] UE/eNB %d : rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,nslot,nslot>>1,rxdata);
}
/*
void do_UL_sig_channel(u8 eNB_i,u8 UE_i,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms) {
s32 **txdata,**rxdata;
u8 UE_id=0,eNB_id=0,aa;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
double nf = 0; //currently unused
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
multipath_channel(UE2eNB[UE_i][eNB_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
if (UE2eNB[UE_i][eNB_i]->first_run == 1)
UE2eNB[UE_i][eNB_i]->first_run = 0;
// RF model
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
(UE_id==0) ? (1.0/7.68e6 * 1e9) : 1e9, // sampling time (ns) + set noise bandwidth to 0 for UE>0 (i.e. no noise except for first UE)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
nf, // noise_figure NOT YET IMPLEMENTED
150.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&UE2eNB[UE_i][eNB_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re,r_im,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);
}
*/
/*
void do_DL_sig_channel(u8 eNB_i,u8 UE_i,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms) {
s32 att_eNB_id=-1;
s32 **txdata,**rxdata;
u8 eNB_id=0,UE_id=0;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i,aa;
u32 slot_offset;
multipath_channel(eNB2UE[eNB_i][UE_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
rx_pwr = signal_energy_fp2(eNB2UE[eNB_i][UE_i]->ch[0],eNB2UE[eNB_i][UE_i]->channel_length)*eNB2UE[eNB_i][UE_i]->channel_length;
printf("[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
eNB_i,UE_i,
enb_data[eNB_id]->tx_power_dBm,
eNB2UE[eNB_id][UE_id]->path_loss_dB);
printf("[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr);
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : rx_pwr %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
if (eNB2UE[eNB_id][UE_id]->first_run == 1)
eNB2UE[eNB_id][UE_id]->first_run = 0;
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/eNB2UE[eNB_i][UE_i]->BW, // sampling time (ns)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
ue_data[UE_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
110.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&eNB2UE[eNB_i][UE_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",UE_id,eNB_id,10*log10(rx_pwr),next_slot,next_slot>>1);
}
*/
/*
void init_mmap_channel(int id,LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0) {
int i;
int fd[20];
int result;
double *map;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(double));
(*s_re) = malloc(2*sizeof(double*));
(*s_im) = malloc(2*sizeof(double*));
(*r_re) = malloc(2*sizeof(double*));
(*r_im) = malloc(2*sizeof(double*));
(*r_re0) = malloc(2*sizeof(double*));
(*r_im0) = malloc(2*sizeof(double*));
char buffer[100];
int j=0;
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/s_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/s_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
for (i=0;i<2;i++) {
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
void init_mmap(int id,LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0) {
int i;
int fd[20];
int result;
double *map;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(double));
*s_re = malloc(2*sizeof(double*));
*s_im = malloc(2*sizeof(double*));
*r_re = malloc(2*sizeof(double*));
*r_im = malloc(2*sizeof(double*));
*r_re0 = malloc(2*sizeof(double*));
*r_im0 = malloc(2*sizeof(double*));
char buffer[100];
int j=0;
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/s_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/s_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
for (i=0;i<2;i++) {
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
*/
+24
View File
@@ -0,0 +1,24 @@
/*
* channel_sim_proc.h
*
*/
#ifndef CHANNEL_SIM_PROC_H_
#define CHANNEL_SIM_PROC_H_
void mmap_enb(int id,int **tx_data[3],int **rx_data[3],LTE_DL_FRAME_PARMS *frame_parms);
void mmap_ue(int id,int ***tx_data,int ***rx_data,LTE_DL_FRAME_PARMS *frame_parms);
void Clean_Param(double **r_re,double **r_im,LTE_DL_FRAME_PARMS *frame_parms);
void do_DL_sig_channel_T(void *param);
void do_UL_sig_channel_T(void *param);
void init_rre(LTE_DL_FRAME_PARMS *frame_parms,double ***r_re0,double ***r_im0);
void Channel_Out(lte_subframe_t direction,int eNB_id,int UE_id,double **r_re,double **r_im,double **r_re0,double **r_im0,LTE_DL_FRAME_PARMS *frame_parms);
#endif /* CHANNEL_SIM_PROC_H_ */
+67
View File
@@ -0,0 +1,67 @@
#ifndef __INTERFACE_H__
# define __INTERFACE_H__
typedef struct {
void* pointer;
} memory_reference_t2;
typedef struct {
memory_reference_t2 mem_ref;
}obj_ref_t2;
typedef struct{
obj_ref_t2 *gm;
}HO;
typedef struct {
void* pointer;
int port;
int Exec_Msg_Flag;
int node_id;
int node_role ;
int next_slot;
int last_slot;
int frame;
int sub_frame;
int slot;
int Exec_FLAG;
int EResp_FLAG;
int ue_id;
}s_t;
HO Instance[3];
typedef struct{
int thread_id;
int eNB_id;
int UE_id;
double **s_re;
double **s_im;
double **r_re;
double **r_im;
double **r_re0;
double **r_im0;
struct channel_desc_t *eNB2UE;
struct channel_desc_t *UE2eNB;
struct node_desc_t *enb_data;
struct node_desc_t *ue_data;
int *next_slot;
int *abstraction_flag;
struct LTE_DL_FRAME_PARMS *frame_parms;
int **tx_data[3];
int **rx_data[3];
}ch_thread;
#define CHANNEL_PORT 37800
#define eNB_PORT 38800
#define UE_PORT 39800
#define MAX_eNB 20
#define MAX_UE 20
#endif