From 899c178d08367222c90471525fbadf77fd26701a Mon Sep 17 00:00:00 2001 From: Lionel Gauthier Date: Tue, 25 Feb 2014 15:31:28 +0000 Subject: [PATCH] Now virtualization should be OK. TO DO :test RF and ethernet emulation. git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5086 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/defs.h | 37 +- openair1/SCHED/phy_procedures_lte_ue.c | 4 +- openair2/COMMON/mac_rrc_primitives.h | 18 +- openair2/COMMON/platform_constants.h | 52 +- openair2/COMMON/platform_types.h | 29 +- openair2/COMMON/rrm_config_structs.h | 4 +- openair2/LAYER2/MAC/config.c | 632 +- openair2/LAYER2/MAC/defs.h | 302 +- openair2/LAYER2/MAC/eNB_scheduler.c | 7264 +++++++++-------- openair2/LAYER2/MAC/l1_helpers.c | 16 +- openair2/LAYER2/MAC/main.c | 326 +- openair2/LAYER2/MAC/pre_processor.c | 1024 +-- openair2/LAYER2/MAC/ra_procedures.c | 550 +- openair2/LAYER2/MAC/rar_tools.c | 126 +- openair2/LAYER2/MAC/ue_procedures.c | 2070 ++--- openair2/LAYER2/PDCP/pdcp_fifo.c | 3 - openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 1676 ++-- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 132 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 1096 +-- openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c | 332 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.h | 8 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 7 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 353 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h | 16 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h | 43 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c | 13 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h | 4 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 197 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h | 29 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c | 455 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h | 34 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c | 370 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h | 44 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 782 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h | 38 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 881 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h | 16 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 559 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h | 6 +- .../RLC/AM_v9.3.0/rlc_am_segments_holes.c | 286 +- .../RLC/AM_v9.3.0/rlc_am_segments_holes.h | 16 +- .../RLC/AM_v9.3.0/rlc_am_status_report.c | 527 +- .../RLC/AM_v9.3.0/rlc_am_status_report.h | 12 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h | 65 +- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.c | 90 +- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.h | 30 +- .../RLC/AM_v9.3.0/rlc_am_timer_reordering.c | 103 +- .../RLC/AM_v9.3.0/rlc_am_timer_reordering.h | 32 +- .../AM_v9.3.0/rlc_am_timer_status_prohibit.c | 96 +- .../AM_v9.3.0/rlc_am_timer_status_prohibit.h | 32 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c | 70 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h | 42 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c | 71 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h | 12 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c | 46 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h | 15 +- openair2/LAYER2/RLC/UM/rlc_um_receiver.c | 280 +- .../RLC/UM_v6.1.0_LITE/rlc_um_receiver.c | 4 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c | 290 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 472 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.h | 27 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c | 1123 ++- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h | 126 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h | 6 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c | 72 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c | 160 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h | 11 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c | 74 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h | 15 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c | 771 +- openair2/LAYER2/RLC/rlc.c | 1000 ++- openair2/LAYER2/RLC/rlc.h | 228 +- openair2/LAYER2/RLC/rlc_mac.c | 509 +- openair2/LAYER2/RLC/rlc_mpls.c | 4 +- openair2/LAYER2/RLC/rlc_rrc.c | 921 ++- openair2/NAS/DRIVER/MESH/Makefile | 2 +- openair2/NAS/DRIVER/MESH/common.c | 6 +- openair2/NAS/DRIVER/MESH/constant.h | 28 +- openair2/NAS/DRIVER/MESH/local.h | 21 +- .../L2_INTERFACE/openair_rrc_L2_interface.c | 74 +- .../L2_INTERFACE/openair_rrc_L2_interface.h | 31 +- openair2/RRC/LITE/L2_interface.c | 248 +- openair2/RRC/LITE/defs.h | 150 +- openair2/RRC/LITE/rrc_UE.c | 3303 ++++---- openair2/RRC/LITE/rrc_common.c | 35 +- openair2/RRC/LITE/rrc_eNB.c | 268 +- openair2/UTIL/OCG/OCG.h | 11 +- .../RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_main.c | 385 +- .../LTE_RAL_ENB/SRC/lteRALenb_subscribe.c | 34 +- .../LTE_RAL_ENB/SRC/lteRALenb_thresholds.c | 2 +- targets/SIMU/USER/Makefile | 3 + targets/SIMU/USER/oaisim.c | 1158 +-- targets/SIMU/USER/oaisim.h | 2 +- targets/SIMU/USER/oaisim_functions.c | 1600 ++-- targets/SIMU/USER/oaisim_functions.h | 4 +- 95 files changed, 18822 insertions(+), 15729 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 2556381090..f8a842e405 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -144,6 +144,7 @@ #include "PHY/TOOLS/time_meas.h" #include "PHY/CODING/defs.h" #include "PHY/TOOLS/defs.h" +#include "platform_types.h" #ifdef OPENAIR_LTE @@ -180,30 +181,30 @@ enum transmission_access_mode{ /// Top-level PHY Data Structure for eNB typedef struct { /// Module ID indicator for this instance - u8 Mod_id; - u8 local_flag; - unsigned int rx_total_gain_eNB_dB; - u32 frame; - LTE_DL_FRAME_PARMS lte_frame_parms; + module_id_t Mod_id; + u8 local_flag; + unsigned int rx_total_gain_eNB_dB; + frame_t frame; + LTE_DL_FRAME_PARMS lte_frame_parms; PHY_MEASUREMENTS_eNB PHY_measurements_eNB[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables - LTE_eNB_COMMON lte_eNB_common_vars; - LTE_eNB_SRS lte_eNB_srs_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PBCH lte_eNB_pbch; - LTE_eNB_PUSCH *lte_eNB_pusch_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PRACH lte_eNB_prach_vars; - LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams + LTE_eNB_COMMON lte_eNB_common_vars; + LTE_eNB_SRS lte_eNB_srs_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PBCH lte_eNB_pbch; + LTE_eNB_PUSCH *lte_eNB_pusch_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PRACH lte_eNB_prach_vars; + LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams // old: LTE_eNB_DLSCH_t **dlsch_eNB[2]; // Nusers times two spatial streams - LTE_eNB_ULSCH_t *ulsch_eNB[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA - LTE_eNB_DLSCH_t *dlsch_eNB_SI,*dlsch_eNB_ra; - LTE_eNB_DLSCH_t *dlsch_eNB_MCH; - LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX]; - LTE_eNB_UE_stats *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX]; + LTE_eNB_ULSCH_t *ulsch_eNB[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA + LTE_eNB_DLSCH_t *dlsch_eNB_SI,*dlsch_eNB_ra; + LTE_eNB_DLSCH_t *dlsch_eNB_MCH; + LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX]; + LTE_eNB_UE_stats *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX]; /// cell-specific reference symbols - unsigned int lte_gold_table[20][2][14]; + unsigned int lte_gold_table[20][2][14]; /// mbsfn reference symbols - unsigned int lte_gold_mbsfn_table[10][3][42]; + unsigned int lte_gold_mbsfn_table[10][3][42]; u32 X_u[64][839]; diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 0740174ee6..95e0a6740f 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1010,7 +1010,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs // Check for SR and do ACK/NACK accordingly if (is_SR_TXOp(phy_vars_ue,eNB_id,next_slot>>1)==1) { - LOG_I(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame,next_slot>>1); #ifdef OPENAIR2 SR_payload = mac_xface->ue_get_SR(phy_vars_ue->Mod_id, @@ -1024,7 +1024,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs if (SR_payload>0) { generate_ul_signal = 1; - LOG_I(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame,next_slot>>1,SR_payload); } else { diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h index 9b53a0ab5c..4e83ecc119 100644 --- a/openair2/COMMON/mac_rrc_primitives.h +++ b/openair2/COMMON/mac_rrc_primitives.h @@ -333,8 +333,8 @@ typedef struct{ //RRC_INTERFACE_FUNCTIONS char (*openair_rrc_eNB_init)(u8 ); char (*openair_rrc_UE_init)(u8, u8); RRC_status_t (*rrc_rx_tx)(u8,u32,u8,u8); - u8 (*mac_rrc_data_ind)(u8,u32,u16,u8 *,u16,u8 eNB_flag, u8 eNB_index); - u8 (*mac_rrc_data_req)(u8,u32,u16,u8,u8 *,u8 eNB_flag, u8 eNB_index); + u8 (*mac_rrc_data_ind)(u8,u32,u16,u8 *,u16,eNB_flag_t eNB_flag, u8 eNB_index); + u8 (*mac_rrc_data_req)(u8,u32,u16,u8,u8 *,eNB_flag_t eNB_flag, u8 eNB_index); void (*mac_rrc_meas_ind)(u8,MAC_MEAS_REQ_ENTRY*); void (*def_meas_ind)(u8, u8); void (*rrc_data_indP) (module_id_t , rb_id_t , sdu_size_t , char*); @@ -352,12 +352,7 @@ typedef struct{ unsigned short (*mac_config_req)(u8,u8,MAC_CONFIG_REQ*); MAC_MEAS_REQ_ENTRY* (*mac_meas_req)(u8 , MAC_MEAS_REQ*); void (*mac_out_of_sync_ind)(u8,u32,unsigned short); - //u8 (*mac_rrc_data_ind)(u8,unsigned short,char *,u8); - //u8 (*mac_rrc_data_req)( u8, unsigned short, u8,char *); - //void (*mac_switch_node_function)(u8); - // void (*mac_rlc_exit)(void); //RLC_INTERFACE_FUNCTIONS - // void (*pdcp_run)(unsigned int); void (*pdcp_run)(void); void (*pdcp_data_req)(module_id_t, rb_id_t, sdu_size_t, char*); signed int (*rrc_rlc_config_req)(unsigned int, unsigned int, unsigned int, unsigned int, rlc_info_t ); @@ -373,21 +368,18 @@ typedef struct{ u16 *SIperiod #ifdef Rel10 , - u8 MBMS_Flag, + MBMS_flag_t MBMS_Flag, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList, MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, struct PMCH_InfoList_r9 *pmch_InfoList #endif ); unsigned int (*mac_rlc_data_req)(module_id_t, unsigned int, char*); - void (*mac_rlc_data_ind)(module_id_t, chan_id_t, char*, tb_size_t, num_tb_t, crc_t* ); - mac_rlc_status_resp_t (*mac_rlc_status_ind) (module_id_t, chan_id_t, tb_size_t, num_tb_t); + void (*mac_rlc_data_ind)(module_id_t, logical_chan_id_t, char*, tb_size_t, num_tb_t, crc_t* ); + mac_rlc_status_resp_t (*mac_rlc_status_ind) (module_id_t, logical_chan_id_t, tb_size_t, num_tb_t); signed int (*rrc_rlc_data_req)(module_id_t, rb_id_t, mui_t, confirm_t, sdu_size_t, char *); void (*rrc_rlc_register_rrc) (void (*rrc_data_indP)(module_id_t , rb_id_t , sdu_size_t , char* ), void (*rrc_data_confP) (module_id_t , rb_id_t , mui_t ) ) ; - //rlc_op_status_t rrc_rlc_config_req (module_id_t, rb_id_t, rb_type_t, rlc_info_t ); - //rlc_op_status_t rrc_rlc_data_req (module_id_t, rb_id_t, mui_t, confirm_t, sdu_size_t, mem_block_t*); - //void rrc_rlc_register_rrc ( void(*rrc_data_indP) (module_id_t , rb_id_t , sdu_size_t , mem_block_t*),void(*rrc_data_conf) (module_id_t , rb_id_t , mui_t) ); void (*mrbch_phy_sync_failure) (u8 Mod_id, u32 frame, u8 Free_ch_index); void (*dl_phy_sync_success) (u8 Mod_id, u32 frame, u8 eNB_index); }MAC_RLC_XFACE; diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h index e79eb691d9..a5f64e5641 100755 --- a/openair2/COMMON/platform_constants.h +++ b/openair2/COMMON/platform_constants.h @@ -55,8 +55,8 @@ #define MAX_MANAGED_RG_PER_MOBILE 2 #define DEFAULT_RAB_ID 3 -#define NB_RB_MAX 11 -#define NB_RAB_MAX 8 +#define NB_RB_MAX (maxDRB + 3) /* was 11, now 14, maxDRB comes from asn1_constants.h, + 3 because of 3 SRB, one invisible id 0, then id 1 and 2 */ +#define NB_RAB_MAX maxDRB /* was 8, now 11 */ #define RAB_SHIFT1 9 #define RAB_SHIFT2 3 #define RAB_OFFSET 0x0007 @@ -69,36 +69,36 @@ #ifdef MESH -# define MAX_RB_MOBILE NB_RB_MAX * ( MAX_MANAGED_RG_PER_MOBILE + MAX_MOBILES_PER_RG - 1 ) -# define MAX_RAB_MOBILE NB_RAB_MAX * ( MAX_MANAGED_RG_PER_MOBILE + MAX_MOBILES_PER_RG - 1 ) -# define MAX_RB_RG MAX_RB_MOBILE //NB_RB_MAX * MAX_MOBILES_PER_RG -# define MAX_RAB_RG (NB_RB_MAX+1) * (MAX_MOBILES_PER_RG + 1) -# define MAX_RAB MAX_RAB_RG -# define MAX_RB MAX_RB_RG +//# define MAX_RB_MOBILE NB_RB_MAX * ( MAX_MANAGED_RG_PER_MOBILE + MAX_MOBILES_PER_RG - 1 ) +//# define MAX_RAB_MOBILE NB_RAB_MAX * ( MAX_MANAGED_RG_PER_MOBILE + MAX_MOBILES_PER_RG - 1 ) +//# define MAX_RB_RG MAX_RB_MOBILE //NB_RB_MAX * MAX_MOBILES_PER_RG +//# define MAX_RAB_RG (NB_RB_MAX+1) * (MAX_MOBILES_PER_RG + 1) +//# define MAX_RAB MAX_RAB_RG +//# define MAX_RB MAX_RB_RG #else -# define MAX_RB_MOBILE NB_RB_MAX * MAX_MANAGED_RG_PER_MOBILE -# define MAX_RAB_MOBILE NB_RAB_MAX * MAX_MANAGED_RG_PER_MOBILE -# define MAX_RB_RG NB_RB_MAX * MAX_MOBILES_PER_RG -# define MAX_RAB_RG NB_RB_MAX * MAX_MOBILES_PER_RG -# //ifdef NODE_RG -# define MAX_RAB MAX_RAB_RG -# define MAX_RB MAX_RB_RG -# //else -# // ifdef NODE_MT -# // define MAX_RAB MAX_RAB_MOBILE -# // define MAX_RB MAX_RB_MOBILE -# //else -# //error NODE_RG or NODE_MT must be defined -# //endif +//# define MAX_RB_MOBILE NB_RB_MAX * MAX_MANAGED_RG_PER_MOBILE +//# define MAX_RAB_MOBILE NB_RAB_MAX * MAX_MANAGED_RG_PER_MOBILE +//# define MAX_RB_RG NB_RB_MAX * MAX_MOBILES_PER_RG +//# define MAX_RAB_RG NB_RB_MAX * MAX_MOBILES_PER_RG +//# ifdef NODE_RG +//# define MAX_RAB MAX_RAB_RG +//# define MAX_RB MAX_RB_RG +//# else +//# // ifdef NODE_MT +//# // define MAX_RAB MAX_RAB_MOBILE +//# // define MAX_RB MAX_RB_MOBILE +//# //else +//# //error NODE_RG or NODE_MT must be defined +//# //endif //# endif #endif //MESH // RLC_MODE -# define RLC_NONE 0 -# define RLC_MODE_AM 1 -# define RLC_MODE_TM 2 -# define RLC_MODE_UM 3 +# define RLC_NONE (rlc_mode_t)0 +# define RLC_MODE_AM (rlc_mode_t)1 +# define RLC_MODE_TM (rlc_mode_t)2 +# define RLC_MODE_UM (rlc_mode_t)3 //E_R # define E_R_RLC_ER_RELEASE 1 diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 3d0cfe17c1..cee057831a 100755 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -25,19 +25,29 @@ typedef signed long int s64_t; typedef unsigned int config_action_t; -typedef unsigned int sdu_size_t; +typedef u16_t sdu_size_t; +typedef s16_t sdu_ssize_t; typedef unsigned int tbs_size_t; typedef unsigned int tb_size_t; -typedef unsigned int rb_id_t; -typedef unsigned int module_id_t; +typedef u16_t rb_id_t; +typedef u16_t srb_id_t; +typedef u32_t frame_t; +typedef u32_t sub_frame_t; +typedef u8_t module_id_t; typedef unsigned int mui_t; typedef unsigned int confirm_t; typedef unsigned int rb_type_t; -typedef rb_id_t chan_id_t; +typedef unsigned int logical_chan_id_t; typedef unsigned int num_tb_t; typedef unsigned int crc_t; typedef unsigned int rlc_tx_status_t; typedef unsigned int rlc_mode_t; +typedef s16_t rlc_sn_t; +typedef u16_t rlc_usn_t; +typedef int traffic_type_t; +typedef u32_t mbms_session_id_t; +typedef u16_t mbms_service_id_t; +typedef u16_t rnti_t; typedef signed int rlc_op_status_t; @@ -47,8 +57,17 @@ typedef unsigned int crc32_t; typedef signed char boolean_t; +typedef enum MBMS_flag_e { + MBMS_FLAG_NO = 0, + MBMS_FLAG_YES = 1, +} MBMS_flag_t; + +typedef enum eNB_flag_e { + ENB_FLAG_NO = 0, + ENB_FLAG_YES = 1, +} eNB_flag_t; // just for integration -extern unsigned int frame; +extern frame_t frame; #endif diff --git a/openair2/COMMON/rrm_config_structs.h b/openair2/COMMON/rrm_config_structs.h index 5b673e3473..7865cd63ed 100755 --- a/openair2/COMMON/rrm_config_structs.h +++ b/openair2/COMMON/rrm_config_structs.h @@ -10,7 +10,7 @@ ***************************************************************************/ - +#ifdef OLD_RRC_CELLULAR # ifndef __RRM_CONFIG_STRUCTS_H__ # define __RRM_CONFIG_STRUCTS_H__ @@ -171,4 +171,4 @@ typedef volatile struct { //typedef RG_CONFIG MAIN_RADIO_GATEWAY; # endif - +#endif diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 97a9c750a0..29137acb58 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -25,16 +25,16 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file config.c -* \brief UE and eNB configuration -* \author Raymond Knopp, Navid Nikaein -* \date 2013 -* \version 0.1 -* \email: navid.nikaein@eurecom.fr -* @ingroup _mac + * \brief UE and eNB configuration + * \author Raymond Knopp, Navid Nikaein + * \date 2013 + * \version 0.1 + * \email: navid.nikaein@eurecom.fr + * @ingroup _mac -*/ + */ #include "COMMON/platform_types.h" #include "COMMON/platform_constants.h" @@ -56,197 +56,197 @@ #endif /* sec 5.9, 36.321: MAC Reset Procedure */ -void ue_mac_reset(u8 Mod_id,u8 eNB_index) { - +void ue_mac_reset(module_id_t module_idP,u8 eNB_index) { + //Resetting Bj - UE_mac_inst[Mod_id].scheduling_info.Bj[0] = 0; - UE_mac_inst[Mod_id].scheduling_info.Bj[1] = 0; - UE_mac_inst[Mod_id].scheduling_info.Bj[2] = 0; + UE_mac_inst[module_idP].scheduling_info.Bj[0] = 0; + UE_mac_inst[module_idP].scheduling_info.Bj[1] = 0; + UE_mac_inst[module_idP].scheduling_info.Bj[2] = 0; //Stopping all timers - + //timeAlignmentTimer expires - + // PHY changes for UE MAC reset - mac_xface->phy_reset_ue(Mod_id,eNB_index); - + mac_xface->phy_reset_ue(module_idP,eNB_index); + // notify RRC to relase PUCCH/SRS // cancel all pending SRs - UE_mac_inst[Mod_id].scheduling_info.SR_pending=0; - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER=0; - + UE_mac_inst[module_idP].scheduling_info.SR_pending=0; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; + // stop ongoing RACH procedure - + // discard explicitly signaled ra_PreambleIndex and ra_RACH_MaskIndex, if any - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = 0; // check! - UE_mac_inst[Mod_id].RA_prach_resources.ra_RACH_MaskIndex = 0; - - ue_init_mac(Mod_id); //This will hopefully do the rest of the MAC reset procedure - + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = 0; // check! + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + + ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure + } -int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, - RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, - struct PhysicalConfigDedicated *physicalConfigDedicated, - MeasObjectToAddMod_t **measObj, - MAC_MainConfig_t *mac_MainConfig, - long logicalChannelIdentity, - LogicalChannelConfig_t *logicalChannelConfig, - MeasGapConfig_t *measGapConfig, - TDD_Config_t *tdd_Config, - MobilityControlInfo_t *mobilityControlInfo, - u8 *SIwindowsize, - u16 *SIperiod, - ARFCN_ValueEUTRA_t *ul_CarrierFreq, - long *ul_Bandwidth, - AdditionalSpectrumEmission_t *additionalSpectrumEmission, - struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList +int rrc_mac_config_req(module_id_t Mod_id, eNB_flag_t eNB_flagP,u8 UE_id,u8 eNB_index, + RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, + struct PhysicalConfigDedicated *physicalConfigDedicated, + MeasObjectToAddMod_t **measObj, + MAC_MainConfig_t *mac_MainConfig, + long logicalChannelIdentity, + LogicalChannelConfig_t *logicalChannelConfig, + MeasGapConfig_t *measGapConfig, + TDD_Config_t *tdd_Config, + MobilityControlInfo_t *mobilityControlInfo, + u8 *SIwindowsize, + u16 *SIperiod, + ARFCN_ValueEUTRA_t *ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t *additionalSpectrumEmission, + struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList #ifdef Rel10 - ,u8 MBMS_Flag, - MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, - PMCH_InfoList_r9_t *pmch_InfoList + ,u8 MBMS_Flag, + MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, + PMCH_InfoList_r9_t *pmch_InfoList #endif #ifdef CBA - ,u8 num_active_cba_groups, - u16 cba_rnti + ,u8 num_active_cba_groups, + u16 cba_rnti #endif - ) { +) { int i; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN); - if (eNB_flag==0) { - LOG_I(MAC,"[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",Mod_id,eNB_index); - if (tdd_Config != NULL) - UE_mac_inst[Mod_id].tdd_Config = tdd_Config; + if (eNB_flagP==0) { + LOG_I(MAC,"[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",Mod_id,eNB_index); + if (tdd_Config != NULL) + UE_mac_inst[Mod_id].tdd_Config = tdd_Config; }else { - if (physicalConfigDedicated == NULL){ - LOG_I(MAC,"[CONFIG][eNB %d] Configuring MAC/PHY\n",Mod_id); - } else{ - LOG_I(MAC,"[CONFIG][eNB %d] Configuring MAC/PHY for UE %d (%x)\n",Mod_id,UE_id,find_UE_RNTI(Mod_id,UE_id)); - } + if (physicalConfigDedicated == NULL){ + LOG_I(MAC,"[CONFIG][eNB %d] Configuring MAC/PHY\n",Mod_id); + } else{ + LOG_I(MAC,"[CONFIG][eNB %d] Configuring MAC/PHY for UE %d (%x)\n",Mod_id,UE_id,find_UE_RNTI(Mod_id,UE_id)); + } } - + if ((tdd_Config!=NULL)||(SIwindowsize!=NULL)||(SIperiod!=NULL)){ - if (eNB_flag==1) - mac_xface->phy_config_sib1_eNB(Mod_id,tdd_Config,*SIwindowsize,*SIperiod); - else - mac_xface->phy_config_sib1_ue(Mod_id,eNB_index,tdd_Config,*SIwindowsize,*SIperiod); + if (eNB_flagP==1) + mac_xface->phy_config_sib1_eNB(Mod_id,tdd_Config,*SIwindowsize,*SIperiod); + else + mac_xface->phy_config_sib1_ue(Mod_id,eNB_index,tdd_Config,*SIwindowsize,*SIperiod); } if (radioResourceConfigCommon!=NULL) { - if (eNB_flag==1) { - LOG_I(MAC,"[CONFIG]SIB2/3 Contents (partial)\n"); - LOG_I(MAC,"[CONFIG]pusch_config_common.n_SB = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB); - LOG_I(MAC,"[CONFIG]pusch_config_common.hoppingMode = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); - LOG_I(MAC,"[CONFIG]pusch_config_common.pusch_HoppingOffset = %ld\n", radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset); - LOG_I(MAC,"[CONFIG]pusch_config_common.enable64QAM = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM); - LOG_I(MAC,"[CONFIG]pusch_config_common.groupHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - LOG_I(MAC,"[CONFIG]pusch_config_common.groupAssignmentPUSCH = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - LOG_I(MAC,"[CONFIG]pusch_config_common.sequenceHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - LOG_I(MAC,"[CONFIG]pusch_config_common.cyclicShift = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); - mac_xface->phy_config_sib2_eNB(Mod_id,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList); - } - else { - UE_mac_inst[Mod_id].radioResourceConfigCommon = radioResourceConfigCommon; - mac_xface->phy_config_sib2_ue(Mod_id,eNB_index,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList); - } + if (eNB_flagP==1) { + LOG_I(MAC,"[CONFIG]SIB2/3 Contents (partial)\n"); + LOG_I(MAC,"[CONFIG]pusch_config_common.n_SB = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB); + LOG_I(MAC,"[CONFIG]pusch_config_common.hoppingMode = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); + LOG_I(MAC,"[CONFIG]pusch_config_common.pusch_HoppingOffset = %ld\n", radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset); + LOG_I(MAC,"[CONFIG]pusch_config_common.enable64QAM = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM); + LOG_I(MAC,"[CONFIG]pusch_config_common.groupHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + LOG_I(MAC,"[CONFIG]pusch_config_common.groupAssignmentPUSCH = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + LOG_I(MAC,"[CONFIG]pusch_config_common.sequenceHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + LOG_I(MAC,"[CONFIG]pusch_config_common.cyclicShift = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); + mac_xface->phy_config_sib2_eNB(Mod_id,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList); + } + else { + UE_mac_inst[Mod_id].radioResourceConfigCommon = radioResourceConfigCommon; + mac_xface->phy_config_sib2_ue(Mod_id,eNB_index,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList); + } } // SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup if (logicalChannelConfig!= NULL) { - if (eNB_flag==0){ - LOG_I(MAC,"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",Mod_id,eNB_index); - UE_mac_inst[Mod_id].logicalChannelConfig[logicalChannelIdentity]=logicalChannelConfig; - UE_mac_inst[Mod_id].scheduling_info.Bj[logicalChannelIdentity]=0; // initilize the bucket for this lcid - if (logicalChannelConfig->ul_SpecificParameters) { - UE_mac_inst[Mod_id].scheduling_info.bucket_size[logicalChannelIdentity]=logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate * - logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size - UE_mac_inst[Mod_id].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; - LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_id,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup); - } else { - LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_id,logicalChannelIdentity); - mac_xface->macphy_exit(""); + if (eNB_flagP==0){ + LOG_I(MAC,"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",Mod_id,eNB_index); + UE_mac_inst[Mod_id].logicalChannelConfig[logicalChannelIdentity]=logicalChannelConfig; + UE_mac_inst[Mod_id].scheduling_info.Bj[logicalChannelIdentity]=0; // initilize the bucket for this lcid + if (logicalChannelConfig->ul_SpecificParameters) { + UE_mac_inst[Mod_id].scheduling_info.bucket_size[logicalChannelIdentity]=logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate * + logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size + UE_mac_inst[Mod_id].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; + LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_id,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup); + } else { + LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_id,logicalChannelIdentity); + mac_xface->macphy_exit(""); + } } - } } if (mac_MainConfig != NULL){ - if (eNB_flag==0){ - LOG_I(MAC,"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",Mod_id,eNB_index); - UE_mac_inst[Mod_id].macConfig=mac_MainConfig; - UE_mac_inst[Mod_id].measGapConfig=measGapConfig; - if (mac_MainConfig->ul_SCH_Config) { - - if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) - UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (u16) *mac_MainConfig->ul_SCH_Config->periodicBSR_Timer; - else - UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (u16) MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity; - - if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) - UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx = (u16) *mac_MainConfig->ul_SCH_Config->maxHARQ_Tx; - else - UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx = (u16) MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; - if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) - UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer = (u16) mac_MainConfig->ul_SCH_Config->retxBSR_Timer; - else - UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer = (u16)MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; - } + if (eNB_flagP==0){ + LOG_I(MAC,"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",Mod_id,eNB_index); + UE_mac_inst[Mod_id].macConfig=mac_MainConfig; + UE_mac_inst[Mod_id].measGapConfig=measGapConfig; + if (mac_MainConfig->ul_SCH_Config) { + + if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) + UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (u16) *mac_MainConfig->ul_SCH_Config->periodicBSR_Timer; + else + UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (u16) MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity; + + if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) + UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx = (u16) *mac_MainConfig->ul_SCH_Config->maxHARQ_Tx; + else + UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx = (u16) MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; + if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) + UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer = (u16) mac_MainConfig->ul_SCH_Config->retxBSR_Timer; + else + UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer = (u16)MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; + } #ifdef Rel10 - if (mac_MainConfig->sr_ProhibitTimer_r9) - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (u16) *mac_MainConfig->sr_ProhibitTimer_r9; - else - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (u16) 0; + if (mac_MainConfig->sr_ProhibitTimer_r9) + UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (u16) *mac_MainConfig->sr_ProhibitTimer_r9; + else + UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (u16) 0; #endif - UE_mac_inst[Mod_id].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer); - UE_mac_inst[Mod_id].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer); - - UE_mac_inst[Mod_id].scheduling_info.drx_config = mac_MainConfig->drx_Config; - UE_mac_inst[Mod_id].scheduling_info.phr_config = mac_MainConfig->phr_Config; - if (mac_MainConfig->phr_Config){ - UE_mac_inst[Mod_id].PHR_state = mac_MainConfig->phr_Config->present; - UE_mac_inst[Mod_id].PHR_reconfigured = 1; - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer; - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer; - UE_mac_inst[Mod_id].scheduling_info.PathlossChange = mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange; - } else { - UE_mac_inst[Mod_id].PHR_reconfigured = 0; - UE_mac_inst[Mod_id].PHR_state = MAC_MainConfig__phr_Config_PR_setup; - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; - UE_mac_inst[Mod_id].scheduling_info.PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; - } - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer); - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer); - UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_id].scheduling_info.PathlossChange); - LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n", - Mod_id,mac_MainConfig->phr_Config->present, - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF, - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF, - UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db); - } + UE_mac_inst[Mod_id].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer); + UE_mac_inst[Mod_id].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer); + + UE_mac_inst[Mod_id].scheduling_info.drx_config = mac_MainConfig->drx_Config; + UE_mac_inst[Mod_id].scheduling_info.phr_config = mac_MainConfig->phr_Config; + if (mac_MainConfig->phr_Config){ + UE_mac_inst[Mod_id].PHR_state = mac_MainConfig->phr_Config->present; + UE_mac_inst[Mod_id].PHR_reconfigured = 1; + UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer; + UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer; + UE_mac_inst[Mod_id].scheduling_info.PathlossChange = mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange; + } else { + UE_mac_inst[Mod_id].PHR_reconfigured = 0; + UE_mac_inst[Mod_id].PHR_state = MAC_MainConfig__phr_Config_PR_setup; + UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; + UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; + UE_mac_inst[Mod_id].scheduling_info.PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; + } + UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer); + UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer); + UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_id].scheduling_info.PathlossChange); + LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n", + Mod_id,mac_MainConfig->phr_Config->present, + UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF, + UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF, + UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db); + } } if (physicalConfigDedicated != NULL) { - if (eNB_flag==1){ - mac_xface->phy_config_dedicated_eNB(Mod_id,find_UE_RNTI(Mod_id,UE_id),physicalConfigDedicated); - }else{ - mac_xface->phy_config_dedicated_ue(Mod_id,eNB_index,physicalConfigDedicated); - UE_mac_inst[Mod_id].physicalConfigDedicated=physicalConfigDedicated; // for SR proc - } + if (eNB_flagP==1){ + mac_xface->phy_config_dedicated_eNB(Mod_id,find_UE_RNTI(Mod_id,UE_id),physicalConfigDedicated); + }else{ + mac_xface->phy_config_dedicated_ue(Mod_id,eNB_index,physicalConfigDedicated); + UE_mac_inst[Mod_id].physicalConfigDedicated=physicalConfigDedicated; // for SR proc + } } - if (eNB_flag == 0) { - if (measObj!= NULL) { - if (measObj[0]!= NULL){ - 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); - for (i=0;imeasObject.choice.measObjectEUTRA.cellsToAddModList->list.array[i]->physCellId; - LOG_I(MAC,"Cell %d : Nid_cell %d\n",i,UE_mac_inst[Mod_id].adj_cell_id[i]); - } - 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); - } - /* + if (eNB_flagP == 0) { + if (measObj!= NULL) { + if (measObj[0]!= NULL){ + 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); + for (i=0;imeasObject.choice.measObjectEUTRA.cellsToAddModList->list.array[i]->physCellId; + LOG_I(MAC,"Cell %d : Nid_cell %d\n",i,UE_mac_inst[Mod_id].adj_cell_id[i]); + } + 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); + } + /* if (quantityConfig != NULL) { if (quantityConfig[0] != NULL) { UE_mac_inst[Mod_id].quantityConfig = quantityConfig[0]; @@ -254,193 +254,193 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, mac_xface->phy_config_meas_ue } } - */ - } - } - if (eNB_flag==0) { - if(mobilityControlInfo != NULL) { - - LOG_D(MAC,"[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",Mod_id,eNB_index); - ue_mac_reset(Mod_id,eNB_index); - - if(mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon, - sizeof(RACH_ConfigCommon_t)); + */ } - - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.prach_ConfigInfo, - (void *)mobilityControlInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo, - sizeof(PRACH_ConfigInfo_t)); - UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.rootSequenceIndex = mobilityControlInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex; - - if(mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pdsch_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon, - sizeof(PDSCH_ConfigCommon_t)); - } - // not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pusch_ConfigCommon, - (void *)&mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon, - sizeof(PUSCH_ConfigCommon_t)); - - if(mobilityControlInfo->radioResourceConfigCommon.phich_Config) { - /* memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->phich_Config, + } + if (eNB_flagP==0) { + if(mobilityControlInfo != NULL) { + + LOG_D(MAC,"[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",Mod_id,eNB_index); + ue_mac_reset(Mod_id,eNB_index); + + if(mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon) { + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon, + (void *)mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon, + sizeof(RACH_ConfigCommon_t)); + } + + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.prach_ConfigInfo, + (void *)mobilityControlInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo, + sizeof(PRACH_ConfigInfo_t)); + UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.rootSequenceIndex = mobilityControlInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex; + + if(mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon) { + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pdsch_ConfigCommon, + (void *)mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon, + sizeof(PDSCH_ConfigCommon_t)); + } + // not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pusch_ConfigCommon, + (void *)&mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon, + sizeof(PUSCH_ConfigCommon_t)); + + if(mobilityControlInfo->radioResourceConfigCommon.phich_Config) { + /* memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->phich_Config, (void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config, sizeof(PHICH_Config_t)); */ + } + if(mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon) { + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pucch_ConfigCommon, + (void *)mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon, + sizeof(PUCCH_ConfigCommon_t)); + } + if(mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon) { + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon, + (void *)mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon, + sizeof(SoundingRS_UL_ConfigCommon_t)); + } + if(mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon) { + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->uplinkPowerControlCommon, + (void *)mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon, + sizeof(UplinkPowerControlCommon_t)); + } + //configure antennaInfoCommon somewhere here.. + if(mobilityControlInfo->radioResourceConfigCommon.p_Max) { + //to be configured + } + if(mobilityControlInfo->radioResourceConfigCommon.tdd_Config) { + UE_mac_inst[Mod_id].tdd_Config = mobilityControlInfo->radioResourceConfigCommon.tdd_Config; + } + if(mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength) { + memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->ul_CyclicPrefixLength, + (void *)mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength, + sizeof(UL_CyclicPrefixLength_t)); + } + // store the previous rnti in case of failure, and set thenew rnti + UE_mac_inst[Mod_id].crnti_before_ho = UE_mac_inst[Mod_id].crnti; + UE_mac_inst[Mod_id].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8)); + LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_id, UE_mac_inst[Mod_id].crnti, eNB_index); + UE_mac_inst[Mod_id].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated)); + if (mobilityControlInfo->rach_ConfigDedicated){ + memcpy((void*)UE_mac_inst[Mod_id].rach_ConfigDedicated, + (void*)mobilityControlInfo->rach_ConfigDedicated, + sizeof(*mobilityControlInfo->rach_ConfigDedicated)); + } + mac_xface->phy_config_afterHO_ue(Mod_id,eNB_index,mobilityControlInfo,0); } - if(mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pucch_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon, - sizeof(PUCCH_ConfigCommon_t)); - } - if(mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon, - sizeof(SoundingRS_UL_ConfigCommon_t)); - } - if(mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon) { - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->uplinkPowerControlCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon, - sizeof(UplinkPowerControlCommon_t)); - } - //configure antennaInfoCommon somewhere here.. - if(mobilityControlInfo->radioResourceConfigCommon.p_Max) { - //to be configured - } - if(mobilityControlInfo->radioResourceConfigCommon.tdd_Config) { - UE_mac_inst[Mod_id].tdd_Config = mobilityControlInfo->radioResourceConfigCommon.tdd_Config; - } - if(mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength) { - memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->ul_CyclicPrefixLength, - (void *)mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength, - sizeof(UL_CyclicPrefixLength_t)); - } - // store the previous rnti in case of failure, and set thenew rnti - UE_mac_inst[Mod_id].crnti_before_ho = UE_mac_inst[Mod_id].crnti; - UE_mac_inst[Mod_id].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8)); - LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_id, UE_mac_inst[Mod_id].crnti, eNB_index); - UE_mac_inst[Mod_id].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated)); - if (mobilityControlInfo->rach_ConfigDedicated){ - memcpy((void*)UE_mac_inst[Mod_id].rach_ConfigDedicated, - (void*)mobilityControlInfo->rach_ConfigDedicated, - sizeof(*mobilityControlInfo->rach_ConfigDedicated)); - } - mac_xface->phy_config_afterHO_ue(Mod_id,eNB_index,mobilityControlInfo,0); - } } - + if (mbsfn_SubframeConfigList != NULL) { - if (eNB_flag == 1) { - LOG_I(MAC,"[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count); - eNB_mac_inst[Mod_id].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count; - for (i=0; ilist.count; i++) { - eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i]; - LOG_I(MAC, "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", Mod_id, i, - eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); - } + if (eNB_flagP == 1) { + LOG_I(MAC,"[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count); + eNB_mac_inst[Mod_id].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count; + for (i=0; ilist.count; i++) { + eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i]; + LOG_I(MAC, "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", Mod_id, i, + eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); + } #ifdef Rel10 - eNB_mac_inst[Mod_id].MBMS_flag = MBMS_Flag; + eNB_mac_inst[Mod_id].MBMS_flag = MBMS_Flag; #endif - } - else { // UE - LOG_I(MAC,"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count); - UE_mac_inst[Mod_id].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count; - for (i=0; ilist.count; i++) { - LOG_I(MAC, "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", Mod_id, i); - UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i]; - // LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_id, - // UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); } - } + else { // UE + LOG_I(MAC,"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count); + UE_mac_inst[Mod_id].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count; + for (i=0; ilist.count; i++) { + LOG_I(MAC, "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", Mod_id, i); + UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i]; + // LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_id, + // UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); + } + } } #ifdef Rel10 if (mbsfn_AreaInfoList != NULL) { - if (eNB_flag == 1) { - // One eNB could be part of multiple mbsfn syc area, this could change over time so reset each time - LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count); - eNB_mac_inst[Mod_id].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; - for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { - eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; - LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_id,i, - eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - mac_xface->phy_config_sib13_eNB(Mod_id,i,eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); + if (eNB_flagP == 1) { + // One eNB could be part of multiple mbsfn syc area, this could change over time so reset each time + LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count); + eNB_mac_inst[Mod_id].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; + for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { + eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; + LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_id,i, + eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + mac_xface->phy_config_sib13_eNB(Mod_id,i,eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); + } } - } - else { // UE - LOG_I(MAC,"[UE %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count); - UE_mac_inst[Mod_id].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; - for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { - UE_mac_inst[Mod_id].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; - LOG_I(MAC,"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",Mod_id, i, - UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - mac_xface->phy_config_sib13_ue(Mod_id,eNB_index,i,UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); + else { // UE + LOG_I(MAC,"[UE %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count); + UE_mac_inst[Mod_id].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; + for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { + UE_mac_inst[Mod_id].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; + LOG_I(MAC,"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",Mod_id, i, + UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + mac_xface->phy_config_sib13_ue(Mod_id,eNB_index,i,UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); + } } - } } - + 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)); + // 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_flagP == 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++) { - eNB_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9; + 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; - LOG_I(MAC, "[CONFIG] PMCH[%d]: This PMCH stop at subframe %ldth\n", i, - eNB_mac_inst[Mod_id].pmch_Config[i]->sf_AllocEnd_r9); - LOG_I(MAC, "[CONFIG] PMCH[%d]: mch_Scheduling_Period = %ld\n", i, - eNB_mac_inst[Mod_id].pmch_Config[i]->mch_SchedulingPeriod_r9); - LOG_I(MAC, "[CONFIG] PMCH[%d]: dataMCS = %ld\n", i, - eNB_mac_inst[Mod_id].pmch_Config[i]->dataMCS_r9); + LOG_I(MAC, "[CONFIG] PMCH[%d]: This PMCH stop at subframe %ldth\n", i, + eNB_mac_inst[Mod_id].pmch_Config[i]->sf_AllocEnd_r9); + LOG_I(MAC, "[CONFIG] PMCH[%d]: mch_Scheduling_Period = %ld\n", i, + eNB_mac_inst[Mod_id].pmch_Config[i]->mch_SchedulingPeriod_r9); + LOG_I(MAC, "[CONFIG] PMCH[%d]: dataMCS = %ld\n", i, + eNB_mac_inst[Mod_id].pmch_Config[i]->dataMCS_r9); - // MBMS session info list in each MCH - 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); + // MBMS session info list in each MCH + 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); + } } - } - else { // UE - LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_id); - 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; - 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); + else { // UE + LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_id); + 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; + 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].mcch_status = 1; } - UE_mac_inst[Mod_id].mcch_status = 1; - } } - + #endif #ifdef CBA - if (eNB_flag == 0){ - if (cba_rnti) { - UE_mac_inst[Mod_id].cba_rnti[num_active_cba_groups-1] = cba_rnti; - LOG_D(MAC,"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n", - Mod_id,Mod_id%num_active_cba_groups, cba_rnti,eNB_index,num_active_cba_groups); - mac_xface->phy_config_cba_rnti(Mod_id,eNB_flag,eNB_index,cba_rnti,num_active_cba_groups-1, num_active_cba_groups); - } + if (eNB_flagP == 0){ + if (cba_rnti) { + UE_mac_inst[Mod_id].cba_rnti[num_active_cba_groups-1] = cba_rnti; + LOG_D(MAC,"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n", + Mod_id,Mod_id%num_active_cba_groups, cba_rnti,eNB_index,num_active_cba_groups); + mac_xface->phy_config_cba_rnti(Mod_id,eNB_flagP,eNB_index,cba_rnti,num_active_cba_groups-1, num_active_cba_groups); + } }else { - if (cba_rnti) { - LOG_D(MAC,"[eNB %d] configure CBA RNTI for UE %d (total active cba groups %d)\n", - Mod_id, UE_id, num_active_cba_groups); - eNB_mac_inst[Mod_id].num_active_cba_groups=num_active_cba_groups; - for (i=0; i < num_active_cba_groups; i ++){ - if (eNB_mac_inst[Mod_id].cba_rnti[i] != cba_rnti + i) - eNB_mac_inst[Mod_id].cba_rnti[i] = cba_rnti + i; - //only configure UE ids up to num_active_cba_groups - //we use them as candidates for the transmission of dci format0) - if (UE_id%num_active_cba_groups == i){ - mac_xface->phy_config_cba_rnti(Mod_id,eNB_flag,UE_id,cba_rnti + i,i,num_active_cba_groups ); - LOG_D(MAC,"[eNB %d] configure CBA groups %d with RNTI %x for UE %d (total active cba groups %d)\n", - Mod_id, i, eNB_mac_inst[Mod_id].cba_rnti[i],UE_id, num_active_cba_groups); - } + if (cba_rnti) { + LOG_D(MAC,"[eNB %d] configure CBA RNTI for UE %d (total active cba groups %d)\n", + Mod_id, UE_id, num_active_cba_groups); + eNB_mac_inst[Mod_id].num_active_cba_groups=num_active_cba_groups; + for (i=0; i < num_active_cba_groups; i ++){ + if (eNB_mac_inst[Mod_id].cba_rnti[i] != cba_rnti + i) + eNB_mac_inst[Mod_id].cba_rnti[i] = cba_rnti + i; + //only configure UE ids up to num_active_cba_groups + //we use them as candidates for the transmission of dci format0) + if (UE_id%num_active_cba_groups == i){ + mac_xface->phy_config_cba_rnti(Mod_id,eNB_flagP,UE_id,cba_rnti + i,i,num_active_cba_groups ); + LOG_D(MAC,"[eNB %d] configure CBA groups %d with RNTI %x for UE %d (total active cba groups %d)\n", + Mod_id, i, eNB_mac_inst[Mod_id].cba_rnti[i],UE_id, num_active_cba_groups); + } + } } - } } #endif diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 891df48d7c..adee2caf60 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -333,7 +333,7 @@ typedef enum { // temp struct for sched typedef struct { - u16 rnti; + rnti_t rnti; u16 subframe; u16 serving_num; UE_ULSCH_STATUS status; @@ -341,7 +341,7 @@ typedef struct { // temp struct for sched typedef struct { - u16 rnti; + rnti_t rnti; u16 weight; u16 subframe; u16 serving_num; @@ -383,7 +383,7 @@ typedef struct{ typedef struct{ /// CRNTI of UE - uint16_t crnti; ///user id (rnti) of connected UEs + rnti_t crnti; ///user id (rnti) of connected UEs // rrc status uint8_t rrc_status; /// harq pid @@ -466,7 +466,7 @@ typedef struct{ typedef struct{ /// C-RNTI of UE - u16 rnti; + rnti_t rnti; /// NDI from last scheduling uint8_t oldNDI[8]; /// NDI from last UL scheduling @@ -566,7 +566,7 @@ typedef struct { /// Flag to indicate that eNB is waiting for ACK that UE has received Msg3. u8 wait_ack_Msg4; /// UE RNTI allocated during RAR - u16 rnti; + rnti_t rnti; /// RA RNTI allocated from received PRACH u16 RA_rnti; /// Received preamble_index @@ -597,9 +597,9 @@ typedef struct{ /// u16 Node_id; /// frame counter - u32 frame; + frame_t frame; /// subframe counter - u32 subframe; + sub_frame_t subframe; /// Outgoing DCI for PHY generated by eNB scheduler DCI_PDU DCI_pdu; /// Outgoing BCCH pdu for PHY @@ -711,13 +711,13 @@ typedef struct { typedef struct{ u16 Node_id; /// frame counter - u32 frame; + frame_t frame; /// subframe counter - u32 subframe; + sub_frame_t subframe; /// C-RNTI of UE u16 crnti; /// C-RNTI of UE before HO - uint16_t crnti_before_ho; ///user id (rnti) of connected UEs + rnti_t crnti_before_ho; ///user id (rnti) of connected UEs /// uplink active flag uint8_t ul_active; /// pointer to RRC PHY configuration @@ -858,33 +858,36 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, @param mbsfn_AreaInfoList pointer to MBSFN Area Info list from SIB13 @param pmch_InfoList pointer to PMCH_InfoList from MBSFNAreaConfiguration Message (MCCH Message) */ -int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index, - RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, - struct PhysicalConfigDedicated *physicalConfigDedicated, - MeasObjectToAddMod_t **measObj, - MAC_MainConfig_t *mac_MainConfig, - long logicalChannelIdentity, - LogicalChannelConfig_t *logicalChannelConfig, - MeasGapConfig_t *measGapConfig, - TDD_Config_t *tdd_Config, - MobilityControlInfo_t *mobilityControlInfo, - u8 *SIwindowsize, - u16 *SIperiod, - ARFCN_ValueEUTRA_t *ul_CarrierFreq, - long *ul_Bandwidth, - AdditionalSpectrumEmission_t *additionalSpectrumEmission, - struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList +int rrc_mac_config_req(module_id_t module_idP, + eNB_flag_t eNB_flag, + u8 UE_id, + u8 eNB_index, + RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, + struct PhysicalConfigDedicated *physicalConfigDedicated, + MeasObjectToAddMod_t **measObj, + MAC_MainConfig_t *mac_MainConfig, + long logicalChannelIdentity, + LogicalChannelConfig_t *logicalChannelConfig, + MeasGapConfig_t *measGapConfig, + TDD_Config_t *tdd_Config, + MobilityControlInfo_t *mobilityControlInfo, + u8 *SIwindowsize, + u16 *SIperiod, + ARFCN_ValueEUTRA_t *ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t *additionalSpectrumEmission, + struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList #ifdef Rel10 - , - u8 MBMS_Flag, - MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, - PMCH_InfoList_r9_t *pmch_InfoList + , + u8 MBMS_Flag, + MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, + PMCH_InfoList_r9_t *pmch_InfoList #endif #ifdef CBA - , - u8 num_active_cba_groups, - u16 cba_rnti + , + u8 num_active_cba_groups, + u16 cba_rnti #endif ); @@ -897,7 +900,7 @@ for the message. @param nprb Pointer to current PRB count @param nCCE Pointer to current nCCE count */ -void schedule_RA(u8 Mod_id,u32 frame,u8 subframe,u8 Msg3_subframe,u8 *nprb,unsigned int *nCCE); +void schedule_RA(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,u8 Msg3_subframe,u8 *nprb,unsigned int *nCCE); /** \brief First stage of SI Scheduling. Gets a SI SDU from RRC if available and computes the MCS required to transport it as a function of the SDU length. It assumes a length less than or equal to 64 bytes (MCS 6, 3 PRBs). @param Mod_id Instance ID of eNB @@ -907,21 +910,21 @@ void schedule_RA(u8 Mod_id,u32 frame,u8 subframe,u8 Msg3_subframe,u8 *nprb,unsig @param nprb Pointer to current PRB count @param nCCE Pointer to current nCCE count */ -void schedule_SI(u8 Mod_id,u32 frame,u8 *nprb,unsigned int *nCCE); +void schedule_SI(module_id_t module_idP,frame_t frameP,u8 *nprb,unsigned int *nCCE); /** \brief MBMS scheduling: Checking the position for MBSFN subframes. Create MSI, transfer MCCH from RRC to MAC, transfer MTCHs from RLC to MAC. Multiplexing MSI,MCCH&MTCHs. Return 1 if there are MBSFN data being allocated, otherwise return 0; @param Mod_id Instance ID of eNB @param frame Frame index @param subframe Subframe number on which to act */ -int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe); +int schedule_MBMS(module_id_t module_idP,frame_t frameP, sub_frame_t subframe); /** \brief check the mapping between sf allocation and sync area, Currently only supports 1:1 mapping @param Mod_id Instance ID of eNB @param mbsfn_sync_area index of mbsfn sync area @param[out] index of sf pattern */ -s8 get_mbsfn_sf_alloction (unsigned char Mod_id, u8 mbsfn_sync_area); +s8 get_mbsfn_sf_alloction (module_id_t module_idP, u8 mbsfn_sync_area); /** \brief check the mapping between sf allocation and sync area, Currently only supports 1:1 mapping @param Mod_id Instance ID of eNB @@ -929,7 +932,7 @@ s8 get_mbsfn_sf_alloction (unsigned char Mod_id, u8 mbsfn_sync_area); @param eNB_index index of eNB @param[out] index of sf pattern */ -s8 ue_get_mbsfn_sf_alloction (unsigned char Mod_id, u8 mbsfn_sync_area, unsigned char eNB_index); +s8 ue_get_mbsfn_sf_alloction (module_id_t module_idP, u8 mbsfn_sync_area, unsigned char eNB_index); /** \brief top ULSCH Scheduling for TDD (config 1-6). @param Mod_id Instance ID of eNB @@ -938,7 +941,7 @@ s8 ue_get_mbsfn_sf_alloction (unsigned char Mod_id, u8 mbsfn_sync_area, unsigned @param sched_subframe Subframe number where PUSCH is transmitted (for DAI lookup) @param nCCE Pointer to current nCCE count */ -void schedule_ulsch(unsigned char Mod_id,u32 frame,unsigned char cooperation_flag,unsigned char subframe,unsigned char sched_subframe,unsigned int *nCCE); +void schedule_ulsch(module_id_t module_idP,frame_t frameP,unsigned char cooperation_flag,sub_frame_t subframe,unsigned char sched_subframe,unsigned int *nCCE); /** \brief ULSCH Scheduling per RNTI TDD config (config 1-6). @param Mod_id Instance ID of eNB @@ -947,7 +950,7 @@ void schedule_ulsch(unsigned char Mod_id,u32 frame,unsigned char cooperation_fla @param sched_subframe Subframe number where PUSCH is transmitted (for DAI lookup) @param nCCE Pointer to current nCCE count */ -void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, unsigned char subframe, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb); +void schedule_ulsch_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframe, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb); /** \brief ULSCH Scheduling for CBA RNTI TDD config (config 1-6). @param Mod_id Instance ID of eNB @@ -956,7 +959,7 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u @param sched_subframe Subframe number where PUSCH is transmitted (for DAI lookup) @param nCCE Pointer to current nCCE count */ -void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, unsigned char subframe, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb); +void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframe, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb); /** \brief Second stage of DLSCH scheduling, after schedule_SI, schedule_RA and schedule_dlsch have been called. This routine first allocates random frequency assignments for SI and RA SDUs using distributed VRB allocations and adds the corresponding DCI SDU to the DCI buffer for PHY. It then loops over the UE specific DCIs previously allocated and fills in the remaining DCI fields related to frequency allocation. It assumes localized allocation of type 0 (DCI.rah=0). The allocation is done for tranmission modes 1,2,4. @param Mod_id Instance of eNB @@ -966,7 +969,7 @@ void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 fram @param RA_scheduled RA was scheduled in this subframe @param mbsfn_flag Indicates that this subframe is for MCH/MCCH */ -void fill_DLSCH_dci(u8 Mod_id,u32 frame,u8 subframe,u32 rballoc,u8 RA_scheduled,int mbsfn_flag); +void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,u32 rballoc,u8 RA_scheduled,int mbsfn_flag); /** \brief UE specific DLSCH scheduling. Retrieves next ue to be schduled from round-robin scheduler and gets the appropriate harq_pid for the subframe from PHY. If the process is active and requires a retransmission, it schedules the retransmission with the same PRB count and MCS as the first transmission. Otherwise it consults RLC for DCCH/DTCH SDUs (status with maximum number of available PRBS), builds the MAC header (timing advance sent by default) and copies @param Mod_id Instance ID of eNB @@ -976,45 +979,45 @@ void fill_DLSCH_dci(u8 Mod_id,u32 frame,u8 subframe,u32 rballoc,u8 RA_scheduled, @param nCCE_used Number of CCE used by SI/RA @param mbsfn_flag Indicates that MCH/MCCH is in this subframe */ -void schedule_ue_spec(u8 Mod_id,u32 frame,u8 subframe,u16 nb_rb_used0,unsigned int *nCCE_used,int mbsfn_flag); +void schedule_ue_spec(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,u16 nb_rb_used0,unsigned int *nCCE_used,int mbsfn_flag); /** \brief Function for UE/PHY to compute PUSCH transmit power in power-control procedure. @param Mod_id Module id of UE @returns Po_NOMINAL_PUSCH (PREAMBLE_RECEIVED_TARGET_POWER+DELTA_PREAMBLE */ -s8 get_Po_NOMINAL_PUSCH(u8 Mod_id); +s8 get_Po_NOMINAL_PUSCH(module_id_t module_idP); /** \brief Function to compute DELTA_PREAMBLE from 36.321 (for RA power ramping procedure and Msg3 PUSCH power control policy) @param Mod_id Module id of UE @returns DELTA_PREAMBLE */ -s8 get_DELTA_PREAMBLE(u8 Mod_id); +s8 get_DELTA_PREAMBLE(module_id_t module_idP); /** \brief Function for compute deltaP_rampup from 36.321 (for RA power ramping procedure and Msg3 PUSCH power control policy) @param Mod_id Module id of UE @returns deltaP_rampup */ -s8 get_deltaP_rampup(u8 Mod_id); +s8 get_deltaP_rampup(module_id_t module_idP); //main.c -void chbch_phy_sync_success(u8 Mod_id,u32 frame,u8 eNB_index); +void chbch_phy_sync_success(module_id_t module_idP,frame_t frameP,u8 eNB_index); -void mrbch_phy_sync_failure(u8 Mod_id, u32 frame,u8 free_eNB_index); +void mrbch_phy_sync_failure(module_id_t module_idP, frame_t frameP,u8 free_eNB_index); int mac_top_init(int eMBMS_active, u8 cba_group_active, u8 HO_active); -char layer2_init_UE(u8 Mod_id); +char layer2_init_UE(module_id_t module_idP); -char layer2_init_eNB(u8 Mod_id, u8 Free_ch_index); +char layer2_init_eNB(module_id_t module_idP, u8 Free_ch_index); -void mac_switch_node_function(u8 Mod_id); +void mac_switch_node_function(module_id_t module_idP); int mac_init_global_param(void); void mac_top_cleanup(void); -void mac_UE_out_of_sync_ind(u8 Mod_id,u32 frame, u16 eNB_index); +void mac_UE_out_of_sync_ind(module_id_t module_idP,frame_t frameP, u16 eNB_index); // eNB functions @@ -1029,13 +1032,13 @@ void mac_UE_out_of_sync_ind(u8 Mod_id,u32 frame, u16 eNB_index); */ -void dlsch_scheduler_pre_processor (unsigned char Mod_id, - u32 frame, - unsigned char subframe, - u8 *dl_pow_off, - u16 *pre_nb_available_rbs, - int N_RBGS, - unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]); +void dlsch_scheduler_pre_processor (module_id_t module_idP, + frame_t frameP, + sub_frame_t subframe, + u8 *dl_pow_off, + u16 *pre_nb_available_rbs, + int N_RBGS, + unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]); /* \brief Function to trigger the eNB scheduling procedure. It is called by PHY at the beginning of each subframe, \f$n$\f and generates all DLSCH allocations for subframe \f$n\f$ and ULSCH allocations for subframe \f$n+k$\f. The resultant DCI_PDU is @@ -1046,7 +1049,7 @@ can be scheduled. @param subframe Index of current subframe @param calibration_flag Flag to indicate that eNB scheduler should schedule TDD auto-calibration PUSCH. */ -void eNB_dlsch_ulsch_scheduler(u8 Mod_id, u8 cooperation_flag, u32 frame, u8 subframe);//, int calibration_flag); +void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, u8 cooperation_flag, frame_t frameP, sub_frame_t subframe);//, int calibration_flag); /* \brief Function to retrieve result of scheduling (DCI) in current subframe. Can be called an arbitrary numeber of times after eNB_dlsch_ulsch_scheduler in a given subframe. @@ -1054,14 +1057,14 @@ in a given subframe. @param subframe Index of current subframe @returns Pointer to generated DCI for subframe */ -DCI_PDU *get_dci_sdu(u8 Mod_id,u32 frame,u8 subframe); +DCI_PDU *get_dci_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe); /* \brief Function to indicate a received preamble on PRACH. It initiates the RA procedure. @param Mod_id Instance ID of eNB @param preamble_index index of the received RA request @param timing_offset Offset in samples of the received PRACH w.r.t. eNB timing. This is used to */ -void initiate_ra_proc(u8 Mod_id,u32 frame, u16 preamble_index,s16 timing_offset,u8 sect_id,u8 subframe,u8 f_id); +void initiate_ra_proc(module_id_t module_idP,frame_t frameP, u16 preamble_index,s16 timing_offset,u8 sect_id,sub_frame_t subframe,u8 f_id); /* \brief Function in eNB to fill RAR pdu when requested by PHY. This provides a single RAR SDU for the moment and returns the t-CRNTI. @param Mod_id Instance ID of eNB @@ -1069,39 +1072,40 @@ void initiate_ra_proc(u8 Mod_id,u32 frame, u16 preamble_index,s16 timing_offset, @param N_RB_UL Number of UL resource blocks @returns t_CRNTI */ -u16 fill_rar(u8 Mod_id,u32 frame, - u8 *dlsch_buffer, - u16 N_RB_UL, - u8 input_buffer_length); +u16 fill_rar(module_id_t module_idP, + frame_t frameP, + u8 *dlsch_buffer, + u16 N_RB_UL, + u8 input_buffer_length); /* \brief This function indicates the end of RA procedure and provides the l3msg received on ULSCH. @param Mod_id Instance ID of eNB @param rnti RNTI of UE transmitting l3msg @param l3msg Pointer to received l3msg */ -void terminate_ra_proc(u8 Mod_id,u32 frame,u16 rnti, u8 *l3msg, u16 l3msg_len); +void terminate_ra_proc(module_id_t module_idP,frame_t frameP, rnti_t rnti, u8 *l3msg, u16 l3msg_len); /* \brief Function to indicate a failed RA response. It removes all temporary variables related to the initial connection of a UE @param Mod_id Instance ID of eNB @param preamble_index index of the received RA request. */ -void cancel_ra_proc(u8 Mod_id,u32 frame, u16 preamble_index); +void cancel_ra_proc(module_id_t module_idP,frame_t frameP, u16 preamble_index); /* \brief Function to indicate a received SDU on ULSCH. @param Mod_id Instance ID of eNB @param rnti RNTI of UE transmitting the SR @param sdu Pointer to received SDU */ -void rx_sdu(u8 Mod_id,u32 frame,u16 rnti, u8 *sdu, u16 sdu_len); +void rx_sdu(module_id_t module_idP, frame_t frameP, rnti_t rnti, u8 *sdu, u16 sdu_len); /* \brief Function to indicate a scheduled schduling request (SR) was received by eNB. @param Mod_id Instance ID of eNB @param rnti RNTI of UE transmitting the SR @param subframe Index of subframe where SR was received */ -void SR_indication(u8 Mod_id,u32 frame,u16 rnti, u8 subframe); +void SR_indication(module_id_t module_idP,frame_t frameP,rnti_t rnti, sub_frame_t subframe); -u8 *get_dlsch_sdu(u8 Mod_id,u32 frame,u16 rnti,u8 TBindex); +u8 *get_dlsch_sdu(module_id_t module_idP,frame_t frameP,rnti_t rnti,u8 TBindex); /* \brief Function to retrieve MCH transport block and MCS used for MCH in this MBSFN subframe. Returns null if no MCH is to be transmitted @param Mod_id Instance ID of eNB @@ -1114,41 +1118,41 @@ MCH_PDU *get_mch_sdu(uint8_t Mod_id,uint32_t frame,uint32_t subframe); //added for ALU icic purpose -u32 Get_Cell_SBMap(u8 Mod_id); -void UpdateSBnumber(unsigned char Mod_id); +u32 Get_Cell_SBMap(module_id_t module_idP); +void UpdateSBnumber(module_id_t module_idP); //end ALU's algo -void ue_mac_reset(u8 Mod_id,u8 eNB_index); -void ue_init_mac(u8 Mod_id); -void init_ue_sched_info(void); -void add_ue_ulsch_info(u8 Mod_id, u8 UE_id, u8 subframe,UE_ULSCH_STATUS status); -void add_ue_dlsch_info(u8 Mod_id, u8 UE_id, u8 subframe,UE_DLSCH_STATUS status); -s8 find_UE_id(u8 Mod_id,u16 rnti) ; -u16 find_UE_RNTI(u8 Mod_id, u8 UE_id); -s8 find_active_UEs(u8 Mod_id); -u8 is_UE_active(unsigned char Mod_id, unsigned char UE_id ); -u16 find_ulgranted_UEs(u8 Mod_id); -u16 find_dlgranted_UEs(u8 Mod_id); -u8 process_ue_cqi (u8 Mod_id, u8 UE_id); +void ue_mac_reset (module_id_t module_idP,u8 eNB_index); +void ue_init_mac (module_id_t module_idP); +void init_ue_sched_info(void); +void add_ue_ulsch_info (module_id_t module_idP, module_id_t ue_mod_idP, sub_frame_t subframe,UE_ULSCH_STATUS status); +void add_ue_dlsch_info (module_id_t module_idP, module_id_t ue_mod_idP, sub_frame_t subframe,UE_DLSCH_STATUS status); +module_id_t find_UE_id (module_id_t module_idP, rnti_t rnti) ; +u16 find_UE_RNTI (module_id_t module_idP, module_id_t ue_mod_idP); +u8 find_active_UEs (module_id_t module_idP); +u8 is_UE_active (module_id_t module_idP, module_id_t ue_mod_idP ); +u8 find_ulgranted_UEs(module_id_t module_idP); +u8 find_dlgranted_UEs(module_id_t module_idP); +u8 process_ue_cqi (module_id_t module_idP, module_id_t ue_mod_idP); -s8 find_active_UEs_with_traffic(unsigned char Mod_id); +s8 find_active_UEs_with_traffic(module_id_t module_idP); -u8 find_num_active_UEs_in_cbagroup(unsigned char Mod_id, unsigned char group_id); -u8 UE_is_to_be_scheduled(u8 Mod_id,u8 UE_id); +u8 find_num_active_UEs_in_cbagroup(module_id_t module_idP, unsigned char group_id); +u8 UE_is_to_be_scheduled(module_id_t module_idP,u8 UE_id); /** \brief Round-robin scheduler for ULSCH traffic. @param Mod_id Instance ID for eNB @param subframe Subframe number on which to act @returns UE index that is to be scheduled if needed/room */ -u8 schedule_next_ulue(u8 Mod_id, u8 UE_id,u8 subframe); +module_id_t schedule_next_ulue(module_id_t module_idP, module_id_t ue_mod_idP,sub_frame_t subframe); /** \brief Round-robin scheduler for DLSCH traffic. @param Mod_id Instance ID for eNB @param subframe Subframe number on which to act @returns UE index that is to be scheduled if needed/room */ -u8 schedule_next_dlue(u8 Mod_id, u8 subframe); +module_id_t schedule_next_dlue(module_id_t module_idP, sub_frame_t subframe); /* \brief Allocates a set of PRBS for a particular UE. This is a simple function for the moment, later it should process frequency-domain CQI information and/or PMI information. Currently it just returns the first PRBS that are available in the subframe based on the number requested. @param UE_id Index of UE on which to act @@ -1156,14 +1160,14 @@ u8 schedule_next_dlue(u8 Mod_id, u8 subframe); @param rballoc Pointer to bit-map of current PRB allocation given to previous users/control channels. This is updated for subsequent calls to the routine. @returns an rballoc bitmap for resource type 0 allocation (DCI). */ -u32 allocate_prbs(u8 UE_id,u8 nb_rb, u32 *rballoc); +u32 allocate_prbs(module_id_t ue_mod_idP,u8 nb_rb, u32 *rballoc); -/* \fn u32 req_new_ulsch(u8 Mod_id) +/* \fn u32 req_new_ulsch(module_id_t module_idP) \brief check for a new transmission in any drb @param Mod_id Instance id of UE in machine @returns 1 for new transmission, 0 for none */ -u32 req_new_ulsch(u8 Mod_id); +u32 req_new_ulsch(module_id_t module_idP); /* \brief Get SR payload (0,1) from UE MAC @param Mod_id Instance id of UE in machine @@ -1172,17 +1176,17 @@ u32 req_new_ulsch(u8 Mod_id); @param subframe subframe number @returns 0 for no SR, 1 for SR */ -u32 ue_get_SR(u8 Mod_id, u32 frame, u8 eNB_id,u16 rnti,u8 subframe); +u32 ue_get_SR(module_id_t module_idP, frame_t frameP, u8 eNB_id,rnti_t rnti,sub_frame_t subframe); -u8 get_ue_weight(u8 Mod_id, u8 UE_id); +u8 get_ue_weight(module_id_t module_idP, module_id_t ue_mod_idP); // UE functions -void mac_out_of_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index); +void mac_out_of_sync_ind(module_id_t module_idP, frame_t frameP, u16 CH_index); -void ue_decode_si(u8 Mod_id, u32 frame, u8 CH_index, void *pdu, u16 len); +void ue_decode_si(module_id_t module_idP, frame_t frame, u8 CH_index, void *pdu, u16 len); -void ue_send_sdu(u8 Mod_id, u32 frame, u8 *sdu,u16 sdu_len,u8 CH_index); +void ue_send_sdu(module_id_t module_idP, frame_t frame, u8 *sdu,u16 sdu_len,u8 CH_index); #ifdef Rel10 @@ -1194,7 +1198,7 @@ void ue_send_sdu(u8 Mod_id, u32 frame, u8 *sdu,u16 sdu_len,u8 CH_index); @param eNB_index Index of attached eNB @param sync_area the index of MBSFN sync area */ -void ue_send_mch_sdu(u8 Mod_id,u32 frame,u8 *sdu,u16 sdu_len,u8 eNB_index,u8 sync_area) ; +void ue_send_mch_sdu(module_id_t module_idP,frame_t frameP,u8 *sdu,u16 sdu_len,u8 eNB_index,u8 sync_area) ; /*\brief Function to check if UE PHY needs to decode MCH for MAC. @param Mod_id Index of protocol instance @@ -1204,7 +1208,7 @@ void ue_send_mch_sdu(u8 Mod_id,u32 frame,u8 *sdu,u16 sdu_len,u8 eNB_index,u8 syn @param[out] sync_area return the sync area @param[out] mcch_active flag indicating whether this MCCH is active in this SF */ -int ue_query_mch(uint8_t Mod_id,uint32_t frame,uint32_t subframe, uint8_t eNB_index, uint8_t *sync_area, uint8_t *mcch_active); +int ue_query_mch(uint8_t Mod_id,uint32_t frame,sub_frame_t subframe, uint8_t eNB_index, uint8_t *sync_area, uint8_t *mcch_active); #endif @@ -1215,14 +1219,14 @@ int ue_query_mch(uint8_t Mod_id,uint32_t frame,uint32_t subframe, uint8_t eNB_in @param subframe subframe number @returns 0 for no SR, 1 for SR */ -void ue_get_sdu(u8 Mod_id, u32 frame, u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u16 buflen,u8 *access_mode); +void ue_get_sdu(module_id_t module_idP, frame_t frameP, sub_frame_t subframe, u8 eNB_index,u8 *ulsch_buffer,u16 buflen,u8 *access_mode); /* \brief Function called by PHY to retrieve information to be transmitted using the RA procedure. If the UE is not in PUSCH mode for a particular eNB index, this is assumed to be an Msg3 and MAC attempts to retrieves the CCCH message from RRC. If the UE is in PUSCH mode for a particular eNB index and PUCCH format 0 (Scheduling Request) is not activated, the MAC may use this resource for random-access to transmit a BSR along with the C-RNTI control element (see 5.1.4 from 36.321) @param Mod_id Index of UE instance @param New_Msg3 Flag to indicate this call is for a new Msg3 @param subframe Index of subframe for PRACH transmission (0 ... 9) @returns A pointer to a PRACH_RESOURCES_t */ -PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame,u8 new_Msg3,u8 subframe); +PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,frame_t frameP,u8 new_Msg3,sub_frame_t subframe); /* \brief Function called by PHY to process the received RAR. It checks that the preamble matches what was sent by the eNB and provides the timing advance and t-CRNTI. @param Mod_id Index of UE instance @@ -1232,7 +1236,7 @@ PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame,u8 new_Msg3,u8 subframe); random-access procedure @returns timing advance or 0xffff if preamble doesn't match */ -u16 ue_process_rar(u8 Mod_id,u32 frame,u8 *dlsch_buffer,u16 *t_crnti,u8 preamble_index); +u16 ue_process_rar(module_id_t module_idP, frame_t frameP,u8 *dlsch_buffer,u16 *t_crnti,u8 preamble_index); /* \brief Generate header for UL-SCH. This function parses the desired control elements and sdus and generates the header as described @@ -1252,16 +1256,16 @@ in the ULSCH buffer. @returns Number of bytes used for header */ unsigned char generate_ulsch_header(u8 *mac_header, - u8 num_sdus, - u8 short_padding, - u16 *sdu_lengths, - u8 *sdu_lcids, - POWER_HEADROOM_CMD *power_headroom, - u16 *crnti, - BSR_SHORT *truncated_bsr, - BSR_SHORT *short_bsr, - BSR_LONG *long_bsr, - unsigned short post_padding); + u8 num_sdus, + u8 short_padding, + u16 *sdu_lengths, + u8 *sdu_lcids, + POWER_HEADROOM_CMD *power_headroom, + u16 *crnti, + BSR_SHORT *truncated_bsr, + BSR_SHORT *short_bsr, + BSR_LONG *long_bsr, + unsigned short post_padding); /* \brief Parse header for UL-SCH. This function parses the received UL-SCH header as described in 36-321 MAC layer specifications. It returns the number of bytes used for the header to be used as an offset for the payload @@ -1275,30 +1279,30 @@ in the ULSCH buffer. @returns Pointer to payload following header */ u8 *parse_ulsch_header(u8 *mac_header, - u8 *num_ce, - u8 *num_sdu, - u8 *rx_ces, - u8 *rx_lcids, - u16 *rx_lengths, - u16 tx_lenght); + u8 *num_ce, + u8 *num_sdu, + u8 *rx_ces, + u8 *rx_lcids, + u16 *rx_lengths, + u16 tx_lenght); int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, u8 cba_group_active, u8 HO_active); int mac_init(void); -s8 add_new_ue(u8 Mod_id, u16 rnti); -s8 mac_remove_ue(u8 Mod_id, u8 UE_id); +s8 add_new_ue(module_id_t module_idP, rnti_t rnti); +s8 mac_remove_ue(module_id_t enb_mod_idP, module_id_t ue_mod_idP); -/*! \fn UE_L2_state_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t direction,u8 eNB_index) +/*! \fn UE_L2_state_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframe, lte_subframe_t direction,u8 eNB_index) \brief UE scheduler where all the ue background tasks are done. This function performs the following: 1) Trigger PDCP every 5ms 2) Call RRC for link status return to PHY3) Perform SR/BSR procedures for scheduling feedback 4) Perform PHR procedures. -\param[in] Mod_id instance of the UE -\param[in] subframe the subframe number -\param[in] direction subframe direction -\param[in] eNB_index instance of eNB +\param[in] module_idP instance of the UE +\param[in] subframe t the subframe number +\param[in] direction subframe direction +\param[in] eNB_index instance of eNB @returns L2 state (CONNETION_OK or CONNECTION_LOST or PHY_RESYNCH) */ -UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t direction,u8 eNB_index); +UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframe, lte_subframe_t direction,u8 eNB_index); -/*! \fn int use_cba_access(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index); +/*! \fn int use_cba_access(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 eNB_index); \brief determine whether to use cba resource to transmit or not \param[in] Mod_id instance of the UE \param[in] frame the frame number @@ -1306,46 +1310,46 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire \param[in] eNB_index instance of eNB \param[out] access(1) or postpone (0) */ -int use_cba_access(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index); +int use_cba_access(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 eNB_index); -/*! \fn int get_bsr_lcgid (u8 Mod_id); +/*! \fn int get_bsr_lcgid (module_id_t module_idP); \brief determine the lcgid for the bsr \param[in] Mod_id instance of the UE \param[out] lcgid */ -int get_bsr_lcgid (u8 Mod_id); +int get_bsr_lcgid (module_id_t module_idP); -/*! \fn u8 get_bsr_len (u8 Mod_id, u16 bufflen); +/*! \fn u8 get_bsr_len (module_id_t module_idP, u16 bufflen); \brief determine whether the bsr is short or long assuming that the MAC pdu is built \param[in] Mod_id instance of the UE \param[in] bufflen size of phy transport block \param[out] bsr_len size of bsr control element */ -u8 get_bsr_len (u8 Mod_id, u16 buflen); +u8 get_bsr_len (module_id_t module_idP, u16 buflen); -/*! \fn BSR_SHORT * get_bsr_short(u8 Mod_id, u8 bsr_len) +/*! \fn BSR_SHORT * get_bsr_short(module_id_t module_idP, u8 bsr_len) \brief get short bsr level \param[in] Mod_id instance of the UE \param[in] bsr_len indicator for no, short, or long bsr \param[out] bsr_s pointer to short bsr */ -BSR_SHORT *get_bsr_short(u8 Mod_id, u8 bsr_len); +BSR_SHORT *get_bsr_short(module_id_t module_idP, u8 bsr_len); -/*! \fn BSR_LONG * get_bsr_long(u8 Mod_id, u8 bsr_len) +/*! \fn BSR_LONG * get_bsr_long(module_id_t module_idP, u8 bsr_len) \brief get long bsr level \param[in] Mod_id instance of the UE \param[in] bsr_len indicator for no, short, or long bsr \param[out] bsr_l pointer to long bsr */ -BSR_LONG * get_bsr_long(u8 Mod_id, u8 bsr_len); +BSR_LONG * get_bsr_long(module_id_t module_idP, u8 bsr_len); -/*! \fn int update_bsr(u8 Mod_id, u32 frame, u8 lcid) +/*! \fn int update_bsr(module_id_t module_idP, frame_t frameP, u8 lcid) \brief get the rlc stats and update the bsr level for each lcid \param[in] Mod_id instance of the UE \param[in] frame Frame index \param[in] lcid logical channel identifier */ -int update_bsr(u8 Mod_id, u32 frame, u8 lcid, u8 lcgid); +int update_bsr(module_id_t module_idP, frame_t frameP, u8 lcid, u8 lcgid); /*! \fn locate (int *table, int size, int value) \brief locate the BSR level in the table as defined in 36.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table. @@ -1399,25 +1403,25 @@ int get_sf_prohibitPHR_Timer(u8 prohibitPHR_Timer); */ int get_db_dl_PathlossChange(u8 dl_PathlossChange); -/*! \fn u8 get_phr_mapping (u8 Mod_id, u8 eNB_index) +/*! \fn u8 get_phr_mapping (module_id_t module_idP, u8 eNB_index) \brief get phr mapping as described in 36.313 \param[in] Mod_id index of eNB \return phr mapping */ -u8 get_phr_mapping (u8 Mod_id, u8 eNB_index); +u8 get_phr_mapping (module_id_t module_idP, u8 eNB_index); -/*! \fn void update_phr (u8 Mod_id) +/*! \fn void update_phr (module_id_t module_idP) \brief update/reset the phr timers \param[in] Mod_id index of eNB \return void */ -void update_phr (u8 Mod_id); +void update_phr (module_id_t module_idP); /*! \brief Function to indicate Msg3 transmission/retransmission which initiates/reset Contention Resolution Timer \param[in] Mod_id Instance index of UE \param[in] eNB_id Index of eNB */ -void Msg3_tx(u8 Mod_id,u32 frame,u8 eNB_id); +void Msg3_tx(module_id_t module_idP,frame_t frameP,u8 eNB_id); /*! \brief Function to indicate the transmission of msg1/rach @@ -1425,12 +1429,12 @@ void Msg3_tx(u8 Mod_id,u32 frame,u8 eNB_id); \param[in] eNB_id Index of eNB */ -void Msg1_tx(u8 Mod_id,u32 frame, u8 eNB_id); +void Msg1_tx(module_id_t module_idP,frame_t frameP, u8 eNB_id); -void dl_phy_sync_success(unsigned char Mod_id, - u32 frame, - unsigned char eNB_index, - u8 first_sync); +void dl_phy_sync_success(module_id_t module_idP, + frame_t frameP, + unsigned char eNB_index, + u8 first_sync); int dump_eNB_l2_stats(char *buffer, int length); diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index b911d4d6fa..1778fea3c0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -25,7 +25,7 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file eNB_scheduler.c * \brief procedures related to UE * \author Raymond Knopp, Navid Nikaein @@ -73,84 +73,84 @@ #ifndef USER_MODE #define msg debug_msg #endif -*/ + */ extern inline unsigned int taus(void); void init_ue_sched_info(void){ - int i,j; + module_id_t i,j; for (i=0;imacphy_exit("[MAC][eNB] Max user count reached\n"); - } - else { - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Added user with rnti %x => UE %d\n", - Mod_id,frame,eNB_mac_inst[Mod_id].RA_template[i].rnti,UE_id); - } - - if (Is_rrc_registered == 1) - mac_rrc_data_ind(Mod_id,frame,CCCH,(u8 *)payload_ptr,rx_lengths[0],1,Mod_id,0); - // add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC - // doesn't provide a CCCH SDU - - } - else if (num_ce >0) { // handle msg3 which is not RRCConnectionRequest - // process_ra_message(msg3,num_ce,rx_lcids,rx_ces); - } - - eNB_mac_inst[Mod_id].RA_template[i].generate_Msg4 = 1; - eNB_mac_inst[Mod_id].RA_template[i].wait_ack_Msg4 = 0; - - return; - } // if process is active + LOG_D(MAC,"[RAPROC] Checking proc %d : rnti (%x, %x), active %d\n",i, + eNB_mac_inst[module_idP].RA_template[i].rnti, rnti, + eNB_mac_inst[module_idP].RA_template[i].RA_active); + if ((eNB_mac_inst[module_idP].RA_template[i].rnti==rnti) && + (eNB_mac_inst[module_idP].RA_template[i].RA_active==1)) { + + payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len); + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", + module_idP,frameP,rx_lengths[0],payload_ptr-msg3); + if ((num_ce == 0) && (num_sdu==1) && (rx_lcids[0] == CCCH)) { // This is an RRCConnectionRequest/Restablishment + memcpy(&eNB_mac_inst[module_idP].RA_template[i].cont_res_id[0],payload_ptr,6); + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", + module_idP,frameP,rx_lengths[0],payload_ptr-msg3); + UE_id=add_new_ue(module_idP,eNB_mac_inst[module_idP].RA_template[i].rnti); + if (UE_id==-1) { + mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n"); + } + else { + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Added user with rnti %x => UE %d\n", + module_idP,frameP,eNB_mac_inst[module_idP].RA_template[i].rnti,UE_id); + } + + if (Is_rrc_registered == 1) + mac_rrc_data_ind(module_idP,frameP,CCCH,(u8 *)payload_ptr,rx_lengths[0],1,module_idP,0); + // add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC + // doesn't provide a CCCH SDU + + } + else if (num_ce >0) { // handle msg3 which is not RRCConnectionRequest + // process_ra_message(msg3,num_ce,rx_lcids,rx_ces); + } + + eNB_mac_inst[module_idP].RA_template[i].generate_Msg4 = 1; + eNB_mac_inst[module_idP].RA_template[i].wait_ack_Msg4 = 0; + + return; + } // if process is active } // loop on RA processes } -DCI_PDU *get_dci_sdu(u8 Mod_id, u32 frame, u8 subframe) { +DCI_PDU *get_dci_sdu(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { - return(&eNB_mac_inst[Mod_id].DCI_pdu); + return(&eNB_mac_inst[module_idP].DCI_pdu); } -s8 find_UE_id(unsigned char Mod_id,u16 rnti) { +module_id_t find_UE_id(module_id_t module_idP, rnti_t rnti) { - unsigned char i; + module_id_t ue_mod_id; - for (i=0;iget_eNB_UE_stats(Mod_id,rnti) != NULL){ // check at the phy enb_ue state for this rnti - nb_active_ue++; - } - else { // this ue is removed at the phy => remove it at the mac as well - mac_remove_ue(Mod_id, UE_id); + if (mac_xface->get_eNB_UE_stats(module_idP,rnti) != NULL){ // check at the phy enb_ue state for this rnti + nb_active_ue++; + } + else { // this ue is removed at the phy => remove it at the mac as well + mac_remove_ue(module_idP, ue_mod_id); + } } - } } return(nb_active_ue); } // function for determining which active ue should be granted resources in uplink based on BSR+QoS -u16 find_ulgranted_UEs(unsigned char Mod_id){ +u8 find_ulgranted_UEs(module_id_t module_idP){ // all active users should be granted - return(find_active_UEs(Mod_id)); + return(find_active_UEs(module_idP)); } // function for determining which active ue should be granted resources in downlink based on CQI, SI, and BSR -u16 find_dlgranted_UEs(unsigned char Mod_id){ +u8 find_dlgranted_UEs(module_id_t module_idP){ // all active users should be granted - return(find_active_UEs(Mod_id)); + return(find_active_UEs(module_idP)); } // get aggregatiob form phy for a give UE -unsigned char process_ue_cqi (unsigned char Mod_id, unsigned char UE_id) { - +unsigned char process_ue_cqi (module_id_t module_idP, module_id_t ue_mod_idP) { unsigned char aggregation=2; // check the MCS and SNR and set the aggregation accordingly - return aggregation; } #ifdef CBA -u8 find_num_active_UEs_in_cbagroup(unsigned char Mod_id, unsigned char group_id){ +u8 find_num_active_UEs_in_cbagroup(module_id_t module_idP, unsigned char group_id){ - u8 UE_id; - u16 rnti; + module_id_t UE_id; + rnti_t rnti; unsigned char nb_ue_in_pusch=0; LTE_eNB_UE_stats* eNB_UE_stats; - - for (UE_id=group_id;UE_id RRC_CONNECTED)){ - // && (UE_is_to_be_scheduled(Mod_id,UE_id))) - // check at the phy enb_ue state for this rnti - if ((eNB_UE_stats= mac_xface->get_eNB_UE_stats(Mod_id,rnti)) != NULL){ - if ((eNB_UE_stats->mode == PUSCH) && (UE_is_to_be_scheduled(Mod_id,UE_id) == 0)){ - nb_ue_in_pusch++; - } + + for (UE_id=group_id;UE_id RRC_CONNECTED)){ + // && (UE_is_to_be_scheduled(module_idP,UE_id))) + // check at the phy enb_ue state for this rnti + if ((eNB_UE_stats= mac_xface->get_eNB_UE_stats(module_idP,rnti)) != NULL){ + if ((eNB_UE_stats->mode == PUSCH) && (UE_is_to_be_scheduled(module_idP,UE_id) == 0)){ + nb_ue_in_pusch++; + } + } } - } } return(nb_ue_in_pusch); } #endif -s8 add_new_ue(unsigned char Mod_id, u16 rnti) { - int i,j; - - for (i=0;i UE_id %d\n",Mod_id,frame,rnti,UE_id); + ue_mod_id = find_UE_id(module_idP,rntiP); + LOG_D(MAC,"[eNB %d] Frame %d Get DLSCH sdu for rnti %x => UE_id %d\n",module_idP,frameP,rntiP,ue_mod_id); - return((unsigned char *)&eNB_mac_inst[Mod_id].DLSCH_pdu[UE_id][TBindex].payload[0]); + return((unsigned char *)&eNB_mac_inst[module_idP].DLSCH_pdu[ue_mod_id][TBindex].payload[0]); } } unsigned char *parse_ulsch_header(unsigned char *mac_header, - unsigned char *num_ce, - unsigned char *num_sdu, - unsigned char *rx_ces, - unsigned char *rx_lcids, - unsigned short *rx_lengths, - unsigned short tb_length) { + unsigned char *num_ce, + unsigned char *num_sdu, + unsigned char *rx_ces, + unsigned char *rx_lcids, + unsigned short *rx_lengths, + unsigned short tb_length) { unsigned char not_done=1,num_ces=0,num_sdus=0,lcid,num_sdu_cnt; unsigned char *mac_header_ptr = mac_header; @@ -460,49 +459,49 @@ unsigned char *parse_ulsch_header(unsigned char *mac_header, while (not_done==1) { - if (((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E == 0) - not_done = 0; - - lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; - if (lcid < EXTENDED_POWER_HEADROOM) { - if (not_done==0) { // last MAC SDU, length is implicit - mac_header_ptr++; - length = tb_length-(mac_header_ptr-mac_header)-ce_len; - for (num_sdu_cnt=0; num_sdu_cnt < num_sdus ; num_sdu_cnt++) - length -= rx_lengths[num_sdu_cnt]; - } - else { - if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { - length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; - mac_header_ptr += 2;//sizeof(SCH_SUBHEADER_SHORT); - } - else { // F = 1 - length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); - mac_header_ptr += 3;//sizeof(SCH_SUBHEADER_LONG); - } + if (((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E == 0) + not_done = 0; + + lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; + if (lcid < EXTENDED_POWER_HEADROOM) { + if (not_done==0) { // last MAC SDU, length is implicit + mac_header_ptr++; + length = tb_length-(mac_header_ptr-mac_header)-ce_len; + for (num_sdu_cnt=0; num_sdu_cnt < num_sdus ; num_sdu_cnt++) + length -= rx_lengths[num_sdu_cnt]; + } + else { + if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { + length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; + mac_header_ptr += 2;//sizeof(SCH_SUBHEADER_SHORT); + } + else { // F = 1 + length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); + mac_header_ptr += 3;//sizeof(SCH_SUBHEADER_LONG); + } + } + LOG_D(MAC,"[eNB] sdu %d lcid %d tb_length %d length %d (offset now %d)\n", + num_sdus,lcid,tb_length, length,mac_header_ptr-mac_header); + rx_lcids[num_sdus] = lcid; + rx_lengths[num_sdus] = length; + num_sdus++; } - LOG_D(MAC,"[eNB] sdu %d lcid %d tb_length %d length %d (offset now %d)\n", - num_sdus,lcid,tb_length, length,mac_header_ptr-mac_header); - rx_lcids[num_sdus] = lcid; - rx_lengths[num_sdus] = length; - num_sdus++; - } - else { // This is a control element subheader POWER_HEADROOM, BSR and CRNTI - if (lcid == SHORT_PADDING) { - mac_header_ptr++; - } - else { - rx_ces[num_ces] = lcid; - num_ces++; - mac_header_ptr++; - if (lcid==LONG_BSR) - ce_len+=4; - else if (lcid==CRNTI) - ce_len+=2; - else if ((lcid==POWER_HEADROOM) || (lcid==TRUNCATED_BSR)|| (lcid== SHORT_BSR)) - ce_len++; + else { // This is a control element subheader POWER_HEADROOM, BSR and CRNTI + if (lcid == SHORT_PADDING) { + mac_header_ptr++; + } + else { + rx_ces[num_ces] = lcid; + num_ces++; + mac_header_ptr++; + if (lcid==LONG_BSR) + ce_len+=4; + else if (lcid==CRNTI) + ce_len+=2; + else if ((lcid==POWER_HEADROOM) || (lcid==TRUNCATED_BSR)|| (lcid== SHORT_BSR)) + ce_len++; + } } - } } *num_ce = num_ces; *num_sdu = num_sdus; @@ -510,138 +509,142 @@ unsigned char *parse_ulsch_header(unsigned char *mac_header, return(mac_header_ptr); } -void SR_indication(u8 Mod_id,u32 frame, u16 rnti, u8 subframe) { +void SR_indication(module_id_t enb_mod_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP) { - u8 UE_id = find_UE_id(Mod_id,rnti); + s8 ue_mod_id = find_UE_id(enb_mod_idP, rntiP); - LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframe %d Signaling SR for UE %d \n",Mod_id,rnti,frame,subframe, UE_id); - eNB_mac_inst[Mod_id].UE_template[UE_id].ul_SR = 1; - eNB_mac_inst[Mod_id].UE_template[UE_id].ul_active = 1; + if (ue_mod_id >= 0) { + LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d \n",enb_mod_idP,rntiP,frameP,subframeP, ue_mod_id); + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].ul_SR = 1; + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].ul_active = 1; + } else { + AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); + } } -void rx_sdu(u8 Mod_id,u32 frame,u16 rnti,u8 *sdu, u16 sdu_len) { +void rx_sdu(module_id_t enb_mod_idP,frame_t frameP,rnti_t rntiP,u8 *sdu, u16 sdu_len) { - unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; - unsigned char rx_lcids[NB_RB_MAX]; + unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; + unsigned char rx_lcids[NB_RB_MAX]; unsigned short rx_lengths[NB_RB_MAX]; - unsigned char UE_id = find_UE_id(Mod_id,rnti); + module_id_t ue_mod_id = find_UE_id(enb_mod_idP,rntiP); int ii,j; for(ii=0; ii> 6); - LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", + switch (rx_ces[i]) { // implement and process BSR + CRNTI + + case POWER_HEADROOM: + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].phr_info = (payload_ptr[0] & 0x3f);// - PHR_MAPPING_OFFSET; + LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received PHR PH = %d (db)\n", rx_ces[i], eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].phr_info); + payload_ptr+=sizeof(POWER_HEADROOM_CMD); + break; + case CRNTI: + LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received CRNTI %d \n", rx_ces[i], payload_ptr[0]); + payload_ptr+=1; + break; + case TRUNCATED_BSR: + case SHORT_BSR: { + u8 lcgid; + + lcgid = (payload_ptr[0] >> 6); + LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", rx_ces[i], lcgid, payload_ptr[0] & 0x3f); - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f); - payload_ptr += 1;//sizeof(SHORT_BSR); // fixme - } break; - case LONG_BSR: - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2); - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = - ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4); - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = - ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6); - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F); - LOG_D(MAC, "[eNB] MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " - "%u LCGID2 = %u LCGID3 = %u\n", + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f); + payload_ptr += 1;//sizeof(SHORT_BSR); // fixme + } break; + case LONG_BSR: + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2); + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID1] = + ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4); + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID2] = + ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6); + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F); + LOG_D(MAC, "[eNB] MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " + "%u LCGID2 = %u LCGID3 = %u\n", rx_ces[i], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3]); - payload_ptr += 3;////sizeof(LONG_BSR); - break; - default: - LOG_E(MAC, "[eNB] Received unknown MAC header (0x%02x)\n", rx_ces[i]); - break; - } + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID0], + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID1], + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID2], + eNB_mac_inst[enb_mod_idP].UE_template[ue_mod_id].bsr_info[LCGID3]); + payload_ptr += 3;////sizeof(LONG_BSR); + break; + default: + LOG_E(MAC, "[eNB] Received unknown MAC header (0x%02x)\n", rx_ces[i]); + break; + } } for (i=0;i UL-DCCH, received %d bytes form UE %d on LCID %d(%d) \n", - Mod_id,frame, rx_lengths[i], UE_id, rx_lcids[i], rx_lcids[i]+(UE_id*NB_RB_MAX)); - - mac_rlc_data_ind(Mod_id,frame,1,RLC_MBMS_NO, - rx_lcids[i]+(UE_id*NB_RB_MAX), - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL);//(unsigned int*)crc_status); - eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].num_pdu_rx[rx_lcids[i]]+=1; - eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; - - } - // } - } else if (rx_lcids[i] >= DTCH) { - // if(eNB_mac_inst[Mod_id].Dcch_lchan[UE_id].Active==1){ + // This check is just to make sure we didn't get a bogus SDU length, to be removed ... + if (rx_lengths[i] UL-DCCH, received %d bytes form UE %d on LCID %d(%d) \n", + enb_mod_idP,frameP, rx_lengths[i], ue_mod_id, rx_lcids[i], rx_lcids[i]); + + mac_rlc_data_ind(enb_mod_idP,ue_mod_id, frameP,1,RLC_MBMS_NO, + rx_lcids[i], + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL);//(unsigned int*)crc_status); + eNB_mac_inst[enb_mod_idP].eNB_UE_stats[ue_mod_id].num_pdu_rx[rx_lcids[i]]+=1; + eNB_mac_inst[enb_mod_idP].eNB_UE_stats[ue_mod_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; + + } + // } + } else if (rx_lcids[i] >= DTCH) { + // if(eNB_mac_inst[module_idP].Dcch_lchan[UE_id].Active==1){ #if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sdu)); - - for (j=0;j<32;j++) - LOG_T(MAC,"%x ",payload_ptr[j]); - LOG_T(MAC,"\n"); + LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sdu)); + + for (j=0;j<32;j++) + LOG_T(MAC,"%x ",payload_ptr[j]); + LOG_T(MAC,"\n"); #endif - LOG_D(MAC,"[eNB %d] Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d (%d)\n", - Mod_id,frame, rx_lengths[i], UE_id,rx_lcids[i],rx_lcids[i]+(UE_id*NB_RB_MAX)); - - if ((rx_lengths[i] 0) ) { // MAX SIZE OF transport block - mac_rlc_data_ind(Mod_id,frame,1,RLC_MBMS_NO, - DTCH+(UE_id*NB_RB_MAX), - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL);//(unsigned int*)crc_status); - eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].num_pdu_rx[rx_lcids[i]]+=1; - eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; - + LOG_D(MAC,"[eNB %d] Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d (%d)\n", + enb_mod_idP,frameP, rx_lengths[i], ue_mod_id,rx_lcids[i],rx_lcids[i]); + + if ((rx_lengths[i] 0) ) { // MAX SIZE OF transport block + mac_rlc_data_ind(enb_mod_idP,ue_mod_id, frameP,1,RLC_MBMS_NO, + DTCH, + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL);//(unsigned int*)crc_status); + eNB_mac_inst[enb_mod_idP].eNB_UE_stats[ue_mod_id].num_pdu_rx[rx_lcids[i]]+=1; + eNB_mac_inst[enb_mod_idP].eNB_UE_stats[ue_mod_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; + + } + // } + } else { + eNB_mac_inst[enb_mod_idP].eNB_UE_stats[ue_mod_id].num_errors_rx+=1; + LOG_E(MAC,"[eNB %d] received unknown LCID %d from UE %d ", rx_lcids[i], ue_mod_id); } - // } - } else { - eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].num_errors_rx+=1; - LOG_E(MAC,"[eNB %d] received unknown LCID %d from UE %d ", rx_lcids[i], UE_id); - } - - payload_ptr+=rx_lengths[i]; + + payload_ptr+=rx_lengths[i]; } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,0); @@ -649,14 +652,14 @@ void rx_sdu(u8 Mod_id,u32 frame,u16 rnti,u8 *sdu, u16 sdu_len) { } unsigned char generate_dlsch_header(unsigned char *mac_header, - unsigned char num_sdus, - unsigned short *sdu_lengths, - unsigned char *sdu_lcids, - unsigned char drx_cmd, - short timing_advance_cmd, - unsigned char *ue_cont_res_id, - unsigned char short_padding, - unsigned short post_padding) { + unsigned char num_sdus, + unsigned short *sdu_lengths, + unsigned char *sdu_lcids, + unsigned char drx_cmd, + short timing_advance_cmd, + unsigned char *ue_cont_res_id, + unsigned char short_padding, + unsigned short post_padding) { SCH_SUBHEADER_FIXED *mac_header_ptr = (SCH_SUBHEADER_FIXED *)mac_header; u8 first_element=0,last_size=0,i; @@ -665,137 +668,137 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, ce_ptr = &mac_header_control_elements[0]; // compute header components - + if ((short_padding == 1) || (short_padding == 2)) { - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - first_element=1; - last_size=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + first_element=1; + last_size=1; } if (short_padding == 2) { - mac_header_ptr->E = 1; - mac_header_ptr++; - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - last_size=1; + mac_header_ptr->E = 1; + mac_header_ptr++; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + last_size=1; } if (drx_cmd != 255) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } - else { - first_element=1; - } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = DRX_CMD; - last_size=1; + if (first_element>0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } + else { + first_element=1; + } + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = DRX_CMD; + last_size=1; } if (timing_advance_cmd != 0) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } - else { - first_element=1; - } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = TIMING_ADV_CMD; - last_size=1; - // msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - ((TIMING_ADVANCE_CMD *)ce_ptr)->R=0; - ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=timing_advance_cmd&0x3f; - LOG_I(MAC,"timing advance =%d (%d)\n",timing_advance_cmd,((TIMING_ADVANCE_CMD *)ce_ptr)->TA); - ce_ptr+=sizeof(TIMING_ADVANCE_CMD); - //msg("offset %d\n",ce_ptr-mac_header_control_elements); + if (first_element>0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } + else { + first_element=1; + } + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = TIMING_ADV_CMD; + last_size=1; + // msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + ((TIMING_ADVANCE_CMD *)ce_ptr)->R=0; + ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=timing_advance_cmd&0x3f; + LOG_I(MAC,"timing advance =%d (%d)\n",timing_advance_cmd,((TIMING_ADVANCE_CMD *)ce_ptr)->TA); + ce_ptr+=sizeof(TIMING_ADVANCE_CMD); + //msg("offset %d\n",ce_ptr-mac_header_control_elements); } if (ue_cont_res_id) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* + if (first_element>0) { + mac_header_ptr->E = 1; + /* printf("[eNB][MAC] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } - else { - first_element=1; - } + */ + mac_header_ptr++; + } + else { + first_element=1; + } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = UE_CONT_RES; - last_size=1; - - LOG_T(MAC,"[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", - ue_cont_res_id[0], - ue_cont_res_id[1], - ue_cont_res_id[2], - ue_cont_res_id[3], - ue_cont_res_id[4], - ue_cont_res_id[5]); - - memcpy(ce_ptr,ue_cont_res_id,6); - ce_ptr+=6; - // msg("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = UE_CONT_RES; + last_size=1; + + LOG_T(MAC,"[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", + ue_cont_res_id[0], + ue_cont_res_id[1], + ue_cont_res_id[2], + ue_cont_res_id[3], + ue_cont_res_id[4], + ue_cont_res_id[5]); + + memcpy(ce_ptr,ue_cont_res_id,6); + ce_ptr+=6; + // msg("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); } //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); for (i=0;i0) { - mac_header_ptr->E = 1; - /*msg("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + if (first_element>0) { + mac_header_ptr->E = 1; + /*msg("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr+=last_size; - //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - } - else { - first_element=1; - } - if (sdu_lengths[i] < 128) { - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; - last_size=2; - } - else { - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB = ((unsigned short) sdu_lengths[i]>>8)&0x7f; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB = (unsigned short) sdu_lengths[i]&0xff; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->padding = 0x00; - last_size=3; + */ + mac_header_ptr+=last_size; + //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + } + else { + first_element=1; + } + if (sdu_lengths[i] < 128) { + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; + last_size=2; + } + else { + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB = ((unsigned short) sdu_lengths[i]>>8)&0x7f; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB = (unsigned short) sdu_lengths[i]&0xff; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->padding = 0x00; + last_size=3; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[eNB] generate long sdu, size %x (MSB %x, LSB %x)\n", - sdu_lengths[i], - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB, - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB); + LOG_D(MAC,"[eNB] generate long sdu, size %x (MSB %x, LSB %x)\n", + sdu_lengths[i], + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB, + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB); #endif - } + } } /* printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - + printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, @@ -808,27 +811,27 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, else printf("F = 1, sdu len (L field) %d\n",(((SCH_SUBHEADER_LONG*)mac_header_ptr)->L)); } - */ + */ if (post_padding>0) {// we have lots of padding at the end of the packet - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - // add a padding element - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - mac_header_ptr++; + mac_header_ptr->E = 1; + mac_header_ptr+=last_size; + // add a padding element + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + mac_header_ptr++; } else { // no end of packet padding - // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) - mac_header_ptr++; + // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) + mac_header_ptr++; } //msg("After subheaders %d\n",(u8*)mac_header_ptr - mac_header); - + if ((ce_ptr-mac_header_control_elements) > 0) { - // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); - memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); - mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); + // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); + memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); + mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); } //msg("After CEs %d\n",(u8*)mac_header_ptr - mac_header); @@ -895,7 +898,7 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, } // Create the MSI MAC Control Element here } - + // SUBHEADER for MAC SDU (MCCH+MTCHs) for (i=0;i0) { @@ -947,15 +950,15 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, return((unsigned char*)mac_header_ptr - mac_header); } #endif -*/ + */ void add_common_dci(DCI_PDU *DCI_pdu, - void *pdu, - u16 rnti, - unsigned char dci_size_bytes, - unsigned char aggregation, - unsigned char dci_size_bits, - unsigned char dci_fmt, - u8 ra_flag) { + void *pdu, + rnti_t rnti, + unsigned char dci_size_bytes, + unsigned char aggregation, + unsigned char dci_size_bits, + unsigned char dci_fmt, + u8 ra_flag) { memcpy(&DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].dci_pdu[0],pdu,dci_size_bytes); DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].dci_length = dci_size_bits; @@ -968,7 +971,7 @@ void add_common_dci(DCI_PDU *DCI_pdu, DCI_pdu->Num_common_dci++; } -void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,u16 rnti,unsigned char dci_size_bytes,unsigned char aggregation,unsigned char dci_size_bits,unsigned char dci_fmt,u8 ra_flag) { +void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_size_bytes,unsigned char aggregation,unsigned char dci_size_bits,unsigned char dci_fmt,u8 ra_flag) { memcpy(&DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].dci_pdu[0],pdu,dci_size_bytes); DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].dci_length = dci_size_bits; @@ -980,134 +983,142 @@ void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,u16 rnti,unsigned char dci_size_ DCI_pdu->Num_ue_spec_dci++; } -void schedule_SI(unsigned char Mod_id,u32 frame, unsigned char *nprb,unsigned int *nCCE) { +void schedule_SI(module_id_t module_idP,frame_t frameP, unsigned char *nprb,unsigned int *nCCE) { unsigned char bcch_sdu_length; int mcs = -1; - void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[Mod_id].BCCH_alloc_pdu; - - bcch_sdu_length = mac_rrc_data_req(Mod_id, - frame, - BCCH,1, - &eNB_mac_inst[Mod_id].BCCH_pdu.payload[0], - 1, - Mod_id, - 0); // not used in this case + void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[module_idP].BCCH_alloc_pdu; + + bcch_sdu_length = mac_rrc_data_req(module_idP, + frameP, + BCCH,1, + &eNB_mac_inst[module_idP].BCCH_pdu.payload[0], + 1, + module_idP, + 0); // not used in this case if (bcch_sdu_length > 0) { - LOG_D(MAC,"[eNB %d] Frame %d : BCCH->DLSCH, Received %d bytes \n",Mod_id,frame,bcch_sdu_length); - - - if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) - mcs=0; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) - mcs=1; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(2,3))) - mcs=2; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(3,3))) - mcs=3; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(4,3))) - mcs=4; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(5,3))) - mcs=5; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(6,3))) - mcs=6; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(7,3))) - mcs=7; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(8,3))) - mcs=8; - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - break; + LOG_D(MAC,"[eNB %d] Frame %d : BCCH->DLSCH, Received %d bytes \n",module_idP,frameP,bcch_sdu_length); + + + if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) + mcs=0; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) + mcs=1; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(2,3))) + mcs=2; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(3,3))) + mcs=3; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(4,3))) + mcs=4; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(5,3))) + mcs=5; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(6,3))) + mcs=6; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(7,3))) + mcs=7; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(8,3))) + mcs=8; + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + + } } - } - else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - case 25: - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - case 50: - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - case 100: - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - break; - + else { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 25: + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 50: + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 100: + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + + } } - } #if defined(USER_MODE) && defined(OAI_EMU) - if (oai_emulation.info.opt_enabled) - trace_pdu(1, &eNB_mac_inst[Mod_id].BCCH_pdu.payload[0], bcch_sdu_length, - 0xffff, 4, 0xffff, eNB_mac_inst[Mod_id].subframe, 0, 0); - LOG_D(OPT,"[eNB %d][BCH] Frame %d trace pdu for rnti %x with size %d\n", - Mod_id, frame, 0xffff, bcch_sdu_length); + if (oai_emulation.info.opt_enabled) { + trace_pdu(1, + &eNB_mac_inst[module_idP].BCCH_pdu.payload[0], + bcch_sdu_length, + 0xffff, + 4, + 0xffff, + eNB_mac_inst[module_idP].subframe, + 0, + 0); + } + LOG_D(OPT,"[eNB %d][BCH] Frame %d trace pdu for rnti %x with size %d\n", + module_idP, frameP, 0xffff, bcch_sdu_length); #endif - if (mac_xface->lte_frame_parms->frame_type == TDD) { - LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (TDD) for SI %d bytes (mcs %d, rb 3, TBS %d)\n", - frame, - bcch_sdu_length, - mcs, - mac_xface->get_TBS_DL(mcs,3)); - } - else { - LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (FDD) for SI %d bytes (mcs %d, rb 3, TBS %d)\n", - frame, - bcch_sdu_length, - mcs, - mac_xface->get_TBS_DL(mcs,3)); - } - eNB_mac_inst[Mod_id].bcch_active=1; - *nprb=3; - *nCCE=4; - return; + if (mac_xface->lte_frame_parms->frame_type == TDD) { + LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (TDD) for SI %d bytes (mcs %d, rb 3, TBS %d)\n", + frameP, + bcch_sdu_length, + mcs, + mac_xface->get_TBS_DL(mcs,3)); + } + else { + LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (FDD) for SI %d bytes (mcs %d, rb 3, TBS %d)\n", + frameP, + bcch_sdu_length, + mcs, + mac_xface->get_TBS_DL(mcs,3)); + } + eNB_mac_inst[module_idP].bcch_active=1; + *nprb=3; + *nCCE=4; + return; } - eNB_mac_inst[Mod_id].bcch_active=0; + eNB_mac_inst[module_idP].bcch_active=0; *nprb=0; - *nCCE=0; - //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame); + *nCCE=0; + //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",module_idP,frameP); } #ifdef Rel10 -s8 get_mbsfn_sf_alloction (unsigned char Mod_id, u8 mbsfn_sync_area){ +s8 get_mbsfn_sf_alloction (module_id_t module_idP, u8 mbsfn_sync_area){ // currently there is one-to-one mapping between sf allocation pattern and sync area if (mbsfn_sync_area > MAX_MBSFN_AREA){ - LOG_W(MAC,"[eNB %d] MBSFN synchronization area %d out of range\n ", Mod_id, mbsfn_sync_area); - return -1; + LOG_W(MAC,"[eNB %d] MBSFN synchronization area %d out of range\n ", module_idP, mbsfn_sync_area); + return -1; } - else if (eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) - return mbsfn_sync_area; + else if (eNB_mac_inst[module_idP].mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) + return mbsfn_sync_area; else { - LOG_W(MAC,"[eNB %d] MBSFN Subframe Config pattern %d not found \n ", Mod_id, mbsfn_sync_area); - return -1; + LOG_W(MAC,"[eNB %d] MBSFN Subframe Config pattern %d not found \n ", module_idP, mbsfn_sync_area); + return -1; } } -int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { +int schedule_MBMS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { int mcch_flag=0,mtch_flag=0, msi_flag=0; - int mbsfn_period =0;// 1<<(eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - int mcch_period = 0;//32<<(eNB_mac_inst[Mod_id].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - int mch_scheduling_period = 8<<(eNB_mac_inst[Mod_id].pmch_Config[0]->mch_SchedulingPeriod_r9); + int mbsfn_period =0;// 1<<(eNB_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); + int mcch_period = 0;//32<<(eNB_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + int mch_scheduling_period = 8<<(eNB_mac_inst[module_idP].pmch_Config[0]->mch_SchedulingPeriod_r9); unsigned char mcch_sdu_length; - unsigned char header_len_mcch=0,header_len_msi=0,header_len_mtch=0, header_len_mtch_temp=0, header_len_mcch_temp=0, header_len_msi_temp=0; + unsigned char header_len_mcch=0,header_len_msi=0,header_len_mtch=0, header_len_mtch_temp=0, header_len_mcch_temp=0, header_len_msi_temp=0; int ii=0, msi_pos=0; int mcch_mcs = -1; u16 TBS,j,padding=0,post_padding=0; @@ -1118,465 +1129,465 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { 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 - eNB_mac_inst[Mod_id].MCH_pdu.Pdu_size=0; + eNB_mac_inst[module_idP].MCH_pdu.Pdu_size=0; - for (i=0; - i< eNB_mac_inst[Mod_id].num_active_mbsfn_area; - i++ ){ - // assume, that there is always a mapping - if ((j=get_mbsfn_sf_alloction(Mod_id,i)) == -1) - return 0; - - mbsfn_period = 1<<(eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->radioframeAllocationPeriod); - mcch_period = 32<<(eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - msi_pos=0; ii=0; - LOG_D(MAC,"[eNB %d] Frame %d subframe %d : Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d)\n", - Mod_id,frame, subframe,i,eNB_mac_inst[Mod_id].num_active_mbsfn_area, - j,eNB_mac_inst[Mod_id].num_sf_allocation_pattern,mbsfn_period,mcch_period); - - - switch (eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { - case 0: - mcch_mcs = 2; - break; - case 1: - mcch_mcs = 7; - break; - case 2: - mcch_mcs = 13; - break; - case 3: - mcch_mcs = 19; - break; - } - - // 1st: Check the MBSFN subframes from SIB2 info (SF allocation pattern i, max 8 non-overlapping patterns exist) - if (frame % mbsfn_period == eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset){ // MBSFN frame - if (eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frame format - - // Find the first subframe in this MCH to transmit MSI - if (frame % mch_scheduling_period == eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset ) { - while (ii == 0) { - ii = eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); - msi_pos++; - } - LOG_D(MAC,"[eNB %d] Frame %d subframe %d : sync area %d sf allocation pattern %d sf alloc %x msi pos is %d \n", Mod_id,frame, subframe,i,j,eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0], msi_pos); - } - - // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 - switch (subframe) { - case 1: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { - if (msi_pos == 1) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 2: - if (mac_xface->lte_frame_parms->frame_type == FDD){ - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { - if (msi_pos == 2) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 3: - if (mac_xface->lte_frame_parms->frame_type == TDD){// TDD - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { - if (msi_pos == 1) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - else {// FDD - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { - if (msi_pos == 3) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 4: - if (mac_xface->lte_frame_parms->frame_type == TDD){ - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { - if (msi_pos == 2) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 6: - if (mac_xface->lte_frame_parms->frame_type == FDD){ - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { - if (msi_pos == 4) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 7: - if (mac_xface->lte_frame_parms->frame_type == TDD){ // TDD - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { - if (msi_pos == 3) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - else {// FDD - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { - if (msi_pos == 5) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 8: - if (mac_xface->lte_frame_parms->frame_type == TDD){ //TDD - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { - if (msi_pos == 4) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - else{ // FDD - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { - if (msi_pos == 6) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 9: - if (mac_xface->lte_frame_parms->frame_type == TDD){ - if ((eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { - if (msi_pos == 5) - msi_flag = 1; - if ( (frame % mcch_period == eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - }// end switch - // sf allocation is non-overlapping - if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)){ - LOG_D(MAC,"[eNB %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", - Mod_id, frame, subframe,i,j,msi_flag,mcch_flag,mtch_flag); - break; - } + for (i=0; + i< eNB_mac_inst[module_idP].num_active_mbsfn_area; + i++ ){ + // assume, that there is always a mapping + if ((j=get_mbsfn_sf_alloction(module_idP,i)) == -1) + return 0; + + mbsfn_period = 1<<(eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationPeriod); + mcch_period = 32<<(eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + msi_pos=0; ii=0; + LOG_D(MAC,"[eNB %d] Frame %d subframeP %d : Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d)\n", + module_idP,frameP, subframeP,i,eNB_mac_inst[module_idP].num_active_mbsfn_area, + j,eNB_mac_inst[module_idP].num_sf_allocation_pattern,mbsfn_period,mcch_period); + + + switch (eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { + case 0: + mcch_mcs = 2; + break; + case 1: + mcch_mcs = 7; + break; + case 2: + mcch_mcs = 13; + break; + case 3: + mcch_mcs = 19; + break; } - else {// four-frame format + + // 1st: Check the MBSFN subframes from SIB2 info (SF allocation pattern i, max 8 non-overlapping patterns exist) + if (frameP % mbsfn_period == eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset){ // MBSFN frameP + if (eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frameP format + + // Find the first subframeP in this MCH to transmit MSI + if (frameP % mch_scheduling_period == eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset ) { + while (ii == 0) { + ii = eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); + msi_pos++; + } + LOG_D(MAC,"[eNB %d] Frame %d subframeP %d : sync area %d sf allocation pattern %d sf alloc %x msi pos is %d \n", module_idP,frameP, subframeP,i,j,eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0], msi_pos); + } + + // Check if the subframeP is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 + switch (subframeP) { + case 1: + if (mac_xface->lte_frame_parms->frame_type == FDD) { + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { + if (msi_pos == 1) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 2: + if (mac_xface->lte_frame_parms->frame_type == FDD){ + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { + if (msi_pos == 2) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 3: + if (mac_xface->lte_frame_parms->frame_type == TDD){// TDD + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { + if (msi_pos == 1) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + else {// FDD + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { + if (msi_pos == 3) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 4: + if (mac_xface->lte_frame_parms->frame_type == TDD){ + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { + if (msi_pos == 2) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 6: + if (mac_xface->lte_frame_parms->frame_type == FDD){ + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { + if (msi_pos == 4) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 7: + if (mac_xface->lte_frame_parms->frame_type == TDD){ // TDD + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { + if (msi_pos == 3) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + else {// FDD + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { + if (msi_pos == 5) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 8: + if (mac_xface->lte_frame_parms->frame_type == TDD){ //TDD + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { + if (msi_pos == 4) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + else{ // FDD + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { + if (msi_pos == 6) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 9: + if (mac_xface->lte_frame_parms->frame_type == TDD){ + if ((eNB_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { + if (msi_pos == 5) + msi_flag = 1; + if ( (frameP % mcch_period == eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((eNB_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + }// end switch + // sf allocation is non-overlapping + if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)){ + LOG_D(MAC,"[eNB %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", + module_idP, frameP, subframeP,i,j,msi_flag,mcch_flag,mtch_flag); + break; + } + } + else {// four-frameP format + } } - } - } // end of for loop - eNB_mac_inst[Mod_id].msi_active=0; - eNB_mac_inst[Mod_id].mcch_active=0; - eNB_mac_inst[Mod_id].mtch_active=0; - // Calculate the mcs + } // end of for loop + eNB_mac_inst[module_idP].msi_active=0; + eNB_mac_inst[module_idP].mcch_active=0; + eNB_mac_inst[module_idP].mtch_active=0; + // Calculate the mcs if ((msi_flag==1) || (mcch_flag==1)) { - eNB_mac_inst[Mod_id].MCH_pdu.mcs = mcch_mcs; + eNB_mac_inst[module_idP].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; + else if (mtch_flag == 1) { // only MTCH in this subframeP + eNB_mac_inst[module_idP].MCH_pdu.mcs = eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; } - - + + // 2nd: Create MSI, get MCCH from RRC and MTCHs from RLC - - // there is MSI (MCH Scheduling Info) + + // there is MSI (MCH Scheduling Info) if (msi_flag == 1) { - // Create MSI here - u16 msi_control_element[29], *msi_ptr; - - msi_ptr = &msi_control_element[0]; - ((MSI_ELEMENT *) msi_ptr)->lcid = MCCH_LCHANID; //MCCH - if (mcch_flag==1) { - ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; - ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0; - } - else { // no mcch for this MSP - ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0x7;// stop value is 2047 - ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xff; - } - msi_ptr+= sizeof(MSI_ELEMENT); - - //Header for MTCHs - num_mtch = eNB_mac_inst[Mod_id].mbms_SessionList[0]->list.count; - for (k=0;klcid = eNB_mac_inst[Mod_id].mbms_SessionList[0]->list.array[k]->logicalChannelIdentity_r9;//mtch_lcid; - ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; // last subframe of this mtch (only one mtch now) - ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xB; - msi_ptr+=sizeof(MSI_ELEMENT); - } - msi_length = msi_ptr-msi_control_element; - if (msi_length<128) - header_len_msi = 2; - else - header_len_msi = 3; - - 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); - // Store MSI data to mch_buffer[0] - memcpy((char *)&mch_buffer[sdu_length_total], - msi_control_element, - msi_length); - - sdu_lcids[num_sdus] = MCH_SCHDL_INFO; - sdu_lengths[num_sdus] = msi_length; - sdu_length_total += sdu_lengths[num_sdus]; - LOG_I(MAC,"[eNB %d] Create %d bytes for MSI\n",Mod_id,sdu_lengths[num_sdus]); - num_sdus++; - eNB_mac_inst[Mod_id].msi_active=1; + // Create MSI here + u16 msi_control_element[29], *msi_ptr; + + msi_ptr = &msi_control_element[0]; + ((MSI_ELEMENT *) msi_ptr)->lcid = MCCH_LCHANID; //MCCH + if (mcch_flag==1) { + ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; + ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0; + } + else { // no mcch for this MSP + ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0x7;// stop value is 2047 + ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xff; + } + msi_ptr+= sizeof(MSI_ELEMENT); + + //Header for MTCHs + num_mtch = eNB_mac_inst[module_idP].mbms_SessionList[0]->list.count; + for (k=0;klcid = eNB_mac_inst[module_idP].mbms_SessionList[0]->list.array[k]->logicalChannelIdentity_r9;//mtch_lcid; + ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; // last subframeP of this mtch (only one mtch now) + ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xB; + msi_ptr+=sizeof(MSI_ELEMENT); + } + msi_length = msi_ptr-msi_control_element; + if (msi_length<128) + header_len_msi = 2; + else + header_len_msi = 3; + + LOG_D(MAC,"[eNB %d] Frame %d : MSI->MCH, length of MSI is %d bytes \n",module_idP,frameP,msi_length); + //LOG_D(MAC,"Scheduler: MSI is transmitted in this subframeP \n" ); + + // LOG_D(MAC,"Scheduler: MSI length is %d bytes\n",msi_length); + // Store MSI data to mch_buffer[0] + memcpy((char *)&mch_buffer[sdu_length_total], + msi_control_element, + msi_length); + + sdu_lcids[num_sdus] = MCH_SCHDL_INFO; + sdu_lengths[num_sdus] = msi_length; + sdu_length_total += sdu_lengths[num_sdus]; + LOG_I(MAC,"[eNB %d] Create %d bytes for MSI\n",module_idP,sdu_lengths[num_sdus]); + num_sdus++; + eNB_mac_inst[module_idP].msi_active=1; } // there is MCCH if (mcch_flag == 1) { - LOG_D(MAC,"[eNB %d] Frame %d Subframe %d: Schedule MCCH MESSAGE (area %d, sfAlloc %d)\n", - Mod_id,frame, subframe, i, j); - - mcch_sdu_length = mac_rrc_data_req(Mod_id, - frame, - MCCH,1, - &eNB_mac_inst[Mod_id].MCCH_pdu.payload[0], - 1,// this is eNB - Mod_id, // index - i); // this is the mbsfn sync area index - - if (mcch_sdu_length > 0) { - LOG_D(MAC,"[eNB %d] Frame %d subframe %d : MCCH->MCH, Received %d bytes from RRC \n",Mod_id,frame,subframe,mcch_sdu_length); - - header_len_mcch = 2; - if (mac_xface->lte_frame_parms->frame_type == TDD) { - LOG_D(MAC,"[eNB %d] Frame %d subframe %d: Scheduling MCCH->MCH (TDD) for MCCH message %d bytes (mcs %d )\n", - Mod_id, - frame,subframe, - mcch_sdu_length, - mcch_mcs); + LOG_D(MAC,"[eNB %d] Frame %d Subframe %d: Schedule MCCH MESSAGE (area %d, sfAlloc %d)\n", + module_idP,frameP, subframeP, i, j); + + mcch_sdu_length = mac_rrc_data_req(module_idP, + frameP, + MCCH,1, + &eNB_mac_inst[module_idP].MCCH_pdu.payload[0], + 1,// this is eNB + module_idP, // index + i); // this is the mbsfn sync area index + + if (mcch_sdu_length > 0) { + LOG_D(MAC,"[eNB %d] Frame %d subframeP %d : MCCH->MCH, Received %d bytes from RRC \n",module_idP,frameP,subframeP,mcch_sdu_length); + + header_len_mcch = 2; + if (mac_xface->lte_frame_parms->frame_type == TDD) { + LOG_D(MAC,"[eNB %d] Frame %d subframeP %d: Scheduling MCCH->MCH (TDD) for MCCH message %d bytes (mcs %d )\n", + module_idP, + frameP,subframeP, + mcch_sdu_length, + mcch_mcs); + } + else { + LOG_I(MAC,"[eNB %d] Frame %d subframeP %d: Scheduling MCCH->MCH (FDD) for MCCH message %d bytes (mcs %d)\n", + module_idP, + frameP, subframeP, + mcch_sdu_length, + mcch_mcs); + } + eNB_mac_inst[module_idP].mcch_active=1; + + memcpy((char *)&mch_buffer[sdu_length_total], + &eNB_mac_inst[module_idP].MCCH_pdu.payload[0], + mcch_sdu_length); + sdu_lcids[num_sdus] = MCCH_LCHANID; + sdu_lengths[num_sdus] = mcch_sdu_length; + if (sdu_lengths[num_sdus]>128) + header_len_mcch = 3; + sdu_length_total += sdu_lengths[num_sdus]; + LOG_D(MAC,"[eNB %d] Got %d bytes for MCCH from RRC \n",module_idP,sdu_lengths[num_sdus]); + num_sdus++; } - else { - LOG_I(MAC,"[eNB %d] Frame %d subframe %d: Scheduling MCCH->MCH (FDD) for MCCH message %d bytes (mcs %d)\n", - Mod_id, - frame, subframe, - mcch_sdu_length, - mcch_mcs); - } - eNB_mac_inst[Mod_id].mcch_active=1; - - memcpy((char *)&mch_buffer[sdu_length_total], - &eNB_mac_inst[Mod_id].MCCH_pdu.payload[0], - mcch_sdu_length); - sdu_lcids[num_sdus] = MCCH_LCHANID; - sdu_lengths[num_sdus] = mcch_sdu_length; - if (sdu_lengths[num_sdus]>128) - header_len_mcch = 3; - sdu_length_total += sdu_lengths[num_sdus]; - LOG_D(MAC,"[eNB %d] Got %d bytes for MCCH from RRC \n",Mod_id,sdu_lengths[num_sdus]); - num_sdus++; - } } - TBS = mac_xface->get_TBS_DL(eNB_mac_inst[Mod_id].MCH_pdu.mcs, mac_xface->lte_frame_parms->N_RB_DL); -#ifdef Rel10 - // do not let mcch and mtch multiplexing when relaying is active - // for sync area 1, so not transmit data - //if ((i == 0) && ((eNB_mac_inst[Mod_id].MBMS_flag != multicast_relay) || (eNB_mac_inst[Mod_id].mcch_active==0))) { -#endif - // there is MTCHs, loop if there are more than 1 + TBS = mac_xface->get_TBS_DL(eNB_mac_inst[module_idP].MCH_pdu.mcs, mac_xface->lte_frame_parms->N_RB_DL); +#ifdef Rel10 + // do not let mcch and mtch multiplexing when relaying is active + // for sync area 1, so not transmit data + //if ((i == 0) && ((eNB_mac_inst[module_idP].MBMS_flag != multicast_relay) || (eNB_mac_inst[module_idP].mcch_active==0))) { +#endif + // there is MTCHs, loop if there are more than 1 if (mtch_flag == 1) { - // Calculate TBS - /* if ((msi_flag==1) || (mcch_flag==1)) { + // 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); + else { // only MTCH in this subframeP + TBS = mac_xface->get_TBS(eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9, mac_xface->lte_frame_parms->N_RB_DL); } - */ - - // get MTCH data from RLC (like for DTCH) - LOG_D(MAC,"[eNB %d] Frame %d subframe %d: Schedule MTCH (area %d, sfAlloc %d)\n",Mod_id,frame,subframe,i,j); - - 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); - - rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_YES,MTCH+ (maxDRB + 3) * MAX_MOBILES_PER_RG, - TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); - //printf("frame %d, subframe %d, rlc_status.bytes_in_buffer is %d\n",frame,subframe, rlc_status.bytes_in_buffer); - - if (rlc_status.bytes_in_buffer >0) { - LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", - Mod_id,frame,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch); - - sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame, RLC_MBMS_YES, - MTCH + (maxDRB + 3) * MAX_MOBILES_PER_RG, - (char*)&mch_buffer[sdu_length_total]); - //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]); - LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] Got %d bytes for MTCH %d\n",Mod_id,sdu_lengths[num_sdus],MTCH); - eNB_mac_inst[Mod_id].mtch_active=1; - sdu_lcids[num_sdus] = MTCH; - sdu_length_total += sdu_lengths[num_sdus]; - if (sdu_lengths[num_sdus] < 128) - header_len_mtch = 2; - num_sdus++; - } - else { - header_len_mtch = 0; - } + */ + + // get MTCH data from RLC (like for DTCH) + LOG_D(MAC,"[eNB %d] Frame %d subframeP %d: Schedule MTCH (area %d, sfAlloc %d)\n",module_idP,frameP,subframeP,i,j); + + header_len_mtch = 3; + LOG_D(MAC,"[eNB %d], Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", + module_idP,frameP,MTCH,TBS, + TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); + + rlc_status = mac_rlc_status_ind(module_idP,frameP,1,RLC_MBMS_YES,MTCH+ (maxDRB + 3) * MAX_MOBILES_PER_RG, + TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); + //printf("frameP %d, subframeP %d, rlc_status.bytes_in_buffer is %d\n",frameP,subframeP, rlc_status.bytes_in_buffer); + + if (rlc_status.bytes_in_buffer >0) { + LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", + module_idP,frameP,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch); + + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,frameP, 1, RLC_MBMS_YES, + MTCH + (maxDRB + 3) * MAX_MOBILES_PER_RG, + (char*)&mch_buffer[sdu_length_total]); + //sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,frameP, RLC_MBMS_NO, MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), (char*)&mch_buffer[sdu_length_total]); + LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] Got %d bytes for MTCH %d\n",module_idP,sdu_lengths[num_sdus],MTCH); + eNB_mac_inst[module_idP].mtch_active=1; + sdu_lcids[num_sdus] = MTCH; + sdu_length_total += sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) + header_len_mtch = 2; + num_sdus++; + } + else { + header_len_mtch = 0; + } } #ifdef Rel10 // } #endif // FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs if ((sdu_length_total + header_len_msi + header_len_mcch + header_len_mtch) >0) { - // Adjust the last subheader - /* if ((msi_flag==1) || (mcch_flag==1)) { - eNB_mac_inst[Mod_id].MCH_pdu.mcs = mcch_mcs; + // Adjust the last subheader + /* if ((msi_flag==1) || (mcch_flag==1)) { + eNB_mac_inst[module_idP].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; + else if (mtch_flag == 1) { // only MTCH in this subframeP + eNB_mac_inst[module_idP].MCH_pdu.mcs = eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; } - */ - header_len_mtch_temp = header_len_mtch; - header_len_mcch_temp = header_len_mcch; - header_len_msi_temp = header_len_msi; - if (header_len_mtch>0) - header_len_mtch=1; // remove Length field in the subheader for the last PDU - else if (header_len_mcch>0) - header_len_mcch=1; - else header_len_msi=1; - // Calculate the padding - if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total) <= 2) { - padding = (TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total); - post_padding = 0; - } - else {// using post_padding, give back the Length field of subheader for the last PDU - padding = 0; + */ + header_len_mtch_temp = header_len_mtch; + header_len_mcch_temp = header_len_mcch; + header_len_msi_temp = header_len_msi; if (header_len_mtch>0) - header_len_mtch = header_len_mtch_temp; + header_len_mtch=1; // remove Length field in the subheader for the last PDU else if (header_len_mcch>0) - header_len_mcch = header_len_mcch_temp; - else header_len_msi = header_len_msi_temp; - post_padding = TBS - sdu_length_total - header_len_msi - header_len_mcch - header_len_mtch; - } - // Generate the MAC Header for MCH - // here we use the function for DLSCH because DLSCH & MCH have the same Header structure - offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[Mod_id].MCH_pdu.payload, - num_sdus, - sdu_lengths, - sdu_lcids, - 255, // no drx - 0, // no timing advance - NULL, // no contention res id - padding, - post_padding); - - eNB_mac_inst[Mod_id].MCH_pdu.Pdu_size=TBS; - eNB_mac_inst[Mod_id].MCH_pdu.sync_area=i; - eNB_mac_inst[Mod_id].MCH_pdu.msi_active= eNB_mac_inst[Mod_id].msi_active; - eNB_mac_inst[Mod_id].MCH_pdu.mcch_active= eNB_mac_inst[Mod_id].mcch_active; - eNB_mac_inst[Mod_id].MCH_pdu.mtch_active= eNB_mac_inst[Mod_id].mtch_active; - LOG_D(MAC," MCS for this sf is %d (mcch active %d, mtch active %d)\n", eNB_mac_inst[Mod_id].MCH_pdu.mcs, - eNB_mac_inst[Mod_id].MCH_pdu.mcch_active,eNB_mac_inst[Mod_id].MCH_pdu.mtch_active ); - 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); - // copy SDU to mch_pdu after the MAC Header - memcpy(&eNB_mac_inst[Mod_id].MCH_pdu.payload[offset],mch_buffer,sdu_length_total); - // filling remainder of MCH with random data if necessery - 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); - + header_len_mcch=1; + else header_len_msi=1; + // Calculate the padding + if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total) <= 2) { + padding = (TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total); + post_padding = 0; + } + else {// using post_padding, give back the Length field of subheader for the last PDU + padding = 0; + if (header_len_mtch>0) + header_len_mtch = header_len_mtch_temp; + else if (header_len_mcch>0) + header_len_mcch = header_len_mcch_temp; + else header_len_msi = header_len_msi_temp; + post_padding = TBS - sdu_length_total - header_len_msi - header_len_mcch - header_len_mtch; + } + // Generate the MAC Header for MCH + // here we use the function for DLSCH because DLSCH & MCH have the same Header structure + offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[module_idP].MCH_pdu.payload, + num_sdus, + sdu_lengths, + sdu_lcids, + 255, // no drx + 0, // no timing advance + NULL, // no contention res id + padding, + post_padding); + + eNB_mac_inst[module_idP].MCH_pdu.Pdu_size=TBS; + eNB_mac_inst[module_idP].MCH_pdu.sync_area=i; + eNB_mac_inst[module_idP].MCH_pdu.msi_active= eNB_mac_inst[module_idP].msi_active; + eNB_mac_inst[module_idP].MCH_pdu.mcch_active= eNB_mac_inst[module_idP].mcch_active; + eNB_mac_inst[module_idP].MCH_pdu.mtch_active= eNB_mac_inst[module_idP].mtch_active; + LOG_D(MAC," MCS for this sf is %d (mcch active %d, mtch active %d)\n", eNB_mac_inst[module_idP].MCH_pdu.mcs, + eNB_mac_inst[module_idP].MCH_pdu.mcch_active,eNB_mac_inst[module_idP].MCH_pdu.mtch_active ); + 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", + module_idP,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,padding,post_padding,eNB_mac_inst[module_idP].MCH_pdu.mcs,TBS,header_len_mtch, header_len_mcch, header_len_msi); + // copy SDU to mch_pdu after the MAC Header + memcpy(&eNB_mac_inst[module_idP].MCH_pdu.payload[offset],mch_buffer,sdu_length_total); + // filling remainder of MCH with random data if necessery + for (j=0;j<(TBS-sdu_length_total-offset);j++) + eNB_mac_inst[module_idP].MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff); + #if defined(USER_MODE) && defined(OAI_EMU) - /* Tracing of PDU is done on UE side */ - if (oai_emulation.info.opt_enabled) - trace_pdu(1, (uint8_t *)eNB_mac_inst[Mod_id].MCH_pdu.payload, - TBS, Mod_id, 6, 0xffff, // M_RNTI = 6 in wirehsark - eNB_mac_inst[Mod_id].subframe,0,0); - LOG_D(OPT,"[eNB %d][MCH] Frame %d : MAC PDU with size %d\n", - Mod_id, frame, TBS); + /* Tracing of PDU is done on UE side */ + if (oai_emulation.info.opt_enabled) + trace_pdu(1, (uint8_t *)eNB_mac_inst[module_idP].MCH_pdu.payload, + TBS, module_idP, 6, 0xffff, // M_RNTI = 6 in wirehsark + eNB_mac_inst[module_idP].subframeP,0,0); + LOG_D(OPT,"[eNB %d][MCH] Frame %d : MAC PDU with size %d\n", + module_idP, frameP, TBS); #endif -/* + /* for (j=0;jmacphy_exit("[MAC][eNB Scheduler] CCCH not allocated\n"); - else { - //msg("[MAC][eNB %d] Frame %d, subframe %d: got %d bytes from RRC\n",Mod_id,frame, subframe,rrc_sdu_length); - } - } - - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: UE_id %d, Is_rrc_registered %d, rrc_sdu_length %d\n", - Mod_id,frame, subframe,UE_id, Is_rrc_registered,rrc_sdu_length); - - if (rrc_sdu_length>0) { - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: Generating Msg4 with RRC Piggyback (RA proc %d, RNTI %x)\n", - Mod_id,frame, subframe,i,RA_template[i].rnti); - - //msg("[MAC][eNB %d][RAPROC] Frame %d, subframe %d: Received %d bytes for Msg4: \n",Mod_id,frame,subframe,rrc_sdu_length); - // for (j=0;jlte_frame_parms->frame_type == TDD) { - - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - case 25: - - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - case 50: - - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - case 100: - - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - } - } - else { // FDD DCI - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - case 25: - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - case 50: - ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - case 100: - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - break; - } - } - RA_template[i].generate_Msg4=0; - RA_template[i].generate_Msg4_dci=1; - RA_template[i].wait_ack_Msg4=1; - RA_template[i].RA_active = 0; - lcid=0; - - if ((TBsize - rrc_sdu_length - msg4_header) <= 2) { - msg4_padding = TBsize - rrc_sdu_length - msg4_header; - msg4_post_padding = 0; - } - else { - msg4_padding = 0; - msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1; - } - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d subframe %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n", - Mod_id,frame,subframe,TBsize,rrc_sdu_length,msg4_header,msg4_padding,msg4_post_padding); - offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)UE_id][0].payload[0], - 1, //num_sdus - &rrc_sdu_length, // - &lcid, // sdu_lcid - 255, // no drx - 0, // no timing advance - RA_template[i].cont_res_id, // contention res id - msg4_padding, // no padding - msg4_post_padding); - - memcpy((void*)&eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)UE_id][0].payload[0][(unsigned char)offset], - &eNB_mac_inst[Mod_id].CCCH_pdu.payload[0], - rrc_sdu_length); + if (RA_template[i].RA_active == 1) { + + LOG_I(MAC,"[eNB %d][RAPROC] RA %d is active (generate RAR %d, generate_Msg4 %d, wait_ack_Msg4 %d, rnti %x)\n", + module_idP,i,RA_template[i].generate_rar,RA_template[i].generate_Msg4,RA_template[i].wait_ack_Msg4, RA_template[i].rnti); + + if (RA_template[i].generate_rar == 1) { + *nprb= (*nprb) + 3; + *nCCE = (*nCCE) + 4; + RA_template[i].Msg3_subframe=Msg3_subframe; + } + else if (RA_template[i].generate_Msg4 == 1) { + + // check for Msg4 Message + UE_id = find_UE_id(module_idP,RA_template[i].rnti); + if (Is_rrc_registered == 1) { + + // Get RRCConnectionSetup for Piggyback + rrc_sdu_length = mac_rrc_data_req(module_idP, + frameP, + CCCH,1, + &eNB_mac_inst[module_idP].CCCH_pdu.payload[0], + 1, + module_idP, + 0); // not used in this case + if (rrc_sdu_length == -1) + mac_xface->macphy_exit("[MAC][eNB Scheduler] CCCH not allocated\n"); + else { + //msg("[MAC][eNB %d] Frame %d, subframeP %d: got %d bytes from RRC\n",module_idP,frameP, subframeP,rrc_sdu_length); + } + } + + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: UE_id %d, Is_rrc_registered %d, rrc_sdu_length %d\n", + module_idP,frameP, subframeP,UE_id, Is_rrc_registered,rrc_sdu_length); + + if (rrc_sdu_length>0) { + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RA proc %d, RNTI %x)\n", + module_idP,frameP, subframeP,i,RA_template[i].rnti); + + //msg("[MAC][eNB %d][RAPROC] Frame %d, subframeP %d: Received %d bytes for Msg4: \n",module_idP,frameP,subframeP,rrc_sdu_length); + // for (j=0;jlte_frame_parms->frame_type == TDD) { + + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 25: + + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 50: + + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 100: + + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + } + } + else { // FDD DCI + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 25: + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 50: + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 100: + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + } + } + RA_template[i].generate_Msg4=0; + RA_template[i].generate_Msg4_dci=1; + RA_template[i].wait_ack_Msg4=1; + RA_template[i].RA_active = 0; + lcid=0; + + if ((TBsize - rrc_sdu_length - msg4_header) <= 2) { + msg4_padding = TBsize - rrc_sdu_length - msg4_header; + msg4_post_padding = 0; + } + else { + msg4_padding = 0; + msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1; + } + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d subframeP %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n", + module_idP,frameP,subframeP,TBsize,rrc_sdu_length,msg4_header,msg4_padding,msg4_post_padding); + offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[module_idP].DLSCH_pdu[(unsigned char)UE_id][0].payload[0], + 1, //num_sdus + &rrc_sdu_length, // + &lcid, // sdu_lcid + 255, // no drx + 0, // no timing advance + RA_template[i].cont_res_id, // contention res id + msg4_padding, // no padding + msg4_post_padding); + + memcpy((void*)&eNB_mac_inst[module_idP].DLSCH_pdu[(unsigned char)UE_id][0].payload[0][(unsigned char)offset], + &eNB_mac_inst[module_idP].CCCH_pdu.payload[0], + rrc_sdu_length); #if defined(USER_MODE) && defined(OAI_EMU) - if (oai_emulation.info.opt_enabled){ - trace_pdu(1, (uint8_t *)eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)UE_id][0].payload[0], - rrc_sdu_length, UE_id, 3, find_UE_RNTI(Mod_id, UE_id), - eNB_mac_inst[Mod_id].subframe,0,0); - LOG_D(OPT,"[eNB %d][DLSCH] Frame %d trace pdu for rnti %x with size %d\n", - Mod_id, frame, find_UE_RNTI(Mod_id,UE_id), rrc_sdu_length); - } + if (oai_emulation.info.opt_enabled){ + trace_pdu(1, (uint8_t *)eNB_mac_inst[module_idP].DLSCH_pdu[(unsigned char)UE_id][0].payload[0], + rrc_sdu_length, UE_id, 3, find_UE_RNTI(module_idP, UE_id), + eNB_mac_inst[module_idP].subframe,0,0); + LOG_D(OPT,"[eNB %d][DLSCH] Frame %d trace pdu for rnti %x with size %d\n", + module_idP, frameP, find_UE_RNTI(module_idP,UE_id), rrc_sdu_length); + } #endif - *nprb= (*nprb) + 3; - *nCCE = (*nCCE) + 4; - } - //try here - } - /* - else if (eNB_mac_inst[Mod_id].RA_template[i].wait_ack_Msg4==1) { + *nprb= (*nprb) + 3; + *nCCE = (*nCCE) + 4; + } + //try here + } + /* + else if (eNB_mac_inst[module_idP].RA_template[i].wait_ack_Msg4==1) { // check HARQ status and retransmit if necessary - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: Checking if Msg4 was acknowledged :\n",Mod_id,frame,subframe); + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Checking if Msg4 was acknowledged :\n",module_idP,frameP,subframeP); // Get candidate harq_pid from PHY - mac_xface->get_ue_active_harq_pid(Mod_id,eNB_mac_inst[Mod_id].RA_template[i].rnti,subframe,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(module_idP,eNB_mac_inst[module_idP].RA_template[i].rnti,subframeP,&harq_pid,&round,0); if (round>0) { - *nprb= (*nprb) + 3; - *nCCE = (*nCCE) + 4; + *nprb= (*nprb) + 3; + *nCCE = (*nCCE) + 4; } } - */ - } + */ + } } } // This has to be updated to include BSR information -u8 UE_is_to_be_scheduled(u8 Mod_id,u8 UE_id) { +u8 UE_is_to_be_scheduled(module_id_t module_idP,u8 UE_id) { - // LOG_D(MAC,"[eNB %d][PUSCH] Frame %d subframe %d Scheduling UE %d\n",Mod_id,rnti,frame,subframe, + // LOG_D(MAC,"[eNB %d][PUSCH] Frame %d subframeP %d Scheduling UE %d\n",module_idP,rnti,frameP,subframeP, // UE_id); - if ((eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0]>0) || - (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1]>0) || - (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2]>0) || - (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3]>0) || - (eNB_mac_inst[Mod_id].UE_template[UE_id].ul_SR>0)) // uplink scheduling request + if ((eNB_mac_inst[module_idP].UE_template[UE_id].bsr_info[LCGID0]>0) || + (eNB_mac_inst[module_idP].UE_template[UE_id].bsr_info[LCGID1]>0) || + (eNB_mac_inst[module_idP].UE_template[UE_id].bsr_info[LCGID2]>0) || + (eNB_mac_inst[module_idP].UE_template[UE_id].bsr_info[LCGID3]>0) || + (eNB_mac_inst[module_idP].UE_template[UE_id].ul_SR>0)) // uplink scheduling request return(1); - else + else return(0); } @@ -1957,8 +1968,8 @@ u32 bytes_to_bsr_index(s32 nbytes) { return(0); while ((iget_nCCE_max(Mod_id) - *nCCE; - + granted_UEs = find_ulgranted_UEs(module_idP); + nCCE_available = mac_xface->get_nCCE_max(module_idP) - *nCCE; + // UE data info; // check which UE has data to transmit // function to decide the scheduling // e.g. scheduling_rslt = Greedy(granted_UEs, nb_RB) // default function for default scheduling - // + // // output of scheduling, the UE numbers in RBs, where it is in the code??? - // check if RA (Msg3) is active in this subframe, if so skip the PRBs used for Msg3 + // check if RA (Msg3) is active in this subframeP, if so skip the PRBs used for Msg3 // Msg3 is using 1 PRB so we need to increase first_rb accordingly // not sure about the break (can there be more than 1 active RA procedure?) for (i=0;i 0) && (*nCCE == 0)) - schedule_ulsch_cba_rnti(Mod_id, cooperation_flag, frame, subframe, sched_subframe, granted_UEs, nCCE, &nCCE_available, &first_rb); + if ((eNB_mac_inst[module_idP].num_active_cba_groups > 0) && (*nCCE == 0)) + schedule_ulsch_cba_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, granted_UEs, nCCE, &nCCE_available, &first_rb); #endif - + } #ifdef CBA -void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, unsigned char subframe, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb){ +void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, unsigned char subframeP, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb){ DCI0_5MHz_TDD_1_6_t *ULSCH_dci_tdd16; DCI0_5MHz_FDD_t *ULSCH_dci_fdd; - DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; - + DCI_PDU *DCI_pdu= &eNB_mac_inst[module_idP].DCI_pdu; + u8 rb_table_index=0, aggregation=2; u32 rballoc; u8 cba_group, cba_resources; @@ -2022,572 +2033,583 @@ void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 fram u8 remaining_rbs= available_rbs; u8 allocated_rbs; // We compute the weight of each group and initialize some variables - for (cba_group=0;cba_group (1< 0) && eNB_mac_inst[Mod_id].cba_rnti[cba_group] != 0){ - // to be refined in case of : granted_UEs >> weight[cba_group]*available_rbs - required_rbs[cba_group] = (u8)ceil((weight[cba_group]*available_rbs)/granted_UEs); - - while (remaining_rbs < required_rbs[cba_group] ) - required_rbs[cba_group]--; - - /* + for (cba_group=0;cba_group (1< 0) && eNB_mac_inst[module_idP].cba_rnti[cba_group] != 0){ + // to be refined in case of : granted_UEs >> weight[cba_group]*available_rbs + required_rbs[cba_group] = (u8)ceil((weight[cba_group]*available_rbs)/granted_UEs); + + while (remaining_rbs < required_rbs[cba_group] ) + required_rbs[cba_group]--; + + /* while (rb_table[rb_table_index] < required_rbs[cba_group]) rb_table_index++; - + while (rb_table[rb_table_index] > remaining_rbs ) rb_table_index--; - + remaining_rbs-=rb_table[rb_table_index]; required_rbs[cba_group]=rb_table[rb_table_index]; - */ - // to be refined - if (weight[cba_group] < required_rbs[cba_group]) - num_cba_resources[cba_group]=(u8)ceil(weight[cba_group]/2.0); - else - num_cba_resources[cba_group]=(u8)ceil(required_rbs[cba_group]/2.0); - - while ((*nCCE) + (1< *nCCE_available) - num_cba_resources[cba_group]--; - - LOG_N(MAC,"[eNB %d] Frame %d, subframe %d: cba group %d weight/granted_ues %d/%d available/required rb (%d/%d), num resources %d->1 (*scaled down*) \n", - Mod_id, frame, subframe, cba_group, - weight[cba_group], granted_UEs, available_rbs,required_rbs[cba_group], - num_cba_resources[cba_group]); - - num_cba_resources[cba_group]=1; - - } - } - // phase 2 - for (cba_group=0;cba_group *nCCE_available) + num_cba_resources[cba_group]--; + + LOG_N(MAC,"[eNB %d] Frame %d, subframeP %d: cba group %d weight/granted_ues %d/%d available/required rb (%d/%d), num resources %d->1 (*scaled down*) \n", + module_idP, frameP, subframeP, cba_group, + weight[cba_group], granted_UEs, available_rbs,required_rbs[cba_group], + num_cba_resources[cba_group]); + + num_cba_resources[cba_group]=1; - while (rb_table[rb_table_index] > remaining_rbs ) - rb_table_index--; - - remaining_rbs-=rb_table[rb_table_index]; - allocated_rbs=rb_table[rb_table_index]; - - rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, - *first_rb, - rb_table[rb_table_index]); - - *first_rb+=rb_table[rb_table_index]; - LOG_D(MAC,"[eNB %d] Frame %d, subframe %d: CBA %d rnti %x, total/required/allocated/remaining rbs (%d/%d/%d/%d), rballoc %d, nCCE (%d/%d)\n", - Mod_id, frame, subframe, cba_group,eNB_mac_inst[Mod_id].cba_rnti[cba_group], - available_rbs, required_rbs[cba_group], allocated_rbs, remaining_rbs,rballoc, - *nCCE_available,*nCCE); - - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - ULSCH_dci_tdd16 = (DCI0_5MHz_TDD_1_6_t *)eNB_mac_inst[Mod_id].UE_template[cba_group].ULSCH_DCI[0]; - - ULSCH_dci_tdd16->type = 0; - ULSCH_dci_tdd16->hopping = 0; - ULSCH_dci_tdd16->rballoc = rballoc; - ULSCH_dci_tdd16->mcs = 2; - ULSCH_dci_tdd16->ndi = 1; - ULSCH_dci_tdd16->TPC = 1; - ULSCH_dci_tdd16->cshift = cba_group; - ULSCH_dci_tdd16->dai = eNB_mac_inst[Mod_id].UE_template[cba_group].DAI_ul[sched_subframe]; - ULSCH_dci_tdd16->cqi_req = 1; - - //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci_tdd16, - eNB_mac_inst[Mod_id].cba_rnti[cba_group], - sizeof(DCI0_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_5MHz_TDD_1_6_t, - format0, - 0); } - else { - ULSCH_dci_fdd = (DCI0_5MHz_FDD_t *)eNB_mac_inst[Mod_id].UE_template[cba_group].ULSCH_DCI[0]; - - ULSCH_dci_fdd->type = 0; - ULSCH_dci_fdd->hopping = 0; - ULSCH_dci_fdd->rballoc = rballoc; - ULSCH_dci_fdd->mcs = 2; - ULSCH_dci_fdd->ndi = 1; - ULSCH_dci_fdd->TPC = 1; - ULSCH_dci_fdd->cshift = 0; - ULSCH_dci_fdd->cqi_req = 1; - - //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci_fdd, - eNB_mac_inst[Mod_id].cba_rnti[cba_group], - sizeof(DCI0_5MHz_FDD_t), - aggregation, - sizeof_DCI0_5MHz_FDD_t, - format0, - 0); + } + // phase 2 + for (cba_group=0;cba_group remaining_rbs ) + rb_table_index--; + + remaining_rbs-=rb_table[rb_table_index]; + allocated_rbs=rb_table[rb_table_index]; + + rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, + *first_rb, + rb_table[rb_table_index]); + + *first_rb+=rb_table[rb_table_index]; + LOG_D(MAC,"[eNB %d] Frame %d, subframeP %d: CBA %d rnti %x, total/required/allocated/remaining rbs (%d/%d/%d/%d), rballoc %d, nCCE (%d/%d)\n", + module_idP, frameP, subframeP, cba_group,eNB_mac_inst[module_idP].cba_rnti[cba_group], + available_rbs, required_rbs[cba_group], allocated_rbs, remaining_rbs,rballoc, + *nCCE_available,*nCCE); + + + if (mac_xface->lte_frame_parms->frame_type == TDD) { + ULSCH_dci_tdd16 = (DCI0_5MHz_TDD_1_6_t *)eNB_mac_inst[module_idP].UE_template[cba_group].ULSCH_DCI[0]; + + ULSCH_dci_tdd16->type = 0; + ULSCH_dci_tdd16->hopping = 0; + ULSCH_dci_tdd16->rballoc = rballoc; + ULSCH_dci_tdd16->mcs = 2; + ULSCH_dci_tdd16->ndi = 1; + ULSCH_dci_tdd16->TPC = 1; + ULSCH_dci_tdd16->cshift = cba_group; + ULSCH_dci_tdd16->dai = eNB_mac_inst[module_idP].UE_template[cba_group].DAI_ul[sched_subframe]; + ULSCH_dci_tdd16->cqi_req = 1; + + //add_ue_spec_dci + add_common_dci(DCI_pdu, + ULSCH_dci_tdd16, + eNB_mac_inst[module_idP].cba_rnti[cba_group], + sizeof(DCI0_5MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_5MHz_TDD_1_6_t, + format0, + 0); + } + else { + ULSCH_dci_fdd = (DCI0_5MHz_FDD_t *)eNB_mac_inst[module_idP].UE_template[cba_group].ULSCH_DCI[0]; + + ULSCH_dci_fdd->type = 0; + ULSCH_dci_fdd->hopping = 0; + ULSCH_dci_fdd->rballoc = rballoc; + ULSCH_dci_fdd->mcs = 2; + ULSCH_dci_fdd->ndi = 1; + ULSCH_dci_fdd->TPC = 1; + ULSCH_dci_fdd->cshift = 0; + ULSCH_dci_fdd->cqi_req = 1; + + //add_ue_spec_dci + add_common_dci(DCI_pdu, + ULSCH_dci_fdd, + eNB_mac_inst[module_idP].cba_rnti[cba_group], + sizeof(DCI0_5MHz_FDD_t), + aggregation, + sizeof_DCI0_5MHz_FDD_t, + format0, + 0); + } + *nCCE = (*nCCE) + (1<get_nCCE_max(module_idP) - *nCCE; + // break;// for the moment only schedule one } - *nCCE = (*nCCE) + (1<get_nCCE_max(Mod_id) - *nCCE; - // break;// for the moment only schedule one - } - } + } } -#endif -void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, unsigned char subframe, unsigned char sched_subframe, u8 granted_UEs, unsigned int *nCCE, unsigned int *nCCE_available, u16 *first_rb){ - unsigned char UE_id; - unsigned char next_ue; - unsigned char aggregation=2; - u16 rnti; - u8 round = 0; - u8 harq_pid = 0; - void *ULSCH_dci; - - LTE_eNB_UE_stats* eNB_UE_stats; - DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; - u8 status=0;//,status0 = 0,status1 = 0; - // u8 k=0; - u8 rb_table_index; - u16 TBS,i; - u32 buffer_occupancy; - u32 tmp_bsr; - u32 cqi_req,cshift,ndi,mcs,rballoc; - - for (UE_id=0;UE_id (1<get_eNB_UE_stats(Mod_id,rnti); - if (eNB_UE_stats==NULL) - mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - - LOG_I(MAC,"[eNB %d] Scheduler Frame %d, subframe %d, nCCE %d: Checking ULSCH next UE_id %d mode id %d (rnti %x,mode %s), format 0\n",Mod_id,frame,subframe,*nCCE,next_ue,Mod_id, rnti,mode_string[eNB_UE_stats->mode]); - - if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel - s8 ret; - // Get candidate harq_pid from PHY - ret = mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,1); - LOG_I(MAC,"Got harq_pid %d, round %d, next_ue %d\n",harq_pid,round,next_ue); - - /* [SR] 01/07/13: Don't schedule UE if we cannot get harq pid */ +#endif +void schedule_ulsch_rnti(module_id_t module_idP, + unsigned char cooperation_flag, + frame_t frameP, + sub_frame_t subframeP, + unsigned char sched_subframe, + u8 granted_UEs, + unsigned int *nCCE, + unsigned int *nCCE_available, + u16 *first_rb){ + module_id_t ue_mod_id = -1; + module_id_t next_ue = -1; + unsigned char aggregation = 2; + rnti_t rnti = -1; + u8 round = 0; + u8 harq_pid = 0; + void *ULSCH_dci = NULL; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].DCI_pdu; + u8 status = 0; + u8 rb_table_index = -1; + u16 TBS,i; + u32 buffer_occupancy; + u32 tmp_bsr; + u32 cqi_req,cshift,ndi,mcs,rballoc; + + for (ue_mod_id=0;ue_mod_id (1<get_eNB_UE_stats(module_idP,rnti); + if (eNB_UE_stats==NULL) + mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); + + LOG_I(MAC,"[eNB %d] Scheduler Frame %d, subframeP %d, nCCE %d: Checking ULSCH next UE_id %d mode id %d (rnti %x,mode %s), format 0\n", + module_idP,frameP,subframeP,*nCCE,next_ue,module_idP, rnti,mode_string[eNB_UE_stats->mode]); + + if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel + s8 ret; + // Get candidate harq_pid from PHY + ret = mac_xface->get_ue_active_harq_pid(module_idP,rnti,subframeP,&harq_pid,&round,1); + LOG_I(MAC,"Got harq_pid %d, round %d, next_ue %d\n",harq_pid,round,next_ue); + + /* [SR] 01/07/13: Don't schedule UE if we cannot get harq pid */ #ifndef EXMIMO_IOT - if ((((UE_is_to_be_scheduled(Mod_id,UE_id)>0)) || (round>0) || ((frame%10)==0)) && (ret == 0)) - // if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames + if ((((UE_is_to_be_scheduled(module_idP,ue_mod_id)>0)) || (round>0) || ((frameP%10)==0)) && (ret == 0)) + // if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames #else - if (round==0) + if (round==0) #endif - { - LOG_D(MAC,"[eNB %d][PUSCH %x] Frame %d subframe %d Scheduling UE %d (SR %d)\n", - Mod_id,rnti,frame,subframe,UE_id, - eNB_mac_inst[Mod_id].UE_template[UE_id].ul_SR); - - // reset the scheduling request - eNB_mac_inst[Mod_id].UE_template[UE_id].ul_SR = 0; + { + LOG_D(MAC,"[eNB %d][PUSCH %x] Frame %d subframeP %d Scheduling UE %d (SR %d)\n", + module_idP,rnti,frameP,subframeP,ue_mod_id, + eNB_mac_inst[module_idP].UE_template[ue_mod_id].ul_SR); - aggregation = process_ue_cqi(Mod_id,next_ue); // =2 by default!! - // msg("[MAC][eNB] subframe %d: aggregation %d\n",subframe,aggregation); + // reset the scheduling request + eNB_mac_inst[module_idP].UE_template[ue_mod_id].ul_SR = 0; - status = mac_get_rrc_status(Mod_id,1,next_ue); + aggregation = process_ue_cqi(module_idP,next_ue); // =2 by default!! + // msg("[MAC][eNB] subframeP %d: aggregation %d\n",subframeP,aggregation); + + status = mac_get_rrc_status(module_idP,1,next_ue); #ifndef EXMIMO_IOT - if (status < RRC_CONNECTED) - cqi_req = 0; - else - cqi_req = 1; + if (status < RRC_CONNECTED) + cqi_req = 0; + else + cqi_req = 1; #else - cqi_req = 0; + cqi_req = 0; #endif - - if (round > 0) { - ndi = eNB_mac_inst[Mod_id].UE_template[UE_id].oldNDI_UL[harq_pid]; - mcs = (round&3) + 28; //not correct for round==4! - } - else { - ndi = 1-eNB_mac_inst[Mod_id].UE_template[UE_id].oldNDI_UL[harq_pid]; - eNB_mac_inst[Mod_id].UE_template[UE_id].oldNDI_UL[harq_pid]=ndi; - mcs = openair_daq_vars.target_ue_ul_mcs; - } - - LOG_D(MAC,"[eNB %d] ULSCH scheduler: Ndi %d, mcs %d\n",Mod_id,ndi,mcs); - if((cooperation_flag > 0) && (next_ue == 1)) { // Allocation on same set of RBs - // RIV:resource indication value // function in openair1/PHY/LTE_TRANSPORT/dci_tools.c - rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, - ((next_ue-1)*4),//openair_daq_vars.ue_ul_nb_rb), - 4);//openair_daq_vars.ue_ul_nb_rb); - } - else if ((round==0) && (mcs < 29)) { - rb_table_index = 1; - TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - buffer_occupancy = ((eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] == 0) && - (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] == 0) && - (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] == 0) && - (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] == 0))? - BSR_TABLE[10] : // This is when we've received SR and buffers are fully served - BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0]]+ - BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1]]+ - BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2]]+ - BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3]]; // This is when remaining data in UE buffers (even if SR is triggered) - - LOG_D(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframe %d Scheduled UE, BSR for LCGID0 %d, LCGID1 %d, LCGID2 %d LCGID3 %d, BO %d\n", - Mod_id,UE_id,rnti,frame,subframe, - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2], - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3], - buffer_occupancy); - - while ((TBS < buffer_occupancy) && - rb_table[rb_table_index]<(mac_xface->lte_frame_parms->N_RB_UL-1-*first_rb)){ - // continue until we've exhauster the UEs request or the total number of available PRBs - /* LOG_I(MAC,"[eNB %d][PUSCH %x] Frame %d subframe %d Scheduled UE (rb_table_index %d => TBS %d)\n", - Mod_id,rnti,frame,subframe, + if (round > 0) { + ndi = eNB_mac_inst[module_idP].UE_template[ue_mod_id].oldNDI_UL[harq_pid]; + mcs = (round&3) + 28; //not correct for round==4! + } + else { + ndi = 1-eNB_mac_inst[module_idP].UE_template[ue_mod_id].oldNDI_UL[harq_pid]; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].oldNDI_UL[harq_pid]=ndi; + mcs = openair_daq_vars.target_ue_ul_mcs; + } + + LOG_D(MAC,"[eNB %d] ULSCH scheduler: Ndi %d, mcs %d\n",module_idP,ndi,mcs); + + if((cooperation_flag > 0) && (next_ue == 1)) { // Allocation on same set of RBs + // RIV:resource indication value // function in openair1/PHY/LTE_TRANSPORT/dci_tools.c + rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, + ((next_ue-1)*4),//openair_daq_vars.ue_ul_nb_rb), + 4);//openair_daq_vars.ue_ul_nb_rb); + } + else if ((round==0) && (mcs < 29)) { + rb_table_index = 1; + TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); + buffer_occupancy = ((eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0] == 0) && + (eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1] == 0) && + (eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2] == 0) && + (eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3] == 0))? + BSR_TABLE[10] : // This is when we've received SR and buffers are fully served + BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0]]+ + BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1]]+ + BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2]]+ + BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3]]; // This is when remaining data in UE buffers (even if SR is triggered) + + LOG_D(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE, BSR for LCGID0 %d, LCGID1 %d, LCGID2 %d LCGID3 %d, BO %d\n", + module_idP, + ue_mod_id, + rnti, + frameP, + subframeP, + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0], + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1], + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2], + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3], + buffer_occupancy); + + while ((TBS < buffer_occupancy) && + rb_table[rb_table_index]<(mac_xface->lte_frame_parms->N_RB_UL-1-*first_rb)){ + // continue until we've exhauster the UEs request or the total number of available PRBs + /* LOG_I(MAC,"[eNB %d][PUSCH %x] Frame %d subframeP %d Scheduled UE (rb_table_index %d => TBS %d)\n", + module_idP,rnti,frameP,subframeP, rb_table_index,TBS); - */ - rb_table_index++; - TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - } - - if (rb_table[rb_table_index]>(mac_xface->lte_frame_parms->N_RB_UL-1-*first_rb)) { - rb_table_index--; - TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - } - //rb_table_index = 8; - - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframe %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", - Mod_id,UE_id,rnti,frame,subframe,mcs, - *first_rb,rb_table[rb_table_index], - rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]), - harq_pid); - - rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, - *first_rb, - rb_table[rb_table_index]);//openair_daq_vars.ue_ul_nb_rb); - - *first_rb+=rb_table[rb_table_index]; // increment for next UE allocation - eNB_mac_inst[Mod_id].UE_template[UE_id].nb_rb_ul[harq_pid] = rb_table[rb_table_index]; //store for possible retransmission - - buffer_occupancy -= mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - i = bytes_to_bsr_index((s32)buffer_occupancy); - - // Adjust BSR entries for LCGIDs - if (i>0) { - if (eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] <= i) { - tmp_bsr = BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0]]; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = 0; - if (BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1]] <= (buffer_occupancy-tmp_bsr)) { - tmp_bsr += BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1]]; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = 0; - if (BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2]] <= (buffer_occupancy-tmp_bsr)) { - tmp_bsr += BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2]]; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = 0; - if (BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3]] <= (buffer_occupancy-tmp_bsr)) { - tmp_bsr += BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3]]; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = 0; - } else { - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3]] - ((s32)buffer_occupancy - (s32)tmp_bsr)); - } - } - else { - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2]] - ((s32)buffer_occupancy -(s32)tmp_bsr)); - } - } - else { - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1]] - (s32)buffer_occupancy); - } - } - else { - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0]] - (s32)buffer_occupancy); - } - } - else { // we have flushed all buffers so clear bsr - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = 0; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = 0; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = 0; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = 0; - } - - - } // ndi==1 - else { //we schedule a retransmission - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframe %d Scheduled UE retransmission (mcs %d, first rb %d, nb_rb %d, TBS %d, harq_pid %d)\n", - Mod_id,UE_id,rnti,frame,subframe,mcs, - *first_rb,eNB_mac_inst[Mod_id].UE_template[UE_id].nb_rb_ul[harq_pid], - mac_xface->get_TBS_UL(mcs,eNB_mac_inst[Mod_id].UE_template[UE_id].nb_rb_ul[harq_pid]), - harq_pid); - - rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, - *first_rb, - eNB_mac_inst[Mod_id].UE_template[UE_id].nb_rb_ul[harq_pid]); - - *first_rb+=eNB_mac_inst[Mod_id].UE_template[UE_id].nb_rb_ul[harq_pid]; // increment for next UE allocation - } - - // Cyclic shift for DM RS - if(cooperation_flag == 2) { - if(next_ue == 1)// For Distriibuted Alamouti, cyclic shift applied to 2nd UE - cshift = 1; - else - cshift = 0; - } - else - cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1) - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_UL) { - case 6: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_1_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_1_5MHz_TDD_1_6_t, - format0, - 0); - break; - default: - case 25: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_5MHz_TDD_1_6_t, - format0, - 0); - break; - case 50: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_10MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_10MHz_TDD_1_6_t, - format0, - 0); - break; - case 100: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_20MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_20MHz_TDD_1_6_t, - format0, - 0); - break; - } - } - else { //FDD - switch (mac_xface->lte_frame_parms->N_RB_UL) { - case 25: - default: - - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = 1; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_5MHz_FDD_t), - aggregation, - sizeof_DCI0_5MHz_FDD_t, - format0, - 0); - break; - case 6: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->TPC = 1; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_1_5MHz_FDD_t), - aggregation, - sizeof_DCI0_1_5MHz_FDD_t, - format0, - 0); - break; - case 50: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = 1; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_10MHz_FDD_t), - aggregation, - sizeof_DCI0_10MHz_FDD_t, - format0, - 0); - break; - case 100: - ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->TPC = 1; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_20MHz_FDD_t), - aggregation, - sizeof_DCI0_20MHz_FDD_t, - format0, - 0); - break; - - } - } - //#ifdef DEBUG_eNB_SCHEDULER - // dump_dci(mac_xface->lte_frame_parms, - // &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]); - //#endif - add_ue_ulsch_info(Mod_id, - next_ue, - subframe, - S_UL_SCHEDULED); - - *nCCE = (*nCCE) + (1<get_nCCE_max(Mod_id) - *nCCE; - //msg("[MAC][eNB %d][ULSCH Scheduler] Frame %d, subframe %d: Generated ULSCH DCI for next UE_id %d, format 0\n", Mod_id,frame,subframe,next_ue); - - //break; // leave loop after first UE is schedule (avoids m - } // UE_is_to_be_scheduled - } // UE is in PUSCH + */ + rb_table_index++; + TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); + } + + if (rb_table[rb_table_index]>(mac_xface->lte_frame_parms->N_RB_UL-1-*first_rb)) { + rb_table_index--; + TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); + } + //rb_table_index = 8; + + LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", + module_idP,ue_mod_id,rnti,frameP,subframeP,mcs, + *first_rb,rb_table[rb_table_index], + rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]), + harq_pid); + + rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, + *first_rb, + rb_table[rb_table_index]);//openair_daq_vars.ue_ul_nb_rb); + + *first_rb+=rb_table[rb_table_index]; // increment for next UE allocation + eNB_mac_inst[module_idP].UE_template[ue_mod_id].nb_rb_ul[harq_pid] = rb_table[rb_table_index]; //store for possible retransmission + + buffer_occupancy -= mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); + i = bytes_to_bsr_index((s32)buffer_occupancy); + + // Adjust BSR entries for LCGIDs + if (i>0) { + if (eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0] <= i) { + tmp_bsr = BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0]]; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0] = 0; + if (BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1]] <= (buffer_occupancy-tmp_bsr)) { + tmp_bsr += BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1]]; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1] = 0; + if (BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2]] <= (buffer_occupancy-tmp_bsr)) { + tmp_bsr += BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2]]; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2] = 0; + if (BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3]] <= (buffer_occupancy-tmp_bsr)) { + tmp_bsr += BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3]]; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3] = 0; + } else { + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3]] - ((s32)buffer_occupancy - (s32)tmp_bsr)); + } + } + else { + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2]] - ((s32)buffer_occupancy -(s32)tmp_bsr)); + } + } + else { + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1]] - (s32)buffer_occupancy); + } + } + else { + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0] = bytes_to_bsr_index((s32)BSR_TABLE[eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0]] - (s32)buffer_occupancy); + } + } + else { // we have flushed all buffers so clear bsr + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID0] = 0; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID1] = 0; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID2] = 0; + eNB_mac_inst[module_idP].UE_template[ue_mod_id].bsr_info[LCGID3] = 0; + } + + + } // ndi==1 + else { //we schedule a retransmission + LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE retransmission (mcs %d, first rb %d, nb_rb %d, TBS %d, harq_pid %d)\n", + module_idP,ue_mod_id,rnti,frameP,subframeP,mcs, + *first_rb,eNB_mac_inst[module_idP].UE_template[ue_mod_id].nb_rb_ul[harq_pid], + mac_xface->get_TBS_UL(mcs,eNB_mac_inst[module_idP].UE_template[ue_mod_id].nb_rb_ul[harq_pid]), + harq_pid); + + rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, + *first_rb, + eNB_mac_inst[module_idP].UE_template[ue_mod_id].nb_rb_ul[harq_pid]); + + *first_rb+=eNB_mac_inst[module_idP].UE_template[ue_mod_id].nb_rb_ul[harq_pid]; // increment for next UE allocation + } + + // Cyclic shift for DM RS + if(cooperation_flag == 2) { + if(next_ue == 1)// For Distriibuted Alamouti, cyclic shift applied to 2nd UE + cshift = 1; + else + cshift = 0; + } + else + cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1) + + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_UL) { + case 6: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_1_5MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_1_5MHz_TDD_1_6_t, + format0, + 0); + break; + default: + case 25: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_5MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_5MHz_TDD_1_6_t, + format0, + 0); + break; + case 50: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_10MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_10MHz_TDD_1_6_t, + format0, + 0); + break; + case 100: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_20MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_20MHz_TDD_1_6_t, + format0, + 0); + break; + } + } + else { //FDD + switch (mac_xface->lte_frame_parms->N_RB_UL) { + case 25: + default: + + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->padding = 0; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_5MHz_FDD_t), + aggregation, + sizeof_DCI0_5MHz_FDD_t, + format0, + 0); + break; + case 6: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->padding = 0; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_1_5MHz_FDD_t), + aggregation, + sizeof_DCI0_1_5MHz_FDD_t, + format0, + 0); + break; + case 50: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->padding = 0; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_10MHz_FDD_t), + aggregation, + sizeof_DCI0_10MHz_FDD_t, + format0, + 0); + break; + case 100: + ULSCH_dci = eNB_mac_inst[module_idP].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->padding = 0; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_20MHz_FDD_t), + aggregation, + sizeof_DCI0_20MHz_FDD_t, + format0, + 0); + break; + + } + } + //#ifdef DEBUG_eNB_SCHEDULER + // dump_dci(mac_xface->lte_frame_parms, + // &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]); + //#endif + add_ue_ulsch_info(module_idP, + next_ue, + subframeP, + S_UL_SCHEDULED); + + *nCCE = (*nCCE) + (1<get_nCCE_max(module_idP) - *nCCE; + //msg("[MAC][eNB %d][ULSCH Scheduler] Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP,frameP,subframeP,next_ue); + + //break; // leave loop after first UE is schedule (avoids m + } // UE_is_to_be_scheduled + } // UE is in PUSCH } // loop over UE_id } -u32 allocate_prbs(unsigned char UE_id,unsigned char nb_rb, u32 *rballoc) { +u32 allocate_prbs(module_id_t ue_mod_idP,unsigned char nb_rb, u32 *rballoc) { int i; u32 rballoc_dci=0; unsigned char nb_rb_alloc=0; for (i=0;i<(mac_xface->lte_frame_parms->N_RB_DL-2);i+=2) { - if (((*rballoc>>i)&3)==0) { - *rballoc |= (3<>1)); - nb_rb_alloc+=2; - } - if (nb_rb_alloc==nb_rb) - return(rballoc_dci); + if (((*rballoc>>i)&3)==0) { + *rballoc |= (3<>1)); + nb_rb_alloc+=2; + } + if (nb_rb_alloc==nb_rb) + return(rballoc_dci); } if ((mac_xface->lte_frame_parms->N_RB_DL&1)==1) { - if ((*rballoc>>(mac_xface->lte_frame_parms->N_RB_DL-1)&1)==0) { - *rballoc |= (1<<(mac_xface->lte_frame_parms->N_RB_DL-1)); - rballoc_dci |= 1;//(1<<(mac_xface->lte_frame_parms->N_RB_DL>>1)); - } + if ((*rballoc>>(mac_xface->lte_frame_parms->N_RB_DL-1)&1)==0) { + *rballoc |= (1<<(mac_xface->lte_frame_parms->N_RB_DL-1)); + rballoc_dci |= 1;//(1<<(mac_xface->lte_frame_parms->N_RB_DL>>1)); + } } return(rballoc_dci); } @@ -2600,34 +2622,34 @@ u32 allocate_prbs_sub(int nb_rb, u8 *rballoc) { //u8 number_of_subbands=13; LOG_D(MAC,"*****Check1RBALLOC****: %d%d%d%d (nb_rb %d,N_RBGS %d)\n", - rballoc[3],rballoc[2],rballoc[1],rballoc[0],nb_rb,mac_xface->lte_frame_parms->N_RBGS); + rballoc[3],rballoc[2],rballoc[1],rballoc[0],nb_rb,mac_xface->lte_frame_parms->N_RBGS); while((nb_rb >0) && (check < mac_xface->lte_frame_parms->N_RBGS)){ - //printf("rballoc[%d] %d\n",check,rballoc[check]); - if(rballoc[check] == 1){ - rballoc_dci |= (1<<((mac_xface->lte_frame_parms->N_RBGS-1)-check)); - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - nb_rb--; - case 25: - if ((check == mac_xface->lte_frame_parms->N_RBGS-1)) - nb_rb--; - else - nb_rb-=2; - break; - case 50: - if ((check == mac_xface->lte_frame_parms->N_RBGS-1)) - nb_rb-=2; - else - nb_rb-=3; - break; - case 100: - nb_rb-=4; - break; + //printf("rballoc[%d] %d\n",check,rballoc[check]); + if(rballoc[check] == 1){ + rballoc_dci |= (1<<((mac_xface->lte_frame_parms->N_RBGS-1)-check)); + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + nb_rb--; + case 25: + if ((check == mac_xface->lte_frame_parms->N_RBGS-1)) + nb_rb--; + else + nb_rb-=2; + break; + case 50: + if ((check == mac_xface->lte_frame_parms->N_RBGS-1)) + nb_rb-=2; + else + nb_rb-=3; + break; + case 100: + nb_rb-=4; + break; + } } - } - //printf("rb_alloc %x\n",rballoc_dci); - check = check+1; - // check1 = check1+2; + //printf("rb_alloc %x\n",rballoc_dci); + check = check+1; + // check1 = check1+2; } // rballoc_dci = (rballoc_dci)&(0x1fff); LOG_D(MAC,"*********RBALLOC : %x\n",rballoc_dci); @@ -2636,26 +2658,24 @@ u32 allocate_prbs_sub(int nb_rb, u8 *rballoc) { } -void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 RBalloc,u8 RA_scheduled,int mbsfn_flag) { +void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,u32 RBalloc,u8 RA_scheduled,int mbsfn_flag) { // loop over all allocated UEs and compute frequency allocations for PDSCH - unsigned char UE_id,first_rb,nb_rb=3; - u16 rnti; + module_id_t ue_mod_id = -1; + u8 first_rb,nb_rb=3; + rnti_t rnti; unsigned char vrb_map[100]; - u8 rballoc_sub[mac_xface->lte_frame_parms->N_RBGS]; + u8 rballoc_sub[mac_xface->lte_frame_parms->N_RBGS]; //u8 number_of_subbands=13; - u32 rballoc=RBalloc; + u32 rballoc = RBalloc; - // u32 test=0; unsigned char round; unsigned char harq_pid; - void *DLSCH_dci=NULL; - DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; - int i; - // u8 status=0; - - void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[Mod_id].BCCH_alloc_pdu; - int size_bits,size_bytes; + void *DLSCH_dci=NULL; + DCI_PDU *DCI_pdu= &eNB_mac_inst[module_idP].DCI_pdu; + int i; + void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[module_idP].BCCH_alloc_pdu; + int size_bits,size_bytes; if (mbsfn_flag>0) return; @@ -2665,668 +2685,668 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R // SI DLSCH // printf("BCCH check\n"); - if (eNB_mac_inst[Mod_id].bcch_active == 1) { - eNB_mac_inst[Mod_id].bcch_active = 0; - LOG_D(MAC,"[eNB %d] Frame %d subframe %d: BCCH active\n", Mod_id, frame, subframe); - // randomize frequency allocation for SI - first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (eNB_mac_inst[module_idP].bcch_active == 1) { + eNB_mac_inst[module_idP].bcch_active = 0; + LOG_D(MAC,"[eNB %d] Frame %d subframeP %d: BCCH active\n", module_idP, frameP, subframeP); + // randomize frequency allocation for SI + first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); + if (mac_xface->lte_frame_parms->frame_type == TDD) { - } - else { - BCCH_alloc_pdu_fdd.rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(BCCH_alloc_pdu_fdd.vrb_type,BCCH_alloc_pdu_fdd.rballoc); - } - - vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; + } + else { + BCCH_alloc_pdu_fdd.rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(BCCH_alloc_pdu_fdd.vrb_type,BCCH_alloc_pdu_fdd.rballoc); + } - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_1_5MHz_TDD_1_6_t), - 2, - sizeof_DCI1A_1_5MHz_TDD_1_6_t, - format1A,0); - break; - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_5MHz_TDD_1_6_t), - 2, - sizeof_DCI1A_5MHz_TDD_1_6_t, - format1A,0); - break; - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_10MHz_TDD_1_6_t), - 2, - sizeof_DCI1A_10MHz_TDD_1_6_t, - format1A,0); - break; - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_20MHz_TDD_1_6_t), - 2, - sizeof_DCI1A_20MHz_TDD_1_6_t, - format1A,0); - break; + vrb_map[first_rb] = 1; + vrb_map[first_rb+1] = 1; + vrb_map[first_rb+2] = 1; + vrb_map[first_rb+3] = 1; + + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_1_5MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_1_5MHz_TDD_1_6_t, + format1A,0); + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_5MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_5MHz_TDD_1_6_t, + format1A,0); + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_10MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_10MHz_TDD_1_6_t, + format1A,0); + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_20MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_20MHz_TDD_1_6_t, + format1A,0); + break; + } } - } - else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_1_5MHz_FDD_t), - 2, - sizeof_DCI1A_1_5MHz_FDD_t, - format1A,0); - break; - case 25: - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_5MHz_FDD_t), - 2, - sizeof_DCI1A_5MHz_FDD_t, - format1A,0); - break; - case 50: - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_10MHz_FDD_t), - 2, - sizeof_DCI1A_10MHz_FDD_t, - format1A,0); - break; - case 100: - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_20MHz_FDD_t), - 2, - sizeof_DCI1A_20MHz_FDD_t, - format1A,0); - break; + else { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_1_5MHz_FDD_t), + 2, + sizeof_DCI1A_1_5MHz_FDD_t, + format1A,0); + break; + case 25: + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_5MHz_FDD_t), + 2, + sizeof_DCI1A_5MHz_FDD_t, + format1A,0); + break; + case 50: + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_10MHz_FDD_t), + 2, + sizeof_DCI1A_10MHz_FDD_t, + format1A,0); + break; + case 100: + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_20MHz_FDD_t), + 2, + sizeof_DCI1A_20MHz_FDD_t, + format1A,0); + break; + } } - } } if (RA_scheduled == 1) { - for (i=0;ilte_frame_parms->N_RB_DL-4)); - if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) - break; - } - vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch(mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - default: - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - } - } - else { - switch(mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - case 25: - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - case 50: - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - case 100: - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - break; - default: - break; - } - } - add_common_dci(DCI_pdu, - (void*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0], - eNB_mac_inst[Mod_id].RA_template[i].RA_rnti, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bytes1, - 2, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits1, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt1, - 1); - - - - LOG_D(MAC,"[eNB %d] Frame %d: Adding common dci for RA%d (RAR) RA_active %d\n",Mod_id,frame,i, - eNB_mac_inst[Mod_id].RA_template[i].RA_active); - } - if (eNB_mac_inst[Mod_id].RA_template[i].generate_Msg4_dci == 1) { - - // randomize frequency allocation for RA - while (1) { - first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); - if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) - break; - } - vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - default: - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - } - } - else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - - case 6: - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - case 25: - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - case 50: - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - case 100: - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->padding=0; - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - default: - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - break; - } - } - - add_ue_spec_dci(DCI_pdu, - (void*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0], - eNB_mac_inst[Mod_id].RA_template[i].rnti, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bytes2, - 1, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits2, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt2, - 0); - LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: Adding ue specific dci (rnti %x) for Msg4\n", - Mod_id,frame,subframe,eNB_mac_inst[Mod_id].RA_template[i].rnti); - eNB_mac_inst[Mod_id].RA_template[i].generate_Msg4_dci=0; - - } - else if (eNB_mac_inst[Mod_id].RA_template[i].wait_ack_Msg4==1) { - // check HARQ status and retransmit if necessary - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: Checking if Msg4 was acknowledged: \n", - Mod_id,frame,subframe); - // Get candidate harq_pid from PHY - mac_xface->get_ue_active_harq_pid(Mod_id,eNB_mac_inst[Mod_id].RA_template[i].rnti,subframe,&harq_pid,&round,0); - if (round>0) { - // we have to schedule a retransmission - if (mac_xface->lte_frame_parms->frame_type == TDD) - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->ndi=1; - else - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->ndi=1; - // randomize frequency allocation for RA - while (1) { - first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); - if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) - break; - } - vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; - if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - } - else { - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - } - - add_ue_spec_dci(DCI_pdu, - (void*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0], - eNB_mac_inst[Mod_id].RA_template[i].rnti, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bytes2, - 2, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits2, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt2, - 0); - LOG_W(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)\n", - Mod_id,frame,subframe,eNB_mac_inst[Mod_id].RA_template[i].rnti); - } - else { - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d : Msg4 acknowledged\n",Mod_id,frame,subframe); - eNB_mac_inst[Mod_id].RA_template[i].wait_ack_Msg4=0; - eNB_mac_inst[Mod_id].RA_template[i].RA_active=0; - } + for (i=0;ilte_frame_parms->N_RB_DL-4)); + if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) + break; + } + vrb_map[first_rb] = 1; + vrb_map[first_rb+1] = 1; + vrb_map[first_rb+2] = 1; + vrb_map[first_rb+3] = 1; + + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch(mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + default: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + } + } + else { + switch(mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->padding=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + default: + break; + } + } + add_common_dci(DCI_pdu, + (void*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu1[0], + eNB_mac_inst[module_idP].RA_template[i].RA_rnti, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_size_bytes1, + 2, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_size_bits1, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_fmt1, + 1); + + + + LOG_D(MAC,"[eNB %d] Frame %d: Adding common dci for RA%d (RAR) RA_active %d\n",module_idP,frameP,i, + eNB_mac_inst[module_idP].RA_template[i].RA_active); + } + if (eNB_mac_inst[module_idP].RA_template[i].generate_Msg4_dci == 1) { + + // randomize frequency allocation for RA + while (1) { + first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); + if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) + break; + } + vrb_map[first_rb] = 1; + vrb_map[first_rb+1] = 1; + vrb_map[first_rb+2] = 1; + vrb_map[first_rb+3] = 1; + + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + default: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + } + } + else { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + + case 6: + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->padding=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + default: + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + } + } + + add_ue_spec_dci(DCI_pdu, + (void*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0], + eNB_mac_inst[module_idP].RA_template[i].rnti, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_size_bytes2, + 1, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_size_bits2, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_fmt2, + 0); + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Adding ue specific dci (rnti %x) for Msg4\n", + module_idP,frameP,subframeP,eNB_mac_inst[module_idP].RA_template[i].rnti); + eNB_mac_inst[module_idP].RA_template[i].generate_Msg4_dci=0; + + } + else if (eNB_mac_inst[module_idP].RA_template[i].wait_ack_Msg4==1) { + // check HARQ status and retransmit if necessary + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Checking if Msg4 was acknowledged: \n", + module_idP,frameP,subframeP); + // Get candidate harq_pid from PHY + mac_xface->get_ue_active_harq_pid(module_idP,eNB_mac_inst[module_idP].RA_template[i].rnti,subframeP,&harq_pid,&round,0); + if (round>0) { + // we have to schedule a retransmission + if (mac_xface->lte_frame_parms->frame_type == TDD) + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->ndi=1; + else + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->ndi=1; + // randomize frequency allocation for RA + while (1) { + first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); + if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) + break; + } + vrb_map[first_rb] = 1; + vrb_map[first_rb+1] = 1; + vrb_map[first_rb+2] = 1; + vrb_map[first_rb+3] = 1; + if (mac_xface->lte_frame_parms->frame_type == TDD) { + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + } + else { + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0])->rballoc); + } + + add_ue_spec_dci(DCI_pdu, + (void*)&eNB_mac_inst[module_idP].RA_template[i].RA_alloc_pdu2[0], + eNB_mac_inst[module_idP].RA_template[i].rnti, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_size_bytes2, + 2, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_size_bits2, + eNB_mac_inst[module_idP].RA_template[i].RA_dci_fmt2, + 0); + LOG_W(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)\n", + module_idP,frameP,subframeP,eNB_mac_inst[module_idP].RA_template[i].rnti); + } + else { + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,frameP,subframeP); + eNB_mac_inst[module_idP].RA_template[i].wait_ack_Msg4=0; + eNB_mac_inst[module_idP].RA_template[i].RA_active=0; + } + } } - } - } // RA is scheduled in this subframe + } // RA is scheduled in this subframeP // UE specific DCIs - for (UE_id=0;UE_id status %d\n",UE_id,eNB_dlsch_info[Mod_id][UE_id].status); - if (eNB_dlsch_info[Mod_id][UE_id].status == S_DL_SCHEDULED) { - - // clear scheduling flag - eNB_dlsch_info[Mod_id][UE_id].status = S_DL_WAITING; - rnti = find_UE_RNTI(Mod_id,UE_id); - mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - nb_rb = eNB_mac_inst[Mod_id].UE_template[UE_id].nb_rb[harq_pid]; - - DLSCH_dci = (void *)eNB_mac_inst[Mod_id].UE_template[UE_id].DLSCH_DCI[harq_pid]; - - - /// Synchronizing rballoc with rballoc_sub - for(i=0;ilte_frame_parms->N_RBGS;i++){ - rballoc_sub[i] = eNB_mac_inst[Mod_id].UE_template[UE_id].rballoc_subband[harq_pid][i]; - if(rballoc_sub[i] == 1) - rballoc |= (0x0001<get_transmission_mode(Mod_id,rnti)) { - default: - - case 1: - - case 2: - LOG_D(MAC,"[USER-PLANE DEFAULT DRB] Adding UE spec DCI for %d PRBS (%x) => ",nb_rb,rballoc); - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_1_5MHz_TDD_t); - size_bits = sizeof_DCI1_1_5MHz_TDD_t; - break; - case 25: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_5MHz_TDD_t); - size_bits = sizeof_DCI1_5MHz_TDD_t; - break; - case 50: - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_10MHz_TDD_t); - size_bits = sizeof_DCI1_10MHz_TDD_t; - break; - case 100: - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_20MHz_TDD_t); - size_bits = sizeof_DCI1_20MHz_TDD_t; - break; - default: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_5MHz_TDD_t); - size_bits = sizeof_DCI1_5MHz_TDD_t; - break; - } - - - } - else { - switch(mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_1_5MHz_FDD_t); - size_bits=sizeof_DCI1_1_5MHz_FDD_t; - break; - case 25: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_5MHz_FDD_t); - size_bits=sizeof_DCI1_5MHz_FDD_t; - break; - case 50: - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_10MHz_FDD_t); - size_bits=sizeof_DCI1_10MHz_FDD_t; - break; - case 100: - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_20MHz_FDD_t); - size_bits=sizeof_DCI1_20MHz_FDD_t; - break; - default: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_5MHz_FDD_t); - size_bits=sizeof_DCI1_5MHz_FDD_t; - break; - } - } - - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - size_bytes, - process_ue_cqi (Mod_id,UE_id),//aggregation, - size_bits, - format1, - 0); - - break; - case 4: - - //if (nb_rb>10) { - // DCI format 2_2A_M10PRB can also be used for less than 10 PRB (it refers to the system bandwidth) - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI2_5MHz_2A_M10PRB_TDD_t), - process_ue_cqi (Mod_id,UE_id),//aggregation, - sizeof_DCI2_5MHz_2A_M10PRB_TDD_t, - format2_2A_M10PRB, - 0); - /*} + for (ue_mod_id=0;ue_mod_id status %d\n",UE_id,eNB_dlsch_info[module_idP][UE_id].status); + if (eNB_dlsch_info[module_idP][ue_mod_id].status == S_DL_SCHEDULED) { + + // clear scheduling flag + eNB_dlsch_info[module_idP][ue_mod_id].status = S_DL_WAITING; + rnti = find_UE_RNTI(module_idP,ue_mod_id); + mac_xface->get_ue_active_harq_pid(module_idP,rnti,subframeP,&harq_pid,&round,0); + nb_rb = eNB_mac_inst[module_idP].UE_template[ue_mod_id].nb_rb[harq_pid]; + + DLSCH_dci = (void *)eNB_mac_inst[module_idP].UE_template[ue_mod_id].DLSCH_DCI[harq_pid]; + + + /// Synchronizing rballoc with rballoc_sub + for(i=0;ilte_frame_parms->N_RBGS;i++){ + rballoc_sub[i] = eNB_mac_inst[module_idP].UE_template[ue_mod_id].rballoc_subband[harq_pid][i]; + if(rballoc_sub[i] == 1) + rballoc |= (0x0001<get_transmission_mode(module_idP,rnti)) { + default: + + case 1: + + case 2: + LOG_D(MAC,"[USER-PLANE DEFAULT DRB] Adding UE spec DCI for %d PRBS (%x) => ",nb_rb,rballoc); + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_1_5MHz_TDD_t); + size_bits = sizeof_DCI1_1_5MHz_TDD_t; + break; + case 25: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_5MHz_TDD_t); + size_bits = sizeof_DCI1_5MHz_TDD_t; + break; + case 50: + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_10MHz_TDD_t); + size_bits = sizeof_DCI1_10MHz_TDD_t; + break; + case 100: + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_20MHz_TDD_t); + size_bits = sizeof_DCI1_20MHz_TDD_t; + break; + default: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_5MHz_TDD_t); + size_bits = sizeof_DCI1_5MHz_TDD_t; + break; + } + + + } + else { + switch(mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_1_5MHz_FDD_t); + size_bits=sizeof_DCI1_1_5MHz_FDD_t; + break; + case 25: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_5MHz_FDD_t); + size_bits=sizeof_DCI1_5MHz_FDD_t; + break; + case 50: + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_10MHz_FDD_t); + size_bits=sizeof_DCI1_10MHz_FDD_t; + break; + case 100: + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_20MHz_FDD_t); + size_bits=sizeof_DCI1_20MHz_FDD_t; + break; + default: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_5MHz_FDD_t); + size_bits=sizeof_DCI1_5MHz_FDD_t; + break; + } + } + + add_ue_spec_dci(DCI_pdu, + DLSCH_dci, + rnti, + size_bytes, + process_ue_cqi (module_idP,ue_mod_id),//aggregation, + size_bits, + format1, + 0); + + break; + case 4: + + //if (nb_rb>10) { + // DCI format 2_2A_M10PRB can also be used for less than 10 PRB (it refers to the system bandwidth) + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; + add_ue_spec_dci(DCI_pdu, + DLSCH_dci, + rnti, + sizeof(DCI2_5MHz_2A_M10PRB_TDD_t), + process_ue_cqi (module_idP,ue_mod_id),//aggregation, + sizeof_DCI2_5MHz_2A_M10PRB_TDD_t, + format2_2A_M10PRB, + 0); + /*} else { ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); add_ue_spec_dci(DCI_pdu, @@ -3337,37 +3357,37 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R sizeof_DCI2_5MHz_2A_L10PRB_TDD_t, format2_2A_L10PRB); }*/ - break; - case 5: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; - - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), - process_ue_cqi (Mod_id,UE_id),//aggregation, - sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, - format1E_2A_M10PRB, - 0); - break; - - case 6: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; - - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), - process_ue_cqi (Mod_id,UE_id),//aggregation - sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, - format1E_2A_M10PRB, - 0); - break; - + break; + case 5: + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; + + add_ue_spec_dci(DCI_pdu, + DLSCH_dci, + rnti, + sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), + process_ue_cqi (module_idP,ue_mod_id),//aggregation, + sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, + format1E_2A_M10PRB, + 0); + break; + + case 6: + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; + + add_ue_spec_dci(DCI_pdu, + DLSCH_dci, + rnti, + sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), + process_ue_cqi (module_idP,ue_mod_id),//aggregation + sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, + format1E_2A_M10PRB, + 0); + break; + + } } - } } @@ -3375,55 +3395,52 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R -void update_ul_dci(u8 Mod_id,u16 rnti,u8 dai) { +void update_ul_dci(module_id_t module_idP,rnti_t rnti,u8 dai) { - DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; - int i; - DCI0_5MHz_TDD_1_6_t *ULSCH_dci; + DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].DCI_pdu; + int i; + DCI0_5MHz_TDD_1_6_t *ULSCH_dci = NULL;; if (mac_xface->lte_frame_parms->frame_type == TDD) { - for (i=0;iNum_common_dci+DCI_pdu->Num_ue_spec_dci;i++) { - ULSCH_dci = (DCI0_5MHz_TDD_1_6_t *)DCI_pdu->dci_alloc[i].dci_pdu; - if ((DCI_pdu->dci_alloc[i].format == format0) && (DCI_pdu->dci_alloc[i].rnti == rnti)) - ULSCH_dci->dai = (dai-1)&3; - } + for (i=0;iNum_common_dci+DCI_pdu->Num_ue_spec_dci;i++) { + ULSCH_dci = (DCI0_5MHz_TDD_1_6_t *)DCI_pdu->dci_alloc[i].dci_pdu; + if ((DCI_pdu->dci_alloc[i].format == format0) && (DCI_pdu->dci_alloc[i].rnti == rnti)) + ULSCH_dci->dai = (dai-1)&3; + } } // printf("Update UL DCI: DAI %d\n",dai); } -void schedule_ue_spec(unsigned char Mod_id, - u32 frame, - unsigned char subframe, - u16 nb_rb_used0, - unsigned int *nCCE_used, - int mbsfn_flag) { - - unsigned char UE_id; - unsigned char next_ue; - unsigned char granted_UEs; - u16 nCCE; - unsigned char aggregation; +void schedule_ue_spec(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP, + u16 nb_rb_used0, + unsigned int *nCCE_used, + int mbsfn_flag) { + + module_id_t ue_mod_id = -1; + module_id_t next_ue = -1; + unsigned char granted_UEs = 0; + u16 nCCE; + unsigned char aggregation; mac_rlc_status_resp_t rlc_status; - unsigned char header_len_dcch=0, header_len_dcch_tmp=0,header_len_dtch=0,header_len_dtch_tmp=0, ta_len=0; - unsigned char sdu_lcids[11],offset,num_sdus=0; - u16 nb_rb,nb_rb_temp,nb_available_rb,TBS,j,sdu_lengths[11],rnti,padding=0,post_padding=0; - unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; - unsigned char round=0; - unsigned char harq_pid=0; - void *DLSCH_dci; - LTE_eNB_UE_stats* eNB_UE_stats; - u16 sdu_length_total=0; - // unsigned char loop_count; - unsigned char DAI; - u16 i=0; - u8 dl_pow_off[NUMBER_OF_UE_MAX]; - unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]; -// unsigned char rballoc_sub[N_RBGS_MAX]; - u16 pre_nb_available_rbs[NUMBER_OF_UE_MAX]; - int mcs; - //u8 number_of_subbands=13; - u16 min_rb_unit; - short ta_update=0; + unsigned char header_len_dcch=0, header_len_dcch_tmp=0,header_len_dtch=0,header_len_dtch_tmp=0, ta_len=0; + unsigned char sdu_lcids[11],offset,num_sdus=0; + u16 nb_rb,nb_rb_temp,nb_available_rb,TBS,j,sdu_lengths[11],rnti,padding=0,post_padding=0; + unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; + unsigned char round = 0; + unsigned char harq_pid = 0; + void *DLSCH_dci = NULL; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + u16 sdu_length_total = 0; + unsigned char DAI; + u16 i = 0; + u8 dl_pow_off[NUMBER_OF_UE_MAX]; + unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]; + u16 pre_nb_available_rbs[NUMBER_OF_UE_MAX]; + int mcs; + u16 min_rb_unit; + short ta_update = 0; switch (mac_xface->lte_frame_parms->N_RB_DL) { case 6: @@ -3447,794 +3464,829 @@ void schedule_ue_spec(unsigned char Mod_id, return; //int **rballoc_sub = (int **)malloc(1792*sizeof(int *)); - granted_UEs = find_dlgranted_UEs(Mod_id); + granted_UEs = find_dlgranted_UEs(module_idP); - //weight = get_ue_weight(Mod_id,UE_id); + //weight = get_ue_weight(module_idP,UE_id); aggregation = 1; // set to the maximum aggregation level /// Initialization for pre-processor for(i=0;ilte_frame_parms->N_RBGS;j++){ -// rballoc_sub[j] = 0; - rballoc_sub_UE[i][j] = 0; - } + pre_nb_available_rbs[i] = 0; + dl_pow_off[i] = 2; + for(j=0;jlte_frame_parms->N_RBGS;j++){ + // rballoc_sub[j] = 0; + rballoc_sub_UE[i][j] = 0; + } } for (i = 0; i < NUMBER_OF_UE_MAX; i++) { - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[i].pre_nb_available_rbs = 0; - for (j = 0; j < mac_xface->lte_frame_parms->N_RBGS; j++) { - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[i].rballoc_sub[j] = 0; - } + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[i].pre_nb_available_rbs = 0; + for (j = 0; j < mac_xface->lte_frame_parms->N_RBGS; j++) { + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[i].rballoc_sub[j] = 0; + } } // set current available nb_rb and nCCE to maximum nb_available_rb = mac_xface->lte_frame_parms->N_RB_DL - nb_rb_used0; - nCCE = mac_xface->get_nCCE_max(Mod_id) - *nCCE_used; + nCCE = mac_xface->get_nCCE_max(module_idP) - *nCCE_used; // store the goloabl enb stats - eNB_mac_inst[Mod_id].eNB_stats.num_dlactive_UEs = granted_UEs; - eNB_mac_inst[Mod_id].eNB_stats.available_prbs = nb_available_rb; - eNB_mac_inst[Mod_id].eNB_stats.total_available_prbs += nb_available_rb; - eNB_mac_inst[Mod_id].eNB_stats.available_ncces = nCCE; - eNB_mac_inst[Mod_id].eNB_stats.dlsch_bytes_tx=0; - eNB_mac_inst[Mod_id].eNB_stats.dlsch_pdus_tx=0; + eNB_mac_inst[module_idP].eNB_stats.num_dlactive_UEs = granted_UEs; + eNB_mac_inst[module_idP].eNB_stats.available_prbs = nb_available_rb; + eNB_mac_inst[module_idP].eNB_stats.total_available_prbs += nb_available_rb; + eNB_mac_inst[module_idP].eNB_stats.available_ncces = nCCE; + eNB_mac_inst[module_idP].eNB_stats.dlsch_bytes_tx=0; + eNB_mac_inst[module_idP].eNB_stats.dlsch_pdus_tx=0; /// CALLING Pre_Processor for downlink scheduling (Returns estimation of RBs required by each UE and the allocation on sub-band) - dlsch_scheduler_pre_processor(Mod_id, - frame, - subframe, - dl_pow_off, - pre_nb_available_rbs, - mac_xface->lte_frame_parms->N_RBGS, - rballoc_sub_UE); - - - for (UE_id=0;UE_idmacphy_exit("");//continue; - } + dlsch_scheduler_pre_processor(module_idP, + frameP, + subframeP, + dl_pow_off, + pre_nb_available_rbs, + mac_xface->lte_frame_parms->N_RBGS, + rballoc_sub_UE); - eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,rnti); - if (eNB_UE_stats==NULL) - mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - // Get candidate harq_pid from PHY - mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - // printf("Got harq_pid %d, round %d\n",harq_pid,round); + for (ue_mod_id=0;ue_mod_idmacphy_exit("");//continue; + } - if ((nb_available_rb == 0) || (nCCE < (1<get_transmission_mode(Mod_id,rnti)==5) - continue; //to next user (there might be rbs availiable for other UEs in TM5 - // else - // break; - } - sdu_length_total=0; - num_sdus=0; + eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,rnti); + if (eNB_UE_stats==NULL) + mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - // get Round-Robin allocation - next_ue = UE_id;//schedule_next_dlue(Mod_id,subframe); // next scheduled user - // If nobody is left, exit while loop and go to next step - if (next_ue == 255) - break; + // Get candidate harq_pid from PHY + mac_xface->get_ue_active_harq_pid(module_idP,rnti,subframeP,&harq_pid,&round,0); + // printf("Got harq_pid %d, round %d\n",harq_pid,round); - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - if ((subframe==0)||(subframe==1)||(subframe==3)||(subframe==5)||(subframe==6)||(subframe==8)) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - case 1: - if ((subframe==0)||(subframe==4)||(subframe==5)||(subframe==9)) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - break; - case 2: - if ((subframe==4)||(subframe==5)) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - break; - case 3: - if ((subframe==5)||(subframe==7)||(subframe==9)) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - break; - case 4: - if ((subframe==0)||(subframe==6)) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - break; - case 5: - if (subframe==9) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - break; - case 6: - if ((subframe==0)||(subframe==1)||(subframe==5)||(subframe==6)||(subframe==9)) - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI = 0; - default: - break; + + nb_available_rb = pre_nb_available_rbs[ue_mod_id]; + + if ((nb_available_rb == 0) || (nCCE < (1<get_transmission_mode(module_idP,rnti)==5) + continue; //to next user (there might be rbs availiable for other UEs in TM5 + // else + // break; } - } + sdu_length_total=0; + num_sdus=0; + + // get Round-Robin allocation + next_ue = ue_mod_id;//schedule_next_dlue(module_idP,subframeP); // next scheduled user + // If nobody is left, exit while loop and go to next step + if (next_ue == 255) + break; - // This is an allocated UE_id - rnti = find_UE_RNTI(Mod_id,next_ue); - if (rnti==0) - continue; + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->tdd_config) { + case 0: + if ((subframeP==0)||(subframeP==1)||(subframeP==3)||(subframeP==5)||(subframeP==6)||(subframeP==8)) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + case 1: + if ((subframeP==0)||(subframeP==4)||(subframeP==5)||(subframeP==9)) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + break; + case 2: + if ((subframeP==4)||(subframeP==5)) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + break; + case 3: + if ((subframeP==5)||(subframeP==7)||(subframeP==9)) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + break; + case 4: + if ((subframeP==0)||(subframeP==6)) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + break; + case 5: + if (subframeP==9) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + break; + case 6: + if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)||(subframeP==9)) + eNB_mac_inst[module_idP].UE_template[next_ue].DAI = 0; + default: + break; + } + } + + // This is an allocated UE_id + rnti = find_UE_RNTI(module_idP,next_ue); + if (rnti==0) + continue; + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,rnti); - eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,rnti); + if (eNB_UE_stats==NULL) + mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - if (eNB_UE_stats==NULL) - mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); + //eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs; + // int flag_LA=0; + //printf("CQI %d\n",eNB_UE_stats->DL_cqi[0]); + + eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; - //eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs; - // int flag_LA=0; - //printf("CQI %d\n",eNB_UE_stats->DL_cqi[0]); - - eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; - if(eNB_UE_stats->dlsch_mcs1>22) - eNB_UE_stats->dlsch_mcs1=22; - - - // for TM5, limit the MCS to 16QAM + eNB_UE_stats->dlsch_mcs1=22; - // for EXMIMO, limit the MCS to 16QAM as well -#ifdef EXMIMO - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); -#endif + // for TM5, limit the MCS to 16QAM - // Get candidate harq_pid from PHY - mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].harq_pid = harq_pid; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].harq_round = round; - // Note this code is for a specific DCI format - DLSCH_dci = (void *)eNB_mac_inst[Mod_id].UE_template[next_ue].DLSCH_DCI[harq_pid]; + // for EXMIMO, limit the MCS to 16QAM as well +#ifdef EXMIMO + eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); +#endif - for(j=0;jlte_frame_parms->N_RBGS;j++){ // initializing the rb allocation indicator for each UE - eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = 0; - } - // store stats - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].dl_cqi= eNB_UE_stats->DL_cqi[0]; - - if (round > 0) { - if (mac_xface->lte_frame_parms->frame_type == TDD) { - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI++; - LOG_D(MAC,"DAI update: subframe %d: UE %d, DAI %d\n",subframe,next_ue,eNB_mac_inst[Mod_id].UE_template[next_ue].DAI); - - update_ul_dci(Mod_id,rnti,eNB_mac_inst[Mod_id].UE_template[next_ue].DAI); - } + // Get candidate harq_pid from PHY + mac_xface->get_ue_active_harq_pid(module_idP,rnti,subframeP,&harq_pid,&round,0); - // get freq_allocation - nb_rb = eNB_mac_inst[Mod_id].UE_template[next_ue].nb_rb[harq_pid]; - if (nb_rb <= nb_available_rb) { - - if(nb_rb == pre_nb_available_rbs[next_ue]){ - for(j=0;jlte_frame_parms->N_RBGS;j++) // for indicating the rballoc for each sub-band - eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j];} - else - { - nb_rb_temp = nb_rb; - j = 0; - while((nb_rb_temp > 0) && (jlte_frame_parms->N_RBGS)){ - if(rballoc_sub_UE[next_ue][j] == 1){ - eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))) - nb_rb_temp = nb_rb_temp - min_rb_unit+1; - else - nb_rb_temp = nb_rb_temp - min_rb_unit; - } - j = j+1; - } - } - - nb_available_rb -= nb_rb; - aggregation = process_ue_cqi(Mod_id,next_ue); - nCCE-=(1<mu_mimo_mode[next_ue].pre_nb_available_rbs = nb_rb; - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[next_ue].dl_pow_off = dl_pow_off[next_ue]; - - for(j=0;jlte_frame_parms->N_RBGS;j++) - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[next_ue].rballoc_sub[j] = eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j]; - - switch (mac_xface->get_transmission_mode(Mod_id,rnti)) { - case 1: - case 2: - default: - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - // ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs); - } - else { - // ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs); - - } - break; - case 25: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - // ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs); - } - else { - // ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs); - - } - break; - case 50: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - // ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs); - } - else { - // ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs); - - } - break; - case 100: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - // ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs); - } - else { - // ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs); - - } - break; - } - break; - case 4: - // if (nb_rb>10) { - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi1 = 0; - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - // } - //else { - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->ndi1 = 0; - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - // } - break; - case 5: - // if(nb_rb>10){ - //((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = eNB_UE_stats->DL_cqi[0]<<1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - if(dl_pow_off[next_ue] == 2) - dl_pow_off[next_ue] = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = dl_pow_off[next_ue]; - // } - break; - case 6: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = 1;//dl_pow_off[next_ue]; - break; - } + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].harq_pid = harq_pid; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].harq_round = round; + // Note this code is for a specific DCI format + DLSCH_dci = (void *)eNB_mac_inst[module_idP].UE_template[next_ue].DLSCH_DCI[harq_pid]; - add_ue_dlsch_info(Mod_id, - next_ue, - subframe, - S_DL_SCHEDULED); - - //eNB_UE_stats->dlsch_trials[round]++; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_retransmission+=1; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].rbs_used_retx=nb_rb; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].total_rbs_used_retx+=nb_rb; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].ncce_used_retx=nCCE; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].dlsch_mcs2=eNB_UE_stats->dlsch_mcs1; + for(j=0;jlte_frame_parms->N_RBGS;j++){ // initializing the rb allocation indicator for each UE + eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j] = 0; } - else { // don't schedule this UE, its retransmission takes more resources than we have - + // store stats + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].dl_cqi= eNB_UE_stats->DL_cqi[0]; + + if (round > 0) { + if (mac_xface->lte_frame_parms->frame_type == TDD) { + eNB_mac_inst[module_idP].UE_template[next_ue].DAI++; + LOG_D(MAC,"DAI update: subframeP %d: UE %d, DAI %d\n",subframeP,next_ue,eNB_mac_inst[module_idP].UE_template[next_ue].DAI); + + update_ul_dci(module_idP,rnti,eNB_mac_inst[module_idP].UE_template[next_ue].DAI); + } + + // get freq_allocation + nb_rb = eNB_mac_inst[module_idP].UE_template[next_ue].nb_rb[harq_pid]; + if (nb_rb <= nb_available_rb) { + + if(nb_rb == pre_nb_available_rbs[next_ue]){ + for(j=0;jlte_frame_parms->N_RBGS;j++) // for indicating the rballoc for each sub-band + eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j];} + else + { + nb_rb_temp = nb_rb; + j = 0; + while((nb_rb_temp > 0) && (jlte_frame_parms->N_RBGS)){ + if(rballoc_sub_UE[next_ue][j] == 1){ + eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; + if((j == mac_xface->lte_frame_parms->N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))) + nb_rb_temp = nb_rb_temp - min_rb_unit+1; + else + nb_rb_temp = nb_rb_temp - min_rb_unit; + } + j = j+1; + } + } + + nb_available_rb -= nb_rb; + aggregation = process_ue_cqi(module_idP,next_ue); + nCCE-=(1<mu_mimo_mode[next_ue].pre_nb_available_rbs = nb_rb; + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[next_ue].dl_pow_off = dl_pow_off[next_ue]; + + for(j=0;jlte_frame_parms->N_RBGS;j++) + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[next_ue].rballoc_sub[j] = eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j]; + + switch (mac_xface->get_transmission_mode(module_idP,rnti)) { + case 1: + case 2: + default: + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + // ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",module_idP,harq_pid,round,(eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1),((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + // ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",module_idP,harq_pid,round,((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + case 25: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + // ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",module_idP,harq_pid,round,(eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1),((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + // ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",module_idP,harq_pid,round,((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + case 50: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + // ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",module_idP,harq_pid,round,(eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1),((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + // ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",module_idP,harq_pid,round,((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + case 100: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + // ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",module_idP,harq_pid,round,(eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1),((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + // ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",module_idP,harq_pid,round,((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + } + break; + case 4: + // if (nb_rb>10) { + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi1 = 0; + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + // } + //else { + // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->ndi1 = 0; + // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; + // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + // } + break; + case 5: + // if(nb_rb>10){ + //((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = eNB_UE_stats->DL_cqi[0]<<1; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + if(dl_pow_off[next_ue] == 2) + dl_pow_off[next_ue] = 1; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = dl_pow_off[next_ue]; + // } + break; + case 6: + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = 1;//dl_pow_off[next_ue]; + break; + } + + add_ue_dlsch_info(module_idP, + next_ue, + subframeP, + S_DL_SCHEDULED); + + //eNB_UE_stats->dlsch_trials[round]++; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_retransmission+=1; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].rbs_used_retx=nb_rb; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].total_rbs_used_retx+=nb_rb; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].ncce_used_retx=nCCE; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].dlsch_mcs2=eNB_UE_stats->dlsch_mcs1; + } + else { // don't schedule this UE, its retransmission takes more resources than we have + + } } - } - else { // This is a potentially new SDU opportunity + else { // This is a potentially new SDU opportunity - // calculate mcs + // calculate mcs - rlc_status.bytes_in_buffer = 0; - // Now check RLC information to compute number of required RBs - // get maximum TBS size for RLC request - //TBS = mac_xface->get_TBS(eNB_UE_stats->DL_cqi[0]<<1,nb_available_rb); - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); - // check first for RLC data on DCCH - // add the length for all the control elements (timing adv, drx, etc) : header + payload + rlc_status.bytes_in_buffer = 0; + // Now check RLC information to compute number of required RBs + // get maximum TBS size for RLC request + //TBS = mac_xface->get_TBS(eNB_UE_stats->DL_cqi[0]<<1,nb_available_rb); + TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); + // check first for RLC data on DCCH + // add the length for all the control elements (timing adv, drx, etc) : header + payload #ifndef EXMIMO_IOT - ta_len = ((eNB_UE_stats->timing_advance_update/4)!=0) ? 2 : 0; -#else - ta_len = 0; + ta_len = ((eNB_UE_stats->timing_advance_update/4)!=0) ? 2 : 0; +#else + ta_len = 0; #endif - - header_len_dcch = 2; // 2 bytes DCCH SDU subheader - - - rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_NO, DCCH+(NB_RB_MAX*next_ue), - (TBS-ta_len-header_len_dcch)); // transport block set size - - sdu_lengths[0]=0; - if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit - LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH, Requesting %d bytes from RLC (RRC message)\n",Mod_id,frame,TBS-header_len_dcch); - sdu_lengths[0] += mac_rlc_data_req(Mod_id,frame,RLC_MBMS_NO, - DCCH+(NB_RB_MAX*next_ue), - (char *)&dlsch_buffer[sdu_lengths[0]]); - - LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",Mod_id,sdu_lengths[0]); - sdu_length_total = sdu_lengths[0]; - sdu_lcids[0] = DCCH; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_pdu_tx[DCCH]+=1; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_bytes_tx[DCCH]+=sdu_lengths[0]; - num_sdus = 1; + + header_len_dcch = 2; // 2 bytes DCCH SDU subheader + + + rlc_status = mac_rlc_status_ind( + module_idP, + ue_mod_id, + frameP, + 1, + RLC_MBMS_NO, + DCCH, + (TBS-ta_len-header_len_dcch)); // transport block set size + + sdu_lengths[0]=0; + if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit + LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH, Requesting %d bytes from RLC (RRC message)\n",module_idP,frameP,TBS-header_len_dcch); + sdu_lengths[0] += mac_rlc_data_req( + module_idP, + ue_mod_id, + frameP, + 1, + RLC_MBMS_NO, + DCCH, + (char *)&dlsch_buffer[sdu_lengths[0]]); + + LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",module_idP,sdu_lengths[0]); + sdu_length_total = sdu_lengths[0]; + sdu_lcids[0] = DCCH; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_pdu_tx[DCCH]+=1; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_bytes_tx[DCCH]+=sdu_lengths[0]; + num_sdus = 1; #ifdef DEBUG_eNB_SCHEDULER - LOG_T(MAC,"[eNB %d][DCCH] Got %d bytes :",Mod_id,sdu_lengths[0]); - for (j=0;j 0) { - LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n", - Mod_id,frame,TBS-header_len_dcch-sdu_length_total); - sdu_lengths[num_sdus] += mac_rlc_data_req(Mod_id,frame,RLC_MBMS_NO, - DCCH+1+(NB_RB_MAX*next_ue), - (char *)&dlsch_buffer[sdu_lengths[0]]); - sdu_lcids[num_sdus] = DCCH1; - sdu_length_total += sdu_lengths[num_sdus]; - header_len_dcch += 2; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_pdu_tx[DCCH1]+=1; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; - num_sdus++; - LOG_D(MAC,"[eNB %d] Got %d bytes for DCCH from RLC\n",Mod_id,sdu_lengths[0]); - } - // check for DTCH and update header information - // here we should loop over all possible DTCH - - header_len_dtch = 3; // 3 bytes DTCH SDU subheader - - LOG_D(MAC,"[eNB %d], Frame %d, DTCH->DLSCH, Checking RLC status (rab %d, tbs %d, len %d)\n", - Mod_id,frame,DTCH+(NB_RB_MAX*next_ue),TBS, - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_NO, DTCH+(NB_RB_MAX*next_ue), - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - if (rlc_status.bytes_in_buffer > 0) { - - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, Requesting %d bytes from RLC (hdr len dtch %d)\n", - Mod_id,frame,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); - sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame,RLC_MBMS_NO, - DTCH+(NB_RB_MAX*next_ue), - (char*)&dlsch_buffer[sdu_length_total]); - - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",Mod_id,sdu_lengths[num_sdus],DTCH+(NB_RB_MAX*next_ue)); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_pdu_tx[DTCH]+=1; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; - if (sdu_lengths[num_sdus] < 128) - header_len_dtch=2; - num_sdus++; - } - else { - header_len_dtch = 0; - } - - // there is a payload - if (((sdu_length_total + header_len_dcch + header_len_dtch )> 0)) { - - // Now compute number of required RBs for total sdu length - // Assume RAH format 2 - // adjust header lengths - header_len_dcch_tmp = header_len_dcch; - header_len_dtch_tmp = header_len_dtch; - if (header_len_dtch==0) - header_len_dcch = (header_len_dcch >0) ? 1 : header_len_dcch; // remove length field - else - header_len_dtch = (header_len_dtch > 0) ? 1 :header_len_dtch; // remove length field for the last SDU - - - - - mcs = eNB_UE_stats->dlsch_mcs1; - if (mcs==0) nb_rb = 4; // don't let the TBS get too small - else nb_rb=min_rb_unit; - - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); - - while (TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) { - nb_rb += min_rb_unit; // - if (nb_rb>nb_available_rb) { // if we've gone beyond the maximum number of RBs - // (can happen if N_RB_DL is odd) - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); - nb_rb = nb_available_rb; - break; - } - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rb); - } - - if(nb_rb == pre_nb_available_rbs[next_ue]) - for(j=0;jlte_frame_parms->N_RBGS;j++) // for indicating the rballoc for each sub-band - eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; - else - { - nb_rb_temp = nb_rb; - j = 0; - while((nb_rb_temp > 0) && (jlte_frame_parms->N_RBGS)){ - if(rballoc_sub_UE[next_ue][j] == 1){ - eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; - if ((j == mac_xface->lte_frame_parms->N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))) - nb_rb_temp = nb_rb_temp - min_rb_unit+1; - else - nb_rb_temp = nb_rb_temp - min_rb_unit; - } - j = j+1; - } - } - - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[next_ue].pre_nb_available_rbs = nb_rb; - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[next_ue].dl_pow_off = dl_pow_off[next_ue]; - - for(j=0;jlte_frame_parms->N_RBGS;j++) - PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[next_ue].rballoc_sub[j] = eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j]; - - - // decrease mcs until TBS falls below required length - while ((TBS > (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && (mcs>0)) { - mcs--; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); - } - - // if we have decreased too much or we don't have enough RBs, increase MCS - while ((TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && ((( dl_pow_off[next_ue]>0) && (mcs<28)) || ( (dl_pow_off[next_ue]==0) && (mcs<=15)))) { - mcs++; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); - } - - LOG_D(MAC,"dlsch_mcs before and after the rate matching = (%d, %d)\n",eNB_UE_stats->dlsch_mcs1, mcs); + } + else { + header_len_dcch = 0; + sdu_length_total = 0; + } + + // check for DCCH1 and update header information (assume 2 byte sub-header) + rlc_status = mac_rlc_status_ind( + module_idP, + ue_mod_id, + frameP, + 1, + RLC_MBMS_NO, + DCCH+1, + (TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and + // DCCH SDU + + if (rlc_status.bytes_in_buffer > 0) { + LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n", + module_idP,frameP,TBS-header_len_dcch-sdu_length_total); + sdu_lengths[num_sdus] += mac_rlc_data_req( + module_idP, + ue_mod_id, + frameP, + 1, + RLC_MBMS_NO, + DCCH+1, + (char *)&dlsch_buffer[sdu_lengths[0]]); + + sdu_lcids[num_sdus] = DCCH1; + sdu_length_total += sdu_lengths[num_sdus]; + header_len_dcch += 2; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_pdu_tx[DCCH1]+=1; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; + num_sdus++; + LOG_D(MAC,"[eNB %d] Got %d bytes for DCCH from RLC\n",module_idP,sdu_lengths[0]); + } + // check for DTCH and update header information + // here we should loop over all possible DTCH + + header_len_dtch = 3; // 3 bytes DTCH SDU subheader + + LOG_D(MAC,"[eNB %d], Frame %d, DTCH->DLSCH, Checking RLC status (rab %d, tbs %d, len %d)\n", + module_idP,frameP,DTCH,TBS, + TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); + + rlc_status = mac_rlc_status_ind( + module_idP, + ue_mod_id, + frameP, + 1, + RLC_MBMS_NO, + DTCH, + TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); + + if (rlc_status.bytes_in_buffer > 0) { + + LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, Requesting %d bytes from RLC (hdr len dtch %d)\n", + module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); + sdu_lengths[num_sdus] = mac_rlc_data_req( + module_idP, + ue_mod_id, + frameP, + 1, + RLC_MBMS_NO, + DTCH, + (char*)&dlsch_buffer[sdu_length_total]); + + LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],DTCH); + sdu_lcids[num_sdus] = DTCH; + sdu_length_total += sdu_lengths[num_sdus]; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_pdu_tx[DTCH]+=1; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) { + header_len_dtch=2; + } + num_sdus++; + } + else { + header_len_dtch = 0; + } + + // there is a payload + if (((sdu_length_total + header_len_dcch + header_len_dtch )> 0)) { + + // Now compute number of required RBs for total sdu length + // Assume RAH format 2 + // adjust header lengths + header_len_dcch_tmp = header_len_dcch; + header_len_dtch_tmp = header_len_dtch; + if (header_len_dtch==0) { + header_len_dcch = (header_len_dcch >0) ? 1 : header_len_dcch; // remove length field + } else { + header_len_dtch = (header_len_dtch > 0) ? 1 :header_len_dtch; // remove length field for the last SDU + } + + + mcs = eNB_UE_stats->dlsch_mcs1; + if (mcs==0) nb_rb = 4; // don't let the TBS get too small + else nb_rb=min_rb_unit; + + TBS = mac_xface->get_TBS_DL(mcs,nb_rb); + + while (TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) { + nb_rb += min_rb_unit; // + if (nb_rb>nb_available_rb) { // if we've gone beyond the maximum number of RBs + // (can happen if N_RB_DL is odd) + TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); + nb_rb = nb_available_rb; + break; + } + TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rb); + } + + if(nb_rb == pre_nb_available_rbs[next_ue]) { + for(j=0;jlte_frame_parms->N_RBGS;j++) {// for indicating the rballoc for each sub-band + eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; + } + } else + { + nb_rb_temp = nb_rb; + j = 0; + while((nb_rb_temp > 0) && (jlte_frame_parms->N_RBGS)){ + if(rballoc_sub_UE[next_ue][j] == 1){ + eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; + if ((j == mac_xface->lte_frame_parms->N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))) + nb_rb_temp = nb_rb_temp - min_rb_unit+1; + else + nb_rb_temp = nb_rb_temp - min_rb_unit; + } + j = j+1; + } + } + + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[next_ue].pre_nb_available_rbs = nb_rb; + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[next_ue].dl_pow_off = dl_pow_off[next_ue]; + + for(j=0;jlte_frame_parms->N_RBGS;j++) + PHY_vars_eNB_g[module_idP]->mu_mimo_mode[next_ue].rballoc_sub[j] = eNB_mac_inst[module_idP].UE_template[next_ue].rballoc_subband[harq_pid][j]; + + + // decrease mcs until TBS falls below required length + while ((TBS > (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && (mcs>0)) { + mcs--; + TBS = mac_xface->get_TBS_DL(mcs,nb_rb); + } + + // if we have decreased too much or we don't have enough RBs, increase MCS + while ((TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && ((( dl_pow_off[next_ue]>0) && (mcs<28)) || ( (dl_pow_off[next_ue]==0) && (mcs<=15)))) { + mcs++; + TBS = mac_xface->get_TBS_DL(mcs,nb_rb); + } + + LOG_D(MAC,"dlsch_mcs before and after the rate matching = (%d, %d)\n",eNB_UE_stats->dlsch_mcs1, mcs); #ifdef DEBUG_eNB_SCHEDULER - LOG_D(MAC,"[eNB %d] Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", - Mod_id,mcs,TBS,nb_rb); - // msg("[MAC][eNB ] Reminder of DLSCH with random data %d %d %d %d \n", - // TBS, sdu_length_total, offset, TBS-sdu_length_total-offset); + LOG_D(MAC,"[eNB %d] Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", + module_idP,mcs,TBS,nb_rb); + // msg("[MAC][eNB ] Reminder of DLSCH with random data %d %d %d %d \n", + // TBS, sdu_length_total, offset, TBS-sdu_length_total-offset); #endif - if ((TBS - header_len_dcch - header_len_dtch - sdu_length_total - ta_len) <= 2) { - padding = (TBS - header_len_dcch - header_len_dtch - sdu_length_total - ta_len); - post_padding = 0; - } - else { - padding = 0; - // adjust the header len - if (header_len_dtch==0) - header_len_dcch = header_len_dcch_tmp; - else //if (( header_len_dcch==0)&&((header_len_dtch==1)||(header_len_dtch==2))) - header_len_dtch = header_len_dtch_tmp; - - post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len ; // 1 is for the postpadding header - } + if ((TBS - header_len_dcch - header_len_dtch - sdu_length_total - ta_len) <= 2) { + padding = (TBS - header_len_dcch - header_len_dtch - sdu_length_total - ta_len); + post_padding = 0; + } + else { + padding = 0; + // adjust the header len + if (header_len_dtch==0) + header_len_dcch = header_len_dcch_tmp; + else //if (( header_len_dcch==0)&&((header_len_dtch==1)||(header_len_dtch==2))) + header_len_dtch = header_len_dtch_tmp; + + post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len ; // 1 is for the postpadding header + } #ifndef EXMIMO_IOT - ta_update = eNB_UE_stats->timing_advance_update/4; -#else - ta_update = 0; + ta_update = eNB_UE_stats->timing_advance_update/4; +#else + ta_update = 0; #endif - offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)next_ue][0].payload[0], - // offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0], - num_sdus, //num_sdus - sdu_lengths, // - sdu_lcids, - 255, // no drx - ta_update, // timing advance - NULL, // contention res id - padding, - post_padding); - //#ifdef DEBUG_eNB_SCHEDULER - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, next_ue %d,padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", - Mod_id,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, - ta_len,next_ue,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); - //#endif - - LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n"); - for (i=0;i<16;i++) - LOG_T(MAC,"%x.",dlsch_buffer[i]); - LOG_T(MAC,"\n"); - - // cycle through SDUs and place in dlsch_buffer - memcpy(&eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)next_ue][0].payload[0][offset],dlsch_buffer,sdu_length_total); - // memcpy(&eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]); - - // fill remainder of DLSCH with random data - for (j=0;j<(TBS-sdu_length_total-offset);j++) - eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)next_ue][0].payload[0][offset+sdu_length_total+j] = (char)(taus()&0xff); - //eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset+sdu_lengths[0]+j] = (char)(taus()&0xff); + offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[module_idP].DLSCH_pdu[(module_id_t)next_ue][0].payload[0], + // offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0], + num_sdus, //num_sdus + sdu_lengths, // + sdu_lcids, + 255, // no drx + ta_update, // timing advance + NULL, // contention res id + padding, + post_padding); + //#ifdef DEBUG_eNB_SCHEDULER + LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, next_ue %d,padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", + module_idP,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, + ta_len,next_ue,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); + //#endif + + LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n"); + for (i=0;i<16;i++) + LOG_T(MAC,"%x.",dlsch_buffer[i]); + LOG_T(MAC,"\n"); + + // cycle through SDUs and place in dlsch_buffer + memcpy(&eNB_mac_inst[module_idP].DLSCH_pdu[(module_id_t)next_ue][0].payload[0][offset],dlsch_buffer,sdu_length_total); + // memcpy(&eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]); + + // fill remainder of DLSCH with random data + for (j=0;j<(TBS-sdu_length_total-offset);j++) + eNB_mac_inst[module_idP].DLSCH_pdu[(module_id_t)next_ue][0].payload[0][offset+sdu_length_total+j] = (char)(taus()&0xff); + //eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset+sdu_lengths[0]+j] = (char)(taus()&0xff); #if defined(USER_MODE) && defined(OAI_EMU) - /* Tracing of PDU is done on UE side */ - if (oai_emulation.info.opt_enabled) - trace_pdu(1, (uint8_t *)eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)next_ue][0].payload[0], - TBS, Mod_id, 3, find_UE_RNTI(Mod_id,next_ue), - eNB_mac_inst[Mod_id].subframe,0,0); - LOG_D(OPT,"[eNB %d][DLSCH] Frame %d rnti %x with size %d\n", - Mod_id, frame, find_UE_RNTI(Mod_id,next_ue), TBS); + /* Tracing of PDU is done on UE side */ + if (oai_emulation.info.opt_enabled) + trace_pdu(1, (uint8_t *)eNB_mac_inst[module_idP].DLSCH_pdu[(module_id_t)next_ue][0].payload[0], + TBS, module_idP, 3, find_UE_RNTI(module_idP,next_ue), + eNB_mac_inst[module_idP].subframe,0,0); + LOG_D(OPT,"[eNB %d][DLSCH] Frame %d rnti %x with size %d\n", + module_idP, frameP, find_UE_RNTI(module_idP,next_ue), TBS); #endif - aggregation = process_ue_cqi(Mod_id,next_ue); - nCCE-=(1<dlsch_mcs1; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].dlsch_mcs2=mcs; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].TBS = TBS; - - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].overhead_bytes= TBS- sdu_length_total; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].total_sdu_bytes+= sdu_length_total; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].total_pdu_bytes+= TBS; - eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].total_num_pdus+=1; - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI++; - // printf("DAI update: subframe %d: UE %d, DAI %d\n",subframe,next_ue,eNB_mac_inst[Mod_id].UE_template[next_ue].DAI); - - update_ul_dci(Mod_id,rnti,eNB_mac_inst[Mod_id].UE_template[next_ue].DAI); - } - - switch (mac_xface->get_transmission_mode(Mod_id,rnti)) { - case 1: - case 2: - default: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - break; - case 25: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"Format1 DCI: harq_pid %d, ndi %d\n",harq_pid,((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi); - break; - case 50: - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - break; - case 100: - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - break; - default: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - break; - } - } - else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; - break; - case 25: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; - break; - case 50: - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = 0; - break; - case 100: - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = 0; - break; - default: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; - break; - } - } - break; - case 4: - // if (nb_rb>10) { - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi1 = 1; - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; - ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - - //} - /* else { + aggregation = process_ue_cqi(module_idP,next_ue); + nCCE-=(1<dlsch_mcs1; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].dlsch_mcs2=mcs; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].TBS = TBS; + + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].overhead_bytes= TBS- sdu_length_total; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].total_sdu_bytes+= sdu_length_total; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].total_pdu_bytes+= TBS; + eNB_mac_inst[module_idP].eNB_UE_stats[next_ue].total_num_pdus+=1; + + if (mac_xface->lte_frame_parms->frame_type == TDD) { + eNB_mac_inst[module_idP].UE_template[next_ue].DAI++; + // printf("DAI update: subframeP %d: UE %d, DAI %d\n",subframeP,next_ue,eNB_mac_inst[module_idP].UE_template[next_ue].DAI); + + update_ul_dci(module_idP,rnti,eNB_mac_inst[module_idP].UE_template[next_ue].DAI); + } + + switch (mac_xface->get_transmission_mode(module_idP,rnti)) { + case 1: + case 2: + default: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + break; + case 25: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"Format1 DCI: harq_pid %d, ndi %d\n",harq_pid,((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi); + break; + case 50: + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + break; + case 100: + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + break; + default: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + break; + } + } + else { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + case 25: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + case 50: + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + case 100: + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + default: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + } + } + break; + case 4: + // if (nb_rb>10) { + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs1 = mcs; + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi1 = 1; + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; + ((DCI2_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + + //} + /* else { ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->mcs1 = eNB_UE_stats->DL_cqi[0]; ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->ndi1 = 1; ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; }*/ - break; - case 5: - - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - if(dl_pow_off[next_ue] == 2) - dl_pow_off[next_ue] = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = dl_pow_off[next_ue]; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; - break; - case 6: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; - break; - } - // Toggle NDI for next time - LOG_D(MAC,"Frame %d, subframe %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n",frame,subframe,next_ue, - eNB_mac_inst[Mod_id].UE_template[next_ue].rnti,harq_pid,eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]); - eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]=1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; - } - - else { // There is no data from RLC or MAC header, so don't schedule - + break; + case 5: + + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + if(dl_pow_off[next_ue] == 2) + dl_pow_off[next_ue] = 1; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = dl_pow_off[next_ue]; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; + break; + case 6: + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = 1; + ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; + break; + } + // Toggle NDI for next time + LOG_D(MAC,"Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n",frameP,subframeP,next_ue, + eNB_mac_inst[module_idP].UE_template[next_ue].rnti,harq_pid,eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]); + eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]=1-eNB_mac_inst[module_idP].UE_template[next_ue].oldNDI[harq_pid]; + } + + else { // There is no data from RLC or MAC header, so don't schedule + + } } - } - if (mac_xface->lte_frame_parms->frame_type == TDD) { - DAI = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Frame %d: DAI %d for UE %d\n",Mod_id,frame,DAI,next_ue); - // Save DAI for Format 0 DCI - - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - // if ((subframe==0)||(subframe==1)||(subframe==5)||(subframe==6)) - break; - case 1: - switch (subframe) { - case 1: - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[7] = DAI; - break; - case 4: - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[8] = DAI; - break; - case 6: - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[2] = DAI; - break; - case 9: - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[3] = DAI; - break; - } - case 2: - // if ((subframe==3)||(subframe==8)) - // eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul = DAI; - break; - case 3: - if ((subframe==6)||(subframe==8)||(subframe==0)) { - LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframe %d => %d\n",DAI,subframe, ((subframe+8)%10)>>1); - eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[((subframe+8)%10)>>1] = DAI; - } - break; - case 4: - // if ((subframe==8)||(subframe==9)) - // eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul = DAI; - break; - case 5: - // if (subframe==8) - // eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul = DAI; - break; - case 6: - // if ((subframe==1)||(subframe==4)||(subframe==6)||(subframe==9)) - // eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul = DAI; - break; - default: - break; + if (mac_xface->lte_frame_parms->frame_type == TDD) { + DAI = (eNB_mac_inst[module_idP].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Frame %d: DAI %d for UE %d\n",module_idP,frameP,DAI,next_ue); + // Save DAI for Format 0 DCI + + switch (mac_xface->lte_frame_parms->tdd_config) { + case 0: + // if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)) + break; + case 1: + switch (subframeP) { + case 1: + eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[7] = DAI; + break; + case 4: + eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[8] = DAI; + break; + case 6: + eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[2] = DAI; + break; + case 9: + eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[3] = DAI; + break; + } + case 2: + // if ((subframeP==3)||(subframeP==8)) + // eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul = DAI; + break; + case 3: + if ((subframeP==6)||(subframeP==8)||(subframeP==0)) { + LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1); + eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul[((subframeP+8)%10)>>1] = DAI; + } + break; + case 4: + // if ((subframeP==8)||(subframeP==9)) + // eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul = DAI; + break; + case 5: + // if (subframeP==8) + // eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul = DAI; + break; + case 6: + // if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9)) + // eNB_mac_inst[module_idP].UE_template[next_ue].DAI_ul = DAI; + break; + default: + break; + } } - } - //printf("MAC nCCE : %d\n",*nCCE_used); + //printf("MAC nCCE : %d\n",*nCCE_used); } } -void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subframe) {//, int calibration_flag) { +void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame_t frameP, sub_frame_t subframeP) {//, int calibration_flag) { unsigned char nprb=0; unsigned int nCCE=0; @@ -4250,77 +4302,77 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf int result; #endif - DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; - // LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler\n",Mod_id, frame, subframe); + DCI_PDU *DCI_pdu= &eNB_mac_inst[module_idP].DCI_pdu; + // LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler\n",module_idP, frameP, subframeP); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,1); #if defined(ENABLE_ITTI) do { - // Checks if a message has been sent to MAC sub-task - itti_poll_msg (TASK_MAC_ENB, &msg_p); + // Checks if a message has been sent to MAC sub-task + itti_poll_msg (TASK_MAC_ENB, &msg_p); - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); + if (msg_p != NULL) { + msg_name = ITTI_MSG_NAME (msg_p); + instance = ITTI_MSG_INSTANCE (msg_p); - switch (ITTI_MSG_ID(msg_p)) { - case MESSAGE_TEST: - LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p)); - break; + switch (ITTI_MSG_ID(msg_p)) { + case MESSAGE_TEST: + LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p)); + break; - case RRC_MAC_BCCH_DATA_REQ: - LOG_D(MAC, "Received %s from %s: instance %d, frame %d, eNB_index %d\n", + case RRC_MAC_BCCH_DATA_REQ: + LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n", msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, - RRC_MAC_BCCH_DATA_REQ (msg_p).frame, RRC_MAC_BCCH_DATA_REQ (msg_p).enb_index); + RRC_MAC_BCCH_DATA_REQ (msg_p).frameP, RRC_MAC_BCCH_DATA_REQ (msg_p).enb_index); - // TODO process BCCH data req. - break; + // TODO process BCCH data req. + break; - case RRC_MAC_CCCH_DATA_REQ: - LOG_D(MAC, "Received %s from %s: instance %d, frame %d, eNB_index %d\n", + case RRC_MAC_CCCH_DATA_REQ: + LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n", msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, - RRC_MAC_CCCH_DATA_REQ (msg_p).frame, RRC_MAC_CCCH_DATA_REQ (msg_p).enb_index); + RRC_MAC_CCCH_DATA_REQ (msg_p).frameP, RRC_MAC_CCCH_DATA_REQ (msg_p).enb_index); - // TODO process CCCH data req. - break; + // TODO process CCCH data req. + break; #ifdef Rel10 - case RRC_MAC_MCCH_DATA_REQ: - LOG_D(MAC, "Received %s from %s: instance %d, frame %d, eNB_index %d, mbsfn_sync_area %d\n", + case RRC_MAC_MCCH_DATA_REQ: + LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d, mbsfn_sync_area %d\n", msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, - RRC_MAC_MCCH_DATA_REQ (msg_p).frame, RRC_MAC_MCCH_DATA_REQ (msg_p).enb_index, RRC_MAC_MCCH_DATA_REQ (msg_p).mbsfn_sync_area); + RRC_MAC_MCCH_DATA_REQ (msg_p).frameP, RRC_MAC_MCCH_DATA_REQ (msg_p).enb_index, RRC_MAC_MCCH_DATA_REQ (msg_p).mbsfn_sync_area); - // TODO process MCCH data req. - break; + // TODO process MCCH data req. + break; #endif - default: - LOG_E(MAC, "Received unexpected message %s\n", msg_name); - break; - } + default: + LOG_E(MAC, "Received unexpected message %s\n", msg_name); + break; + } - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - } + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + } } while(msg_p != NULL); #endif -// clear DCI and BCCH contents before scheduling + // clear DCI and BCCH contents before scheduling DCI_pdu->Num_common_dci = 0; DCI_pdu->Num_ue_spec_dci = 0; - eNB_mac_inst[Mod_id].bcch_active = 0; + eNB_mac_inst[module_idP].bcch_active = 0; #ifdef Rel10 - eNB_mac_inst[Mod_id].mcch_active =0; + eNB_mac_inst[module_idP].mcch_active =0; #endif - eNB_mac_inst[Mod_id].frame = frame; - eNB_mac_inst[Mod_id].subframe = subframe; + eNB_mac_inst[module_idP].frame = frameP; + eNB_mac_inst[module_idP].subframe = subframeP; - //if (subframe%5 == 0) + //if (subframeP%5 == 0) #ifdef EXMIMO - pdcp_run(frame, 1, 0, Mod_id); + pdcp_run(frameP, 1, 0, module_idP); /* ret = pthread_mutex_trylock (&pdcp_mutex); if (ret != 0) { @@ -4333,7 +4385,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf else { pdcp_instance_cnt++; pthread_mutex_unlock(&pdcp_mutex); - + if (pdcp_instance_cnt == 0) { if (pthread_cond_signal(&pdcp_cond) != 0) { LOG_E(PDCP,"pthread_cond_signal unsuccessfull\n"); @@ -4344,132 +4396,132 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt); } } - */ + */ #endif #ifdef CELLULAR - rrc_rx_tx(Mod_id, frame, 0, 0); + rrc_rx_tx(module_idP, frameP, 0, 0); #else // check HO - rrc_rx_tx(Mod_id, - frame, - 1, - Mod_id); + rrc_rx_tx(module_idP, + frameP, + 1, + module_idP); #endif #ifdef Rel10 - if (eNB_mac_inst[Mod_id].MBMS_flag >0) { + if (eNB_mac_inst[module_idP].MBMS_flag >0) { - mbsfn_status = schedule_MBMS(Mod_id,frame,subframe); + mbsfn_status = schedule_MBMS(module_idP,frameP,subframeP); } #endif - switch (subframe) { + switch (subframeP) { case 0: // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution) - // Schedule ULSCH for FDD or subframe 4 (TDD config 0,3,6) + // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6) // Schedule Normal DLSCH - - schedule_RA(Mod_id,frame,subframe,2,&nprb,&nCCE); + + schedule_RA(module_idP,frameP,subframeP,2,&nprb,&nCCE); if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD - schedule_ulsch(Mod_id,frame,cooperation_flag,0,4,&nCCE);//,calibration_flag); + schedule_ulsch(module_idP,frameP,cooperation_flag,0,4,&nCCE);//,calibration_flag); } else if ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD - (mac_xface->lte_frame_parms->tdd_config == 3) || - (mac_xface->lte_frame_parms->tdd_config == 6)) - //schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,4,&nCCE);//,calibration_flag); + (mac_xface->lte_frame_parms->tdd_config == 3) || + (mac_xface->lte_frame_parms->tdd_config == 6)) + //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4,&nCCE);//,calibration_flag); + - - // schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); + // schedule_ue_spec(module_idP,subframeP,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,1,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status); break; case 1: - // TDD, schedule UL for subframe 7 (TDD config 0,1) / subframe 8 (TDD Config 6) + // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6) // FDD, schedule normal UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - case 1: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,7,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - case 6: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,8,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 0: + case 1: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7,&nCCE); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + case 6: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8,&nCCE); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + default: + break; + } } else { //FDD - schedule_ulsch(Mod_id,frame,cooperation_flag,1,5,&nCCE); - // schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); - // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + schedule_ulsch(module_idP,frameP,cooperation_flag,1,5,&nCCE); + // schedule_ue_spec(module_idP,subframeP,nprb,&nCCE,mbsfn_status); + // fill_DLSCH_dci(module_idP,subframeP,RBalloc,0,mbsfn_status); } break; case 2: - // TDD, nothing + // TDD, nothing // FDD, normal UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD - schedule_ulsch(Mod_id,frame,cooperation_flag,2,6,&nCCE); - // schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); - // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + schedule_ulsch(module_idP,frameP,cooperation_flag,2,6,&nCCE); + // schedule_ue_spec(module_idP,subframeP,nprb,&nCCE,mbsfn_status); + // fill_DLSCH_dci(module_idP,subframeP,RBalloc,0,mbsfn_status); } break; case 3: - // TDD Config 2, ULSCH for subframe 7 + // TDD Config 2, ULSCH for subframeP 7 // TDD Config 2/5 normal DLSCH // FDD, normal UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { - case 2: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,7,&nCCE); - case 5: - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 2: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7,&nCCE); + case 5: + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + default: + break; + } } else { //FDD - // schedule_ulsch(Mod_id,frame,cooperation_flag,3,7,&nCCE); - // schedule_ue_spec(Mod_id,subframe,0,0,mbsfn_status); - // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + // schedule_ulsch(module_idP,frameP,cooperation_flag,3,7,&nCCE); + // schedule_ue_spec(module_idP,subframeP,0,0,mbsfn_status); + // fill_DLSCH_dci(module_idP,subframeP,RBalloc,0,mbsfn_status); } break; case 4: - // TDD Config 1, ULSCH for subframe 8 + // TDD Config 1, ULSCH for subframeP 8 // TDD Config 1/2/4/5 DLSCH // FDD UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 1: - // schedule_RA(Mod_id,frame,subframe,&nprb,&nCCE); - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,8,&nCCE); - case 2: - case 4: - case 5: - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,1,mbsfn_status); - break; - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 1: + // schedule_RA(module_idP,frameP,subframeP,&nprb,&nCCE); + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8,&nCCE); + case 2: + case 4: + case 5: + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status); + break; + default: + break; + } } else { - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD - schedule_RA(Mod_id, frame, subframe, 0, &nprb, &nCCE); - // schedule_ulsch(Mod_id, frame, cooperation_flag, 4, 8, &nCCE); - //schedule_ue_spec(Mod_id, frame, subframe, nprb, &nCCE, mbsfn_status); - fill_DLSCH_dci(Mod_id, frame, subframe, RBalloc, 1, mbsfn_status); + if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD + schedule_RA(module_idP, frameP, subframeP, 0, &nprb, &nCCE); + // schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8, &nCCE); + //schedule_ue_spec(module_idP, frameP, subframeP, nprb, &nCCE, mbsfn_status); + fill_DLSCH_dci(module_idP, frameP, subframeP, RBalloc, 1, mbsfn_status); - } + } } break; @@ -4478,22 +4530,22 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf // TDD Config 0,6 ULSCH for subframes 9,3 resp. // TDD normal DLSCH // FDD normal UL/DLSCH - schedule_SI(Mod_id,frame,&nprb,&nCCE); - //schedule_RA(Mod_id,frame,subframe,5,&nprb,&nCCE); + schedule_SI(module_idP,frameP,&nprb,&nCCE); + //schedule_RA(module_idP,frameP,subframeP,5,&nprb,&nCCE); if ((mac_xface->lte_frame_parms->frame_type == FDD) ) { - // schedule_RA(Mod_id,frame,subframe,1,&nprb,&nCCE); - // schedule_ulsch(Mod_id,frame,cooperation_flag,5,9,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + // schedule_RA(module_idP,frameP,subframeP,1,&nprb,&nCCE); + // schedule_ulsch(module_idP,frameP,cooperation_flag,5,9,&nCCE); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0 - (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6 - //schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6 + //schedule_ulsch(module_idP,cooperation_flag,subframeP,&nCCE); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } else { - //schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + //schedule_ue_spec(module_idP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } break; @@ -4502,137 +4554,137 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf // TDD Config 3,4,5 Normal DLSCH // FDD normal ULSCH/DLSCH if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - break; - case 1: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,2,&nCCE); - // schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - case 6: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,3,&nCCE); - // schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - case 5: - schedule_RA(Mod_id,frame,subframe,2,&nprb,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,1,mbsfn_status); - break; - case 3: - case 4: - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 0: + break; + case 1: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2,&nCCE); + // schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + case 6: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,&nCCE); + // schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + case 5: + schedule_RA(module_idP,frameP,subframeP,2,&nprb,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status); + break; + case 3: + case 4: + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + + default: + break; + } } else { //FDD - // schedule_ulsch(Mod_id,frame,cooperation_flag,6,0,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + // schedule_ulsch(module_idP,frameP,cooperation_flag,6,0,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } break; - + case 7: // TDD Config 3,4,5 Normal DLSCH // FDD Normal UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 3: - case 4: - // schedule_RA(Mod_id,frame,subframe,3,&nprb,&nCCE); // 3 = Msg3 subframe, not - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); //1,mbsfn_status); - break; - case 5: - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 3: + case 4: + // schedule_RA(module_idP,frameP,subframeP,3,&nprb,&nCCE); // 3 = Msg3 subframeP, not + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); //1,mbsfn_status); + break; + case 5: + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + default: + break; + } } else { //FDD - // schedule_ulsch(Mod_id,frame,cooperation_flag,7,1,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + // schedule_ulsch(module_idP,frameP,cooperation_flag,7,1,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } break; case 8: - // TDD Config 2,3,4,5 ULSCH for subframe 2 + // TDD Config 2,3,4,5 ULSCH for subframeP 2 // // FDD Normal UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 2: - case 3: - case 4: - case 5: - - // schedule_RA(Mod_id,subframe,&nprb,&nCCE); - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,2,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 2: + case 3: + case 4: + case 5: + + // schedule_RA(module_idP,subframeP,&nprb,&nCCE); + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + default: + break; + } } else { //FDD - // schedule_ulsch(Mod_id,frame,cooperation_flag,8,2,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + // schedule_ulsch(module_idP,frameP,cooperation_flag,8,2,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } break; case 9: // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4 if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { - case 1: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,3,&nCCE); - schedule_RA(Mod_id,frame,subframe,7,&nprb,&nCCE); // 7 = Msg3 subframe, not - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,1,mbsfn_status); - break; - case 3: - case 4: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,3,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - case 6: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,4,&nCCE); - //schedule_RA(Mod_id,frame,subframe,&nprb,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - case 2: - case 5: - //schedule_RA(Mod_id,frame,subframe,&nprb,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } + switch (mac_xface->lte_frame_parms->tdd_config) { + case 1: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,&nCCE); + schedule_RA(module_idP,frameP,subframeP,7,&nprb,&nCCE); // 7 = Msg3 subframeP, not + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status); + break; + case 3: + case 4: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + case 6: + schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4,&nCCE); + //schedule_RA(module_idP,frameP,subframeP,&nprb,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + case 2: + case 5: + //schedule_RA(module_idP,frameP,subframeP,&nprb,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); + break; + default: + break; + } } else { //FDD - // schedule_ulsch(Mod_id,frame,cooperation_flag,9,3,&nCCE); - schedule_ue_spec(Mod_id,frame,subframe,0,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + // schedule_ulsch(module_idP,frameP,cooperation_flag,9,3,&nCCE); + schedule_ue_spec(module_idP,frameP,subframeP,0,&nCCE,mbsfn_status); + fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status); } break; - + } DCI_pdu->nCCE = nCCE; - LOG_D(MAC,"frame %d, subframe %d nCCE %d\n",frame,subframe,nCCE); + LOG_D(MAC,"frameP %d, subframeP %d nCCE %d\n",frameP,subframeP,nCCE); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,0); } diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c index e98403fa36..21efccfe21 100644 --- a/openair2/LAYER2/MAC/l1_helpers.c +++ b/openair2/LAYER2/MAC/l1_helpers.c @@ -39,23 +39,23 @@ #include "extern.h" #include "UTIL/LOG/log.h" -s8 get_Po_NOMINAL_PUSCH(u8 Mod_id) { +s8 get_Po_NOMINAL_PUSCH(module_id_t module_idP) { RACH_ConfigCommon_t *rach_ConfigCommon = NULL; - if (UE_mac_inst[Mod_id].radioResourceConfigCommon) - rach_ConfigCommon = &UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon; + if (UE_mac_inst[module_idP].radioResourceConfigCommon) + rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; else { - LOG_E(MAC,"[UE %d] FATAL radioResourceConfigCommon is NULL !!!\n",Mod_id); + LOG_E(MAC,"[UE %d] FATAL radioResourceConfigCommon is NULL !!!\n",module_idP); mac_xface->macphy_exit(""); } return(-120 + (rach_ConfigCommon->powerRampingParameters.preambleInitialReceivedTargetPower<<1) + - get_DELTA_PREAMBLE(Mod_id)); + get_DELTA_PREAMBLE(module_idP)); } -s8 get_deltaP_rampup(u8 Mod_id) { +s8 get_deltaP_rampup(module_id_t module_idP) { - LOG_D(MAC,"[PUSCH]%d dB\n",UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER<<1); - return((s8)(UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER<<1)); + LOG_D(MAC,"[PUSCH]%d dB\n",UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER<<1); + return((s8)(UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER<<1)); } diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 1fc5d38a5a..e3ada9a319 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -25,16 +25,16 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file main.c -* \brief top init of Layer 2 -* \author Raymond Knopp and Navid Nikaein -* \date 2011 -* \version 0.5 -* \email: navid.nikaein@eurecom.fr -* @ingroup _mac + * \brief top init of Layer 2 + * \author Raymond Knopp and Navid Nikaein + * \date 2011 + * \version 0.5 + * \email: navid.nikaein@eurecom.fr + * @ingroup _mac -*/ + */ #ifdef USER_MODE #include "LAYER2/register.h" @@ -74,98 +74,94 @@ /***********************************************************************/ -void dl_phy_sync_success(unsigned char Mod_id, - u32 frame, - unsigned char eNB_index, - u8 first_sync){ //init as MR -/***********************************************************************/ - LOG_D(MAC,"[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n", Mod_id, frame, eNB_index); +void dl_phy_sync_success(module_id_t module_idP, + frame_t frameP, + unsigned char eNB_index, + u8 first_sync){ //init as MR + /***********************************************************************/ + LOG_D(MAC,"[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n", module_idP, frameP, eNB_index); if (first_sync==1) { - layer2_init_UE(Mod_id); - openair_rrc_ue_init(Mod_id,eNB_index); + layer2_init_UE(module_idP); + openair_rrc_ue_init(module_idP,eNB_index); } else { - mac_in_sync_ind(Mod_id,frame,eNB_index); + mac_in_sync_ind(module_idP,frameP,eNB_index); } - + } /***********************************************************************/ -void mrbch_phy_sync_failure(u8 Mod_id, u32 frame, u8 free_eNB_index){//init as CH +void mrbch_phy_sync_failure(module_id_t module_idP, frame_t frameP, u8 free_eNB_index){//init as CH /***********************************************************************/ - LOG_I(MAC,"[eNB %d] Frame %d: PHY Sync failure \n",Mod_id,frame); - layer2_init_eNB(Mod_id, free_eNB_index); - openair_rrc_eNB_init(Mod_id); - - - - + LOG_I(MAC,"[eNB %d] Frame %d: PHY Sync failure \n",module_idP,frameP); + layer2_init_eNB(module_idP, free_eNB_index); + openair_rrc_eNB_init(module_idP); } -char layer2_init_eNB(unsigned char Mod_id, unsigned char eNB_index){ +char layer2_init_eNB(module_id_t module_idP, unsigned char eNB_index){ return 0; } /***********************************************************************/ -char layer2_init_UE(unsigned char Mod_id){ - +char layer2_init_UE(module_id_t module_idP){ + return 0; } /***********************************************************************/ -void mac_UE_out_of_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index){ -/***********************************************************************/ +void mac_UE_out_of_sync_ind(module_id_t module_idP, frame_t frameP, u16 eNB_index){ + /***********************************************************************/ -// Mac_rlc_xface->mac_out_of_sync_ind(Mod_id, frame, eNB_index); + // Mac_rlc_xface->mac_out_of_sync_ind(Mod_id, frameP, eNB_index); } /***********************************************************************/ int mac_top_init(int eMBMS_active, u8 cba_group_active, u8 HO_active){ -/***********************************************************************/ - unsigned char Mod_id,i,j; + /***********************************************************************/ + module_id_t Mod_id,i,j; RA_TEMPLATE *RA_template; UE_TEMPLATE *UE_template; int size_bytes1,size_bytes2,size_bits1,size_bits2; LOG_I(MAC,"[MAIN] Init function start:Nb_UE_INST=%d\n",NB_UE_INST); if (NB_UE_INST>0) { - UE_mac_inst = (UE_MAC_INST*)malloc16(NB_UE_INST*sizeof(UE_MAC_INST)); - if (UE_mac_inst == NULL) { - LOG_C(MAC,"[MAIN] Can't ALLOCATE %d Bytes for %d UE_MAC_INST with size %d \n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,sizeof(UE_MAC_INST)); - mac_xface->macphy_exit("[MAC][MAIN] not enough memory for UEs \n"); - } - LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d UE_MAC_INST @ %p\n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,UE_mac_inst); - - bzero(UE_mac_inst,NB_UE_INST*sizeof(UE_MAC_INST)); - for(i=0;imacphy_exit("[MAC][MAIN] not enough memory for UEs \n"); + } + LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d UE_MAC_INST @ %p\n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,UE_mac_inst); + + bzero(UE_mac_inst,NB_UE_INST*sizeof(UE_MAC_INST)); + for(i=0;i0) { - eNB_mac_inst = (eNB_MAC_INST*)malloc16(NB_eNB_INST*sizeof(eNB_MAC_INST)); - if (eNB_mac_inst == NULL){ - LOG_D(MAC,"[MAIN] can't ALLOCATE %d Bytes for %d eNB_MAC_INST with size %d \n",NB_eNB_INST*sizeof(eNB_MAC_INST),NB_eNB_INST,sizeof(eNB_MAC_INST)); - mac_xface->macphy_exit("[MAC][MAIN] not enough memory for eNB \n"); - } - LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d eNB_MAC_INST @ %p\n",NB_eNB_INST*sizeof(eNB_MAC_INST),NB_eNB_INST,eNB_mac_inst); - bzero(eNB_mac_inst,NB_eNB_INST*sizeof(eNB_MAC_INST)); + eNB_mac_inst = (eNB_MAC_INST*)malloc16(NB_eNB_INST*sizeof(eNB_MAC_INST)); + if (eNB_mac_inst == NULL){ + LOG_D(MAC,"[MAIN] can't ALLOCATE %d Bytes for %d eNB_MAC_INST with size %d \n",NB_eNB_INST*sizeof(eNB_MAC_INST),NB_eNB_INST,sizeof(eNB_MAC_INST)); + mac_xface->macphy_exit("[MAC][MAIN] not enough memory for eNB \n"); + } + LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d eNB_MAC_INST @ %p\n",NB_eNB_INST*sizeof(eNB_MAC_INST),NB_eNB_INST,eNB_mac_inst); + bzero(eNB_mac_inst,NB_eNB_INST*sizeof(eNB_MAC_INST)); } else eNB_mac_inst = NULL; - + for(Mod_id=0;Mod_idIs_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 - /*#ifdef Rel10 + /*#ifdef Rel10 int n; for (n=0;n<4096;n++) eNB_mac_inst[Mod_id].MCH_pdu.payload[n] = taus(); @@ -176,18 +172,18 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active, u8 HO_active){ if (Is_rrc_registered == 1){ - LOG_I(MAC,"[MAIN] calling RRC\n"); + LOG_I(MAC,"[MAIN] calling RRC\n"); #ifndef CELLULAR //nothing to be done yet for cellular - openair_rrc_top_init(eMBMS_active, cba_group_active,HO_active); + openair_rrc_top_init(eMBMS_active, cba_group_active,HO_active); #endif } - else { + else { LOG_I(MAC,"[MAIN] Running without an RRC\n"); - } + } #ifndef USER_MODE #ifndef PHY_EMUL LOG_I(MAC,"[MAIN] add openair2 proc\n"); -//// add_openair2_stats(); + //// add_openair2_stats(); #endif #endif @@ -196,102 +192,102 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active, u8 HO_active){ // Set up DCIs for TDD 5MHz Config 1..6 for (i=0;ilte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - break; - case 25: - size_bytes1 = sizeof(DCI1A_5MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_5MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_5MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_5MHz_TDD_1_6_t; - break; - case 50: - size_bytes1 = sizeof(DCI1A_10MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_10MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_10MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_10MHz_TDD_1_6_t; - break; - case 100: - size_bytes1 = sizeof(DCI1A_20MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_20MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_20MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_20MHz_TDD_1_6_t; - break; - default: - size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - break; - } - + LOG_D(MAC,"[MAIN][eNB %d] initializing RA_template\n",i); + LOG_D(MAC, "[MSC_NEW][FRAME 00000][MAC_eNB][MOD %02d][]\n", i); + + RA_template = (RA_TEMPLATE *)&eNB_mac_inst[i].RA_template[0]; + for (j=0;jlte_frame_parms->frame_type == TDD) { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + break; + case 25: + size_bytes1 = sizeof(DCI1A_5MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_5MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_5MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_5MHz_TDD_1_6_t; + break; + case 50: + size_bytes1 = sizeof(DCI1A_10MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_10MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_10MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_10MHz_TDD_1_6_t; + break; + case 100: + size_bytes1 = sizeof(DCI1A_20MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_20MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_20MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_20MHz_TDD_1_6_t; + break; + default: + size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + break; + } + + } + else { + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; + size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; + break; + case 25: + size_bytes1 = sizeof(DCI1A_5MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_5MHz_FDD_t); + size_bits1 = sizeof_DCI1A_5MHz_FDD_t; + size_bits2 = sizeof_DCI1A_5MHz_FDD_t; + break; + case 50: + size_bytes1 = sizeof(DCI1A_10MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_10MHz_FDD_t); + size_bits1 = sizeof_DCI1A_10MHz_FDD_t; + size_bits2 = sizeof_DCI1A_10MHz_FDD_t; + break; + case 100: + size_bytes1 = sizeof(DCI1A_20MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_20MHz_FDD_t); + size_bits1 = sizeof_DCI1A_20MHz_FDD_t; + size_bits2 = sizeof_DCI1A_20MHz_FDD_t; + break; + default: + size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; + size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; + break; + } + } + memcpy((void *)&RA_template[j].RA_alloc_pdu1[0],(void *)&RA_alloc_pdu,size_bytes1); + memcpy((void *)&RA_template[j].RA_alloc_pdu2[0],(void *)&DLSCH_alloc_pdu1A,size_bytes2); + RA_template[j].RA_dci_size_bytes1 = size_bytes1; + RA_template[j].RA_dci_size_bytes2 = size_bytes2; + RA_template[j].RA_dci_size_bits1 = size_bits1; + RA_template[j].RA_dci_size_bits2 = size_bits2; + + RA_template[j].RA_dci_fmt1 = format1A; + RA_template[j].RA_dci_fmt2 = format1A; } - else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; - size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; - break; - case 25: - size_bytes1 = sizeof(DCI1A_5MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_5MHz_FDD_t); - size_bits1 = sizeof_DCI1A_5MHz_FDD_t; - size_bits2 = sizeof_DCI1A_5MHz_FDD_t; - break; - case 50: - size_bytes1 = sizeof(DCI1A_10MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_10MHz_FDD_t); - size_bits1 = sizeof_DCI1A_10MHz_FDD_t; - size_bits2 = sizeof_DCI1A_10MHz_FDD_t; - break; - case 100: - size_bytes1 = sizeof(DCI1A_20MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_20MHz_FDD_t); - size_bits1 = sizeof_DCI1A_20MHz_FDD_t; - size_bits2 = sizeof_DCI1A_20MHz_FDD_t; - break; - default: - size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; - size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; - break; - } + + memset (&eNB_mac_inst[i].eNB_stats,0,sizeof(eNB_STATS)); + UE_template = (UE_TEMPLATE *)&eNB_mac_inst[i].UE_template[0]; + for (j=0;jget_SB_size(mac_xface->lte_frame_parms->N_RB_DL); @@ -299,20 +295,20 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active, u8 HO_active){ srand (time(NULL)); for(j=0;jIs_cluster_head[0] = 1; //Mac_rlc_xface->Is_cluster_head[1] = 0; - + return(1); } diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index f44513973a..3d80ce6418 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -1,4 +1,4 @@ - + /******************************************************************************* Eurecom OpenAirInterface @@ -26,7 +26,7 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file pre_processor.c * \brief procedures related to UE * \author Ankit Bhamri @@ -56,7 +56,7 @@ #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" - + #define DEBUG_eNB_SCHEDULER 1 #define DEBUG_HEADER_PARSING 1 //#define DEBUG_PACKET_TRACE 1 @@ -67,286 +67,300 @@ #ifndef USER_MODE #define msg debug_msg #endif -*/ + */ extern inline unsigned int taus(void); // This function stores the downlink buffer for all the logical channels -void store_dlsch_buffer (unsigned char Mod_id, - u32 frame, - unsigned char subframe){ +void store_dlsch_buffer (module_id_t Mod_id, + frame_t frameP, + sub_frame_t subframeP){ - unsigned char next_ue; - u16 rnti,i=0; + module_id_t next_ue; + rnti_t rnti; + u16 i=0; mac_rlc_status_resp_t rlc_status; - unsigned char UE_id,granted_UEs; + unsigned char UE_id,granted_UEs; granted_UEs = find_dlgranted_UEs(Mod_id); for (UE_id=0;UE_id0) - LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and %d size, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", - Mod_id, frame, subframe, next_ue, - i, eNB_mac_inst[Mod_id].UE_template[next_ue].dl_pdus_in_buffer[i],eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_info[i], - eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_head_sdu_creation_time[i], - eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_head_sdu_remaining_size_to_send[i], - eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_head_sdu_is_segmented[i] - ); + /* note for dl_buffer_head_sdu_remaining_size_to_send[i] : + * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent + */ + if (eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_info[i]>0) + LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and %d size, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", + Mod_id, frameP, subframeP, next_ue, + i, eNB_mac_inst[Mod_id].UE_template[next_ue].dl_pdus_in_buffer[i],eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_info[i], + eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_head_sdu_creation_time[i], + eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_head_sdu_remaining_size_to_send[i], + eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_head_sdu_is_segmented[i] + ); #endif - } + } #ifdef DEBUG_eNB_SCHEDULER - if ( eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total>0) - LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", - Mod_id, frame, subframe, next_ue, - eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total, - eNB_mac_inst[Mod_id].UE_template[next_ue].dl_pdus_total - ); + if ( eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total>0) + LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", + Mod_id, frameP, subframeP, next_ue, + eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total, + eNB_mac_inst[Mod_id].UE_template[next_ue].dl_pdus_total + ); #endif } } // This function returns the estimated number of RBs required by each UE for downlink scheduling -void assign_rbs_required (unsigned char Mod_id, - u32 frame, - unsigned char subframe, - u16 *nb_rbs_required){ +void assign_rbs_required (module_id_t Mod_id, + frame_t frameP, + sub_frame_t subframe, + u16 *nb_rbs_required){ - - unsigned char next_ue; - u16 rnti,TBS = 0; - LTE_eNB_UE_stats* eNB_UE_stats; - unsigned char UE_id, granted_UEs; + + module_id_t next_ue; + rnti_t rnti; + u16 TBS = 0; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + module_id_t ue_inst; + unsigned char granted_UEs; granted_UEs = find_dlgranted_UEs(Mod_id); - for (UE_id=0;UE_idget_eNB_UE_stats(Mod_id,rnti); - //if(eNB_UE_stats == NULL) - //continue; - - - switch(eNB_UE_stats->DL_cqi[0]) + for (ue_inst=0;ue_instget_eNB_UE_stats(Mod_id,rnti); + //if(eNB_UE_stats == NULL) + //continue; + + + switch(eNB_UE_stats->DL_cqi[0]) { case 0: - eNB_UE_stats->dlsch_mcs1 = 0; - break; + eNB_UE_stats->dlsch_mcs1 = 0; + break; case 1: - eNB_UE_stats->dlsch_mcs1 = 0; - break; + eNB_UE_stats->dlsch_mcs1 = 0; + break; case 2: - eNB_UE_stats->dlsch_mcs1 = 0; - break; + eNB_UE_stats->dlsch_mcs1 = 0; + break; case 3: - eNB_UE_stats->dlsch_mcs1 = 2; - break; + eNB_UE_stats->dlsch_mcs1 = 2; + break; case 4: - eNB_UE_stats->dlsch_mcs1 = 4; - break; + eNB_UE_stats->dlsch_mcs1 = 4; + break; case 5: - eNB_UE_stats->dlsch_mcs1 = 6; - break; + eNB_UE_stats->dlsch_mcs1 = 6; + break; case 6: - eNB_UE_stats->dlsch_mcs1 = 8; - break; + eNB_UE_stats->dlsch_mcs1 = 8; + break; case 7: - eNB_UE_stats->dlsch_mcs1 = 11; - break; + eNB_UE_stats->dlsch_mcs1 = 11; + break; case 8: - eNB_UE_stats->dlsch_mcs1 = 13; - break; + eNB_UE_stats->dlsch_mcs1 = 13; + break; case 9: - eNB_UE_stats->dlsch_mcs1 = 16; - break; + eNB_UE_stats->dlsch_mcs1 = 16; + break; case 10: - eNB_UE_stats->dlsch_mcs1 = 18; - break; + eNB_UE_stats->dlsch_mcs1 = 18; + break; case 11: - eNB_UE_stats->dlsch_mcs1 = 20; - break; + eNB_UE_stats->dlsch_mcs1 = 20; + break; case 12: - eNB_UE_stats->dlsch_mcs1 = 22; - break; + eNB_UE_stats->dlsch_mcs1 = 22; + break; case 13: - eNB_UE_stats->dlsch_mcs1 = 22;//25 - break; + eNB_UE_stats->dlsch_mcs1 = 22;//25 + break; case 14: - eNB_UE_stats->dlsch_mcs1 = 22;//27 - break; + eNB_UE_stats->dlsch_mcs1 = 22;//27 + break; case 15: - eNB_UE_stats->dlsch_mcs1 = 22;//28 - break; + eNB_UE_stats->dlsch_mcs1 = 22;//28 + break; default: - printf("Invalid CQI"); - exit(-1); + printf("Invalid CQI"); + exit(-1); } - - - - if ((mac_get_rrc_status(Mod_id,1,next_ue) < RRC_RECONFIGURED)){ - nb_rbs_required[next_ue] = mac_xface->lte_frame_parms->N_RB_DL; - continue; - } - - - if (eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total> 0) { - - if (eNB_UE_stats->dlsch_mcs1==0) nb_rbs_required[next_ue] = 4; // don't let the TBS get too small - else nb_rbs_required[next_ue] = 2; - - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rbs_required[next_ue]); - - while (TBS < eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total) { - nb_rbs_required[next_ue] += 2; - if (nb_rbs_required[next_ue]>mac_xface->lte_frame_parms->N_RB_DL) { - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,mac_xface->lte_frame_parms->N_RB_DL); - nb_rbs_required[next_ue] = mac_xface->lte_frame_parms->N_RB_DL;// calculating required number of RBs for each UE - break; - } - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rbs_required[next_ue]); + + + + if ((mac_get_rrc_status(Mod_id,1,next_ue) < RRC_RECONFIGURED)){ + nb_rbs_required[next_ue] = mac_xface->lte_frame_parms->N_RB_DL; + continue; + } + + + if (eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total> 0) { + + if (eNB_UE_stats->dlsch_mcs1==0) nb_rbs_required[next_ue] = 4; // don't let the TBS get too small + else nb_rbs_required[next_ue] = 2; + + TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rbs_required[next_ue]); + + while (TBS < eNB_mac_inst[Mod_id].UE_template[next_ue].dl_buffer_total) { + nb_rbs_required[next_ue] += 2; + if (nb_rbs_required[next_ue]>mac_xface->lte_frame_parms->N_RB_DL) { + TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,mac_xface->lte_frame_parms->N_RB_DL); + nb_rbs_required[next_ue] = mac_xface->lte_frame_parms->N_RB_DL;// calculating required number of RBs for each UE + break; + } + TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rbs_required[next_ue]); + } + } - - } - + } } // This fuction sorts the UE in order their dlsch buffer and CQI -void sort_UEs (unsigned char Mod_id, - unsigned char subframe, - u16 *UE_id_sorted){ - - unsigned char next_ue1,next_ue2,round1=0,round2=0,harq_pid1=0,harq_pid2=0; - u16 UE_id,granted_UEs,i=0,ii=0,j=0,rnti1,rnti2; - LTE_eNB_UE_stats* eNB_UE_stats1; - LTE_eNB_UE_stats* eNB_UE_stats2; - - +void sort_UEs (module_id_t Mod_id, + sub_frame_t subframe, + module_id_t *UE_id_sorted){ + + module_id_t next_ue1,next_ue2; + unsigned char round1=0,round2=0,harq_pid1=0,harq_pid2=0; + module_id_t ue_inst; + u16 granted_UEs,i=0,ii=0,j=0; + rnti_t rnti1,rnti2; + LTE_eNB_UE_stats *eNB_UE_stats1 = NULL; + LTE_eNB_UE_stats *eNB_UE_stats2 = NULL; + + granted_UEs = find_dlgranted_UEs(Mod_id); - - - for (UE_id=0;UE_idget_eNB_UE_stats(Mod_id,rnti1); - - mac_xface->get_ue_active_harq_pid(Mod_id,rnti1,subframe,&harq_pid1,&round1,0); - - - for(ii=i+1;iiget_eNB_UE_stats(Mod_id,rnti2); - - mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); - - if(round2 > round1){ - UE_id_sorted[i] = next_ue2; - UE_id_sorted[ii] = next_ue1; - } - else if (round2 == round1){ - for(j=0;jDL_cqi[0] < eNB_UE_stats2->DL_cqi[0]){ - UE_id_sorted[i] = next_ue2; - UE_id_sorted[ii] = next_ue1; - } - } - } + + next_ue1 = UE_id_sorted[i]; + + rnti1 = find_UE_RNTI(Mod_id,next_ue1); + if(rnti1 == 0) + continue; + + + eNB_UE_stats1 = mac_xface->get_eNB_UE_stats(Mod_id,rnti1); + + mac_xface->get_ue_active_harq_pid(Mod_id,rnti1,subframe,&harq_pid1,&round1,0); + + + for(ii=i+1;iiget_eNB_UE_stats(Mod_id,rnti2); + + mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); + + if(round2 > round1){ + UE_id_sorted[i] = next_ue2; + UE_id_sorted[ii] = next_ue1; + } + else if (round2 == round1){ + for(j=0;jDL_cqi[0] < eNB_UE_stats2->DL_cqi[0]){ + UE_id_sorted[i] = next_ue2; + UE_id_sorted[ii] = next_ue1; + } + } + } + } } - } } } - + // This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done -void dlsch_scheduler_pre_processor (unsigned char Mod_id, - u32 frame, - unsigned char subframe, - u8 *dl_pow_off, - u16 *pre_nb_available_rbs, - int N_RBGS, - unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]){ +void dlsch_scheduler_pre_processor (module_id_t Mod_id, + frame_t frameP, + sub_frame_t subframeP, + u8 *dl_pow_off, + u16 *pre_nb_available_rbs, + int N_RBGS, + unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]){ unsigned char next_ue,next_ue1,next_ue2,rballoc_sub[mac_xface->lte_frame_parms->N_RBGS],harq_pid=0,harq_pid1=0,harq_pid2=0,round=0,round1=0,round2=0,total_ue_count=0; unsigned char MIMO_mode_indicator[mac_xface->lte_frame_parms->N_RBGS]; - u16 UE_id,UE_id_sorted[NUMBER_OF_UE_MAX],granted_UEs,i,ii,j,nb_rbs_required[NUMBER_OF_UE_MAX],nb_rbs_required_remaining[NUMBER_OF_UE_MAX],nb_rbs_required_remaining_1[NUMBER_OF_UE_MAX],i1,i2,i3,r1=0,average_rbs_per_user=0; - u16 rnti,rnti1,rnti2; - LTE_eNB_UE_stats* eNB_UE_stats1; - LTE_eNB_UE_stats* eNB_UE_stats2; - u16 min_rb_unit; + module_id_t UE_id, i; + module_id_t UE_id_sorted[NUMBER_OF_UE_MAX]; + module_id_t granted_UEs; + u16 ii,j; + u16 nb_rbs_required[NUMBER_OF_UE_MAX]; + u16 nb_rbs_required_remaining[NUMBER_OF_UE_MAX]; + u16 nb_rbs_required_remaining_1[NUMBER_OF_UE_MAX]; + u16 i1,i2,i3,r1=0; + u16 average_rbs_per_user=0; + rnti_t rnti,rnti1,rnti2; + LTE_eNB_UE_stats *eNB_UE_stats1 = NULL; + LTE_eNB_UE_stats *eNB_UE_stats2 = NULL; + u16 min_rb_unit; switch (mac_xface->lte_frame_parms->N_RB_DL) { @@ -371,42 +385,42 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, for(i=0;ilte_frame_parms->N_RBGS); //exit(-1); // Store the DLSCH buffer for each logical channel - store_dlsch_buffer (Mod_id,frame,subframe); + store_dlsch_buffer (Mod_id,frameP,subframeP); // Calculate the number of RBs required by each UE on the basis of logical channel's buffer - assign_rbs_required (Mod_id,frame,subframe,nb_rbs_required); + assign_rbs_required (Mod_id,frameP,subframeP,nb_rbs_required); // Sorts the user on the basis of dlsch logical channel buffer and CQI - sort_UEs (Mod_id,subframe,UE_id_sorted); - //printf ("Frame:%d,SUCCESS %d[%d] %d[%d]\n",frame,UE_id_sorted[0],nb_rbs_required[UE_id_sorted[0]],UE_id_sorted[1],nb_rbs_required[UE_id_sorted[1]]); - + sort_UEs (Mod_id,subframeP,UE_id_sorted); + //printf ("Frame:%d,SUCCESS %d[%d] %d[%d]\n",frameP,UE_id_sorted[0],nb_rbs_required[UE_id_sorted[0]],UE_id_sorted[1],nb_rbs_required[UE_id_sorted[1]]); + for (i=0;iget_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - if(round>0) - nb_rbs_required[i] = eNB_mac_inst[Mod_id].UE_template[i].nb_rb[harq_pid]; - //nb_rbs_required_remaining[i] = nb_rbs_required[i]; - if(nb_rbs_required[i] > 0) - total_ue_count = total_ue_count + 1; + rnti = find_UE_RNTI(Mod_id,i); + if(rnti == 0) + continue; + mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframeP,&harq_pid,&round,0); + if(round>0) + nb_rbs_required[i] = eNB_mac_inst[Mod_id].UE_template[i].nb_rb[harq_pid]; + //nb_rbs_required_remaining[i] = nb_rbs_required[i]; + if(nb_rbs_required[i] > 0) + total_ue_count = total_ue_count + 1; } // hypotetical assignement if((total_ue_count > 0) && ( min_rb_unit * total_ue_count <= mac_xface->lte_frame_parms->N_RB_DL ) ) @@ -415,316 +429,316 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, average_rbs_per_user = min_rb_unit; for(i=0;iget_ue_active_harq_pid(Mod_id,rnti,subframeP,&harq_pid,&round,0); + + if ((mac_get_rrc_status(Mod_id,1,next_ue) < RRC_RECONFIGURED) && (round >0)) { + + + + for(j=0;j0)){ + + rballoc_sub[j] = 1; + rballoc_sub_UE[next_ue][j] = 1; + + MIMO_mode_indicator[j] = 1; + + if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) + dl_pow_off[next_ue] = 1; + // if the total rb is odd + if ((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))) { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; + } + } + } + } } - // retransmission in control channels - for (i = 0 ;iget_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - if ((mac_get_rrc_status(Mod_id,1,next_ue) < RRC_RECONFIGURED) && (round >0)) { + // retransmission in data channels + for (i = 0 ;iget_ue_active_harq_pid(Mod_id,rnti,subframeP,&harq_pid,&round,0); + + if ((mac_get_rrc_status(Mod_id,1,next_ue) >= RRC_RECONFIGURED) && (round > 0)) { - for(j=0;j0)){ - rballoc_sub[j] = 1; - rballoc_sub_UE[next_ue][j] = 1; + for(j=0;j0)){ - if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) - dl_pow_off[next_ue] = 1; - // if the total rb is odd - if ((j == N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))) { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; - } - else { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; - } - } - } + rballoc_sub[j] = 1; + rballoc_sub_UE[next_ue][j] = 1; + + MIMO_mode_indicator[j] = 1; + + if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) + dl_pow_off[next_ue] = 1; + + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit + 1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; + } + } + } + } } - } + // control channel in the 1st transmission + for (i = 0 ;iget_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); + next_ue = UE_id_sorted[i]; + rnti = find_UE_RNTI(Mod_id,next_ue); + if(rnti == 0) + continue; + mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframeP,&harq_pid,&round,0); + + if ((mac_get_rrc_status(Mod_id,1,next_ue) < RRC_RECONFIGURED) && (round == 0)) { - if ((mac_get_rrc_status(Mod_id,1,next_ue) >= RRC_RECONFIGURED) && (round > 0)) { - for(j=0;j0)){ + if((rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue][j] == 0) && (nb_rbs_required_remaining[next_ue]>0)){ - rballoc_sub[j] = 1; - rballoc_sub_UE[next_ue][j] = 1; + rballoc_sub[j] = 1; + rballoc_sub_UE[next_ue][j] = 1; - MIMO_mode_indicator[j] = 1; + MIMO_mode_indicator[j] = 1; - if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) - dl_pow_off[next_ue] = 1; + if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) + dl_pow_off[next_ue] = 1; - if((j == N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit + 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; - } - else { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; - } - } - } + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit + 1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; + } + } + } + } } - } - // control channel in the 1st transmission - for (i = 0 ;iget_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - if ((mac_get_rrc_status(Mod_id,1,next_ue) < RRC_RECONFIGURED) && (round == 0)) { + // data chanel TM5 + for (i = 0 ;iget_eNB_UE_stats(Mod_id,rnti1); - if((rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue][j] == 0) && (nb_rbs_required_remaining[next_ue]>0)){ + mac_xface->get_ue_active_harq_pid(Mod_id,rnti1,subframeP,&harq_pid1,&round1,0); - rballoc_sub[j] = 1; - rballoc_sub_UE[next_ue][j] = 1; + if ((mac_get_rrc_status(Mod_id,1,next_ue1) >= RRC_RECONFIGURED) && (round1==0) && (mac_xface->get_transmission_mode(Mod_id,rnti1)==5) && (dl_pow_off[next_ue1] != 1)) { - MIMO_mode_indicator[j] = 1; - if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) - dl_pow_off[next_ue] = 1; + for(j=0;jlte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit + 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; - } - else { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; - } - } - } - } - } + if((((j == (N_RBGS-1))&& (rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue1][j] == 0)) || ((j < (N_RBGS-1)) && (rballoc_sub[j+1] == 0) && (rballoc_sub_UE[next_ue1][j+1] == 0))) && (nb_rbs_required_remaining[next_ue1]>0)){ - + for (ii = i+1;ii < granted_UEs;ii++) { - // data chanel TM5 - for (i = 0 ;iget_eNB_UE_stats(Mod_id,rnti1); + eNB_UE_stats2 = mac_xface->get_eNB_UE_stats(Mod_id,rnti2); + mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframeP,&harq_pid2,&round2,0); - mac_xface->get_ue_active_harq_pid(Mod_id,rnti1,subframe,&harq_pid1,&round1,0); + if ((mac_get_rrc_status(Mod_id,1,next_ue2) >= RRC_RECONFIGURED) && (round2==0) && (mac_xface->get_transmission_mode(Mod_id,rnti2)==5) && (dl_pow_off[next_ue2] != 1)) { + + if((((j == (N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j] == 0)) || ((j < (N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j+1] == 0))) && (nb_rbs_required_remaining[next_ue2]>0)){ + + if((((eNB_UE_stats2->DL_pmi_single^eNB_UE_stats1->DL_pmi_single)<<(14-j))&0xc000)== 0x4000){ //MU-MIMO only for 25 RBs configuration + + rballoc_sub[j] = 1; + rballoc_sub_UE[next_ue1][j] = 1; + rballoc_sub_UE[next_ue2][j] = 1; + MIMO_mode_indicator[j] = 0; + + if (j< N_RBGS-1) { + rballoc_sub[j+1] = 1; + rballoc_sub_UE[next_ue1][j+1] = 1; + rballoc_sub_UE[next_ue2][j+1] = 1; + MIMO_mode_indicator[j+1] = 0; + } + + dl_pow_off[next_ue1] = 0; + dl_pow_off[next_ue2] = 0; - if ((mac_get_rrc_status(Mod_id,1,next_ue1) >= RRC_RECONFIGURED) && (round1==0) && (mac_xface->get_transmission_mode(Mod_id,rnti1)==5) && (dl_pow_off[next_ue1] != 1)) { - - - for(j=0;j0)){ - - for (ii = i+1;ii < granted_UEs;ii++) { - - next_ue2 = UE_id_sorted[ii]; - rnti2 = find_UE_RNTI(Mod_id,next_ue2); - if(rnti2 == 0) - continue; - - eNB_UE_stats2 = mac_xface->get_eNB_UE_stats(Mod_id,rnti2); - mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); - - if ((mac_get_rrc_status(Mod_id,1,next_ue2) >= RRC_RECONFIGURED) && (round2==0) && (mac_xface->get_transmission_mode(Mod_id,rnti2)==5) && (dl_pow_off[next_ue2] != 1)) { - - if((((j == (N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j] == 0)) || ((j < (N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j+1] == 0))) && (nb_rbs_required_remaining[next_ue2]>0)){ - - if((((eNB_UE_stats2->DL_pmi_single^eNB_UE_stats1->DL_pmi_single)<<(14-j))&0xc000)== 0x4000){ //MU-MIMO only for 25 RBs configuration - - rballoc_sub[j] = 1; - rballoc_sub_UE[next_ue1][j] = 1; - rballoc_sub_UE[next_ue2][j] = 1; - MIMO_mode_indicator[j] = 0; - - if (j< N_RBGS-1) { - rballoc_sub[j+1] = 1; - rballoc_sub_UE[next_ue1][j+1] = 1; - rballoc_sub_UE[next_ue2][j+1] = 1; - MIMO_mode_indicator[j+1] = 0; - } - - dl_pow_off[next_ue1] = 0; - dl_pow_off[next_ue2] = 0; - - - - - if ((j == N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25) || - (mac_xface->lte_frame_parms->N_RB_DL == 50))){ - nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - min_rb_unit+1; - pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + min_rb_unit-1; - nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - min_rb_unit+1; - pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + min_rb_unit-1; - } - else { - nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - 4; - pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + 4; - nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - 4; - pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + 4; - } - break; - } - } - } - } - } - } + + + + if ((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25) || + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - min_rb_unit+1; + pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + min_rb_unit-1; + nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - min_rb_unit+1; + pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + min_rb_unit-1; + } + else { + nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - 4; + pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + 4; + nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - 4; + pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + 4; + } + break; + } + } + } + } + } + } + } } - } - // data channel for all TM - for (i = 0;iget_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - - if ((mac_get_rrc_status(Mod_id,1,next_ue) >= RRC_RECONFIGURED) && (round==0)) { - - - for(j=0;j0)){ - - - switch (mac_xface->get_transmission_mode(Mod_id,rnti)) { - case 1: - case 2: - case 4: - case 6: - rballoc_sub[j] = 1; - rballoc_sub_UE[next_ue][j] = 1; - - MIMO_mode_indicator[j] = 1; - - if((j == N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] +min_rb_unit-1; - } - else { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; - } - - break; - case 5: - if (dl_pow_off[next_ue] != 0){ - - dl_pow_off[next_ue] = 1; - - rballoc_sub[j] = 1; - rballoc_sub_UE[next_ue][j] = 1; - - MIMO_mode_indicator[j] = 1; - - if((j == N_RBGS-1) && - ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| - (mac_xface->lte_frame_parms->N_RB_DL == 50))){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit-1; - } - else { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; - } - } - break; - default: - break; - } - } - } + // data channel for all TM + for (i = 0;iget_ue_active_harq_pid(Mod_id,rnti,subframeP,&harq_pid,&round,0); + + if ((mac_get_rrc_status(Mod_id,1,next_ue) >= RRC_RECONFIGURED) && (round==0)) { + + + for(j=0;j0)){ + + + switch (mac_xface->get_transmission_mode(Mod_id,rnti)) { + case 1: + case 2: + case 4: + case 6: + rballoc_sub[j] = 1; + rballoc_sub_UE[next_ue][j] = 1; + + MIMO_mode_indicator[j] = 1; + + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] +min_rb_unit-1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; + } + + break; + case 5: + if (dl_pow_off[next_ue] != 0){ + + dl_pow_off[next_ue] = 1; + + rballoc_sub[j] = 1; + rballoc_sub_UE[next_ue][j] = 1; + + MIMO_mode_indicator[j] = 1; + + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit-1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; + } + } + break; + default: + break; + } + } + } + } } - } } - + i1=0; i2=0; i3=0; for (j=0;j0) && (i3==0)) PHY_vars_eNB_g[Mod_id]->check_for_SUMIMO_transmissions = PHY_vars_eNB_g[Mod_id]->check_for_SUMIMO_transmissions + 1; - + if(i3 == N_RBGS && i1==0 && i2==0) PHY_vars_eNB_g[Mod_id]->FULL_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id]->FULL_MUMIMO_transmissions + 1; @@ -732,21 +746,21 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, PHY_vars_eNB_g[Mod_id]->check_for_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id]->check_for_MUMIMO_transmissions + 1; PHY_vars_eNB_g[Mod_id]->check_for_total_transmissions = PHY_vars_eNB_g[Mod_id]->check_for_total_transmissions + 1; - - - - + + + + for(UE_id=0;UE_idmu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id]; - LOG_D(PHY,"******************Scheduling Information for UE%d ************************\n",UE_id); - LOG_D(PHY,"dl power offset UE%d = %d \n",UE_id,dl_pow_off[UE_id]); - LOG_D(PHY,"***********RB Alloc for every subband for UE%d ***********\n",UE_id); - for(j=0;jmu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[UE_id][i]; - LOG_D(PHY,"RB Alloc for UE%d and Subband%d = %d\n",UE_id,j,rballoc_sub_UE[UE_id][j]); - } - //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[UE_id]; - LOG_D(PHY,"Total RBs allocated for UE%d = %d\n",UE_id,pre_nb_available_rbs[UE_id]); + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id]; + LOG_D(PHY,"******************Scheduling Information for UE%d ************************\n",UE_id); + LOG_D(PHY,"dl power offset UE%d = %d \n",UE_id,dl_pow_off[UE_id]); + LOG_D(PHY,"***********RB Alloc for every subband for UE%d ***********\n",UE_id); + for(j=0;jmu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[UE_id][i]; + LOG_D(PHY,"RB Alloc for UE%d and Subband%d = %d\n",UE_id,j,rballoc_sub_UE[UE_id][j]); + } + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[UE_id]; + LOG_D(PHY,"Total RBs allocated for UE%d = %d\n",UE_id,pre_nb_available_rbs[UE_id]); } } diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 369ac7246d..b12fff2fcd 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -25,18 +25,18 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file openair2/LAYER2/MAC/ra_procedures.c -* \brief Routines for UE MAC-layer Random-access procedures (36.321) V8.6 2009-03 -* \author R. Knopp -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr -* \note -* \warning -*/ + * \brief Routines for UE MAC-layer Random-access procedures (36.321) V8.6 2009-03 + * \author R. Knopp + * \date 2011 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr + * \note + * \warning + */ #include "extern.h" #include "defs.h" @@ -55,25 +55,25 @@ extern inline unsigned int taus(void); -s8 get_DELTA_PREAMBLE(u8 Mod_id) { +s8 get_DELTA_PREAMBLE(module_id_t module_idP) { - u8 prachConfigIndex = UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + u8 prachConfigIndex = UE_mac_inst[module_idP].radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; u8 preambleformat; - if (UE_mac_inst[Mod_id].tdd_Config) { // TDD - if (prachConfigIndex < 20) - preambleformat = 0; - else if (prachConfigIndex < 30) - preambleformat = 1; - else if (prachConfigIndex < 40) - preambleformat = 2; - else if (prachConfigIndex < 48) - preambleformat = 3; - else - preambleformat = 4; + if (UE_mac_inst[module_idP].tdd_Config) { // TDD + if (prachConfigIndex < 20) + preambleformat = 0; + else if (prachConfigIndex < 30) + preambleformat = 1; + else if (prachConfigIndex < 40) + preambleformat = 2; + else if (prachConfigIndex < 48) + preambleformat = 3; + else + preambleformat = 4; } else { // FDD - preambleformat = prachConfigIndex>>2; + preambleformat = prachConfigIndex>>2; } switch (preambleformat) { case 0: @@ -86,8 +86,8 @@ s8 get_DELTA_PREAMBLE(u8 Mod_id) { return(8); default: LOG_E(MAC,"[UE %d] ue_procedures.c: FATAL, Illegal preambleformat %d, prachConfigIndex %d\n", - Mod_id, - preambleformat,prachConfigIndex); + module_idP, + preambleformat,prachConfigIndex); mac_xface->macphy_exit(""); return(0); } @@ -95,309 +95,309 @@ s8 get_DELTA_PREAMBLE(u8 Mod_id) { } /// This routine implements Section 5.1.2 (Random Access Resource Selection) from 36.321 -void get_prach_resources(u8 Mod_id, - u8 eNB_index, - u8 t_id, - u8 first_Msg3, - RACH_ConfigDedicated_t *rach_ConfigDedicated) { - - u8 Msg3_size = UE_mac_inst[Mod_id].RA_Msg3_size; - PRACH_RESOURCES_t *prach_resources = &UE_mac_inst[Mod_id].RA_prach_resources; +void get_prach_resources(module_id_t module_idP, + u8 eNB_index, + u8 t_id, + u8 first_Msg3, + RACH_ConfigDedicated_t *rach_ConfigDedicated) { + + u8 Msg3_size = UE_mac_inst[module_idP].RA_Msg3_size; + PRACH_RESOURCES_t *prach_resources = &UE_mac_inst[module_idP].RA_prach_resources; RACH_ConfigCommon_t *rach_ConfigCommon = NULL; u8 noGroupB = 0; u8 f_id = 0,num_prach=0; - if (UE_mac_inst[Mod_id].radioResourceConfigCommon) - rach_ConfigCommon = &UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon; + if (UE_mac_inst[module_idP].radioResourceConfigCommon) + rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; else { - LOG_E(MAC,"[UE %d] FATAL radioResourceConfigCommon is NULL !!!\n",Mod_id); - mac_xface->macphy_exit(""); + LOG_E(MAC,"[UE %d] FATAL radioResourceConfigCommon is NULL !!!\n",module_idP); + mac_xface->macphy_exit(""); } if (rach_ConfigDedicated) { // This is for network controlled Mobility, later - if (rach_ConfigDedicated->ra_PRACH_MaskIndex != 0) { - prach_resources->ra_PreambleIndex = rach_ConfigDedicated->ra_PreambleIndex; - prach_resources->ra_RACH_MaskIndex = rach_ConfigDedicated->ra_PRACH_MaskIndex; - return; - } + if (rach_ConfigDedicated->ra_PRACH_MaskIndex != 0) { + prach_resources->ra_PreambleIndex = rach_ConfigDedicated->ra_PreambleIndex; + prach_resources->ra_RACH_MaskIndex = rach_ConfigDedicated->ra_PRACH_MaskIndex; + return; + } } if (!rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) { - noGroupB = 1; + noGroupB = 1; } else { - if (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA == - rach_ConfigCommon->preambleInfo.numberOfRA_Preambles) - noGroupB = 1; + if (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA == + rach_ConfigCommon->preambleInfo.numberOfRA_Preambles) + noGroupB = 1; } if (first_Msg3 == 1) { - if (noGroupB == 1) { - // use Group A procedure - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = (taus())&0x3f; - UE_mac_inst[Mod_id].RA_prach_resources.ra_RACH_MaskIndex = 0; - UE_mac_inst[Mod_id].RA_usedGroupA = 1; - } - else if ((Msg3_size < rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->messageSizeGroupA) || - (mac_xface->get_PL(Mod_id,eNB_index) > UE_mac_inst[Mod_id].RA_maxPL)) { - // use Group A procedure - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = (taus())%rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA; - UE_mac_inst[Mod_id].RA_prach_resources.ra_RACH_MaskIndex = 0; - UE_mac_inst[Mod_id].RA_usedGroupA = 1; - } - else { // use Group B - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = - rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + - (taus())%(rach_ConfigCommon->preambleInfo.numberOfRA_Preambles - - rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA); - UE_mac_inst[Mod_id].RA_prach_resources.ra_RACH_MaskIndex = 0; - UE_mac_inst[Mod_id].RA_usedGroupA = 0; - } - UE_mac_inst[Mod_id].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(Mod_id); + if (noGroupB == 1) { + // use Group A procedure + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())&0x3f; + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + UE_mac_inst[module_idP].RA_usedGroupA = 1; + } + else if ((Msg3_size < rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->messageSizeGroupA) || + (mac_xface->get_PL(module_idP,eNB_index) > UE_mac_inst[module_idP].RA_maxPL)) { + // use Group A procedure + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())%rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA; + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + UE_mac_inst[module_idP].RA_usedGroupA = 1; + } + else { // use Group B + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = + rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + + (taus())%(rach_ConfigCommon->preambleInfo.numberOfRA_Preambles - + rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA); + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + UE_mac_inst[module_idP].RA_usedGroupA = 0; + } + UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(module_idP); } else { // Msg3 is being retransmitted - if (UE_mac_inst[Mod_id].RA_usedGroupA == 1) { - if (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = (taus())%rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA; - else - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = (taus())&0x3f; - UE_mac_inst[Mod_id].RA_prach_resources.ra_RACH_MaskIndex = 0; - } - else { - UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex = - rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + - (taus())%(rach_ConfigCommon->preambleInfo.numberOfRA_Preambles - - rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA); - UE_mac_inst[Mod_id].RA_prach_resources.ra_RACH_MaskIndex = 0; - } + if (UE_mac_inst[module_idP].RA_usedGroupA == 1) { + if (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())%rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA; + else + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())&0x3f; + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + } + else { + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = + rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + + (taus())%(rach_ConfigCommon->preambleInfo.numberOfRA_Preambles - + rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA); + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + } } // choose random PRACH resource in TDD - if (UE_mac_inst[Mod_id].tdd_Config) { - num_prach = mac_xface->get_num_prach_tdd(mac_xface->lte_frame_parms); - if ((num_prach>0) && (num_prach<6)) - UE_mac_inst[Mod_id].RA_prach_resources.ra_TDD_map_index = (taus()%num_prach); - f_id = mac_xface->get_fid_prach_tdd(mac_xface->lte_frame_parms, - UE_mac_inst[Mod_id].RA_prach_resources.ra_TDD_map_index); + if (UE_mac_inst[module_idP].tdd_Config) { + num_prach = mac_xface->get_num_prach_tdd(mac_xface->lte_frame_parms); + if ((num_prach>0) && (num_prach<6)) + UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index = (taus()%num_prach); + f_id = mac_xface->get_fid_prach_tdd(mac_xface->lte_frame_parms, + UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index); } // choose RA-RNTI - UE_mac_inst[Mod_id].RA_prach_resources.ra_RNTI = 1 + t_id + 10*f_id; + UE_mac_inst[module_idP].RA_prach_resources.ra_RNTI = 1 + t_id + 10*f_id; } -void Msg1_tx(u8 Mod_id,u32 frame, u8 eNB_id) { +void Msg1_tx(module_id_t module_idP,frame_t frameP, u8 eNB_id) { // start contention resolution timer - UE_mac_inst[Mod_id].RA_attempt_number++; + UE_mac_inst[module_idP].RA_attempt_number++; #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.opt_enabled) { - trace_pdu(0, NULL, 0, Mod_id, 3, UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex, - UE_mac_inst[Mod_id].subframe, 0, UE_mac_inst[Mod_id].RA_attempt_number); - LOG_D(OPT,"[UE %d][RAPROC] TX MSG1 Frame %d trace pdu for rnti %x with size %d\n", - Mod_id, frame, 1, UE_mac_inst[Mod_id].RA_Msg3_size); + trace_pdu(0, NULL, 0, module_idP, 3, UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex, + UE_mac_inst[module_idP].subframe, 0, UE_mac_inst[module_idP].RA_attempt_number); + LOG_D(OPT,"[UE %d][RAPROC] TX MSG1 Frame %d trace pdu for rnti %x with size %d\n", + module_idP, frameP, 1, UE_mac_inst[module_idP].RA_Msg3_size); } #endif } -void Msg3_tx(u8 Mod_id,u32 frame, u8 eNB_id) { +void Msg3_tx(module_id_t module_idP,frame_t frameP, u8 eNB_id) { // start contention resolution timer - LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Setting contention resolution timer\n",Mod_id,frame); - UE_mac_inst[Mod_id].RA_contention_resolution_cnt = 0; - UE_mac_inst[Mod_id].RA_contention_resolution_timer_active = 1; + LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Setting contention resolution timer\n",module_idP,frameP); + UE_mac_inst[module_idP].RA_contention_resolution_cnt = 0; + UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 1; #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.opt_enabled) { // msg3 - trace_pdu(0, &UE_mac_inst[Mod_id].CCCH_pdu.payload[0], UE_mac_inst[Mod_id].RA_Msg3_size, - Mod_id, 3, UE_mac_inst[Mod_id].crnti, UE_mac_inst[Mod_id].subframe, 0, 0); - LOG_D(OPT,"[UE %d][RAPROC] MSG3 Frame %d trace pdu Preamble %d with size %d\n", - Mod_id, frame, UE_mac_inst[Mod_id].crnti /*UE_mac_inst[Mod_id].RA_prach_resources.ra_PreambleIndex*/, UE_mac_inst[Mod_id].RA_Msg3_size); + trace_pdu(0, &UE_mac_inst[module_idP].CCCH_pdu.payload[0], UE_mac_inst[module_idP].RA_Msg3_size, + module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].subframe, 0, 0); + LOG_D(OPT,"[UE %d][RAPROC] MSG3 Frame %d trace pdu Preamble %d with size %d\n", + module_idP, frameP, UE_mac_inst[module_idP].crnti /*UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex*/, UE_mac_inst[module_idP].RA_Msg3_size); } #endif } -PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame, u8 eNB_index,u8 subframe){ +PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,frame_t frameP, u8 eNB_indexP,sub_frame_t subframeP){ - u8 Size=0; - UE_MODE_t UE_mode = mac_xface->get_ue_mode(Mod_id,eNB_index); - u8 lcid = CCCH; - u16 Size16; + u8 Size=0; + UE_MODE_t UE_mode = mac_xface->get_ue_mode(module_idP,eNB_indexP); + u8 lcid = CCCH; + u16 Size16; struct RACH_ConfigCommon *rach_ConfigCommon = (struct RACH_ConfigCommon *)NULL; - s32 frame_diff=0; - mac_rlc_status_resp_t rlc_status; - u8 dcch_header_len=0; - u16 sdu_lengths[8]; - u8 ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES]; + s32 frame_diff=0; + mac_rlc_status_resp_t rlc_status; + u8 dcch_header_len=0; + u16 sdu_lengths[8]; + u8 ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES]; if (UE_mode == PRACH) { - if (UE_mac_inst[Mod_id].radioResourceConfigCommon) - rach_ConfigCommon = &UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon; - else { - return(NULL); - } - if (Is_rrc_registered == 1) { - - if (UE_mac_inst[Mod_id].RA_active == 0) { - // check if RRC is ready to initiate the RA procedure - Size = mac_rrc_data_req(Mod_id, - frame, - CCCH,1, - &UE_mac_inst[Mod_id].CCCH_pdu.payload[sizeof(SCH_SUBHEADER_SHORT)+1],0, - eNB_index, - 0); - Size16 = (u16)Size; - - // LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",Mod_id,frame,Size); - LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_DATA_REQ (RRCConnectionRequest eNB %d) --->][MAC_UE][MOD %02d][]\n", - frame, Mod_id, eNB_index, Mod_id); - LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",Mod_id,frame,Size); - - if (Size>0) { - - UE_mac_inst[Mod_id].RA_active = 1; - UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER = 1; - UE_mac_inst[Mod_id].RA_Msg3_size = Size+sizeof(SCH_SUBHEADER_SHORT)+sizeof(SCH_SUBHEADER_SHORT); - UE_mac_inst[Mod_id].RA_prachMaskIndex = 0; - UE_mac_inst[Mod_id].RA_prach_resources.Msg3 = UE_mac_inst[Mod_id].CCCH_pdu.payload; - UE_mac_inst[Mod_id].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) - if (rach_ConfigCommon) { - UE_mac_inst[Mod_id].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; - if (UE_mac_inst[Mod_id].RA_window_cnt == 9) - UE_mac_inst[Mod_id].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! - } - else { - LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",Mod_id,frame); - mac_xface->macphy_exit(""); - } - UE_mac_inst[Mod_id].RA_tx_frame = frame; - UE_mac_inst[Mod_id].RA_tx_subframe = subframe; - UE_mac_inst[Mod_id].RA_backoff_frame = frame; - UE_mac_inst[Mod_id].RA_backoff_subframe = subframe; - // Fill in preamble and PRACH resource - get_prach_resources(Mod_id,eNB_index,subframe,1,NULL); - - generate_ulsch_header((u8*)&UE_mac_inst[Mod_id].CCCH_pdu.payload[0], // mac header - 1, // num sdus - 0, // short pading - &Size16, // sdu length - &lcid, // sdu lcid - NULL, // power headroom - NULL, // crnti - NULL, // truncated bsr - NULL, // short bsr - NULL, // long_bsr - 1); //post_padding - - return(&UE_mac_inst[Mod_id].RA_prach_resources); - } - else if (UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[DCCH] > 0) { - // This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example) - dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element - rlc_status = mac_rlc_status_ind(Mod_id+NB_eNB_INST,frame,0,RLC_MBMS_NO, - DCCH, - 6); - if (UE_mac_inst[Mod_id].crnti_before_ho) - LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, HO RRCConnectionReconfigurationComplete (%x, %x), RRC message has %d bytes to send throug PRACH (mac header len %d)\n", - Mod_id,frame, UE_mac_inst[Mod_id].crnti,UE_mac_inst[Mod_id].crnti_before_ho, rlc_status.bytes_in_buffer,dcch_header_len); - else - LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to send through PRACH(mac header len %d)\n", - Mod_id,frame, rlc_status.bytes_in_buffer,dcch_header_len); - - sdu_lengths[0] = mac_rlc_data_req(Mod_id+NB_eNB_INST,frame,RLC_MBMS_NO, - DCCH, - (char *)&ulsch_buff[0]); - - LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",Mod_id,sdu_lengths[0]); - update_bsr(Mod_id, frame, DCCH,UE_mac_inst[Mod_id].scheduling_info.LCGID[DCCH]); - //header_len +=2; - UE_mac_inst[Mod_id].RA_active = 1; - UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER = 1; - UE_mac_inst[Mod_id].RA_Msg3_size = Size+dcch_header_len; - UE_mac_inst[Mod_id].RA_prachMaskIndex = 0; - UE_mac_inst[Mod_id].RA_prach_resources.Msg3 = ulsch_buff; - UE_mac_inst[Mod_id].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) - if (rach_ConfigCommon) { - UE_mac_inst[Mod_id].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; - if (UE_mac_inst[Mod_id].RA_window_cnt == 9) - UE_mac_inst[Mod_id].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! - } - else { - LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",Mod_id,frame); - mac_xface->macphy_exit(""); - } - UE_mac_inst[Mod_id].RA_tx_frame = frame; - UE_mac_inst[Mod_id].RA_tx_subframe = subframe; - UE_mac_inst[Mod_id].RA_backoff_frame = frame; - UE_mac_inst[Mod_id].RA_backoff_subframe = subframe; - // Fill in preamble and PRACH resource - get_prach_resources(Mod_id,eNB_index,subframe,1,NULL); - generate_ulsch_header((u8*)ulsch_buff, // mac header - 1, // num sdus - 0, // short pading - &Size16, // sdu length - &lcid, // sdu lcid - NULL, // power headroom - &UE_mac_inst[Mod_id].crnti, // crnti - NULL, // truncated bsr - NULL, // short bsr - NULL, // long_bsr - 0); //post_padding - - return(&UE_mac_inst[Mod_id].RA_prach_resources); - } + if (UE_mac_inst[module_idP].radioResourceConfigCommon) + rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; + else { + return(NULL); } - else { // RACH is active - LOG_D(MAC,"[MAC][UE %d][RAPROC] frame %d, subframe %d: RA Active, window cnt %d (RA_tx_frame %d, RA_tx_subframe %d)\n",Mod_id, - frame,subframe,UE_mac_inst[Mod_id].RA_window_cnt, - UE_mac_inst[Mod_id].RA_tx_frame,UE_mac_inst[Mod_id].RA_tx_subframe); - // compute backoff parameters - if (UE_mac_inst[Mod_id].RA_backoff_cnt>0) { - frame_diff = (s32)frame - UE_mac_inst[Mod_id].RA_backoff_frame; - if (frame_diff < 0) - frame_diff = -frame_diff; - UE_mac_inst[Mod_id].RA_backoff_cnt -= ((10*frame_diff) + (subframe-UE_mac_inst[Mod_id].RA_backoff_subframe)); - - UE_mac_inst[Mod_id].RA_backoff_frame = frame; - UE_mac_inst[Mod_id].RA_backoff_subframe = subframe; - } - // compute RA window parameters - if (UE_mac_inst[Mod_id].RA_window_cnt>0) { - frame_diff = (s32)frame - UE_mac_inst[Mod_id].RA_tx_frame; - if (frame_diff < 0) - frame_diff = -frame_diff; - UE_mac_inst[Mod_id].RA_window_cnt -= ((10*frame_diff) + (subframe-UE_mac_inst[Mod_id].RA_tx_subframe)); - LOG_D(MAC,"[MAC][UE %d][RAPROC] frame %d, subframe %d: RA Active, adjusted window cnt %d\n",Mod_id, - frame,subframe,UE_mac_inst[Mod_id].RA_window_cnt); - } - if ((UE_mac_inst[Mod_id].RA_window_cnt<=0) && - (UE_mac_inst[Mod_id].RA_backoff_cnt<=0)) { - - UE_mac_inst[Mod_id].RA_tx_frame = frame; - UE_mac_inst[Mod_id].RA_tx_subframe = subframe; - UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER++; - UE_mac_inst[Mod_id].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER += (rach_ConfigCommon->powerRampingParameters.powerRampingStep<<1); // 2dB increments in ASN.1 definition - if (UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER == rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax) { - LOG_D(MAC,"[UE %d] Frame %d: Maximum number of RACH attempts (%d)\n",Mod_id,frame,rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax); - // send message to RRC - UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER=1; - UE_mac_inst[Mod_id].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(Mod_id); - } - UE_mac_inst[Mod_id].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; - UE_mac_inst[Mod_id].RA_backoff_cnt = 0; - - // Fill in preamble and PRACH resource - get_prach_resources(Mod_id,eNB_index,subframe,0,NULL); - return(&UE_mac_inst[Mod_id].RA_prach_resources); - } + if (Is_rrc_registered == 1) { + + if (UE_mac_inst[module_idP].RA_active == 0) { + // check if RRC is ready to initiate the RA procedure + Size = mac_rrc_data_req(module_idP, + frameP, + CCCH,1, + &UE_mac_inst[module_idP].CCCH_pdu.payload[sizeof(SCH_SUBHEADER_SHORT)+1],0, + eNB_indexP, + 0); + Size16 = (u16)Size; + + // LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",module_idP,frameP,Size); + LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_DATA_REQ (RRCConnectionRequest eNB %d) --->][MAC_UE][MOD %02d][]\n", + frameP, module_idP, eNB_indexP, module_idP); + LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",module_idP,frameP,Size); + + if (Size>0) { + + UE_mac_inst[module_idP].RA_active = 1; + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER = 1; + UE_mac_inst[module_idP].RA_Msg3_size = Size+sizeof(SCH_SUBHEADER_SHORT)+sizeof(SCH_SUBHEADER_SHORT); + UE_mac_inst[module_idP].RA_prachMaskIndex = 0; + UE_mac_inst[module_idP].RA_prach_resources.Msg3 = UE_mac_inst[module_idP].CCCH_pdu.payload; + UE_mac_inst[module_idP].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) + if (rach_ConfigCommon) { + UE_mac_inst[module_idP].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; + if (UE_mac_inst[module_idP].RA_window_cnt == 9) + UE_mac_inst[module_idP].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! + } + else { + LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",module_idP,frameP); + mac_xface->macphy_exit(""); + } + UE_mac_inst[module_idP].RA_tx_frame = frameP; + UE_mac_inst[module_idP].RA_tx_subframe = subframeP; + UE_mac_inst[module_idP].RA_backoff_frame = frameP; + UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; + // Fill in preamble and PRACH resource + get_prach_resources(module_idP,eNB_indexP,subframeP,1,NULL); + + generate_ulsch_header((u8*)&UE_mac_inst[module_idP].CCCH_pdu.payload[0], // mac header + 1, // num sdus + 0, // short pading + &Size16, // sdu length + &lcid, // sdu lcid + NULL, // power headroom + NULL, // crnti + NULL, // truncated bsr + NULL, // short bsr + NULL, // long_bsr + 1); //post_padding + + return(&UE_mac_inst[module_idP].RA_prach_resources); + } + else if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DCCH] > 0) { + // This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example) + dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element + rlc_status = mac_rlc_status_ind(0, module_idP,frameP,0,RLC_MBMS_NO, + DCCH, + 6); + if (UE_mac_inst[module_idP].crnti_before_ho) + LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, HO RRCConnectionReconfigurationComplete (%x, %x), RRC message has %d bytes to send throug PRACH (mac header len %d)\n", + module_idP,frameP, UE_mac_inst[module_idP].crnti,UE_mac_inst[module_idP].crnti_before_ho, rlc_status.bytes_in_buffer,dcch_header_len); + else + LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to send through PRACH(mac header len %d)\n", + module_idP,frameP, rlc_status.bytes_in_buffer,dcch_header_len); + + sdu_lengths[0] = mac_rlc_data_req(eNB_indexP, module_idP,frameP,0, RLC_MBMS_NO, + DCCH, + (char *)&ulsch_buff[0]); + + LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",module_idP,sdu_lengths[0]); + update_bsr(module_idP, frameP, DCCH,UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]); + //header_len +=2; + UE_mac_inst[module_idP].RA_active = 1; + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER = 1; + UE_mac_inst[module_idP].RA_Msg3_size = Size+dcch_header_len; + UE_mac_inst[module_idP].RA_prachMaskIndex = 0; + UE_mac_inst[module_idP].RA_prach_resources.Msg3 = ulsch_buff; + UE_mac_inst[module_idP].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) + if (rach_ConfigCommon) { + UE_mac_inst[module_idP].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; + if (UE_mac_inst[module_idP].RA_window_cnt == 9) + UE_mac_inst[module_idP].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! + } + else { + LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",module_idP,frameP); + mac_xface->macphy_exit(""); + } + UE_mac_inst[module_idP].RA_tx_frame = frameP; + UE_mac_inst[module_idP].RA_tx_subframe = subframeP; + UE_mac_inst[module_idP].RA_backoff_frame = frameP; + UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; + // Fill in preamble and PRACH resource + get_prach_resources(module_idP,eNB_indexP,subframeP,1,NULL); + generate_ulsch_header((u8*)ulsch_buff, // mac header + 1, // num sdus + 0, // short pading + &Size16, // sdu length + &lcid, // sdu lcid + NULL, // power headroom + &UE_mac_inst[module_idP].crnti, // crnti + NULL, // truncated bsr + NULL, // short bsr + NULL, // long_bsr + 0); //post_padding + + return(&UE_mac_inst[module_idP].RA_prach_resources); + } + } + else { // RACH is active + LOG_D(MAC,"[MAC][UE %d][RAPROC] frameP %d, subframe %d: RA Active, window cnt %d (RA_tx_frame %d, RA_tx_subframe %d)\n",module_idP, + frameP,subframeP,UE_mac_inst[module_idP].RA_window_cnt, + UE_mac_inst[module_idP].RA_tx_frame,UE_mac_inst[module_idP].RA_tx_subframe); + // compute backoff parameters + if (UE_mac_inst[module_idP].RA_backoff_cnt>0) { + frame_diff = (s32)frameP - UE_mac_inst[module_idP].RA_backoff_frame; + if (frame_diff < 0) + frame_diff = -frame_diff; + UE_mac_inst[module_idP].RA_backoff_cnt -= ((10*frame_diff) + (subframeP-UE_mac_inst[module_idP].RA_backoff_subframe)); + + UE_mac_inst[module_idP].RA_backoff_frame = frameP; + UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; + } + // compute RA window parameters + if (UE_mac_inst[module_idP].RA_window_cnt>0) { + frame_diff = (frame_t)frameP - UE_mac_inst[module_idP].RA_tx_frame; + if (frame_diff < 0) + frame_diff = -frame_diff; + UE_mac_inst[module_idP].RA_window_cnt -= ((10*frame_diff) + (subframeP-UE_mac_inst[module_idP].RA_tx_subframe)); + LOG_D(MAC,"[MAC][UE %d][RAPROC] frameP %d, subframe %d: RA Active, adjusted window cnt %d\n",module_idP, + frameP,subframeP,UE_mac_inst[module_idP].RA_window_cnt); + } + if ((UE_mac_inst[module_idP].RA_window_cnt<=0) && + (UE_mac_inst[module_idP].RA_backoff_cnt<=0)) { + + UE_mac_inst[module_idP].RA_tx_frame = frameP; + UE_mac_inst[module_idP].RA_tx_subframe = subframeP; + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER++; + UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER += (rach_ConfigCommon->powerRampingParameters.powerRampingStep<<1); // 2dB increments in ASN.1 definition + if (UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER == rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax) { + LOG_D(MAC,"[UE %d] Frame %d: Maximum number of RACH attempts (%d)\n",module_idP,frameP,rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax); + // send message to RRC + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER=1; + UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(module_idP); + } + UE_mac_inst[module_idP].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; + UE_mac_inst[module_idP].RA_backoff_cnt = 0; + + // Fill in preamble and PRACH resource + get_prach_resources(module_idP,eNB_indexP,subframeP,0,NULL); + return(&UE_mac_inst[module_idP].RA_prach_resources); + } + } } - } } else if (UE_mode == PUSCH) { - LOG_D(MAC,"[UE %d] FATAL: Should not have checked for RACH in PUSCH yet ...",Mod_id); - mac_xface->macphy_exit(""); + LOG_D(MAC,"[UE %d] FATAL: Should not have checked for RACH in PUSCH yet ...",module_idP); + mac_xface->macphy_exit(""); } return(NULL); } diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index 8696fcf537..70f20446d7 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -25,15 +25,15 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file rar_tools.c -* \brief random access tools -* \author Raymond Knopp -* \date 2011 -* \version 0.5 -* @ingroup _mac + * \brief random access tools + * \author Raymond Knopp + * \date 2011 + * \version 0.5 + * @ingroup _mac -*/ + */ #include "defs.h" #include "extern.h" @@ -54,11 +54,11 @@ extern unsigned short RIV2first_rb_LUT25[512]; extern inline unsigned int taus(void); -unsigned short fill_rar(u8 Mod_id, - u32 frame, - u8 *dlsch_buffer, - u16 N_RB_UL, - u8 input_buffer_length) { +unsigned short fill_rar(module_id_t module_idP, + frame_t frameP, + u8 *dlsch_buffer, + u16 N_RB_UL, + u8 input_buffer_length) { RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer; // RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1); @@ -68,34 +68,34 @@ unsigned short fill_rar(u8 Mod_id, uint8_t mcs,TPC,ULdelay,cqireq; for (i=0;iE = 0; // First and last RAR rarh->T = 1; // 0 for E/T/R/R/BI subheader, 1 for E/T/RAPID subheader - rarh->RAPID = eNB_mac_inst[Mod_id].RA_template[ra_idx].preamble_index; // Respond to Preamble 0 only for the moment + rarh->RAPID = eNB_mac_inst[module_idP].RA_template[ra_idx].preamble_index; // Respond to Preamble 0 only for the moment /* rar->R = 0; - rar->Timing_Advance_Command = eNB_mac_inst[Mod_id].RA_template[ra_idx].timing_offset/4; + rar->Timing_Advance_Command = eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset/4; rar->hopping_flag = 0; rar->rb_alloc = mac_xface->computeRIV(N_RB_UL,12,2); // 2 RB rar->mcs = 2; // mcs 2 rar->TPC = 4; // 2 dB power adjustment rar->UL_delay = 0; rar->cqi_req = 1; - rar->t_crnti = eNB_mac_inst[Mod_id].RA_template[ra_idx].rnti; - */ - rar[4] = (uint8_t)(eNB_mac_inst[Mod_id].RA_template[ra_idx].rnti>>8); - rar[5] = (uint8_t)(eNB_mac_inst[Mod_id].RA_template[ra_idx].rnti&0xff); - eNB_mac_inst[Mod_id].RA_template[ra_idx].timing_offset = 0; - //eNB_mac_inst[Mod_id].RA_template[ra_idx].timing_offset /= 16; - rar[0] = (uint8_t)(eNB_mac_inst[Mod_id].RA_template[ra_idx].timing_offset>>(2+4)); // 7 MSBs of timing advance + divide by 4 - rar[1] = (uint8_t)(eNB_mac_inst[Mod_id].RA_template[ra_idx].timing_offset<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 + rar->t_crnti = eNB_mac_inst[module_idP].RA_template[ra_idx].rnti; + */ + rar[4] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].rnti>>8); + rar[5] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].rnti&0xff); + eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset = 0; + //eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset /= 16; + rar[0] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset>>(2+4)); // 7 MSBs of timing advance + divide by 4 + rar[1] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 rballoc = mac_xface->computeRIV(N_RB_UL,1,1); // first PRB only for UL Grant rar[1] |= (rballoc>>7)&7; // Hopping = 0 (bit 3), 3 MSBs of rballoc rar[2] = ((uint8_t)(rballoc&0xff))<<1; // 7 LSBs of rballoc @@ -106,59 +106,59 @@ unsigned short fill_rar(u8 Mod_id, rar[2] |= ((mcs&0x8)>>3); // mcs 10 rar[3] = (((mcs&0x7)<<5)) | ((TPC&7)<<2) | ((ULdelay&1)<<1) | (cqireq&1); - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",Mod_id,frame, - *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], - ra_idx, - eNB_mac_inst[Mod_id].RA_template[ra_idx].rnti, - rarh->RAPID,eNB_mac_inst[Mod_id].RA_template[0].preamble_index, - eNB_mac_inst[Mod_id].RA_template[ra_idx].timing_offset); + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",module_idP,frame, + *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], + ra_idx, + eNB_mac_inst[module_idP].RA_template[ra_idx].rnti, + rarh->RAPID,eNB_mac_inst[module_idP].RA_template[0].preamble_index, + eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset); #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.opt_enabled){ - trace_pdu(1, dlsch_buffer, input_buffer_length, Mod_id, 2, 1, - eNB_mac_inst[Mod_id].subframe, 0, 0); - LOG_I(OPT,"[eNB %d][RAPROC] RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", - Mod_id, frame, eNB_mac_inst[Mod_id].RA_template[ra_idx].rnti, + trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1, + eNB_mac_inst[module_idP].subframe, 0, 0); + LOG_I(OPT,"[eNB %d][RAPROC] RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", + module_idP, frame, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti, rarh->RAPID, input_buffer_length); } #endif - return(eNB_mac_inst[Mod_id].RA_template[ra_idx].rnti); + return(eNB_mac_inst[module_idP].RA_template[ra_idx].rnti); } -uint16_t ue_process_rar(u8 Mod_id, u32 frame, u8 *dlsch_buffer,u16 *t_crnti,u8 preamble_index) { +uint16_t ue_process_rar(module_id_t module_idP, frame_t frameP, u8 *dlsch_buffer,rnti_t *t_crnti,u8 preamble_index) { RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer; // RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1); uint8_t *rar = (uint8_t *)(dlsch_buffer+1); - - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",Mod_id,frame, - *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], - rarh->RAPID,preamble_index); + + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frame, + *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], + rarh->RAPID,preamble_index); #ifdef DEBUG_RAR - LOG_D(MAC,"[UE %d][RAPROC] rarh->E %d\n",Mod_id,rarh->E); - LOG_D(MAC,"[UE %d][RAPROC] rarh->T %d\n",Mod_id,rarh->T); - LOG_D(MAC,"[UE %d][RAPROC] rarh->RAPID %d\n",Mod_id,rarh->RAPID); - - // LOG_I(MAC,"[UE %d][RAPROC] rar->R %d\n",Mod_id,rar->R); - LOG_I(MAC,"[UE %d][RAPROC] rar->Timing_Advance_Command %d\n",Mod_id,(((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); - // LOG_I(MAC,"[UE %d][RAPROC] rar->hopping_flag %d\n",Mod_id,rar->hopping_flag); - // LOG_I(MAC,"[UE %d][RAPROC] rar->rb_alloc %d\n",Mod_id,rar->rb_alloc); - // LOG_I(MAC,"[UE %d][RAPROC] rar->mcs %d\n",Mod_id,rar->mcs); - // LOG_I(MAC,"[UE %d][RAPROC] rar->TPC %d\n",Mod_id,rar->TPC); - // LOG_I(MAC,"[UE %d][RAPROC] rar->UL_delay %d\n",Mod_id,rar->UL_delay); - // LOG_I(MAC,"[UE %d][RAPROC] rar->cqi_req %d\n",Mod_id,rar->cqi_req); - LOG_I(MAC,"[UE %d][RAPROC] rar->t_crnti %x\n",Mod_id,(uint16_t)rar[5]+(rar[4]<<8)); + LOG_D(MAC,"[UE %d][RAPROC] rarh->E %d\n",module_idP,rarh->E); + LOG_D(MAC,"[UE %d][RAPROC] rarh->T %d\n",module_idP,rarh->T); + LOG_D(MAC,"[UE %d][RAPROC] rarh->RAPID %d\n",module_idP,rarh->RAPID); + + // LOG_I(MAC,"[UE %d][RAPROC] rar->R %d\n",module_idP,rar->R); + LOG_I(MAC,"[UE %d][RAPROC] rar->Timing_Advance_Command %d\n",module_idP,(((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); + // LOG_I(MAC,"[UE %d][RAPROC] rar->hopping_flag %d\n",module_idP,rar->hopping_flag); + // LOG_I(MAC,"[UE %d][RAPROC] rar->rb_alloc %d\n",module_idP,rar->rb_alloc); + // LOG_I(MAC,"[UE %d][RAPROC] rar->mcs %d\n",module_idP,rar->mcs); + // LOG_I(MAC,"[UE %d][RAPROC] rar->TPC %d\n",module_idP,rar->TPC); + // LOG_I(MAC,"[UE %d][RAPROC] rar->UL_delay %d\n",module_idP,rar->UL_delay); + // LOG_I(MAC,"[UE %d][RAPROC] rar->cqi_req %d\n",module_idP,rar->cqi_req); + LOG_I(MAC,"[UE %d][RAPROC] rar->t_crnti %x\n",module_idP,(uint16_t)rar[5]+(rar[4]<<8)); #endif - + if (preamble_index == rarh->RAPID) { - *t_crnti = (uint16_t)rar[5]+(rar[4]<<8);//rar->t_crnti; - UE_mac_inst[Mod_id].crnti = *t_crnti;//rar->t_crnti; - //return(rar->Timing_Advance_Command); - return((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); + *t_crnti = (uint16_t)rar[5]+(rar[4]<<8);//rar->t_crnti; + UE_mac_inst[module_idP].crnti = *t_crnti;//rar->t_crnti; + //return(rar->Timing_Advance_Command); + return((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); } else { - UE_mac_inst[Mod_id].crnti=0; - return(0xffff); + UE_mac_inst[module_idP].crnti=0; + return(0xffff); } } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 3cff02fafc..910cd145c6 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -25,16 +25,16 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file ue_procedures.c -* \brief procedures related to UE -* \author Raymond Knopp, Navid Nikaein -* \date 2011 -* \version 0.5 -* \email: navid.nikaein@eurecom.fr -* @ingroup _mac + * \brief procedures related to UE + * \author Raymond Knopp, Navid Nikaein + * \date 2011 + * \version 0.5 + * \email: navid.nikaein@eurecom.fr + * @ingroup _mac -*/ + */ #ifdef EXMIMO #include @@ -78,7 +78,7 @@ #ifndef USER_MODE #define msg debug_msg #endif -*/ + */ mapping BSR_names[] = { {"NONE", 0}, {"SHORT BSR", 1}, @@ -91,52 +91,51 @@ mapping BSR_names[] = { extern inline unsigned int taus(void); -void ue_init_mac(u8 Mod_id){ +void ue_init_mac(module_id_t module_idP){ int i; - + // default values as deined in 36.331 sec 9.2.2 - LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",Mod_id); - LOG_D(MAC, "[MSC_NEW][FRAME 00000][MAC_UE][MOD %02d][]\n", Mod_id+NB_eNB_INST); - - //UE_mac_inst[Mod_id].scheduling_info.macConfig=NULL; - UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer= MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; - UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer=MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity; - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; - UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; - UE_mac_inst[Mod_id].PHR_state = MAC_MainConfig__phr_Config_PR_setup; - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER=0; - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer=0; - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer_Running=0; - UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx=MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; - UE_mac_inst[Mod_id].scheduling_info.ttiBundling=0; - UE_mac_inst[Mod_id].scheduling_info.drx_config=NULL; - UE_mac_inst[Mod_id].scheduling_info.phr_config=NULL; - UE_mac_inst[Mod_id].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer); - UE_mac_inst[Mod_id].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer); - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer); - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer); - UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_id].scheduling_info.PathlossChange); - + LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",module_idP); + + //UE_mac_inst[module_idP].scheduling_info.macConfig=NULL; + UE_mac_inst[module_idP].scheduling_info.retxBSR_Timer= MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; + UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer=MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity; + UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; + UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; + UE_mac_inst[module_idP].PHR_state = MAC_MainConfig__phr_Config_PR_setup; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer=0; + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=0; + UE_mac_inst[module_idP].scheduling_info.maxHARQ_Tx=MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; + UE_mac_inst[module_idP].scheduling_info.ttiBundling=0; + UE_mac_inst[module_idP].scheduling_info.drx_config=NULL; + UE_mac_inst[module_idP].scheduling_info.phr_config=NULL; + UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer); + UE_mac_inst[module_idP].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[module_idP].scheduling_info.retxBSR_Timer); + UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer); + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer); + UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[module_idP].scheduling_info.PathlossChange); + for (i=0; i < MAX_NUM_LCID; i++){ - LOG_D(MAC,"[UE%d] Applying default logical channel config for LCGID %d\n",Mod_id,i); - UE_mac_inst[Mod_id].scheduling_info.Bj[i]=-1; - UE_mac_inst[Mod_id].scheduling_info.bucket_size[i]=-1; - if (i < DTCH) // initilize all control channels lcgid to 0 - UE_mac_inst[Mod_id].scheduling_info.LCGID[i]=0; - else // initialize all the data channels lcgid to 1 - UE_mac_inst[Mod_id].scheduling_info.LCGID[i]=1; - UE_mac_inst[Mod_id].scheduling_info.LCID_status[i]=0; + LOG_D(MAC,"[UE%d] Applying default logical channel config for LCGID %d\n",module_idP,i); + UE_mac_inst[module_idP].scheduling_info.Bj[i]=-1; + UE_mac_inst[module_idP].scheduling_info.bucket_size[i]=-1; + if (i < DTCH) // initilize all control channels lcgid to 0 + UE_mac_inst[module_idP].scheduling_info.LCGID[i]=0; + else // initialize all the data channels lcgid to 1 + UE_mac_inst[module_idP].scheduling_info.LCGID[i]=1; + UE_mac_inst[module_idP].scheduling_info.LCID_status[i]=0; } } unsigned char *parse_header(unsigned char *mac_header, - unsigned char *num_ce, - unsigned char *num_sdu, - unsigned char *rx_ces, - unsigned char *rx_lcids, - unsigned short *rx_lengths, - unsigned short tb_length) { + unsigned char *num_ce, + unsigned char *num_sdu, + unsigned char *rx_ces, + unsigned char *rx_lcids, + unsigned short *rx_lengths, + unsigned short tb_length) { unsigned char not_done=1,num_ces=0,num_sdus=0,lcid, num_sdu_cnt; unsigned char *mac_header_ptr = mac_header; @@ -144,57 +143,57 @@ unsigned char *parse_header(unsigned char *mac_header, while (not_done==1) { - if (((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E == 0) { - // printf("E=0\n"); - not_done = 0; - } - lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; - if (lcid < UE_CONT_RES) { - //printf("[MAC][UE] header %x.%x.%x\n",mac_header_ptr[0],mac_header_ptr[1],mac_header_ptr[2]); - if (not_done==0) {// last MAC SDU, length is implicit - mac_header_ptr++; - length = tb_length-(mac_header_ptr-mac_header)-ce_len; - for (num_sdu_cnt=0; num_sdu_cnt < num_sdus ; num_sdu_cnt++) - length -= rx_lengths[num_sdu_cnt]; + if (((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E == 0) { + // printf("E=0\n"); + not_done = 0; } - else { - if (((SCH_SUBHEADER_LONG *)mac_header_ptr)->F == 1) { - length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); - mac_header_ptr += 3; + lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; + if (lcid < UE_CONT_RES) { + //printf("[MAC][UE] header %x.%x.%x\n",mac_header_ptr[0],mac_header_ptr[1],mac_header_ptr[2]); + if (not_done==0) {// last MAC SDU, length is implicit + mac_header_ptr++; + length = tb_length-(mac_header_ptr-mac_header)-ce_len; + for (num_sdu_cnt=0; num_sdu_cnt < num_sdus ; num_sdu_cnt++) + length -= rx_lengths[num_sdu_cnt]; + } + else { + if (((SCH_SUBHEADER_LONG *)mac_header_ptr)->F == 1) { + length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); + mac_header_ptr += 3; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] parse long sdu, size %x \n",length); + LOG_D(MAC,"[UE] parse long sdu, size %x \n",length); #endif - - } else { //if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { - length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; - mac_header_ptr += 2; - } - } + + } else { //if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { + length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; + mac_header_ptr += 2; + } + } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] sdu %d lcid %d length %d (offset now %d)\n", - num_sdus,lcid,length,mac_header_ptr-mac_header); + LOG_D(MAC,"[UE] sdu %d lcid %d length %d (offset now %d)\n", + num_sdus,lcid,length,mac_header_ptr-mac_header); #endif - rx_lcids[num_sdus] = lcid; - rx_lengths[num_sdus] = length; - num_sdus++; - } - else { // This is a control element subheader - if (lcid == SHORT_PADDING) { - mac_header_ptr++; - } - else { - rx_ces[num_ces] = lcid; - num_ces++; - mac_header_ptr ++; - if (lcid==TIMING_ADV_CMD) - ce_len++; - else if (lcid==UE_CONT_RES) - ce_len+=6; + rx_lcids[num_sdus] = lcid; + rx_lengths[num_sdus] = length; + num_sdus++; } + else { // This is a control element subheader + if (lcid == SHORT_PADDING) { + mac_header_ptr++; + } + else { + rx_ces[num_ces] = lcid; + num_ces++; + mac_header_ptr ++; + if (lcid==TIMING_ADV_CMD) + ce_len++; + else if (lcid==UE_CONT_RES) + ce_len+=6; + } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] ce %d lcid %d (offset now %d)\n",num_ces,lcid,mac_header_ptr-mac_header); + LOG_D(MAC,"[UE] ce %d lcid %d (offset now %d)\n",num_ces,lcid,mac_header_ptr-mac_header); #endif - } + } } *num_ce = num_ces; *num_sdu = num_sdus; @@ -202,74 +201,73 @@ unsigned char *parse_header(unsigned char *mac_header, return(mac_header_ptr); } -u32 ue_get_SR(u8 Mod_id,u32 frame,u8 eNB_id,u16 rnti, u8 subframe) { +u32 ue_get_SR(module_id_t module_idP,frame_t frame,u8 eNB_id,u16 rnti, sub_frame_t subframe) { // no UL-SCH resources available for this tti && UE has a valid PUCCH resources for SR configuration for this tti // int MGL=6;// measurement gap length in ms - int MGRP=0; // measurement gap repition period in ms - int gapOffset=-1; - int T=0; - // int sfn=0; + int MGRP = 0; // measurement gap repetition period in ms + int gapOffset = -1; + int T = 0; - DevCheck(Mod_id < NB_UE_INST, Mod_id, NB_UE_INST, 0); + DevCheck(module_idP < NB_UE_INST, module_idP, NB_UE_INST, 0); // determin the measurement gap LOG_D(MAC,"[UE %d][SR %x] Frame %d subframe %d PHY asks for SR (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", - Mod_id,rnti,frame,subframe, - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER, - (1<<(2+UE_mac_inst[Mod_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax)), - UE_mac_inst[Mod_id].scheduling_info.SR_pending); - - if (UE_mac_inst[Mod_id].measGapConfig !=NULL){ - if (UE_mac_inst[Mod_id].measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp0){ - MGRP= 40; - gapOffset= UE_mac_inst[Mod_id].measGapConfig->choice.setup.gapOffset.choice.gp0; - }else if (UE_mac_inst[Mod_id].measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp1){ - MGRP= 80; - gapOffset= UE_mac_inst[Mod_id].measGapConfig->choice.setup.gapOffset.choice.gp1; - }else{ - LOG_W(MAC, "Measurement GAP offset is unknown\n"); - } - T=MGRP/10; - //check the measurement gap and sr prohibit timer - if ((subframe == gapOffset %10) && ((frame %T) == (floor(gapOffset/10))) - && (UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer_Running =0)){ - UE_mac_inst[Mod_id].scheduling_info.SR_pending=1; - return(0); - } + module_idP,rnti,frame,subframe, + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER, + (1<<(2+UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax)), + UE_mac_inst[module_idP].scheduling_info.SR_pending); + + if (UE_mac_inst[module_idP].measGapConfig !=NULL){ + if (UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp0){ + MGRP= 40; + gapOffset= UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.choice.gp0; + }else if (UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp1){ + MGRP= 80; + gapOffset= UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.choice.gp1; + }else{ + LOG_W(MAC, "Measurement GAP offset is unknown\n"); + } + T=MGRP/10; + //check the measurement gap and sr prohibit timer + if ((subframe == gapOffset %10) && ((frame %T) == (floor(gapOffset/10))) + && (UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running =0)){ + UE_mac_inst[module_idP].scheduling_info.SR_pending=1; + return(0); + } } - if ((UE_mac_inst[Mod_id].scheduling_info.SR_pending==1) && - (UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER < - (1<<(2+UE_mac_inst[Mod_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax))) - ){ - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER++; - // start the sr-prohibittimer : rel 9 and above - if (UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer > 0) { // timer configured - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer--; - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer_Running=1; - } else - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer_Running=0; - LOG_D(MAC,"[UE %d][SR %x] Frame %d subframe %d send SR_indication (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", - Mod_id,rnti,frame,subframe, - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER, - (1<<(2+UE_mac_inst[Mod_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax)), - UE_mac_inst[Mod_id].scheduling_info.SR_pending); - - //UE_mac_inst[Mod_id].ul_active =1; - - return(1); //instruct phy to signal SR + if ((UE_mac_inst[module_idP].scheduling_info.SR_pending==1) && + (UE_mac_inst[module_idP].scheduling_info.SR_COUNTER < + (1<<(2+UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax))) + ){ + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER++; + // start the sr-prohibittimer : rel 9 and above + if (UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer > 0) { // timer configured + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer--; + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=1; + } else + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=0; + LOG_D(MAC,"[UE %d][SR %x] Frame %d subframe %d send SR_indication (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", + module_idP,rnti,frame,subframe, + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER, + (1<<(2+UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax)), + UE_mac_inst[module_idP].scheduling_info.SR_pending); + + //UE_mac_inst[module_idP].ul_active =1; + + return(1); //instruct phy to signal SR } else{ - // notify RRC to relase PUCCH/SRS - // clear any configured dl/ul - // initiate RA - UE_mac_inst[Mod_id].scheduling_info.SR_pending=0; - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER=0; - return(0); + // notify RRC to relase PUCCH/SRS + // clear any configured dl/ul + // initiate RA + UE_mac_inst[module_idP].scheduling_info.SR_pending=0; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; + return(0); } } -void ue_send_sdu(u8 Mod_id,u32 frame,u8 *sdu,u16 sdu_len,u8 eNB_index) { +void ue_send_sdu(module_id_t module_idP,frame_t frameP,u8 *sdu,u16 sdu_len,u8 eNB_index) { unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; unsigned char rx_lcids[NB_RB_MAX]; @@ -282,16 +280,16 @@ void ue_send_sdu(u8 Mod_id,u32 frame,u8 *sdu,u16 sdu_len,u8 eNB_index) { #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.opt_enabled) { - trace_pdu(1, sdu, sdu_len, Mod_id, 3, UE_mac_inst[Mod_id].crnti, - UE_mac_inst[Mod_id].subframe, 0, 0); + trace_pdu(1, sdu, sdu_len, module_idP, 3, UE_mac_inst[module_idP].crnti, + UE_mac_inst[module_idP].subframe, 0, 0); } #endif payload_ptr = parse_header(sdu,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_len); #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE %d] ue_send_sdu : Frame %d eNB_index %d : num_ce %d num_sdu %d\n",Mod_id, - frame,eNB_index,num_ce,num_sdu); + LOG_D(MAC,"[UE %d] ue_send_sdu : Frame %d eNB_index %d : num_ce %d num_sdu %d\n",module_idP, + frame,eNB_index,num_ce,num_sdu); #endif #if defined(ENABLE_MAC_PAYLOAD_DEBUG) @@ -302,465 +300,470 @@ void ue_send_sdu(u8 Mod_id,u32 frame,u8 *sdu,u16 sdu_len,u8 eNB_index) { #endif for (i=0;i= 9 (64 bits) - // (other possibility is 1 for TBS=7 (SCH_SUBHEADER_FIXED), or 2 for TBS=8 (SCH_SUBHEADER_FIXED+PADDING or SCH_SUBHEADER_SHORT) - for (i=0;i<6;i++) - if (tx_sdu[i] != payload_ptr[i]) { - LOG_E(MAC,"[UE %d][RAPROC] Contention detected, RA failed\n",Mod_id); - mac_xface->ra_failed(Mod_id,eNB_index); - UE_mac_inst[Mod_id].RA_contention_resolution_timer_active = 0; - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT); - return; - } - LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing contention resolution timer\n"); - UE_mac_inst[Mod_id].RA_contention_resolution_timer_active = 0; - mac_xface->ra_succeeded(Mod_id,eNB_index); - } - payload_ptr+=6; - break; + LOG_I(MAC,"[UE %d][RAPROC] Frame %d : received contention resolution msg: %x.%x.%x.%x.%x.%x, Terminating RA procedure\n", + module_idP,frame,payload_ptr[0],payload_ptr[1],payload_ptr[2],payload_ptr[3],payload_ptr[4],payload_ptr[5]); + if (UE_mac_inst[module_idP].RA_active == 1) { + LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing RA_active flag\n"); + UE_mac_inst[module_idP].RA_active=0; + // check if RA procedure has finished completely (no contention) + tx_sdu = &UE_mac_inst[module_idP].CCCH_pdu.payload[3]; + //Note: 3 assumes sizeof(SCH_SUBHEADER_SHORT) + PADDING CE, which is when UL-Grant has TBS >= 9 (64 bits) + // (other possibility is 1 for TBS=7 (SCH_SUBHEADER_FIXED), or 2 for TBS=8 (SCH_SUBHEADER_FIXED+PADDING or SCH_SUBHEADER_SHORT) + for (i=0;i<6;i++) + if (tx_sdu[i] != payload_ptr[i]) { + LOG_E(MAC,"[UE %d][RAPROC] Contention detected, RA failed\n",module_idP); + mac_xface->ra_failed(module_idP,eNB_index); + UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 0; + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT); + return; + } + LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing contention resolution timer\n"); + UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 0; + mac_xface->ra_succeeded(module_idP,eNB_index); + } + payload_ptr+=6; + break; case TIMING_ADV_CMD: #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] CE %d : UE Timing Advance : %d\n",i,payload_ptr[0]); + LOG_D(MAC,"[UE] CE %d : UE Timing Advance : %d\n",i,payload_ptr[0]); #endif - //mac_xface->process_timing_advance(Mod_id,payload_ptr[0]); - payload_ptr++; - break; + //mac_xface->process_timing_advance(module_idP,payload_ptr[0]); + payload_ptr++; + break; case DRX_CMD: #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] CE %d : UE DRX :",i); + LOG_D(MAC,"[UE] CE %d : UE DRX :",i); #endif - payload_ptr++; - break; + payload_ptr++; + break; } } for (i=0;i DL-CCCH, RRC message (eNB %d, %d bytes)\n",module_idP,frame, eNB_index, rx_lengths[i]); - LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-CCCH, RRC message (eNB %d, %d bytes)\n",Mod_id,frame, eNB_index, rx_lengths[i]); - #if defined(ENABLE_MAC_PAYLOAD_DEBUG) - int j; - for (j=0;j DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", Mod_id, frame, rx_lcids[i],eNB_index,rx_lengths[i]); - mac_rlc_data_ind(Mod_id+NB_eNB_INST, - frame, - 0, - RLC_MBMS_NO, - DCCH, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL); - } - else if (rx_lcids[i] == DCCH1) { - LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", Mod_id, frame, rx_lcids[i], eNB_index,rx_lengths[i]); - mac_rlc_data_ind(Mod_id+NB_eNB_INST, - frame, - 0, - RLC_MBMS_NO, - DCCH1, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL); - } - else if (rx_lcids[i] == DTCH) { - LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DTCH%d (eNB %d, %d bytes)\n", Mod_id, frame,rx_lcids[i], eNB_index,rx_lengths[i]); + } + else if (rx_lcids[i] == DCCH) { + LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", module_idP, frame, rx_lcids[i],eNB_index,rx_lengths[i]); + mac_rlc_data_ind(eNB_index, + module_idP, + frame, + 0, + RLC_MBMS_NO, + DCCH, + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL); + } + else if (rx_lcids[i] == DCCH1) { + LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", module_idP, frame, rx_lcids[i], eNB_index,rx_lengths[i]); + mac_rlc_data_ind(eNB_index, + module_idP, + frame, + 0, + RLC_MBMS_NO, + DCCH1, + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL); + } + else if (rx_lcids[i] == DTCH) { + LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DTCH%d (eNB %d, %d bytes)\n", module_idP, frame,rx_lcids[i], eNB_index,rx_lengths[i]); #if defined(ENABLE_MAC_PAYLOAD_DEBUG) - int j; - for (j=0;jE == 0) { - not_done = 0; - } - lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; - if (lcid < SHORT_PADDING) {// subheader for MSI, MCCH or MTCH - if (not_done == 0) { // last MAC SDU, length is implicit - mac_header_ptr++; - length = tb_length- (mac_header_ptr - mac_header); - for (i=0; iE == 0) { + not_done = 0; } - else { // not the last MAC SDU - if ( ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F == 1) {// subheader has length of 3octets - // length = ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L; - length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); - mac_header_ptr += 3; - } - else {// subheader has length of 2octets - length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; - mac_header_ptr += 2; - } + lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; + if (lcid < SHORT_PADDING) {// subheader for MSI, MCCH or MTCH + if (not_done == 0) { // last MAC SDU, length is implicit + mac_header_ptr++; + length = tb_length- (mac_header_ptr - mac_header); + for (i=0; iF == 1) {// subheader has length of 3octets + // length = ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L; + length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); + mac_header_ptr += 3; + } + else {// subheader has length of 2octets + length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; + mac_header_ptr += 2; + } + } + rx_lcids[num_sdus] = lcid; + rx_lengths[num_sdus] = length; + num_sdus++; + } + else {// subheader for padding + // if (lcid == SHORT_PADDING) + mac_header_ptr++; } - rx_lcids[num_sdus] = lcid; - rx_lengths[num_sdus] = length; - num_sdus++; - } - else {// subheader for padding - // if (lcid == SHORT_PADDING) - mac_header_ptr++; - } } *num_sdu = num_sdus; return(mac_header_ptr); } // this function is for sending mch_sdu from phy to mac -void ue_send_mch_sdu(u8 Mod_id, u32 frame, u8 *sdu, u16 sdu_len, u8 eNB_index, u8 sync_area) { +void ue_send_mch_sdu(module_id_t module_idP, frame_t frameP, u8 *sdu, u16 sdu_len, u8 eNB_index, u8 sync_area) { unsigned char num_sdu, i, *payload_ptr; unsigned char rx_lcids[NB_RB_MAX]; unsigned short rx_lengths[NB_RB_MAX]; // vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN); - LOG_D(MAC,"[UE %d] Frame %d : process the mch PDU for sync area %d \n",Mod_id,frame, sync_area); - LOG_D(MAC,"[UE %d] sdu: %x.%x\n", Mod_id,sdu[0], sdu[1]); - LOG_D(MAC,"[UE %d] parse_mch_header, demultiplex\n",Mod_id); + LOG_D(MAC,"[UE %d] Frame %d : process the mch PDU for sync area %d \n",module_idP,frame, sync_area); + LOG_D(MAC,"[UE %d] sdu: %x.%x\n", module_idP,sdu[0], sdu[1]); + LOG_D(MAC,"[UE %d] parse_mch_header, demultiplex\n",module_idP); payload_ptr = parse_mch_header(sdu, &num_sdu, rx_lcids, rx_lengths, sdu_len); - LOG_D(MAC,"[UE %d] parse_mch_header, found %d sdus\n",Mod_id,num_sdu); + LOG_D(MAC,"[UE %d] parse_mch_header, found %d sdus\n",module_idP,num_sdu); for (i=0; iMSI for sync area %d (eNB %d, %d bytes)\n",Mod_id,frame, sync_area, eNB_index, rx_lengths[i]); - // ??store necessary scheduling info to ue_mac_inst in order to - // calculate exact position of interested service (for the complex case has >1 mtch) - // set msi_status to 1 - UE_mac_inst[Mod_id].msi_status = 1; + if (rx_lcids[i] == MCH_SCHDL_INFO) { + if (UE_mac_inst[module_idP].mcch_status==1) { + LOG_I(MAC,"[UE %d] Frame %d : MCH->MSI for sync area %d (eNB %d, %d bytes)\n",module_idP,frame, sync_area, eNB_index, rx_lengths[i]); + // ??store necessary scheduling info to ue_mac_inst in order to + // calculate exact position of interested service (for the complex case has >1 mtch) + // set msi_status to 1 + UE_mac_inst[module_idP].msi_status = 1; + } } - } - else if (rx_lcids[i] == MCCH_LCHANID) { - LOG_I(MAC,"[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n",Mod_id,frame, i, sync_area, eNB_index, rx_lengths[i]); - mac_rrc_data_ind(Mod_id, - frame, - MCCH, - payload_ptr, rx_lengths[i], 0, eNB_index, sync_area); - } - else if (rx_lcids[i] == MTCH) { - if (UE_mac_inst[Mod_id].msi_status==1) { - LOG_I(MAC,"[UE %d] Frame %d : MCH->MTCH for sync area %d (eNB %d, %d bytes)\n",Mod_id,frame, sync_area, eNB_index, rx_lengths[i]); - - 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); - + else if (rx_lcids[i] == MCCH_LCHANID) { + LOG_I(MAC,"[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n",module_idP,frame, i, sync_area, eNB_index, rx_lengths[i]); + mac_rrc_data_ind(module_idP, + frame, + MCCH, + payload_ptr, rx_lengths[i], 0, eNB_index, sync_area); } - } else { - LOG_W(MAC,"[UE %d] Frame %d : unknown sdu %d mcch status %d eNB %d \n",Mod_id,frame,rx_lengths[i], - UE_mac_inst[Mod_id].mcch_status, eNB_index); - } - - payload_ptr += rx_lengths[i]; + else if (rx_lcids[i] == MTCH) { + if (UE_mac_inst[module_idP].msi_status==1) { + LOG_I(MAC,"[UE %d] Frame %d : MCH->MTCH for sync area %d (eNB %d, %d bytes)\n",module_idP,frame, sync_area, eNB_index, rx_lengths[i]); + + mac_rlc_data_ind( + 0 + module_idP, + frame, + 0, + RLC_MBMS_YES, + MTCH + (maxDRB + 3), + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL); + + } + } else { + LOG_W(MAC,"[UE %d] Frame %d : unknown sdu %d mcch status %d eNB %d \n",module_idP,frame,rx_lengths[i], + UE_mac_inst[module_idP].mcch_status, eNB_index); + } + + payload_ptr += rx_lengths[i]; } // vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT); } -s8 ue_get_mbsfn_sf_alloction (unsigned char Mod_id, u8 mbsfn_sync_area, unsigned char eNB_index){ - // currently there is one-to-one mapping between sf allocation pattern and sync area +s8 ue_get_mbsfn_sf_alloction (module_id_t module_idP, u8 mbsfn_sync_area, unsigned char eNB_index){ + // currently there is one-to-one mapping between sf allocation pattern and sync area if (mbsfn_sync_area > MAX_MBSFN_AREA){ - LOG_W(MAC,"[UE %d] MBSFN synchronization area %d out of range for eNB %d\n ", Mod_id, mbsfn_sync_area, eNB_index); - return -1; + LOG_W(MAC,"[UE %d] MBSFN synchronization area %d out of range for eNB %d\n ", module_idP, mbsfn_sync_area, eNB_index); + return -1; } - else if (UE_mac_inst[Mod_id].mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) + else if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) return mbsfn_sync_area; else { - LOG_W(MAC,"[UE %d] MBSFN Subframe Config pattern %d not found \n ", Mod_id, mbsfn_sync_area); - return -1; + LOG_W(MAC,"[UE %d] MBSFN Subframe Config pattern %d not found \n ", module_idP, mbsfn_sync_area); + return -1; } } -int ue_query_mch(uint8_t Mod_id, uint32_t frame, uint32_t subframe, uint8_t eNB_index,uint8_t *sync_area, uint8_t *mcch_active) { +int ue_query_mch(module_id_t module_idP, uint32_t frame, uint32_t subframe, uint8_t eNB_index,uint8_t *sync_area, uint8_t *mcch_active) { int i=0, j=0, ii=0, msi_pos=0, mcch_mcs = - 1; int mcch_flag=0, mtch_flag=0, msi_flag=0; - int mbsfn_period = 0;// 1<<(UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - int mcch_period = 0;// 32<<(UE_mac_inst[Mod_id].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + int mbsfn_period = 0;// 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); + int mcch_period = 0;// 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); int mch_scheduling_period = -1; - if (UE_mac_inst[Mod_id].pmch_Config[0]) - mch_scheduling_period = 8<<(UE_mac_inst[Mod_id].pmch_Config[0]->mch_SchedulingPeriod_r9); + if (UE_mac_inst[module_idP].pmch_Config[0]) + mch_scheduling_period = 8<<(UE_mac_inst[module_idP].pmch_Config[0]->mch_SchedulingPeriod_r9); for (i=0; - i< UE_mac_inst[Mod_id].num_active_mbsfn_area; - i++ ){ - // assume, that there is always a mapping - if ((j=ue_get_mbsfn_sf_alloction(Mod_id,i,eNB_index)) == -1) - return -1; // continue; - ii=0; - msi_pos=0; - mbsfn_period = 1<<(UE_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - mcch_period = 32<<(UE_mac_inst[Mod_id].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - - LOG_D(MAC,"[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%d))\n", - Mod_id,frame, subframe,i,UE_mac_inst[Mod_id].num_active_mbsfn_area, - j,UE_mac_inst[Mod_id].num_sf_allocation_pattern,mbsfn_period,mcch_period, - mch_scheduling_period,UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset); - - // get the real MCS value - switch (UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { - case 0: - mcch_mcs = 2; - break; - case 1: - mcch_mcs = 7; - break; - case 2: - mcch_mcs = 13; - break; - case 3: - mcch_mcs = 19; - break; - } - - if (frame % mbsfn_period == UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset){ // MBSFN frame - if (UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frame format - - if (UE_mac_inst[Mod_id].pmch_Config[0]) { - // Find the first subframe in this MCH to transmit MSI - if (frame % mch_scheduling_period == UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset ) { - while (ii == 0) { - ii = UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); - msi_pos++; - } - } - } - - // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 - switch (subframe) { - case 1: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { - if (msi_pos == 1) - msi_flag = 1; - if ( (frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 2: - if (mac_xface->lte_frame_parms->frame_type == FDD){ - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { - if (msi_pos == 2) - msi_flag = 1; - if ( (frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 3: - if (mac_xface->lte_frame_parms->frame_type == TDD){// TDD - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { - if (msi_pos == 1) - msi_flag = 1; - if ( (frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - else {// FDD - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { - if (msi_pos == 3) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 4: - if (mac_xface->lte_frame_parms->frame_type == TDD){ - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { - if (msi_pos == 2) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 6: - if (mac_xface->lte_frame_parms->frame_type == FDD){ - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { - if (msi_pos == 4) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 7: - if (mac_xface->lte_frame_parms->frame_type == TDD){ // TDD - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { - if (msi_pos == 3) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - else {// FDD - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { - if (msi_pos == 5) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 8: - if (mac_xface->lte_frame_parms->frame_type == TDD){ //TDD - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { - if (msi_pos == 4) - msi_flag = 1; - if ( (frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - else{ // FDD - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { - if (msi_pos == 6) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - - case 9: - if (mac_xface->lte_frame_parms->frame_type == TDD){ - if ((UE_mac_inst[Mod_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { - if (msi_pos == 5) - msi_flag = 1; - if ((frame % mcch_period == UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) ) - mcch_flag = 1; - mtch_flag = 1; - } - } - break; - }// end switch - // sf allocation is non-overlapping - if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)){ - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", - Mod_id, frame, subframe,i,j,msi_flag,mcch_flag,mtch_flag); - - *sync_area=i; - break; - } + i< UE_mac_inst[module_idP].num_active_mbsfn_area; + i++ ){ + // assume, that there is always a mapping + if ((j=ue_get_mbsfn_sf_alloction(module_idP,i,eNB_index)) == -1) + return -1; // continue; + ii=0; + msi_pos=0; + mbsfn_period = 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); + mcch_period = 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + + LOG_D(MAC,"[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%d))\n", + module_idP,frame, subframe,i,UE_mac_inst[module_idP].num_active_mbsfn_area, + j,UE_mac_inst[module_idP].num_sf_allocation_pattern,mbsfn_period,mcch_period, + mch_scheduling_period,UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset); + + // get the real MCS value + switch (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { + case 0: + mcch_mcs = 2; + break; + case 1: + mcch_mcs = 7; + break; + case 2: + mcch_mcs = 13; + break; + case 3: + mcch_mcs = 19; + break; } - else {// four-frame format + + if (frame % mbsfn_period == UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset){ // MBSFN frame + if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frame format + + if (UE_mac_inst[module_idP].pmch_Config[0]) { + // Find the first subframe in this MCH to transmit MSI + if (frame % mch_scheduling_period == UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset ) { + while (ii == 0) { + ii = UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); + msi_pos++; + } + } + } + + // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 + switch (subframe) { + case 1: + if (mac_xface->lte_frame_parms->frame_type == FDD) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { + if (msi_pos == 1) + msi_flag = 1; + if ( (frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 2: + if (mac_xface->lte_frame_parms->frame_type == FDD){ + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { + if (msi_pos == 2) + msi_flag = 1; + if ( (frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 3: + if (mac_xface->lte_frame_parms->frame_type == TDD){// TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { + if (msi_pos == 1) + msi_flag = 1; + if ( (frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + else {// FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { + if (msi_pos == 3) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 4: + if (mac_xface->lte_frame_parms->frame_type == TDD){ + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { + if (msi_pos == 2) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 6: + if (mac_xface->lte_frame_parms->frame_type == FDD){ + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { + if (msi_pos == 4) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 7: + if (mac_xface->lte_frame_parms->frame_type == TDD){ // TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { + if (msi_pos == 3) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + else {// FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { + if (msi_pos == 5) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 8: + if (mac_xface->lte_frame_parms->frame_type == TDD){ //TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { + if (msi_pos == 4) + msi_flag = 1; + if ( (frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + else{ // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { + if (msi_pos == 6) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + + case 9: + if (mac_xface->lte_frame_parms->frame_type == TDD){ + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { + if (msi_pos == 5) + msi_flag = 1; + if ((frame % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) ) + mcch_flag = 1; + mtch_flag = 1; + } + } + break; + }// end switch + // sf allocation is non-overlapping + if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)){ + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", + module_idP, frame, subframe,i,j,msi_flag,mcch_flag,mtch_flag); + + *sync_area=i; + break; + } + } + else {// four-frame format + } } - } } // end of for - + if ( (mcch_flag==1))// || (msi_flag==1)) *mcch_active=1; - if ( (mcch_flag==1) || ((msi_flag==1) && (UE_mac_inst[Mod_id].mcch_status==1)) ){ - return mcch_mcs; - } else if ((mtch_flag==1) && (UE_mac_inst[Mod_id].msi_status==1)) - return UE_mac_inst[Mod_id].pmch_Config[0]->dataMCS_r9; + if ( (mcch_flag==1) || ((msi_flag==1) && (UE_mac_inst[module_idP].mcch_status==1)) ){ + return mcch_mcs; + } else if ((mtch_flag==1) && (UE_mac_inst[module_idP].msi_status==1)) + return UE_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; else return -1; } @@ -768,16 +771,16 @@ int ue_query_mch(uint8_t Mod_id, uint32_t frame, uint32_t subframe, uint8_t eNB_ #endif unsigned char generate_ulsch_header(u8 *mac_header, - u8 num_sdus, - u8 short_padding, - u16 *sdu_lengths, - u8 *sdu_lcids, - POWER_HEADROOM_CMD *power_headroom, - u16 *crnti, - BSR_SHORT *truncated_bsr, - BSR_SHORT *short_bsr, - BSR_LONG *long_bsr, - unsigned short post_padding) { + u8 num_sdus, + u8 short_padding, + u16 *sdu_lengths, + u8 *sdu_lcids, + POWER_HEADROOM_CMD *power_headroom, + u16 *crnti, + BSR_SHORT *truncated_bsr, + BSR_SHORT *short_bsr, + BSR_LONG *long_bsr, + unsigned short post_padding) { SCH_SUBHEADER_FIXED *mac_header_ptr = (SCH_SUBHEADER_FIXED *)mac_header; unsigned char first_element=0,last_size=0,i; @@ -792,212 +795,212 @@ unsigned char generate_ulsch_header(u8 *mac_header, ce_ptr = &mac_header_control_elements[0]; if ((short_padding == 1) || (short_padding == 2)) { - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - first_element=1; - last_size=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + first_element=1; + last_size=1; } if (short_padding == 2) { - mac_header_ptr->E = 1; - mac_header_ptr++; - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - last_size=1; + mac_header_ptr->E = 1; + mac_header_ptr++; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + last_size=1; } if (power_headroom) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } - else { - first_element=1; - } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = POWER_HEADROOM; - last_size=1; - *((POWER_HEADROOM_CMD *)ce_ptr)=(*power_headroom); - ce_ptr+=sizeof(POWER_HEADROOM_CMD); - LOG_D(MAC, "phr header size %d\n",sizeof(POWER_HEADROOM_CMD)); + if (first_element>0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } + else { + first_element=1; + } + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = POWER_HEADROOM; + last_size=1; + *((POWER_HEADROOM_CMD *)ce_ptr)=(*power_headroom); + ce_ptr+=sizeof(POWER_HEADROOM_CMD); + LOG_D(MAC, "phr header size %d\n",sizeof(POWER_HEADROOM_CMD)); } if (crnti) { #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] CRNTI : %x (first_element %d)\n",*crnti,first_element); + LOG_D(MAC,"[UE] CRNTI : %x (first_element %d)\n",*crnti,first_element); #endif - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } - else { - first_element=1; - } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = CRNTI; - last_size=1; - *((u16 *)ce_ptr)=(*crnti); - ce_ptr+=sizeof(u16); - // printf("offset %d\n",ce_ptr-mac_header_control_elements); + if (first_element>0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } + else { + first_element=1; + } + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = CRNTI; + last_size=1; + *((u16 *)ce_ptr)=(*crnti); + ce_ptr+=sizeof(u16); + // printf("offset %d\n",ce_ptr-mac_header_control_elements); } if (truncated_bsr) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* + if (first_element>0) { + mac_header_ptr->E = 1; + /* printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } - else { - first_element=1; - } + */ + mac_header_ptr++; + } + else { + first_element=1; + } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] Scheduler Truncated BSR Header\n"); + LOG_D(MAC,"[UE] Scheduler Truncated BSR Header\n"); #endif - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = TRUNCATED_BSR; - last_size=1; - *((BSR_TRUNCATED *)ce_ptr)=(*truncated_bsr); - ce_ptr+=sizeof(BSR_TRUNCATED); - - // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = TRUNCATED_BSR; + last_size=1; + *((BSR_TRUNCATED *)ce_ptr)=(*truncated_bsr); + ce_ptr+=sizeof(BSR_TRUNCATED); + + // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); } else if (short_bsr) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* + if (first_element>0) { + mac_header_ptr->E = 1; + /* printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } - else { - first_element=1; - } + */ + mac_header_ptr++; + } + else { + first_element=1; + } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] Scheduler SHORT BSR Header\n"); + LOG_D(MAC,"[UE] Scheduler SHORT BSR Header\n"); #endif - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_BSR; - last_size=1; - *((BSR_SHORT *)ce_ptr)=(*short_bsr); - ce_ptr+=sizeof(BSR_SHORT); - - // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_BSR; + last_size=1; + *((BSR_SHORT *)ce_ptr)=(*short_bsr); + ce_ptr+=sizeof(BSR_SHORT); + + // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); } else if (long_bsr) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* + if (first_element>0) { + mac_header_ptr->E = 1; + /* printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } - else { - first_element=1; - } + */ + mac_header_ptr++; + } + else { + first_element=1; + } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] Scheduler Long BSR Header\n"); + LOG_D(MAC,"[UE] Scheduler Long BSR Header\n"); #endif - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = LONG_BSR; - last_size=1; - - *(ce_ptr) = (long_bsr->Buffer_size0 << 2) | ((long_bsr->Buffer_size1 & 0x30) >> 4); - *(ce_ptr + 1) = ((long_bsr->Buffer_size1 & 0x0F) << 4) | ((long_bsr->Buffer_size2 & 0x3C) >> 2); - *(ce_ptr + 2) = ((long_bsr->Buffer_size2 & 0x03) << 2) | (long_bsr->Buffer_size3 & 0x3F); - /* Padding */ - *(ce_ptr + 3) = 0; - ce_ptr += BSR_LONG_SIZE; - - // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = LONG_BSR; + last_size=1; + + *(ce_ptr) = (long_bsr->Buffer_size0 << 2) | ((long_bsr->Buffer_size1 & 0x30) >> 4); + *(ce_ptr + 1) = ((long_bsr->Buffer_size1 & 0x0F) << 4) | ((long_bsr->Buffer_size2 & 0x3C) >> 2); + *(ce_ptr + 2) = ((long_bsr->Buffer_size2 & 0x03) << 2) | (long_bsr->Buffer_size3 & 0x3F); + /* Padding */ + *(ce_ptr + 3) = 0; + ce_ptr += BSR_LONG_SIZE; + + // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); } // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); for (i=0;i0)) { - mac_header_ptr->E = 1; + if ((first_element>0)) { + mac_header_ptr->E = 1; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + LOG_D(MAC,"[UE] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); #endif - mac_header_ptr+=last_size; - // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - } - else { - first_element=1; + mac_header_ptr+=last_size; + // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + } + else { + first_element=1; - } - if (sdu_lengths[i] < 128) { - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; // 3 - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; - last_size=2; + } + if (sdu_lengths[i] < 128) { + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; // 3 + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; + last_size=2; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] short sdu\n"); - LOG_T(MAC,"[UE] last subheader : %x (R%d,E%d,LCID%d,F%d,L%d)\n", - ((u16*)mac_header_ptr)[0], - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L); + LOG_D(MAC,"[UE] short sdu\n"); + LOG_T(MAC,"[UE] last subheader : %x (R%d,E%d,LCID%d,F%d,L%d)\n", + ((u16*)mac_header_ptr)[0], + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R, + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E, + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID, + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F, + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L); #endif - } - else { - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB = ((unsigned short) sdu_lengths[i]>>8)&0x7f; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB = (unsigned short) sdu_lengths[i]&0xff; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->padding = 0x00; - last_size=3; + } + else { + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB = ((unsigned short) sdu_lengths[i]>>8)&0x7f; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB = (unsigned short) sdu_lengths[i]&0xff; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->padding = 0x00; + last_size=3; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] long sdu\n"); + LOG_D(MAC,"[UE] long sdu\n"); #endif - } + } } if (post_padding>0) {// we have lots of padding at the end of the packet - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - // add a padding element - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - mac_header_ptr++; + mac_header_ptr->E = 1; + mac_header_ptr+=last_size; + // add a padding element + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + mac_header_ptr++; } else { // no end of packet padding - // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) - mac_header_ptr++; - //mac_header_ptr=last_size; // FIXME: should be ++ + // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) + mac_header_ptr++; + //mac_header_ptr=last_size; // FIXME: should be ++ } - + if ((ce_ptr-mac_header_control_elements) > 0) { - memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); - mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); + memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); + mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); } #ifdef DEBUG_HEADER_PARSING LOG_T(MAC," [UE %d] header : ", crnti); @@ -1009,7 +1012,7 @@ unsigned char generate_ulsch_header(u8 *mac_header, } -void ue_get_sdu(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u16 buflen, u8 *access_mode) { +void ue_get_sdu(module_id_t module_idP,frame_t frame,sub_frame_t subframe, u8 eNB_index,u8 *ulsch_buffer,u16 buflen, u8 *access_mode) { mac_rlc_status_resp_t rlc_status; u8 dcch_header_len=0,dcch1_header_len=0,dtch_header_len=0; @@ -1036,16 +1039,16 @@ void ue_get_sdu(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u #ifdef CBA if (*access_mode==CBA_ACCESS){ - LOG_D(MAC,"[UE %d] frame %d subframe %d try CBA transmission\n", - Mod_id, frame, subframe); - //if (UE_mac_inst[Mod_id].scheduling_info.LCID_status[DTCH] == LCID_EMPTY) - if (use_cba_access(Mod_id,frame,subframe,eNB_index)==0){ - *access_mode=POSTPONED_ACCESS; - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); - return; - } - LOG_D(MAC,"[UE %d] frame %d subframe %d CBA transmission oppurtunity, tbs %d\n", - Mod_id, frame, subframe,buflen); + LOG_D(MAC,"[UE %d] frame %d subframe %d try CBA transmission\n", + module_idP, frame, subframe); + //if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DTCH] == LCID_EMPTY) + if (use_cba_access(module_idP,frame,subframe,eNB_index)==0){ + *access_mode=POSTPONED_ACCESS; + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); + return; + } + LOG_D(MAC,"[UE %d] frame %d subframe %d CBA transmission oppurtunity, tbs %d\n", + module_idP, frame, subframe,buflen); } #endif dcch_header_len=2;//sizeof(SCH_SUBHEADER_SHORT); @@ -1054,151 +1057,151 @@ void ue_get_sdu(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u dtch_header_len=(buflen > 128 ) ? 3 : 2 ; //sizeof(SCH_SUBHEADER_LONG)-1 : sizeof(SCH_SUBHEADER_SHORT); bsr_header_len = 1;//sizeof(SCH_SUBHEADER_FIXED); phr_header_len = 1;//sizeof(SCH_SUBHEADER_FIXED); - phr_ce_len = (UE_mac_inst[Mod_id].PHR_reporting_active == 1) ? 1 /* sizeof(POWER_HEADROOM_CMD)*/: 0; + phr_ce_len = (UE_mac_inst[module_idP].PHR_reporting_active == 1) ? 1 /* sizeof(POWER_HEADROOM_CMD)*/: 0; if (phr_ce_len > 0){ - phr_len = phr_ce_len + phr_header_len; - LOG_D(MAC,"[UE %d] header size info: PHR len %d (ce%d,hdr%d) buff_len %d\n", - Mod_id, phr_len, phr_ce_len, phr_header_len, buflen); + phr_len = phr_ce_len + phr_header_len; + LOG_D(MAC,"[UE %d] header size info: PHR len %d (ce%d,hdr%d) buff_len %d\n", + module_idP, phr_len, phr_ce_len, phr_header_len, buflen); }else phr_len=0; - - bsr_ce_len = get_bsr_len (Mod_id, buflen-phr_len); + + bsr_ce_len = get_bsr_len (module_idP, buflen-phr_len); if (bsr_ce_len > 0 ){ - bsr_len = bsr_ce_len + bsr_header_len; - LOG_D(MAC,"[UE %d] header size info: dcch %d, dcch1 %d, dtch %d, bsr (ce%d,hdr%d) buff_len %d\n", - Mod_id, dcch_header_len,dcch1_header_len,dtch_header_len, bsr_ce_len, bsr_header_len, buflen); + bsr_len = bsr_ce_len + bsr_header_len; + LOG_D(MAC,"[UE %d] header size info: dcch %d, dcch1 %d, dtch %d, bsr (ce%d,hdr%d) buff_len %d\n", + module_idP, dcch_header_len,dcch1_header_len,dtch_header_len, bsr_ce_len, bsr_header_len, buflen); } else bsr_len = 0; - - // check for UL bandwidth requests and add SR control element + + // check for UL bandwidth requests and add SR control element // Check for DCCH first sdu_lengths[0]=0; - - if (UE_mac_inst[Mod_id].scheduling_info.LCID_status[DCCH] == LCID_NOT_EMPTY) { - - rlc_status = mac_rlc_status_ind(Mod_id+NB_eNB_INST,frame,0,RLC_MBMS_NO, - DCCH, - (buflen-dcch_header_len-bsr_len-phr_len)); - LOG_D(MAC, "[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to " + + if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DCCH] == LCID_NOT_EMPTY) { + + rlc_status = mac_rlc_status_ind(0, module_idP,frame,0,RLC_MBMS_NO, + DCCH, + (buflen-dcch_header_len-bsr_len-phr_len)); + LOG_D(MAC, "[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to " "send (Transport Block size %d, mac header len %d)\n", - Mod_id,frame, rlc_status.bytes_in_buffer,buflen,dcch_header_len); - - sdu_lengths[0] += mac_rlc_data_req(Mod_id+NB_eNB_INST,frame,RLC_MBMS_NO, - DCCH, - (char *)&ulsch_buff[sdu_lengths[0]]); - - sdu_length_total += sdu_lengths[0]; - sdu_lcids[0] = DCCH; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",Mod_id,sdu_lengths[0]); - num_sdus = 1; - update_bsr(Mod_id, frame, DCCH, UE_mac_inst[Mod_id].scheduling_info.LCGID[DCCH]); - //header_len +=2; + module_idP,frame, rlc_status.bytes_in_buffer,buflen,dcch_header_len); + + sdu_lengths[0] += mac_rlc_data_req(0, module_idP,frame,0, RLC_MBMS_NO, + DCCH, + (char *)&ulsch_buff[sdu_lengths[0]]); + + sdu_length_total += sdu_lengths[0]; + sdu_lcids[0] = DCCH; + LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",module_idP,sdu_lengths[0]); + num_sdus = 1; + update_bsr(module_idP, frame, DCCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]); + //header_len +=2; } else { - dcch_header_len=0; - num_sdus = 0; + dcch_header_len=0; + num_sdus = 0; } // DCCH1 - if (UE_mac_inst[Mod_id].scheduling_info.LCID_status[DCCH1] == LCID_NOT_EMPTY) { + if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DCCH1] == LCID_NOT_EMPTY) { - rlc_status = mac_rlc_status_ind(Mod_id+NB_eNB_INST,frame,0,RLC_MBMS_NO, - DCCH1, - (buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-sdu_length_total)); + rlc_status = mac_rlc_status_ind(0, module_idP,frame,0,RLC_MBMS_NO, + DCCH1, + (buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-sdu_length_total)); - LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH1 -> ULSCH, RRC message has %d bytes to" + LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH1 -> ULSCH, RRC message has %d bytes to" " send (Transport Block size %d, mac header len %d)\n", - Mod_id,frame, rlc_status.bytes_in_buffer,buflen,dcch1_header_len); - - sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id+NB_eNB_INST,frame,RLC_MBMS_NO, - DCCH1, - (char *)&ulsch_buff[sdu_lengths[0]]); - sdu_length_total += sdu_lengths[num_sdus]; - sdu_lcids[num_sdus] = DCCH1; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH1\n",Mod_id,sdu_lengths[num_sdus]); - num_sdus++; - //update_bsr(Mod_id, frame, DCCH1); - //dcch_header_len +=2; // include dcch1 + module_idP,frame, rlc_status.bytes_in_buffer,buflen,dcch1_header_len); + + sdu_lengths[num_sdus] = mac_rlc_data_req(0, module_idP,frame,0,RLC_MBMS_NO, + DCCH1, + (char *)&ulsch_buff[sdu_lengths[0]]); + sdu_length_total += sdu_lengths[num_sdus]; + sdu_lcids[num_sdus] = DCCH1; + LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH1\n",module_idP,sdu_lengths[num_sdus]); + num_sdus++; + //update_bsr(module_idP, frame, DCCH1); + //dcch_header_len +=2; // include dcch1 } else { - dcch1_header_len =0; + dcch1_header_len =0; } - if ((UE_mac_inst[Mod_id].scheduling_info.LCID_status[DTCH] == LCID_NOT_EMPTY) && + if ((UE_mac_inst[module_idP].scheduling_info.LCID_status[DTCH] == LCID_NOT_EMPTY) && ((bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len+sdu_length_total) <= buflen)){ - // optimize the dtch header lenght - //if ((UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[DTCH] > 128) && - /* if (((UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[DTCH] >= 128) && - ((UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[DTCH]+bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len) > buflen)&& + // optimize the dtch header lenght + //if ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] > 128) && + /* if (((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] >= 128) && + ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH]+bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len) > buflen)&& buflen >=128 )) dtch_header_len = 3;//sizeof(SCH_SUBHEADER_LONG); else dtch_header_len = 2;//sizeof(SCH_SUBHEADER_SHORT); - */ - rlc_status = mac_rlc_status_ind(Mod_id+NB_eNB_INST,frame,0,RLC_MBMS_NO, - DTCH, - buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total); - - LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[DTCH] %d)\n", - Mod_id,frame, rlc_status.bytes_in_buffer,buflen,dtch_header_len, - UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[DTCH]); - - sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id+NB_eNB_INST,frame,RLC_MBMS_NO, - DTCH, - (char *)&ulsch_buff[sdu_length_total]); - - //adjust dtch header - dtch_header_len = (sdu_lengths[num_sdus] >= 128) ? 3 : 2; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DTCH\n",Mod_id,sdu_lengths[num_sdus]); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - num_sdus++; - UE_mac_inst[Mod_id].ul_active = update_bsr(Mod_id, frame, DTCH, UE_mac_inst[Mod_id].scheduling_info.LCGID[DTCH]); + */ + rlc_status = mac_rlc_status_ind(0, module_idP,frame,0,RLC_MBMS_NO, + DTCH, + buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total); + + LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[DTCH] %d)\n", + module_idP,frame, rlc_status.bytes_in_buffer,buflen,dtch_header_len, + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH]); + + sdu_lengths[num_sdus] = mac_rlc_data_req(0, module_idP,frame, 0, RLC_MBMS_NO, + DTCH, + (char *)&ulsch_buff[sdu_length_total]); + + //adjust dtch header + dtch_header_len = (sdu_lengths[num_sdus] >= 128) ? 3 : 2; + LOG_D(MAC,"[UE %d] TX Got %d bytes for DTCH\n",module_idP,sdu_lengths[num_sdus]); + sdu_lcids[num_sdus] = DTCH; + sdu_length_total += sdu_lengths[num_sdus]; + num_sdus++; + UE_mac_inst[module_idP].ul_active = update_bsr(module_idP, frame, DTCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DTCH]); } else { // no rlc pdu : generate the dummy header - dtch_header_len = 0; + dtch_header_len = 0; } - - lcgid= get_bsr_lcgid(Mod_id); + + lcgid= get_bsr_lcgid(module_idP); if (lcgid < 0 ) { - bsr_s = NULL; - bsr_l = NULL ; + bsr_s = NULL; + bsr_l = NULL ; } else if ((lcgid ==MAX_NUM_LCGID) && (bsr_ce_len == sizeof(BSR_LONG))) { - bsr_s = NULL; - bsr_l->Buffer_size0 = UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID0]; - bsr_l->Buffer_size1 = UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID1]; - bsr_l->Buffer_size2 = UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID2]; - bsr_l->Buffer_size3 = UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID3]; - LOG_D(MAC, "[UE %d] Frame %d report long BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d)\n", Mod_id,frame, - UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID0], - UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID1], - UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID2], - UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID3]); + bsr_s = NULL; + bsr_l->Buffer_size0 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0]; + bsr_l->Buffer_size1 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]; + bsr_l->Buffer_size2 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]; + bsr_l->Buffer_size3 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]; + LOG_D(MAC, "[UE %d] Frame %d report long BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d)\n", module_idP,frame, + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0], + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1], + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2], + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]); } else if (bsr_ce_len == sizeof(BSR_SHORT)) { - bsr_l = NULL; - bsr_s->LCGID = lcgid; - bsr_s->Buffer_size = UE_mac_inst[Mod_id].scheduling_info.BSR[lcgid]; - LOG_D(MAC,"[UE %d] Frame %d report SHORT BSR with level %d for LCGID %d\n", - Mod_id, frame, UE_mac_inst[Mod_id].scheduling_info.BSR[lcgid],lcgid); + bsr_l = NULL; + bsr_s->LCGID = lcgid; + bsr_s->Buffer_size = UE_mac_inst[module_idP].scheduling_info.BSR[lcgid]; + LOG_D(MAC,"[UE %d] Frame %d report SHORT BSR with level %d for LCGID %d\n", + module_idP, frame, UE_mac_inst[module_idP].scheduling_info.BSR[lcgid],lcgid); } else { bsr_s = NULL; bsr_l = NULL; } - // build PHR and update the timers + // build PHR and update the timers if (phr_ce_len == sizeof(POWER_HEADROOM_CMD)){ - phr_p->PH = get_phr_mapping(Mod_id,eNB_index); - phr_p->R = 0; - LOG_D(MAC,"[UE %d] Frame %d report PHR with mapping (%d->%d) for LCID %d\n", - Mod_id,frame, mac_xface->get_PHR(Mod_id,eNB_index), phr_p->PH,POWER_HEADROOM); - update_phr(Mod_id); + phr_p->PH = get_phr_mapping(module_idP,eNB_index); + phr_p->R = 0; + LOG_D(MAC,"[UE %d] Frame %d report PHR with mapping (%d->%d) for LCID %d\n", + module_idP,frame, mac_xface->get_PHR(module_idP,eNB_index), phr_p->PH,POWER_HEADROOM); + update_phr(module_idP); }else phr_p=NULL; - LOG_T(MAC,"[UE %d] Frame %d: bsr s %p bsr_l %p, phr_p %p\n", Mod_id,frame,bsr_s, bsr_l, phr_p); + LOG_T(MAC,"[UE %d] Frame %d: bsr s %p bsr_l %p, phr_p %p\n", module_idP,frame,bsr_s, bsr_l, phr_p); // adjust the header length dcch_header_len_tmp = dcch_header_len; @@ -1207,42 +1210,41 @@ void ue_get_sdu(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u dcch_header_len = (dcch_header_len>0)? 1: dcch_header_len; else dtch_header_len= (dtch_header_len >0)? 1: dtch_header_len; // for short and long, cut the length+F fields - - if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) == buflen) { - *access_mode=CANCELED_ACCESS; - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); - return; - } else if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) <= 2) { - short_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total; - post_padding = 0; + + if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) <= 2) { + short_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total; + post_padding = 0; } else { - short_padding = 0; - if (dtch_header_len==0) - dcch_header_len = dcch_header_len_tmp; - else - dtch_header_len= dtch_header_len_tmp; - - post_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total -1 ; + if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) == buflen) { + *access_mode=CANCELED_ACCESS; + } + short_padding = 0; + if (dtch_header_len==0) + dcch_header_len = dcch_header_len_tmp; + else + dtch_header_len= dtch_header_len_tmp; + + post_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total -1 ; } - + // Generate header // if (num_sdus>0) { - + payload_offset = generate_ulsch_header(ulsch_buffer, // mac header - num_sdus, // num sdus - short_padding, // short pading - sdu_lengths, // sdu length - sdu_lcids, // sdu lcid - phr_p, // power headroom - NULL, // crnti - NULL, // truncated bsr - bsr_s, // short bsr - bsr_l, - post_padding); // long_bsr + num_sdus, // num sdus + short_padding, // short pading + sdu_lengths, // sdu length + sdu_lcids, // sdu lcid + phr_p, // power headroom + NULL, // crnti + NULL, // truncated bsr + bsr_s, // short bsr + bsr_l, + post_padding); // long_bsr LOG_I(MAC,"[UE %d] Generate header :bufflen %d sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d, dcch_header_len %d, dtch_header_len %d, padding %d,post_padding %d, bsr len %d, phr len %d, reminder %d \n", - Mod_id,buflen, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],payload_offset, dcch_header_len, dtch_header_len, - short_padding,post_padding, bsr_len, phr_len,buflen-sdu_length_total-payload_offset); + module_idP,buflen, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],payload_offset, dcch_header_len, dtch_header_len, + short_padding,post_padding, bsr_len, phr_len,buflen-sdu_length_total-payload_offset); // cycle through SDUs and place in ulsch_buffer memcpy(&ulsch_buffer[payload_offset],ulsch_buff,sdu_length_total); // fill remainder of DLSCH with random data @@ -1251,16 +1253,16 @@ void ue_get_sdu(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.opt_enabled) - trace_pdu(0, ulsch_buffer, buflen, Mod_id, 3, UE_mac_inst[Mod_id].crnti, subframe, 0, 0); + trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, subframe, 0, 0); LOG_D(OPT,"[UE %d][ULSCH] Frame %d trace pdu for rnti %x with size %d\n", - Mod_id, frame, UE_mac_inst[Mod_id].crnti, buflen); + module_idP, frame, UE_mac_inst[module_idP].crnti, buflen); #endif - - LOG_D(MAC,"[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", - Mod_id,payload_offset, sdu_length_total); - UE_mac_inst[Mod_id].scheduling_info.SR_pending=0; - UE_mac_inst[Mod_id].scheduling_info.SR_COUNTER=0; - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); + + LOG_D(MAC,"[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", + module_idP,payload_offset, sdu_length_total); + UE_mac_inst[module_idP].scheduling_info.SR_pending=0; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); } // called at each subframe @@ -1272,7 +1274,7 @@ void ue_get_sdu(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index,u8 *ulsch_buffer,u -UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t direction,u8 eNB_index) { +UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP, lte_subframe_t directionP,u8 eNB_indexP) { int lcid; // lcid index int TTI= 1; @@ -1295,31 +1297,31 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire #if defined(ENABLE_ITTI) do { - // Checks if a message has been sent to MAC sub-task - itti_poll_msg (TASK_MAC_UE, &msg_p); + // Checks if a message has been sent to MAC sub-task + itti_poll_msg (TASK_MAC_UE, &msg_p); - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); + if (msg_p != NULL) { + msg_name = ITTI_MSG_NAME (msg_p); + instance = ITTI_MSG_INSTANCE (msg_p); - switch (ITTI_MSG_ID(msg_p)) { - case RRC_MAC_CCCH_DATA_REQ: - LOG_I(MAC, "Received %s from %s: instance %d, frame %d, eNB_index %d\n", + switch (ITTI_MSG_ID(msg_p)) { + case RRC_MAC_CCCH_DATA_REQ: + LOG_I(MAC, "Received %s from %s: instance %d, frame %d, eNB_index %d\n", msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, RRC_MAC_CCCH_DATA_REQ (msg_p).frame, RRC_MAC_CCCH_DATA_REQ (msg_p).enb_index); - // TODO process CCCH data req. - break; + // TODO process CCCH data req. + break; - default: - LOG_E(MAC, "Received unexpected message %s\n", msg_name); - break; - } + default: + LOG_E(MAC, "Received unexpected message %s\n", msg_name); + break; + } - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - } + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + } } while(msg_p != NULL); #endif @@ -1327,7 +1329,7 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire //Rrc_xface->Frame_index=Mac_rlc_xface->frame; //if (subframe%5 == 0) #ifdef EXMIMO - pdcp_run(frame, 0, Mod_id, eNB_index); + pdcp_run(frame, 0, module_idP, eNB_index); /* ret = pthread_mutex_trylock (&pdcp_mutex); if (ret != 0) { @@ -1340,7 +1342,7 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire else { pdcp_instance_cnt++; pthread_mutex_unlock(&pdcp_mutex); - + if (pdcp_instance_cnt == 0) { if (pthread_cond_signal(&pdcp_cond) != 0) { LOG_E(PDCP,"pthread_cond_signal unsuccessfull\n"); @@ -1351,20 +1353,20 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt); } } - */ + */ #endif - UE_mac_inst[Mod_id].frame = frame; - UE_mac_inst[Mod_id].subframe = subframe; + UE_mac_inst[module_idP].frame = frameP; + UE_mac_inst[module_idP].subframe = subframeP; #ifdef CELLULAR - rrc_rx_tx(Mod_id, frame, 0, eNB_index); + rrc_rx_tx(module_idP, frameP, 0, eNB_indexP); #else - switch (rrc_rx_tx(Mod_id, - frame, - 0, - eNB_index)) { + switch (rrc_rx_tx(module_idP, + frameP, + 0, + eNB_indexP)) { case RRC_OK: break; case RRC_ConnSetup_failed: @@ -1375,9 +1377,9 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire LOG_E(MAC,"RRC Loss of synch, returning PHY_RESYNCH\n"); return(PHY_RESYNCH); case RRC_Handover_failed: - LOG_N(MAC,"Handover failure for UE %d eNB_index %d\n",Mod_id,eNB_index); + LOG_N(MAC,"Handover failure for UE %d eNB_index %d\n",module_idP,eNB_indexP); //Invalid...need to add another MAC UE state for re-connection procedure - mac_xface->phy_config_afterHO_ue(Mod_id,eNB_index,(MobilityControlInfo_t *)NULL,1); + mac_xface->phy_config_afterHO_ue(module_idP,eNB_indexP,(MobilityControlInfo_t *)NULL,1); //return(3); break; case RRC_HO_STARTED: @@ -1389,28 +1391,28 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire #endif // Check Contention resolution timer (put in a function later) - if (UE_mac_inst[Mod_id].RA_contention_resolution_timer_active == 1) { - - if (UE_mac_inst[Mod_id].radioResourceConfigCommon) - rach_ConfigCommon = &UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon; - else { - LOG_E(MAC,"FATAL: radioResourceConfigCommon is NULL!!!\n"); - mac_xface->macphy_exit(""); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - return(RRC_OK); - } + if (UE_mac_inst[module_idP].RA_contention_resolution_timer_active == 1) { - LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frame,UE_mac_inst[Mod_id].RA_contention_resolution_cnt, - ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)); + if (UE_mac_inst[module_idP].radioResourceConfigCommon) + rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; + else { + LOG_E(MAC,"FATAL: radioResourceConfigCommon is NULL!!!\n"); + mac_xface->macphy_exit(""); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + return(RRC_OK); + } - UE_mac_inst[Mod_id].RA_contention_resolution_cnt++; - if (UE_mac_inst[Mod_id].RA_contention_resolution_cnt == - ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)) { - UE_mac_inst[Mod_id].RA_active = 0; - // Signal PHY to quit RA procedure - LOG_E(MAC,"Contention resolution timer expired, RA failed\n"); - mac_xface->ra_failed(Mod_id,eNB_index); - } + LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frame,UE_mac_inst[module_idP].RA_contention_resolution_cnt, + ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)); + + UE_mac_inst[module_idP].RA_contention_resolution_cnt++; + if (UE_mac_inst[module_idP].RA_contention_resolution_cnt == + ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)) { + UE_mac_inst[module_idP].RA_active = 0; + // Signal PHY to quit RA procedure + LOG_E(MAC,"Contention resolution timer expired, RA failed\n"); + mac_xface->ra_failed(module_idP,eNB_indexP); + } } @@ -1418,77 +1420,77 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire // outlined in Sections 5.4.4 an 5.4.5 of 36.321 // Put this in another function - // Get RLC status info and update Bj for all lcids that are active + // Get RLC status info and update Bj for all lcids that are active for (lcid=DCCH; lcid <= DTCH; lcid++ ) { - if ((lcid == 0) ||(UE_mac_inst[Mod_id].logicalChannelConfig[lcid])) { - // meausre the Bj - if ((direction == SF_UL)&& (UE_mac_inst[Mod_id].scheduling_info.Bj[lcid] >= 0)){ - if (UE_mac_inst[Mod_id].logicalChannelConfig[lcid]->ul_SpecificParameters) { - bucketsizeduration = UE_mac_inst[Mod_id].logicalChannelConfig[lcid]->ul_SpecificParameters->prioritisedBitRate * TTI; - bucketsizeduration_max = get_ms_bucketsizeduration(UE_mac_inst[Mod_id].logicalChannelConfig[lcid]->ul_SpecificParameters->bucketSizeDuration); - } - else { - LOG_E(MAC,"[UE %d] lcid %d, NULL ul_SpecificParameters\n",Mod_id,lcid); - mac_xface->macphy_exit(""); - } - if ( UE_mac_inst[Mod_id].scheduling_info.Bj[lcid] > bucketsizeduration_max ) - UE_mac_inst[Mod_id].scheduling_info.Bj[lcid] = bucketsizeduration_max; - else - UE_mac_inst[Mod_id].scheduling_info.Bj[lcid] = bucketsizeduration; - } - if (update_bsr(Mod_id,frame, lcid, UE_mac_inst[Mod_id].scheduling_info.LCGID[lcid])) { - UE_mac_inst[Mod_id].scheduling_info.SR_pending= 1; - LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d SR for PUSCH is pending for LCGID %d with BSR level %d (%d bytes in RLC)\n", - Mod_id, frame,subframe,UE_mac_inst[Mod_id].scheduling_info.LCGID[lcid], - UE_mac_inst[Mod_id].scheduling_info.BSR[UE_mac_inst[Mod_id].scheduling_info.LCGID[lcid]], - UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[UE_mac_inst[Mod_id].scheduling_info.LCGID[lcid]]); + if ((lcid == 0) ||(UE_mac_inst[module_idP].logicalChannelConfig[lcid])) { + // meausre the Bj + if ((directionP == SF_UL)&& (UE_mac_inst[module_idP].scheduling_info.Bj[lcid] >= 0)){ + if (UE_mac_inst[module_idP].logicalChannelConfig[lcid]->ul_SpecificParameters) { + bucketsizeduration = UE_mac_inst[module_idP].logicalChannelConfig[lcid]->ul_SpecificParameters->prioritisedBitRate * TTI; + bucketsizeduration_max = get_ms_bucketsizeduration(UE_mac_inst[module_idP].logicalChannelConfig[lcid]->ul_SpecificParameters->bucketSizeDuration); + } + else { + LOG_E(MAC,"[UE %d] lcid %d, NULL ul_SpecificParameters\n",module_idP,lcid); + mac_xface->macphy_exit(""); + } + if ( UE_mac_inst[module_idP].scheduling_info.Bj[lcid] > bucketsizeduration_max ) + UE_mac_inst[module_idP].scheduling_info.Bj[lcid] = bucketsizeduration_max; + else + UE_mac_inst[module_idP].scheduling_info.Bj[lcid] = bucketsizeduration; + } + if (update_bsr(module_idP,frame, lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid])) { + UE_mac_inst[module_idP].scheduling_info.SR_pending= 1; + LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d SR for PUSCH is pending for LCGID %d with BSR level %d (%d bytes in RLC)\n", + module_idP, frameP,subframeP,UE_mac_inst[module_idP].scheduling_info.LCGID[lcid], + UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]]); + } } - } } // UE has no valid phy config dedicated || no valid/released SR - if ((UE_mac_inst[Mod_id].physicalConfigDedicated == NULL)) { - // cancel all pending SRs - UE_mac_inst[Mod_id].scheduling_info.SR_pending=0; - UE_mac_inst[Mod_id].ul_active=0; - LOG_T(MAC,"[UE %d] Release all SRs \n", Mod_id); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - return(CONNECTION_OK); + if ((UE_mac_inst[module_idP].physicalConfigDedicated == NULL)) { + // cancel all pending SRs + UE_mac_inst[module_idP].scheduling_info.SR_pending=0; + UE_mac_inst[module_idP].ul_active=0; + LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + return(CONNECTION_OK); } - if ((UE_mac_inst[Mod_id].physicalConfigDedicated->schedulingRequestConfig == NULL) || - (UE_mac_inst[Mod_id].physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_release)){ + if ((UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig == NULL) || + (UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_release)){ - // initiate RA with CRNTI included in msg3 (no contention) as descibed in 36.321 sec 5.1.5 + // initiate RA with CRNTI included in msg3 (no contention) as descibed in 36.321 sec 5.1.5 - // cancel all pending SRs - UE_mac_inst[Mod_id].scheduling_info.SR_pending=0; - UE_mac_inst[Mod_id].ul_active=0; - LOG_T(MAC,"[UE %d] Release all SRs \n", Mod_id); + // cancel all pending SRs + UE_mac_inst[module_idP].scheduling_info.SR_pending=0; + UE_mac_inst[module_idP].ul_active=0; + LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP); } // Put this in a function // Call PHR procedure as described in Section 5.4.6 in 36.321 - if (UE_mac_inst[Mod_id].PHR_state == MAC_MainConfig__phr_Config_PR_setup){ // normal operation - if (UE_mac_inst[Mod_id].PHR_reconfigured == 1) { // upon (re)configuration of the power headroom reporting functionality by upper layers - UE_mac_inst[Mod_id].PHR_reporting_active = 1; - UE_mac_inst[Mod_id].PHR_reconfigured = 0; - } else { - //LOG_D(MAC,"PHR normal operation %d active %d \n", UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF, UE_mac_inst[Mod_id].PHR_reporting_active); - if ((UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF <= 0) && - ((mac_xface->get_PL(Mod_id,eNB_index) < UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db) || - (UE_mac_inst[Mod_id].power_backoff_db[eNB_index] > UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db))) + if (UE_mac_inst[module_idP].PHR_state == MAC_MainConfig__phr_Config_PR_setup){ // normal operation + if (UE_mac_inst[module_idP].PHR_reconfigured == 1) { // upon (re)configuration of the power headroom reporting functionality by upper layers + UE_mac_inst[module_idP].PHR_reporting_active = 1; + UE_mac_inst[module_idP].PHR_reconfigured = 0; + } else { + //LOG_D(MAC,"PHR normal operation %d active %d \n", UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF, UE_mac_inst[module_idP].PHR_reporting_active); + if ((UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF <= 0) && + ((mac_xface->get_PL(module_idP,eNB_indexP) < UE_mac_inst[module_idP].scheduling_info.PathlossChange_db) || + (UE_mac_inst[module_idP].power_backoff_db[eNB_indexP] > UE_mac_inst[module_idP].scheduling_info.PathlossChange_db))) // trigger PHR and reset the timer later when the PHR report is sent - UE_mac_inst[Mod_id].PHR_reporting_active = 1; - else if (UE_mac_inst[Mod_id].PHR_reporting_active ==0 ) - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF--; - if (UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF <= 0 ) + UE_mac_inst[module_idP].PHR_reporting_active = 1; + else if (UE_mac_inst[module_idP].PHR_reporting_active ==0 ) + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF--; + if (UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF <= 0 ) // trigger PHR and reset the timer later when the PHR report is sent - UE_mac_inst[Mod_id].PHR_reporting_active = 1; - else if (UE_mac_inst[Mod_id].PHR_reporting_active == 0 ) - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF--; - } + UE_mac_inst[module_idP].PHR_reporting_active = 1; + else if (UE_mac_inst[module_idP].PHR_reporting_active == 0 ) + UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF--; + } } else { // release / nothing - UE_mac_inst[Mod_id].PHR_reporting_active = 0; // release PHR + UE_mac_inst[module_idP].PHR_reporting_active = 0; // release PHR } //If the UE has UL resources allocated for new transmission for this TTI here: vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); @@ -1502,89 +1504,89 @@ double uniform_rngen(int min, int max) { return (max - min) * random + min; } -int use_cba_access(u8 Mod_id,u32 frame,u8 subframe, u8 eNB_index){ - - if (( ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID1]>0)&&(UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID1]<64)) || - ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID2]>0)&&(UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID2]<64)) || - ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID3]>0)&&(UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID3]<64)) ) - // && (UE_mac_inst[Mod_id].ul_active == 0) // check if the ul is acrtive - && (UE_mac_inst[Mod_id].cba_last_access[0] <= 0) ) { // backoff - // LOG_D(MAC,"[UE %d] Frame %d Subframe %d: the current CBA backoff is %d \n", Mod_id, frame, subframe, - // UE_mac_inst[Mod_id].cba_last_access[0] ); - - UE_mac_inst[Mod_id].cba_last_access[0]= round(uniform_rngen(1,10)); - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", Mod_id, frame, subframe, - UE_mac_inst[Mod_id].cba_last_access[0], UE_mac_inst[Mod_id].ul_active); - - return 1; - } else if (( ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID1]> 0 )) || - ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID2]> 0 )) || - ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID3]> 0 )) ) - // && (UE_mac_inst[Mod_id].ul_active == 0) // check if the ul is acrtive - && (UE_mac_inst[Mod_id].cba_last_access[0]> 0) ){ - - UE_mac_inst[Mod_id].cba_last_access[0]-=1; - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: CBA backoff is decreased by one to %d UL active state %d \n", - Mod_id, frame, subframe, - UE_mac_inst[Mod_id].cba_last_access[0], UE_mac_inst[Mod_id].ul_active); - - } /*else if (( ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID1] == 0 )) && - ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID2] == 0 )) && - ((UE_mac_inst[Mod_id].scheduling_info.BSR[LCGID3] == 0 )) ) - && (UE_mac_inst[Mod_id].cba_last_access[0]> 0) ){ - UE_mac_inst[Mod_id].cba_last_access[0]-=1; +int use_cba_access(module_id_t module_idP,frame_t frameP,u8 subframe, u8 eNB_index){ + + if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]<64)) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]<64)) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]<64)) ) + // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive + && (UE_mac_inst[module_idP].cba_last_access[0] <= 0) ) { // backoff + // LOG_D(MAC,"[UE %d] Frame %d Subframe %d: the current CBA backoff is %d \n", module_idP, frame, subframe, + // UE_mac_inst[module_idP].cba_last_access[0] ); + + UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,10)); + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frame, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + + return 1; + } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]> 0 )) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]> 0 )) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]> 0 )) ) + // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive + && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ){ + + UE_mac_inst[module_idP].cba_last_access[0]-=1; + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: CBA backoff is decreased by one to %d UL active state %d \n", + module_idP, frame, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + + } /*else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1] == 0 )) && + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2] == 0 )) && + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3] == 0 )) ) + && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ){ + UE_mac_inst[module_idP].cba_last_access[0]-=1; }*/ - + return 0; - + } #endif -int get_bsr_lcgid (u8 Mod_id){ +int get_bsr_lcgid (module_id_t module_idP){ int lcgid, lcgid_tmp=-1; int num_active_lcgid = 0; - + for (lcgid = 0 ; lcgid < MAX_NUM_LCGID; lcgid++){ - if (UE_mac_inst[Mod_id].scheduling_info.BSR[lcgid] > 0 ){ - lcgid_tmp = lcgid; - num_active_lcgid+=1; - } + if (UE_mac_inst[module_idP].scheduling_info.BSR[lcgid] > 0 ){ + lcgid_tmp = lcgid; + num_active_lcgid+=1; + } } if (num_active_lcgid == 0) - return -1; + return -1; else if (num_active_lcgid == 1) - return lcgid_tmp; + return lcgid_tmp; else - return MAX_NUM_LCGID; + return MAX_NUM_LCGID; } -u8 get_bsr_len (u8 Mod_id, u16 buflen) { +u8 get_bsr_len (module_id_t module_idP, u16 buflen) { int lcgid=0; u8 bsr_len=0, num_lcgid=0; int pdu = 0; for (lcgid=0; lcgid < MAX_NUM_LCGID; lcgid++ ) { - if (UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcgid] > 0 ) - pdu += (UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcgid] + bsr_len + 2); //2 = sizeof(SCH_SUBHEADER_SHORT) - if (UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcgid] > 128 ) // long header size: adjust the header size - pdu += 1; - // current phy buff can not transport all sdu for this lcgid -> transmit a bsr for this lcgid - - if ( (pdu > buflen) && (UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcgid] > 0 ) ){ - num_lcgid +=1; - bsr_len = (num_lcgid >= 2 ) ? sizeof(BSR_LONG) : sizeof(BSR_SHORT) ; - } - LOG_D(MAC,"BSR Bytes %d for lcgid %d bsr len %d num lcgid %d\n", UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcgid], lcgid, bsr_len, num_lcgid); + if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 0 ) + pdu += (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] + bsr_len + 2); //2 = sizeof(SCH_SUBHEADER_SHORT) + if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 128 ) // long header size: adjust the header size + pdu += 1; + // current phy buff can not transport all sdu for this lcgid -> transmit a bsr for this lcgid + + if ( (pdu > buflen) && (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 0 ) ){ + num_lcgid +=1; + bsr_len = (num_lcgid >= 2 ) ? sizeof(BSR_LONG) : sizeof(BSR_SHORT) ; + } + LOG_D(MAC,"BSR Bytes %d for lcgid %d bsr len %d num lcgid %d\n", UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid], lcgid, bsr_len, num_lcgid); } if ( bsr_len > 0 ) LOG_D(MAC,"[UE %d] Prepare a %s (Transport Block Size %d, MAC pdu Size %d) \n", - Mod_id, map_int_to_str(BSR_names, bsr_len), buflen, pdu); + module_idP, map_int_to_str(BSR_names, bsr_len), buflen, pdu); return bsr_len; } -int update_bsr(u8 Mod_id, u32 frame, u8 lcid, u8 lcg_id){ +int update_bsr(module_id_t module_idP, frame_t frameP, u8 lcid, u8 lcg_id){ mac_rlc_status_resp_t rlc_status; u8 sr_pending = 0; @@ -1592,25 +1594,25 @@ int update_bsr(u8 Mod_id, u32 frame, u8 lcid, u8 lcg_id){ return sr_pending; // fixme: need a better way to reset if ((lcid == DCCH) || (lcid == DTCH)){ - UE_mac_inst[Mod_id].scheduling_info.BSR[lcg_id]=0; - UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcg_id]=0; + UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id]=0; + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]=0; } // for (lcid =0 ; lcid < MAX_NUM_LCID; lcid++) { - if (UE_mac_inst[Mod_id].scheduling_info.LCGID[lcid] == lcg_id) { - rlc_status = mac_rlc_status_ind(Mod_id+NB_eNB_INST,frame,0,RLC_MBMS_NO, - lcid, - 0); - if (rlc_status.bytes_in_buffer > 0 ) { - sr_pending = 1; - UE_mac_inst[Mod_id].scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY; - UE_mac_inst[Mod_id].scheduling_info.BSR[lcg_id] += locate (BSR_TABLE,BSR_TABLE_SIZE, rlc_status.bytes_in_buffer); - UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcg_id] += rlc_status.bytes_in_buffer; - // UE_mac_inst[Mod_id].scheduling_info.BSR_short_lcid = lcid; // only applicable to short bsr - LOG_D(MAC,"[UE %d] BSR level %d (LCGID %d, rlc buffer %d byte)\n", - Mod_id, UE_mac_inst[Mod_id].scheduling_info.BSR[lcg_id],lcg_id, UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[lcg_id]); - } - else - UE_mac_inst[Mod_id].scheduling_info.LCID_status[lcid]=LCID_EMPTY; + if (UE_mac_inst[module_idP].scheduling_info.LCGID[lcid] == lcg_id) { + rlc_status = mac_rlc_status_ind(0, module_idP,frame,0,RLC_MBMS_NO, + lcid, + 0); + if (rlc_status.bytes_in_buffer > 0 ) { + sr_pending = 1; + UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY; + UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id] += locate (BSR_TABLE,BSR_TABLE_SIZE, rlc_status.bytes_in_buffer); + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id] += rlc_status.bytes_in_buffer; + // UE_mac_inst[module_idP].scheduling_info.BSR_short_lcid = lcid; // only applicable to short bsr + LOG_D(MAC,"[UE %d] BSR level %d (LCGID %d, rlc buffer %d byte)\n", + module_idP, UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id],lcg_id, UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]); + } + else + UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid]=LCID_EMPTY; } //} return sr_pending; @@ -1628,12 +1630,12 @@ u8 locate (const u32 *table, int size, int value){ ascend = (table[ju] >= table[jl]) ? 1 : 0; // determine the order of the the table: 1 if ascending order of table, 0 otherwise while (ju-jl > 1) { //If we are not yet done, - jm = (ju+jl) >> 1; //compute a midpoint, - if ((value >= table[jm]) == ascend) - jl=jm; // replace the lower limit - else - ju=jm; //replace the upper limit - LOG_T(MAC,"[UE] searching BSR index %d for (BSR TABLE %d < value %d)\n", jm, table[jm], value); + jm = (ju+jl) >> 1; //compute a midpoint, + if ((value >= table[jm]) == ascend) + jl=jm; // replace the lower limit + else + ju=jm; //replace the upper limit + LOG_T(MAC,"[UE] searching BSR index %d for (BSR TABLE %d < value %d)\n", jm, table[jm], value); } if (value == table[jl]) return jl; else return jl+1; //equally ju @@ -1745,24 +1747,24 @@ int get_ms_bucketsizeduration(u8 bucketsizeduration){ } } -void update_phr(u8 Mod_id){ - - UE_mac_inst[Mod_id].PHR_reporting_active =0; - UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer); - UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer); - // LOG_D(MAC,"phr %d %d\n ",UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF, UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF); +void update_phr(module_id_t module_idP){ + + UE_mac_inst[module_idP].PHR_reporting_active =0; + UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer); + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer); + // LOG_D(MAC,"phr %d %d\n ",UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF, UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF); } -u8 get_phr_mapping (u8 Mod_id, u8 eNB_index){ +u8 get_phr_mapping (module_id_t module_idP, u8 eNB_index){ -//power headroom reporting range is from -23 ...+40 dB, as described in 36313 -//note: mac_xface->get_Po_NOMINAL_PUSCH(Mod_id) is float - if (mac_xface->get_PHR(Mod_id,eNB_index) < -23) + //power headroom reporting range is from -23 ...+40 dB, as described in 36313 + //note: mac_xface->get_Po_NOMINAL_PUSCH(module_idP) is float + if (mac_xface->get_PHR(module_idP,eNB_index) < -23) return 0; - else if (mac_xface->get_PHR(Mod_id,eNB_index) >= 40) + else if (mac_xface->get_PHR(module_idP,eNB_index) >= 40) return 63; - else // -23 to 40 - return (u8) mac_xface->get_PHR(Mod_id,eNB_index) + PHR_MAPPING_OFFSET; - + else // -23 to 40 + return (u8) mac_xface->get_PHR(module_idP,eNB_index) + PHR_MAPPING_OFFSET; + } int get_sf_perioidicPHR_Timer(u8 perioidicPHR_Timer){ return (perioidicPHR_Timer+1)*10; diff --git a/openair2/LAYER2/PDCP/pdcp_fifo.c b/openair2/LAYER2/PDCP/pdcp_fifo.c index 2ac7305ecf..cbd2fc6084 100755 --- a/openair2/LAYER2/PDCP/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP/pdcp_fifo.c @@ -259,9 +259,6 @@ pdcp_fifo_read_input_sdus_remaining_bytes () { //----------------------------------------------------------------------------- sdu_size_t bytes_read=0; - // if remaining bytes to read - - if (pdcp_input_sdu_remaining_size_to_read > 0) { diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index ccdf4e9f20..40b2a43f98 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -25,7 +25,7 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file pdcp.c * \brief pdcp interface with RLC @@ -61,9 +61,6 @@ # include "intertask_interface.h" #endif -#define PDCP_DATA_REQ_DEBUG 0 -#define PDCP_DATA_IND_DEBUG 0 - #ifndef OAI_EMU extern int otg_enabled; #endif @@ -79,176 +76,180 @@ extern int otg_rx_pkt( int src, int dst, int ctime, char *buffer_tx, unsigned in * this mem_block_t to be dissected for testing purposes. For further details see test * code at targets/TEST/PDCP/test_pdcp.c:test_pdcp_data_req() */ -#ifdef PDCP_UNIT_TEST -BOOL pdcp_data_req(module_id_t module_id, u32_t frame, u8_t eNB_flag, rb_id_t rb_id, sdu_size_t sdu_buffer_size, \ - unsigned char* sdu_buffer, pdcp_t* test_pdcp_entity, list_t* test_list) -#else -BOOL pdcp_data_req(u8 eNB_id, u8 UE_id, u32_t frame, u8_t eNB_flag, rb_id_t rb_id, u32 muiP, u32 confirmP, - sdu_size_t sdu_buffer_size, unsigned char* sdu_buffer, u8 mode) -#endif +BOOL pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t frameP, eNB_flag_t enb_flagP, rb_id_t rb_idP, mui_t muiP, u32 confirmP, + sdu_size_t sdu_buffer_sizeP, unsigned char* sdu_buffer_pP, u8 modeP) { //----------------------------------------------------------------------------- - pdcp_t* pdcp; - u8 i; - u8 pdcp_header_len=0, pdcp_tailer_len=0; - u16 pdcp_pdu_size=0, current_sn; - mem_block_t* pdcp_pdu = NULL; - rlc_op_status_t rlc_status; - module_id_t module_id; - rb_id_t rb_id_rlc = 0; - - AssertError (eNB_id < NUMBER_OF_eNB_MAX, return FALSE, "eNB id is too high (%u/%d) %u %u!\n", eNB_id, NUMBER_OF_eNB_MAX, UE_id, rb_id); - AssertError (UE_id < NUMBER_OF_UE_MAX, return FALSE, "UE id is too high (%u/%d) %u %u!\n", UE_id, NUMBER_OF_UE_MAX, eNB_id, rb_id); - AssertError (rb_id < NB_RB_MAX, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_id, NB_RB_MAX, UE_id, eNB_id); - -#ifdef PDCP_UNIT_TEST - pdcp = test_pdcp_entity; -#else - if (eNB_flag == 0) { - pdcp = &pdcp_array_ue[UE_id][rb_id]; - module_id = NB_eNB_INST + UE_id; - rb_id_rlc = rb_id; + pdcp_t *pdcp_p = NULL; + u8 i = 0; + u8 pdcp_header_len = 0; + u8 pdcp_tailer_len = 0; + u16 pdcp_pdu_size = 0; + u16 current_sn = 0; + mem_block_t *pdcp_pdu_p = NULL; + rlc_op_status_t rlc_status; + rb_id_t rb_id_rlc = 0; + + AssertError (enb_mod_idP < NUMBER_OF_eNB_MAX, return FALSE, "eNB id is too high (%u/%d) %u %u!\n", enb_mod_idP, NUMBER_OF_eNB_MAX, ue_mod_idP, rb_idP); + AssertError (ue_mod_idP < NUMBER_OF_UE_MAX, return FALSE, "UE id is too high (%u/%d) %u %u!\n", ue_mod_idP, NUMBER_OF_UE_MAX, enb_mod_idP, rb_idP); + AssertError (rb_idP < NB_RB_MAX, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, NB_RB_MAX, ue_mod_idP, enb_mod_idP); + + if (enb_flagP == 0) { + pdcp_p = &pdcp_array_ue[ue_mod_idP][rb_idP]; } else { - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rb_id]; - module_id = eNB_id; - rb_id_rlc = rb_id + (NB_RB_MAX * UE_id); + pdcp_p = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP]; } -#endif - if ((pdcp->instanciated_instance == 0) && (mode != PDCP_TM)) { - if (eNB_flag == 0) { - LOG_W(PDCP, "[UE %d] Instance is not configured for eNB %d, rb_id %d Ignoring SDU...\n", - UE_id, eNB_id, rb_id); - } else { - LOG_W(PDCP, "[eNB %d] Instance is not configured for UE %d, rb_id %d Ignoring SDU...\n", - eNB_id, UE_id, rb_id); - } - return FALSE; + if ((pdcp_p->instanciated_instance == 0) && (modeP != PDCP_TM)) { + if (enb_flagP == 0) { + LOG_W(PDCP, "[UE %d] Instance is not configured for eNB %d, rb_id %d Ignoring SDU...\n", + ue_mod_idP, enb_mod_idP, rb_idP); + } else { + LOG_W(PDCP, "[eNB %d] Instance is not configured for UE %d, rb_id %d Ignoring SDU...\n", + enb_mod_idP, ue_mod_idP, rb_idP); + } + return FALSE; } - if (sdu_buffer_size == 0) { - LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n"); - return FALSE; + if (sdu_buffer_sizeP == 0) { + LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n"); + return FALSE; } /* * XXX MAX_IP_PACKET_SIZE is 4096, shouldn't this be MAX SDU size, which is 8188 bytes? */ - if (sdu_buffer_size > MAX_IP_PACKET_SIZE) { - LOG_E(PDCP, "Requested SDU size (%d) is bigger than that can be handled by PDCP (%u)!\n", - sdu_buffer_size, MAX_IP_PACKET_SIZE); - // XXX What does following call do? - mac_xface->macphy_exit("PDCP sdu buffer size > MAX_IP_PACKET_SIZE"); + if (sdu_buffer_sizeP > MAX_IP_PACKET_SIZE) { + LOG_E(PDCP, "Requested SDU size (%d) is bigger than that can be handled by PDCP (%u)!\n", + sdu_buffer_sizeP, MAX_IP_PACKET_SIZE); + // XXX What does following call do? + mac_xface->macphy_exit("PDCP sdu buffer size > MAX_IP_PACKET_SIZE"); } // PDCP transparent mode for MBMS traffic - if (mode == PDCP_TM) { - 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); - if (pdcp_pdu != NULL) { - 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_rlc, muiP, confirmP, sdu_buffer_size, pdcp_pdu); - } else - rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES; + if (modeP == PDCP_TM) { + LOG_D(PDCP, " [TM] Asking for a new mem_block of size %d\n",sdu_buffer_sizeP); + pdcp_pdu_p = get_free_mem_block(sdu_buffer_sizeP); + if (pdcp_pdu_p != NULL) { + memcpy(&pdcp_pdu_p->data[0], sdu_buffer_pP, sdu_buffer_sizeP); + rlc_status = rlc_data_req(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, RLC_MBMS_YES, rb_idP, muiP, confirmP, sdu_buffer_sizeP, pdcp_pdu_p); + } else { + rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES; +#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) + AssertFatal(0, "[FRAME %5u][%s][PDCP][MOD %u/%u][RB %u] PDCP_DATA_REQ SDU DROPPED, OUT OF MEMORY \n", + frameP, + (enb_flagP) ? "eNB" : "UE", + enb_mod_idP, + ue_mod_idP, + rb_idP); +#endif + } } else { - // calculate the pdcp header and trailer size - if ((rb_id % NB_RB_MAX) < DTCH) { - pdcp_header_len = PDCP_CONTROL_PLANE_DATA_PDU_SN_SIZE; - pdcp_tailer_len = PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE; - } else { - pdcp_header_len = PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; - pdcp_tailer_len = 0; - } - pdcp_pdu_size= sdu_buffer_size + pdcp_header_len + pdcp_tailer_len; - - LOG_I(PDCP, "Data request notification for PDCP entity with module ID %d and radio bearer ID %d pdu size %d (header%d, trailer%d)\n", module_id, rb_id,pdcp_pdu_size, pdcp_header_len,pdcp_tailer_len); - - /* - * Allocate a new block for the new PDU (i.e. PDU header and SDU payload) - */ - LOG_D(PDCP, "Asking for a new mem_block of size %d\n", pdcp_pdu_size); - pdcp_pdu = get_free_mem_block(pdcp_pdu_size); - - if (pdcp_pdu != NULL) { - /* - * Create a Data PDU with header and append data - * - * Place User Plane PDCP Data PDU header first - */ - - if ((rb_id % NB_RB_MAX) < DTCH) { // this Control plane PDCP Data PDU - pdcp_control_plane_data_pdu_header pdu_header; - pdu_header.sn = pdcp_get_next_tx_seq_number(pdcp); - current_sn = pdu_header.sn; - memset(&pdu_header.mac_i[0],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE); - if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char*)pdcp_pdu->data, &pdu_header) == FALSE) { - LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n"); - return FALSE; - } + // calculate the pdcp header and trailer size + if (rb_idP < DTCH) { + pdcp_header_len = PDCP_CONTROL_PLANE_DATA_PDU_SN_SIZE; + pdcp_tailer_len = PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE; } else { - pdcp_user_plane_data_pdu_header_with_long_sn pdu_header; - pdu_header.dc = (mode == 1) ? PDCP_DATA_PDU : PDCP_CONTROL_PDU; - pdu_header.sn = pdcp_get_next_tx_seq_number(pdcp); - current_sn = pdu_header.sn ; - if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char*)pdcp_pdu->data, &pdu_header) == FALSE) { - LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n"); - return FALSE; - } + pdcp_header_len = PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; + pdcp_tailer_len = 0; } + pdcp_pdu_size = sdu_buffer_sizeP + pdcp_header_len + pdcp_tailer_len; + + LOG_I(PDCP, "Data request notification for PDCP entity %s enb id %u ue_id %u and radio bearer ID %d pdu size %d (header%d, trailer%d)\n", + (enb_flagP) ? "eNB" : "UE", + enb_mod_idP, + ue_mod_idP, + rb_idP, + pdcp_pdu_size, + pdcp_header_len, + pdcp_tailer_len); + /* - * Validate incoming sequence number, there might be a problem with PDCP initialization + * Allocate a new block for the new PDU (i.e. PDU header and SDU payload) */ - if (current_sn > pdcp_calculate_max_seq_num_for_given_size(pdcp->seq_num_size)) { - LOG_E(PDCP, "Generated sequence number (%lu) is greater than a sequence number could ever be!\n", current_sn); - LOG_E(PDCP, "There must be a problem with PDCP initialization, ignoring this PDU...\n"); - - free_mem_block(pdcp_pdu); - return FALSE; - } + LOG_D(PDCP, "Asking for a new mem_block of size %d\n", pdcp_pdu_size); + pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size); + + if (pdcp_pdu_p != NULL) { + /* + * Create a Data PDU with header and append data + * + * Place User Plane PDCP Data PDU header first + */ + + if ((rb_idP % NB_RB_MAX) < DTCH) { // this Control plane PDCP Data PDU + pdcp_control_plane_data_pdu_header pdu_header; + pdu_header.sn = pdcp_get_next_tx_seq_number(pdcp_p); + current_sn = pdu_header.sn; + memset(&pdu_header.mac_i[0],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE); + if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char*)pdcp_pdu_p->data, &pdu_header) == FALSE) { + LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n"); + return FALSE; + } + } else { + pdcp_user_plane_data_pdu_header_with_long_sn pdu_header; + pdu_header.dc = (modeP == 1) ? PDCP_DATA_PDU : PDCP_CONTROL_PDU; + pdu_header.sn = pdcp_get_next_tx_seq_number(pdcp_p); + current_sn = pdu_header.sn ; + if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char*)pdcp_pdu_p->data, &pdu_header) == FALSE) { + LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n"); + return FALSE; + } + } + /* + * Validate incoming sequence number, there might be a problem with PDCP initialization + */ + if (current_sn > pdcp_calculate_max_seq_num_for_given_size(pdcp_p->seq_num_size)) { + LOG_E(PDCP, "Generated sequence number (%lu) is greater than a sequence number could ever be!\n", current_sn); + LOG_E(PDCP, "There must be a problem with PDCP initialization, ignoring this PDU...\n"); + + free_mem_block(pdcp_pdu_p); + return FALSE; + } - LOG_D(PDCP, "Sequence number %d is assigned to current PDU\n", current_sn); + LOG_D(PDCP, "Sequence number %d is assigned to current PDU\n", current_sn); - /* Then append data... */ - memcpy(&pdcp_pdu->data[pdcp_header_len], sdu_buffer, sdu_buffer_size); + /* Then append data... */ + memcpy(&pdcp_pdu_p->data[pdcp_header_len], sdu_buffer_pP, sdu_buffer_sizeP); - //For control plane data that are not integrity protected, - // the MAC-I field is still present and should be padded with padding bits set to 0. - // NOTE: user-plane data are never integrity protected - for (i=0;idata[pdcp_header_len + sdu_buffer_size + i] = 0x00;// pdu_header.mac_i[i]; + //For control plane data that are not integrity protected, + // the MAC-I field is still present and should be padded with padding bits set to 0. + // NOTE: user-plane data are never integrity protected + for (i=0;idata[pdcp_header_len + sdu_buffer_sizeP + i] = 0x00;// pdu_header.mac_i[i]; #if defined(ENABLE_SECURITY) - if ((pdcp->security_activated != 0) && - ((pdcp->cipheringAlgorithm) != 0) && - ((pdcp->integrityProtAlgorithm) != 0)) { - pdcp_apply_security(pdcp, rb_id % NB_RB_MAX, - pdcp_header_len, current_sn, pdcp_pdu->data, - sdu_buffer_size); - } + if ((pdcp->security_activated != 0) && + ((pdcp->cipheringAlgorithm) != 0) && + ((pdcp->integrityProtAlgorithm) != 0)) { + pdcp_apply_security(pdcp, rb_id % NB_RB_MAX, + pdcp_header_len, current_sn, pdcp_pdu->data, + sdu_buffer_size); + } #endif - /* Print octets of outgoing data in hexadecimal form */ - LOG_D(PDCP, "Following content with size %d will be sent over RLC (PDCP PDU header is the first two bytes)\n", - pdcp_pdu_size); - util_print_hex_octets(PDCP, (unsigned char*)pdcp_pdu->data, pdcp_pdu_size); - //util_flush_hex_octets(PDCP, (unsigned char*)pdcp_pdu->data, pdcp_pdu_size); - } else { - LOG_E(PDCP, "Cannot create a mem_block for a PDU!\n"); - return FALSE; - } -#ifdef PDCP_UNIT_TEST - /* - * Here we add PDU to the list and return to test code without - * handing it off to RLC - */ - list_add_tail_eurecom(pdcp_pdu, test_list); - return TRUE; -#else - /* - * Ask sublayer to transmit data and check return value - * to see if RLC succeeded - */ - rlc_status = rlc_data_req(module_id, frame, eNB_flag, 0, rb_id_rlc, muiP, confirmP, pdcp_pdu_size, pdcp_pdu); + /* Print octets of outgoing data in hexadecimal form */ + LOG_D(PDCP, "Following content with size %d will be sent over RLC (PDCP PDU header is the first two bytes)\n", + pdcp_pdu_size); + //util_print_hex_octets(PDCP, (unsigned char*)pdcp_pdu_p->data, pdcp_pdu_size); + //util_flush_hex_octets(PDCP, (unsigned char*)pdcp_pdu->data, pdcp_pdu_size); + } else { + LOG_E(PDCP, "Cannot create a mem_block for a PDU!\n"); +#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) + AssertFatal(0, "[FRAME %5u][%s][PDCP][MOD %u/%u][RB %u] PDCP_DATA_REQ SDU DROPPED, OUT OF MEMORY \n", + frameP, + (enb_flagP) ? "eNB" : "UE", + enb_mod_idP, + ue_mod_idP, + rb_idP); +#endif + return FALSE; + } + /* + * Ask sublayer to transmit data and check return value + * to see if RLC succeeded + */ + rlc_status = rlc_data_req(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, 0, rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); } switch (rlc_status) { case RLC_OP_STATUS_OK: @@ -287,238 +288,241 @@ BOOL pdcp_data_req(u8 eNB_id, u8 UE_id, u32_t frame, u8_t eNB_flag, rb_id_t rb_i } }*/ return TRUE; -#endif // PDCP_UNIT_TEST } -//----------------------------------------------------------------------------- -#ifdef PDCP_UNIT_TEST -BOOL pdcp_data_ind(module_id_t module_id, u32_t frame, u8_t eNB_flag, rb_id_t rb_id, sdu_size_t sdu_buffer_size, \ - mem_block_t* sdu_buffer, pdcp_t* pdcp_test_entity, list_t* test_list) -#else -BOOL pdcp_data_ind(u8 eNB_id, u8 UE_id, u32_t frame, u8_t eNB_flag, u8_t MBMS_flagP, rb_id_t rb_id, sdu_size_t sdu_buffer_size, \ - mem_block_t* sdu_buffer, u8 is_data_plane) -#endif + +BOOL pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t frameP, eNB_flag_t enb_flagP, u8_t MBMS_flagP, rb_id_t rb_idP, sdu_size_t sdu_buffer_sizeP, \ + mem_block_t* sdu_buffer_pP, u8 is_data_planeP) { //----------------------------------------------------------------------------- -#ifdef PDCP_UNIT_TEST - pdcp_t* pdcp; - list_t* sdu_list; -#else - pdcp_t* pdcp; - list_t* sdu_list; -#endif - mem_block_t *new_sdu = NULL; - u8 pdcp_header_len=0, pdcp_tailer_len=0; - u16 sequence_number; - u8 payload_offset = 0; - module_id_t module_id; - -#ifdef PDCP_UNIT_TEST - pdcp = pdcp_test_entity; - sdu_list = test_list; - - LOG_I(PDCP, "Data indication notification for PDCP entity for module" - "ID %d and radio bearer ID %d rlc sdu size %d eNB_flag %d\n", - module_id, rb_id, sdu_buffer_size, eNB_flag); -#else - DevCheck4(UE_id < NUMBER_OF_UE_MAX, UE_id, NUMBER_OF_UE_MAX, eNB_id, rb_id); - DevCheck4(eNB_id < NUMBER_OF_eNB_MAX, eNB_id, NUMBER_OF_eNB_MAX, UE_id, rb_id); - DevCheck4(rb_id < NB_RB_MAX, rb_id, NB_RB_MAX, eNB_id, UE_id); - - if (eNB_flag == 0) { - pdcp = &pdcp_array_ue[UE_id][rb_id]; - module_id = NB_eNB_INST + UE_id; - - LOG_I(PDCP, "Data indication notification for PDCP entity from UE %u to eNB %u " + pdcp_t *pdcp_p = NULL; + list_t *sdu_list_p = NULL; + mem_block_t *new_sdu_p = NULL; + u8 pdcp_header_len = 0; + u8 pdcp_tailer_len = 0; + u16 sequence_number = 0; + u8 payload_offset = 0; + + AssertFatal (enb_mod_idP >= oai_emulation.info.first_enb_local, + "eNB inst is too low (%u/%d)!\n", + enb_mod_idP, + oai_emulation.info.first_enb_local); + AssertFatal (enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local), + "eNB inst is too high (%u/%d)!\n", + enb_mod_idP, + oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local); + AssertFatal (ue_mod_idP >= oai_emulation.info.first_ue_local, + "UE inst is too low (%u/%d)!\n", + ue_mod_idP, + oai_emulation.info.first_ue_local); + AssertFatal (ue_mod_idP < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local), + "UE inst is too high (%u/%d)!\n", + ue_mod_idP, + oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); + DevCheck4(rb_idP < NB_RB_MAX, rb_idP, NB_RB_MAX, enb_mod_idP, ue_mod_idP); + + if (enb_flagP == 0) { + pdcp_p = &pdcp_array_ue[ue_mod_idP][rb_idP]; + + LOG_I(PDCP, "Data indication notification for PDCP entity from eNB %u to UE %u " "and radio bearer ID %d rlc sdu size %d eNB_flag %d\n", - UE_id, eNB_id, rb_id, sdu_buffer_size, eNB_flag); + ue_mod_idP, enb_mod_idP, rb_idP, sdu_buffer_sizeP, enb_flagP); } else { - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rb_id]; - module_id = eNB_id; + pdcp_p = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP]; - LOG_I(PDCP, "Data indication notification for PDCP entity from eNB %u to UE %u " + LOG_I(PDCP, "Data indication notification for PDCP entity from UE %u to eNB %u " "and radio bearer ID %d rlc sdu size %d eNB_flag %d eNB_id %d\n", - eNB_id, UE_id, rb_id, sdu_buffer_size, eNB_flag, eNB_id); + enb_mod_idP, ue_mod_idP, rb_idP, sdu_buffer_sizeP, enb_flagP, enb_mod_idP); } - sdu_list = &pdcp_sdu_list; -#endif + sdu_list_p = &pdcp_sdu_list; +# - if (sdu_buffer_size == 0) { - LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n"); - return FALSE; + if (sdu_buffer_sizeP == 0) { + LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n"); + return FALSE; } /* - * Check if incoming SDU is long enough to carry a PDU header - */ + * Check if incoming SDU is long enough to carry a PDU header + */ if (MBMS_flagP == 0 ) { - if ((rb_id % NB_RB_MAX) < DTCH) { - pdcp_header_len = PDCP_CONTROL_PLANE_DATA_PDU_SN_SIZE; - pdcp_tailer_len = PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE; - } else { - pdcp_header_len = PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; - pdcp_tailer_len = 0; - } + if ((rb_idP % NB_RB_MAX) < DTCH) { + pdcp_header_len = PDCP_CONTROL_PLANE_DATA_PDU_SN_SIZE; + pdcp_tailer_len = PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE; + } else { + pdcp_header_len = PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; + pdcp_tailer_len = 0; + } - if (sdu_buffer_size < pdcp_header_len + pdcp_tailer_len ) { - LOG_W(PDCP, "Incoming (from RLC) SDU is short of size (size:%d)! Ignoring...\n", sdu_buffer_size); -#ifndef PDCP_UNIT_TEST - free_mem_block(sdu_buffer); -#endif - return FALSE; - } + if (sdu_buffer_sizeP < pdcp_header_len + pdcp_tailer_len ) { + LOG_W(PDCP, "Incoming (from RLC) SDU is short of size (size:%d)! Ignoring...\n", sdu_buffer_sizeP); + free_mem_block(sdu_buffer_pP); + return FALSE; + } - /* + /* * Parse the PDU placed at the beginning of SDU to check * if incoming SN is in line with RX window */ - if (pdcp_header_len == PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE) { // DRB - sequence_number = pdcp_get_sequence_number_of_pdu_with_long_sn((unsigned char*)sdu_buffer->data); -// u8 dc = pdcp_get_dc_filed((unsigned char*)sdu_buffer->data); - } else { //SRB1/2 - sequence_number = pdcp_get_sequence_number_of_pdu_with_SRB_sn((unsigned char*)sdu_buffer->data); - } - if (pdcp_is_rx_seq_number_valid(sequence_number, pdcp) == TRUE) { - LOG_D(PDCP, "Incoming PDU has a sequence number (%d) in accordance with RX window, yay!\n", sequence_number); - /* if (dc == PDCP_DATA_PDU ) + if (pdcp_header_len == PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE) { // DRB + sequence_number = pdcp_get_sequence_number_of_pdu_with_long_sn((unsigned char*)sdu_buffer_pP->data); + // u8 dc = pdcp_get_dc_filed((unsigned char*)sdu_buffer->data); + } else { //SRB1/2 + sequence_number = pdcp_get_sequence_number_of_pdu_with_SRB_sn((unsigned char*)sdu_buffer_pP->data); + } + if (pdcp_is_rx_seq_number_valid(sequence_number, pdcp_p) == TRUE) { + LOG_D(PDCP, "Incoming PDU has a sequence number (%d) in accordance with RX window\n", sequence_number); + /* if (dc == PDCP_DATA_PDU ) LOG_D(PDCP, "Passing piggybacked SDU to NAS driver...\n"); else LOG_D(PDCP, "Passing piggybacked SDU to RRC ...\n");*/ - } else { - LOG_W(PDCP, "Incoming PDU has an unexpected sequence number (%d), RX window snychronisation have probably been lost!\n", sequence_number); - /* - * XXX Till we implement in-sequence delivery and duplicate discarding - * mechanism all out-of-order packets will be delivered to RRC/IP - */ + } else { + LOG_W(PDCP, "Incoming PDU has an unexpected sequence number (%d), RX window snychronisation have probably been lost!\n", sequence_number); + /* + * XXX Till we implement in-sequence delivery and duplicate discarding + * mechanism all out-of-order packets will be delivered to RRC/IP + */ #if 0 - LOG_D(PDCP, "Ignoring PDU...\n"); - free_mem_block(sdu_buffer); - return FALSE; + LOG_D(PDCP, "Ignoring PDU...\n"); + free_mem_block(sdu_buffer); + return FALSE; #else - LOG_W(PDCP, "Delivering out-of-order SDU to upper layer...\n"); + LOG_W(PDCP, "Delivering out-of-order SDU to upper layer...\n"); #endif - } - // SRB1/2: control-plane data - if ( (rb_id % NB_RB_MAX) < DTCH ){ -#if defined(ENABLE_SECURITY) - if (pdcp->security_activated == 1) { - pdcp_validate_security(pdcp, rb_id, pdcp_header_len, - sequence_number, sdu_buffer->data, - sdu_buffer_size - pdcp_tailer_len); } + // SRB1/2: control-plane data + if ( (rb_idP % NB_RB_MAX) < DTCH ){ +#if defined(ENABLE_SECURITY) + if (pdcp->security_activated == 1) { + pdcp_validate_security(pdcp, rb_id, pdcp_header_len, + sequence_number, sdu_buffer->data, + sdu_buffer_size - pdcp_tailer_len); + } #endif - //rrc_lite_data_ind(module_id, //Modified MW - L2 Interface - pdcp_rrc_data_ind(eNB_id, - UE_id, - frame, - eNB_flag, - rb_id, - sdu_buffer_size - pdcp_header_len - pdcp_tailer_len, - (u8*)&sdu_buffer->data[pdcp_header_len]); - free_mem_block(sdu_buffer); - // free_mem_block(new_sdu); - return TRUE; - } - payload_offset=PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; +//rrc_lite_data_ind(module_id, //Modified MW - L2 Interface + pdcp_rrc_data_ind(enb_mod_idP, + ue_mod_idP, + frameP, + enb_flagP, + rb_idP, + sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len, + (u8*)&sdu_buffer_pP->data[pdcp_header_len]); + free_mem_block(sdu_buffer_pP); + // free_mem_block(new_sdu); + return TRUE; + } + payload_offset=PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; #if defined(ENABLE_SECURITY) - if (pdcp->security_activated == 1) { - pdcp_validate_security(pdcp, rb_id % NB_RB_MAX, pdcp_header_len, - sequence_number, sdu_buffer->data, - sdu_buffer_size - pdcp_tailer_len); - } + if (pdcp->security_activated == 1) { + pdcp_validate_security(pdcp_p, rb_idP % NB_RB_MAX, pdcp_header_len, + sequence_number, sdu_buffer->data, + sdu_buffer_size - pdcp_tailer_len); + } #endif } else { - payload_offset=0; + payload_offset=0; } #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.otg_enabled == 1) { - int src_id, dst_id, ctime; - - src_id = (eNB_flag != 0) ? UE_id + NB_eNB_INST : eNB_id; - dst_id = (eNB_flag == 0) ? UE_id + NB_eNB_INST : eNB_id; - ctime = oai_emulation.info.time_ms; // avg current simulation time in ms : we may get the exact time through OCG? - LOG_D(PDCP, "Check received buffer : enb_flag %d mod id %d, rab id %d (src %d, dst %d)\n", - eNB_flag, module_id, rb_id, src_id, dst_id); - - if (otg_rx_pkt(src_id, dst_id,ctime,&sdu_buffer->data[payload_offset], - sdu_buffer_size - payload_offset ) == 0 ) { - free_mem_block(sdu_buffer); - return TRUE; - } + module_id_t src_id, dst_id; + int ctime; + + src_id = (enb_flagP != 0) ? ue_mod_idP : enb_mod_idP; + dst_id = (enb_flagP == 0) ? ue_mod_idP : enb_mod_idP; + ctime = oai_emulation.info.time_ms; // avg current simulation time in ms : we may get the exact time through OCG? + LOG_D(PDCP, "Check received buffer : enb_flag %d rab id %d (src %d, dst %d)\n", + enb_flagP, rb_idP, src_id, dst_id); + + if (otg_rx_pkt(src_id, dst_id,ctime,&sdu_buffer_pP->data[payload_offset], + sdu_buffer_sizeP - payload_offset ) == 0 ) { + free_mem_block(sdu_buffer_pP); + return TRUE; + } } #else if (otg_enabled==1) { - LOG_D(OTG,"Discarding received packed\n"); - free_mem_block(sdu_buffer); - return TRUE; + LOG_D(OTG,"Discarding received packed\n"); + free_mem_block(sdu_buffer_pP); + return TRUE; } #endif - new_sdu = get_free_mem_block(sdu_buffer_size - payload_offset + sizeof (pdcp_data_ind_header_t)); + new_sdu_p = get_free_mem_block(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t)); - if (new_sdu) { - /* + if (new_sdu_p) { + /* * Prepend PDCP indication header which is going to be removed at pdcp_fifo_flush_sdus() */ - memset(new_sdu->data, 0, sizeof (pdcp_data_ind_header_t)); - if (eNB_flag == 0) { - ((pdcp_data_ind_header_t *) new_sdu->data)->rb_id = rb_id; - } else { - /* RB id for an UE on eNB is instantiated */ - ((pdcp_data_ind_header_t *) new_sdu->data)->rb_id = rb_id + (UE_id * NB_RB_MAX); - } - ((pdcp_data_ind_header_t *) new_sdu->data)->data_size = sdu_buffer_size - payload_offset; - - // Here there is no virtualization possible -#ifdef IDROMEL_NEMO - if (eNB_flag == 0) - ((pdcp_data_ind_header_t *) new_sdu->data)->inst = rb_id / NB_RB_MAX; - else - ((pdcp_data_ind_header_t *) new_sdu->data)->inst = 0; -#else - ((pdcp_data_ind_header_t *) new_sdu->data)->inst = module_id; + memset(new_sdu_p->data, 0, sizeof (pdcp_data_ind_header_t)); + ((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size = sdu_buffer_sizeP - payload_offset; + + // Here there is no virtualization possible + // set ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst for IP layer here + if (enb_flagP == 0) { + ((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_idP; +#if defined(OAI_EMU) + ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ue_mod_idP + oai_emulation.info.nb_enb_local - oai_emulation.info.first_ue_local; +#endif + } else { + ((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_idP + (ue_mod_idP * NB_RB_MAX); +#if defined(OAI_EMU) + ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = enb_mod_idP - oai_emulation.info.first_enb_local; #endif - - // XXX Decompression would be done at this point + } + - /* + // XXX Decompression would be done at this point + + /* * After checking incoming sequence number PDCP header * has to be stripped off so here we copy SDU buffer starting * from its second byte (skipping 0th and 1st octets, i.e. * PDCP header) */ - memcpy(&new_sdu->data[sizeof (pdcp_data_ind_header_t)], \ - &sdu_buffer->data[payload_offset], \ - sdu_buffer_size - payload_offset); - list_add_tail_eurecom (new_sdu, sdu_list); - - /* Print octets of incoming data in hexadecimal form */ - LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n", sdu_buffer_size - payload_offset + sizeof(pdcp_data_ind_header_t), - sdu_buffer_size - payload_offset); - //util_print_hex_octets(PDCP, (unsigned char*)new_sdu->data, sdu_buffer_size - PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE + sizeof(pdcp_data_ind_header_t)); - util_flush_hex_octets(PDCP, (unsigned char*)new_sdu->data, sdu_buffer_size - payload_offset + sizeof(pdcp_data_ind_header_t)); - - /* + memcpy(&new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], \ + &sdu_buffer_pP->data[payload_offset], \ + sdu_buffer_sizeP - payload_offset); + list_add_tail_eurecom (new_sdu_p, sdu_list_p); + + /* Print octets of incoming data in hexadecimal form */ + LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n", + sdu_buffer_sizeP - payload_offset + sizeof(pdcp_data_ind_header_t), + sdu_buffer_sizeP - payload_offset); + //util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset); + //util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset); + + /* * Update PDCP statistics * XXX Following two actions are identical, is there a merge error? */ - if (eNB_flag == 1) { - Pdcp_stats_rx[module_id][(rb_id & RAB_OFFSET2) >> RAB_SHIFT2][(rb_id & RAB_OFFSET) - DTCH]++; - Pdcp_stats_rx_bytes[module_id][(rb_id & RAB_OFFSET2) >> RAB_SHIFT2][(rb_id & RAB_OFFSET) - DTCH] += sdu_buffer_size; + + /*if (enb_flagP == 1) { + Pdcp_stats_rx[module_id][(rb_idP & RAB_OFFSET2) >> RAB_SHIFT2][(rb_idP & RAB_OFFSET) - DTCH]++; + Pdcp_stats_rx_bytes[module_id][(rb_idP & RAB_OFFSET2) >> RAB_SHIFT2][(rb_idP & RAB_OFFSET) - DTCH] += sdu_buffer_sizeP; } else { - Pdcp_stats_rx[module_id][(rb_id & RAB_OFFSET2) >> RAB_SHIFT2][(rb_id & RAB_OFFSET) - DTCH]++; - Pdcp_stats_rx_bytes[module_id][(rb_id & RAB_OFFSET2) >> RAB_SHIFT2][(rb_id & RAB_OFFSET) - DTCH] += sdu_buffer_size; - } + Pdcp_stats_rx[module_id][(rb_idP & RAB_OFFSET2) >> RAB_SHIFT2][(rb_idP & RAB_OFFSET) - DTCH]++; + Pdcp_stats_rx_bytes[module_id][(rb_idP & RAB_OFFSET2) >> RAB_SHIFT2][(rb_idP & RAB_OFFSET) - DTCH] += sdu_buffer_sizeP; + }*/ + } +#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) + else { + AssertFatal(0, "[FRAME %5u][%s][PDCP][MOD %u/%u][RB %u] PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY \n", + frameP, + (enb_flagP) ? "eNB" : "UE", + enb_mod_idP, + ue_mod_idP, + rb_idP); } +#endif - free_mem_block(sdu_buffer); + free_mem_block(sdu_buffer_pP); return TRUE; } //----------------------------------------------------------------------------- -void pdcp_run (u32_t frame, u8 eNB_flag, u8 UE_index, u8 eNB_index) { +void pdcp_run (frame_t frameP, eNB_flag_t eNB_flag, module_id_t ue_mod_idP, module_id_t enb_mod_idP) { //----------------------------------------------------------------------------- #if defined(ENABLE_ITTI) MessageDef *msg_p; @@ -531,48 +535,48 @@ void pdcp_run (u32_t frame, u8 eNB_flag, u8 UE_index, u8 eNB_index) { #if defined(ENABLE_ITTI) do { - // Checks if a message has been sent to PDCP sub-task - itti_poll_msg (eNB_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, &msg_p); + // Checks if a message has been sent to PDCP sub-task + itti_poll_msg (eNB_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, &msg_p); - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); + if (msg_p != NULL) { + msg_name = ITTI_MSG_NAME (msg_p); + instance = ITTI_MSG_INSTANCE (msg_p); - switch (ITTI_MSG_ID(msg_p)) { - case RRC_DCCH_DATA_REQ: - LOG_I(PDCP, "Received %s from %s: instance %d, frame %d, eNB_flag %d, rb_id %d, muiP %d, confirmP %d, mode %d\n", + switch (ITTI_MSG_ID(msg_p)) { + case RRC_DCCH_DATA_REQ: + LOG_I(PDCP, "Received %s from %s: instance %d, frame %d, eNB_flag %d, rb_id %d, muiP %d, confirmP %d, mode %d\n", msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, RRC_DCCH_DATA_REQ (msg_p).frame, RRC_DCCH_DATA_REQ (msg_p).enb_flag, RRC_DCCH_DATA_REQ (msg_p).rb_id, RRC_DCCH_DATA_REQ (msg_p).muip, RRC_DCCH_DATA_REQ (msg_p).confirmp, RRC_DCCH_DATA_REQ (msg_p).mode); - result = pdcp_data_req (RRC_DCCH_DATA_REQ (msg_p).eNB_index, RRC_DCCH_DATA_REQ (msg_p).ue_index, RRC_DCCH_DATA_REQ (msg_p).frame, RRC_DCCH_DATA_REQ (msg_p).enb_flag, - RRC_DCCH_DATA_REQ (msg_p).rb_id, RRC_DCCH_DATA_REQ (msg_p).muip, - RRC_DCCH_DATA_REQ (msg_p).confirmp, RRC_DCCH_DATA_REQ (msg_p).sdu_size, - RRC_DCCH_DATA_REQ (msg_p).sdu_p, RRC_DCCH_DATA_REQ (msg_p).mode); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); + result = pdcp_data_req (RRC_DCCH_DATA_REQ (msg_p).eNB_index, RRC_DCCH_DATA_REQ (msg_p).ue_index, RRC_DCCH_DATA_REQ (msg_p).frame, RRC_DCCH_DATA_REQ (msg_p).enb_flag, + RRC_DCCH_DATA_REQ (msg_p).rb_id, RRC_DCCH_DATA_REQ (msg_p).muip, + RRC_DCCH_DATA_REQ (msg_p).confirmp, RRC_DCCH_DATA_REQ (msg_p).sdu_size, + RRC_DCCH_DATA_REQ (msg_p).sdu_p, RRC_DCCH_DATA_REQ (msg_p).mode); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); - // Message buffer has been processed, free it now. - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_REQ (msg_p).sdu_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - break; + // Message buffer has been processed, free it now. + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_REQ (msg_p).sdu_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + break; - default: - LOG_E(PDCP, "Received unexpected message %s\n", msg_name); - break; - } + default: + LOG_E(PDCP, "Received unexpected message %s\n", msg_name); + break; + } - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - } + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + } } while(msg_p != NULL); # if 0 { - MessageDef *msg_resp_p; + MessageDef *msg_resp_p; - msg_resp_p = itti_alloc_new_message(TASK_PDCP_ENB, MESSAGE_TEST); + msg_resp_p = itti_alloc_new_message(TASK_PDCP_ENB, MESSAGE_TEST); - itti_send_msg_to_task(TASK_RRC_ENB, 1, msg_resp_p); + itti_send_msg_to_task(TASK_RRC_ENB, 1, msg_resp_p); } { MessageDef *msg_resp_p; @@ -591,29 +595,32 @@ void pdcp_run (u32_t frame, u8 eNB_flag, u8 UE_index, u8 eNB_index) { # endif #endif - pdcp_fifo_read_input_sdus_from_otg(frame, eNB_flag, UE_index, eNB_index); + pdcp_fifo_read_input_sdus_from_otg(frameP, eNB_flag, ue_mod_idP, enb_mod_idP); // IP/NAS -> PDCP traffic : TX, read the pkt from the upper layer buffer - pdcp_fifo_read_input_sdus(frame, eNB_flag, UE_index, eNB_index); + pdcp_fifo_read_input_sdus(frameP, eNB_flag, ue_mod_idP, enb_mod_idP); // PDCP -> NAS/IP traffic: RX - pdcp_fifo_flush_sdus(frame, eNB_flag, eNB_index, UE_index); + pdcp_fifo_flush_sdus(frameP, eNB_flag, enb_mod_idP, ue_mod_idP); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT); } -BOOL rrc_pdcp_config_asn1_req (u8 eNB_id, u8 UE_id, u32_t frame, u8_t eNB_flag, - SRB_ToAddModList_t* srb2add_list, - DRB_ToAddModList_t* drb2add_list, - DRB_ToReleaseList_t* drb2release_list, - u8 security_mode, - u8 *kRRCenc, - u8 *kRRCint, - u8 *kUPenc +BOOL rrc_pdcp_config_asn1_req (module_id_t enb_mod_idP, + module_id_t ue_mod_idP, + frame_t frameP, + eNB_flag_t enb_flagP, + SRB_ToAddModList_t *srb2add_list_pP, + DRB_ToAddModList_t *drb2add_list_pP, + DRB_ToReleaseList_t *drb2release_list_pP, + u8 security_modeP, + u8 *kRRCenc_pP, + u8 *kRRCint_pP, + u8 *kUPenc_pP #ifdef Rel10 - ,PMCH_InfoList_r9_t* pmch_InfoList_r9 +,PMCH_InfoList_r9_t* pmch_InfoList_r9_pP #endif - ) +) { long int rb_id = 0; long int lc_id = 0; @@ -621,261 +628,259 @@ BOOL rrc_pdcp_config_asn1_req (u8 eNB_id, u8 UE_id, u32_t frame, u8_t eNB_flag, long int mch_id = 0; rlc_mode_t rlc_type = RLC_NONE; DRB_Identity_t drb_id = 0; - DRB_Identity_t* pdrb_id = NULL; + DRB_Identity_t *pdrb_id_p = NULL; u8 drb_sn = 0; u8 srb_sn = 5; // fixed sn for SRBs u8 drb_report = 0; long int cnt = 0; u16 header_compression_profile = 0; u32 action = ACTION_ADD; - SRB_ToAddMod_t* srb_toaddmod = NULL; - DRB_ToAddMod_t* drb_toaddmod = NULL; - pdcp_t *pdcp; - module_id_t module_id; + SRB_ToAddMod_t *srb_toaddmod_p = NULL; + DRB_ToAddMod_t *drb_toaddmod_p = NULL; + pdcp_t *pdcp_p = NULL; + module_id_t module_id = -1; #ifdef Rel10 int i,j; - MBMS_SessionInfoList_r9_t *mbms_SessionInfoList_r9; - MBMS_SessionInfo_r9_t *MBMS_SessionInfo= NULL; + MBMS_SessionInfoList_r9_t *mbms_SessionInfoList_r9_p = NULL; + MBMS_SessionInfo_r9_t *MBMS_SessionInfo_p = NULL; #endif - if (eNB_flag == 0) { - module_id = NB_eNB_INST + UE_id; - LOG_D(PDCP, "[UE %d] CONFIG REQ ASN1 for eNB %d (Mod_id %u)\n", UE_id, eNB_id, module_id); + if (enb_flagP == 0) { + LOG_D(PDCP, "[UE %d] CONFIG REQ ASN1 for eNB %d\n", ue_mod_idP, enb_mod_idP); } else { - module_id = eNB_id; - LOG_D(PDCP, "[eNB %d] CONFIG REQ ASN1 for UE %d (Mod_id %u)\n", eNB_id, UE_id, module_id); + LOG_D(PDCP, "[eNB %d] CONFIG REQ ASN1 for UE %d\n", enb_mod_idP, ue_mod_idP); } // srb2add_list does not define pdcp config, we use rlc info to setup the pdcp dcch0 and dcch1 channels - if (srb2add_list != NULL) { - for (cnt=0;cntlist.count;cnt++) { - srb_id = srb2add_list->list.array[cnt]->srb_Identity; - srb_toaddmod = srb2add_list->list.array[cnt]; - rlc_type = RLC_MODE_AM; - rb_id = srb_id; - lc_id = srb_id; - - if (eNB_flag == 0) { - pdcp = &pdcp_array_ue[UE_id][srb_id]; - } else { - pdcp = &pdcp_array_eNB[eNB_id][UE_id][srb_id]; - } + if (srb2add_list_pP != NULL) { + for (cnt=0;cntlist.count;cnt++) { + srb_id = srb2add_list_pP->list.array[cnt]->srb_Identity; + srb_toaddmod_p = srb2add_list_pP->list.array[cnt]; + rlc_type = RLC_MODE_AM; + rb_id = srb_id; + lc_id = srb_id; + + if (enb_flagP == 0) { + pdcp_p = &pdcp_array_ue[ue_mod_idP][srb_id]; + } else { + pdcp_p = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][srb_id]; + } - if (pdcp->instanciated_instance == 1) { - action = ACTION_MODIFY; - } else { - action = ACTION_ADD; - } + if (pdcp_p->instanciated_instance == 1) { + action = ACTION_MODIFY; + } else { + action = ACTION_ADD; + } - if (srb_toaddmod->rlc_Config) { - switch (srb_toaddmod->rlc_Config->present) { - case SRB_ToAddMod__rlc_Config_PR_NOTHING: - break; - case SRB_ToAddMod__rlc_Config_PR_explicitValue: - switch (srb_toaddmod->rlc_Config->choice.explicitValue.present) { - case RLC_Config_PR_NOTHING: - break; - default: - pdcp_config_req_asn1 (pdcp, - eNB_id, - UE_id, - frame, - eNB_flag, // not really required - rlc_type, - action, - lc_id, - mch_id, - rb_id, - srb_sn, - 0, // drb_report - 0, // header compression - security_mode, - kRRCenc, - kRRCint, - kUPenc); - break; - } - break; - case SRB_ToAddMod__rlc_Config_PR_defaultValue: - // already the default values - break; - default: - DevParam(srb_toaddmod->rlc_Config->present, UE_id, eNB_id); - break; - } + if (srb_toaddmod_p->rlc_Config) { + switch (srb_toaddmod_p->rlc_Config->present) { + case SRB_ToAddMod__rlc_Config_PR_NOTHING: + break; + case SRB_ToAddMod__rlc_Config_PR_explicitValue: + switch (srb_toaddmod_p->rlc_Config->choice.explicitValue.present) { + case RLC_Config_PR_NOTHING: + break; + default: + pdcp_config_req_asn1 (pdcp_p, + enb_mod_idP, + ue_mod_idP, + frameP, + enb_flagP, // not really required + rlc_type, + action, + lc_id, + mch_id, + rb_id, + srb_sn, + 0, // drb_report + 0, // header compression + security_modeP, + kRRCenc_pP, + kRRCint_pP, + kUPenc_pP); + break; + } + break; + case SRB_ToAddMod__rlc_Config_PR_defaultValue: + // already the default values + break; + default: + DevParam(srb_toaddmod_p->rlc_Config->present, ue_mod_idP, enb_mod_idP); + break; + } + } } - } } // reset the action - if (drb2add_list != NULL) { - for (cnt=0;cntlist.count;cnt++) { + if (drb2add_list_pP != NULL) { + for (cnt=0;cntlist.count;cnt++) { - drb_toaddmod = drb2add_list->list.array[cnt]; + drb_toaddmod_p = drb2add_list_pP->list.array[cnt]; - drb_id = drb_toaddmod->drb_Identity; + drb_id = drb_toaddmod_p->drb_Identity; - if (drb_toaddmod->logicalChannelIdentity != null) { - lc_id = *drb_toaddmod->logicalChannelIdentity; - } else { - lc_id = -1; - } - rb_id = lc_id; + if (drb_toaddmod_p->logicalChannelIdentity != null) { + lc_id = *drb_toaddmod_p->logicalChannelIdentity; + } else { + lc_id = -1; + } + rb_id = lc_id; - DevCheck4(rb_id < NB_RB_MAX, rb_id, NB_RB_MAX, UE_id, eNB_id); + DevCheck4(rb_id < NB_RB_MAX, rb_id, NB_RB_MAX, ue_mod_idP, enb_mod_idP); - if (eNB_flag == 0) { - pdcp = &pdcp_array_ue[UE_id][rb_id]; - } else { - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rb_id]; - } + if (enb_flagP == 0) { + pdcp_p = &pdcp_array_ue[ue_mod_idP][rb_id]; + } else { + pdcp_p = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rb_id]; + } - if (pdcp->instanciated_instance == 1) - action = ACTION_MODIFY; - else - action = ACTION_ADD; - - if (drb_toaddmod->pdcp_Config){ - if (drb_toaddmod->pdcp_Config->discardTimer) { - // set the value of the timer - } - if (drb_toaddmod->pdcp_Config->rlc_AM) { - drb_report = drb_toaddmod->pdcp_Config->rlc_AM->statusReportRequired; - rlc_type =RLC_MODE_AM; - } - if (drb_toaddmod->pdcp_Config->rlc_UM){ - drb_sn = drb_toaddmod->pdcp_Config->rlc_UM->pdcp_SN_Size; - rlc_type =RLC_MODE_UM; - } - switch (drb_toaddmod->pdcp_Config->headerCompression.present) { - case PDCP_Config__headerCompression_PR_NOTHING: - case PDCP_Config__headerCompression_PR_notUsed: - header_compression_profile=0x0; - break; - case PDCP_Config__headerCompression_PR_rohc: - // parse the struc and get the rohc profile - if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0001) - header_compression_profile=0x0001; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0002) - header_compression_profile=0x0002; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0003) - header_compression_profile=0x0003; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0004) - header_compression_profile=0x0004; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0006) - header_compression_profile=0x0006; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0101) - header_compression_profile=0x0101; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0102) - header_compression_profile=0x0102; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0103) - header_compression_profile=0x0103; - else if(drb_toaddmod->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0104) - header_compression_profile=0x0104; - else { - header_compression_profile=0x0; - LOG_W(PDCP,"unknown header compresion profile\n"); + if (pdcp_p->instanciated_instance == 1) + action = ACTION_MODIFY; + else + action = ACTION_ADD; + + if (drb_toaddmod_p->pdcp_Config){ + if (drb_toaddmod_p->pdcp_Config->discardTimer) { + // set the value of the timer + } + if (drb_toaddmod_p->pdcp_Config->rlc_AM) { + drb_report = drb_toaddmod_p->pdcp_Config->rlc_AM->statusReportRequired; + rlc_type =RLC_MODE_AM; + } + if (drb_toaddmod_p->pdcp_Config->rlc_UM){ + drb_sn = drb_toaddmod_p->pdcp_Config->rlc_UM->pdcp_SN_Size; + rlc_type =RLC_MODE_UM; + } + switch (drb_toaddmod_p->pdcp_Config->headerCompression.present) { + case PDCP_Config__headerCompression_PR_NOTHING: + case PDCP_Config__headerCompression_PR_notUsed: + header_compression_profile=0x0; + break; + case PDCP_Config__headerCompression_PR_rohc: + // parse the struc and get the rohc profile + if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0001) + header_compression_profile=0x0001; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0002) + header_compression_profile=0x0002; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0003) + header_compression_profile=0x0003; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0004) + header_compression_profile=0x0004; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0006) + header_compression_profile=0x0006; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0101) + header_compression_profile=0x0101; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0102) + header_compression_profile=0x0102; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0103) + header_compression_profile=0x0103; + else if(drb_toaddmod_p->pdcp_Config->headerCompression.choice.rohc.profiles.profile0x0104) + header_compression_profile=0x0104; + else { + header_compression_profile=0x0; + LOG_W(PDCP,"unknown header compresion profile\n"); + } + // set the applicable profile + break; + default: + LOG_W(PDCP,"[MOD_id %d][RB %d] unknown drb_toaddmod->PDCP_Config->headerCompression->present \n", + module_id, drb_id); + break; + } + pdcp_config_req_asn1 (pdcp_p, + enb_mod_idP, + ue_mod_idP, + frameP, + enb_flagP, // not really required + rlc_type, + action, + lc_id, + mch_id, + rb_id, + drb_sn, + drb_report, + header_compression_profile, + security_modeP, + kRRCenc_pP, + kRRCint_pP, + kUPenc_pP); } - // set the applicable profile - break; - default: - LOG_W(PDCP,"[MOD_id %d][RB %d] unknown drb_toaddmod->PDCP_Config->headerCompression->present \n", - module_id, drb_id); - break; - } - pdcp_config_req_asn1 (pdcp, - eNB_id, - UE_id, - frame, - eNB_flag, // not really required - rlc_type, - action, - lc_id, - mch_id, - rb_id, - drb_sn, - drb_report, - header_compression_profile, - security_mode, - kRRCenc, - kRRCint, - kUPenc); } - } } - if (drb2release_list != NULL) { - for (cnt=0;cntlist.count;cnt++) { - pdrb_id = drb2release_list->list.array[cnt]; - rb_id = *pdrb_id; - if (eNB_flag == 0) { - pdcp = &pdcp_array_ue[UE_id][rb_id]; - } else { - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rb_id]; + if (drb2release_list_pP != NULL) { + for (cnt=0;cntlist.count;cnt++) { + pdrb_id_p = drb2release_list_pP->list.array[cnt]; + rb_id = *pdrb_id_p; + if (enb_flagP == 0) { + pdcp_p = &pdcp_array_ue[ue_mod_idP][rb_id]; + } else { + pdcp_p = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rb_id]; + } + action = ACTION_REMOVE; + pdcp_config_req_asn1 (pdcp_p, + enb_mod_idP, + ue_mod_idP, + frameP, + enb_flagP, // not really required + rlc_type, + action, + lc_id, + mch_id, + rb_id, + 0, + 0, + 0, + security_modeP, + kRRCenc_pP, + kRRCint_pP, + kUPenc_pP); } - action = ACTION_REMOVE; - pdcp_config_req_asn1 (pdcp, - eNB_id, - UE_id, - frame, - eNB_flag, // not really required - rlc_type, - action, - lc_id, - mch_id, - rb_id, - 0, - 0, - 0, - security_mode, - kRRCenc, - kRRCint, - kUPenc); - } } #ifdef Rel10 if (pmch_InfoList_r9 != NULL) { - for (i=0;ilist.count;i++) { - mbms_SessionInfoList_r9 = &(pmch_InfoList_r9->list.array[i]->mbms_SessionInfoList_r9); - for (j=0;jlist.count;j++) { - MBMS_SessionInfo = mbms_SessionInfoList_r9->list.array[j]; - //lc_id = MBMS_SessionInfo->logicalChannelIdentity_r9; // lcid - lc_id = MBMS_SessionInfo->sessionId_r9->buf[0]; - mch_id = MBMS_SessionInfo->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string - - // can set the mch_id = i - if (eNB_flag) - rb_id = (mch_id * maxSessionPerPMCH ) + lc_id; - else - rb_id = (mch_id * maxSessionPerPMCH ) + lc_id + (maxDRB + 3); - - if (pdcp_mbms_array[module_id][rb_id].instanciated_instance == module_id + 1) - action = ACTION_MBMS_MODIFY; - else - action = ACTION_MBMS_ADD; - - rlc_type = RLC_MODE_UM; - pdcp_config_req_asn1 (NULL, - eNB_id, - UE_id, - frame, - eNB_flag, - rlc_type, - action, - lc_id, - mch_id, - rb_id, - 0, // set to deafult - 0, - 0, - security_mode, - kRRCenc, - kRRCint, - kUPenc); + for (i=0;ilist.count;i++) { + mbms_SessionInfoList_r9 = &(pmch_InfoList_r9->list.array[i]->mbms_SessionInfoList_r9); + for (j=0;jlist.count;j++) { + MBMS_SessionInfo = mbms_SessionInfoList_r9->list.array[j]; + //lc_id = MBMS_SessionInfo->logicalChannelIdentity_r9; // lcid + lc_id = MBMS_SessionInfo->sessionId_r9->buf[0]; + mch_id = MBMS_SessionInfo->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string + + // can set the mch_id = i + if (eNB_flag) + rb_id = (mch_id * maxSessionPerPMCH ) + lc_id; + else + rb_id = (mch_id * maxSessionPerPMCH ) + lc_id + (maxDRB + 3); + + if (pdcp_mbms_array[module_id][rb_id].instanciated_instance == module_id + 1) + action = ACTION_MBMS_MODIFY; + else + action = ACTION_MBMS_ADD; + + rlc_type = RLC_MODE_UM; + pdcp_config_req_asn1 (NULL, + enb_mod_idP, + ue_mod_idP, + frameP, + eNB_flag, + rlc_type, + action, + lc_id, + mch_id, + rb_id, + 0, // set to deafult + 0, + 0, + security_mode, + kRRCenc, + kRRCint, + kUPenc); + } } - } } #endif @@ -883,258 +888,275 @@ BOOL rrc_pdcp_config_asn1_req (u8 eNB_id, u8 UE_id, u32_t frame, u8_t eNB_flag, } -BOOL pdcp_config_req_asn1 (pdcp_t *pdcp, u8 eNB_id, u8 UE_id, u32 frame, u8_t eNB_flag, - rlc_mode_t rlc_mode, u32 action, u16 lc_id,u16 mch_id, rb_id_t rb_id, - u8 rb_sn, u8 rb_report, u16 header_compression_profile, - u8 security_mode, - u8 *kRRCenc, - u8 *kRRCint, - u8 *kUPenc) +BOOL pdcp_config_req_asn1 (pdcp_t *pdcp_pP, + module_id_t enb_mod_idP, + module_id_t ue_mod_idP, + frame_t frameP, + eNB_flag_t enb_flagP, + rlc_mode_t rlc_modeP, + u32 actionP, + u16 lc_idP, + u16 mch_idP, + rb_id_t rb_idP, + u8 rb_snP, + u8 rb_reportP, + u16 header_compression_profileP, + u8 security_modeP, + u8 *kRRCenc_pP, + u8 *kRRCint_pP, + u8 *kUPenc_pP) { - module_id_t module_id = 0; - - switch (action) { - case ACTION_ADD: - DevAssert(pdcp != NULL); - pdcp->instanciated_instance = 1; - pdcp->is_ue = (eNB_flag == 0) ? 1 : 0; - pdcp->lcid = lc_id; - pdcp->header_compression_profile = header_compression_profile; - pdcp->status_report = rb_report; - - if (rb_sn == PDCP_Config__rlc_UM__pdcp_SN_Size_len7bits) { - pdcp->seq_num_size = 7; - } else if (rb_sn == PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits) { - pdcp->seq_num_size=12; - } else { - pdcp->seq_num_size=5; - } - pdcp->rlc_mode = rlc_mode; - pdcp->next_pdcp_tx_sn = 0; - pdcp->next_pdcp_rx_sn = 0; - pdcp->tx_hfn = 0; - pdcp->rx_hfn = 0; - pdcp->last_submitted_pdcp_rx_sn = 4095; - pdcp->first_missing_pdu = -1; + switch (actionP) { + case ACTION_ADD: + DevAssert(pdcp_pP != NULL); + pdcp_pP->instanciated_instance = 1; + pdcp_pP->is_ue = (enb_flagP == 0) ? 1 : 0; + pdcp_pP->lcid = lc_idP; + pdcp_pP->header_compression_profile = header_compression_profileP; + pdcp_pP->status_report = rb_reportP; + + if (rb_snP == PDCP_Config__rlc_UM__pdcp_SN_Size_len7bits) { + pdcp_pP->seq_num_size = 7; + } else if (rb_snP == PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits) { + pdcp_pP->seq_num_size=12; + } else { + pdcp_pP->seq_num_size=5; + } - if (eNB_flag == 0) { + pdcp_pP->rlc_mode = rlc_modeP; + pdcp_pP->next_pdcp_tx_sn = 0; + pdcp_pP->next_pdcp_rx_sn = 0; + pdcp_pP->tx_hfn = 0; + pdcp_pP->rx_hfn = 0; + pdcp_pP->last_submitted_pdcp_rx_sn = 4095; + pdcp_pP->first_missing_pdu = -1; + + if (enb_flagP == 0) { LOG_I(PDCP, "[UE %d] Config request : Action ADD for eNB %d: Frame %d LCID %d (rb id %d) " - "configured with SN size %d bits and RLC %s\n", - UE_id, eNB_id, frame, lc_id, rb_id, pdcp->seq_num_size, - (rlc_mode == 1) ? "AM" : (rlc_mode == 2) ? "TM" : "UM"); - } else { + "configured with SN size %d bits and RLC %s\n", + ue_mod_idP, enb_mod_idP, frameP, lc_idP, rb_idP, pdcp_pP->seq_num_size, + (rlc_modeP == 1) ? "AM" : (rlc_modeP == 2) ? "TM" : "UM"); + } else { LOG_I(PDCP, "[eNB %d] Config request : Action ADD for UE %d: Frame %d LCID %d (rb id %d) " - "configured with SN size %d bits and RLC %s\n", - eNB_id, UE_id, frame, lc_id, rb_id, pdcp->seq_num_size, - (rlc_mode == 1) ? "AM" : (rlc_mode == 2) ? "TM" : "UM"); - } + "configured with SN size %d bits and RLC %s\n", + enb_mod_idP, ue_mod_idP, frameP, lc_idP, rb_idP, pdcp_pP->seq_num_size, + (rlc_modeP == 1) ? "AM" : (rlc_modeP == 2) ? "TM" : "UM"); + } - /* Setup security */ - if (security_mode != 0xff) { - pdcp_config_set_security(pdcp, eNB_id, UE_id, frame, eNB_flag, rb_id, lc_id, security_mode, kRRCenc, kRRCint, kUPenc); - } + /* Setup security */ + if (security_modeP != 0xff) { + pdcp_config_set_security(pdcp_pP, enb_mod_idP, ue_mod_idP, frameP, enb_flagP, rb_idP, lc_idP, security_modeP, kRRCenc_pP, kRRCint_pP, kUPenc_pP); + } - LOG_D(PDCP, "[MSC_NEW][FRAME %05d][PDCP][MOD %02d][RB %02d]\n", frame, (eNB_flag == 0) ? NB_eNB_INST + UE_id : eNB_id, rb_id); - break; + LOG_D(PDCP, "[FRAME %5u][%s][PDCP][MOD %u/%u][RB %u]\n", frameP, (enb_flagP == 0) ? "UE" : "eNB", enb_mod_idP, ue_mod_idP, rb_idP); + break; - case ACTION_MODIFY: - DevAssert(pdcp != NULL); - pdcp->header_compression_profile=header_compression_profile; - pdcp->status_report = rb_report; - pdcp->rlc_mode = rlc_mode; + case ACTION_MODIFY: + DevAssert(pdcp_pP != NULL); + pdcp_pP->header_compression_profile=header_compression_profileP; + pdcp_pP->status_report = rb_reportP; + pdcp_pP->rlc_mode = rlc_modeP; - /* Setup security */ - if (security_mode != 0xff) { - pdcp_config_set_security(pdcp, eNB_id, UE_id, frame, eNB_flag, rb_id, lc_id, security_mode, kRRCenc, kRRCint, kUPenc); - } + /* Setup security */ + if (security_modeP != 0xff) { + pdcp_config_set_security(pdcp_pP, enb_mod_idP, ue_mod_idP, frameP, enb_flagP, rb_idP, lc_idP, security_modeP, kRRCenc_pP, kRRCint_pP, kUPenc_pP); + } - if (rb_sn == PDCP_Config__rlc_UM__pdcp_SN_Size_len7bits) { - pdcp->seq_num_size = 7; - } else if (rb_sn == PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits) { - pdcp->seq_num_size = 12; - } else { - pdcp->seq_num_size=5; - } + if (rb_snP == PDCP_Config__rlc_UM__pdcp_SN_Size_len7bits) { + pdcp_pP->seq_num_size = 7; + } else if (rb_snP == PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits) { + pdcp_pP->seq_num_size = 12; + } else { + pdcp_pP->seq_num_size=5; + } - if (eNB_flag == 0) { + if (enb_flagP == 0) { LOG_I(PDCP,"[UE %d] Config request : Action MODIFY for eNB %d: Frame %d LCID %d " - "RB id %d configured with SN size %d and RLC %s \n", - UE_id, eNB_id, frame, lc_id, rb_id, rb_sn, - (rlc_mode == 1) ? "AM" : (rlc_mode == 2) ? "TM" : "UM"); - } else { + "RB id %d configured with SN size %d and RLC %s \n", + ue_mod_idP, enb_mod_idP, frameP, lc_idP, rb_idP, rb_snP, + (rlc_modeP == 1) ? "AM" : (rlc_modeP == 2) ? "TM" : "UM"); + } else { LOG_I(PDCP,"[eNB %d] Config request : Action MODIFY for UE %d: Frame %d LCID %d " - "RB id %d configured with SN size %d and RLC %s \n", - eNB_id, UE_id, frame, lc_id, rb_id, rb_sn, - (rlc_mode == 1) ? "AM" : (rlc_mode == 2) ? "TM" : "UM"); - } - break; - case ACTION_REMOVE: - DevAssert(pdcp != NULL); - pdcp->instanciated_instance = 0; - pdcp->lcid = 0; - pdcp->header_compression_profile = 0x0; - pdcp->cipheringAlgorithm = 0xff; - pdcp->integrityProtAlgorithm = 0xff; - pdcp->status_report = 0; - pdcp->rlc_mode = RLC_NONE; - pdcp->next_pdcp_tx_sn = 0; - pdcp->next_pdcp_rx_sn = 0; - pdcp->tx_hfn = 0; - pdcp->rx_hfn = 0; - pdcp->last_submitted_pdcp_rx_sn = 4095; - pdcp->seq_num_size = 0; - pdcp->first_missing_pdu = -1; - pdcp->security_activated = 0; - - if (eNB_flag == 0) { + "RB id %d configured with SN size %d and RLC %s \n", + enb_mod_idP, ue_mod_idP, frameP, lc_idP, rb_idP, rb_snP, + (rlc_modeP == 1) ? "AM" : (rlc_modeP == 2) ? "TM" : "UM"); + } + break; + case ACTION_REMOVE: + DevAssert(pdcp_pP != NULL); + pdcp_pP->instanciated_instance = 0; + pdcp_pP->lcid = 0; + pdcp_pP->header_compression_profile = 0x0; + pdcp_pP->cipheringAlgorithm = 0xff; + pdcp_pP->integrityProtAlgorithm = 0xff; + pdcp_pP->status_report = 0; + pdcp_pP->rlc_mode = RLC_NONE; + pdcp_pP->next_pdcp_tx_sn = 0; + pdcp_pP->next_pdcp_rx_sn = 0; + pdcp_pP->tx_hfn = 0; + pdcp_pP->rx_hfn = 0; + pdcp_pP->last_submitted_pdcp_rx_sn = 4095; + pdcp_pP->seq_num_size = 0; + pdcp_pP->first_missing_pdu = -1; + pdcp_pP->security_activated = 0; + + if (enb_flagP == 0) { LOG_I(PDCP, "[UE %d] Config request : ACTION_REMOVE for eNB %d: Frame %d LCID %d RBID %d configured\n", - UE_id, eNB_id, frame, lc_id, rb_id); - } else { + ue_mod_idP, enb_mod_idP, frameP, lc_idP, rb_idP); + } else { LOG_I(PDCP, "[eNB %d] Config request : ACTION_REMOVE for UE %d: Frame %d LCID %d RBID %d configured\n", - eNB_id, UE_id, frame, lc_id, rb_id); - } - /* Security keys */ - if (pdcp->kUPenc != NULL) { - free(pdcp->kUPenc); - } - if (pdcp->kRRCint != NULL) { - free(pdcp->kRRCint); - } - if (pdcp->kRRCenc != NULL) { - free(pdcp->kRRCenc); - } - break; - case ACTION_MBMS_ADD: - case ACTION_MBMS_MODIFY: - if (eNB_flag == 0) { - module_id = UE_id + NB_eNB_INST; + enb_mod_idP, ue_mod_idP, frameP, lc_idP, rb_idP); + } + /* Security keys */ + if (pdcp_pP->kUPenc != NULL) { + free(pdcp_pP->kUPenc); + } + if (pdcp_pP->kRRCint != NULL) { + free(pdcp_pP->kRRCint); + } + if (pdcp_pP->kRRCenc != NULL) { + free(pdcp_pP->kRRCenc); + } + break; + case ACTION_MBMS_ADD: + case ACTION_MBMS_MODIFY: + if (enb_flagP == 0) { LOG_I(PDCP,"[UE %d] Config request for eNB %d: %s: Frame %d service_id/mch index %d, session_id/lcid %d, rbid %d configured\n", - UE_id, eNB_id, action == ACTION_MBMS_ADD ? "ACTION_MBMS_ADD" : "ACTION_MBMS_MODIFY", frame, mch_id, lc_id, rb_id); - } else { - module_id = eNB_id; + ue_mod_idP, enb_mod_idP, actionP == ACTION_MBMS_ADD ? "ACTION_MBMS_ADD" : "ACTION_MBMS_MODIFY", frameP, mch_idP, lc_idP, rb_idP); + } else { LOG_I(PDCP,"[eNB %d] Config request for UE %d: %s: Frame %d service_id/mch index %d, session_id/lcid %d, rbid %d configured\n", - eNB_id, UE_id, action == ACTION_MBMS_ADD ? "ACTION_MBMS_ADD" : "ACTION_MBMS_MODIFY", frame, mch_id, lc_id, rb_id); - } - pdcp_mbms_array[module_id][rb_id].instanciated_instance = module_id + 1 ; - pdcp_mbms_array[module_id][rb_id].service_id = mch_id; - pdcp_mbms_array[module_id][rb_id].session_id = lc_id; - pdcp_mbms_array[module_id][rb_id].rb_id = rb_id; - break; - case ACTION_SET_SECURITY_MODE: - pdcp_config_set_security(pdcp, eNB_id, UE_id, frame, eNB_flag, rb_id, lc_id, security_mode, kRRCenc, kRRCint, kUPenc); - break; - default: - DevParam(action, eNB_id, UE_id); - break; + enb_mod_idP, ue_mod_idP, actionP == ACTION_MBMS_ADD ? "ACTION_MBMS_ADD" : "ACTION_MBMS_MODIFY", frameP, mch_idP, lc_idP, rb_idP); + } + if (enb_flagP == 1) { + pdcp_mbms_array_eNB[enb_mod_idP][rb_idP].instanciated_instance = 1 ; + pdcp_mbms_array_eNB[enb_mod_idP][rb_idP].service_id = mch_idP; + pdcp_mbms_array_eNB[enb_mod_idP][rb_idP].session_id = lc_idP; + pdcp_mbms_array_eNB[enb_mod_idP][rb_idP].rb_id = rb_idP; + } else { + pdcp_mbms_array_eNB[ue_mod_idP][rb_idP].instanciated_instance = 1 ; + pdcp_mbms_array_eNB[ue_mod_idP][rb_idP].service_id = mch_idP; + pdcp_mbms_array_eNB[ue_mod_idP][rb_idP].session_id = lc_idP; + pdcp_mbms_array_eNB[ue_mod_idP][rb_idP].rb_id = rb_idP; + } + break; + case ACTION_SET_SECURITY_MODE: + pdcp_config_set_security(pdcp_pP, enb_mod_idP, ue_mod_idP, frameP, enb_flagP, rb_idP, lc_idP, security_modeP, kRRCenc_pP, kRRCint_pP, kUPenc_pP); + break; + default: + DevParam(actionP, enb_mod_idP, ue_mod_idP); + break; } return 0; } -void pdcp_config_set_security(pdcp_t *pdcp, u8 eNB_id, u8 UE_id, u32 frame, u8 eNB_flag, rb_id_t rb_id, - u16 lc_id, u8 security_mode, u8 *kRRCenc, u8 *kRRCint, u8 *kUPenc) +void pdcp_config_set_security(pdcp_t *pdcp_pP, + module_id_t enb_mod_idP, + module_id_t ue_mod_idP, + frame_t frameP, + eNB_flag_t eNB_flag, + rb_id_t rb_idP, + u16 lc_idP, + u8 security_modeP, + u8 *kRRCenc, + u8 *kRRCint, + u8 *kUPenc) { - DevAssert(pdcp != NULL); + DevAssert(pdcp_pP != NULL); - if ((security_mode >= 0) && (security_mode <= 0x77)) { - pdcp->cipheringAlgorithm = security_mode & 0x0f; - pdcp->integrityProtAlgorithm = (security_mode>>4) & 0xf; + if ((security_modeP >= 0) && (security_modeP <= 0x77)) { + pdcp_pP->cipheringAlgorithm = security_modeP & 0x0f; + pdcp_pP->integrityProtAlgorithm = (security_modeP>>4) & 0xf; - if (eNB_flag == 0) { - LOG_D(PDCP,"[UE %d][RB %02d] Set security mode : ACTION_SET_SECURITY_MODE: " - "Frame %d cipheringAlgorithm %d integrityProtAlgorithm %d\n", - UE_id, rb_id, frame, pdcp->cipheringAlgorithm, pdcp->integrityProtAlgorithm); - } else { - LOG_D(PDCP,"[eNB %d][UE %d][RB %02d] Set security mode : ACTION_SET_SECURITY_MODE: " - "Frame %d cipheringAlgorithm %d integrityProtAlgorithm %d\n", - eNB_id, UE_id, rb_id, frame, pdcp->cipheringAlgorithm, pdcp->integrityProtAlgorithm); - } - pdcp->kRRCenc = kRRCenc; - pdcp->kRRCint = kRRCint; - pdcp->kUPenc = kUPenc; + if (eNB_flag == 0) { + LOG_D(PDCP,"[UE %d][RB %02d] Set security mode : ACTION_SET_SECURITY_MODE: " + "Frame %d cipheringAlgorithm %d integrityProtAlgorithm %d\n", + ue_mod_idP, rb_idP, frameP, pdcp_pP->cipheringAlgorithm, pdcp_pP->integrityProtAlgorithm); + } else { + LOG_D(PDCP,"[eNB %d][UE %d][RB %02d] Set security mode : ACTION_SET_SECURITY_MODE: " + "Frame %d cipheringAlgorithm %d integrityProtAlgorithm %d\n", + enb_mod_idP, ue_mod_idP, rb_idP, frameP, pdcp_pP->cipheringAlgorithm, pdcp_pP->integrityProtAlgorithm); + } + pdcp_pP->kRRCenc = kRRCenc; + pdcp_pP->kRRCint = kRRCint; + pdcp_pP->kUPenc = kUPenc; - /* Activate security */ - pdcp->security_activated = 1; + /* Activate security */ + pdcp_pP->security_activated = 1; } else { - LOG_E(PDCP,"[%s %d] bad security mode %d", security_mode); + LOG_E(PDCP,"[%s %d] bad security mode %d", security_modeP); } } -void rrc_pdcp_config_req (u8 eNB_id, u8 UE_id, u32 frame, u8_t eNB_flag, u32 action, rb_id_t rb_id, u8 security_mode) +void rrc_pdcp_config_req (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t frameP, eNB_flag_t enb_flagP, u32 actionP, rb_id_t rb_idP, u8 security_modeP) { - pdcp_t *pdcp; - module_id_t module_id; + pdcp_t *pdcp_p = NULL; - if (eNB_flag == 0) { - pdcp = &pdcp_array_ue[UE_id][rb_id]; - module_id = NB_eNB_INST + UE_id; + if (enb_mod_idP == 0) { + pdcp_p = &pdcp_array_ue[ue_mod_idP][rb_idP]; } else { - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rb_id]; - module_id = eNB_id; + pdcp_p = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP]; } /* - * Initialize sequence number state variables of relevant PDCP entity - */ - switch (action) { - case ACTION_ADD: - pdcp->instanciated_instance = 1; - - pdcp->next_pdcp_tx_sn = 0; - pdcp->next_pdcp_rx_sn = 0; - pdcp->tx_hfn = 0; - pdcp->rx_hfn = 0; - /* SN of the last PDCP SDU delivered to upper layers */ - pdcp->last_submitted_pdcp_rx_sn = 4095; - - if (rb_id < DTCH) { // SRB - pdcp->seq_num_size = 5; - } else { // DRB - pdcp->seq_num_size = 12; - } - pdcp->first_missing_pdu = -1; - LOG_D(PDCP,"[%s %d] Config request : Action ADD: Frame %d radio bearer id %d configured\n", - (eNB_flag) ? "eNB" : "UE", module_id, frame, rb_id); - LOG_D(PDCP, "[MSC_NEW][FRAME %05d][PDCP][MOD %02d][RB %02d]\n", frame, module_id,rb_id); - break; - case ACTION_MODIFY: - break; - case ACTION_REMOVE: - pdcp->instanciated_instance = 0; - pdcp->next_pdcp_tx_sn = 0; - pdcp->next_pdcp_rx_sn = 0; - pdcp->tx_hfn = 0; - pdcp->rx_hfn = 0; - pdcp->last_submitted_pdcp_rx_sn = 4095; - pdcp->seq_num_size = 0; - pdcp->first_missing_pdu = -1; - pdcp->security_activated = 0; - LOG_D(PDCP,"[%s %d] Config request : ACTION_REMOVE: Frame %d radio bearer id %d configured\n", - (eNB_flag) ? "eNB" : "UE", module_id, frame, rb_id); - - break; - case ACTION_SET_SECURITY_MODE: - if ((security_mode >= 0) && (security_mode <= 0x77)) { - pdcp->cipheringAlgorithm= security_mode & 0x0f; - pdcp->integrityProtAlgorithm = (security_mode>>4) & 0xf; + * Initialize sequence number state variables of relevant PDCP entity + */ + switch (actionP) { + case ACTION_ADD: + pdcp_p->instanciated_instance = 1; + + pdcp_p->next_pdcp_tx_sn = 0; + pdcp_p->next_pdcp_rx_sn = 0; + pdcp_p->tx_hfn = 0; + pdcp_p->rx_hfn = 0; + /* SN of the last PDCP SDU delivered to upper layers */ + pdcp_p->last_submitted_pdcp_rx_sn = 4095; + + if (rb_idP < DTCH) { // SRB + pdcp_p->seq_num_size = 5; + } else { // DRB + pdcp_p->seq_num_size = 12; + } + pdcp_p->first_missing_pdu = -1; + LOG_D(PDCP,"[%s %d] Config request : Action ADD: Frame %d radio bearer id %d configured\n", + (enb_flagP) ? "eNB" : "UE", (enb_flagP) ? enb_mod_idP : ue_mod_idP, frameP, rb_idP); + break; + case ACTION_MODIFY: + break; + case ACTION_REMOVE: + pdcp_p->instanciated_instance = 0; + pdcp_p->next_pdcp_tx_sn = 0; + pdcp_p->next_pdcp_rx_sn = 0; + pdcp_p->tx_hfn = 0; + pdcp_p->rx_hfn = 0; + pdcp_p->last_submitted_pdcp_rx_sn = 4095; + pdcp_p->seq_num_size = 0; + pdcp_p->first_missing_pdu = -1; + pdcp_p->security_activated = 0; + LOG_D(PDCP,"[%s %d] Config request : ACTION_REMOVE: Frame %d radio bearer id %d configured\n", + (enb_flagP) ? "eNB" : "UE", (enb_flagP) ? enb_mod_idP : ue_mod_idP, frameP, rb_idP); + + break; + case ACTION_SET_SECURITY_MODE: + if ((security_modeP >= 0) && (security_modeP <= 0x77)) { + pdcp_p->cipheringAlgorithm= security_modeP & 0x0f; + pdcp_p->integrityProtAlgorithm = (security_modeP>>4) & 0xf; LOG_D(PDCP,"[%s %d]Set security mode : ACTION_SET_SECURITY_MODE: Frame %d cipheringAlgorithm %d integrityProtAlgorithm %d\n", - (eNB_flag) ? "eNB" : "UE", module_id, frame, - pdcp->cipheringAlgorithm, - pdcp->integrityProtAlgorithm ); - } else { - LOG_D(PDCP,"[%s %d] bad security mode %d", security_mode); - } - break; - default: - DevParam(action, UE_id, eNB_id); - break; + (enb_flagP) ? "eNB" : "UE", (enb_flagP) ? enb_mod_idP : ue_mod_idP, frameP, + pdcp_p->cipheringAlgorithm, + pdcp_p->integrityProtAlgorithm ); + } else { + LOG_D(PDCP,"[%s %d] bad security mode %d", security_modeP); + } + break; + default: + DevParam(actionP, ue_mod_idP, enb_mod_idP); + break; } } // TODO PDCP module initialization code might be removed -int - pdcp_module_init () -{ +int pdcp_module_init (void) { //----------------------------------------------------------------------------- #ifdef NAS_FIFO int ret; @@ -1142,23 +1164,23 @@ int ret=rtf_create(PDCP2NAS_FIFO,32768); if (ret < 0) { - LOG_E(PDCP, "Cannot create PDCP2NAS fifo %d (ERROR %d)\n", PDCP2NAS_FIFO, ret); + LOG_E(PDCP, "Cannot create PDCP2NAS fifo %d (ERROR %d)\n", PDCP2NAS_FIFO, ret); - return -1; + return -1; } else { - LOG_D(PDCP, "Created PDCP2NAS fifo %d\n", PDCP2NAS_FIFO); - rtf_reset(PDCP2NAS_FIFO); + LOG_D(PDCP, "Created PDCP2NAS fifo %d\n", PDCP2NAS_FIFO); + rtf_reset(PDCP2NAS_FIFO); } ret=rtf_create(NAS2PDCP_FIFO,32768); if (ret < 0) { - LOG_E(PDCP, "Cannot create NAS2PDCP fifo %d (ERROR %d)\n", NAS2PDCP_FIFO, ret); + LOG_E(PDCP, "Cannot create NAS2PDCP fifo %d (ERROR %d)\n", NAS2PDCP_FIFO, ret); - return -1; + return -1; } else { - LOG_D(PDCP, "Created NAS2PDCP fifo %d\n", NAS2PDCP_FIFO); - rtf_reset(NAS2PDCP_FIFO); + LOG_D(PDCP, "Created NAS2PDCP fifo %d\n", NAS2PDCP_FIFO); + rtf_reset(NAS2PDCP_FIFO); } pdcp_2_nas_irq = 0; @@ -1171,9 +1193,8 @@ int } //----------------------------------------------------------------------------- -void - pdcp_module_cleanup () - //----------------------------------------------------------------------------- +void pdcp_module_cleanup (void) +//----------------------------------------------------------------------------- { #ifdef NAS_FIFO rtf_destroy(NAS2PDCP_FIFO); @@ -1184,17 +1205,33 @@ void //----------------------------------------------------------------------------- void pdcp_layer_init(void) { -//----------------------------------------------------------------------------- - + //----------------------------------------------------------------------------- + module_id_t instance, instance2; + rb_id_t rb_id; + int j; /* - * Initialize SDU list - */ + * Initialize SDU list + */ list_init(&pdcp_sdu_list, NULL); - memset(pdcp_array_ue, 0, sizeof(pdcp_array_ue)); - memset(pdcp_array_eNB, 0, sizeof(pdcp_array_eNB)); - - memset((void*)&pdcp_mbms_array, 0, sizeof(pdcp_mbms_array)); + for (instance = 0; instance < NUMBER_OF_UE_MAX; instance++) { + for (rb_id = 0; rb_id < NB_RB_MAX; rb_id++) { + memset(&pdcp_array_ue[instance][rb_id], 0, sizeof(pdcp_t)); + } + for (j = 0; j < 16*29; j++) { + memset(&pdcp_mbms_array_ue[instance][j], 0, sizeof(pdcp_mbms_t)); + } + } + for (instance = 0; instance < NUMBER_OF_eNB_MAX; instance++) { + for (instance2 = 0; instance2 < NUMBER_OF_UE_MAX; instance2++) { + for (rb_id = 0; rb_id < NB_RB_MAX; rb_id++) { + memset(&pdcp_array_eNB[instance][instance2][rb_id], 0, sizeof(pdcp_t)); + } + } + for (j = 0; j < 16*29; j++) { + memset(&pdcp_mbms_array_eNB[instance][j], 0, sizeof(pdcp_mbms_t)); + } + } LOG_I(PDCP, "PDCP layer has been initialized\n"); @@ -1202,26 +1239,6 @@ void pdcp_layer_init(void) pdcp_output_header_bytes_to_write=0; pdcp_input_sdu_remaining_size_to_read=0; - /* - * Initialize PDCP entities (see pdcp_t at pdcp.h) - */ - // set RB for eNB : this is now down by RRC for each mod id and rab id when needed. - /* for (i=0;i < NB_eNB_INST; i++) { - for (j=NB_eNB_INST; j < NB_eNB_INST+NB_UE_INST; j++ ) { - pdcp_config_req(i, (j-NB_eNB_INST) * NB_RB_MAX + DCCH, DCCH ); // default DRB - pdcp_config_req(i, (j-NB_eNB_INST) * NB_RB_MAX + DCCH1, DCCH1 ); // default DRB - pdcp_config_req(i, (j-NB_eNB_INST) * NB_RB_MAX + DTCH, DTCH ); // default DRB - } - } - // set RB for UE - for (i=NB_eNB_INST;idata))->inst; - // asjust the instance id when passing sdu to IP - ((pdcp_data_ind_header_t *)(sdu->data))->inst = (((pdcp_data_ind_header_t *)(sdu->data))->inst >= NB_eNB_INST) ? - ((pdcp_data_ind_header_t *)(sdu->data))->inst - NB_eNB_INST +oai_emulation.info.nb_enb_local - oai_emulation.info.first_ue_local :// UE - ((pdcp_data_ind_header_t *)(sdu->data))->inst - oai_emulation.info.first_ue_local; // ENB + //LGmcs_inst = ((pdcp_data_ind_header_t *)(sdu->data))->inst; + // asjust the instance id when passing sdu to IP + //((pdcp_data_ind_header_t *)(sdu->data))->inst = (((pdcp_data_ind_header_t *)(sdu->data))->inst >= NB_eNB_INST) ? + // ((pdcp_data_ind_header_t *)(sdu->data))->inst - NB_eNB_INST +oai_emulation.info.nb_enb_local - oai_emulation.info.first_ue_local :// UE + // ((pdcp_data_ind_header_t *)(sdu->data))->inst - oai_emulation.info.first_ue_local; // ENB #else - ((pdcp_data_ind_header_t *)(sdu->data))->inst = 0; + ((pdcp_data_ind_header_t *)(sdu_p->data))->inst = 0; #endif #ifdef PDCP_DEBUG - LOG_I(PDCP, "PDCP->IP TTI %d INST %d: Preparing %d Bytes of data from rab %d to Nas_mesh\n", - frame, ((pdcp_data_ind_header_t *)(sdu->data))->inst, - ((pdcp_data_ind_header_t *)(sdu->data))->data_size, ((pdcp_data_ind_header_t *)(sdu->data))->rb_id); + LOG_I(PDCP, "PDCP->IP TTI %d INST %d: Preparing %d Bytes of data from rab %d to Nas_mesh\n", + frameP, ((pdcp_data_ind_header_t *)(sdu_p->data))->inst, + ((pdcp_data_ind_header_t *)(sdu_p->data))->data_size, ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id); #endif //PDCP_DEBUG - cont = 0; + cont = 0; - if (!pdcp_output_sdu_bytes_to_write) { - if (!pdcp_output_header_bytes_to_write) { - pdcp_output_header_bytes_to_write = sizeof (pdcp_data_ind_header_t); - } + if (!pdcp_output_sdu_bytes_to_write) { + if (!pdcp_output_header_bytes_to_write) { + pdcp_output_header_bytes_to_write = sizeof (pdcp_data_ind_header_t); + } #ifdef NAS_FIFO - bytes_wrote = rtf_put (PDCP2NAS_FIFO, - &(((u8 *) sdu->data)[sizeof (pdcp_data_ind_header_t) - pdcp_output_header_bytes_to_write]), - pdcp_output_header_bytes_to_write); + bytes_wrote = rtf_put (PDCP2NAS_FIFO, + &(((u8 *) sdu->data)[sizeof (pdcp_data_ind_header_t) - pdcp_output_header_bytes_to_write]), + pdcp_output_header_bytes_to_write); #else #ifdef NAS_NETLINK #ifdef LINUX - memcpy(NLMSG_DATA(nas_nlh_tx), &(((u8 *) sdu->data)[sizeof (pdcp_data_ind_header_t) - pdcp_output_header_bytes_to_write]), - pdcp_output_header_bytes_to_write); - nas_nlh_tx->nlmsg_len = pdcp_output_header_bytes_to_write; + memcpy(NLMSG_DATA(nas_nlh_tx), &(((u8 *) sdu_p->data)[sizeof (pdcp_data_ind_header_t) - pdcp_output_header_bytes_to_write]), + pdcp_output_header_bytes_to_write); + nas_nlh_tx->nlmsg_len = pdcp_output_header_bytes_to_write; #endif //LINUX #endif //NAS_NETLINK - bytes_wrote = pdcp_output_header_bytes_to_write; + bytes_wrote = pdcp_output_header_bytes_to_write; #endif //NAS_FIFO #ifdef PDCP_DEBUG - LOG_I(PDCP, "Frame %d Sent %d Bytes of header to Nas_mesh\n", - frame, - bytes_wrote); + LOG_I(PDCP, "Frame %d Sent %d Bytes of header to Nas_mesh\n", + frameP, + bytes_wrote); #endif //PDCP_DEBUG - if (bytes_wrote > 0) { - pdcp_output_header_bytes_to_write = pdcp_output_header_bytes_to_write - bytes_wrote; + if (bytes_wrote > 0) { + pdcp_output_header_bytes_to_write = pdcp_output_header_bytes_to_write - bytes_wrote; - if (!pdcp_output_header_bytes_to_write) { // continue with sdu - pdcp_output_sdu_bytes_to_write = ((pdcp_data_ind_header_t *) sdu->data)->data_size; + if (!pdcp_output_header_bytes_to_write) { // continue with sdu + pdcp_output_sdu_bytes_to_write = ((pdcp_data_ind_header_t *) sdu_p->data)->data_size; #ifdef NAS_FIFO - bytes_wrote = rtf_put (PDCP2NAS_FIFO, &(sdu->data[sizeof (pdcp_data_ind_header_t)]), pdcp_output_sdu_bytes_to_write); + bytes_wrote = rtf_put (PDCP2NAS_FIFO, &(sdu->data[sizeof (pdcp_data_ind_header_t)]), pdcp_output_sdu_bytes_to_write); #else #ifdef NAS_NETLINK #ifdef LINUX - memcpy(NLMSG_DATA(nas_nlh_tx)+sizeof(pdcp_data_ind_header_t), &(sdu->data[sizeof (pdcp_data_ind_header_t)]), pdcp_output_sdu_bytes_to_write); - nas_nlh_tx->nlmsg_len += pdcp_output_sdu_bytes_to_write; - ret = sendmsg(nas_sock_fd,&nas_msg_tx,0); - if (ret<0) { - LOG_D(PDCP, "[PDCP_FIFOS] sendmsg returns %d (errno: %d)\n", ret, errno); - mac_xface->macphy_exit("sendmsg failed for nas_sock_fd\n"); - break; - } + memcpy(NLMSG_DATA(nas_nlh_tx)+sizeof(pdcp_data_ind_header_t), &(sdu_p->data[sizeof (pdcp_data_ind_header_t)]), pdcp_output_sdu_bytes_to_write); + nas_nlh_tx->nlmsg_len += pdcp_output_sdu_bytes_to_write; + ret = sendmsg(nas_sock_fd,&nas_msg_tx,0); + if (ret<0) { + LOG_D(PDCP, "[PDCP_FIFOS] sendmsg returns %d (errno: %d)\n", ret, errno); + mac_xface->macphy_exit("sendmsg failed for nas_sock_fd\n"); + break; + } #endif // LINUX #endif //NAS_NETLINK - bytes_wrote= pdcp_output_sdu_bytes_to_write; + bytes_wrote= pdcp_output_sdu_bytes_to_write; #endif // NAS_FIFO #ifdef PDCP_DEBUG - LOG_I(PDCP, "PDCP->IP Frame %d INST %d: Sent %d Bytes of data from rab %d to Nas_mesh\n", - frame, - ((pdcp_data_ind_header_t *)(sdu->data))->inst, - bytes_wrote, - ((pdcp_data_ind_header_t *)(sdu->data))->rb_id); + LOG_I(PDCP, "PDCP->IP Frame %d INST %d: Sent %d Bytes of data from rab %d to Nas_mesh\n", + frameP, + ((pdcp_data_ind_header_t *)(sdu_p->data))->inst, + bytes_wrote, + ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id); #endif //PDCP_DEBUG - if (bytes_wrote > 0) { - pdcp_output_sdu_bytes_to_write -= bytes_wrote; - - if (!pdcp_output_sdu_bytes_to_write) { // OK finish with this SDU - // LOG_D(PDCP, "rb sent a sdu qos_sap %d\n", sapiP); - LOG_D(PDCP, - "[MSC_MSG][FRAME %05d][PDCP][MOD %02d][RB %02d][--- PDCP_DATA_IND / %d Bytes --->][IP][MOD %02d][]\n", - frame, - mcs_inst, //((pdcp_data_ind_header_t *)(sdu->data))->inst, - ((pdcp_data_ind_header_t *)(sdu->data))->rb_id, - ((pdcp_data_ind_header_t *)(sdu->data))->data_size, - mcs_inst); //((pdcp_data_ind_header_t *)(sdu->data))->inst - - list_remove_head (&pdcp_sdu_list); - free_mem_block (sdu); - cont = 1; - pdcp_nb_sdu_sent += 1; - sdu = list_get_head (&pdcp_sdu_list); - } - } else { - LOG_W(PDCP, "RADIO->IP SEND SDU CONGESTION!\n"); + if (bytes_wrote > 0) { + pdcp_output_sdu_bytes_to_write -= bytes_wrote; + + if (!pdcp_output_sdu_bytes_to_write) { // OK finish with this SDU + // LOG_D(PDCP, "rb sent a sdu qos_sap %d\n", sapiP); + LOG_D(PDCP, + "[FRAME %05d][xxx][PDCP][MOD xx/xx][RB %u][--- PDCP_DATA_IND / %d Bytes --->][IP][INSTANCE %u][RB %u]\n", + frameP, + ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id%NB_RB_MAX, + ((pdcp_data_ind_header_t *)(sdu_p->data))->data_size, + ((pdcp_data_ind_header_t *)(sdu_p->data))->inst, + ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id); + + list_remove_head (&pdcp_sdu_list); + free_mem_block (sdu_p); + cont = 1; + pdcp_nb_sdu_sent += 1; + sdu_p = list_get_head (&pdcp_sdu_list); + } + } else { + LOG_W(PDCP, "RADIO->IP SEND SDU CONGESTION!\n"); + } + } else { + LOG_W(PDCP, "RADIO->IP SEND SDU CONGESTION!\n"); + } } - } else { - LOG_W(PDCP, "RADIO->IP SEND SDU CONGESTION!\n"); - } - } - } else { - // continue writing sdu + } else { + // continue writing sdu #ifdef NAS_FIFO - bytes_wrote = rtf_put (PDCP2NAS_FIFO, - (u8 *) (&(sdu->data[sizeof (pdcp_data_ind_header_t) + ((pdcp_data_ind_header_t *) sdu->data)->data_size - pdcp_output_sdu_bytes_to_write])), - pdcp_output_sdu_bytes_to_write); + bytes_wrote = rtf_put (PDCP2NAS_FIFO, + (u8 *) (&(sdu_p->data[sizeof (pdcp_data_ind_header_t) + ((pdcp_data_ind_header_t *) sdu_p->data)->data_size - pdcp_output_sdu_bytes_to_write])), + pdcp_output_sdu_bytes_to_write); #else // NAS_FIFO - bytes_wrote = pdcp_output_sdu_bytes_to_write; + bytes_wrote = pdcp_output_sdu_bytes_to_write; #endif // NAS_FIFO - if (bytes_wrote > 0) { - pdcp_output_sdu_bytes_to_write -= bytes_wrote; - - if (!pdcp_output_sdu_bytes_to_write) { // OK finish with this SDU - //PRINT_RB_SEND_OUTPUT_SDU ("[PDCP] RADIO->IP SEND SDU\n"); - list_remove_head (&pdcp_sdu_list); - free_mem_block (sdu); - cont = 1; - pdcp_nb_sdu_sent += 1; - sdu = list_get_head (&pdcp_sdu_list); - // LOG_D(PDCP, "rb sent a sdu from rab\n"); - } + if (bytes_wrote > 0) { + pdcp_output_sdu_bytes_to_write -= bytes_wrote; + + if (!pdcp_output_sdu_bytes_to_write) { // OK finish with this SDU + //PRINT_RB_SEND_OUTPUT_SDU ("[PDCP] RADIO->IP SEND SDU\n"); + list_remove_head (&pdcp_sdu_list); + free_mem_block (sdu_p); + cont = 1; + pdcp_nb_sdu_sent += 1; + sdu_p = list_get_head (&pdcp_sdu_list); + // LOG_D(PDCP, "rb sent a sdu from rab\n"); + } + } } - } } #ifdef NAS_FIFO if ((pdcp_nb_sdu_sent)) { - if ((pdcp_2_nas_irq > 0)) { + if ((pdcp_2_nas_irq > 0)) { #ifdef PDCP_DEBUG - LOG_I(PDCP, "Frame %d : Trigger NAS RX interrupt\n", - frame); + LOG_I(PDCP, "Frame %d : Trigger NAS RX interrupt\n", + frameP); #endif //PDCP_DEBUG - rt_pend_linux_srq (pdcp_2_nas_irq); - } else { - LOG_E(PDCP, "Frame %d: ERROR IF IP STACK WANTED : NOTIF PACKET(S) pdcp_2_nas_irq not initialized : %d\n", - frame, - pdcp_2_nas_irq); - } + rt_pend_linux_srq (pdcp_2_nas_irq); + } else { + LOG_E(PDCP, "Frame %d: ERROR IF IP STACK WANTED : NOTIF PACKET(S) pdcp_2_nas_irq not initialized : %d\n", + frameP, + pdcp_2_nas_irq); + } } #endif //NAS_FIFO @@ -267,330 +265,513 @@ int pdcp_fifo_flush_sdus(u32_t frame, u8 eNB_flag, u8 eNB_id, u8 UE_id) * returns zero value if whole bytes that had to be read were not read at all * returns a negative value if an error was encountered while reading the rt fifo */ -int pdcp_fifo_read_input_sdus_remaining_bytes (u32_t frame, u8_t eNB_flag) +int pdcp_fifo_read_input_sdus_remaining_bytes (frame_t frameP, eNB_flag_t eNB_flagP) { //----------------------------------------------------------------------------- sdu_size_t bytes_read = 0; - rb_id_t rab_id = 0; - pdcp_t *pdcp; - u8 UE_id = 0; - u8 eNB_id; - u8 rb_id; - int result; + rb_id_t rab_id = 0; + pdcp_t *pdcp_p = NULL; + module_id_t ue_inst = 0; + module_id_t enb_inst = 0; + rb_id_t rb_id = 0; + int result = -1; // if remaining bytes to read if (pdcp_input_sdu_remaining_size_to_read > 0) { - bytes_read = rtf_get (NAS2PDCP_FIFO, - &(pdcp_input_sdu_buffer[pdcp_input_sdu_size_read]), - pdcp_input_sdu_remaining_size_to_read); + bytes_read = rtf_get (NAS2PDCP_FIFO, + &(pdcp_input_sdu_buffer[pdcp_input_sdu_size_read]), + pdcp_input_sdu_remaining_size_to_read); - if (bytes_read > 0) { - LOG_D(PDCP, "[PDCP_FIFOS] Read %d remaining bytes of data from Nas_mesh\n", bytes_read); + if (bytes_read > 0) { + LOG_D(PDCP, "[PDCP_FIFOS] Read %d remaining bytes of data from Nas_mesh\n", bytes_read); - pdcp_input_sdu_remaining_size_to_read = pdcp_input_sdu_remaining_size_to_read - bytes_read; - pdcp_input_sdu_size_read = pdcp_input_sdu_size_read + bytes_read; + pdcp_input_sdu_remaining_size_to_read = pdcp_input_sdu_remaining_size_to_read - bytes_read; + pdcp_input_sdu_size_read = pdcp_input_sdu_size_read + bytes_read; - if (pdcp_input_sdu_remaining_size_to_read != 0) { - return 0; - } else { + if (pdcp_input_sdu_remaining_size_to_read != 0) { + return 0; + } else { #ifdef PDCP_DEBUG - LOG_I(PDCP, "Frame %d: IP->RADIO RECEIVED COMPLETE SDU size %d inst %d rb %d\n", - frame, - pdcp_input_sdu_size_read, - pdcp_input_header.inst, - pdcp_input_header.rb_id); + LOG_I(PDCP, "Frame %d: IP->RADIO RECEIVED COMPLETE SDU size %d inst %d rb %d\n", + frameP, + pdcp_input_sdu_size_read, + pdcp_input_header.inst, + pdcp_input_header.rb_id); #endif //PDCP_DEBUG - pdcp_input_sdu_size_read = 0; + pdcp_input_sdu_size_read = 0; #ifdef IDROMEL_NEMO - pdcp_read_header.inst = 0; + pdcp_read_header_g.inst = 0; #endif - if (eNB_flag == 0) { - UE_id = pdcp_read_header.inst; - rb_id = pdcp_read_header.rb_id % NB_RB_MAX; - eNB_id = 0; - - DevCheck4(UE_id < NB_UE_INST, UE_id, NB_UE_INST, pdcp_read_header.rb_id, NB_RB_MAX); - DevCheck4(eNB_id < NB_eNB_INST, eNB_id, NB_eNB_INST, pdcp_read_header.rb_id, NB_RB_MAX); - - pdcp = &pdcp_array_ue[UE_id][rb_id]; - } else { - UE_id = pdcp_read_header.rb_id / NB_RB_MAX; - rb_id = pdcp_read_header.rb_id % NB_RB_MAX; - eNB_id = pdcp_read_header.inst; - - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rb_id]; - } - - if (pdcp_input_header.rb_id != 0) { - LOG_D(PDCP, "[MSC_MSG][FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %02d][RB %02d]\n", - frame, pdcp_read_header.inst, pdcp_read_header.data_size, pdcp_read_header.inst, pdcp_read_header.rb_id); - - if (pdcp->instanciated_instance) { - result = pdcp_data_req (eNB_id, UE_id, - frame, eNB_flag, - pdcp_input_header.rb_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_input_header.data_size, - pdcp_input_sdu_buffer, - PDCP_DATA_PDU); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); - } - - } else if ((pdcp_input_header.traffic_type == OAI_NW_DRV_IPV6_ADDR_TYPE_MULTICAST) || (pdcp_input_header.traffic_type == OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST)) { - LOG_D(PDCP, "[MSC_MSG][FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ on MBMS bearer/ %d Bytes --->][PDCP][MOD %02d][RB %02d]\n", - frame, pdcp_read_header.inst, pdcp_read_header.data_size, pdcp_read_header.inst, pdcp_read_header.rb_id); - - if (pdcp->instanciated_instance) { - result = pdcp_data_req (eNB_id, - UE_id, - frame, - eNB_flag, - pdcp_input_header.rb_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_input_header.data_size, - pdcp_input_sdu_buffer, - PDCP_TM); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); - } - - } else if (eNB_flag) { - // is a broadcast packet, we have to send this packet on all default RABS of all connected UEs - LOG_D(PDCP, "Checking if could sent on default rabs\n"); -#warning CODE TO BE REVIEWED, ONLY WORK FOR SIMPLE TOPOLOGY CASES - for (rab_id = DEFAULT_RAB_ID; rab_id < MAX_RB; rab_id = rab_id + NB_RB_MAX) { - LOG_D(PDCP, "Checking if could sent on default rab id %d\n", rab_id); - pdcp = &pdcp_array_eNB[eNB_id][UE_id][rab_id]; - if (pdcp->instanciated_instance == (pdcp_input_header.inst + 1)) { - result = pdcp_data_req (eNB_id, - UE_id, - frame, eNB_flag, - rab_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_input_header.data_size, - pdcp_input_sdu_buffer, - PDCP_DATA_PDU); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); - } - } - } else { - LOG_D(PDCP, "Forcing send on DEFAULT_RAB_ID\n"); - result = pdcp_data_req (eNB_id, - UE_id, - frame, eNB_flag, - DEFAULT_RAB_ID, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_input_header.data_size, - pdcp_input_sdu_buffer, - PDCP_DATA_PDU); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); - } - // not necessary - //memset(pdcp_input_sdu_buffer, 0, MAX_IP_PACKET_SIZE); - return 1; + if (eNB_flagP == 0) { + ue_inst = pdcp_read_header_g.inst; + rb_id = pdcp_read_header_g.rb_id % NB_RB_MAX; + enb_inst = 0; + pdcp_p = &pdcp_array_ue[ue_inst][rb_id]; + } else { + ue_inst = pdcp_read_header_g.rb_id / NB_RB_MAX; + rb_id = pdcp_read_header_g.rb_id % NB_RB_MAX; + enb_inst = pdcp_read_header_g.inst; + pdcp_p = &pdcp_array_eNB[enb_inst][ue_inst][rb_id]; + } + AssertFatal (enb_inst < NB_eNB_INST, "eNB module id is too high (%u/%d)!\n", enb_inst, NB_eNB_INST); + AssertFatal (ue_inst >= NB_eNB_INST, + "UE module id is too low (%u/%d)!\n", + ue_inst, + NB_eNB_INST); + AssertFatal (ue_inst < (NB_eNB_INST + NB_UE_INST), + "UE module id is too high (%u/%d)!\n", + ue_inst, + NB_eNB_INST + NB_UE_INST); + AssertFatal (rab_id < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rab_id, NB_RB_MAX); + + if (pdcp_input_header.rb_id != 0) { + LOG_D(PDCP, "[FRAME %5u][%s][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB %u]\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_inst, + ue_inst, + rb_id); + + if (pdcp_p->instanciated_instance) { + result = pdcp_data_req (enb_inst, + ue_inst, + frameP, + eNB_flagP, + rb_id, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_input_header.data_size, + pdcp_input_sdu_buffer, + PDCP_DATA_PDU); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); + } + + } else if ((pdcp_input_header.traffic_type == OAI_NW_DRV_IPV6_ADDR_TYPE_MULTICAST) || (pdcp_input_header.traffic_type == OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST)) { + LOG_D(PDCP, "[FRAME %5u][%s][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ on MBMS bearer/ %d Bytes --->][PDCP][MOD %u/%u][RB %u]\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_inst, + ue_inst, + rb_id); + + if (pdcp_p->instanciated_instance) { + result = pdcp_data_req ( + enb_inst, + ue_inst, + frameP, + eNB_flagP, + rb_id, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_input_header.data_size, + pdcp_input_sdu_buffer, + PDCP_TM); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); + } + + } else if (eNB_flagP) { + // is a broadcast packet, we have to send this packet on all default RABS of all connected UEs + LOG_D(PDCP, "Checking if could sent on default rabs\n"); + for (ue_inst = 0; ue_inst < NUMBER_OF_UE_MAX; ue_inst++) { + LOG_D(PDCP, "Checking if could sent on default rab id %d\n", DEFAULT_RAB_ID); + pdcp_p = &pdcp_array_eNB[enb_inst][ue_inst][DEFAULT_RAB_ID]; + if (pdcp_p->instanciated_instance) { + LOG_D(PDCP, "[FRAME %5u][%s][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB DEFAULT_RAB_ID %u]\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_inst, + ue_inst, + DEFAULT_RAB_ID); + result = pdcp_data_req ( + enb_inst, + ue_inst, + frameP, + eNB_flagP, + DEFAULT_RAB_ID, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_input_header.data_size, + pdcp_input_sdu_buffer, + PDCP_DATA_PDU); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); + } + } + } else { + LOG_D(PDCP, "Forcing send on DEFAULT_RAB_ID\n"); + LOG_D(PDCP, "[FRAME %5u][%s][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB DEFAULT_RAB_ID %u]\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_inst, + ue_inst, + DEFAULT_RAB_ID); + result = pdcp_data_req ( + enb_inst, + ue_inst, + frameP, + eNB_flagP, + DEFAULT_RAB_ID, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_input_header.data_size, + pdcp_input_sdu_buffer, + PDCP_DATA_PDU); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); + } + // not necessary + //memset(pdcp_input_sdu_buffer, 0, MAX_IP_PACKET_SIZE); + return 1; + } + } else { + return bytes_read; } - } else { - return bytes_read; - } } return 1; } //----------------------------------------------------------------------------- -int pdcp_fifo_read_input_sdus (u32_t frame, u8_t eNB_flag, u8_t UE_index, u8_t eNB_index) +int pdcp_fifo_read_input_sdus (frame_t frameP, eNB_flag_t eNB_flagP, module_id_t ue_mod_idP, module_id_t enb_mod_idP) { #ifdef NAS_NETLINK # if defined(ENABLE_PDCP_NETLINK_FIFO) - rb_id_t rab_id; - pdcp_t *pdcp; - u8 pdcp_mode = 0; - struct pdcp_netlink_element_s *data = NULL; - - while (pdcp_netlink_dequeue_element(eNB_flag, UE_index, eNB_index, &data) != 0) { - DevAssert(data != NULL); - if (eNB_flag == 0) { - rab_id = data->pdcp_read_header.rb_id; - pdcp = &pdcp_array_ue[UE_index][rab_id]; - } else { + module_id_t ue_id = 0; + rb_id_t rab_id = 0; + pdcp_t *pdcp = NULL; + u8 pdcp_mode = 0; + struct pdcp_netlink_element_s *data = NULL; + + while (pdcp_netlink_dequeue_element(enb_mod_idP, ue_mod_idP, eNB_flagP, &data) != 0) { + DevAssert(data != NULL); + if (eNB_flagP == 0) { + rab_id = data->pdcp_read_header.rb_id % NB_RB_MAX; + pdcp = &pdcp_array_ue[ue_mod_idP][rab_id]; + } else { rab_id = data->pdcp_read_header.rb_id % NB_RB_MAX; - UE_index = data->pdcp_read_header.rb_id / NB_RB_MAX; - pdcp = &pdcp_array_eNB[eNB_index][UE_index][rab_id]; - } - - if (data->pdcp_read_header.rb_id != 0) { - if (pdcp->instanciated_instance) { - LOG_D(PDCP, "[FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ " - "/ %d Bytes --->][PDCP][MOD %02d][RB %02d]\n", - frame, data->pdcp_read_header.inst, data->pdcp_read_header.data_size, - data->pdcp_read_header.inst, data->pdcp_read_header.rb_id); + ue_mod_idP = data->pdcp_read_header.rb_id / NB_RB_MAX; + pdcp = &pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rab_id]; + } + AssertFatal (enb_mod_idP >= oai_emulation.info.first_enb_local, + "eNB inst is too low (%u/%d)!\n", + enb_mod_idP, + oai_emulation.info.first_enb_local); + AssertFatal (enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local), + "eNB inst is too high (%u/%d)!\n", + enb_mod_idP, + oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local); + AssertFatal (ue_mod_idP >= oai_emulation.info.first_ue_local, + "UE inst is too low (%u/%d)!\n", + ue_mod_idP, + oai_emulation.info.first_ue_local); + AssertFatal (ue_mod_idP < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local), + "UE inst is too high (%u/%d)!\n", + ue_mod_idP, + oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); + AssertFatal (rab_id < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rab_id, NB_RB_MAX); + + if (rab_id != 0) { + if (pdcp->instanciated_instance) { + LOG_D(PDCP, "[FRAME %05d][%s][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ " + "/ %d Bytes --->][PDCP][MOD %u/%u][RB %u]\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + data->pdcp_read_header.inst, + data->pdcp_read_header.rb_id, + data->pdcp_read_header.data_size, + enb_mod_idP, + ue_mod_idP, + rab_id); #ifdef OAI_NW_DRIVER_TYPE_ETHERNET - - if ((data->pdcp_read_header.traffic_type == 2) /*OAI_NW_DRV_IPV6_ADDR_TYPE_MULTICAST */ || - (data->pdcp_read_header.traffic_type == 6) /*OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST */ || - (data->pdcp_read_header.traffic_type == 7) /*OAI_NW_DRV_IPV4_ADDR_TYPE_BROADCAST */ ) - pdcp_mode = PDCP_TM; - else if ((data->pdcp_read_header.traffic_type == 1) /* OAI_NW_DRV_IPV6_ADDR_TYPE_UNICAST */ || - (data->pdcp_read_header.traffic_type == 5) /*OAI_NW_DRV_IPV4_ADDR_TYPE_UNICAST*/ ) - pdcp_mode= PDCP_DATA_PDU; - else { - pdcp_mode= PDCP_DATA_PDU; - LOG_W(PDCP,"unknown IP traffic type \n"); - } + if ((data->pdcp_read_header.traffic_type == 2) /*OAI_NW_DRV_IPV6_ADDR_TYPE_MULTICAST */ || + (data->pdcp_read_header.traffic_type == 6) /*OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST */ || + (data->pdcp_read_header.traffic_type == 7) /*OAI_NW_DRV_IPV4_ADDR_TYPE_BROADCAST */ ) + pdcp_mode = PDCP_TM; + else if ((data->pdcp_read_header.traffic_type == 1) /* OAI_NW_DRV_IPV6_ADDR_TYPE_UNICAST */ || + (data->pdcp_read_header.traffic_type == 5) /*OAI_NW_DRV_IPV4_ADDR_TYPE_UNICAST*/ ) + pdcp_mode= PDCP_DATA_PDU; + else { + pdcp_mode= PDCP_DATA_PDU; + LOG_W(PDCP,"unknown IP traffic type \n"); + } #else // NASMESH driver does not curreenlty support multicast traffic - pdcp_mode = PDCP_DATA_PDU; + pdcp_mode = PDCP_DATA_PDU; #endif - pdcp_data_req(eNB_index, - UE_index, - frame, - eNB_flag, - rab_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - data->pdcp_read_header.data_size, - data->data, - pdcp_mode); - } else { - LOG_E(PDCP, "Received packet for non-instanciated instance %u with rb_id %u, UE_index %d, eNB_flag %d eNB_index %d\n", - data->pdcp_read_header.inst, data->pdcp_read_header.rb_id, UE_index, eNB_flag,eNB_index); - } - } else if (eNB_flag) { // eNB - /* rb_id = 0, thus interpreated as broadcast and transported as - * multiple unicast is a broadcast packet, we have to send this - * packet on all default RABS of all connected UEs - */ -#warning CODE TO BE REVIEWED, ONLY WORK FOR SIMPLE TOPOLOGY CASES - for (rab_id = DEFAULT_RAB_ID; rab_id < MAX_RB; rab_id = rab_id + NB_RB_MAX) { - pdcp = &pdcp_array_eNB[eNB_index][UE_index][rab_id]; - if (pdcp->instanciated_instance) { - pdcp_data_req(eNB_index, - UE_index, - frame, - eNB_flag, - rab_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - data->pdcp_read_header.data_size, - data->data, - PDCP_DATA_PDU); - } - } - } else { - LOG_D(PDCP, "Forcing send on DEFAULT_RAB_ID\n"); - pdcp_data_req(eNB_index, - UE_index, - frame, eNB_flag, - DEFAULT_RAB_ID, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - data->pdcp_read_header.data_size, - data->data, - PDCP_DATA_PDU); - } - - free(data->data); - free(data); - data = NULL; - } - return 0; -# else + pdcp_data_req(enb_mod_idP, + ue_mod_idP, + frameP, + eNB_flagP, + rab_id, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + data->pdcp_read_header.data_size, + data->data, + pdcp_mode); + } else { + LOG_E(PDCP, "Received packet for non-instanciated instance %u with rb_id %u, UE_index %d, eNB_flagP %d eNB_index %d\n", + data->pdcp_read_header.inst, data->pdcp_read_header.rb_id, ue_mod_idP, eNB_flagP,enb_mod_idP); + } + } else if (eNB_flagP) { + /* rb_id = 0, thus interpreated as broadcast and transported as + * multiple unicast is a broadcast packet, we have to send this + * packet on all default RABS of all connected UEs + */ + for (ue_id = oai_emulation.info.first_ue_local; ue_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); ue_id++) { + pdcp = &pdcp_array_eNB[enb_mod_idP][ue_id][DEFAULT_RAB_ID]; + if (pdcp->instanciated_instance) { + pdcp_data_req( + enb_mod_idP, + ue_id, + frameP, + eNB_flagP, + DEFAULT_RAB_ID, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + data->pdcp_read_header.data_size, + data->data, + PDCP_DATA_PDU); + } + } + } else { + LOG_D(PDCP, "Forcing send on DEFAULT_RAB_ID\n"); + pdcp_data_req( + enb_mod_idP, + ue_mod_idP, + frameP, + eNB_flagP, + DEFAULT_RAB_ID, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + data->pdcp_read_header.data_size, + data->data, + PDCP_DATA_PDU); + } + free(data->data); + free(data); + data = NULL; + } + return 0; +# else /* ENABLE_PDCP_NETLINK_FIFO*/ int len = 1; rb_id_t rab_id = 0; - while (len > 0) { - len = recvmsg(nas_sock_fd, &nas_msg_rx, 0); - - if (len<=0) { - // nothing in pdcp NAS socket - //LOG_I(PDCP, "[PDCP][NETLINK] Nothing in socket, length %d \n", len); - } else { - for (nas_nlh_rx = (struct nlmsghdr *) nl_rx_buf; - NLMSG_OK (nas_nlh_rx, len); - nas_nlh_rx = NLMSG_NEXT (nas_nlh_rx, len)) { + len = recvmsg(nas_sock_fd, &nas_msg_rx, 0); + if (len<=0) { + // nothing in pdcp NAS socket + //LOG_I(PDCP, "[PDCP][NETLINK] Nothing in socket, length %d \n", len); + } else { + for (nas_nlh_rx = (struct nlmsghdr *) nl_rx_buf; + NLMSG_OK (nas_nlh_rx, len); + nas_nlh_rx = NLMSG_NEXT (nas_nlh_rx, len)) { - if (nas_nlh_rx->nlmsg_type == NLMSG_DONE) { - LOG_I(PDCP, "[PDCP][NETLINK] RX NLMSG_DONE\n"); - //return; - } + if (nas_nlh_rx->nlmsg_type == NLMSG_DONE) { + LOG_I(PDCP, "[PDCP][FIFO] RX NLMSG_DONE\n"); + //return; + } - if (nas_nlh_rx->nlmsg_type == NLMSG_ERROR) { - LOG_I(PDCP, "[PDCP][NETLINK] RX NLMSG_ERROR\n"); - } - if (pdcp_read_state == 0) { - if (nas_nlh_rx->nlmsg_len == sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)) { - pdcp_read_state = 1; //get - memcpy((void *)&pdcp_read_header, (void *)NLMSG_DATA(nas_nlh_rx), sizeof(pdcp_data_req_header_t)); - LOG_I(PDCP, "[PDCP][NETLINK] RX pdcp_data_req_header_t inst %u, rb_id %u data_size %d\n", pdcp_read_header.inst, pdcp_read_header.rb_id, pdcp_read_header.data_size); - } else { - LOG_E(PDCP, "[PDCP][NETLINK] WRONG size %d should be sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)\n", nas_nlh_rx->nlmsg_len); - } + if (nas_nlh_rx->nlmsg_type == NLMSG_ERROR) { + LOG_I(PDCP, "[PDCP][FIFO] RX NLMSG_ERROR\n"); + } + if (pdcp_read_state_g == 0) { + if (nas_nlh_rx->nlmsg_len == sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)) { + pdcp_read_state_g = 1; //get + memcpy((void *)&pdcp_read_header_g, (void *)NLMSG_DATA(nas_nlh_rx), sizeof(pdcp_data_req_header_t)); + LOG_I(PDCP, "[PDCP][FIFO] RX pdcp_data_req_header_t inst %u, rb_id %u data_size %d\n", + pdcp_read_header_g.inst, pdcp_read_header_g.rb_id, pdcp_read_header_g.data_size); } else { - pdcp_read_state = 0; - // print_active_requests() + LOG_E(PDCP, "[PDCP][FIFO] WRONG size %d should be sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)\n", + nas_nlh_rx->nlmsg_len); + } + } else { + pdcp_read_state_g = 0; + // print_active_requests() #ifdef PDCP_DEBUG - LOG_I(PDCP, "[PDCP][NETLINK] Something in socket, length %d \n", nas_nlh_rx->nlmsg_len - sizeof(struct nlmsghdr)); + LOG_I(PDCP, "[PDCP][FIFO] Something in socket, length %d \n", + nas_nlh_rx->nlmsg_len - sizeof(struct nlmsghdr)); #endif - //memcpy(pdcp_read_payload, (unsigned char *)NLMSG_DATA(nas_nlh_rx), nas_nlh_rx->nlmsg_len - sizeof(struct nlmsghdr)); - - #ifdef OAI_EMU - pdcp_read_header.inst = (pdcp_read_header.inst >= oai_emulation.info.nb_enb_local) ? \ - pdcp_read_header.inst - oai_emulation.info.nb_enb_local+ NB_eNB_INST + oai_emulation.info.first_ue_local : - pdcp_read_header.inst + oai_emulation.info.first_enb_local; - #else - pdcp_read_header.inst = 0; - #endif - - if (pdcp_read_header.rb_id != 0) { - if (pdcp_array[pdcp_read_header.inst][pdcp_read_header.rb_id%NB_RB_MAX].instanciated_instance) { + //memcpy(pdcp_read_payload, (unsigned char *)NLMSG_DATA(nas_nlh_rx), nas_nlh_rx->nlmsg_len - sizeof(struct nlmsghdr)); + + // overwrite function input parameters, because only one netlink socket for all instances + if (pdcp_read_header_g.inst < oai_emulation.info.nb_enb_local) { + eNB_flagP = 1; + ue_mod_idP = pdcp_read_header_g.rb_id / NB_RB_MAX + oai_emulation.info.first_ue_local; + enb_mod_idP = pdcp_read_header_g.inst + oai_emulation.info.first_enb_local; + rab_id = pdcp_read_header_g.rb_id % NB_RB_MAX; + } else { + eNB_flagP = 0; + ue_mod_idP = pdcp_read_header_g.inst - oai_emulation.info.nb_enb_local + oai_emulation.info.first_ue_local; + enb_mod_idP = 0; + rab_id = pdcp_read_header_g.rb_id; + } + AssertFatal (enb_mod_idP >= oai_emulation.info.first_enb_local, + "eNB inst is too low (%u/%d)!\n", + enb_mod_idP, + oai_emulation.info.first_enb_local); + AssertFatal (enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local), + "eNB inst is too high (%u/%d)!\n", + enb_mod_idP, + oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local); + AssertFatal (ue_mod_idP >= oai_emulation.info.first_ue_local, + "UE inst is too low (%u/%d)!\n", + ue_mod_idP, + oai_emulation.info.first_ue_local); + AssertFatal (ue_mod_idP < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local), + "UE inst is too high (%u/%d)!\n", + ue_mod_idP, + oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); + AssertFatal (rab_id < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rab_id, NB_RB_MAX); +#ifdef OAI_EMU + /*LGpdcp_read_header.inst = (pdcp_read_header_g.inst >= oai_emulation.info.nb_enb_local) ? \ + pdcp_read_header_g.inst - oai_emulation.info.nb_enb_local+ NB_eNB_INST + oai_emulation.info.first_ue_local : + pdcp_read_header_g.inst + oai_emulation.info.first_enb_local;*/ +#else + pdcp_read_header_g.inst = 0; +#endif + + if (eNB_flagP) { + if (rab_id != 0) { + if (pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rab_id].instanciated_instance) { #ifdef PDCP_DEBUG - LOG_I(PDCP, "[PDCP][NETLINK][IP->PDCP] TTI %d, INST %d: Received socket with length %d (nlmsg_len = %d) on Rab %d \n", - frame, pdcp_read_header.inst, len, nas_nlh_rx->nlmsg_len-sizeof(struct nlmsghdr), pdcp_read_header.rb_id); - LOG_D(PDCP, "[MSC_MSG][FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %02d][RB %02d]\n", - frame, pdcp_read_header.inst, pdcp_read_header.data_size, pdcp_read_header.inst, pdcp_read_header.rb_id); + LOG_I(PDCP, "[FRAME %5u][eNB][NETLINK][IP->PDCP] INST %d: Received socket with length %d (nlmsg_len = %d) on Rab %d \n", + frameP, + pdcp_read_header_g.inst, + len, + nas_nlh_rx->nlmsg_len-sizeof(struct nlmsghdr), + pdcp_read_header_g.rb_id); #endif - pdcp_data_req(eNB_index,UE_index,frame, eNB_flag, - pdcp_read_header.rb_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_read_header.data_size, - (unsigned char *)NLMSG_DATA(nas_nlh_rx), - PDCP_DATA_PDU); + LOG_D(PDCP, "[FRAME %5u][eNB][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB %u]\n", + frameP, + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_mod_idP, + ue_mod_idP, + rab_id); + + pdcp_data_req(enb_mod_idP,ue_mod_idP,frameP, eNB_flagP, + rab_id, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_read_header_g.data_size, + (unsigned char *)NLMSG_DATA(nas_nlh_rx), + PDCP_DATA_PDU); } else { - LOG_E(PDCP, "Received packet for non-instanciated instance %u with rb_id %u\n", - pdcp_read_header.inst, pdcp_read_header.rb_id); + LOG_D(PDCP, "[FRAME %5u][eNB][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes ---X][PDCP][MOD %u/%u][RB %u] NON INSTANCIATED INSTANCE, DROPPED\n", + frameP, + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_mod_idP, + ue_mod_idP, + rab_id); } - } else if (eNB_flag) { // rb_id =0, thus interpreated as broadcast and transported as multiple unicast + } else { // rb_id =0, thus interpreated as broadcast and transported as multiple unicast // is a broadcast packet, we have to send this packet on all default RABS of all connected UEs - #warning CODE TO BE REVIEWED, ONLY WORK FOR SIMPLE TOPOLOGY CASES - for (rab_id = DEFAULT_RAB_ID; rab_id < MAX_RB; rab_id = rab_id + NB_RB_MAX) { - if (pdcp_array[pdcp_input_header.inst][rab_id%NB_RB_MAX].instanciated_instance == (pdcp_input_header.inst + 1)) { - pdcp_data_req (eNB_index,UE_index,frame, eNB_flag, - rab_id, RLC_MUI_UNDEFINED,RLC_SDU_CONFIRM_NO, - pdcp_read_header.data_size, - (unsigned char *)NLMSG_DATA(nas_nlh_rx), - PDCP_DATA_PDU); +#warning CODE TO BE REVIEWED, ONLY WORK FOR SIMPLE TOPOLOGY CASES + for (ue_mod_idP = oai_emulation.info.first_ue_local; ue_mod_idP < oai_emulation.info.nb_ue_local; ue_mod_idP++) { + if (pdcp_array_eNB[enb_mod_idP][ue_mod_idP][rab_id].instanciated_instance > 0) { + LOG_D(PDCP, "[FRAME %5u][eNB][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB DEFAULT_RAB_ID %u]\n", + frameP, + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_mod_idP, + ue_mod_idP, + DEFAULT_RAB_ID); + pdcp_data_req ( + enb_mod_idP, + ue_mod_idP, + frameP, + eNB_flagP, + DEFAULT_RAB_ID, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_read_header_g.data_size, + (unsigned char *)NLMSG_DATA(nas_nlh_rx), + PDCP_DATA_PDU); } } - } else { - LOG_D(PDCP, "Forcing send on DEFAULT_RAB_ID\n"); - pdcp_data_req (eNB_index, - UE_index, - frame, eNB_flag, - DEFAULT_RAB_ID, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_read_header.data_size, - (unsigned char *)NLMSG_DATA(nas_nlh_rx), - PDCP_DATA_PDU); + } + } else { + if (rab_id != 0) { + if (pdcp_array_ue[ue_mod_idP][rab_id].instanciated_instance) { +#ifdef PDCP_DEBUG + LOG_I(PDCP, "[FRAME %5u][UE][NETLINK][IP->PDCP] INST %d: Received socket with length %d (nlmsg_len = %d) on Rab %d \n", + frameP, + pdcp_read_header_g.inst, + len, + nas_nlh_rx->nlmsg_len-sizeof(struct nlmsghdr), + pdcp_read_header_g.rb_id); + + LOG_D(PDCP, "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB %u]\n", + frameP, + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_mod_idP, + ue_mod_idP, + rab_id); +#endif + pdcp_data_req( + enb_mod_idP, + ue_mod_idP, + frameP, + eNB_flagP, + rab_id, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_read_header_g.data_size, + (unsigned char *)NLMSG_DATA(nas_nlh_rx), + PDCP_DATA_PDU); + } else { + LOG_D(PDCP, "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes ---X][PDCP][MOD %u/%u][RB %u] NON INSTANCIATED INSTANCE, DROPPED\n", + frameP, + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_mod_idP, + ue_mod_idP, + rab_id); + } + } else { + LOG_D(PDCP, "Forcing send on DEFAULT_RAB_ID\n"); + LOG_D(PDCP, "[FRAME %5u][eNB][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u/%u][RB DEFAULT_RAB_ID %u]\n", + frameP, + pdcp_read_header_g.inst, + pdcp_read_header_g.rb_id, + pdcp_read_header_g.data_size, + enb_mod_idP, + ue_mod_idP, + DEFAULT_RAB_ID); + pdcp_data_req ( + enb_mod_idP, + ue_mod_idP, + frameP, + eNB_flagP, + DEFAULT_RAB_ID, + RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, + pdcp_read_header_g.data_size, + (unsigned char *)NLMSG_DATA(nas_nlh_rx), + PDCP_DATA_PDU); } } + } } + } } return len; # endif @@ -600,84 +781,85 @@ int pdcp_fifo_read_input_sdus (u32_t frame, u8_t eNB_flag, u8_t UE_index, u8_t e } -void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t eNB_flag, u8 UE_index, u8 eNB_index) { - unsigned char *otg_pkt=NULL; - int src_id, module_id; // src for otg - int dst_id, rb_id; // dst for otg - int pkt_size=0, pkt_cnt=0; - u8 pdcp_mode, is_ue=0; - Packet_otg_elt * otg_pkt_info=NULL; - int result; +void pdcp_fifo_read_input_sdus_from_otg (frame_t frameP, eNB_flag_t eNB_flagP, module_id_t ue_mod_idP, module_id_t enb_mod_idP) { + unsigned char *otg_pkt=NULL; + module_id_t src_id, module_id; // src for otg + module_id_t dst_id; // dst for otg + rb_id_t rb_id; + int pkt_size=0, pkt_cnt=0; + u8 pdcp_mode, is_ue=0; + Packet_otg_elt *otg_pkt_info=NULL; + int result; - src_id = eNB_index; + src_id = enb_mod_idP; // we need to add conditions to avoid transmitting data when the UE is not RRC connected. #if defined(USER_MODE) && defined(OAI_EMU) if (oai_emulation.info.otg_enabled ==1 ){ - 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 ; - src_id = module_id; - while ((otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id]))) != NULL) { - LOG_I(OTG,"Mod_id %d Frame %d Got a packet (%p), HEAD of otg_pdcp_buffer[%d] is %p and Nb elements is %d\n", - module_id,frame, otg_pkt_info, module_id, pkt_list_get_head(&(otg_pdcp_buffer[module_id])), otg_pdcp_buffer[module_id].nb_elements); - //otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id])); - dst_id = (otg_pkt_info->otg_pkt).dst_id; - module_id = (otg_pkt_info->otg_pkt).module_id; - rb_id = (otg_pkt_info->otg_pkt).rb_id; - is_ue = (otg_pkt_info->otg_pkt).is_ue; - 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 - // 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; - pkt_size = (otg_pkt_info->otg_pkt).sdu_buffer_size; - if (otg_pkt != NULL) { - if (is_ue == 0 ) { - //rb_id = (/*NB_eNB_INST +*/ dst_id -1 ) * MAX_NUM_RB + DTCH; - LOG_D(OTG,"[eNB %d] Frame %d sending packet %d from module %d on rab id %d (src %d, dst %d) pkt size %d for pdcp mode %d\n", - eNB_index, frame, pkt_cnt++, module_id, rb_id, module_id, dst_id, pkt_size, pdcp_mode); - result = pdcp_data_req(eNB_index, UE_index, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, pkt_size, otg_pkt,pdcp_mode); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); - } - else { - //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); - result = pdcp_data_req(eNB_index, UE_index, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, pkt_size, otg_pkt, PDCP_DATA_PDU); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); - } - free(otg_pkt); - otg_pkt = NULL; + module_id = (eNB_flagP == 1) ? enb_mod_idP : ue_mod_idP; + //rb_id = (eNB_flagP == 1) ? enb_mod_idP * MAX_NUM_RB + DTCH : (NB_eNB_INST + UE_index -1 ) * MAX_NUM_RB + DTCH ; + src_id = module_id; + while ((otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id]))) != NULL) { + LOG_I(OTG,"Mod_id %d Frame %d Got a packet (%p), HEAD of otg_pdcp_buffer[%d] is %p and Nb elements is %d\n", + module_id,frameP, otg_pkt_info, module_id, pkt_list_get_head(&(otg_pdcp_buffer[module_id])), otg_pdcp_buffer[module_id].nb_elements); + //otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id])); + dst_id = (otg_pkt_info->otg_pkt).dst_id; + module_id = (otg_pkt_info->otg_pkt).module_id; + rb_id = (otg_pkt_info->otg_pkt).rb_id; + is_ue = (otg_pkt_info->otg_pkt).is_ue; + 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 + // if (mac_get_rrc_status(module_id, eNB_flagP, 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; + pkt_size = (otg_pkt_info->otg_pkt).sdu_buffer_size; + if (otg_pkt != NULL) { + if (is_ue == 0 ) { + //rb_id = (/*NB_eNB_INST +*/ dst_id -1 ) * MAX_NUM_RB + DTCH; + LOG_D(OTG,"[eNB %d] Frame %d sending packet %d from module %d on rab id %d (src %d, dst %d) pkt size %d for pdcp mode %d\n", + enb_mod_idP, frameP, pkt_cnt++, module_id, rb_id, module_id, dst_id, pkt_size, pdcp_mode); + result = pdcp_data_req(enb_mod_idP, ue_mod_idP, frameP, eNB_flagP, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, pkt_size, otg_pkt,pdcp_mode); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); + } + else { + //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_mod_idP, src_id, rb_id, src_id, dst_id, pkt_size); + result = pdcp_data_req(enb_mod_idP, ue_mod_idP, frameP, eNB_flagP, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, pkt_size, otg_pkt, PDCP_DATA_PDU); + AssertFatal (result == TRUE, "PDCP data request failed!\n"); + } + free(otg_pkt); + otg_pkt = NULL; + } + // } //else LOG_D(OTG,"frameP %d enb %d-> ue %d link not yet established state %d \n", frameP, eNB_index,dst_id - NB_eNB_INST, mac_get_rrc_status(module_id, eNB_flagP, 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 - if ((otg_enabled==1) && (eNB_flag == 1)) { // generate DL traffic - unsigned int ctime=0; - ctime = frame * 100; - - /*if ((mac_get_rrc_status(eNB_index, eNB_flag, 0 ) > 2) && - (mac_get_rrc_status(eNB_index, eNB_flag, 1 ) > 2)) { */ - for (dst_id = 0; dst_id 2) { - otg_pkt=packet_gen(src_id, dst_id, 0, ctime, &pkt_size); - if (otg_pkt != NULL){ - rb_id = dst_id * NB_RB_MAX + DTCH; - pdcp_data_req(eNB_index, dst_id, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO,pkt_size, otg_pkt, PDCP_DATA_PDU); - LOG_I(OTG,"send packet from module %d on rab id %d (src %d, dst %d) pkt size %d\n", eNB_index, rb_id, src_id, dst_id, pkt_size); - free(otg_pkt); - } - /*else { + if ((otg_enabled==1) && (eNB_flagP == 1)) { // generate DL traffic + unsigned int ctime=0; + ctime = frameP * 100; + + /*if ((mac_get_rrc_status(eNB_index, eNB_flagP, 0 ) > 2) && + (mac_get_rrc_status(eNB_index, eNB_flagP, 1 ) > 2)) { */ + for (dst_id = 0; dst_id 2) { + otg_pkt=packet_gen(src_id, dst_id, 0, ctime, &pkt_size); + if (otg_pkt != NULL){ + rb_id = dst_id * NB_RB_MAX + DTCH; + pdcp_data_req(enb_mod_idP, dst_id, frameP, eNB_flagP, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO,pkt_size, otg_pkt, PDCP_DATA_PDU); + LOG_I(OTG,"send packet from module %d on rab id %d (src %d, dst %d) pkt size %d\n", enb_mod_idP, rb_id, src_id, dst_id, pkt_size); + free(otg_pkt); + } + /*else { LOG_I(OTG,"nothing generated (src %d, dst %d)\n",src_id, dst_id); }*/ - } - /*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 )); + } + /*else { + LOG_I(OTG,"rrc_status (src %d, dst %d) = %d\n",src_id, dst_id, mac_get_rrc_status(src_id, eNB_flagP, dst_id )); }*/ - } + } } #endif } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c index b8b131634f..72eebe92f6 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c @@ -25,18 +25,18 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ /*! \file pdcp_netlink.c -* \brief pdcp communication with linux IP interface, -* have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink. -* Read operation from netlink should be achieved in an asynchronous way to avoid -* subframe overload, netlink congestion... -* \author Sebastien ROUX -* \date 2013 -* \version 0.1 -* @ingroup pdcp -*/ + * \brief pdcp communication with linux IP interface, + * have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink. + * Read operation from netlink should be achieved in an asynchronous way to avoid + * subframe overload, netlink congestion... + * \author Sebastien ROUX + * \date 2013 + * \version 0.1 + * @ingroup pdcp + */ #include #include @@ -81,163 +81,199 @@ static pthread_t pdcp_netlink_thread; * and the corresponding entity in User-space. * one queue for eNBs (index 0)/one queue for UEs (index 1) */ -static struct lfds611_queue_state **pdcp_netlink_queue = NULL; -static uint32_t *pdcp_netlink_nb_element = NULL; +static struct lfds611_queue_state **pdcp_netlink_queue_enb = NULL; +static struct lfds611_queue_state **pdcp_netlink_queue_ue = NULL; +static uint32_t *pdcp_netlink_nb_element_enb = NULL; +static uint32_t *pdcp_netlink_nb_element_ue = NULL; static void *pdcp_netlink_thread_fct(void *arg); int pdcp_netlink_init(void) { - int i, nb_modules; - pthread_attr_t attr; - struct sched_param sched_param; + int i; + int nb_inst_enb; + int nb_inst_ue; + pthread_attr_t attr; + struct sched_param sched_param; #if defined(USER_MODE) && defined(OAI_EMU) - nb_modules = NB_eNB_INST + NB_UE_INST; + nb_inst_enb = oai_emulation.info.nb_enb_local; + nb_inst_ue = oai_emulation.info.nb_ue_local; #else - nb_modules = 1; + nb_inst_enb = 1; + nb_inst_ue = 1; #endif - pdcp_netlink_queue = calloc(nb_modules, sizeof(struct lfds611_queue_state*)); - pdcp_netlink_nb_element = malloc(nb_modules * sizeof(uint32_t)); - - LOG_I(PDCP, "Creating %d queues for Netlink -> PDCP communication\n", - nb_modules); - - for (i = 0; i < nb_modules; i++) { - pdcp_netlink_nb_element[i] = 0; - if (lfds611_queue_new(&pdcp_netlink_queue[i], PDCP_QUEUE_NB_ELEMENTS) < 0) { - LOG_E(PDCP, "Failed to create new FIFO for Netlink -> PDCP communcation instance %d\n", i); - exit(EXIT_FAILURE); - } - } - - if (pthread_attr_init(&attr) != 0) { - LOG_E(PDCP, "Failed to initialize pthread attribute for Netlink -> PDCP communication (%d:%s)\n", - errno, strerror(errno)); - exit(EXIT_FAILURE); - } - - sched_param.sched_priority = 10; - - pthread_attr_setschedpolicy(&attr, SCHED_RR); - pthread_attr_setschedparam(&attr, &sched_param); - - /* Create one thread that fetchs packets from the netlink. - * When the netlink fifo is full, packets are silently dropped, this behaviour - * should be avoided if we want a reliable link. - */ - if (pthread_create(&pdcp_netlink_thread, &attr, pdcp_netlink_thread_fct, NULL) != 0) { - LOG_E(PDCP, "Failed to create new thread for Netlink/PDCP communcation (%d:%s)\n", - errno, strerror(errno)); - exit(EXIT_FAILURE); - } - - return 0; + pdcp_netlink_queue_enb = calloc(nb_inst_enb, sizeof(struct lfds611_queue_state*)); + pdcp_netlink_nb_element_enb = malloc(nb_inst_enb * sizeof(uint32_t)); + + pdcp_netlink_queue_ue = calloc(nb_inst_ue, sizeof(struct lfds611_queue_state*)); + pdcp_netlink_nb_element_ue = malloc(nb_inst_ue * sizeof(uint32_t)); + + LOG_I(PDCP, "Creating %d queues for eNB Netlink -> PDCP communication\n", nb_inst_enb); + LOG_I(PDCP, "Creating %d queues for UE Netlink -> PDCP communication\n", nb_inst_ue); + + for (i = 0; i < nb_inst_enb; i++) { + pdcp_netlink_nb_element_enb[i] = 0; + if (lfds611_queue_new(&pdcp_netlink_queue_enb[i], PDCP_QUEUE_NB_ELEMENTS) < 0) { + LOG_E(PDCP, "Failed to create new FIFO for eNB Netlink -> PDCP communcation instance %d\n", i); + exit(EXIT_FAILURE); + } + } + for (i = 0; i < nb_inst_ue; i++) { + pdcp_netlink_nb_element_ue[i] = 0; + if (lfds611_queue_new(&pdcp_netlink_queue_ue[i], PDCP_QUEUE_NB_ELEMENTS) < 0) { + LOG_E(PDCP, "Failed to create new FIFO for UE Netlink -> PDCP communcation instance %d\n", i); + exit(EXIT_FAILURE); + } + } + + if (pthread_attr_init(&attr) != 0) { + LOG_E(PDCP, "Failed to initialize pthread attribute for Netlink -> PDCP communication (%d:%s)\n", + errno, strerror(errno)); + exit(EXIT_FAILURE); + } + + sched_param.sched_priority = 10; + + pthread_attr_setschedpolicy(&attr, SCHED_RR); + pthread_attr_setschedparam(&attr, &sched_param); + + /* Create one thread that fetchs packets from the netlink. + * When the netlink fifo is full, packets are silently dropped, this behaviour + * should be avoided if we want a reliable link. + */ + if (pthread_create(&pdcp_netlink_thread, &attr, pdcp_netlink_thread_fct, NULL) != 0) { + LOG_E(PDCP, "Failed to create new thread for Netlink/PDCP communcation (%d:%s)\n", + errno, strerror(errno)); + exit(EXIT_FAILURE); + } + + return 0; } -int pdcp_netlink_dequeue_element(uint8_t eNB_flag, uint8_t UE_index, uint8_t eNB_index, - struct pdcp_netlink_element_s **data) +int pdcp_netlink_dequeue_element( + module_id_t enb_mod_idP, + module_id_t ue_mod_idP, + eNB_flag_t eNB_flagP, + struct pdcp_netlink_element_s **data_ppP) { - int ret = 0; - module_id_t module_id; - -#if defined(USER_MODE) && defined(OAI_EMU) - module_id = (eNB_flag != 0) ? eNB_index : NB_eNB_INST + UE_index; -#else - module_id = 0; -#endif - - ret = lfds611_queue_dequeue(pdcp_netlink_queue[module_id], (void **)data); - - if (ret != 0) { - LOG_D(PDCP, "De-queueing packet for module %d\n", module_id); - } - return ret; + int ret = 0; + + if (eNB_flagP) { + ret = lfds611_queue_dequeue(pdcp_netlink_queue_enb[enb_mod_idP], (void **)data_ppP); + if (ret != 0) { + LOG_D(PDCP, "De-queueing packet for eNB instance %d\n", enb_mod_idP); + } + } else { + ret = lfds611_queue_dequeue(pdcp_netlink_queue_ue[ue_mod_idP], (void **)data_ppP); + if (ret != 0) { + LOG_D(PDCP, "De-queueing packet for UE instance %d\n", ue_mod_idP); + } + } + + return ret; } static void *pdcp_netlink_thread_fct(void *arg) { - int len; - struct pdcp_netlink_element_s *new_data = NULL; - uint8_t pdcp_read_state; - - pdcp_read_state = 0; - memset(nl_rx_buf, 0, NL_MAX_PAYLOAD); - - while (1) { - - len = recvmsg(nas_sock_fd, &nas_msg_rx, 0); - - if (len == 0) { - /* Other peer (kernel) has performed an orderly shutdown - */ - LOG_E(PDCP, "Kernel module has closed the netlink\n"); - exit(EXIT_FAILURE); - } else if (len < 0) { - /* There was an error */ - LOG_E(PDCP, "An error occured while reading netlink (%d:%s)\n", - errno, strerror(errno)); - exit(EXIT_FAILURE); - } else { - /* Normal read. - * NOTE: netlink messages can be assembled to form a multipart message - */ - for (nas_nlh_rx = (struct nlmsghdr *) nl_rx_buf; - NLMSG_OK(nas_nlh_rx, len); - nas_nlh_rx = NLMSG_NEXT (nas_nlh_rx, len)) { - - /* There is no need to check for nlmsg_type because - * the header is not set in our drivers. - */ - if (pdcp_read_state == 0) { - new_data = malloc(sizeof(struct pdcp_netlink_element_s)); - - if (nas_nlh_rx->nlmsg_len == sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)) { - pdcp_read_state = 1; - memcpy((void *)&new_data->pdcp_read_header, (void *)NLMSG_DATA(nas_nlh_rx), sizeof(pdcp_data_req_header_t)); - LOG_I(PDCP, "[NETLINK] RX pdcp_data_req_header_t inst %u, " - "rb_id %u data_size %d\n", - new_data->pdcp_read_header.inst, new_data->pdcp_read_header.rb_id, - new_data->pdcp_read_header.data_size); - } else { - LOG_E(PDCP, "[NETLINK] WRONG size %d should be sizeof " - "%d ((pdcp_data_req_header_t) + sizeof(struct nlmsghdr))\n", - nas_nlh_rx->nlmsg_len, sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)); - } - } else { - pdcp_read_state = 0; + int len = 0; + struct pdcp_netlink_element_s *new_data_p = NULL; + uint8_t pdcp_thread_read_state ; + eNB_flag_t eNB_flag = 0; + + pdcp_thread_read_state = 0; + memset(nl_rx_buf, 0, NL_MAX_PAYLOAD); + + while (1) { + + len = recvmsg(nas_sock_fd, &nas_msg_rx, 0); + + if (len == 0) { + /* Other peer (kernel) has performed an orderly shutdown + */ + LOG_E(PDCP, "[NETLINK_THREAD] Kernel module has closed the netlink\n"); + exit(EXIT_FAILURE); + } else if (len < 0) { + /* There was an error */ + LOG_E(PDCP, "[NETLINK_THREAD] An error occured while reading netlink (%d:%s)\n", + errno, strerror(errno)); + exit(EXIT_FAILURE); + } else { + /* Normal read. + * NOTE: netlink messages can be assembled to form a multipart message + */ + for (nas_nlh_rx = (struct nlmsghdr *) nl_rx_buf; + NLMSG_OK(nas_nlh_rx, len); + nas_nlh_rx = NLMSG_NEXT (nas_nlh_rx, len)) { + + /* There is no need to check for nlmsg_type because + * the header is not set in our drivers. + */ + if (pdcp_thread_read_state == 0) { + new_data_p = malloc(sizeof(struct pdcp_netlink_element_s)); + + if (nas_nlh_rx->nlmsg_len == sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)) { + pdcp_thread_read_state = 1; + memcpy((void *)&new_data_p->pdcp_read_header, (void *)NLMSG_DATA(nas_nlh_rx), sizeof(pdcp_data_req_header_t)); + LOG_I(PDCP, "[NETLINK_THREAD] RX pdcp_data_req_header_t inst %u, " + "rb_id %u data_size %d\n", + new_data_p->pdcp_read_header.inst, + new_data_p->pdcp_read_header.rb_id, + new_data_p->pdcp_read_header.data_size); + } else { + LOG_E(PDCP, "[NETLINK_THREAD] WRONG size %d should be sizeof " + "%d ((pdcp_data_req_header_t) + sizeof(struct nlmsghdr))\n", + nas_nlh_rx->nlmsg_len, + sizeof (pdcp_data_req_header_t) + sizeof(struct nlmsghdr)); + } + } else { + pdcp_thread_read_state = 0; #ifdef OAI_EMU - if (new_data->pdcp_read_header.inst >= oai_emulation.info.nb_enb_local) { - new_data->pdcp_read_header.inst = new_data->pdcp_read_header.inst - - oai_emulation.info.nb_enb_local + NB_eNB_INST - + oai_emulation.info.first_ue_local; - } else { - new_data->pdcp_read_header.inst = new_data->pdcp_read_header.inst - + oai_emulation.info.first_enb_local; - } + if (new_data_p->pdcp_read_header.inst >= oai_emulation.info.nb_enb_local) { + new_data_p->pdcp_read_header.inst = new_data_p->pdcp_read_header.inst + - oai_emulation.info.nb_enb_local + + + oai_emulation.info.first_ue_local; + eNB_flag = 0; + } else { + new_data_p->pdcp_read_header.inst = new_data_p->pdcp_read_header.inst + + oai_emulation.info.first_enb_local; + eNB_flag = 1; + } #else - new_data->pdcp_read_header.inst = 0; + new_data_p->pdcp_read_header.inst = 0; #endif - new_data->data = malloc(sizeof(uint8_t) * new_data->pdcp_read_header.data_size); - /* Copy the data */ - memcpy(new_data->data, NLMSG_DATA(nas_nlh_rx), new_data->pdcp_read_header.data_size); - - if (pdcp_netlink_nb_element[new_data->pdcp_read_header.inst] - > PDCP_QUEUE_NB_ELEMENTS) { - LOG_E(PDCP, "[Mod %02x] We reached maximum number of elements in pdcp queue (%d)\n", - new_data->pdcp_read_header.inst, pdcp_netlink_nb_element); - } - - LOG_D(PDCP, "En-queueing packet for module %d\n", new_data->pdcp_read_header.inst); - - /* Enqueue the element in the right queue */ -// lfds611_queue_enqueue(pdcp_netlink_queue[new_data->pdcp_read_header.inst], new_data); - lfds611_queue_guaranteed_enqueue(pdcp_netlink_queue[new_data->pdcp_read_header.inst], new_data); - } - } - } - } - return NULL; + new_data_p->data = malloc(sizeof(uint8_t) * new_data_p->pdcp_read_header.data_size); + /* Copy the data */ + memcpy(new_data_p->data, NLMSG_DATA(nas_nlh_rx), new_data_p->pdcp_read_header.data_size); + + if (eNB_flag) { + if (pdcp_netlink_nb_element_enb[new_data_p->pdcp_read_header.inst] + > PDCP_QUEUE_NB_ELEMENTS) { + LOG_E(PDCP, "[NETLINK_THREAD][Inst %02x] We reached maximum number of elements in eNB pdcp queue (%d)\n", + new_data_p->pdcp_read_header.inst, pdcp_netlink_nb_element_enb); + } + + LOG_D(PDCP, "[NETLINK_THREAD] En-queueing packet for eNB instance %d\n", new_data_p->pdcp_read_header.inst); + + /* Enqueue the element in the right queue */ + lfds611_queue_guaranteed_enqueue(pdcp_netlink_queue_enb[new_data_p->pdcp_read_header.inst], new_data_p); + } else { + if (pdcp_netlink_nb_element_ue[new_data_p->pdcp_read_header.inst] + > PDCP_QUEUE_NB_ELEMENTS) { + LOG_E(PDCP, "[NETLINK_THREAD][Inst %02x] We reached maximum number of elements in UE pdcp queue (%d)\n", + new_data_p->pdcp_read_header.inst, pdcp_netlink_nb_element_ue); + } + + LOG_D(PDCP, "[NETLINK_THREAD] En-queueing packet for UE instance %d\n", new_data_p->pdcp_read_header.inst); + + /* Enqueue the element in the right queue */ + lfds611_queue_guaranteed_enqueue(pdcp_netlink_queue_ue[new_data_p->pdcp_read_header.inst], new_data_p); + } + } + } + } + } + return NULL; } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h index 54d762ed9f..9d5505e20b 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -153,11 +153,11 @@ BOOL pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_b BOOL pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, \ u8 bitmap[512], pdcp_control_pdu_for_pdcp_status_report* pdu); -int pdcp_netlink_dequeue_element(uint8_t eNB_flag, uint8_t UE_index, uint8_t eNB_index, - struct pdcp_netlink_element_s **data); +int pdcp_netlink_dequeue_element(module_id_t enb_mod_idP, module_id_t ue_mod_idP, eNB_flag_t eNB_flagP, + struct pdcp_netlink_element_s **data_ppP); -void pdcp_config_set_security(pdcp_t *pdcp, u8 eNB_id, u8 UE_id, u32 frame, u8 eNB_flag, rb_id_t rb_id, - u16 lc_id, u8 security_mode, u8 *kRRCenc, u8 *kRRCint, u8 *kUPenc); +void pdcp_config_set_security(pdcp_t *pdcp_pP, module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t frameP, eNB_flag_t eNB_flagP, rb_id_t rb_idP, + u16 lc_idP, u8 security_modeP, u8 *kRRCenc_pP, u8 *kRRCint_pP, u8 *kUPenc_pP); #if defined(ENABLE_SECURITY) int pdcp_apply_security(pdcp_t *pdcp_entity, rb_id_t rb_id, diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index 2dc0b924e7..2fe2960e56 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -87,12 +87,15 @@ void util_flush_hex_octets(comp_name_t component, unsigned char* data, unsigned LOG_W(component, "Incoming buffer is NULL! Ignoring...\n"); return; } + printf("[PDCP]"); unsigned long octet_index = 0; for (octet_index = 0; octet_index < size; ++octet_index) { - LOG_T(component, "%02x.", data[octet_index]); + //LOG_T(component, "%02x.", data[octet_index]); + printf("%02x.", data[octet_index]); } - LOG_T(component, " \n"); + //LOG_T(component, " \n"); + printf(" \n"); } /* diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c index ba9d0a9a42..d3d724f773 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -35,6 +35,7 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis #if defined(ENABLE_ITTI) # include "intertask_interface.h" #endif +# include "assertions.h" #include "rlc_am.h" #include "rlc_am_segment.h" #include "rlc_am_timer_poll_retransmit.h" @@ -56,7 +57,7 @@ extern rlc_am_control_pdu_info_t g_rlc_am_control_pdu_info; //----------------------------------------------------------------------------- u32_t -rlc_am_get_buffer_occupancy_in_bytes (rlc_am_entity_t *rlc_pP,u32 frameP) +rlc_am_get_buffer_occupancy_in_bytes (rlc_am_entity_t *rlc_pP,frame_t frameP) { //----------------------------------------------------------------------------- u32_t max_li_overhead; @@ -67,7 +68,7 @@ rlc_am_get_buffer_occupancy_in_bytes (rlc_am_entity_t *rlc_pP,u32 frameP) if (rlc_pP->t_status_prohibit.running == 0) { #ifdef TRACE_RLC_AM_BO if (((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3) > 0) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] BO : CONTROL PDU %d bytes \n", frameP, rlc_pP->module_id, rlc_pP->rb_id, ((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3)); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] BO : CONTROL PDU %d bytes \n", frameP, rlc_pP->module_id, rlc_pP->rb_id, ((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3)); } #endif return ((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3); @@ -89,9 +90,9 @@ rlc_am_get_buffer_occupancy_in_bytes (rlc_am_entity_t *rlc_pP,u32 frameP) #ifdef TRACE_RLC_AM_BO if ((rlc_pP->status_buffer_occupancy + rlc_pP->retransmission_buffer_occupancy + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead) > 0) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] BO : STATUS BUFFER %d bytes \n", frameP, rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->status_buffer_occupancy); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] BO : RETRANS BUFFER %d bytes \n", frameP, rlc_pP->module_id,rlc_pP->rb_id, rlc_pP->retransmission_buffer_occupancy); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] BO : SDU BUFFER %d bytes + li_overhead %d bytes header_overhead %d bytes (nb sdu not segmented %d)\n", frameP, rlc_pP->module_id,rlc_pP->rb_id, rlc_pP->sdu_buffer_occupancy, max_li_overhead, header_overhead, rlc_pP->nb_sdu_no_segmented); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] BO : STATUS BUFFER %d bytes \n", frameP, rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->status_buffer_occupancy); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] BO : RETRANS BUFFER %d bytes \n", frameP, rlc_pP->module_id,rlc_pP->rb_id, rlc_pP->retransmission_buffer_occupancy); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] BO : SDU BUFFER %d bytes + li_overhead %d bytes header_overhead %d bytes (nb sdu not segmented %d)\n", frameP, rlc_pP->module_id,rlc_pP->rb_id, rlc_pP->sdu_buffer_occupancy, max_li_overhead, header_overhead, rlc_pP->nb_sdu_no_segmented); } #endif return rlc_pP->status_buffer_occupancy + rlc_pP->retransmission_buffer_occupancy + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead; @@ -103,31 +104,46 @@ void rlc_am_release (rlc_am_entity_t *rlc_pP) } //----------------------------------------------------------------------------- -void config_req_rlc_am (rlc_am_entity_t *rlc_pP, u32_t frameP, u8_t eNB_flagP, module_id_t module_idP, rlc_am_info_t * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP) +void config_req_rlc_am (frame_t frameP, + eNB_flag_t eNB_flagP, + module_id_t enb_module_idP, + module_id_t ue_module_idP, + rlc_am_info_t *config_am_pP, + rb_id_t rb_idP, + rb_type_t rb_typeP) { //----------------------------------------------------------------------------- - LOG_D(RLC, "[MSC_MSG][FRAME %05d][RRC_%s][MOD %02d][][--- CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d) --->][RLC_AM][MOD %02d][RB %02d]\n", + rlc_am_entity_t *rlc = NULL; + + LOG_D(RLC, "[FRAME %5u][%s][RRC][MOD %u/%u][][--- CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d) --->][RLC_AM][MOD %u/%u][RB %u]\n", frameP, - ( Mac_rlc_xface->Is_cluster_head[module_idP] == 1) ? "eNB":"UE", - module_idP, - config_amP->max_retx_threshold, - config_amP->poll_pdu, - config_amP->poll_byte, - config_amP->t_poll_retransmit, - config_amP->t_reordering, - config_amP->t_status_prohibit, - module_idP, + ( eNB_flagP > 0) ? "eNB":"UE", + enb_module_idP, + ue_module_idP, + config_am_pP->max_retx_threshold, + config_am_pP->poll_pdu, + config_am_pP->poll_byte, + config_am_pP->t_poll_retransmit, + config_am_pP->t_reordering, + config_am_pP->t_status_prohibit, + enb_module_idP, + ue_module_idP, rb_idP); - rlc_am_init(rlc_pP,frameP); - rlc_am_set_debug_infos(rlc_pP, frameP, eNB_flagP, module_idP, rb_idP, rb_typeP); - rlc_am_configure(rlc_pP,frameP, - config_amP->max_retx_threshold, - config_amP->poll_pdu, - config_amP->poll_byte, - config_amP->t_poll_retransmit, - config_amP->t_reordering, - config_amP->t_status_prohibit); + if (eNB_flagP) { + rlc = &rlc_array_eNB[enb_module_idP][ue_module_idP][rb_idP].rlc.am; + } else { + rlc = &rlc_array_ue[ue_module_idP][rb_idP].rlc.am; + } + rlc_am_init(rlc,frameP); + rlc_am_set_debug_infos(rlc, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP); + rlc_am_configure(rlc,frameP, + config_am_pP->max_retx_threshold, + config_am_pP->poll_pdu, + config_am_pP->poll_byte, + config_am_pP->t_poll_retransmit, + config_am_pP->t_reordering, + config_am_pP->t_status_prohibit); } u32_t pollPDU_tab[PollPDU_pInfinity+1]={4,8,16,32,64,128,256,1024}; // What is PollPDU_pInfinity??? 1024 for now @@ -138,54 +154,70 @@ u32_t am_t_Reordering_tab[T_Reordering_spare1]={0,5,10,15,20,25,30,35,40,45,50,5 u32_t t_StatusProhibit_tab[T_StatusProhibit_spare8]={0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,300,350,400,450,500}; //----------------------------------------------------------------------------- -void config_req_rlc_am_asn1 (rlc_am_entity_t *rlc_pP, u32_t frameP, u8_t eNB_flagP, module_id_t module_idP, struct RLC_Config__am * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP) +void config_req_rlc_am_asn1 (frame_t frameP, + eNB_flag_t eNB_flagP, + module_id_t enb_module_idP, + module_id_t ue_module_idP, + struct RLC_Config__am *config_am_pP, + rb_id_t rb_idP, + rb_type_t rb_typeP) { //----------------------------------------------------------------------------- - if ( (config_amP->ul_AM_RLC.maxRetxThreshold <= UL_AM_RLC__maxRetxThreshold_t32) && - (config_amP->ul_AM_RLC.pollPDU<=PollPDU_pInfinity) && - (config_amP->ul_AM_RLC.pollByteul_AM_RLC.t_PollRetransmitdl_AM_RLC.t_Reorderingdl_AM_RLC.t_StatusProhibit][RLC_AM][MOD %02d][RB %02d]\n", - frameP, - ( Mac_rlc_xface->Is_cluster_head[module_idP] == 1) ? "eNB":"UE", - module_idP, - maxRetxThreshold_tab[config_amP->ul_AM_RLC.maxRetxThreshold], - pollPDU_tab[config_amP->ul_AM_RLC.pollPDU], - pollByte_tab[config_amP->ul_AM_RLC.pollByte], - PollRetransmit_tab[config_amP->ul_AM_RLC.t_PollRetransmit], - am_t_Reordering_tab[config_amP->dl_AM_RLC.t_Reordering], - t_StatusProhibit_tab[config_amP->dl_AM_RLC.t_StatusProhibit], - module_idP, - rb_idP); - - rlc_am_init(rlc_pP,frameP); - rlc_am_set_debug_infos(rlc_pP, frameP, eNB_flagP, module_idP, rb_idP, rb_typeP); - rlc_am_configure(rlc_pP,frameP, - maxRetxThreshold_tab[config_amP->ul_AM_RLC.maxRetxThreshold], - pollPDU_tab[config_amP->ul_AM_RLC.pollPDU], - pollByte_tab[config_amP->ul_AM_RLC.pollByte], - PollRetransmit_tab[config_amP->ul_AM_RLC.t_PollRetransmit], - am_t_Reordering_tab[config_amP->dl_AM_RLC.t_Reordering], - t_StatusProhibit_tab[config_amP->dl_AM_RLC.t_StatusProhibit]); + rlc_am_entity_t *rlc = NULL; + + if (eNB_flagP) { + rlc = &rlc_array_eNB[enb_module_idP][ue_module_idP][rb_idP].rlc.am; + } else { + rlc = &rlc_array_ue[ue_module_idP][rb_idP].rlc.am; + } + if ((config_am_pP->ul_AM_RLC.maxRetxThreshold <= UL_AM_RLC__maxRetxThreshold_t32) && + (config_am_pP->ul_AM_RLC.pollPDU<=PollPDU_pInfinity) && + (config_am_pP->ul_AM_RLC.pollByteul_AM_RLC.t_PollRetransmitdl_AM_RLC.t_Reorderingdl_AM_RLC.t_StatusProhibit][RLC_AM][MOD %u/%u][RB %u]\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + enb_module_idP, + ue_module_idP, + maxRetxThreshold_tab[config_am_pP->ul_AM_RLC.maxRetxThreshold], + pollPDU_tab[config_am_pP->ul_AM_RLC.pollPDU], + pollByte_tab[config_am_pP->ul_AM_RLC.pollByte], + PollRetransmit_tab[config_am_pP->ul_AM_RLC.t_PollRetransmit], + am_t_Reordering_tab[config_am_pP->dl_AM_RLC.t_Reordering], + t_StatusProhibit_tab[config_am_pP->dl_AM_RLC.t_StatusProhibit], + enb_module_idP, + ue_module_idP, + rb_idP); - } - else { - LOG_D(RLC, "[MSC_MSG][FRAME %05d][RRC_%s][MOD %02d][][--- ILLEGAL CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d) --->][RLC_AM][MOD %02d][RB %02d], RLC-AM NOT CONFIGURED\n", - frameP, - ( Mac_rlc_xface->Is_cluster_head[module_idP] == 1) ? "eNB":"UE", - module_idP, - config_amP->ul_AM_RLC.maxRetxThreshold, - config_amP->ul_AM_RLC.pollPDU, - config_amP->ul_AM_RLC.pollByte, - config_amP->ul_AM_RLC.t_PollRetransmit, - config_amP->dl_AM_RLC.t_Reordering, - config_amP->dl_AM_RLC.t_StatusProhibit, - module_idP, - rb_idP); - } + rlc_am_init(rlc,frameP); + rlc_am_set_debug_infos(rlc, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP); + rlc_am_configure(rlc, + frameP, + maxRetxThreshold_tab[config_am_pP->ul_AM_RLC.maxRetxThreshold], + pollPDU_tab[config_am_pP->ul_AM_RLC.pollPDU], + pollByte_tab[config_am_pP->ul_AM_RLC.pollByte], + PollRetransmit_tab[config_am_pP->ul_AM_RLC.t_PollRetransmit], + am_t_Reordering_tab[config_am_pP->dl_AM_RLC.t_Reordering], + t_StatusProhibit_tab[config_am_pP->dl_AM_RLC.t_StatusProhibit]); + } else { + LOG_D(RLC, "[FRAME %5u][%s][RRC][MOD %u/%u][][--- ILLEGAL CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d) --->][RLC_AM][MOD %u/%u][RB %u], RLC-AM NOT CONFIGURED\n", + frameP, + (eNB_flagP) ? "eNB" : "UE", + enb_module_idP, + ue_module_idP, + config_am_pP->ul_AM_RLC.maxRetxThreshold, + config_am_pP->ul_AM_RLC.pollPDU, + config_am_pP->ul_AM_RLC.pollByte, + config_am_pP->ul_AM_RLC.t_PollRetransmit, + config_am_pP->dl_AM_RLC.t_Reordering, + config_am_pP->dl_AM_RLC.t_StatusProhibit, + enb_module_idP, + ue_module_idP, + rb_idP); + } } //----------------------------------------------------------------------------- @@ -250,7 +282,7 @@ void rlc_am_stat_req (rlc_am_entity_t *rlc_pP, } //----------------------------------------------------------------------------- void -rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) +rlc_am_get_pdus (rlc_am_entity_t *rlc_pP, frame_t frameP) { //----------------------------------------------------------------------------- int display_flag = 0; @@ -291,7 +323,13 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) } } else { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] DELAYED SENT STATUS PDU BECAUSE T-STATUS-PROHIBIT RUNNING (TIME-OUT FRAME %05d)\n",frameP, rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->t_status_prohibit.frame_time_out); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] DELAYED SENT STATUS PDU BECAUSE T-STATUS-PROHIBIT RUNNING (TIME-OUT FRAME %5u)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->t_status_prohibit.frame_time_out); } } /*while ((rlc_pP->nb_bytes_requested_by_mac > 0) && (stay_on_this_list)) { @@ -300,7 +338,7 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) if ( ((rlc_am_tx_control_pdu_management_t*)(pdu->data))->size <= rlc_pP->nb_bytes_requested_by_mac) { pdu = list_remove_head(&rlc_pP->control_pdu_list); #ifdef TRACE_RLC_AM_TX - msg ("[FRAME %05d][RLC_AM][MOD %02d][RB %02d] SEND CONTROL PDU\n", ((rlc_am_entity_t *) rlc_pP)->module_id,((rlc_am_entity_t *) rlc_pP)->rb_id, frameP); + msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] SEND CONTROL PDU\n", ((rlc_am_entity_t *) rlc_pP)->module_id,((rlc_am_entity_t *) rlc_pP)->rb_id, frameP); #endif list_add_tail_eurecom (pdu, &rlc_pP->pdus_to_mac_layer); rlc_pP->nb_bytes_requested_by_mac = rlc_pP->nb_bytes_requested_by_mac - ((rlc_am_tx_control_pdu_management_t*)(pdu->data))->size; @@ -323,7 +361,14 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) if ((tx_data_pdu_management->header_and_payload_size <= rlc_pP->nb_bytes_requested_by_mac) && (tx_data_pdu_management->retx_count >= 0) && (tx_data_pdu_management->nack_so_start == 0) && (tx_data_pdu_management->nack_so_stop == 0x7FFF)) { mem_block_t* copy = rlc_am_retransmit_get_copy(rlc_pP, frameP,rlc_pP->first_retrans_pdu_sn); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] RE-SEND DATA PDU SN %04d %d BYTES\n",frameP, rlc_pP->module_id,rlc_pP->rb_id, rlc_pP->first_retrans_pdu_sn, tx_data_pdu_management->header_and_payload_size); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RE-SEND DATA PDU SN %04d %d BYTES\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->first_retrans_pdu_sn, + tx_data_pdu_management->header_and_payload_size); rlc_pP->stat_tx_data_pdu += 1; rlc_pP->stat_tx_retransmit_pdu += 1; rlc_pP->stat_tx_retransmit_pdu_by_status += 1; @@ -337,7 +382,12 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) tx_data_pdu_management->retx_count += 1; return; } else if ((tx_data_pdu_management->retx_count >= 0) && (rlc_pP->nb_bytes_requested_by_mac >= RLC_AM_MIN_SEGMENT_SIZE_REQUEST)) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] SEND SEGMENT OF DATA PDU SN %04d MAC BYTES %d SIZE %d RTX COUNT %d nack_so_start %d nack_so_stop %04X(hex)\n", frameP, rlc_pP->module_id,rlc_pP->rb_id, + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] SEND SEGMENT OF DATA PDU SN %04d MAC BYTES %d SIZE %d RTX COUNT %d nack_so_start %d nack_so_stop %04X(hex)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, rlc_pP->first_retrans_pdu_sn, rlc_pP->nb_bytes_requested_by_mac, tx_data_pdu_management->header_and_payload_size, @@ -346,7 +396,15 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) tx_data_pdu_management->nack_so_stop); mem_block_t* copy = rlc_am_retransmit_get_subsegment(rlc_pP, frameP, rlc_pP->first_retrans_pdu_sn, &rlc_pP->nb_bytes_requested_by_mac); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] SEND SEGMENT OF DATA PDU SN %04d (NEW SO %05d)\n", frameP, rlc_pP->module_id,rlc_pP->rb_id, rlc_pP->first_retrans_pdu_sn, tx_data_pdu_management->nack_so_start); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] SEND SEGMENT OF DATA PDU SN %04d (NEW SO %05d)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->first_retrans_pdu_sn, + tx_data_pdu_management->nack_so_start); + rlc_pP->stat_tx_data_pdu += 1; rlc_pP->stat_tx_retransmit_pdu += 1; rlc_pP->stat_tx_retransmit_pdu_by_status += 1; @@ -361,7 +419,13 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) while ((rlc_pP->first_retrans_pdu_sn != rlc_pP->vt_s) && (!(rlc_pP->pdu_retrans_buffer[rlc_pP->first_retrans_pdu_sn].flags.retransmit))) { rlc_pP->first_retrans_pdu_sn = (rlc_pP->first_retrans_pdu_sn+1) & RLC_AM_SN_MASK; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] UPDATED first_retrans_pdu_sn SN %04d\n", frameP, rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->first_retrans_pdu_sn); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] UPDATED first_retrans_pdu_sn SN %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->first_retrans_pdu_sn); }; display_flag = 1; @@ -369,17 +433,28 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) // no more pdu to be retransmited rlc_pP->first_retrans_pdu_sn = -1; display_flag = 0; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] CLEAR first_retrans_pdu_sn\n",frameP, rlc_pP->module_id, rlc_pP->rb_id); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] CLEAR first_retrans_pdu_sn\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); } if (display_flag > 0) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] UPDATED first_retrans_pdu_sn %04d\n", frameP, rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->first_retrans_pdu_sn); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] UPDATED first_retrans_pdu_sn %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->first_retrans_pdu_sn); } return; /* ONLY ONE TB PER TTI if ((tx_data_pdu_management->retx_count >= 0) && (rlc_pP->nb_bytes_requested_by_mac < RLC_AM_MIN_SEGMENT_SIZE_REQUEST)) { #ifdef TRACE_RLC_AM_TX - msg ("[FRAME %05d][RLC_AM][MOD %02d][RB %02d] BREAK LOOP ON RETRANSMISSION BECAUSE ONLY %d BYTES ALLOWED TO TRANSMIT BY MAC\n",frameP, ((rlc_am_entity_t *) rlc_pP)->module_id,((rlc_am_entity_t *) rlc_pP)->rb_id, rlc_pP->nb_bytes_requested_by_mac); + msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] BREAK LOOP ON RETRANSMISSION BECAUSE ONLY %d BYTES ALLOWED TO TRANSMIT BY MAC\n",frameP, ((rlc_am_entity_t *) rlc_pP)->module_id,((rlc_am_entity_t *) rlc_pP)->rb_id, rlc_pP->nb_bytes_requested_by_mac); #endif break; }*/ @@ -398,7 +473,12 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) rlc_am_retransmit_any_pdu(rlc_pP,frameP); return; } else { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] COULD NOT RETRANSMIT ANY PDU BECAUSE ",frameP, rlc_pP->module_id, rlc_pP->rb_id); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] COULD NOT RETRANSMIT ANY PDU BECAUSE ", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); if (rlc_pP->pdus_to_mac_layer.head != NULL) { LOG_D(RLC, "THERE ARE SOME PDUS READY TO TRANSMIT "); } @@ -413,21 +493,27 @@ rlc_am_get_pdus (rlc_am_entity_t *rlc_pP,u32_t frameP) break; default: - LOG_E(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] MAC_DATA_REQ UNKNOWN PROTOCOL STATE 0x%02X\n", frameP, rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->protocol_state); + LOG_E(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] MAC_DATA_REQ UNKNOWN PROTOCOL STATE 0x%02X\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->protocol_state); } } //----------------------------------------------------------------------------- void -rlc_am_rx (void *argP, u32_t frameP, u8_t eNB_flagP, struct mac_data_ind data_indP) +rlc_am_rx (void *arg_pP, frame_t frameP, eNB_flag_t eNB_flagP, struct mac_data_ind data_indP) { //----------------------------------------------------------------------------- - rlc_am_entity_t *rlc = (rlc_am_entity_t *) argP; + rlc_am_entity_t *rlc = (rlc_am_entity_t *) arg_pP; switch (rlc->protocol_state) { case RLC_NULL_STATE: - LOG_N(RLC, "[RLC_AM %p] ERROR MAC_DATA_IND IN RLC_NULL_STATE\n", argP); + LOG_N(RLC, "[RLC_AM %p] ERROR MAC_DATA_IND IN RLC_NULL_STATE\n", arg_pP); list_free (&data_indP.data); break; @@ -442,7 +528,7 @@ rlc_am_rx (void *argP, u32_t frameP, u8_t eNB_flagP, struct mac_data_ind data_in //----------------------------------------------------------------------------- struct mac_status_resp -rlc_am_mac_status_indication (void *rlc_pP, u32 frameP, u16 tb_sizeP, struct mac_status_ind tx_statusP) +rlc_am_mac_status_indication (void *rlc_pP, frame_t frameP, u16 tb_sizeP, struct mac_status_ind tx_statusP) { //----------------------------------------------------------------------------- struct mac_status_resp status_resp; @@ -471,36 +557,43 @@ rlc_am_mac_status_indication (void *rlc_pP, u32 frameP, u16 tb_sizeP, struct mac if ((rlc->input_sdus[rlc->current_sdu_index].mem_block != NULL) && (status_resp.buffer_occupancy_in_bytes)) { - //status_resp.buffer_occupancy_in_bytes += ((rlc_am_entity_t *) rlc)->tx_header_min_length_in_bytes; - status_resp.buffer_occupancy_in_pdus = rlc->nb_sdu; - diff_time = frameP - ((rlc_am_tx_sdu_management_t *) (rlc->input_sdus[rlc->current_sdu_index].mem_block->data))->sdu_creation_time; - - status_resp.head_sdu_creation_time = (diff_time > 0 ) ? (u32_t) diff_time : (u32_t)(0xffffffff - diff_time + frameP) ; - - sdu_size = ((rlc_am_tx_sdu_management_t *) (rlc->input_sdus[rlc->current_sdu_index].mem_block->data))->sdu_size; - sdu_remaining_size = ((rlc_am_tx_sdu_management_t *) (rlc->input_sdus[rlc->current_sdu_index].mem_block->data))->sdu_remaining_size; - - status_resp.head_sdu_remaining_size_to_send = sdu_remaining_size; - if (sdu_size == sdu_remaining_size) { + //status_resp.buffer_occupancy_in_bytes += ((rlc_am_entity_t *) rlc)->tx_header_min_length_in_bytes; + status_resp.buffer_occupancy_in_pdus = rlc->nb_sdu; + diff_time = frameP - ((rlc_am_tx_sdu_management_t *) (rlc->input_sdus[rlc->current_sdu_index].mem_block->data))->sdu_creation_time; + + status_resp.head_sdu_creation_time = (diff_time > 0 ) ? (u32_t) diff_time : (u32_t)(0xffffffff - diff_time + frameP) ; + + sdu_size = ((rlc_am_tx_sdu_management_t *) (rlc->input_sdus[rlc->current_sdu_index].mem_block->data))->sdu_size; + sdu_remaining_size = ((rlc_am_tx_sdu_management_t *) (rlc->input_sdus[rlc->current_sdu_index].mem_block->data))->sdu_remaining_size; + + status_resp.head_sdu_remaining_size_to_send = sdu_remaining_size; + if (sdu_size == sdu_remaining_size) { status_resp.head_sdu_is_segmented = 0; - } - else { - status_resp.head_sdu_is_segmented = 1; - } - + } + else { + status_resp.head_sdu_is_segmented = 1; + } + } else { } #ifdef TRACE_RLC_AM_TX_STATUS if (tb_sizeP > 0) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] MAC_STATUS_INDICATION (DATA) %d bytes -> %d bytes\n", frameP, rlc->module_id, rlc->rb_id, tb_sizeP, status_resp.buffer_occupancy_in_bytes); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] MAC_STATUS_INDICATION (DATA) %d bytes -> %d bytes\n", + frameP, + (rlc->is_enb) ? "eNB" : "UE", + rlc->enb_module_id, + rlc->ue_module_id, + rlc->rb_id, + tb_sizeP, + status_resp.buffer_occupancy_in_bytes); /*if ((tx_statusP.tx_status == MAC_TX_STATUS_SUCCESSFUL) && (tx_statusP.no_pdu)) { - msg ("[FRAME %05d][RLC_AM][MOD %02d][RB %02d] MAC_STATUS_INDICATION TX STATUS SUCCESSFUL %d PDUs\n",rlc->module_id, + msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] MAC_STATUS_INDICATION TX STATUS SUCCESSFUL %d PDUs\n",rlc->module_id, rlc->rb_id, frameP, tx_statusP.no_pdu); } if ((tx_statusP.tx_status == MAC_TX_STATUS_UNSUCCESSFUL) && (tx_statusP.no_pdu)) { - msg ("[FRAME %05d][RLC_AM][MOD %02d][RB %02d] MAC_STATUS_INDICATION TX STATUS UNSUCCESSFUL %d PDUs\n",rlc->module_id, rlc->rb_id, + msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] MAC_STATUS_INDICATION TX STATUS UNSUCCESSFUL %d PDUs\n",rlc->module_id, rlc->rb_id, frameP, tx_statusP.no_pdu); }*/ } @@ -509,7 +602,7 @@ frameP, tx_statusP.no_pdu); } //----------------------------------------------------------------------------- struct mac_data_req -rlc_am_mac_data_request (void *rlc_pP,u32 frameP) +rlc_am_mac_data_request (void *rlc_pP, frame_t frameP) { //----------------------------------------------------------------------------- struct mac_data_req data_req; @@ -535,7 +628,13 @@ rlc_am_mac_data_request (void *rlc_pP,u32 frameP) list_add_list (&l_rlc_p->pdus_to_mac_layer, &data_req.data); //((rlc_am_entity_t *) rlc_pP)->tx_pdus += data_req.data.nb_elements; if ((nb_bytes_requested_by_mac + data_req.data.nb_elements) > 0) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] MAC_DATA_REQUEST %05d BYTES REQUESTED -> %d TBs\n", frameP, l_rlc_p->module_id,l_rlc_p->rb_id, nb_bytes_requested_by_mac, data_req.data.nb_elements); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] MAC_DATA_REQUEST %05d BYTES REQUESTED -> %d TBs\n", + frameP, + (l_rlc_p->is_enb) ? "eNB" : "UE", + l_rlc_p->enb_module_id, + l_rlc_p->ue_module_id, + nb_bytes_requested_by_mac, + data_req.data.nb_elements); } data_req.buffer_occupancy_in_bytes = rlc_am_get_buffer_occupancy_in_bytes(l_rlc_p,frameP); data_req.rlc_info.rlc_protocol_state = l_rlc_p->protocol_state; @@ -654,7 +753,7 @@ rlc_am_mac_data_request (void *rlc_pP,u32 frameP) } //----------------------------------------------------------------------------- void -rlc_am_mac_data_indication (void *rlc_pP, u32_t frameP, u8 eNB_flagP, struct mac_data_ind data_indP) +rlc_am_mac_data_indication (void *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, struct mac_data_ind data_indP) { //----------------------------------------------------------------------------- rlc_am_entity_t *l_rlc_p = (rlc_am_entity_t *) rlc_pP; @@ -789,7 +888,7 @@ rlc_am_mac_data_indication (void *rlc_pP, u32_t frameP, u8 eNB_flagP, struct mac //----------------------------------------------------------------------------- void -rlc_am_data_req (void *rlc_pP, u32_t frameP, mem_block_t * sdu_pP) +rlc_am_data_req (void *rlc_pP, frame_t frameP, mem_block_t * sdu_pP) { //----------------------------------------------------------------------------- rlc_am_entity_t *rlc_p = (rlc_am_entity_t *) rlc_pP; @@ -838,12 +937,44 @@ rlc_am_data_req (void *rlc_pP, u32_t frameP, mem_block_t * sdu_pP) rlc_p->input_sdus[rlc_p->next_sdu_index].flags.no_new_sdu_segmented_in_last_pdu = 0; //rlc_p->input_sdus[rlc_p->next_sdu_index].li_index_for_discard = -1; rlc_p->next_sdu_index = (rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; - LOG_I(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] RLC_AM_DATA_REQ size %d Bytes, NB SDU %d current_sdu_index=%d next_sdu_index=%d conf %d mui %d\n", frameP, rlc_p->module_id, rlc_p->rb_id, data_size, rlc_p->nb_sdu, rlc_p->current_sdu_index, rlc_p->next_sdu_index, conf, mui); + LOG_I(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_REQ size %d Bytes, NB SDU %d current_sdu_index=%d next_sdu_index=%d conf %d mui %d\n", + frameP, + (rlc_p->is_enb) ? "eNB" : "UE", + rlc_p->enb_module_id, + rlc_p->ue_module_id, + rlc_p->rb_id, + data_size, + rlc_p->nb_sdu, + rlc_p->current_sdu_index, + rlc_p->next_sdu_index, + conf, + mui); } else { - LOG_W(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d] RLC_AM_DATA_REQ BUFFER FULL, NB SDU %d current_sdu_index=%d next_sdu_index=%d size_input_sdus_buffer=%d\n", frameP, rlc_p->module_id, rlc_p->rb_id, rlc_p->nb_sdu, rlc_p->current_sdu_index, rlc_p->next_sdu_index, RLC_AM_SDU_CONTROL_BUFFER_SIZE); + LOG_W(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_REQ BUFFER FULL, NB SDU %d current_sdu_index=%d next_sdu_index=%d size_input_sdus_buffer=%d\n", + frameP, + (rlc_p->is_enb) ? "eNB" : "UE", + rlc_p->enb_module_id, + rlc_p->ue_module_id, + rlc_p->rb_id, + rlc_p->nb_sdu, + rlc_p->current_sdu_index, + rlc_p->next_sdu_index, + RLC_AM_SDU_CONTROL_BUFFER_SIZE); LOG_W(RLC, " input_sdus[].mem_block=%p next input_sdus[].flags.segmented=%d\n", rlc_p->input_sdus[rlc_p->next_sdu_index].mem_block, rlc_p->input_sdus[rlc_p->next_sdu_index].flags.segmented); rlc_p->stat_tx_pdcp_sdu_discarded += 1; rlc_p->stat_tx_pdcp_bytes_discarded += ((struct rlc_am_data_req *) (sdu_pP->data))->data_size; free_mem_block (sdu_pP); +#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) + AssertFatal(0, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_REQ size %d Bytes, SDU DROPPED, INPUT BUFFER OVERFLOW NB SDU %d current_sdu_index=%d next_sdu_index=%d \n", + frameP, + (rlc_p->is_enb) ? "eNB" : "UE", + rlc_p->enb_module_id, + rlc_p->ue_module_id, + rlc_p->rb_id, + data_size, + rlc_p->nb_sdu, + rlc_p->current_sdu_index, + rlc_p->next_sdu_index); +#endif } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h index 49c60fb700..ceac5a9e36 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h @@ -96,29 +96,29 @@ public_rlc_am(void rlc_am_release (rlc_am_entity_t *rlcP);) * @{ */ -/*! \fn void config_req_rlc_am (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flagP, module_id_t module_idP, rlc_am_info_t * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP) +/*! \fn void config_req_rlc_am (u32_t frame, u8_t eNB_flagP, module_id_t enb_module_idP, module_id_t ue_module_idP, rlc_am_info_t * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP) * \brief Configure the UL and DL parameters of the RLC AM -* \param[in] rlcP RLC AM protocol instance pointer. * \param[in] frame Frame index. * \param[in] eNB_flag Flag to indicate eNB (1) or UE (0) -* \param[in] module_idP Virtualized module identifier. +* \param[in] enb_module_idP eNB Virtualized module identifier. +* \param[in] ue_module_idP UE Virtualized module identifier. * \param[in] config_amP Configuration parameters for RLC AM instance. * \param[in] rb_idP Radio bearer identifier. * \param[in] rb_typeP Radio bearer type (Signalling or Data). */ -public_rlc_am(void config_req_rlc_am (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flagP, module_id_t module_idP, rlc_am_info_t * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP);) +public_rlc_am(void config_req_rlc_am (u32_t frame, u8_t eNB_flagP, module_id_t enb_module_idP, module_id_t ue_module_idP, rlc_am_info_t * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP);) -/*! \fn void config_req_rlc_am_asn1 (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flagP, module_id_t module_idP, struct RLC_Config__am * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP) +/*! \fn void config_req_rlc_am_asn1 (u32_t frame, u8_t eNB_flagP, module_id_t enb_module_idP, module_id_t ue_module_idP, struct RLC_Config__am * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP) * \brief Configure the UL and DL parameters of the RLC AM with the asn1c autogenerated pameters structs -* \param[in] rlcP RLC AM protocol instance pointer. * \param[in] frame Frame index. * \param[in] eNB_flag Flag to indicate eNB (1) or UE (0) -* \param[in] module_idP Virtualized module identifier. +* \param[in] enb_module_idP eNB Virtualized module identifier. +* \param[in] ue_module_idP UE Virtualized module identifier. * \param[in] config_amP Configuration parameters for RLC AM instance. * \param[in] rb_idP Radio bearer identifier. * \param[in] rb_typeP Radio bearer type (Signalling or Data). */ -public_rlc_am(void config_req_rlc_am_asn1 (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flagP, module_id_t module_idP, struct RLC_Config__am * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP);) +public_rlc_am(void config_req_rlc_am_asn1 (u32_t frame, u8_t eNB_flagP, module_id_t enb_module_idP, module_id_t ue_module_idP, struct RLC_Config__am * config_amP, rb_id_t rb_idP, rb_type_t rb_typeP);) /** @} */ diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h index e82a724a07..9c7a0e41eb 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -55,19 +55,21 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis * \brief Structure containing a RLC AM instance protocol variables, statistic variables, allocation variables, buffers and other miscellaneous variables. */ typedef struct rlc_am_entity { - module_id_t module_id; /*!< \brief Virtualization index for this protocol instance, means handset or eNB index. */ - u16_t rb_id; /*!< \brief Radio bearer identifier, for statistics and trace purpose. */ - boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ - boolean_t is_enb; /*!< \brief To know if the RLC belongs to a eNB or UE. */ + module_id_t enb_module_id; /*!< \brief eNB Virtualization index for this protocol instance, meaningful if is_enb is set. */ + module_id_t ue_module_id; /*!< \brief UE Virtualization index for this protocol instance. */ + rb_id_t rb_id; /*!< \brief Radio bearer identifier, for statistics and trace purpose. */ + logical_chan_id_t channel_id; /*!< \brief Transport channel identifier. */ + boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ + boolean_t is_enb; /*!< \brief To know if the RLC belongs to a eNB or UE. */ - signed int sdu_buffer_occupancy; /*!< \brief Number of bytes of unsegmented SDUs. */ - signed int retransmission_buffer_occupancy; /*!< \brief Number of bytes of PDUs in retransmission buffer waiting for a ACK. */ - signed int status_buffer_occupancy; /*!< \brief Number of bytes of control PDUs waiting for transmission. */ + signed int sdu_buffer_occupancy; /*!< \brief Number of bytes of unsegmented SDUs. */ + signed int retransmission_buffer_occupancy; /*!< \brief Number of bytes of PDUs in retransmission buffer waiting for a ACK. */ + signed int status_buffer_occupancy; /*!< \brief Number of bytes of control PDUs waiting for transmission. */ //--------------------------------------------------------------------- // TX BUFFERS //--------------------------------------------------------------------- - mem_block_t* input_sdus_alloc; /*!< \brief Allocated memory for the input SDU buffer (for SDUs coming from upper layers). */ + mem_block_t* input_sdus_alloc; /*!< \brief Allocated memory for the input SDU buffer (for SDUs coming from upper layers). */ rlc_am_tx_sdu_management_t *input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). */ signed int nb_sdu; /*!< \brief Total number of valid rlc_am_tx_sdu_management_t in input_sdus[]. */ signed int nb_sdu_no_segmented; /*!< \brief Total number of SDUs not segmented and partially segmented. */ @@ -88,7 +90,7 @@ typedef struct rlc_am_entity { //--------------------------------------------------------------------- list2_t receiver_buffer; /*!< \brief Receiver buffer implemented with a list. */ mem_block_t *output_sdu_in_construction; /*!< \brief Memory area where a complete SDU is reassemblied before being send to upper layers. */ - s32_t output_sdu_size_to_write; /*!< \brief Size of the reassemblied SDU. */ + sdu_size_t output_sdu_size_to_write; /*!< \brief Size of the reassemblied SDU. */ //--------------------------------------------------------------------- @@ -98,19 +100,19 @@ typedef struct rlc_am_entity { //----------------------------- // TX STATE VARIABLES //----------------------------- - u16_t vt_a; /*!< \brief Acknowledgement state variable. This state variable holds the value of the SN of the next AMD PDU for which a positive acknowledgment is to be received in-sequence, and it serves as the lower edge of the transmitting window. It is initially set to 0, and is updated whenever the AM RLC entity receives a positive acknowledgment for an AMD PDU with SN = VT(A).*/ - u16_t vt_ms; /*!< \brief Maximum send state variable. This state variable equals VT(A) + AM_Window_Size, and it serves as the higher edge of the transmitting window. */ - u16_t vt_s; /*!< \brief Send state variable. This state variable holds the value of the SN to be assigned for the next newly generated AMD PDU. It is initially set to 0, and is updated whenever the AM RLC entity delivers an AMD PDU with SN = VT(S).*/ - u16_t poll_sn; /*!< \brief Poll send state variable. This state variable holds the value of VT(S)-1 upon the most recent transmission of a RLC data PDU with the poll bit set to “1”. It is initially set to 0.*/ + rlc_usn_t vt_a; /*!< \brief Acknowledgement state variable. This state variable holds the value of the SN of the next AMD PDU for which a positive acknowledgment is to be received in-sequence, and it serves as the lower edge of the transmitting window. It is initially set to 0, and is updated whenever the AM RLC entity receives a positive acknowledgment for an AMD PDU with SN = VT(A).*/ + rlc_usn_t vt_ms; /*!< \brief Maximum send state variable. This state variable equals VT(A) + AM_Window_Size, and it serves as the higher edge of the transmitting window. */ + rlc_usn_t vt_s; /*!< \brief Send state variable. This state variable holds the value of the SN to be assigned for the next newly generated AMD PDU. It is initially set to 0, and is updated whenever the AM RLC entity delivers an AMD PDU with SN = VT(S).*/ + rlc_usn_t poll_sn; /*!< \brief Poll send state variable. This state variable holds the value of VT(S)-1 upon the most recent transmission of a RLC data PDU with the poll bit set to “1”. It is initially set to 0.*/ //----------------------------- // RX STATE VARIABLES //----------------------------- - u16_t vr_r; /*!< \brief Receive state variable. This state variable holds the value of the SN following the last in-sequence completely received AMD PDU, and it serves as the lower edge of the receiving window. It is initially set to 0, and is updated whenever the AM RLC entity receives an AMD PDU with SN = VR(R). */ - u16_t vr_mr; /*!< \brief Maximum acceptable receive state variable. This state variable equals VR(R) + AM_Window_Size, and it holds the value of the SN of the first AMD PDU that is beyond the receiving window and serves as the higher edge of the receiving window. */ - u16_t vr_x; /*!< \brief t-Reordering state variable. This state variable holds the value of the SN following the SN of the RLC data PDU which triggered t-Reordering. */ - u16_t vr_ms; /*!< \brief Maximum STATUS transmit state variable. This state variable holds the highest possible value of the SN which can be indicated by “ACK_SN” when a STATUS PDU needs to be constructed. It is initially set to 0. */ - u16_t vr_h; /*!< \brief Highest received state variable. This state variable holds the value of the SN following the SN of the RLC data PDU with the highest SN among received RLC data PDUs. It is initially set to 0. */ + rlc_usn_t vr_r; /*!< \brief Receive state variable. This state variable holds the value of the SN following the last in-sequence completely received AMD PDU, and it serves as the lower edge of the receiving window. It is initially set to 0, and is updated whenever the AM RLC entity receives an AMD PDU with SN = VR(R). */ + rlc_usn_t vr_mr; /*!< \brief Maximum acceptable receive state variable. This state variable equals VR(R) + AM_Window_Size, and it holds the value of the SN of the first AMD PDU that is beyond the receiving window and serves as the higher edge of the receiving window. */ + rlc_usn_t vr_x; /*!< \brief t-Reordering state variable. This state variable holds the value of the SN following the SN of the RLC data PDU which triggered t-Reordering. */ + rlc_usn_t vr_ms; /*!< \brief Maximum STATUS transmit state variable. This state variable holds the highest possible value of the SN which can be indicated by “ACK_SN” when a STATUS PDU needs to be constructed. It is initially set to 0. */ + rlc_usn_t vr_h; /*!< \brief Highest received state variable. This state variable holds the value of the SN following the SN of the RLC data PDU with the highest SN among received RLC data PDUs. It is initially set to 0. */ //----------------------------- // TIMERS CONFIGURED BY RRC @@ -183,12 +185,7 @@ typedef struct rlc_am_entity { // note occupancy of other buffers is deducted from nb elements in lists u32_t buffer_occupancy_retransmission_buffer; /*!< \brief Number of PDUs. */ - //************************************************************** - // new members - //************************************************************** u8_t allocation; /*!< \brief Boolean for rlc_am_entity_t struct allocation. */ - u8_t location; /*!< \brief EnodeB / UE. */ - } rlc_am_entity_t; /** @} */ # endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c index b2c088ae66..7c911941c3 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c @@ -42,7 +42,7 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis #define TRACE_RLC_AM_FREE_SDU //----------------------------------------------------------------------------- -void rlc_am_free_in_sdu(rlc_am_entity_t *rlcP, u32_t frame, unsigned int index_in_bufferP) +void rlc_am_free_in_sdu(rlc_am_entity_t *rlcP, frame_t frameP, unsigned int index_in_bufferP) //----------------------------------------------------------------------------- { if (index_in_bufferP <= RLC_AM_SDU_CONTROL_BUFFER_SIZE) { @@ -65,7 +65,16 @@ void rlc_am_free_in_sdu(rlc_am_entity_t *rlcP, u32_t frame, unsigned int index_i } } #ifdef TRACE_RLC_AM_FREE_SDU - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][FREE SDU] SDU INDEX %03d current_sdu_index=%d next_sdu_index=%d nb_sdu_no_segmented=%d\n", frame, rlcP->module_id, rlcP->rb_id, index_in_bufferP, rlcP->current_sdu_index, rlcP->next_sdu_index, rlcP->nb_sdu_no_segmented); + LOG_D(RLC, "[FRAME %05d][%s][RLC_AM][MOD %u/%u][RB %u][FREE SDU] SDU INDEX %03d current_sdu_index=%d next_sdu_index=%d nb_sdu_no_segmented=%d\n", + frameP, + (rlcP->is_enb) ? "eNB" : "UE", + rlcP->enb_module_id, + rlcP->ue_module_id, + rlcP->rb_id, + index_in_bufferP, + rlcP->current_sdu_index, + rlcP->next_sdu_index, + rlcP->nb_sdu_no_segmented); #endif } // called when segmentation is done diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h index 9b3f3f8c79..6d7bc70b55 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h @@ -57,14 +57,14 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis # define public_rlc_am_in_sdu(x) extern x # endif # endif -/*! \fn void rlc_am_free_in_sdu (rlc_am_entity_t *rlcP, u32_t frame, unsigned int index_in_bufferP) +/*! \fn void rlc_am_free_in_sdu (rlc_am_entity_t *rlcP, frame_t frameP, unsigned int index_in_bufferP) * \brief Free a higher layer SDU stored in input_sdus[] buffer. * \param[in] rlcP RLC AM protocol instance pointer. * \param[in] frame Frame index. * \param[in] index_in_bufferP Position index of the SDU. * \note Update also the RLC AM instance variables nb_sdu, current_sdu_index, nb_sdu_no_segmented. */ -protected_rlc_am_in_sdu(void rlc_am_free_in_sdu (rlc_am_entity_t *rlcP, u32_t frame, unsigned int index_in_bufferP);) +protected_rlc_am_in_sdu(void rlc_am_free_in_sdu (rlc_am_entity_t *rlcP, frame_t frameP, unsigned int index_in_bufferP);) /*! \fn void rlc_am_free_in_sdu_data (rlc_am_entity_t *rlcP, unsigned int index_in_bufferP) diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c index 35200d4967..cf88f9de46 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -36,119 +36,152 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" //----------------------------------------------------------------------------- -void rlc_am_init(rlc_am_entity_t *rlcP,u32_t frame) +void rlc_am_init(rlc_am_entity_t *rlc_pP, frame_t frameP) //----------------------------------------------------------------------------- { - int saved_allocation = rlcP->allocation; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD XX][RB XX][INIT] STATE VARIABLES, BUFFERS, LISTS\n", frame); - memset(rlcP, 0, sizeof(rlc_am_entity_t)); - rlcP->allocation = saved_allocation; - - list2_init(&rlcP->receiver_buffer, "RX BUFFER"); - list_init(&rlcP->pdus_to_mac_layer, "PDUS TO MAC"); - list_init(&rlcP->control_pdu_list, "CONTROL PDU LIST"); - list_init(&rlcP->segmentation_pdu_list, "SEGMENTATION PDU LIST"); + int saved_allocation = rlc_pP->allocation; + LOG_D(RLC, "[FRAME %5u][RLC_AM][MOD XX][RB XX][INIT] STATE VARIABLES, BUFFERS, LISTS\n", frameP); + memset(rlc_pP, 0, sizeof(rlc_am_entity_t)); + rlc_pP->allocation = saved_allocation; + + list2_init(&rlc_pP->receiver_buffer, "RX BUFFER"); + list_init(&rlc_pP->pdus_to_mac_layer, "PDUS TO MAC"); + list_init(&rlc_pP->control_pdu_list, "CONTROL PDU LIST"); + list_init(&rlc_pP->segmentation_pdu_list, "SEGMENTATION PDU LIST"); //LOG_D(RLC,"RLC_AM_SDU_CONTROL_BUFFER_SIZE %d sizeof(rlc_am_tx_sdu_management_t) %d \n", RLC_AM_SDU_CONTROL_BUFFER_SIZE, sizeof(rlc_am_tx_sdu_management_t)); - rlcP->input_sdus_alloc = get_free_mem_block(RLC_AM_SDU_CONTROL_BUFFER_SIZE*sizeof(rlc_am_tx_sdu_management_t)); - rlcP->input_sdus = (rlc_am_tx_sdu_management_t*)((rlcP->input_sdus_alloc)->data); - rlcP->pdu_retrans_buffer_alloc = get_free_mem_block((u16_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof(rlc_am_tx_data_pdu_management_t))); - rlcP->pdu_retrans_buffer = (rlc_am_tx_data_pdu_management_t*)((rlcP->pdu_retrans_buffer_alloc)->data); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD XX][RB XX][INIT] input_sdus[] = %p element size=%d\n", frame, rlcP->input_sdus,sizeof(rlc_am_tx_sdu_management_t)); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD XX][RB XX][INIT] pdu_retrans_buffer[] = %p element size=%d\n", frame, rlcP->pdu_retrans_buffer,sizeof(rlc_am_tx_data_pdu_management_t)); + rlc_pP->input_sdus_alloc = get_free_mem_block(RLC_AM_SDU_CONTROL_BUFFER_SIZE*sizeof(rlc_am_tx_sdu_management_t)); + rlc_pP->input_sdus = (rlc_am_tx_sdu_management_t*)((rlc_pP->input_sdus_alloc)->data); + rlc_pP->pdu_retrans_buffer_alloc = get_free_mem_block((u16_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof(rlc_am_tx_data_pdu_management_t))); + rlc_pP->pdu_retrans_buffer = (rlc_am_tx_data_pdu_management_t*)((rlc_pP->pdu_retrans_buffer_alloc)->data); + LOG_D(RLC, "[FRAME %5u][RLC_AM][MOD XX][RB XX][INIT] input_sdus[] = %p element size=%d\n", frameP, rlc_pP->input_sdus,sizeof(rlc_am_tx_sdu_management_t)); + LOG_D(RLC, "[FRAME %5u][RLC_AM][MOD XX][RB XX][INIT] pdu_retrans_buffer[] = %p element size=%d\n", frameP, rlc_pP->pdu_retrans_buffer,sizeof(rlc_am_tx_data_pdu_management_t)); // TX state variables - //rlcP->vt_a = 0; - rlcP->vt_ms = rlcP->vt_a + RLC_AM_WINDOW_SIZE; - //rlcP->vt_s = 0; - //rlcP->poll_sn = 0; + //rlc_pP->vt_a = 0; + rlc_pP->vt_ms = rlc_pP->vt_a + RLC_AM_WINDOW_SIZE; + //rlc_pP->vt_s = 0; + //rlc_pP->poll_sn = 0; // TX counters - //rlcP->c_pdu_without_poll = 0; - //rlcP->c_byte_without_poll = 0; + //rlc_pP->c_pdu_without_poll = 0; + //rlc_pP->c_byte_without_poll = 0; // RX state variables - //rlcP->vr_r = 0; - rlcP->vr_mr = rlcP->vr_r + RLC_AM_WINDOW_SIZE; - //rlcP->vr_x = 0; - //rlcP->vr_ms = 0; - //rlcP->vr_h = 0; - - rlcP->last_frame_status_indication = 123456; // any value > 1 - rlcP->first_retrans_pdu_sn = -1; + //rlc_pP->vr_r = 0; + rlc_pP->vr_mr = rlc_pP->vr_r + RLC_AM_WINDOW_SIZE; + //rlc_pP->vr_x = 0; + //rlc_pP->vr_ms = 0; + //rlc_pP->vr_h = 0; + + rlc_pP->last_frame_status_indication = 123456; // any value > 1 + rlc_pP->first_retrans_pdu_sn = -1; } //----------------------------------------------------------------------------- -void rlc_am_cleanup(rlc_am_entity_t *rlcP,u32_t frame) +void rlc_am_cleanup(rlc_am_entity_t *rlc_pP, frame_t frameP) //----------------------------------------------------------------------------- { - LOG_I(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][CLEANUP]\n", frame, rlcP->module_id, rlcP->rb_id); - - list2_free(&rlcP->receiver_buffer); - list_free(&rlcP->pdus_to_mac_layer); - list_free(&rlcP->control_pdu_list); - list_free(&rlcP->segmentation_pdu_list); - - - if (rlcP->output_sdu_in_construction != NULL) { - free_mem_block(rlcP->output_sdu_in_construction); - rlcP->output_sdu_in_construction = NULL; + LOG_I(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][CLEANUP]\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + + list2_free(&rlc_pP->receiver_buffer); + list_free(&rlc_pP->pdus_to_mac_layer); + list_free(&rlc_pP->control_pdu_list); + list_free(&rlc_pP->segmentation_pdu_list); + + + if (rlc_pP->output_sdu_in_construction != NULL) { + free_mem_block(rlc_pP->output_sdu_in_construction); + rlc_pP->output_sdu_in_construction = NULL; } unsigned int i; - if (rlcP->input_sdus_alloc != NULL) { + if (rlc_pP->input_sdus_alloc != NULL) { for (i=0; i < RLC_AM_SDU_CONTROL_BUFFER_SIZE; i++) { - if (rlcP->input_sdus[i].mem_block != NULL) { - free_mem_block(rlcP->input_sdus[i].mem_block); - rlcP->input_sdus[i].mem_block = NULL; + if (rlc_pP->input_sdus[i].mem_block != NULL) { + free_mem_block(rlc_pP->input_sdus[i].mem_block); + rlc_pP->input_sdus[i].mem_block = NULL; } } - free_mem_block(rlcP->input_sdus_alloc); - rlcP->input_sdus_alloc = NULL; - rlcP->input_sdus = NULL; + free_mem_block(rlc_pP->input_sdus_alloc); + rlc_pP->input_sdus_alloc = NULL; + rlc_pP->input_sdus = NULL; } - if (rlcP->pdu_retrans_buffer_alloc != NULL) { + if (rlc_pP->pdu_retrans_buffer_alloc != NULL) { for (i=0; i < RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE; i++) { - if (rlcP->pdu_retrans_buffer[i].mem_block != NULL) { - free_mem_block(rlcP->pdu_retrans_buffer[i].mem_block); - rlcP->pdu_retrans_buffer[i].mem_block = NULL; + if (rlc_pP->pdu_retrans_buffer[i].mem_block != NULL) { + free_mem_block(rlc_pP->pdu_retrans_buffer[i].mem_block); + rlc_pP->pdu_retrans_buffer[i].mem_block = NULL; } } - free_mem_block(rlcP->pdu_retrans_buffer_alloc); - rlcP->pdu_retrans_buffer_alloc = NULL; - rlcP->pdu_retrans_buffer = NULL; + free_mem_block(rlc_pP->pdu_retrans_buffer_alloc); + rlc_pP->pdu_retrans_buffer_alloc = NULL; + rlc_pP->pdu_retrans_buffer = NULL; } + memset(rlc_pP, 0, sizeof(rlc_am_entity_t)); } //----------------------------------------------------------------------------- -void rlc_am_configure(rlc_am_entity_t *rlcP, - u32_t frame, - u16_t max_retx_thresholdP, - u16_t poll_pduP, - u16_t poll_byteP, - u32_t t_poll_retransmitP, - u32_t t_reorderingP, - u32_t t_status_prohibitP) +void rlc_am_configure(rlc_am_entity_t *rlc_pP, + frame_t frameP, + u16_t max_retx_thresholdP, + u16_t poll_pduP, + u16_t poll_byteP, + u32_t t_poll_retransmitP, + u32_t t_reorderingP, + u32_t t_status_prohibitP) //----------------------------------------------------------------------------- { - LOG_I(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][CONFIGURE] max_retx_threshold %d poll_pdu %d poll_byte %d t_poll_retransmit %d t_reordering %d t_status_prohibit %d\n", frame, rlcP->module_id, rlcP->rb_id, max_retx_thresholdP, poll_pduP, poll_byteP, t_poll_retransmitP, t_reorderingP, t_status_prohibitP); - - rlcP->max_retx_threshold = max_retx_thresholdP; - rlcP->poll_pdu = poll_pduP; - rlcP->poll_byte = poll_byteP; - rlcP->protocol_state = RLC_DATA_TRANSFER_READY_STATE; - - rlc_am_init_timer_poll_retransmit(rlcP, t_poll_retransmitP); - rlc_am_init_timer_reordering (rlcP, t_reorderingP); - rlc_am_init_timer_status_prohibit(rlcP, t_status_prohibitP); + LOG_I(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][CONFIGURE] max_retx_threshold %d poll_pdu %d poll_byte %d t_poll_retransmit %d t_reordering %d t_status_prohibit %d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + max_retx_thresholdP, + poll_pduP, + poll_byteP, + t_poll_retransmitP, + t_reorderingP, + t_status_prohibitP); + + rlc_pP->max_retx_threshold = max_retx_thresholdP; + rlc_pP->poll_pdu = poll_pduP; + rlc_pP->poll_byte = poll_byteP; + rlc_pP->protocol_state = RLC_DATA_TRANSFER_READY_STATE; + + rlc_am_init_timer_poll_retransmit(rlc_pP, t_poll_retransmitP); + rlc_am_init_timer_reordering (rlc_pP, t_reorderingP); + rlc_am_init_timer_status_prohibit(rlc_pP, t_status_prohibitP); } //----------------------------------------------------------------------------- -void rlc_am_set_debug_infos(rlc_am_entity_t *rlcP, u32 frame, u8_t eNB_flagP, module_id_t module_idP, rb_id_t rb_idP, rb_type_t rb_typeP) +void rlc_am_set_debug_infos(rlc_am_entity_t *rlc_pP, + frame_t frameP, + eNB_flag_t eNB_flagP, + module_id_t enb_module_idP, + module_id_t ue_module_idP, + rb_id_t rb_idP, + rb_type_t rb_typeP) //----------------------------------------------------------------------------- { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][SET DEBUG INFOS] module_id %d rb_id %d rb_type %d\n", frame, module_idP, rb_idP, module_idP, rb_idP, rb_typeP); - - rlcP->module_id = module_idP; - rlcP->rb_id = rb_idP; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][SET DEBUG INFOS] module_id %d rb_id %d rb_type %d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rb_idP, + enb_module_idP, + ue_module_idP, + rb_idP, + rb_typeP); + + rlc_pP->enb_module_id = enb_module_idP; + rlc_pP->ue_module_id = ue_module_idP; + rlc_pP->rb_id = rb_idP; if (rb_typeP != SIGNALLING_RADIO_BEARER) { - rlcP->is_data_plane = 1; + rlc_pP->is_data_plane = 1; } else { - rlcP->is_data_plane = 0; + rlc_pP->is_data_plane = 0; } - rlcP->is_enb = eNB_flagP; + rlc_pP->is_enb = eNB_flagP; } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h index a03b030963..3b0d272a3c 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h @@ -78,23 +78,23 @@ typedef volatile struct { } rlc_am_info_t; //----------------------------------------------------------------------------- -/*! \fn void rlc_am_init (rlc_am_entity_t* rlcP,u32_t frame) +/*! \fn void rlc_am_init (rlc_am_entity_t* rlc_pP,frame_t frameP) * \brief Initialize the RLC AM protocol instance, reset variables, allocate buffers, lists, then, the next step in order have a running RLC AM instance is to configure and set debug informations for this RLC instance. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index */ -public_rlc_am_init( void rlc_am_init (rlc_am_entity_t* rlcP,u32_t frame);) +public_rlc_am_init( void rlc_am_init (rlc_am_entity_t* rlc_pP,frame_t frameP);) -/*! \fn void rlc_am_cleanup(rlc_am_entity_t* rlcP,u32_t frame) +/*! \fn void rlc_am_cleanup(rlc_am_entity_t* rlc_pP,frame_t frameP) * \brief Free all memory resources allocated and kept by this RLC AM instance. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index */ -public_rlc_am_init( void rlc_am_cleanup(rlc_am_entity_t* rlcP,u32_t frame);) +public_rlc_am_init( void rlc_am_cleanup(rlc_am_entity_t* rlc_pP,frame_t frameP);) -/*! \fn void rlc_am_configure(rlc_am_entity_t *rlcP, u32_t frame, u16_t max_retx_thresholdP, u16_t poll_pduP, u16_t poll_byteP, u32_t t_poll_retransmitP, u32_t t_reorderingP, u32_t t_status_prohibitP) +/*! \fn void rlc_am_configure(rlc_am_entity_t *rlc_pP, frame_t frameP, u16_t max_retx_thresholdP, u16_t poll_pduP, u16_t poll_byteP, u32_t t_poll_retransmitP, u32_t t_reorderingP, u32_t t_status_prohibitP) * \brief Set RLC AM protocol parameters. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index * \param[in] max_retx_thresholdP Limit the number of retransmissions of an AMD PDU. @@ -104,8 +104,8 @@ AMD PDU. * \param[in] t_reorderingP This timer is used by the receiving side of an AM RLC entity in order to detect loss of RLC PDUs at lower layer, value in frames. * \param[in] t_status_prohibitP This timer is used by the receiving side of an AM RLC entity in order to prohibit transmission of a STATUS PDU, value in frames. */ -public_rlc_am_init( void rlc_am_configure(rlc_am_entity_t *rlcP, - u32_t frame, +public_rlc_am_init( void rlc_am_configure(rlc_am_entity_t *rlc_pP, + frame_t frameP, u16_t max_retx_thresholdP, u16_t poll_pduP, u16_t poll_byteP, @@ -113,15 +113,16 @@ public_rlc_am_init( void rlc_am_configure(rlc_am_entity_t *rlcP, u32_t t_reorderingP, u32_t t_status_prohibitP);) -/*! \fn void rlc_am_set_debug_infos(rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flagP, module_id_t module_idP, rb_id_t rb_idP, rb_type_t rb_typeP) +/*! \fn void rlc_am_set_debug_infos(rlc_am_entity_t *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, module_id_t enb_module_idP, module_id_t ue_module_idP, rb_id_t rb_idP, rb_type_t rb_typeP) * \brief Set informations that will be displayed in traces, helping the debug process. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index * \param[in] eNB_flag Flag to indicate eNB (1) or UE (0) -* \param[in] module_idP Virtualization variable, module identifier. +* \param[in] enb_module_idP eNB Virtualization variable, module identifier. +* \param[in] ue_module_idP UE Virtualization variable, module identifier. * \param[in] rb_idP Radio bearer identifier. * \param[in] rb_typeP Radio bearer type (Signalling or data). */ -public_rlc_am_init( void rlc_am_set_debug_infos(rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flagP, module_id_t module_idP, rb_id_t rb_idP, rb_type_t rb_typeP);) +public_rlc_am_init( void rlc_am_set_debug_infos(rlc_am_entity_t *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, module_id_t enb_module_idP, module_id_t ue_module_idP, rb_id_t rb_idP, rb_type_t rb_typeP);) /** @} */ #endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c index a4f929a3cc..e5ba3575ea 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c @@ -25,11 +25,12 @@ Openair Tech : openair_tech@eurecom.fr Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France -*******************************************************************************/ + *******************************************************************************/ #define RLC_AM_MODULE #define RLC_AM_REASSEMBLY_C #include "platform_types.h" //----------------------------------------------------------------------------- +#include "assertions.h" #include "rlc.h" #include "rlc_am.h" #include "list.h" @@ -38,221 +39,301 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis //#define TRACE_RLC_AM_RX_DECODE //----------------------------------------------------------------------------- -inline void rlc_am_clear_rx_sdu (rlc_am_entity_t *rlcP) +inline void rlc_am_clear_rx_sdu (rlc_am_entity_t *rlc_pP) //----------------------------------------------------------------------------- { - rlcP->output_sdu_size_to_write = 0; + rlc_pP->output_sdu_size_to_write = 0; } //----------------------------------------------------------------------------- -void rlc_am_reassembly (u8_t * srcP, s32_t lengthP, rlc_am_entity_t *rlcP, u32_t frame) +void rlc_am_reassembly (u8_t * src_pP, s32_t lengthP, rlc_am_entity_t *rlc_pP, frame_t frameP) //----------------------------------------------------------------------------- { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PAYLOAD] reassembly() %d bytes\n", frame, rlcP->module_id, rlcP->rb_id, lengthP); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PAYLOAD] reassembly() %d bytes\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + lengthP); - if (rlcP->output_sdu_in_construction == NULL) { - rlcP->output_sdu_in_construction = get_free_mem_block (RLC_SDU_MAX_SIZE); - rlcP->output_sdu_size_to_write = 0; - assert(rlcP->output_sdu_in_construction != NULL); + if (rlc_pP->output_sdu_in_construction == NULL) { + rlc_pP->output_sdu_in_construction = get_free_mem_block (RLC_SDU_MAX_SIZE); + rlc_pP->output_sdu_size_to_write = 0; + assert(rlc_pP->output_sdu_in_construction != NULL); } - if (rlcP->output_sdu_in_construction != NULL) { + if (rlc_pP->output_sdu_in_construction != NULL) { - // check if no overflow in size - if ((rlcP->output_sdu_size_to_write + lengthP) <= RLC_SDU_MAX_SIZE) { - memcpy (&rlcP->output_sdu_in_construction->data[rlcP->output_sdu_size_to_write], srcP, lengthP); + // check if no overflow in size + if ((rlc_pP->output_sdu_size_to_write + lengthP) <= RLC_SDU_MAX_SIZE) { + memcpy (&rlc_pP->output_sdu_in_construction->data[rlc_pP->output_sdu_size_to_write], src_pP, lengthP); - rlcP->output_sdu_size_to_write += lengthP; - } else { - LOG_E(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PAYLOAD] ERROR SDU SIZE OVERFLOW SDU GARBAGED\n", frame, rlcP->module_id, rlcP->rb_id); - // erase SDU - rlcP->output_sdu_size_to_write = 0; - } + rlc_pP->output_sdu_size_to_write += lengthP; + } else { + LOG_E(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PAYLOAD] ERROR SDU SIZE OVERFLOW SDU GARBAGED\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); +#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) + AssertFatal(0, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_IND, SDU SIZE OVERFLOW SDU GARBAGED\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); +#endif + // erase SDU + rlc_pP->output_sdu_size_to_write = 0; + } } else { - LOG_E(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PAYLOAD] ERROR OUTPUT SDU IS NULL\n", frame, rlcP->module_id, rlcP->rb_id); + LOG_E(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PAYLOAD] ERROR OUTPUT SDU IS NULL\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); +#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) + AssertFatal(0, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_IND, SDU DROPPED, OUT OF MEMORY\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); +#endif } } //----------------------------------------------------------------------------- -void rlc_am_send_sdu (rlc_am_entity_t *rlcP,u32_t frame, u8_t eNB_flag) +void rlc_am_send_sdu (rlc_am_entity_t *rlc_pP,frame_t frameP, eNB_flag_t eNB_flagP) //----------------------------------------------------------------------------- { - if ((rlcP->output_sdu_in_construction)) { - LOG_D(RLC, "\n\n\n[FRAME %05d][RLC_AM][MOD %02d][RB %02d][SEND_SDU] %d bytes sdu %p\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->output_sdu_size_to_write, rlcP->output_sdu_in_construction); - if (rlcP->output_sdu_size_to_write > 0) { - u8_t eNB_id; - u8_t UE_id; - if (eNB_flag == 0) { - /* FIXME: force send on first eNB */ - eNB_id = 0; - UE_id = rlcP->module_id - NB_eNB_INST; - } else { - UE_id = rlcP->rb_id / NB_RB_MAX; - eNB_id = rlcP->module_id; - } - rlcP->stat_rx_pdcp_sdu += 1; - rlcP->stat_rx_pdcp_bytes += rlcP->output_sdu_size_to_write; - #ifdef TEST_RLC_AM - rlc_am_v9_3_0_test_data_ind (rlcP->module_id, - rlcP->rb_id, - rlcP->output_sdu_size_to_write, - rlcP->output_sdu_in_construction); - #else - rlc_data_ind (rlcP->module_id, eNB_id, UE_id, frame, eNB_flag, RLC_MBMS_NO, rlcP->rb_id, rlcP->output_sdu_size_to_write, rlcP->output_sdu_in_construction, rlcP->is_data_plane); - #endif - rlcP->output_sdu_in_construction = NULL; - } else { - LOG_E(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][SEND_SDU] ERROR SIZE <= 0 ... DO NOTHING, SET SDU SIZE TO 0\n", frame,rlcP->module_id, rlcP->rb_id); - //msg("[RLC_AM][MOD %d] Freeing mem_block ...\n", rlcP->module_id); - //free_mem_block (rlcP->output_sdu_in_construction); - assert(3==4); - } - rlcP->output_sdu_size_to_write = 0; + if ((rlc_pP->output_sdu_in_construction)) { + LOG_D(RLC, "\n\n\n[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][SEND_SDU] %d bytes sdu %p\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->output_sdu_size_to_write, + rlc_pP->output_sdu_in_construction); + if (rlc_pP->output_sdu_size_to_write > 0) { + rlc_pP->stat_rx_pdcp_sdu += 1; + rlc_pP->stat_rx_pdcp_bytes += rlc_pP->output_sdu_size_to_write; +#ifdef TEST_RLC_AM + rlc_am_v9_3_0_test_data_ind (rlc_pP->module_id, + rlc_pP->rb_id, + rlc_pP->output_sdu_size_to_write, + rlc_pP->output_sdu_in_construction); +#else + rlc_data_ind (rlc_pP->enb_module_id, rlc_pP->ue_module_id, frameP, eNB_flagP, RLC_MBMS_NO, rlc_pP->rb_id, rlc_pP->output_sdu_size_to_write, rlc_pP->output_sdu_in_construction, rlc_pP->is_data_plane); +#endif + rlc_pP->output_sdu_in_construction = NULL; + } else { + LOG_E(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][SEND_SDU] ERROR SIZE <= 0 ... DO NOTHING, SET SDU SIZE TO 0\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + //msg("[RLC_AM][MOD %d] Freeing mem_block ...\n", rlc_pP->module_id); + //free_mem_block (rlc_pP->output_sdu_in_construction); + assert(3==4); + } + rlc_pP->output_sdu_size_to_write = 0; } } //----------------------------------------------------------------------------- -void rlc_am_reassemble_pdu(rlc_am_entity_t* rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP) { -//----------------------------------------------------------------------------- - int i,j; +void rlc_am_reassemble_pdu(rlc_am_entity_t* rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, mem_block_t* tb_pP) { + //----------------------------------------------------------------------------- + int i,j; - rlc_am_pdu_info_t* pdu_info = &((rlc_am_rx_pdu_management_t*)(tbP->data))->pdu_info; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU SN=%03d\n", frame, rlcP->module_id, rlcP->rb_id, pdu_info->sn); + rlc_am_pdu_info_t* pdu_info = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU SN=%03d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + pdu_info->sn); #ifdef TRACE_RLC_AM_RX_DECODE - rlc_am_display_data_pdu_infos(rlcP, frame, pdu_info); + rlc_am_display_data_pdu_infos(rlc_pP, frameP, pdu_info); #endif - if (pdu_info->e == RLC_E_FIXED_PART_DATA_FIELD_FOLLOW) { - switch (pdu_info->fi) { - case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=11 (00)\n", frame, rlcP->module_id, rlcP->rb_id); - // one complete SDU - rlc_am_send_sdu(rlcP,frame,eNB_flag); // may be not necessary - rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); // may be not necessary - //rlcP->reassembly_missing_sn_detected = 0; - break; - case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=10 (01)\n", frame, rlcP->module_id, rlcP->rb_id); - // one beginning segment of SDU in PDU - rlc_am_send_sdu(rlcP,frame,eNB_flag); // may be not necessary - rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); - //rlcP->reassembly_missing_sn_detected = 0; - break; - case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=01 (10)\n", frame, rlcP->module_id, rlcP->rb_id); - // one last segment of SDU - //if (rlcP->reassembly_missing_sn_detected == 0) { - rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - //} // else { clear sdu already done - //rlcP->reassembly_missing_sn_detected = 0; - break; - case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=00 (11)\n", frame, rlcP->module_id, rlcP->rb_id); - //if (rlcP->reassembly_missing_sn_detected == 0) { - // one whole segment of SDU in PDU - rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); - //} else { - // rlcP->reassembly_missing_sn_detected = 1; // not necessary but for readability of the code - //} + if (pdu_info->e == RLC_E_FIXED_PART_DATA_FIELD_FOLLOW) { + switch (pdu_info->fi) { + case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=11 (00)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + // one complete SDU + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); // may be not necessary + rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); // may be not necessary + //rlc_pP->reassembly_missing_sn_detected = 0; + break; + case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=10 (01)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + // one beginning segment of SDU in PDU + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); // may be not necessary + rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlc_pP,frameP); + //rlc_pP->reassembly_missing_sn_detected = 0; + break; + case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=01 (10)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + // one last segment of SDU + //if (rlc_pP->reassembly_missing_sn_detected == 0) { + rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + //} // else { clear sdu already done + //rlc_pP->reassembly_missing_sn_detected = 0; + break; + case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=00 (11)\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + //if (rlc_pP->reassembly_missing_sn_detected == 0) { + // one whole segment of SDU in PDU + rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlc_pP,frameP); + //} else { + // rlc_pP->reassembly_missing_sn_detected = 1; // not necessary but for readability of the code + //} - break; + break; #ifdef USER_MODE - default: - assert(0 != 0); + default: + assert(0 != 0); #endif + } + } else { + switch (pdu_info->fi) { + case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=11 (00) Li=", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + for (i=0; i < pdu_info->num_li; i++) { + LOG_D(RLC, "%d ",pdu_info->li_list[i]); + } + LOG_D(RLC, "\n"); + //msg(" remaining size %d\n",size); + // N complete SDUs + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + j = 0; + for (i = 0; i < pdu_info->num_li; i++) { + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + j = j + pdu_info->li_list[i]; + } + if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug + // data is already ok, done by last loop above + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + } + //rlc_pP->reassembly_missing_sn_detected = 0; + break; + case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=10 (01) Li=", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + for (i=0; i < pdu_info->num_li; i++) { + LOG_D(RLC, "%d ",pdu_info->li_list[i]); + } + LOG_D(RLC, "\n"); + //msg(" remaining size %d\n",size); + // N complete SDUs + one segment of SDU in PDU + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + j = 0; + for (i = 0; i < pdu_info->num_li; i++) { + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + j = j + pdu_info->li_list[i]; } - } else { - switch (pdu_info->fi) { - case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=11 (00) Li=", frame, rlcP->module_id, rlcP->rb_id); - for (i=0; i < pdu_info->num_li; i++) { - LOG_D(RLC, "%d ",pdu_info->li_list[i]); - } - LOG_D(RLC, "\n"); - //msg(" remaining size %d\n",size); - // N complete SDUs - rlc_am_send_sdu(rlcP,frame,eNB_flag); - j = 0; - for (i = 0; i < pdu_info->num_li; i++) { - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - j = j + pdu_info->li_list[i]; - } - if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug - // data is already ok, done by last loop above - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - } - //rlcP->reassembly_missing_sn_detected = 0; - break; - case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=10 (01) Li=", frame, rlcP->module_id, rlcP->rb_id); - for (i=0; i < pdu_info->num_li; i++) { - LOG_D(RLC, "%d ",pdu_info->li_list[i]); - } - LOG_D(RLC, "\n"); - //msg(" remaining size %d\n",size); - // N complete SDUs + one segment of SDU in PDU - rlc_am_send_sdu(rlcP,frame,eNB_flag); - j = 0; - for (i = 0; i < pdu_info->num_li; i++) { - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - j = j + pdu_info->li_list[i]; - } - if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug - // data is already ok, done by last loop above - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP, frame); - } - //rlcP->reassembly_missing_sn_detected = 0; - break; - case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=01 (10) Li=", frame, rlcP->module_id, rlcP->rb_id); - for (i=0; i < pdu_info->num_li; i++) { - LOG_D(RLC, "%d ",pdu_info->li_list[i]); - } - LOG_D(RLC, "\n"); - //msg(" remaining size %d\n",size); - // one last segment of SDU + N complete SDUs in PDU - j = 0; - for (i = 0; i < pdu_info->num_li; i++) { - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - j = j + pdu_info->li_list[i]; - } - if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug - // data is already ok, done by last loop above - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - } - //rlcP->reassembly_missing_sn_detected = 0; - break; - case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=00 (11) Li=", frame, rlcP->module_id, rlcP->rb_id); - for (i=0; i < pdu_info->num_li; i++) { - LOG_D(RLC, "%d ",pdu_info->li_list[i]); - } - LOG_D(RLC, "\n"); - //msg(" remaining size %d\n",size); - j = 0; - for (i = 0; i < pdu_info->num_li; i++) { - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); - rlc_am_send_sdu(rlcP,frame,eNB_flag); - j = j + pdu_info->li_list[i]; - } - if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug - // data is already ok, done by last loop above - rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP,frame); - } else { + if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug + // data is already ok, done by last loop above + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlc_pP, frameP); + } + //rlc_pP->reassembly_missing_sn_detected = 0; + break; + case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=01 (10) Li=", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + for (i=0; i < pdu_info->num_li; i++) { + LOG_D(RLC, "%d ",pdu_info->li_list[i]); + } + LOG_D(RLC, "\n"); + //msg(" remaining size %d\n",size); + // one last segment of SDU + N complete SDUs in PDU + j = 0; + for (i = 0; i < pdu_info->num_li; i++) { + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + j = j + pdu_info->li_list[i]; + } + if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug + // data is already ok, done by last loop above + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + } + //rlc_pP->reassembly_missing_sn_detected = 0; + break; + case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=00 (11) Li=", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + for (i=0; i < pdu_info->num_li; i++) { + LOG_D(RLC, "%d ",pdu_info->li_list[i]); + } + LOG_D(RLC, "\n"); + //msg(" remaining size %d\n",size); + j = 0; + for (i = 0; i < pdu_info->num_li; i++) { + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlc_pP,frameP); + rlc_am_send_sdu(rlc_pP,frameP,eNB_flagP); + j = j + pdu_info->li_list[i]; + } + if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug + // data is already ok, done by last loop above + rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlc_pP,frameP); + } else { #ifdef USER_MODE - //assert (5!=5); + //assert (5!=5); #endif - } - //rlcP->reassembly_missing_sn_detected = 0; - break; + } + //rlc_pP->reassembly_missing_sn_detected = 0; + break; #ifdef USER_MODE - default: - assert(1 != 1); + default: + assert(1 != 1); #endif - } - } - free_mem_block(tbP); + } + } + free_mem_block(tb_pP); } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h index 551ab976cc..2dc00490fb 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h @@ -56,36 +56,36 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis # define public_rlc_am_reassembly(x) extern x # endif # endif -/*! \fn void rlc_am_clear_rx_sdu (rlc_am_entity_t *rlcP) +/*! \fn void rlc_am_clear_rx_sdu (rlc_am_entity_t *rlc_pP) * \brief Reset the data cursor index in the output SDU buffer to zero. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. */ -private_rlc_am_reassembly( void rlc_am_clear_rx_sdu (rlc_am_entity_t *rlcP);) +private_rlc_am_reassembly( void rlc_am_clear_rx_sdu (rlc_am_entity_t *rlc_pP);) -/*! \fn void rlc_am_reassembly (u8_t * srcP, s32_t lengthP, rlc_am_entity_t *rlcP,u32_t frame) +/*! \fn void rlc_am_reassembly (u8_t * srcP, s32_t lengthP, rlc_am_entity_t *rlc_pP,frame_t frameP) * \brief Concatenate datas at the tail of the output SDU in construction. This SDU in construction will be sent to higher layer. * \param[in] srcP Pointer on data to be reassemblied. * \param[in] lengthP Length of data to be reassemblied. -* \param[in] rlcP RLC AM protocol instance pointer. -* \param[in] frame Frame index. +* \param[in] rlc_pP RLC AM protocol instance pointer. +* \param[in] frameP Frame index. */ -private_rlc_am_reassembly( void rlc_am_reassembly (u8_t * srcP, s32_t lengthP, rlc_am_entity_t *rlcP,u32_t frame);) +private_rlc_am_reassembly( void rlc_am_reassembly (u8_t * srcP, s32_t lengthP, rlc_am_entity_t *rlc_pP,frame_t frameP);) -/*! \fn void rlc_am_send_sdu (rlc_am_entity_t *rlcP,u32_t frame) +/*! \fn void rlc_am_send_sdu (rlc_am_entity_t *rlc_pP,frame_t frameP) * \brief Send the output SDU in construction to higher layer. -* \param[in] rlcP RLC AM protocol instance pointer. -* \param[in] frame Frame index. +* \param[in] rlc_pP RLC AM protocol instance pointer. +* \param[in] frameP Frame index. */ -private_rlc_am_reassembly( void rlc_am_send_sdu (rlc_am_entity_t *rlcP,u32_t frame, u8_t eNB_flag);) +private_rlc_am_reassembly( void rlc_am_send_sdu (rlc_am_entity_t *rlc_pP,frame_t frameP, eNB_flag_t eNB_flagP);) -/*! \fn void rlc_am_reassemble_pdu(rlc_am_entity_t* rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP) +/*! \fn void rlc_am_reassemble_pdu(rlc_am_entity_t* rlc_pP, frame_t frameP, u8_t eNB_flagP, mem_block_t* tb_pP) * \brief Reassembly a RLC AM PDU, depending of the content of this PDU, data will be reassemblied to the current output SDU, the current will be sent to higher layers or not, after or before the reassembly, or no send of SDU will be triggered, depending on FI field in PDU header. -* \param[in] rlcP RLC AM protocol instance pointer. -* \param[in] frame Frame index. -* \param[in] eNB_flag Flag to indicate eNB (1) or UE (0). -* \param[in] tbP RLC AM PDU embedded in a mem_block_t. +* \param[in] rlc_pP RLC AM protocol instance pointer. +* \param[in] frameP Frame index. +* \param[in] eNB_flagP Flag to indicate eNB (1) or UE (0). +* \param[in] tb_pP RLC AM PDU embedded in a mem_block_t. */ -protected_rlc_am_reassembly( void rlc_am_reassemble_pdu(rlc_am_entity_t* rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP);) +protected_rlc_am_reassembly( void rlc_am_reassemble_pdu(rlc_am_entity_t* rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, mem_block_t* tb_pP);) /** @} */ #endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c index c95bbd38b8..6e95f55e55 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -42,194 +42,248 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis //#define DEBUG_RLC_AM_DISPLAY_TB_DATA //#define RLC_AM_GENERATE_ERRORS //----------------------------------------------------------------------------- -signed int rlc_am_get_data_pdu_infos(u32_t frame, rlc_am_pdu_sn_10_t* headerP, s16_t total_sizeP, rlc_am_pdu_info_t* pdu_infoP) +signed int rlc_am_get_data_pdu_infos(frame_t frameP, rlc_am_pdu_sn_10_t* header_pP, s16_t total_sizeP, rlc_am_pdu_info_t* pdu_info_pP) //----------------------------------------------------------------------------- { - memset(pdu_infoP, 0, sizeof (rlc_am_pdu_info_t)); + memset(pdu_info_pP, 0, sizeof (rlc_am_pdu_info_t)); s16_t sum_li = 0; - pdu_infoP->d_c = headerP->b1 >> 7; - pdu_infoP->num_li = 0; + pdu_info_pP->d_c = header_pP->b1 >> 7; + pdu_info_pP->num_li = 0; - if (pdu_infoP->d_c) { - pdu_infoP->rf = (headerP->b1 >> 6) & 0x01; - pdu_infoP->p = (headerP->b1 >> 5) & 0x01; - pdu_infoP->fi = (headerP->b1 >> 3) & 0x03; - pdu_infoP->e = (headerP->b1 >> 2) & 0x01; - pdu_infoP->sn = headerP->b2 + (((u16_t)(headerP->b1 & 0x03)) << 8); + if (pdu_info_pP->d_c) { + pdu_info_pP->rf = (header_pP->b1 >> 6) & 0x01; + pdu_info_pP->p = (header_pP->b1 >> 5) & 0x01; + pdu_info_pP->fi = (header_pP->b1 >> 3) & 0x03; + pdu_info_pP->e = (header_pP->b1 >> 2) & 0x01; + pdu_info_pP->sn = header_pP->b2 + (((u16_t)(header_pP->b1 & 0x03)) << 8); - pdu_infoP->header_size = 2; - if (pdu_infoP->rf) { - pdu_infoP->lsf = (headerP->data[0] >> 7) & 0x01; - pdu_infoP->so = headerP->data[1] + (((u16_t)(headerP->data[0] & 0x7F)) << 8); - pdu_infoP->payload = &headerP->data[2]; - pdu_infoP->header_size += 2; + pdu_info_pP->header_size = 2; + if (pdu_info_pP->rf) { + pdu_info_pP->lsf = (header_pP->data[0] >> 7) & 0x01; + pdu_info_pP->so = header_pP->data[1] + (((u16_t)(header_pP->data[0] & 0x7F)) << 8); + pdu_info_pP->payload = &header_pP->data[2]; + pdu_info_pP->header_size += 2; } else { - pdu_infoP->payload = &headerP->data[0]; + pdu_info_pP->payload = &header_pP->data[0]; } - if (pdu_infoP->e) { + if (pdu_info_pP->e) { rlc_am_e_li_t *e_li; unsigned int li_length_in_bytes = 1; unsigned int li_to_read = 1; - if (pdu_infoP->rf) { - e_li = (rlc_am_e_li_t*)(&headerP->data[2]); + if (pdu_info_pP->rf) { + e_li = (rlc_am_e_li_t*)(&header_pP->data[2]); } else { - e_li = (rlc_am_e_li_t*)(headerP->data); + e_li = (rlc_am_e_li_t*)(header_pP->data); } while (li_to_read) { li_length_in_bytes = li_length_in_bytes ^ 3; if (li_length_in_bytes == 2) { - pdu_infoP->li_list[pdu_infoP->num_li] = ((u16_t)(e_li->b1 << 4)) & 0x07F0; - pdu_infoP->li_list[pdu_infoP->num_li] |= (((u8_t)(e_li->b2 >> 4)) & 0x000F); + pdu_info_pP->li_list[pdu_info_pP->num_li] = ((u16_t)(e_li->b1 << 4)) & 0x07F0; + pdu_info_pP->li_list[pdu_info_pP->num_li] |= (((u8_t)(e_li->b2 >> 4)) & 0x000F); li_to_read = e_li->b1 & 0x80; - pdu_infoP->header_size += 2; + pdu_info_pP->header_size += 2; } else { - pdu_infoP->li_list[pdu_infoP->num_li] = ((u16_t)(e_li->b2 << 8)) & 0x0700; - pdu_infoP->li_list[pdu_infoP->num_li] |= e_li->b3; + pdu_info_pP->li_list[pdu_info_pP->num_li] = ((u16_t)(e_li->b2 << 8)) & 0x0700; + pdu_info_pP->li_list[pdu_info_pP->num_li] |= e_li->b3; li_to_read = e_li->b2 & 0x08; e_li++; - pdu_infoP->header_size += 1; + pdu_info_pP->header_size += 1; } - sum_li += pdu_infoP->li_list[pdu_infoP->num_li]; - pdu_infoP->num_li = pdu_infoP->num_li + 1; - if (pdu_infoP->num_li > RLC_AM_MAX_SDU_IN_PDU) { - LOG_E(RLC, "[FRAME %05d][RLC_AM][MOD XX][RB XX][GET PDU INFO] SN %04d TOO MANY LIs ", frame, pdu_infoP->sn); + sum_li += pdu_info_pP->li_list[pdu_info_pP->num_li]; + pdu_info_pP->num_li = pdu_info_pP->num_li + 1; + if (pdu_info_pP->num_li > RLC_AM_MAX_SDU_IN_PDU) { + LOG_E(RLC, "[FRAME %5u][RLC_AM][MOD XX][RB XX][GET PDU INFO] SN %04d TOO MANY LIs ", + frameP, + pdu_info_pP->sn); return -2; } } if (li_length_in_bytes == 2) { - pdu_infoP->payload = &e_li->b3; + pdu_info_pP->payload = &e_li->b3; } else { - pdu_infoP->payload = &e_li->b1; + pdu_info_pP->payload = &e_li->b1; } } - pdu_infoP->payload_size = total_sizeP - pdu_infoP->header_size; - if (pdu_infoP->payload_size > sum_li) { - pdu_infoP->hidden_size = pdu_infoP->payload_size - sum_li; + pdu_info_pP->payload_size = total_sizeP - pdu_info_pP->header_size; + if (pdu_info_pP->payload_size > sum_li) { + pdu_info_pP->hidden_size = pdu_info_pP->payload_size - sum_li; } return 0; } else { - LOG_W(RLC, "[FRAME %05d][RLC_AM][MOD XX][RB XX][GET DATA PDU INFO] SN %04d ERROR CONTROL PDU ", frame, pdu_infoP->sn); + LOG_W(RLC, "[FRAME %5u][RLC_AM][MOD XX][RB XX][GET DATA PDU INFO] SN %04d ERROR CONTROL PDU ", + frameP, + pdu_info_pP->sn); return -1; } } //----------------------------------------------------------------------------- -void rlc_am_display_data_pdu_infos(rlc_am_entity_t *rlcP, u32_t frame, rlc_am_pdu_info_t* pdu_infoP) +void rlc_am_display_data_pdu_infos(rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_am_pdu_info_t* pdu_info_pP) //----------------------------------------------------------------------------- { int num_li; - if (pdu_infoP->d_c) { - if (pdu_infoP->rf) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][DISPLAY DATA PDU] RX DATA PDU SN %04d FI %1d SO %05d LSF %01d POLL %1d ", frame, rlcP->module_id, rlcP->rb_id, pdu_infoP->sn, pdu_infoP->fi, pdu_infoP->so, pdu_infoP->lsf, pdu_infoP->p); + if (pdu_info_pP->d_c) { + if (pdu_info_pP->rf) { + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][DISPLAY DATA PDU] RX DATA PDU SN %04d FI %1d SO %05d LSF %01d POLL %1d ", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + pdu_info_pP->sn, + pdu_info_pP->fi, + pdu_info_pP->so, + pdu_info_pP->lsf, pdu_info_pP->p); } else { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][DISPLAY DATA PDU] RX DATA PDU SN %04d FI %1d POLL %1d ", frame, rlcP->module_id, rlcP->rb_id, pdu_infoP->sn, pdu_infoP->fi, pdu_infoP->p); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][DISPLAY DATA PDU] RX DATA PDU SN %04d FI %1d POLL %1d ", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + pdu_info_pP->sn, + pdu_info_pP->fi, + pdu_info_pP->p); } - for (num_li = 0; num_li < pdu_infoP->num_li; num_li++) { - LOG_D(RLC, "LI %05d ", pdu_infoP->li_list[num_li]); + for (num_li = 0; num_li < pdu_info_pP->num_li; num_li++) { + LOG_D(RLC, "LI %05d ", pdu_info_pP->li_list[num_li]); } - if (pdu_infoP->hidden_size > 0) { - LOG_D(RLC, "hidden size %05d ", pdu_infoP->hidden_size); + if (pdu_info_pP->hidden_size > 0) { + LOG_D(RLC, "hidden size %05d ", pdu_info_pP->hidden_size); } LOG_D(RLC, "\n"); } else { - LOG_E(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][DISPLAY DATA PDU] ERROR RX CONTROL PDU\n", frame, rlcP->module_id, rlcP->rb_id); + LOG_E(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][DISPLAY DATA PDU] ERROR RX CONTROL PDU\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); } } -// assumed the sn of the tb is equal to VR(MS) +// assumed the sn of the tb_p is equal to VR(MS) //----------------------------------------------------------------------------- -void rlc_am_rx_update_vr_ms(rlc_am_entity_t *rlcP, u32_t frame, mem_block_t* tbP) +void rlc_am_rx_update_vr_ms(rlc_am_entity_t *rlc_pP, frame_t frameP, mem_block_t* tb_pP) //----------------------------------------------------------------------------- { - //rlc_am_pdu_info_t* pdu_info = &((rlc_am_rx_pdu_management_t*)(tbP->data))->pdu_info; - rlc_am_pdu_info_t* pdu_info_cursor; - mem_block_t* cursor; + //rlc_am_pdu_info_t* pdu_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + rlc_am_pdu_info_t* pdu_info_cursor_p = NULL; + mem_block_t* cursor_p; - cursor = tbP; - if (cursor) { + cursor_p = tb_pP; + if (cursor_p) { do { - pdu_info_cursor = &((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info; - if (((rlc_am_rx_pdu_management_t*)(cursor->data))->all_segments_received == 0) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + if (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->all_segments_received == 0) { #ifdef TRACE_RLC_AM_RX - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vr_ms, pdu_info_cursor->sn); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vr_ms, pdu_info_cursor_p->sn); #endif - rlcP->vr_ms = pdu_info_cursor->sn; + rlc_pP->vr_ms = pdu_info_cursor_p->sn; return; } - cursor = cursor->next; - } while (cursor != NULL); + cursor_p = cursor_p->next; + } while (cursor_p != NULL); #ifdef TRACE_RLC_AM_RX - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vr_ms, (pdu_info_cursor->sn + 1) & RLC_AM_SN_MASK); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vr_ms, + (pdu_info_cursor_p->sn + 1) & RLC_AM_SN_MASK); #endif - rlcP->vr_ms = (pdu_info_cursor->sn + 1) & RLC_AM_SN_MASK; + rlc_pP->vr_ms = (pdu_info_cursor_p->sn + 1) & RLC_AM_SN_MASK; } } -// assumed the sn of the tb is equal to VR(R) +// assumed the sn of the tb_p is equal to VR(R) //----------------------------------------------------------------------------- -void rlc_am_rx_update_vr_r(rlc_am_entity_t *rlcP,u32_t frame,mem_block_t* tbP) +void rlc_am_rx_update_vr_r(rlc_am_entity_t *rlc_pP,frame_t frameP,mem_block_t* tb_pP) //----------------------------------------------------------------------------- { - rlc_am_pdu_info_t* pdu_info_cursor; - mem_block_t* cursor; - cursor = tbP; - if (cursor) { + rlc_am_pdu_info_t* pdu_info_cursor_p = NULL; + mem_block_t* cursor_p; + + cursor_p = tb_pP; + if (cursor_p) { do { - pdu_info_cursor = &((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info; - if ((((rlc_am_rx_pdu_management_t*)(cursor->data))->all_segments_received == 0) || - (rlcP->vr_r != pdu_info_cursor->sn)) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + if ((((rlc_am_rx_pdu_management_t*)(cursor_p->data))->all_segments_received == 0) || + (rlc_pP->vr_r != pdu_info_cursor_p->sn)) { return; } #ifdef TRACE_RLC_AM_RX - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][UPDATE VR(R)] UPDATED VR(R) %04d -> %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vr_r, (pdu_info_cursor->sn + 1) & RLC_AM_SN_MASK); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][UPDATE VR(R)] UPDATED VR(R) %04d -> %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vr_r, + (pdu_info_cursor_p->sn + 1) & RLC_AM_SN_MASK); #endif - if (((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info.rf == 1) { - if (((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info.lsf == 1) { - rlcP->vr_r = (rlcP->vr_r + 1) & RLC_AM_SN_MASK; + if (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info.rf == 1) { + if (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info.lsf == 1) { + rlc_pP->vr_r = (rlc_pP->vr_r + 1) & RLC_AM_SN_MASK; } } else { - rlcP->vr_r = (rlcP->vr_r + 1) & RLC_AM_SN_MASK; + rlc_pP->vr_r = (rlc_pP->vr_r + 1) & RLC_AM_SN_MASK; } - cursor = cursor->next; - } while (cursor != NULL); - //rlcP->vr_r = (pdu_info_cursor->sn + 1) & RLC_AM_SN_MASK; + cursor_p = cursor_p->next; + } while (cursor_p != NULL); + //rlc_pP->vr_r = (pdu_info_cursor_p->sn + 1) & RLC_AM_SN_MASK; } } //----------------------------------------------------------------------------- void -rlc_am_receive_routing (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flag, struct mac_data_ind data_indP) +rlc_am_receive_routing (rlc_am_entity_t *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, struct mac_data_ind data_indP) //----------------------------------------------------------------------------- { - mem_block_t *tb; - u8_t *first_byte; + mem_block_t *tb_p = NULL; + u8_t *first_byte_p = NULL; s16_t tb_size_in_bytes; - while ((tb = list_remove_head (&data_indP.data))) { - first_byte = ((struct mac_tb_ind *) (tb->data))->data_ptr; - tb_size_in_bytes = ((struct mac_tb_ind *) (tb->data))->size; + while ((tb_p = list_remove_head (&data_indP.data))) { + first_byte_p = ((struct mac_tb_ind *) (tb_p->data))->data_ptr; + tb_size_in_bytes = ((struct mac_tb_ind *) (tb_p->data))->size; if (tb_size_in_bytes > 0) { - if ((*first_byte & 0x80) == 0x80) { - rlcP->stat_rx_data_bytes += tb_size_in_bytes; - rlcP->stat_rx_data_pdu += 1; - rlc_am_receive_process_data_pdu (rlcP, frame, eNB_flag, tb, first_byte, tb_size_in_bytes); + if ((*first_byte_p & 0x80) == 0x80) { + rlc_pP->stat_rx_data_bytes += tb_size_in_bytes; + rlc_pP->stat_rx_data_pdu += 1; + rlc_am_receive_process_data_pdu (rlc_pP, frameP, eNB_flagP, tb_p, first_byte_p, tb_size_in_bytes); } else { - rlcP->stat_rx_control_bytes += tb_size_in_bytes; - rlcP->stat_rx_control_pdu += 1; - rlc_am_receive_process_control_pdu (rlcP, frame, tb, &first_byte, &tb_size_in_bytes); + rlc_pP->stat_rx_control_bytes += tb_size_in_bytes; + rlc_pP->stat_rx_control_pdu += 1; + rlc_am_receive_process_control_pdu (rlc_pP, frameP, tb_p, &first_byte_p, &tb_size_in_bytes); // Test if remaining bytes not processed (up to know, highest probability is bug in MAC) AssertFatal( tb_size_in_bytes == 0, "Remaining %d bytes following a control PDU", tb_size_in_bytes); } - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][RX ROUTING] VR(R)=%03d VR(MR)=%03d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vr_r, rlcP->vr_mr); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][RX ROUTING] VR(R)=%03d VR(MR)=%03d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vr_r, + rlc_pP->vr_mr); } } // end while } //----------------------------------------------------------------------------- -void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP, u8_t* first_byteP, u16_t tb_size_in_bytesP) +void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, mem_block_t* tb_pP, u8_t* first_byte_pP, u16_t tb_size_in_bytesP) //----------------------------------------------------------------------------- { // 5.1.3.2 Receive operations @@ -258,29 +312,54 @@ void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t e // - place the received RLC data PDU in the reception buffer; // - if some byte segments of the AMD PDU contained in the RLC data PDU have been received before: // - discard the duplicate byte segments. - rlc_am_pdu_info_t* pdu_info = &((rlc_am_rx_pdu_management_t*)(tbP->data))->pdu_info; - rlc_am_pdu_sn_10_t* rlc_am_pdu_sn_10 = (rlc_am_pdu_sn_10_t*)first_byteP; + rlc_am_pdu_info_t* pdu_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + rlc_am_pdu_sn_10_t* rlc_am_pdu_sn_10_p = (rlc_am_pdu_sn_10_t*)first_byte_pP; - if (rlc_am_get_data_pdu_infos(frame,rlc_am_pdu_sn_10, tb_size_in_bytesP, pdu_info) >= 0) { + if (rlc_am_get_data_pdu_infos(frameP,rlc_am_pdu_sn_10_p, tb_size_in_bytesP, pdu_info_p) >= 0) { - ((rlc_am_rx_pdu_management_t*)(tbP->data))->all_segments_received = 0; - if (rlc_am_in_rx_window(rlcP, pdu_info->sn)) { + ((rlc_am_rx_pdu_management_t*)(tb_pP->data))->all_segments_received = 0; + if (rlc_am_in_rx_window(rlc_pP, pdu_info_p->sn)) { - if (pdu_info->p) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] POLL BIT SET, STATUS REQUESTED:\n", frame, rlcP->module_id, rlcP->rb_id); - rlcP->status_requested = 1; + if (pdu_info_p->p) { + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][PROCESS RX PDU] POLL BIT SET, STATUS REQUESTED:\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + rlc_pP->status_requested = 1; } - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vr_r, rlcP->vr_h, rlcP->vr_mr, rlcP->vr_ms, rlcP->vr_x); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vr_r, + rlc_pP->vr_h, + rlc_pP->vr_mr, + rlc_pP->vr_ms, + rlc_pP->vr_x); - if (rlc_am_rx_list_insert_pdu(rlcP, frame,tbP) < 0) { - rlcP->stat_rx_data_pdu_dropped += 1; - rlcP->stat_rx_data_bytes_dropped += tb_size_in_bytesP; - free_mem_block (tbP); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] PDU DISCARDED, STATUS REQUESTED:\n", frame, rlcP->module_id, rlcP->rb_id); - rlcP->status_requested = 1; + if (rlc_am_rx_list_insert_pdu(rlc_pP, frameP,tb_pP) < 0) { + rlc_pP->stat_rx_data_pdu_dropped += 1; + rlc_pP->stat_rx_data_bytes_dropped += tb_size_in_bytesP; + free_mem_block (tb_pP); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][PROCESS RX PDU] PDU DISCARDED, STATUS REQUESTED:\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + rlc_pP->status_requested = 1; #if defined(RLC_STOP_ON_LOST_PDU) AssertFatal( 0 == 1, - "[FRAME %05d][RLC_AM][MOD %d][RB %d] LOST PDU DETECTED\n", frame, rlcP->module_id, rlcP->rb_id); + "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] LOST PDU DETECTED\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); #endif } else { // 5.1.3.2.3 @@ -316,45 +395,64 @@ void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t e #ifdef TRACE_RLC_AM_RX - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] RX LIST AFTER INSERTION:\n", frame, rlcP->module_id, rlcP->rb_id); - rlc_am_rx_list_display(rlcP, "rlc_am_receive_process_data_pdu AFTER INSERTION "); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][PROCESS RX PDU] RX LIST AFTER INSERTION:\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + rlc_am_rx_list_display(rlc_pP, "rlc_am_receive_process_data_pdu AFTER INSERTION "); #endif - if (rlc_am_sn_gte_vr_h(rlcP, pdu_info->sn) > 0) { - rlcP->vr_h = (pdu_info->sn + 1) & RLC_AM_SN_MASK; + if (rlc_am_sn_gte_vr_h(rlc_pP, pdu_info_p->sn) > 0) { + rlc_pP->vr_h = (pdu_info_p->sn + 1) & RLC_AM_SN_MASK; } - rlc_am_rx_check_all_byte_segments(rlcP, frame, tbP); - if ((pdu_info->sn == rlcP->vr_ms) && (((rlc_am_rx_pdu_management_t*)(tbP->data))->all_segments_received)) { - rlc_am_rx_update_vr_ms(rlcP, frame, tbP); + rlc_am_rx_check_all_byte_segments(rlc_pP, frameP, tb_pP); + if ((pdu_info_p->sn == rlc_pP->vr_ms) && (((rlc_am_rx_pdu_management_t*)(tb_pP->data))->all_segments_received)) { + rlc_am_rx_update_vr_ms(rlc_pP, frameP, tb_pP); } - if (pdu_info->sn == rlcP->vr_r) { - if (((rlc_am_rx_pdu_management_t*)(tbP->data))->all_segments_received) { - rlc_am_rx_update_vr_r(rlcP, frame, tbP); - rlcP->vr_mr = (rlcP->vr_r + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; + if (pdu_info_p->sn == rlc_pP->vr_r) { + if (((rlc_am_rx_pdu_management_t*)(tb_pP->data))->all_segments_received) { + rlc_am_rx_update_vr_r(rlc_pP, frameP, tb_pP); + rlc_pP->vr_mr = (rlc_pP->vr_r + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; } - rlc_am_rx_list_reassemble_rlc_sdus(rlcP,frame,eNB_flag); + rlc_am_rx_list_reassemble_rlc_sdus(rlc_pP,frameP,eNB_flagP); } - if (rlcP->t_reordering.running) { - if ((rlcP->vr_x == rlcP->vr_r) || ((rlc_am_in_rx_window(rlcP, pdu_info->sn) == 0) && (rlcP->vr_x != rlcP->vr_mr))) { - rlc_am_stop_and_reset_timer_reordering(rlcP,frame); + if (rlc_pP->t_reordering.running) { + if ((rlc_pP->vr_x == rlc_pP->vr_r) || ((rlc_am_in_rx_window(rlc_pP, pdu_info_p->sn) == 0) && (rlc_pP->vr_x != rlc_pP->vr_mr))) { + rlc_am_stop_and_reset_timer_reordering(rlc_pP,frameP); } } - if (!(rlcP->t_reordering.running)) { - if (rlcP->vr_h != rlcP->vr_r) { // - if VR (H) > VR(R) translated to - if VR (H) != VR(R) - rlc_am_start_timer_reordering(rlcP,frame); - rlcP->vr_x = rlcP->vr_h; + if (!(rlc_pP->t_reordering.running)) { + if (rlc_pP->vr_h != rlc_pP->vr_r) { // - if VR (H) > VR(R) translated to - if VR (H) != VR(R) + rlc_am_start_timer_reordering(rlc_pP,frameP); + rlc_pP->vr_x = rlc_pP->vr_h; } } } - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MS) %04d VR(MR) %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vr_r, rlcP->vr_h, rlcP->vr_ms, rlcP->vr_mr); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MS) %04d VR(MR) %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vr_r, + rlc_pP->vr_h, + rlc_pP->vr_ms, + rlc_pP->vr_mr); } else { - rlcP->stat_rx_data_pdu_out_of_window += 1; - rlcP->stat_rx_data_bytes_out_of_window += tb_size_in_bytesP; - free_mem_block (tbP); - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] PDU OUT OF RX WINDOW, DISCARDED, STATUS REQUESTED:\n", frame, rlcP->module_id, rlcP->rb_id); - rlcP->status_requested = 1; + rlc_pP->stat_rx_data_pdu_out_of_window += 1; + rlc_pP->stat_rx_data_bytes_out_of_window += tb_size_in_bytesP; + free_mem_block (tb_pP); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][PROCESS RX PDU] PDU OUT OF RX WINDOW, DISCARDED, STATUS REQUESTED:\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id); + rlc_pP->status_requested = 1; } } else { - free_mem_block (tbP); + free_mem_block (tb_pP); } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h index 34662c701f..2934b6c0db 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h @@ -56,7 +56,7 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis # define public_rlc_am_receiver(x) extern x # endif # endif -/*! \fn signed int rlc_am_get_data_pdu_infos(u32_t frame, rlc_am_pdu_sn_10_t* headerP, s16_t sizeP, rlc_am_pdu_info_t* pdu_infoP) +/*! \fn signed int rlc_am_get_data_pdu_infos(frame_t frameP, rlc_am_pdu_sn_10_t* headerP, s16_t sizeP, rlc_am_pdu_info_t* pdu_infoP) * \brief Extract PDU informations (header fields, data size, etc) from the serialized PDU. * \param[in] frame Frame index. * \param[in] headerP RLC AM header PDU pointer. @@ -64,52 +64,52 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis * \param[in] pdu_infoP Structure containing extracted informations from PDU. * \return 0 if no error was encountered during the parsing of the PDU, else -1; */ -protected_rlc_am_receiver( signed int rlc_am_get_data_pdu_infos(u32_t frame, rlc_am_pdu_sn_10_t* headerP, s16_t sizeP, rlc_am_pdu_info_t* pdu_infoP)); +protected_rlc_am_receiver( signed int rlc_am_get_data_pdu_infos(frame_t frameP, rlc_am_pdu_sn_10_t* headerP, s16_t sizeP, rlc_am_pdu_info_t* pdu_infoP)); -/*! \fn void rlc_am_display_data_pdu_infos(rlc_am_entity_t *rlcP, u32_t frame, rlc_am_pdu_info_t* pdu_infoP) +/*! \fn void rlc_am_display_data_pdu_infos(rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_am_pdu_info_t* pdu_infoP) * \brief Display RLC AM PDU informations. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index. * \param[in] pdu_infoP Structure containing extracted informations of a PDU. */ -protected_rlc_am_receiver( void rlc_am_display_data_pdu_infos(rlc_am_entity_t *rlcP, u32_t frame, rlc_am_pdu_info_t* pdu_infoP);) +protected_rlc_am_receiver( void rlc_am_display_data_pdu_infos(rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_am_pdu_info_t* pdu_infoP);) -/*! \fn void rlc_am_rx_update_vr_ms(rlc_am_entity_t *rlcP,mem_block_t* tbP) +/*! \fn void rlc_am_rx_update_vr_ms(rlc_am_entity_t *rlc_pP,mem_block_t* tb_pP) * \brief Update RLC AM protocol variable VR(MS). -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index. -* \param[in] tbP PDU embedded in a mem_block_t struct. +* \param[in] tb_pP PDU embedded in a mem_block_t struct. * \note It is assumed that the sequence number of the transport block is equal to VR(MS) */ -protected_rlc_am_receiver( void rlc_am_rx_update_vr_ms(rlc_am_entity_t *rlcP,u32_t frame, mem_block_t* tbP);) +protected_rlc_am_receiver( void rlc_am_rx_update_vr_ms(rlc_am_entity_t *rlc_pP,frame_t frameP, mem_block_t* tb_pP);) -/*! \fn void rlc_am_rx_update_vr_r (rlc_am_entity_t *rlcP,u32_t frame,mem_block_t* tbP) +/*! \fn void rlc_am_rx_update_vr_r (rlc_am_entity_t *rlc_pP,frame_t frameP,mem_block_t* tb_pP) * \brief Update RLC AM protocol variable VR(R). -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index. -* \param[in] tbP PDU embedded in a mem_block_t struct. +* \param[in] tb_pP PDU embedded in a mem_block_t struct. * \note It is assumed that the sequence number of the transport block is equal to VR(R) */ -protected_rlc_am_receiver( void rlc_am_rx_update_vr_r (rlc_am_entity_t *rlcP,u32_t frame, mem_block_t* tbP);) +protected_rlc_am_receiver( void rlc_am_rx_update_vr_r (rlc_am_entity_t *rlc_pP,frame_t frameP, mem_block_t* tb_pP);) -/*! \fn void rlc_am_receive_routing (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flag, struct mac_data_ind data_indP) +/*! \fn void rlc_am_receive_routing (rlc_am_entity_t *rlc_pP, frame_t frameP, u8_t eNB_flagP, struct mac_data_ind data_indP) * \brief Convert transport blocks received from MAC layer into RLC AM PDUs, and dispatch to the right processing block these PDUS upon their type (CONTROL/DATA). -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index. -* \param[in] eNB_flag Flag to indicate eNB (1) or UE (0). +* \param[in] eNB_flagP Flag to indicate eNB (1) or UE (0). * \param[in] data_indP Transport blocks received from MAC layer. */ -protected_rlc_am_receiver( void rlc_am_receive_routing (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flag, struct mac_data_ind data_indP)); +protected_rlc_am_receiver( void rlc_am_receive_routing (rlc_am_entity_t *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, struct mac_data_ind data_indP)); -/*! \fn void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP, u8_t* first_byteP, u16_t tb_size_in_bytesP) +/*! \fn void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlc_pP, frame_t frameP, u8_t eNB_flagP, mem_block_t* tb_pP, u8_t* first_byteP, u16_t tb_size_in_bytesP) * \brief Process an incoming data PDU received from MAC layer. -* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] frame Frame index. -* \param[in] eNB_flag Flag to indicate eNB (1) or UE (0). -* \param[in] tbP PDU embedded in a mem_block_t struct. +* \param[in] eNB_flagP Flag to indicate eNB (1) or UE (0). +* \param[in] tb_pP PDU embedded in a mem_block_t struct. * \param[in] first_byteP Pointer on first byte of the PDU. * \param[in] tb_size_in_bytesP Transport block size in bytes (same as PDU size in bytes). */ -private_rlc_am_receiver( void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP, u8_t* first_byteP, u16_t tb_size_in_bytesP)); +private_rlc_am_receiver( void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP, mem_block_t* tb_pP, u8_t* first_byteP, u16_t tb_size_in_bytesP)); /** @} */ # endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c index 4ad7f018e1..87db121184 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -40,7 +40,7 @@ Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis //#define TRACE_RLC_AM_NACK //#define TRACE_RLC_AM_ACK //----------------------------------------------------------------------------- -void rlc_am_nack_pdu (rlc_am_entity_t *rlcP, u32_t frame, u16_t snP, u16_t so_startP, u16_t so_endP) +void rlc_am_nack_pdu (rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_sn_t snP, sdu_size_t so_startP, sdu_size_t so_endP) //----------------------------------------------------------------------------- { // 5.2.1 Retransmission @@ -56,12 +56,12 @@ void rlc_am_nack_pdu (rlc_am_entity_t *rlcP, u32_t frame, u16_t snP, u16_t so_st // - indicate to upper layers that max retransmission has been reached. - mem_block_t* mb = rlcP->pdu_retrans_buffer[snP].mem_block; + mem_block_t* mb_pP = rlc_pP->pdu_retrans_buffer[snP].mem_block; int pdu_sdu_index; int sdu_index; - if (mb != NULL) { - rlcP->num_nack_sn += 1; + if (mb_pP != NULL) { + rlc_pP->num_nack_sn += 1; assert(so_startP <= so_endP); //----------------------------------------- // allow holes in reports @@ -69,94 +69,109 @@ void rlc_am_nack_pdu (rlc_am_entity_t *rlcP, u32_t frame, u16_t snP, u16_t so_st // increasing order among calls refering to only one status PDU // and among time //----------------------------------------- - if (rlcP->pdu_retrans_buffer[snP].last_nack_time != frame) { - rlcP->pdu_retrans_buffer[snP].last_nack_time = frame; - rlc_am_clear_holes(rlcP, snP); + if (rlc_pP->pdu_retrans_buffer[snP].last_nack_time != frameP) { + rlc_pP->pdu_retrans_buffer[snP].last_nack_time = frameP; + rlc_am_clear_holes(rlc_pP, snP); } if (!((so_startP == 0) && (so_endP == 0x7FFF))) { - rlcP->num_nack_so += 1; + rlc_pP->num_nack_so += 1; } - rlc_am_add_hole(rlcP, frame, snP, so_startP, so_endP); + rlc_am_add_hole(rlc_pP, frameP, snP, so_startP, so_endP); - if (rlcP->first_retrans_pdu_sn < 0) { - rlcP->first_retrans_pdu_sn = snP; - } else if (rlc_am_tx_sn1_gt_sn2(rlcP, rlcP->first_retrans_pdu_sn, snP)){ - rlcP->first_retrans_pdu_sn = snP; + if (rlc_pP->first_retrans_pdu_sn < 0) { + rlc_pP->first_retrans_pdu_sn = snP; + } else if (rlc_am_tx_sn1_gt_sn2(rlc_pP, rlc_pP->first_retrans_pdu_sn, snP)){ + rlc_pP->first_retrans_pdu_sn = snP; } - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][NACK-PDU] NACK PDU SN %04d previous retx_count %d 1ST_RETRANS_PDU %04d\n", - frame, - rlcP->module_id, - rlcP->rb_id, - snP, - rlcP->pdu_retrans_buffer[snP].retx_count, - rlcP->first_retrans_pdu_sn); - - rlcP->pdu_retrans_buffer[snP].flags.retransmit = 1; - - if (rlcP->pdu_retrans_buffer[snP].retx_count == -1) { - rlcP->pdu_retrans_buffer[snP].retx_count = 0; - rlcP->retrans_num_bytes_to_retransmit += rlcP->pdu_retrans_buffer[snP].header_and_payload_size; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][NACK-PDU] NACK PDU SN %04d previous retx_count %d 1ST_RETRANS_PDU %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + snP, + rlc_pP->pdu_retrans_buffer[snP].retx_count, + rlc_pP->first_retrans_pdu_sn); + + rlc_pP->pdu_retrans_buffer[snP].flags.retransmit = 1; + + if (rlc_pP->pdu_retrans_buffer[snP].retx_count == -1) { + rlc_pP->pdu_retrans_buffer[snP].retx_count = 0; + rlc_pP->retrans_num_bytes_to_retransmit += rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size; } else { - rlcP->pdu_retrans_buffer[snP].retx_count += 1; + rlc_pP->pdu_retrans_buffer[snP].retx_count += 1; } - if (rlcP->pdu_retrans_buffer[snP].retx_count >= rlcP->max_retx_threshold) { - for (pdu_sdu_index = 0; pdu_sdu_index < rlcP->pdu_retrans_buffer[snP].nb_sdus; pdu_sdu_index++) { - sdu_index = rlcP->pdu_retrans_buffer[snP].sdus_index[pdu_sdu_index]; + if (rlc_pP->pdu_retrans_buffer[snP].retx_count >= rlc_pP->max_retx_threshold) { + for (pdu_sdu_index = 0; pdu_sdu_index < rlc_pP->pdu_retrans_buffer[snP].nb_sdus; pdu_sdu_index++) { + sdu_index = rlc_pP->pdu_retrans_buffer[snP].sdus_index[pdu_sdu_index]; assert(pdu_sdu_index < RLC_AM_MAX_SDU_IN_PDU); assert(sdu_index < RLC_AM_SDU_CONTROL_BUFFER_SIZE); - rlcP->input_sdus[sdu_index].nb_pdus_ack += 1; - if (rlcP->input_sdus[sdu_index].nb_pdus_ack == rlcP->input_sdus[sdu_index].nb_pdus) { + rlc_pP->input_sdus[sdu_index].nb_pdus_ack += 1; + if (rlc_pP->input_sdus[sdu_index].nb_pdus_ack == rlc_pP->input_sdus[sdu_index].nb_pdus) { #ifdef TEST_RLC_AM - rlc_am_v9_3_0_test_data_conf (rlcP->module_id, rlcP->rb_id, rlcP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_NO); + rlc_am_v9_3_0_test_data_conf (rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_NO); #else - rlc_data_conf(rlcP->module_id, frame, rlcP->is_enb, rlcP->rb_id, rlcP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_NO, rlcP->is_data_plane); + rlc_data_conf(rlc_pP->enb_module_id, rlc_pP->ue_module_id, frameP, rlc_pP->is_enb, rlc_pP->rb_id, rlc_pP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_NO, rlc_pP->is_data_plane); #endif - rlcP->stat_tx_pdcp_sdu_discarded += 1; - rlcP->stat_tx_pdcp_bytes_discarded += rlcP->input_sdus[sdu_index].sdu_size; - rlc_am_free_in_sdu(rlcP, frame, sdu_index); + rlc_pP->stat_tx_pdcp_sdu_discarded += 1; + rlc_pP->stat_tx_pdcp_bytes_discarded += rlc_pP->input_sdus[sdu_index].sdu_size; + rlc_am_free_in_sdu(rlc_pP, frameP, sdu_index); } } } } else { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][NACK-PDU] ERROR NACK MISSING PDU SN %05d\n", frame, rlcP->module_id, rlcP->rb_id, snP); + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][NACK-PDU] ERROR NACK MISSING PDU SN %05d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + snP); //assert(2==3); } } //----------------------------------------------------------------------------- -void rlc_am_ack_pdu (rlc_am_entity_t *rlcP, u32_t frame, u16_t snP) +void rlc_am_ack_pdu (rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_sn_t snP) //----------------------------------------------------------------------------- { - mem_block_t* mb = rlcP->pdu_retrans_buffer[snP].mem_block; + mem_block_t* mb_pP = rlc_pP->pdu_retrans_buffer[snP].mem_block; int pdu_sdu_index; int sdu_index; - rlcP->pdu_retrans_buffer[snP].flags.retransmit = 0; - - if ((rlcP->pdu_retrans_buffer[snP].flags.ack == 0) && (mb != NULL)) { - //if (mb != NULL) { - free_mem_block(mb); - rlcP->pdu_retrans_buffer[snP].mem_block = NULL; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][ACK-PDU] ACK PDU SN %05d previous retx_count %d \n", frame, rlcP->module_id, rlcP->rb_id, snP, rlcP->pdu_retrans_buffer[snP].retx_count); - rlcP->retrans_num_pdus -= 1; - rlcP->retrans_num_bytes -= rlcP->pdu_retrans_buffer[snP].header_and_payload_size; - - if (rlcP->pdu_retrans_buffer[snP].retx_count >= 0) { - rlcP->retrans_num_bytes_to_retransmit -= rlcP->pdu_retrans_buffer[snP].header_and_payload_size; + rlc_pP->pdu_retrans_buffer[snP].flags.retransmit = 0; + + if ((rlc_pP->pdu_retrans_buffer[snP].flags.ack == 0) && (mb_pP != NULL)) { + //if (mb_pP != NULL) { + free_mem_block(mb_pP); + rlc_pP->pdu_retrans_buffer[snP].mem_block = NULL; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][ACK-PDU] ACK PDU SN %05d previous retx_count %d \n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + snP, + rlc_pP->pdu_retrans_buffer[snP].retx_count); + rlc_pP->retrans_num_pdus -= 1; + rlc_pP->retrans_num_bytes -= rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size; + + if (rlc_pP->pdu_retrans_buffer[snP].retx_count >= 0) { + rlc_pP->retrans_num_bytes_to_retransmit -= rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size; } - for (pdu_sdu_index = 0; pdu_sdu_index < rlcP->pdu_retrans_buffer[snP].nb_sdus; pdu_sdu_index++) { - sdu_index = rlcP->pdu_retrans_buffer[snP].sdus_index[pdu_sdu_index]; + for (pdu_sdu_index = 0; pdu_sdu_index < rlc_pP->pdu_retrans_buffer[snP].nb_sdus; pdu_sdu_index++) { + sdu_index = rlc_pP->pdu_retrans_buffer[snP].sdus_index[pdu_sdu_index]; assert(sdu_index >= 0); assert(sdu_index < RLC_AM_SDU_CONTROL_BUFFER_SIZE); - rlcP->input_sdus[sdu_index].nb_pdus_ack += 1; - if ((rlcP->input_sdus[sdu_index].nb_pdus_ack == rlcP->input_sdus[sdu_index].nb_pdus) && - (rlcP->input_sdus[sdu_index].sdu_remaining_size == 0)) { + rlc_pP->input_sdus[sdu_index].nb_pdus_ack += 1; + if ((rlc_pP->input_sdus[sdu_index].nb_pdus_ack == rlc_pP->input_sdus[sdu_index].nb_pdus) && + (rlc_pP->input_sdus[sdu_index].sdu_remaining_size == 0)) { #ifdef TEST_RLC_AM - rlc_am_v9_3_0_test_data_conf (rlcP->module_id, rlcP->rb_id, rlcP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_YES); + rlc_am_v9_3_0_test_data_conf (rlc_pP->module_id, rlc_pP->rb_id, rlc_pP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_YES); #else - rlc_data_conf(rlcP->module_id, frame, rlcP->is_enb, rlcP->rb_id, rlcP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_YES, rlcP->is_data_plane); + rlc_data_conf(rlc_pP->enb_module_id, rlc_pP->ue_module_id, frameP, rlc_pP->is_enb, rlc_pP->rb_id, rlc_pP->input_sdus[sdu_index].mui, RLC_SDU_CONFIRM_YES, rlc_pP->is_data_plane); #endif - rlc_am_free_in_sdu(rlcP, frame, sdu_index); + rlc_am_free_in_sdu(rlc_pP, frameP, sdu_index); } } // 7.1... @@ -164,83 +179,117 @@ void rlc_am_ack_pdu (rlc_am_entity_t *rlcP, u32_t frame, u16_t snP) // This state variable holds the value of the SN of the next AMD PDU for which a positive acknowledgment is to be // received in-sequence, and it serves as the lower edge of the transmitting window. It is initially set to 0, and is updated // whenever the AM RLC entity receives a positive acknowledgment for an AMD PDU with SN = VT(A). - rlcP->pdu_retrans_buffer[snP].flags.ack = 1; - if (snP == rlcP->vt_a) { - //rlcP->pdu_retrans_buffer[snP].flags.ack = 1; + rlc_pP->pdu_retrans_buffer[snP].flags.ack = 1; + if (snP == rlc_pP->vt_a) { + //rlc_pP->pdu_retrans_buffer[snP].flags.ack = 1; do { - memset(&rlcP->pdu_retrans_buffer[rlcP->vt_a], 0, sizeof(rlc_am_tx_data_pdu_management_t)); - if (rlcP->vt_a == rlcP->first_retrans_pdu_sn) { - rlcP->first_retrans_pdu_sn = (rlcP->vt_a + 1) & RLC_AM_SN_MASK; + memset(&rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a], 0, sizeof(rlc_am_tx_data_pdu_management_t)); + if (rlc_pP->vt_a == rlc_pP->first_retrans_pdu_sn) { + rlc_pP->first_retrans_pdu_sn = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; } - rlcP->vt_a = (rlcP->vt_a + 1) & RLC_AM_SN_MASK; - } while ((rlcP->pdu_retrans_buffer[rlcP->vt_a].flags.ack == 1) && (rlcP->vt_a != rlcP->vt_s)); - - - rlcP->vt_ms = (rlcP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][ACK-PDU] UPDATED VT(A) %04d VT(MS) %04d VT(S) %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vt_a, rlcP->vt_ms, rlcP->vt_s); + rlc_pP->vt_a = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; + } while ((rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a].flags.ack == 1) && (rlc_pP->vt_a != rlc_pP->vt_s)); + + + rlc_pP->vt_ms = (rlc_pP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][ACK-PDU] UPDATED VT(A) %04d VT(MS) %04d VT(S) %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vt_a, + rlc_pP->vt_ms, + rlc_pP->vt_s); } - if (snP == rlcP->first_retrans_pdu_sn) { + if (snP == rlc_pP->first_retrans_pdu_sn) { do { - rlcP->first_retrans_pdu_sn = (rlcP->first_retrans_pdu_sn + 1) & RLC_AM_SN_MASK; - if (rlcP->pdu_retrans_buffer[rlcP->first_retrans_pdu_sn].retx_count >= 0) { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][ACK-PDU] UPDATED first_retrans_pdu_sn -> %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->first_retrans_pdu_sn); + rlc_pP->first_retrans_pdu_sn = (rlc_pP->first_retrans_pdu_sn + 1) & RLC_AM_SN_MASK; + if (rlc_pP->pdu_retrans_buffer[rlc_pP->first_retrans_pdu_sn].retx_count >= 0) { + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][ACK-PDU] UPDATED first_retrans_pdu_sn -> %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->first_retrans_pdu_sn); break; } - } while (rlcP->first_retrans_pdu_sn != rlcP->vt_s); - if (rlcP->vt_s == rlcP->first_retrans_pdu_sn) { - rlcP->first_retrans_pdu_sn = -1; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][ACK-PDU] UPDATED first_retrans_pdu_sn -> %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->first_retrans_pdu_sn); + } while (rlc_pP->first_retrans_pdu_sn != rlc_pP->vt_s); + if (rlc_pP->vt_s == rlc_pP->first_retrans_pdu_sn) { + rlc_pP->first_retrans_pdu_sn = -1; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][ACK-PDU] UPDATED first_retrans_pdu_sn -> %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->first_retrans_pdu_sn); } } } else { - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][ACK-PDU] WARNING ACK PDU SN %05d -> NO PDU TO ACK\n", frame, rlcP->module_id, rlcP->rb_id, snP); - if (mb != NULL) { - free_mem_block(mb); - rlcP->pdu_retrans_buffer[snP].mem_block = NULL; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][ACK-PDU] WARNING ACK PDU SN %05d -> NO PDU TO ACK\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + snP); + if (mb_pP != NULL) { + free_mem_block(mb_pP); + rlc_pP->pdu_retrans_buffer[snP].mem_block = NULL; } - if (rlcP->pdu_retrans_buffer[snP].flags.ack > 0) { - if (snP == rlcP->vt_a) { - //rlcP->pdu_retrans_buffer[snP].flags.ack = 1; + if (rlc_pP->pdu_retrans_buffer[snP].flags.ack > 0) { + if (snP == rlc_pP->vt_a) { + //rlc_pP->pdu_retrans_buffer[snP].flags.ack = 1; do { - memset(&rlcP->pdu_retrans_buffer[rlcP->vt_a], 0, sizeof(rlc_am_tx_data_pdu_management_t)); - if (rlcP->vt_a == rlcP->first_retrans_pdu_sn) { - rlcP->first_retrans_pdu_sn = (rlcP->vt_a + 1) & RLC_AM_SN_MASK; + memset(&rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a], 0, sizeof(rlc_am_tx_data_pdu_management_t)); + if (rlc_pP->vt_a == rlc_pP->first_retrans_pdu_sn) { + rlc_pP->first_retrans_pdu_sn = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; } - rlcP->vt_a = (rlcP->vt_a + 1) & RLC_AM_SN_MASK; - } while ((rlcP->pdu_retrans_buffer[rlcP->vt_a].flags.ack == 1) && (rlcP->vt_a != rlcP->vt_s)); - - rlcP->vt_ms = (rlcP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; - LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][ACK-PDU] UPDATED VT(A) %04d VT(MS) %04d VT(S) %04d\n", frame, rlcP->module_id, rlcP->rb_id, rlcP->vt_a, rlcP->vt_ms, rlcP->vt_s); + rlc_pP->vt_a = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; + } while ((rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a].flags.ack == 1) && (rlc_pP->vt_a != rlc_pP->vt_s)); + + rlc_pP->vt_ms = (rlc_pP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; + LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u][ACK-PDU] UPDATED VT(A) %04d VT(MS) %04d VT(S) %04d\n", + frameP, + (rlc_pP->is_enb) ? "eNB" : "UE", + rlc_pP->enb_module_id, + rlc_pP->ue_module_id, + rlc_pP->rb_id, + rlc_pP->vt_a, + rlc_pP->vt_ms, + rlc_pP->vt_s); } } } } //----------------------------------------------------------------------------- -mem_block_t* rlc_am_retransmit_get_copy (rlc_am_entity_t *rlcP, u32 frame, u16_t snP) +mem_block_t* rlc_am_retransmit_get_copy (rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_sn_t snP) //----------------------------------------------------------------------------- { - mem_block_t* mb_original = rlcP->pdu_retrans_buffer[snP].mem_block; - if (mb_original != NULL) { + mem_block_t* mb_original_p = rlc_pP->pdu_retrans_buffer[snP].mem_block; + if (mb_original_p != NULL) { - rlc_am_tx_data_pdu_management_t *pdu_mngt = &rlcP->pdu_retrans_buffer[snP % RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE]; + rlc_am_tx_data_pdu_management_t *pdu_mngt = &rlc_pP->pdu_retrans_buffer[snP % RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE]; int size = pdu_mngt->header_and_payload_size + sizeof(struct mac_tb_req); mem_block_t* mb_copy = get_free_mem_block(size); - memcpy(mb_copy->data, mb_original->data, size); + memcpy(mb_copy->data, mb_original_p->data, size); - rlc_am_pdu_sn_10_t *pdu = (rlc_am_pdu_sn_10_t*) (&mb_copy->data[sizeof(struct mac_tb_req)]); - ((struct mac_tb_req*)(mb_copy->data))->data_ptr = (u8_t*)pdu; + rlc_am_pdu_sn_10_t *pdu_p = (rlc_am_pdu_sn_10_t*) (&mb_copy->data[sizeof(struct mac_tb_req)]); + ((struct mac_tb_req*)(mb_copy->data))->data_ptr = (u8_t*)pdu_p; pdu_mngt->flags.retransmit = 0; - rlc_am_pdu_polling(rlcP, frame, pdu, pdu_mngt->payload_size); + rlc_am_pdu_polling(rlc_pP, frameP, pdu_p, pdu_mngt->payload_size); return mb_copy; } else { return NULL; } } //----------------------------------------------------------------------------- -mem_block_t* rlc_am_retransmit_get_subsegment(rlc_am_entity_t *rlcP, u32_t frame, u16_t snP, u16_t *sizeP) +mem_block_t* rlc_am_retransmit_get_subsegment(rlc_am_entity_t *rlc_pP, frame_t frameP, rlc_sn_t snP, sdu_size_t *sizeP) //----------------------------------------------------------------------------- { @@ -287,33 +336,45 @@ mem_block_t* rlc_am_retransmit_get_subsegment(rlc_am_entity_t *rlcP, u32_t frame // - set the header of the new AMD PDU segment in accordance with the description in sub clause 6.; // - set the P field according to sub clause 5.2.2. - mem_block_t* mb_original = rlcP->pdu_retrans_buffer[snP].mem_block; + mem_block_t* mb_original_p = rlc_pP->pdu_retrans_buffer[snP].mem_block; - if (mb_original != NULL) { - mem_block_t* mb_sub_segment = get_free_mem_block(*sizeP + sizeof(struct mac_tb_req)); - rlc_am_pdu_sn_10_t* pdu_original = (rlc_am_pdu_sn_10_t*) (&mb_original->data[sizeof(struct mac_tb_req)]); - rlc_am_pdu_sn_10_t* pdu_sub_segment = (rlc_am_pdu_sn_10_t*) (&mb_sub_segment->data[sizeof(struct mac_tb_req)]); + if (mb_original_p != NULL) { + mem_block_t* mb_sub_segment_p = get_free_mem_block(*sizeP + sizeof(struct mac_tb_req)); + rlc_am_