From 3121d183f017ec1ff8410df0ea3ef1ccc0d74ee5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sat, 2 Apr 2022 00:46:05 +0900 Subject: [PATCH] [HSS/PCF] Store IMEISV instead of IMEI (#1464) --- lib/dbi/subscription.c | 7 +++-- lib/dbi/subscription.h | 2 +- src/hss/hss-context.c | 4 +-- src/hss/hss-context.h | 2 +- src/hss/hss-s6a-path.c | 39 +++++++++++++++++++++++-- src/pcf/npcf-handler.c | 25 ++++++++++++++-- webui/server/models/profile.js | 2 +- webui/server/models/subscriber.js | 2 +- webui/src/components/Profile/View.js | 10 +++---- webui/src/components/Subscriber/View.js | 10 +++---- 10 files changed, 78 insertions(+), 25 deletions(-) diff --git a/lib/dbi/subscription.c b/lib/dbi/subscription.c index 670279176..dfd86214f 100644 --- a/lib/dbi/subscription.c +++ b/lib/dbi/subscription.c @@ -148,7 +148,7 @@ int ogs_dbi_update_sqn(char *supi, uint64_t sqn) return rv; } -int ogs_dbi_update_imei(char *supi, char *imei) +int ogs_dbi_update_imeisv(char *supi, char *imeisv) { int rv = OGS_OK; bson_t *query = NULL; @@ -165,12 +165,13 @@ int ogs_dbi_update_imei(char *supi, char *imei) supi_id = ogs_id_get_value(supi); ogs_assert(supi_id); - ogs_debug("SUPI type: %s, SUPI id: %s, imei: %s", supi_type, supi_id, imei); + ogs_debug("SUPI type: %s, SUPI id: %s, imeisv: %s", + supi_type, supi_id, imeisv); query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); update = BCON_NEW("$set", "{", - "imei", BCON_UTF8(imei), + "imeisv", BCON_UTF8(imeisv), "}"); if (!mongoc_collection_update(ogs_mongoc()->collection.subscriber, MONGOC_UPDATE_UPSERT, query, update, NULL, &error)) { diff --git a/lib/dbi/subscription.h b/lib/dbi/subscription.h index e6da36cea..2d118a7e5 100644 --- a/lib/dbi/subscription.h +++ b/lib/dbi/subscription.h @@ -41,7 +41,7 @@ typedef struct ogs_dbi_auth_info_s { int ogs_dbi_auth_info(char *supi, ogs_dbi_auth_info_t *auth_info); int ogs_dbi_update_sqn(char *supi, uint64_t sqn); int ogs_dbi_increment_sqn(char *supi); -int ogs_dbi_update_imei(char *supi, char *imei); +int ogs_dbi_update_imeisv(char *supi, char *imeisv); int ogs_dbi_subscription_data(char *supi, ogs_subscription_data_t *subscription_data); diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index 6be690ff3..2b6a0fb91 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -374,7 +374,7 @@ int hss_db_update_sqn(char *imsi_bcd, uint8_t *rand, uint64_t sqn) return rv; } -int hss_db_update_imei(char *imsi_bcd, char *imei) +int hss_db_update_imeisv(char *imsi_bcd, char *imeisv) { int rv; char *supi = NULL; @@ -385,7 +385,7 @@ int hss_db_update_imei(char *imsi_bcd, char *imei) supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd); ogs_assert(supi); - rv = ogs_dbi_update_imei(supi, imei); + rv = ogs_dbi_update_imeisv(supi, imeisv); ogs_free(supi); ogs_thread_mutex_unlock(&self.db_lock); diff --git a/src/hss/hss-context.h b/src/hss/hss-context.h index 3cc04c110..fa0886cec 100644 --- a/src/hss/hss-context.h +++ b/src/hss/hss-context.h @@ -61,7 +61,7 @@ int hss_context_parse_config(void); int hss_db_auth_info(char *imsi_bcd, ogs_dbi_auth_info_t *auth_info); int hss_db_update_sqn(char *imsi_bcd, uint8_t *rand, uint64_t sqn); int hss_db_increment_sqn(char *imsi_bcd); -int hss_db_update_imei(char *imsi_bcd, char *imei); +int hss_db_update_imeisv(char *imsi_bcd, char *imeisv); int hss_db_subscription_data( char *imsi_bcd, ogs_subscription_data_t *subscription_data); diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 394d9fe29..5ab3ea38f 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -318,17 +318,50 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ret = fd_msg_search_avp(qry, ogs_diam_s6a_terminal_information, &avp); ogs_assert(ret == 0); if (avp) { + char *p, *last; + + p = imeisv_bcd; + last = imeisv_bcd + OGS_MAX_IMEISV_BCD_LEN + 1; + ret = fd_avp_search_avp(avp, ogs_diam_s6a_imei, &avpch1); ogs_assert(ret == 0); if (avpch1) { ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); if (hdr->avp_value->os.len) { - ogs_cpystrn(imeisv_bcd, (char*)hdr->avp_value->os.data, - ogs_min(hdr->avp_value->os.len, OGS_MAX_IMEISV_BCD_LEN)+1); - hss_db_update_imei(imsi_bcd, imeisv_bcd); + char *s = NULL; + + ogs_assert(hdr->avp_value->os.data); + s = ogs_strndup( + (const char *)hdr->avp_value->os.data, + hdr->avp_value->os.len); + ogs_assert(s); + p = ogs_slprintf(p, last, "%s", s); + + ogs_free(s); } } + + ret = fd_avp_search_avp(avp, ogs_diam_s6a_software_version, &avpch1); + ogs_assert(ret == 0); + if (avpch1) { + ret = fd_msg_avp_hdr(avpch1, &hdr); + ogs_assert(ret == 0); + if (hdr->avp_value->os.len) { + char *s = NULL; + + ogs_assert(hdr->avp_value->os.data); + s = ogs_strndup( + (const char *)hdr->avp_value->os.data, + hdr->avp_value->os.len); + ogs_assert(s); + p = ogs_slprintf(p, last, "%s", s); + + ogs_free(s); + } + } + + ogs_assert(OGS_OK == hss_db_update_imeisv(imsi_bcd, imeisv_bcd)); } ret = fd_msg_search_avp(qry, ogs_diam_visited_plmn_id, &avp); diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index f52ea2534..f3a7a9b96 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -106,9 +106,28 @@ bool pcf_npcf_am_policy_contrtol_handle_create(pcf_ue_t *pcf_ue, pcf_ue->access_type = PolicyAssociationRequest->access_type; - if (pcf_ue->pei) - ogs_free(pcf_ue->pei); - pcf_ue->pei = ogs_strdup(PolicyAssociationRequest->pei); + if (PolicyAssociationRequest->pei) { + char *type = NULL, *value = NULL; + if (pcf_ue->pei) + ogs_free(pcf_ue->pei); + pcf_ue->pei = ogs_strdup(PolicyAssociationRequest->pei); + + type = ogs_id_get_type(pcf_ue->pei); + ogs_assert(type); + value = ogs_id_get_value(pcf_ue->pei); + ogs_assert(value); + + if (strcmp(type, "imeisv") == 0) { + ogs_assert(OGS_OK == ogs_dbi_update_imeisv(pcf_ue->supi, value)); + } else { + ogs_fatal("Unknown Type = %s", type); + ogs_assert_if_reached(); + } + + + ogs_free(type); + ogs_free(value); + } Guami = PolicyAssociationRequest->guami; if (Guami && Guami->amf_id && diff --git a/webui/server/models/profile.js b/webui/server/models/profile.js index 32134886c..053567ed7 100644 --- a/webui/server/models/profile.js +++ b/webui/server/models/profile.js @@ -12,7 +12,7 @@ const Profile = new Schema({ title: { $type: String, required: true }, msisdn: [ String ], - imei: [ String ], + imeisv: [ String ], security: { k: String, diff --git a/webui/server/models/subscriber.js b/webui/server/models/subscriber.js index dfe3bb41d..81a4ec857 100644 --- a/webui/server/models/subscriber.js +++ b/webui/server/models/subscriber.js @@ -12,7 +12,7 @@ const Subscriber = new Schema({ imsi: { $type: String, unique: true, required: true }, msisdn: [ String ], - imei: [ String ], + imeisv: [ String ], security: { k: String, diff --git a/webui/src/components/Profile/View.js b/webui/src/components/Profile/View.js index 26c6beda6..493fb6902 100644 --- a/webui/src/components/Profile/View.js +++ b/webui/src/components/Profile/View.js @@ -163,7 +163,7 @@ const View = ({ visible, disableOnClickOutside, profile, onEdit, onDelete, onHid const _id = (profile || {})._id; const title = (profile || {}).title; const msisdn_list = ((profile || {}).msisdn || []); - const imei = (profile || {}).imei; + const imeisv = (profile || {}).imeisv; const security = ((profile || {}).security || {}); const ambr = ((profile || {}).ambr || {}); const slice_list = ((profile || {}).slice || []); @@ -194,7 +194,7 @@ const View = ({ visible, disableOnClickOutside, profile, onEdit, onDelete, onHid
Profile Configuration
- {(msisdn_list.length !== 0 || (imei && imei.length !== 0)) && + {(msisdn_list.length !== 0 || (imeisv && imeisv.length !== 0)) &&
@@ -206,10 +206,10 @@ const View = ({ visible, disableOnClickOutside, profile, onEdit, onDelete, onHid MSISDN
)} - {imei && imei.length !== 0 && + {imeisv && imeisv.length !== 0 &&
- {imei} - IMEI + {imeisv} + IMEISV
}
diff --git a/webui/src/components/Subscriber/View.js b/webui/src/components/Subscriber/View.js index afac2f3ef..da2d7e1d3 100644 --- a/webui/src/components/Subscriber/View.js +++ b/webui/src/components/Subscriber/View.js @@ -162,7 +162,7 @@ const Pdn = styled.div` const View = ({ visible, disableOnClickOutside, subscriber, onEdit, onDelete, onHide }) => { const imsi = (subscriber || {}).imsi; const msisdn_list = ((subscriber || {}).msisdn || []); - const imei = (subscriber || {}).imei; + const imeisv = (subscriber || {}).imeisv; const security = ((subscriber || {}).security || {}); const ambr = ((subscriber || {}).ambr || {}); const slice_list = ((subscriber || {}).slice || []); @@ -193,7 +193,7 @@ const View = ({ visible, disableOnClickOutside, subscriber, onEdit, onDelete, on
Subscriber Configuration
- {(msisdn_list.length !== 0 || (imei && imei.length !== 0)) && + {(msisdn_list.length !== 0 || (imeisv && imeisv.length !== 0)) &&
@@ -205,10 +205,10 @@ const View = ({ visible, disableOnClickOutside, subscriber, onEdit, onDelete, on MSISDN
)} - {imei && imei.length !== 0 && + {imeisv && imeisv.length !== 0 &&
- {imei} - IMEI + {imeisv} + IMEISV
}