forked from acouzens/open5gs
detach request is done
This commit is contained in:
parent
67630336cd
commit
8c157dec08
|
@ -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 = >p_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, >p_message);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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 = >p_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);
|
||||
}
|
||||
|
|
|
@ -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 = >p_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 = >p_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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -101,10 +101,8 @@ void sgw_state_operational(fsm_t *s, event_t *e)
|
|||
xact, sess, >p_message);
|
||||
break;
|
||||
case GTP_DELETE_SESSION_RESPONSE_TYPE:
|
||||
#if 0
|
||||
sgw_handle_delete_session_response(
|
||||
xact, sess, >p_message);
|
||||
#endif
|
||||
break;
|
||||
case GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
|
||||
sgw_handle_release_access_bearers_request(
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue