Create Bearer Response (MME->SGW)

This commit is contained in:
Sukchan Lee 2017-09-05 01:17:24 +09:00
parent 41262d50fa
commit 257c6f2115
10 changed files with 254 additions and 19 deletions

View File

@ -161,7 +161,14 @@ static int s1ap_decode_successfull_outcome(s1ap_message_t *message,
s1ap_xer_print_s1ap_initialcontextsetupresponse,
s1ap_xer__print2sp, message);
break;
case S1ap_ProcedureCode_id_E_RABSetup:
ret = s1ap_decode_s1ap_e_rabsetupresponseies(
&message->s1ap_E_RABSetupResponseIEs,
&successfullOutcome_p->value);
s1ap_decode_xer_print_message(
s1ap_xer_print_s1ap_e_rabsetupresponse,
s1ap_xer__print2sp, message);
break;
case S1ap_ProcedureCode_id_UEContextRelease:
ret = s1ap_decode_s1ap_uecontextreleasecomplete_ies(
&message->s1ap_UEContextReleaseComplete_IEs,
@ -206,7 +213,6 @@ static int s1ap_decode_unsuccessfull_outcome(s1ap_message_t *message,
s1ap_xer_print_s1ap_initialcontextsetupfailure,
s1ap_xer__print2sp, message);
break;
default:
d_error("Unknown procedure ID (%d) for "
"unsuccessfull outcome message",

View File

@ -113,6 +113,11 @@ static inline int s1ap_free_successfull_outcome(s1ap_message_t *message)
&message->s1ap_InitialContextSetupResponseIEs);
break;
case S1ap_ProcedureCode_id_E_RABSetup:
s1ap_free_s1ap_e_rabsetupresponseies(
&message->s1ap_E_RABSetupResponseIEs);
break;
case S1ap_ProcedureCode_id_UEContextRelease:
s1ap_free_s1ap_uecontextreleasecomplete_ies(
&message->s1ap_UEContextReleaseComplete_IEs);

View File

@ -169,11 +169,12 @@ status_t mme_s11_build_modify_bearer_request(
memset(&gtp_message, 0, sizeof(gtp_message_t));
/* Bearer Context : EBI */
req->bearer_contexts_to_be_modified.presence = 1;
req->bearer_contexts_to_be_modified.eps_bearer_id.presence = 1;
req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = bearer->ebi;
/* Send Data Plane(DL) : ENB-S1U */
/* Data Plane(DL) : ENB-S1U */
memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t));
enb_s1u_teid.ipv4 = 1;
enb_s1u_teid.interface_type = GTP_F_TEID_S1_U_ENODEB_GTP_U;
@ -241,6 +242,51 @@ status_t mme_s11_build_delete_session_request(
return CORE_OK;
}
status_t mme_s11_build_create_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
{
status_t rv;
gtp_message_t gtp_message;
gtp_create_bearer_response_t *rsp = &gtp_message.create_bearer_response;
gtp_cause_t cause;
gtp_f_teid_t enb_s1u_teid;
d_assert(bearer, return CORE_ERROR, "Null param");
memset(&gtp_message, 0, sizeof(gtp_message_t));
/* Set Cause */
memset(&cause, 0, sizeof(cause));
cause.value = GTP_CAUSE_REQUEST_ACCEPTED;
rsp->cause.presence = 1;
rsp->cause.len = sizeof(cause);
rsp->cause.data = &cause;
/* Bearer Context : EBI */
rsp->bearer_contexts.presence = 1;
rsp->bearer_contexts.eps_bearer_id.presence = 1;
rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi;
/* Data Plane(DL) : ENB-S1U */
memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t));
enb_s1u_teid.ipv4 = 1;
enb_s1u_teid.interface_type = GTP_F_TEID_S1_U_ENODEB_GTP_U;
enb_s1u_teid.ipv4_addr = bearer->enb_s1u_addr;
enb_s1u_teid.teid = htonl(bearer->enb_s1u_teid);
rsp->bearer_contexts.s1_u_enodeb_f_teid.presence = 1;
rsp->bearer_contexts.s1_u_enodeb_f_teid.data = &enb_s1u_teid;
rsp->bearer_contexts.s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
/* TODO : UE Time Zone */
gtp_message.h.type = type;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
}
status_t mme_s11_build_release_access_bearers_request(
pkbuf_t **pkbuf, c_uint8_t type)
{

View File

@ -13,6 +13,8 @@ CORE_DECLARE(status_t) mme_s11_build_modify_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_s11_build_delete_session_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess);
CORE_DECLARE(status_t) mme_s11_build_create_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_s11_build_release_access_bearers_request(
pkbuf_t **pkbuf, c_uint8_t type);
CORE_DECLARE(status_t) mme_s11_build_downlink_data_notification_ack(

View File

@ -300,9 +300,9 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
d_assert(enb->s1ap_sock, enb_ue_remove(enb_ue); return,);
d_trace(3, "[S1AP] InitialUEMessage : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
event_s1ap_to_nas(enb_ue, &ies->nas_pdu);
}
@ -319,13 +319,13 @@ void s1ap_handle_uplink_nas_transport(
d_assert(ies, return, "Null param");
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(enb_ue, return, "Null param");
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
d_trace(3, "[S1AP] uplinkNASTransport : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
event_s1ap_to_nas(enb_ue, &ies->nas_pdu);
}
@ -377,8 +377,8 @@ void s1ap_handle_ue_capability_info_indication(
d_trace(3, "[S1AP] UE Capability Info Indication : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
}
void s1ap_handle_initial_context_setup_response(
@ -399,12 +399,11 @@ void s1ap_handle_initial_context_setup_response(
d_trace(3, "[S1AP] Initial Context Setup Response : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
for (i = 0;
i < ies->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes.count;
i++)
for (i = 0; i < ies->e_RABSetupListCtxtSURes.
s1ap_E_RABSetupItemCtxtSURes.count; i++)
{
status_t rv;
gtp_header_t h;
@ -445,6 +444,72 @@ void s1ap_handle_initial_context_setup_response(
}
}
void s1ap_handle_e_rab_setup_response(
mme_enb_t *enb, s1ap_message_t *message)
{
char buf[INET_ADDRSTRLEN];
int i;
enb_ue_t *enb_ue = NULL;
S1ap_E_RABSetupResponseIEs_t *ies = NULL;
d_assert(enb, return, "Null param");
d_assert(message, return, "Null param");
ies = &message->s1ap_E_RABSetupResponseIEs;
d_assert(ies, return, "Null param");
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);
d_trace(3, "[S1AP] E-RAB Setup Response : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
for (i = 0; i < ies->e_RABSetupListBearerSURes.
s1ap_E_RABSetupItemBearerSURes.count; i++)
{
status_t rv;
gtp_header_t h;
gtp_xact_t *xact = NULL;
pkbuf_t *pkbuf = NULL;
mme_bearer_t *bearer = NULL;
mme_ue_t *mme_ue = enb_ue->mme_ue;
S1ap_E_RABSetupItemBearerSURes_t *e_rab = NULL;
e_rab = (S1ap_E_RABSetupItemBearerSURes_t *)ies->
e_RABSetupListBearerSURes.s1ap_E_RABSetupItemBearerSURes.array[i];
d_assert(e_rab, return, "Null param");
bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID);
d_assert(bearer, return, "Null param");
xact = bearer->xact;
d_assert(xact, return, "Null param");
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
sizeof(bearer->enb_s1u_teid));
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->enb_s1u_addr));
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
}
void s1ap_handle_ue_context_release_request(
mme_enb_t *enb, s1ap_message_t *message)
{
@ -570,8 +635,8 @@ void s1ap_handle_ue_context_release_complete(
d_trace(3, "[S1AP] UE Context Release Complete : "
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->mme_ue_s1ap_id,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
enb_ue_remove(enb_ue);
}

View File

@ -18,6 +18,8 @@ CORE_DECLARE(void) s1ap_handle_ue_capability_info_indication(
mme_enb_t *enb, s1ap_message_t *message);
CORE_DECLARE(void) s1ap_handle_initial_context_setup_response(
mme_enb_t *enb, s1ap_message_t *message);
CORE_DECLARE(void) s1ap_handle_e_rab_setup_response(
mme_enb_t *enb, s1ap_message_t *message);
CORE_DECLARE(void) s1ap_handle_ue_context_release_request(
mme_enb_t *enb, s1ap_message_t *message);

View File

@ -106,6 +106,11 @@ void s1ap_state_operational(fsm_t *s, event_t *e)
enb, message);
break;
}
case S1ap_ProcedureCode_id_E_RABSetup :
{
s1ap_handle_e_rab_setup_response(enb, message);
break;
}
case S1ap_ProcedureCode_id_UEContextRelease :
{
s1ap_handle_ue_context_release_complete(

View File

@ -750,3 +750,89 @@ status_t tests1ap_build_service_request(pkbuf_t **pkbuf, int i)
return CORE_OK;
}
status_t tests1ap_build_e_rab_setup_response(pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"2005002600000300 004005c00200003c 0008400300010000 1c400f000027400a"
"0c1f0a012da50100 b410",
"",
"",
"",
"",
"",
"",
"",
"",
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
42,
0,
0,
0,
0,
0,
59,
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_dedicated_bearer_accept(
pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"000d403700000500"
"000005c00200003c 0008000300010000 1a000a0927c035da 96036200c6006440"
"080000f1109d67aa 50004340060000f1 102b67",
"",
"",
"",
"",
"",
"",
"",
"",
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
59,
0,
0,
0,
0,
0,
59,
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

@ -35,6 +35,10 @@ CORE_DECLARE(status_t) tests1ap_build_ue_context_release_complete(
pkbuf_t **pkbuf, int i);
CORE_DECLARE(status_t) tests1ap_build_service_request(
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_e_rab_setup_response(
pkbuf_t **pkbuf, int i);
#ifdef __cplusplus
}

View File

@ -224,6 +224,20 @@ static void volte_test1(abts_case *tc, void *data)
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
/* Send E-RAB Setup */
rv = tests1ap_build_e_rab_setup_response(&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));
/* Send Activate dedicated EPS bearer context accept */
rv = tests1ap_build_activate_dedicated_bearer_accept(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/********** Remove Subscriber in Database */
doc = BCON_NEW("imsi", BCON_UTF8("001010123456819"));
ABTS_PTR_NOTNULL(tc, doc);