[GTPv2] fix incorrect formatting PLMN-ID (#969)

This commit is contained in:
Sukchan Lee 2021-05-05 22:51:50 +09:00
parent e5a0dfb444
commit 5901582281
6 changed files with 48 additions and 39 deletions

View File

@ -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])

View File

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

View File

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

View File

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

View File

@ -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]",

View File

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