Commit e46fb846 authored by nguyennd's avatar nguyennd

Update and validate the eMBMS operation and its interface to OTG, pre-ci test passed

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4148 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent f66750b1
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
extern inline unsigned int taus(void); extern inline unsigned int taus(void);
extern int exit_openair; extern int exit_openair;
extern void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, uint32_t frame, u16 next_slot, LTE_DL_FRAME_PARMS *frame_parms); //extern void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, uint32_t frame, u16 next_slot, LTE_DL_FRAME_PARMS *frame_parms);
unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(16))); unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(16)));
......
...@@ -2989,6 +2989,7 @@ int phy_procedures_UE_RX(u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs ...@@ -2989,6 +2989,7 @@ int phy_procedures_UE_RX(u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
if (ret == (1+phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations)) { if (ret == (1+phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations)) {
phy_vars_ue->dlsch_mch_errors[0]++; phy_vars_ue->dlsch_mch_errors[0]++;
LOG_D(PHY,"number of errors: %d\n",phy_vars_ue->dlsch_mch_errors[0]);
LOG_D(PHY,"[UE %d] Frame %d, subframe %d: PMCH in error, not passing to L2 (TBS %d, iter %d,G %d)\n",phy_vars_ue->Mod_id,((last_slot>>1)==9?-1:0)+phy_vars_ue->frame,last_slot>>1,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3,phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G); LOG_D(PHY,"[UE %d] Frame %d, subframe %d: PMCH in error, not passing to L2 (TBS %d, iter %d,G %d)\n",phy_vars_ue->Mod_id,((last_slot>>1)==9?-1:0)+phy_vars_ue->frame,last_slot>>1,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3,phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G);
dump_mch(phy_vars_ue,0,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G,(last_slot>>1)); dump_mch(phy_vars_ue,0,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G,(last_slot>>1));
#ifdef DEBUG_DLSCH #ifdef DEBUG_DLSCH
......
...@@ -9,7 +9,7 @@ OPENAIR1_TOP = $(OPENAIR1_DIR) ...@@ -9,7 +9,7 @@ OPENAIR1_TOP = $(OPENAIR1_DIR)
OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR2_TOP = $(OPENAIR2_DIR)
OPENAIR3 = $(OPENAIR3_DIR) OPENAIR3 = $(OPENAIR3_DIR)
CFLAGS = -g -O2 -Wno-strict-aliasing -rdynamic -Wall -DPHYSIM -DNODE_RG -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 $(CPUFLAGS) -DMALLOC_CHECK_=1 # -Wno-packed-bitfield-compat CFLAGS = -g -O -Wno-strict-aliasing -rdynamic -Wall -DPHYSIM -DNODE_RG -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 $(CPUFLAGS) -DMALLOC_CHECK_=1 # -Wno-packed-bitfield-compat
# DCI Debug # DCI Debug
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
*/ */
# define MAX_IP_PACKET_SIZE 1512 # define MAX_IP_PACKET_SIZE 1512
# else # else
# define MAX_IP_PACKET_SIZE 1500 # define MAX_IP_PACKET_SIZE 1500 // 3000
# endif # endif
#endif #endif
// overwrite the previous deinitions // overwrite the previous deinitions
......
...@@ -70,7 +70,7 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, ...@@ -70,7 +70,7 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index,
mac_xface->phy_config_sib1_ue(Mod_id,eNB_index,tdd_Config,*SIwindowsize,*SIperiod); mac_xface->phy_config_sib1_ue(Mod_id,eNB_index,tdd_Config,*SIwindowsize,*SIperiod);
} }
if (radioResourceConfigCommon) { if (radioResourceConfigCommon!=NULL) {
if (eNB_flag==1) { if (eNB_flag==1) {
LOG_I(MAC,"[CONFIG]SIB2/3 Contents (partial)\n"); LOG_I(MAC,"[CONFIG]SIB2/3 Contents (partial)\n");
...@@ -185,7 +185,7 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, ...@@ -185,7 +185,7 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index,
} }
if (eNB_flag == 0) { if (eNB_flag == 0) {
if (measObj!= NULL) if (measObj!= NULL) {
if (measObj[0]!= NULL){ if (measObj[0]!= NULL){
UE_mac_inst[Mod_id].n_adj_cells = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.count; UE_mac_inst[Mod_id].n_adj_cells = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.count;
LOG_I(MAC,"Number of adjacent cells %d\n",UE_mac_inst[Mod_id].n_adj_cells); LOG_I(MAC,"Number of adjacent cells %d\n",UE_mac_inst[Mod_id].n_adj_cells);
...@@ -195,6 +195,7 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, ...@@ -195,6 +195,7 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index,
} }
mac_xface->phy_config_meas_ue(Mod_id,eNB_index,UE_mac_inst[Mod_id].n_adj_cells,UE_mac_inst[Mod_id].adj_cell_id); mac_xface->phy_config_meas_ue(Mod_id,eNB_index,UE_mac_inst[Mod_id].n_adj_cells,UE_mac_inst[Mod_id].adj_cell_id);
} }
}
} }
...@@ -243,8 +244,13 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, ...@@ -243,8 +244,13 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index,
if (pmch_InfoList != NULL) { if (pmch_InfoList != NULL) {
// LOG_I(MAC,"DUY: lcid when entering rrc_mac config_req is %02d\n",(pmch_InfoList->list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9));
if (eNB_flag == 1) { if (eNB_flag == 1) {
LOG_I(MAC, "[CONFIG] Number of PMCH in this MBSFN Area %d\n", pmch_InfoList->list.count); LOG_I(MAC, "[CONFIG] Number of PMCH in this MBSFN Area %d\n", pmch_InfoList->list.count);
for (i =0; i< pmch_InfoList->list.count; i++) { for (i =0; i< pmch_InfoList->list.count; i++) {
eNB_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9; eNB_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
...@@ -256,17 +262,15 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, ...@@ -256,17 +262,15 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index,
eNB_mac_inst[Mod_id].pmch_Config[i]->dataMCS_r9); eNB_mac_inst[Mod_id].pmch_Config[i]->dataMCS_r9);
// MBMS session info list in each MCH // MBMS session info list in each MCH
// for (j=0;j< pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9.list.count;j++) { eNB_mac_inst[Mod_id].mbms_SessionList[i] = &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9;
eNB_mac_inst[Mod_id].mbms_SessionList[i] = &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9; LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n",i, eNB_mac_inst[Mod_id].mbms_SessionList[i]->list.count);
LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n",i, eNB_mac_inst[Mod_id].mbms_SessionList[i]->list.count);
// }
} }
} }
else { // UE else { // UE
LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_id); LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_id);
for (i =0; i< pmch_InfoList->list.count; i++) { for (i =0; i< pmch_InfoList->list.count; i++) {
UE_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9; UE_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", Mod_id, LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", Mod_id, i,
UE_mac_inst[Mod_id].pmch_Config[i]->mch_SchedulingPeriod_r9); UE_mac_inst[Mod_id].pmch_Config[i]->mch_SchedulingPeriod_r9);
} }
UE_mac_inst[Mod_id].mcch_status = 1; UE_mac_inst[Mod_id].mcch_status = 1;
......
...@@ -86,8 +86,8 @@ ...@@ -86,8 +86,8 @@
#define MCCH 4 // MCCH #define MCCH 4 // MCCH
#define MTCH 1 // MTCH
#define MTCH 5 // MTCH
#ifdef Rel10 #ifdef Rel10
// Mask for identifying subframe for MBMS // Mask for identifying subframe for MBMS
...@@ -107,7 +107,7 @@ ...@@ -107,7 +107,7 @@
#define MAX_PMCH_perMBSFN 15 #define MAX_PMCH_perMBSFN 15
#define MCCH_PAYLOAD_SIZE_MAX 128 #define MCCH_PAYLOAD_SIZE_MAX 128
#define MCH_PAYLOAD_SIZE_MAX 1024 //#define MCH_PAYLOAD_SIZE_MAX 16384// this value is using in case mcs and TBS index are high
#endif #endif
#ifdef USER_MODE #ifdef USER_MODE
......
...@@ -1091,6 +1091,12 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1091,6 +1091,12 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
int mcch_mcs; int mcch_mcs;
u16 TBS,j,padding=0,post_padding=0; u16 TBS,j,padding=0,post_padding=0;
mac_rlc_status_resp_t rlc_status; mac_rlc_status_resp_t rlc_status;
int num_mtch;
int msi_length,i;
unsigned char sdu_lcids[11], num_sdus=0, offset=0;
u16 sdu_lengths[11], sdu_length_total=0;
unsigned char mch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; // check the max value, this is for dlsch only
switch (eNB_mac_inst[Mod_id].mbsfn_AreaInfo[0]->mcch_Config_r9.signallingMCS_r9) { switch (eNB_mac_inst[Mod_id].mbsfn_AreaInfo[0]->mcch_Config_r9.signallingMCS_r9) {
case 0: case 0:
mcch_mcs = 2; mcch_mcs = 2;
...@@ -1259,22 +1265,17 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1259,22 +1265,17 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
} }
} }
// Calculate the mcs // Calculate the mcs
if ((msi_flag==1) || (mcch_flag==1)) { if ((msi_flag==1) || (mcch_flag==1)) {
eNB_mac_inst[Mod_id].MCH_pdu.mcs = mcch_mcs; eNB_mac_inst[Mod_id].MCH_pdu.mcs = mcch_mcs;
} }
else if (mtch_flag == 1) { // only MTCH in this subframe else if (mtch_flag == 1) { // only MTCH in this subframe
eNB_mac_inst[Mod_id].MCH_pdu.mcs = eNB_mac_inst[Mod_id].pmch_Config[0]->dataMCS_r9; eNB_mac_inst[Mod_id].MCH_pdu.mcs = eNB_mac_inst[Mod_id].pmch_Config[0]->dataMCS_r9;
} }
// 2nd: Create MSI, get MCCH from RRC and MTCHs from RLC // 2nd: Create MSI, get MCCH from RRC and MTCHs from RLC
int num_mtch;
int msi_length,i;
unsigned char sdu_lcids[11], num_sdus=0, offset;
u16 sdu_lengths[11], sdu_length_total=0;
unsigned char mch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; // check the max value, this is for dlsch only
// there is MSI (MCH Scheduling Info) // there is MSI (MCH Scheduling Info)
if (msi_flag == 1) { if (msi_flag == 1) {
// Create MSI here // Create MSI here
...@@ -1292,7 +1293,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1292,7 +1293,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
} }
msi_ptr+= sizeof(MSI_ELEMENT); msi_ptr+= sizeof(MSI_ELEMENT);
//MTCHs //Header for MTCHs
num_mtch = eNB_mac_inst[Mod_id].mbms_SessionList[0]->list.count; num_mtch = eNB_mac_inst[Mod_id].mbms_SessionList[0]->list.count;
for (i=0;i<num_mtch;i++) { // loop for all session in this MCH (MCH[0]) at this moment for (i=0;i<num_mtch;i++) { // loop for all session in this MCH (MCH[0]) at this moment
((MSI_ELEMENT *) msi_ptr)->lcid = eNB_mac_inst[Mod_id].mbms_SessionList[0]->list.array[i]->logicalChannelIdentity_r9;//mtch_lcid; ((MSI_ELEMENT *) msi_ptr)->lcid = eNB_mac_inst[Mod_id].mbms_SessionList[0]->list.array[i]->logicalChannelIdentity_r9;//mtch_lcid;
...@@ -1306,7 +1307,9 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1306,7 +1307,9 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
else else
header_len_msi = 3; header_len_msi = 3;
LOG_D(MAC,"Scheduler: MSI is transmitted in this subframe \n" ); LOG_D(MAC,"[eNB %d] Frame %d : MSI->MCH, length of MSI is %d bytes \n",Mod_id,frame,msi_length);
//LOG_D(MAC,"Scheduler: MSI is transmitted in this subframe \n" );
// LOG_D(MAC,"Scheduler: MSI length is %d bytes\n",msi_length); // LOG_D(MAC,"Scheduler: MSI length is %d bytes\n",msi_length);
// Store MSI data to mch_buffer[0] // Store MSI data to mch_buffer[0]
memcpy((char *)&mch_buffer[sdu_length_total], memcpy((char *)&mch_buffer[sdu_length_total],
...@@ -1363,48 +1366,61 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1363,48 +1366,61 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
} }
eNB_mac_inst[Mod_id].mcch_active=0; eNB_mac_inst[Mod_id].mcch_active=0;
} }
// there is MTCHs, loop if there are more than 1 // there is MTCHs, loop if there are more than 1
if (mtch_flag == 1) { if (mtch_flag == 1) {
// Calculate TBS
// Calculate TBS /* if ((msi_flag==1) || (mcch_flag==1)) {
TBS = mac_xface->get_TBS(mcch_mcs, mac_xface->lte_frame_parms->N_RB_DL);
}
else { // only MTCH in this subframe
TBS = mac_xface->get_TBS(eNB_mac_inst[Mod_id].pmch_Config[0]->dataMCS_r9, mac_xface->lte_frame_parms->N_RB_DL);
}
*/
TBS = mac_xface->get_TBS_DL(eNB_mac_inst[Mod_id].MCH_pdu.mcs, mac_xface->lte_frame_parms->N_RB_DL); TBS = mac_xface->get_TBS_DL(eNB_mac_inst[Mod_id].MCH_pdu.mcs, mac_xface->lte_frame_parms->N_RB_DL);
// get MTCH data from RLC (like for DTCH)
LOG_D(MAC,"[eNB %d] Frame %d : MTCH data is transmitted on this subframe\n",Mod_id,frame);
/* header_len_mtch = 3;
LOG_D(MAC,"[eNB %d], Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n",
Mod_id,frame,MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)),TBS,
TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch);
rlc_status = mac_rlc_status_ind(Mod_id,frame,1,MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), // get MTCH data from RLC (like for DTCH)
LOG_D(MAC,"[eNB %d] Frame %d : MTCH data is transmitted on subframe %d\n",Mod_id,frame,subframe);
header_len_mtch = 3;
LOG_D(MAC,"[eNB %d], Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n",
Mod_id,frame,MTCH,TBS,
TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch);
if (rlc_status.bytes_in_buffer >0) { rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_YES,MTCH+ (maxDRB + 3) * MAX_MOBILES_PER_RG,
// LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch);
// Mod_id,frame,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch); printf("frame %d, subframe %d, rlc_status.bytes_in_buffer is %d\n",frame,subframe, rlc_status.bytes_in_buffer);
sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame, RLC_MBMS_NO if (rlc_status.bytes_in_buffer >0) {
MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n",
(char*)&mch_buffer[sdu_length_total]); Mod_id,frame,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch);
LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] Got %d bytes for MTCH %d\n",Mod_id,sdu_lengths[num_sdus],MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)));
sdu_lcids[num_sdus] = MTCH; sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame, RLC_MBMS_YES,
sdu_length_total += sdu_lengths[num_sdus]; MTCH + (maxDRB + 3) * MAX_MOBILES_PER_RG,
if (sdu_lengths[num_sdus] < 128) (char*)&mch_buffer[sdu_length_total]);
header_len_mtch = 2; //sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame, RLC_MBMS_NO, MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), (char*)&mch_buffer[sdu_length_total]);
num_sdus++; LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] Got %d bytes for MTCH %d\n",Mod_id,sdu_lengths[num_sdus],MTCH);
} sdu_lcids[num_sdus] = MTCH;
else { sdu_length_total += sdu_lengths[num_sdus];
header_len_mtch = 0; if (sdu_lengths[num_sdus] < 128)
} header_len_mtch = 2;
*/ num_sdus++;
}
else {
header_len_mtch = 0;
}
} }
// FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs // FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs
if ((sdu_length_total + header_len_msi + header_len_mcch + header_len_mtch) >0) { if ((sdu_length_total + header_len_msi + header_len_mcch + header_len_mtch) >0) {
// Adjust the last subheader // Adjust the last subheader
/* if ((msi_flag==1) || (mcch_flag==1)) {
eNB_mac_inst[Mod_id].MCH_pdu.mcs = mcch_mcs;
}
else if (mtch_flag == 1) { // only MTCH in this subframe
eNB_mac_inst[Mod_id].MCH_pdu.mcs = eNB_mac_inst[Mod_id].pmch_Config[0]->dataMCS_r9;
}
*/
header_len_mtch_temp = header_len_mtch; header_len_mtch_temp = header_len_mtch;
header_len_mcch_temp = header_len_mcch; header_len_mcch_temp = header_len_mcch;
header_len_msi_temp = header_len_msi; header_len_msi_temp = header_len_msi;
...@@ -1439,7 +1455,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1439,7 +1455,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
padding, padding,
post_padding); post_padding);
LOG_D(MAC,"[DUY] MCS for this sf is %d\n", eNB_mac_inst[Mod_id].MCH_pdu.mcs); LOG_D(MAC," MCS for this sf is %d\n", eNB_mac_inst[Mod_id].MCH_pdu.mcs);
LOG_I(MAC,"[eNB %d][MBMS USER-PLANE ] Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,padding %d,post_padding %d (mcs %d, TBS %d), header MTCH %d, header MCCH %d, header MSI %d\n", LOG_I(MAC,"[eNB %d][MBMS USER-PLANE ] Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,padding %d,post_padding %d (mcs %d, TBS %d), header MTCH %d, header MCCH %d, header MSI %d\n",
Mod_id,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,padding,post_padding,eNB_mac_inst[Mod_id].MCH_pdu.mcs,TBS,header_len_mtch, header_len_mcch, header_len_msi); Mod_id,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,padding,post_padding,eNB_mac_inst[Mod_id].MCH_pdu.mcs,TBS,header_len_mtch, header_len_mcch, header_len_msi);
...@@ -1448,14 +1464,21 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1448,14 +1464,21 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
// filling remainder of MCH with random data if necessery // filling remainder of MCH with random data if necessery
for (j=0;j<(TBS-sdu_length_total-offset);j++) for (j=0;j<(TBS-sdu_length_total-offset);j++)
eNB_mac_inst[Mod_id].MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff); eNB_mac_inst[Mod_id].MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff);
/*
for (j=0;j<sdu_length_total;j++)
printf("%2x.",eNB_mac_inst[Mod_id].MCH_pdu.payload[j+offset]);
printf(" \n");*/
return 1; return 1;
} }
else else {
// for testing purpose, fill with random data
//for (j=0;j<(TBS-sdu_length_total-offset);j++)
// eNB_mac_inst[Mod_id].MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff);
return 0; return 0;
}
//this is for testing //this is for testing
/* if (mtch_flag == 1) { /*
if (mtch_flag == 1) {
// LOG_D(MAC,"DUY: mch_buffer length so far is : %ld\n", &mch_buffer[sdu_length_total]-&mch_buffer[0]); // LOG_D(MAC,"DUY: mch_buffer length so far is : %ld\n", &mch_buffer[sdu_length_total]-&mch_buffer[0]);
return 1; return 1;
} }
...@@ -1466,12 +1489,12 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { ...@@ -1466,12 +1489,12 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) {
MCH_PDU *get_mch_sdu(uint8_t Mod_id,uint32_t frame, uint32_t subframe) { MCH_PDU *get_mch_sdu(uint8_t Mod_id,uint32_t frame, uint32_t subframe) {
// eNB_mac_inst[Mod_id].MCH_pdu.mcs=0; // eNB_mac_inst[Mod_id].MCH_pdu.mcs=0;
LOG_D(MAC,"[DUY] MCH_pdu.mcs is %d\n", eNB_mac_inst[Mod_id].MCH_pdu.mcs); LOG_D(MAC," MCH_pdu.mcs is %d\n", eNB_mac_inst[Mod_id].MCH_pdu.mcs);
return(&eNB_mac_inst[Mod_id].MCH_pdu); return(&eNB_mac_inst[Mod_id].MCH_pdu);
} }
#endif #endif
// First stage of Random-Access Scheduling // First stage of Random-Access Scheduling
void schedule_RA(unsigned char Mod_id,u32 frame, unsigned char subframe,unsigned char Msg3_subframe,unsigned char *nprb,unsigned int *nCCE) { void schedule_RA(unsigned char Mod_id,u32 frame, unsigned char subframe,unsigned char Msg3_subframe,unsigned char *nprb,unsigned int *nCCE) {
...@@ -4226,7 +4249,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf ...@@ -4226,7 +4249,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf
#endif #endif
#ifdef Rel10 #ifdef Rel10
if (eNB_mac_inst[Mod_id].MBMS_flag ==1) { if (eNB_mac_inst[Mod_id].MBMS_flag >0) {
mbsfn_status = schedule_MBMS(Mod_id,frame,subframe); mbsfn_status = schedule_MBMS(Mod_id,frame,subframe);
} }
......
...@@ -173,12 +173,12 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active){ ...@@ -173,12 +173,12 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active){
#ifdef PHY_EMUL #ifdef PHY_EMUL
Mac_rlc_xface->Is_cluster_head[Mod_id]=2;//0: MR, 1: CH, 2: not CH neither MR Mac_rlc_xface->Is_cluster_head[Mod_id]=2;//0: MR, 1: CH, 2: not CH neither MR
#endif #endif
#ifdef Rel10 /*#ifdef Rel10
int n; int n;
for (n=0;n<4096;n++) for (n=0;n<4096;n++)
eNB_mac_inst[Mod_id].MCH_pdu.payload[n] = taus(); eNB_mac_inst[Mod_id].MCH_pdu.payload[n] = taus();
// Mac_rlc_xface->Node_id[Mod_id]=NODE_ID[Mod_id]; // Mac_rlc_xface->Node_id[Mod_id]=NODE_ID[Mod_id];
#endif #endif*/
} }
// Mac_rlc_xface->frame=Mac_rlc_xface->frame; // Mac_rlc_xface->frame=Mac_rlc_xface->frame;
......
...@@ -485,7 +485,7 @@ void ue_send_mch_sdu(u8 Mod_id, u32 frame, u8 *sdu, u16 sdu_len, u8 eNB_index) { ...@@ -485,7 +485,7 @@ void ue_send_mch_sdu(u8 Mod_id, u32 frame, u8 *sdu, u16 sdu_len, u8 eNB_index) {
for (i=0; i<num_sdu; i++) { for (i=0; i<num_sdu; i++) {
if (rx_lcids[i] == MCH_SCHDL_INFO) { if (rx_lcids[i] == MCH_SCHDL_INFO) {
if (UE_mac_inst[Mod_id].mcch_status==1) { if (UE_mac_inst[Mod_id].mcch_status==1) {
LOG_D(MAC,"[UE %d] Frame %d : MCH -> MSI (eNB %d, %d bytes)\n",Mod_id,frame, eNB_index, rx_lengths[i]); LOG_I(MAC,"[UE %d] Frame %d : MCH -> MSI (eNB %d, %d bytes)\n",Mod_id,frame, eNB_index, rx_lengths[i]);
// ??store necessary scheduling info to ue_mac_inst in order to // ??store necessary scheduling info to ue_mac_inst in order to
// calculate exact position of interested service (for the complex case has >1 mtch) // calculate exact position of interested service (for the complex case has >1 mtch)
// set msi_status to 1 // set msi_status to 1
...@@ -501,8 +501,18 @@ void ue_send_mch_sdu(u8 Mod_id, u32 frame, u8 *sdu, u16 sdu_len, u8 eNB_index) { ...@@ -501,8 +501,18 @@ void ue_send_mch_sdu(u8 Mod_id, u32 frame, u8 *sdu, u16 sdu_len, u8 eNB_index) {
} }
else if (rx_lcids[i] == MTCH) { else if (rx_lcids[i] == MTCH) {
if (UE_mac_inst[Mod_id].msi_status==1) { if (UE_mac_inst[Mod_id].msi_status==1) {
// LOG_I(MAC,"[UE %d] Frame %d : MCH -> MTCH (eNB %d, %d bytes)\n",Mod_id,frame, eNB_index, rx_lengths[i]); LOG_I(MAC,"[UE %d] Frame %d : MCH -> MTCH (eNB %d, %d bytes)\n",Mod_id,frame, eNB_index, rx_lengths[i]);
// mac_rlc_data_ind(); check for this function
mac_rlc_data_ind(Mod_id+NB_eNB_INST, // because rlc[module_idP] (to differential between eNB and UE)
frame,
0,
RLC_MBMS_YES,
MTCH + (maxDRB + 3),
(char *)payload_ptr,
rx_lengths[i],
1,
NULL);
} }
} }
payload_ptr += rx_lengths[i]; payload_ptr += rx_lengths[i];
...@@ -528,13 +538,13 @@ int ue_query_mch(uint8_t Mod_id, uint32_t frame, uint32_t subframe) { ...@@ -528,13 +538,13 @@ int ue_query_mch(uint8_t Mod_id, uint32_t frame, uint32_t subframe) {
if (UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frame format if (UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frame format
if (UE_mac_inst[Mod_id].pmch_Config[0]) { if (UE_mac_inst[Mod_id].pmch_Config[0]) {
// Find the first subframe in this MCH to transmit MSI // Find the first subframe in this MCH to transmit MSI
if (frame % mch_scheduling_period == UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->radioframeAllocationOffset ) { if (frame % mch_scheduling_period == UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->radioframeAllocationOffset ) {
while (ii == 0) { while (ii == 0) {
ii = UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); ii = UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos);
msi_pos++; msi_pos++;
}
} }
}
} }
// Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1
......
...@@ -94,7 +94,7 @@ BOOL pdcp_data_req(module_id_t module_id, u32_t frame, u8_t eNB_flag, rb_id_t rb ...@@ -94,7 +94,7 @@ BOOL pdcp_data_req(module_id_t module_id, u32_t frame, u8_t eNB_flag, rb_id_t rb
mem_block_t* pdcp_pdu = NULL; mem_block_t* pdcp_pdu = NULL;
rlc_op_status_t rlc_status; rlc_op_status_t rlc_status;
if (pdcp->instanciated_instance == 0) { if ((pdcp->instanciated_instance == 0) && (mode != PDCP_TM)) {
LOG_W(PDCP, "Instance is not configured, Ignoring SDU...\n"); LOG_W(PDCP, "Instance is not configured, Ignoring SDU...\n");
return FALSE; return FALSE;
} }
...@@ -119,7 +119,7 @@ BOOL pdcp_data_req(module_id_t module_id, u32_t frame, u8_t eNB_flag, rb_id_t rb ...@@ -119,7 +119,7 @@ BOOL pdcp_data_req(module_id_t module_id, u32_t frame, u8_t eNB_flag, rb_id_t rb
LOG_D(PDCP, " [TM] Asking for a new mem_block of size %d\n",sdu_buffer_size); LOG_D(PDCP, " [TM] Asking for a new mem_block of size %d\n",sdu_buffer_size);
pdcp_pdu = get_free_mem_block(sdu_buffer_size); pdcp_pdu = get_free_mem_block(sdu_buffer_size);
if (pdcp_pdu != NULL) { if (pdcp_pdu != NULL) {
memcpy(&pdcp_pdu->data, sdu_buffer, sdu_buffer_size); memcpy(&pdcp_pdu->data[0], sdu_buffer, sdu_buffer_size);
rlc_status = rlc_data_req(module_id, frame, eNB_flag, RLC_MBMS_YES, rb_id, muiP, confirmP, sdu_buffer_size, pdcp_pdu); rlc_status = rlc_data_req(module_id, frame, eNB_flag, RLC_MBMS_YES, rb_id, muiP, confirmP, sdu_buffer_size, pdcp_pdu);
} else } else
rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES; rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES;
......
...@@ -638,12 +638,12 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index ...@@ -638,12 +638,12 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index
int pkt_size=0, pkt_cnt=0; int pkt_size=0, pkt_cnt=0;
u8 pdcp_mode; u8 pdcp_mode;
Packet_otg_elt * otg_pkt_info; Packet_otg_elt * otg_pkt_info;
// we need to add conditions to avoid transmitting data when the UE is not RRC connected. // we need to add conditions to avoid transmitting data when the UE is not RRC connected.
#if defined(USER_MODE) && defined(OAI_EMU) #if defined(USER_MODE) && defined(OAI_EMU)
if (oai_emulation.info.otg_enabled ==1 ){ if (oai_emulation.info.otg_enabled ==1 ){
module_id = (eNB_flag == 1) ? eNB_index : NB_eNB_INST + UE_index ; module_id = (eNB_flag == 1) ? eNB_index : NB_eNB_INST + UE_index ;
//rb_id = (eNB_flag == 1) ? eNB_index * MAX_NUM_RB + DTCH : (NB_eNB_INST + UE_index -1 ) * MAX_NUM_RB + DTCH ; //rb_id = (eNB_flag == 1) ? eNB_index * MAX_NUM_RB + DTCH : (NB_eNB_INST + UE_index -1 ) * MAX_NUM_RB + DTCH ;
if (eNB_flag == 1) { // search for DL traffic if (eNB_flag == 1) { // search for DL traffic
//for (dst_id = NB_eNB_INST; dst_id < NB_UE_INST + NB_eNB_INST; dst_id++) { //for (dst_id = NB_eNB_INST; dst_id < NB_UE_INST + NB_eNB_INST; dst_id++) {
while ((otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id]))) != NULL) { while ((otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id]))) != NULL) {
...@@ -653,6 +653,8 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index ...@@ -653,6 +653,8 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index
module_id = (otg_pkt_info->otg_pkt).module_id; module_id = (otg_pkt_info->otg_pkt).module_id;
rb_id = (otg_pkt_info->otg_pkt).rb_id; rb_id = (otg_pkt_info->otg_pkt).rb_id;
pdcp_mode = (otg_pkt_info->otg_pkt).mode; pdcp_mode = (otg_pkt_info->otg_pkt).mode;
// LOG_I(PDCP,"pdcp_fifo, pdcp mode is= %d\n",pdcp_mode);
// generate traffic if the ue is rrc reconfigured state // generate traffic if the ue is rrc reconfigured state
// if (mac_get_rrc_status(module_id, eNB_flag, dst_id ) > 2 /*RRC_CONNECTED*/) { // not needed: this test is already done in update_otg_enb // if (mac_get_rrc_status(module_id, eNB_flag, dst_id ) > 2 /*RRC_CONNECTED*/) { // not needed: this test is already done in update_otg_enb
otg_pkt = (u8*) (otg_pkt_info->otg_pkt).sdu_buffer; otg_pkt = (u8*) (otg_pkt_info->otg_pkt).sdu_buffer;
...@@ -664,6 +666,7 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index ...@@ -664,6 +666,7 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index
free(otg_pkt); free(otg_pkt);
} }
// } //else LOG_D(OTG,"frame %d enb %d-> ue %d link not yet established state %d \n", frame, eNB_index,dst_id - NB_eNB_INST, mac_get_rrc_status(module_id, eNB_flag, dst_id - NB_eNB_INST)); // } //else LOG_D(OTG,"frame %d enb %d-> ue %d link not yet established state %d \n", frame, eNB_index,dst_id - NB_eNB_INST, mac_get_rrc_status(module_id, eNB_flag, dst_id - NB_eNB_INST));
} }
} }
else { else {
...@@ -678,7 +681,7 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index ...@@ -678,7 +681,7 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index
otg_pkt = (u8*) (otg_pkt_info->otg_pkt).sdu_buffer; otg_pkt = (u8*) (otg_pkt_info->otg_pkt).sdu_buffer;
pkt_size = (otg_pkt_info->otg_pkt).sdu_buffer_size; pkt_size = (otg_pkt_info->otg_pkt).sdu_buffer_size;
if (otg_pkt != NULL){ if (otg_pkt != NULL){
//rb_id= eNB_index * MAX_NUM_RB + DTCH; //rb_id= eNB_index * MAX_NUM_RB + DTCH;
LOG_D(OTG,"[UE %d] sending packet from module %d on rab id %d (src %d, dst %d) pkt size %d\n", UE_index, src_id, rb_id, src_id, dst_id, pkt_size); LOG_D(OTG,"[UE %d] sending packet from module %d on rab id %d (src %d, dst %d) pkt size %d\n", UE_index, src_id, rb_id, src_id, dst_id, pkt_size);
pdcp_data_req(src_id, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO,pkt_size, otg_pkt, PDCP_DATA_PDU); pdcp_data_req(src_id, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO,pkt_size, otg_pkt, PDCP_DATA_PDU);
free(otg_pkt); free(otg_pkt);
...@@ -692,9 +695,9 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index ...@@ -692,9 +695,9 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index
unsigned int ctime=0; unsigned int ctime=0;
src_id = eNB_index; src_id = eNB_index;
ctime = frame * 100; ctime = frame * 100;
/*if ((mac_get_rrc_status(eNB_index, eNB_flag, 0 ) > 2) && /*if ((mac_get_rrc_status(eNB_index, eNB_flag, 0 ) > 2) &&
(mac_get_rrc_status(eNB_index, eNB_flag, 1 ) > 2)) { */ (mac_get_rrc_status(eNB_index, eNB_flag, 1 ) > 2)) { */
for (dst_id = 0; dst_id<NUMBER_OF_UE_MAX; dst_id++) { for (dst_id = 0; dst_id<NUMBER_OF_UE_MAX; dst_id++) {
if (mac_get_rrc_status(eNB_index, eNB_flag, dst_id ) > 2) { if (mac_get_rrc_status(eNB_index, eNB_flag, dst_id ) > 2) {
otg_pkt=packet_gen(src_id, dst_id, ctime, &pkt_size); otg_pkt=packet_gen(src_id, dst_id, ctime, &pkt_size);
...@@ -705,12 +708,12 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index ...@@ -705,12 +708,12 @@ void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index
free(otg_pkt); free(otg_pkt);
} }
/*else { /*else {
LOG_I(OTG,"nothing generated (src %d, dst %d)\n",src_id, dst_id); LOG_I(OTG,"nothing generated (src %d, dst %d)\n",src_id, dst_id);
}*/ }*/
} }
/*else { /*else {
LOG_I(OTG,"rrc_status (src %d, dst %d) = %d\n",src_id, dst_id, mac_get_rrc_status(src_id, eNB_flag, dst_id )); LOG_I(OTG,"rrc_status (src %d, dst %d) = %d\n",src_id, dst_id, mac_get_rrc_status(src_id, eNB_flag, dst_id ));
}*/ }*/
} }
} }
#endif #endif
......
...@@ -423,6 +423,7 @@ rlc_um_segment_5 (struct rlc_um_entity *rlcP,u32_t frame) ...@@ -423,6 +423,7 @@ rlc_um_segment_5 (struct rlc_um_entity *rlcP,u32_t frame)
test_remaining_size_to_substract = 0; test_remaining_size_to_substract = 0;
test_remaining_num_li_to_substract = 0; test_remaining_num_li_to_substract = 0;
pdu_remaining_size = pdu_remaining_size - (test_li_length_in_bytes ^ 3); pdu_remaining_size = pdu_remaining_size - (test_li_length_in_bytes ^ 3);
data_pdu_size -= (test_li_length_in_bytes ^ 3);//modifier pour duy
} else if ((sdu_mngt->sdu_remaining_size + (test_li_length_in_bytes ^ 3)) < test_pdu_remaining_size ) { } else if ((sdu_mngt->sdu_remaining_size + (test_li_length_in_bytes ^ 3)) < test_pdu_remaining_size ) {
test_num_li += 1; test_num_li += 1;
num_fill_sdu += 1; num_fill_sdu += 1;
...@@ -439,6 +440,7 @@ rlc_um_segment_5 (struct rlc_um_entity *rlcP,u32_t frame) ...@@ -439,6 +440,7 @@ rlc_um_segment_5 (struct rlc_um_entity *rlcP,u32_t frame)
test_remaining_size_to_substract = 0; test_remaining_size_to_substract = 0;
test_remaining_num_li_to_substract = 0; test_remaining_num_li_to_substract = 0;
pdu_remaining_size = pdu_remaining_size - 1; pdu_remaining_size = pdu_remaining_size - 1;
data_pdu_size -= 1;//modifier pour duy
} }
sdu_buffer_index = (sdu_buffer_index + 1) % rlcP->size_input_sdus_buffer; sdu_buffer_index = (sdu_buffer_index + 1) % rlcP->size_input_sdus_buffer;
} }
......
...@@ -438,20 +438,18 @@ rlc_op_status_t rlc_data_req (module_id_t module_idP, u32_t frame, u8_t eNB_ ...@@ -438,20 +438,18 @@ rlc_op_status_t rlc_data_req (module_id_t module_idP, u32_t frame, u8_t eNB_
} else { } else {
mbms_rb_id = rb_idP + (maxDRB + 3); mbms_rb_id = rb_idP + (maxDRB + 3);
} }
// LOG_I(RLC,"DUY rlc_data_req: mbms_rb_id in RLC instant is: %d\n", mbms_rb_id);
if (sduP != NULL) { if (sduP != NULL) {
if (sdu_sizeP > 0) { if (sdu_sizeP > 0) {
LOG_I(RLC,"received a packet with size %d for MBMS \n", sdu_sizeP); LOG_I(RLC,"received a packet with size %d for MBMS \n", sdu_sizeP);
new_sdu = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc)); new_sdu = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc));
if (new_sdu != NULL) { if (new_sdu != NULL) {
// PROCESS OF COMPRESSION HERE: // PROCESS OF COMPRESSION HERE:
memset (new_sdu->data, 0, sizeof (struct rlc_um_data_req_alloc)); memset (new_sdu->data, 0, sizeof (struct rlc_um_data_req_alloc));
memcpy (&new_sdu->data[sizeof (struct rlc_um_data_req_alloc)], &sduP->data[0], sdu_sizeP); memcpy (&new_sdu->data[sizeof (struct rlc_um_data_req_alloc)], &sduP->data[0], sdu_sizeP);
((struct rlc_um_data_req *) (new_sdu->data))->data_size = sdu_sizeP; ((struct rlc_um_data_req *) (new_sdu->data))->data_size = sdu_sizeP;
((struct rlc_um_data_req *) (new_sdu->data))->data_offset = sizeof (struct rlc_um_data_req_alloc); ((struct rlc_um_data_req *) (new_sdu->data))->data_offset = sizeof (struct rlc_um_data_req_alloc);
free_mem_block(sduP); free_mem_block(sduP);
LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
if (rlc[module_idP].m_rlc_um_array[rlc[module_idP].m_rlc_pointer[mbms_rb_id].rlc_index].is_data_plane) { if (rlc[module_idP].m_rlc_um_array[rlc[module_idP].m_rlc_pointer[mbms_rb_id].rlc_index].is_data_plane) {
LOG_D(RLC, "[MSC_MSG][FRAME %05d][PDCP][MOD %02d][RB %02d][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][MOD %02d][RB %02d]\n", LOG_D(RLC, "[MSC_MSG][FRAME %05d][PDCP][MOD %02d][RB %02d][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][MOD %02d][RB %02d]\n",
...@@ -480,13 +478,13 @@ rlc_op_status_t rlc_data_req (module_id_t module_idP, u32_t frame, u8_t eNB_ ...@@ -480,13 +478,13 @@ rlc_op_status_t rlc_data_req (module_id_t module_idP, u32_t frame, u8_t eNB_
return RLC_OP_STATUS_BAD_PARAMETER; return RLC_OP_STATUS_BAD_PARAMETER;
} }
} else { } else {
return RLC_OP_STATUS_BAD_PARAMETER; return RLC_OP_STATUS_BAD_PARAMETER;
} }
#endif #endif
} else { } else {
free_mem_block(sduP); free_mem_block(sduP);
//handle_event(ERROR,"FILE %s FONCTION rlc_data_req() LINE %s : parameter module_id out of bounds :%d\n", __FILE__, __LINE__, module_idP); //handle_event(ERROR,"FILE %s FONCTION rlc_data_req() LINE %s : parameter module_id out of bounds :%d\n", __FILE__, __LINE__, module_idP);
return RLC_OP_STATUS_BAD_PARAMETER; return RLC_OP_STATUS_BAD_PARAMETER;
} }
} }
......
...@@ -40,7 +40,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (module_id_t module_idP, u32_t frameP, u ...@@ -40,7 +40,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (module_id_t module_idP, u32_t frameP, u
rlc_mode_t rlc_type; rlc_mode_t rlc_type;
#ifdef Rel10 #ifdef Rel10
long int cnt2 = 0; long int cnt2 = 0;
long int mrb_id = 0; // long int mrb_id = 0;
long int mbms_service_id = 0; long int mbms_service_id = 0;
long int mbms_session_id = 0; long int mbms_session_id = 0;
PMCH_Info_r9_t* pmch_info_r9 = NULL; PMCH_Info_r9_t* pmch_info_r9 = NULL;
...@@ -264,61 +264,66 @@ rlc_op_status_t rrc_rlc_config_asn1_req (module_id_t module_idP, u32_t frameP, u ...@@ -264,61 +264,66 @@ rlc_op_status_t rrc_rlc_config_asn1_req (module_id_t module_idP, u32_t frameP, u
#ifdef Rel10 #ifdef Rel10
if (pmch_info_listP != NULL) { if (pmch_info_listP != NULL) {
for (cnt=0;cnt<pmch_info_listP->list.count;cnt++) {
pmch_info_r9 = pmch_info_listP->list.array[cnt]; LOG_I(RRC,"[%s %d] Config RLC instant for MBMS\n", (eNB_flagP) ? "eNB" : "UE", module_idP);
for (cnt2=0;cnt2<pmch_info_r9->mbms_SessionInfoList_r9.list.count;cnt2++) { for (cnt=0;cnt<pmch_info_listP->list.count;cnt++) {
mbms_session = pmch_info_r9->mbms_SessionInfoList_r9.list.array[cnt2]; pmch_info_r9 = pmch_info_listP->list.array[cnt];
if (mbms_session->logicalChannelIdentity_r9 > 0) { for (cnt2=0;cnt2<pmch_info_r9->mbms_SessionInfoList_r9.list.count;cnt2++) {
//lc_id = (NUMBER_OF_UE_MAX*NB_RB_MAX) + mbms_session->logicalChannelIdentity_r9; mbms_session = pmch_info_r9->mbms_SessionInfoList_r9.list.array[cnt2];
if (eNB_flagP) { if (mbms_session->logicalChannelIdentity_r9 > 0) {
lc_id = mbms_session->logicalChannelIdentity_r9 + (maxDRB + 3) * MAX_MOBILES_PER_RG;
} else { // lc_id = (NUMBER_OF_UE_MAX*NB_RB_MAX) + mbms_session->logicalChannelIdentity_r9;
lc_id = mbms_session->logicalChannelIdentity_r9 + (maxDRB + 3); // test this one and tell Lionel
} if (eNB_flagP) {
lc_id = mbms_session->logicalChannelIdentity_r9 + (maxDRB + 3) * MAX_MOBILES_PER_RG;
if (mbms_session->sessionId_r9 != NULL) { } else {
mbms_session_id = mbms_session->sessionId_r9->buf[0]; lc_id = mbms_session->logicalChannelIdentity_r9 + (maxDRB + 3);
} else { }
mbms_session_id = mbms_session->logicalChannelIdentity_r9;
}
mbms_service_id = mbms_session->tmgi_r9.serviceId_r9.buf[0];
rb_id = (mbms_service_id * maxSessionPerPMCH) + lc_id;
if (rlc[module_idP].m_rlc_pointer[rb_id].rlc_type == RLC_NONE) {
rlc_status = rrc_rlc_add_rlc (module_idP, frameP, rb_id, lc_id, RLC_UM);
if (rlc_status != RLC_OP_STATUS_OK ) {
LOG_D(RLC, "[RLC_RRC] COULD NOT ALLOCATE RLC UM INSTANCE\n");
continue;//? return rlc_status;
}
} else if (rlc[module_idP].m_rlc_pointer[rb_id].rlc_type != RLC_UM) {
LOG_E(RLC, "[RLC_RRC] MBMS ERROR IN CONFIG, RLC FOUND ALREADY CONFIGURED FOR MBMS BEARER IS NOT UM\n");
continue;
}
dl_um_rlc.sn_FieldLength = SN_FieldLength_size10;
dl_um_rlc.t_Reordering = T_Reordering_ms5;
config_req_rlc_um_asn1 (&rlc[module_idP].m_rlc_um_array[rlc[module_idP].m_rlc_pointer[rb_id].rlc_index],
frameP, if (mbms_session->sessionId_r9 != NULL) {
eNB_flagP, mbms_session_id = mbms_session->sessionId_r9->buf[0];
RLC_MBMS_YES, } else {
module_idP, mbms_session_id = mbms_session->logicalChannelIdentity_r9;
NULL, }
&dl_um_rlc, mbms_service_id = mbms_session->tmgi_r9.serviceId_r9.buf[2];// can use the pmch_index, here is the value 'cnt'
rb_id, rb_id = (mbms_service_id * maxSessionPerPMCH) + lc_id;
RADIO_ACCESS_BEARER);
} else { if (rlc[module_idP].m_rlc_pointer[rb_id].rlc_type == RLC_NONE) {
LOG_D(RLC, "[RLC_RRC] Invalid LogicalChannelIdentity for MTCH --- Value 0 is reserved for MCCH\n"); rlc_status = rrc_rlc_add_rlc (module_idP, frameP, rb_id, lc_id, RLC_UM);
lc_id = -1; if (rlc_status != RLC_OP_STATUS_OK ) {
} LOG_D(RLC, "[RLC_RRC] COULD NOT ALLOCATE RLC UM INSTANCE\n");
} continue;//? return rlc_status;
} }
} else if (rlc[module_idP].m_rlc_pointer[rb_id].rlc_type != RLC_UM) {
LOG_E(RLC, "[RLC_RRC] MBMS ERROR IN CONFIG, RLC FOUND ALREADY CONFIGURED FOR MBMS BEARER IS NOT UM\n");
continue;
}
dl_um_rlc.sn_FieldLength = SN_FieldLength_size5;
dl_um_rlc.t_Reordering = T_Reordering_ms0;
config_req_rlc_um_asn1 (&rlc[module_idP].m_rlc_um_array[rlc[module_idP].m_rlc_pointer[rb_id].rlc_index],
frameP,
eNB_flagP,
RLC_MBMS_YES,
module_idP,
NULL,
&dl_um_rlc,
rb_id,
RADIO_ACCESS_BEARER);
} else {
LOG_D(RLC, "[RLC_RRC] Invalid LogicalChannelIdentity for MTCH --- Value 0 is reserved for MCCH\n");
lc_id = -1;
}
}
} }
}
#endif #endif
LOG_D(RLC, "[RLC_RRC][MOD_id %d]CONFIG REQ ASN1 END \n",module_idP); LOG_D(RLC, "[RLC_RRC][MOD_id %d]CONFIG REQ ASN1 END \n",module_idP);
return RLC_OP_STATUS_OK; return RLC_OP_STATUS_OK;
} }
......
...@@ -30,3 +30,4 @@ regen: regenerate-from-asn1-source ...@@ -30,3 +30,4 @@ regen: regenerate-from-asn1-source
regenerate-from-asn1-source: regenerate-from-asn1-source:
asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy asn1c/ASN1_files/EUTRA-RRC-Definitions.asn asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy asn1c/ASN1_files/EUTRA-RRC-Definitions.asn
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "DRB-ToAddModList.h" #include "DRB-ToAddModList.h"
#ifdef Rel10 #ifdef Rel10
#include "MCCH-Message.h" #include "MCCH-Message.h"
#define MRB1 1 //#define MRB1 1
#endif #endif
#include "RRC/LITE/defs.h" #include "RRC/LITE/defs.h"
...@@ -596,7 +596,7 @@ uint8_t do_SIB23(uint8_t Mod_id, ...@@ -596,7 +596,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
*sib3 = &sib3_part->choice.sib3; *sib3 = &sib3_part->choice.sib3;
#ifdef Rel10 #ifdef Rel10
if (MBMS_flag == 1) { if (MBMS_flag > 0) {
sib13_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); sib13_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
memset(sib13_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); memset(sib13_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
sib13_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920; sib13_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920;
...@@ -722,7 +722,7 @@ uint8_t do_SIB23(uint8_t Mod_id, ...@@ -722,7 +722,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
// (*sib2)->mbsfn_SubframeConfigList = NULL; // (*sib2)->mbsfn_SubframeConfigList = NULL;
#ifdef Rel10 #ifdef Rel10
if (MBMS_flag == 1) { if (MBMS_flag > 0) {
LOG_I(RRC,"Adding MBSFN Configuration to SIB2\n"); LOG_I(RRC,"Adding MBSFN Configuration to SIB2\n");
MBSFN_SubframeConfig_t *sib2_mbsfn_SubframeConfig1; MBSFN_SubframeConfig_t *sib2_mbsfn_SubframeConfig1;
(*sib2)->mbsfn_SubframeConfigList = CALLOC(1,sizeof(struct MBSFN_SubframeConfigList)); (*sib2)->mbsfn_SubframeConfigList = CALLOC(1,sizeof(struct MBSFN_SubframeConfigList));
...@@ -738,10 +738,10 @@ uint8_t do_SIB23(uint8_t Mod_id, ...@@ -738,10 +738,10 @@ uint8_t do_SIB23(uint8_t Mod_id,
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1; sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1;
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2; sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2;
if (frame_parms->frame_type == TDD) {// pattern 001110 for TDD if (frame_parms->frame_type == TDD) {// pattern 001110 for TDD
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x0e<<2;// shift 2 cuz 2last bits are unused. sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x08<<2;// shift 2 cuz 2last bits are unused.
} }
else { // pattern 101010 for FDD) else { // pattern 101010 for FDD)
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x2a<<2; sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x30<<2;
} }
ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig1); ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig1);
} }
...@@ -785,7 +785,7 @@ uint8_t do_SIB23(uint8_t Mod_id, ...@@ -785,7 +785,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
// SIB13 // SIB13
// fill in all elements of SIB13 if present // fill in all elements of SIB13 if present
#ifdef Rel10 #ifdef Rel10
if (MBMS_flag == 1) { if (MBMS_flag > 0 ) {
// Notification for mcch change // Notification for mcch change
(*sib13)->notificationConfig_r9.notificationRepetitionCoeff_r9= MBMS_NotificationConfig_r9__notificationRepetitionCoeff_r9_n2; (*sib13)->notificationConfig_r9.notificationRepetitionCoeff_r9= MBMS_NotificationConfig_r9__notificationRepetitionCoeff_r9_n2;
(*sib13)->notificationConfig_r9.notificationOffset_r9= 0; (*sib13)->notificationConfig_r9.notificationOffset_r9= 0;
...@@ -813,7 +813,7 @@ uint8_t do_SIB23(uint8_t Mod_id, ...@@ -813,7 +813,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
} }
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2; MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2;
MBSFN_Area1->mcch_Config_r9.signallingMCS_r9= MBSFN_AreaInfo_r9__mcch_Config_r9__signallingMCS_r9_n7; MBSFN_Area1->mcch_Config_r9.signallingMCS_r9= MBSFN_AreaInfo_r9__mcch_Config_r9__signallingMCS_r9_n13;
ASN_SEQUENCE_ADD(&MBSFNArea_list->list,MBSFN_Area1); ASN_SEQUENCE_ADD(&MBSFNArea_list->list,MBSFN_Area1);
...@@ -857,7 +857,7 @@ uint8_t do_SIB23(uint8_t Mod_id, ...@@ -857,7 +857,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list, ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list,
sib3_part); sib3_part);
#ifdef Rel10 #ifdef Rel10
if (MBMS_flag == 1) { if (MBMS_flag > 0) {
ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list,sib13_part); ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list,sib13_part);
} }
#endif #endif
...@@ -1475,7 +1475,7 @@ uint8_t do_RRCConnectionReconfiguration(uint8_t Mod_id ...@@ -1475,7 +1475,7 @@ uint8_t do_RRCConnectionReconfiguration(uint8_t Mod_id
} }
uint8_t TMGI[5] = {5,4,0,0,1};//TMGI is a string of octet, ref. TS 24.008 fig. 10.5.4a uint8_t TMGI[5] = {4,3,2,1,0};//TMGI is a string of octet, ref. TS 24.008 fig. 10.5.4a
#ifdef Rel10 #ifdef Rel10
uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms, uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms,
...@@ -1505,10 +1505,10 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -1505,10 +1505,10 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms,
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1; mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1;
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2; mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2;
if (frame_parms->frame_type == TDD) {// pattern 001110 for TDD if (frame_parms->frame_type == TDD) {// pattern 001110 for TDD
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x0e<<2;// shift 2bits cuz 2last bits are unused. mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x08<<2;// shift 2bits cuz 2last bits are unused.
} }
else { // pattern 101010 for FDD) else { // pattern 101010 for FDD)
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x2a<<2; mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x30<<2;
} }
ASN_SEQUENCE_ADD(&(*mbsfnAreaConfiguration)->commonSF_Alloc_r9.list,mbsfn_SubframeConfig1); ASN_SEQUENCE_ADD(&(*mbsfnAreaConfiguration)->commonSF_Alloc_r9.list,mbsfn_SubframeConfig1);
...@@ -1520,8 +1520,8 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -1520,8 +1520,8 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms,
pmch_Info_1 = CALLOC(1,sizeof(PMCH_Info_r9_t)); pmch_Info_1 = CALLOC(1,sizeof(PMCH_Info_r9_t));
memset((void*)pmch_Info_1,0,sizeof(PMCH_Info_r9_t)); memset((void*)pmch_Info_1,0,sizeof(PMCH_Info_r9_t));
pmch_Info_1->pmch_Config_r9.sf_AllocEnd_r9= 11;//take the value of last mbsfn subframe in this CSA period because there is only one PMCH in this mbsfn area pmch_Info_1->pmch_Config_r9.sf_AllocEnd_r9= 3;//take the value of last mbsfn subframe in this CSA period because there is only one PMCH in this mbsfn area
pmch_Info_1->pmch_Config_r9.dataMCS_r9= 15; pmch_Info_1->pmch_Config_r9.dataMCS_r9= 13;
pmch_Info_1->pmch_Config_r9.mch_SchedulingPeriod_r9= PMCH_Config_r9__mch_SchedulingPeriod_r9_rf16; pmch_Info_1->pmch_Config_r9.mch_SchedulingPeriod_r9= PMCH_Config_r9__mch_SchedulingPeriod_r9_rf16;
// MBMSs-SessionInfoList-r9 // MBMSs-SessionInfoList-r9
...@@ -1539,7 +1539,7 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -1539,7 +1539,7 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms,
mbms_Session_1->sessionId_r9 = CALLOC(1,sizeof(OCTET_STRING_t)); mbms_Session_1->sessionId_r9 = CALLOC(1,sizeof(OCTET_STRING_t));
mbms_Session_1->sessionId_r9->buf= MALLOC(1); mbms_Session_1->sessionId_r9->buf= MALLOC(1);
mbms_Session_1->sessionId_r9->size= 1; mbms_Session_1->sessionId_r9->size= 1;
mbms_Session_1->sessionId_r9->buf[0]= MRB1; mbms_Session_1->sessionId_r9->buf[0]= MTCH;
// Logical Channel ID // Logical Channel ID
mbms_Session_1->logicalChannelIdentity_r9= MTCH; mbms_Session_1->logicalChannelIdentity_r9= MTCH;
ASN_SEQUENCE_ADD(&pmch_Info_1->mbms_SessionInfoList_r9.list,mbms_Session_1); ASN_SEQUENCE_ADD(&pmch_Info_1->mbms_SessionInfoList_r9.list,mbms_Session_1);
......
...@@ -1472,6 +1472,7 @@ int decode_SI(u8 Mod_id,u32 frame,u8 eNB_index,u8 si_window) { ...@@ -1472,6 +1472,7 @@ int decode_SI(u8 Mod_id,u32 frame,u8 eNB_index,u8 si_window) {
if (UE_rrc_inst[Mod_id].MBMS_flag < 3) // see -Q option if (UE_rrc_inst[Mod_id].MBMS_flag < 3) // see -Q option
#endif #endif
rrc_ue_generate_RRCConnectionRequest(Mod_id,frame,eNB_index); rrc_ue_generate_RRCConnectionRequest(Mod_id,frame,eNB_index);
LOG_I(RRC, "not sending connection request\n");
if (UE_rrc_inst[Mod_id].Info[eNB_index].State == RRC_IDLE) { if (UE_rrc_inst[Mod_id].Info[eNB_index].State == RRC_IDLE) {
LOG_I(RRC,"[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED\n",Mod_id); LOG_I(RRC,"[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED\n",Mod_id);
...@@ -1577,6 +1578,7 @@ int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len) ...@@ -1577,6 +1578,7 @@ int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len)
asn_dec_rval_t dec_rval; asn_dec_rval_t dec_rval;
if (UE_rrc_inst[Mod_id].Info[eNB_index].MCCH_MESSAGEStatus == 1) { if (UE_rrc_inst[Mod_id].Info[eNB_index].MCCH_MESSAGEStatus == 1) {
LOG_D(RRC,"MCCH MESSAGE has been already received!\n");
return 0; // avoid decoding to prevent memory bloating return 0; // avoid decoding to prevent memory bloating
} }
else { else {
...@@ -1596,15 +1598,15 @@ int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len) ...@@ -1596,15 +1598,15 @@ int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len)
#endif #endif
if (mcch->message.present == MCCH_MessageType_PR_c1) { if (mcch->message.present == MCCH_MessageType_PR_c1) {
LOG_D(RRC,"[UE %d] Found First MCCH_MESSAGE\n",Mod_id); LOG_D(RRC,"[UE %d] Found mcch message \n",Mod_id);
if(mcch->message.choice.c1.present == MCCH_MessageType__c1_PR_mbsfnAreaConfiguration_r9) { if(mcch->message.choice.c1.present == MCCH_MessageType__c1_PR_mbsfnAreaConfiguration_r9) {
/* /*
memcpy((void*)*mcch_message, memcpy((void*)*mcch_message,
(void*)&mcch->message.choice.c1.choice.mbsfnAreaConfiguration_r9, (void*)&mcch->message.choice.c1.choice.mbsfnAreaConfiguration_r9,
sizeof(MBSFNAreaConfiguration_r9_t)); */ sizeof(MBSFNAreaConfiguration_r9_t)); */
*mcch_message = &mcch->message.choice.c1.choice.mbsfnAreaConfiguration_r9; *mcch_message = &mcch->message.choice.c1.choice.mbsfnAreaConfiguration_r9;
LOG_D(RRC,"[UE %d] Found MBSFNAreaConfiguration\n",Mod_id); LOG_I(RRC,"[UE %d] Frame %d : Found MBSFNAreaConfiguration from eNB \n",Mod_id, frame, eNB_index);
decode_MBSFNAreaConfiguration(Mod_id,eNB_index); decode_MBSFNAreaConfiguration(Mod_id,eNB_index,frame);
} }
} }
...@@ -1612,7 +1614,7 @@ int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len) ...@@ -1612,7 +1614,7 @@ int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len)
return 0; return 0;
} }
void decode_MBSFNAreaConfiguration(u8 Mod_id, u8 eNB_index) { void decode_MBSFNAreaConfiguration(u8 Mod_id, u8 eNB_index, u32 frame) {
LOG_D(RRC,"[UE %d] Number of MCH(s) in this MBSFN Area is %d\n", Mod_id, UE_rrc_inst[Mod_id].mcch_message[eNB_index]->pmch_InfoList_r9.list.count); LOG_D(RRC,"[UE %d] Number of MCH(s) in this MBSFN Area is %d\n", Mod_id, UE_rrc_inst[Mod_id].mcch_message[eNB_index]->pmch_InfoList_r9.list.count);
// store to MAC/PHY necessary parameters for receiving MTCHs // store to MAC/PHY necessary parameters for receiving MTCHs
rrc_mac_config_req(Mod_id,0,0,eNB_index, rrc_mac_config_req(Mod_id,0,0,eNB_index,
...@@ -1645,7 +1647,28 @@ void decode_MBSFNAreaConfiguration(u8 Mod_id, u8 eNB_index) { ...@@ -1645,7 +1647,28 @@ void decode_MBSFNAreaConfiguration(u8 Mod_id, u8 eNB_index) {
UE_rrc_inst[Mod_id].Info[eNB_index].MCCH_MESSAGEStatus = 1; UE_rrc_inst[Mod_id].Info[eNB_index].MCCH_MESSAGEStatus = 1;
// Config Radio Bearer for MBMS user data (similar way to configure for eNB side in init_MBMS function) // Config Radio Bearer for MBMS user data (similar way to configure for eNB side in init_MBMS function)
rrc_pdcp_config_asn1_req(NB_eNB_INST+Mod_id,frame,
0,// eNB_flag
eNB_index,// 0,// index
NULL, // SRB_ToAddModList
NULL, // DRB_ToAddModList
(DRB_ToReleaseList_t*)NULL
#ifdef Rel10
,
&(UE_rrc_inst[Mod_id].mcch_message[eNB_index]->pmch_InfoList_r9)
#endif
);
rrc_rlc_config_asn1_req(NB_eNB_INST+Mod_id, frame,
0,// eNB_flag
0,
NULL,// SRB_ToAddModList
NULL,// DRB_ToAddModList
NULL,// DRB_ToReleaseList
&(UE_rrc_inst[Mod_id].mcch_message[eNB_index]->pmch_InfoList_r9));
// */
} }
#endif // rel10 #endif // rel10
......
...@@ -181,10 +181,8 @@ init_SI (u8 Mod_id) ...@@ -181,10 +181,8 @@ init_SI (u8 Mod_id)
&eNB_rrc_inst[Mod_id].sib3 &eNB_rrc_inst[Mod_id].sib3
#ifdef Rel10 #ifdef Rel10
, ,
&eNB_rrc_inst[Mod_id]. &eNB_rrc_inst[Mod_id].sib13,
sib13, eNB_rrc_inst[Mod_id].MBMS_flag
eNB_rrc_inst[Mod_id].
MBMS_flag
#endif #endif
); );
/* /*
...@@ -231,7 +229,7 @@ init_SI (u8 Mod_id) ...@@ -231,7 +229,7 @@ init_SI (u8 Mod_id)
#ifdef Rel10 #ifdef Rel10
if (eNB_rrc_inst[Mod_id].MBMS_flag == 1) if (eNB_rrc_inst[Mod_id].MBMS_flag > 0)
{ {
// LOG_D(RRC, "[eNB %d] mbsfn_SubframeConfigList.list.count = %ld\n", Mod_id, eNB_rrc_inst[Mod_id].sib2->mbsfn_SubframeConfigList->list.count); // LOG_D(RRC, "[eNB %d] mbsfn_SubframeConfigList.list.count = %ld\n", Mod_id, eNB_rrc_inst[Mod_id].sib2->mbsfn_SubframeConfigList->list.count);
...@@ -348,9 +346,8 @@ init_MCCH (u8 Mod_id) ...@@ -348,9 +346,8 @@ init_MCCH (u8 Mod_id)
// ??Configure MCCH logical channel // ??Configure MCCH logical channel
// call mac_config_req with appropriate structure from ASN.1 description // call mac_config_req with appropriate structure from ASN.1 description
//LOG_I(RRC, "DUY: lcid before entering rrc_mac_config_req is %02d\n",eNB_rrc_inst[Mod_id].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9);
// LOG_I(RRC, "DUY: serviceID is %d\n",eNB_rrc_inst[Mod_id].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->tmgi_r9.serviceId_r9.buf[2]); // LOG_I(RRC, "DUY: serviceID is %d\n",eNB_rrc_inst[Mod_id].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->tmgi_r9.serviceId_r9.buf[2]);
//LOG_I(RRC, "DUY: session ID is %d\n",eNB_rrc_inst[Mod_id].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->sessionId_r9->buf[0]); // LOG_I(RRC, "DUY: session ID is %d\n",eNB_rrc_inst[Mod_id].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->sessionId_r9->buf[0]);
rrc_mac_config_req (Mod_id, 1, 0, 0, rrc_mac_config_req (Mod_id, 1, 0, 0,
(RadioResourceConfigCommonSIB_t *) NULL, (RadioResourceConfigCommonSIB_t *) NULL,
(struct PhysicalConfigDedicated *) NULL, (struct PhysicalConfigDedicated *) NULL,
...@@ -383,14 +380,15 @@ init_MCCH (u8 Mod_id) ...@@ -383,14 +380,15 @@ init_MCCH (u8 Mod_id)
void void
init_MBMS (u8 Mod_id, u32 frame) init_MBMS (u8 Mod_id, u32 frame)
{ // init the configuration for MTCH { // init the configuration for MTCH
// int j,i, num_mch;
if (eNB_rrc_inst[Mod_id].MBMS_flag == 1) if (eNB_rrc_inst[Mod_id].MBMS_flag > 0)
{ {
// LOG_I(RRC,"[eNB %d] Frame %d : Configuring Radio Bearer for MBMS service in MCH[%d]\n", Mod_id, frame,i); //check the lcid // LOG_I(RRC,"[eNB %d] Frame %d : Configuring Radio Bearer for MBMS service in MCH[%d]\n", Mod_id, frame,i); //check the lcid
// Configuring PDCP and RLC for MBMS Radio Bearer // Configuring PDCP and RLC for MBMS Radio Bearer
rrc_pdcp_config_asn1_req (Mod_id, frame, 1, 0, NULL, // SRB_ToAddModList rrc_pdcp_config_asn1_req (Mod_id, frame, 1, 0,
NULL, // SRB_ToAddModList
NULL, // DRB_ToAddModList NULL, // DRB_ToAddModList
(DRB_ToReleaseList_t *) NULL (DRB_ToReleaseList_t *) NULL
#ifdef Rel10 #ifdef Rel10
...@@ -398,20 +396,18 @@ init_MBMS (u8 Mod_id, u32 frame) ...@@ -398,20 +396,18 @@ init_MBMS (u8 Mod_id, u32 frame)
&(eNB_rrc_inst[Mod_id].mcch_message-> &(eNB_rrc_inst[Mod_id].mcch_message->
pmch_InfoList_r9) pmch_InfoList_r9)
#endif #endif
); );
rrc_rlc_config_asn1_req (Mod_id, frame, 1, 0, NULL, // SRB_ToAddModList rrc_rlc_config_asn1_req(Mod_id, frame, 1, 0,
NULL, // DRB_ToAddModList NULL,// SRB_ToAddModList
NULL, // DRB_ToReleaseList NULL,// DRB_ToAddModList
&(eNB_rrc_inst[Mod_id].mcch_message-> NULL,// DRB_ToReleaseList
pmch_InfoList_r9)); &(eNB_rrc_inst[Mod_id].mcch_message->pmch_InfoList_r9));
//rrc_mac_config_req();
//rrc_mac_config_req();
// use the same as of DTCH for the moment,need to check the flag for mXch }
}
} }
#endif #endif
...@@ -483,7 +479,7 @@ openair_rrc_lite_eNB_init (u8 Mod_id) ...@@ -483,7 +479,7 @@ openair_rrc_lite_eNB_init (u8 Mod_id)
init_SI (Mod_id); init_SI (Mod_id);
#ifdef Rel10 #ifdef Rel10
if (eNB_rrc_inst[Mod_id].MBMS_flag == 1) if (eNB_rrc_inst[Mod_id].MBMS_flag > 0)
{ {
/// MCCH INIT /// MCCH INIT
init_MCCH (Mod_id); init_MCCH (Mod_id);
......
...@@ -112,6 +112,8 @@ char *str_sub (const char *s, unsigned int start, unsigned int end) { ...@@ -112,6 +112,8 @@ char *str_sub (const char *s, unsigned int start, unsigned int end) {
// set the simulation time // set the simulation time
void set_ctime(int ctime){ void set_ctime(int ctime){
otg_info->ctime=ctime; otg_info->ctime=ctime;
// otg_muticast_info->ctime=ctime;
} }
......
...@@ -477,6 +477,10 @@ typedef struct { ...@@ -477,6 +477,10 @@ typedef struct {
float radio_access_delay[NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX][NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX]; float radio_access_delay[NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX][NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX];
double tx_throughput[NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX][NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX];
double rx_goodput[NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX][NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX]; /*!< \brief Rx goodput: (size of received data)/ctime*/
float rx_loss_rate[NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX][NUMBER_OF_eNB_MAX + NUMBER_OF_SERVICE_MAX]; /*!< \brief Rx Loss Rate: ratio, unit: bytes*/
unsigned int rx_total_bytes_dl; unsigned int rx_total_bytes_dl;
}otg_multicast_info_t; }otg_multicast_info_t;
......
This diff is collapsed.
...@@ -105,13 +105,13 @@ int otg_rx_pkt( int src, int dst, int ctime, char *buffer_tx, unsigned int size) ...@@ -105,13 +105,13 @@ int otg_rx_pkt( int src, int dst, int ctime, char *buffer_tx, unsigned int size)
} }
else if (otg_hdr_info_rx->flag == 0x1000){ else if (otg_hdr_info_rx->flag == 0x1000){
seq_num_rx = otg_multicast_info->rx_sn[src][dst][otg_hdr_rx->traffic_type]; seq_num_rx = otg_multicast_info->rx_sn[src][dst][otg_hdr_rx->traffic_type];
nb_loss_pkts = otg_multicast_info->loss_pkts_dl[src][dst][otg_hdr_rx->traffic_type];
// otg_multicast_info->ran_owd[src][dst][otg_hdr_rx->traffic_type] = ctime- otg_hdr_rx->time; // otg_multicast_info->ran_owd[src][dst][otg_hdr_rx->traffic_type] = ctime- otg_hdr_rx->time;
nb_loss_pkts = otg_multicast_info->loss_rate[src][dst][otg_hdr_rx->traffic_type];
// rx_check_loss(src, dst, otg_hdr_info_rx->flag, otg_hdr_rx->seq_num, &seq_num_rx, &nb_loss_pkts); // rx_check_loss(src, dst, otg_hdr_info_rx->flag, otg_hdr_rx->seq_num, &seq_num_rx, &nb_loss_pkts);
// otg_multicast_info->loss_rate[src][dst][otg_hdr_rx->traffic_type]=nb_loss_pkts; // otg_multicast_info->loss_rate[src][dst][otg_hdr_rx->traffic_type]=nb_loss_pkts;
//otg_multicast_info->rx_sn[src][dst][otg_hdr_rx->traffic_type]=seq_num_rx; //otg_multicast_info->rx_sn[src][dst][otg_hdr_rx->traffic_type]=seq_num_rx;
LOG_I(OTG,"received a multicast packet with size %d sn %d ran owd %d loss rate %d\n", // LOG_I(OTG,"received a multicast packet with size %d sn %d ran owd %d loss rate %d\n",
otg_hdr_info_rx->size, seq_num_rx, ctime- otg_hdr_rx->time, nb_loss_pkts); // otg_hdr_info_rx->size, seq_num_rx, ctime- otg_hdr_rx->time, nb_loss_pkts);
//return 0; //return 0;
} }
...@@ -134,8 +134,6 @@ int otg_rx_pkt( int src, int dst, int ctime, char *buffer_tx, unsigned int size) ...@@ -134,8 +134,6 @@ int otg_rx_pkt( int src, int dst, int ctime, char *buffer_tx, unsigned int size)
if (otg_info->owd_const[src][dst][otg_hdr_rx->flow_id]==0) if (otg_info->owd_const[src][dst][otg_hdr_rx->flow_id]==0)
owd_const_gen(src,dst,otg_hdr_rx->flow_id, otg_hdr_rx->traffic_type); owd_const_gen(src,dst,otg_hdr_rx->flow_id, otg_hdr_rx->traffic_type);
/******/ /******/
/* /*
...@@ -175,6 +173,8 @@ float owd_const_application_v=owd_const_application()/2; ...@@ -175,6 +173,8 @@ float owd_const_application_v=owd_const_application()/2;
} }
if (otg_hdr_info_rx->flag == 0x1000){ if (otg_hdr_info_rx->flag == 0x1000){
LOG_I(OTG,"received a multicast packet at time %d with size %d, seq num %d, ran owd %d number loss packet %d\n",
ctime,otg_hdr_info_rx->size, otg_hdr_rx->seq_num, ctime - otg_hdr_rx->time, nb_loss_pkts);
LOG_I(OTG,"INFO LATENCY :: [SRC %d][DST %d] radio access %.2f (tx time %d, ctime %d), OWD:%.2f (ms):\n", LOG_I(OTG,"INFO LATENCY :: [SRC %d][DST %d] radio access %.2f (tx time %d, ctime %d), OWD:%.2f (ms):\n",
src, dst, otg_multicast_info->radio_access_delay[src][dst], otg_hdr_rx->time, ctime , otg_multicast_info->rx_pkt_owd[src][dst]); src, dst, otg_multicast_info->radio_access_delay[src][dst], otg_hdr_rx->time, ctime , otg_multicast_info->rx_pkt_owd[src][dst]);
...@@ -187,13 +187,12 @@ float owd_const_application_v=owd_const_application()/2; ...@@ -187,13 +187,12 @@ float owd_const_application_v=owd_const_application()/2;
otg_multicast_info->rx_owd_max[src][dst][otg_hdr_rx->traffic_type]=MAX(otg_multicast_info->rx_owd_max[src][dst][otg_hdr_rx->traffic_type],otg_multicast_info->rx_pkt_owd[src][dst] ); otg_multicast_info->rx_owd_max[src][dst][otg_hdr_rx->traffic_type]=MAX(otg_multicast_info->rx_owd_max[src][dst][otg_hdr_rx->traffic_type],otg_multicast_info->rx_pkt_owd[src][dst] );
otg_multicast_info->rx_owd_min[src][dst][otg_hdr_rx->traffic_type]=MIN(otg_multicast_info->rx_owd_min[src][dst][otg_hdr_rx->traffic_type],otg_multicast_info->rx_pkt_owd[src][dst] ); otg_multicast_info->rx_owd_min[src][dst][otg_hdr_rx->traffic_type]=MIN(otg_multicast_info->rx_owd_min[src][dst][otg_hdr_rx->traffic_type],otg_multicast_info->rx_pkt_owd[src][dst] );
} }
if (g_otg->curve==1){ if (g_otg->curve==1){
if (g_otg->owd_radio_access==0) if (g_otg->owd_radio_access==0)
add_tab_metric(src, dst, otg_multicast_info->rx_pkt_owd[src][dst], ((otg_hdr_info_rx->size*1000*8)/(otg_multicast_info->rx_pkt_owd[src][dst]*1024 )), otg_hdr_rx->time); add_tab_metric(src, dst, otg_multicast_info->rx_pkt_owd[src][dst], ((otg_hdr_info_rx->size*1000*8)/(otg_multicast_info->rx_pkt_owd[src][dst]*1024 )), otg_hdr_rx->time);
else else
add_tab_metric(src, dst, otg_multicast_info->radio_access_delay[src][dst], ((otg_hdr_info_rx->size*1000*8)/(otg_multicast_info->rx_pkt_owd[src][dst]*1024 )), otg_hdr_rx->time); add_tab_metric(src, dst, otg_multicast_info->radio_access_delay[src][dst], ((otg_hdr_info_rx->size*1000*8)/(otg_multicast_info->rx_pkt_owd[src][dst]*1024 )), otg_hdr_rx->time);
} }
otg_multicast_info->rx_total_bytes_dl+=otg_hdr_info_rx->size; otg_multicast_info->rx_total_bytes_dl+=otg_hdr_info_rx->size;
} }
else { else {
...@@ -277,6 +276,7 @@ float owd_const_application_v=owd_const_application()/2; ...@@ -277,6 +276,7 @@ float owd_const_application_v=owd_const_application()/2;
else if (otg_hdr_info_rx->flag == 0x1000){ else if (otg_hdr_info_rx->flag == 0x1000){
otg_multicast_info->rx_num_pkt[src][dst][otg_hdr_rx->traffic_type]+=1; otg_multicast_info->rx_num_pkt[src][dst][otg_hdr_rx->traffic_type]+=1;
otg_multicast_info->rx_num_bytes[src][dst][otg_hdr_rx->traffic_type]+=otg_hdr_info_rx->size; otg_multicast_info->rx_num_bytes[src][dst][otg_hdr_rx->traffic_type]+=otg_hdr_info_rx->size;
// LOG_D(OTG,"DUY: otg_multicast_info->rx_num_bytes[%d][%d][%d] is %d \nn",src,dst,otg_hdr_rx->traffic_type,otg_multicast_info->rx_num_bytes[src][dst][otg_hdr_rx->traffic_type]);
otg_multicast_info->rx_sn[src][dst][otg_hdr_rx->traffic_type]=seq_num_rx; otg_multicast_info->rx_sn[src][dst][otg_hdr_rx->traffic_type]=seq_num_rx;
otg_multicast_info->loss_pkts_dl[src][dst][otg_hdr_rx->traffic_type]=nb_loss_pkts; otg_multicast_info->loss_pkts_dl[src][dst][otg_hdr_rx->traffic_type]=nb_loss_pkts;
......
...@@ -306,14 +306,20 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size) ...@@ -306,14 +306,20 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size)
char *header=NULL; char *header=NULL;
unsigned int flag; unsigned int flag;
int app,seq_num=0; int app,seq_num=0;
int otg_hdr_size= + sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t); int otg_hdr_size= sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t);
set_ctime(ctime); // fixme: this should be done separetly from packet_gen and packet_gen_multicast set_ctime(ctime); // fixme: this should be done separetly from packet_gen and packet_gen_multicast
//for (app=0; app<MAX_NUM_APPLICATION; app++){ //for (app=0; app<MAX_NUM_APPLICATION; app++){
for (app=0; app<1; app++){ for (app=0; app<1; app++){
if ( (g_otg_multicast->idt_dist[src][dst][app]> 0) && if ( (g_otg_multicast->idt_dist[src][dst][app]> 0) &&
((ctime - otg_multicast_info->ptime[src][dst][app]) >= otg_multicast_info->idt[src][dst][app]) && ((ctime - otg_multicast_info->ptime[src][dst][app]) >= otg_multicast_info->idt[src][dst][app]) &&
(g_otg_multicast->duration[src][dst][app] > ctime) ){ (g_otg_multicast->duration[src][dst][app] > ctime) ){
//Duy add
LOG_I(OTG,"multicast gen: entering generating\n");
//end Duy add
//otg_info->idt[src][dst][app]= time_dist(src, dst, app, -1); //otg_info->idt[src][dst][app]= time_dist(src, dst, app, -1);
otg_multicast_info->idt[src][dst][app]=ceil(uniform_dist(g_otg_multicast->idt_min[src][dst][app], otg_multicast_info->idt[src][dst][app]=ceil(uniform_dist(g_otg_multicast->idt_min[src][dst][app],
g_otg_multicast->idt_max[src][dst][app])); g_otg_multicast->idt_max[src][dst][app]));
...@@ -328,7 +334,7 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size) ...@@ -328,7 +334,7 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size)
if (otg_multicast_info->header_size_app[src][dst][app]==0){ if (otg_multicast_info->header_size_app[src][dst][app]==0){
otg_multicast_info->header_size_app[src][dst][app]=1; otg_multicast_info->header_size_app[src][dst][app]=1;
LOG_W(OTG,"header type not defined, set to 1\n"); LOG_W(OTG,"header type not defined, set to 1\n");
} }
header = random_string(otg_multicast_info->header_size_app[src][dst][app], header = random_string(otg_multicast_info->header_size_app[src][dst][app],
g_otg->packet_gen_type, g_otg->packet_gen_type,
HEADER_ALPHABET); HEADER_ALPHABET);
...@@ -336,12 +342,15 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size) ...@@ -336,12 +342,15 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size)
flag = 0x1000; flag = 0x1000;
seq_num=otg_multicast_info->tx_sn[src][dst][app]++; seq_num=otg_multicast_info->tx_sn[src][dst][app]++;
otg_multicast_info->tx_num_pkt[src][dst][app]+=1; otg_multicast_info->tx_num_pkt[src][dst][app]+=1;
otg_multicast_info->tx_num_bytes[src][dst][app]+= strlen(header) + strlen(payload)+otg_hdr_size; otg_multicast_info->tx_num_bytes[src][dst][app]+= strlen(header) + strlen(payload) + otg_hdr_size;
LOG_D(OTG,"otg_multicast_info->tx_num_bytes[%d][%d][%d] = %d \n",src,dst,app, otg_multicast_info->tx_num_bytes[src][dst][app]);
if (size!=strlen(payload)) if (size!=strlen(payload))
LOG_E(OTG,"[src %d][dst %d] The expected packet size does not match the payload size : size %d, strlen %d \n", src, dst, size, strlen(payload)); LOG_E(OTG,"[src %d][dst %d] The expected packet size does not match the payload size : size %d, strlen %d \n", src, dst, size, strlen(payload));
else else {
LOG_I(OTG,"[src %d][dst %d]TX INFO pkt at time %d Size= [payload %d] [Total %d] with seq num %d: |%s|%s| \n", LOG_I(OTG,"[src %d][dst %d]TX INFO pkt at time %d Size= [payload %d] [Total %d] with seq num %d: |%s|%s| \n",
src, dst, ctime, size, strlen(header)+strlen(payload)+otg_hdr_size, seq_num, header, payload); src, dst, ctime, size, strlen(header)+strlen(payload)+otg_hdr_size, seq_num, header, payload);
LOG_D(OTG,"\n");
}
buffer_size = otg_hdr_size + strlen(header) + strlen(payload); buffer_size = otg_hdr_size + strlen(header) + strlen(payload);
*pkt_size = buffer_size; *pkt_size = buffer_size;
...@@ -353,7 +362,8 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size) ...@@ -353,7 +362,8 @@ unsigned char *packet_gen_multicast(int src, int dst, int ctime, int * pkt_size)
} }
if (buffer_size) if (buffer_size)
return serialize_buffer(header, payload, buffer_size,g_otg_multicast->application_type[src][dst][app], flag, 0, ctime, seq_num, 0, HDR_IP_v4_MIN+HDR_UDP, 1); return serialize_buffer(header, payload, buffer_size,0/*g_otg_multicast->application_type[src][dst][app]*/, flag, 0, ctime, seq_num, 0, HDR_IP_v4_MIN+HDR_UDP, 1);
// application_types is MSCBR = 1 is set in g_otg_multicast init, but 0 is need in otg_rx for coherence with index of otg_multicast_info
else else
return NULL; return NULL;
} }
...@@ -652,9 +662,9 @@ unsigned char * serialize_buffer(char* header, char* payload, unsigned int buffe ...@@ -652,9 +662,9 @@ unsigned char * serialize_buffer(char* header, char* payload, unsigned int buffe
void init_predef_multicast_traffic() { void init_predef_multicast_traffic() {
int i, j, k; int i, j, k;
for (i=0; i<2; i++){ // src //maxServiceCount for (i=0; i<1; i++){ // src //maxServiceCount
for (j=0; j<2; j++){ // dst // maxSessionPerPMCH for (j=1; j<2; j++){ // dst // maxSessionPerPMCH
for (k=0; k<MAX_NUM_APPLICATION; k++){ for (k=0; k<1/*MAX_NUM_APPLICATION*/; k++){
switch(g_otg_multicast->application_type[i][j][k]){ switch(g_otg_multicast->application_type[i][j][k]){
case MSCBR : case MSCBR :
//LOG_D(OTG, "configure MSCBR for MBMS (service %d, session %d, app %d)\n", i, j, k); //LOG_D(OTG, "configure MSCBR for MBMS (service %d, session %d, app %d)\n", i, j, k);
...@@ -662,12 +672,13 @@ for (i=0; i<2; i++){ // src //maxServiceCount ...@@ -662,12 +672,13 @@ for (i=0; i<2; i++){ // src //maxServiceCount
g_otg_multicast->ip_v[i][j][k]= IPV4; g_otg_multicast->ip_v[i][j][k]= IPV4;
g_otg_multicast->idt_dist[i][j][k]= UNIFORM; g_otg_multicast->idt_dist[i][j][k]= UNIFORM;
g_otg_multicast->idt_min[i][j][k]= 20; g_otg_multicast->idt_min[i][j][k]= 20;// can modify here to increase the frequency of generate data
g_otg_multicast->idt_max[i][j][k]= 100; g_otg_multicast->idt_max[i][j][k]= 50;
g_otg_multicast->size_dist[i][j][k]= FIXED; g_otg_multicast->size_dist[i][j][k]= UNIFORM;
g_otg_multicast->size_min[i][j][k]= 20; g_otg_multicast->size_min[i][j][k]= 768;
g_otg_multicast->size_max[i][j][k]= 100; g_otg_multicast->size_max[i][j][k]= 1024 ;//can not be greater than 1500 which is max_ip_packet_size in pdcp.c
g_otg_multicast->duration[i][j][k] = 1000; // the packet will be generated after duration g_otg_multicast->duration[i][j][k] = 1000; // the packet will be generated after duration
header_size_gen_multicast(i,j,k); header_size_gen_multicast(i,j,k);
......
...@@ -753,7 +753,7 @@ int ...@@ -753,7 +753,7 @@ int
UE_id= oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local + RN_id; // NB_UE_INST + RN_id UE_id= oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local + RN_id; // NB_UE_INST + RN_id
eNB_id= oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local + RN_id; // NB_eNB_INST + RN_id eNB_id= oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local + RN_id; // NB_eNB_INST + RN_id
// currently only works in FDD // currently only works in FDD
if (oai_emulation.info.eMBMS_active_state == 3){ if (oai_emulation.info.eMBMS_active_state == 4){
r_mode = multicast_relay; r_mode = multicast_relay;
LOG_I(EMU,"Activating the multicast relaying\n"); LOG_I(EMU,"Activating the multicast relaying\n");
}else { }else {
......
...@@ -111,7 +111,6 @@ void get_simulation_options(int argc, char *argv[]) { ...@@ -111,7 +111,6 @@ void get_simulation_options(int argc, char *argv[]) {
}; };
while ((c = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hi:j:IJ:k:l:m:M:n:N:oO:p:P:rR:s:S:Q:t:T:u:U:vVx:y:w:W:X:z:Z:", long_options, &option_index)) != -1) { while ((c = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hi:j:IJ:k:l:m:M:n:N:oO:p:P:rR:s:S:Q:t:T:u:U:vVx:y:w:W:X:z:Z:", long_options, &option_index)) != -1) {
switch (c) { switch (c) {
case 0: case 0:
if (! strcmp(long_options[option_index].name, "pdcp_period")) { if (! strcmp(long_options[option_index].name, "pdcp_period")) {
...@@ -788,32 +787,65 @@ void update_otg_eNB(int module_id, unsigned int ctime) { ...@@ -788,32 +787,65 @@ void update_otg_eNB(int module_id, unsigned int ctime) {
#ifdef Rel10 #ifdef Rel10
int service_id, session_id, rb_id; int service_id, session_id, rb_id;
// MBSM multicast traffic // MBSM multicast traffic
for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount // if (frame >= 46) {// only generate when UE can receive MTCH (need to control this value)
for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount
if (pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance== module_id + 1){ // this service/session is configured for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH
otg_pkt = malloc (sizeof(Packet_otg_elt)); // LOG_I(OTG,"DUY:frame %d, pdcp_mbms_array[module_id][rb_id].instanciated_instance is %d\n",frame,pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance);
// LOG_T(OTG,"multicast packet gen for (service/mch %d, session/lcid %d)\n", service_id, session_id); if (pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance == module_id + 1){ // this service/session is configured
rb_id = pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].rb_id;
(otg_pkt->otg_pkt).sdu_buffer = (u8*) packet_gen_multicast(module_id, session_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size)); otg_pkt = malloc (sizeof(Packet_otg_elt));
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) { // LOG_T(OTG,"multicast packet gen for (service/mch %d, session/lcid %d, rb_id %d)\n", service_id, session_id, service_id*maxSessionPerPMCH + session_id);
(otg_pkt->otg_pkt).rb_id = rb_id; rb_id = pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].rb_id;
(otg_pkt->otg_pkt).module_id = module_id; (otg_pkt->otg_pkt).sdu_buffer = (u8*) packet_gen_multicast(module_id, session_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
//(otg_pkt->otg_pkt).dst_id = session_id; if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
//Adding the packet to the OTG-PDCP buffer (otg_pkt->otg_pkt).rb_id = rb_id;
(otg_pkt->otg_pkt).mode = PDCP_TM; (otg_pkt->otg_pkt).module_id = module_id;
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id])); (otg_pkt->otg_pkt).dst_id = session_id;
LOG_I(EMU, "[eNB %d] ADD pkt to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id); //Adding the packet to the OTG-PDCP buffer
} else { (otg_pkt->otg_pkt).mode = PDCP_TM;
//LOG_I(EMU, "OTG returns null \n"); pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id]));
free(otg_pkt); LOG_I(EMU, "[eNB %d] ADD packet multicast to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id);
otg_pkt=NULL; } else {
} //LOG_I(EMU, "OTG returns null \n");
} free(otg_pkt);
} otg_pkt=NULL;
} }
#endif
// old version
/* // MBSM multicast traffic
#ifdef Rel10
if (frame >= 46) {// only generate when UE can receive MTCH (need to control this value)
for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount
for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH
// LOG_I(OTG,"DUY:frame %d, pdcp_mbms_array[module_id][rb_id].instanciated_instance is %d\n",frame,pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance);
if ((pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance== module_id + 1) && (eNB_flag == 1)){ // this service/session is configured
// LOG_T(OTG,"multicast packet gen for (service/mch %d, session/lcid %d)\n", service_id, session_id);
// Duy add
LOG_I(OTG, "frame %d, multicast packet gen for (service/mch %d, session/lcid %d, rb_id %d)\n",frame, service_id, session_id,service_id*maxSessionPerPMCH + session_id);
// end Duy add
rb_id = pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].rb_id;
otg_pkt=(u8*) packet_gen_multicast(module_id, session_id, ctime, &pkt_size);
if (otg_pkt != NULL) {
LOG_D(OTG,"[eNB %d] sending a multicast packet from module %d on rab id %d (src %d, dst %d) pkt size %d\n", eNB_index, module_id, rb_id, module_id, session_id, pkt_size);
pdcp_data_req(module_id, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, pkt_size, otg_pkt,PDCP_TM);
free(otg_pkt);
}
}
}
}
} // end multicast traffic
#endif
*/
}
}
}
// } // end multicast traffic
#endif
//LOG_I(EMU, "[eNB %d] update OTG nb_elts = %d \n", module_id, otg_pdcp_buffer[module_id].nb_elements); //LOG_I(EMU, "[eNB %d] update OTG nb_elts = %d \n", module_id, otg_pdcp_buffer[module_id].nb_elements);
//free(otg_pkt); //free(otg_pkt);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment