[AMF] Add amfInfoList to NFProfile

The actual configured GUAMIs and TAIs are used to form NF profile.
Comparing to SMF the "info" section is not introduced into amf.yaml!
Each amf_id (region, set) produces a separate Info in the InfoList.
Guami list consists of all GUAMIs of particular Info.
taiList consists of all TAIs for all PLMNs of particular Info.

Examle:

amf.yaml:
    guami:
      - plmn_id:
          mcc: 999
          mnc: 70
        amf_id:
          region: 2
          set: 2
          pointer: 4
      - plmn_id:
          mcc: 001
          mnc: 01
        amf_id:
          region: 2
          set: 1
      - plmn_id:
          mcc: 001
          mnc: 02
        amf_id:
          region: 2
          set: 2
    tai:
      - plmn_id:
          mcc: 001
          mnc: 01
        tac: [1, 2, 3]
    tai:
      - plmn_id:
          mcc: 002
          mnc: 02
        tac: 4
      - plmn_id:
          mcc: 001
          mnc: 02
        tac: 10
    tai:
      - plmn_id:
          mcc: 004
          mnc: 04
        tac: [6, 7]
      - plmn_id:
          mcc: 005
          mnc: 05
        tac: 8
      - plmn_id:
          mcc: 999
          mnc: 70
        tac: [9, 10]

"amfInfoList":  {
        "1":    {
                "amfSetId":     "002",
                "amfRegionId":  "02",
                "guamiList":    [{
                                "plmnId":       {
                                        "mcc":  "999",
                                        "mnc":  "70"
                                },
                                "amfId":        "020084"
                        }, {
                                "plmnId":       {
                                        "mcc":  "001",
                                        "mnc":  "02"
                                },
                                "amfId":        "020080"
                        }],
                "taiList":      [{
                                "plmnId":       {
                                        "mcc":  "001",
                                        "mnc":  "02"
                                },
                                "tac":  "00000a"
                        }, {
                                "plmnId":       {
                                        "mcc":  "999",
                                        "mnc":  "70"
                                },
                                "tac":  "000009"
                        }, {
                                "plmnId":       {
                                        "mcc":  "999",
                                        "mnc":  "70"
                                },
                                "tac":  "00000a"
                        }]
        },
        "2":    {
                "amfSetId":     "001",
                "amfRegionId":  "02",
                "guamiList":    [{
                                "plmnId":       {
                                        "mcc":  "001",
                                        "mnc":  "01"
                                },
                                "amfId":        "020040"
                        }],
                "taiList":      [{
                                "plmnId":       {
                                        "mcc":  "001",
                                        "mnc":  "01"
                                },
                                "tac":  "000001"
                        }, {
                                "plmnId":       {
                                        "mcc":  "001",
                                        "mnc":  "01"
                                },
                                "tac":  "000002"
                        }, {
                                "plmnId":       {
                                        "mcc":  "001",
                                        "mnc":  "01"
                                },
                                "tac":  "000003"
                        }]
        }
}
This commit is contained in:
Gaber Stare 2022-09-14 11:33:20 +00:00 committed by Sukchan Lee
parent ce7d631064
commit d3d4e5ce60
5 changed files with 367 additions and 26 deletions

View file

@ -23,7 +23,9 @@ static OpenAPI_nf_service_t *build_nf_service(
ogs_sbi_nf_service_t *nf_service);
static void free_nf_service(OpenAPI_nf_service_t *NFService);
static OpenAPI_smf_info_t *build_smf_info(ogs_sbi_nf_info_t *nf_info);
static OpenAPI_amf_info_t *build_amf_info(ogs_sbi_nf_info_t *nf_info);
static void free_smf_info(OpenAPI_smf_info_t *SmfInfo);
static void free_amf_info(OpenAPI_amf_info_t *AmfInfo);
ogs_sbi_request_t *ogs_nnrf_nfm_build_register(void)
{
@ -79,13 +81,15 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile(
OpenAPI_list_t *AllowedNfTypeList = NULL;
OpenAPI_list_t *NFServiceList = NULL;
OpenAPI_map_t *NFServiceMap = NULL;
OpenAPI_list_t *SmfInfoList = NULL;
OpenAPI_map_t *SmfInfoMap = NULL;
OpenAPI_list_t *InfoList = NULL;
OpenAPI_map_t *InfoMap = NULL;
OpenAPI_smf_info_t *SmfInfo = NULL;
int SmfInfoMapKey;
int InfoMapKey;
OpenAPI_lnode_t *node = NULL;
OpenAPI_amf_info_t *AmfInfo = NULL;
int i = 0;
char *ipstr = NULL;
@ -222,10 +226,10 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile(
} else
OpenAPI_list_free(NFServiceList);
SmfInfoList = OpenAPI_list_create();
ogs_assert(SmfInfoList);
InfoList = OpenAPI_list_create();
ogs_assert(InfoList);
SmfInfoMapKey = 0;
InfoMapKey = 0;
ogs_list_for_each(&nf_instance->nf_info_list, nf_info) {
if (nf_info->nf_type == OpenAPI_nf_type_SMF) {
@ -238,11 +242,21 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile(
SmfInfo = build_smf_info(nf_info);
ogs_expect_or_return_val(SmfInfo, NULL);
SmfInfoMap = OpenAPI_map_create(
ogs_msprintf("%d", ++SmfInfoMapKey), SmfInfo);
ogs_assert(SmfInfoMap);
InfoMap = OpenAPI_map_create(
ogs_msprintf("%d", ++InfoMapKey), SmfInfo);
ogs_assert(InfoMap);
OpenAPI_list_add(SmfInfoList, SmfInfoMap);
OpenAPI_list_add(InfoList, InfoMap);
} else if (nf_info->nf_type == OpenAPI_nf_type_AMF) {
AmfInfo = build_amf_info(nf_info);
ogs_expect_or_return_val(AmfInfo, NULL);
InfoMap = OpenAPI_map_create(
ogs_msprintf("%d", ++InfoMapKey), AmfInfo);
ogs_assert(InfoMap);
OpenAPI_list_add(InfoList, InfoMap);
} else {
ogs_fatal("Not implemented NF-type[%s]",
@ -250,23 +264,37 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile(
ogs_assert_if_reached();
}
}
if (SmfInfoList->count == 1) {
NFProfile->smf_info = SmfInfo;
OpenAPI_list_for_each(SmfInfoList, node) {
SmfInfoMap = node->data;
if (SmfInfoMap) {
if (SmfInfoMap->key)
ogs_free(SmfInfoMap->key);
ogs_free(SmfInfoMap);
if (InfoList->count == 1) {
if (nf_instance->nf_type == OpenAPI_nf_type_SMF) {
NFProfile->smf_info = SmfInfo;
} else if (nf_instance->nf_type == OpenAPI_nf_type_AMF) {
NFProfile->amf_info = AmfInfo;
} else {
ogs_fatal("Not implemented NF-type[%s]",
OpenAPI_nf_type_ToString(nf_instance->nf_type));
ogs_assert_if_reached();
}
OpenAPI_list_for_each(InfoList, node) {
InfoMap = node->data;
if (InfoMap) {
if (InfoMap->key)
ogs_free(InfoMap->key);
ogs_free(InfoMap);
}
}
OpenAPI_list_free(SmfInfoList);
} else if (SmfInfoList->count > 1) {
NFProfile->smf_info_list = SmfInfoList;
OpenAPI_list_free(InfoList);
} else if (InfoList->count > 1) {
if (nf_instance->nf_type == OpenAPI_nf_type_SMF) {
NFProfile->smf_info_list = InfoList;
} else if (nf_instance->nf_type == OpenAPI_nf_type_AMF) {
NFProfile->amf_info_list = InfoList;
} else {
ogs_fatal("Not implemented NF-type[%s]",
OpenAPI_nf_type_ToString(nf_instance->nf_type));
ogs_assert_if_reached();
}
} else
OpenAPI_list_free(SmfInfoList);
OpenAPI_list_free(InfoList);
return NFProfile;
}
@ -277,6 +305,8 @@ void ogs_nnrf_nfm_free_nf_profile(OpenAPI_nf_profile_t *NFProfile)
OpenAPI_nf_service_t *NFService = NULL;
OpenAPI_map_t *SmfInfoMap = NULL;
OpenAPI_smf_info_t *SmfInfo = NULL;
OpenAPI_map_t *AmfInfoMap = NULL;
OpenAPI_amf_info_t *AmfInfo = NULL;
OpenAPI_lnode_t *node = NULL;
ogs_assert(NFProfile);
@ -327,6 +357,22 @@ void ogs_nnrf_nfm_free_nf_profile(OpenAPI_nf_profile_t *NFProfile)
if (NFProfile->smf_info)
free_smf_info(NFProfile->smf_info);
OpenAPI_list_for_each(NFProfile->amf_info_list, node) {
AmfInfoMap = node->data;
if (AmfInfoMap) {
AmfInfo = AmfInfoMap->value;
if (AmfInfo)
free_amf_info(AmfInfo);
if (AmfInfoMap->key)
ogs_free(AmfInfoMap->key);
ogs_free(AmfInfoMap);
}
}
OpenAPI_list_free(NFProfile->amf_info_list);
if (NFProfile->amf_info)
free_amf_info(NFProfile->amf_info);
ogs_free(NFProfile);
}
@ -622,6 +668,124 @@ static OpenAPI_smf_info_t *build_smf_info(ogs_sbi_nf_info_t *nf_info)
return SmfInfo;
}
static OpenAPI_amf_info_t *build_amf_info(ogs_sbi_nf_info_t *nf_info)
{
int i, j;
OpenAPI_amf_info_t *AmfInfo = NULL;
OpenAPI_list_t *guamiAmfInfoList = NULL;
OpenAPI_guami_t *guamiAmfInfoItem = NULL;
OpenAPI_list_t *TaiList = NULL;
OpenAPI_tai_t *TaiItem = NULL;
OpenAPI_list_t *TaiRangeList = NULL;
OpenAPI_tai_range_t *TaiRangeItem = NULL;
OpenAPI_list_t *TacRangeList = NULL;
OpenAPI_tac_range_t *TacRangeItem = NULL;
ogs_assert(nf_info);
AmfInfo = ogs_calloc(1, sizeof(*AmfInfo));
ogs_expect_or_return_val(AmfInfo, NULL);
AmfInfo->amf_set_id = ogs_msprintf("%03x", nf_info->amf.amf_set_id);
AmfInfo->amf_region_id = ogs_msprintf("%02x", nf_info->amf.amf_region_id);
guamiAmfInfoList = OpenAPI_list_create();
ogs_assert(guamiAmfInfoList);
for (i = 0; i < nf_info->amf.num_of_guami; i++) {
guamiAmfInfoItem = ogs_calloc(1, sizeof(*guamiAmfInfoItem));
ogs_expect_or_return_val(guamiAmfInfoItem, NULL);
guamiAmfInfoItem->plmn_id =
ogs_sbi_build_plmn_id_nid(&nf_info->amf.guami[i].plmn_id);
ogs_expect_or_return_val(guamiAmfInfoItem->plmn_id, NULL);
guamiAmfInfoItem->amf_id =
ogs_amf_id_to_string(&nf_info->amf.guami[i].amf_id);
ogs_expect_or_return_val(guamiAmfInfoItem->amf_id, NULL);
OpenAPI_list_add(guamiAmfInfoList, guamiAmfInfoItem);
}
if (guamiAmfInfoList->count)
AmfInfo->guami_list = guamiAmfInfoList;
else
OpenAPI_list_free(guamiAmfInfoList);
TaiList = OpenAPI_list_create();
ogs_assert(TaiList);
for (i = 0; i < nf_info->amf.num_of_nr_tai; i++) {
TaiItem = ogs_calloc(1, sizeof(*TaiItem));
ogs_expect_or_return_val(TaiItem, NULL);
TaiItem->plmn_id = ogs_sbi_build_plmn_id(
&nf_info->amf.nr_tai[i].plmn_id);
ogs_expect_or_return_val(TaiItem->plmn_id, NULL);
TaiItem->tac =
ogs_uint24_to_0string(nf_info->amf.nr_tai[i].tac);
ogs_expect_or_return_val(TaiItem->tac, NULL);
OpenAPI_list_add(TaiList, TaiItem);
}
if (TaiList->count)
AmfInfo->tai_list = TaiList;
else
OpenAPI_list_free(TaiList);
TaiRangeList = OpenAPI_list_create();
ogs_assert(TaiRangeList);
for (i = 0; i < nf_info->amf.num_of_nr_tai_range; i++) {
TacRangeList = OpenAPI_list_create();
ogs_assert(TacRangeList);
for (j = 0;
j < nf_info->amf.nr_tai_range[i].num_of_tac_range;
j++) {
TacRangeItem = ogs_calloc(1, sizeof(*TacRangeItem));
ogs_expect_or_return_val(TacRangeItem, NULL);
TacRangeItem->start = ogs_uint24_to_0string(
nf_info->amf.nr_tai_range[i].start[j]);
ogs_expect_or_return_val(TacRangeItem->start, NULL);
TacRangeItem->end =
ogs_uint24_to_0string(
nf_info->amf.nr_tai_range[i].end[j]);
ogs_expect_or_return_val(TacRangeItem->end, NULL);
OpenAPI_list_add(TacRangeList, TacRangeItem);
}
if (!TacRangeList->count) {
OpenAPI_list_free(TacRangeList);
ogs_error("CHECK CONFIGURATION: No Start/End in TacRange");
ogs_expect_or_return_val(0, NULL);
}
TaiRangeItem = ogs_calloc(1, sizeof(*TaiRangeItem));
ogs_expect_or_return_val(TaiRangeItem, NULL);
TaiRangeItem->plmn_id = ogs_sbi_build_plmn_id(
&nf_info->amf.nr_tai_range[i].plmn_id);
ogs_expect_or_return_val(TaiRangeItem->plmn_id, NULL);
TaiRangeItem->tac_range_list = TacRangeList;
OpenAPI_list_add(TaiRangeList, TaiRangeItem);
}
if (TaiRangeList->count)
AmfInfo->tai_range_list = TaiRangeList;
else
OpenAPI_list_free(TaiRangeList);
return AmfInfo;
}
static void free_smf_info(OpenAPI_smf_info_t *SmfInfo)
{
OpenAPI_list_t *sNssaiSmfInfoList = NULL;
@ -705,6 +869,74 @@ static void free_smf_info(OpenAPI_smf_info_t *SmfInfo)
ogs_free(SmfInfo);
}
static void free_amf_info(OpenAPI_amf_info_t *AmfInfo)
{
OpenAPI_list_t *guamiAmfInfoList = NULL;
OpenAPI_guami_t *guamiAmfInfoItem = NULL;
OpenAPI_list_t *TaiList = NULL;
OpenAPI_tai_t *TaiItem = NULL;
OpenAPI_list_t *TaiRangeList = NULL;
OpenAPI_tai_range_t *TaiRangeItem = NULL;
OpenAPI_list_t *TacRangeList = NULL;
OpenAPI_tac_range_t *TacRangeItem = NULL;
OpenAPI_lnode_t *node = NULL, *node2 = NULL;
ogs_assert(AmfInfo);
ogs_free(AmfInfo->amf_set_id);
ogs_free(AmfInfo->amf_region_id);
guamiAmfInfoList = AmfInfo->guami_list;
OpenAPI_list_for_each(guamiAmfInfoList, node) {
guamiAmfInfoItem = node->data;
ogs_assert(guamiAmfInfoItem);
ogs_free(guamiAmfInfoItem);
}
OpenAPI_list_free(guamiAmfInfoList);
TaiList = AmfInfo->tai_list;
OpenAPI_list_for_each(TaiList, node) {
TaiItem = node->data;
ogs_assert(TaiItem);
if (TaiItem->plmn_id)
ogs_sbi_free_plmn_id(TaiItem->plmn_id);
if (TaiItem->tac)
ogs_free(TaiItem->tac);
ogs_free(TaiItem);
}
OpenAPI_list_free(TaiList);
TaiRangeList = AmfInfo->tai_range_list;
OpenAPI_list_for_each(TaiRangeList, node) {
TaiRangeItem = node->data;
ogs_assert(TaiRangeItem);
if (TaiRangeItem->plmn_id)
ogs_sbi_free_plmn_id(TaiRangeItem->plmn_id);
TacRangeList = TaiRangeItem->tac_range_list;
OpenAPI_list_for_each(TacRangeList, node2) {
TacRangeItem = node2->data;
ogs_assert(TacRangeItem);
if (TacRangeItem->start)
ogs_free(TacRangeItem->start);
if (TacRangeItem->end)
ogs_free(TacRangeItem->end);
ogs_free(TacRangeItem);
}
OpenAPI_list_free(TacRangeList);
ogs_free(TaiRangeItem);
}
OpenAPI_list_free(TaiRangeList);
ogs_free(AmfInfo);
}
ogs_sbi_request_t *ogs_nnrf_nfm_build_update(void)
{
ogs_sbi_nf_instance_t *nf_instance = NULL;