From 5901582281b25375d5c7722285b5454d3b469b87 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Wed, 5 May 2021 22:51:50 +0900 Subject: [PATCH] [GTPv2] fix incorrect formatting PLMN-ID (#969) --- lib/gtp/meson.build | 4 ++-- lib/gtp/ogs-gtp.h | 1 + lib/gtp/types.h | 22 ++++++++++++++++------ src/mme/mme-s11-build.c | 33 ++++++++++++++------------------- src/sgwc/s11-handler.c | 23 +++++++++++++---------- tests/unit/gtp-message-test.c | 4 ++-- 6 files changed, 48 insertions(+), 39 deletions(-) diff --git a/lib/gtp/meson.build b/lib/gtp/meson.build index b18a8c6da..e9d2d5cec 100644 --- a/lib/gtp/meson.build +++ b/lib/gtp/meson.build @@ -44,10 +44,10 @@ libgtp = library('ogsgtp', version : libogslib_version, c_args : '-DOGS_GTP_COMPILATION', include_directories : [libgtp_inc, libinc], - dependencies : [libcore_dep, libapp_dep], + dependencies : [libcore_dep, libapp_dep, libnas_common_dep], install : true) libgtp_dep = declare_dependency( link_with : libgtp, include_directories : [libgtp_inc, libinc], - dependencies : [libcore_dep, libapp_dep]) + dependencies : [libcore_dep, libapp_dep, libnas_common_dep]) diff --git a/lib/gtp/ogs-gtp.h b/lib/gtp/ogs-gtp.h index 9f4aa426d..d4ba513bd 100644 --- a/lib/gtp/ogs-gtp.h +++ b/lib/gtp/ogs-gtp.h @@ -23,6 +23,7 @@ #include "ogs-core.h" #include "ipfw/ogs-ipfw.h" #include "ogs-app.h" +#include "ogs-nas-common.h" #define OGS_GTPV1_U_UDP_PORT 2152 #define OGS_GTPV2_C_UDP_PORT 2123 diff --git a/lib/gtp/types.h b/lib/gtp/types.h index 7be06d986..90ab3bce9 100644 --- a/lib/gtp/types.h +++ b/lib/gtp/types.h @@ -312,28 +312,38 @@ int16_t ogs_gtp_build_tft( /* 8.21 User Location Information (ULI) */ #define OGS_GTP_MAX_ULI_LEN sizeof(ogs_gtp_uli_t) typedef struct ogs_gtp_uli_cgi_s { - ogs_plmn_id_t plmn_id; + ogs_nas_plmn_id_t nas_plmn_id; uint16_t lac; uint16_t ci; } __attribute__ ((packed)) ogs_gtp_uli_cgi_t; typedef struct ogs_gtp_uli_sai_s { - ogs_plmn_id_t plmn_id; + ogs_nas_plmn_id_t nas_plmn_id; uint16_t lac; uint16_t sac; } __attribute__ ((packed)) ogs_gtp_uli_sai_t; typedef struct ogs_gtp_uli_rai_s { - ogs_plmn_id_t plmn_id; + ogs_nas_plmn_id_t nas_plmn_id; uint16_t lac; uint16_t rac; } __attribute__ ((packed)) ogs_gtp_uli_rai_t; typedef struct ogs_gtp_uli_lai_s { - ogs_plmn_id_t plmn_id; + ogs_nas_plmn_id_t nas_plmn_id; uint16_t lac; } __attribute__ ((packed)) ogs_gtp_uli_lai_t; +typedef struct ogs_gtp_uli_tai_s { + ogs_nas_plmn_id_t nas_plmn_id; + uint16_t tac; +} __attribute__ ((packed)) ogs_gtp_uli_tai_t; + +typedef struct ogs_gtp_uli_e_cgi_s { + ogs_nas_plmn_id_t nas_plmn_id; + uint32_t cell_id; +} __attribute__ ((packed)) ogs_gtp_uli_e_cgi_t; + typedef struct ogs_gtp_uli_s { struct { ED7(uint8_t spare:2;, @@ -347,8 +357,8 @@ typedef struct ogs_gtp_uli_s { ogs_gtp_uli_cgi_t cgi; ogs_gtp_uli_sai_t sai; ogs_gtp_uli_rai_t rai; - ogs_eps_tai_t tai; - ogs_e_cgi_t e_cgi; + ogs_gtp_uli_tai_t tai; + ogs_gtp_uli_e_cgi_t e_cgi; ogs_gtp_uli_lai_t lai; } ogs_gtp_uli_t; diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index ec61e0355..7f7c27572 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -77,18 +77,17 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.tai.nas_plmn_id, &mme_ue->tai.plmn_id); uli.tai.tac = mme_ue->tai.tac; - memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id, - sizeof(uli.e_cgi.plmn_id)); + ogs_nas_from_plmn_id(&uli.e_cgi.nas_plmn_id, &mme_ue->e_cgi.plmn_id); uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id; req->user_location_information.presence = 1; ogs_gtp_build_uli(&req->user_location_information, &uli, uli_buf, OGS_GTP_MAX_ULI_LEN); req->serving_network.presence = 1; - req->serving_network.data = &mme_ue->tai.plmn_id; - req->serving_network.len = sizeof(mme_ue->tai.plmn_id); + req->serving_network.data = &uli.tai.nas_plmn_id; + req->serving_network.len = sizeof(uli.tai.nas_plmn_id); req->rat_type.presence = 1; req->rat_type.u8 = OGS_GTP_RAT_TYPE_EUTRAN; @@ -318,10 +317,9 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request( memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.tai.nas_plmn_id, &mme_ue->tai.plmn_id); uli.tai.tac = mme_ue->tai.tac; - memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id, - sizeof(uli.e_cgi.plmn_id)); + ogs_nas_from_plmn_id(&uli.e_cgi.nas_plmn_id, &mme_ue->e_cgi.plmn_id); uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id; req->user_location_information.presence = 1; ogs_gtp_build_uli(&req->user_location_information, &uli, @@ -364,9 +362,9 @@ ogs_pkbuf_t *mme_s11_build_delete_session_request( memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.tai.nas_plmn_id, &mme_ue->tai.plmn_id); uli.tai.tac = mme_ue->tai.tac; - memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.e_cgi.nas_plmn_id, &mme_ue->e_cgi.plmn_id); uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id; req->user_location_information.presence = 1; ogs_gtp_build_uli(&req->user_location_information, &uli, @@ -453,10 +451,9 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response( memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.tai.nas_plmn_id, &mme_ue->tai.plmn_id); uli.tai.tac = mme_ue->tai.tac; - memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id, - sizeof(uli.e_cgi.plmn_id)); + ogs_nas_from_plmn_id(&uli.e_cgi.nas_plmn_id, &mme_ue->e_cgi.plmn_id); uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id; rsp->user_location_information.presence = 1; ogs_gtp_build_uli(&rsp->user_location_information, &uli, @@ -530,10 +527,9 @@ ogs_pkbuf_t *mme_s11_build_update_bearer_response( memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.tai.nas_plmn_id, &mme_ue->tai.plmn_id); uli.tai.tac = mme_ue->tai.tac; - memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id, - sizeof(uli.e_cgi.plmn_id)); + ogs_nas_from_plmn_id(&uli.e_cgi.nas_plmn_id, &mme_ue->e_cgi.plmn_id); uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id; rsp->user_location_information.presence = 1; ogs_gtp_build_uli(&rsp->user_location_information, &uli, @@ -607,10 +603,9 @@ ogs_pkbuf_t *mme_s11_build_delete_bearer_response( memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_from_plmn_id(&uli.tai.nas_plmn_id, &mme_ue->tai.plmn_id); uli.tai.tac = mme_ue->tai.tac; - memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id, - sizeof(uli.e_cgi.plmn_id)); + ogs_nas_from_plmn_id(&uli.e_cgi.nas_plmn_id, &mme_ue->e_cgi.plmn_id); uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id; rsp->user_location_information.presence = 1; ogs_gtp_build_uli(&rsp->user_location_information, &uli, diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 34ffe3b91..b16966b52 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -203,12 +203,18 @@ void sgwc_s11_handle_create_session_request( /* Set User Location Information */ decoded = ogs_gtp_parse_uli(&uli, &req->user_location_information); ogs_assert(req->user_location_information.len == decoded); - memcpy(&sgwc_ue->e_tai.plmn_id, &uli.tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); sgwc_ue->e_tai.tac = uli.tai.tac; - memcpy(&sgwc_ue->e_cgi.plmn_id, - &uli.e_cgi.plmn_id, sizeof(uli.e_cgi.plmn_id)); + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + /* Select SGW-U based on UE Location Information */ sgwc_sess_select_sgwu(sess); @@ -352,11 +358,9 @@ void sgwc_s11_handle_modify_bearer_request( decoded = ogs_gtp_parse_uli( &uli, &req->user_location_information); ogs_assert(req->user_location_information.len == decoded); - memcpy(&sgwc_ue->e_tai.plmn_id, &uli.tai.plmn_id, - sizeof(uli.tai.plmn_id)); + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); sgwc_ue->e_tai.tac = uli.tai.tac; - memcpy(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.plmn_id, - sizeof(uli.e_cgi.plmn_id)); + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), @@ -620,10 +624,9 @@ void sgwc_s11_handle_create_bearer_response( decoded = ogs_gtp_parse_uli(&uli, &rsp->user_location_information); ogs_assert(rsp->user_location_information.len == decoded); - memcpy(&sgwc_ue->e_tai.plmn_id, &uli.tai.plmn_id, sizeof(uli.tai.plmn_id)); + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); sgwc_ue->e_tai.tac = uli.tai.tac; - memcpy(&sgwc_ue->e_cgi.plmn_id, - &uli.e_cgi.plmn_id, sizeof(uli.e_cgi.plmn_id)); + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", diff --git a/tests/unit/gtp-message-test.c b/tests/unit/gtp-message-test.c index 9abab4d15..e7ca115f4 100644 --- a/tests/unit/gtp-message-test.c +++ b/tests/unit/gtp-message-test.c @@ -71,9 +71,9 @@ static void gtp_message_test1(abts_case *tc, void *data) memset(&uli, 0, sizeof(ogs_gtp_uli_t)); uli.flags.e_cgi = 1; uli.flags.tai = 1; - ogs_plmn_id_build(&uli.tai.plmn_id, 555, 10, 2); + ogs_plmn_id_build(&uli.tai.nas_plmn_id, 555, 10, 2); uli.tai.tac = 4130; - ogs_plmn_id_build(&uli.e_cgi.plmn_id, 555, 10, 2); + ogs_plmn_id_build(&uli.e_cgi.nas_plmn_id, 555, 10, 2); uli.e_cgi.cell_id = 105729; req.user_location_information.presence = 1; size = ogs_gtp_build_uli(&req.user_location_information, &uli,