Use common S1AP library for UERadioCapability

- Use S1AP_STORE/CLEAR macros for storing/retrieving UERadioCapability
- UERadioCapability will be stored in UECapabilityInfoIndication
- InitialContextSetupRequest use the stored UERadioCapability
This commit is contained in:
Sukchan Lee 2018-04-09 21:52:16 +09:00
parent 2a1feae83f
commit 935e4b56ef
4 changed files with 36 additions and 7 deletions

View File

@ -1988,6 +1988,7 @@ status_t mme_ue_remove(mme_ue_t *mme_ue)
CLEAR_PAGING_INFO(mme_ue);
/* Free UeRadioCapability */
#if 0
if (mme_ue->radio_capa)
{
S1AP_UERadioCapability_t *radio_capa =
@ -1997,6 +1998,9 @@ status_t mme_ue_remove(mme_ue_t *mme_ue)
CORE_FREE(radio_capa->buf);
CORE_FREE(mme_ue->radio_capa);
}
#else
S1AP_CLEAR_DATA(&mme_ue->ueRadioCapability);
#endif
/* Clear Transparent Container */
S1AP_CLEAR_DATA(&mme_ue->container);

View File

@ -346,7 +346,11 @@ struct _mme_ue_t {
c_uint32_t max_paging_retry;
/* UE Radio Capability */
#if 0
void *radio_capa;
#else
OCTET_STRING_t ueRadioCapability;
#endif
/* S1AP Transparent Container */
OCTET_STRING_t container;

View File

@ -466,7 +466,6 @@ status_t s1ap_build_initial_context_setup_request(
sess = mme_sess_next(sess);
}
d_trace(5, " UESecurityCapability\n");
UESecurityCapabilities->encryptionAlgorithms.size = 2;
UESecurityCapabilities->encryptionAlgorithms.buf =
core_calloc(UESecurityCapabilities->encryptionAlgorithms.size,
@ -483,7 +482,6 @@ status_t s1ap_build_initial_context_setup_request(
UESecurityCapabilities->integrityProtectionAlgorithms.buf[0] =
(mme_ue->ue_network_capability.eia << 1);
d_trace(5, " UESecurityKey\n");
SecurityKey->size = SHA256_DIGEST_SIZE;
SecurityKey->buf =
core_calloc(SecurityKey->size, sizeof(c_uint8_t));
@ -491,13 +489,13 @@ status_t s1ap_build_initial_context_setup_request(
memcpy(SecurityKey->buf, mme_ue->kenb, SecurityKey->size);
/* Set UeRadioCapability if exists */
#if 0
if (mme_ue->radio_capa)
{
S1AP_UERadioCapability_t *UERadioCapability = NULL;
S1AP_UERadioCapability_t *radio_capa =
(S1AP_UERadioCapability_t *)mme_ue->radio_capa;
d_trace(5, " UERadioCapabiltiy\n");
ie = core_calloc(1, sizeof(S1AP_InitialContextSetupRequestIEs_t));
ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie);
@ -513,12 +511,31 @@ status_t s1ap_build_initial_context_setup_request(
core_calloc(UERadioCapability->size, sizeof(c_uint8_t));
memcpy(UERadioCapability->buf, radio_capa->buf, radio_capa->size);
}
#else
if (mme_ue->ueRadioCapability.buf && mme_ue->ueRadioCapability.size)
{
S1AP_UERadioCapability_t *UERadioCapability = NULL;
ie = core_calloc(1, sizeof(S1AP_InitialContextSetupRequestIEs_t));
ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie);
ie->id = S1AP_ProtocolIE_ID_id_UERadioCapability;
ie->criticality = S1AP_Criticality_ignore;
ie->value.present =
S1AP_InitialContextSetupRequestIEs__value_PR_UERadioCapability;
UERadioCapability = &ie->value.choice.UERadioCapability;
d_assert(UERadioCapability, return CORE_ERROR,);
s1ap_buffer_to_OCTET_STRING(
mme_ue->ueRadioCapability.buf, mme_ue->ueRadioCapability.size,
UERadioCapability);
}
#endif
d_trace(5, " Encode PDU\n");
rv = s1ap_encode_pdu(s1apbuf, &pdu);
s1ap_free_pdu(&pdu);
d_trace(5, " Done\n");
if (rv != CORE_OK)
{
d_error("s1ap_encode_pdu() failed");

View File

@ -447,6 +447,7 @@ void s1ap_handle_ue_capability_info_indication(
if (enb_ue->mme_ue)
{
#if 0
S1AP_UERadioCapability_t *radio_capa = NULL;
mme_ue_t *mme_ue = enb_ue->mme_ue;
@ -470,6 +471,10 @@ void s1ap_handle_ue_capability_info_indication(
d_assert(radio_capa->buf, return, "core_calloc error(size=%d)",
radio_capa->size);
memcpy(radio_capa->buf, UERadioCapability->buf, radio_capa->size);
#else
d_assert(UERadioCapability, return,);
S1AP_STORE_DATA(&enb_ue->mme_ue->ueRadioCapability, UERadioCapability);
#endif
}
}
@ -1626,8 +1631,7 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
}
}
S1AP_STORE_DATA(
&mme_ue->container, Target_ToSource_TransparentContainer);
S1AP_STORE_DATA(&mme_ue->container, Target_ToSource_TransparentContainer);
if (mme_ue_have_indirect_tunnel(mme_ue) == 1)
{