update it

This commit is contained in:
Sukchan Lee 2017-04-12 21:44:18 +09:00
parent 3059914d39
commit 21839551cc
8 changed files with 134 additions and 21 deletions

View File

@ -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 = \

View File

@ -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");

View File

@ -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);

56
src/mme/mme_s11_handler.c Normal file
View File

@ -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;
}

19
src/mme/mme_s11_handler.h Normal file
View File

@ -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__ */

View File

@ -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, &gtp_message.create_session_response);
break;
default:
d_warn("Not implmeneted(type:%d)", type);

View File

@ -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();

View File

@ -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);