diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index 3ae0ee4d4f..fe580e83e9 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -264,6 +264,13 @@ typedef struct _mme_sess_t { list_t bearer_list; /* Related Context */ +#define MME_S11_PATH_IN_SESSION(session) \ + do { \ + d_assert((session), return, "Null param"); \ + (session)->sgw = mme_sgw_next((session)->sgw); \ + if (!(session)->sgw) (session)->sgw = mme_sgw_first(); \ + d_assert((session)->sgw, return, "Null param"); \ + } while(0) mme_sgw_t *sgw; mme_ue_t *mme_ue; diff --git a/src/mme/mme_s11_handler.c b/src/mme/mme_s11_handler.c index 9d3e672f2b..b2a7686311 100644 --- a/src/mme/mme_s11_handler.c +++ b/src/mme/mme_s11_handler.c @@ -22,10 +22,8 @@ void mme_s11_handle_create_session_request(mme_sess_t *sess) mme_ue_t *mme_ue = NULL; /* Use round-robin for selecting SGW */ - d_assert(sess, return, "Null param"); - sess->sgw = mme_sgw_next(sess->sgw); - if (!sess->sgw) sess->sgw = mme_sgw_first(); - d_assert(sess->sgw, return, "Null param"); + MME_S11_PATH_IN_SESSION(sess); + mme_ue = sess->mme_ue; d_assert(mme_ue, return, "Null param"); @@ -40,8 +38,6 @@ void mme_s11_handle_create_session_request(mme_sess_t *sess) xact = gtp_xact_local_create(sess->sgw, &h, pkbuf); d_assert(xact, return, "Null param"); - GTP_XACT_STORE_SESSION(xact, sess); - rv = gtp_xact_commit(xact); d_assert(rv == CORE_OK, return, "xact_commit error"); } @@ -60,12 +56,6 @@ void mme_s11_handle_create_session_response( d_assert(xact, return, "Null param"); d_assert(mme_ue, return, "Null param"); d_assert(rsp, return, "Null param"); - sess = GTP_XACT_RETRIEVE_SESSION(xact); - d_assert(sess, return, "Null param"); - bearer = mme_default_bearer_in_sess(sess); - d_assert(bearer, return, "Null param"); - pdn = sess->pdn; - d_assert(pdn, return, "Null param"); if (rsp->sender_f_teid_for_control_plane.presence == 0) { @@ -93,6 +83,14 @@ void mme_s11_handle_create_session_response( return; } + bearer = mme_bearer_find_by_ue_ebi(mme_ue, + rsp->bearer_contexts_created.eps_bearer_id.u8); + d_assert(bearer, return, "Null param"); + sess = bearer->sess; + d_assert(sess, return, "Null param"); + pdn = sess->pdn; + d_assert(pdn, return, "Null param"); + /* Receive Control Plane(UL) : SGW-S11 */ sgw_s11_teid = rsp->sender_f_teid_for_control_plane.data; mme_ue->sgw_s11_teid = ntohl(sgw_s11_teid->teid); diff --git a/src/pgw/pgw_context.h b/src/pgw/pgw_context.h index 317580516c..8dc4104290 100644 --- a/src/pgw/pgw_context.h +++ b/src/pgw/pgw_context.h @@ -89,6 +89,15 @@ typedef struct _pgw_sess_t { int hash_keylen; list_t bearer_list; + + /* Related Context */ +#define PGW_S5C_PATH_IN_SESSION(session, xaction) \ + do { \ + d_assert((session), return, "Null param"); \ + d_assert((xaction), return, "Null param"); \ + (session)->sgw = (xaction)->gnode; \ + } while(0) + pgw_sgw_t *sgw; } pgw_sess_t; typedef struct _pgw_bearer_t { diff --git a/src/pgw/pgw_gx_handler.c b/src/pgw/pgw_gx_handler.c index 19206b1082..0ea36b38d3 100644 --- a/src/pgw/pgw_gx_handler.c +++ b/src/pgw/pgw_gx_handler.c @@ -96,6 +96,8 @@ void pgw_gx_handle_cca_initial_request( rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.len = GTP_F_TEID_IPV4_LEN; + PGW_S5C_PATH_IN_SESSION(sess, xact); + gtp_message.h.type = GTP_CREATE_SESSION_RESPONSE_TYPE; gtp_message.h.teid = sess->sgw_s5c_teid; diff --git a/src/sgw/sgw_context.h b/src/sgw/sgw_context.h index 1b7f0fe1b8..d8ee8cf151 100644 --- a/src/sgw/sgw_context.h +++ b/src/sgw/sgw_context.h @@ -83,7 +83,19 @@ typedef struct _sgw_sess_t { list_t bearer_list; /* Related Context */ +#define SGW_S11_PATH_IN_SESSION(session, xaction) \ + do { \ + d_assert((session), return, "Null param"); \ + d_assert((xaction), return, "Null param"); \ + (session)->mme = (xaction)->gnode; \ + } while(0) sgw_mme_t *mme; +#define SGW_S5C_PATH_IN_SESSION(session, gnode) \ + do { \ + d_assert((session), return, "Null param"); \ + d_assert((gnode), return, "Null param"); \ + (session)->pgw = gnode; \ + } while(0) sgw_mme_t *pgw; sgw_ue_t *sgw_ue; } sgw_sess_t; diff --git a/src/sgw/sgw_s11_handler.c b/src/sgw/sgw_s11_handler.c index 88589cc412..4f8cc6ac3f 100644 --- a/src/sgw/sgw_s11_handler.c +++ b/src/sgw/sgw_s11_handler.c @@ -104,8 +104,8 @@ void sgw_handle_create_session_request(gtp_xact_t *s11_xact, } /* Setup GTP Node */ - sess->pgw = pgw; - sess->mme = s11_xact->gnode; + SGW_S5C_PATH_IN_SESSION(sess, pgw); + SGW_S11_PATH_IN_SESSION(sess, s11_xact); req->pgw_s5_s8_address_for_control_plane_or_pmip.presence = 0;