detach request is done

This commit is contained in:
Sukchan Lee 2017-07-26 14:18:28 +09:00
parent 67630336cd
commit 8c157dec08
10 changed files with 132 additions and 57 deletions

View File

@ -190,7 +190,8 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
mme_bearer_t *bearer;
gtp_delete_session_request_t *req = &gtp_message.delete_session_request;
gtp_f_teid_t mme_s11_teid;
gtp_uli_t uli;
char uli_buf[GTP_MAX_ULI_LEN];
gtp_indication_t indication;
d_assert(sess, return CORE_ERROR, "Null param");
@ -206,21 +207,25 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
req->linked_eps_bearer_id.u8 = bearer->ebi;
}
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &mme_ue->enb_ue->tai.plmn_id,
sizeof(uli.tai.plmn_id));
uli.tai.tac = mme_ue->enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &mme_ue->enb_ue->e_cgi.plmn_id,
sizeof(uli.tai.plmn_id));
uli.e_cgi.cell_id = mme_ue->enb_ue->e_cgi.cell_id;
req->user_location_information.presence = 1;
gtp_build_uli(&req->user_location_information, &uli,
uli_buf, GTP_MAX_ULI_LEN);
memset(&indication, 0, sizeof(gtp_indication_t));
indication.oi = 1;
req->indication_flags.presence = 1;
req->indication_flags.data = &indication;
req->indication_flags.len = sizeof(gtp_indication_t);
memset(&mme_s11_teid, 0, sizeof(gtp_f_teid_t));
mme_s11_teid.ipv4 = 1;
mme_s11_teid.interface_type = GTP_F_TEID_S11_MME_GTP_C;
mme_s11_teid.teid = htonl(sess->mme_s11_teid);
mme_s11_teid.ipv4_addr = sess->mme_s11_addr;
req->sender_f_teid_for_control_plane.presence = 1;
req->sender_f_teid_for_control_plane.data = &mme_s11_teid;
req->sender_f_teid_for_control_plane.len = GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(pkbuf, GTP_DELETE_SESSION_REQUEST_TYPE, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");

View File

@ -253,7 +253,8 @@ status_t nas_security_decode(mme_ue_t *mme_ue, pkbuf_t *pkbuf, int *mac_failed)
return CORE_ERROR, "pkbuf_header error");
return CORE_ERROR;
#else
d_error("NAS MAC verification failed");
d_error("NAS MAC verification failed(0x%x != 0x%x)",
ntohl(h->message_authentication_code), ntohl(mac32));
*mac_failed = 1;
#endif
}

View File

@ -217,12 +217,6 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
}
}
}
else
{
d_warn("Duplicated: eNB[0x%x] sends "
"Initial-UE Message[eNB-UE-S1AP-ID(%d)]",
enb->enb_id, enb_ue->enb_ue_s1ap_id);
}
memcpy(&enb_ue->tai.plmn_id, pLMNidentity->buf,
sizeof(enb_ue->tai.plmn_id));
@ -461,6 +455,6 @@ void s1ap_handle_ue_context_release_complete(
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
enb_ue_remove(enb_ue);
d_assert(enb_ue_remove(enb_ue) == CORE_OK,, "No ENB_UE context");
}

View File

@ -247,24 +247,17 @@ void pgw_handle_delete_session_request(
pkbuf_t *pkbuf;
gtp_message_t gtp_message;
c_uint8_t type = GTP_DELETE_SESSION_RESPONSE_TYPE;
gtp_f_teid_t *sgw_s5c_teid;
gtp_delete_session_response_t *rsp = &gtp_message.delete_session_response;
c_uint32_t sgw_s5c_teid;
gtp_cause_t cause;
c_uint8_t pco_buf[MAX_PCO_LEN];
c_int16_t pco_len;
d_assert(xact, return, "Null param");
/* sess can be NULL */
d_assert(req, return, "Null param");
if (req->sender_f_teid_for_control_plane.presence == 0)
{
d_error("No TEID");
return;
}
/* prepare cause */
memset(&cause, 0, sizeof(cause));
cause.value = GTP_CAUSE_REQUEST_ACCEPTED;
@ -272,8 +265,9 @@ void pgw_handle_delete_session_request(
/* Remove a pgw session */
if (sess)
{
d_info("[GTP] Delete Session Reqeust : "
"SGW[%d] --> PGW[%d]", sess->sgw_s5c_teid, sess->pgw_s5c_teid);
/* backup sgw_s5c_teid in session context */
sgw_s5c_teid = sess->sgw_s5c_teid;
if (pgw_sess_remove(sess) != CORE_OK)
{
d_error("Error on PGW session %d removal", sess->index);
@ -311,6 +305,5 @@ void pgw_handle_delete_session_request(
d_assert(rv == CORE_OK, return, "gtp build failed");
/* send */
sgw_s5c_teid = req->sender_f_teid_for_control_plane.data;
pgw_s5c_send_to_sgw(xact, type, ntohl(sgw_s5c_teid->teid), pkbuf);
pgw_s5c_send_to_sgw(xact, type, sgw_s5c_teid, pkbuf);
}

View File

@ -245,7 +245,6 @@ void sgw_handle_delete_session_request(gtp_xact_t *xact,
status_t rv;
pkbuf_t *pkbuf = NULL;
gtp_delete_session_request_t *req = NULL;
gtp_f_teid_t sgw_s5c_teid;
d_assert(xact, return, "Null param");
d_assert(sess, return, "Null param");
@ -253,26 +252,6 @@ void sgw_handle_delete_session_request(gtp_xact_t *xact,
req = &gtp_message->delete_session_request;
if (req->sender_f_teid_for_control_plane.presence == 0)
{
d_error("No GTP TEID");
return;
}
//bearer = sgw_default_bearer_in_sess(sess);
//d_assert(bearer, sgw_sess_remove(sess); return, "No Bearer Context");
/* FIXME: handle "Indication" IE for oi flag */
/* Send Control Plane(DL) : SGW-S5C */
memset(&sgw_s5c_teid, 0, sizeof(gtp_f_teid_t));
sgw_s5c_teid.teid = htonl(sess->sgw_s5c_teid);
sgw_s5c_teid.ipv4_addr = sess->sgw_s5c_addr;
sgw_s5c_teid.interface_type = GTP_F_TEID_S5_S8_SGW_GTP_C;
req->sender_f_teid_for_control_plane.presence = 1;
req->sender_f_teid_for_control_plane.data = &sgw_s5c_teid;
req->sender_f_teid_for_control_plane.len = GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(&pkbuf, GTP_DELETE_SESSION_REQUEST_TYPE, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
@ -284,6 +263,58 @@ void sgw_handle_delete_session_request(gtp_xact_t *xact,
"SGW[%d] --> PGW[%d]", sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void sgw_handle_delete_session_response(gtp_xact_t *xact,
sgw_sess_t *sess, gtp_message_t *gtp_message)
{
status_t rv;
gtp_delete_session_response_t *rsp = NULL;
pkbuf_t *pkbuf = NULL;
c_uint32_t mme_s11_teid;
gtp_cause_t *cause = NULL;
d_assert(sess, return, "Null param");
d_assert(xact, return, "Null param");
d_assert(gtp_message, return, "Null param");
rsp = &gtp_message->delete_session_response;
if (rsp->cause.presence == 0)
{
d_error("No Cause");
return;
}
cause = rsp->cause.data;
d_assert(cause, return, "Null param");
/* Remove a pgw session */
if (sess)
{
d_info("[GTP] Delete Session Response : "
"SGW[%d] --> PGW[%d]", sess->sgw_s5c_teid, sess->pgw_s5c_teid);
/* backup sgw_s5c_teid in session context */
mme_s11_teid = sess->mme_s11_teid;
if (sgw_sess_remove(sess) != CORE_OK)
{
d_error("Error on PGW session %d removal", sess->index);
cause->value = GTP_CAUSE_CONTEXT_NOT_FOUND;
}
}
else
{
cause->value = GTP_CAUSE_INVALID_PEER;
}
rv = gtp_build_msg(&pkbuf, GTP_DELETE_SESSION_RESPONSE_TYPE, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s11_send_to_mme(xact, GTP_DELETE_SESSION_RESPONSE_TYPE,
mme_s11_teid, pkbuf) == CORE_OK, return,
"failed to send message");
}
void sgw_handle_release_access_bearers_request(gtp_xact_t *xact,
sgw_sess_t *sess, gtp_release_access_bearers_request_t *req)
{

View File

@ -20,6 +20,8 @@ CORE_DECLARE(void) sgw_handle_modify_bearer_request(gtp_xact_t *xact,
CORE_DECLARE(void) sgw_handle_delete_session_request(gtp_xact_t *xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_handle_delete_session_response(gtp_xact_t *xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_handle_release_access_bearers_request(gtp_xact_t *xact,
sgw_sess_t *sess, gtp_release_access_bearers_request_t *req);

View File

@ -101,10 +101,8 @@ void sgw_state_operational(fsm_t *s, event_t *e)
xact, sess, &gtp_message);
break;
case GTP_DELETE_SESSION_RESPONSE_TYPE:
#if 0
sgw_handle_delete_session_response(
xact, sess, &gtp_message);
#endif
break;
case GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
sgw_handle_release_access_bearers_request(

View File

@ -219,6 +219,24 @@ static void nas_sm_test1(abts_case *tc, void *data)
ABTS_TRUE(tc, memcmp(recvbuf->payload+43, tmp+43, 3) == 0);
pkbuf_free(recvbuf);
/* Send Detach Request */
rv = tests1ap_build_detach_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/* Receive UE Context Release Command */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rc = tests1ap_enb_read(sock, recvbuf);
recvbuf->len = 23;
pkbuf_free(recvbuf);
/* Send UE Context Release Complete */
rv = tests1ap_build_ue_context_release_complete(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/* eNB disonncect from MME */
rv = tests1ap_enb_close(sock);
ABTS_INT_EQUAL(tc, CORE_OK, rv);

View File

@ -400,6 +400,38 @@ status_t tests1ap_build_emm_status(pkbuf_t **pkbuf, int i)
return CORE_OK;
}
status_t tests1ap_build_detach_request(pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"000c404900000600 080003000100001a 00161517a3f862ae 040745090bf600f1"
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
"4001300060000600 40020003e6",
"",
""
"",
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
77,
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_ue_context_release_request(pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
@ -432,8 +464,8 @@ status_t tests1ap_build_ue_context_release_request(pkbuf_t **pkbuf, int i)
status_t tests1ap_build_ue_context_release_complete(pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"",
char *payload[TESTS1AP_MAX_MESSAGE] = {
"2017001300000200 004005c00100009d 00084003400527",
"",
"2017"
@ -443,13 +475,13 @@ status_t tests1ap_build_ue_context_release_complete(pkbuf_t **pkbuf, int i)
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
0,
23,
0,
22,
0,
};
char hexbuf[MAX_SDU_LEN];
*pkbuf = pkbuf_alloc(0, MAX_SDU_LEN);
if (!(*pkbuf)) return CORE_ERROR;

View File

@ -27,6 +27,7 @@ CORE_DECLARE(status_t) tests1ap_build_initial_context_setup_response(
pkbuf_t **pkbuf, int i);
CORE_DECLARE(status_t) tests1ap_build_attach_complete(pkbuf_t **pkbuf, int i);
CORE_DECLARE(status_t) tests1ap_build_emm_status(pkbuf_t **pkbuf, int i);
CORE_DECLARE(status_t) tests1ap_build_detach_request(pkbuf_t **pkbuf, int i);
CORE_DECLARE(status_t) tests1ap_build_ue_context_release_request(
pkbuf_t **pkbuf, int i);
CORE_DECLARE(status_t) tests1ap_build_ue_context_release_complete(