From 20195b67cf23cc4aa85b29980f089b061804681f Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Tue, 11 Apr 2017 21:38:24 +0900 Subject: [PATCH] update it --- lib/nas/nas_types.h | 2 +- src/hss/hss_context.c | 3 ++- src/mme/esm_handler.c | 9 +++++++++ src/mme/mme_context.c | 16 ++++++++++++++++ src/mme/mme_context.h | 5 ++++- src/mme/mme_s11_build.c | 9 ++++++--- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/lib/nas/nas_types.h b/lib/nas/nas_types.h index 2c4df38c2..3520c97a8 100644 --- a/lib/nas/nas_types.h +++ b/lib/nas/nas_types.h @@ -749,7 +749,7 @@ ED2(c_uint8_t paging_time_window:4;, * O TLV 3-102 */ typedef struct _nas_access_point_name_t { c_uint8_t length; - c_uint8_t access_point_name_value[MAX_APN_LEN]; + c_int8_t apn[MAX_APN_LEN]; } __attribute__ ((packed)) nas_access_point_name_t; /* 9.9.4.4 ESM cause diff --git a/src/hss/hss_context.c b/src/hss/hss_context.c index f183560e4..2f9533fcf 100644 --- a/src/hss/hss_context.c +++ b/src/hss/hss_context.c @@ -64,7 +64,8 @@ status_t hss_context_init(void) pdn = hss_pdn_add(); d_assert(pdn, return -1, "Profile context add failed"); - strcpy(pdn->apn, "Internet"); + pdn->apn[0] = 0x08; + strcpy(pdn->apn+1, "internet"); pdn->type = PDN_TYPE_IPV4; diff --git a/src/mme/esm_handler.c b/src/mme/esm_handler.c index 60b5a5adb..4ce27c846 100644 --- a/src/mme/esm_handler.c +++ b/src/mme/esm_handler.c @@ -28,6 +28,15 @@ void esm_handle_information_response(mme_esm_t *esm, pkbuf_t *pkbuf = NULL; status_t rv; + if (esm_information_response->presencemask & + NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT) + { + esm->pdn = mme_pdn_find_by_apn( + esm_information_response->access_point_name.apn); + d_assert(esm->pdn, return, "No PDN Context[APN:%s])", + esm_information_response->access_point_name.apn); + } + rv = mme_s11_build_create_session_req(&pkbuf, esm); d_assert(rv == CORE_OK, return, "S11 build error"); diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index 395091670..e0bb07c86 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -345,6 +345,22 @@ pdn_t* mme_pdn_find_by_id(pdn_id_t id) return pdn; } +pdn_t* mme_pdn_find_by_apn(c_int8_t *apn) +{ + pdn_t *pdn = NULL; + + pdn = list_first(&self.pdn_list); + while (pdn) + { + if (strcmp(pdn->apn, apn) == 0) + break; + + pdn = list_next(pdn); + } + + return pdn; +} + pdn_t* mme_pdn_first() { return list_first(&self.pdn_list); diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index 8bcba854a..cc9d21e0c 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -166,8 +166,10 @@ typedef struct _mme_esm_t { c_uint8_t pti; /** Procedure Trasaction Identity */ - mme_ue_t *ue; mme_sgw_t *sgw; + pdn_t *pdn; + + mme_ue_t *ue; } mme_esm_t; CORE_DECLARE(status_t) mme_context_init(void); @@ -194,6 +196,7 @@ CORE_DECLARE(pdn_t*) mme_pdn_add(pdn_id_t id); CORE_DECLARE(status_t) mme_pdn_remove(pdn_t *pdn); CORE_DECLARE(status_t) mme_pdn_remove_all(void); CORE_DECLARE(pdn_t*) mme_pdn_find_by_id(pdn_id_t id); +CORE_DECLARE(pdn_t*) mme_pdn_find_by_apn(c_int8_t *apn); CORE_DECLARE(pdn_t*) mme_pdn_first(void); CORE_DECLARE(pdn_t*) mme_pdn_next(pdn_t *pdn); diff --git a/src/mme/mme_s11_build.c b/src/mme/mme_s11_build.c index 6f5c4d2a0..42a9f72e4 100644 --- a/src/mme/mme_s11_build.c +++ b/src/mme/mme_s11_build.c @@ -11,8 +11,9 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) { status_t rv; - mme_ue_t *ue = NULL; + pdn_t *pdn = NULL; mme_sgw_t *sgw = NULL; + mme_ue_t *ue = NULL; gtp_message_t gtp_message; gtp_create_session_request_t *req = >p_message.create_session_request; @@ -28,10 +29,12 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) gtp_ue_timezone_t ue_timezone; d_assert(esm, return CORE_ERROR, "Null param"); - ue = esm->ue; - d_assert(ue, return CORE_ERROR, "Null param"); + pdn = esm->pdn; + d_assert(pdn, return CORE_ERROR, "Null param"); sgw = esm->sgw; d_assert(sgw, return CORE_ERROR, "Null param"); + ue = esm->ue; + d_assert(ue, return CORE_ERROR, "Null param"); memset(>p_message, 0, sizeof(gtp_message_t));