Commit d6b7e02d authored by alexandr's avatar alexandr

Bugs fixed in PHY/MAC/RRC HO process + X2 features added

parent ca86e1f0
...@@ -119,6 +119,7 @@ endmacro(add_list_string_option) ...@@ -119,6 +119,7 @@ endmacro(add_list_string_option)
#################################################### ####################################################
# compilation flags # compilation flags
############################################# #############################################
#set(CMAKE_BUILD_TYPE "Debug")
if (CMAKE_BUILD_TYPE STREQUAL "") if (CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "RelWithDebInfo") set(CMAKE_BUILD_TYPE "RelWithDebInfo")
endif() endif()
...@@ -1617,11 +1618,11 @@ add_executable(oaisim_nos1 ...@@ -1617,11 +1618,11 @@ add_executable(oaisim_nos1
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
target_link_libraries (oaisim_nos1 target_link_libraries (oaisim_nos1
-Wl,--start-group -Wl,--start-group
RRC_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} ${X2AP_LIB} ${X2AP_ENB} RRC_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} ${X2AP_LIB} ${X2AP_ENB} SCTP_CLIENT
-Wl,--end-group ) -Wl,--end-group )
target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} sctp
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
#Force link with forms, regardless XFORMS option #Force link with forms, regardless XFORMS option
target_link_libraries (oaisim_nos1 forms) target_link_libraries (oaisim_nos1 forms)
......
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
set (ENABLE_USE_X2 True)
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
set ( ADDR_CONF False ) set ( ADDR_CONF False )
set ( DEBUG_OMG False ) set ( DEBUG_OMG False )
...@@ -19,7 +21,7 @@ set ( ENABLE_USE_MME False ) ...@@ -19,7 +21,7 @@ set ( ENABLE_USE_MME False )
set ( ENABLE_USE_RAW_SOCKET_FOR_SGI False) set ( ENABLE_USE_RAW_SOCKET_FOR_SGI False)
set ( ENABLE_VCD_FIFO False ) set ( ENABLE_VCD_FIFO False )
set ( ENB_MODE True ) set ( ENB_MODE True )
set ( EXMIMO_IOT True ) set ( EXMIMO_IOT False )
set ( HARD_RT False ) set ( HARD_RT False )
set ( JUMBO_FRAME True ) set ( JUMBO_FRAME True )
set ( LARGE_SCALE False ) set ( LARGE_SCALE False )
......
...@@ -601,8 +601,8 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility ...@@ -601,8 +601,8 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility
else else
lte_frame_parms->nb_antennas_tx = 1; lte_frame_parms->nb_antennas_tx = 1;
//PHICH //PHICH (check if long to enum conversion is valid)
if (radioResourceConfigCommon->antennaInfoCommon) { if (radioResourceConfigCommon->phich_Config){
lte_frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; lte_frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource;
lte_frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; lte_frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration;
} }
...@@ -621,6 +621,9 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility ...@@ -621,6 +621,9 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility
PHY_vars_UE_g[Mod_id][CC_id]->lte_ue_pdcch_vars[eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8); PHY_vars_UE_g[Mod_id][CC_id]->lte_ue_pdcch_vars[eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
// Update channels
PHY_vars_UE_g[Mod_id][CC_id]->dlsch_ue[eNB_id][CC_id]->rnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_id]->rnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
} }
if(ho_failed) { if(ho_failed) {
...@@ -1481,3 +1484,39 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, ...@@ -1481,3 +1484,39 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB,
return (0); return (0);
} }
// Configure ue state in case of handover
void phy_config_ue_state_ho(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti){
uint32_t k,j;
int UE_id = find_UE_id(Mod_id,rnti);
if(UE_id==-1){
printf("Program exited: phy_config_ue_state_ho: UE does not exist\n");
exit(-1);
}
LOG_I(PHY, "ho called for eNB %d CC %d rnti %x UE_id %d\n", Mod_id, CC_id, rnti, UE_id);
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].mode = PUSCH;
PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[UE_id]->Msg3_flag = 0;
// HARQ processes
for (k=0; k<8; k++){ //harq_processes
for (j=0; j<PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[UE_id][0]->Mdlharq; j++) {
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_NAK[k][j]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_ACK[k][j]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_trials[k][j]=0;
}
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_l2_errors[k]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].ulsch_errors[k]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].ulsch_consecutive_errors=0;
for (j=0; j<PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[UE_id]->Mdlharq; j++) {
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].ulsch_decoding_attempts[k][j]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].ulsch_decoding_attempts_last[k][j]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].ulsch_round_errors[k][j]=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].ulsch_round_fer[k][j]=0;
}
}
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_sliding_cnt=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_NAK_round0=0;
PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[UE_id].dlsch_mcs_offset=0;
}
...@@ -42,8 +42,8 @@ ...@@ -42,8 +42,8 @@
#include "LAYER2/MAC/extern.h" #include "LAYER2/MAC/extern.h"
//uint8_t ncs_cell[20][7]; //uint8_t ncs_cell[20][7];
//#define DEBUG_PUCCH_TX #define DEBUG_PUCCH_TX
//#define DEBUG_PUCCH_RX #define DEBUG_PUCCH_RX
int16_t cfo_pucch_np[24*7] = {20787,-25330,27244,-18205,31356,-9512,32767,0,31356,9511,27244,18204,20787,25329, int16_t cfo_pucch_np[24*7] = {20787,-25330,27244,-18205,31356,-9512,32767,0,31356,9511,27244,18204,20787,25329,
27244,-18205,30272,-12540,32137,-6393,32767,0,32137,6392,30272,12539,27244,18204, 27244,-18205,30272,-12540,32137,-6393,32767,0,32137,6392,30272,12539,27244,18204,
......
...@@ -3751,6 +3751,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ ...@@ -3751,6 +3751,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
phy_vars_eNB->eNB_UE_stats[i].crnti); phy_vars_eNB->eNB_UE_stats[i].crnti);
remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
/*this is a bug: we have to break here*/
} }
/* /*
......
...@@ -381,7 +381,7 @@ void *eNB_app_task(void *args_p) ...@@ -381,7 +381,7 @@ void *eNB_app_task(void *args_p)
itti_mark_task_ready (TASK_ENB_APP); itti_mark_task_ready (TASK_ENB_APP);
# if defined(ENABLE_USE_MME) # if defined(ENABLE_ITTI)
# if defined(OAI_EMU) # if defined(OAI_EMU)
enb_nb = oai_emulation.info.nb_enb_local; enb_nb = oai_emulation.info.nb_enb_local;
enb_id_start = oai_emulation.info.first_enb_local; enb_id_start = oai_emulation.info.first_enb_local;
...@@ -415,6 +415,9 @@ void *eNB_app_task(void *args_p) ...@@ -415,6 +415,9 @@ void *eNB_app_task(void *args_p)
# endif # endif
# if defined(ENABLE_USE_X2) # if defined(ENABLE_USE_X2)
enb_nb = oai_emulation.info.nb_enb_local;
enb_id_start = oai_emulation.info.first_enb_local;
enb_id_end = oai_emulation.info.first_enb_local + enb_nb;
/* Try to register each eNB with each other */ /* Try to register each eNB with each other */
x2_registered_enb = 0; x2_registered_enb = 0;
x2_register_enb_pending = eNB_app_register_x2 (enb_id_start, enb_id_end, enb_properties_p); x2_register_enb_pending = eNB_app_register_x2 (enb_id_start, enb_id_end, enb_properties_p);
......
...@@ -261,8 +261,10 @@ rrc_mac_config_req( ...@@ -261,8 +261,10 @@ rrc_mac_config_req(
if (physicalConfigDedicated != NULL) { if (physicalConfigDedicated != NULL) {
if (eNB_flagP==1) { if (eNB_flagP==1) {
printf("PHY-config-debug-enb\n");
mac_xface->phy_config_dedicated_eNB(Mod_id, CC_id, UE_RNTI(Mod_id, UE_id), physicalConfigDedicated); mac_xface->phy_config_dedicated_eNB(Mod_id, CC_id, UE_RNTI(Mod_id, UE_id), physicalConfigDedicated);
} else { } else {
printf("PHY-config-debug-ue\n");
mac_xface->phy_config_dedicated_ue(Mod_id,0,eNB_index,physicalConfigDedicated); mac_xface->phy_config_dedicated_ue(Mod_id,0,eNB_index,physicalConfigDedicated);
UE_mac_inst[Mod_id].physicalConfigDedicated=physicalConfigDedicated; // for SR proc UE_mac_inst[Mod_id].physicalConfigDedicated=physicalConfigDedicated; // for SR proc
} }
......
...@@ -130,7 +130,11 @@ void rx_sdu( ...@@ -130,7 +130,11 @@ void rx_sdu(
enb_mod_idP, CC_idP, rx_ces[i], i,num_ce, payload_ptr[0], payload_ptr[1]); enb_mod_idP, CC_idP, rx_ces[i], i,num_ce, payload_ptr[0], payload_ptr[1]);
UE_id = find_UE_id(enb_mod_idP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]); UE_id = find_UE_id(enb_mod_idP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]);
/* TODO: maybe check that the CRNTI is in handover mode? */ /* TODO: maybe check that the CRNTI is in handover mode? */
if (UE_id != -1) rntiP = (((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]; if (UE_id != -1) {
rntiP = (((uint16_t)payload_ptr[0])<<8) + payload_ptr[1];
phy_config_ue_state_ho(enb_mod_idP,CC_idP,rntiP);
eNB_mac_inst[enb_mod_idP].UE_list.UE_template[UE_PCCID(enb_mod_idP,UE_id)][UE_id].configured = 1;
}
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : CRNTI %x (UE_id %d) in Msg3\n",enb_mod_idP, CC_idP, rx_ces[i], (((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id); LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : CRNTI %x (UE_id %d) in Msg3\n",enb_mod_idP, CC_idP, rx_ces[i], (((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id);
payload_ptr+=2; payload_ptr+=2;
......
...@@ -516,6 +516,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui ...@@ -516,6 +516,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
mac_xface->phy_config_sib2_eNB = phy_config_sib2_eNB; mac_xface->phy_config_sib2_eNB = phy_config_sib2_eNB;
mac_xface->phy_config_sib2_ue = phy_config_sib2_ue; mac_xface->phy_config_sib2_ue = phy_config_sib2_ue;
mac_xface->phy_config_afterHO_ue = phy_config_afterHO_ue; mac_xface->phy_config_afterHO_ue = phy_config_afterHO_ue;
mac_xface->phy_config_ue_state_ho = phy_config_ue_state_ho;
#ifdef Rel10 #ifdef Rel10
mac_xface->phy_config_sib13_eNB = phy_config_sib13_eNB; mac_xface->phy_config_sib13_eNB = phy_config_sib13_eNB;
mac_xface->phy_config_sib13_ue = phy_config_sib13_ue; mac_xface->phy_config_sib13_ue = phy_config_sib13_ue;
......
...@@ -758,6 +758,8 @@ int rrc_mac_config_req(module_id_t module_idP, ...@@ -758,6 +758,8 @@ int rrc_mac_config_req(module_id_t module_idP,
// Assign the new c-rnti in the UE context (during HO) // Assign the new c-rnti in the UE context (during HO)
void rrc_mac_get_new_crnti(protocol_ctxt_t* ctxt_pP,uint8_t eNB_index); void rrc_mac_get_new_crnti(protocol_ctxt_t* ctxt_pP,uint8_t eNB_index);
void phy_config_ue_state_ho(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti);
/** \brief get the estimated UE distance from the PHY->MAC layer. /** \brief get the estimated UE distance from the PHY->MAC layer.
@param Mod_id Instance ID of eNB @param Mod_id Instance ID of eNB
@param UE_id Index of UE if this is an eNB configuration @param UE_id Index of UE if this is an eNB configuration
......
...@@ -207,7 +207,7 @@ typedef struct { ...@@ -207,7 +207,7 @@ typedef struct {
void (*phy_config_afterHO_ue)(module_id_t Mod_id,uint8_t CC_id,uint8_t CH_index, void (*phy_config_afterHO_ue)(module_id_t Mod_id,uint8_t CC_id,uint8_t CH_index,
MobilityControlInfo_t *mobilityControlInfo, MobilityControlInfo_t *mobilityControlInfo,
uint8_t ho_failed); uint8_t ho_failed);
void (*phy_config_ue_state_ho)(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti);
/// Function to indicate failure of contention resolution or RA procedure /// Function to indicate failure of contention resolution or RA procedure
void (*ra_failed)(module_id_t Mod_id, uint8_t CC_id,uint8_t eNB_index); void (*ra_failed)(module_id_t Mod_id, uint8_t CC_id,uint8_t eNB_index);
......
...@@ -752,5 +752,5 @@ void rrc_lite_ue_update_ho_status(module_id_t Mod_idP){ ...@@ -752,5 +752,5 @@ void rrc_lite_ue_update_ho_status(module_id_t Mod_idP){
LOG_D(RRC,"Reset HO timer in RRC\n"); LOG_D(RRC,"Reset HO timer in RRC\n");
UE_rrc_inst[Mod_idP].Info[0].T304_active = 0; // Stop the timer (MAC procedure was successful) UE_rrc_inst[Mod_idP].Info[0].T304_active = 0; // Stop the timer (MAC procedure was successful)
UE_rrc_inst[Mod_idP].HandoverInfoUe.measFlag = 0; // Stop the measurements UE_rrc_inst[Mod_idP].HandoverInfoUe.measFlag = 0; // Stop the measurements
UE_rrc_inst[Mod_idP].Info[0].State = RRC_CONNECTED; //UE_rrc_inst[Mod_idP].Info[1].State = RRC_RECONFIGURED;
} }
...@@ -972,7 +972,6 @@ rrc_ue_process_radioResourceConfigDedicated( ...@@ -972,7 +972,6 @@ rrc_ue_process_radioResourceConfigDedicated(
if (UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]) { if (UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]) {
memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index],(char*)radioResourceConfigDedicated->physicalConfigDedicated, memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index],(char*)radioResourceConfigDedicated->physicalConfigDedicated,
sizeof(struct PhysicalConfigDedicated)); sizeof(struct PhysicalConfigDedicated));
} else { } else {
UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index] = radioResourceConfigDedicated->physicalConfigDedicated; UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index] = radioResourceConfigDedicated->physicalConfigDedicated;
} }
...@@ -1093,13 +1092,14 @@ rrc_ue_process_radioResourceConfigDedicated( ...@@ -1093,13 +1092,14 @@ rrc_ue_process_radioResourceConfigDedicated(
LOG_D(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 eNB %d) --->][MAC_UE][MOD %02d][]\n", LOG_D(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 eNB %d) --->][MAC_UE][MOD %02d][]\n",
ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id);
}
rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index,
(RadioResourceConfigCommonSIB_t *)NULL, (RadioResourceConfigCommonSIB_t *)NULL,
UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index],
#ifdef Rel10 #ifdef Rel10
(SCellToAddMod_r10_t *)NULL, (SCellToAddMod_r10_t *)NULL,
//struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
#endif #endif
(MeasObjectToAddMod_t **)NULL, (MeasObjectToAddMod_t **)NULL,
UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index],
1, 1,
...@@ -1113,19 +1113,18 @@ rrc_ue_process_radioResourceConfigDedicated( ...@@ -1113,19 +1113,18 @@ rrc_ue_process_radioResourceConfigDedicated(
NULL, NULL,
NULL, NULL,
NULL NULL
#ifdef Rel10 #ifdef Rel10
, ,
0, 0,
(MBSFN_AreaInfoList_r9_t *)NULL, (MBSFN_AreaInfoList_r9_t *)NULL,
(PMCH_InfoList_r9_t *)NULL (PMCH_InfoList_r9_t *)NULL
#endif #endif
#ifdef CBA #ifdef CBA
, ,
0, 0,
0 0
#endif #endif
); );
}
} else { } else {
if (UE_rrc_inst[ctxt_pP->module_id].SRB2_config[eNB_index]) { if (UE_rrc_inst[ctxt_pP->module_id].SRB2_config[eNB_index]) {
memcpy(UE_rrc_inst[ctxt_pP->module_id].SRB2_config[eNB_index],radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt], memcpy(UE_rrc_inst[ctxt_pP->module_id].SRB2_config[eNB_index],radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt],
...@@ -1151,13 +1150,14 @@ rrc_ue_process_radioResourceConfigDedicated( ...@@ -1151,13 +1150,14 @@ rrc_ue_process_radioResourceConfigDedicated(
ctxt_pP->module_id, ctxt_pP->module_id,
eNB_index, eNB_index,
ctxt_pP->module_id); ctxt_pP->module_id);
}
rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index,
(RadioResourceConfigCommonSIB_t *)NULL, (RadioResourceConfigCommonSIB_t *)NULL,
UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index],
#ifdef Rel10 #ifdef Rel10
(SCellToAddMod_r10_t *)NULL, (SCellToAddMod_r10_t *)NULL,
//struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
#endif #endif
(MeasObjectToAddMod_t **)NULL, (MeasObjectToAddMod_t **)NULL,
UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index],
2, 2,
...@@ -1171,22 +1171,21 @@ rrc_ue_process_radioResourceConfigDedicated( ...@@ -1171,22 +1171,21 @@ rrc_ue_process_radioResourceConfigDedicated(
NULL, NULL,
NULL, NULL,
NULL NULL
#ifdef Rel10 #ifdef Rel10
, ,
0, 0,
(MBSFN_AreaInfoList_r9_t *)NULL, (MBSFN_AreaInfoList_r9_t *)NULL,
(PMCH_InfoList_r9_t *)NULL (PMCH_InfoList_r9_t *)NULL
#endif #endif
#ifdef CBA #ifdef CBA
, ,
0, 0,
0 0
#endif #endif
); );
} }
} }
} }
}
// Establish DRBs if present // Establish DRBs if present
if (radioResourceConfigDedicated->drb_ToAddModList) { if (radioResourceConfigDedicated->drb_ToAddModList) {
......
...@@ -2874,7 +2874,10 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( ...@@ -2874,7 +2874,10 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover(
(void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pdsch_ConfigCommon, sizeof(PDSCH_ConfigCommon_t)); (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pdsch_ConfigCommon, sizeof(PDSCH_ConfigCommon_t));
memcpy((void *)&mobilityInfo->radioResourceConfigCommon.pusch_ConfigCommon, memcpy((void *)&mobilityInfo->radioResourceConfigCommon.pusch_ConfigCommon,
(void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pusch_ConfigCommon, sizeof(PUSCH_ConfigCommon_t)); (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pusch_ConfigCommon, sizeof(PUSCH_ConfigCommon_t));
mobilityInfo->radioResourceConfigCommon.phich_Config = NULL; mobilityInfo->radioResourceConfigCommon.phich_Config =
CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.phich_Config));
mobilityInfo->radioResourceConfigCommon.phich_Config->phich_Duration = (long)mac_xface->lte_frame_parms->phich_config_common.phich_duration;
mobilityInfo->radioResourceConfigCommon.phich_Config->phich_Resource = (long)mac_xface->lte_frame_parms->phich_config_common.phich_resource;
mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon = mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon =
CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon)); CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon));
memcpy((void *)mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon, memcpy((void *)mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon,
......
...@@ -407,6 +407,14 @@ int logInit (void) ...@@ -407,6 +407,14 @@ int logInit (void)
g_log->log_component[RRH].filelog = 0; g_log->log_component[RRH].filelog = 0;
g_log->log_component[RRH].filelog_name = ""; g_log->log_component[RRH].filelog_name = "";
g_log->log_component[X2AP].name = "X2AP";
g_log->log_component[X2AP].level = LOG_EMERG;
g_log->log_component[X2AP].flag = LOG_FULL;
g_log->log_component[X2AP].interval = 1;
g_log->log_component[X2AP].fd = 0;
g_log->log_component[X2AP].filelog = 0;
g_log->log_component[X2AP].filelog_name = "";
g_log->level2string[LOG_EMERG] = "G"; //EMERG g_log->level2string[LOG_EMERG] = "G"; //EMERG
g_log->level2string[LOG_ALERT] = "A"; // ALERT g_log->level2string[LOG_ALERT] = "A"; // ALERT
g_log->level2string[LOG_CRIT] = "C"; // CRITIC g_log->level2string[LOG_CRIT] = "C"; // CRITIC
......
...@@ -290,8 +290,12 @@ ...@@ -290,8 +290,12 @@
# define X2AP_PORT 36422 # define X2AP_PORT 36422
#endif #endif
#ifndef TRUE
#define TRUE 1 #define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0 #define FALSE 0
#endif
extern int asn_debug; extern int asn_debug;
extern int asn1_xer_print; extern int asn1_xer_print;
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <arpa/inet.h>
#include "intertask_interface.h" #include "intertask_interface.h"
...@@ -53,12 +53,17 @@ ...@@ -53,12 +53,17 @@
#include "x2ap_eNB_handler.h" #include "x2ap_eNB_handler.h"
#include "x2ap_ies_defs.h" #include "x2ap_ies_defs.h"
#include "x2ap_eNB_management_procedures.h" #include "x2ap_eNB_management_procedures.h"
#include "x2ap_eNB_generate_messages.h"
#include "msc.h" #include "msc.h"
#include "assertions.h" #include "assertions.h"
#include "conversions.h" #include "conversions.h"
struct x2ap_enb_map;
struct x2ap_eNB_data_s;
RB_PROTOTYPE(x2ap_enb_map, x2ap_eNB_data_s, entry, x2ap_eNB_compare_assoc_id);
static static
void x2ap_eNB_handle_register_eNB(instance_t instance, void x2ap_eNB_handle_register_eNB(instance_t instance,
...@@ -99,13 +104,37 @@ void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa ...@@ -99,13 +104,37 @@ void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa
DevAssert(sctp_new_association_resp != NULL); DevAssert(sctp_new_association_resp != NULL);
printf("x2ap_eNB_handle_sctp_association_resp at 1\n");
dump_trees();
instance_p = x2ap_eNB_get_instance(instance); instance_p = x2ap_eNB_get_instance(instance);
DevAssert(instance_p != NULL); DevAssert(instance_p != NULL);
/* if the assoc_id is already known, it is certainly because an IND was received
* before. In this case, just update streams and return
*/
if (sctp_new_association_resp->assoc_id != -1) {
x2ap_enb_data_p = x2ap_get_eNB(instance_p, sctp_new_association_resp->assoc_id,
sctp_new_association_resp->ulp_cnx_id);
if (x2ap_enb_data_p != NULL) {
/* some sanity check - to be refined at some point */
if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
X2AP_ERROR("x2ap_enb_data_p not NULL and sctp state not SCTP_STATE_ESTABLISHED, what to do?\n");
abort();
}
x2ap_enb_data_p->in_streams = sctp_new_association_resp->in_streams;
x2ap_enb_data_p->out_streams = sctp_new_association_resp->out_streams;
return;
}
}
x2ap_enb_data_p = x2ap_get_eNB(instance_p, -1, x2ap_enb_data_p = x2ap_get_eNB(instance_p, -1,
sctp_new_association_resp->ulp_cnx_id); sctp_new_association_resp->ulp_cnx_id);
DevAssert(x2ap_enb_data_p != NULL); DevAssert(x2ap_enb_data_p != NULL);
printf("x2ap_eNB_handle_sctp_association_resp at 2\n");
dump_trees();
if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) { if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
X2AP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n", X2AP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n",
sctp_new_association_resp->sctp_state, sctp_new_association_resp->sctp_state,
...@@ -118,15 +147,70 @@ void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa ...@@ -118,15 +147,70 @@ void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa
return; return;
} }
printf("x2ap_eNB_handle_sctp_association_resp at 3\n");
dump_trees();
/* Update parameters */ /* Update parameters */
x2ap_enb_data_p->assoc_id = sctp_new_association_resp->assoc_id; x2ap_enb_data_p->assoc_id = sctp_new_association_resp->assoc_id;
x2ap_enb_data_p->in_streams = sctp_new_association_resp->in_streams; x2ap_enb_data_p->in_streams = sctp_new_association_resp->in_streams;
x2ap_enb_data_p->out_streams = sctp_new_association_resp->out_streams; x2ap_enb_data_p->out_streams = sctp_new_association_resp->out_streams;
printf("x2ap_eNB_handle_sctp_association_resp at 4\n");
dump_trees();
/* Prepare new x2 Setup Request */ /* Prepare new x2 Setup Request */
x2ap_eNB_generate_x2_setup_request(instance_p, x2ap_enb_data_p); x2ap_eNB_generate_x2_setup_request(instance_p, x2ap_enb_data_p);
} }
static
void x2ap_eNB_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind)
{
x2ap_eNB_instance_t *instance_p;
x2ap_eNB_data_t *x2ap_enb_data_p;
printf("x2ap_eNB_handle_sctp_association_ind at 1 (called for instance %d)\n", instance);
dump_trees();
DevAssert(sctp_new_association_ind != NULL);
instance_p = x2ap_eNB_get_instance(instance);
DevAssert(instance_p != NULL);
x2ap_enb_data_p = x2ap_get_eNB(instance_p, sctp_new_association_ind->assoc_id, -1);
if (x2ap_enb_data_p != NULL) abort();
// DevAssert(x2ap_enb_data_p != NULL);
if (x2ap_enb_data_p == NULL) {
/* Create new eNB descriptor */
x2ap_enb_data_p = calloc(1, sizeof(*x2ap_enb_data_p));
DevAssert(x2ap_enb_data_p != NULL);
x2ap_enb_data_p->cnx_id = x2ap_eNB_fetch_add_global_cnx_id();
x2ap_enb_data_p->x2ap_eNB_instance = instance_p;
/* Insert the new descriptor in list of known eNB
* but not yet associated.
*/
RB_INSERT(x2ap_enb_map, &instance_p->x2ap_enb_head, x2ap_enb_data_p);
x2ap_enb_data_p->state = X2AP_ENB_STATE_CONNECTED;
instance_p->x2_target_enb_nb++;
if (instance_p->x2_target_enb_pending_nb > 0) {
instance_p->x2_target_enb_pending_nb--;
}
} else {
X2AP_WARN("x2ap_enb_data_p already exists\n");
}
printf("x2ap_eNB_handle_sctp_association_ind at 2\n");
dump_trees();
/* Update parameters */
x2ap_enb_data_p->assoc_id = sctp_new_association_ind->assoc_id;
x2ap_enb_data_p->in_streams = sctp_new_association_ind->in_streams;
x2ap_enb_data_p->out_streams = sctp_new_association_ind->out_streams;
printf("x2ap_eNB_handle_sctp_association_ind at 3\n");
dump_trees();
}
int x2ap_eNB_init_sctp (x2ap_eNB_instance_t *instance_p, int x2ap_eNB_init_sctp (x2ap_eNB_instance_t *instance_p,
net_ip_address_t *local_ip_addr) net_ip_address_t *local_ip_addr)
{ {
...@@ -146,9 +230,13 @@ int x2ap_eNB_init_sctp (x2ap_eNB_instance_t *instance_p, ...@@ -146,9 +230,13 @@ int x2ap_eNB_init_sctp (x2ap_eNB_instance_t *instance_p,
sctp_init->ipv6 = 0; sctp_init->ipv6 = 0;
sctp_init->nb_ipv4_addr = 1; sctp_init->nb_ipv4_addr = 1;
#if 0
memcpy(&sctp_init->ipv4_address, memcpy(&sctp_init->ipv4_address,
local_ip_addr, local_ip_addr,
sizeof(*local_ip_addr)); sizeof(*local_ip_addr));
#endif
sctp_init->ipv4_address[0] = inet_addr(local_ip_addr->ipv4_address);
/* /*
* SR WARNING: ipv6 multi-homing fails sometimes for localhost. * SR WARNING: ipv6 multi-homing fails sometimes for localhost.
* * * * Disable it for now. * * * * Disable it for now.
...@@ -269,7 +357,7 @@ void x2ap_eNB_handle_register_eNB(instance_t instance, ...@@ -269,7 +357,7 @@ void x2ap_eNB_handle_register_eNB(instance_t instance,
for (index = 0; index < x2ap_register_eNB->nb_x2; index++) { for (index = 0; index < x2ap_register_eNB->nb_x2; index++) {
if (x2ap_register_eNB->target_enb_x2_ip_address[index].active == 1 ){ if (x2ap_register_eNB->target_enb_x2_ip_address[index].active == 1 ){
X2AP_INFO("eNB[%d] eNB id %u acting as an initiator\n", X2AP_INFO("eNB[%d] eNB id %u acting as an initiator (client)\n",
instance, x2ap_register_eNB->eNB_id); instance, x2ap_register_eNB->eNB_id);
x2ap_eNB_register_eNB(new_instance, x2ap_eNB_register_eNB(new_instance,
&x2ap_register_eNB->target_enb_x2_ip_address[index], &x2ap_register_eNB->target_enb_x2_ip_address[index],
...@@ -281,9 +369,9 @@ void x2ap_eNB_handle_register_eNB(instance_t instance, ...@@ -281,9 +369,9 @@ void x2ap_eNB_handle_register_eNB(instance_t instance,
/* initiate the SCTP listener */ /* initiate the SCTP listener */
if (x2ap_eNB_init_sctp(new_instance,&x2ap_register_eNB->enb_x2_ip_address) < 0 ) { if (x2ap_eNB_init_sctp(new_instance,&x2ap_register_eNB->enb_x2_ip_address) < 0 ) {
X2AP_ERROR ("Error while sending SCTP_INIT_MSG to SCTP \n"); X2AP_ERROR ("Error while sending SCTP_INIT_MSG to SCTP \n");
return -1; return;
} }
X2AP_INFO("eNB[%d] eNB id %u acting as a listner\n", X2AP_INFO("eNB[%d] eNB id %u acting as a listner (server)\n",
instance, x2ap_register_eNB->eNB_id); instance, x2ap_register_eNB->eNB_id);
} }
} }
...@@ -311,21 +399,23 @@ void *x2ap_task(void *arg) ...@@ -311,21 +399,23 @@ void *x2ap_task(void *arg)
break; break;
case X2AP_REGISTER_ENB_REQ: case X2AP_REGISTER_ENB_REQ:
x2ap_eNB_handle_register_eNB(ITTI_MESSAGE_GET_INSTANCE(received_msg), x2ap_eNB_handle_register_eNB(ITTI_MESSAGE_GET_INSTANCE(received_msg),
&X2AP_REGISTER_ENB_REQ(received_msg)); &X2AP_REGISTER_ENB_REQ(received_msg));
break; break;
case SCTP_NEW_ASSOCIATION_RESP: case SCTP_NEW_ASSOCIATION_RESP:
x2ap_eNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), x2ap_eNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
&received_msg->ittiMsg.sctp_new_association_resp); &received_msg->ittiMsg.sctp_new_association_resp);
break;
case SCTP_NEW_ASSOCIATION_IND:
x2ap_eNB_handle_sctp_association_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
&received_msg->ittiMsg.sctp_new_association_ind);
break;
case SCTP_DATA_IND: { case SCTP_DATA_IND:
x2ap_eNB_handle_sctp_data_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg), x2ap_eNB_handle_sctp_data_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
&received_msg->ittiMsg.sctp_data_ind); &received_msg->ittiMsg.sctp_data_ind);
}
break; break;
default: default:
......
...@@ -53,7 +53,7 @@ int x2ap_eNB_decode_initiating(x2ap_message *x2ap_message_p, X2ap_InitiatingMess ...@@ -53,7 +53,7 @@ int x2ap_eNB_decode_initiating(x2ap_message *x2ap_message_p, X2ap_InitiatingMess
int x2ap_eNB_decode_successful(x2ap_message *x2ap_message_p, X2ap_SuccessfulOutcome_t *successful_p); int x2ap_eNB_decode_successful(x2ap_message *x2ap_message_p, X2ap_SuccessfulOutcome_t *successful_p);
int x2ap_eNB_decode_unsuccessful(x2ap_message *x2ap_message_p, X2ap_UnsuccessfulOutcome_t *unsuccessful_p); int x2ap_eNB_decode_unsuccessful(x2ap_message *x2ap_message_p, X2ap_UnsuccessfulOutcome_t *unsuccessful_p);
int x2ap_eNB_decode_pdu(x2ap_message *x2ap_message_p, uint8_t *buffer, uint32_t len) { int x2ap_eNB_decode_pdu(x2ap_message *x2ap_message_p, const uint8_t * const buffer, uint32_t len) {
X2AP_PDU_t pdu; X2AP_PDU_t pdu;
X2AP_PDU_t *pdu_p = &pdu; X2AP_PDU_t *pdu_p = &pdu;
asn_dec_rval_t dec_ret; asn_dec_rval_t dec_ret;
...@@ -117,7 +117,7 @@ x2ap_eNB_decode_initiating(x2ap_message *x2ap_message_p, X2ap_InitiatingMessage_ ...@@ -117,7 +117,7 @@ x2ap_eNB_decode_initiating(x2ap_message *x2ap_message_p, X2ap_InitiatingMessage_
switch(x2ap_message_p->procedureCode) { switch(x2ap_message_p->procedureCode) {
case X2ap_ProcedureCode_id_x2Setup : case X2ap_ProcedureCode_id_x2Setup :
ret = x2ap_decode_x2setuprequest_ies(&x2ap_message_p->msg.x2SetupRequest_IEs, &initiating_p->value); ret = x2ap_decode_x2setuprequest_ies(&x2ap_message_p->msg.x2SetupRequest_IEs, &initiating_p->value);
x2ap_xer_print_x2setuprequest_(x2ap_xer__print2sp,message_string,message); x2ap_xer_print_x2setuprequest_(x2ap_xer__print2sp,message_string,x2ap_message_p);
message_id = X2AP_SETUP_REQUEST_LOG; message_id = X2AP_SETUP_REQUEST_LOG;
message_string_size = strlen(message_string); message_string_size = strlen(message_string);
message = itti_alloc_new_message_sized(TASK_X2AP, message = itti_alloc_new_message_sized(TASK_X2AP,
...@@ -200,24 +200,31 @@ x2ap_eNB_decode_successful(x2ap_message *x2ap_message_p, X2ap_SuccessfulOutcome_ ...@@ -200,24 +200,31 @@ x2ap_eNB_decode_successful(x2ap_message *x2ap_message_p, X2ap_SuccessfulOutcome_
switch(x2ap_message_p->procedureCode) { switch(x2ap_message_p->procedureCode) {
case X2ap_ProcedureCode_id_x2Setup: case X2ap_ProcedureCode_id_x2Setup:
ret = x2ap_decode_x2setupresponse_ies(&x2ap_message_p->msg.x2SetupResponse_IEs, &successful_p->value); ret = x2ap_decode_x2setupresponse_ies(&x2ap_message_p->msg.x2SetupResponse_IEs, &successful_p->value);
break;
case X2ap_ProcedureCode_id_reset: case X2ap_ProcedureCode_id_reset:
ret = x2ap_decode_x2ap_resetresponse_ies(&x2ap_message_p->msg.x2ap_ResetResponse_IEs, &successful_p->value); ret = x2ap_decode_x2ap_resetresponse_ies(&x2ap_message_p->msg.x2ap_ResetResponse_IEs, &successful_p->value);
break;
case X2ap_ProcedureCode_id_resourceStatusReportingInitiation: case X2ap_ProcedureCode_id_resourceStatusReportingInitiation:
ret = x2ap_decode_x2ap_resourcestatusresponse_ies(&x2ap_message_p->msg.x2ap_ResourceStatusResponse_IEs, &successful_p->value); ret = x2ap_decode_x2ap_resourcestatusresponse_ies(&x2ap_message_p->msg.x2ap_ResourceStatusResponse_IEs, &successful_p->value);
break;
case X2ap_ProcedureCode_id_mobilitySettingsChange: case X2ap_ProcedureCode_id_mobilitySettingsChange:
ret = x2ap_decode_x2ap_mobilitychangeacknowledge_ies(&x2ap_message_p->msg.x2ap_MobilityChangeAcknowledge_IEs, &successful_p->value); ret = x2ap_decode_x2ap_mobilitychangeacknowledge_ies(&x2ap_message_p->msg.x2ap_MobilityChangeAcknowledge_IEs, &successful_p->value);
break;
case X2ap_ProcedureCode_id_eNBConfigurationUpdate: case X2ap_ProcedureCode_id_eNBConfigurationUpdate:
ret = x2ap_decode_x2ap_enbconfigurationupdateacknowledge_ies(&x2ap_message_p->msg.x2ap_ENBConfigurationUpdateAcknowledge_IEs, &successful_p->value); ret = x2ap_decode_x2ap_enbconfigurationupdateacknowledge_ies(&x2ap_message_p->msg.x2ap_ENBConfigurationUpdateAcknowledge_IEs, &successful_p->value);
break;
case X2ap_ProcedureCode_id_handoverPreparation: case X2ap_ProcedureCode_id_handoverPreparation:
ret = x2ap_decode_x2ap_handoverrequestacknowledge_ies(&x2ap_message_p->msg.x2ap_HandoverRequestAcknowledge_IEs, &successful_p->value); ret = x2ap_decode_x2ap_handoverrequestacknowledge_ies(&x2ap_message_p->msg.x2ap_HandoverRequestAcknowledge_IEs, &successful_p->value);
break;
case X2ap_ProcedureCode_id_cellActivation: case X2ap_ProcedureCode_id_cellActivation:
ret = x2ap_decode_x2ap_cellactivationresponse_ies(&x2ap_message_p->msg.x2ap_CellActivationResponse_IEs, &successful_p->value); ret = x2ap_decode_x2ap_cellactivationresponse_ies(&x2ap_message_p->msg.x2ap_CellActivationResponse_IEs, &successful_p->value);
break;
default: default:
X2AP_DEBUG("Unknown procedure (%d) or not implemented", (int)x2ap_message_p->procedureCode); X2AP_DEBUG("Unknown procedure (%d) or not implemented", (int)x2ap_message_p->procedureCode);
...@@ -248,21 +255,28 @@ x2ap_eNB_decode_unsuccessful(x2ap_message *x2ap_message_p, X2ap_UnsuccessfulOutc ...@@ -248,21 +255,28 @@ x2ap_eNB_decode_unsuccessful(x2ap_message *x2ap_message_p, X2ap_UnsuccessfulOutc
switch(x2ap_message_p->procedureCode) { switch(x2ap_message_p->procedureCode) {
case X2ap_ProcedureCode_id_x2Setup: case X2ap_ProcedureCode_id_x2Setup:
ret = x2ap_decode_x2setupfailure_ies(&x2ap_message_p->msg.x2SetupFailure_IEs, &unsuccessful_p->value); ret = x2ap_decode_x2setupfailure_ies(&x2ap_message_p->msg.x2SetupFailure_IEs, &unsuccessful_p->value);
break;
case X2ap_ProcedureCode_id_resourceStatusReportingInitiation: case X2ap_ProcedureCode_id_resourceStatusReportingInitiation:
ret = x2ap_decode_x2ap_resourcestatusfailure_ies(&x2ap_message_p->msg.x2ap_ResourceStatusFailure_IEs, &unsuccessful_p->value); ret = x2ap_decode_x2ap_resourcestatusfailure_ies(&x2ap_message_p->msg.x2ap_ResourceStatusFailure_IEs, &unsuccessful_p->value);
break;
case X2ap_ProcedureCode_id_mobilitySettingsChange: case X2ap_ProcedureCode_id_mobilitySettingsChange:
ret = x2ap_decode_x2ap_mobilitychangefailure_ies(&x2ap_message_p->msg.x2ap_MobilityChangeFailure_IEs, &unsuccessful_p->value); ret = x2ap_decode_x2ap_mobilitychangefailure_ies(&x2ap_message_p->msg.x2ap_MobilityChangeFailure_IEs, &unsuccessful_p->value);
break;
case X2ap_ProcedureCode_id_eNBConfigurationUpdate: case X2ap_ProcedureCode_id_eNBConfigurationUpdate:
ret = x2ap_decode_x2ap_enbconfigurationupdatefailure_ies(&x2ap_message_p->msg.x2ap_ENBConfigurationUpdateFailure_IEs, &unsuccessful_p->value); ret = x2ap_decode_x2ap_enbconfigurationupdatefailure_ies(&x2ap_message_p->msg.x2ap_ENBConfigurationUpdateFailure_IEs, &unsuccessful_p->value);
break;
case X2ap_ProcedureCode_id_handoverPreparation: case X2ap_ProcedureCode_id_handoverPreparation:
ret = x2ap_decode_x2ap_handoverpreparationfailure_ies(&x2ap_message_p->msg.x2ap_HandoverPreparationFailure_IEs, &unsuccessful_p->value); ret = x2ap_decode_x2ap_handoverpreparationfailure_ies(&x2ap_message_p->msg.x2ap_HandoverPreparationFailure_IEs, &unsuccessful_p->value);
break;
case X2ap_ProcedureCode_id_cellActivation: case X2ap_ProcedureCode_id_cellActivation:
ret = x2ap_decode_x2ap_cellactivationfailure_ies(&x2ap_message_p->msg.x2ap_CellActivationFailure_IEs, &unsuccessful_p->value); ret = x2ap_decode_x2ap_cellactivationfailure_ies(&x2ap_message_p->msg.x2ap_CellActivationFailure_IEs, &unsuccessful_p->value);
break;
default: default:
X2AP_DEBUG("Unknown procedure (%d) or not implemented", (int)x2ap_message_p->procedureCode); X2AP_DEBUG("Unknown procedure (%d) or not implemented", (int)x2ap_message_p->procedureCode);
break; break;
......
...@@ -40,6 +40,6 @@ ...@@ -40,6 +40,6 @@
#ifndef X2AP_ENB_DECODER_H_ #ifndef X2AP_ENB_DECODER_H_
#define X2AP_ENB_DECODER_H_ #define X2AP_ENB_DECODER_H_
int x2ap_eNB_decode_pdu(x2ap_message *x2ap_message, uint8_t *buffer, uint32_t len); int x2ap_eNB_decode_pdu(x2ap_message *x2ap_message, const uint8_t * const buffer, uint32_t len);
#endif /* X2AP_ENB_DECODER_H_ */ #endif /* X2AP_ENB_DECODER_H_ */
...@@ -180,6 +180,8 @@ typedef struct { ...@@ -180,6 +180,8 @@ typedef struct {
int x2ap_eNB_compare_assoc_id(struct x2ap_eNB_data_s *p1, struct x2ap_eNB_data_s *p2); int x2ap_eNB_compare_assoc_id(struct x2ap_eNB_data_s *p1, struct x2ap_eNB_data_s *p2);
/* Generate the tree management functions */ /* Generate the tree management functions */
struct x2ap_eNB_map;
struct x2ap_eNB_data_s;
RB_PROTOTYPE(x2ap_eNB_map, x2ap_eNB_data_s, entry, x2ap_eNB_compare_assoc_id); RB_PROTOTYPE(x2ap_eNB_map, x2ap_eNB_data_s, entry, x2ap_eNB_compare_assoc_id);
......
...@@ -48,9 +48,9 @@ ...@@ -48,9 +48,9 @@
#include "assertions.h" #include "assertions.h"
int x2ap_encode_initiating(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t *length); int x2ap_eNB_encode_initiating(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t *length);
int x2ap_encode_successful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t *length); int x2ap_eNB_encode_successful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t *length);
int x2ap_encode_unsuccessful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t *length); int x2ap_eNB_encode_unsuccessful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t *length);
static inline int x2ap_reset_request_encoder(X2ap_ResetRequest_IEs_t *resetRequest_IEs, uint8_t **buf, uint32_t *length); static inline int x2ap_reset_request_encoder(X2ap_ResetRequest_IEs_t *resetRequest_IEs, uint8_t **buf, uint32_t *length);
static inline int x2_setup_response_encoder(X2SetupResponse_IEs_t *x2SetupResponse_IEs, uint8_t **buf, uint32_t *length); static inline int x2_setup_response_encoder(X2SetupResponse_IEs_t *x2SetupResponse_IEs, uint8_t **buf, uint32_t *length);
...@@ -122,6 +122,7 @@ x2ap_eNB_encode_initiating(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t ...@@ -122,6 +122,7 @@ x2ap_eNB_encode_initiating(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t
#warning "do the same for the other messages" #warning "do the same for the other messages"
x2ap_xer_print_x2ap_resetrequest_(x2ap_xer__print2sp, message_string, x2ap_message_p); x2ap_xer_print_x2ap_resetrequest_(x2ap_xer__print2sp, message_string, x2ap_message_p);
message_string_size = strlen(message_string) + 1;
message_id = X2AP_RESET_REQUST_LOG; message_id = X2AP_RESET_REQUST_LOG;
message = itti_alloc_new_message_sized(TASK_X2AP, message_id, message_string_size + sizeof (IttiMsgText)); message = itti_alloc_new_message_sized(TASK_X2AP, message_id, message_string_size + sizeof (IttiMsgText));
message->ittiMsg.x2ap_reset_request_log.size = message_string_size; message->ittiMsg.x2ap_reset_request_log.size = message_string_size;
...@@ -206,6 +207,7 @@ x2ap_eNB_encode_successful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t ...@@ -206,6 +207,7 @@ x2ap_eNB_encode_successful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32_t
#warning "do the same for the other messages" #warning "do the same for the other messages"
x2ap_xer_print_x2ap_resourcestatusresponse_(x2ap_xer__print2sp, message_string, x2ap_message_p); x2ap_xer_print_x2ap_resourcestatusresponse_(x2ap_xer__print2sp, message_string, x2ap_message_p);
message_string_size = strlen(message_string) + 1;
message_id = X2AP_RESOURCE_STATUS_RESPONSE_LOG; message_id = X2AP_RESOURCE_STATUS_RESPONSE_LOG;
message = itti_alloc_new_message_sized(TASK_X2AP, message_id, message_string_size + sizeof (IttiMsgText)); message = itti_alloc_new_message_sized(TASK_X2AP, message_id, message_string_size + sizeof (IttiMsgText));
message->ittiMsg.x2ap_resource_status_response_log.size = message_string_size; message->ittiMsg.x2ap_resource_status_response_log.size = message_string_size;
...@@ -258,6 +260,7 @@ x2ap_eNB_encode_unsuccessful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32 ...@@ -258,6 +260,7 @@ x2ap_eNB_encode_unsuccessful(x2ap_message *x2ap_message_p, uint8_t **buf, uint32
ret = x2ap_resource_status_failure_encoder(&x2ap_message_p->msg.x2ap_ResourceStatusFailure_IEs, buf, length); ret = x2ap_resource_status_failure_encoder(&x2ap_message_p->msg.x2ap_ResourceStatusFailure_IEs, buf, length);
#warning "do the same for the other messages" #warning "do the same for the other messages"
x2ap_xer_print_x2ap_resourcestatusfailure_(x2ap_xer__print2sp, message_string, x2ap_message_p); x2ap_xer_print_x2ap_resourcestatusfailure_(x2ap_xer__print2sp, message_string, x2ap_message_p);
message_string_size = strlen(message_string) + 1;
message_id = X2AP_RESOURCE_STATUS_FAILURE_LOG; message_id = X2AP_RESOURCE_STATUS_FAILURE_LOG;
message = itti_alloc_new_message_sized(TASK_X2AP, message_id, message_string_size + sizeof (IttiMsgText)); message = itti_alloc_new_message_sized(TASK_X2AP, message_id, message_string_size + sizeof (IttiMsgText));
message->ittiMsg.x2ap_resource_status_failure_log.size = message_string_size; message->ittiMsg.x2ap_resource_status_failure_log.size = message_string_size;
......
...@@ -40,6 +40,8 @@ ...@@ -40,6 +40,8 @@
#include "x2ap_eNB.h" #include "x2ap_eNB.h"
#include "x2ap_eNB_generate_messages.h" #include "x2ap_eNB_generate_messages.h"
#include "x2ap_eNB_encoder.h"
#include "x2ap_eNB_itti_messaging.h"
#include "msc.h" #include "msc.h"
#include "assertions.h" #include "assertions.h"
...@@ -149,7 +151,7 @@ x2ap_generate_x2_setup_response (x2ap_eNB_data_t * eNB_association) ...@@ -149,7 +151,7 @@ x2ap_generate_x2_setup_response (x2ap_eNB_data_t * eNB_association)
X2ap_PLMN_Identity_t broadcast_plmnIdentity_2; X2ap_PLMN_Identity_t broadcast_plmnIdentity_2;
X2ap_PLMN_Identity_t broadcast_plmnIdentity_3; X2ap_PLMN_Identity_t broadcast_plmnIdentity_3;
X2ap_ServedCellItem_t *served_cell= malloc(sizeof(X2ap_ServedCellItem_t));; X2ap_ServedCellItem_t *served_cell = calloc(1, sizeof(X2ap_ServedCellItem_t));;
uint8_t *buffer; uint8_t *buffer;
uint32_t len; uint32_t len;
...@@ -218,9 +220,14 @@ x2ap_generate_x2_setup_response (x2ap_eNB_data_t * eNB_association) ...@@ -218,9 +220,14 @@ x2ap_generate_x2_setup_response (x2ap_eNB_data_t * eNB_association)
/* /*
* Non-UE signalling -> stream 0 * Non-UE signalling -> stream 0
*/ */
return x2ap_eNB_itti_send_sctp_data_req (buffer, len, eNB_association->assoc_id, 0); x2ap_eNB_itti_send_sctp_data_req (instance->instance, eNB_association->assoc_id, buffer, len, 0);
return ret;
} }
int x2ap_eNB_set_cause (X2ap_Cause_t * cause_p,
X2ap_Cause_PR cause_type,
long cause_value);
int x2ap_eNB_generate_x2_setup_failure ( uint32_t assoc_id, int x2ap_eNB_generate_x2_setup_failure ( uint32_t assoc_id,
X2ap_Cause_PR cause_type, X2ap_Cause_PR cause_type,
...@@ -231,6 +238,7 @@ int x2ap_eNB_generate_x2_setup_failure ( uint32_t assoc_id, ...@@ -231,6 +238,7 @@ int x2ap_eNB_generate_x2_setup_failure ( uint32_t assoc_id,
uint32_t length; uint32_t length;
x2ap_message message; x2ap_message message;
X2SetupFailure_IEs_t *x2_setup_failure_p; X2SetupFailure_IEs_t *x2_setup_failure_p;
int ret = 0;
memset (&message, 0, sizeof (x2ap_message)); memset (&message, 0, sizeof (x2ap_message));
x2_setup_failure_p = &message.msg.x2SetupFailure_IEs; x2_setup_failure_p = &message.msg.x2SetupFailure_IEs;
...@@ -251,7 +259,10 @@ int x2ap_eNB_generate_x2_setup_failure ( uint32_t assoc_id, ...@@ -251,7 +259,10 @@ int x2ap_eNB_generate_x2_setup_failure ( uint32_t assoc_id,
MSC_X2AP_TARGET_ENB, NULL, 0, MSC_X2AP_TARGET_ENB, NULL, 0,
"0 X2Setup/unsuccessfulOutcome assoc_id %u cause %u value %u", "0 X2Setup/unsuccessfulOutcome assoc_id %u cause %u value %u",
assoc_id, cause_type, cause_value); assoc_id, cause_type, cause_value);
return x2ap_eNB_itti_send_sctp_data_req (buffer_p, length, assoc_id, 0);
x2ap_eNB_itti_send_sctp_data_req (/* instance? */ 0, assoc_id, buffer_p, length, 0);
return ret;
} }
int x2ap_eNB_set_cause (X2ap_Cause_t * cause_p, int x2ap_eNB_set_cause (X2ap_Cause_t * cause_p,
......
...@@ -374,7 +374,7 @@ int x2ap_eNB_handle_x2_setup_response(uint32_t assoc_id, ...@@ -374,7 +374,7 @@ int x2ap_eNB_handle_x2_setup_response(uint32_t assoc_id,
uint32_t eNB_id = 0; uint32_t eNB_id = 0;
DevAssert(message != NULL); DevAssert(message != NULL);
x2SetupResponse = &message->msg.x2SetupRequest_IEs; x2SetupResponse = &message->msg.x2SetupResponse_IEs;
MSC_LOG_RX_MESSAGE (MSC_X2AP_TARGET_ENB, MSC_LOG_RX_MESSAGE (MSC_X2AP_TARGET_ENB,
MSC_X2AP_SRC_ENB, NULL, 0, MSC_X2AP_SRC_ENB, NULL, 0,
......
...@@ -106,6 +106,30 @@ void x2ap_eNB_insert_new_instance(x2ap_eNB_instance_t *new_instance_p) ...@@ -106,6 +106,30 @@ void x2ap_eNB_insert_new_instance(x2ap_eNB_instance_t *new_instance_p)
new_instance_p, x2ap_eNB_entries); new_instance_p, x2ap_eNB_entries);
} }
void dump_tree(x2ap_eNB_data_t *t)
{
if (t == NULL) return;
printf("-----------------------\n");
printf("eNB id %d %s\n", t->eNB_id, t->eNB_name);
printf("state %d\n", t->state);
printf("nextstream %d\n", t->nextstream);
printf("in_streams %d out_streams %d\n", t->in_streams, t->out_streams);
printf("cnx_id %d assoc_id %d\n", t->cnx_id, t->assoc_id);
dump_tree(t->entry.rbe_left);
dump_tree(t->entry.rbe_right);
}
void dump_trees(void)
{
x2ap_eNB_instance_t *zz;
STAILQ_FOREACH(zz, &x2ap_eNB_internal_data.x2ap_eNB_instances_head,
x2ap_eNB_entries) {
printf("here comes the tree (instance %d):\n---------------------------------------------\n", zz->instance);
dump_tree(zz->x2ap_enb_head.rbh_root);
printf("---------------------------------------------\n");
}
}
struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p, struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p,
int32_t assoc_id, int32_t assoc_id,
uint16_t cnx_id) uint16_t cnx_id)
...@@ -113,6 +137,9 @@ struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p, ...@@ -113,6 +137,9 @@ struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p,
struct x2ap_eNB_data_s temp; struct x2ap_eNB_data_s temp;
struct x2ap_eNB_data_s *found; struct x2ap_eNB_data_s *found;
printf("x2ap_get_eNB at 1 (looking for assoc_id %d cnx_id %d)\n", assoc_id, cnx_id);
dump_trees();
memset(&temp, 0, sizeof(struct x2ap_eNB_data_s)); memset(&temp, 0, sizeof(struct x2ap_eNB_data_s));
temp.assoc_id = assoc_id; temp.assoc_id = assoc_id;
...@@ -153,11 +180,13 @@ x2ap_eNB_instance_t *x2ap_eNB_get_instance(instance_t instance) ...@@ -153,11 +180,13 @@ x2ap_eNB_instance_t *x2ap_eNB_get_instance(instance_t instance)
/// utility functions /// utility functions
void x2ap_dump_eNB (x2ap_eNB_data_t * eNB_ref);
void void
x2ap_dump_eNB_list (void) { x2ap_dump_eNB_list (void) {
x2ap_eNB_instance_t *inst = NULL; x2ap_eNB_instance_t *inst = NULL;
struct x2ap_eNB_data_s *found = NULL; struct x2ap_eNB_data_s *found = NULL;
struct x2ap_eNB_data_s *temp = NULL; struct x2ap_eNB_data_s temp;
memset(&temp, 0, sizeof(struct x2ap_eNB_data_s)); memset(&temp, 0, sizeof(struct x2ap_eNB_data_s));
...@@ -188,12 +217,13 @@ void x2ap_dump_eNB (x2ap_eNB_data_t * eNB_ref) { ...@@ -188,12 +217,13 @@ void x2ap_dump_eNB (x2ap_eNB_data_t * eNB_ref) {
x2ap_eNB_data_t * x2ap_is_eNB_id_in_list (const uint32_t eNB_id) x2ap_eNB_data_t * x2ap_is_eNB_id_in_list (const uint32_t eNB_id)
{ {
x2ap_eNB_instance_t *eNB_ref; x2ap_eNB_instance_t *inst;
struct x2ap_eNB_data_s *elm;
STAILQ_FOREACH (eNB_ref, &x2ap_eNB_internal_data.x2ap_eNB_instances_head, x2ap_eNB_entries) { STAILQ_FOREACH(inst, &x2ap_eNB_internal_data.x2ap_eNB_instances_head, x2ap_eNB_entries) {
if (eNB_ref->eNB_id == eNB_id) { RB_FOREACH(elm, x2ap_enb_map, &inst->x2ap_enb_head) {
if (elm->eNB_id == eNB_id)
return eNB_ref; return elm;
} }
} }
return NULL; return NULL;
...@@ -201,12 +231,14 @@ x2ap_eNB_data_t * x2ap_is_eNB_id_in_list (const uint32_t eNB_id) ...@@ -201,12 +231,14 @@ x2ap_eNB_data_t * x2ap_is_eNB_id_in_list (const uint32_t eNB_id)
x2ap_eNB_data_t * x2ap_is_eNB_assoc_id_in_list (const uint32_t sctp_assoc_id) x2ap_eNB_data_t * x2ap_is_eNB_assoc_id_in_list (const uint32_t sctp_assoc_id)
{ {
x2ap_eNB_instance_t *inst = NULL; x2ap_eNB_instance_t *inst;
struct x2ap_eNB_data_s *found = NULL; struct x2ap_eNB_data_s *found;
struct x2ap_eNB_data_s *temp = NULL; struct x2ap_eNB_data_s temp;
STAILQ_FOREACH (inst, &x2ap_eNB_internal_data.x2ap_eNB_instances_head, x2ap_eNB_entries) { temp.assoc_id = sctp_assoc_id;
temp.cnx_id = -1;
STAILQ_FOREACH(inst, &x2ap_eNB_internal_data.x2ap_eNB_instances_head, x2ap_eNB_entries) {
found = RB_FIND(x2ap_enb_map, &inst->x2ap_enb_head, &temp); found = RB_FIND(x2ap_enb_map, &inst->x2ap_enb_head, &temp);
if (found != NULL){ if (found != NULL){
if (found->assoc_id == sctp_assoc_id) { if (found->assoc_id == sctp_assoc_id) {
......
...@@ -46,4 +46,8 @@ x2ap_eNB_data_t* x2ap_is_eNB_id_in_list(uint32_t eNB_id); ...@@ -46,4 +46,8 @@ x2ap_eNB_data_t* x2ap_is_eNB_id_in_list(uint32_t eNB_id);
x2ap_eNB_data_t* x2ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id); x2ap_eNB_data_t* x2ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id);
struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p,
int32_t assoc_id,
uint16_t cnx_id);
#endif /* X2AP_ENB_MANAGEMENT_PROCEDURES_H_ */ #endif /* X2AP_ENB_MANAGEMENT_PROCEDURES_H_ */
...@@ -295,7 +295,7 @@ do { \ ...@@ -295,7 +295,7 @@ do { \
(bITsTRING)->size = 3; \ (bITsTRING)->size = 3; \
(bITsTRING)->bits_unused = 4; \ (bITsTRING)->bits_unused = 4; \
} while(0) } while(0)
/*
/* TS 36.413 v10.9.0 section 9.2.1.38: /* TS 36.413 v10.9.0 section 9.2.1.38:
* E-UTRAN CGI/Cell Identity * E-UTRAN CGI/Cell Identity
* The leftmost bits of the Cell * The leftmost bits of the Cell
......
...@@ -34,12 +34,12 @@ ...@@ -34,12 +34,12 @@
# ifdef OPENAIR2 # ifdef OPENAIR2
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
# include "sctp_eNB_task.h"
# include "s1ap_eNB.h" # include "s1ap_eNB.h"
# include "nas_ue_task.h" # include "nas_ue_task.h"
# include "udp_eNB_task.h" # include "udp_eNB_task.h"
# include "gtpv1u_eNB_task.h" # include "gtpv1u_eNB_task.h"
# endif # endif
# include "sctp_eNB_task.h"
# if defined (ENABLE_USE_X2) # if defined (ENABLE_USE_X2)
# include "x2ap_eNB.h" # include "x2ap_eNB.h"
# endif # endif
...@@ -59,11 +59,6 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) ...@@ -59,11 +59,6 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
{ {
if (enb_nb > 0) { if (enb_nb > 0) {
if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
LOG_E(SCTP, "Create task for SCTP failed\n");
return -1;
}
if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) { if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
LOG_E(S1AP, "Create task for S1AP failed\n"); LOG_E(S1AP, "Create task for S1AP failed\n");
return -1; return -1;
...@@ -90,13 +85,19 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) ...@@ -90,13 +85,19 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
# endif # endif
} }
# endif # endif
#if defined(ENABLE_USE_X2) #if ENABLE_USE_X2
if (itti_create_task (TASK_X2AP, x2ap_task, NULL) < 0) { if (itti_create_task (TASK_X2AP, x2ap_task, NULL) < 0) {
LOG_E(X2AP, "Create task for X2AP failed\n"); LOG_E(X2AP, "Create task for X2AP failed\n");
return -1; return -1;
} }
#endif #endif
if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
LOG_E(SCTP, "Create task for SCTP failed\n");
return -1;
}
if (enb_nb > 0) { if (enb_nb > 0) {
if (itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL) < 0) { if (itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL) < 0) {
LOG_E(RRC, "Create task for RRC eNB failed\n"); LOG_E(RRC, "Create task for RRC eNB failed\n");
......
...@@ -35,8 +35,8 @@ eNBs = ...@@ -35,8 +35,8 @@ eNBs =
Nid_cell_mbsfn = 0; Nid_cell_mbsfn = 0;
nb_antennas_tx = 1; nb_antennas_tx = 1;
nb_antennas_rx = 1; nb_antennas_rx = 1;
tx_gain = 90; tx_gain = 25;
rx_gain = 120; rx_gain = 20;
prach_root = 0; prach_root = 0;
prach_config_index = 0; prach_config_index = 0;
prach_high_speed = "DISABLE"; prach_high_speed = "DISABLE";
...@@ -46,7 +46,7 @@ eNBs = ...@@ -46,7 +46,7 @@ eNBs =
pucch_nRB_CQI = 1; pucch_nRB_CQI = 1;
pucch_nCS_AN = 0; pucch_nCS_AN = 0;
pucch_n1_AN = 32; pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29; pdsch_referenceSignalPower = 0;
pdsch_p_b = 0; pdsch_p_b = 0;
pusch_n_SB = 1; pusch_n_SB = 1;
pusch_enable64QAM = "DISABLE"; pusch_enable64QAM = "DISABLE";
...@@ -55,7 +55,7 @@ eNBs = ...@@ -55,7 +55,7 @@ eNBs =
pusch_groupHoppingEnabled = "ENABLE"; pusch_groupHoppingEnabled = "ENABLE";
pusch_groupAssignment = 0; pusch_groupAssignment = 0;
pusch_sequenceHoppingEnabled = "DISABLE"; pusch_sequenceHoppingEnabled = "DISABLE";
pusch_nDMRS1 = 1; pusch_nDMRS1 = 0;
phich_duration = "NORMAL"; phich_duration = "NORMAL";
phich_resource = "ONESIXTH"; phich_resource = "ONESIXTH";
srs_enable = "DISABLE"; srs_enable = "DISABLE";
...@@ -64,9 +64,9 @@ eNBs = ...@@ -64,9 +64,9 @@ eNBs =
srs_ackNackST =; srs_ackNackST =;
srs_MaxUpPts =;*/ srs_MaxUpPts =;*/
pusch_p0_Nominal = -90; pusch_p0_Nominal = -108;
pusch_alpha = "AL1"; pusch_alpha = "AL1";
pucch_p0_Nominal = -96; pucch_p0_Nominal = -108;
msg3_delta_Preamble = 6; msg3_delta_Preamble = 6;
pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1 = "deltaF2";
pucch_deltaF_Format1b = "deltaF3"; pucch_deltaF_Format1b = "deltaF3";
...@@ -81,8 +81,8 @@ eNBs = ...@@ -81,8 +81,8 @@ eNBs =
rach_messageSizeGroupA = ; rach_messageSizeGroupA = ;
rach_messagePowerOffsetGroupB = ; rach_messagePowerOffsetGroupB = ;
*/ */
rach_powerRampingStep = 4; rach_powerRampingStep = 2;
rach_preambleInitialReceivedTargetPower = -108; rach_preambleInitialReceivedTargetPower = -100;
rach_preambleTransMax = 10; rach_preambleTransMax = 10;
rach_raResponseWindowSize = 10; rach_raResponseWindowSize = 10;
rach_macContentionResolutionTimer = 48; rach_macContentionResolutionTimer = 48;
...@@ -142,9 +142,9 @@ eNBs = ...@@ -142,9 +142,9 @@ eNBs =
///X2 ///X2
target_enb_x2_ip_address = ( { ipv4 = "127.0.0.1"; target_enb_x2_ip_address = ( { ipv4 = "127.0.0.11";
ipv6 = "192:168:30::17"; ipv6 = "192:168:30::17";
active = "yes"; active = "no";
preference = "ipv4"; preference = "ipv4";
} }
); );
...@@ -159,8 +159,8 @@ eNBs = ...@@ -159,8 +159,8 @@ eNBs =
ENB_PORT_FOR_S1U = 2152; # Spec 2152 ENB_PORT_FOR_S1U = 2152; # Spec 2152
ENB_INTERFACE_NAME_FOR_X2C = "lo"; ENB_INTERFACE_NAME_FOR_X2C = "lo";
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1/24"; ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.10/24";
ENB_PORT_FOR_X2C = 1234; # Spec ? ENB_PORT_FOR_X2C = 36422;
ENB_INTERFACE_NAME_FOR_X2U = "eth0"; ENB_INTERFACE_NAME_FOR_X2U = "eth0";
ENB_IPV4_ADDRESS_FOR_X2U = "10.0.1.100/24"; ENB_IPV4_ADDRESS_FOR_X2U = "10.0.1.100/24";
...@@ -216,8 +216,8 @@ eNBs = ...@@ -216,8 +216,8 @@ eNBs =
Nid_cell_mbsfn = 0; Nid_cell_mbsfn = 0;
nb_antennas_tx = 1; nb_antennas_tx = 1;
nb_antennas_rx = 1; nb_antennas_rx = 1;
tx_gain = 90; tx_gain = 25;
rx_gain = 120; rx_gain = 20;
prach_root = 0; prach_root = 0;
prach_config_index = 0; prach_config_index = 0;
prach_high_speed = "DISABLE"; prach_high_speed = "DISABLE";
...@@ -227,7 +227,7 @@ eNBs = ...@@ -227,7 +227,7 @@ eNBs =
pucch_nRB_CQI = 1; pucch_nRB_CQI = 1;
pucch_nCS_AN = 0; pucch_nCS_AN = 0;
pucch_n1_AN = 32; pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29; pdsch_referenceSignalPower = 0;
pdsch_p_b = 0; pdsch_p_b = 0;
pusch_n_SB = 1; pusch_n_SB = 1;
pusch_enable64QAM = "DISABLE"; pusch_enable64QAM = "DISABLE";
...@@ -236,7 +236,7 @@ eNBs = ...@@ -236,7 +236,7 @@ eNBs =
pusch_groupHoppingEnabled = "ENABLE"; pusch_groupHoppingEnabled = "ENABLE";
pusch_groupAssignment = 0; pusch_groupAssignment = 0;
pusch_sequenceHoppingEnabled = "DISABLE"; pusch_sequenceHoppingEnabled = "DISABLE";
pusch_nDMRS1 = 1; pusch_nDMRS1 = 0;
phich_duration = "NORMAL"; phich_duration = "NORMAL";
phich_resource = "ONESIXTH"; phich_resource = "ONESIXTH";
srs_enable = "DISABLE"; srs_enable = "DISABLE";
...@@ -245,9 +245,9 @@ eNBs = ...@@ -245,9 +245,9 @@ eNBs =
srs_ackNackST =; srs_ackNackST =;
srs_MaxUpPts =;*/ srs_MaxUpPts =;*/
pusch_p0_Nominal = -90; pusch_p0_Nominal = -108;
pusch_alpha = "AL1"; pusch_alpha = "AL1";
pucch_p0_Nominal = -96; pucch_p0_Nominal = -108;
msg3_delta_Preamble = 6; msg3_delta_Preamble = 6;
pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1 = "deltaF2";
pucch_deltaF_Format1b = "deltaF3"; pucch_deltaF_Format1b = "deltaF3";
...@@ -262,8 +262,8 @@ eNBs = ...@@ -262,8 +262,8 @@ eNBs =
rach_messageSizeGroupA = ; rach_messageSizeGroupA = ;
rach_messagePowerOffsetGroupB = ; rach_messagePowerOffsetGroupB = ;
*/ */
rach_powerRampingStep = 4; rach_powerRampingStep = 2;
rach_preambleInitialReceivedTargetPower = -108; rach_preambleInitialReceivedTargetPower = -100;
rach_preambleTransMax = 10; rach_preambleTransMax = 10;
rach_raResponseWindowSize = 10; rach_raResponseWindowSize = 10;
rach_macContentionResolutionTimer = 48; rach_macContentionResolutionTimer = 48;
...@@ -323,9 +323,9 @@ eNBs = ...@@ -323,9 +323,9 @@ eNBs =
///X2 ///X2
target_enb_x2_ip_address = ( { ipv4 = "127.0.0.1"; target_enb_x2_ip_address = ( { ipv4 = "127.0.0.10";
ipv6 = "192:168:30::17"; ipv6 = "192:168:30::17";
active = "no"; active = "yes";
preference = "ipv4"; preference = "ipv4";
} }
); );
...@@ -340,8 +340,8 @@ eNBs = ...@@ -340,8 +340,8 @@ eNBs =
ENB_PORT_FOR_S1U = 2152; # Spec 2152 ENB_PORT_FOR_S1U = 2152; # Spec 2152
ENB_INTERFACE_NAME_FOR_X2C = "lo"; ENB_INTERFACE_NAME_FOR_X2C = "lo";
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1/24"; ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.11/24";
ENB_PORT_FOR_X2C = 1234; # Spec ? ENB_PORT_FOR_X2C = 36422; # Spec ?
ENB_INTERFACE_NAME_FOR_X2U = "eth0"; ENB_INTERFACE_NAME_FOR_X2U = "eth0";
ENB_IPV4_ADDRESS_FOR_X2U = "10.0.1.100/24"; ENB_IPV4_ADDRESS_FOR_X2U = "10.0.1.100/24";
......
...@@ -54,8 +54,38 @@ ...@@ -54,8 +54,38 @@
</MOBILITY> </MOBILITY>
</TOPOLOGY_CONFIG> </TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>2</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL>
<FLOW_START_ms>1600</FLOW_START_ms>
<FLOW_DURATION_ms>3000</FLOW_DURATION_ms>
<IP_VERSION>ipv4</IP_VERSION>
<DESTINATION_ID>0</DESTINATION_ID>
<IDT_DIST>uniform</IDT_DIST>
<IDT_MIN_ms>10</IDT_MIN_ms>
<IDT_MAX_ms>50</IDT_MAX_ms>
<SIZE_DIST>uniform</SIZE_DIST>
<SIZE_MIN_byte>850</SIZE_MIN_byte>
<SIZE_MAX_byte>1408</SIZE_MAX_byte>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG> <EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <EMULATION_TIME_ms>3000</EMULATION_TIME_ms>
<CURVE>disable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes
are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable,
it allows to ptrint BACKGROUND statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable,
throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency
measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If
enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level --> <LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL> <LEVEL>debug</LEVEL>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment