From bbef3e6ff594dce95d435fab60172d63d32a64f6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Thu, 14 Sep 2017 19:55:21 +0900 Subject: [PATCH] S11(MME-SGW) GTP Node changed from per-SESSION to per-UE --- src/mme/mme_context.c | 4 +++- src/mme/mme_context.h | 20 ++++++++++++-------- src/mme/mme_gtp_path.c | 29 +++++++---------------------- src/mme/mme_s11_build.c | 4 ++-- src/sgw/sgw_context.c | 9 +++++++-- src/sgw/sgw_context.h | 16 +++++++++------- src/sgw/sgw_s11_handler.c | 9 +++------ src/sgw/sgw_s5c_handler.c | 2 +- 8 files changed, 44 insertions(+), 49 deletions(-) diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index 486825a4a..0f83c7297 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -145,6 +145,7 @@ static status_t mme_context_validation() } sgw = mme_sgw_next(sgw); } + self.sgw = mme_sgw_first(); if (self.max_num_of_served_gummei == 0) { @@ -1150,6 +1151,8 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue) event_set_param1(&e, (c_uintptr_t)mme_ue->index); fsm_create(&mme_ue->sm, emm_state_initial, emm_state_final); fsm_init(&mme_ue->sm, &e); + + CONNECT_SGW_GTP_NODE(mme_ue); return mme_ue; } @@ -1505,7 +1508,6 @@ mme_sess_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti) list_append(&mme_ue->sess_list, sess); sess->mme_ue = mme_ue; - sess->sgw = mme_sgw_first(); sess->pti = pti; bearer = mme_bearer_add(sess); diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index 885b6fb02..7fad7fe64 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -68,6 +68,8 @@ typedef struct _mme_context_t { /* Generator for unique identification */ c_uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */ c_uint32_t m_tmsi; /* m_tmsi generator */ + /* Iterator for SGW round-robin */ + mme_sgw_t *sgw; /* defined in 'nas_ies.h' * #define NAS_SECURITY_ALGORITHMS_EIA0 0 @@ -311,6 +313,16 @@ struct _mme_ue_t { c_uint8_t request; c_uint8_t response; } gtp_counter[MAX_NUM_OF_GTP_COUNTER]; + +#define CONNECT_SGW_GTP_NODE(__mME) \ + do { \ + d_assert((__mME), break, "Null param"); \ + (__mME)->sgw = mme_sgw_next(self.sgw); \ + if (!(__mME)->sgw) (__mME)->sgw = mme_sgw_first(); \ + self.sgw = (__mME)->sgw; \ + d_assert((__mME)->sgw, break, "Null param"); \ + } while(0) + mme_sgw_t *sgw; }; #define MME_HAVE_SGW_S1U_PATH(__sESS) \ @@ -337,14 +349,6 @@ typedef struct _mme_sess_t { list_t bearer_list; /* Related Context */ -#define CONNECT_SGW_GTP_NODE(__sESS) \ - do { \ - d_assert((__sESS), break, "Null param"); \ - (__sESS)->sgw = mme_sgw_next((__sESS)->sgw); \ - if (!(__sESS)->sgw) (__sESS)->sgw = mme_sgw_first(); \ - d_assert((__sESS)->sgw, break, "Null param"); \ - } while(0) - mme_sgw_t *sgw; mme_ue_t *mme_ue; #define MME_UE_HAVE_APN(__mME) \ diff --git a/src/mme/mme_gtp_path.c b/src/mme/mme_gtp_path.c index 206d1fb88..f670785ae 100644 --- a/src/mme/mme_gtp_path.c +++ b/src/mme/mme_gtp_path.c @@ -99,9 +99,6 @@ status_t mme_gtp_send_create_session_request(mme_sess_t *sess) gtp_xact_t *xact = NULL; mme_ue_t *mme_ue = NULL; - /* Use round-robin for selecting SGW */ - CONNECT_SGW_GTP_NODE(sess); - mme_ue = sess->mme_ue; d_assert(mme_ue, return CORE_ERROR, "Null param"); @@ -113,7 +110,7 @@ status_t mme_gtp_send_create_session_request(mme_sess_t *sess) d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error"); - xact = gtp_xact_local_create(sess->sgw, &h, pkbuf); + xact = gtp_xact_local_create(mme_ue->sgw, &h, pkbuf); d_assert(xact, return CORE_ERROR, "Null param"); rv = gtp_xact_commit(xact); @@ -130,15 +127,12 @@ status_t mme_gtp_send_modify_bearer_request( gtp_xact_t *xact = NULL; mme_ue_t *mme_ue = NULL; - mme_sess_t *sess = NULL; gtp_header_t h; pkbuf_t *pkbuf = NULL; d_assert(bearer, return CORE_ERROR, "Null param"); - sess = bearer->sess; - d_assert(sess, return CORE_ERROR, "Null param"); - mme_ue = sess->mme_ue; + mme_ue = bearer->mme_ue; d_assert(mme_ue, return CORE_ERROR, "Null param"); memset(&h, 0, sizeof(gtp_header_t)); @@ -149,7 +143,7 @@ status_t mme_gtp_send_modify_bearer_request( &pkbuf, h.type, bearer, uli_presence); d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error"); - xact = gtp_xact_local_create(sess->sgw, &h, pkbuf); + xact = gtp_xact_local_create(mme_ue->sgw, &h, pkbuf); d_assert(xact, return CORE_ERROR, "Null param"); rv = gtp_xact_commit(xact); @@ -177,7 +171,7 @@ status_t mme_gtp_send_delete_session_request(mme_sess_t *sess) rv = mme_s11_build_delete_session_request(&s11buf, h.type, sess); d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error"); - xact = gtp_xact_local_create(sess->sgw, &h, s11buf); + xact = gtp_xact_local_create(mme_ue->sgw, &h, s11buf); d_assert(xact, return CORE_ERROR, "Null param"); GTP_XACT_STORE_SESSION(xact, sess); @@ -256,11 +250,8 @@ status_t mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue) gtp_header_t h; pkbuf_t *pkbuf = NULL; gtp_xact_t *xact = NULL; - mme_sess_t *sess = NULL; d_assert(mme_ue, return CORE_ERROR, "Null param"); - sess = mme_sess_first(mme_ue); - d_assert(sess, return CORE_ERROR, "Null param"); memset(&h, 0, sizeof(gtp_header_t)); h.type = GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE; @@ -269,7 +260,7 @@ status_t mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue) rv = mme_s11_build_release_access_bearers_request(&pkbuf, h.type); d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error"); - xact = gtp_xact_local_create(sess->sgw, &h, pkbuf); + xact = gtp_xact_local_create(mme_ue->sgw, &h, pkbuf); d_assert(xact, return CORE_ERROR, "Null param"); rv = gtp_xact_commit(xact); @@ -285,11 +276,8 @@ status_t mme_gtp_send_create_indirect_data_forwarding_tunnel_request( gtp_header_t h; pkbuf_t *pkbuf = NULL; gtp_xact_t *xact = NULL; - mme_sess_t *sess = NULL; d_assert(mme_ue, return CORE_ERROR, "Null param"); - sess = mme_sess_first(mme_ue); - d_assert(sess, return CORE_ERROR, "Null param"); memset(&h, 0, sizeof(gtp_header_t)); h.type = GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE; @@ -299,7 +287,7 @@ status_t mme_gtp_send_create_indirect_data_forwarding_tunnel_request( &pkbuf, h.type, mme_ue); d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error"); - xact = gtp_xact_local_create(sess->sgw, &h, pkbuf); + xact = gtp_xact_local_create(mme_ue->sgw, &h, pkbuf); d_assert(xact, return CORE_ERROR, "Null param"); rv = gtp_xact_commit(xact); @@ -315,11 +303,8 @@ status_t mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( gtp_header_t h; pkbuf_t *pkbuf = NULL; gtp_xact_t *xact = NULL; - mme_sess_t *sess = NULL; d_assert(mme_ue, return CORE_ERROR, "Null param"); - sess = mme_sess_first(mme_ue); - d_assert(sess, return CORE_ERROR, "Null param"); memset(&h, 0, sizeof(gtp_header_t)); h.type = GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE; @@ -328,7 +313,7 @@ status_t mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( pkbuf = pkbuf_alloc(TLV_MAX_HEADROOM, 0); d_assert(pkbuf, return CORE_ERROR, "S11 build error"); - xact = gtp_xact_local_create(sess->sgw, &h, pkbuf); + xact = gtp_xact_local_create(mme_ue->sgw, &h, pkbuf); d_assert(xact, return CORE_ERROR, "Null param"); rv = gtp_xact_commit(xact); diff --git a/src/mme/mme_s11_build.c b/src/mme/mme_s11_build.c index f366e4d3c..a3c88dc5e 100644 --- a/src/mme/mme_s11_build.c +++ b/src/mme/mme_s11_build.c @@ -33,8 +33,6 @@ status_t mme_s11_build_create_session_request( c_uint32_t pgw_ipv4_addr = 0; d_assert(sess, return CORE_ERROR, "Null param"); - sgw = sess->sgw; - d_assert(sgw, return CORE_ERROR, "Null param"); pdn = sess->pdn; d_assert(pdn, return CORE_ERROR, "Null param"); bearer = mme_default_bearer_in_sess(sess); @@ -43,6 +41,8 @@ status_t mme_s11_build_create_session_request( d_assert(pgw_ipv4_addr, return CORE_ERROR, "Null param"); mme_ue = sess->mme_ue; d_assert(mme_ue, return CORE_ERROR, "Null param"); + sgw = mme_ue->sgw; + d_assert(sgw, return CORE_ERROR, "Null param"); memset(>p_message, 0, sizeof(gtp_message_t)); diff --git a/src/sgw/sgw_context.c b/src/sgw/sgw_context.c index 8a7b99f02..c9c6ece2e 100644 --- a/src/sgw/sgw_context.c +++ b/src/sgw/sgw_context.c @@ -710,17 +710,22 @@ sgw_bearer_t* sgw_bearer_add(sgw_sess_t *sess) { sgw_bearer_t *bearer = NULL; sgw_tunnel_t *tunnel = NULL; + sgw_ue_t *sgw_ue = NULL; d_assert(sess, return NULL, "Null param"); + sgw_ue = sess->sgw_ue; + d_assert(sgw_ue, return NULL, "Null param"); index_alloc(&sgw_bearer_pool, &bearer); d_assert(bearer, return NULL, "Bearer context allocation failed"); bearer->sgw_s5u_teid = bearer->index; bearer->sgw_s5u_addr = sgw_self()->s5u_addr; - - bearer->sess = sess; + list_append(&sess->bearer_list, bearer); + + bearer->sgw_ue = sgw_ue; + bearer->sess = sess; list_init(&bearer->tunnel_list); diff --git a/src/sgw/sgw_context.h b/src/sgw/sgw_context.h index 33fcdd56d..7c953b989 100644 --- a/src/sgw/sgw_context.h +++ b/src/sgw/sgw_context.h @@ -74,6 +74,14 @@ typedef struct _sgw_ue_t { c_uint32_t state; list_t sess_list; + +#define CONNECT_MME_GTP_NODE(__sGW, __xACT) \ + do { \ + d_assert((__sGW), return, "Null param"); \ + d_assert((__xACT), return, "Null param"); \ + (__sGW)->mme = (__xACT)->gnode; \ + } while(0) + sgw_mme_t *mme; } sgw_ue_t; typedef struct _sgw_sess_t { @@ -93,13 +101,6 @@ typedef struct _sgw_sess_t { list_t bearer_list; /* Related Context */ -#define CONNECT_MME_GTP_NODE(__sESS, __xACT) \ - do { \ - d_assert((__sESS), return, "Null param"); \ - d_assert((__xACT), return, "Null param"); \ - (__sESS)->mme = (__xACT)->gnode; \ - } while(0) - sgw_mme_t *mme; #define CONNECT_PGW_GTP_NODE(__sESS, __gNODE) \ do { \ d_assert((__sESS), return, "Null param"); \ @@ -134,6 +135,7 @@ typedef struct _sgw_bearer_t { list_t tunnel_list; sgw_sess_t *sess; + sgw_ue_t *sgw_ue; } sgw_bearer_t; typedef struct _sgw_tunnel_t { diff --git a/src/sgw/sgw_s11_handler.c b/src/sgw/sgw_s11_handler.c index 7b5652f3e..5e0ccb2b8 100644 --- a/src/sgw/sgw_s11_handler.c +++ b/src/sgw/sgw_s11_handler.c @@ -114,7 +114,7 @@ void sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact, } /* Setup GTP Node */ - CONNECT_MME_GTP_NODE(sess, s11_xact); + CONNECT_MME_GTP_NODE(sgw_ue, s11_xact); CONNECT_PGW_GTP_NODE(sess, pgw); req->pgw_s5_s8_address_for_control_plane_or_pmip.presence = 0; @@ -476,16 +476,13 @@ void sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer) pkbuf_t *pkbuf = NULL; gtp_message_t gtp_message; sgw_ue_t *sgw_ue = NULL; - sgw_sess_t *sess = NULL; gtp_xact_t *xact = NULL; /* FIXME : ARP should be retrieved from ? */ c_uint8_t arp = 0x61; d_assert(bearer, return, "Null param"); - sess = bearer->sess; - d_assert(sess, return, "Null param"); - sgw_ue = sess->sgw_ue; + sgw_ue = bearer->sgw_ue; d_assert(sgw_ue, return, "Null param"); /* Build downlink notification message */ @@ -506,7 +503,7 @@ void sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer) rv = gtp_build_msg(&pkbuf, >p_message); d_assert(rv == CORE_OK, return, "gtp build failed"); - xact = gtp_xact_local_create(sess->mme, >p_message.h, pkbuf); + xact = gtp_xact_local_create(sgw_ue->mme, >p_message.h, pkbuf); d_assert(xact, return, "Null param"); rv = gtp_xact_commit(xact); diff --git a/src/sgw/sgw_s5c_handler.c b/src/sgw/sgw_s5c_handler.c index a4e1fcabf..93837fdd8 100644 --- a/src/sgw/sgw_s5c_handler.c +++ b/src/sgw/sgw_s5c_handler.c @@ -255,7 +255,7 @@ void sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact, rv = gtp_build_msg(&pkbuf, gtp_message); d_assert(rv == CORE_OK, return, "gtp build failed"); - s11_xact = gtp_xact_local_create(sess->mme, >p_message->h, pkbuf); + s11_xact = gtp_xact_local_create(sgw_ue->mme, >p_message->h, pkbuf); d_assert(s11_xact, return, "Null param"); gtp_xact_associate(s5c_xact, s11_xact);