S11(MME-SGW) GTP Node changed from per-SESSION to per-UE

This commit is contained in:
Sukchan Lee 2017-09-14 19:55:21 +09:00
parent cbc8fba7f1
commit bbef3e6ff5
8 changed files with 44 additions and 49 deletions

View File

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

View File

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

View File

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

View File

@ -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(&gtp_message, 0, sizeof(gtp_message_t));

View File

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

View File

@ -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 {

View File

@ -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, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
xact = gtp_xact_local_create(sess->mme, &gtp_message.h, pkbuf);
xact = gtp_xact_local_create(sgw_ue->mme, &gtp_message.h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_commit(xact);

View File

@ -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, &gtp_message->h, pkbuf);
s11_xact = gtp_xact_local_create(sgw_ue->mme, &gtp_message->h, pkbuf);
d_assert(s11_xact, return, "Null param");
gtp_xact_associate(s5c_xact, s11_xact);