From d53b30449f00836d4b2cb00aa4e5ff4dbedf5c10 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Tue, 11 Apr 2017 20:44:38 +0900 Subject: [PATCH] update it --- lib/3gpp/3gpp_common.h | 10 +++++++++ lib/gtp/gtp_types.c | 20 +++++++++--------- lib/gtp/gtp_types.h | 16 +++----------- src/mme/esm_handler.c | 11 +++++++--- src/mme/mme_context.h | 2 ++ src/mme/mme_s11_build.c | 47 +++++++++++++++++++++++------------------ src/mme/s1ap_handler.c | 26 +++++++++++++++++++++++ test/gtp_message_test.c | 10 ++++----- 8 files changed, 90 insertions(+), 52 deletions(-) diff --git a/lib/3gpp/3gpp_common.h b/lib/3gpp/3gpp_common.h index 226fae60a..8df5d1145 100644 --- a/lib/3gpp/3gpp_common.h +++ b/lib/3gpp/3gpp_common.h @@ -57,6 +57,16 @@ CORE_DECLARE(c_uint16_t) plmn_id_mnc_len(plmn_id_t *plmn_id); CORE_DECLARE(void *) plmn_id_build(plmn_id_t *plmn_id, c_uint16_t mcc, c_uint16_t mnc, c_uint16_t mnc_len); +typedef struct _tai_t { + plmn_id_t plmn_id; + c_uint16_t tac; +} __attribute__ ((packed)) tai_t; + +typedef struct _e_cgi_t { + plmn_id_t plmn_id; + c_uint32_t cell_id; /* 28 bit */ +} __attribute__ ((packed)) e_cgi_t; + /********************************** * PDN Structure */ typedef c_uint32_t pdn_id_t; diff --git a/lib/gtp/gtp_types.c b/lib/gtp/gtp_types.c index 54d7613aa..bee980d34 100644 --- a/lib/gtp/gtp_types.c +++ b/lib/gtp/gtp_types.c @@ -146,13 +146,13 @@ c_int16_t gtp_parse_uli(gtp_uli_t *uli, tlv_octet_t *octet) uli->tai.tac = ntohs(uli->tai.tac); size += sizeof(uli->tai); } - if (uli->flags.ecgi) + if (uli->flags.e_cgi) { - d_assert(size + sizeof(uli->ecgi) <= octet->len, + d_assert(size + sizeof(uli->e_cgi) <= octet->len, return -1, "decode error"); - memcpy(&uli->ecgi, octet->data + size, sizeof(uli->ecgi)); - uli->ecgi.eci = ntohl(uli->ecgi.eci); - size += sizeof(uli->ecgi); + memcpy(&uli->e_cgi, octet->data + size, sizeof(uli->e_cgi)); + uli->e_cgi.cell_id = ntohl(uli->e_cgi.cell_id); + size += sizeof(uli->e_cgi); } if (uli->flags.lai) { @@ -221,13 +221,13 @@ c_int16_t gtp_build_uli( memcpy(octet->data + size, &target.tai, sizeof(target.tai)); size += sizeof(target.tai); } - if (target.flags.ecgi) + if (target.flags.e_cgi) { - d_assert(size + sizeof(target.ecgi) <= data_len, + d_assert(size + sizeof(target.e_cgi) <= data_len, return -1, "encode error"); - target.ecgi.eci = htonl(target.ecgi.eci); - memcpy(octet->data + size, &target.ecgi, sizeof(target.ecgi)); - size += sizeof(target.ecgi); + target.e_cgi.cell_id = htonl(target.e_cgi.cell_id); + memcpy(octet->data + size, &target.e_cgi, sizeof(target.e_cgi)); + size += sizeof(target.e_cgi); } if (target.flags.lai) { diff --git a/lib/gtp/gtp_types.h b/lib/gtp/gtp_types.h index e06e18962..a1049b236 100644 --- a/lib/gtp/gtp_types.h +++ b/lib/gtp/gtp_types.h @@ -166,16 +166,6 @@ typedef struct _gtp_uli_rai_t { c_uint16_t rac; } __attribute__ ((packed)) gtp_uli_rai_t; -typedef struct _gtp_uli_tai_t { - plmn_id_t plmn_id; - c_uint16_t tac; -} __attribute__ ((packed)) gtp_uli_tai_t; - -typedef struct _gtp_uli_ecgi_t { - plmn_id_t plmn_id; - c_uint32_t eci; /* 28 bit */ -} __attribute__ ((packed)) gtp_uli_ecgi_t; - typedef struct _gtp_uli_lai_t { plmn_id_t plmn_id; c_uint16_t lac; @@ -185,7 +175,7 @@ typedef struct _gtp_uli_t { struct { ED7(c_uint8_t spare:2;, c_uint8_t lai:1;, - c_uint8_t ecgi:1;, + c_uint8_t e_cgi:1;, c_uint8_t tai:1;, c_uint8_t rai:1;, c_uint8_t sai:1;, @@ -194,8 +184,8 @@ typedef struct _gtp_uli_t { gtp_uli_cgi_t cgi; gtp_uli_sai_t sai; gtp_uli_rai_t rai; - gtp_uli_tai_t tai; - gtp_uli_ecgi_t ecgi; + tai_t tai; + e_cgi_t e_cgi; gtp_uli_lai_t lai; } gtp_uli_t; diff --git a/src/mme/esm_handler.c b/src/mme/esm_handler.c index 67b58d48a..60b5a5adb 100644 --- a/src/mme/esm_handler.c +++ b/src/mme/esm_handler.c @@ -25,8 +25,13 @@ void esm_handle_pdn_connectivity_request(mme_esm_t *esm, void esm_handle_information_response(mme_esm_t *esm, nas_esm_information_response_t *esm_information_response) { - pkbuf_t *pkbuf; + pkbuf_t *pkbuf = NULL; + status_t rv; - mme_s11_build_create_session_req(&pkbuf, esm); - mme_s11_send_to_sgw(esm->sgw, GTP_CREATE_SESSION_REQUEST_TYPE, 0, pkbuf); + rv = mme_s11_build_create_session_req(&pkbuf, esm); + d_assert(rv == CORE_OK, return, "S11 build error"); + + rv = mme_s11_send_to_sgw(esm->sgw, + GTP_CREATE_SESSION_REQUEST_TYPE, 0, pkbuf); + d_assert(rv == CORE_OK, return, "S11 send error"); } diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index 4135327f1..8bcba854a 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -112,6 +112,8 @@ typedef struct _mme_ue_t { int imei_len; /* UE Info */ + tai_t tai; + e_cgi_t e_cgi; plmn_id_t visited_plmn_id; /* Security Context */ diff --git a/src/mme/mme_s11_build.c b/src/mme/mme_s11_build.c index db17c726c..6f5c4d2a0 100644 --- a/src/mme/mme_s11_build.c +++ b/src/mme/mme_s11_build.c @@ -11,12 +11,13 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) { status_t rv; + mme_ue_t *ue = NULL; + mme_sgw_t *sgw = NULL; gtp_message_t gtp_message; gtp_create_session_request_t *req = >p_message.create_session_request; gtp_uli_t uli; char uli_buf[GTP_MAX_ULI_LEN]; - plmn_id_t serving_network; gtp_f_teid_t s11, s5; gtp_paa_t paa; gtp_ambr_t ambr; @@ -26,34 +27,43 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) char bearer_qos_buf[GTP_BEARER_QOS_LEN]; 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"); + sgw = esm->sgw; + d_assert(sgw, return CORE_ERROR, "Null param"); + memset(>p_message, 0, sizeof(gtp_message_t)); + d_assert(ue->imsi_len, return CORE_ERROR, "Null param"); req->imsi.presence = 1; - req->imsi.data = (c_uint8_t *)"\x55\x15\x30\x11\x34\x00\x10\xf4"; - req->imsi.len = 8; + req->imsi.data = ue->imsi; + req->imsi.len = ue->imsi_len; + /* Not used */ req->msisdn.presence = 1; - req->msisdn.data = (c_uint8_t *)"\x94\x71\x52\x76\x00\x41"; - req->msisdn.len = 6; + req->msisdn.data = ue->imsi; + req->msisdn.len = ue->imsi_len; + /* Not used */ req->me_identity.presence = 1; - req->me_identity.data = (c_uint8_t *)"\x53\x61\x20\x00\x91\x78\x84\x00"; - req->me_identity.len = 8; + req->me_identity.data = ue->imsi; + req->me_identity.len = ue->imsi_len; memset(&uli, 0, sizeof(gtp_uli_t)); - uli.flags.ecgi = 1; + uli.flags.e_cgi = 1; uli.flags.tai = 1; - plmn_id_build(&uli.tai.plmn_id, 555, 10, 2); - uli.tai.tac = 4130; - plmn_id_build(&uli.ecgi.plmn_id, 555, 10, 2); - uli.ecgi.eci = 105729; + memcpy(&uli.tai.plmn_id, &ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + uli.tai.tac = ue->tai.tac; + memcpy(&uli.e_cgi.plmn_id, &ue->e_cgi.plmn_id, sizeof(uli.tai.plmn_id)); + uli.e_cgi.cell_id = ue->e_cgi.cell_id; req->user_location_information.presence = 1; gtp_build_uli(&req->user_location_information, &uli, uli_buf, GTP_MAX_ULI_LEN); req->serving_network.presence = 1; - req->serving_network.data = plmn_id_build(&serving_network, 555, 10, 2); - req->serving_network.len = sizeof(serving_network); + req->serving_network.data = &ue->visited_plmn_id; + req->serving_network.len = sizeof(ue->visited_plmn_id); req->rat_type.presence = 1; req->rat_type.u8 = GTP_RAT_TYPE_EUTRAN; @@ -61,12 +71,8 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) memset(&s11, 0, sizeof(gtp_f_teid_t)); s11.ipv4 = 1; s11.interface_type = GTP_F_TEID_S11_MME_GTP_C; -#if 0 - s11.teid = htonl(0x80000084); -#else - s11.teid = htonl(1); -#endif - s11.ipv4_addr = inet_addr("10.50.54.10"); + s11.teid = htonl(esm->teid); + s11.ipv4_addr = mme_self()->s11_addr; req->sender_f_teid_for_control_plane.presence = 1; req->sender_f_teid_for_control_plane.data = &s11; req->sender_f_teid_for_control_plane.len = GTP_F_TEID_IPV4_LEN; @@ -74,7 +80,6 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) memset(&s5, 0, sizeof(gtp_f_teid_t)); s5.ipv4 = 1; s5.interface_type = GTP_F_TEID_S5_S8_PGW_GTP_C; - s5.ipv4_addr = inet_addr("10.50.54.37"); req->pgw_s5_s8_address_for_control_plane_or_pmip.presence = 1; req->pgw_s5_s8_address_for_control_plane_or_pmip.data = &s5; req->pgw_s5_s8_address_for_control_plane_or_pmip.len = GTP_F_TEID_IPV4_LEN; diff --git a/src/mme/s1ap_handler.c b/src/mme/s1ap_handler.c index 6439d1332..4fbe90909 100644 --- a/src/mme/s1ap_handler.c +++ b/src/mme/s1ap_handler.c @@ -62,12 +62,31 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message) mme_ue_t *ue = NULL; S1ap_InitialUEMessage_IEs_t *ies = NULL; + S1ap_TAI_t *tai = NULL; + S1ap_PLMNidentity_t *pLMNidentity = NULL; + S1ap_TAC_t *tAC = NULL; + S1ap_EUTRAN_CGI_t *eutran_cgi = NULL; + S1ap_CellIdentity_t *cell_ID = NULL; d_assert(enb, return, "Null param"); ies = &message->s1ap_InitialUEMessage_IEs; d_assert(ies, return, "Null param"); + tai = &ies->tai; + d_assert(tai, return,); + pLMNidentity = &tai->pLMNidentity; + d_assert(pLMNidentity && pLMNidentity->size == sizeof(plmn_id_t), return,); + tAC = &tai->tAC; + d_assert(tAC && tAC->size == sizeof(c_uint16_t), return,); + + eutran_cgi = &ies->eutran_cgi; + d_assert(eutran_cgi, return,); + pLMNidentity = &eutran_cgi->pLMNidentity; + d_assert(pLMNidentity && pLMNidentity->size == sizeof(plmn_id_t), return,); + cell_ID = &eutran_cgi->cell_ID; + d_assert(cell_ID, return,); + ue = mme_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID); if (!ue) { @@ -83,6 +102,13 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message) enb->enb_id, ue->enb_ue_s1ap_id); } + memcpy(&ue->tai.plmn_id, pLMNidentity->buf, sizeof(ue->tai.plmn_id)); + memcpy(&ue->tai.tac, tAC->buf, sizeof(ue->tai.tac)); + ue->tai.tac = ntohs(ue->tai.tac); + memcpy(&ue->e_cgi.plmn_id, pLMNidentity->buf, sizeof(ue->e_cgi.plmn_id)); + memcpy(&ue->e_cgi.cell_id, cell_ID->buf, sizeof(ue->e_cgi.cell_id)); + ue->e_cgi.cell_id = (ntohl(ue->e_cgi.cell_id) >> 4); + d_assert(enb->s1ap_sock, mme_ue_remove(ue); return,); d_info("[S1AP] InitialUEMessage : UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]", ue->enb_ue_s1ap_id, diff --git a/test/gtp_message_test.c b/test/gtp_message_test.c index 676365085..57d0e8d38 100644 --- a/test/gtp_message_test.c +++ b/test/gtp_message_test.c @@ -57,12 +57,12 @@ static void gtp_message_test1(abts_case *tc, void *data) req.me_identity.len = 8; memset(&uli, 0, sizeof(gtp_uli_t)); - uli.flags.ecgi = 1; + uli.flags.e_cgi = 1; uli.flags.tai = 1; plmn_id_build(&uli.tai.plmn_id, 555, 10, 2); uli.tai.tac = 4130; - plmn_id_build(&uli.ecgi.plmn_id, 555, 10, 2); - uli.ecgi.eci = 105729; + plmn_id_build(&uli.e_cgi.plmn_id, 555, 10, 2); + uli.e_cgi.cell_id = 105729; req.user_location_information.presence = 1; size = gtp_build_uli(&req.user_location_information, &uli, ulibuf, GTP_MAX_ULI_LEN); @@ -199,8 +199,8 @@ static void gtp_message_test1(abts_case *tc, void *data) size = gtp_parse_uli(&uli, &req.user_location_information); ABTS_INT_EQUAL(tc, 13, size); ABTS_INT_EQUAL(tc, 0, uli.flags.lai); - ABTS_INT_EQUAL(tc, 1, uli.flags.ecgi); - ABTS_INT_EQUAL(tc, 105729, uli.ecgi.eci); + ABTS_INT_EQUAL(tc, 1, uli.flags.e_cgi); + ABTS_INT_EQUAL(tc, 105729, uli.e_cgi.cell_id); ABTS_INT_EQUAL(tc, 1, uli.flags.tai); ABTS_INT_EQUAL(tc, 4130, uli.tai.tac); ABTS_INT_EQUAL(tc, 0, uli.flags.rai);