Save UeRadioCapability into mme_ue.

The saved information will be used when transmitting
InitialContextSetupReq
This commit is contained in:
James Park 2017-08-08 12:01:08 -07:00
parent d3cdbac70d
commit 7243966cc4
4 changed files with 57 additions and 0 deletions

View File

@ -74,6 +74,7 @@ status_t mme_context_final()
mme_sgw_remove_all();
mme_enb_remove_all();
mme_ue_remove_all();
d_assert(self.mme_ue_s1ap_id_hash, , "Null param");
hash_destroy(self.mme_ue_s1ap_id_hash);
@ -1202,9 +1203,27 @@ status_t mme_ue_remove(mme_ue_t *mme_ue)
if (mme_ue->last_paging_msg)
pkbuf_free(mme_ue->last_paging_msg);
/* Free UeRadioCapability */
if (mme_ue->radio_capa)
{
S1ap_UERadioCapability_t *radio_capa =
(S1ap_UERadioCapability_t *)mme_ue->radio_capa;
core_free(radio_capa->buf);
core_free(mme_ue->radio_capa);
}
mme_sess_remove_all(mme_ue);
mme_pdn_remove_all(mme_ue);
if (mme_ue->enb_ue)
{
if (mme_ue->enb_ue->mme_ue != mme_ue)
d_warn("Invalid mme_ue assigend to enb_ue");
else
mme_ue->enb_ue->mme_ue = NULL;
}
index_free(&mme_ue_pool, mme_ue);
return CORE_OK;

View File

@ -236,6 +236,9 @@ struct _mme_ue_t {
tm_block_id t3413;
#define MAX_NUM_OF_PAGING 2
c_uint32_t max_paging_retry;
/* UE Radio Capability */
void *radio_capa;
};
typedef struct _mme_sess_t {

View File

@ -244,6 +244,21 @@ status_t s1ap_build_initial_context_setup_request(
ies->securityKey.bits_unused = 0;
memcpy(ies->securityKey.buf, mme_ue->kenb, ies->securityKey.size);
/* Set UeRadioCapability if exists */
if (mme_ue->radio_capa)
{
S1ap_UERadioCapability_t *radio_capa =
(S1ap_UERadioCapability_t *)mme_ue->radio_capa;
ies->presenceMask |=
S1AP_INITIALCONTEXTSETUPREQUESTIES_UERADIOCAPABILITY_PRESENT;
ies->ueRadioCapability.size = radio_capa->size;
ies->ueRadioCapability.buf =
core_calloc(ies->ueRadioCapability.size, sizeof(c_uint8_t));
memcpy(ies->ueRadioCapability.buf, radio_capa->buf, radio_capa->size);
}
message.procedureCode = S1ap_ProcedureCode_id_InitialContextSetup;
message.direction = S1AP_PDU_PR_initiatingMessage;

View File

@ -332,6 +332,26 @@ void s1ap_handle_ue_capability_info_indication(
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
if (enb_ue->mme_ue)
{
S1ap_UERadioCapability_t *ue_radio_capa = NULL;
S1ap_UERadioCapability_t *radio_capa = NULL;
mme_ue_t *mme_ue = enb_ue->mme_ue;
/* Save UE radio capability */
ue_radio_capa = &ies->ueRadioCapability;
mme_ue->radio_capa = core_calloc(1, sizeof(S1ap_UERadioCapability_t));
d_assert(mme_ue->radio_capa,return,"core_calloc Error");
radio_capa = (S1ap_UERadioCapability_t *)mme_ue->radio_capa;
radio_capa->size = ue_radio_capa->size;
radio_capa->buf =
core_calloc(radio_capa->size, sizeof(c_uint8_t));
d_assert(radio_capa->buf,return,"core_calloc Error(size=%d)",
radio_capa->size);
memcpy(radio_capa->buf, ue_radio_capa->buf, radio_capa->size);
}
d_trace(3, "[S1AP] UE Capability Info Indication : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,