forked from acouzens/open5gs
[SBI] Fixed Invalid S-NSSAI format (#2337)
This commit is contained in:
parent
ad86e8f49b
commit
31f95ce2e0
|
@ -772,7 +772,7 @@ int ogs_sbi_rfc7231_string(char *date_str, ogs_time_t time)
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ogs_sbi_s_nssai_to_string(ogs_s_nssai_t *s_nssai)
|
char *ogs_sbi_s_nssai_to_json(ogs_s_nssai_t *s_nssai)
|
||||||
{
|
{
|
||||||
cJSON *item = NULL;
|
cJSON *item = NULL;
|
||||||
OpenAPI_snssai_t sNSSAI;
|
OpenAPI_snssai_t sNSSAI;
|
||||||
|
@ -798,7 +798,7 @@ char *ogs_sbi_s_nssai_to_string(ogs_s_nssai_t *s_nssai)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ogs_sbi_s_nssai_from_string(ogs_s_nssai_t *s_nssai, char *str)
|
bool ogs_sbi_s_nssai_from_json(ogs_s_nssai_t *s_nssai, char *str)
|
||||||
{
|
{
|
||||||
bool rc = false;
|
bool rc = false;
|
||||||
|
|
||||||
|
@ -823,6 +823,70 @@ bool ogs_sbi_s_nssai_from_string(ogs_s_nssai_t *s_nssai, char *str)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *ogs_sbi_s_nssai_to_string(ogs_s_nssai_t *s_nssai)
|
||||||
|
{
|
||||||
|
ogs_assert(s_nssai);
|
||||||
|
|
||||||
|
if (s_nssai->sd.v != OGS_S_NSSAI_NO_SD_VALUE) {
|
||||||
|
return ogs_msprintf("%d-%06x", s_nssai->sst, s_nssai->sd.v);
|
||||||
|
} else {
|
||||||
|
return ogs_msprintf("%d", s_nssai->sst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ogs_sbi_s_nssai_from_string(ogs_s_nssai_t *s_nssai, char *str)
|
||||||
|
{
|
||||||
|
bool rc = false;
|
||||||
|
char *token, *p, *tofree;
|
||||||
|
char *sst = NULL;
|
||||||
|
char *sd = NULL;
|
||||||
|
|
||||||
|
ogs_assert(s_nssai);
|
||||||
|
ogs_assert(str);
|
||||||
|
|
||||||
|
tofree = p = ogs_strdup(str);
|
||||||
|
if (!p) {
|
||||||
|
ogs_error("ogs_strdup[%s] failed", str);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
token = strsep(&p, "-");
|
||||||
|
if (!token) {
|
||||||
|
ogs_error("strsep[%s] failed", str);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
sst = ogs_strdup(token);
|
||||||
|
if (!sst) {
|
||||||
|
ogs_error("ogs_strdup[%s:%s] failed", str, token);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
s_nssai->sst = atoi(sst);
|
||||||
|
s_nssai->sd.v = OGS_S_NSSAI_NO_SD_VALUE;
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
sd = ogs_strdup(p);
|
||||||
|
if (!sd) {
|
||||||
|
ogs_error("ogs_strdup[%s:%s] failed", str, token);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
s_nssai->sd = ogs_uint24_from_string(sd);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = true;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (tofree)
|
||||||
|
ogs_free(tofree);
|
||||||
|
if (sst)
|
||||||
|
ogs_free(sst);
|
||||||
|
if (sd)
|
||||||
|
ogs_free(sd);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
OpenAPI_plmn_id_t *ogs_sbi_build_plmn_id(ogs_plmn_id_t *plmn_id)
|
OpenAPI_plmn_id_t *ogs_sbi_build_plmn_id(ogs_plmn_id_t *plmn_id)
|
||||||
{
|
{
|
||||||
OpenAPI_plmn_id_t *PlmnId = NULL;
|
OpenAPI_plmn_id_t *PlmnId = NULL;
|
||||||
|
@ -1257,17 +1321,3 @@ void ogs_sbi_free_qos_data(OpenAPI_qos_data_t *QosData)
|
||||||
|
|
||||||
ogs_free(QosData);
|
ogs_free(QosData);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ogs_sbi_s_nssai_to_string_plain(ogs_s_nssai_t *s_nssai)
|
|
||||||
{
|
|
||||||
ogs_assert(s_nssai);
|
|
||||||
if (s_nssai->sd.v !=
|
|
||||||
OGS_S_NSSAI_NO_SD_VALUE) {
|
|
||||||
return ogs_msprintf("%d%06x",
|
|
||||||
s_nssai->sst,
|
|
||||||
s_nssai->sd.v);
|
|
||||||
} else {
|
|
||||||
return ogs_msprintf("%d",
|
|
||||||
s_nssai->sst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -63,6 +63,9 @@ bool ogs_sbi_time_from_string(ogs_time_t *time, char *str);
|
||||||
#define OGS_SBI_RFC7231_DATE_LEN (34)
|
#define OGS_SBI_RFC7231_DATE_LEN (34)
|
||||||
int ogs_sbi_rfc7231_string(char *date_str, ogs_time_t time);
|
int ogs_sbi_rfc7231_string(char *date_str, ogs_time_t time);
|
||||||
|
|
||||||
|
char *ogs_sbi_s_nssai_to_json(ogs_s_nssai_t *s_nssai);
|
||||||
|
bool ogs_sbi_s_nssai_from_json(ogs_s_nssai_t *s_nssai, char *str);
|
||||||
|
|
||||||
char *ogs_sbi_s_nssai_to_string(ogs_s_nssai_t *s_nssai);
|
char *ogs_sbi_s_nssai_to_string(ogs_s_nssai_t *s_nssai);
|
||||||
bool ogs_sbi_s_nssai_from_string(ogs_s_nssai_t *s_nssai, char *str);
|
bool ogs_sbi_s_nssai_from_string(ogs_s_nssai_t *s_nssai, char *str);
|
||||||
|
|
||||||
|
@ -91,7 +94,6 @@ OpenAPI_pcc_rule_t *ogs_sbi_build_pcc_rule(
|
||||||
void ogs_sbi_free_pcc_rule(OpenAPI_pcc_rule_t *PccRule);
|
void ogs_sbi_free_pcc_rule(OpenAPI_pcc_rule_t *PccRule);
|
||||||
OpenAPI_qos_data_t *ogs_sbi_build_qos_data(ogs_pcc_rule_t *pcc_rule);
|
OpenAPI_qos_data_t *ogs_sbi_build_qos_data(ogs_pcc_rule_t *pcc_rule);
|
||||||
void ogs_sbi_free_qos_data(OpenAPI_qos_data_t *QosData);
|
void ogs_sbi_free_qos_data(OpenAPI_qos_data_t *QosData);
|
||||||
char *ogs_sbi_s_nssai_to_string_plain(ogs_s_nssai_t *s_nssai);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -475,9 +475,9 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (message->param.single_nssai_presence) {
|
if (message->param.single_nssai_presence) {
|
||||||
char *v = ogs_sbi_s_nssai_to_string(&message->param.s_nssai);
|
char *v = ogs_sbi_s_nssai_to_json(&message->param.s_nssai);
|
||||||
if (!v) {
|
if (!v) {
|
||||||
ogs_error("ogs_sbi_s_nssai_to_string() failed");
|
ogs_error("ogs_sbi_s_nssai_to_json() failed");
|
||||||
ogs_sbi_request_free(request);
|
ogs_sbi_request_free(request);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -485,9 +485,9 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
|
||||||
ogs_free(v);
|
ogs_free(v);
|
||||||
}
|
}
|
||||||
if (message->param.snssai_presence) {
|
if (message->param.snssai_presence) {
|
||||||
char *v = ogs_sbi_s_nssai_to_string(&message->param.s_nssai);
|
char *v = ogs_sbi_s_nssai_to_json(&message->param.s_nssai);
|
||||||
if (!v) {
|
if (!v) {
|
||||||
ogs_error("ogs_sbi_s_nssai_to_string() failed");
|
ogs_error("ogs_sbi_s_nssai_to_json() failed");
|
||||||
ogs_sbi_request_free(request);
|
ogs_sbi_request_free(request);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -748,16 +748,14 @@ int ogs_sbi_parse_request(
|
||||||
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SINGLE_NSSAI)) {
|
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SINGLE_NSSAI)) {
|
||||||
char *v = ogs_hash_this_val(hi);
|
char *v = ogs_hash_this_val(hi);
|
||||||
if (v) {
|
if (v) {
|
||||||
bool rc = ogs_sbi_s_nssai_from_string(
|
bool rc = ogs_sbi_s_nssai_from_json(&message->param.s_nssai, v);
|
||||||
&message->param.s_nssai, v);
|
|
||||||
if (rc == true)
|
if (rc == true)
|
||||||
message->param.single_nssai_presence = true;
|
message->param.single_nssai_presence = true;
|
||||||
}
|
}
|
||||||
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SNSSAI)) {
|
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SNSSAI)) {
|
||||||
char *v = ogs_hash_this_val(hi);
|
char *v = ogs_hash_this_val(hi);
|
||||||
if (v) {
|
if (v) {
|
||||||
bool rc = ogs_sbi_s_nssai_from_string(
|
bool rc = ogs_sbi_s_nssai_from_json(&message->param.s_nssai, v);
|
||||||
&message->param.s_nssai, v);
|
|
||||||
if (rc == true)
|
if (rc == true)
|
||||||
message->param.snssai_presence = true;
|
message->param.snssai_presence = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -232,7 +232,7 @@ void amf_metrics_inst_by_slice_add(ogs_plmn_id_t *plmn,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snssai) {
|
if (snssai) {
|
||||||
s_nssai = ogs_sbi_s_nssai_to_string_plain(snssai);
|
s_nssai = ogs_sbi_s_nssai_to_string(snssai);
|
||||||
} else {
|
} else {
|
||||||
s_nssai = ogs_strdup("");
|
s_nssai = ogs_strdup("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,7 +159,7 @@ void pcf_metrics_inst_by_slice_add(ogs_plmn_id_t *plmn,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snssai) {
|
if (snssai) {
|
||||||
s_nssai = ogs_sbi_s_nssai_to_string_plain(snssai);
|
s_nssai = ogs_sbi_s_nssai_to_string(snssai);
|
||||||
} else {
|
} else {
|
||||||
s_nssai = ogs_strdup("");
|
s_nssai = ogs_strdup("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,7 @@ void smf_metrics_inst_by_slice_add(ogs_plmn_id_t *plmn,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snssai) {
|
if (snssai) {
|
||||||
s_nssai = ogs_sbi_s_nssai_to_string_plain(snssai);
|
s_nssai = ogs_sbi_s_nssai_to_string(snssai);
|
||||||
} else {
|
} else {
|
||||||
s_nssai = ogs_strdup("");
|
s_nssai = ogs_strdup("");
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,7 @@ void smf_metrics_inst_by_5qi_add(ogs_plmn_id_t *plmn,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snssai) {
|
if (snssai) {
|
||||||
s_nssai = ogs_sbi_s_nssai_to_string_plain(snssai);
|
s_nssai = ogs_sbi_s_nssai_to_string(snssai);
|
||||||
} else {
|
} else {
|
||||||
s_nssai = ogs_strdup("");
|
s_nssai = ogs_strdup("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -505,6 +505,43 @@ static void sbi_message_test5(abts_case *tc, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sbi_message_test6(abts_case *tc, void *data)
|
static void sbi_message_test6(abts_case *tc, void *data)
|
||||||
|
{
|
||||||
|
ogs_s_nssai_t s_nssai1, s_nssai2;
|
||||||
|
char *string = NULL;
|
||||||
|
bool rc = false;
|
||||||
|
|
||||||
|
memset(&s_nssai1, 0, sizeof(ogs_s_nssai_t));
|
||||||
|
|
||||||
|
s_nssai1.sst = 255;
|
||||||
|
s_nssai1.sd.v = 0x19cde0;
|
||||||
|
|
||||||
|
string = ogs_sbi_s_nssai_to_string(&s_nssai1);
|
||||||
|
ABTS_PTR_NOTNULL(tc, string);
|
||||||
|
|
||||||
|
rc = ogs_sbi_s_nssai_from_string(&s_nssai2, string);
|
||||||
|
ABTS_TRUE(tc, rc == true);
|
||||||
|
|
||||||
|
ogs_free(string);
|
||||||
|
|
||||||
|
ABTS_INT_EQUAL(tc, s_nssai1.sst, s_nssai2.sst);
|
||||||
|
ABTS_INT_EQUAL(tc, s_nssai1.sd.v, s_nssai2.sd.v);
|
||||||
|
|
||||||
|
s_nssai1.sst = 1;
|
||||||
|
s_nssai1.sd.v = OGS_S_NSSAI_NO_SD_VALUE;
|
||||||
|
|
||||||
|
string = ogs_sbi_s_nssai_to_string(&s_nssai1);
|
||||||
|
ABTS_PTR_NOTNULL(tc, string);
|
||||||
|
|
||||||
|
rc = ogs_sbi_s_nssai_from_string(&s_nssai2, string);
|
||||||
|
ABTS_TRUE(tc, rc == true);
|
||||||
|
|
||||||
|
ogs_free(string);
|
||||||
|
|
||||||
|
ABTS_INT_EQUAL(tc, s_nssai1.sst, s_nssai2.sst);
|
||||||
|
ABTS_INT_EQUAL(tc, s_nssai1.sd.v, s_nssai2.sd.v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sbi_message_test7(abts_case *tc, void *data)
|
||||||
{
|
{
|
||||||
cJSON *item = NULL, *item2 = NULL;
|
cJSON *item = NULL, *item2 = NULL;
|
||||||
char *content = NULL;
|
char *content = NULL;
|
||||||
|
@ -553,12 +590,11 @@ static void sbi_message_test6(abts_case *tc, void *data)
|
||||||
OpenAPI_list_free(DnnInfoList);
|
OpenAPI_list_free(DnnInfoList);
|
||||||
|
|
||||||
memset(&s_nssai, 0, sizeof(s_nssai));
|
memset(&s_nssai, 0, sizeof(s_nssai));
|
||||||
s_nssai.sst = 1;
|
s_nssai.sst = 255;
|
||||||
s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE;
|
s_nssai.sd.v = 0x19cde0;
|
||||||
|
|
||||||
SubscribedSnssaiInfoMap = OpenAPI_map_create(
|
SubscribedSnssaiInfoMap = OpenAPI_map_create(
|
||||||
ogs_sbi_s_nssai_to_string(&s_nssai),
|
ogs_sbi_s_nssai_to_string(&s_nssai), SubscribedSnssaiInfo);
|
||||||
SubscribedSnssaiInfo);
|
|
||||||
ogs_assert(SubscribedSnssaiInfoMap);
|
ogs_assert(SubscribedSnssaiInfoMap);
|
||||||
ogs_assert(SubscribedSnssaiInfoMap->key);
|
ogs_assert(SubscribedSnssaiInfoMap->key);
|
||||||
|
|
||||||
|
@ -611,8 +647,8 @@ static void sbi_message_test6(abts_case *tc, void *data)
|
||||||
if (SubscribedSnssaiInfoMap) {
|
if (SubscribedSnssaiInfoMap) {
|
||||||
memset(&s_nssai, 0, sizeof(s_nssai));
|
memset(&s_nssai, 0, sizeof(s_nssai));
|
||||||
ogs_sbi_s_nssai_from_string(&s_nssai, SubscribedSnssaiInfoMap->key);
|
ogs_sbi_s_nssai_from_string(&s_nssai, SubscribedSnssaiInfoMap->key);
|
||||||
ABTS_INT_EQUAL(tc, 1, s_nssai.sst);
|
ABTS_INT_EQUAL(tc, 255, s_nssai.sst);
|
||||||
ABTS_INT_EQUAL(tc, OGS_S_NSSAI_NO_SD_VALUE, s_nssai.sd.v);
|
ABTS_INT_EQUAL(tc, 0x19cde0, s_nssai.sd.v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,11 +657,11 @@ static void sbi_message_test6(abts_case *tc, void *data)
|
||||||
content = cJSON_Print(item);
|
content = cJSON_Print(item);
|
||||||
cJSON_Delete(item);
|
cJSON_Delete(item);
|
||||||
ogs_assert(content);
|
ogs_assert(content);
|
||||||
ABTS_INT_EQUAL(tc, 148, (int)strlen(content));
|
ABTS_INT_EQUAL(tc, 139, (int)strlen(content));
|
||||||
ogs_free(content);
|
ogs_free(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sbi_message_test7(abts_case *tc, void *data)
|
static void sbi_message_test8(abts_case *tc, void *data)
|
||||||
{
|
{
|
||||||
ABTS_INT_EQUAL(tc, OpenAPI_nf_type_NRF,
|
ABTS_INT_EQUAL(tc, OpenAPI_nf_type_NRF,
|
||||||
ogs_sbi_service_type_to_nf_type(OGS_SBI_SERVICE_TYPE_NNRF_NFM));
|
ogs_sbi_service_type_to_nf_type(OGS_SBI_SERVICE_TYPE_NNRF_NFM));
|
||||||
|
@ -795,6 +831,7 @@ abts_suite *test_sbi_message(abts_suite *suite)
|
||||||
abts_run_test(suite, sbi_message_test5, NULL);
|
abts_run_test(suite, sbi_message_test5, NULL);
|
||||||
abts_run_test(suite, sbi_message_test6, NULL);
|
abts_run_test(suite, sbi_message_test6, NULL);
|
||||||
abts_run_test(suite, sbi_message_test7, NULL);
|
abts_run_test(suite, sbi_message_test7, NULL);
|
||||||
|
abts_run_test(suite, sbi_message_test8, NULL);
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue