add PDN disconnect
This commit is contained in:
parent
913762c317
commit
b0be746292
|
@ -78,14 +78,6 @@ static int s1ap_decode_initiating(s1ap_message_t *message,
|
|||
message->procedureCode = initiating_p->procedureCode;
|
||||
switch (initiating_p->procedureCode)
|
||||
{
|
||||
case S1ap_ProcedureCode_id_uplinkNASTransport:
|
||||
ret = s1ap_decode_s1ap_uplinknastransport_ies(
|
||||
&message->s1ap_UplinkNASTransport_IEs,
|
||||
&initiating_p->value);
|
||||
s1ap_decode_xer_print_message(s1ap_xer_print_s1ap_uplinknastransport,
|
||||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_S1Setup:
|
||||
ret = s1ap_decode_s1ap_s1setuprequesties(
|
||||
&message->s1ap_S1SetupRequestIEs,
|
||||
|
@ -94,6 +86,14 @@ static int s1ap_decode_initiating(s1ap_message_t *message,
|
|||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_uplinkNASTransport:
|
||||
ret = s1ap_decode_s1ap_uplinknastransport_ies(
|
||||
&message->s1ap_UplinkNASTransport_IEs,
|
||||
&initiating_p->value);
|
||||
s1ap_decode_xer_print_message(s1ap_xer_print_s1ap_uplinknastransport,
|
||||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_initialUEMessage:
|
||||
ret = s1ap_decode_s1ap_initialuemessage_ies(
|
||||
&message->s1ap_InitialUEMessage_IEs,
|
||||
|
@ -102,13 +102,6 @@ static int s1ap_decode_initiating(s1ap_message_t *message,
|
|||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_UEContextReleaseRequest:
|
||||
ret = s1ap_decode_s1ap_uecontextreleaserequest_ies(
|
||||
&message->s1ap_UEContextReleaseRequest_IEs, &initiating_p->value);
|
||||
s1ap_decode_xer_print_message(s1ap_xer_print_s1ap_uecontextreleaserequest,
|
||||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
|
||||
ret = s1ap_decode_s1ap_uecapabilityinfoindicationies(
|
||||
&message->s1ap_UECapabilityInfoIndicationIEs,
|
||||
|
@ -118,6 +111,13 @@ static int s1ap_decode_initiating(s1ap_message_t *message,
|
|||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_UEContextReleaseRequest:
|
||||
ret = s1ap_decode_s1ap_uecontextreleaserequest_ies(
|
||||
&message->s1ap_UEContextReleaseRequest_IEs, &initiating_p->value);
|
||||
s1ap_decode_xer_print_message(s1ap_xer_print_s1ap_uecontextreleaserequest,
|
||||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_NASNonDeliveryIndication:
|
||||
ret = s1ap_decode_s1ap_nasnondeliveryindication_ies(
|
||||
&message->s1ap_NASNonDeliveryIndication_IEs,
|
||||
|
@ -169,6 +169,14 @@ static int s1ap_decode_successfull_outcome(s1ap_message_t *message,
|
|||
s1ap_xer_print_s1ap_e_rabsetupresponse,
|
||||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
case S1ap_ProcedureCode_id_E_RABRelease:
|
||||
ret = s1ap_decode_s1ap_e_rabreleaseresponseies(
|
||||
&message->s1ap_E_RABReleaseResponseIEs,
|
||||
&successfullOutcome_p->value);
|
||||
s1ap_decode_xer_print_message(
|
||||
s1ap_xer_print_s1ap_e_rabreleaseresponse,
|
||||
s1ap_xer__print2sp, message);
|
||||
break;
|
||||
case S1ap_ProcedureCode_id_UEContextRelease:
|
||||
ret = s1ap_decode_s1ap_uecontextreleasecomplete_ies(
|
||||
&message->s1ap_UEContextReleaseComplete_IEs,
|
||||
|
|
|
@ -25,6 +25,8 @@ static inline int s1ap_encode_initial_context_setup_request(
|
|||
s1ap_message_t *message_p, pkbuf_t *pkbuf);
|
||||
static inline int s1ap_encode_e_rab_setup_request(
|
||||
s1ap_message_t *message_p, pkbuf_t *pkbuf);
|
||||
static inline int s1ap_encode_e_rab_release_command(
|
||||
s1ap_message_t *message_p, pkbuf_t *pkbuf);
|
||||
static inline int s1ap_encode_ue_context_release_command(
|
||||
s1ap_message_t *message_p, pkbuf_t *pkbuf);
|
||||
static inline int s1ap_encode_paging(
|
||||
|
@ -107,6 +109,12 @@ static inline int s1ap_encode_initiating_message(
|
|||
s1ap_xer__print2sp, message_p);
|
||||
ret = s1ap_encode_e_rab_setup_request(message_p, pkbuf);
|
||||
break;
|
||||
case S1ap_ProcedureCode_id_E_RABRelease:
|
||||
s1ap_encode_xer_print_message(
|
||||
s1ap_xer_print_s1ap_e_rabreleasecommand,
|
||||
s1ap_xer__print2sp, message_p);
|
||||
ret = s1ap_encode_e_rab_release_command(message_p, pkbuf);
|
||||
break;
|
||||
case S1ap_ProcedureCode_id_UEContextRelease:
|
||||
s1ap_encode_xer_print_message(
|
||||
s1ap_xer_print_s1ap_uecontextreleasecommand,
|
||||
|
@ -398,6 +406,43 @@ static inline int s1ap_encode_e_rab_setup_request(
|
|||
return enc_ret.encoded;
|
||||
}
|
||||
|
||||
static inline int s1ap_encode_e_rab_release_command(
|
||||
s1ap_message_t *message_p, pkbuf_t *pkbuf)
|
||||
{
|
||||
asn_enc_rval_t enc_ret = {0};
|
||||
|
||||
S1AP_PDU_t pdu;
|
||||
S1ap_E_RABReleaseCommand_t req;
|
||||
asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_E_RABReleaseCommand;
|
||||
|
||||
memset(&req, 0, sizeof(S1ap_E_RABReleaseCommand_t));
|
||||
if (s1ap_encode_s1ap_e_rabreleasecommandies(
|
||||
&req, &message_p->s1ap_E_RABReleaseCommandIEs) < 0)
|
||||
{
|
||||
d_error("Encoding of %s failed", td->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&pdu, 0, sizeof (S1AP_PDU_t));
|
||||
pdu.present = S1AP_PDU_PR_initiatingMessage;
|
||||
pdu.choice.initiatingMessage.procedureCode = message_p->procedureCode;
|
||||
pdu.choice.initiatingMessage.criticality = S1ap_Criticality_reject;
|
||||
ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, &req);
|
||||
|
||||
enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU,
|
||||
&pdu, pkbuf->payload, MAX_SDU_LEN);
|
||||
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &req);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu);
|
||||
|
||||
if (enc_ret.encoded < 0)
|
||||
{
|
||||
d_error("Encoding of %s failed", td->name);
|
||||
}
|
||||
|
||||
return enc_ret.encoded;
|
||||
}
|
||||
|
||||
static inline int s1ap_encode_ue_context_release_command(
|
||||
s1ap_message_t *message_p, pkbuf_t *pkbuf)
|
||||
{
|
||||
|
|
|
@ -45,21 +45,6 @@ static inline int s1ap_free_initiating_message(s1ap_message_t *message)
|
|||
&message->s1ap_InitialUEMessage_IEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
|
||||
s1ap_free_s1ap_uecapabilityinfoindicationies(
|
||||
&message->s1ap_UECapabilityInfoIndicationIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_InitialContextSetup:
|
||||
s1ap_free_s1ap_initialcontextsetuprequesties(
|
||||
&message->s1ap_InitialContextSetupRequestIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_E_RABSetup:
|
||||
s1ap_free_s1ap_e_rabsetuprequesties(
|
||||
&message->s1ap_E_RABSetupRequestIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_downlinkNASTransport:
|
||||
s1ap_free_s1ap_downlinknastransport_ies(
|
||||
&message->s1ap_DownlinkNASTransport_IEs);
|
||||
|
@ -70,6 +55,26 @@ static inline int s1ap_free_initiating_message(s1ap_message_t *message)
|
|||
&message->s1ap_UplinkNASTransport_IEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_InitialContextSetup:
|
||||
s1ap_free_s1ap_initialcontextsetuprequesties(
|
||||
&message->s1ap_InitialContextSetupRequestIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
|
||||
s1ap_free_s1ap_uecapabilityinfoindicationies(
|
||||
&message->s1ap_UECapabilityInfoIndicationIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_E_RABSetup:
|
||||
s1ap_free_s1ap_e_rabsetuprequesties(
|
||||
&message->s1ap_E_RABSetupRequestIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_E_RABRelease:
|
||||
s1ap_free_s1ap_e_rabreleasecommandies(
|
||||
&message->s1ap_E_RABReleaseCommandIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_NASNonDeliveryIndication:
|
||||
s1ap_free_s1ap_nasnondeliveryindication_ies(
|
||||
&message->s1ap_NASNonDeliveryIndication_IEs);
|
||||
|
@ -118,6 +123,11 @@ static inline int s1ap_free_successfull_outcome(s1ap_message_t *message)
|
|||
&message->s1ap_E_RABSetupResponseIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_E_RABRelease:
|
||||
s1ap_free_s1ap_e_rabmodifyresponseies(
|
||||
&message->s1ap_E_RABModifyResponseIEs);
|
||||
break;
|
||||
|
||||
case S1ap_ProcedureCode_id_UEContextRelease:
|
||||
s1ap_free_s1ap_uecontextreleasecomplete_ies(
|
||||
&message->s1ap_UEContextReleaseComplete_IEs);
|
||||
|
|
|
@ -192,3 +192,38 @@ status_t esm_build_activate_dedicated_bearer_context_request(
|
|||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t esm_build_deactivate_bearer_context_request(
|
||||
pkbuf_t **pkbuf, mme_bearer_t *bearer, nas_esm_cause_t esm_cause)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
||||
nas_message_t message;
|
||||
nas_deactivate_eps_bearer_context_request_t
|
||||
*deactivate_eps_bearer_context_request =
|
||||
&message.esm.deactivate_eps_bearer_context_request;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.h.security_header_type =
|
||||
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
|
||||
message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
message.esm.h.eps_bearer_identity = bearer->ebi;
|
||||
message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM;
|
||||
message.esm.h.procedure_transaction_identity = sess->pti;
|
||||
message.esm.h.message_type =
|
||||
NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST;
|
||||
|
||||
deactivate_eps_bearer_context_request->esm_cause = esm_cause;
|
||||
|
||||
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
|
||||
*pkbuf,,);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,8 @@ CORE_DECLARE(status_t) esm_build_activate_default_bearer_context_request(
|
|||
pkbuf_t **pkbuf, mme_sess_t *sess);
|
||||
CORE_DECLARE(status_t) esm_build_activate_dedicated_bearer_context_request(
|
||||
pkbuf_t **pkbuf, mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) esm_build_deactivate_bearer_context_request(
|
||||
pkbuf_t **pkbuf, mme_bearer_t *bearer, nas_esm_cause_t esm_cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -301,8 +301,7 @@ void esm_state_disconnect(fsm_t *s, event_t *e)
|
|||
{
|
||||
default:
|
||||
{
|
||||
d_warn("Not implemented(type:%d)",
|
||||
message->esm.h.message_type);
|
||||
FSM_TRAN(s, esm_state_session_exception);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -473,6 +473,11 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_disconnect))
|
||||
{
|
||||
rv = nas_send_deactivate_bearer_context_request(
|
||||
enb_ue, bearer);
|
||||
d_assert(rv == CORE_OK, break,
|
||||
"nas_send_deactivate_bearer"
|
||||
"_context_request failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -161,3 +161,30 @@ status_t nas_send_activate_dedicated_bearer_context_request(
|
|||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t nas_send_deactivate_bearer_context_request(
|
||||
enb_ue_t *enb_ue, mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *esmbuf = NULL, *s1apbuf = NULL;
|
||||
S1ap_Cause_t cause;
|
||||
|
||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
|
||||
rv = esm_build_deactivate_bearer_context_request(
|
||||
&esmbuf, bearer, ESM_CAUSE_REGULAR_DEACTIVATION);
|
||||
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
|
||||
|
||||
d_trace(3, "[NAS] Deactivate bearer context request : EMM <-- ESM\n");
|
||||
|
||||
cause.present = S1ap_Cause_PR_nas;
|
||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||
rv = s1ap_build_e_rab_release_command(&s1apbuf, bearer, esmbuf, &cause);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(esmbuf); return CORE_ERROR, "s1ap build error");
|
||||
|
||||
d_assert(nas_send_to_enb(enb_ue, s1apbuf) == CORE_OK,,);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ CORE_DECLARE(status_t) nas_send_attach_reject(mme_ue_t *mme_ue,
|
|||
nas_esm_cause_t esm_cause);
|
||||
CORE_DECLARE(status_t) nas_send_activate_dedicated_bearer_context_request(
|
||||
enb_ue_t *enb_ue, mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) nas_send_deactivate_bearer_context_request(
|
||||
enb_ue_t *enb_ue, mme_bearer_t *bearer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -402,6 +402,104 @@ status_t s1ap_build_e_rab_setup_request(
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
static void s1ap_build_cause(S1ap_Cause_t *dst, S1ap_Cause_t *src)
|
||||
{
|
||||
d_assert(src, return, "Null param");
|
||||
d_assert(dst, return, "Null param");
|
||||
|
||||
dst->present = src->present;
|
||||
switch(dst->present)
|
||||
{
|
||||
case S1ap_Cause_PR_radioNetwork:
|
||||
dst->choice.radioNetwork = src->choice.radioNetwork;
|
||||
break;
|
||||
case S1ap_Cause_PR_transport:
|
||||
dst->choice.transport = src->choice.transport;
|
||||
break;
|
||||
case S1ap_Cause_PR_nas:
|
||||
dst->choice.nas = src->choice.nas;
|
||||
break;
|
||||
case S1ap_Cause_PR_protocol:
|
||||
dst->choice.protocol = src->choice.protocol;
|
||||
break;
|
||||
case S1ap_Cause_PR_misc:
|
||||
dst->choice.misc = src->choice.misc;
|
||||
break;
|
||||
default:
|
||||
d_error("Invalid src type : %d", dst->present);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
|
||||
mme_bearer_t *bearer, pkbuf_t *esmbuf, S1ap_Cause_t *cause)
|
||||
{
|
||||
char buf[INET_ADDRSTRLEN];
|
||||
|
||||
int encoded;
|
||||
s1ap_message_t message;
|
||||
S1ap_E_RABReleaseCommandIEs_t *ies = &message.s1ap_E_RABReleaseCommandIEs;
|
||||
S1ap_E_RABItem_t *e_rab = NULL;
|
||||
S1ap_NAS_PDU_t *nasPdu = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
|
||||
d_assert(esmbuf, return CORE_ERROR, "Null param");
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
||||
subscription_data = &mme_ue->subscription_data;
|
||||
d_assert(subscription_data, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(&message, 0, sizeof(s1ap_message_t));
|
||||
|
||||
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
|
||||
ies->eNB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
|
||||
|
||||
ies->presenceMask |=
|
||||
S1AP_E_RABRELEASECOMMANDIES_UEAGGREGATEMAXIMUMBITRATE_PRESENT;
|
||||
asn_uint642INTEGER(
|
||||
&ies->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL,
|
||||
subscription_data->ambr.uplink);
|
||||
asn_uint642INTEGER(
|
||||
&ies->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL,
|
||||
subscription_data->ambr.downlink);
|
||||
|
||||
e_rab = (S1ap_E_RABItem_t *)core_calloc(1, sizeof(S1ap_E_RABItem_t));
|
||||
e_rab->e_RAB_ID = bearer->ebi;
|
||||
s1ap_build_cause(&e_rab->cause, cause);
|
||||
|
||||
ies->presenceMask |= S1AP_E_RABRELEASECOMMANDIES_NAS_PDU_PRESENT;
|
||||
nasPdu = &ies->nas_pdu;
|
||||
nasPdu->size = esmbuf->len;
|
||||
nasPdu->buf = core_calloc(nasPdu->size, sizeof(c_uint8_t));
|
||||
memcpy(nasPdu->buf, esmbuf->payload, nasPdu->size);
|
||||
|
||||
ASN_SEQUENCE_ADD(&ies->e_RABToBeReleasedList, e_rab);
|
||||
|
||||
message.procedureCode = S1ap_ProcedureCode_id_E_RABRelease;
|
||||
message.direction = S1AP_PDU_PR_initiatingMessage;
|
||||
|
||||
encoded = s1ap_encode_pdu(s1apbuf, &message);
|
||||
s1ap_free_pdu(&message);
|
||||
|
||||
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
|
||||
|
||||
d_trace(3, "[S1AP] E-RAB Release Command : "
|
||||
"UE[eNB-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
|
||||
enb_ue->enb_ue_s1ap_id,
|
||||
INET_NTOP(&enb_ue->enb->s1ap_sock->remote.sin_addr.s_addr, buf),
|
||||
enb_ue->enb->enb_id);
|
||||
|
||||
pkbuf_free(esmbuf);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t s1ap_build_ue_context_release_commmand(
|
||||
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_t *cause)
|
||||
{
|
||||
|
|
|
@ -17,6 +17,8 @@ CORE_DECLARE(status_t) s1ap_build_initial_context_setup_request(
|
|||
pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf);
|
||||
CORE_DECLARE(status_t) s1ap_build_e_rab_setup_request(
|
||||
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *esmbuf);
|
||||
CORE_DECLARE(status_t) s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
|
||||
mme_bearer_t *bearer, pkbuf_t *esmbuf, S1ap_Cause_t *cause);
|
||||
CORE_DECLARE(status_t) s1ap_build_ue_context_release_commmand(
|
||||
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_t *cause);
|
||||
CORE_DECLARE(status_t) s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue);
|
||||
|
|
|
@ -206,6 +206,7 @@ status_t s1ap_send_to_esm(mme_ue_t *mme_ue, pkbuf_t *esmbuf)
|
|||
event_t e;
|
||||
nas_esm_header_t *h = NULL;
|
||||
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
c_uint8_t pti = NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
|
||||
c_uint8_t ebi = NAS_EPS_BEARER_IDENTITY_UNASSIGNED;
|
||||
|
@ -229,6 +230,9 @@ status_t s1ap_send_to_esm(mme_ue_t *mme_ue, pkbuf_t *esmbuf)
|
|||
linked_eps_bearer_identity->eps_bearer_identity);
|
||||
d_assert(bearer, return CORE_ERROR,
|
||||
"Invalid pti(%d) and ebi(%d)\n", pti, ebi);
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
sess->pti = pti;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -236,7 +240,7 @@ status_t s1ap_send_to_esm(mme_ue_t *mme_ue, pkbuf_t *esmbuf)
|
|||
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
|
||||
else if (pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED)
|
||||
{
|
||||
mme_sess_t *sess = mme_sess_find_by_pti(mme_ue, pti);
|
||||
sess = mme_sess_find_by_pti(mme_ue, pti);
|
||||
if (!sess)
|
||||
sess = mme_sess_add(mme_ue, pti);
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
|
|
|
@ -111,6 +111,10 @@ void s1ap_state_operational(fsm_t *s, event_t *e)
|
|||
s1ap_handle_e_rab_setup_response(enb, message);
|
||||
break;
|
||||
}
|
||||
case S1ap_ProcedureCode_id_E_RABRelease :
|
||||
{
|
||||
break;
|
||||
}
|
||||
case S1ap_ProcedureCode_id_UEContextRelease :
|
||||
{
|
||||
s1ap_handle_ue_context_release_complete(
|
||||
|
|
|
@ -793,6 +793,48 @@ status_t tests1ap_build_e_rab_setup_response(pkbuf_t **pkbuf, int i)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t tests1ap_build_e_rab_release_response(pkbuf_t **pkbuf, int i)
|
||||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"2007001d0000"
|
||||
"0300004005c08000 0108000840030001 000045400600000f 40010c",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
||||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
33,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
};
|
||||
char hexbuf[MAX_SDU_LEN];
|
||||
|
||||
*pkbuf = pkbuf_alloc(0, MAX_SDU_LEN);
|
||||
if (!(*pkbuf)) return CORE_ERROR;
|
||||
|
||||
(*pkbuf)->len = len[i];
|
||||
memcpy((*pkbuf)->payload, CORE_HEX(payload[i], strlen(payload[i]), hexbuf),
|
||||
(*pkbuf)->len);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t tests1ap_build_activate_default_bearer_accept(
|
||||
pkbuf_t **pkbuf, int i)
|
||||
{
|
||||
|
@ -883,6 +925,50 @@ status_t tests1ap_build_activate_dedicated_bearer_accept(
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t tests1ap_build_deactivate_bearer_accept(
|
||||
pkbuf_t **pkbuf, int i)
|
||||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"000d40370000"
|
||||
"0500000005c08000 0108000800030001 00001a000a09274c b2ebbd056200ce00"
|
||||
"6440080055f50100 19d0100043400600 55f5011022",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
||||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
59,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
};
|
||||
char hexbuf[MAX_SDU_LEN];
|
||||
|
||||
*pkbuf = pkbuf_alloc(0, MAX_SDU_LEN);
|
||||
if (!(*pkbuf)) return CORE_ERROR;
|
||||
|
||||
(*pkbuf)->len = len[i];
|
||||
memcpy((*pkbuf)->payload, CORE_HEX(payload[i], strlen(payload[i]), hexbuf),
|
||||
(*pkbuf)->len);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t tests1ap_build_pdn_connectivity_request(
|
||||
pkbuf_t **pkbuf, int i)
|
||||
{
|
||||
|
@ -928,3 +1014,47 @@ status_t tests1ap_build_pdn_connectivity_request(
|
|||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t tests1ap_build_pdn_disconnectivity_request(
|
||||
pkbuf_t **pkbuf, int i)
|
||||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"000d40380000"
|
||||
"0500000005c08000 0108000800030001 00001a000b0a2732 423c53040206d206"
|
||||
"006440080055f501 0019d01000434006 0055f5011022",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
||||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
60,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
};
|
||||
char hexbuf[MAX_SDU_LEN];
|
||||
|
||||
*pkbuf = pkbuf_alloc(0, MAX_SDU_LEN);
|
||||
if (!(*pkbuf)) return CORE_ERROR;
|
||||
|
||||
(*pkbuf)->len = len[i];
|
||||
memcpy((*pkbuf)->payload, CORE_HEX(payload[i], strlen(payload[i]), hexbuf),
|
||||
(*pkbuf)->len);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -37,12 +37,18 @@ CORE_DECLARE(status_t) tests1ap_build_service_request(
|
|||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_e_rab_setup_response(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_e_rab_release_response(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_activate_default_bearer_accept(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_activate_dedicated_bearer_accept(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_deactivate_bearer_accept(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_pdn_connectivity_request(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
CORE_DECLARE(status_t) tests1ap_build_pdn_disconnectivity_request(
|
||||
pkbuf_t **pkbuf, int i);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -268,6 +268,33 @@ static void volte_test1(abts_case *tc, void *data)
|
|||
|
||||
core_sleep(time_from_msec(300));
|
||||
|
||||
/* Send PDN disconnectivity request */
|
||||
rv = tests1ap_build_pdn_disconnectivity_request(&sendbuf, msgindex);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
/* Receive E-RAB Release Command +
|
||||
* Deactivate EPS bearer context request */
|
||||
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
|
||||
rc = tests1ap_enb_read(sock, recvbuf);
|
||||
ABTS_INT_NEQUAL(tc, 0, rc);
|
||||
pkbuf_free(recvbuf);
|
||||
|
||||
/* Send E-RAB Release Response */
|
||||
rv = tests1ap_build_e_rab_release_response(&sendbuf, msgindex);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
/* Deactivate EPS bearer context accept */
|
||||
rv = tests1ap_build_deactivate_bearer_accept(&sendbuf, msgindex);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
core_sleep(time_from_msec(300));
|
||||
|
||||
/********** Remove Subscriber in Database */
|
||||
doc = BCON_NEW("imsi", BCON_UTF8("001010123456819"));
|
||||
ABTS_PTR_NOTNULL(tc, doc);
|
||||
|
@ -529,7 +556,9 @@ abts_suite *test_volte(abts_suite *suite)
|
|||
suite = ADD_SUITE(suite)
|
||||
|
||||
abts_run_test(suite, volte_test1, NULL);
|
||||
#if 0
|
||||
abts_run_test(suite, volte_test2, NULL);
|
||||
#endif
|
||||
|
||||
return suite;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue