Add/update current imei of UE in subscriber profile (#1464)

* first commit

* fix

Co-authored-by: root <root@lfv.unassigned-domain>
This commit is contained in:
EugeneBogush 2022-03-31 13:35:30 +03:00 committed by GitHub
parent 82241f5b84
commit f557fc8eaa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 95 additions and 16 deletions

View File

@ -148,6 +148,46 @@ int ogs_dbi_update_sqn(char *supi, uint64_t sqn)
return rv;
}
int ogs_dbi_update_imei(char *supi, char *imei)
{
int rv = OGS_OK;
bson_t *query = NULL;
bson_t *update = NULL;
bson_error_t error;
char *supi_type = NULL;
char *supi_id = NULL;
ogs_assert(supi);
supi_type = ogs_id_get_type(supi);
ogs_assert(supi_type);
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);
query = BCON_NEW(supi_type, BCON_UTF8(supi_id));
update = BCON_NEW("$set",
"{",
"imei", BCON_UTF8(imei),
"}");
if (!mongoc_collection_update(ogs_mongoc()->collection.subscriber,
MONGOC_UPDATE_UPSERT, query, update, NULL, &error)) {
ogs_error("mongoc_collection_update() failure: %s", error.message);
rv = OGS_ERROR;
}
if (query) bson_destroy(query);
if (update) bson_destroy(update);
ogs_free(supi_type);
ogs_free(supi_id);
return rv;
}
int ogs_dbi_increment_sqn(char *supi)
{
int rv = OGS_OK;

View File

@ -41,6 +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_subscription_data(char *supi,
ogs_subscription_data_t *subscription_data);

View File

@ -374,6 +374,25 @@ 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 rv;
char *supi = NULL;
ogs_assert(imsi_bcd);
ogs_thread_mutex_lock(&self.db_lock);
supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd);
ogs_assert(supi);
rv = ogs_dbi_update_imei(supi, imei);
ogs_free(supi);
ogs_thread_mutex_unlock(&self.db_lock);
return rv;
}
int hss_db_increment_sqn(char *imsi_bcd)
{
int rv;

View File

@ -61,6 +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_subscription_data(
char *imsi_bcd, ogs_subscription_data_t *subscription_data);

View File

@ -274,9 +274,11 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp,
struct msg *ans, *qry;
struct avp_hdr *hdr;
struct avp *avpch1;
union avp_value val;
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
char imeisv_bcd[OGS_MAX_IMEISV_BCD_LEN+1];
int rv;
uint32_t result_code = 0;
@ -313,6 +315,22 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp,
goto out;
}
ret = fd_msg_search_avp(qry, ogs_diam_s6a_terminal_information, &avp);
ogs_assert(ret == 0);
if (avp) {
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);
}
}
}
ret = fd_msg_search_avp(qry, ogs_diam_visited_plmn_id, &avp);
ogs_assert(ret == 0);
ret = fd_msg_avp_hdr(avp, &hdr);