add PDN disconnect

This commit is contained in:
Sukchan Lee 2017-09-07 23:41:05 +09:00
parent 913762c317
commit b0be746292
16 changed files with 439 additions and 33 deletions

View File

@ -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,

View File

@ -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)
{

View File

@ -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);

View File

@ -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;
}

View File

@ -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
}

View File

@ -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;
}
}

View File

@ -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
{

View File

@ -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;
}

View File

@ -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
}

View File

@ -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)
{

View File

@ -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);

View File

@ -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");

View File

@ -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(

View File

@ -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;
}

View File

@ -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
}

View File

@ -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;
}