dedicated bearer(MME->UE)

This commit is contained in:
Sukchan Lee 2017-09-05 00:04:05 +09:00
parent a9b181cbd5
commit 41262d50fa
15 changed files with 331 additions and 67 deletions

View File

@ -176,3 +176,43 @@ void apn_ambr_build(
apn_aggregate_maximum_bit_rate->length = length*2;
}
void eps_qos_build(nas_eps_quality_of_service_t *eps_qos, c_uint8_t qci,
c_uint64_t dl_mbr, c_uint64_t ul_mbr, c_uint64_t dl_gbr, c_uint64_t ul_gbr)
{
c_uint8_t length = 0;
dl_mbr = dl_mbr / 1024; /* Kbps */
ul_mbr = ul_mbr / 1024; /* Kbps */
dl_gbr = dl_gbr / 1024; /* Kbps */
ul_gbr = ul_gbr / 1024; /* Kbps */
memset(eps_qos, 0, sizeof(nas_eps_quality_of_service_t));
eps_qos->qci = qci;
length = c_max(length, br_calculate(
&eps_qos->dl_mbr,
&eps_qos->dl_mbr_extended,
&eps_qos->dl_mbr_extended2,
dl_mbr));
length = c_max(length, br_calculate(
&eps_qos->ul_mbr,
&eps_qos->ul_mbr_extended,
&eps_qos->ul_mbr_extended2,
ul_mbr));
length = c_max(length, br_calculate(
&eps_qos->dl_gbr,
&eps_qos->dl_gbr_extended,
&eps_qos->dl_gbr_extended2,
dl_gbr));
length = c_max(length, br_calculate(
&eps_qos->ul_gbr,
&eps_qos->ul_gbr_extended,
&eps_qos->ul_gbr_extended2,
ul_gbr));
eps_qos->length = length*4+1;
}

View File

@ -1044,6 +1044,10 @@ typedef struct _nas_eps_quality_of_service_t {
c_uint8_t dl_gbr_extended2;
} nas_eps_quality_of_service_t;
CORE_DECLARE(void) eps_qos_build(nas_eps_quality_of_service_t *eps_qos,
c_uint8_t qci,
c_uint64_t dl_mbr, c_uint64_t ul_mbr, c_uint64_t dl_gbr, c_uint64_t ul_gbr);
/* 9.9.4.4 ESM cause
* M V 1
* Annex B (informative):Cause values for EPS session management
@ -1108,8 +1112,8 @@ ED3(c_uint8_t type:4;,
/* 9.9.4.6 Linked EPS bearer identity
* M V 1/2 */
typedef struct _nas_linked_eps_bearer_identity_t {
ED2(c_uint8_t eps_bearer_identity:4;,
c_uint8_t spare:4;)
ED2(c_uint8_t spare:4;,
c_uint8_t eps_bearer_identity:4;)
} __attribute__ ((packed)) nas_linked_eps_bearer_identity_t;
/* 9.9.4.7 LLC service access point identifier

View File

@ -13,8 +13,6 @@ static inline int s1ap_encode_successfull_outcome(
static inline int s1ap_encode_unsuccessfull_outcome(
s1ap_message_t *message_p, pkbuf_t *pkbuf);
static inline int s1ap_encode_initial_context_setup_request(
s1ap_message_t *message_p, pkbuf_t *pkbuf);
static inline int s1ap_encode_s1setup_request(
s1ap_message_t *message_p, pkbuf_t *pkbuf);
static inline int s1ap_encode_s1setup_response(
@ -23,6 +21,10 @@ static inline int s1ap_encode_s1setup_failure(
s1ap_message_t *message_p, pkbuf_t *pkbuf);
static inline int s1ap_encode_downlink_nas_transport(
s1ap_message_t *message_p, pkbuf_t *pkbuf);
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_ue_context_release_command(
s1ap_message_t *message_p, pkbuf_t *pkbuf);
static inline int s1ap_encode_paging(
@ -99,6 +101,12 @@ static inline int s1ap_encode_initiating_message(
s1ap_xer__print2sp, message_p);
ret = s1ap_encode_initial_context_setup_request(message_p, pkbuf);
break;
case S1ap_ProcedureCode_id_E_RABSetup:
s1ap_encode_xer_print_message(
s1ap_xer_print_s1ap_e_rabsetuprequest,
s1ap_xer__print2sp, message_p);
ret = s1ap_encode_e_rab_setup_request(message_p, pkbuf);
break;
case S1ap_ProcedureCode_id_UEContextRelease:
s1ap_encode_xer_print_message(
s1ap_xer_print_s1ap_uecontextreleasecommand,
@ -162,46 +170,6 @@ static inline int s1ap_encode_unsuccessfull_outcome(
return ret;
}
static inline int s1ap_encode_initial_context_setup_request(
s1ap_message_t *message_p, pkbuf_t *pkbuf)
{
asn_enc_rval_t enc_ret = {0};
S1AP_PDU_t pdu;
S1ap_InitialContextSetupRequest_t initialContextSetupRequest;
asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_InitialContextSetupRequest;
memset(&initialContextSetupRequest, 0,
sizeof(S1ap_InitialContextSetupRequest_t));
if (s1ap_encode_s1ap_initialcontextsetuprequesties(
&initialContextSetupRequest,
&message_p->s1ap_InitialContextSetupRequestIEs) < 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, &initialContextSetupRequest);
enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU,
&pdu, pkbuf->payload, MAX_SDU_LEN);
ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &initialContextSetupRequest);
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_s1setup_request(
s1ap_message_t *message_p, pkbuf_t *pkbuf)
{
@ -353,6 +321,83 @@ static inline int s1ap_encode_downlink_nas_transport(
return enc_ret.encoded;
}
static inline int s1ap_encode_initial_context_setup_request(
s1ap_message_t *message_p, pkbuf_t *pkbuf)
{
asn_enc_rval_t enc_ret = {0};
S1AP_PDU_t pdu;
S1ap_InitialContextSetupRequest_t initialContextSetupRequest;
asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_InitialContextSetupRequest;
memset(&initialContextSetupRequest, 0,
sizeof(S1ap_InitialContextSetupRequest_t));
if (s1ap_encode_s1ap_initialcontextsetuprequesties(
&initialContextSetupRequest,
&message_p->s1ap_InitialContextSetupRequestIEs) < 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, &initialContextSetupRequest);
enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU,
&pdu, pkbuf->payload, MAX_SDU_LEN);
ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &initialContextSetupRequest);
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_e_rab_setup_request(
s1ap_message_t *message_p, pkbuf_t *pkbuf)
{
asn_enc_rval_t enc_ret = {0};
S1AP_PDU_t pdu;
S1ap_E_RABSetupRequest_t req;
asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_E_RABSetupRequest;
memset(&req, 0, sizeof(S1ap_E_RABSetupRequest_t));
if (s1ap_encode_s1ap_e_rabsetuprequesties(
&req, &message_p->s1ap_E_RABSetupRequestIEs) < 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

@ -55,6 +55,11 @@ static inline int s1ap_free_initiating_message(s1ap_message_t *message)
&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);

View File

@ -90,17 +90,8 @@ status_t esm_build_activate_default_bearer_context(
message.esm.h.message_type =
NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST;
#if 0 /* default bearer is not needed */
eps_qos->length = 5;
eps_qos->qci = pdn->qos.qci;
eps_qos->ul_mbr = 0xff;
eps_qos->dl_mbr = 0xff;
eps_qos->ul_gbr = 0xff;
eps_qos->dl_gbr = 0xff;
#else
eps_qos->length = 1;
eps_qos->qci = pdn->qos.qci;
#endif
access_point_name->length = strlen(pdn->apn);
core_cpystrn(access_point_name->apn, pdn->apn,
@ -129,3 +120,46 @@ status_t esm_build_activate_default_bearer_context(
return CORE_OK;
}
status_t esm_build_activate_dedicated_bearer_context(
pkbuf_t **pkbuf, mme_bearer_t *bearer)
{
mme_ue_t *mme_ue = NULL;
mme_bearer_t *linked_bearer = NULL;
nas_message_t message;
nas_activate_dedicated_eps_bearer_context_request_t
*activate_dedicated_eps_bearer_context_request =
&message.esm.activate_dedicated_eps_bearer_context_request;
nas_linked_eps_bearer_identity_t *linked_ebi =
&activate_dedicated_eps_bearer_context_request->
linked_eps_bearer_identity;
nas_eps_quality_of_service_t *eps_qos =
&activate_dedicated_eps_bearer_context_request->eps_qos;
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
linked_bearer = mme_linked_bearer(bearer);
d_assert(linked_bearer, 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 = 0;
message.esm.h.message_type =
NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST;
linked_ebi->eps_bearer_identity = linked_bearer->ebi;
eps_qos_build(eps_qos, bearer->qos.qci,
bearer->qos.mbr.downlink, bearer->qos.mbr.uplink,
bearer->qos.gbr.downlink, bearer->qos.gbr.uplink);
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,);
return CORE_OK;
}

View File

@ -9,12 +9,12 @@ extern "C" {
CORE_DECLARE(status_t) esm_build_pdn_connectivity_reject(pkbuf_t **pkbuf,
c_uint8_t pti, nas_esm_cause_t esm_cause);
CORE_DECLARE(status_t) esm_build_information_request(pkbuf_t **pkbuf,
mme_bearer_t *bearer);
CORE_DECLARE(status_t) esm_build_activate_default_bearer_context(
pkbuf_t **pkbuf, mme_sess_t *sess);
CORE_DECLARE(status_t) esm_build_activate_dedicated_bearer_context(
pkbuf_t **pkbuf, mme_bearer_t *bearer);
#ifdef __cplusplus
}

View File

@ -59,3 +59,29 @@ void esm_handle_information_response(mme_sess_t *sess,
sess->ue_pco_len);
}
}
void esm_handle_activate_dedicated_bearer_request(mme_bearer_t *bearer)
{
status_t rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
pkbuf_t *esmbuf = NULL, *s1apbuf = NULL;
d_assert(bearer, return, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param");
rv = esm_build_activate_dedicated_bearer_context(&esmbuf, bearer);
d_assert(rv == CORE_OK && esmbuf, return, "esm build error");
d_trace(3, "[NAS] Activate dedicated bearer context request : "
"EMM <-- ESM\n");
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(esmbuf); return, "s1ap build error");
d_assert(nas_send_to_enb(enb_ue, s1apbuf) == CORE_OK,,);
}

View File

@ -13,6 +13,8 @@ CORE_DECLARE(void) esm_handle_pdn_connectivity_request(mme_sess_t *sess,
nas_pdn_connectivity_request_t *pdn_connectivity_request);
CORE_DECLARE(void) esm_handle_information_response(mme_sess_t *sess,
nas_esm_information_response_t *bearer_information_response);
CORE_DECLARE(void) esm_handle_activate_dedicated_bearer_request(
mme_bearer_t *bearer);
#ifdef __cplusplus
}

View File

@ -113,9 +113,21 @@ void esm_state_operational(fsm_t *s, event_t *e)
}
case NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
{
mme_bearer_t *dedicated_bearer = NULL;
d_trace(3, "[NAS] Activate default eps bearer "
"context accept : UE[%s] --> ESM[%d]\n",
mme_ue->imsi_bcd, bearer->pti);
dedicated_bearer = mme_bearer_next(bearer);
while(dedicated_bearer)
{
if (MME_BEARER_IS_VALID(dedicated_bearer))
continue;
esm_handle_activate_dedicated_bearer_request(
dedicated_bearer);
dedicated_bearer = mme_bearer_next(dedicated_bearer);
}
break;
}
default:

View File

@ -1709,6 +1709,17 @@ mme_bearer_t* mme_default_bearer_in_sess(mme_sess_t *sess)
return mme_bearer_first(sess);
}
mme_bearer_t* mme_linked_bearer(mme_bearer_t *bearer)
{
mme_sess_t *sess = NULL;
d_assert(bearer, return NULL, "Null param");
sess = bearer->sess;
d_assert(sess, return NULL, "Null param");
return mme_default_bearer_in_sess(sess);
}
mme_bearer_t* mme_bearer_first(mme_sess_t *sess)
{
d_assert(sess, return NULL, "Null param");

View File

@ -373,6 +373,7 @@ CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_sess_ebi(
CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_ue_ebi(
mme_ue_t *mme_ue, c_uint8_t ebi);
CORE_DECLARE(mme_bearer_t*) mme_default_bearer_in_sess(mme_sess_t *sess);
CORE_DECLARE(mme_bearer_t*) mme_linked_bearer(mme_bearer_t *bearer);
CORE_DECLARE(mme_bearer_t*) mme_bearer_first(mme_sess_t *sess);
CORE_DECLARE(mme_bearer_t*) mme_bearer_next(mme_bearer_t *bearer);

View File

@ -267,6 +267,10 @@ void mme_s11_handle_create_bearer_request(
bearer_qos.pre_emption_capability;
bearer->qos.arp.pre_emption_vulnerability =
bearer_qos.pre_emption_vulnerability;
bearer->qos.mbr.downlink = bearer_qos.dl_mbr;
bearer->qos.mbr.uplink = bearer_qos.ul_mbr;
bearer->qos.gbr.downlink = bearer_qos.dl_gbr;
bearer->qos.gbr.uplink = bearer_qos.ul_gbr;
/* Save Transaction */
bearer->xact = xact;

View File

@ -157,9 +157,6 @@ status_t s1ap_build_initial_context_setup_request(
S1ap_InitialContextSetupRequestIEs_t *ies =
&message.s1ap_InitialContextSetupRequestIEs;
S1ap_E_RABToBeSetupItemCtxtSUReq_t *e_rab = NULL;
#if 0 /* Not needed in default bearer */
struct S1ap_GBR_QosInformation *gbrQosInformation = NULL; /* OPTIONAL */
#endif
S1ap_NAS_PDU_t *nasPdu = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
@ -203,15 +200,6 @@ status_t s1ap_build_initial_context_setup_request(
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionVulnerability = !(pdn->qos.arp.pre_emption_vulnerability);
#if 0 /* Not needed in default bearer */
gbrQosInformation = core_calloc(1, sizeof(struct S1ap_GBR_QosInformation));
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL, 0);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL, 0);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_GuaranteedBitrateDL, 0);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_GuaranteedBitrateUL, 0);
e_rab->e_RABlevelQoSParameters.gbrQosInformation = gbrQosInformation;
#endif
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf =
core_calloc(e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
@ -290,6 +278,90 @@ status_t s1ap_build_initial_context_setup_request(
return CORE_OK;
}
status_t s1ap_build_e_rab_setup_request(
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *esmbuf)
{
char buf[INET_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_E_RABSetupRequestIEs_t *ies = &message.s1ap_E_RABSetupRequestIEs;
S1ap_E_RABToBeSetupItemBearerSUReq_t *e_rab = NULL;
struct S1ap_GBR_QosInformation *gbrQosInformation = NULL; /* OPTIONAL */
S1ap_NAS_PDU_t *nasPdu = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = 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");
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;
e_rab = (S1ap_E_RABToBeSetupItemBearerSUReq_t *)
core_calloc(1, sizeof(S1ap_E_RABToBeSetupItemBearerSUReq_t));
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionCapability = !(bearer->qos.arp.pre_emption_capability);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
pre_emptionVulnerability = !(bearer->qos.arp.pre_emption_vulnerability);
gbrQosInformation = core_calloc(1, sizeof(struct S1ap_GBR_QosInformation));
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL,
bearer->qos.mbr.downlink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL,
bearer->qos.mbr.uplink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_GuaranteedBitrateDL,
bearer->qos.gbr.downlink);
asn_uint642INTEGER(&gbrQosInformation->e_RAB_GuaranteedBitrateUL,
bearer->qos.gbr.uplink);
e_rab->e_RABlevelQoSParameters.gbrQosInformation = gbrQosInformation;
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf =
core_calloc(e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
memcpy(e_rab->transportLayerAddress.buf, &bearer->sgw_s1u_addr,
e_rab->transportLayerAddress.size);
s1ap_uint32_to_OCTET_STRING(bearer->sgw_s1u_teid, &e_rab->gTP_TEID);
nasPdu = &e_rab->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_RABToBeSetupListBearerSUReq, e_rab);
message.procedureCode = S1ap_ProcedureCode_id_E_RABSetup;
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 Setup Request : "
"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

@ -15,6 +15,8 @@ CORE_DECLARE(status_t) s1ap_build_downlink_nas_transport(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, pkbuf_t *emmbuf);
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_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

@ -218,6 +218,12 @@ static void volte_test1(abts_case *tc, void *data)
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
/* Receive E-RAB Setup */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rc = tests1ap_enb_read(sock, recvbuf);
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
/********** Remove Subscriber in Database */
doc = BCON_NEW("imsi", BCON_UTF8("001010123456819"));
ABTS_PTR_NOTNULL(tc, doc);