GTP re-archi(first phase)

This commit is contained in:
Sukchan Lee 2017-08-28 21:47:32 +09:00
parent b8504073dd
commit 829047f763
7 changed files with 88 additions and 22 deletions

View File

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

View File

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

View File

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

View File

@ -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 */

View File

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

View File

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

View File

@ -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\" : {"