diff --git a/src/mme/Makefile.am b/src/mme/Makefile.am index 2255f45a3..56f958bc8 100644 --- a/src/mme/Makefile.am +++ b/src/mme/Makefile.am @@ -10,7 +10,7 @@ libmme_la_SOURCES = \ nas_conv.h nas_security.h \ emm_handler.h \ esm_handler.h esm_build.h \ - mme_s11_path.h mme_s11_build.h \ + mme_s11_path.h mme_s11_build.h mme_s11_handler.h \ mme_sm.h nodist_libmme_la_SOURCES = \ @@ -20,7 +20,7 @@ nodist_libmme_la_SOURCES = \ mme_s6a_handler.c \ nas_conv.c nas_security.c emm_sm.c emm_handler.c \ esm_sm.c esm_handler.c esm_build.c \ - mme_s11_path.c mme_s11_build.c \ + mme_s11_path.c mme_s11_build.c mme_s11_handler.c \ mme_sm.c libmme_la_DEPENDENCIES = \ diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index ed3b2b41e..d00cb876e 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -522,6 +522,24 @@ mme_esm_t* mme_esm_find_by_pti(mme_ue_t *ue, c_uint8_t pti) return esm; } +mme_esm_t* mme_esm_find_by_ebi(mme_ue_t *ue, c_uint8_t ebi) +{ + mme_esm_t *esm = NULL; + + d_assert(ue, return NULL, "Null param"); + + esm = mme_esm_first(ue); + while (esm) + { + if (ebi == esm->ebi) + break; + + esm = mme_esm_next(esm); + } + + return esm; +} + mme_esm_t* mme_esm_first(mme_ue_t *ue) { d_assert(ue, return NULL, "Null param"); diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index ff1d1186b..0620175c5 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -222,6 +222,7 @@ CORE_DECLARE(status_t) mme_esm_remove(mme_esm_t *esm); CORE_DECLARE(status_t) mme_esm_remove_all(mme_ue_t *ue); CORE_DECLARE(mme_esm_t*) mme_esm_find(index_t index); CORE_DECLARE(mme_esm_t*) mme_esm_find_by_pti(mme_ue_t *ue, c_uint8_t pti); +CORE_DECLARE(mme_esm_t*) mme_esm_find_by_ebi(mme_ue_t *ue, c_uint8_t ebi); CORE_DECLARE(mme_esm_t*) mme_esm_first(mme_ue_t *ue); CORE_DECLARE(mme_esm_t*) mme_esm_next(mme_esm_t *esm); diff --git a/src/mme/mme_s11_handler.c b/src/mme/mme_s11_handler.c new file mode 100644 index 000000000..251d6f250 --- /dev/null +++ b/src/mme/mme_s11_handler.c @@ -0,0 +1,56 @@ +#define TRACE_MODULE _mme_s11_handler + +#include "core_debug.h" + +#include "gtp_types.h" + +#include "mme_event.h" +#include "mme_context.h" +#include "mme_s11_handler.h" + +void mme_s11_handle_create_session_response( + mme_ue_t *ue, gtp_create_session_response_t *rsp) +{ + gtp_f_teid_t *sgw_s11_teid = NULL; + gtp_f_teid_t *sgw_s1u_teid = NULL; + + mme_esm_t *esm = NULL; + + d_assert(ue, return, "Null param"); + d_assert(rsp, return, "Null param"); + + if (rsp->sender_f_teid_for_control_plane.presence == 0) + { + d_error("No GTP TEID"); + return; + } + if (rsp->bearer_contexts_created.presence == 0) + { + d_error("No Bearer"); + return; + } + if (rsp->bearer_contexts_created.eps_bearer_id.presence == 0) + { + d_error("No EPS Bearer ID"); + return; + } + if (rsp->bearer_contexts_created.s1_u_enodeb_f_teid.presence == 0) + { + d_error("No GTP TEID"); + return; + } + + esm = mme_esm_find_by_ebi( + ue, rsp->bearer_contexts_created.eps_bearer_id.u8); + d_assert(esm, return, "No ESM Context"); + + /* Receive Control Plane(UL) : SGW-S11 */ + sgw_s11_teid = rsp->sender_f_teid_for_control_plane.data; + ue->sgw_s11_teid = ntohl(sgw_s11_teid->teid); + ue->sgw_s11_addr = sgw_s11_teid->ipv4_addr; + + /* Receive Data Plane(UL) : SGW-S1U */ + sgw_s1u_teid = rsp->bearer_contexts_created.s1_u_enodeb_f_teid.data; + esm->sgw_s1u_teid = ntohl(sgw_s1u_teid->teid); + esm->sgw_s1u_addr = sgw_s1u_teid->ipv4_addr; +} diff --git a/src/mme/mme_s11_handler.h b/src/mme/mme_s11_handler.h new file mode 100644 index 000000000..aa786618c --- /dev/null +++ b/src/mme/mme_s11_handler.h @@ -0,0 +1,19 @@ +#ifndef __MME_HANDLER_H__ +#define __MME_HANDLER_H__ + +#include "gtp_tlv.h" + +#include "mme_context.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +CORE_DECLARE(void) mme_s11_handle_create_session_response( + mme_ue_t *ue, gtp_create_session_response_t *rsp); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MME_HANDLER_H__ */ diff --git a/src/mme/mme_sm.c b/src/mme/mme_sm.c index cf5041d3a..4f098c382 100644 --- a/src/mme/mme_sm.c +++ b/src/mme/mme_sm.c @@ -9,6 +9,7 @@ #include "s1ap_path.h" #include "nas_security.h" #include "mme_s11_path.h" +#include "mme_s11_handler.h" void mme_state_initial(fsm_t *s, event_t *e) { @@ -247,7 +248,8 @@ void mme_state_operational(fsm_t *s, event_t *e) switch(type) { case GTP_CREATE_SESSION_RESPONSE_TYPE: - d_info("receive reponse : %d", teid); + mme_s11_handle_create_session_response( + ue, >p_message.create_session_response); break; default: d_warn("Not implmeneted(type:%d)", type); diff --git a/src/pgw/pgw_handler.c b/src/pgw/pgw_handler.c index 8cb078653..d86b8333f 100644 --- a/src/pgw/pgw_handler.c +++ b/src/pgw/pgw_handler.c @@ -119,29 +119,36 @@ void pgw_handle_create_session_request( d_assert(xact, return, "Null param"); d_assert(req, return, "Null param"); - if (req->sender_f_teid_for_control_plane.presence == 0) - { - d_error("No Sender F-TEID for control plance"); - return; - } if (req->access_point_name.presence == 0) { d_error("No APN"); return; } - if (req->protocol_configuration_options.presence == 0) { d_error("No Protocol Configuration Options"); return; } - - if (req->bearer_contexts_to_be_created.presence == 0 || - req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0) + if (req->sender_f_teid_for_control_plane.presence == 0) + { + d_error("No TEID"); + return; + } + if (req->bearer_contexts_to_be_created.presence == 0) { d_error("No Bearer"); return; } + if (req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0) + { + d_error("No EPS Bearer ID"); + return; + } + if (req->bearer_contexts_to_be_created.s5_s8_u_sgw_f_teid.presence == 0) + { + d_error("No TEID"); + return; + } /* Generate Control Plane(UL) : PGW-S5C */ sess = pgw_sess_add(); diff --git a/src/sgw/sgw_handler.c b/src/sgw/sgw_handler.c index 8b6102d35..e0a063894 100644 --- a/src/sgw/sgw_handler.c +++ b/src/sgw/sgw_handler.c @@ -28,16 +28,19 @@ void sgw_handle_create_session_request( if (req->sender_f_teid_for_control_plane.presence == 0) { - d_error("No Sender F-TEID for control plance"); + d_error("No GTP TEID"); return; } - - if (req->bearer_contexts_to_be_created.presence == 0 || - req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0) + if (req->bearer_contexts_to_be_created.presence == 0) { d_error("No Bearer"); return; } + if (req->bearer_contexts_to_be_created.eps_bearer_id.presence == 0) + { + d_error("No EPS Bearer ID"); + return; + } /* Generate Control Plane(UL) : SGW-S11 */ /* Generate Control Plane(DL) : SGW-S5C */ @@ -111,17 +114,24 @@ void sgw_handle_create_session_response(gtp_xact_t *xact, if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface. presence == 0) { - d_error("No PGW F-TEID for GTP-based control plance"); + d_error("No GTP TEID"); return; } - - if (rsp->bearer_contexts_created.presence == 0 || - rsp->bearer_contexts_created.eps_bearer_id.presence == 0 || - rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.presence == 0) + if (rsp->bearer_contexts_created.presence == 0) { d_error("No Bearer"); return; } + if (rsp->bearer_contexts_created.eps_bearer_id.presence == 0) + { + d_error("No EPS Bearer ID"); + return; + } + if (rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.presence == 0) + { + d_error("No GTP TEID"); + return; + } bearer = sgw_bearer_find_by_id(sess, rsp->bearer_contexts_created.eps_bearer_id.u8);