diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 358da43a944482b82ea4e5ccc8bbe36ec2539b5e..5e9474f93f2f9b9f27d8fac21d58db92878412ef 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -2977,6 +2977,13 @@ int rrc_eNB_decode_dcch (u8 Mod_id, u32 frame, u8 Srb_id, u8 UE_index, (void *) UE_EUTRA_Capability); #endif +#if defined(ENABLE_USE_MME) + if (EPC_MODE_ENABLED == 1) + { + rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(Mod_id, UE_index, ul_dcch_msg); + } +#endif + rrc_eNB_generate_defaultRRCConnectionReconfiguration (Mod_id, frame, UE_index, eNB_rrc_inst[Mod_id].HO_flag); diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 17c15e9d5bdd0aec5135e1392e9518a0b6ad5b0c..54202b0f913fec18c5cf361efe5af44dd9899a30 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -354,6 +354,26 @@ void rrc_eNB_send_S1AP_UPLINK_NAS(uint8_t mod_id, uint8_t ue_index, UL_DCCH_Mess } /*------------------------------------------------------------------------------*/ +void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(uint8_t mod_id, uint8_t ue_index, UL_DCCH_Message_t *ul_dcch_msg) { + UECapabilityInformation_t *ueCapabilityInformation = &ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation; + + if ((ueCapabilityInformation->criticalExtensions.present == UECapabilityInformation__criticalExtensions_PR_c1) + && (ueCapabilityInformation->criticalExtensions.choice.c1.present + == UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8) + && (ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count > 0)) { + MessageDef *msg_p; + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_UE_CAPABILITIES_IND); + S1AP_UE_CAPABILITIES_IND (msg_p).eNB_ue_s1ap_id = eNB_rrc_inst[mod_id].Info.UE[ue_index].eNB_ue_s1ap_id; + S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.length = + ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[0]->ueCapabilityRAT_Container.size; + S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.buffer = + ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[0]->ueCapabilityRAT_Container.buf; + + itti_send_msg_to_task (TASK_S1AP, mod_id, msg_p); + } +} + + /*------------------------------------------------------------------------------*/ void rrc_eNB_send_S1AP_NAS_FIRST_REQ(uint8_t mod_id, uint8_t ue_index, RRCConnectionSetupComplete_r8_IEs_t *rrcConnectionSetupComplete) { #if defined(ENABLE_ITTI) diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index 1e5827ee13087f24062a4f461d58cb657a8fb689..d3a8f1da6dd2dbeab94d1f594a1e8d0a83f8a14c 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -33,6 +33,14 @@ void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t Mod_id, uint8_t UE_ind */ void rrc_eNB_send_S1AP_UPLINK_NAS(uint8_t Mod_id, uint8_t UE_index, UL_DCCH_Message_t *ul_dcch_msg); +/*! \fn void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(uint8_t Mod_id, uint8_t UE_index, UL_DCCH_Message_t *ul_dcch_msg) + *\brief create a S1AP_UE_CAPABILITIES_IND to transfer a NAS message to S1AP. + *\param mod_id Instance ID of eNB. + *\param ue_index Instance ID of UE in the eNB. + *\param ul_dcch_msg The message receive by RRC holding the NAS message. + */ +void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(uint8_t mod_id, uint8_t ue_index, UL_DCCH_Message_t *ul_dcch_msg); + /*! \fn rrc_eNB_send_S1AP_NAS_FIRST_REQ(uint8_t Mod_id, uint8_t UE_index, RRCConnectionSetupComplete_r8_IEs_t *rrcConnectionSetupComplete) *\brief create a S1AP_NAS_FIRST_REQ to indicate that RRC has completed its first connection setup to S1AP. *\brief eventually forward a NAS message to S1AP.