forked from acouzens/open5gs
S11(MME-SGW) GTP Node changed from per-SESSION to per-UE
This commit is contained in:
parent
cbc8fba7f1
commit
bbef3e6ff5
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue