modify dedicated bearer is done

This commit is contained in:
Sukchan Lee 2018-01-17 16:01:11 +09:00
parent fffd654391
commit 131fb3ac79
16 changed files with 309 additions and 19 deletions

View File

@ -217,11 +217,10 @@ void esm_state_active(fsm_t *s, event_t *e)
d_trace(3, "[NAS] Modify EPS bearer context accept : "
"UE[%s] --> ESM[EBI:%d] in ACTIVE state\n",
mme_ue->imsi_bcd, bearer->ebi);
#if 0
rv = mme_gtp_send_update_bearer_response(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_delete_session_request error");
#endif
"mme_gtp_send_update_session_request error");
break;
}
case NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:

View File

@ -259,6 +259,38 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
return CORE_OK;
}
status_t mme_gtp_send_update_bearer_response(mme_bearer_t *bearer)
{
status_t rv;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
xact = bearer->xact;
d_assert(xact, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_UPDATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_update_bearer_response(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
d_assert(xact, return CORE_ERROR, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}
status_t mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer)
{
status_t rv;

View File

@ -17,18 +17,14 @@ CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(
mme_bearer_t *bearer, int uli_presence);
CORE_DECLARE(status_t) mme_gtp_send_delete_session_request(mme_sess_t *sess);
CORE_DECLARE(status_t) mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) mme_gtp_send_create_bearer_response(
mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_gtp_send_delete_bearer_response(
mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_request(
mme_ue_t *mme_ue);
CORE_DECLARE(status_t) mme_gtp_send_create_bearer_response(mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_gtp_send_update_bearer_response(mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue);
CORE_DECLARE(status_t)
mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
CORE_DECLARE(status_t) mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue);
CORE_DECLARE(status_t)
mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
CORE_DECLARE(status_t) mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue);
#ifdef __cplusplus

View File

@ -428,6 +428,79 @@ status_t mme_s11_build_create_bearer_response(
return CORE_OK;
}
status_t mme_s11_build_update_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
{
status_t rv;
gtp_message_t gtp_message;
gtp_update_bearer_response_t *rsp = &gtp_message.update_bearer_response;
gtp_cause_t cause;
gtp_uli_t uli;
char uli_buf[GTP_MAX_ULI_LEN];
gtp_ue_timezone_t ue_timezone;
time_exp_t time_exp;
mme_ue_t *mme_ue = NULL;
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, 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;
/* Bearer Context : Cause */
rsp->bearer_contexts.cause.presence = 1;
rsp->bearer_contexts.cause.len = sizeof(cause);
rsp->bearer_contexts.cause.data = &cause;
/* User Location Information(ULI) */
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id));
uli.tai.tac = mme_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id,
sizeof(uli.e_cgi.plmn_id));
uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id;
rsp->user_location_information.presence = 1;
gtp_build_uli(&rsp->user_location_information, &uli,
uli_buf, GTP_MAX_ULI_LEN);
/* UE Time Zone */
memset(&ue_timezone, 0, sizeof(ue_timezone));
time_exp_lt(&time_exp, time_now());
if (time_exp.tm_gmtoff > 0)
ue_timezone.sign = 0;
else
ue_timezone.sign = 1;
/* quarters of an hour */
ue_timezone.gmtoff = GTP_TIME_TO_BCD(time_exp.tm_gmtoff / 900);
ue_timezone.daylight_saving_time =
GTP_UE_TIME_ZONE_NO_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME;
rsp->ue_time_zone.presence = 1;
rsp->ue_time_zone.data = &ue_timezone;
rsp->ue_time_zone.len = sizeof(ue_timezone);
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_delete_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
{

View File

@ -15,6 +15,8 @@ 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_update_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_s11_build_delete_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_s11_build_release_access_bearers_request(

View File

@ -414,13 +414,11 @@ void mme_s11_handle_update_bearer_request(
}
else
{
d_warn("ignore Update Bearer Request : "
d_warn("[IGNORE] Update Bearer Request : "
"Both QoS and TFT is NULL");
#if 0
rv = mme_gtp_send_update_bearer_response(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_delete_session_request error");
#endif
}
}
else

View File

@ -198,6 +198,33 @@ void pgw_s5c_handle_create_bearer_response(
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void pgw_s5c_handle_update_bearer_response(
pgw_sess_t *sess, gtp_xact_t *xact, gtp_update_bearer_response_t *req)
{
status_t rv;
d_assert(xact, return, "Null param");
d_assert(sess, return, "Null param");
d_assert(req, return, "Null param");
if (req->bearer_contexts.presence == 0)
{
d_error("No Bearer");
return;
}
if (req->bearer_contexts.eps_bearer_id.presence == 0)
{
d_error("No EPS Bearer ID");
return;
}
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
d_trace(3, "[PGW] Update Bearer Response : SGW[0x%x] --> PGW[0x%x]\n",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void pgw_s5c_handle_delete_bearer_response(
pgw_sess_t *sess, gtp_xact_t *xact, gtp_delete_bearer_response_t *req)
{

View File

@ -15,6 +15,8 @@ CORE_DECLARE(void) pgw_s5c_handle_delete_session_request(
pgw_sess_t *sess, gtp_xact_t *xact, gtp_delete_session_request_t *req);
CORE_DECLARE(void) pgw_s5c_handle_create_bearer_response(
pgw_sess_t *sess, gtp_xact_t *xact, gtp_create_bearer_response_t *req);
CORE_DECLARE(void) pgw_s5c_handle_update_bearer_response(
pgw_sess_t *sess, gtp_xact_t *xact, gtp_update_bearer_response_t *req);
CORE_DECLARE(void) pgw_s5c_handle_delete_bearer_response(
pgw_sess_t *sess, gtp_xact_t *xact, gtp_delete_bearer_response_t *req);

View File

@ -126,6 +126,11 @@ void pgw_state_operational(fsm_t *s, event_t *e)
sess, xact, &message->create_bearer_response);
pkbuf_free(copybuf);
break;
case GTP_UPDATE_BEARER_RESPONSE_TYPE:
pgw_s5c_handle_update_bearer_response(
sess, xact, &message->update_bearer_response);
pkbuf_free(copybuf);
break;
case GTP_DELETE_BEARER_RESPONSE_TYPE:
pgw_s5c_handle_delete_bearer_response(
sess, xact, &message->delete_bearer_response);

View File

@ -459,6 +459,59 @@ void sgw_s11_handle_create_bearer_response(gtp_xact_t *s11_xact,
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void sgw_s11_handle_update_bearer_response(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
{
status_t rv;
pkbuf_t *pkbuf = NULL;
gtp_xact_t *s5c_xact = NULL;
sgw_sess_t *sess = NULL;
sgw_bearer_t *bearer = NULL;
gtp_update_bearer_response_t *req = NULL;
d_assert(s11_xact, return, "Null param");
d_assert(sgw_ue, return, "Null param");
d_assert(gtp_message, return, "Null param");
s5c_xact = s11_xact->assoc_xact;
d_assert(s5c_xact, return, "Null param");
req = &gtp_message->update_bearer_response;
d_assert(req, return, "Null param");
if (req->bearer_contexts.presence == 0)
{
d_error("No Bearer");
return;
}
if (req->bearer_contexts.eps_bearer_id.presence == 0)
{
d_error("No EPS Bearer ID");
return;
}
bearer = sgw_bearer_find_by_ue_ebi(
sgw_ue, req->bearer_contexts.eps_bearer_id.u8);
d_assert(bearer, return, "No Bearer Context[EBI:%d]",
req->bearer_contexts.eps_bearer_id);
sess = bearer->sess;
d_assert(sess, return, "Null param");
gtp_message->h.type = GTP_UPDATE_BEARER_RESPONSE_TYPE;
gtp_message->h.teid = sess->pgw_s5c_teid;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
rv = gtp_xact_update_tx(s5c_xact, &gtp_message->h, pkbuf);
d_assert(s5c_xact, return, "Null param");
rv = gtp_xact_commit(s5c_xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
d_trace(3, "[SGW] Update Bearer Response : SGW[0x%x] --> PGW[0x%x]\n",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void sgw_s11_handle_delete_bearer_response(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
{

View File

@ -17,6 +17,8 @@ CORE_DECLARE(void) sgw_s11_handle_delete_session_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_s11_handle_create_bearer_response(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_s11_handle_update_bearer_response(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_s11_handle_delete_bearer_response(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);

View File

@ -106,6 +106,10 @@ void sgw_state_operational(fsm_t *s, event_t *e)
sgw_s11_handle_create_bearer_response(xact, sgw_ue,
&message);
break;
case GTP_UPDATE_BEARER_RESPONSE_TYPE:
sgw_s11_handle_update_bearer_response(xact, sgw_ue,
&message);
break;
case GTP_DELETE_BEARER_RESPONSE_TYPE:
sgw_s11_handle_delete_bearer_response(xact, sgw_ue,
&message);

View File

@ -1348,7 +1348,7 @@ status_t tests1ap_build_deactivate_bearer_accept(
"0500000005c00000 0001000800030001 00001a000a09274c b2ebbd056200ce00"
"6440080055f50100 19d0100043400600 55f5011022",
"000d40370000"
"0500000005c00000 0001000800030001 00001a000a09273e c7610a057200ce00"
"0500000005c00000 0001000800030001 00001a000a0927a9 a1b2bd057200ce00"
"6440080055f50100 19d0100043400600 55f5011022",
"",

View File

@ -288,7 +288,6 @@ static void volte_test1(abts_case *tc, void *data)
core_sleep(time_from_msec(1000));
#if 0
/* Send Session-Termination-Request */
pcscf_rx_send_str(rx_sid);
@ -315,6 +314,7 @@ static void volte_test1(abts_case *tc, void *data)
core_sleep(time_from_msec(300));
#if 0
/* Send PDN disconnectivity request */
rv = tests1ap_build_pdn_disconnectivity_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);

View File

@ -1104,6 +1104,48 @@ status_t tests1ap_build_e_rab_setup_response(
return CORE_OK;
}
status_t tests1ap_build_e_rab_modify_response(pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"2006"
"001b000003000040 0480000001000840 020001001f400600 002500010e",
"",
"",
"",
"",
"",
"",
"",
"",
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
31,
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_e_rab_release_response(pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
@ -1247,6 +1289,57 @@ status_t tests1ap_build_activate_dedicated_bearer_accept(
return CORE_OK;
}
status_t tests1ap_build_modify_bearer_accept(
pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"000d"
"4035000005000000 0480000001000800 020001001a000a09 27a5c0d564067200"
"ca006440080064f0 430020a000004340 060064f043020a",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
57,
0,
0,
0,
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_deactivate_bearer_accept(
pkbuf_t **pkbuf, int i)
{
@ -1255,7 +1348,7 @@ status_t tests1ap_build_deactivate_bearer_accept(
"0500000005c00000 0001000800030001 00001a000a09274c b2ebbd056200ce00"
"6440080055f50100 19d0100043400600 55f5011022",
"000d40370000"
"0500000005c00000 0001000800030001 00001a000a09273e c7610a057200ce00"
"0500000005c00000 0001000800030001 00001a000a0927a9 a1b2bd057200ce00"
"6440080055f50100 19d0100043400600 55f5011022",
"",

View File

@ -53,12 +53,16 @@ CORE_DECLARE(status_t) tests1ap_build_e_rab_setup_response(
pkbuf_t **pkbuf,
c_uint32_t mme_ue_s1ap_id, c_uint32_t enb_ue_s1ap_id,
c_uint8_t ebi, c_uint32_t teid);
CORE_DECLARE(status_t) tests1ap_build_e_rab_modify_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_modify_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_path_switch_request(