forked from acouzens/open5gs
GTP re-archi(first phase)
This commit is contained in:
parent
b8504073dd
commit
829047f763
|
@ -254,7 +254,10 @@ void emm_handle_attach_complete(
|
|||
d_assert(nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
void emm_handle_attach_reject(mme_ue_t *mme_ue)
|
||||
void emm_handle_attach_reject(mme_ue_t *mme_ue,
|
||||
e_S1ap_CauseNas s1ap_cause_nas,
|
||||
nas_emm_cause_t emm_cause,
|
||||
nas_esm_cause_t esm_cause)
|
||||
{
|
||||
status_t rv;
|
||||
mme_enb_t *enb = NULL;
|
||||
|
@ -272,22 +275,20 @@ void emm_handle_attach_reject(mme_ue_t *mme_ue)
|
|||
sess = mme_sess_first(mme_ue);
|
||||
if (sess)
|
||||
{
|
||||
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess->pti,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess->pti, esm_cause);
|
||||
d_assert(rv == CORE_OK && esmbuf, return, "esm build error");
|
||||
d_trace(3, "[NAS] PDN Connectivity reject : "
|
||||
"EMM <-- ESM[%d]\n", sess->pti);
|
||||
}
|
||||
|
||||
rv = emm_build_attach_reject(&emmbuf,
|
||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esmbuf);
|
||||
rv = emm_build_attach_reject(&emmbuf, emm_cause, esmbuf);
|
||||
d_assert(rv == CORE_OK && emmbuf,
|
||||
pkbuf_free(esmbuf); return, "emm build error");
|
||||
d_assert(nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == CORE_OK,,);
|
||||
d_trace(3, "[NAS] Attach reject : UE[%s] <-- EMM\n", mme_ue->imsi_bcd);
|
||||
|
||||
cause.present = S1ap_Cause_PR_nas;
|
||||
cause.choice.nas = S1ap_CauseNas_authentication_failure;
|
||||
cause.choice.nas = s1ap_cause_nas;;
|
||||
|
||||
rv = s1ap_build_ue_context_release_commmand(&s1apbuf, enb_ue, &cause);
|
||||
d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error");
|
||||
|
|
|
@ -14,7 +14,10 @@ CORE_DECLARE(void) emm_handle_attach_request(
|
|||
CORE_DECLARE(void) emm_handle_attach_accept(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(void) emm_handle_attach_complete(
|
||||
mme_ue_t *mme_ue, nas_attach_complete_t *attach_complete);
|
||||
CORE_DECLARE(void) emm_handle_attach_reject(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(void) emm_handle_attach_reject(mme_ue_t *mme_ue,
|
||||
e_S1ap_CauseNas s1ap_cause_nas,
|
||||
nas_emm_cause_t emm_cause,
|
||||
nas_esm_cause_t esm_cause);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_identity_request(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(void) emm_handle_identity_response(
|
||||
|
@ -28,15 +31,15 @@ CORE_DECLARE(void) emm_handle_detach_request(
|
|||
CORE_DECLARE(void) emm_handle_detach_accept(mme_ue_t *mme_ue);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_service_request(
|
||||
mme_ue_t *mme_ue, nas_service_request_t *service_request);
|
||||
mme_ue_t *mme_ue, nas_service_request_t *service_request);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_emm_status(
|
||||
mme_ue_t *mme_ue, nas_emm_status_t *emm_status);
|
||||
mme_ue_t *mme_ue, nas_emm_status_t *emm_status);
|
||||
CORE_DECLARE(void) emm_handle_tau_request(
|
||||
mme_ue_t *mme_ue, nas_tracking_area_update_request_t *tau_request);
|
||||
mme_ue_t *mme_ue, nas_tracking_area_update_request_t *tau_request);
|
||||
CORE_DECLARE(void) emm_handle_tau_accept(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(void) emm_handle_tau_reject(mme_ue_t *mme_ue,
|
||||
nas_esm_cause_t emm_cause);
|
||||
nas_esm_cause_t emm_cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -104,6 +104,7 @@ static status_t mme_context_prepare()
|
|||
|
||||
self.s1ap_port = S1AP_SCTP_PORT;
|
||||
self.s11_port = GTPV2_C_UDP_PORT;
|
||||
self.s5c_port = GTPV2_C_UDP_PORT;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
@ -210,6 +211,7 @@ status_t mme_context_parse_config()
|
|||
START, ROOT,
|
||||
MME_START, MME_ROOT,
|
||||
SGW_START, SGW_ROOT,
|
||||
PGW_START, PGW_ROOT,
|
||||
SKIP, STOP
|
||||
} parse_state;
|
||||
parse_state state = START;
|
||||
|
@ -218,6 +220,7 @@ status_t mme_context_parse_config()
|
|||
size_t root_tokens = 0;
|
||||
size_t mme_tokens = 0;
|
||||
size_t sgw_tokens = 0;
|
||||
size_t pgw_tokens = 0;
|
||||
size_t skip_tokens = 0;
|
||||
int i, j, m, n, p, q;
|
||||
int arr, size, arr1, size1;
|
||||
|
@ -250,6 +253,10 @@ status_t mme_context_parse_config()
|
|||
{
|
||||
state = SGW_START;
|
||||
}
|
||||
else if (jsmntok_equal(json, t, "PGW") == 0)
|
||||
{
|
||||
state = PGW_START;
|
||||
}
|
||||
else
|
||||
{
|
||||
state = SKIP;
|
||||
|
@ -661,6 +668,54 @@ status_t mme_context_parse_config()
|
|||
if (sgw_tokens == 0) stack = ROOT;
|
||||
break;
|
||||
}
|
||||
case PGW_START:
|
||||
{
|
||||
state = PGW_ROOT;
|
||||
pgw_tokens = t->size;
|
||||
|
||||
break;
|
||||
}
|
||||
case PGW_ROOT:
|
||||
{
|
||||
if (jsmntok_equal(json, t, "NETWORK") == 0)
|
||||
{
|
||||
m = 1;
|
||||
size = 1;
|
||||
|
||||
if ((t+1)->type == JSMN_ARRAY)
|
||||
{
|
||||
m = 2;
|
||||
size = (t+1)->size;
|
||||
}
|
||||
|
||||
for (arr = 0; arr < size; arr++)
|
||||
{
|
||||
for (n = 1; n > 0; m++, n--)
|
||||
{
|
||||
n += (t+m)->size;
|
||||
|
||||
if (jsmntok_equal(json, t+m, "S5C_ADDR") == 0)
|
||||
{
|
||||
char *v = jsmntok_to_string(json, t+m+1);
|
||||
if (v) self.s5c_addr = inet_addr(v);
|
||||
}
|
||||
else if (jsmntok_equal(json, t+m, "S5C_PORT") == 0)
|
||||
{
|
||||
char *v = jsmntok_to_string(json, t+m+1);
|
||||
if (v) self.s5c_port = atoi(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
state = SKIP;
|
||||
stack = PGW_ROOT;
|
||||
skip_tokens = t->size;
|
||||
|
||||
pgw_tokens--;
|
||||
if (pgw_tokens == 0) stack = ROOT;
|
||||
break;
|
||||
}
|
||||
case SKIP:
|
||||
{
|
||||
skip_tokens += t->size;
|
||||
|
|
|
@ -54,6 +54,9 @@ typedef struct _mme_context_t {
|
|||
c_uint16_t s11_port; /* MME S11 local port */
|
||||
net_sock_t *s11_sock; /* MME S11 local listen socket */
|
||||
|
||||
c_uint32_t s5c_addr; /* PGW S5C remote address */
|
||||
c_uint16_t s5c_port; /* MME S5C remote port */
|
||||
|
||||
msgq_id queue_id; /* Queue for processing MME control plane */
|
||||
tm_service_t tm_service; /* Timer Service */
|
||||
gtp_xact_ctx_t gtp_xact_ctx; /* GTP Transaction Context for MME */
|
||||
|
@ -277,6 +280,9 @@ typedef struct _mme_sess_t {
|
|||
#define MME_UE_HAVE_APN(mme) \
|
||||
((mme) && (mme_sess_first(mme)) && \
|
||||
((mme_sess_first(mme))->pdn))
|
||||
#define MME_SESSION_GET_PGW_IPV4_ADDR(sess) \
|
||||
(((sess) && ((sess)->pdn) && (((sess)->pdn)->pgw.ipv4_addr)) ? \
|
||||
(((sess)->pdn)->pgw.ipv4_addr) : (mme_self()->s5c_addr))
|
||||
pdn_t *pdn;
|
||||
|
||||
/* Protocol Configuration Options */
|
||||
|
|
|
@ -25,12 +25,15 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
char bearer_qos_buf[GTP_BEARER_QOS_LEN];
|
||||
gtp_ue_timezone_t ue_timezone;
|
||||
c_int8_t apn[MAX_APN_LEN];
|
||||
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");
|
||||
pgw_ipv4_addr = MME_SESSION_GET_PGW_IPV4_ADDR(sess);
|
||||
d_assert(pgw_ipv4_addr, return CORE_ERROR, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
d_assert(mme_ue->enb_ue, return CORE_ERROR, "Null param");
|
||||
|
@ -42,13 +45,6 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
req->imsi.data = mme_ue->imsi;
|
||||
req->imsi.len = mme_ue->imsi_len;
|
||||
|
||||
/* Not used */
|
||||
#if 0
|
||||
req->msisdn.presence = 1;
|
||||
req->msisdn.data = mme_ue->imsi;
|
||||
req->msisdn.len = mme_ue->imsi_len;
|
||||
#endif
|
||||
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
uli.flags.tai = 1;
|
||||
|
@ -81,6 +77,7 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
memset(&pgw_s5c_teid, 0, sizeof(gtp_f_teid_t));
|
||||
pgw_s5c_teid.ipv4 = 1;
|
||||
pgw_s5c_teid.interface_type = GTP_F_TEID_S5_S8_PGW_GTP_C;
|
||||
pgw_s5c_teid.ipv4_addr = pgw_ipv4_addr;
|
||||
req->pgw_s5_s8_address_for_control_plane_or_pmip.presence = 1;
|
||||
req->pgw_s5_s8_address_for_control_plane_or_pmip.data = &pgw_s5c_teid;
|
||||
req->pgw_s5_s8_address_for_control_plane_or_pmip.len = GTP_F_TEID_IPV4_LEN;
|
||||
|
|
|
@ -407,7 +407,10 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
{
|
||||
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
emm_handle_attach_reject(mme_ue);
|
||||
emm_handle_attach_reject(mme_ue,
|
||||
S1ap_CauseNas_authentication_failure,
|
||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -420,7 +423,10 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_error("Not impleneted");
|
||||
emm_handle_attach_reject(mme_ue,
|
||||
S1ap_CauseNas_unspecified,
|
||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,8 +83,6 @@ static void volte_test1(abts_case *tc, void *data)
|
|||
"\"priority_level\" : 6,"
|
||||
"\"pre_emption_vulnerability\" : 1,"
|
||||
"\"pre_emption_capability\" : 1 } },"
|
||||
"\"pgw\" : {"
|
||||
"\"ipv4\" : \"1.0.0.4\" },"
|
||||
"\"type\" : 0 }"
|
||||
"],"
|
||||
"\"ambr\" : {"
|
||||
|
|
Loading…
Reference in New Issue