VoNR added but not tested!
This commit is contained in:
parent
0ea2142ba6
commit
0fb8279e36
|
@ -41,7 +41,6 @@ example_conf = '''
|
||||||
vonr.yaml
|
vonr.yaml
|
||||||
slice.yaml
|
slice.yaml
|
||||||
srslte.yaml
|
srslte.yaml
|
||||||
sample.yaml
|
|
||||||
non3gpp.yaml
|
non3gpp.yaml
|
||||||
'''.split()
|
'''.split()
|
||||||
|
|
||||||
|
|
|
@ -16,13 +16,13 @@ Open5GS is a C-language Open Source implementation of 5GC and EPC, i.e. the core
|
||||||
- Multiple PDU session
|
- Multiple PDU session
|
||||||
- Handover(5GC Xn/N2 and EPC S1/X2)
|
- Handover(5GC Xn/N2 and EPC S1/X2)
|
||||||
- CSFB(Circuit Switched Fall Back) and SMSoS(SMS Over SGs)
|
- CSFB(Circuit Switched Fall Back) and SMSoS(SMS Over SGs)
|
||||||
- VoLTE(Voice over LTE) with HSS-Cx interface
|
|
||||||
- Support ePDG Interface(SWx, S6b, S2b)
|
- Support ePDG Interface(SWx, S6b, S2b)
|
||||||
|
- VoLTE(Voice over LTE) with HSS-Cx interface
|
||||||
|
- VoNR(Voice over NR)
|
||||||
|
|
||||||
#### Known Limitations
|
#### Known Limitations
|
||||||
---
|
---
|
||||||
|
|
||||||
- No VoNR(Voice over NR)
|
|
||||||
- No Interworking with EPC
|
- No Interworking with EPC
|
||||||
- No NB-IoT
|
- No NB-IoT
|
||||||
- No OCS/OFCS
|
- No OCS/OFCS
|
||||||
|
|
|
@ -726,3 +726,279 @@ void ogs_ims_data_free(ogs_ims_data_t *ims_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int flow_rx_to_gx(ogs_flow_t *rx_flow, ogs_flow_t *gx_flow)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *from_str, *to_str;
|
||||||
|
|
||||||
|
ogs_assert(rx_flow);
|
||||||
|
ogs_assert(gx_flow);
|
||||||
|
|
||||||
|
if (!strncmp(rx_flow->description,
|
||||||
|
"permit out", strlen("permit out"))) {
|
||||||
|
gx_flow->direction = OGS_FLOW_DOWNLINK_ONLY;
|
||||||
|
gx_flow->description = ogs_strdup(rx_flow->description);
|
||||||
|
ogs_assert(gx_flow->description);
|
||||||
|
|
||||||
|
} else if (!strncmp(rx_flow->description,
|
||||||
|
"permit in", strlen("permit in"))) {
|
||||||
|
gx_flow->direction = OGS_FLOW_UPLINK_ONLY;
|
||||||
|
|
||||||
|
/* 'permit in' should be changed
|
||||||
|
* 'permit out' in Gx Diameter */
|
||||||
|
len = strlen(rx_flow->description)+2;
|
||||||
|
gx_flow->description = ogs_malloc(len);
|
||||||
|
ogs_assert(gx_flow->description);
|
||||||
|
strcpy(gx_flow->description, "permit out");
|
||||||
|
from_str = strstr(&rx_flow->description[strlen("permit in")], "from");
|
||||||
|
ogs_assert(from_str);
|
||||||
|
to_str = strstr(&rx_flow->description[strlen("permit in")], "to");
|
||||||
|
ogs_assert(to_str);
|
||||||
|
strncat(gx_flow->description,
|
||||||
|
&rx_flow->description[strlen("permit in")],
|
||||||
|
strlen(rx_flow->description) -
|
||||||
|
strlen("permit in") - strlen(from_str));
|
||||||
|
strcat(gx_flow->description, "from");
|
||||||
|
strcat(gx_flow->description, &to_str[strlen("to")]);
|
||||||
|
strcat(gx_flow->description, " to");
|
||||||
|
strncat(gx_flow->description, &from_str[strlen("from")],
|
||||||
|
strlen(from_str) - strlen(to_str) - strlen("from") - 1);
|
||||||
|
ogs_assert(len == strlen(gx_flow->description)+1);
|
||||||
|
} else {
|
||||||
|
ogs_error("Invalid Flow Descripton : [%s]", rx_flow->description);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ogs_pcc_rule_num_of_flow_equal_to_media(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, ogs_media_component_t *media_component)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
int i, j, k;
|
||||||
|
int matched = 0;
|
||||||
|
int new = 0;
|
||||||
|
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
ogs_assert(media_component);
|
||||||
|
|
||||||
|
for (i = 0; i < media_component->num_of_sub; i++) {
|
||||||
|
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
||||||
|
|
||||||
|
for (j = 0; j < sub->num_of_flow; j++) {
|
||||||
|
new++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new == 0) {
|
||||||
|
/* No new flow in Media-Component */
|
||||||
|
return pcc_rule->num_of_flow;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < media_component->num_of_sub; i++) {
|
||||||
|
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
||||||
|
|
||||||
|
for (j = 0; j < sub->num_of_flow &&
|
||||||
|
j < OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT; j++) {
|
||||||
|
ogs_flow_t gx_flow;
|
||||||
|
ogs_flow_t *rx_flow = &sub->flow[j];
|
||||||
|
|
||||||
|
rv = flow_rx_to_gx(rx_flow, &gx_flow);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("flow reformatting error");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k = 0; k < pcc_rule->num_of_flow; k++) {
|
||||||
|
if (gx_flow.direction == pcc_rule->flow[k].direction &&
|
||||||
|
!strcmp(gx_flow.description,
|
||||||
|
pcc_rule->flow[k].description)) {
|
||||||
|
matched++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OGS_FLOW_FREE(&gx_flow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matched;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ogs_pcc_rule_install_flow_from_media(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, ogs_media_component_t *media_component)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
ogs_assert(media_component);
|
||||||
|
|
||||||
|
/* Remove Flow from PCC Rule */
|
||||||
|
for (i = 0; i < pcc_rule->num_of_flow; i++) {
|
||||||
|
OGS_FLOW_FREE(&pcc_rule->flow[i]);
|
||||||
|
}
|
||||||
|
pcc_rule->num_of_flow = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < media_component->num_of_sub; i++) {
|
||||||
|
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
||||||
|
|
||||||
|
/* Copy Flow to PCC Rule */
|
||||||
|
for (j = 0; j < sub->num_of_flow &&
|
||||||
|
j < OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT; j++) {
|
||||||
|
ogs_flow_t *rx_flow = NULL;
|
||||||
|
ogs_flow_t *gx_flow = NULL;
|
||||||
|
|
||||||
|
if (pcc_rule->num_of_flow < OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE) {
|
||||||
|
rx_flow = &sub->flow[j];
|
||||||
|
gx_flow = &pcc_rule->flow[pcc_rule->num_of_flow];
|
||||||
|
|
||||||
|
rv = flow_rx_to_gx(rx_flow, gx_flow);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("flow reformatting error");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcc_rule->num_of_flow++;
|
||||||
|
} else {
|
||||||
|
ogs_error("Overflow: Number of Flow");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ogs_pcc_rule_update_qos_from_media(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, ogs_media_component_t *media_component)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
ogs_assert(media_component);
|
||||||
|
|
||||||
|
pcc_rule->qos.mbr.downlink = 0;
|
||||||
|
pcc_rule->qos.mbr.uplink = 0;
|
||||||
|
pcc_rule->qos.gbr.downlink = 0;
|
||||||
|
pcc_rule->qos.gbr.uplink = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < media_component->num_of_sub; i++) {
|
||||||
|
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
||||||
|
|
||||||
|
for (j = 0; j < sub->num_of_flow &&
|
||||||
|
j < OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT; j++) {
|
||||||
|
ogs_flow_t gx_flow;
|
||||||
|
ogs_flow_t *rx_flow = &sub->flow[j];
|
||||||
|
|
||||||
|
rv = flow_rx_to_gx(rx_flow, &gx_flow);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("flow reformatting error");
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gx_flow.direction == OGS_FLOW_DOWNLINK_ONLY) {
|
||||||
|
if (sub->flow_usage == OGS_FLOW_USAGE_RTCP) {
|
||||||
|
if (media_component->rr_bandwidth &&
|
||||||
|
media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
(media_component->rr_bandwidth +
|
||||||
|
media_component->rs_bandwidth);
|
||||||
|
} else if (media_component->max_requested_bandwidth_dl) {
|
||||||
|
if (media_component->rr_bandwidth &&
|
||||||
|
!media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
ogs_max(0.05 *
|
||||||
|
media_component->max_requested_bandwidth_dl,
|
||||||
|
media_component->rr_bandwidth);
|
||||||
|
}
|
||||||
|
if (!media_component->rr_bandwidth &&
|
||||||
|
media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
ogs_max(0.05 *
|
||||||
|
media_component->max_requested_bandwidth_dl,
|
||||||
|
media_component->rs_bandwidth);
|
||||||
|
}
|
||||||
|
if (!media_component->rr_bandwidth &&
|
||||||
|
!media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
0.05 *
|
||||||
|
media_component->max_requested_bandwidth_dl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (gx_flow.description) {
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
media_component->max_requested_bandwidth_dl;
|
||||||
|
pcc_rule->qos.gbr.downlink +=
|
||||||
|
media_component->min_requested_bandwidth_dl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (gx_flow.direction == OGS_FLOW_UPLINK_ONLY) {
|
||||||
|
if (sub->flow_usage == OGS_FLOW_USAGE_RTCP) {
|
||||||
|
if (media_component->rr_bandwidth &&
|
||||||
|
media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
(media_component->rr_bandwidth +
|
||||||
|
media_component->rs_bandwidth);
|
||||||
|
} else if (media_component->max_requested_bandwidth_ul) {
|
||||||
|
if (media_component->rr_bandwidth &&
|
||||||
|
!media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
ogs_max(0.05 *
|
||||||
|
media_component->max_requested_bandwidth_ul,
|
||||||
|
media_component->rr_bandwidth);
|
||||||
|
}
|
||||||
|
if (!media_component->rr_bandwidth &&
|
||||||
|
media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
ogs_max(0.05 *
|
||||||
|
media_component->max_requested_bandwidth_ul,
|
||||||
|
media_component->rs_bandwidth);
|
||||||
|
}
|
||||||
|
if (!media_component->rr_bandwidth &&
|
||||||
|
!media_component->rs_bandwidth) {
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
0.05 *
|
||||||
|
media_component->max_requested_bandwidth_ul;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (gx_flow.description) {
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
media_component->max_requested_bandwidth_ul;
|
||||||
|
pcc_rule->qos.gbr.uplink +=
|
||||||
|
media_component->min_requested_bandwidth_ul;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
|
||||||
|
OGS_FLOW_FREE(&gx_flow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcc_rule->qos.mbr.downlink == 0) {
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
media_component->max_requested_bandwidth_dl;
|
||||||
|
pcc_rule->qos.mbr.downlink +=
|
||||||
|
(media_component->rr_bandwidth + media_component->rs_bandwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcc_rule->qos.mbr.uplink == 0) {
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
media_component->max_requested_bandwidth_ul;
|
||||||
|
pcc_rule->qos.mbr.uplink +=
|
||||||
|
(media_component->rr_bandwidth + media_component->rs_bandwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcc_rule->qos.gbr.downlink == 0)
|
||||||
|
pcc_rule->qos.gbr.downlink = pcc_rule->qos.mbr.downlink;
|
||||||
|
if (pcc_rule->qos.gbr.uplink == 0)
|
||||||
|
pcc_rule->qos.gbr.uplink = pcc_rule->qos.mbr.uplink;
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -652,6 +652,25 @@ void ogs_session_data_free(ogs_session_data_t *session_data);
|
||||||
|
|
||||||
typedef struct ogs_media_sub_component_s {
|
typedef struct ogs_media_sub_component_s {
|
||||||
uint32_t flow_number;
|
uint32_t flow_number;
|
||||||
|
/*
|
||||||
|
* TS29.214
|
||||||
|
* 5.3.12 Flow-Usage AVP
|
||||||
|
* NO_INFORMATION(0)
|
||||||
|
* RTCP(1)
|
||||||
|
* AF_SIGNALLING(2)
|
||||||
|
*
|
||||||
|
* TS29.514
|
||||||
|
* 5.6.3.14 Enumeration: FlowUsage
|
||||||
|
* NO_INFO : 1
|
||||||
|
* RTCP : 2
|
||||||
|
* AF_SIGNALLING : 3
|
||||||
|
*
|
||||||
|
* EPC and 5GC have different values for FlowUsage
|
||||||
|
* At this point, we will use the 5GC value.
|
||||||
|
*/
|
||||||
|
#define OGS_FLOW_USAGE_NO_INFO 1
|
||||||
|
#define OGS_FLOW_USAGE_RTCP 2
|
||||||
|
#define OGS_FLOW_USAGE_AF_SIGNALLING 3
|
||||||
uint32_t flow_usage;
|
uint32_t flow_usage;
|
||||||
ogs_flow_t flow[OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT];
|
ogs_flow_t flow[OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT];
|
||||||
int num_of_flow;
|
int num_of_flow;
|
||||||
|
@ -690,6 +709,13 @@ typedef struct ogs_ims_data_s {
|
||||||
|
|
||||||
void ogs_ims_data_free(ogs_ims_data_t *ims_data);
|
void ogs_ims_data_free(ogs_ims_data_t *ims_data);
|
||||||
|
|
||||||
|
int ogs_pcc_rule_num_of_flow_equal_to_media(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, ogs_media_component_t *media_component);
|
||||||
|
int ogs_pcc_rule_install_flow_from_media(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, ogs_media_component_t *media_component);
|
||||||
|
int ogs_pcc_rule_update_qos_from_media(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, ogs_media_component_t *media_component);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -477,7 +477,7 @@ done:
|
||||||
ogs_error("PCC Rule Id has already been defined");
|
ogs_error("PCC Rule Id has already been defined");
|
||||||
ogs_free(pcc_rule->id);
|
ogs_free(pcc_rule->id);
|
||||||
}
|
}
|
||||||
pcc_rule->id = ogs_msprintf("%d", pcc_rule_index+1);
|
pcc_rule->id = ogs_msprintf("%s-n%d", dnn, pcc_rule_index+1);
|
||||||
ogs_assert(pcc_rule->id);
|
ogs_assert(pcc_rule->id);
|
||||||
|
|
||||||
pcc_rule->precedence = pcc_rule_index+1;
|
pcc_rule->precedence = pcc_rule_index+1;
|
||||||
|
|
|
@ -403,7 +403,7 @@ int16_t ogs_gtp_parse_tft(ogs_gtp_tft_t *tft, ogs_tlv_octet_t *octet)
|
||||||
(unsigned char *)octet->data+size+len,
|
(unsigned char *)octet->data+size+len,
|
||||||
sizeof(tft->pf[i].content.component[j].port.low));
|
sizeof(tft->pf[i].content.component[j].port.low));
|
||||||
tft->pf[i].content.component[j].port.low =
|
tft->pf[i].content.component[j].port.low =
|
||||||
htobe16(tft->pf[i].content.component[j].port.low);
|
be16toh(tft->pf[i].content.component[j].port.low);
|
||||||
len += sizeof(tft->pf[i].content.component[j].port.low);
|
len += sizeof(tft->pf[i].content.component[j].port.low);
|
||||||
break;
|
break;
|
||||||
case OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE:
|
case OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE:
|
||||||
|
@ -415,7 +415,7 @@ int16_t ogs_gtp_parse_tft(ogs_gtp_tft_t *tft, ogs_tlv_octet_t *octet)
|
||||||
(unsigned char *)octet->data+size+len,
|
(unsigned char *)octet->data+size+len,
|
||||||
sizeof(tft->pf[i].content.component[j].port.low));
|
sizeof(tft->pf[i].content.component[j].port.low));
|
||||||
tft->pf[i].content.component[j].port.low =
|
tft->pf[i].content.component[j].port.low =
|
||||||
htobe16(tft->pf[i].content.component[j].port.low);
|
be16toh(tft->pf[i].content.component[j].port.low);
|
||||||
len += sizeof(tft->pf[i].content.component[j].port.low);
|
len += sizeof(tft->pf[i].content.component[j].port.low);
|
||||||
|
|
||||||
ogs_assert(size+len+
|
ogs_assert(size+len+
|
||||||
|
@ -425,7 +425,7 @@ int16_t ogs_gtp_parse_tft(ogs_gtp_tft_t *tft, ogs_tlv_octet_t *octet)
|
||||||
(unsigned char *)octet->data+size+len,
|
(unsigned char *)octet->data+size+len,
|
||||||
sizeof(tft->pf[i].content.component[j].port.high));
|
sizeof(tft->pf[i].content.component[j].port.high));
|
||||||
tft->pf[i].content.component[j].port.high =
|
tft->pf[i].content.component[j].port.high =
|
||||||
htobe16(tft->pf[i].content.component[j].port.high);
|
be16toh(tft->pf[i].content.component[j].port.high);
|
||||||
len += sizeof(tft->pf[i].content.component[j].port.high);
|
len += sizeof(tft->pf[i].content.component[j].port.high);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -444,6 +444,77 @@ int ogs_nas_build_qos_flow_descriptions(
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ogs_nas_parse_qos_flow_descriptions(
|
||||||
|
ogs_nas_qos_flow_description_t *description,
|
||||||
|
ogs_nas_qos_flow_descriptions_t *descriptions)
|
||||||
|
{
|
||||||
|
ogs_nas_qos_flow_description_t *first = description;
|
||||||
|
|
||||||
|
char *buffer;
|
||||||
|
uint16_t length, size = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_assert(description);
|
||||||
|
ogs_assert(descriptions);
|
||||||
|
ogs_assert(descriptions->length);
|
||||||
|
length = descriptions->length;
|
||||||
|
ogs_assert(descriptions->buffer);
|
||||||
|
buffer = descriptions->buffer;
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
while (size < length) {
|
||||||
|
memset(description, 0, sizeof(*description));
|
||||||
|
|
||||||
|
ogs_assert(size+3 <= length);
|
||||||
|
memcpy(description, buffer+size, 3);
|
||||||
|
size += 3;
|
||||||
|
|
||||||
|
for (i = 0; i < description->num_of_parameter &&
|
||||||
|
i < OGS_NAS_MAX_NUM_OF_QOS_FLOW_PARAMETER; i++) {
|
||||||
|
ogs_assert(size+sizeof(description->param[i].identifier) <= length);
|
||||||
|
memcpy(&description->param[i].identifier, buffer+size,
|
||||||
|
sizeof(description->param[i].identifier));
|
||||||
|
size += sizeof(description->param[i].identifier);
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(description->param[i].len) <= length);
|
||||||
|
memcpy(&description->param[i].len, buffer+size,
|
||||||
|
sizeof(description->param[i].len));
|
||||||
|
size += sizeof(description->param[i].len);
|
||||||
|
|
||||||
|
switch(description->param[i].identifier) {
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_5QI:
|
||||||
|
ogs_assert(description->param[i].len == 1);
|
||||||
|
ogs_assert(size+description->param[i].len <= length);
|
||||||
|
memcpy(&description->param[i].qos_index,
|
||||||
|
buffer+size, description->param[i].len);
|
||||||
|
size += description->param[i].len;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_UPLINK:
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_DOWNLINK:
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_UPLINK:
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_DOWNLINK:
|
||||||
|
ogs_assert(description->param[i].len == 3);
|
||||||
|
ogs_assert(size+description->param[i].len <= length);
|
||||||
|
memcpy(&description->param[i].br,
|
||||||
|
buffer+size, description->param[i].len);
|
||||||
|
description->param[i].br.value =
|
||||||
|
be16toh(description->param[i].br.value);
|
||||||
|
size += description->param[i].len;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ogs_fatal("Unknown qos_flow parameter identifier [%d]",
|
||||||
|
description->param[i].identifier);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
description++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)(description-first);
|
||||||
|
}
|
||||||
|
|
||||||
int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
ogs_nas_qos_rule_t *rule, int num_of_rule)
|
ogs_nas_qos_rule_t *rule, int num_of_rule)
|
||||||
{
|
{
|
||||||
|
@ -471,7 +542,6 @@ int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
memcpy(buffer + length, &target.identifier, sizeof(target.identifier));
|
memcpy(buffer + length, &target.identifier, sizeof(target.identifier));
|
||||||
length += sizeof(target.identifier);
|
length += sizeof(target.identifier);
|
||||||
|
|
||||||
|
|
||||||
ogs_assert(length + sizeof(target.length) <=
|
ogs_assert(length + sizeof(target.length) <=
|
||||||
OGS_NAS_MAX_QOS_RULES_LEN);
|
OGS_NAS_MAX_QOS_RULES_LEN);
|
||||||
|
|
||||||
|
@ -484,6 +554,16 @@ int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
memcpy(buffer + length, &target.flags, sizeof(target.flags));
|
memcpy(buffer + length, &target.flags, sizeof(target.flags));
|
||||||
length += sizeof(target.flags);
|
length += sizeof(target.flags);
|
||||||
|
|
||||||
|
if (rule->code == OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE ||
|
||||||
|
rule->code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) {
|
||||||
|
if (target.num_of_packet_filter != 0) {
|
||||||
|
ogs_fatal("Invalue QoS rule code[%d] "
|
||||||
|
"and number of packet filter[%d]",
|
||||||
|
rule->code, target.num_of_packet_filter);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < target.num_of_packet_filter &&
|
for (j = 0; j < target.num_of_packet_filter &&
|
||||||
j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) {
|
j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) {
|
||||||
ogs_assert(length + sizeof(target.pf[j].flags) <=
|
ogs_assert(length + sizeof(target.pf[j].flags) <=
|
||||||
|
@ -492,6 +572,10 @@ int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
sizeof(target.pf[j].flags));
|
sizeof(target.pf[j].flags));
|
||||||
length += sizeof(target.pf[j].flags);
|
length += sizeof(target.pf[j].flags);
|
||||||
|
|
||||||
|
if (rule->code ==
|
||||||
|
OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS)
|
||||||
|
continue;
|
||||||
|
|
||||||
ogs_assert(length + sizeof(target.pf[j].content.length) <=
|
ogs_assert(length + sizeof(target.pf[j].content.length) <=
|
||||||
OGS_NAS_MAX_QOS_RULES_LEN);
|
OGS_NAS_MAX_QOS_RULES_LEN);
|
||||||
memcpy(buffer + length, &target.pf[j].content.length,
|
memcpy(buffer + length, &target.pf[j].content.length,
|
||||||
|
@ -625,14 +709,20 @@ int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_assert(length + sizeof(target.precedence) <=
|
if (rule->code != OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE &&
|
||||||
OGS_NAS_MAX_QOS_RULES_LEN);
|
rule->code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS &&
|
||||||
memcpy(buffer + length, &target.precedence, sizeof(target.precedence));
|
rule->code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) {
|
||||||
length += sizeof(target.precedence);
|
ogs_assert(length + sizeof(target.precedence) <=
|
||||||
ogs_assert(length + sizeof(target.flow.flags) <=
|
OGS_NAS_MAX_QOS_RULES_LEN);
|
||||||
OGS_NAS_MAX_QOS_RULES_LEN);
|
memcpy(buffer + length, &target.precedence,
|
||||||
memcpy(buffer + length, &target.flow.flags, sizeof(target.precedence));
|
sizeof(target.precedence));
|
||||||
length += sizeof(target.flow.flags);
|
length += sizeof(target.precedence);
|
||||||
|
ogs_assert(length + sizeof(target.flow.flags) <=
|
||||||
|
OGS_NAS_MAX_QOS_RULES_LEN);
|
||||||
|
memcpy(buffer + length, &target.flow.flags,
|
||||||
|
sizeof(target.flow.flags));
|
||||||
|
length += sizeof(target.flow.flags);
|
||||||
|
}
|
||||||
|
|
||||||
/* Update QoS Rule Length */
|
/* Update QoS Rule Length */
|
||||||
target.length = htobe16(
|
target.length = htobe16(
|
||||||
|
@ -645,3 +735,206 @@ int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ogs_nas_parse_qos_rules(
|
||||||
|
ogs_nas_qos_rule_t *rule, ogs_nas_qos_rules_t *rules)
|
||||||
|
{
|
||||||
|
ogs_nas_qos_rule_t *first = rule;
|
||||||
|
|
||||||
|
char *buffer;
|
||||||
|
uint16_t length, size = 0;
|
||||||
|
int i, j, len = 0;
|
||||||
|
|
||||||
|
ogs_assert(rule);
|
||||||
|
ogs_assert(rules);
|
||||||
|
ogs_assert(rules->length);
|
||||||
|
length = rules->length;
|
||||||
|
ogs_assert(rules->buffer);
|
||||||
|
buffer = rules->buffer;
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
while (size < length) {
|
||||||
|
memset(rule, 0, sizeof(*rule));
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(rule->identifier) <= length);
|
||||||
|
memcpy(&rule->identifier, buffer+size, sizeof(rule->identifier));
|
||||||
|
size += sizeof(rule->identifier);
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(rule->length) <= length);
|
||||||
|
memcpy(&rule->length, buffer+size, sizeof(rule->length));
|
||||||
|
rule->length = be16toh(rule->length);
|
||||||
|
size += sizeof(rule->length);
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(rule->flags) <= length);
|
||||||
|
memcpy(&rule->flags, buffer+size, sizeof(rule->flags));
|
||||||
|
size += sizeof(rule->flags);
|
||||||
|
|
||||||
|
if (rule->code == OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE ||
|
||||||
|
rule->code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) {
|
||||||
|
if (rule->num_of_packet_filter != 0) {
|
||||||
|
ogs_error("Invalue QoS rule code[%d] "
|
||||||
|
"and number of packet filter[%d]",
|
||||||
|
rule->code, rule->num_of_packet_filter);
|
||||||
|
rule->num_of_packet_filter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < rule->num_of_packet_filter &&
|
||||||
|
i < OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) {
|
||||||
|
ogs_assert(size+sizeof(rule->pf[i].flags) <= length);
|
||||||
|
memcpy(&rule->pf[i].flags, buffer+size, sizeof(rule->pf[i].flags));
|
||||||
|
size += sizeof(rule->pf[i].flags);
|
||||||
|
|
||||||
|
if (rule->code ==
|
||||||
|
OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(rule->pf[i].content.length) <= length);
|
||||||
|
memcpy(&rule->pf[i].content.length, buffer+size,
|
||||||
|
sizeof(rule->pf[i].content.length));
|
||||||
|
size += sizeof(rule->pf[i].content.length);
|
||||||
|
|
||||||
|
j = 0; len = 0;
|
||||||
|
while(len < rule->pf[i].content.length) {
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].type) <= length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].type,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].type));
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].type);
|
||||||
|
switch(rule->pf[i].content.component[j].type) {
|
||||||
|
case OGS_PACKET_FILTER_PROTOCOL_IDENTIFIER_NEXT_HEADER_TYPE:
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].proto) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].proto,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].proto));
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].proto);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE:
|
||||||
|
case OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE:
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].ipv4.addr) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].ipv4.addr,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].ipv4.addr));
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].ipv4.addr);
|
||||||
|
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].ipv4.mask) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].ipv4.mask,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].ipv4.mask));
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].ipv4.mask);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE:
|
||||||
|
case OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE:
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].ipv6.addr) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].ipv6.addr,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].ipv6.addr));
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].ipv6.addr);
|
||||||
|
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6.prefixlen) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].ipv6.prefixlen,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6.prefixlen));
|
||||||
|
len += sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6.prefixlen);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_TYPE:
|
||||||
|
case OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE:
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6_mask.addr) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].ipv6_mask.addr,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6_mask.addr));
|
||||||
|
len += sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6_mask.addr);
|
||||||
|
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6_mask.mask) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].ipv6_mask.mask,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6_mask.mask));
|
||||||
|
len += sizeof(
|
||||||
|
rule->pf[i].content.component[j].ipv6_mask.mask);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_SINGLE_LOCAL_PORT_TYPE:
|
||||||
|
case OGS_PACKET_FILTER_SINGLE_REMOTE_PORT_TYPE:
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].port.low) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].port.low,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].port.low));
|
||||||
|
rule->pf[i].content.component[j].port.low =
|
||||||
|
be16toh(rule->pf[i].content.component[j].port.low);
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].port.low);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE:
|
||||||
|
case OGS_PACKET_FILTER_REMOTE_PORT_RANGE_TYPE:
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].port.low) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].port.low,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].port.low));
|
||||||
|
rule->pf[i].content.component[j].port.low =
|
||||||
|
be16toh(rule->pf[i].content.component[j].port.low);
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].port.low);
|
||||||
|
|
||||||
|
ogs_assert(size+len+
|
||||||
|
sizeof(rule->pf[i].content.component[j].port.high) <=
|
||||||
|
length);
|
||||||
|
memcpy(&rule->pf[i].content.component[j].port.high,
|
||||||
|
buffer+size+len,
|
||||||
|
sizeof(rule->pf[i].content.component[j].port.high));
|
||||||
|
rule->pf[i].content.component[j].port.high =
|
||||||
|
be16toh(rule->pf[i].content.component[j].port.high);
|
||||||
|
len += sizeof(rule->pf[i].content.component[j].port.high);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ogs_error("Unknown Packet Filter Type(%d)",
|
||||||
|
rule->pf[i].content.component[j].type);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
rule->pf[i].content.num_of_component = j;
|
||||||
|
size += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule->code != OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE &&
|
||||||
|
rule->code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS &&
|
||||||
|
rule->code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) {
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(rule->precedence) <= length);
|
||||||
|
memcpy(&rule->precedence, buffer+size, sizeof(rule->precedence));
|
||||||
|
size += sizeof(rule->precedence);
|
||||||
|
|
||||||
|
ogs_assert(size+sizeof(rule->flow.flags) <= length);
|
||||||
|
memcpy(&rule->flow.flags, buffer+size, sizeof(rule->flow.flags));
|
||||||
|
size += sizeof(rule->flow.flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
rule++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)(rule-first);
|
||||||
|
}
|
||||||
|
|
|
@ -803,6 +803,10 @@ int ogs_nas_build_qos_flow_descriptions(
|
||||||
ogs_nas_qos_flow_description_t *flow_description,
|
ogs_nas_qos_flow_description_t *flow_description,
|
||||||
int num_of_flow_description);
|
int num_of_flow_description);
|
||||||
|
|
||||||
|
int ogs_nas_parse_qos_flow_descriptions(
|
||||||
|
ogs_nas_qos_flow_description_t *description,
|
||||||
|
ogs_nas_qos_flow_descriptions_t *descriptions);
|
||||||
|
|
||||||
/* 9.11.4.13 QoS rules
|
/* 9.11.4.13 QoS rules
|
||||||
* M LV-E 6-65535 */
|
* M LV-E 6-65535 */
|
||||||
#define OGS_NAS_MAX_NUM_OF_QOS_RULE 8
|
#define OGS_NAS_MAX_NUM_OF_QOS_RULE 8
|
||||||
|
@ -858,6 +862,8 @@ typedef struct ogs_nas_qos_rules_s {
|
||||||
|
|
||||||
int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
int ogs_nas_build_qos_rules(ogs_nas_qos_rules_t *rules,
|
||||||
ogs_nas_qos_rule_t *rule, int num_of_rule);
|
ogs_nas_qos_rule_t *rule, int num_of_rule);
|
||||||
|
int ogs_nas_parse_qos_rules(
|
||||||
|
ogs_nas_qos_rule_t *rule, ogs_nas_qos_rules_t *rules);
|
||||||
|
|
||||||
/* 9.11.4.15 SM PDU DN request container
|
/* 9.11.4.15 SM PDU DN request container
|
||||||
* O TLV 3-255 */
|
* O TLV 3-255 */
|
||||||
|
|
|
@ -443,3 +443,64 @@ void ogs_nas_bitrate_from_uint64(ogs_nas_bitrate_t *nas, uint64_t bitrate)
|
||||||
}
|
}
|
||||||
nas->value = bitrate;
|
nas->value = bitrate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t ogs_nas_bitrate_to_uint64(ogs_nas_bitrate_t *nas_bitrate)
|
||||||
|
{
|
||||||
|
ogs_assert(nas_bitrate);
|
||||||
|
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_1K)
|
||||||
|
return nas_bitrate->value * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_4K)
|
||||||
|
return nas_bitrate->value * 4 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_16K)
|
||||||
|
return nas_bitrate->value * 16 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_64K)
|
||||||
|
return nas_bitrate->value * 64 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_256K)
|
||||||
|
return nas_bitrate->value * 256 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_1M)
|
||||||
|
return nas_bitrate->value * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_4M)
|
||||||
|
return nas_bitrate->value * 4 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_16M)
|
||||||
|
return nas_bitrate->value * 16 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_64M)
|
||||||
|
return nas_bitrate->value * 64 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_256M)
|
||||||
|
return nas_bitrate->value * 256 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_1G)
|
||||||
|
return nas_bitrate->value * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_4G)
|
||||||
|
return nas_bitrate->value * 4 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_16G)
|
||||||
|
return nas_bitrate->value * 16 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_64G)
|
||||||
|
return nas_bitrate->value * 64 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_256G)
|
||||||
|
return nas_bitrate->value * 256 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_1T)
|
||||||
|
return nas_bitrate->value * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_4T)
|
||||||
|
return nas_bitrate->value * 4 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_16T)
|
||||||
|
return nas_bitrate->value * 16 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_64T)
|
||||||
|
return nas_bitrate->value * 64 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_256T)
|
||||||
|
return nas_bitrate->value * 256 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_1P)
|
||||||
|
return nas_bitrate->value * 1024 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_4P)
|
||||||
|
return nas_bitrate->value * 4 * 1024 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_16P)
|
||||||
|
return nas_bitrate->value * 16 * 1024 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_64P)
|
||||||
|
return nas_bitrate->value * 64 * 1024 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
if (nas_bitrate->unit == OGS_NAS_BR_UNIT_256P)
|
||||||
|
return nas_bitrate->value * 256 * 1024 * 1024 * 1024 * 1024 * 1024;
|
||||||
|
|
||||||
|
ogs_fatal("Unknown unit [%d]", nas_bitrate->unit);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -941,6 +941,7 @@ typedef struct ogs_nas_bitrate_s {
|
||||||
|
|
||||||
void ogs_nas_bitrate_from_uint64(
|
void ogs_nas_bitrate_from_uint64(
|
||||||
ogs_nas_bitrate_t *nas_bitrate, uint64_t bitrate);
|
ogs_nas_bitrate_t *nas_bitrate, uint64_t bitrate);
|
||||||
|
uint64_t ogs_nas_bitrate_to_uint64(ogs_nas_bitrate_t *nas_bitrate);
|
||||||
|
|
||||||
typedef struct ogs_nas_session_ambr_s {
|
typedef struct ogs_nas_session_ambr_s {
|
||||||
uint8_t length;
|
uint8_t length;
|
||||||
|
|
|
@ -74,17 +74,27 @@ typedef struct ogs_pfcp_xact_s {
|
||||||
#define OGS_PFCP_MODIFY_DL_ONLY ((uint64_t)1<<1)
|
#define OGS_PFCP_MODIFY_DL_ONLY ((uint64_t)1<<1)
|
||||||
#define OGS_PFCP_MODIFY_UL_ONLY ((uint64_t)1<<2)
|
#define OGS_PFCP_MODIFY_UL_ONLY ((uint64_t)1<<2)
|
||||||
#define OGS_PFCP_MODIFY_INDIRECT ((uint64_t)1<<3)
|
#define OGS_PFCP_MODIFY_INDIRECT ((uint64_t)1<<3)
|
||||||
#define OGS_PFCP_MODIFY_CREATE ((uint64_t)1<<4)
|
#define OGS_PFCP_MODIFY_UE_REQUESTED ((uint64_t)1<<4)
|
||||||
#define OGS_PFCP_MODIFY_REMOVE ((uint64_t)1<<5)
|
#define OGS_PFCP_MODIFY_NETWORK_REQUESTED ((uint64_t)1<<5)
|
||||||
#define OGS_PFCP_MODIFY_TFT_UPDATE ((uint64_t)1<<6)
|
#define OGS_PFCP_MODIFY_CREATE ((uint64_t)1<<6)
|
||||||
#define OGS_PFCP_MODIFY_QOS_UPDATE ((uint64_t)1<<7)
|
#define OGS_PFCP_MODIFY_REMOVE ((uint64_t)1<<7)
|
||||||
#define OGS_PFCP_MODIFY_ACTIVATE ((uint64_t)1<<8)
|
#define OGS_PFCP_MODIFY_EPC_TFT_UPDATE ((uint64_t)1<<8)
|
||||||
#define OGS_PFCP_MODIFY_DEACTIVATE ((uint64_t)1<<9)
|
#define OGS_PFCP_MODIFY_EPC_QOS_UPDATE ((uint64_t)1<<9)
|
||||||
#define OGS_PFCP_MODIFY_END_MARKER ((uint64_t)1<<10)
|
#define OGS_PFCP_MODIFY_TFT_NEW ((uint64_t)1<<10)
|
||||||
#define OGS_PFCP_MODIFY_ERROR_INDICATION ((uint64_t)1<<11)
|
#define OGS_PFCP_MODIFY_TFT_ADD ((uint64_t)1<<11)
|
||||||
#define OGS_PFCP_MODIFY_XN_HANDOVER ((uint64_t)1<<12)
|
#define OGS_PFCP_MODIFY_TFT_REPLACE ((uint64_t)1<<12)
|
||||||
#define OGS_PFCP_MODIFY_N2_HANDOVER ((uint64_t)1<<13)
|
#define OGS_PFCP_MODIFY_TFT_DELETE ((uint64_t)1<<13)
|
||||||
#define OGS_PFCP_MODIFY_HANDOVER_CANCEL ((uint64_t)1<<14)
|
#define OGS_PFCP_MODIFY_QOS_CREATE ((uint64_t)1<<14)
|
||||||
|
#define OGS_PFCP_MODIFY_QOS_MODIFY ((uint64_t)1<<15)
|
||||||
|
#define OGS_PFCP_MODIFY_QOS_DELETE ((uint64_t)1<<16)
|
||||||
|
#define OGS_PFCP_MODIFY_ACTIVATE ((uint64_t)1<<17)
|
||||||
|
#define OGS_PFCP_MODIFY_DEACTIVATE ((uint64_t)1<<18)
|
||||||
|
#define OGS_PFCP_MODIFY_END_MARKER ((uint64_t)1<<19)
|
||||||
|
#define OGS_PFCP_MODIFY_ERROR_INDICATION ((uint64_t)1<<20)
|
||||||
|
#define OGS_PFCP_MODIFY_XN_HANDOVER ((uint64_t)1<<21)
|
||||||
|
#define OGS_PFCP_MODIFY_N2_HANDOVER ((uint64_t)1<<22)
|
||||||
|
#define OGS_PFCP_MODIFY_HANDOVER_CANCEL ((uint64_t)1<<23)
|
||||||
|
|
||||||
uint64_t modify_flags;
|
uint64_t modify_flags;
|
||||||
|
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED 1
|
#define OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED 1
|
||||||
|
|
158
lib/sbi/conv.c
158
lib/sbi/conv.c
|
@ -663,3 +663,161 @@ void ogs_sbi_free_nr_location(OpenAPI_nr_location_t *NrLocation)
|
||||||
|
|
||||||
ogs_free(NrLocation);
|
ogs_free(NrLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OpenAPI_pcc_rule_t *ogs_sbi_build_pcc_rule(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, int flow_presence)
|
||||||
|
{
|
||||||
|
OpenAPI_pcc_rule_t *PccRule = NULL;
|
||||||
|
OpenAPI_list_t *FlowInformationList = NULL;
|
||||||
|
OpenAPI_flow_information_t *FlowInformation = NULL;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
|
||||||
|
PccRule = ogs_calloc(1, sizeof(*PccRule));
|
||||||
|
ogs_assert(PccRule);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At this point, only 1 QosData is used for PccRule.
|
||||||
|
* Therefore, QoS ID uses the same value as PCC Rule ID.
|
||||||
|
*/
|
||||||
|
PccRule->pcc_rule_id = pcc_rule->id;
|
||||||
|
|
||||||
|
PccRule->ref_qos_data = OpenAPI_list_create();
|
||||||
|
ogs_assert(PccRule->ref_qos_data);
|
||||||
|
|
||||||
|
OpenAPI_list_add(PccRule->ref_qos_data, PccRule->pcc_rule_id);
|
||||||
|
|
||||||
|
PccRule->is_precedence = true;
|
||||||
|
PccRule->precedence = pcc_rule->precedence;
|
||||||
|
|
||||||
|
if (flow_presence == 1) {
|
||||||
|
FlowInformationList = OpenAPI_list_create();
|
||||||
|
ogs_assert(FlowInformationList);
|
||||||
|
|
||||||
|
for (i = 0; i < pcc_rule->num_of_flow; i++) {
|
||||||
|
ogs_flow_t *flow = &pcc_rule->flow[i];
|
||||||
|
ogs_assert(flow);
|
||||||
|
|
||||||
|
FlowInformation = ogs_calloc(1, sizeof(*FlowInformation));
|
||||||
|
ogs_assert(FlowInformation);
|
||||||
|
|
||||||
|
if (flow->direction == OGS_FLOW_UPLINK_ONLY)
|
||||||
|
FlowInformation->flow_direction =
|
||||||
|
OpenAPI_flow_direction_UPLINK;
|
||||||
|
else if (flow->direction == OGS_FLOW_DOWNLINK_ONLY)
|
||||||
|
FlowInformation->flow_direction =
|
||||||
|
OpenAPI_flow_direction_DOWNLINK;
|
||||||
|
else {
|
||||||
|
ogs_fatal("Unsupported direction [%d]", flow->direction);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_assert(flow->description);
|
||||||
|
FlowInformation->flow_description = flow->description;
|
||||||
|
|
||||||
|
OpenAPI_list_add(FlowInformationList, FlowInformation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FlowInformationList->count)
|
||||||
|
PccRule->flow_infos = FlowInformationList;
|
||||||
|
else
|
||||||
|
OpenAPI_list_free(FlowInformationList);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PccRule;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_sbi_free_pcc_rule(OpenAPI_pcc_rule_t *PccRule)
|
||||||
|
{
|
||||||
|
OpenAPI_flow_information_t *FlowInformation = NULL;
|
||||||
|
OpenAPI_lnode_t *node = NULL;
|
||||||
|
|
||||||
|
ogs_assert(PccRule);
|
||||||
|
|
||||||
|
if (PccRule->ref_qos_data)
|
||||||
|
OpenAPI_list_free(PccRule->ref_qos_data);
|
||||||
|
if (PccRule->flow_infos) {
|
||||||
|
OpenAPI_list_for_each(PccRule->flow_infos, node) {
|
||||||
|
FlowInformation = node->data;
|
||||||
|
if (FlowInformation) ogs_free(FlowInformation);
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(PccRule->flow_infos);
|
||||||
|
}
|
||||||
|
ogs_free(PccRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenAPI_qos_data_t *ogs_sbi_build_qos_data(ogs_pcc_rule_t *pcc_rule)
|
||||||
|
{
|
||||||
|
OpenAPI_qos_data_t *QosData = NULL;
|
||||||
|
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
|
||||||
|
QosData = ogs_calloc(1, sizeof(*QosData));
|
||||||
|
ogs_assert(QosData);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At this point, only 1 QosData is used for PccRule.
|
||||||
|
* Therefore, QoS ID uses the same value as PCC Rule ID.
|
||||||
|
*/
|
||||||
|
QosData->qos_id = pcc_rule->id;
|
||||||
|
|
||||||
|
QosData->is__5qi = true;
|
||||||
|
QosData->_5qi = pcc_rule->qos.index;
|
||||||
|
QosData->is_priority_level = true;
|
||||||
|
QosData->priority_level = pcc_rule->qos.arp.priority_level;
|
||||||
|
|
||||||
|
QosData->arp = ogs_calloc(1, sizeof(OpenAPI_arp_t));
|
||||||
|
ogs_assert(QosData->arp);
|
||||||
|
|
||||||
|
if (pcc_rule->qos.arp.pre_emption_capability ==
|
||||||
|
OGS_5GC_PRE_EMPTION_ENABLED)
|
||||||
|
QosData->arp->preempt_cap =
|
||||||
|
OpenAPI_preemption_capability_MAY_PREEMPT;
|
||||||
|
else if (pcc_rule->qos.arp.pre_emption_capability ==
|
||||||
|
OGS_5GC_PRE_EMPTION_DISABLED)
|
||||||
|
QosData->arp->preempt_cap =
|
||||||
|
OpenAPI_preemption_capability_NOT_PREEMPT;
|
||||||
|
ogs_assert(pcc_rule->qos.arp.pre_emption_capability);
|
||||||
|
|
||||||
|
if (pcc_rule->qos.arp.pre_emption_vulnerability ==
|
||||||
|
OGS_5GC_PRE_EMPTION_ENABLED)
|
||||||
|
QosData->arp->preempt_vuln =
|
||||||
|
OpenAPI_preemption_vulnerability_PREEMPTABLE;
|
||||||
|
else if (pcc_rule->qos.arp.pre_emption_vulnerability ==
|
||||||
|
OGS_5GC_PRE_EMPTION_DISABLED)
|
||||||
|
QosData->arp->preempt_vuln =
|
||||||
|
OpenAPI_preemption_vulnerability_NOT_PREEMPTABLE;
|
||||||
|
ogs_assert(pcc_rule->qos.arp.pre_emption_vulnerability);
|
||||||
|
QosData->arp->priority_level = pcc_rule->qos.arp.priority_level;
|
||||||
|
|
||||||
|
if (pcc_rule->qos.mbr.uplink)
|
||||||
|
QosData->maxbr_ul = ogs_sbi_bitrate_to_string(
|
||||||
|
pcc_rule->qos.mbr.uplink, OGS_SBI_BITRATE_BPS);
|
||||||
|
if (pcc_rule->qos.mbr.downlink)
|
||||||
|
QosData->maxbr_dl = ogs_sbi_bitrate_to_string(
|
||||||
|
pcc_rule->qos.mbr.downlink, OGS_SBI_BITRATE_BPS);
|
||||||
|
|
||||||
|
if (pcc_rule->qos.gbr.uplink)
|
||||||
|
QosData->gbr_ul = ogs_sbi_bitrate_to_string(
|
||||||
|
pcc_rule->qos.gbr.uplink, OGS_SBI_BITRATE_BPS);
|
||||||
|
if (pcc_rule->qos.gbr.downlink)
|
||||||
|
QosData->gbr_dl = ogs_sbi_bitrate_to_string(
|
||||||
|
pcc_rule->qos.gbr.downlink, OGS_SBI_BITRATE_BPS);
|
||||||
|
|
||||||
|
return QosData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_sbi_free_qos_data(OpenAPI_qos_data_t *QosData)
|
||||||
|
{
|
||||||
|
ogs_assert(QosData);
|
||||||
|
|
||||||
|
if (QosData->arp) ogs_free(QosData->arp);
|
||||||
|
if (QosData->maxbr_ul) ogs_free(QosData->maxbr_ul);
|
||||||
|
if (QosData->maxbr_dl) ogs_free(QosData->maxbr_dl);
|
||||||
|
if (QosData->gbr_ul) ogs_free(QosData->gbr_ul);
|
||||||
|
if (QosData->gbr_dl) ogs_free(QosData->gbr_dl);
|
||||||
|
|
||||||
|
ogs_free(QosData);
|
||||||
|
}
|
||||||
|
|
|
@ -76,6 +76,12 @@ bool ogs_sbi_parse_nr_location(ogs_5gs_tai_t *tai, ogs_nr_cgi_t *nr_cgi,
|
||||||
OpenAPI_nr_location_t *NrLocation);
|
OpenAPI_nr_location_t *NrLocation);
|
||||||
void ogs_sbi_free_nr_location(OpenAPI_nr_location_t *NrLocation);
|
void ogs_sbi_free_nr_location(OpenAPI_nr_location_t *NrLocation);
|
||||||
|
|
||||||
|
OpenAPI_pcc_rule_t *ogs_sbi_build_pcc_rule(
|
||||||
|
ogs_pcc_rule_t *pcc_rule, int flow_presence);
|
||||||
|
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);
|
||||||
|
void ogs_sbi_free_qos_data(OpenAPI_qos_data_t *QosData);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -161,6 +161,12 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message)
|
||||||
OpenAPI_pcf_binding_free(message->PcfBinding);
|
OpenAPI_pcf_binding_free(message->PcfBinding);
|
||||||
if (message->AppSessionContext)
|
if (message->AppSessionContext)
|
||||||
OpenAPI_app_session_context_free(message->AppSessionContext);
|
OpenAPI_app_session_context_free(message->AppSessionContext);
|
||||||
|
if (message->AppSessionContextUpdateDataPatch)
|
||||||
|
OpenAPI_app_session_context_update_data_patch_free(message->AppSessionContextUpdateDataPatch);
|
||||||
|
if (message->SmPolicyNotification)
|
||||||
|
OpenAPI_sm_policy_notification_free(message->SmPolicyNotification);
|
||||||
|
if (message->TerminationNotification)
|
||||||
|
OpenAPI_termination_notification_free(message->TerminationNotification);
|
||||||
|
|
||||||
for (i = 0; i < message->num_of_part; i++) {
|
for (i = 0; i < message->num_of_part; i++) {
|
||||||
if (message->part[i].pkbuf)
|
if (message->part[i].pkbuf)
|
||||||
|
@ -875,6 +881,18 @@ static char *build_json(ogs_sbi_message_t *message)
|
||||||
item = OpenAPI_app_session_context_convertToJSON(
|
item = OpenAPI_app_session_context_convertToJSON(
|
||||||
message->AppSessionContext);
|
message->AppSessionContext);
|
||||||
ogs_assert(item);
|
ogs_assert(item);
|
||||||
|
} else if (message->AppSessionContextUpdateDataPatch) {
|
||||||
|
item = OpenAPI_app_session_context_update_data_patch_convertToJSON(
|
||||||
|
message->AppSessionContextUpdateDataPatch);
|
||||||
|
ogs_assert(item);
|
||||||
|
} else if (message->SmPolicyNotification) {
|
||||||
|
item = OpenAPI_sm_policy_notification_convertToJSON(
|
||||||
|
message->SmPolicyNotification);
|
||||||
|
ogs_assert(item);
|
||||||
|
} else if (message->TerminationNotification) {
|
||||||
|
item = OpenAPI_termination_notification_convertToJSON(
|
||||||
|
message->TerminationNotification);
|
||||||
|
ogs_assert(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
|
@ -1608,14 +1626,30 @@ static int parse_json(ogs_sbi_message_t *message,
|
||||||
SWITCH(message->h.resource.component[0])
|
SWITCH(message->h.resource.component[0])
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_APP_SESSIONS)
|
CASE(OGS_SBI_RESOURCE_NAME_APP_SESSIONS)
|
||||||
if (message->h.resource.component[1]) {
|
if (message->h.resource.component[1]) {
|
||||||
SWITCH(message->h.method)
|
if (message->h.resource.component[2]) {
|
||||||
CASE(OGS_SBI_HTTP_METHOD_DELETE)
|
SWITCH(message->h.resource.component[2])
|
||||||
break;
|
CASE(OGS_SBI_RESOURCE_NAME_DELETE)
|
||||||
DEFAULT
|
/* Nothing */
|
||||||
rv = OGS_ERROR;
|
break;
|
||||||
ogs_error("Unknown method [%s]", message->h.method);
|
DEFAULT
|
||||||
END
|
rv = OGS_ERROR;
|
||||||
break;
|
ogs_error("JSON parse error");
|
||||||
|
END
|
||||||
|
} else {
|
||||||
|
SWITCH(message->h.method)
|
||||||
|
CASE(OGS_SBI_HTTP_METHOD_PATCH)
|
||||||
|
message->AppSessionContextUpdateDataPatch =
|
||||||
|
OpenAPI_app_session_context_update_data_patch_parseFromJSON(item);
|
||||||
|
if (!message->AppSessionContextUpdateDataPatch) {
|
||||||
|
rv = OGS_ERROR;
|
||||||
|
ogs_error("JSON parse error");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
DEFAULT
|
||||||
|
rv = OGS_ERROR;
|
||||||
|
ogs_error("JSON parse error");
|
||||||
|
END
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
SWITCH(message->h.method)
|
SWITCH(message->h.method)
|
||||||
CASE(OGS_SBI_HTTP_METHOD_POST)
|
CASE(OGS_SBI_HTTP_METHOD_POST)
|
||||||
|
@ -1630,14 +1664,12 @@ static int parse_json(ogs_sbi_message_t *message,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
DEFAULT
|
DEFAULT
|
||||||
rv = OGS_ERROR;
|
rv = OGS_ERROR;
|
||||||
ogs_error("Unknown method [%s]", message->h.method);
|
ogs_error("Unknown method [%s]", message->h.method);
|
||||||
END
|
END
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
DEFAULT
|
DEFAULT
|
||||||
rv = OGS_ERROR;
|
rv = OGS_ERROR;
|
||||||
ogs_error("Unknown resource name [%s]",
|
ogs_error("Unknown resource name [%s]",
|
||||||
|
@ -1675,10 +1707,36 @@ static int parse_json(ogs_sbi_message_t *message,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
CASE(OGS_SBI_RESOURCE_NAME_SM_POLICY_NOTIFY)
|
||||||
|
SWITCH(message->h.resource.component[2])
|
||||||
|
CASE(OGS_SBI_RESOURCE_NAME_UPDATE)
|
||||||
|
message->SmPolicyNotification =
|
||||||
|
OpenAPI_sm_policy_notification_parseFromJSON(item);
|
||||||
|
if (!message->SmPolicyNotification) {
|
||||||
|
rv = OGS_ERROR;
|
||||||
|
ogs_error("JSON parse error");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
CASE(OGS_SBI_RESOURCE_NAME_TERMINATE)
|
||||||
|
message->TerminationNotification =
|
||||||
|
OpenAPI_termination_notification_parseFromJSON(item);
|
||||||
|
if (!message->TerminationNotification) {
|
||||||
|
rv = OGS_ERROR;
|
||||||
|
ogs_error("JSON parse error");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
DEFAULT
|
||||||
|
rv = OGS_ERROR;
|
||||||
|
ogs_error("Unknown resource name [%s]",
|
||||||
|
message->h.resource.component[2]);
|
||||||
|
END
|
||||||
|
break;
|
||||||
|
|
||||||
DEFAULT
|
DEFAULT
|
||||||
rv = OGS_ERROR;
|
rv = OGS_ERROR;
|
||||||
ogs_error("Unknown resource name [%s]",
|
ogs_error("Unknown resource name [%s]",
|
||||||
message->h.resource.component[1]);
|
message->h.resource.component[0]);
|
||||||
END
|
END
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -148,6 +148,9 @@ extern "C" {
|
||||||
"npcf-policyauthorization"
|
"npcf-policyauthorization"
|
||||||
#define OGS_SBI_RESOURCE_NAME_APP_SESSIONS "app-sessions"
|
#define OGS_SBI_RESOURCE_NAME_APP_SESSIONS "app-sessions"
|
||||||
#define OGS_SBI_RESOURCE_NAME_NOTIFY "notify"
|
#define OGS_SBI_RESOURCE_NAME_NOTIFY "notify"
|
||||||
|
#define OGS_SBI_SERVICE_NAME_NPCF_CALLBACK "npcf-callback"
|
||||||
|
#define OGS_SBI_RESOURCE_NAME_UPDATE "update"
|
||||||
|
#define OGS_SBI_RESOURCE_NAME_TERMINATE "terminate"
|
||||||
|
|
||||||
#define OGS_SBI_SERVICE_NAME_NNSSF_NSSELECTION "nnssf-nsselection"
|
#define OGS_SBI_SERVICE_NAME_NNSSF_NSSELECTION "nnssf-nsselection"
|
||||||
#define OGS_SBI_RESOURCE_NAME_NETWORK_SLICE_INFORMATION \
|
#define OGS_SBI_RESOURCE_NAME_NETWORK_SLICE_INFORMATION \
|
||||||
|
@ -397,10 +400,13 @@ typedef struct ogs_sbi_message_s {
|
||||||
OpenAPI_sm_policy_decision_t *SmPolicyDecision;
|
OpenAPI_sm_policy_decision_t *SmPolicyDecision;
|
||||||
OpenAPI_sm_policy_data_t *SmPolicyData;
|
OpenAPI_sm_policy_data_t *SmPolicyData;
|
||||||
OpenAPI_sm_policy_delete_data_t *SmPolicyDeleteData;
|
OpenAPI_sm_policy_delete_data_t *SmPolicyDeleteData;
|
||||||
OpenAPI_sm_policy_notification_t *SmPolicyNotification;
|
|
||||||
OpenAPI_authorized_network_slice_info_t *AuthorizedNetworkSliceInfo;
|
OpenAPI_authorized_network_slice_info_t *AuthorizedNetworkSliceInfo;
|
||||||
OpenAPI_pcf_binding_t *PcfBinding;
|
OpenAPI_pcf_binding_t *PcfBinding;
|
||||||
OpenAPI_app_session_context_t *AppSessionContext;
|
OpenAPI_app_session_context_t *AppSessionContext;
|
||||||
|
OpenAPI_app_session_context_update_data_patch_t
|
||||||
|
*AppSessionContextUpdateDataPatch;
|
||||||
|
OpenAPI_sm_policy_notification_t *SmPolicyNotification;
|
||||||
|
OpenAPI_termination_notification_t *TerminationNotification;
|
||||||
|
|
||||||
ogs_sbi_links_t *links;
|
ogs_sbi_links_t *links;
|
||||||
|
|
||||||
|
|
|
@ -68,8 +68,10 @@
|
||||||
#include "model/authorized_network_slice_info.h"
|
#include "model/authorized_network_slice_info.h"
|
||||||
#include "model/pcf_binding.h"
|
#include "model/pcf_binding.h"
|
||||||
#include "model/app_session_context.h"
|
#include "model/app_session_context.h"
|
||||||
|
#include "model/app_session_context_update_data_patch.h"
|
||||||
#include "model/policy_update.h"
|
#include "model/policy_update.h"
|
||||||
#include "model/sm_policy_notification.h"
|
#include "model/sm_policy_notification.h"
|
||||||
|
#include "model/termination_notification.h"
|
||||||
|
|
||||||
#include "custom/links.h"
|
#include "custom/links.h"
|
||||||
#include "custom/ue_authentication_ctx.h"
|
#include "custom/ue_authentication_ctx.h"
|
||||||
|
|
|
@ -59,7 +59,9 @@ cJSON *OpenAPI_acceptable_service_info_convertToJSON(OpenAPI_acceptable_service_
|
||||||
if (acceptable_service_info->acc_bw_med_comps) {
|
if (acceptable_service_info->acc_bw_med_comps) {
|
||||||
OpenAPI_list_for_each(acceptable_service_info->acc_bw_med_comps, acc_bw_med_comps_node) {
|
OpenAPI_list_for_each(acceptable_service_info->acc_bw_med_comps, acc_bw_med_comps_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)acc_bw_med_comps_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)acc_bw_med_comps_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_media_component_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_media_component_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_acceptable_service_info_convertToJSON() failed [acc_bw_med_comps]");
|
ogs_error("OpenAPI_acceptable_service_info_convertToJSON() failed [acc_bw_med_comps]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -103,12 +105,15 @@ OpenAPI_acceptable_service_info_t *OpenAPI_acceptable_service_info_parseFromJSON
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(acc_bw_med_comps_local_map, acc_bw_med_comps) {
|
cJSON_ArrayForEach(acc_bw_med_comps_local_map, acc_bw_med_comps) {
|
||||||
cJSON *localMapObject = acc_bw_med_comps_local_map;
|
cJSON *localMapObject = acc_bw_med_comps_local_map;
|
||||||
if (!cJSON_IsObject(acc_bw_med_comps_local_map)) {
|
if (cJSON_IsObject(acc_bw_med_comps_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_media_component_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(acc_bw_med_comps_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_acceptable_service_info_parseFromJSON() failed [acc_bw_med_comps]");
|
ogs_error("OpenAPI_acceptable_service_info_parseFromJSON() failed [acc_bw_med_comps]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_media_component_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(acc_bw_med_compsList , localMapKeyPair);
|
OpenAPI_list_add(acc_bw_med_compsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,9 @@ cJSON *OpenAPI_am_policy_data_convertToJSON(OpenAPI_am_policy_data_t *am_policy_
|
||||||
if (am_policy_data->pra_infos) {
|
if (am_policy_data->pra_infos) {
|
||||||
OpenAPI_list_for_each(am_policy_data->pra_infos, pra_infos_node) {
|
OpenAPI_list_for_each(am_policy_data->pra_infos, pra_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_am_policy_data_convertToJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_am_policy_data_convertToJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -105,12 +107,15 @@ OpenAPI_am_policy_data_t *OpenAPI_am_policy_data_parseFromJSON(cJSON *am_policy_
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
||||||
cJSON *localMapObject = pra_infos_local_map;
|
cJSON *localMapObject = pra_infos_local_map;
|
||||||
if (!cJSON_IsObject(pra_infos_local_map)) {
|
if (cJSON_IsObject(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_am_policy_data_parseFromJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_am_policy_data_parseFromJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,9 @@ cJSON *OpenAPI_app_session_context_req_data_convertToJSON(OpenAPI_app_session_co
|
||||||
if (app_session_context_req_data->med_components) {
|
if (app_session_context_req_data->med_components) {
|
||||||
OpenAPI_list_for_each(app_session_context_req_data->med_components, med_components_node) {
|
OpenAPI_list_for_each(app_session_context_req_data->med_components, med_components_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_components_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_components_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_media_component_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_media_component_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_app_session_context_req_data_convertToJSON() failed [med_components]");
|
ogs_error("OpenAPI_app_session_context_req_data_convertToJSON() failed [med_components]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -508,12 +510,15 @@ OpenAPI_app_session_context_req_data_t *OpenAPI_app_session_context_req_data_par
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(med_components_local_map, med_components) {
|
cJSON_ArrayForEach(med_components_local_map, med_components) {
|
||||||
cJSON *localMapObject = med_components_local_map;
|
cJSON *localMapObject = med_components_local_map;
|
||||||
if (!cJSON_IsObject(med_components_local_map)) {
|
if (cJSON_IsObject(med_components_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_media_component_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(med_components_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_app_session_context_req_data_parseFromJSON() failed [med_components]");
|
ogs_error("OpenAPI_app_session_context_req_data_parseFromJSON() failed [med_components]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_media_component_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(med_componentsList , localMapKeyPair);
|
OpenAPI_list_add(med_componentsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,7 +167,9 @@ cJSON *OpenAPI_app_session_context_update_data_convertToJSON(OpenAPI_app_session
|
||||||
if (app_session_context_update_data->med_components) {
|
if (app_session_context_update_data->med_components) {
|
||||||
OpenAPI_list_for_each(app_session_context_update_data->med_components, med_components_node) {
|
OpenAPI_list_for_each(app_session_context_update_data->med_components, med_components_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_components_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_components_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_media_component_rm_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_media_component_rm_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_app_session_context_update_data_convertToJSON() failed [med_components]");
|
ogs_error("OpenAPI_app_session_context_update_data_convertToJSON() failed [med_components]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -364,12 +366,15 @@ OpenAPI_app_session_context_update_data_t *OpenAPI_app_session_context_update_da
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(med_components_local_map, med_components) {
|
cJSON_ArrayForEach(med_components_local_map, med_components) {
|
||||||
cJSON *localMapObject = med_components_local_map;
|
cJSON *localMapObject = med_components_local_map;
|
||||||
if (!cJSON_IsObject(med_components_local_map)) {
|
if (cJSON_IsObject(med_components_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_media_component_rm_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(med_components_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_app_session_context_update_data_parseFromJSON() failed [med_components]");
|
ogs_error("OpenAPI_app_session_context_update_data_parseFromJSON() failed [med_components]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_media_component_rm_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(med_componentsList , localMapKeyPair);
|
OpenAPI_list_add(med_componentsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,7 +119,9 @@ cJSON *OpenAPI_area_scope_convertToJSON(OpenAPI_area_scope_t *area_scope)
|
||||||
if (area_scope->tac_info_per_plmn) {
|
if (area_scope->tac_info_per_plmn) {
|
||||||
OpenAPI_list_for_each(area_scope->tac_info_per_plmn, tac_info_per_plmn_node) {
|
OpenAPI_list_for_each(area_scope->tac_info_per_plmn, tac_info_per_plmn_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)tac_info_per_plmn_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)tac_info_per_plmn_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_tac_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_tac_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_area_scope_convertToJSON() failed [tac_info_per_plmn]");
|
ogs_error("OpenAPI_area_scope_convertToJSON() failed [tac_info_per_plmn]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -209,12 +211,15 @@ OpenAPI_area_scope_t *OpenAPI_area_scope_parseFromJSON(cJSON *area_scopeJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(tac_info_per_plmn_local_map, tac_info_per_plmn) {
|
cJSON_ArrayForEach(tac_info_per_plmn_local_map, tac_info_per_plmn) {
|
||||||
cJSON *localMapObject = tac_info_per_plmn_local_map;
|
cJSON *localMapObject = tac_info_per_plmn_local_map;
|
||||||
if (!cJSON_IsObject(tac_info_per_plmn_local_map)) {
|
if (cJSON_IsObject(tac_info_per_plmn_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_tac_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(tac_info_per_plmn_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_area_scope_parseFromJSON() failed [tac_info_per_plmn]");
|
ogs_error("OpenAPI_area_scope_parseFromJSON() failed [tac_info_per_plmn]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_tac_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(tac_info_per_plmnList , localMapKeyPair);
|
OpenAPI_list_add(tac_info_per_plmnList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,9 @@ cJSON *OpenAPI_cag_data_convertToJSON(OpenAPI_cag_data_t *cag_data)
|
||||||
if (cag_data->cag_infos) {
|
if (cag_data->cag_infos) {
|
||||||
OpenAPI_list_for_each(cag_data->cag_infos, cag_infos_node) {
|
OpenAPI_list_for_each(cag_data->cag_infos, cag_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)cag_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)cag_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_cag_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_cag_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_cag_data_convertToJSON() failed [cag_infos]");
|
ogs_error("OpenAPI_cag_data_convertToJSON() failed [cag_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -94,12 +96,15 @@ OpenAPI_cag_data_t *OpenAPI_cag_data_parseFromJSON(cJSON *cag_dataJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(cag_infos_local_map, cag_infos) {
|
cJSON_ArrayForEach(cag_infos_local_map, cag_infos) {
|
||||||
cJSON *localMapObject = cag_infos_local_map;
|
cJSON *localMapObject = cag_infos_local_map;
|
||||||
if (!cJSON_IsObject(cag_infos_local_map)) {
|
if (cJSON_IsObject(cag_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_cag_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(cag_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_cag_data_parseFromJSON() failed [cag_infos]");
|
ogs_error("OpenAPI_cag_data_parseFromJSON() failed [cag_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_cag_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(cag_infosList , localMapKeyPair);
|
OpenAPI_list_add(cag_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,9 @@ cJSON *OpenAPI_cag_data_1_convertToJSON(OpenAPI_cag_data_1_t *cag_data_1)
|
||||||
if (cag_data_1->cag_infos) {
|
if (cag_data_1->cag_infos) {
|
||||||
OpenAPI_list_for_each(cag_data_1->cag_infos, cag_infos_node) {
|
OpenAPI_list_for_each(cag_data_1->cag_infos, cag_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)cag_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)cag_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_cag_info_1_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_cag_info_1_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_cag_data_1_convertToJSON() failed [cag_infos]");
|
ogs_error("OpenAPI_cag_data_1_convertToJSON() failed [cag_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -94,12 +96,15 @@ OpenAPI_cag_data_1_t *OpenAPI_cag_data_1_parseFromJSON(cJSON *cag_data_1JSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(cag_infos_local_map, cag_infos) {
|
cJSON_ArrayForEach(cag_infos_local_map, cag_infos) {
|
||||||
cJSON *localMapObject = cag_infos_local_map;
|
cJSON *localMapObject = cag_infos_local_map;
|
||||||
if (!cJSON_IsObject(cag_infos_local_map)) {
|
if (cJSON_IsObject(cag_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_cag_info_1_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(cag_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_cag_data_1_parseFromJSON() failed [cag_infos]");
|
ogs_error("OpenAPI_cag_data_1_parseFromJSON() failed [cag_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_cag_info_1_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(cag_infosList , localMapKeyPair);
|
OpenAPI_list_add(cag_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,9 @@ cJSON *OpenAPI_eap_session_convertToJSON(OpenAPI_eap_session_t *eap_session)
|
||||||
if (eap_session->_links) {
|
if (eap_session->_links) {
|
||||||
OpenAPI_list_for_each(eap_session->_links, _links_node) {
|
OpenAPI_list_for_each(eap_session->_links, _links_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)_links_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)_links_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_links_value_schema_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_links_value_schema_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_eap_session_convertToJSON() failed [_links]");
|
ogs_error("OpenAPI_eap_session_convertToJSON() failed [_links]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -150,12 +152,15 @@ OpenAPI_eap_session_t *OpenAPI_eap_session_parseFromJSON(cJSON *eap_sessionJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(_links_local_map, _links) {
|
cJSON_ArrayForEach(_links_local_map, _links) {
|
||||||
cJSON *localMapObject = _links_local_map;
|
cJSON *localMapObject = _links_local_map;
|
||||||
if (!cJSON_IsObject(_links_local_map)) {
|
if (cJSON_IsObject(_links_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_links_value_schema_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(_links_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_eap_session_parseFromJSON() failed [_links]");
|
ogs_error("OpenAPI_eap_session_parseFromJSON() failed [_links]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_links_value_schema_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(_linksList , localMapKeyPair);
|
OpenAPI_list_add(_linksList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,9 @@ cJSON *OpenAPI_ee_subscription_convertToJSON(OpenAPI_ee_subscription_t *ee_subsc
|
||||||
if (ee_subscription->monitoring_configurations) {
|
if (ee_subscription->monitoring_configurations) {
|
||||||
OpenAPI_list_for_each(ee_subscription->monitoring_configurations, monitoring_configurations_node) {
|
OpenAPI_list_for_each(ee_subscription->monitoring_configurations, monitoring_configurations_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)monitoring_configurations_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)monitoring_configurations_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_monitoring_configuration_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_monitoring_configuration_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ee_subscription_convertToJSON() failed [monitoring_configurations]");
|
ogs_error("OpenAPI_ee_subscription_convertToJSON() failed [monitoring_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -196,12 +198,15 @@ OpenAPI_ee_subscription_t *OpenAPI_ee_subscription_parseFromJSON(cJSON *ee_subsc
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(monitoring_configurations_local_map, monitoring_configurations) {
|
cJSON_ArrayForEach(monitoring_configurations_local_map, monitoring_configurations) {
|
||||||
cJSON *localMapObject = monitoring_configurations_local_map;
|
cJSON *localMapObject = monitoring_configurations_local_map;
|
||||||
if (!cJSON_IsObject(monitoring_configurations_local_map)) {
|
if (cJSON_IsObject(monitoring_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_monitoring_configuration_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(monitoring_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ee_subscription_parseFromJSON() failed [monitoring_configurations]");
|
ogs_error("OpenAPI_ee_subscription_parseFromJSON() failed [monitoring_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_monitoring_configuration_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(monitoring_configurationsList , localMapKeyPair);
|
OpenAPI_list_add(monitoring_configurationsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,9 @@ cJSON *OpenAPI_eps_interworking_info_convertToJSON(OpenAPI_eps_interworking_info
|
||||||
if (eps_interworking_info->eps_iwk_pgws) {
|
if (eps_interworking_info->eps_iwk_pgws) {
|
||||||
OpenAPI_list_for_each(eps_interworking_info->eps_iwk_pgws, eps_iwk_pgws_node) {
|
OpenAPI_list_for_each(eps_interworking_info->eps_iwk_pgws, eps_iwk_pgws_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)eps_iwk_pgws_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)eps_iwk_pgws_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_eps_iwk_pgw_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_eps_iwk_pgw_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_eps_interworking_info_convertToJSON() failed [eps_iwk_pgws]");
|
ogs_error("OpenAPI_eps_interworking_info_convertToJSON() failed [eps_iwk_pgws]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -83,12 +85,15 @@ OpenAPI_eps_interworking_info_t *OpenAPI_eps_interworking_info_parseFromJSON(cJS
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(eps_iwk_pgws_local_map, eps_iwk_pgws) {
|
cJSON_ArrayForEach(eps_iwk_pgws_local_map, eps_iwk_pgws) {
|
||||||
cJSON *localMapObject = eps_iwk_pgws_local_map;
|
cJSON *localMapObject = eps_iwk_pgws_local_map;
|
||||||
if (!cJSON_IsObject(eps_iwk_pgws_local_map)) {
|
if (cJSON_IsObject(eps_iwk_pgws_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_eps_iwk_pgw_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(eps_iwk_pgws_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_eps_interworking_info_parseFromJSON() failed [eps_iwk_pgws]");
|
ogs_error("OpenAPI_eps_interworking_info_parseFromJSON() failed [eps_iwk_pgws]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_eps_iwk_pgw_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(eps_iwk_pgwsList , localMapKeyPair);
|
OpenAPI_list_add(eps_iwk_pgwsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,9 @@ cJSON *OpenAPI_inline_response_200_convertToJSON(OpenAPI_inline_response_200_t *
|
||||||
if (inline_response_200->_links) {
|
if (inline_response_200->_links) {
|
||||||
OpenAPI_list_for_each(inline_response_200->_links, _links_node) {
|
OpenAPI_list_for_each(inline_response_200->_links, _links_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)_links_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)_links_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_links_value_schema_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_links_value_schema_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_inline_response_200_convertToJSON() failed [_links]");
|
ogs_error("OpenAPI_inline_response_200_convertToJSON() failed [_links]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -83,12 +85,15 @@ OpenAPI_inline_response_200_t *OpenAPI_inline_response_200_parseFromJSON(cJSON *
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(_links_local_map, _links) {
|
cJSON_ArrayForEach(_links_local_map, _links) {
|
||||||
cJSON *localMapObject = _links_local_map;
|
cJSON *localMapObject = _links_local_map;
|
||||||
if (!cJSON_IsObject(_links_local_map)) {
|
if (cJSON_IsObject(_links_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_links_value_schema_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(_links_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_inline_response_200_parseFromJSON() failed [_links]");
|
ogs_error("OpenAPI_inline_response_200_parseFromJSON() failed [_links]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_links_value_schema_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(_linksList , localMapKeyPair);
|
OpenAPI_list_add(_linksList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,9 @@ cJSON *OpenAPI_iptv_config_data_convertToJSON(OpenAPI_iptv_config_data_t *iptv_c
|
||||||
if (iptv_config_data->multi_acc_ctrls) {
|
if (iptv_config_data->multi_acc_ctrls) {
|
||||||
OpenAPI_list_for_each(iptv_config_data->multi_acc_ctrls, multi_acc_ctrls_node) {
|
OpenAPI_list_for_each(iptv_config_data->multi_acc_ctrls, multi_acc_ctrls_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)multi_acc_ctrls_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)multi_acc_ctrls_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_multicast_access_control_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_multicast_access_control_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_iptv_config_data_convertToJSON() failed [multi_acc_ctrls]");
|
ogs_error("OpenAPI_iptv_config_data_convertToJSON() failed [multi_acc_ctrls]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -203,12 +205,15 @@ OpenAPI_iptv_config_data_t *OpenAPI_iptv_config_data_parseFromJSON(cJSON *iptv_c
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(multi_acc_ctrls_local_map, multi_acc_ctrls) {
|
cJSON_ArrayForEach(multi_acc_ctrls_local_map, multi_acc_ctrls) {
|
||||||
cJSON *localMapObject = multi_acc_ctrls_local_map;
|
cJSON *localMapObject = multi_acc_ctrls_local_map;
|
||||||
if (!cJSON_IsObject(multi_acc_ctrls_local_map)) {
|
if (cJSON_IsObject(multi_acc_ctrls_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_multicast_access_control_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(multi_acc_ctrls_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_iptv_config_data_parseFromJSON() failed [multi_acc_ctrls]");
|
ogs_error("OpenAPI_iptv_config_data_parseFromJSON() failed [multi_acc_ctrls]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_multicast_access_control_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(multi_acc_ctrlsList , localMapKeyPair);
|
OpenAPI_list_add(multi_acc_ctrlsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,9 @@ cJSON *OpenAPI_iptv_config_data_patch_convertToJSON(OpenAPI_iptv_config_data_pat
|
||||||
if (iptv_config_data_patch->multi_acc_ctrls) {
|
if (iptv_config_data_patch->multi_acc_ctrls) {
|
||||||
OpenAPI_list_for_each(iptv_config_data_patch->multi_acc_ctrls, multi_acc_ctrls_node) {
|
OpenAPI_list_for_each(iptv_config_data_patch->multi_acc_ctrls, multi_acc_ctrls_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)multi_acc_ctrls_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)multi_acc_ctrls_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_multicast_access_control_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_multicast_access_control_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_iptv_config_data_patch_convertToJSON() failed [multi_acc_ctrls]");
|
ogs_error("OpenAPI_iptv_config_data_patch_convertToJSON() failed [multi_acc_ctrls]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -83,12 +85,15 @@ OpenAPI_iptv_config_data_patch_t *OpenAPI_iptv_config_data_patch_parseFromJSON(c
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(multi_acc_ctrls_local_map, multi_acc_ctrls) {
|
cJSON_ArrayForEach(multi_acc_ctrls_local_map, multi_acc_ctrls) {
|
||||||
cJSON *localMapObject = multi_acc_ctrls_local_map;
|
cJSON *localMapObject = multi_acc_ctrls_local_map;
|
||||||
if (!cJSON_IsObject(multi_acc_ctrls_local_map)) {
|
if (cJSON_IsObject(multi_acc_ctrls_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_multicast_access_control_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(multi_acc_ctrls_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_iptv_config_data_patch_parseFromJSON() failed [multi_acc_ctrls]");
|
ogs_error("OpenAPI_iptv_config_data_patch_parseFromJSON() failed [multi_acc_ctrls]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_multicast_access_control_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(multi_acc_ctrlsList , localMapKeyPair);
|
OpenAPI_list_add(multi_acc_ctrlsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,7 +310,9 @@ cJSON *OpenAPI_media_component_convertToJSON(OpenAPI_media_component_t *media_co
|
||||||
if (media_component->med_sub_comps) {
|
if (media_component->med_sub_comps) {
|
||||||
OpenAPI_list_for_each(media_component->med_sub_comps, med_sub_comps_node) {
|
OpenAPI_list_for_each(media_component->med_sub_comps, med_sub_comps_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_sub_comps_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_sub_comps_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_media_sub_component_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_media_sub_component_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_media_component_convertToJSON() failed [med_sub_comps]");
|
ogs_error("OpenAPI_media_component_convertToJSON() failed [med_sub_comps]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -656,12 +658,15 @@ OpenAPI_media_component_t *OpenAPI_media_component_parseFromJSON(cJSON *media_co
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(med_sub_comps_local_map, med_sub_comps) {
|
cJSON_ArrayForEach(med_sub_comps_local_map, med_sub_comps) {
|
||||||
cJSON *localMapObject = med_sub_comps_local_map;
|
cJSON *localMapObject = med_sub_comps_local_map;
|
||||||
if (!cJSON_IsObject(med_sub_comps_local_map)) {
|
if (cJSON_IsObject(med_sub_comps_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_media_sub_component_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(med_sub_comps_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_media_component_parseFromJSON() failed [med_sub_comps]");
|
ogs_error("OpenAPI_media_component_parseFromJSON() failed [med_sub_comps]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_media_sub_component_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(med_sub_compsList , localMapKeyPair);
|
OpenAPI_list_add(med_sub_compsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,7 +312,9 @@ cJSON *OpenAPI_media_component_rm_convertToJSON(OpenAPI_media_component_rm_t *me
|
||||||
if (media_component_rm->med_sub_comps) {
|
if (media_component_rm->med_sub_comps) {
|
||||||
OpenAPI_list_for_each(media_component_rm->med_sub_comps, med_sub_comps_node) {
|
OpenAPI_list_for_each(media_component_rm->med_sub_comps, med_sub_comps_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_sub_comps_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)med_sub_comps_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_media_sub_component_rm_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_media_sub_component_rm_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_media_component_rm_convertToJSON() failed [med_sub_comps]");
|
ogs_error("OpenAPI_media_component_rm_convertToJSON() failed [med_sub_comps]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -670,12 +672,15 @@ OpenAPI_media_component_rm_t *OpenAPI_media_component_rm_parseFromJSON(cJSON *me
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(med_sub_comps_local_map, med_sub_comps) {
|
cJSON_ArrayForEach(med_sub_comps_local_map, med_sub_comps) {
|
||||||
cJSON *localMapObject = med_sub_comps_local_map;
|
cJSON *localMapObject = med_sub_comps_local_map;
|
||||||
if (!cJSON_IsObject(med_sub_comps_local_map)) {
|
if (cJSON_IsObject(med_sub_comps_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_media_sub_component_rm_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(med_sub_comps_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_media_component_rm_parseFromJSON() failed [med_sub_comps]");
|
ogs_error("OpenAPI_media_component_rm_parseFromJSON() failed [med_sub_comps]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_media_sub_component_rm_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(med_sub_compsList , localMapKeyPair);
|
OpenAPI_list_add(med_sub_compsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -686,7 +686,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->udr_info_list) {
|
if (nf_profile->udr_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->udr_info_list, udr_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->udr_info_list, udr_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)udr_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)udr_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_udr_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_udr_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [udr_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [udr_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -720,7 +722,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->udm_info_list) {
|
if (nf_profile->udm_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->udm_info_list, udm_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->udm_info_list, udm_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)udm_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)udm_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_udm_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_udm_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [udm_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [udm_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -754,7 +758,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->ausf_info_list) {
|
if (nf_profile->ausf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->ausf_info_list, ausf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->ausf_info_list, ausf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ausf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ausf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_ausf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_ausf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [ausf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [ausf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -788,7 +794,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->amf_info_list) {
|
if (nf_profile->amf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->amf_info_list, amf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->amf_info_list, amf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)amf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)amf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_amf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_amf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [amf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [amf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -822,7 +830,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->smf_info_list) {
|
if (nf_profile->smf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->smf_info_list, smf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->smf_info_list, smf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)smf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)smf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_smf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_smf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [smf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [smf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -856,7 +866,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->upf_info_list) {
|
if (nf_profile->upf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->upf_info_list, upf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->upf_info_list, upf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)upf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)upf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_upf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_upf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [upf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [upf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -890,7 +902,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->pcf_info_list) {
|
if (nf_profile->pcf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->pcf_info_list, pcf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->pcf_info_list, pcf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pcf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pcf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_pcf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_pcf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [pcf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [pcf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -924,7 +938,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->bsf_info_list) {
|
if (nf_profile->bsf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->bsf_info_list, bsf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->bsf_info_list, bsf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)bsf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)bsf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_bsf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_bsf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [bsf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [bsf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -958,7 +974,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->chf_info_list) {
|
if (nf_profile->chf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->chf_info_list, chf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->chf_info_list, chf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)chf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)chf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_chf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_chf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [chf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [chf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1018,7 +1036,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->udsf_info_list) {
|
if (nf_profile->udsf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->udsf_info_list, udsf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->udsf_info_list, udsf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)udsf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)udsf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_udsf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_udsf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [udsf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [udsf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1052,7 +1072,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->pcscf_info_list) {
|
if (nf_profile->pcscf_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->pcscf_info_list, pcscf_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->pcscf_info_list, pcscf_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pcscf_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pcscf_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_pcscf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_pcscf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [pcscf_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [pcscf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1073,7 +1095,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->hss_info_list) {
|
if (nf_profile->hss_info_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->hss_info_list, hss_info_list_node) {
|
OpenAPI_list_for_each(nf_profile->hss_info_list, hss_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)hss_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)hss_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_hss_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_hss_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [hss_info_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [hss_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1141,7 +1165,9 @@ cJSON *OpenAPI_nf_profile_convertToJSON(OpenAPI_nf_profile_t *nf_profile)
|
||||||
if (nf_profile->nf_service_list) {
|
if (nf_profile->nf_service_list) {
|
||||||
OpenAPI_list_for_each(nf_profile->nf_service_list, nf_service_list_node) {
|
OpenAPI_list_for_each(nf_profile->nf_service_list, nf_service_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)nf_service_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)nf_service_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_nf_service_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_nf_service_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [nf_service_list]");
|
ogs_error("OpenAPI_nf_profile_convertToJSON() failed [nf_service_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1724,12 +1750,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(udr_info_list_local_map, udr_info_list) {
|
cJSON_ArrayForEach(udr_info_list_local_map, udr_info_list) {
|
||||||
cJSON *localMapObject = udr_info_list_local_map;
|
cJSON *localMapObject = udr_info_list_local_map;
|
||||||
if (!cJSON_IsObject(udr_info_list_local_map)) {
|
if (cJSON_IsObject(udr_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_udr_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(udr_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [udr_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [udr_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_udr_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(udr_info_listList , localMapKeyPair);
|
OpenAPI_list_add(udr_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1754,12 +1783,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(udm_info_list_local_map, udm_info_list) {
|
cJSON_ArrayForEach(udm_info_list_local_map, udm_info_list) {
|
||||||
cJSON *localMapObject = udm_info_list_local_map;
|
cJSON *localMapObject = udm_info_list_local_map;
|
||||||
if (!cJSON_IsObject(udm_info_list_local_map)) {
|
if (cJSON_IsObject(udm_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_udm_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(udm_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [udm_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [udm_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_udm_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(udm_info_listList , localMapKeyPair);
|
OpenAPI_list_add(udm_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1784,12 +1816,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(ausf_info_list_local_map, ausf_info_list) {
|
cJSON_ArrayForEach(ausf_info_list_local_map, ausf_info_list) {
|
||||||
cJSON *localMapObject = ausf_info_list_local_map;
|
cJSON *localMapObject = ausf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(ausf_info_list_local_map)) {
|
if (cJSON_IsObject(ausf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_ausf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(ausf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [ausf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [ausf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_ausf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(ausf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(ausf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1814,12 +1849,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(amf_info_list_local_map, amf_info_list) {
|
cJSON_ArrayForEach(amf_info_list_local_map, amf_info_list) {
|
||||||
cJSON *localMapObject = amf_info_list_local_map;
|
cJSON *localMapObject = amf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(amf_info_list_local_map)) {
|
if (cJSON_IsObject(amf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_amf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(amf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [amf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [amf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_amf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(amf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(amf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1844,12 +1882,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(smf_info_list_local_map, smf_info_list) {
|
cJSON_ArrayForEach(smf_info_list_local_map, smf_info_list) {
|
||||||
cJSON *localMapObject = smf_info_list_local_map;
|
cJSON *localMapObject = smf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(smf_info_list_local_map)) {
|
if (cJSON_IsObject(smf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_smf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(smf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [smf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [smf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_smf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(smf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(smf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1874,12 +1915,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(upf_info_list_local_map, upf_info_list) {
|
cJSON_ArrayForEach(upf_info_list_local_map, upf_info_list) {
|
||||||
cJSON *localMapObject = upf_info_list_local_map;
|
cJSON *localMapObject = upf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(upf_info_list_local_map)) {
|
if (cJSON_IsObject(upf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_upf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(upf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [upf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [upf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_upf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(upf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(upf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1904,12 +1948,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pcf_info_list_local_map, pcf_info_list) {
|
cJSON_ArrayForEach(pcf_info_list_local_map, pcf_info_list) {
|
||||||
cJSON *localMapObject = pcf_info_list_local_map;
|
cJSON *localMapObject = pcf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(pcf_info_list_local_map)) {
|
if (cJSON_IsObject(pcf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_pcf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pcf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [pcf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [pcf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_pcf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pcf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(pcf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1934,12 +1981,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(bsf_info_list_local_map, bsf_info_list) {
|
cJSON_ArrayForEach(bsf_info_list_local_map, bsf_info_list) {
|
||||||
cJSON *localMapObject = bsf_info_list_local_map;
|
cJSON *localMapObject = bsf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(bsf_info_list_local_map)) {
|
if (cJSON_IsObject(bsf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_bsf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(bsf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [bsf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [bsf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_bsf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(bsf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(bsf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1964,12 +2014,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(chf_info_list_local_map, chf_info_list) {
|
cJSON_ArrayForEach(chf_info_list_local_map, chf_info_list) {
|
||||||
cJSON *localMapObject = chf_info_list_local_map;
|
cJSON *localMapObject = chf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(chf_info_list_local_map)) {
|
if (cJSON_IsObject(chf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_chf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(chf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [chf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [chf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_chf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(chf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(chf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2008,12 +2061,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(udsf_info_list_local_map, udsf_info_list) {
|
cJSON_ArrayForEach(udsf_info_list_local_map, udsf_info_list) {
|
||||||
cJSON *localMapObject = udsf_info_list_local_map;
|
cJSON *localMapObject = udsf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(udsf_info_list_local_map)) {
|
if (cJSON_IsObject(udsf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_udsf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(udsf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [udsf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [udsf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_udsf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(udsf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(udsf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2038,12 +2094,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pcscf_info_list_local_map, pcscf_info_list) {
|
cJSON_ArrayForEach(pcscf_info_list_local_map, pcscf_info_list) {
|
||||||
cJSON *localMapObject = pcscf_info_list_local_map;
|
cJSON *localMapObject = pcscf_info_list_local_map;
|
||||||
if (!cJSON_IsObject(pcscf_info_list_local_map)) {
|
if (cJSON_IsObject(pcscf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_pcscf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pcscf_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [pcscf_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [pcscf_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_pcscf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pcscf_info_listList , localMapKeyPair);
|
OpenAPI_list_add(pcscf_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2061,12 +2120,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(hss_info_list_local_map, hss_info_list) {
|
cJSON_ArrayForEach(hss_info_list_local_map, hss_info_list) {
|
||||||
cJSON *localMapObject = hss_info_list_local_map;
|
cJSON *localMapObject = hss_info_list_local_map;
|
||||||
if (!cJSON_IsObject(hss_info_list_local_map)) {
|
if (cJSON_IsObject(hss_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_hss_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(hss_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [hss_info_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [hss_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_hss_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(hss_info_listList , localMapKeyPair);
|
OpenAPI_list_add(hss_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2132,12 +2194,15 @@ OpenAPI_nf_profile_t *OpenAPI_nf_profile_parseFromJSON(cJSON *nf_profileJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(nf_service_list_local_map, nf_service_list) {
|
cJSON_ArrayForEach(nf_service_list_local_map, nf_service_list) {
|
||||||
cJSON *localMapObject = nf_service_list_local_map;
|
cJSON *localMapObject = nf_service_list_local_map;
|
||||||
if (!cJSON_IsObject(nf_service_list_local_map)) {
|
if (cJSON_IsObject(nf_service_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_nf_service_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(nf_service_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [nf_service_list]");
|
ogs_error("OpenAPI_nf_profile_parseFromJSON() failed [nf_service_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_nf_service_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(nf_service_listList , localMapKeyPair);
|
OpenAPI_list_add(nf_service_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,7 +269,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_udr_info) {
|
if (nrf_info->served_udr_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_udr_info, served_udr_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_udr_info, served_udr_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_udr_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_udr_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_udr_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_udr_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_udr_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_udr_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -305,7 +307,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_udm_info) {
|
if (nrf_info->served_udm_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_udm_info, served_udm_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_udm_info, served_udm_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_udm_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_udm_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_udm_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_udm_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_udm_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_udm_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -341,7 +345,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_ausf_info) {
|
if (nrf_info->served_ausf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_ausf_info, served_ausf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_ausf_info, served_ausf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_ausf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_ausf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_ausf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_ausf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_ausf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_ausf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -377,7 +383,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_amf_info) {
|
if (nrf_info->served_amf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_amf_info, served_amf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_amf_info, served_amf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_amf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_amf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_amf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_amf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_amf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_amf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -413,7 +421,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_smf_info) {
|
if (nrf_info->served_smf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_smf_info, served_smf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_smf_info, served_smf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_smf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_smf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_smf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_smf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_smf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_smf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -449,7 +459,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_upf_info) {
|
if (nrf_info->served_upf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_upf_info, served_upf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_upf_info, served_upf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_upf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_upf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_upf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_upf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_upf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_upf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -485,7 +497,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_pcf_info) {
|
if (nrf_info->served_pcf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_pcf_info, served_pcf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_pcf_info, served_pcf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_pcf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_pcf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_pcf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_pcf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_pcf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_pcf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -521,7 +535,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_bsf_info) {
|
if (nrf_info->served_bsf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_bsf_info, served_bsf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_bsf_info, served_bsf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_bsf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_bsf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_bsf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_bsf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_bsf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_bsf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -557,7 +573,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_chf_info) {
|
if (nrf_info->served_chf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_chf_info, served_chf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_chf_info, served_chf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_chf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_chf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_chf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_chf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_chf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_chf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -593,7 +611,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_nef_info) {
|
if (nrf_info->served_nef_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_nef_info, served_nef_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_nef_info, served_nef_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_nef_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_nef_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_nef_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_nef_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_nef_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_nef_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -614,7 +634,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_nwdaf_info) {
|
if (nrf_info->served_nwdaf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_nwdaf_info, served_nwdaf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_nwdaf_info, served_nwdaf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_nwdaf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_nwdaf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_nwdaf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_nwdaf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_nwdaf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_nwdaf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -650,7 +672,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_gmlc_info) {
|
if (nrf_info->served_gmlc_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_gmlc_info, served_gmlc_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_gmlc_info, served_gmlc_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_gmlc_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_gmlc_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_gmlc_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_gmlc_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_gmlc_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_gmlc_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -671,7 +695,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_lmf_info) {
|
if (nrf_info->served_lmf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_lmf_info, served_lmf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_lmf_info, served_lmf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_lmf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_lmf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_lmf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_lmf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_lmf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_lmf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -692,7 +718,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_nf_info) {
|
if (nrf_info->served_nf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_nf_info, served_nf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_nf_info, served_nf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_nf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_nf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_nf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_nf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_nf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_nf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -728,7 +756,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_udsf_info) {
|
if (nrf_info->served_udsf_info) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_udsf_info, served_udsf_info_node) {
|
OpenAPI_list_for_each(nrf_info->served_udsf_info, served_udsf_info_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_udsf_info_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_udsf_info_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_udsf_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_udsf_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_udsf_info]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_udsf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -764,7 +794,9 @@ cJSON *OpenAPI_nrf_info_convertToJSON(OpenAPI_nrf_info_t *nrf_info)
|
||||||
if (nrf_info->served_scp_info_list) {
|
if (nrf_info->served_scp_info_list) {
|
||||||
OpenAPI_list_for_each(nrf_info->served_scp_info_list, served_scp_info_list_node) {
|
OpenAPI_list_for_each(nrf_info->served_scp_info_list, served_scp_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_scp_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)served_scp_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_scp_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_scp_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_scp_info_list]");
|
ogs_error("OpenAPI_nrf_info_convertToJSON() failed [served_scp_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -794,12 +826,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_udr_info_local_map, served_udr_info) {
|
cJSON_ArrayForEach(served_udr_info_local_map, served_udr_info) {
|
||||||
cJSON *localMapObject = served_udr_info_local_map;
|
cJSON *localMapObject = served_udr_info_local_map;
|
||||||
if (!cJSON_IsObject(served_udr_info_local_map)) {
|
if (cJSON_IsObject(served_udr_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_udr_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_udr_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_udr_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_udr_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_udr_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_udr_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_udr_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -834,12 +869,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_udm_info_local_map, served_udm_info) {
|
cJSON_ArrayForEach(served_udm_info_local_map, served_udm_info) {
|
||||||
cJSON *localMapObject = served_udm_info_local_map;
|
cJSON *localMapObject = served_udm_info_local_map;
|
||||||
if (!cJSON_IsObject(served_udm_info_local_map)) {
|
if (cJSON_IsObject(served_udm_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_udm_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_udm_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_udm_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_udm_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_udm_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_udm_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_udm_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -874,12 +912,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_ausf_info_local_map, served_ausf_info) {
|
cJSON_ArrayForEach(served_ausf_info_local_map, served_ausf_info) {
|
||||||
cJSON *localMapObject = served_ausf_info_local_map;
|
cJSON *localMapObject = served_ausf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_ausf_info_local_map)) {
|
if (cJSON_IsObject(served_ausf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_ausf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_ausf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_ausf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_ausf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_ausf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_ausf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_ausf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -914,12 +955,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_amf_info_local_map, served_amf_info) {
|
cJSON_ArrayForEach(served_amf_info_local_map, served_amf_info) {
|
||||||
cJSON *localMapObject = served_amf_info_local_map;
|
cJSON *localMapObject = served_amf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_amf_info_local_map)) {
|
if (cJSON_IsObject(served_amf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_amf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_amf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_amf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_amf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_amf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_amf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_amf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -954,12 +998,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_smf_info_local_map, served_smf_info) {
|
cJSON_ArrayForEach(served_smf_info_local_map, served_smf_info) {
|
||||||
cJSON *localMapObject = served_smf_info_local_map;
|
cJSON *localMapObject = served_smf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_smf_info_local_map)) {
|
if (cJSON_IsObject(served_smf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_smf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_smf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_smf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_smf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_smf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_smf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_smf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -994,12 +1041,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_upf_info_local_map, served_upf_info) {
|
cJSON_ArrayForEach(served_upf_info_local_map, served_upf_info) {
|
||||||
cJSON *localMapObject = served_upf_info_local_map;
|
cJSON *localMapObject = served_upf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_upf_info_local_map)) {
|
if (cJSON_IsObject(served_upf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_upf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_upf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_upf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_upf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_upf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_upf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_upf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1034,12 +1084,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_pcf_info_local_map, served_pcf_info) {
|
cJSON_ArrayForEach(served_pcf_info_local_map, served_pcf_info) {
|
||||||
cJSON *localMapObject = served_pcf_info_local_map;
|
cJSON *localMapObject = served_pcf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_pcf_info_local_map)) {
|
if (cJSON_IsObject(served_pcf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_pcf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_pcf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_pcf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_pcf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_pcf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_pcf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_pcf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1074,12 +1127,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_bsf_info_local_map, served_bsf_info) {
|
cJSON_ArrayForEach(served_bsf_info_local_map, served_bsf_info) {
|
||||||
cJSON *localMapObject = served_bsf_info_local_map;
|
cJSON *localMapObject = served_bsf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_bsf_info_local_map)) {
|
if (cJSON_IsObject(served_bsf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_bsf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_bsf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_bsf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_bsf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_bsf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_bsf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_bsf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1114,12 +1170,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_chf_info_local_map, served_chf_info) {
|
cJSON_ArrayForEach(served_chf_info_local_map, served_chf_info) {
|
||||||
cJSON *localMapObject = served_chf_info_local_map;
|
cJSON *localMapObject = served_chf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_chf_info_local_map)) {
|
if (cJSON_IsObject(served_chf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_chf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_chf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_chf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_chf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_chf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_chf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_chf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1154,12 +1213,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_nef_info_local_map, served_nef_info) {
|
cJSON_ArrayForEach(served_nef_info_local_map, served_nef_info) {
|
||||||
cJSON *localMapObject = served_nef_info_local_map;
|
cJSON *localMapObject = served_nef_info_local_map;
|
||||||
if (!cJSON_IsObject(served_nef_info_local_map)) {
|
if (cJSON_IsObject(served_nef_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_nef_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_nef_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_nef_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_nef_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_nef_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_nef_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_nef_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1177,12 +1239,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_nwdaf_info_local_map, served_nwdaf_info) {
|
cJSON_ArrayForEach(served_nwdaf_info_local_map, served_nwdaf_info) {
|
||||||
cJSON *localMapObject = served_nwdaf_info_local_map;
|
cJSON *localMapObject = served_nwdaf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_nwdaf_info_local_map)) {
|
if (cJSON_IsObject(served_nwdaf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_nwdaf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_nwdaf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_nwdaf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_nwdaf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_nwdaf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_nwdaf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_nwdaf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1217,12 +1282,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_gmlc_info_local_map, served_gmlc_info) {
|
cJSON_ArrayForEach(served_gmlc_info_local_map, served_gmlc_info) {
|
||||||
cJSON *localMapObject = served_gmlc_info_local_map;
|
cJSON *localMapObject = served_gmlc_info_local_map;
|
||||||
if (!cJSON_IsObject(served_gmlc_info_local_map)) {
|
if (cJSON_IsObject(served_gmlc_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_gmlc_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_gmlc_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_gmlc_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_gmlc_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_gmlc_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_gmlc_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_gmlc_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1240,12 +1308,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_lmf_info_local_map, served_lmf_info) {
|
cJSON_ArrayForEach(served_lmf_info_local_map, served_lmf_info) {
|
||||||
cJSON *localMapObject = served_lmf_info_local_map;
|
cJSON *localMapObject = served_lmf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_lmf_info_local_map)) {
|
if (cJSON_IsObject(served_lmf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_lmf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_lmf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_lmf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_lmf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_lmf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_lmf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_lmf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1263,12 +1334,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_nf_info_local_map, served_nf_info) {
|
cJSON_ArrayForEach(served_nf_info_local_map, served_nf_info) {
|
||||||
cJSON *localMapObject = served_nf_info_local_map;
|
cJSON *localMapObject = served_nf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_nf_info_local_map)) {
|
if (cJSON_IsObject(served_nf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_nf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_nf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_nf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_nf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_nf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_nf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_nf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1303,12 +1377,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_udsf_info_local_map, served_udsf_info) {
|
cJSON_ArrayForEach(served_udsf_info_local_map, served_udsf_info) {
|
||||||
cJSON *localMapObject = served_udsf_info_local_map;
|
cJSON *localMapObject = served_udsf_info_local_map;
|
||||||
if (!cJSON_IsObject(served_udsf_info_local_map)) {
|
if (cJSON_IsObject(served_udsf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_udsf_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_udsf_info_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_udsf_info]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_udsf_info]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_udsf_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_udsf_infoList , localMapKeyPair);
|
OpenAPI_list_add(served_udsf_infoList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1343,12 +1420,15 @@ OpenAPI_nrf_info_t *OpenAPI_nrf_info_parseFromJSON(cJSON *nrf_infoJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(served_scp_info_list_local_map, served_scp_info_list) {
|
cJSON_ArrayForEach(served_scp_info_list_local_map, served_scp_info_list) {
|
||||||
cJSON *localMapObject = served_scp_info_list_local_map;
|
cJSON *localMapObject = served_scp_info_list_local_map;
|
||||||
if (!cJSON_IsObject(served_scp_info_list_local_map)) {
|
if (cJSON_IsObject(served_scp_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_scp_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(served_scp_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_scp_info_list]");
|
ogs_error("OpenAPI_nrf_info_parseFromJSON() failed [served_scp_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_scp_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(served_scp_info_listList , localMapKeyPair);
|
OpenAPI_list_add(served_scp_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,7 +123,9 @@ cJSON *OpenAPI_nssai_convertToJSON(OpenAPI_nssai_t *nssai)
|
||||||
if (nssai->additional_snssai_data) {
|
if (nssai->additional_snssai_data) {
|
||||||
OpenAPI_list_for_each(nssai->additional_snssai_data, additional_snssai_data_node) {
|
OpenAPI_list_for_each(nssai->additional_snssai_data, additional_snssai_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)additional_snssai_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)additional_snssai_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_additional_snssai_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_additional_snssai_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nssai_convertToJSON() failed [additional_snssai_data]");
|
ogs_error("OpenAPI_nssai_convertToJSON() failed [additional_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -219,12 +221,15 @@ OpenAPI_nssai_t *OpenAPI_nssai_parseFromJSON(cJSON *nssaiJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(additional_snssai_data_local_map, additional_snssai_data) {
|
cJSON_ArrayForEach(additional_snssai_data_local_map, additional_snssai_data) {
|
||||||
cJSON *localMapObject = additional_snssai_data_local_map;
|
cJSON *localMapObject = additional_snssai_data_local_map;
|
||||||
if (!cJSON_IsObject(additional_snssai_data_local_map)) {
|
if (cJSON_IsObject(additional_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_additional_snssai_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(additional_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nssai_parseFromJSON() failed [additional_snssai_data]");
|
ogs_error("OpenAPI_nssai_parseFromJSON() failed [additional_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_additional_snssai_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(additional_snssai_dataList , localMapKeyPair);
|
OpenAPI_list_add(additional_snssai_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,7 +123,9 @@ cJSON *OpenAPI_nssai_1_convertToJSON(OpenAPI_nssai_1_t *nssai_1)
|
||||||
if (nssai_1->additional_snssai_data) {
|
if (nssai_1->additional_snssai_data) {
|
||||||
OpenAPI_list_for_each(nssai_1->additional_snssai_data, additional_snssai_data_node) {
|
OpenAPI_list_for_each(nssai_1->additional_snssai_data, additional_snssai_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)additional_snssai_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)additional_snssai_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_additional_snssai_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_additional_snssai_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_nssai_1_convertToJSON() failed [additional_snssai_data]");
|
ogs_error("OpenAPI_nssai_1_convertToJSON() failed [additional_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -219,12 +221,15 @@ OpenAPI_nssai_1_t *OpenAPI_nssai_1_parseFromJSON(cJSON *nssai_1JSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(additional_snssai_data_local_map, additional_snssai_data) {
|
cJSON_ArrayForEach(additional_snssai_data_local_map, additional_snssai_data) {
|
||||||
cJSON *localMapObject = additional_snssai_data_local_map;
|
cJSON *localMapObject = additional_snssai_data_local_map;
|
||||||
if (!cJSON_IsObject(additional_snssai_data_local_map)) {
|
if (cJSON_IsObject(additional_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_additional_snssai_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(additional_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_nssai_1_parseFromJSON() failed [additional_snssai_data]");
|
ogs_error("OpenAPI_nssai_1_parseFromJSON() failed [additional_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_additional_snssai_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(additional_snssai_dataList , localMapKeyPair);
|
OpenAPI_list_add(additional_snssai_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,9 @@ cJSON *OpenAPI_policy_association_convertToJSON(OpenAPI_policy_association_t *po
|
||||||
if (policy_association->pras) {
|
if (policy_association->pras) {
|
||||||
OpenAPI_list_for_each(policy_association->pras, pras_node) {
|
OpenAPI_list_for_each(policy_association->pras, pras_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pras_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pras_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_policy_association_convertToJSON() failed [pras]");
|
ogs_error("OpenAPI_policy_association_convertToJSON() failed [pras]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -266,12 +268,15 @@ OpenAPI_policy_association_t *OpenAPI_policy_association_parseFromJSON(cJSON *po
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pras_local_map, pras) {
|
cJSON_ArrayForEach(pras_local_map, pras) {
|
||||||
cJSON *localMapObject = pras_local_map;
|
cJSON *localMapObject = pras_local_map;
|
||||||
if (!cJSON_IsObject(pras_local_map)) {
|
if (cJSON_IsObject(pras_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pras_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_policy_association_parseFromJSON() failed [pras]");
|
ogs_error("OpenAPI_policy_association_parseFromJSON() failed [pras]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(prasList , localMapKeyPair);
|
OpenAPI_list_add(prasList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -255,7 +255,9 @@ cJSON *OpenAPI_policy_association_update_request_convertToJSON(OpenAPI_policy_as
|
||||||
if (policy_association_update_request->pra_statuses) {
|
if (policy_association_update_request->pra_statuses) {
|
||||||
OpenAPI_list_for_each(policy_association_update_request->pra_statuses, pra_statuses_node) {
|
OpenAPI_list_for_each(policy_association_update_request->pra_statuses, pra_statuses_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_statuses_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_statuses_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_policy_association_update_request_convertToJSON() failed [pra_statuses]");
|
ogs_error("OpenAPI_policy_association_update_request_convertToJSON() failed [pra_statuses]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -542,12 +544,15 @@ OpenAPI_policy_association_update_request_t *OpenAPI_policy_association_update_r
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pra_statuses_local_map, pra_statuses) {
|
cJSON_ArrayForEach(pra_statuses_local_map, pra_statuses) {
|
||||||
cJSON *localMapObject = pra_statuses_local_map;
|
cJSON *localMapObject = pra_statuses_local_map;
|
||||||
if (!cJSON_IsObject(pra_statuses_local_map)) {
|
if (cJSON_IsObject(pra_statuses_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pra_statuses_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_policy_association_update_request_parseFromJSON() failed [pra_statuses]");
|
ogs_error("OpenAPI_policy_association_update_request_parseFromJSON() failed [pra_statuses]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pra_statusesList , localMapKeyPair);
|
OpenAPI_list_add(pra_statusesList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,7 +211,9 @@ cJSON *OpenAPI_policy_data_change_notification_convertToJSON(OpenAPI_policy_data
|
||||||
if (policy_data_change_notification->op_spec_data_map) {
|
if (policy_data_change_notification->op_spec_data_map) {
|
||||||
OpenAPI_list_for_each(policy_data_change_notification->op_spec_data_map, op_spec_data_map_node) {
|
OpenAPI_list_for_each(policy_data_change_notification->op_spec_data_map, op_spec_data_map_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)op_spec_data_map_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)op_spec_data_map_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_operator_specific_data_container_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_operator_specific_data_container_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_policy_data_change_notification_convertToJSON() failed [op_spec_data_map]");
|
ogs_error("OpenAPI_policy_data_change_notification_convertToJSON() failed [op_spec_data_map]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -381,12 +383,15 @@ OpenAPI_policy_data_change_notification_t *OpenAPI_policy_data_change_notificati
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(op_spec_data_map_local_map, op_spec_data_map) {
|
cJSON_ArrayForEach(op_spec_data_map_local_map, op_spec_data_map) {
|
||||||
cJSON *localMapObject = op_spec_data_map_local_map;
|
cJSON *localMapObject = op_spec_data_map_local_map;
|
||||||
if (!cJSON_IsObject(op_spec_data_map_local_map)) {
|
if (cJSON_IsObject(op_spec_data_map_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_operator_specific_data_container_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(op_spec_data_map_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_policy_data_change_notification_parseFromJSON() failed [op_spec_data_map]");
|
ogs_error("OpenAPI_policy_data_change_notification_parseFromJSON() failed [op_spec_data_map]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_operator_specific_data_container_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(op_spec_data_mapList , localMapKeyPair);
|
OpenAPI_list_add(op_spec_data_mapList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,9 @@ cJSON *OpenAPI_policy_update_convertToJSON(OpenAPI_policy_update_t *policy_updat
|
||||||
if (policy_update->pras) {
|
if (policy_update->pras) {
|
||||||
OpenAPI_list_for_each(policy_update->pras, pras_node) {
|
OpenAPI_list_for_each(policy_update->pras, pras_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pras_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pras_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_rm_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_rm_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_policy_update_convertToJSON() failed [pras]");
|
ogs_error("OpenAPI_policy_update_convertToJSON() failed [pras]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -254,12 +256,15 @@ OpenAPI_policy_update_t *OpenAPI_policy_update_parseFromJSON(cJSON *policy_updat
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pras_local_map, pras) {
|
cJSON_ArrayForEach(pras_local_map, pras) {
|
||||||
cJSON *localMapObject = pras_local_map;
|
cJSON *localMapObject = pras_local_map;
|
||||||
if (!cJSON_IsObject(pras_local_map)) {
|
if (cJSON_IsObject(pras_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_rm_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pras_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_policy_update_parseFromJSON() failed [pras]");
|
ogs_error("OpenAPI_policy_update_parseFromJSON() failed [pras]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_rm_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(prasList , localMapKeyPair);
|
OpenAPI_list_add(prasList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,9 @@ cJSON *OpenAPI_session_management_subscription_data_convertToJSON(OpenAPI_sessio
|
||||||
if (session_management_subscription_data->dnn_configurations) {
|
if (session_management_subscription_data->dnn_configurations) {
|
||||||
OpenAPI_list_for_each(session_management_subscription_data->dnn_configurations, dnn_configurations_node) {
|
OpenAPI_list_for_each(session_management_subscription_data->dnn_configurations, dnn_configurations_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)dnn_configurations_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)dnn_configurations_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_dnn_configuration_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_dnn_configuration_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_convertToJSON() failed [dnn_configurations]");
|
ogs_error("OpenAPI_session_management_subscription_data_convertToJSON() failed [dnn_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -197,7 +199,9 @@ cJSON *OpenAPI_session_management_subscription_data_convertToJSON(OpenAPI_sessio
|
||||||
if (session_management_subscription_data->expected_ue_behaviours_list) {
|
if (session_management_subscription_data->expected_ue_behaviours_list) {
|
||||||
OpenAPI_list_for_each(session_management_subscription_data->expected_ue_behaviours_list, expected_ue_behaviours_list_node) {
|
OpenAPI_list_for_each(session_management_subscription_data->expected_ue_behaviours_list, expected_ue_behaviours_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)expected_ue_behaviours_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)expected_ue_behaviours_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_expected_ue_behaviour_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_expected_ue_behaviour_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_convertToJSON() failed [expected_ue_behaviours_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_convertToJSON() failed [expected_ue_behaviours_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -218,7 +222,9 @@ cJSON *OpenAPI_session_management_subscription_data_convertToJSON(OpenAPI_sessio
|
||||||
if (session_management_subscription_data->suggested_packet_num_dl_list) {
|
if (session_management_subscription_data->suggested_packet_num_dl_list) {
|
||||||
OpenAPI_list_for_each(session_management_subscription_data->suggested_packet_num_dl_list, suggested_packet_num_dl_list_node) {
|
OpenAPI_list_for_each(session_management_subscription_data->suggested_packet_num_dl_list, suggested_packet_num_dl_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)suggested_packet_num_dl_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)suggested_packet_num_dl_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_suggested_packet_num_dl_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_suggested_packet_num_dl_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_convertToJSON() failed [suggested_packet_num_dl_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_convertToJSON() failed [suggested_packet_num_dl_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -264,12 +270,15 @@ OpenAPI_session_management_subscription_data_t *OpenAPI_session_management_subsc
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(dnn_configurations_local_map, dnn_configurations) {
|
cJSON_ArrayForEach(dnn_configurations_local_map, dnn_configurations) {
|
||||||
cJSON *localMapObject = dnn_configurations_local_map;
|
cJSON *localMapObject = dnn_configurations_local_map;
|
||||||
if (!cJSON_IsObject(dnn_configurations_local_map)) {
|
if (cJSON_IsObject(dnn_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_dnn_configuration_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(dnn_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_parseFromJSON() failed [dnn_configurations]");
|
ogs_error("OpenAPI_session_management_subscription_data_parseFromJSON() failed [dnn_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_dnn_configuration_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(dnn_configurationsList , localMapKeyPair);
|
OpenAPI_list_add(dnn_configurationsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -360,12 +369,15 @@ OpenAPI_session_management_subscription_data_t *OpenAPI_session_management_subsc
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(expected_ue_behaviours_list_local_map, expected_ue_behaviours_list) {
|
cJSON_ArrayForEach(expected_ue_behaviours_list_local_map, expected_ue_behaviours_list) {
|
||||||
cJSON *localMapObject = expected_ue_behaviours_list_local_map;
|
cJSON *localMapObject = expected_ue_behaviours_list_local_map;
|
||||||
if (!cJSON_IsObject(expected_ue_behaviours_list_local_map)) {
|
if (cJSON_IsObject(expected_ue_behaviours_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_expected_ue_behaviour_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(expected_ue_behaviours_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_parseFromJSON() failed [expected_ue_behaviours_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_parseFromJSON() failed [expected_ue_behaviours_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_expected_ue_behaviour_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(expected_ue_behaviours_listList , localMapKeyPair);
|
OpenAPI_list_add(expected_ue_behaviours_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -383,12 +395,15 @@ OpenAPI_session_management_subscription_data_t *OpenAPI_session_management_subsc
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(suggested_packet_num_dl_list_local_map, suggested_packet_num_dl_list) {
|
cJSON_ArrayForEach(suggested_packet_num_dl_list_local_map, suggested_packet_num_dl_list) {
|
||||||
cJSON *localMapObject = suggested_packet_num_dl_list_local_map;
|
cJSON *localMapObject = suggested_packet_num_dl_list_local_map;
|
||||||
if (!cJSON_IsObject(suggested_packet_num_dl_list_local_map)) {
|
if (cJSON_IsObject(suggested_packet_num_dl_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_suggested_packet_num_dl_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(suggested_packet_num_dl_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_parseFromJSON() failed [suggested_packet_num_dl_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_parseFromJSON() failed [suggested_packet_num_dl_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_suggested_packet_num_dl_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(suggested_packet_num_dl_listList , localMapKeyPair);
|
OpenAPI_list_add(suggested_packet_num_dl_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,9 @@ cJSON *OpenAPI_session_management_subscription_data_1_convertToJSON(OpenAPI_sess
|
||||||
if (session_management_subscription_data_1->dnn_configurations) {
|
if (session_management_subscription_data_1->dnn_configurations) {
|
||||||
OpenAPI_list_for_each(session_management_subscription_data_1->dnn_configurations, dnn_configurations_node) {
|
OpenAPI_list_for_each(session_management_subscription_data_1->dnn_configurations, dnn_configurations_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)dnn_configurations_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)dnn_configurations_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_dnn_configuration_1_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_dnn_configuration_1_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_1_convertToJSON() failed [dnn_configurations]");
|
ogs_error("OpenAPI_session_management_subscription_data_1_convertToJSON() failed [dnn_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -197,7 +199,9 @@ cJSON *OpenAPI_session_management_subscription_data_1_convertToJSON(OpenAPI_sess
|
||||||
if (session_management_subscription_data_1->expected_ue_behaviours_list) {
|
if (session_management_subscription_data_1->expected_ue_behaviours_list) {
|
||||||
OpenAPI_list_for_each(session_management_subscription_data_1->expected_ue_behaviours_list, expected_ue_behaviours_list_node) {
|
OpenAPI_list_for_each(session_management_subscription_data_1->expected_ue_behaviours_list, expected_ue_behaviours_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)expected_ue_behaviours_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)expected_ue_behaviours_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_expected_ue_behaviour_data_1_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_expected_ue_behaviour_data_1_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_1_convertToJSON() failed [expected_ue_behaviours_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_1_convertToJSON() failed [expected_ue_behaviours_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -218,7 +222,9 @@ cJSON *OpenAPI_session_management_subscription_data_1_convertToJSON(OpenAPI_sess
|
||||||
if (session_management_subscription_data_1->suggested_packet_num_dl_list) {
|
if (session_management_subscription_data_1->suggested_packet_num_dl_list) {
|
||||||
OpenAPI_list_for_each(session_management_subscription_data_1->suggested_packet_num_dl_list, suggested_packet_num_dl_list_node) {
|
OpenAPI_list_for_each(session_management_subscription_data_1->suggested_packet_num_dl_list, suggested_packet_num_dl_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)suggested_packet_num_dl_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)suggested_packet_num_dl_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_suggested_packet_num_dl_1_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_suggested_packet_num_dl_1_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_1_convertToJSON() failed [suggested_packet_num_dl_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_1_convertToJSON() failed [suggested_packet_num_dl_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -264,12 +270,15 @@ OpenAPI_session_management_subscription_data_1_t *OpenAPI_session_management_sub
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(dnn_configurations_local_map, dnn_configurations) {
|
cJSON_ArrayForEach(dnn_configurations_local_map, dnn_configurations) {
|
||||||
cJSON *localMapObject = dnn_configurations_local_map;
|
cJSON *localMapObject = dnn_configurations_local_map;
|
||||||
if (!cJSON_IsObject(dnn_configurations_local_map)) {
|
if (cJSON_IsObject(dnn_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_dnn_configuration_1_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(dnn_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_1_parseFromJSON() failed [dnn_configurations]");
|
ogs_error("OpenAPI_session_management_subscription_data_1_parseFromJSON() failed [dnn_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_dnn_configuration_1_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(dnn_configurationsList , localMapKeyPair);
|
OpenAPI_list_add(dnn_configurationsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -360,12 +369,15 @@ OpenAPI_session_management_subscription_data_1_t *OpenAPI_session_management_sub
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(expected_ue_behaviours_list_local_map, expected_ue_behaviours_list) {
|
cJSON_ArrayForEach(expected_ue_behaviours_list_local_map, expected_ue_behaviours_list) {
|
||||||
cJSON *localMapObject = expected_ue_behaviours_list_local_map;
|
cJSON *localMapObject = expected_ue_behaviours_list_local_map;
|
||||||
if (!cJSON_IsObject(expected_ue_behaviours_list_local_map)) {
|
if (cJSON_IsObject(expected_ue_behaviours_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_expected_ue_behaviour_data_1_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(expected_ue_behaviours_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_1_parseFromJSON() failed [expected_ue_behaviours_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_1_parseFromJSON() failed [expected_ue_behaviours_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_expected_ue_behaviour_data_1_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(expected_ue_behaviours_listList , localMapKeyPair);
|
OpenAPI_list_add(expected_ue_behaviours_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -383,12 +395,15 @@ OpenAPI_session_management_subscription_data_1_t *OpenAPI_session_management_sub
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(suggested_packet_num_dl_list_local_map, suggested_packet_num_dl_list) {
|
cJSON_ArrayForEach(suggested_packet_num_dl_list_local_map, suggested_packet_num_dl_list) {
|
||||||
cJSON *localMapObject = suggested_packet_num_dl_list_local_map;
|
cJSON *localMapObject = suggested_packet_num_dl_list_local_map;
|
||||||
if (!cJSON_IsObject(suggested_packet_num_dl_list_local_map)) {
|
if (cJSON_IsObject(suggested_packet_num_dl_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_suggested_packet_num_dl_1_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(suggested_packet_num_dl_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_session_management_subscription_data_1_parseFromJSON() failed [suggested_packet_num_dl_list]");
|
ogs_error("OpenAPI_session_management_subscription_data_1_parseFromJSON() failed [suggested_packet_num_dl_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_suggested_packet_num_dl_1_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(suggested_packet_num_dl_listList , localMapKeyPair);
|
OpenAPI_list_add(suggested_packet_num_dl_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,9 @@ cJSON *OpenAPI_shared_data_convertToJSON(OpenAPI_shared_data_t *shared_data)
|
||||||
if (shared_data->shared_dnn_configurations) {
|
if (shared_data->shared_dnn_configurations) {
|
||||||
OpenAPI_list_for_each(shared_data->shared_dnn_configurations, shared_dnn_configurations_node) {
|
OpenAPI_list_for_each(shared_data->shared_dnn_configurations, shared_dnn_configurations_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)shared_dnn_configurations_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)shared_dnn_configurations_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_dnn_configuration_1_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_dnn_configuration_1_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_shared_data_convertToJSON() failed [shared_dnn_configurations]");
|
ogs_error("OpenAPI_shared_data_convertToJSON() failed [shared_dnn_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -162,7 +164,9 @@ cJSON *OpenAPI_shared_data_convertToJSON(OpenAPI_shared_data_t *shared_data)
|
||||||
if (shared_data->shared_snssai_infos) {
|
if (shared_data->shared_snssai_infos) {
|
||||||
OpenAPI_list_for_each(shared_data->shared_snssai_infos, shared_snssai_infos_node) {
|
OpenAPI_list_for_each(shared_data->shared_snssai_infos, shared_snssai_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)shared_snssai_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)shared_snssai_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_snssai_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_snssai_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_shared_data_convertToJSON() failed [shared_snssai_infos]");
|
ogs_error("OpenAPI_shared_data_convertToJSON() failed [shared_snssai_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -183,7 +187,9 @@ cJSON *OpenAPI_shared_data_convertToJSON(OpenAPI_shared_data_t *shared_data)
|
||||||
if (shared_data->shared_vn_group_datas) {
|
if (shared_data->shared_vn_group_datas) {
|
||||||
OpenAPI_list_for_each(shared_data->shared_vn_group_datas, shared_vn_group_datas_node) {
|
OpenAPI_list_for_each(shared_data->shared_vn_group_datas, shared_vn_group_datas_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)shared_vn_group_datas_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)shared_vn_group_datas_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_vn_group_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_vn_group_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_shared_data_convertToJSON() failed [shared_vn_group_datas]");
|
ogs_error("OpenAPI_shared_data_convertToJSON() failed [shared_vn_group_datas]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -245,12 +251,15 @@ OpenAPI_shared_data_t *OpenAPI_shared_data_parseFromJSON(cJSON *shared_dataJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(shared_dnn_configurations_local_map, shared_dnn_configurations) {
|
cJSON_ArrayForEach(shared_dnn_configurations_local_map, shared_dnn_configurations) {
|
||||||
cJSON *localMapObject = shared_dnn_configurations_local_map;
|
cJSON *localMapObject = shared_dnn_configurations_local_map;
|
||||||
if (!cJSON_IsObject(shared_dnn_configurations_local_map)) {
|
if (cJSON_IsObject(shared_dnn_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_dnn_configuration_1_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(shared_dnn_configurations_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_shared_data_parseFromJSON() failed [shared_dnn_configurations]");
|
ogs_error("OpenAPI_shared_data_parseFromJSON() failed [shared_dnn_configurations]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_dnn_configuration_1_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(shared_dnn_configurationsList , localMapKeyPair);
|
OpenAPI_list_add(shared_dnn_configurationsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -275,12 +284,15 @@ OpenAPI_shared_data_t *OpenAPI_shared_data_parseFromJSON(cJSON *shared_dataJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(shared_snssai_infos_local_map, shared_snssai_infos) {
|
cJSON_ArrayForEach(shared_snssai_infos_local_map, shared_snssai_infos) {
|
||||||
cJSON *localMapObject = shared_snssai_infos_local_map;
|
cJSON *localMapObject = shared_snssai_infos_local_map;
|
||||||
if (!cJSON_IsObject(shared_snssai_infos_local_map)) {
|
if (cJSON_IsObject(shared_snssai_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_snssai_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(shared_snssai_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_shared_data_parseFromJSON() failed [shared_snssai_infos]");
|
ogs_error("OpenAPI_shared_data_parseFromJSON() failed [shared_snssai_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_snssai_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(shared_snssai_infosList , localMapKeyPair);
|
OpenAPI_list_add(shared_snssai_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,12 +310,15 @@ OpenAPI_shared_data_t *OpenAPI_shared_data_parseFromJSON(cJSON *shared_dataJSON)
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(shared_vn_group_datas_local_map, shared_vn_group_datas) {
|
cJSON_ArrayForEach(shared_vn_group_datas_local_map, shared_vn_group_datas) {
|
||||||
cJSON *localMapObject = shared_vn_group_datas_local_map;
|
cJSON *localMapObject = shared_vn_group_datas_local_map;
|
||||||
if (!cJSON_IsObject(shared_vn_group_datas_local_map)) {
|
if (cJSON_IsObject(shared_vn_group_datas_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_vn_group_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(shared_vn_group_datas_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_shared_data_parseFromJSON() failed [shared_vn_group_datas]");
|
ogs_error("OpenAPI_shared_data_parseFromJSON() failed [shared_vn_group_datas]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_vn_group_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(shared_vn_group_datasList , localMapKeyPair);
|
OpenAPI_list_add(shared_vn_group_datasList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,9 @@ cJSON *OpenAPI_sm_policy_data_convertToJSON(OpenAPI_sm_policy_data_t *sm_policy_
|
||||||
if (sm_policy_data->sm_policy_snssai_data) {
|
if (sm_policy_data->sm_policy_snssai_data) {
|
||||||
OpenAPI_list_for_each(sm_policy_data->sm_policy_snssai_data, sm_policy_snssai_data_node) {
|
OpenAPI_list_for_each(sm_policy_data->sm_policy_snssai_data, sm_policy_snssai_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_snssai_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_snssai_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_sm_policy_snssai_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_sm_policy_snssai_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_data_convertToJSON() failed [sm_policy_snssai_data]");
|
ogs_error("OpenAPI_sm_policy_data_convertToJSON() failed [sm_policy_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -91,7 +93,9 @@ cJSON *OpenAPI_sm_policy_data_convertToJSON(OpenAPI_sm_policy_data_t *sm_policy_
|
||||||
if (sm_policy_data->um_data_limits) {
|
if (sm_policy_data->um_data_limits) {
|
||||||
OpenAPI_list_for_each(sm_policy_data->um_data_limits, um_data_limits_node) {
|
OpenAPI_list_for_each(sm_policy_data->um_data_limits, um_data_limits_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_data_limits_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_data_limits_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_usage_mon_data_limit_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_usage_mon_data_limit_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_data_convertToJSON() failed [um_data_limits]");
|
ogs_error("OpenAPI_sm_policy_data_convertToJSON() failed [um_data_limits]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -112,7 +116,9 @@ cJSON *OpenAPI_sm_policy_data_convertToJSON(OpenAPI_sm_policy_data_t *sm_policy_
|
||||||
if (sm_policy_data->um_data) {
|
if (sm_policy_data->um_data) {
|
||||||
OpenAPI_list_for_each(sm_policy_data->um_data, um_data_node) {
|
OpenAPI_list_for_each(sm_policy_data->um_data, um_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_usage_mon_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_usage_mon_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_data_convertToJSON() failed [um_data]");
|
ogs_error("OpenAPI_sm_policy_data_convertToJSON() failed [um_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -152,12 +158,15 @@ OpenAPI_sm_policy_data_t *OpenAPI_sm_policy_data_parseFromJSON(cJSON *sm_policy_
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(sm_policy_snssai_data_local_map, sm_policy_snssai_data) {
|
cJSON_ArrayForEach(sm_policy_snssai_data_local_map, sm_policy_snssai_data) {
|
||||||
cJSON *localMapObject = sm_policy_snssai_data_local_map;
|
cJSON *localMapObject = sm_policy_snssai_data_local_map;
|
||||||
if (!cJSON_IsObject(sm_policy_snssai_data_local_map)) {
|
if (cJSON_IsObject(sm_policy_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_sm_policy_snssai_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(sm_policy_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_data_parseFromJSON() failed [sm_policy_snssai_data]");
|
ogs_error("OpenAPI_sm_policy_data_parseFromJSON() failed [sm_policy_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_sm_policy_snssai_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(sm_policy_snssai_dataList , localMapKeyPair);
|
OpenAPI_list_add(sm_policy_snssai_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,12 +183,15 @@ OpenAPI_sm_policy_data_t *OpenAPI_sm_policy_data_parseFromJSON(cJSON *sm_policy_
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(um_data_limits_local_map, um_data_limits) {
|
cJSON_ArrayForEach(um_data_limits_local_map, um_data_limits) {
|
||||||
cJSON *localMapObject = um_data_limits_local_map;
|
cJSON *localMapObject = um_data_limits_local_map;
|
||||||
if (!cJSON_IsObject(um_data_limits_local_map)) {
|
if (cJSON_IsObject(um_data_limits_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_usage_mon_data_limit_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(um_data_limits_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_data_parseFromJSON() failed [um_data_limits]");
|
ogs_error("OpenAPI_sm_policy_data_parseFromJSON() failed [um_data_limits]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_usage_mon_data_limit_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(um_data_limitsList , localMapKeyPair);
|
OpenAPI_list_add(um_data_limitsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,12 +209,15 @@ OpenAPI_sm_policy_data_t *OpenAPI_sm_policy_data_parseFromJSON(cJSON *sm_policy_
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(um_data_local_map, um_data) {
|
cJSON_ArrayForEach(um_data_local_map, um_data) {
|
||||||
cJSON *localMapObject = um_data_local_map;
|
cJSON *localMapObject = um_data_local_map;
|
||||||
if (!cJSON_IsObject(um_data_local_map)) {
|
if (cJSON_IsObject(um_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_usage_mon_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(um_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_data_parseFromJSON() failed [um_data]");
|
ogs_error("OpenAPI_sm_policy_data_parseFromJSON() failed [um_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_usage_mon_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(um_dataList , localMapKeyPair);
|
OpenAPI_list_add(um_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,9 @@ cJSON *OpenAPI_sm_policy_data_patch_convertToJSON(OpenAPI_sm_policy_data_patch_t
|
||||||
if (sm_policy_data_patch->um_data) {
|
if (sm_policy_data_patch->um_data) {
|
||||||
OpenAPI_list_for_each(sm_policy_data_patch->um_data, um_data_node) {
|
OpenAPI_list_for_each(sm_policy_data_patch->um_data, um_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_usage_mon_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_usage_mon_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_data_patch_convertToJSON() failed [um_data]");
|
ogs_error("OpenAPI_sm_policy_data_patch_convertToJSON() failed [um_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -82,7 +84,9 @@ cJSON *OpenAPI_sm_policy_data_patch_convertToJSON(OpenAPI_sm_policy_data_patch_t
|
||||||
if (sm_policy_data_patch->sm_policy_snssai_data) {
|
if (sm_policy_data_patch->sm_policy_snssai_data) {
|
||||||
OpenAPI_list_for_each(sm_policy_data_patch->sm_policy_snssai_data, sm_policy_snssai_data_node) {
|
OpenAPI_list_for_each(sm_policy_data_patch->sm_policy_snssai_data, sm_policy_snssai_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_snssai_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_snssai_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_sm_policy_snssai_data_patch_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_sm_policy_snssai_data_patch_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_data_patch_convertToJSON() failed [sm_policy_snssai_data]");
|
ogs_error("OpenAPI_sm_policy_data_patch_convertToJSON() failed [sm_policy_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -112,12 +116,15 @@ OpenAPI_sm_policy_data_patch_t *OpenAPI_sm_policy_data_patch_parseFromJSON(cJSON
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(um_data_local_map, um_data) {
|
cJSON_ArrayForEach(um_data_local_map, um_data) {
|
||||||
cJSON *localMapObject = um_data_local_map;
|
cJSON *localMapObject = um_data_local_map;
|
||||||
if (!cJSON_IsObject(um_data_local_map)) {
|
if (cJSON_IsObject(um_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_usage_mon_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(um_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_data_patch_parseFromJSON() failed [um_data]");
|
ogs_error("OpenAPI_sm_policy_data_patch_parseFromJSON() failed [um_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_usage_mon_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(um_dataList , localMapKeyPair);
|
OpenAPI_list_add(um_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,12 +142,15 @@ OpenAPI_sm_policy_data_patch_t *OpenAPI_sm_policy_data_patch_parseFromJSON(cJSON
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(sm_policy_snssai_data_local_map, sm_policy_snssai_data) {
|
cJSON_ArrayForEach(sm_policy_snssai_data_local_map, sm_policy_snssai_data) {
|
||||||
cJSON *localMapObject = sm_policy_snssai_data_local_map;
|
cJSON *localMapObject = sm_policy_snssai_data_local_map;
|
||||||
if (!cJSON_IsObject(sm_policy_snssai_data_local_map)) {
|
if (cJSON_IsObject(sm_policy_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_sm_policy_snssai_data_patch_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(sm_policy_snssai_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_data_patch_parseFromJSON() failed [sm_policy_snssai_data]");
|
ogs_error("OpenAPI_sm_policy_data_patch_parseFromJSON() failed [sm_policy_snssai_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_sm_policy_snssai_data_patch_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(sm_policy_snssai_dataList , localMapKeyPair);
|
OpenAPI_list_add(sm_policy_snssai_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,7 +190,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->sess_rules) {
|
if (sm_policy_decision->sess_rules) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->sess_rules, sess_rules_node) {
|
OpenAPI_list_for_each(sm_policy_decision->sess_rules, sess_rules_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sess_rules_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sess_rules_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_session_rule_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_session_rule_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [sess_rules]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [sess_rules]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -211,7 +213,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->pcc_rules) {
|
if (sm_policy_decision->pcc_rules) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->pcc_rules, pcc_rules_node) {
|
OpenAPI_list_for_each(sm_policy_decision->pcc_rules, pcc_rules_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pcc_rules_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pcc_rules_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_pcc_rule_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_pcc_rule_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [pcc_rules]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [pcc_rules]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -239,7 +243,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->qos_decs) {
|
if (sm_policy_decision->qos_decs) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->qos_decs, qos_decs_node) {
|
OpenAPI_list_for_each(sm_policy_decision->qos_decs, qos_decs_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)qos_decs_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)qos_decs_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_qos_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_qos_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [qos_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [qos_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -260,7 +266,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->chg_decs) {
|
if (sm_policy_decision->chg_decs) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->chg_decs, chg_decs_node) {
|
OpenAPI_list_for_each(sm_policy_decision->chg_decs, chg_decs_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)chg_decs_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)chg_decs_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_charging_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_charging_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [chg_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [chg_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -294,7 +302,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->traff_cont_decs) {
|
if (sm_policy_decision->traff_cont_decs) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->traff_cont_decs, traff_cont_decs_node) {
|
OpenAPI_list_for_each(sm_policy_decision->traff_cont_decs, traff_cont_decs_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)traff_cont_decs_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)traff_cont_decs_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_traffic_control_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_traffic_control_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [traff_cont_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [traff_cont_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -315,7 +325,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->um_decs) {
|
if (sm_policy_decision->um_decs) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->um_decs, um_decs_node) {
|
OpenAPI_list_for_each(sm_policy_decision->um_decs, um_decs_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_decs_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)um_decs_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_usage_monitoring_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_usage_monitoring_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [um_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [um_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -336,7 +348,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->qos_chars) {
|
if (sm_policy_decision->qos_chars) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->qos_chars, qos_chars_node) {
|
OpenAPI_list_for_each(sm_policy_decision->qos_chars, qos_chars_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)qos_chars_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)qos_chars_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_qos_characteristics_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_qos_characteristics_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [qos_chars]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [qos_chars]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -357,7 +371,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->qos_mon_decs) {
|
if (sm_policy_decision->qos_mon_decs) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->qos_mon_decs, qos_mon_decs_node) {
|
OpenAPI_list_for_each(sm_policy_decision->qos_mon_decs, qos_mon_decs_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)qos_mon_decs_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)qos_mon_decs_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_qos_monitoring_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_qos_monitoring_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [qos_mon_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [qos_mon_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -385,7 +401,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->conds) {
|
if (sm_policy_decision->conds) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->conds, conds_node) {
|
OpenAPI_list_for_each(sm_policy_decision->conds, conds_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)conds_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)conds_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_condition_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_condition_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [conds]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [conds]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -475,7 +493,9 @@ cJSON *OpenAPI_sm_policy_decision_convertToJSON(OpenAPI_sm_policy_decision_t *sm
|
||||||
if (sm_policy_decision->pra_infos) {
|
if (sm_policy_decision->pra_infos) {
|
||||||
OpenAPI_list_for_each(sm_policy_decision->pra_infos, pra_infos_node) {
|
OpenAPI_list_for_each(sm_policy_decision->pra_infos, pra_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_rm_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_rm_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_sm_policy_decision_convertToJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -593,12 +613,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(sess_rules_local_map, sess_rules) {
|
cJSON_ArrayForEach(sess_rules_local_map, sess_rules) {
|
||||||
cJSON *localMapObject = sess_rules_local_map;
|
cJSON *localMapObject = sess_rules_local_map;
|
||||||
if (!cJSON_IsObject(sess_rules_local_map)) {
|
if (cJSON_IsObject(sess_rules_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_session_rule_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(sess_rules_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [sess_rules]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [sess_rules]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_session_rule_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(sess_rulesList , localMapKeyPair);
|
OpenAPI_list_add(sess_rulesList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -616,12 +639,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pcc_rules_local_map, pcc_rules) {
|
cJSON_ArrayForEach(pcc_rules_local_map, pcc_rules) {
|
||||||
cJSON *localMapObject = pcc_rules_local_map;
|
cJSON *localMapObject = pcc_rules_local_map;
|
||||||
if (!cJSON_IsObject(pcc_rules_local_map)) {
|
if (cJSON_IsObject(pcc_rules_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_pcc_rule_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pcc_rules_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [pcc_rules]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [pcc_rules]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_pcc_rule_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pcc_rulesList , localMapKeyPair);
|
OpenAPI_list_add(pcc_rulesList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -648,12 +674,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(qos_decs_local_map, qos_decs) {
|
cJSON_ArrayForEach(qos_decs_local_map, qos_decs) {
|
||||||
cJSON *localMapObject = qos_decs_local_map;
|
cJSON *localMapObject = qos_decs_local_map;
|
||||||
if (!cJSON_IsObject(qos_decs_local_map)) {
|
if (cJSON_IsObject(qos_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_qos_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(qos_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [qos_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [qos_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_qos_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(qos_decsList , localMapKeyPair);
|
OpenAPI_list_add(qos_decsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -671,12 +700,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(chg_decs_local_map, chg_decs) {
|
cJSON_ArrayForEach(chg_decs_local_map, chg_decs) {
|
||||||
cJSON *localMapObject = chg_decs_local_map;
|
cJSON *localMapObject = chg_decs_local_map;
|
||||||
if (!cJSON_IsObject(chg_decs_local_map)) {
|
if (cJSON_IsObject(chg_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_charging_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(chg_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [chg_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [chg_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_charging_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(chg_decsList , localMapKeyPair);
|
OpenAPI_list_add(chg_decsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,12 +733,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(traff_cont_decs_local_map, traff_cont_decs) {
|
cJSON_ArrayForEach(traff_cont_decs_local_map, traff_cont_decs) {
|
||||||
cJSON *localMapObject = traff_cont_decs_local_map;
|
cJSON *localMapObject = traff_cont_decs_local_map;
|
||||||
if (!cJSON_IsObject(traff_cont_decs_local_map)) {
|
if (cJSON_IsObject(traff_cont_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_traffic_control_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(traff_cont_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [traff_cont_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [traff_cont_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_traffic_control_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(traff_cont_decsList , localMapKeyPair);
|
OpenAPI_list_add(traff_cont_decsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -724,12 +759,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(um_decs_local_map, um_decs) {
|
cJSON_ArrayForEach(um_decs_local_map, um_decs) {
|
||||||
cJSON *localMapObject = um_decs_local_map;
|
cJSON *localMapObject = um_decs_local_map;
|
||||||
if (!cJSON_IsObject(um_decs_local_map)) {
|
if (cJSON_IsObject(um_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_usage_monitoring_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(um_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [um_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [um_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_usage_monitoring_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(um_decsList , localMapKeyPair);
|
OpenAPI_list_add(um_decsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -747,12 +785,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(qos_chars_local_map, qos_chars) {
|
cJSON_ArrayForEach(qos_chars_local_map, qos_chars) {
|
||||||
cJSON *localMapObject = qos_chars_local_map;
|
cJSON *localMapObject = qos_chars_local_map;
|
||||||
if (!cJSON_IsObject(qos_chars_local_map)) {
|
if (cJSON_IsObject(qos_chars_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_qos_characteristics_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(qos_chars_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [qos_chars]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [qos_chars]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_qos_characteristics_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(qos_charsList , localMapKeyPair);
|
OpenAPI_list_add(qos_charsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -770,12 +811,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(qos_mon_decs_local_map, qos_mon_decs) {
|
cJSON_ArrayForEach(qos_mon_decs_local_map, qos_mon_decs) {
|
||||||
cJSON *localMapObject = qos_mon_decs_local_map;
|
cJSON *localMapObject = qos_mon_decs_local_map;
|
||||||
if (!cJSON_IsObject(qos_mon_decs_local_map)) {
|
if (cJSON_IsObject(qos_mon_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_qos_monitoring_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(qos_mon_decs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [qos_mon_decs]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [qos_mon_decs]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_qos_monitoring_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(qos_mon_decsList , localMapKeyPair);
|
OpenAPI_list_add(qos_mon_decsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -802,12 +846,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(conds_local_map, conds) {
|
cJSON_ArrayForEach(conds_local_map, conds) {
|
||||||
cJSON *localMapObject = conds_local_map;
|
cJSON *localMapObject = conds_local_map;
|
||||||
if (!cJSON_IsObject(conds_local_map)) {
|
if (cJSON_IsObject(conds_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_condition_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(conds_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [conds]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [conds]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_condition_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(condsList , localMapKeyPair);
|
OpenAPI_list_add(condsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -904,12 +951,15 @@ OpenAPI_sm_policy_decision_t *OpenAPI_sm_policy_decision_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
||||||
cJSON *localMapObject = pra_infos_local_map;
|
cJSON *localMapObject = pra_infos_local_map;
|
||||||
if (!cJSON_IsObject(pra_infos_local_map)) {
|
if (cJSON_IsObject(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_rm_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_sm_policy_decision_parseFromJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_rm_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,7 +247,9 @@ cJSON *OpenAPI_sm_policy_dnn_data_convertToJSON(OpenAPI_sm_policy_dnn_data_t *sm
|
||||||
if (sm_policy_dnn_data->ref_um_data_limit_ids) {
|
if (sm_policy_dnn_data->ref_um_data_limit_ids) {
|
||||||
OpenAPI_list_for_each(sm_policy_dnn_data->ref_um_data_limit_ids, ref_um_data_limit_ids_node) {
|
OpenAPI_list_for_each(sm_policy_dnn_data->ref_um_data_limit_ids, ref_um_data_limit_ids_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ref_um_data_limit_ids_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ref_um_data_limit_ids_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_limit_id_to_monitoring_key_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_limit_id_to_monitoring_key_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_dnn_data_convertToJSON() failed [ref_um_data_limit_ids]");
|
ogs_error("OpenAPI_sm_policy_dnn_data_convertToJSON() failed [ref_um_data_limit_ids]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -303,7 +305,9 @@ cJSON *OpenAPI_sm_policy_dnn_data_convertToJSON(OpenAPI_sm_policy_dnn_data_t *sm
|
||||||
if (sm_policy_dnn_data->pra_infos) {
|
if (sm_policy_dnn_data->pra_infos) {
|
||||||
OpenAPI_list_for_each(sm_policy_dnn_data->pra_infos, pra_infos_node) {
|
OpenAPI_list_for_each(sm_policy_dnn_data->pra_infos, pra_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_dnn_data_convertToJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_sm_policy_dnn_data_convertToJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -485,12 +489,15 @@ OpenAPI_sm_policy_dnn_data_t *OpenAPI_sm_policy_dnn_data_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(ref_um_data_limit_ids_local_map, ref_um_data_limit_ids) {
|
cJSON_ArrayForEach(ref_um_data_limit_ids_local_map, ref_um_data_limit_ids) {
|
||||||
cJSON *localMapObject = ref_um_data_limit_ids_local_map;
|
cJSON *localMapObject = ref_um_data_limit_ids_local_map;
|
||||||
if (!cJSON_IsObject(ref_um_data_limit_ids_local_map)) {
|
if (cJSON_IsObject(ref_um_data_limit_ids_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_limit_id_to_monitoring_key_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(ref_um_data_limit_ids_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_dnn_data_parseFromJSON() failed [ref_um_data_limit_ids]");
|
ogs_error("OpenAPI_sm_policy_dnn_data_parseFromJSON() failed [ref_um_data_limit_ids]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_limit_id_to_monitoring_key_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(ref_um_data_limit_idsList , localMapKeyPair);
|
OpenAPI_list_add(ref_um_data_limit_idsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -553,12 +560,15 @@ OpenAPI_sm_policy_dnn_data_t *OpenAPI_sm_policy_dnn_data_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
||||||
cJSON *localMapObject = pra_infos_local_map;
|
cJSON *localMapObject = pra_infos_local_map;
|
||||||
if (!cJSON_IsObject(pra_infos_local_map)) {
|
if (cJSON_IsObject(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_dnn_data_parseFromJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_sm_policy_dnn_data_parseFromJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,9 @@ cJSON *OpenAPI_sm_policy_snssai_data_convertToJSON(OpenAPI_sm_policy_snssai_data
|
||||||
if (sm_policy_snssai_data->sm_policy_dnn_data) {
|
if (sm_policy_snssai_data->sm_policy_dnn_data) {
|
||||||
OpenAPI_list_for_each(sm_policy_snssai_data->sm_policy_dnn_data, sm_policy_dnn_data_node) {
|
OpenAPI_list_for_each(sm_policy_snssai_data->sm_policy_dnn_data, sm_policy_dnn_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_dnn_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_dnn_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_sm_policy_dnn_data_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_sm_policy_dnn_data_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_snssai_data_convertToJSON() failed [sm_policy_dnn_data]");
|
ogs_error("OpenAPI_sm_policy_snssai_data_convertToJSON() failed [sm_policy_dnn_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -106,12 +108,15 @@ OpenAPI_sm_policy_snssai_data_t *OpenAPI_sm_policy_snssai_data_parseFromJSON(cJS
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(sm_policy_dnn_data_local_map, sm_policy_dnn_data) {
|
cJSON_ArrayForEach(sm_policy_dnn_data_local_map, sm_policy_dnn_data) {
|
||||||
cJSON *localMapObject = sm_policy_dnn_data_local_map;
|
cJSON *localMapObject = sm_policy_dnn_data_local_map;
|
||||||
if (!cJSON_IsObject(sm_policy_dnn_data_local_map)) {
|
if (cJSON_IsObject(sm_policy_dnn_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_sm_policy_dnn_data_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(sm_policy_dnn_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_snssai_data_parseFromJSON() failed [sm_policy_dnn_data]");
|
ogs_error("OpenAPI_sm_policy_snssai_data_parseFromJSON() failed [sm_policy_dnn_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_sm_policy_dnn_data_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(sm_policy_dnn_dataList , localMapKeyPair);
|
OpenAPI_list_add(sm_policy_dnn_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,9 @@ cJSON *OpenAPI_sm_policy_snssai_data_patch_convertToJSON(OpenAPI_sm_policy_snssa
|
||||||
if (sm_policy_snssai_data_patch->sm_policy_dnn_data) {
|
if (sm_policy_snssai_data_patch->sm_policy_dnn_data) {
|
||||||
OpenAPI_list_for_each(sm_policy_snssai_data_patch->sm_policy_dnn_data, sm_policy_dnn_data_node) {
|
OpenAPI_list_for_each(sm_policy_snssai_data_patch->sm_policy_dnn_data, sm_policy_dnn_data_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_dnn_data_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)sm_policy_dnn_data_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_sm_policy_dnn_data_patch_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_sm_policy_dnn_data_patch_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_snssai_data_patch_convertToJSON() failed [sm_policy_dnn_data]");
|
ogs_error("OpenAPI_sm_policy_snssai_data_patch_convertToJSON() failed [sm_policy_dnn_data]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -106,12 +108,15 @@ OpenAPI_sm_policy_snssai_data_patch_t *OpenAPI_sm_policy_snssai_data_patch_parse
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(sm_policy_dnn_data_local_map, sm_policy_dnn_data) {
|
cJSON_ArrayForEach(sm_policy_dnn_data_local_map, sm_policy_dnn_data) {
|
||||||
cJSON *localMapObject = sm_policy_dnn_data_local_map;
|
cJSON *localMapObject = sm_policy_dnn_data_local_map;
|
||||||
if (!cJSON_IsObject(sm_policy_dnn_data_local_map)) {
|
if (cJSON_IsObject(sm_policy_dnn_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_sm_policy_dnn_data_patch_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(sm_policy_dnn_data_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_snssai_data_patch_parseFromJSON() failed [sm_policy_dnn_data]");
|
ogs_error("OpenAPI_sm_policy_snssai_data_patch_parseFromJSON() failed [sm_policy_dnn_data]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_sm_policy_dnn_data_patch_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(sm_policy_dnn_dataList , localMapKeyPair);
|
OpenAPI_list_add(sm_policy_dnn_dataList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -589,7 +589,9 @@ cJSON *OpenAPI_sm_policy_update_context_data_convertToJSON(OpenAPI_sm_policy_upd
|
||||||
if (sm_policy_update_context_data->rep_pra_infos) {
|
if (sm_policy_update_context_data->rep_pra_infos) {
|
||||||
OpenAPI_list_for_each(sm_policy_update_context_data->rep_pra_infos, rep_pra_infos_node) {
|
OpenAPI_list_for_each(sm_policy_update_context_data->rep_pra_infos, rep_pra_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)rep_pra_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)rep_pra_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_sm_policy_update_context_data_convertToJSON() failed [rep_pra_infos]");
|
ogs_error("OpenAPI_sm_policy_update_context_data_convertToJSON() failed [rep_pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1231,12 +1233,15 @@ OpenAPI_sm_policy_update_context_data_t *OpenAPI_sm_policy_update_context_data_p
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(rep_pra_infos_local_map, rep_pra_infos) {
|
cJSON_ArrayForEach(rep_pra_infos_local_map, rep_pra_infos) {
|
||||||
cJSON *localMapObject = rep_pra_infos_local_map;
|
cJSON *localMapObject = rep_pra_infos_local_map;
|
||||||
if (!cJSON_IsObject(rep_pra_infos_local_map)) {
|
if (cJSON_IsObject(rep_pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(rep_pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_sm_policy_update_context_data_parseFromJSON() failed [rep_pra_infos]");
|
ogs_error("OpenAPI_sm_policy_update_context_data_parseFromJSON() failed [rep_pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(rep_pra_infosList , localMapKeyPair);
|
OpenAPI_list_add(rep_pra_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,9 @@ cJSON *OpenAPI_smf_selection_data_convertToJSON(OpenAPI_smf_selection_data_t *sm
|
||||||
if (smf_selection_data->candidates) {
|
if (smf_selection_data->candidates) {
|
||||||
OpenAPI_list_for_each(smf_selection_data->candidates, candidates_node) {
|
OpenAPI_list_for_each(smf_selection_data->candidates, candidates_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)candidates_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)candidates_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_candidate_for_replacement_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_candidate_for_replacement_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_smf_selection_data_convertToJSON() failed [candidates]");
|
ogs_error("OpenAPI_smf_selection_data_convertToJSON() failed [candidates]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -145,12 +147,15 @@ OpenAPI_smf_selection_data_t *OpenAPI_smf_selection_data_parseFromJSON(cJSON *sm
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(candidates_local_map, candidates) {
|
cJSON_ArrayForEach(candidates_local_map, candidates) {
|
||||||
cJSON *localMapObject = candidates_local_map;
|
cJSON *localMapObject = candidates_local_map;
|
||||||
if (!cJSON_IsObject(candidates_local_map)) {
|
if (cJSON_IsObject(candidates_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_candidate_for_replacement_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(candidates_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_smf_selection_data_parseFromJSON() failed [candidates]");
|
ogs_error("OpenAPI_smf_selection_data_parseFromJSON() failed [candidates]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_candidate_for_replacement_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(candidatesList , localMapKeyPair);
|
OpenAPI_list_add(candidatesList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,9 @@ cJSON *OpenAPI_smf_selection_subscription_data_convertToJSON(OpenAPI_smf_selecti
|
||||||
if (smf_selection_subscription_data->subscribed_snssai_infos) {
|
if (smf_selection_subscription_data->subscribed_snssai_infos) {
|
||||||
OpenAPI_list_for_each(smf_selection_subscription_data->subscribed_snssai_infos, subscribed_snssai_infos_node) {
|
OpenAPI_list_for_each(smf_selection_subscription_data->subscribed_snssai_infos, subscribed_snssai_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)subscribed_snssai_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)subscribed_snssai_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_snssai_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_snssai_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_smf_selection_subscription_data_convertToJSON() failed [subscribed_snssai_infos]");
|
ogs_error("OpenAPI_smf_selection_subscription_data_convertToJSON() failed [subscribed_snssai_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -112,12 +114,15 @@ OpenAPI_smf_selection_subscription_data_t *OpenAPI_smf_selection_subscription_da
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(subscribed_snssai_infos_local_map, subscribed_snssai_infos) {
|
cJSON_ArrayForEach(subscribed_snssai_infos_local_map, subscribed_snssai_infos) {
|
||||||
cJSON *localMapObject = subscribed_snssai_infos_local_map;
|
cJSON *localMapObject = subscribed_snssai_infos_local_map;
|
||||||
if (!cJSON_IsObject(subscribed_snssai_infos_local_map)) {
|
if (cJSON_IsObject(subscribed_snssai_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_snssai_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(subscribed_snssai_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_smf_selection_subscription_data_parseFromJSON() failed [subscribed_snssai_infos]");
|
ogs_error("OpenAPI_smf_selection_subscription_data_parseFromJSON() failed [subscribed_snssai_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_snssai_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(subscribed_snssai_infosList , localMapKeyPair);
|
OpenAPI_list_add(subscribed_snssai_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,9 @@ cJSON *OpenAPI_smf_selection_subscription_data_1_convertToJSON(OpenAPI_smf_selec
|
||||||
if (smf_selection_subscription_data_1->subscribed_snssai_infos) {
|
if (smf_selection_subscription_data_1->subscribed_snssai_infos) {
|
||||||
OpenAPI_list_for_each(smf_selection_subscription_data_1->subscribed_snssai_infos, subscribed_snssai_infos_node) {
|
OpenAPI_list_for_each(smf_selection_subscription_data_1->subscribed_snssai_infos, subscribed_snssai_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)subscribed_snssai_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)subscribed_snssai_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_snssai_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_snssai_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_smf_selection_subscription_data_1_convertToJSON() failed [subscribed_snssai_infos]");
|
ogs_error("OpenAPI_smf_selection_subscription_data_1_convertToJSON() failed [subscribed_snssai_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -112,12 +114,15 @@ OpenAPI_smf_selection_subscription_data_1_t *OpenAPI_smf_selection_subscription_
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(subscribed_snssai_infos_local_map, subscribed_snssai_infos) {
|
cJSON_ArrayForEach(subscribed_snssai_infos_local_map, subscribed_snssai_infos) {
|
||||||
cJSON *localMapObject = subscribed_snssai_infos_local_map;
|
cJSON *localMapObject = subscribed_snssai_infos_local_map;
|
||||||
if (!cJSON_IsObject(subscribed_snssai_infos_local_map)) {
|
if (cJSON_IsObject(subscribed_snssai_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_snssai_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(subscribed_snssai_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_smf_selection_subscription_data_1_parseFromJSON() failed [subscribed_snssai_infos]");
|
ogs_error("OpenAPI_smf_selection_subscription_data_1_parseFromJSON() failed [subscribed_snssai_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_snssai_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(subscribed_snssai_infosList , localMapKeyPair);
|
OpenAPI_list_add(subscribed_snssai_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,9 @@ cJSON *OpenAPI_spatial_validity_convertToJSON(OpenAPI_spatial_validity_t *spatia
|
||||||
if (spatial_validity->presence_info_list) {
|
if (spatial_validity->presence_info_list) {
|
||||||
OpenAPI_list_for_each(spatial_validity->presence_info_list, presence_info_list_node) {
|
OpenAPI_list_for_each(spatial_validity->presence_info_list, presence_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)presence_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)presence_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_spatial_validity_convertToJSON() failed [presence_info_list]");
|
ogs_error("OpenAPI_spatial_validity_convertToJSON() failed [presence_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -84,12 +86,15 @@ OpenAPI_spatial_validity_t *OpenAPI_spatial_validity_parseFromJSON(cJSON *spatia
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(presence_info_list_local_map, presence_info_list) {
|
cJSON_ArrayForEach(presence_info_list_local_map, presence_info_list) {
|
||||||
cJSON *localMapObject = presence_info_list_local_map;
|
cJSON *localMapObject = presence_info_list_local_map;
|
||||||
if (!cJSON_IsObject(presence_info_list_local_map)) {
|
if (cJSON_IsObject(presence_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(presence_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_spatial_validity_parseFromJSON() failed [presence_info_list]");
|
ogs_error("OpenAPI_spatial_validity_parseFromJSON() failed [presence_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(presence_info_listList , localMapKeyPair);
|
OpenAPI_list_add(presence_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,9 @@ cJSON *OpenAPI_spatial_validity_rm_convertToJSON(OpenAPI_spatial_validity_rm_t *
|
||||||
if (spatial_validity_rm->presence_info_list) {
|
if (spatial_validity_rm->presence_info_list) {
|
||||||
OpenAPI_list_for_each(spatial_validity_rm->presence_info_list, presence_info_list_node) {
|
OpenAPI_list_for_each(spatial_validity_rm->presence_info_list, presence_info_list_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)presence_info_list_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)presence_info_list_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_spatial_validity_rm_convertToJSON() failed [presence_info_list]");
|
ogs_error("OpenAPI_spatial_validity_rm_convertToJSON() failed [presence_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -84,12 +86,15 @@ OpenAPI_spatial_validity_rm_t *OpenAPI_spatial_validity_rm_parseFromJSON(cJSON *
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(presence_info_list_local_map, presence_info_list) {
|
cJSON_ArrayForEach(presence_info_list_local_map, presence_info_list) {
|
||||||
cJSON *localMapObject = presence_info_list_local_map;
|
cJSON *localMapObject = presence_info_list_local_map;
|
||||||
if (!cJSON_IsObject(presence_info_list_local_map)) {
|
if (cJSON_IsObject(presence_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(presence_info_list_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_spatial_validity_rm_parseFromJSON() failed [presence_info_list]");
|
ogs_error("OpenAPI_spatial_validity_rm_parseFromJSON() failed [presence_info_list]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(presence_info_listList , localMapKeyPair);
|
OpenAPI_list_add(presence_info_listList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,9 @@ cJSON *OpenAPI_ue_context_in_smf_data_convertToJSON(OpenAPI_ue_context_in_smf_da
|
||||||
if (ue_context_in_smf_data->pdu_sessions) {
|
if (ue_context_in_smf_data->pdu_sessions) {
|
||||||
OpenAPI_list_for_each(ue_context_in_smf_data->pdu_sessions, pdu_sessions_node) {
|
OpenAPI_list_for_each(ue_context_in_smf_data->pdu_sessions, pdu_sessions_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pdu_sessions_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pdu_sessions_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_pdu_session_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_pdu_session_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ue_context_in_smf_data_convertToJSON() failed [pdu_sessions]");
|
ogs_error("OpenAPI_ue_context_in_smf_data_convertToJSON() failed [pdu_sessions]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -125,12 +127,15 @@ OpenAPI_ue_context_in_smf_data_t *OpenAPI_ue_context_in_smf_data_parseFromJSON(c
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pdu_sessions_local_map, pdu_sessions) {
|
cJSON_ArrayForEach(pdu_sessions_local_map, pdu_sessions) {
|
||||||
cJSON *localMapObject = pdu_sessions_local_map;
|
cJSON *localMapObject = pdu_sessions_local_map;
|
||||||
if (!cJSON_IsObject(pdu_sessions_local_map)) {
|
if (cJSON_IsObject(pdu_sessions_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_pdu_session_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pdu_sessions_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ue_context_in_smf_data_parseFromJSON() failed [pdu_sessions]");
|
ogs_error("OpenAPI_ue_context_in_smf_data_parseFromJSON() failed [pdu_sessions]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_pdu_session_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pdu_sessionsList , localMapKeyPair);
|
OpenAPI_list_add(pdu_sessionsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,9 @@ cJSON *OpenAPI_ue_context_in_smf_data_1_convertToJSON(OpenAPI_ue_context_in_smf_
|
||||||
if (ue_context_in_smf_data_1->pdu_sessions) {
|
if (ue_context_in_smf_data_1->pdu_sessions) {
|
||||||
OpenAPI_list_for_each(ue_context_in_smf_data_1->pdu_sessions, pdu_sessions_node) {
|
OpenAPI_list_for_each(ue_context_in_smf_data_1->pdu_sessions, pdu_sessions_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pdu_sessions_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pdu_sessions_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_pdu_session_1_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_pdu_session_1_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ue_context_in_smf_data_1_convertToJSON() failed [pdu_sessions]");
|
ogs_error("OpenAPI_ue_context_in_smf_data_1_convertToJSON() failed [pdu_sessions]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -125,12 +127,15 @@ OpenAPI_ue_context_in_smf_data_1_t *OpenAPI_ue_context_in_smf_data_1_parseFromJS
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pdu_sessions_local_map, pdu_sessions) {
|
cJSON_ArrayForEach(pdu_sessions_local_map, pdu_sessions) {
|
||||||
cJSON *localMapObject = pdu_sessions_local_map;
|
cJSON *localMapObject = pdu_sessions_local_map;
|
||||||
if (!cJSON_IsObject(pdu_sessions_local_map)) {
|
if (cJSON_IsObject(pdu_sessions_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_pdu_session_1_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pdu_sessions_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ue_context_in_smf_data_1_parseFromJSON() failed [pdu_sessions]");
|
ogs_error("OpenAPI_ue_context_in_smf_data_1_parseFromJSON() failed [pdu_sessions]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_pdu_session_1_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pdu_sessionsList , localMapKeyPair);
|
OpenAPI_list_add(pdu_sessionsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,9 @@ cJSON *OpenAPI_ue_policy_set_convertToJSON(OpenAPI_ue_policy_set_t *ue_policy_se
|
||||||
if (ue_policy_set->pra_infos) {
|
if (ue_policy_set->pra_infos) {
|
||||||
OpenAPI_list_for_each(ue_policy_set->pra_infos, pra_infos_node) {
|
OpenAPI_list_for_each(ue_policy_set->pra_infos, pra_infos_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)pra_infos_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_presence_info_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_presence_info_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ue_policy_set_convertToJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_ue_policy_set_convertToJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -134,7 +136,9 @@ cJSON *OpenAPI_ue_policy_set_convertToJSON(OpenAPI_ue_policy_set_t *ue_policy_se
|
||||||
if (ue_policy_set->ue_policy_sections) {
|
if (ue_policy_set->ue_policy_sections) {
|
||||||
OpenAPI_list_for_each(ue_policy_set->ue_policy_sections, ue_policy_sections_node) {
|
OpenAPI_list_for_each(ue_policy_set->ue_policy_sections, ue_policy_sections_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ue_policy_sections_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ue_policy_sections_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_ue_policy_section_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_ue_policy_section_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ue_policy_set_convertToJSON() failed [ue_policy_sections]");
|
ogs_error("OpenAPI_ue_policy_set_convertToJSON() failed [ue_policy_sections]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -171,7 +175,9 @@ cJSON *OpenAPI_ue_policy_set_convertToJSON(OpenAPI_ue_policy_set_t *ue_policy_se
|
||||||
if (ue_policy_set->allowed_route_sel_descs) {
|
if (ue_policy_set->allowed_route_sel_descs) {
|
||||||
OpenAPI_list_for_each(ue_policy_set->allowed_route_sel_descs, allowed_route_sel_descs_node) {
|
OpenAPI_list_for_each(ue_policy_set->allowed_route_sel_descs, allowed_route_sel_descs_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)allowed_route_sel_descs_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)allowed_route_sel_descs_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_plmn_route_selection_descriptor_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_plmn_route_selection_descriptor_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ue_policy_set_convertToJSON() failed [allowed_route_sel_descs]");
|
ogs_error("OpenAPI_ue_policy_set_convertToJSON() failed [allowed_route_sel_descs]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -238,12 +244,15 @@ OpenAPI_ue_policy_set_t *OpenAPI_ue_policy_set_parseFromJSON(cJSON *ue_policy_se
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
cJSON_ArrayForEach(pra_infos_local_map, pra_infos) {
|
||||||
cJSON *localMapObject = pra_infos_local_map;
|
cJSON *localMapObject = pra_infos_local_map;
|
||||||
if (!cJSON_IsObject(pra_infos_local_map)) {
|
if (cJSON_IsObject(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(pra_infos_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ue_policy_set_parseFromJSON() failed [pra_infos]");
|
ogs_error("OpenAPI_ue_policy_set_parseFromJSON() failed [pra_infos]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_presence_info_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
OpenAPI_list_add(pra_infosList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,12 +290,15 @@ OpenAPI_ue_policy_set_t *OpenAPI_ue_policy_set_parseFromJSON(cJSON *ue_policy_se
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(ue_policy_sections_local_map, ue_policy_sections) {
|
cJSON_ArrayForEach(ue_policy_sections_local_map, ue_policy_sections) {
|
||||||
cJSON *localMapObject = ue_policy_sections_local_map;
|
cJSON *localMapObject = ue_policy_sections_local_map;
|
||||||
if (!cJSON_IsObject(ue_policy_sections_local_map)) {
|
if (cJSON_IsObject(ue_policy_sections_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_ue_policy_section_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(ue_policy_sections_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ue_policy_set_parseFromJSON() failed [ue_policy_sections]");
|
ogs_error("OpenAPI_ue_policy_set_parseFromJSON() failed [ue_policy_sections]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_ue_policy_section_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(ue_policy_sectionsList , localMapKeyPair);
|
OpenAPI_list_add(ue_policy_sectionsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -324,12 +336,15 @@ OpenAPI_ue_policy_set_t *OpenAPI_ue_policy_set_parseFromJSON(cJSON *ue_policy_se
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(allowed_route_sel_descs_local_map, allowed_route_sel_descs) {
|
cJSON_ArrayForEach(allowed_route_sel_descs_local_map, allowed_route_sel_descs) {
|
||||||
cJSON *localMapObject = allowed_route_sel_descs_local_map;
|
cJSON *localMapObject = allowed_route_sel_descs_local_map;
|
||||||
if (!cJSON_IsObject(allowed_route_sel_descs_local_map)) {
|
if (cJSON_IsObject(allowed_route_sel_descs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_plmn_route_selection_descriptor_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(allowed_route_sel_descs_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ue_policy_set_parseFromJSON() failed [allowed_route_sel_descs]");
|
ogs_error("OpenAPI_ue_policy_set_parseFromJSON() failed [allowed_route_sel_descs]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_plmn_route_selection_descriptor_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(allowed_route_sel_descsList , localMapKeyPair);
|
OpenAPI_list_add(allowed_route_sel_descsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,9 @@ cJSON *OpenAPI_ue_policy_set_patch_convertToJSON(OpenAPI_ue_policy_set_patch_t *
|
||||||
if (ue_policy_set_patch->ue_policy_sections) {
|
if (ue_policy_set_patch->ue_policy_sections) {
|
||||||
OpenAPI_list_for_each(ue_policy_set_patch->ue_policy_sections, ue_policy_sections_node) {
|
OpenAPI_list_for_each(ue_policy_set_patch->ue_policy_sections, ue_policy_sections_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ue_policy_sections_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)ue_policy_sections_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_ue_policy_section_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_ue_policy_section_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_ue_policy_set_patch_convertToJSON() failed [ue_policy_sections]");
|
ogs_error("OpenAPI_ue_policy_set_patch_convertToJSON() failed [ue_policy_sections]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -148,12 +150,15 @@ OpenAPI_ue_policy_set_patch_t *OpenAPI_ue_policy_set_patch_parseFromJSON(cJSON *
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(ue_policy_sections_local_map, ue_policy_sections) {
|
cJSON_ArrayForEach(ue_policy_sections_local_map, ue_policy_sections) {
|
||||||
cJSON *localMapObject = ue_policy_sections_local_map;
|
cJSON *localMapObject = ue_policy_sections_local_map;
|
||||||
if (!cJSON_IsObject(ue_policy_sections_local_map)) {
|
if (cJSON_IsObject(ue_policy_sections_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_ue_policy_section_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(ue_policy_sections_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_ue_policy_set_patch_parseFromJSON() failed [ue_policy_sections]");
|
ogs_error("OpenAPI_ue_policy_set_patch_parseFromJSON() failed [ue_policy_sections]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_ue_policy_section_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(ue_policy_sectionsList , localMapKeyPair);
|
OpenAPI_list_add(ue_policy_sectionsList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,9 @@ cJSON *OpenAPI_usage_mon_data_convertToJSON(OpenAPI_usage_mon_data_t *usage_mon_
|
||||||
if (usage_mon_data->scopes) {
|
if (usage_mon_data->scopes) {
|
||||||
OpenAPI_list_for_each(usage_mon_data->scopes, scopes_node) {
|
OpenAPI_list_for_each(usage_mon_data->scopes, scopes_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)scopes_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)scopes_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_usage_mon_data_scope_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_usage_mon_data_scope_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_usage_mon_data_convertToJSON() failed [scopes]");
|
ogs_error("OpenAPI_usage_mon_data_convertToJSON() failed [scopes]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -160,12 +162,15 @@ OpenAPI_usage_mon_data_t *OpenAPI_usage_mon_data_parseFromJSON(cJSON *usage_mon_
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(scopes_local_map, scopes) {
|
cJSON_ArrayForEach(scopes_local_map, scopes) {
|
||||||
cJSON *localMapObject = scopes_local_map;
|
cJSON *localMapObject = scopes_local_map;
|
||||||
if (!cJSON_IsObject(scopes_local_map)) {
|
if (cJSON_IsObject(scopes_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_usage_mon_data_scope_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(scopes_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_usage_mon_data_parseFromJSON() failed [scopes]");
|
ogs_error("OpenAPI_usage_mon_data_parseFromJSON() failed [scopes]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_usage_mon_data_scope_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(scopesList , localMapKeyPair);
|
OpenAPI_list_add(scopesList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,9 @@ cJSON *OpenAPI_usage_mon_data_limit_convertToJSON(OpenAPI_usage_mon_data_limit_t
|
||||||
if (usage_mon_data_limit->scopes) {
|
if (usage_mon_data_limit->scopes) {
|
||||||
OpenAPI_list_for_each(usage_mon_data_limit->scopes, scopes_node) {
|
OpenAPI_list_for_each(usage_mon_data_limit->scopes, scopes_node) {
|
||||||
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)scopes_node->data;
|
OpenAPI_map_t *localKeyValue = (OpenAPI_map_t*)scopes_node->data;
|
||||||
cJSON *itemLocal = OpenAPI_usage_mon_data_scope_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_usage_mon_data_scope_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_usage_mon_data_limit_convertToJSON() failed [scopes]");
|
ogs_error("OpenAPI_usage_mon_data_limit_convertToJSON() failed [scopes]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -164,12 +166,15 @@ OpenAPI_usage_mon_data_limit_t *OpenAPI_usage_mon_data_limit_parseFromJSON(cJSON
|
||||||
OpenAPI_map_t *localMapKeyPair = NULL;
|
OpenAPI_map_t *localMapKeyPair = NULL;
|
||||||
cJSON_ArrayForEach(scopes_local_map, scopes) {
|
cJSON_ArrayForEach(scopes_local_map, scopes) {
|
||||||
cJSON *localMapObject = scopes_local_map;
|
cJSON *localMapObject = scopes_local_map;
|
||||||
if (!cJSON_IsObject(scopes_local_map)) {
|
if (cJSON_IsObject(scopes_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_usage_mon_data_scope_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull(scopes_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_usage_mon_data_limit_parseFromJSON() failed [scopes]");
|
ogs_error("OpenAPI_usage_mon_data_limit_parseFromJSON() failed [scopes]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_usage_mon_data_scope_parseFromJSON(localMapObject));
|
|
||||||
OpenAPI_list_add(scopesList , localMapKeyPair);
|
OpenAPI_list_add(scopesList , localMapKeyPair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -505,7 +505,9 @@ cJSON *OpenAPI_{{classname}}_convertToJSON(OpenAPI_{{classname}}_t *{{classname}
|
||||||
{{/isBoolean}}
|
{{/isBoolean}}
|
||||||
{{/isPrimitiveType}}
|
{{/isPrimitiveType}}
|
||||||
{{^isPrimitiveType}}
|
{{^isPrimitiveType}}
|
||||||
cJSON *itemLocal = OpenAPI_{{complexType}}_convertToJSON(localKeyValue->value);
|
cJSON *itemLocal = localKeyValue->value ?
|
||||||
|
OpenAPI_{{complexType}}_convertToJSON(localKeyValue->value) :
|
||||||
|
cJSON_CreateNull();
|
||||||
if (itemLocal == NULL) {
|
if (itemLocal == NULL) {
|
||||||
ogs_error("OpenAPI_{{classname}}_convertToJSON() failed [{{{name}}}]");
|
ogs_error("OpenAPI_{{classname}}_convertToJSON() failed [{{{name}}}]");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -798,12 +800,15 @@ OpenAPI_{{classname}}_t *OpenAPI_{{classname}}_parseFromJSON(cJSON *{{classname}
|
||||||
{{/isNumeric}}
|
{{/isNumeric}}
|
||||||
{{/isPrimitiveType}}
|
{{/isPrimitiveType}}
|
||||||
{{^isPrimitiveType}}
|
{{^isPrimitiveType}}
|
||||||
if (!cJSON_IsObject({{{name}}}_local_map)) {
|
if (cJSON_IsObject({{{name}}}_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(
|
||||||
|
localMapObject->string, OpenAPI_{{complexType}}_parseFromJSON(localMapObject));
|
||||||
|
} else if (cJSON_IsNull({{{name}}}_local_map)) {
|
||||||
|
localMapKeyPair = OpenAPI_map_create(localMapObject->string, NULL);
|
||||||
|
} else {
|
||||||
ogs_error("OpenAPI_{{classname}}_parseFromJSON() failed [{{{name}}}]");
|
ogs_error("OpenAPI_{{classname}}_parseFromJSON() failed [{{{name}}}]");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
localMapKeyPair = OpenAPI_map_create(
|
|
||||||
localMapObject->string, OpenAPI_{{complexType}}_parseFromJSON(localMapObject));
|
|
||||||
{{/isPrimitiveType}}
|
{{/isPrimitiveType}}
|
||||||
OpenAPI_list_add({{{name}}}List , localMapKeyPair);
|
OpenAPI_list_add({{{name}}}List , localMapKeyPair);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
|
||||||
|
"spaces": 2,
|
||||||
|
"generator-cli": {
|
||||||
|
"version": "5.2.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -1206,6 +1206,9 @@ void amf_ue_remove(amf_ue_t *amf_ue)
|
||||||
/* Clear N2 Transfer */
|
/* Clear N2 Transfer */
|
||||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
||||||
|
|
||||||
|
/* Clear 5GSM Message */
|
||||||
|
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
|
||||||
|
|
||||||
/* Remove all session context */
|
/* Remove all session context */
|
||||||
amf_sess_remove_all(amf_ue);
|
amf_sess_remove_all(amf_ue);
|
||||||
|
|
||||||
|
@ -1677,6 +1680,7 @@ void amf_sess_remove(amf_sess_t *sess)
|
||||||
ogs_pkbuf_free(sess->pdu_session_establishment_accept);
|
ogs_pkbuf_free(sess->pdu_session_establishment_accept);
|
||||||
|
|
||||||
AMF_SESS_CLEAR_N2_TRANSFER(sess, pdu_session_resource_setup_request);
|
AMF_SESS_CLEAR_N2_TRANSFER(sess, pdu_session_resource_setup_request);
|
||||||
|
AMF_SESS_CLEAR_N2_TRANSFER(sess, pdu_session_resource_modification_command);
|
||||||
AMF_SESS_CLEAR_N2_TRANSFER(sess, path_switch_request_ack);
|
AMF_SESS_CLEAR_N2_TRANSFER(sess, path_switch_request_ack);
|
||||||
AMF_SESS_CLEAR_N2_TRANSFER(sess, handover_request);
|
AMF_SESS_CLEAR_N2_TRANSFER(sess, handover_request);
|
||||||
AMF_SESS_CLEAR_N2_TRANSFER(sess, handover_command);
|
AMF_SESS_CLEAR_N2_TRANSFER(sess, handover_command);
|
||||||
|
@ -1827,6 +1831,33 @@ bool amf_handover_request_transfer_needed(amf_ue_t *amf_ue)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool amf_paging_ongoing(amf_ue_t *amf_ue)
|
||||||
|
{
|
||||||
|
amf_sess_t *sess = NULL;
|
||||||
|
|
||||||
|
ogs_assert(amf_ue);
|
||||||
|
|
||||||
|
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||||
|
if (sess->paging.ongoing == true)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amf_downlink_signalling_pending(amf_ue_t *amf_ue)
|
||||||
|
{
|
||||||
|
amf_sess_t *sess = NULL;
|
||||||
|
|
||||||
|
ogs_assert(amf_ue);
|
||||||
|
|
||||||
|
ogs_list_for_each(&amf_ue->sess_list, sess)
|
||||||
|
if (sess->gsm_message.type)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int amf_find_served_tai(ogs_5gs_tai_t *nr_tai)
|
int amf_find_served_tai(ogs_5gs_tai_t *nr_tai)
|
||||||
{
|
{
|
||||||
int i = 0, j = 0, k = 0;
|
int i = 0, j = 0, k = 0;
|
||||||
|
|
|
@ -459,6 +459,7 @@ typedef struct amf_sess_s {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
ogs_pkbuf_t *pdu_session_resource_setup_request;
|
ogs_pkbuf_t *pdu_session_resource_setup_request;
|
||||||
|
ogs_pkbuf_t *pdu_session_resource_modification_command;
|
||||||
ogs_pkbuf_t *path_switch_request_ack;
|
ogs_pkbuf_t *path_switch_request_ack;
|
||||||
ogs_pkbuf_t *handover_request;
|
ogs_pkbuf_t *handover_request;
|
||||||
ogs_pkbuf_t *handover_command;
|
ogs_pkbuf_t *handover_command;
|
||||||
|
@ -467,13 +468,13 @@ typedef struct amf_sess_s {
|
||||||
do { \
|
do { \
|
||||||
ogs_assert(__sESS); \
|
ogs_assert(__sESS); \
|
||||||
ogs_assert((__sESS)->amf_ue); \
|
ogs_assert((__sESS)->amf_ue); \
|
||||||
if (sess->transfer.__n2Type) { \
|
if ((__sESS)->transfer.__n2Type) { \
|
||||||
ogs_warn("[%s:%d] N2 transfer message duplicated. Overwritten", \
|
ogs_warn("[%s:%d] N2 transfer message duplicated. Overwritten", \
|
||||||
((__sESS)->amf_ue)->supi, sess->psi); \
|
((__sESS)->amf_ue)->supi, (__sESS)->psi); \
|
||||||
ogs_pkbuf_free(sess->transfer.__n2Type); \
|
ogs_pkbuf_free((__sESS)->transfer.__n2Type); \
|
||||||
} \
|
} \
|
||||||
sess->transfer.__n2Type = __n2Buf; \
|
(__sESS)->transfer.__n2Type = __n2Buf; \
|
||||||
ogs_assert(sess->transfer.__n2Type); \
|
ogs_assert((__sESS)->transfer.__n2Type); \
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
#define AMF_SESS_CLEAR_N2_TRANSFER(__sESS, __n2Type) \
|
#define AMF_SESS_CLEAR_N2_TRANSFER(__sESS, __n2Type) \
|
||||||
|
@ -505,13 +506,14 @@ typedef struct amf_sess_s {
|
||||||
do { \
|
do { \
|
||||||
ogs_assert(__sESS); \
|
ogs_assert(__sESS); \
|
||||||
ogs_assert(__lOCATION); \
|
ogs_assert(__lOCATION); \
|
||||||
ogs_assert(__uRI); \
|
|
||||||
AMF_SESS_CLEAR_PAGING_INFO(__sESS) \
|
AMF_SESS_CLEAR_PAGING_INFO(__sESS) \
|
||||||
(__sESS)->paging.ongoing = true; \
|
(__sESS)->paging.ongoing = true; \
|
||||||
((__sESS)->paging.location) = ogs_strdup(__lOCATION); \
|
((__sESS)->paging.location) = ogs_strdup(__lOCATION); \
|
||||||
ogs_assert((__sESS)->paging.location); \
|
ogs_assert((__sESS)->paging.location); \
|
||||||
((__sESS)->paging.n1n2_failure_txf_notif_uri) = ogs_strdup(__uRI); \
|
if (__uRI) { \
|
||||||
ogs_assert((__sESS)->paging.n1n2_failure_txf_notif_uri); \
|
((__sESS)->paging.n1n2_failure_txf_notif_uri) = ogs_strdup(__uRI); \
|
||||||
|
ogs_assert((__sESS)->paging.n1n2_failure_txf_notif_uri); \
|
||||||
|
} \
|
||||||
} while(0);
|
} while(0);
|
||||||
#define AMF_SESS_CLEAR_PAGING_INFO(__sESS) \
|
#define AMF_SESS_CLEAR_PAGING_INFO(__sESS) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -519,9 +521,10 @@ typedef struct amf_sess_s {
|
||||||
ogs_assert((__sESS)->paging.location); \
|
ogs_assert((__sESS)->paging.location); \
|
||||||
ogs_free((__sESS)->paging.location); \
|
ogs_free((__sESS)->paging.location); \
|
||||||
((__sESS)->paging.location) = NULL; \
|
((__sESS)->paging.location) = NULL; \
|
||||||
ogs_assert((__sESS)->paging.n1n2_failure_txf_notif_uri); \
|
if ((__sESS)->paging.n1n2_failure_txf_notif_uri) { \
|
||||||
ogs_free((__sESS)->paging.n1n2_failure_txf_notif_uri); \
|
ogs_free((__sESS)->paging.n1n2_failure_txf_notif_uri); \
|
||||||
((__sESS)->paging.n1n2_failure_txf_notif_uri) = NULL; \
|
((__sESS)->paging.n1n2_failure_txf_notif_uri) = NULL; \
|
||||||
|
} \
|
||||||
((__sESS)->paging.ongoing) = false; \
|
((__sESS)->paging.ongoing) = false; \
|
||||||
} \
|
} \
|
||||||
} while(0);
|
} while(0);
|
||||||
|
@ -533,6 +536,52 @@ typedef struct amf_sess_s {
|
||||||
} \
|
} \
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint8_t type;
|
||||||
|
ogs_pkbuf_t *n1buf;
|
||||||
|
ogs_pkbuf_t *n2buf;
|
||||||
|
} gsm_message;
|
||||||
|
|
||||||
|
#define AMF_SESS_STORE_5GSM_MESSAGE(__sESS, __tYPE, __n1Buf, __n2Buf) \
|
||||||
|
do { \
|
||||||
|
ogs_assert(__sESS); \
|
||||||
|
ogs_assert((__sESS)->amf_ue); \
|
||||||
|
if ((__sESS)->gsm_message.n1buf) { \
|
||||||
|
ogs_warn("[%s:%d] N1 message duplicated. Overwritten", \
|
||||||
|
((__sESS)->amf_ue)->supi, (__sESS)->psi); \
|
||||||
|
ogs_pkbuf_free((__sESS)->gsm_message.n1buf); \
|
||||||
|
} \
|
||||||
|
(__sESS)->gsm_message.n1buf = __n1Buf; \
|
||||||
|
ogs_assert((__sESS)->gsm_message.n1buf); \
|
||||||
|
if ((__sESS)->gsm_message.n2buf) { \
|
||||||
|
ogs_warn("[%s:%d] N2 message duplicated. Overwritten", \
|
||||||
|
((__sESS)->amf_ue)->supi, (__sESS)->psi); \
|
||||||
|
ogs_pkbuf_free((__sESS)->gsm_message.n2buf); \
|
||||||
|
} \
|
||||||
|
(__sESS)->gsm_message.n2buf = __n2Buf; \
|
||||||
|
ogs_assert((__sESS)->gsm_message.n2buf); \
|
||||||
|
(__sESS)->gsm_message.type = __tYPE; \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
#define AMF_SESS_CLEAR_5GSM_MESSAGE(__sESS) \
|
||||||
|
do { \
|
||||||
|
if ((__sESS)->gsm_message.n1buf) \
|
||||||
|
ogs_pkbuf_free((__sESS)->gsm_message.n1buf); \
|
||||||
|
(__sESS)->gsm_message.n1buf = NULL; \
|
||||||
|
if ((__sESS)->gsm_message.n2buf) \
|
||||||
|
ogs_pkbuf_free((__sESS)->gsm_message.n2buf); \
|
||||||
|
(__sESS)->gsm_message.n2buf = NULL; \
|
||||||
|
(__sESS)->gsm_message.type = 0; \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
#define AMF_UE_CLEAR_5GSM_MESSAGE(__aMF) \
|
||||||
|
do { \
|
||||||
|
amf_sess_t *sess = NULL; \
|
||||||
|
ogs_list_for_each(&((__aMF)->sess_list), sess) { \
|
||||||
|
AMF_SESS_CLEAR_5GSM_MESSAGE(sess) \
|
||||||
|
} \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
char *nsi_id;
|
char *nsi_id;
|
||||||
struct {
|
struct {
|
||||||
|
@ -691,6 +740,13 @@ bool amf_pdu_res_setup_req_transfer_needed(amf_ue_t *amf_ue);
|
||||||
(amf_handover_request_transfer_needed(__aMF) == true)
|
(amf_handover_request_transfer_needed(__aMF) == true)
|
||||||
bool amf_handover_request_transfer_needed(amf_ue_t *amf_ue);
|
bool amf_handover_request_transfer_needed(amf_ue_t *amf_ue);
|
||||||
|
|
||||||
|
#define PAGING_ONGOING(__aMF) \
|
||||||
|
(amf_paging_ongoing(__aMF) == true)
|
||||||
|
bool amf_paging_ongoing(amf_ue_t *amf_ue);
|
||||||
|
#define DOWNLINK_SIGNALLING_PENDING(__aMF) \
|
||||||
|
(amf_downlink_signalling_pending(__aMF) == true)
|
||||||
|
bool amf_downlink_signalling_pending(amf_ue_t *amf_ue);
|
||||||
|
|
||||||
int amf_find_served_tai(ogs_5gs_tai_t *nr_tai);
|
int amf_find_served_tai(ogs_5gs_tai_t *nr_tai);
|
||||||
ogs_s_nssai_t *amf_find_s_nssai(
|
ogs_s_nssai_t *amf_find_s_nssai(
|
||||||
ogs_plmn_id_t *served_plmn_id, ogs_s_nssai_t *s_nssai);
|
ogs_plmn_id_t *served_plmn_id, ogs_s_nssai_t *s_nssai);
|
||||||
|
|
|
@ -201,6 +201,7 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
|
||||||
*/
|
*/
|
||||||
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
||||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
||||||
|
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
|
||||||
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
|
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
|
||||||
|
|
||||||
if (SECURITY_CONTEXT_IS_VALID(amf_ue)) {
|
if (SECURITY_CONTEXT_IS_VALID(amf_ue)) {
|
||||||
|
@ -1101,10 +1102,46 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
||||||
sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, ¶m,
|
sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, ¶m,
|
||||||
amf_nsmf_pdusession_build_update_sm_context));
|
amf_nsmf_pdusession_build_update_sm_context));
|
||||||
|
|
||||||
if (gsm_header->message_type ==
|
switch (gsm_header->message_type) {
|
||||||
OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE) {
|
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE:
|
||||||
|
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_REJECT:
|
||||||
|
if (PAGING_ONGOING(amf_ue) == true) {
|
||||||
|
|
||||||
|
gmm_configuration_update_command_param_t param;
|
||||||
|
/*
|
||||||
|
* TS24.501
|
||||||
|
* 5.4.4 Generic UE configuration update procedure
|
||||||
|
* 5.4.4.1 General
|
||||||
|
*
|
||||||
|
* This procedure shall be initiated by the network to assign
|
||||||
|
* a new 5G-GUTI to the UE after a successful service request
|
||||||
|
* procedure invoked as a response to a paging request
|
||||||
|
* from the network and before the release
|
||||||
|
* of the N1 NAS signalling connection.
|
||||||
|
*
|
||||||
|
* If the service request procedure was triggered
|
||||||
|
* due to 5GSM downlink signalling pending, the procedure
|
||||||
|
* for assigning a new 5G-GUTI can be initiated by the network
|
||||||
|
* after the transport of the 5GSM downlink signalling.
|
||||||
|
*/
|
||||||
|
amf_ue_new_guti(amf_ue);
|
||||||
|
|
||||||
|
memset(¶m, 0, sizeof(param));
|
||||||
|
param.acknowledgement_requested = 1;
|
||||||
|
param.guti = 1;
|
||||||
|
ogs_assert(OGS_OK ==
|
||||||
|
nas_5gs_send_configuration_update_command(
|
||||||
|
amf_ue, ¶m));
|
||||||
|
|
||||||
|
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE:
|
||||||
/* Prevent to invoke SMF for this session */
|
/* Prevent to invoke SMF for this session */
|
||||||
CLEAR_SM_CONTEXT_REF(sess);
|
CLEAR_SM_CONTEXT_REF(sess);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -53,14 +53,6 @@ int gmm_handle_security_mode_complete(amf_ue_t *amf_ue,
|
||||||
int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
||||||
ogs_nas_5gs_ul_nas_transport_t *ul_nas_transport);
|
ogs_nas_5gs_ul_nas_transport_t *ul_nas_transport);
|
||||||
|
|
||||||
#if 0
|
|
||||||
int gmm_handle_tau_request(amf_ue_t *amf_ue,
|
|
||||||
ogs_nas_5gs_tracking_area_update_request_t *tau_request);
|
|
||||||
|
|
||||||
int gmm_handle_extended_service_request(amf_ue_t *amf_ue,
|
|
||||||
ogs_nas_5gs_extended_service_request_t *extended_service_request);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -66,6 +66,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
|
||||||
case OGS_FSM_ENTRY_SIG:
|
case OGS_FSM_ENTRY_SIG:
|
||||||
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
||||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
||||||
|
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
|
||||||
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
|
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
|
||||||
break;
|
break;
|
||||||
case OGS_FSM_EXIT_SIG:
|
case OGS_FSM_EXIT_SIG:
|
||||||
|
@ -367,7 +368,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
||||||
ogs_warn("[%s] Paging failed. Stop", amf_ue->supi);
|
ogs_warn("[%s] Paging failed. Stop", amf_ue->supi);
|
||||||
|
|
||||||
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||||
if (sess->paging.ongoing == true) {
|
if (sess->paging.ongoing == true &&
|
||||||
|
sess->paging.n1n2_failure_txf_notif_uri != NULL) {
|
||||||
ogs_assert(true ==
|
ogs_assert(true ==
|
||||||
amf_sbi_send_n1_n2_failure_notify(
|
amf_sbi_send_n1_n2_failure_notify(
|
||||||
sess,
|
sess,
|
||||||
|
@ -382,6 +384,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
||||||
AMF_UE_CLEAR_N2_TRANSFER(
|
AMF_UE_CLEAR_N2_TRANSFER(
|
||||||
amf_ue, pdu_session_resource_setup_request);
|
amf_ue, pdu_session_resource_setup_request);
|
||||||
|
|
||||||
|
/* Clear 5GSM Message */
|
||||||
|
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
|
||||||
|
|
||||||
/* Clear t3513 Timers */
|
/* Clear t3513 Timers */
|
||||||
CLEAR_AMF_UE_TIMER(amf_ue->t3513);
|
CLEAR_AMF_UE_TIMER(amf_ue->t3513);
|
||||||
|
|
||||||
|
@ -1181,6 +1186,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
||||||
case OGS_FSM_ENTRY_SIG:
|
case OGS_FSM_ENTRY_SIG:
|
||||||
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
||||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request);
|
||||||
|
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
|
||||||
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
|
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
|
||||||
|
|
||||||
amf_sbi_send_release_all_sessions(
|
amf_sbi_send_release_all_sessions(
|
||||||
|
|
|
@ -143,23 +143,6 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
ogs_assert(n2buf);
|
ogs_assert(n2buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (n2InfoContent->ngap_ie_type) {
|
|
||||||
case OpenAPI_ngap_ie_type_PDU_RES_SETUP_REQ:
|
|
||||||
case OpenAPI_ngap_ie_type_PDU_RES_MOD_REQ:
|
|
||||||
case OpenAPI_ngap_ie_type_PDU_RES_REL_CMD:
|
|
||||||
/* N1 SM Message */
|
|
||||||
if (n1buf) {
|
|
||||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
|
||||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf, 0, 0);
|
|
||||||
ogs_assert(gmmbuf);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ogs_error("Not implemented ngap_ie_type[%d]",
|
|
||||||
n2InfoContent->ngap_ie_type);
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&sendmsg, 0, sizeof(sendmsg));
|
memset(&sendmsg, 0, sizeof(sendmsg));
|
||||||
|
|
||||||
status = OGS_SBI_HTTP_STATUS_OK;
|
status = OGS_SBI_HTTP_STATUS_OK;
|
||||||
|
@ -177,6 +160,12 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (n1buf) {
|
||||||
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf, 0, 0);
|
||||||
|
ogs_assert(gmmbuf);
|
||||||
|
}
|
||||||
|
|
||||||
if (gmmbuf) {
|
if (gmmbuf) {
|
||||||
ran_ue_t *ran_ue = NULL;
|
ran_ue_t *ran_ue = NULL;
|
||||||
|
|
||||||
|
@ -301,7 +290,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OpenAPI_ngap_ie_type_PDU_RES_MOD_REQ:
|
case OpenAPI_ngap_ie_type_PDU_RES_MOD_REQ:
|
||||||
if (!gmmbuf) {
|
if (!n1buf) {
|
||||||
ogs_error("[%s] No N1 SM Content", amf_ue->supi);
|
ogs_error("[%s] No N1 SM Content", amf_ue->supi);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -311,10 +300,45 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CM_IDLE(amf_ue)) {
|
if (CM_IDLE(amf_ue)) {
|
||||||
ogs_fatal("[%s] IDLE state is not implemented", amf_ue->supi);
|
ogs_sbi_server_t *server = NULL;
|
||||||
ogs_assert_if_reached();
|
ogs_sbi_header_t header;
|
||||||
|
|
||||||
|
status = OGS_SBI_HTTP_STATUS_ACCEPTED;
|
||||||
|
N1N2MessageTransferRspData.cause =
|
||||||
|
OpenAPI_n1_n2_message_transfer_cause_ATTEMPTING_TO_REACH_UE;
|
||||||
|
|
||||||
|
/* Location */
|
||||||
|
server = ogs_sbi_server_from_stream(stream);
|
||||||
|
ogs_assert(server);
|
||||||
|
|
||||||
|
memset(&header, 0, sizeof(header));
|
||||||
|
header.service.name = (char *)OGS_SBI_SERVICE_NAME_NAMF_COMM;
|
||||||
|
header.api.version = (char *)OGS_SBI_API_V1;
|
||||||
|
header.resource.component[0] =
|
||||||
|
(char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS;
|
||||||
|
header.resource.component[1] = amf_ue->supi;
|
||||||
|
header.resource.component[2] =
|
||||||
|
(char *)OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES;
|
||||||
|
header.resource.component[3] = sess->sm_context_ref;
|
||||||
|
|
||||||
|
sendmsg.http.location = ogs_sbi_server_uri(server, &header);
|
||||||
|
|
||||||
|
/* Store Paging Info */
|
||||||
|
AMF_SESS_STORE_PAGING_INFO(
|
||||||
|
sess, sendmsg.http.location, NULL);
|
||||||
|
|
||||||
|
/* Store 5GSM Message */
|
||||||
|
AMF_SESS_STORE_5GSM_MESSAGE(sess,
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND,
|
||||||
|
n1buf, n2buf);
|
||||||
|
|
||||||
|
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
|
||||||
|
|
||||||
} else if (CM_CONNECTED(amf_ue)) {
|
} else if (CM_CONNECTED(amf_ue)) {
|
||||||
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf, 0, 0);
|
||||||
|
ogs_assert(gmmbuf);
|
||||||
|
|
||||||
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
||||||
sess, gmmbuf, n2buf);
|
sess, gmmbuf, n2buf);
|
||||||
ogs_assert(ngapbuf);
|
ogs_assert(ngapbuf);
|
||||||
|
@ -335,9 +359,10 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (n1buf)
|
||||||
|
ogs_pkbuf_free(n1buf);
|
||||||
|
|
||||||
if (CM_IDLE(amf_ue)) {
|
if (CM_IDLE(amf_ue)) {
|
||||||
if (gmmbuf)
|
|
||||||
ogs_pkbuf_free(gmmbuf);
|
|
||||||
if (n2buf)
|
if (n2buf)
|
||||||
ogs_pkbuf_free(n2buf);
|
ogs_pkbuf_free(n2buf);
|
||||||
|
|
||||||
|
|
|
@ -416,6 +416,37 @@ int nas_5gs_send_configuration_update_command(
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
||||||
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
amf_ue_t *amf_ue = NULL;
|
||||||
|
|
||||||
|
ogs_pkbuf_t *gmmbuf = NULL;
|
||||||
|
ogs_pkbuf_t *ngapbuf = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
amf_ue = sess->amf_ue;
|
||||||
|
ogs_assert(amf_ue);
|
||||||
|
ogs_assert(n1smbuf);
|
||||||
|
ogs_assert(n2smbuf);
|
||||||
|
|
||||||
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
||||||
|
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||||
|
|
||||||
|
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
||||||
|
sess, gmmbuf, n2smbuf);
|
||||||
|
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||||
|
|
||||||
|
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||||
|
ogs_expect(rv == OGS_OK);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,9 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue);
|
||||||
int nas_5gs_send_configuration_update_command(
|
int nas_5gs_send_configuration_update_command(
|
||||||
amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param);
|
amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param);
|
||||||
|
|
||||||
|
int nas_send_pdu_session_modification_command(amf_sess_t *sess,
|
||||||
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
||||||
|
|
||||||
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
||||||
|
|
||||||
|
|
|
@ -759,8 +759,6 @@ void ngap_handle_initial_context_setup_response(
|
||||||
uint64_t amf_ue_ngap_id;
|
uint64_t amf_ue_ngap_id;
|
||||||
amf_nsmf_pdusession_sm_context_param_t param;
|
amf_nsmf_pdusession_sm_context_param_t param;
|
||||||
|
|
||||||
bool paging_ongoing = false;
|
|
||||||
|
|
||||||
NGAP_SuccessfulOutcome_t *successfulOutcome = NULL;
|
NGAP_SuccessfulOutcome_t *successfulOutcome = NULL;
|
||||||
NGAP_InitialContextSetupResponse_t *InitialContextSetupResponse = NULL;
|
NGAP_InitialContextSetupResponse_t *InitialContextSetupResponse = NULL;
|
||||||
|
|
||||||
|
@ -913,14 +911,60 @@ void ngap_handle_initial_context_setup_response(
|
||||||
ogs_pkbuf_free(param.n2smbuf);
|
ogs_pkbuf_free(param.n2smbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
/*
|
||||||
if (sess->paging.ongoing == true) {
|
* TS24.501
|
||||||
paging_ongoing = true;
|
* 5.4.4 Generic UE configuration update procedure
|
||||||
break;
|
* 5.4.4.1 General
|
||||||
}
|
*
|
||||||
}
|
* This procedure shall be initiated by the network to assign
|
||||||
|
* a new 5G-GUTI to the UE after a successful service request
|
||||||
|
* procedure invoked as a response to a paging request
|
||||||
|
* from the network and before the release of the N1 NAS signalling
|
||||||
|
* connection.
|
||||||
|
*/
|
||||||
|
if (DOWNLINK_SIGNALLING_PENDING(amf_ue) == true) {
|
||||||
|
/*
|
||||||
|
* TS24.501
|
||||||
|
* 5.4.4 Generic UE configuration update procedure
|
||||||
|
* 5.4.4.1 General
|
||||||
|
*
|
||||||
|
* If the service request procedure was triggered
|
||||||
|
* due to 5GSM downlink signalling pending, the procedure
|
||||||
|
* for assigning a new 5G-GUTI can be initiated by the network
|
||||||
|
* after the transport of the 5GSM downlink signalling.
|
||||||
|
*/
|
||||||
|
ogs_list_for_each(&amf_ue->sess_list, sess) {
|
||||||
|
ogs_pkbuf_t *ngapbuf = NULL;
|
||||||
|
ogs_pkbuf_t *gmmbuf = NULL;
|
||||||
|
|
||||||
if (paging_ongoing == true) {
|
/* There is no Downlink Signalling Pending in this sesssion */
|
||||||
|
if (sess->gsm_message.type == 0) continue;
|
||||||
|
|
||||||
|
switch (sess->gsm_message.type) {
|
||||||
|
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND:
|
||||||
|
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||||
|
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
|
||||||
|
sess->gsm_message.n1buf, 0, 0);
|
||||||
|
ogs_assert(gmmbuf);
|
||||||
|
|
||||||
|
ngapbuf = ngap_build_pdu_session_resource_modify_request(
|
||||||
|
sess, gmmbuf, sess->gsm_message.n2buf);
|
||||||
|
ogs_assert(ngapbuf);
|
||||||
|
|
||||||
|
if (nas_5gs_send_to_gnb(amf_ue, ngapbuf) != OGS_OK) {
|
||||||
|
ogs_error("nas_5gs_send_to_gnb() failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
AMF_SESS_CLEAR_5GSM_MESSAGE(sess);
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ogs_fatal("Unknown GSM Message Type[%d]",
|
||||||
|
sess->gsm_message.type);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (PAGING_ONGOING(amf_ue) == true) {
|
||||||
gmm_configuration_update_command_param_t param;
|
gmm_configuration_update_command_param_t param;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -951,9 +995,9 @@ void ngap_handle_initial_context_setup_response(
|
||||||
param.guti = 1;
|
param.guti = 1;
|
||||||
ogs_assert(OGS_OK ==
|
ogs_assert(OGS_OK ==
|
||||||
nas_5gs_send_configuration_update_command(amf_ue, ¶m));
|
nas_5gs_send_configuration_update_command(amf_ue, ¶m));
|
||||||
}
|
|
||||||
|
|
||||||
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ngap_handle_initial_context_setup_failure(
|
void ngap_handle_initial_context_setup_failure(
|
||||||
|
|
|
@ -255,6 +255,43 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OpenAPI_n2_sm_info_type_PDU_RES_MOD_REQ:
|
||||||
|
if (!n1smbuf) {
|
||||||
|
ogs_error("[%s:%d] No N1 SM Content [%s]",
|
||||||
|
amf_ue->supi, sess->psi, n1SmMsg->content_id);
|
||||||
|
ogs_assert(OGS_OK ==
|
||||||
|
nas_5gs_send_back_gsm_message(sess,
|
||||||
|
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
|
||||||
|
AMF_NAS_BACKOFF_TIME));
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!n2smbuf) {
|
||||||
|
ogs_error("[%s:%d] No N2 SM Content",
|
||||||
|
amf_ue->supi, sess->psi);
|
||||||
|
ogs_assert(OGS_OK ==
|
||||||
|
nas_5gs_send_back_gsm_message(sess,
|
||||||
|
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
|
||||||
|
AMF_NAS_BACKOFF_TIME));
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE : The pkbuf created in the SBI message will be removed
|
||||||
|
* from ogs_sbi_message_free(), so it must be copied.
|
||||||
|
*/
|
||||||
|
n1smbuf = ogs_pkbuf_copy(n1smbuf);
|
||||||
|
ogs_assert(n1smbuf);
|
||||||
|
|
||||||
|
n2smbuf = ogs_pkbuf_copy(n2smbuf);
|
||||||
|
ogs_assert(n2smbuf);
|
||||||
|
|
||||||
|
ogs_assert(OGS_OK ==
|
||||||
|
nas_send_pdu_session_modification_command(
|
||||||
|
sess, n1smbuf, n2smbuf));
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
case OpenAPI_n2_sm_info_type_PDU_RES_REL_CMD:
|
case OpenAPI_n2_sm_info_type_PDU_RES_REL_CMD:
|
||||||
if (!n1smbuf) {
|
if (!n1smbuf) {
|
||||||
ogs_error("[%s:%d] No N1 SM Content [%s]",
|
ogs_error("[%s:%d] No N1 SM Content [%s]",
|
||||||
|
|
|
@ -25,6 +25,7 @@ int __pcf_log_domain;
|
||||||
|
|
||||||
static OGS_POOL(pcf_ue_pool, pcf_ue_t);
|
static OGS_POOL(pcf_ue_pool, pcf_ue_t);
|
||||||
static OGS_POOL(pcf_sess_pool, pcf_sess_t);
|
static OGS_POOL(pcf_sess_pool, pcf_sess_t);
|
||||||
|
static OGS_POOL(pcf_app_pool, pcf_app_t);
|
||||||
|
|
||||||
static int context_initialized = 0;
|
static int context_initialized = 0;
|
||||||
|
|
||||||
|
@ -43,6 +44,7 @@ void pcf_context_init(void)
|
||||||
|
|
||||||
ogs_pool_init(&pcf_ue_pool, ogs_app()->max.ue);
|
ogs_pool_init(&pcf_ue_pool, ogs_app()->max.ue);
|
||||||
ogs_pool_init(&pcf_sess_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&pcf_sess_pool, ogs_app()->pool.sess);
|
||||||
|
ogs_pool_init(&pcf_app_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
ogs_list_init(&self.pcf_ue_list);
|
ogs_list_init(&self.pcf_ue_list);
|
||||||
|
|
||||||
|
@ -69,6 +71,7 @@ void pcf_context_final(void)
|
||||||
ogs_assert(self.ipv6prefix_hash);
|
ogs_assert(self.ipv6prefix_hash);
|
||||||
ogs_hash_destroy(self.ipv6prefix_hash);
|
ogs_hash_destroy(self.ipv6prefix_hash);
|
||||||
|
|
||||||
|
ogs_pool_final(&pcf_app_pool);
|
||||||
ogs_pool_final(&pcf_sess_pool);
|
ogs_pool_final(&pcf_sess_pool);
|
||||||
ogs_pool_final(&pcf_ue_pool);
|
ogs_pool_final(&pcf_ue_pool);
|
||||||
|
|
||||||
|
@ -238,6 +241,8 @@ pcf_sess_t *pcf_sess_add(pcf_ue_t *pcf_ue, uint8_t psi)
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
memset(sess, 0, sizeof *sess);
|
memset(sess, 0, sizeof *sess);
|
||||||
|
|
||||||
|
ogs_list_init(&sess->app_list);
|
||||||
|
|
||||||
/* SBI Type */
|
/* SBI Type */
|
||||||
sess->sbi.type = OGS_SBI_OBJ_SESS_TYPE;
|
sess->sbi.type = OGS_SBI_OBJ_SESS_TYPE;
|
||||||
|
|
||||||
|
@ -257,10 +262,6 @@ pcf_sess_t *pcf_sess_add(pcf_ue_t *pcf_ue, uint8_t psi)
|
||||||
(int)ogs_pool_index(&pcf_sess_pool, sess));
|
(int)ogs_pool_index(&pcf_sess_pool, sess));
|
||||||
ogs_assert(sess->sm_policy_id);
|
ogs_assert(sess->sm_policy_id);
|
||||||
|
|
||||||
sess->app_session_id = ogs_msprintf("%d",
|
|
||||||
(int)ogs_pool_index(&pcf_sess_pool, sess));
|
|
||||||
ogs_assert(sess->app_session_id);
|
|
||||||
|
|
||||||
sess->pcf_ue = pcf_ue;
|
sess->pcf_ue = pcf_ue;
|
||||||
sess->psi = psi;
|
sess->psi = psi;
|
||||||
|
|
||||||
|
@ -294,12 +295,11 @@ void pcf_sess_remove(pcf_sess_t *sess)
|
||||||
/* Free SBI object memory */
|
/* Free SBI object memory */
|
||||||
ogs_sbi_object_free(&sess->sbi);
|
ogs_sbi_object_free(&sess->sbi);
|
||||||
|
|
||||||
|
pcf_app_remove_all(sess);
|
||||||
|
|
||||||
ogs_assert(sess->sm_policy_id);
|
ogs_assert(sess->sm_policy_id);
|
||||||
ogs_free(sess->sm_policy_id);
|
ogs_free(sess->sm_policy_id);
|
||||||
|
|
||||||
ogs_assert(sess->app_session_id);
|
|
||||||
ogs_free(sess->app_session_id);
|
|
||||||
|
|
||||||
if (sess->binding_id)
|
if (sess->binding_id)
|
||||||
ogs_free(sess->binding_id);
|
ogs_free(sess->binding_id);
|
||||||
|
|
||||||
|
@ -410,12 +410,6 @@ pcf_sess_t *pcf_sess_find_by_sm_policy_id(char *sm_policy_id)
|
||||||
return pcf_sess_find(atoll(sm_policy_id));
|
return pcf_sess_find(atoll(sm_policy_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
pcf_sess_t *pcf_sess_find_by_app_session_id(char *app_session_id)
|
|
||||||
{
|
|
||||||
ogs_assert(app_session_id);
|
|
||||||
return pcf_sess_find(atoll(app_session_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
pcf_sess_t *pcf_sess_find_by_psi(pcf_ue_t *pcf_ue, uint8_t psi)
|
pcf_sess_t *pcf_sess_find_by_psi(pcf_ue_t *pcf_ue, uint8_t psi)
|
||||||
{
|
{
|
||||||
pcf_sess_t *sess = NULL;
|
pcf_sess_t *sess = NULL;
|
||||||
|
@ -511,3 +505,70 @@ void pcf_sess_select_nf(pcf_sess_t *sess, OpenAPI_nf_type_e nf_type)
|
||||||
else
|
else
|
||||||
ogs_sbi_select_first_nf(&sess->sbi, nf_type, pcf_nf_state_registered);
|
ogs_sbi_select_first_nf(&sess->sbi, nf_type, pcf_nf_state_registered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcf_app_t *pcf_app_add(pcf_sess_t *sess)
|
||||||
|
{
|
||||||
|
pcf_app_t *app = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
|
||||||
|
ogs_pool_alloc(&pcf_app_pool, &app);
|
||||||
|
ogs_assert(app);
|
||||||
|
memset(app, 0, sizeof *app);
|
||||||
|
|
||||||
|
app->app_session_id = ogs_msprintf("%d",
|
||||||
|
(int)ogs_pool_index(&pcf_app_pool, app));
|
||||||
|
ogs_assert(app->app_session_id);
|
||||||
|
|
||||||
|
app->sess = sess;
|
||||||
|
|
||||||
|
ogs_list_add(&sess->app_list, app);
|
||||||
|
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcf_app_remove(pcf_app_t *app)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_assert(app);
|
||||||
|
ogs_assert(app->sess);
|
||||||
|
|
||||||
|
ogs_list_remove(&app->sess->app_list, app);
|
||||||
|
|
||||||
|
for (i = 0; i < app->num_of_pcc_rule; i++) {
|
||||||
|
OGS_PCC_RULE_FREE(&app->pcc_rule[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app->notif_uri)
|
||||||
|
ogs_free(app->notif_uri);
|
||||||
|
if (app->naf.client)
|
||||||
|
ogs_sbi_client_remove(app->naf.client);
|
||||||
|
|
||||||
|
ogs_assert(app->app_session_id);
|
||||||
|
ogs_free(app->app_session_id);
|
||||||
|
|
||||||
|
ogs_pool_free(&pcf_app_pool, app);
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pcf_app_remove_all(pcf_sess_t *sess)
|
||||||
|
{
|
||||||
|
pcf_app_t *app = NULL, *next_app = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_list_for_each_safe(&sess->app_list, next_app, app)
|
||||||
|
pcf_app_remove(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
pcf_app_t *pcf_app_find(uint32_t index)
|
||||||
|
{
|
||||||
|
return ogs_pool_find(&pcf_app_pool, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
pcf_app_t *pcf_app_find_by_app_session_id(char *app_session_id)
|
||||||
|
{
|
||||||
|
ogs_assert(app_session_id);
|
||||||
|
return pcf_app_find(atoll(app_session_id));
|
||||||
|
}
|
||||||
|
|
|
@ -122,8 +122,6 @@ struct pcf_sess_s {
|
||||||
uint8_t addr6[OGS_IPV6_LEN];
|
uint8_t addr6[OGS_IPV6_LEN];
|
||||||
} ipv6prefix;
|
} ipv6prefix;
|
||||||
|
|
||||||
char *app_session_id;
|
|
||||||
|
|
||||||
ogs_s_nssai_t s_nssai;
|
ogs_s_nssai_t s_nssai;
|
||||||
|
|
||||||
/* SBI Features */
|
/* SBI Features */
|
||||||
|
@ -134,10 +132,28 @@ struct pcf_sess_s {
|
||||||
OpenAPI_ambr_t *subscribed_sess_ambr;
|
OpenAPI_ambr_t *subscribed_sess_ambr;
|
||||||
OpenAPI_subscribed_default_qos_t *subscribed_default_qos;
|
OpenAPI_subscribed_default_qos_t *subscribed_default_qos;
|
||||||
|
|
||||||
|
ogs_list_t app_list;
|
||||||
|
|
||||||
/* Related Context */
|
/* Related Context */
|
||||||
pcf_ue_t *pcf_ue;
|
pcf_ue_t *pcf_ue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct pcf_app_s {
|
||||||
|
ogs_lnode_t lnode;
|
||||||
|
|
||||||
|
char *app_session_id;
|
||||||
|
|
||||||
|
char *notif_uri;
|
||||||
|
struct {
|
||||||
|
ogs_sbi_client_t *client;
|
||||||
|
} naf;
|
||||||
|
|
||||||
|
ogs_pcc_rule_t pcc_rule[OGS_MAX_NUM_OF_PCC_RULE];
|
||||||
|
int num_of_pcc_rule;
|
||||||
|
|
||||||
|
pcf_sess_t *sess;
|
||||||
|
} pcf_app_t;
|
||||||
|
|
||||||
void pcf_context_init(void);
|
void pcf_context_init(void);
|
||||||
void pcf_context_final(void);
|
void pcf_context_final(void);
|
||||||
pcf_context_t *pcf_self(void);
|
pcf_context_t *pcf_self(void);
|
||||||
|
@ -159,7 +175,6 @@ bool pcf_sess_set_ipv6prefix(pcf_sess_t *sess, char *ipv6prefix);
|
||||||
|
|
||||||
pcf_sess_t *pcf_sess_find(uint32_t index);
|
pcf_sess_t *pcf_sess_find(uint32_t index);
|
||||||
pcf_sess_t *pcf_sess_find_by_sm_policy_id(char *sm_policy_id);
|
pcf_sess_t *pcf_sess_find_by_sm_policy_id(char *sm_policy_id);
|
||||||
pcf_sess_t *pcf_sess_find_by_app_session_id(char *app_session_id);
|
|
||||||
pcf_sess_t *pcf_sess_find_by_psi(pcf_ue_t *pcf_ue, uint8_t psi);
|
pcf_sess_t *pcf_sess_find_by_psi(pcf_ue_t *pcf_ue, uint8_t psi);
|
||||||
pcf_sess_t *pcf_sess_find_by_dnn(pcf_ue_t *pcf_ue, char *dnn);
|
pcf_sess_t *pcf_sess_find_by_dnn(pcf_ue_t *pcf_ue, char *dnn);
|
||||||
pcf_sess_t *pcf_sess_find_by_ipv4addr(char *ipv4addr_string);
|
pcf_sess_t *pcf_sess_find_by_ipv4addr(char *ipv4addr_string);
|
||||||
|
@ -172,6 +187,12 @@ pcf_sess_t *pcf_sess_cycle(pcf_sess_t *sess);
|
||||||
void pcf_ue_select_nf(pcf_ue_t *pcf_ue, OpenAPI_nf_type_e nf_type);
|
void pcf_ue_select_nf(pcf_ue_t *pcf_ue, OpenAPI_nf_type_e nf_type);
|
||||||
void pcf_sess_select_nf(pcf_sess_t *sess, OpenAPI_nf_type_e nf_type);
|
void pcf_sess_select_nf(pcf_sess_t *sess, OpenAPI_nf_type_e nf_type);
|
||||||
|
|
||||||
|
pcf_app_t *pcf_app_add(pcf_sess_t *sess);
|
||||||
|
int pcf_app_remove(pcf_app_t *app);
|
||||||
|
void pcf_app_remove_all(pcf_sess_t *sess);
|
||||||
|
pcf_app_t *pcf_app_find(uint32_t index);
|
||||||
|
pcf_app_t *pcf_app_find_by_app_session_id(char *app_session_id);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,6 +34,7 @@ typedef struct ogs_sbi_subscription_s ogs_sbi_subscription_t;
|
||||||
|
|
||||||
typedef struct pcf_ue_s pcf_ue_t;
|
typedef struct pcf_ue_s pcf_ue_t;
|
||||||
typedef struct pcf_sess_s pcf_sess_t;
|
typedef struct pcf_sess_s pcf_sess_t;
|
||||||
|
typedef struct pcf_app_s pcf_app_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PCF_EVT_BASE = OGS_FSM_USER_SIG,
|
PCF_EVT_BASE = OGS_FSM_USER_SIG,
|
||||||
|
@ -60,6 +61,7 @@ typedef struct pcf_event_s {
|
||||||
|
|
||||||
pcf_ue_t *pcf_ue;
|
pcf_ue_t *pcf_ue;
|
||||||
pcf_sess_t *sess;
|
pcf_sess_t *sess;
|
||||||
|
pcf_app_t *app;
|
||||||
|
|
||||||
ogs_timer_t *timer;
|
ogs_timer_t *timer;
|
||||||
} pcf_event_t;
|
} pcf_event_t;
|
||||||
|
|
|
@ -34,6 +34,7 @@ libpcf_sources = files('''
|
||||||
|
|
||||||
namf-build.c
|
namf-build.c
|
||||||
nsmf-build.c
|
nsmf-build.c
|
||||||
|
naf-build.c
|
||||||
|
|
||||||
am-sm.c
|
am-sm.c
|
||||||
sm-sm.c
|
sm-sm.c
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of Open5GS.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "naf-build.h"
|
||||||
|
|
||||||
|
ogs_sbi_request_t *pcf_naf_callback_build_policyauthorization_terminate(
|
||||||
|
pcf_app_t *app_session, void *data)
|
||||||
|
{
|
||||||
|
ogs_sbi_message_t message;
|
||||||
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
|
||||||
|
ogs_assert(app_session);
|
||||||
|
|
||||||
|
memset(&message, 0, sizeof(message));
|
||||||
|
message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST;
|
||||||
|
message.h.uri = ogs_mstrcatf(
|
||||||
|
app_session->notif_uri, "/%s", OGS_SBI_RESOURCE_NAME_TERMINATE);
|
||||||
|
ogs_assert(message.h.uri);
|
||||||
|
|
||||||
|
request = ogs_sbi_build_request(&message);
|
||||||
|
ogs_assert(request);
|
||||||
|
|
||||||
|
ogs_free(message.h.uri);
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of Open5GS.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PCF_NAF_BUILD_H
|
||||||
|
#define PCF_NAF_BUILD_H
|
||||||
|
|
||||||
|
#include "context.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ogs_sbi_request_t *pcf_naf_callback_build_policyauthorization_terminate(
|
||||||
|
pcf_app_t *app_session, void *data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PCF_NAF_BUILD_H */
|
|
@ -24,7 +24,7 @@
|
||||||
bool pcf_nbsf_management_handle_register(
|
bool pcf_nbsf_management_handle_register(
|
||||||
pcf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
pcf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
||||||
{
|
{
|
||||||
int i, j, rv, status = 0;
|
int i, rv, status = 0;
|
||||||
char *strerror = NULL;
|
char *strerror = NULL;
|
||||||
pcf_ue_t *pcf_ue = NULL;
|
pcf_ue_t *pcf_ue = NULL;
|
||||||
ogs_sbi_server_t *server = NULL;
|
ogs_sbi_server_t *server = NULL;
|
||||||
|
@ -43,7 +43,7 @@ bool pcf_nbsf_management_handle_register(
|
||||||
|
|
||||||
OpenAPI_sm_policy_decision_t SmPolicyDecision;
|
OpenAPI_sm_policy_decision_t SmPolicyDecision;
|
||||||
|
|
||||||
OpenAPI_lnode_t *node = NULL, *node2 = NULL;
|
OpenAPI_lnode_t *node = NULL;
|
||||||
|
|
||||||
OpenAPI_list_t *SessRuleList = NULL;
|
OpenAPI_list_t *SessRuleList = NULL;
|
||||||
OpenAPI_map_t *SessRuleMap = NULL;
|
OpenAPI_map_t *SessRuleMap = NULL;
|
||||||
|
@ -55,7 +55,6 @@ bool pcf_nbsf_management_handle_register(
|
||||||
OpenAPI_list_t *PccRuleList = NULL;
|
OpenAPI_list_t *PccRuleList = NULL;
|
||||||
OpenAPI_map_t *PccRuleMap = NULL;
|
OpenAPI_map_t *PccRuleMap = NULL;
|
||||||
OpenAPI_pcc_rule_t *PccRule = NULL;
|
OpenAPI_pcc_rule_t *PccRule = NULL;
|
||||||
OpenAPI_flow_information_t *FlowInformation = NULL;
|
|
||||||
|
|
||||||
OpenAPI_list_t *QosDecisionList = NULL;
|
OpenAPI_list_t *QosDecisionList = NULL;
|
||||||
OpenAPI_map_t *QosDecisionMap = NULL;
|
OpenAPI_map_t *QosDecisionMap = NULL;
|
||||||
|
@ -275,110 +274,26 @@ bool pcf_nbsf_management_handle_register(
|
||||||
ogs_assert(QosDecisionList);
|
ogs_assert(QosDecisionList);
|
||||||
|
|
||||||
for (i = 0; i < session_data.num_of_pcc_rule; i++) {
|
for (i = 0; i < session_data.num_of_pcc_rule; i++) {
|
||||||
OpenAPI_list_t *FlowInformationList = NULL;
|
|
||||||
ogs_pcc_rule_t *pcc_rule = &session_data.pcc_rule[i];
|
ogs_pcc_rule_t *pcc_rule = &session_data.pcc_rule[i];
|
||||||
|
|
||||||
ogs_assert(pcc_rule);
|
ogs_assert(pcc_rule);
|
||||||
|
|
||||||
PccRule = ogs_calloc(1, sizeof(*PccRule));
|
if (!pcc_rule->num_of_flow) {
|
||||||
ogs_assert(PccRule);
|
/* No Flow */
|
||||||
QosData = ogs_calloc(1, sizeof(*QosData));
|
continue;
|
||||||
ogs_assert(QosData);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* At this point, only 1 QosData is used for PccRule.
|
|
||||||
* Therefore, QoS ID uses the same value as PCC Rule ID.
|
|
||||||
*/
|
|
||||||
PccRule->pcc_rule_id = pcc_rule->id;
|
|
||||||
QosData->qos_id = pcc_rule->id;
|
|
||||||
|
|
||||||
PccRule->ref_qos_data = OpenAPI_list_create();
|
|
||||||
ogs_assert(PccRule->ref_qos_data);
|
|
||||||
|
|
||||||
OpenAPI_list_add(PccRule->ref_qos_data, QosData->qos_id);
|
|
||||||
|
|
||||||
PccRule->is_precedence = true;
|
|
||||||
PccRule->precedence = pcc_rule->precedence;
|
|
||||||
|
|
||||||
FlowInformationList = OpenAPI_list_create();
|
|
||||||
ogs_assert(FlowInformationList);
|
|
||||||
|
|
||||||
for (j = 0; j < pcc_rule->num_of_flow; j++) {
|
|
||||||
ogs_flow_t *flow = &pcc_rule->flow[j];
|
|
||||||
ogs_assert(flow);
|
|
||||||
|
|
||||||
FlowInformation = ogs_calloc(1, sizeof(*FlowInformation));
|
|
||||||
ogs_assert(FlowInformation);
|
|
||||||
|
|
||||||
if (flow->direction == OGS_FLOW_UPLINK_ONLY)
|
|
||||||
FlowInformation->flow_direction =
|
|
||||||
OpenAPI_flow_direction_UPLINK;
|
|
||||||
else if (flow->direction == OGS_FLOW_DOWNLINK_ONLY)
|
|
||||||
FlowInformation->flow_direction =
|
|
||||||
OpenAPI_flow_direction_DOWNLINK;
|
|
||||||
else {
|
|
||||||
ogs_fatal("Unsupported direction [%d]", flow->direction);
|
|
||||||
ogs_assert_if_reached();
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_assert(flow->description);
|
|
||||||
FlowInformation->flow_description = flow->description;
|
|
||||||
|
|
||||||
OpenAPI_list_add(FlowInformationList, FlowInformation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FlowInformationList->count)
|
PccRule = ogs_sbi_build_pcc_rule(pcc_rule, 1);
|
||||||
PccRule->flow_infos = FlowInformationList;
|
ogs_assert(PccRule->pcc_rule_id);
|
||||||
else
|
|
||||||
OpenAPI_list_free(FlowInformationList);
|
|
||||||
|
|
||||||
PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule);
|
PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule);
|
||||||
ogs_assert(PccRuleMap);
|
ogs_assert(PccRuleMap);
|
||||||
|
|
||||||
OpenAPI_list_add(PccRuleList, PccRuleMap);
|
OpenAPI_list_add(PccRuleList, PccRuleMap);
|
||||||
|
|
||||||
QosData->is__5qi = true;
|
QosData = ogs_sbi_build_qos_data(pcc_rule);
|
||||||
QosData->_5qi = pcc_rule->qos.index;
|
ogs_assert(QosData);
|
||||||
QosData->is_priority_level = true;
|
ogs_assert(QosData->qos_id);
|
||||||
QosData->priority_level = pcc_rule->qos.arp.priority_level;
|
|
||||||
|
|
||||||
QosData->arp = ogs_calloc(1, sizeof(OpenAPI_arp_t));
|
|
||||||
ogs_assert(QosData->arp);
|
|
||||||
|
|
||||||
if (pcc_rule->qos.arp.pre_emption_capability ==
|
|
||||||
OGS_5GC_PRE_EMPTION_ENABLED)
|
|
||||||
QosData->arp->preempt_cap =
|
|
||||||
OpenAPI_preemption_capability_MAY_PREEMPT;
|
|
||||||
else if (pcc_rule->qos.arp.pre_emption_capability ==
|
|
||||||
OGS_5GC_PRE_EMPTION_DISABLED)
|
|
||||||
QosData->arp->preempt_cap =
|
|
||||||
OpenAPI_preemption_capability_NOT_PREEMPT;
|
|
||||||
ogs_assert(pcc_rule->qos.arp.pre_emption_capability);
|
|
||||||
|
|
||||||
if (pcc_rule->qos.arp.pre_emption_vulnerability ==
|
|
||||||
OGS_5GC_PRE_EMPTION_ENABLED)
|
|
||||||
QosData->arp->preempt_vuln =
|
|
||||||
OpenAPI_preemption_vulnerability_PREEMPTABLE;
|
|
||||||
else if (pcc_rule->qos.arp.pre_emption_vulnerability ==
|
|
||||||
OGS_5GC_PRE_EMPTION_DISABLED)
|
|
||||||
QosData->arp->preempt_vuln =
|
|
||||||
OpenAPI_preemption_vulnerability_NOT_PREEMPTABLE;
|
|
||||||
ogs_assert(pcc_rule->qos.arp.pre_emption_vulnerability);
|
|
||||||
QosData->arp->priority_level = pcc_rule->qos.arp.priority_level;
|
|
||||||
|
|
||||||
if (pcc_rule->qos.mbr.uplink)
|
|
||||||
QosData->maxbr_ul = ogs_sbi_bitrate_to_string(
|
|
||||||
pcc_rule->qos.mbr.uplink, OGS_SBI_BITRATE_KBPS);
|
|
||||||
if (pcc_rule->qos.mbr.downlink)
|
|
||||||
QosData->maxbr_dl = ogs_sbi_bitrate_to_string(
|
|
||||||
pcc_rule->qos.mbr.downlink, OGS_SBI_BITRATE_KBPS);
|
|
||||||
|
|
||||||
if (pcc_rule->qos.gbr.uplink)
|
|
||||||
QosData->gbr_ul = ogs_sbi_bitrate_to_string(
|
|
||||||
pcc_rule->qos.gbr.uplink, OGS_SBI_BITRATE_KBPS);
|
|
||||||
if (pcc_rule->qos.gbr.downlink)
|
|
||||||
QosData->gbr_dl = ogs_sbi_bitrate_to_string(
|
|
||||||
pcc_rule->qos.gbr.downlink, OGS_SBI_BITRATE_KBPS);
|
|
||||||
|
|
||||||
QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData);
|
QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData);
|
||||||
ogs_assert(QosDecisionMap);
|
ogs_assert(QosDecisionMap);
|
||||||
|
@ -446,18 +361,8 @@ bool pcf_nbsf_management_handle_register(
|
||||||
PccRuleMap = node->data;
|
PccRuleMap = node->data;
|
||||||
if (PccRuleMap) {
|
if (PccRuleMap) {
|
||||||
PccRule = PccRuleMap->value;
|
PccRule = PccRuleMap->value;
|
||||||
if (PccRule) {
|
if (PccRule)
|
||||||
if (PccRule->ref_qos_data)
|
ogs_sbi_free_pcc_rule(PccRule);
|
||||||
OpenAPI_list_free(PccRule->ref_qos_data);
|
|
||||||
if (PccRule->flow_infos) {
|
|
||||||
OpenAPI_list_for_each(PccRule->flow_infos, node2) {
|
|
||||||
FlowInformation = node2->data;
|
|
||||||
if (FlowInformation) ogs_free(FlowInformation);
|
|
||||||
}
|
|
||||||
OpenAPI_list_free(PccRule->flow_infos);
|
|
||||||
}
|
|
||||||
ogs_free(PccRule);
|
|
||||||
}
|
|
||||||
ogs_free(PccRuleMap);
|
ogs_free(PccRuleMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -467,15 +372,8 @@ bool pcf_nbsf_management_handle_register(
|
||||||
QosDecisionMap = node->data;
|
QosDecisionMap = node->data;
|
||||||
if (QosDecisionMap) {
|
if (QosDecisionMap) {
|
||||||
QosData = QosDecisionMap->value;
|
QosData = QosDecisionMap->value;
|
||||||
if (QosData) {
|
if (QosData)
|
||||||
if (QosData->arp) ogs_free(QosData->arp);
|
ogs_sbi_free_qos_data(QosData);
|
||||||
if (QosData->maxbr_ul) ogs_free(QosData->maxbr_ul);
|
|
||||||
if (QosData->maxbr_dl) ogs_free(QosData->maxbr_dl);
|
|
||||||
if (QosData->gbr_ul) ogs_free(QosData->gbr_ul);
|
|
||||||
if (QosData->gbr_dl) ogs_free(QosData->gbr_dl);
|
|
||||||
|
|
||||||
ogs_free(QosData);
|
|
||||||
}
|
|
||||||
ogs_free(QosDecisionMap);
|
ogs_free(QosDecisionMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,7 @@ bool pcf_npcf_am_policy_contrtol_handle_create(pcf_ue_t *pcf_ue,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pcf_npcf_smpolicycontrtol_handle_create(pcf_sess_t *sess,
|
bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *message)
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *message)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
@ -293,12 +293,13 @@ cleanup:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pcf_npcf_smpolicycontrtol_handle_delete(pcf_sess_t *sess,
|
bool pcf_npcf_smpolicycontrol_handle_delete(pcf_sess_t *sess,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *message)
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *message)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
char *strerror = NULL;
|
char *strerror = NULL;
|
||||||
pcf_ue_t *pcf_ue = NULL;
|
pcf_ue_t *pcf_ue = NULL;
|
||||||
|
pcf_app_t *app_session = NULL;
|
||||||
|
|
||||||
OpenAPI_sm_policy_delete_data_t *SmPolicyDeleteData = NULL;
|
OpenAPI_sm_policy_delete_data_t *SmPolicyDeleteData = NULL;
|
||||||
|
|
||||||
|
@ -315,6 +316,10 @@ bool pcf_npcf_smpolicycontrtol_handle_delete(pcf_sess_t *sess,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_list_for_each(&sess->app_list, app_session) {
|
||||||
|
pcf_sbi_send_policyauthorization_terminate_notify(app_session);
|
||||||
|
}
|
||||||
|
|
||||||
ogs_assert(true ==
|
ogs_assert(true ==
|
||||||
pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_BSF, sess, stream, NULL,
|
pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_BSF, sess, stream, NULL,
|
||||||
pcf_nbsf_management_build_de_register));
|
pcf_nbsf_management_build_de_register));
|
||||||
|
@ -335,9 +340,13 @@ cleanup:
|
||||||
bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int i, j, rv, status = 0;
|
||||||
char *strerror = NULL;
|
char *strerror = NULL;
|
||||||
pcf_ue_t *pcf_ue = NULL;
|
pcf_ue_t *pcf_ue = NULL;
|
||||||
|
pcf_app_t *app_session = NULL;
|
||||||
|
|
||||||
|
ogs_sbi_client_t *client = NULL;
|
||||||
|
ogs_sockaddr_t *addr = NULL;
|
||||||
|
|
||||||
OpenAPI_app_session_context_t *AppSessionContext = NULL;
|
OpenAPI_app_session_context_t *AppSessionContext = NULL;
|
||||||
OpenAPI_app_session_context_req_data_t *AscReqData = NULL;
|
OpenAPI_app_session_context_req_data_t *AscReqData = NULL;
|
||||||
|
@ -349,6 +358,8 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
ogs_sbi_message_t sendmsg;
|
ogs_sbi_message_t sendmsg;
|
||||||
ogs_sbi_response_t *response = NULL;
|
ogs_sbi_response_t *response = NULL;
|
||||||
|
|
||||||
|
ogs_session_data_t session_data;
|
||||||
|
|
||||||
ogs_ims_data_t ims_data;
|
ogs_ims_data_t ims_data;
|
||||||
ogs_media_component_t *media_component = NULL;
|
ogs_media_component_t *media_component = NULL;
|
||||||
ogs_media_sub_component_t *sub = NULL;
|
ogs_media_sub_component_t *sub = NULL;
|
||||||
|
@ -363,6 +374,16 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
|
|
||||||
OpenAPI_list_t *fDescList = NULL;
|
OpenAPI_list_t *fDescList = NULL;
|
||||||
|
|
||||||
|
OpenAPI_sm_policy_decision_t SmPolicyDecision;
|
||||||
|
|
||||||
|
OpenAPI_list_t *PccRuleList = NULL;
|
||||||
|
OpenAPI_map_t *PccRuleMap = NULL;
|
||||||
|
OpenAPI_pcc_rule_t *PccRule = NULL;
|
||||||
|
|
||||||
|
OpenAPI_list_t *QosDecisionList = NULL;
|
||||||
|
OpenAPI_map_t *QosDecisionMap = NULL;
|
||||||
|
OpenAPI_qos_data_t *QosData = NULL;
|
||||||
|
|
||||||
OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL;
|
OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL;
|
||||||
|
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
@ -370,8 +391,6 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
ogs_assert(stream);
|
ogs_assert(stream);
|
||||||
ogs_assert(recvmsg);
|
ogs_assert(recvmsg);
|
||||||
|
|
||||||
ogs_assert(sess->app_session_id);
|
|
||||||
|
|
||||||
server = ogs_sbi_server_from_stream(stream);
|
server = ogs_sbi_server_from_stream(stream);
|
||||||
ogs_assert(server);
|
ogs_assert(server);
|
||||||
|
|
||||||
|
@ -412,6 +431,14 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addr = ogs_sbi_getaddr_from_uri(AscReqData->notif_uri);
|
||||||
|
if (!addr) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] Invalid URI [%s]",
|
||||||
|
pcf_ue->supi, sess->psi, AscReqData->notif_uri);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_BAD_REQUEST;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
supported_features = ogs_uint64_from_string(AscReqData->supp_feat);
|
supported_features = ogs_uint64_from_string(AscReqData->supp_feat);
|
||||||
sess->policyauthorization_features &= supported_features;
|
sess->policyauthorization_features &= supported_features;
|
||||||
|
|
||||||
|
@ -423,8 +450,6 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ims_data, 0, sizeof(ims_data));
|
memset(&ims_data, 0, sizeof(ims_data));
|
||||||
media_component = &ims_data.
|
|
||||||
media_component[ims_data.num_of_media_component];
|
|
||||||
|
|
||||||
MediaComponentList = AscReqData->med_components;
|
MediaComponentList = AscReqData->med_components;
|
||||||
OpenAPI_list_for_each(MediaComponentList, node) {
|
OpenAPI_list_for_each(MediaComponentList, node) {
|
||||||
|
@ -432,6 +457,8 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
if (MediaComponentMap) {
|
if (MediaComponentMap) {
|
||||||
MediaComponent = MediaComponentMap->value;
|
MediaComponent = MediaComponentMap->value;
|
||||||
if (MediaComponent) {
|
if (MediaComponent) {
|
||||||
|
media_component = &ims_data.
|
||||||
|
media_component[ims_data.num_of_media_component];
|
||||||
media_component->media_component_number =
|
media_component->media_component_number =
|
||||||
MediaComponent->med_comp_n;
|
MediaComponent->med_comp_n;
|
||||||
media_component->media_type = MediaComponent->med_type;
|
media_component->media_type = MediaComponent->med_type;
|
||||||
|
@ -447,12 +474,18 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
if (MediaComponent->mir_bw_ul)
|
if (MediaComponent->mir_bw_ul)
|
||||||
media_component->min_requested_bandwidth_ul =
|
media_component->min_requested_bandwidth_ul =
|
||||||
ogs_sbi_bitrate_from_string(MediaComponent->mir_bw_ul);
|
ogs_sbi_bitrate_from_string(MediaComponent->mir_bw_ul);
|
||||||
|
if (MediaComponent->rr_bw)
|
||||||
|
media_component->rr_bandwidth =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->rr_bw);
|
||||||
|
if (MediaComponent->rs_bw)
|
||||||
|
media_component->rs_bandwidth =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->rs_bw);
|
||||||
media_component->flow_status = MediaComponent->f_status;
|
media_component->flow_status = MediaComponent->f_status;
|
||||||
|
|
||||||
sub = &media_component->sub[media_component->num_of_sub];
|
|
||||||
|
|
||||||
SubComponentList = MediaComponent->med_sub_comps;
|
SubComponentList = MediaComponent->med_sub_comps;
|
||||||
OpenAPI_list_for_each(SubComponentList, node2) {
|
OpenAPI_list_for_each(SubComponentList, node2) {
|
||||||
|
sub = &media_component->sub[media_component->num_of_sub];
|
||||||
|
|
||||||
SubComponentMap = node2->data;
|
SubComponentMap = node2->data;
|
||||||
if (SubComponentMap) {
|
if (SubComponentMap) {
|
||||||
SubComponent = SubComponentMap->value;
|
SubComponent = SubComponentMap->value;
|
||||||
|
@ -474,22 +507,225 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
sub->num_of_flow++;
|
sub->num_of_flow++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
media_component->num_of_sub++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
media_component->num_of_sub++;
|
}
|
||||||
|
ims_data.num_of_media_component++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app_session = pcf_app_add(sess);
|
||||||
|
ogs_assert(app_session);
|
||||||
|
|
||||||
|
if (app_session->notif_uri)
|
||||||
|
ogs_free(app_session->notif_uri);
|
||||||
|
app_session->notif_uri = ogs_strdup(AscReqData->notif_uri);
|
||||||
|
ogs_assert(app_session->notif_uri);
|
||||||
|
|
||||||
|
client = ogs_sbi_client_find(addr);
|
||||||
|
if (!client) {
|
||||||
|
client = ogs_sbi_client_add(addr);
|
||||||
|
ogs_assert(client);
|
||||||
|
}
|
||||||
|
OGS_SETUP_SBI_CLIENT(&app_session->naf, client);
|
||||||
|
|
||||||
|
ogs_freeaddrinfo(addr);
|
||||||
|
|
||||||
|
memset(&session_data, 0, sizeof(ogs_session_data_t));
|
||||||
|
rv = ogs_dbi_session_data(
|
||||||
|
pcf_ue->supi, &sess->s_nssai, sess->dnn, &session_data);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] Cannot find SUPI in DB",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_NOT_FOUND;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision));
|
||||||
|
|
||||||
|
PccRuleList = OpenAPI_list_create();
|
||||||
|
ogs_assert(PccRuleList);
|
||||||
|
|
||||||
|
QosDecisionList = OpenAPI_list_create();
|
||||||
|
ogs_assert(QosDecisionList);
|
||||||
|
|
||||||
|
for (i = 0; i < ims_data.num_of_media_component; i++) {
|
||||||
|
int flow_presence = 0;
|
||||||
|
|
||||||
|
ogs_pcc_rule_t *pcc_rule = NULL;
|
||||||
|
ogs_pcc_rule_t *db_pcc_rule = NULL;
|
||||||
|
uint8_t qos_index = 0;
|
||||||
|
ogs_media_component_t *media_component = &ims_data.media_component[i];
|
||||||
|
|
||||||
|
switch(media_component->media_type) {
|
||||||
|
case OpenAPI_media_type_AUDIO:
|
||||||
|
qos_index = OGS_QOS_INDEX_1;
|
||||||
|
break;
|
||||||
|
case OpenAPI_media_type_VIDEO:
|
||||||
|
qos_index = OGS_QOS_INDEX_2;
|
||||||
|
break;
|
||||||
|
case OpenAPI_media_type_CONTROL:
|
||||||
|
qos_index = OGS_QOS_INDEX_5;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strerror = ogs_msprintf("[%s:%d] Not implemented : [Media-Type:%d]",
|
||||||
|
pcf_ue->supi, sess->psi, media_component->media_type);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < session_data.num_of_pcc_rule; j++) {
|
||||||
|
if (session_data.pcc_rule[j].qos.index == qos_index) {
|
||||||
|
db_pcc_rule = &session_data.pcc_rule[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!db_pcc_rule &&
|
||||||
|
(media_component->media_type == OpenAPI_media_type_CONTROL)) {
|
||||||
|
/*
|
||||||
|
* Check for default bearer for IMS signalling
|
||||||
|
* QCI 5 and ARP 1
|
||||||
|
*/
|
||||||
|
if (session_data.session.qos.index != OGS_QOS_INDEX_5 ||
|
||||||
|
session_data.session.qos.arp.priority_level != 1) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] CHECK WEBUI : "
|
||||||
|
"Even the Default Bearer(QCI:%d,ARP:%d) "
|
||||||
|
"cannot support IMS signalling.",
|
||||||
|
pcf_ue->supi, sess->psi,
|
||||||
|
session_data.session.qos.index,
|
||||||
|
session_data.session.qos.arp.priority_level);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!db_pcc_rule) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] CHECK WEBUI : "
|
||||||
|
"No PCC Rule in DB [QoS Index:%d] - "
|
||||||
|
"Please add PCC Rule using WEBUI",
|
||||||
|
pcf_ue->supi, sess->psi, qos_index);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < app_session->num_of_pcc_rule; j++) {
|
||||||
|
if (app_session->pcc_rule[j].qos.index == qos_index) {
|
||||||
|
pcc_rule = &app_session->pcc_rule[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pcc_rule) {
|
||||||
|
pcc_rule = &app_session->pcc_rule[app_session->num_of_pcc_rule];
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
|
||||||
|
pcc_rule->id = ogs_msprintf("%s-a%s",
|
||||||
|
db_pcc_rule->id, app_session->app_session_id);
|
||||||
|
ogs_assert(pcc_rule->id);
|
||||||
|
|
||||||
|
memcpy(&pcc_rule->qos, &db_pcc_rule->qos, sizeof(ogs_qos_t));
|
||||||
|
|
||||||
|
pcc_rule->flow_status = db_pcc_rule->flow_status;
|
||||||
|
pcc_rule->precedence = db_pcc_rule->precedence;
|
||||||
|
|
||||||
|
/* Install Flow */
|
||||||
|
flow_presence = 1;
|
||||||
|
rv = ogs_pcc_rule_install_flow_from_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] install_flow() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
app_session->num_of_pcc_rule++;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
/* Check Flow */
|
||||||
|
count = ogs_pcc_rule_num_of_flow_equal_to_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
|
if (count == -1) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] matched_flow() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcc_rule->num_of_flow != count) {
|
||||||
|
/* Re-install Flow */
|
||||||
|
flow_presence = 1;
|
||||||
|
rv = ogs_pcc_rule_install_flow_from_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] re-install_flow() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ims_data.num_of_media_component++;
|
|
||||||
|
/* Update QoS */
|
||||||
|
rv = ogs_pcc_rule_update_qos_from_media(pcc_rule, media_component);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] update_qos() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we failed to get QoS from IMS, apply WEBUI QoS */
|
||||||
|
if (pcc_rule->qos.mbr.downlink == 0)
|
||||||
|
pcc_rule->qos.mbr.downlink = db_pcc_rule->qos.mbr.downlink;
|
||||||
|
if (pcc_rule->qos.mbr.uplink == 0)
|
||||||
|
pcc_rule->qos.mbr.uplink = db_pcc_rule->qos.mbr.uplink;
|
||||||
|
if (pcc_rule->qos.gbr.downlink == 0)
|
||||||
|
pcc_rule->qos.gbr.downlink = db_pcc_rule->qos.gbr.downlink;
|
||||||
|
if (pcc_rule->qos.gbr.uplink == 0)
|
||||||
|
pcc_rule->qos.gbr.uplink = db_pcc_rule->qos.gbr.uplink;
|
||||||
|
|
||||||
|
/**************************************************************
|
||||||
|
* Build PCC Rule & QoS Decision
|
||||||
|
*************************************************************/
|
||||||
|
PccRule = ogs_sbi_build_pcc_rule(pcc_rule, flow_presence);
|
||||||
|
ogs_assert(PccRule->pcc_rule_id);
|
||||||
|
|
||||||
|
PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule);
|
||||||
|
ogs_assert(PccRuleMap);
|
||||||
|
|
||||||
|
OpenAPI_list_add(PccRuleList, PccRuleMap);
|
||||||
|
|
||||||
|
QosData = ogs_sbi_build_qos_data(pcc_rule);
|
||||||
|
ogs_assert(QosData);
|
||||||
|
ogs_assert(QosData->qos_id);
|
||||||
|
|
||||||
|
QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData);
|
||||||
|
ogs_assert(QosDecisionMap);
|
||||||
|
|
||||||
|
OpenAPI_list_add(QosDecisionList, QosDecisionMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PccRuleList->count)
|
||||||
|
SmPolicyDecision.pcc_rules = PccRuleList;
|
||||||
|
|
||||||
|
if (QosDecisionList->count)
|
||||||
|
SmPolicyDecision.qos_decs = QosDecisionList;
|
||||||
|
|
||||||
memset(&sendmsg, 0, sizeof(sendmsg));
|
memset(&sendmsg, 0, sizeof(sendmsg));
|
||||||
|
|
||||||
memset(&header, 0, sizeof(header));
|
memset(&header, 0, sizeof(header));
|
||||||
header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION;
|
header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION;
|
||||||
header.api.version = (char *)OGS_SBI_API_V1;
|
header.api.version = (char *)OGS_SBI_API_V1;
|
||||||
header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS;
|
header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS;
|
||||||
header.resource.component[1] = (char *)sess->app_session_id;
|
header.resource.component[1] = (char *)app_session->app_session_id;
|
||||||
sendmsg.http.location = ogs_sbi_server_uri(server, &header);
|
sendmsg.http.location = ogs_sbi_server_uri(server, &header);
|
||||||
ogs_assert(sendmsg.http.location);
|
ogs_assert(sendmsg.http.location);
|
||||||
|
|
||||||
|
@ -501,12 +737,35 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
|
|
||||||
ogs_free(sendmsg.http.location);
|
ogs_free(sendmsg.http.location);
|
||||||
|
|
||||||
#if 0
|
if (PccRuleList->count || QosDecisionList->count) {
|
||||||
ogs_assert(true == pcf_sbi_send_smpolicycontrol_notify(sess));
|
ogs_assert(true == pcf_sbi_send_smpolicycontrol_update_notify(
|
||||||
ogs_assert(true == pcf_sbi_send_am_policy_control_notify(pcf_ue));
|
sess, &SmPolicyDecision));
|
||||||
#endif
|
}
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(PccRuleList, node) {
|
||||||
|
PccRuleMap = node->data;
|
||||||
|
if (PccRuleMap) {
|
||||||
|
PccRule = PccRuleMap->value;
|
||||||
|
if (PccRule)
|
||||||
|
ogs_sbi_free_pcc_rule(PccRule);
|
||||||
|
ogs_free(PccRuleMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(PccRuleList);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(QosDecisionList, node) {
|
||||||
|
QosDecisionMap = node->data;
|
||||||
|
if (QosDecisionMap) {
|
||||||
|
QosData = QosDecisionMap->value;
|
||||||
|
if (QosData)
|
||||||
|
ogs_sbi_free_qos_data(QosData);
|
||||||
|
ogs_free(QosDecisionMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(QosDecisionList);
|
||||||
|
|
||||||
ogs_ims_data_free(&ims_data);
|
ogs_ims_data_free(&ims_data);
|
||||||
|
ogs_session_data_free(&session_data);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -518,7 +777,509 @@ cleanup:
|
||||||
ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL));
|
ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL));
|
||||||
ogs_free(strerror);
|
ogs_free(strerror);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(PccRuleList, node) {
|
||||||
|
PccRuleMap = node->data;
|
||||||
|
if (PccRuleMap) {
|
||||||
|
PccRule = PccRuleMap->value;
|
||||||
|
if (PccRule)
|
||||||
|
ogs_sbi_free_pcc_rule(PccRule);
|
||||||
|
ogs_free(PccRuleMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(PccRuleList);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(QosDecisionList, node) {
|
||||||
|
QosDecisionMap = node->data;
|
||||||
|
if (QosDecisionMap) {
|
||||||
|
QosData = QosDecisionMap->value;
|
||||||
|
if (QosData)
|
||||||
|
ogs_sbi_free_qos_data(QosData);
|
||||||
|
ogs_free(QosDecisionMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(QosDecisionList);
|
||||||
|
|
||||||
ogs_ims_data_free(&ims_data);
|
ogs_ims_data_free(&ims_data);
|
||||||
|
ogs_session_data_free(&session_data);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool pcf_npcf_policyauthorization_handle_update(
|
||||||
|
pcf_sess_t *sess, pcf_app_t *app_session,
|
||||||
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
||||||
|
{
|
||||||
|
int i, j, rv, status = 0;
|
||||||
|
char *strerror = NULL;
|
||||||
|
pcf_ue_t *pcf_ue = NULL;
|
||||||
|
|
||||||
|
OpenAPI_app_session_context_update_data_patch_t
|
||||||
|
*AppSessionContextUpdateDataPatch = NULL;
|
||||||
|
OpenAPI_app_session_context_update_data_t *AscUpdateData = NULL;
|
||||||
|
|
||||||
|
ogs_sbi_message_t sendmsg;
|
||||||
|
ogs_sbi_response_t *response = NULL;
|
||||||
|
|
||||||
|
ogs_session_data_t session_data;
|
||||||
|
|
||||||
|
ogs_ims_data_t ims_data;
|
||||||
|
ogs_media_component_t *media_component = NULL;
|
||||||
|
ogs_media_sub_component_t *sub = NULL;
|
||||||
|
|
||||||
|
OpenAPI_list_t *MediaComponentList = NULL;
|
||||||
|
OpenAPI_map_t *MediaComponentMap = NULL;
|
||||||
|
OpenAPI_media_component_rm_t *MediaComponent = NULL;
|
||||||
|
|
||||||
|
OpenAPI_list_t *SubComponentList = NULL;
|
||||||
|
OpenAPI_map_t *SubComponentMap = NULL;
|
||||||
|
OpenAPI_media_sub_component_t *SubComponent = NULL;
|
||||||
|
|
||||||
|
OpenAPI_list_t *fDescList = NULL;
|
||||||
|
|
||||||
|
OpenAPI_sm_policy_decision_t SmPolicyDecision;
|
||||||
|
|
||||||
|
OpenAPI_list_t *PccRuleList = NULL;
|
||||||
|
OpenAPI_map_t *PccRuleMap = NULL;
|
||||||
|
OpenAPI_pcc_rule_t *PccRule = NULL;
|
||||||
|
|
||||||
|
OpenAPI_list_t *QosDecisionList = NULL;
|
||||||
|
OpenAPI_map_t *QosDecisionMap = NULL;
|
||||||
|
OpenAPI_qos_data_t *QosData = NULL;
|
||||||
|
|
||||||
|
OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
pcf_ue = sess->pcf_ue;
|
||||||
|
ogs_assert(app_session);
|
||||||
|
ogs_assert(stream);
|
||||||
|
ogs_assert(recvmsg);
|
||||||
|
|
||||||
|
AppSessionContextUpdateDataPatch =
|
||||||
|
recvmsg->AppSessionContextUpdateDataPatch;
|
||||||
|
if (!AppSessionContextUpdateDataPatch) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] No AppSessionContextUpdateDataPatch",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_BAD_REQUEST;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
AscUpdateData = AppSessionContextUpdateDataPatch->asc_req_data;
|
||||||
|
if (!AscUpdateData) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] No AscUpdateData",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_BAD_REQUEST;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AscUpdateData->med_components) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] No AscUpdateData->MediaCompoenent",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_BAD_REQUEST;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&ims_data, 0, sizeof(ims_data));
|
||||||
|
|
||||||
|
MediaComponentList = AscUpdateData->med_components;
|
||||||
|
OpenAPI_list_for_each(MediaComponentList, node) {
|
||||||
|
MediaComponentMap = node->data;
|
||||||
|
if (MediaComponentMap) {
|
||||||
|
MediaComponent = MediaComponentMap->value;
|
||||||
|
if (MediaComponent) {
|
||||||
|
media_component = &ims_data.
|
||||||
|
media_component[ims_data.num_of_media_component];
|
||||||
|
|
||||||
|
media_component->media_component_number =
|
||||||
|
MediaComponent->med_comp_n;
|
||||||
|
media_component->media_type = MediaComponent->med_type;
|
||||||
|
if (MediaComponent->mar_bw_dl)
|
||||||
|
media_component->max_requested_bandwidth_dl =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->mar_bw_dl);
|
||||||
|
if (MediaComponent->mar_bw_ul)
|
||||||
|
media_component->max_requested_bandwidth_ul =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->mar_bw_ul);
|
||||||
|
if (MediaComponent->mir_bw_dl)
|
||||||
|
media_component->min_requested_bandwidth_dl =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->mir_bw_dl);
|
||||||
|
if (MediaComponent->mir_bw_ul)
|
||||||
|
media_component->min_requested_bandwidth_ul =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->mir_bw_ul);
|
||||||
|
if (MediaComponent->rr_bw)
|
||||||
|
media_component->rr_bandwidth =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->rr_bw);
|
||||||
|
if (MediaComponent->rs_bw)
|
||||||
|
media_component->rs_bandwidth =
|
||||||
|
ogs_sbi_bitrate_from_string(MediaComponent->rs_bw);
|
||||||
|
media_component->flow_status = MediaComponent->f_status;
|
||||||
|
|
||||||
|
SubComponentList = MediaComponent->med_sub_comps;
|
||||||
|
OpenAPI_list_for_each(SubComponentList, node2) {
|
||||||
|
sub = &media_component->sub[media_component->num_of_sub];
|
||||||
|
|
||||||
|
SubComponentMap = node2->data;
|
||||||
|
if (SubComponentMap) {
|
||||||
|
SubComponent = SubComponentMap->value;
|
||||||
|
if (SubComponent) {
|
||||||
|
sub->flow_number = SubComponent->f_num;
|
||||||
|
sub->flow_usage = SubComponent->flow_usage;
|
||||||
|
|
||||||
|
fDescList = SubComponent->f_descs;
|
||||||
|
OpenAPI_list_for_each(fDescList, node3) {
|
||||||
|
ogs_flow_t *flow = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sub->num_of_flow <
|
||||||
|
OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT);
|
||||||
|
flow = &sub->flow[sub->num_of_flow];
|
||||||
|
if (node3->data) {
|
||||||
|
flow->description = ogs_strdup(node3->data);
|
||||||
|
ogs_assert(flow->description);
|
||||||
|
|
||||||
|
sub->num_of_flow++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
media_component->num_of_sub++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ims_data.num_of_media_component++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&session_data, 0, sizeof(ogs_session_data_t));
|
||||||
|
rv = ogs_dbi_session_data(
|
||||||
|
pcf_ue->supi, &sess->s_nssai, sess->dnn, &session_data);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] Cannot find SUPI in DB",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_NOT_FOUND;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision));
|
||||||
|
|
||||||
|
PccRuleList = OpenAPI_list_create();
|
||||||
|
ogs_assert(PccRuleList);
|
||||||
|
|
||||||
|
QosDecisionList = OpenAPI_list_create();
|
||||||
|
ogs_assert(QosDecisionList);
|
||||||
|
|
||||||
|
for (i = 0; i < ims_data.num_of_media_component; i++) {
|
||||||
|
int flow_presence = 0;
|
||||||
|
|
||||||
|
ogs_pcc_rule_t *pcc_rule = NULL;
|
||||||
|
ogs_pcc_rule_t *db_pcc_rule = NULL;
|
||||||
|
uint8_t qos_index = 0;
|
||||||
|
ogs_media_component_t *media_component = &ims_data.media_component[i];
|
||||||
|
|
||||||
|
switch(media_component->media_type) {
|
||||||
|
case OpenAPI_media_type_AUDIO:
|
||||||
|
qos_index = OGS_QOS_INDEX_1;
|
||||||
|
break;
|
||||||
|
case OpenAPI_media_type_VIDEO:
|
||||||
|
qos_index = OGS_QOS_INDEX_2;
|
||||||
|
break;
|
||||||
|
case OpenAPI_media_type_CONTROL:
|
||||||
|
qos_index = OGS_QOS_INDEX_5;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strerror = ogs_msprintf("[%s:%d] Not implemented : [Media-Type:%d]",
|
||||||
|
pcf_ue->supi, sess->psi, media_component->media_type);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < session_data.num_of_pcc_rule; j++) {
|
||||||
|
if (session_data.pcc_rule[j].qos.index == qos_index) {
|
||||||
|
db_pcc_rule = &session_data.pcc_rule[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!db_pcc_rule &&
|
||||||
|
(media_component->media_type == OpenAPI_media_type_CONTROL)) {
|
||||||
|
/*
|
||||||
|
* Check for default bearer for IMS signalling
|
||||||
|
* QCI 5 and ARP 1
|
||||||
|
*/
|
||||||
|
if (session_data.session.qos.index != OGS_QOS_INDEX_5 ||
|
||||||
|
session_data.session.qos.arp.priority_level != 1) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] CHECK WEBUI : "
|
||||||
|
"Even the Default Bearer(QCI:%d,ARP:%d) "
|
||||||
|
"cannot support IMS signalling.",
|
||||||
|
pcf_ue->supi, sess->psi,
|
||||||
|
session_data.session.qos.index,
|
||||||
|
session_data.session.qos.arp.priority_level);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!db_pcc_rule) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] CHECK WEBUI : "
|
||||||
|
"No PCC Rule in DB [QoS Index:%d] - "
|
||||||
|
"Please add PCC Rule using WEBUI",
|
||||||
|
pcf_ue->supi, sess->psi, qos_index);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < app_session->num_of_pcc_rule; j++) {
|
||||||
|
if (app_session->pcc_rule[j].qos.index == qos_index) {
|
||||||
|
pcc_rule = &app_session->pcc_rule[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pcc_rule) {
|
||||||
|
pcc_rule = &app_session->pcc_rule[app_session->num_of_pcc_rule];
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
|
||||||
|
pcc_rule->id = ogs_strdup(app_session->app_session_id);
|
||||||
|
ogs_assert(pcc_rule->id);
|
||||||
|
|
||||||
|
memcpy(&pcc_rule->qos, &db_pcc_rule->qos, sizeof(ogs_qos_t));
|
||||||
|
|
||||||
|
pcc_rule->flow_status = db_pcc_rule->flow_status;
|
||||||
|
pcc_rule->precedence = db_pcc_rule->precedence;
|
||||||
|
|
||||||
|
/* Install Flow */
|
||||||
|
flow_presence = 1;
|
||||||
|
rv = ogs_pcc_rule_install_flow_from_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] install_flow() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
app_session->num_of_pcc_rule++;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
/* Check Flow */
|
||||||
|
count = ogs_pcc_rule_num_of_flow_equal_to_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
|
if (count == -1) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] matched_flow() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcc_rule->num_of_flow != count) {
|
||||||
|
/* Re-install Flow */
|
||||||
|
flow_presence = 1;
|
||||||
|
rv = ogs_pcc_rule_install_flow_from_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] re-install_flow() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update QoS */
|
||||||
|
rv = ogs_pcc_rule_update_qos_from_media(pcc_rule, media_component);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] update_qos() failed",
|
||||||
|
pcf_ue->supi, sess->psi);
|
||||||
|
status = OGS_SBI_HTTP_STATUS_FORBIDDEN;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we failed to get QoS from IMS, apply WEBUI QoS */
|
||||||
|
if (pcc_rule->qos.mbr.downlink == 0)
|
||||||
|
pcc_rule->qos.mbr.downlink = db_pcc_rule->qos.mbr.downlink;
|
||||||
|
if (pcc_rule->qos.mbr.uplink == 0)
|
||||||
|
pcc_rule->qos.mbr.uplink = db_pcc_rule->qos.mbr.uplink;
|
||||||
|
if (pcc_rule->qos.gbr.downlink == 0)
|
||||||
|
pcc_rule->qos.gbr.downlink = db_pcc_rule->qos.gbr.downlink;
|
||||||
|
if (pcc_rule->qos.gbr.uplink == 0)
|
||||||
|
pcc_rule->qos.gbr.uplink = db_pcc_rule->qos.gbr.uplink;
|
||||||
|
|
||||||
|
/**************************************************************
|
||||||
|
* Build PCC Rule & QoS Decision
|
||||||
|
*************************************************************/
|
||||||
|
PccRule = ogs_sbi_build_pcc_rule(pcc_rule, flow_presence);
|
||||||
|
ogs_assert(PccRule->pcc_rule_id);
|
||||||
|
|
||||||
|
PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule);
|
||||||
|
ogs_assert(PccRuleMap);
|
||||||
|
|
||||||
|
OpenAPI_list_add(PccRuleList, PccRuleMap);
|
||||||
|
|
||||||
|
QosData = ogs_sbi_build_qos_data(pcc_rule);
|
||||||
|
ogs_assert(QosData);
|
||||||
|
ogs_assert(QosData->qos_id);
|
||||||
|
|
||||||
|
QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData);
|
||||||
|
ogs_assert(QosDecisionMap);
|
||||||
|
|
||||||
|
OpenAPI_list_add(QosDecisionList, QosDecisionMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PccRuleList->count)
|
||||||
|
SmPolicyDecision.pcc_rules = PccRuleList;
|
||||||
|
|
||||||
|
if (QosDecisionList->count)
|
||||||
|
SmPolicyDecision.qos_decs = QosDecisionList;
|
||||||
|
|
||||||
|
memset(&sendmsg, 0, sizeof(sendmsg));
|
||||||
|
|
||||||
|
sendmsg.AppSessionContextUpdateDataPatch =
|
||||||
|
recvmsg->AppSessionContextUpdateDataPatch;
|
||||||
|
|
||||||
|
response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK);
|
||||||
|
ogs_assert(response);
|
||||||
|
ogs_assert(true == ogs_sbi_server_send_response(stream, response));
|
||||||
|
|
||||||
|
if (PccRuleList->count || QosDecisionList->count) {
|
||||||
|
ogs_assert(true == pcf_sbi_send_smpolicycontrol_update_notify(
|
||||||
|
sess, &SmPolicyDecision));
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(PccRuleList, node) {
|
||||||
|
PccRuleMap = node->data;
|
||||||
|
if (PccRuleMap) {
|
||||||
|
PccRule = PccRuleMap->value;
|
||||||
|
if (PccRule)
|
||||||
|
ogs_sbi_free_pcc_rule(PccRule);
|
||||||
|
ogs_free(PccRuleMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(PccRuleList);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(QosDecisionList, node) {
|
||||||
|
QosDecisionMap = node->data;
|
||||||
|
if (QosDecisionMap) {
|
||||||
|
QosData = QosDecisionMap->value;
|
||||||
|
if (QosData)
|
||||||
|
ogs_sbi_free_qos_data(QosData);
|
||||||
|
ogs_free(QosDecisionMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(QosDecisionList);
|
||||||
|
|
||||||
|
ogs_ims_data_free(&ims_data);
|
||||||
|
ogs_session_data_free(&session_data);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
ogs_assert(status);
|
||||||
|
ogs_assert(strerror);
|
||||||
|
ogs_error("%s", strerror);
|
||||||
|
ogs_assert(true ==
|
||||||
|
ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL));
|
||||||
|
ogs_free(strerror);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(PccRuleList, node) {
|
||||||
|
PccRuleMap = node->data;
|
||||||
|
if (PccRuleMap) {
|
||||||
|
PccRule = PccRuleMap->value;
|
||||||
|
if (PccRule)
|
||||||
|
ogs_sbi_free_pcc_rule(PccRule);
|
||||||
|
ogs_free(PccRuleMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(PccRuleList);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(QosDecisionList, node) {
|
||||||
|
QosDecisionMap = node->data;
|
||||||
|
if (QosDecisionMap) {
|
||||||
|
QosData = QosDecisionMap->value;
|
||||||
|
if (QosData)
|
||||||
|
ogs_sbi_free_qos_data(QosData);
|
||||||
|
ogs_free(QosDecisionMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(QosDecisionList);
|
||||||
|
|
||||||
|
ogs_ims_data_free(&ims_data);
|
||||||
|
ogs_session_data_free(&session_data);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pcf_npcf_policyauthorization_handle_delete(
|
||||||
|
pcf_sess_t *sess, pcf_app_t *app_session,
|
||||||
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
OpenAPI_sm_policy_decision_t SmPolicyDecision;
|
||||||
|
|
||||||
|
OpenAPI_list_t *PccRuleList = NULL;
|
||||||
|
OpenAPI_map_t *PccRuleMap = NULL;
|
||||||
|
|
||||||
|
OpenAPI_list_t *QosDecisionList = NULL;
|
||||||
|
OpenAPI_map_t *QosDecisionMap = NULL;
|
||||||
|
|
||||||
|
OpenAPI_lnode_t *node = NULL;
|
||||||
|
|
||||||
|
ogs_assert(true == ogs_sbi_send_http_status_no_content(stream));
|
||||||
|
|
||||||
|
ogs_assert(app_session);
|
||||||
|
|
||||||
|
memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision));
|
||||||
|
|
||||||
|
PccRuleList = OpenAPI_list_create();
|
||||||
|
ogs_assert(PccRuleList);
|
||||||
|
|
||||||
|
QosDecisionList = OpenAPI_list_create();
|
||||||
|
ogs_assert(QosDecisionList);
|
||||||
|
|
||||||
|
for (i = 0; i < app_session->num_of_pcc_rule; i++) {
|
||||||
|
ogs_pcc_rule_t *pcc_rule = &app_session->pcc_rule[i];
|
||||||
|
|
||||||
|
ogs_assert(pcc_rule);
|
||||||
|
|
||||||
|
PccRuleMap = OpenAPI_map_create(pcc_rule->id, NULL);
|
||||||
|
ogs_assert(PccRuleMap);
|
||||||
|
|
||||||
|
OpenAPI_list_add(PccRuleList, PccRuleMap);
|
||||||
|
|
||||||
|
QosDecisionMap = OpenAPI_map_create(pcc_rule->id, NULL);
|
||||||
|
ogs_assert(QosDecisionMap);
|
||||||
|
|
||||||
|
OpenAPI_list_add(QosDecisionList, QosDecisionMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PccRuleList->count)
|
||||||
|
SmPolicyDecision.pcc_rules = PccRuleList;
|
||||||
|
|
||||||
|
if (QosDecisionList->count)
|
||||||
|
SmPolicyDecision.qos_decs = QosDecisionList;
|
||||||
|
|
||||||
|
if (PccRuleList->count || QosDecisionList->count) {
|
||||||
|
ogs_assert(true == pcf_sbi_send_smpolicycontrol_delete_notify(
|
||||||
|
sess, app_session, &SmPolicyDecision));
|
||||||
|
} else {
|
||||||
|
pcf_app_remove(app_session);
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(PccRuleList, node) {
|
||||||
|
PccRuleMap = node->data;
|
||||||
|
if (PccRuleMap) {
|
||||||
|
ogs_free(PccRuleMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(PccRuleList);
|
||||||
|
|
||||||
|
OpenAPI_list_for_each(QosDecisionList, node) {
|
||||||
|
QosDecisionMap = node->data;
|
||||||
|
if (QosDecisionMap) {
|
||||||
|
ogs_free(QosDecisionMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenAPI_list_free(QosDecisionList);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -29,13 +29,19 @@ extern "C" {
|
||||||
bool pcf_npcf_am_policy_contrtol_handle_create(pcf_ue_t *pcf_ue,
|
bool pcf_npcf_am_policy_contrtol_handle_create(pcf_ue_t *pcf_ue,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||||
|
|
||||||
bool pcf_npcf_smpolicycontrtol_handle_create(pcf_sess_t *sess,
|
bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||||
bool pcf_npcf_smpolicycontrtol_handle_delete(pcf_sess_t *sess,
|
bool pcf_npcf_smpolicycontrol_handle_delete(pcf_sess_t *sess,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||||
|
|
||||||
bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess,
|
||||||
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||||
|
bool pcf_npcf_policyauthorization_handle_update(
|
||||||
|
pcf_sess_t *sess, pcf_app_t *app,
|
||||||
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||||
|
bool pcf_npcf_policyauthorization_handle_delete(
|
||||||
|
pcf_sess_t *sess, pcf_app_t *app,
|
||||||
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,27 +19,86 @@
|
||||||
|
|
||||||
#include "nsmf-build.h"
|
#include "nsmf-build.h"
|
||||||
|
|
||||||
ogs_sbi_request_t *pcf_nsmf_callback_build_smpolicycontrol(
|
ogs_sbi_request_t *pcf_nsmf_callback_build_smpolicycontrol_update(
|
||||||
pcf_sess_t *sess, void *data)
|
pcf_sess_t *sess, void *data)
|
||||||
{
|
{
|
||||||
ogs_sbi_message_t message;
|
ogs_sbi_message_t message;
|
||||||
|
ogs_sbi_header_t header;
|
||||||
ogs_sbi_request_t *request = NULL;
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
ogs_sbi_server_t *server = NULL;
|
||||||
|
|
||||||
OpenAPI_sm_policy_notification_t SmPolicyNotification;
|
OpenAPI_sm_policy_notification_t SmPolicyNotification;
|
||||||
|
OpenAPI_sm_policy_decision_t *SmPolicyDecision;
|
||||||
|
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
ogs_assert(sess->sm_policy_id);
|
||||||
ogs_assert(sess->notification_uri);
|
ogs_assert(sess->notification_uri);
|
||||||
|
|
||||||
|
server = ogs_list_first(&ogs_sbi_self()->server_list);
|
||||||
|
ogs_assert(server);
|
||||||
|
|
||||||
|
memset(&header, 0, sizeof(header));
|
||||||
|
header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL;
|
||||||
|
header.api.version = (char *)OGS_SBI_API_V1;
|
||||||
|
header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES;
|
||||||
|
header.resource.component[1] = sess->sm_policy_id;
|
||||||
|
header.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_UPDATE;
|
||||||
|
|
||||||
memset(&SmPolicyNotification, 0, sizeof(SmPolicyNotification));
|
memset(&SmPolicyNotification, 0, sizeof(SmPolicyNotification));
|
||||||
|
|
||||||
|
SmPolicyNotification.resource_uri = ogs_sbi_server_uri(server, &header);
|
||||||
|
ogs_assert(SmPolicyNotification.resource_uri);
|
||||||
|
|
||||||
|
SmPolicyDecision = data;
|
||||||
|
ogs_assert(SmPolicyDecision);
|
||||||
|
|
||||||
|
SmPolicyNotification.sm_policy_decision = SmPolicyDecision;
|
||||||
|
|
||||||
memset(&message, 0, sizeof(message));
|
memset(&message, 0, sizeof(message));
|
||||||
message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST;
|
message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST;
|
||||||
message.h.uri = sess->notification_uri;
|
message.h.uri = ogs_mstrcatf(
|
||||||
|
sess->notification_uri, "/%s", OGS_SBI_RESOURCE_NAME_UPDATE);
|
||||||
|
ogs_assert(message.h.uri);
|
||||||
|
|
||||||
message.SmPolicyNotification = &SmPolicyNotification;
|
message.SmPolicyNotification = &SmPolicyNotification;
|
||||||
|
|
||||||
request = ogs_sbi_build_request(&message);
|
request = ogs_sbi_build_request(&message);
|
||||||
ogs_assert(request);
|
ogs_assert(request);
|
||||||
|
|
||||||
|
ogs_free(SmPolicyNotification.resource_uri);
|
||||||
|
ogs_free(message.h.uri);
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_sbi_request_t *pcf_nsmf_callback_build_smpolicycontrol_terminate(
|
||||||
|
pcf_sess_t *sess, void *data)
|
||||||
|
{
|
||||||
|
ogs_sbi_message_t message;
|
||||||
|
ogs_sbi_header_t header;
|
||||||
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_assert(sess->sm_policy_id);
|
||||||
|
ogs_assert(sess->notification_uri);
|
||||||
|
|
||||||
|
memset(&header, 0, sizeof(header));
|
||||||
|
header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL;
|
||||||
|
header.api.version = (char *)OGS_SBI_API_V1;
|
||||||
|
header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES;
|
||||||
|
header.resource.component[1] = sess->sm_policy_id;
|
||||||
|
header.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_UPDATE;
|
||||||
|
|
||||||
|
memset(&message, 0, sizeof(message));
|
||||||
|
message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST;
|
||||||
|
message.h.uri = ogs_mstrcatf(
|
||||||
|
sess->notification_uri, "/%s", OGS_SBI_RESOURCE_NAME_TERMINATE);
|
||||||
|
ogs_assert(message.h.uri);
|
||||||
|
|
||||||
|
request = ogs_sbi_build_request(&message);
|
||||||
|
ogs_assert(request);
|
||||||
|
|
||||||
|
ogs_free(message.h.uri);
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,9 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ogs_sbi_request_t *pcf_nsmf_callback_build_smpolicycontrol(
|
ogs_sbi_request_t *pcf_nsmf_callback_build_smpolicycontrol_update(
|
||||||
|
pcf_sess_t *sess, void *data);
|
||||||
|
ogs_sbi_request_t *pcf_nsmf_callback_build_smpolicycontrol_terminate(
|
||||||
pcf_sess_t *sess, void *data);
|
pcf_sess_t *sess, void *data);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -53,6 +53,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e)
|
||||||
|
|
||||||
pcf_ue_t *pcf_ue = NULL;
|
pcf_ue_t *pcf_ue = NULL;
|
||||||
pcf_sess_t *sess = NULL;
|
pcf_sess_t *sess = NULL;
|
||||||
|
pcf_app_t *app_session = NULL;
|
||||||
|
|
||||||
pcf_sm_debug(e);
|
pcf_sm_debug(e);
|
||||||
|
|
||||||
|
@ -231,8 +232,10 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e)
|
||||||
AppSessionContext->asc_req_data->ue_ipv6);
|
AppSessionContext->asc_req_data->ue_ipv6);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sess = pcf_sess_find_by_app_session_id(
|
app_session = pcf_app_find_by_app_session_id(
|
||||||
message.h.resource.component[1]);
|
message.h.resource.component[1]);
|
||||||
|
if (app_session)
|
||||||
|
sess = app_session->sess;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -251,6 +254,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e)
|
||||||
ogs_assert(OGS_FSM_STATE(&sess->sm));
|
ogs_assert(OGS_FSM_STATE(&sess->sm));
|
||||||
|
|
||||||
e->sess = sess;
|
e->sess = sess;
|
||||||
|
e->app = app_session;
|
||||||
e->sbi.message = &message;
|
e->sbi.message = &message;
|
||||||
ogs_fsm_dispatch(&sess->sm, e);
|
ogs_fsm_dispatch(&sess->sm, e);
|
||||||
if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) {
|
if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) {
|
||||||
|
|
|
@ -240,6 +240,18 @@ static int client_notify_cb(ogs_sbi_response_t *response, void *data)
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int client_delete_notify_cb(ogs_sbi_response_t *response, void *data)
|
||||||
|
{
|
||||||
|
pcf_app_t *app_session = data;
|
||||||
|
|
||||||
|
ogs_assert(app_session);
|
||||||
|
client_notify_cb(response, data);
|
||||||
|
|
||||||
|
pcf_app_remove(app_session);
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue)
|
bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue)
|
||||||
{
|
{
|
||||||
ogs_sbi_request_t *request = NULL;
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
@ -254,7 +266,8 @@ bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue)
|
||||||
return ogs_sbi_client_send_request(client, client_notify_cb, request, NULL);
|
return ogs_sbi_client_send_request(client, client_notify_cb, request, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pcf_sbi_send_smpolicycontrol_notify(pcf_sess_t *sess)
|
bool pcf_sbi_send_smpolicycontrol_update_notify(
|
||||||
|
pcf_sess_t *sess, OpenAPI_sm_policy_decision_t *SmPolicyDecision)
|
||||||
{
|
{
|
||||||
ogs_sbi_request_t *request = NULL;
|
ogs_sbi_request_t *request = NULL;
|
||||||
ogs_sbi_client_t *client = NULL;
|
ogs_sbi_client_t *client = NULL;
|
||||||
|
@ -263,7 +276,54 @@ bool pcf_sbi_send_smpolicycontrol_notify(pcf_sess_t *sess)
|
||||||
client = sess->nsmf.client;
|
client = sess->nsmf.client;
|
||||||
ogs_assert(client);
|
ogs_assert(client);
|
||||||
|
|
||||||
request = pcf_nsmf_callback_build_smpolicycontrol(sess, NULL);
|
request = pcf_nsmf_callback_build_smpolicycontrol_update(
|
||||||
|
sess, SmPolicyDecision);
|
||||||
|
ogs_expect_or_return_val(request, false);
|
||||||
|
return ogs_sbi_client_send_request(client, client_notify_cb, request, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pcf_sbi_send_smpolicycontrol_delete_notify(
|
||||||
|
pcf_sess_t *sess, pcf_app_t *app_session,
|
||||||
|
OpenAPI_sm_policy_decision_t *SmPolicyDecision)
|
||||||
|
{
|
||||||
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
ogs_sbi_client_t *client = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
client = sess->nsmf.client;
|
||||||
|
ogs_assert(client);
|
||||||
|
|
||||||
|
request = pcf_nsmf_callback_build_smpolicycontrol_update(
|
||||||
|
sess, SmPolicyDecision);
|
||||||
|
ogs_expect_or_return_val(request, false);
|
||||||
|
return ogs_sbi_client_send_request(
|
||||||
|
client, client_delete_notify_cb, request, app_session);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pcf_sbi_send_smpolicycontrol_terminate_notify(pcf_sess_t *sess)
|
||||||
|
{
|
||||||
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
ogs_sbi_client_t *client = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
client = sess->nsmf.client;
|
||||||
|
ogs_assert(client);
|
||||||
|
|
||||||
|
request = pcf_nsmf_callback_build_smpolicycontrol_terminate(sess, NULL);
|
||||||
|
ogs_expect_or_return_val(request, false);
|
||||||
|
return ogs_sbi_client_send_request(client, client_notify_cb, request, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pcf_sbi_send_policyauthorization_terminate_notify(pcf_app_t *app)
|
||||||
|
{
|
||||||
|
ogs_sbi_request_t *request = NULL;
|
||||||
|
ogs_sbi_client_t *client = NULL;
|
||||||
|
|
||||||
|
ogs_assert(app);
|
||||||
|
client = app->naf.client;
|
||||||
|
ogs_assert(client);
|
||||||
|
|
||||||
|
request = pcf_naf_callback_build_policyauthorization_terminate(app, NULL);
|
||||||
ogs_expect_or_return_val(request, false);
|
ogs_expect_or_return_val(request, false);
|
||||||
return ogs_sbi_client_send_request(client, client_notify_cb, request, NULL);
|
return ogs_sbi_client_send_request(client, client_notify_cb, request, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "nbsf-build.h"
|
#include "nbsf-build.h"
|
||||||
#include "namf-build.h"
|
#include "namf-build.h"
|
||||||
#include "nsmf-build.h"
|
#include "nsmf-build.h"
|
||||||
|
#include "naf-build.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -44,7 +45,14 @@ bool pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
|
||||||
ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data));
|
ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data));
|
||||||
|
|
||||||
bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue);
|
bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue);
|
||||||
bool pcf_sbi_send_smpolicycontrol_notify(pcf_sess_t *sess);
|
bool pcf_sbi_send_smpolicycontrol_update_notify(
|
||||||
|
pcf_sess_t *sess, OpenAPI_sm_policy_decision_t *SmPolicyDecision);
|
||||||
|
bool pcf_sbi_send_smpolicycontrol_delete_notify(
|
||||||
|
pcf_sess_t *sess, pcf_app_t *app_session,
|
||||||
|
OpenAPI_sm_policy_decision_t *SmPolicyDecision);
|
||||||
|
bool pcf_sbi_send_smpolicycontrol_terminate_notify(pcf_sess_t *sess);
|
||||||
|
|
||||||
|
bool pcf_sbi_send_policyauthorization_terminate_notify(pcf_app_t *app);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,22 +70,22 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e)
|
||||||
SWITCH(message->h.service.name)
|
SWITCH(message->h.service.name)
|
||||||
CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL)
|
CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL)
|
||||||
if (!message->h.resource.component[1]) {
|
if (!message->h.resource.component[1]) {
|
||||||
handled = pcf_npcf_smpolicycontrtol_handle_create(
|
handled = pcf_npcf_smpolicycontrol_handle_create(
|
||||||
sess, stream, message);
|
sess, stream, message);
|
||||||
if (!handled) {
|
if (!handled) {
|
||||||
ogs_error("[%s:%d] "
|
ogs_error("[%s:%d] "
|
||||||
"pcf_npcf_smpolicycontrtol_handle_create() failed",
|
"pcf_npcf_smpolicycontrol_handle_create() failed",
|
||||||
pcf_ue->supi, sess->psi);
|
pcf_ue->supi, sess->psi);
|
||||||
OGS_FSM_TRAN(s, pcf_sm_state_exception);
|
OGS_FSM_TRAN(s, pcf_sm_state_exception);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SWITCH(message->h.resource.component[2])
|
SWITCH(message->h.resource.component[2])
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_DELETE)
|
CASE(OGS_SBI_RESOURCE_NAME_DELETE)
|
||||||
handled = pcf_npcf_smpolicycontrtol_handle_delete(
|
handled = pcf_npcf_smpolicycontrol_handle_delete(
|
||||||
sess, stream, message);
|
sess, stream, message);
|
||||||
if (!handled) {
|
if (!handled) {
|
||||||
ogs_error("[%s:%d] "
|
ogs_error("[%s:%d] "
|
||||||
"pcf_npcf_smpolicycontrtol_handle_delete() failed",
|
"pcf_npcf_smpolicycontrol_handle_delete() failed",
|
||||||
pcf_ue->supi, sess->psi);
|
pcf_ue->supi, sess->psi);
|
||||||
OGS_FSM_TRAN(s, pcf_sm_state_exception);
|
OGS_FSM_TRAN(s, pcf_sm_state_exception);
|
||||||
}
|
}
|
||||||
|
@ -103,17 +103,46 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CASE(OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION)
|
CASE(OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION)
|
||||||
if (!message->h.resource.component[1]) {
|
if (message->h.resource.component[1]) {
|
||||||
handled = pcf_npcf_policyauthorization_handle_create(
|
if (message->h.resource.component[2]) {
|
||||||
sess, stream, message);
|
SWITCH(message->h.resource.component[2])
|
||||||
|
CASE(OGS_SBI_RESOURCE_NAME_DELETE)
|
||||||
|
handled = pcf_npcf_policyauthorization_handle_delete(
|
||||||
|
sess, e->app, stream, message);
|
||||||
|
break;
|
||||||
|
DEFAULT
|
||||||
|
ogs_error("[%s:%d] Invalid resource name [%s]",
|
||||||
|
pcf_ue->supi, sess->psi,
|
||||||
|
message->h.resource.component[2]);
|
||||||
|
ogs_assert(true ==
|
||||||
|
ogs_sbi_server_send_error(stream,
|
||||||
|
OGS_SBI_HTTP_STATUS_FORBIDDEN, message,
|
||||||
|
"Invalid resource name", message->h.uri));
|
||||||
|
END
|
||||||
|
} else {
|
||||||
|
SWITCH(message->h.method)
|
||||||
|
CASE(OGS_SBI_HTTP_METHOD_PATCH)
|
||||||
|
handled = pcf_npcf_policyauthorization_handle_update(
|
||||||
|
sess, e->app, stream, message);
|
||||||
|
break;
|
||||||
|
DEFAULT
|
||||||
|
ogs_error("[%s:%d] Unknown method [%s]",
|
||||||
|
pcf_ue->supi, sess->psi, message->h.method);
|
||||||
|
ogs_assert(true ==
|
||||||
|
ogs_sbi_server_send_error(stream,
|
||||||
|
OGS_SBI_HTTP_STATUS_FORBIDDEN, message,
|
||||||
|
"Invalid HTTP method", message->h.uri));
|
||||||
|
END
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
SWITCH(message->h.resource.component[2])
|
SWITCH(message->h.method)
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_DELETE)
|
CASE(OGS_SBI_HTTP_METHOD_POST)
|
||||||
ogs_fatal("TODO");
|
handled = pcf_npcf_policyauthorization_handle_create(
|
||||||
|
sess, stream, message);
|
||||||
break;
|
break;
|
||||||
DEFAULT
|
DEFAULT
|
||||||
ogs_error("[%s:%d] Invalid HTTP URI [%s]",
|
ogs_error("[%s:%d] Unknown method [%s]",
|
||||||
pcf_ue->supi, sess->psi, message->h.uri);
|
pcf_ue->supi, sess->psi, message->h.method);
|
||||||
ogs_assert(true ==
|
ogs_assert(true ==
|
||||||
ogs_sbi_server_send_error(stream,
|
ogs_sbi_server_send_error(stream,
|
||||||
OGS_SBI_HTTP_STATUS_FORBIDDEN, message,
|
OGS_SBI_HTTP_STATUS_FORBIDDEN, message,
|
||||||
|
|
|
@ -62,12 +62,6 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg);
|
||||||
|
|
||||||
static int encode_pcc_rule_definition(
|
static int encode_pcc_rule_definition(
|
||||||
struct avp *avp, ogs_pcc_rule_t *pcc_rule, int flow_presence);
|
struct avp *avp, ogs_pcc_rule_t *pcc_rule, int flow_presence);
|
||||||
static int matched_flow(ogs_pcc_rule_t *pcc_rule,
|
|
||||||
ogs_media_component_t *media_component);
|
|
||||||
static int install_flow(ogs_pcc_rule_t *pcc_rule,
|
|
||||||
ogs_media_component_t *media_component);
|
|
||||||
static int update_qos(ogs_pcc_rule_t *pcc_rule,
|
|
||||||
ogs_media_component_t *media_component);
|
|
||||||
|
|
||||||
static __inline__ struct sess_state *new_state(os0_t sid)
|
static __inline__ struct sess_state *new_state(os0_t sid)
|
||||||
{
|
{
|
||||||
|
@ -654,7 +648,6 @@ int pcrf_gx_send_rar(
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
int ret = 0, i, j;
|
int ret = 0, i, j;
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
struct msg *req = NULL;
|
struct msg *req = NULL;
|
||||||
struct avp *avp, *avpch1;
|
struct avp *avp, *avpch1;
|
||||||
|
@ -749,10 +742,6 @@ int pcrf_gx_send_rar(
|
||||||
ogs_media_component_t *media_component =
|
ogs_media_component_t *media_component =
|
||||||
&rx_message->ims_data.media_component[i];
|
&rx_message->ims_data.media_component[i];
|
||||||
|
|
||||||
if (media_component->media_component_number == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(media_component->media_type) {
|
switch(media_component->media_type) {
|
||||||
case OGS_DIAM_RX_MEDIA_TYPE_AUDIO:
|
case OGS_DIAM_RX_MEDIA_TYPE_AUDIO:
|
||||||
qos_index = OGS_QOS_INDEX_1;
|
qos_index = OGS_QOS_INDEX_1;
|
||||||
|
@ -832,7 +821,8 @@ int pcrf_gx_send_rar(
|
||||||
|
|
||||||
/* Install Flow */
|
/* Install Flow */
|
||||||
flow_presence = 1;
|
flow_presence = 1;
|
||||||
rv = install_flow(pcc_rule, media_component);
|
rv = ogs_pcc_rule_install_flow_from_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
if (rv != OGS_OK) {
|
if (rv != OGS_OK) {
|
||||||
rx_message->result_code =
|
rx_message->result_code =
|
||||||
OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS;
|
OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS;
|
||||||
|
@ -842,8 +832,11 @@ int pcrf_gx_send_rar(
|
||||||
|
|
||||||
rx_sess_data->num_of_pcc_rule++;
|
rx_sess_data->num_of_pcc_rule++;
|
||||||
} else {
|
} else {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
/* Check Flow */
|
/* Check Flow */
|
||||||
count = matched_flow(pcc_rule, media_component);
|
count = ogs_pcc_rule_num_of_flow_equal_to_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
if (count == -1) {
|
if (count == -1) {
|
||||||
rx_message->result_code =
|
rx_message->result_code =
|
||||||
OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS;
|
OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS;
|
||||||
|
@ -854,7 +847,8 @@ int pcrf_gx_send_rar(
|
||||||
if (pcc_rule->num_of_flow != count) {
|
if (pcc_rule->num_of_flow != count) {
|
||||||
/* Re-install Flow */
|
/* Re-install Flow */
|
||||||
flow_presence = 1;
|
flow_presence = 1;
|
||||||
rv = install_flow(pcc_rule, media_component);
|
rv = ogs_pcc_rule_install_flow_from_media(
|
||||||
|
pcc_rule, media_component);
|
||||||
if (rv != OGS_OK) {
|
if (rv != OGS_OK) {
|
||||||
rx_message->result_code =
|
rx_message->result_code =
|
||||||
OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS;
|
OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS;
|
||||||
|
@ -865,7 +859,7 @@ int pcrf_gx_send_rar(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update QoS */
|
/* Update QoS */
|
||||||
rv = update_qos(pcc_rule, media_component);
|
rv = ogs_pcc_rule_update_qos_from_media(pcc_rule, media_component);
|
||||||
if (rv != OGS_OK) {
|
if (rv != OGS_OK) {
|
||||||
rx_message->result_code =
|
rx_message->result_code =
|
||||||
OGS_DIAM_RX_DIAMETER_REQUESTED_SERVICE_NOT_AUTHORIZED;
|
OGS_DIAM_RX_DIAMETER_REQUESTED_SERVICE_NOT_AUTHORIZED;
|
||||||
|
@ -1361,295 +1355,3 @@ static int encode_pcc_rule_definition(
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int flow_rx_to_gx(ogs_flow_t *rx_flow, ogs_flow_t *gx_flow)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char *from_str, *to_str;
|
|
||||||
|
|
||||||
ogs_assert(rx_flow);
|
|
||||||
ogs_assert(gx_flow);
|
|
||||||
|
|
||||||
if (!strncmp(rx_flow->description,
|
|
||||||
"permit out", strlen("permit out"))) {
|
|
||||||
gx_flow->direction = OGS_FLOW_DOWNLINK_ONLY;
|
|
||||||
gx_flow->description = ogs_strdup(rx_flow->description);
|
|
||||||
ogs_assert(gx_flow->description);
|
|
||||||
|
|
||||||
} else if (!strncmp(rx_flow->description,
|
|
||||||
"permit in", strlen("permit in"))) {
|
|
||||||
gx_flow->direction = OGS_FLOW_UPLINK_ONLY;
|
|
||||||
|
|
||||||
/* 'permit in' should be changed
|
|
||||||
* 'permit out' in Gx Diameter */
|
|
||||||
len = strlen(rx_flow->description)+2;
|
|
||||||
gx_flow->description = ogs_malloc(len);
|
|
||||||
ogs_assert(gx_flow->description);
|
|
||||||
strcpy(gx_flow->description, "permit out");
|
|
||||||
from_str = strstr(&rx_flow->description[strlen("permit in")], "from");
|
|
||||||
ogs_assert(from_str);
|
|
||||||
to_str = strstr(&rx_flow->description[strlen("permit in")], "to");
|
|
||||||
ogs_assert(to_str);
|
|
||||||
strncat(gx_flow->description,
|
|
||||||
&rx_flow->description[strlen("permit in")],
|
|
||||||
strlen(rx_flow->description) -
|
|
||||||
strlen("permit in") - strlen(from_str));
|
|
||||||
strcat(gx_flow->description, "from");
|
|
||||||
strcat(gx_flow->description, &to_str[strlen("to")]);
|
|
||||||
strcat(gx_flow->description, " to");
|
|
||||||
strncat(gx_flow->description, &from_str[strlen("from")],
|
|
||||||
strlen(from_str) - strlen(to_str) - strlen("from") - 1);
|
|
||||||
ogs_assert(len == strlen(gx_flow->description)+1);
|
|
||||||
} else {
|
|
||||||
ogs_error("Invalid Flow Descripton : [%s]", rx_flow->description);
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int matched_flow(ogs_pcc_rule_t *pcc_rule,
|
|
||||||
ogs_media_component_t *media_component)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
int i, j, k;
|
|
||||||
int matched = 0;
|
|
||||||
int new = 0;
|
|
||||||
|
|
||||||
ogs_assert(pcc_rule);
|
|
||||||
ogs_assert(media_component);
|
|
||||||
|
|
||||||
for (i = 0; i < media_component->num_of_sub; i++) {
|
|
||||||
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
|
||||||
|
|
||||||
if (sub->flow_number == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < sub->num_of_flow; j++) {
|
|
||||||
new++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new == 0) {
|
|
||||||
/* No new flow in Media-Component */
|
|
||||||
return pcc_rule->num_of_flow;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < media_component->num_of_sub; i++) {
|
|
||||||
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
|
||||||
|
|
||||||
if (sub->flow_number == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < sub->num_of_flow &&
|
|
||||||
j < OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT; j++) {
|
|
||||||
ogs_flow_t gx_flow;
|
|
||||||
ogs_flow_t *rx_flow = &sub->flow[j];
|
|
||||||
|
|
||||||
rv = flow_rx_to_gx(rx_flow, &gx_flow);
|
|
||||||
if (rv != OGS_OK) {
|
|
||||||
ogs_error("flow reformatting error");
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (k = 0; k < pcc_rule->num_of_flow; k++) {
|
|
||||||
if (gx_flow.direction == pcc_rule->flow[k].direction &&
|
|
||||||
!strcmp(gx_flow.description,
|
|
||||||
pcc_rule->flow[k].description)) {
|
|
||||||
matched++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OGS_FLOW_FREE(&gx_flow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return matched;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int install_flow(ogs_pcc_rule_t *pcc_rule,
|
|
||||||
ogs_media_component_t *media_component)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
ogs_assert(pcc_rule);
|
|
||||||
ogs_assert(media_component);
|
|
||||||
|
|
||||||
/* Remove Flow from PCC Rule */
|
|
||||||
for (i = 0; i < pcc_rule->num_of_flow; i++) {
|
|
||||||
OGS_FLOW_FREE(&pcc_rule->flow[i]);
|
|
||||||
}
|
|
||||||
pcc_rule->num_of_flow = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < media_component->num_of_sub; i++) {
|
|
||||||
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
|
||||||
|
|
||||||
if (sub->flow_number == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy Flow to PCC Rule */
|
|
||||||
for (j = 0; j < sub->num_of_flow &&
|
|
||||||
j < OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT; j++) {
|
|
||||||
ogs_flow_t *rx_flow = NULL;
|
|
||||||
ogs_flow_t *gx_flow = NULL;
|
|
||||||
|
|
||||||
if (pcc_rule->num_of_flow < OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE) {
|
|
||||||
rx_flow = &sub->flow[j];
|
|
||||||
gx_flow = &pcc_rule->flow[pcc_rule->num_of_flow];
|
|
||||||
|
|
||||||
rv = flow_rx_to_gx(rx_flow, gx_flow);
|
|
||||||
if (rv != OGS_OK) {
|
|
||||||
ogs_error("flow reformatting error");
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
pcc_rule->num_of_flow++;
|
|
||||||
} else {
|
|
||||||
ogs_error("Overflow: Number of Flow");
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int update_qos(ogs_pcc_rule_t *pcc_rule,
|
|
||||||
ogs_media_component_t *media_component)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
ogs_assert(pcc_rule);
|
|
||||||
ogs_assert(media_component);
|
|
||||||
|
|
||||||
pcc_rule->qos.mbr.downlink = 0;
|
|
||||||
pcc_rule->qos.mbr.uplink = 0;
|
|
||||||
pcc_rule->qos.gbr.downlink = 0;
|
|
||||||
pcc_rule->qos.gbr.uplink = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < media_component->num_of_sub; i++) {
|
|
||||||
ogs_media_sub_component_t *sub = &media_component->sub[i];
|
|
||||||
|
|
||||||
if (sub->flow_number == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < sub->num_of_flow &&
|
|
||||||
j < OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT; j++) {
|
|
||||||
ogs_flow_t gx_flow;
|
|
||||||
ogs_flow_t *rx_flow = &sub->flow[j];
|
|
||||||
|
|
||||||
rv = flow_rx_to_gx(rx_flow, &gx_flow);
|
|
||||||
if (rv != OGS_OK) {
|
|
||||||
ogs_error("flow reformatting error");
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gx_flow.direction == OGS_FLOW_DOWNLINK_ONLY) {
|
|
||||||
if (sub->flow_usage == OGS_DIAM_RX_FLOW_USAGE_RTCP) {
|
|
||||||
if (media_component->rr_bandwidth &&
|
|
||||||
media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
(media_component->rr_bandwidth +
|
|
||||||
media_component->rs_bandwidth);
|
|
||||||
} else if (media_component->max_requested_bandwidth_dl) {
|
|
||||||
if (media_component->rr_bandwidth &&
|
|
||||||
!media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
ogs_max(0.05 *
|
|
||||||
media_component->max_requested_bandwidth_dl,
|
|
||||||
media_component->rr_bandwidth);
|
|
||||||
}
|
|
||||||
if (!media_component->rr_bandwidth &&
|
|
||||||
media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
ogs_max(0.05 *
|
|
||||||
media_component->max_requested_bandwidth_dl,
|
|
||||||
media_component->rs_bandwidth);
|
|
||||||
}
|
|
||||||
if (!media_component->rr_bandwidth &&
|
|
||||||
!media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
0.05 *
|
|
||||||
media_component->max_requested_bandwidth_dl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (gx_flow.description) {
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
media_component->max_requested_bandwidth_dl;
|
|
||||||
pcc_rule->qos.gbr.downlink +=
|
|
||||||
media_component->min_requested_bandwidth_dl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (gx_flow.direction == OGS_FLOW_UPLINK_ONLY) {
|
|
||||||
if (sub->flow_usage == OGS_DIAM_RX_FLOW_USAGE_RTCP) {
|
|
||||||
if (media_component->rr_bandwidth &&
|
|
||||||
media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
(media_component->rr_bandwidth +
|
|
||||||
media_component->rs_bandwidth);
|
|
||||||
} else if (media_component->max_requested_bandwidth_ul) {
|
|
||||||
if (media_component->rr_bandwidth &&
|
|
||||||
!media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
ogs_max(0.05 *
|
|
||||||
media_component->max_requested_bandwidth_ul,
|
|
||||||
media_component->rr_bandwidth);
|
|
||||||
}
|
|
||||||
if (!media_component->rr_bandwidth &&
|
|
||||||
media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
ogs_max(0.05 *
|
|
||||||
media_component->max_requested_bandwidth_ul,
|
|
||||||
media_component->rs_bandwidth);
|
|
||||||
}
|
|
||||||
if (!media_component->rr_bandwidth &&
|
|
||||||
!media_component->rs_bandwidth) {
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
0.05 *
|
|
||||||
media_component->max_requested_bandwidth_ul;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (gx_flow.description) {
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
media_component->max_requested_bandwidth_ul;
|
|
||||||
pcc_rule->qos.gbr.uplink +=
|
|
||||||
media_component->min_requested_bandwidth_ul;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ogs_assert_if_reached();
|
|
||||||
|
|
||||||
OGS_FLOW_FREE(&gx_flow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcc_rule->qos.mbr.downlink == 0) {
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
media_component->max_requested_bandwidth_dl;
|
|
||||||
pcc_rule->qos.mbr.downlink +=
|
|
||||||
(media_component->rr_bandwidth + media_component->rs_bandwidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcc_rule->qos.mbr.uplink == 0) {
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
media_component->max_requested_bandwidth_ul;
|
|
||||||
pcc_rule->qos.mbr.uplink +=
|
|
||||||
(media_component->rr_bandwidth + media_component->rs_bandwidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcc_rule->qos.gbr.downlink == 0)
|
|
||||||
pcc_rule->qos.gbr.downlink = pcc_rule->qos.mbr.downlink;
|
|
||||||
if (pcc_rule->qos.gbr.uplink == 0)
|
|
||||||
pcc_rule->qos.gbr.uplink = pcc_rule->qos.mbr.uplink;
|
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
|
||||||
|
|
|
@ -273,12 +273,23 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
switch (hdr->avp_code) {
|
switch (hdr->avp_code) {
|
||||||
case OGS_DIAM_RX_AVP_CODE_FLOW_NUMBER:
|
case OGS_DIAM_RX_AVP_CODE_FLOW_NUMBER:
|
||||||
sub->flow_number =
|
sub->flow_number = hdr->avp_value->i32;
|
||||||
hdr->avp_value->i32;
|
|
||||||
break;
|
break;
|
||||||
case OGS_DIAM_RX_AVP_CODE_FLOW_USAGE:
|
case OGS_DIAM_RX_AVP_CODE_FLOW_USAGE:
|
||||||
sub->flow_usage =
|
switch (hdr->avp_value->i32) {
|
||||||
hdr->avp_value->i32;
|
case OGS_DIAM_RX_FLOW_USAGE_NO_INFORMATION:
|
||||||
|
sub->flow_usage = OGS_FLOW_USAGE_NO_INFO;
|
||||||
|
break;
|
||||||
|
case OGS_DIAM_RX_FLOW_USAGE_RTCP:
|
||||||
|
sub->flow_usage = OGS_FLOW_USAGE_RTCP;
|
||||||
|
break;
|
||||||
|
case OGS_DIAM_RX_FLOW_USAGE_AF_SIGNALLING:
|
||||||
|
sub->flow_usage = OGS_FLOW_USAGE_AF_SIGNALLING;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ogs_error("Invalid flow usage = %d",
|
||||||
|
hdr->avp_value->i32);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case OGS_DIAM_RX_AVP_CODE_FLOW_DESCRIPTION:
|
case OGS_DIAM_RX_AVP_CODE_FLOW_DESCRIPTION:
|
||||||
ogs_assert(sub->num_of_flow <
|
ogs_assert(sub->num_of_flow <
|
||||||
|
|
|
@ -115,15 +115,12 @@ void smf_bearer_binding(smf_sess_t *sess)
|
||||||
|
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
|
||||||
for (i = 0; i < sess->num_of_pcc_rule; i++) {
|
for (i = 0; i < sess->policy.num_of_pcc_rule; i++) {
|
||||||
ogs_gtp_xact_t *xact = NULL;
|
ogs_gtp_xact_t *xact = NULL;
|
||||||
ogs_gtp_header_t h;
|
ogs_gtp_header_t h;
|
||||||
ogs_pkbuf_t *pkbuf = NULL;
|
ogs_pkbuf_t *pkbuf = NULL;
|
||||||
smf_bearer_t *bearer = NULL;
|
smf_bearer_t *bearer = NULL;
|
||||||
|
ogs_pcc_rule_t *pcc_rule = &sess->policy.pcc_rule[i];
|
||||||
ogs_pcc_rule_t *pcc_rule = &sess->pcc_rule[i];
|
|
||||||
int bearer_created = 0;
|
|
||||||
int qos_presence = 0;
|
|
||||||
|
|
||||||
ogs_assert(pcc_rule);
|
ogs_assert(pcc_rule);
|
||||||
if (pcc_rule->name == NULL) {
|
if (pcc_rule->name == NULL) {
|
||||||
|
@ -132,10 +129,13 @@ void smf_bearer_binding(smf_sess_t *sess)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcc_rule->type == OGS_PCC_RULE_TYPE_INSTALL) {
|
if (pcc_rule->type == OGS_PCC_RULE_TYPE_INSTALL) {
|
||||||
ogs_pfcp_pdr_t *dl_pdr = NULL, *ul_pdr = NULL;
|
bool bearer_created = false;
|
||||||
|
bool qos_presence = false;
|
||||||
|
|
||||||
bearer = smf_bearer_find_by_pcc_rule_name(sess, pcc_rule->name);
|
bearer = smf_bearer_find_by_pcc_rule_name(sess, pcc_rule->name);
|
||||||
if (!bearer) {
|
if (!bearer) {
|
||||||
|
ogs_pfcp_pdr_t *dl_pdr = NULL, *ul_pdr = NULL;
|
||||||
|
|
||||||
if (pcc_rule->num_of_flow == 0) {
|
if (pcc_rule->num_of_flow == 0) {
|
||||||
/* TFT is mandatory in
|
/* TFT is mandatory in
|
||||||
* activate dedicated EPS bearer context request */
|
* activate dedicated EPS bearer context request */
|
||||||
|
@ -210,7 +210,7 @@ void smf_bearer_binding(smf_sess_t *sess)
|
||||||
|
|
||||||
memcpy(&bearer->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
memcpy(&bearer->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
||||||
|
|
||||||
bearer_created = 1;
|
bearer_created = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ogs_assert(strcmp(bearer->pcc_rule.name, pcc_rule->name) == 0);
|
ogs_assert(strcmp(bearer->pcc_rule.name, pcc_rule->name) == 0);
|
||||||
|
@ -227,55 +227,46 @@ void smf_bearer_binding(smf_sess_t *sess)
|
||||||
memcpy(&bearer->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
memcpy(&bearer->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
||||||
|
|
||||||
/* Update Bearer Request encodes updated QoS parameter */
|
/* Update Bearer Request encodes updated QoS parameter */
|
||||||
qos_presence = 1;
|
qos_presence = true;
|
||||||
}
|
|
||||||
|
|
||||||
if (pcc_rule->num_of_flow == 0 && qos_presence == 0) {
|
|
||||||
ogs_warn("No need to send 'Update Bearer Request'");
|
|
||||||
ogs_warn(" - Both QoS and TFT are same as before");
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dl_pdr = bearer->dl_pdr;
|
/*
|
||||||
ogs_assert(dl_pdr);
|
* We only use the method of adding a flow to an existing tft.
|
||||||
ul_pdr = bearer->ul_pdr;
|
*
|
||||||
ogs_assert(ul_pdr);
|
* EPC: OGS_GTP_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT
|
||||||
|
* 5GC: OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS
|
||||||
dl_pdr->num_of_flow = 0;
|
*/
|
||||||
ul_pdr->num_of_flow = 0;
|
|
||||||
|
|
||||||
ogs_list_init(&bearer->pf_to_add_list);
|
ogs_list_init(&bearer->pf_to_add_list);
|
||||||
|
|
||||||
for (j = 0; j < pcc_rule->num_of_flow; j++) {
|
for (j = 0; j < pcc_rule->num_of_flow; j++) {
|
||||||
ogs_flow_t *flow = &pcc_rule->flow[j];
|
|
||||||
smf_pf_t *pf = NULL;
|
smf_pf_t *pf = NULL;
|
||||||
|
ogs_flow_t *flow = &pcc_rule->flow[j];
|
||||||
|
|
||||||
ogs_expect_or_return(flow);
|
ogs_expect_or_return(flow);
|
||||||
ogs_expect_or_return(flow->description);
|
ogs_expect_or_return(flow->description);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To add a flow to an existing tft.
|
||||||
|
* duplicated flows are not added
|
||||||
|
*/
|
||||||
if (smf_pf_find_by_flow(
|
if (smf_pf_find_by_flow(
|
||||||
bearer, flow->direction, flow->description) != NULL) {
|
bearer, flow->direction, flow->description) != NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flow->direction == OGS_FLOW_DOWNLINK_ONLY) {
|
/*
|
||||||
dl_pdr->flow_description[dl_pdr->num_of_flow++] =
|
* To add a flow to an existing tft.
|
||||||
flow->description;
|
*
|
||||||
} else if (flow->direction == OGS_FLOW_UPLINK_ONLY) {
|
* Only new flows are added to the PF list.
|
||||||
ul_pdr->flow_description[ul_pdr->num_of_flow++] =
|
* Then, in the PF list, there are all flows
|
||||||
flow->description;
|
* from the beginning to the present.
|
||||||
} else {
|
*/
|
||||||
ogs_error("Flow Bidirectional is not supported[%d]",
|
|
||||||
flow->direction);
|
|
||||||
}
|
|
||||||
|
|
||||||
pf = smf_pf_add(bearer);
|
pf = smf_pf_add(bearer);
|
||||||
if (!pf) {
|
if (!pf) {
|
||||||
ogs_error("Overflow: PacketFilter in Bearer");
|
ogs_error("Overflow: PacketFilter in Bearer");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ogs_assert(pf);
|
|
||||||
|
|
||||||
pf->direction = flow->direction;
|
pf->direction = flow->direction;
|
||||||
pf->flow_description = ogs_strdup(flow->description);
|
pf->flow_description = ogs_strdup(flow->description);
|
||||||
|
@ -307,45 +298,37 @@ void smf_bearer_binding(smf_sess_t *sess)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To add a flow to an existing tft.
|
||||||
|
*
|
||||||
|
* 'pf_to_add_list' now has the added flow.
|
||||||
|
*/
|
||||||
ogs_list_add(&bearer->pf_to_add_list, &pf->to_add_node);
|
ogs_list_add(&bearer->pf_to_add_list, &pf->to_add_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bearer_created == 1) {
|
if (bearer_created == false &&
|
||||||
/* Setup QER */
|
qos_presence == false &&
|
||||||
if (bearer->qos.mbr.downlink || bearer->qos.mbr.uplink ||
|
ogs_list_count(&bearer->pf_to_add_list) == 0) {
|
||||||
bearer->qos.gbr.downlink || bearer->qos.gbr.uplink) {
|
ogs_error("No need to send 'Update Bearer Request'");
|
||||||
ogs_pfcp_qer_t *qer = NULL;
|
ogs_error("bearer_created:%d, qos_presence:%d, rule_count:%d",
|
||||||
|
bearer_created, qos_presence,
|
||||||
|
ogs_list_count(&bearer->pf_to_add_list));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Only 1 QER is used per bearer */
|
if (bearer_created == true) {
|
||||||
qer = bearer->qer;
|
|
||||||
if (!qer) {
|
|
||||||
qer = ogs_pfcp_qer_add(&sess->pfcp);
|
|
||||||
ogs_assert(qer);
|
|
||||||
bearer->qer = qer;
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_pfcp_pdr_associate_qer(bearer->dl_pdr, qer);
|
smf_bearer_tft_update(bearer);
|
||||||
ogs_pfcp_pdr_associate_qer(bearer->ul_pdr, qer);
|
smf_bearer_qos_update(bearer);
|
||||||
|
|
||||||
qer->mbr.uplink = bearer->qos.mbr.uplink;
|
|
||||||
qer->mbr.downlink = bearer->qos.mbr.downlink;
|
|
||||||
qer->gbr.uplink = bearer->qos.gbr.uplink;
|
|
||||||
qer->gbr.downlink = bearer->qos.gbr.downlink;
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_assert(OGS_OK ==
|
ogs_assert(OGS_OK ==
|
||||||
smf_epc_pfcp_send_bearer_modification_request(
|
smf_epc_pfcp_send_bearer_modification_request(
|
||||||
bearer, OGS_PFCP_MODIFY_CREATE));
|
bearer, OGS_PFCP_MODIFY_CREATE));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ogs_gtp_tft_t tft;
|
ogs_gtp_tft_t tft;
|
||||||
|
|
||||||
memset(&tft, 0, sizeof tft);
|
memset(&tft, 0, sizeof tft);
|
||||||
if (pcc_rule->num_of_flow) {
|
if (ogs_list_count(&bearer->pf_to_add_list) > 0) {
|
||||||
if (ogs_list_count(&bearer->pf_to_add_list) == 0) {
|
|
||||||
ogs_error("No need to send 'Update Bearer Request'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
encode_traffic_flow_template(
|
encode_traffic_flow_template(
|
||||||
&tft, bearer,
|
&tft, bearer,
|
||||||
OGS_GTP_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT);
|
OGS_GTP_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT);
|
||||||
|
@ -358,16 +341,17 @@ void smf_bearer_binding(smf_sess_t *sess)
|
||||||
pkbuf = smf_s5c_build_update_bearer_request(
|
pkbuf = smf_s5c_build_update_bearer_request(
|
||||||
h.type, bearer,
|
h.type, bearer,
|
||||||
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED,
|
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED,
|
||||||
pcc_rule->num_of_flow ? &tft : NULL, qos_presence);
|
(ogs_list_count(&bearer->pf_to_add_list) > 0) ?
|
||||||
|
&tft : NULL, qos_presence);
|
||||||
ogs_expect_or_return(pkbuf);
|
ogs_expect_or_return(pkbuf);
|
||||||
|
|
||||||
xact = ogs_gtp_xact_local_create(
|
xact = ogs_gtp_xact_local_create(
|
||||||
sess->gnode, &h, pkbuf, bearer_timeout, bearer);
|
sess->gnode, &h, pkbuf, bearer_timeout, bearer);
|
||||||
ogs_expect_or_return(xact);
|
ogs_expect_or_return(xact);
|
||||||
|
|
||||||
if (pcc_rule->num_of_flow)
|
if (ogs_list_count(&bearer->pf_to_add_list) > 0)
|
||||||
xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE;
|
xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE;
|
||||||
if (qos_presence)
|
if (qos_presence == true)
|
||||||
xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE;
|
xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE;
|
||||||
|
|
||||||
rv = ogs_gtp_xact_commit(xact);
|
rv = ogs_gtp_xact_commit(xact);
|
||||||
|
@ -428,23 +412,16 @@ int smf_gtp_send_create_bearer_request(smf_bearer_t *bearer)
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
void smf_qos_flow_binding(smf_sess_t *sess)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
|
||||||
for (i = 0; i < sess->num_of_pcc_rule; i++) {
|
for (i = 0; i < sess->policy.num_of_pcc_rule; i++) {
|
||||||
#if 0
|
|
||||||
ogs_gtp_header_t h;
|
|
||||||
ogs_pkbuf_t *pkbuf = NULL;
|
|
||||||
#endif
|
|
||||||
smf_bearer_t *qos_flow = NULL;
|
smf_bearer_t *qos_flow = NULL;
|
||||||
|
ogs_pcc_rule_t *pcc_rule = &sess->policy.pcc_rule[i];
|
||||||
ogs_pcc_rule_t *pcc_rule = &sess->pcc_rule[i];
|
|
||||||
int qos_flow_created = 0;
|
|
||||||
int qos_presence = 0;
|
|
||||||
|
|
||||||
ogs_assert(pcc_rule);
|
ogs_assert(pcc_rule);
|
||||||
if (pcc_rule->id == NULL) {
|
if (pcc_rule->id == NULL) {
|
||||||
|
@ -453,8 +430,12 @@ void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcc_rule->type == OGS_PCC_RULE_TYPE_INSTALL) {
|
if (pcc_rule->type == OGS_PCC_RULE_TYPE_INSTALL) {
|
||||||
|
smf_pf_t *pf = NULL;
|
||||||
ogs_pfcp_pdr_t *dl_pdr = NULL, *ul_pdr = NULL;
|
ogs_pfcp_pdr_t *dl_pdr = NULL, *ul_pdr = NULL;
|
||||||
|
|
||||||
|
bool qos_flow_created = false;
|
||||||
|
bool qos_presence = false;
|
||||||
|
|
||||||
qos_flow = smf_qos_flow_find_by_pcc_rule_id(sess, pcc_rule->id);
|
qos_flow = smf_qos_flow_find_by_pcc_rule_id(sess, pcc_rule->id);
|
||||||
if (!qos_flow) {
|
if (!qos_flow) {
|
||||||
if (pcc_rule->num_of_flow == 0) {
|
if (pcc_rule->num_of_flow == 0) {
|
||||||
|
@ -504,11 +485,9 @@ void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
||||||
|
|
||||||
memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
||||||
|
|
||||||
qos_flow_created = 1;
|
qos_flow_created = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ogs_fatal("Update QoS Flow: Not implemented in 5G Core");
|
|
||||||
ogs_assert_if_reached();
|
|
||||||
ogs_assert(strcmp(qos_flow->pcc_rule.id, pcc_rule->id) == 0);
|
ogs_assert(strcmp(qos_flow->pcc_rule.id, pcc_rule->id) == 0);
|
||||||
|
|
||||||
if ((pcc_rule->qos.mbr.downlink &&
|
if ((pcc_rule->qos.mbr.downlink &&
|
||||||
|
@ -523,51 +502,45 @@ void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
||||||
memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t));
|
||||||
|
|
||||||
/* Update Bearer Request encodes updated QoS parameter */
|
/* Update Bearer Request encodes updated QoS parameter */
|
||||||
qos_presence = 1;
|
qos_presence = true;
|
||||||
}
|
|
||||||
|
|
||||||
if (pcc_rule->num_of_flow == 0 && qos_presence == 0) {
|
|
||||||
ogs_warn("No need to send 'Session Modification Request'");
|
|
||||||
ogs_warn(" - Both QoS and TFT are same as before");
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dl_pdr = qos_flow->dl_pdr;
|
/*
|
||||||
ogs_assert(dl_pdr);
|
* We only use the method of adding a flow to an existing tft.
|
||||||
ul_pdr = qos_flow->ul_pdr;
|
*
|
||||||
ogs_assert(ul_pdr);
|
* EPC: OGS_GTP_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT
|
||||||
|
* 5GC: OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS
|
||||||
dl_pdr->num_of_flow = 0;
|
*/
|
||||||
ul_pdr->num_of_flow = 0;
|
|
||||||
|
|
||||||
ogs_list_init(&qos_flow->pf_to_add_list);
|
ogs_list_init(&qos_flow->pf_to_add_list);
|
||||||
|
|
||||||
for (j = 0; j < pcc_rule->num_of_flow; j++) {
|
for (j = 0; j < pcc_rule->num_of_flow; j++) {
|
||||||
ogs_flow_t *flow = &pcc_rule->flow[j];
|
ogs_flow_t *flow = &pcc_rule->flow[j];
|
||||||
smf_pf_t *pf = NULL;
|
|
||||||
|
|
||||||
ogs_expect_or_return(flow);
|
ogs_expect_or_return(flow);
|
||||||
ogs_expect_or_return(flow->description);
|
ogs_expect_or_return(flow->description);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To add a flow to an existing tft.
|
||||||
|
* duplicated flows are not added
|
||||||
|
*/
|
||||||
if (smf_pf_find_by_flow(
|
if (smf_pf_find_by_flow(
|
||||||
qos_flow, flow->direction, flow->description) != NULL) {
|
qos_flow, flow->direction, flow->description) != NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flow->direction == OGS_FLOW_DOWNLINK_ONLY) {
|
/*
|
||||||
dl_pdr->flow_description[dl_pdr->num_of_flow++] =
|
* To add a flow to an existing tft.
|
||||||
flow->description;
|
*
|
||||||
} else if (flow->direction == OGS_FLOW_UPLINK_ONLY) {
|
* Only new flows are added to the PF list.
|
||||||
ul_pdr->flow_description[ul_pdr->num_of_flow++] =
|
* Then, in the PF list, there are all flows
|
||||||
flow->description;
|
* from the beginning to the present.
|
||||||
} else {
|
*/
|
||||||
ogs_error("Flow Bidirectional is not supported[%d]",
|
|
||||||
flow->direction);
|
|
||||||
}
|
|
||||||
|
|
||||||
pf = smf_pf_add(qos_flow);
|
pf = smf_pf_add(qos_flow);
|
||||||
ogs_assert(pf);
|
if (!pf) {
|
||||||
|
ogs_error("Overflow: PacketFilter in Bearer");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pf->direction = flow->direction;
|
pf->direction = flow->direction;
|
||||||
pf->flow_description = ogs_strdup(flow->description);
|
pf->flow_description = ogs_strdup(flow->description);
|
||||||
|
@ -599,99 +572,67 @@ void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To add a flow to an existing tft.
|
||||||
|
*
|
||||||
|
* 'pf_to_add_list' now has the added flow.
|
||||||
|
*/
|
||||||
ogs_list_add(&qos_flow->pf_to_add_list, &pf->to_add_node);
|
ogs_list_add(&qos_flow->pf_to_add_list, &pf->to_add_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qos_flow_created == 1) {
|
if (qos_flow_created == false &&
|
||||||
/* Setup QER */
|
qos_presence == false &&
|
||||||
if (qos_flow->qos.mbr.downlink || qos_flow->qos.mbr.uplink ||
|
ogs_list_count(&qos_flow->pf_to_add_list) == 0) {
|
||||||
qos_flow->qos.gbr.downlink || qos_flow->qos.gbr.uplink) {
|
ogs_error("No need to send 'Session Modification Request'");
|
||||||
ogs_pfcp_qer_t *qer = NULL;
|
ogs_error("qos_flow_created:%d, qos_presence:%d, rule_count:%d",
|
||||||
|
qos_flow_created, qos_presence,
|
||||||
|
ogs_list_count(&qos_flow->pf_to_add_list));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Only 1 QER is used per qos_flow */
|
if (qos_flow_created == true) {
|
||||||
qer = qos_flow->qer;
|
smf_bearer_tft_update(qos_flow);
|
||||||
if (!qer) {
|
smf_bearer_qos_update(qos_flow);
|
||||||
qer = ogs_pfcp_qer_add(&sess->pfcp);
|
|
||||||
ogs_assert(qer);
|
|
||||||
qos_flow->qer = qer;
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_pfcp_pdr_associate_qer(qos_flow->dl_pdr, qer);
|
ogs_assert(OGS_OK ==
|
||||||
ogs_pfcp_pdr_associate_qer(qos_flow->ul_pdr, qer);
|
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||||
|
qos_flow, NULL,
|
||||||
|
OGS_PFCP_MODIFY_NETWORK_REQUESTED|
|
||||||
|
OGS_PFCP_MODIFY_CREATE));
|
||||||
|
|
||||||
qer->mbr.uplink = qos_flow->qos.mbr.uplink;
|
} else {
|
||||||
qer->mbr.downlink = qos_flow->qos.mbr.downlink;
|
uint64_t pfcp_flags = 0;
|
||||||
qer->gbr.uplink = qos_flow->qos.gbr.uplink;
|
|
||||||
qer->gbr.downlink = qos_flow->qos.gbr.downlink;
|
pfcp_flags |= OGS_PFCP_MODIFY_NETWORK_REQUESTED;
|
||||||
|
|
||||||
|
if (ogs_list_count(&qos_flow->pf_to_add_list) > 0) {
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_TFT_ADD;
|
||||||
|
smf_bearer_tft_update(qos_flow);
|
||||||
|
}
|
||||||
|
if (qos_presence == true) {
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_QOS_MODIFY;
|
||||||
|
smf_bearer_qos_update(qos_flow);
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_assert(OGS_OK ==
|
ogs_assert(OGS_OK ==
|
||||||
smf_5gc_pfcp_send_qos_flow_modification_request(
|
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||||
qos_flow, NULL, OGS_PFCP_MODIFY_CREATE));
|
qos_flow, NULL, pfcp_flags));
|
||||||
|
|
||||||
} else {
|
|
||||||
ogs_fatal("Update Qos Flow Not Implemented");
|
|
||||||
ogs_assert_if_reached();
|
|
||||||
#if 0
|
|
||||||
ogs_gtp_tft_t tft;
|
|
||||||
|
|
||||||
memset(&tft, 0, sizeof tft);
|
|
||||||
if (pcc_rule->num_of_flow)
|
|
||||||
encode_traffic_flow_template(
|
|
||||||
&tft, qos_flow,
|
|
||||||
OGS_GTP_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT);
|
|
||||||
|
|
||||||
memset(&h, 0, sizeof(ogs_gtp_header_t));
|
|
||||||
h.type = OGS_GTP_UPDATE_BEARER_REQUEST_TYPE;
|
|
||||||
h.teid = sess->sgw_s5c_teid;
|
|
||||||
|
|
||||||
pkbuf = smf_s5c_build_update_qos_flow_request(
|
|
||||||
h.type, qos_flow,
|
|
||||||
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED,
|
|
||||||
pcc_rule->num_of_flow ? &tft : NULL, qos_presence);
|
|
||||||
ogs_expect_or_return(pkbuf);
|
|
||||||
|
|
||||||
xact = ogs_gtp_xact_local_create(
|
|
||||||
sess->gnode, &h, pkbuf, qos_flow_timeout, qos_flow);
|
|
||||||
ogs_expect_or_return(xact);
|
|
||||||
|
|
||||||
if (pcc_rule->num_of_flow)
|
|
||||||
xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE;
|
|
||||||
if (qos_presence)
|
|
||||||
xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE;
|
|
||||||
|
|
||||||
rv = ogs_gtp_xact_commit(xact);
|
|
||||||
ogs_expect(rv == OGS_OK);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} else if (pcc_rule->type == OGS_PCC_RULE_TYPE_REMOVE) {
|
} else if (pcc_rule->type == OGS_PCC_RULE_TYPE_REMOVE) {
|
||||||
ogs_fatal("Remove Type Not Implemented");
|
qos_flow = smf_qos_flow_find_by_pcc_rule_id(sess, pcc_rule->id);
|
||||||
ogs_assert_if_reached();
|
|
||||||
#if 0
|
|
||||||
qos_flow = smf_qos_flow_find_by_name(sess, pcc_rule->name);
|
|
||||||
|
|
||||||
if (!qos_flow) {
|
if (!qos_flow) {
|
||||||
ogs_warn("No need to send 'Delete Bearer Request'");
|
ogs_warn("No need to send 'Session Modification Request'");
|
||||||
ogs_warn(" - Bearer[Name:%s] has already been removed.",
|
ogs_warn(" - QosFlow[Id:%s] has already been removed.",
|
||||||
pcc_rule->name);
|
pcc_rule->id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&h, 0, sizeof(ogs_gtp_header_t));
|
ogs_assert(OGS_OK ==
|
||||||
h.type = OGS_GTP_DELETE_BEARER_REQUEST_TYPE;
|
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||||
h.teid = sess->sgw_s5c_teid;
|
qos_flow, NULL,
|
||||||
|
OGS_PFCP_MODIFY_NETWORK_REQUESTED|OGS_PFCP_MODIFY_REMOVE));
|
||||||
|
|
||||||
pkbuf = smf_s5c_build_delete_qos_flow_request(h.type, qos_flow,
|
|
||||||
OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED);
|
|
||||||
ogs_expect_or_return(pkbuf);
|
|
||||||
|
|
||||||
xact = ogs_gtp_xact_local_create(
|
|
||||||
sess->gnode, &h, pkbuf, qos_flow_timeout, qos_flow);
|
|
||||||
ogs_expect_or_return(xact);
|
|
||||||
|
|
||||||
rv = ogs_gtp_xact_commit(xact);
|
|
||||||
ogs_expect(rv == OGS_OK);
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
ogs_error("Invalid Type[%d]", pcc_rule->type);
|
ogs_error("Invalid Type[%d]", pcc_rule->type);
|
||||||
ogs_assert_if_reached();
|
ogs_assert_if_reached();
|
||||||
|
|
|
@ -29,7 +29,7 @@ extern "C" {
|
||||||
void smf_bearer_binding(smf_sess_t *sess);
|
void smf_bearer_binding(smf_sess_t *sess);
|
||||||
int smf_gtp_send_create_bearer_request(smf_bearer_t *bearer);
|
int smf_gtp_send_create_bearer_request(smf_bearer_t *bearer);
|
||||||
|
|
||||||
void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream);
|
void smf_qos_flow_binding(smf_sess_t *sess);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -1423,9 +1423,9 @@ void smf_sess_remove(smf_sess_t *sess)
|
||||||
|
|
||||||
OGS_NAS_CLEAR_DATA(&sess->nas.ue_pco);
|
OGS_NAS_CLEAR_DATA(&sess->nas.ue_pco);
|
||||||
|
|
||||||
for (i = 0; i < sess->num_of_pcc_rule; i++)
|
for (i = 0; i < sess->policy.num_of_pcc_rule; i++)
|
||||||
OGS_PCC_RULE_FREE(&sess->pcc_rule[i]);
|
OGS_PCC_RULE_FREE(&sess->policy.pcc_rule[i]);
|
||||||
sess->num_of_pcc_rule = 0;
|
sess->policy.num_of_pcc_rule = 0;
|
||||||
|
|
||||||
if (sess->ipv4) {
|
if (sess->ipv4) {
|
||||||
ogs_hash_set(self.ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, NULL);
|
ogs_hash_set(self.ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, NULL);
|
||||||
|
@ -1584,6 +1584,23 @@ smf_sess_t *smf_sess_find_by_paging_n1n2message_location(
|
||||||
n1n2message_location, strlen(n1n2message_location));
|
n1n2message_location, strlen(n1n2message_location));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_pcc_rule_t *smf_pcc_rule_find_by_id(smf_sess_t *sess, char *pcc_rule_id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_assert(pcc_rule_id);
|
||||||
|
|
||||||
|
for (i = 0; i < sess->policy.num_of_pcc_rule; i++) {
|
||||||
|
ogs_pcc_rule_t *pcc_rule = &sess->policy.pcc_rule[i];
|
||||||
|
if (pcc_rule->id && strcmp(pcc_rule->id, pcc_rule_id) == 0) {
|
||||||
|
return pcc_rule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess)
|
smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess)
|
||||||
{
|
{
|
||||||
smf_bearer_t *qos_flow = NULL;
|
smf_bearer_t *qos_flow = NULL;
|
||||||
|
@ -2140,6 +2157,69 @@ smf_bearer_t *smf_bearer_find_by_pdr_id(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void smf_bearer_tft_update(smf_bearer_t *bearer)
|
||||||
|
{
|
||||||
|
smf_pf_t *pf = NULL;
|
||||||
|
ogs_pfcp_pdr_t *dl_pdr = NULL, *ul_pdr = NULL;
|
||||||
|
|
||||||
|
ogs_assert(bearer);
|
||||||
|
|
||||||
|
dl_pdr = bearer->dl_pdr;
|
||||||
|
ogs_assert(dl_pdr);
|
||||||
|
ul_pdr = bearer->ul_pdr;
|
||||||
|
ogs_assert(ul_pdr);
|
||||||
|
|
||||||
|
dl_pdr->num_of_flow = 0;
|
||||||
|
ul_pdr->num_of_flow = 0;
|
||||||
|
|
||||||
|
ogs_list_for_each(&bearer->pf_list, pf) {
|
||||||
|
if (pf->direction == OGS_FLOW_DOWNLINK_ONLY) {
|
||||||
|
dl_pdr->flow_description[dl_pdr->num_of_flow++] =
|
||||||
|
pf->flow_description;
|
||||||
|
|
||||||
|
} else if (pf->direction == OGS_FLOW_UPLINK_ONLY) {
|
||||||
|
ul_pdr->flow_description[ul_pdr->num_of_flow++] =
|
||||||
|
pf->flow_description;
|
||||||
|
} else {
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
ogs_fatal("Flow Bidirectional is not supported[%d]",
|
||||||
|
pf->direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void smf_bearer_qos_update(smf_bearer_t *bearer)
|
||||||
|
{
|
||||||
|
smf_sess_t *sess = NULL;
|
||||||
|
|
||||||
|
ogs_pfcp_pdr_t *dl_pdr = NULL, *ul_pdr = NULL;
|
||||||
|
ogs_pfcp_qer_t *qer = NULL;
|
||||||
|
|
||||||
|
ogs_assert(bearer);
|
||||||
|
sess = bearer->sess;
|
||||||
|
ogs_assert(sess);
|
||||||
|
|
||||||
|
dl_pdr = bearer->dl_pdr;
|
||||||
|
ogs_assert(dl_pdr);
|
||||||
|
ul_pdr = bearer->ul_pdr;
|
||||||
|
ogs_assert(ul_pdr);
|
||||||
|
|
||||||
|
qer = bearer->qer;
|
||||||
|
if (!qer) {
|
||||||
|
qer = ogs_pfcp_qer_add(&sess->pfcp);
|
||||||
|
ogs_assert(qer);
|
||||||
|
bearer->qer = qer;
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_pfcp_pdr_associate_qer(dl_pdr, qer);
|
||||||
|
ogs_pfcp_pdr_associate_qer(ul_pdr, qer);
|
||||||
|
|
||||||
|
qer->mbr.uplink = bearer->qos.mbr.uplink;
|
||||||
|
qer->mbr.downlink = bearer->qos.mbr.downlink;
|
||||||
|
qer->gbr.uplink = bearer->qos.gbr.uplink;
|
||||||
|
qer->gbr.downlink = bearer->qos.gbr.downlink;
|
||||||
|
}
|
||||||
|
|
||||||
smf_bearer_t *smf_default_bearer_in_sess(smf_sess_t *sess)
|
smf_bearer_t *smf_default_bearer_in_sess(smf_sess_t *sess)
|
||||||
{
|
{
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
|
|
@ -137,7 +137,6 @@ ED3(uint8_t spare:2;,
|
||||||
uint8_t identifier:4;)
|
uint8_t identifier:4;)
|
||||||
|
|
||||||
uint8_t precedence; /* Only used in EPC */
|
uint8_t precedence; /* Only used in EPC */
|
||||||
uint8_t epc_precedence; /* Only used in EPC */
|
|
||||||
|
|
||||||
uint8_t *identifier_node; /* Pool-Node for Identifier */
|
uint8_t *identifier_node; /* Pool-Node for Identifier */
|
||||||
uint8_t *precedence_node; /* Pool-Node for Precedence */
|
uint8_t *precedence_node; /* Pool-Node for Precedence */
|
||||||
|
@ -150,6 +149,10 @@ ED3(uint8_t spare:2;,
|
||||||
|
|
||||||
typedef struct smf_bearer_s {
|
typedef struct smf_bearer_s {
|
||||||
ogs_lnode_t lnode; /**< A node of list_t */
|
ogs_lnode_t lnode; /**< A node of list_t */
|
||||||
|
|
||||||
|
ogs_lnode_t to_update_node;
|
||||||
|
ogs_lnode_t to_delete_node;
|
||||||
|
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
|
|
||||||
ogs_pfcp_pdr_t *dl_pdr;
|
ogs_pfcp_pdr_t *dl_pdr;
|
||||||
|
@ -182,6 +185,9 @@ typedef struct smf_bearer_s {
|
||||||
ogs_list_t pf_list;
|
ogs_list_t pf_list;
|
||||||
ogs_list_t pf_to_add_list;
|
ogs_list_t pf_to_add_list;
|
||||||
|
|
||||||
|
uint8_t num_of_pf_to_delete;
|
||||||
|
uint8_t pf_to_delete[OGS_MAX_NUM_OF_FLOW_IN_NAS];
|
||||||
|
|
||||||
smf_sess_t *sess;
|
smf_sess_t *sess;
|
||||||
} smf_bearer_t;
|
} smf_bearer_t;
|
||||||
|
|
||||||
|
@ -285,8 +291,10 @@ typedef struct smf_sess_s {
|
||||||
ogs_nas_extended_protocol_configuration_options_t ue_pco;
|
ogs_nas_extended_protocol_configuration_options_t ue_pco;
|
||||||
} nas; /* Saved from NAS-5GS */
|
} nas; /* Saved from NAS-5GS */
|
||||||
|
|
||||||
ogs_pcc_rule_t pcc_rule[OGS_MAX_NUM_OF_PCC_RULE]; /* Saved from Gx */
|
struct {
|
||||||
int num_of_pcc_rule;
|
ogs_pcc_rule_t pcc_rule[OGS_MAX_NUM_OF_PCC_RULE];
|
||||||
|
int num_of_pcc_rule;
|
||||||
|
} policy; /* Saved from N7 or Gx */
|
||||||
|
|
||||||
/* Paging */
|
/* Paging */
|
||||||
struct {
|
struct {
|
||||||
|
@ -300,7 +308,8 @@ typedef struct smf_sess_s {
|
||||||
/* State */
|
/* State */
|
||||||
#define SMF_NGAP_STATE_NONE 0
|
#define SMF_NGAP_STATE_NONE 0
|
||||||
#define SMF_NGAP_STATE_DELETE_TRIGGER_UE_REQUESTED 1
|
#define SMF_NGAP_STATE_DELETE_TRIGGER_UE_REQUESTED 1
|
||||||
#define SMF_NGAP_STATE_ERROR_INDICATION_RECEIVED_FROM_5G_AN 2
|
#define SMF_NGAP_STATE_DELETE_TRIGGER_PCF_INITIATED 2
|
||||||
|
#define SMF_NGAP_STATE_ERROR_INDICATION_RECEIVED_FROM_5G_AN 3
|
||||||
struct {
|
struct {
|
||||||
int pdu_session_resource_release;
|
int pdu_session_resource_release;
|
||||||
} ngap_state;
|
} ngap_state;
|
||||||
|
@ -391,6 +400,8 @@ void smf_sess_delete_indirect_data_forwarding(smf_sess_t *sess);
|
||||||
void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess);
|
void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess);
|
||||||
void smf_sess_delete_cp_up_data_forwarding(smf_sess_t *sess);
|
void smf_sess_delete_cp_up_data_forwarding(smf_sess_t *sess);
|
||||||
|
|
||||||
|
ogs_pcc_rule_t *smf_pcc_rule_find_by_id(smf_sess_t *sess, char *pcc_rule_id);
|
||||||
|
|
||||||
smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess);
|
smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess);
|
||||||
smf_bearer_t *smf_qos_flow_find_by_qfi(smf_sess_t *sess, uint8_t qfi);
|
smf_bearer_t *smf_qos_flow_find_by_qfi(smf_sess_t *sess, uint8_t qfi);
|
||||||
smf_bearer_t *smf_qos_flow_find_by_pcc_rule_id(
|
smf_bearer_t *smf_qos_flow_find_by_pcc_rule_id(
|
||||||
|
@ -408,6 +419,9 @@ smf_bearer_t *smf_bearer_find_by_pdr_id(
|
||||||
smf_sess_t *sess, ogs_pfcp_pdr_id_t pdr_id);
|
smf_sess_t *sess, ogs_pfcp_pdr_id_t pdr_id);
|
||||||
smf_bearer_t *smf_default_bearer_in_sess(smf_sess_t *sess);
|
smf_bearer_t *smf_default_bearer_in_sess(smf_sess_t *sess);
|
||||||
|
|
||||||
|
void smf_bearer_tft_update(smf_bearer_t *bearer);
|
||||||
|
void smf_bearer_qos_update(smf_bearer_t *bearer);
|
||||||
|
|
||||||
smf_ue_t *smf_ue_cycle(smf_ue_t *smf_ue);
|
smf_ue_t *smf_ue_cycle(smf_ue_t *smf_ue);
|
||||||
smf_sess_t *smf_sess_cycle(smf_sess_t *sess);
|
smf_sess_t *smf_sess_cycle(smf_sess_t *sess);
|
||||||
smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow);
|
smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow);
|
||||||
|
|
|
@ -242,6 +242,9 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_reject(
|
||||||
pdu_session_establishment_reject =
|
pdu_session_establishment_reject =
|
||||||
&message.gsm.pdu_session_establishment_reject;
|
&message.gsm.pdu_session_establishment_reject;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_assert(gsm_cause);
|
||||||
|
|
||||||
memset(&message, 0, sizeof(message));
|
memset(&message, 0, sizeof(message));
|
||||||
message.gsm.h.extended_protocol_discriminator =
|
message.gsm.h.extended_protocol_discriminator =
|
||||||
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
||||||
|
@ -263,21 +266,33 @@ static void encode_qos_rule_packet_filter(
|
||||||
ogs_assert(qos_rule);
|
ogs_assert(qos_rule);
|
||||||
ogs_assert(qos_flow);
|
ogs_assert(qos_flow);
|
||||||
|
|
||||||
i = 0;
|
if (qos_rule->code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS) {
|
||||||
ogs_list_for_each(&qos_flow->pf_list, pf) {
|
|
||||||
ogs_assert(i < OGS_MAX_NUM_OF_FLOW_IN_NAS);
|
for (i = 0; i < qos_flow->num_of_pf_to_delete; i++) {
|
||||||
qos_rule->pf[i].direction = pf->direction;
|
qos_rule->pf[i].identifier = qos_flow->pf_to_delete[i];
|
||||||
qos_rule->pf[i].identifier = pf->identifier;
|
}
|
||||||
|
qos_rule->num_of_packet_filter = qos_flow->num_of_pf_to_delete;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
ogs_list_for_each_entry(&qos_flow->pf_to_add_list, pf, to_add_node) {
|
||||||
|
ogs_assert(i < OGS_MAX_NUM_OF_FLOW_IN_NAS);
|
||||||
|
qos_rule->pf[i].direction = pf->direction;
|
||||||
|
qos_rule->pf[i].identifier = pf->identifier;
|
||||||
|
|
||||||
|
ogs_pf_content_from_ipfw_rule(
|
||||||
|
pf->direction, &qos_rule->pf[i].content, &pf->ipfw_rule);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
qos_rule->num_of_packet_filter = i;
|
||||||
|
|
||||||
ogs_pf_content_from_ipfw_rule(
|
|
||||||
pf->direction, &qos_rule->pf[i].content, &pf->ipfw_rule);
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
qos_rule->num_of_packet_filter = i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_pkbuf_t *gsm_build_qos_flow_modification_command(
|
ogs_pkbuf_t *gsm_build_qos_flow_modification_command(
|
||||||
smf_bearer_t *qos_flow, uint8_t pti)
|
smf_bearer_t *qos_flow, uint8_t pti,
|
||||||
|
uint8_t qos_rule_code, uint8_t qos_flow_description_code)
|
||||||
{
|
{
|
||||||
ogs_pkbuf_t *pkbuf = NULL;
|
ogs_pkbuf_t *pkbuf = NULL;
|
||||||
smf_sess_t *sess = NULL;
|
smf_sess_t *sess = NULL;
|
||||||
|
@ -317,97 +332,145 @@ ogs_pkbuf_t *gsm_build_qos_flow_modification_command(
|
||||||
message.gsm.h.message_type = OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND;
|
message.gsm.h.message_type = OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND;
|
||||||
|
|
||||||
/* QoS rule */
|
/* QoS rule */
|
||||||
memset(qos_rule, 0, sizeof(qos_rule));
|
if (qos_rule_code) {
|
||||||
qos_rule[0].identifier = qos_flow->qfi; /* Use QFI in Open5GS */
|
memset(qos_rule, 0, sizeof(qos_rule));
|
||||||
qos_rule[0].code = OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE;
|
qos_rule[0].identifier = qos_flow->qfi; /* Use QFI in Open5GS */
|
||||||
|
qos_rule[0].code = qos_rule_code;
|
||||||
|
|
||||||
encode_qos_rule_packet_filter(&qos_rule[0], qos_flow);
|
if (qos_rule_code != OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE &&
|
||||||
|
qos_rule_code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS)
|
||||||
|
encode_qos_rule_packet_filter(&qos_rule[0], qos_flow);
|
||||||
|
|
||||||
ogs_assert(dl_pdr->precedence > 0 && dl_pdr->precedence < 255);
|
if (qos_rule_code != OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE &&
|
||||||
qos_rule[0].precedence = dl_pdr->precedence; /* Use PCC Rule Precedence */
|
qos_rule_code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS &&
|
||||||
qos_rule[0].flow.segregation = 0;
|
qos_rule_code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) {
|
||||||
qos_rule[0].flow.identifier = qos_flow->qfi;
|
ogs_assert(dl_pdr->precedence > 0 && dl_pdr->precedence < 255);
|
||||||
|
/* Use PCC Rule Precedence */
|
||||||
|
qos_rule[0].precedence = dl_pdr->precedence;
|
||||||
|
|
||||||
pdu_session_modification_command->presencemask |=
|
qos_rule[0].flow.segregation = 0;
|
||||||
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_RULES_PRESENT;
|
qos_rule[0].flow.identifier = qos_flow->qfi;
|
||||||
rv = ogs_nas_build_qos_rules(authorized_qos_rules, qos_rule, 1);
|
}
|
||||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
|
||||||
ogs_expect_or_return_val(authorized_qos_rules->length, NULL);
|
rv = ogs_nas_build_qos_rules(authorized_qos_rules, qos_rule, 1);
|
||||||
|
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||||
|
ogs_expect_or_return_val(authorized_qos_rules->length, NULL);
|
||||||
|
|
||||||
|
pdu_session_modification_command->presencemask |=
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_RULES_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
/* QoS flow descriptions */
|
/* QoS flow descriptions */
|
||||||
memset(&qos_flow_description, 0, sizeof(qos_flow_description));
|
if (qos_flow_description_code) {
|
||||||
qos_flow_description[0].identifier = qos_flow->qfi;
|
memset(&qos_flow_description, 0, sizeof(qos_flow_description));
|
||||||
qos_flow_description[0].code = OGS_NAS_CREATE_NEW_QOS_FLOW_DESCRIPTION;
|
qos_flow_description[0].identifier = qos_flow->qfi;
|
||||||
qos_flow_description[0].E_bit = 1;
|
qos_flow_description[0].code = qos_flow_description_code;
|
||||||
|
|
||||||
num_of_param = 0;
|
num_of_param = 0;
|
||||||
|
|
||||||
qos_flow_description[0].param[num_of_param].identifier =
|
if (qos_flow_description_code != OGS_NAS_DELETE_NEW_QOS_FLOW_DESCRIPTION) {
|
||||||
OGS_NAX_QOS_FLOW_PARAMETER_ID_5QI;
|
qos_flow_description[0].E_bit = 1;
|
||||||
qos_flow_description[0].param[num_of_param].len =
|
|
||||||
sizeof(qos_flow_description[0].param[num_of_param].qos_index);
|
|
||||||
qos_flow_description[0].param[num_of_param].qos_index = qos_flow->qos.index;
|
|
||||||
num_of_param++;
|
|
||||||
|
|
||||||
if (qos_flow->qos.gbr.uplink) {
|
qos_flow_description[0].param[num_of_param].identifier =
|
||||||
qos_flow_description[0].param[num_of_param].identifier =
|
OGS_NAX_QOS_FLOW_PARAMETER_ID_5QI;
|
||||||
OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_UPLINK;
|
qos_flow_description[0].param[num_of_param].len =
|
||||||
qos_flow_description[0].param[num_of_param].len =
|
sizeof(qos_flow_description[0].param[num_of_param].qos_index);
|
||||||
sizeof(qos_flow_description[0].param[num_of_param].br);
|
qos_flow_description[0].param[num_of_param].qos_index =
|
||||||
ogs_nas_bitrate_from_uint64(
|
qos_flow->qos.index;
|
||||||
&qos_flow_description[0].param[num_of_param].br,
|
num_of_param++;
|
||||||
qos_flow->qos.gbr.uplink);
|
|
||||||
num_of_param++;
|
if (qos_flow->qos.gbr.uplink) {
|
||||||
|
qos_flow_description[0].param[num_of_param].identifier =
|
||||||
|
OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_UPLINK;
|
||||||
|
qos_flow_description[0].param[num_of_param].len =
|
||||||
|
sizeof(qos_flow_description[0].param[num_of_param].br);
|
||||||
|
ogs_nas_bitrate_from_uint64(
|
||||||
|
&qos_flow_description[0].param[num_of_param].br,
|
||||||
|
qos_flow->qos.gbr.uplink);
|
||||||
|
num_of_param++;
|
||||||
|
}
|
||||||
|
if (qos_flow->qos.gbr.downlink) {
|
||||||
|
qos_flow_description[0].param[num_of_param].identifier =
|
||||||
|
OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_DOWNLINK;
|
||||||
|
qos_flow_description[0].param[num_of_param].len =
|
||||||
|
sizeof(qos_flow_description[0].param[num_of_param].br);
|
||||||
|
ogs_nas_bitrate_from_uint64(
|
||||||
|
&qos_flow_description[0].param[num_of_param].br,
|
||||||
|
qos_flow->qos.gbr.downlink);
|
||||||
|
num_of_param++;
|
||||||
|
}
|
||||||
|
if (qos_flow->qos.mbr.uplink) {
|
||||||
|
qos_flow_description[0].param[num_of_param].identifier =
|
||||||
|
OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_UPLINK;
|
||||||
|
qos_flow_description[0].param[num_of_param].len =
|
||||||
|
sizeof(qos_flow_description[0].param[num_of_param].br);
|
||||||
|
ogs_nas_bitrate_from_uint64(
|
||||||
|
&qos_flow_description[0].param[num_of_param].br,
|
||||||
|
qos_flow->qos.mbr.uplink);
|
||||||
|
num_of_param++;
|
||||||
|
}
|
||||||
|
if (qos_flow->qos.mbr.downlink) {
|
||||||
|
qos_flow_description[0].param[num_of_param].identifier =
|
||||||
|
OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_DOWNLINK;
|
||||||
|
qos_flow_description[0].param[num_of_param].len =
|
||||||
|
sizeof(qos_flow_description[0].param[num_of_param].br);
|
||||||
|
ogs_nas_bitrate_from_uint64(
|
||||||
|
&qos_flow_description[0].param[num_of_param].br,
|
||||||
|
qos_flow->qos.mbr.downlink);
|
||||||
|
num_of_param++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qos_flow_description[0].num_of_parameter = num_of_param;
|
||||||
|
|
||||||
|
rv = ogs_nas_build_qos_flow_descriptions(
|
||||||
|
authorized_qos_flow_descriptions, qos_flow_description, 1);
|
||||||
|
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||||
|
ogs_expect_or_return_val(
|
||||||
|
authorized_qos_flow_descriptions->length, NULL);
|
||||||
|
|
||||||
|
pdu_session_modification_command->presencemask |=
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT;
|
||||||
}
|
}
|
||||||
if (qos_flow->qos.gbr.downlink) {
|
|
||||||
qos_flow_description[0].param[num_of_param].identifier =
|
|
||||||
OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_DOWNLINK;
|
|
||||||
qos_flow_description[0].param[num_of_param].len =
|
|
||||||
sizeof(qos_flow_description[0].param[num_of_param].br);
|
|
||||||
ogs_nas_bitrate_from_uint64(
|
|
||||||
&qos_flow_description[0].param[num_of_param].br,
|
|
||||||
qos_flow->qos.gbr.downlink);
|
|
||||||
num_of_param++;
|
|
||||||
}
|
|
||||||
if (qos_flow->qos.mbr.uplink) {
|
|
||||||
qos_flow_description[0].param[num_of_param].identifier =
|
|
||||||
OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_UPLINK;
|
|
||||||
qos_flow_description[0].param[num_of_param].len =
|
|
||||||
sizeof(qos_flow_description[0].param[num_of_param].br);
|
|
||||||
ogs_nas_bitrate_from_uint64(
|
|
||||||
&qos_flow_description[0].param[num_of_param].br,
|
|
||||||
qos_flow->qos.mbr.uplink);
|
|
||||||
num_of_param++;
|
|
||||||
}
|
|
||||||
if (qos_flow->qos.mbr.downlink) {
|
|
||||||
qos_flow_description[0].param[num_of_param].identifier =
|
|
||||||
OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_DOWNLINK;
|
|
||||||
qos_flow_description[0].param[num_of_param].len =
|
|
||||||
sizeof(qos_flow_description[0].param[num_of_param].br);
|
|
||||||
ogs_nas_bitrate_from_uint64(
|
|
||||||
&qos_flow_description[0].param[num_of_param].br,
|
|
||||||
qos_flow->qos.mbr.downlink);
|
|
||||||
num_of_param++;
|
|
||||||
}
|
|
||||||
|
|
||||||
qos_flow_description[0].num_of_parameter = num_of_param;
|
|
||||||
|
|
||||||
pdu_session_modification_command->presencemask |=
|
|
||||||
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT;
|
|
||||||
rv = ogs_nas_build_qos_flow_descriptions(
|
|
||||||
authorized_qos_flow_descriptions, qos_flow_description, 1);
|
|
||||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
|
||||||
ogs_expect_or_return_val(authorized_qos_flow_descriptions->length, NULL);
|
|
||||||
|
|
||||||
pkbuf = ogs_nas_5gs_plain_encode(&message);
|
pkbuf = ogs_nas_5gs_plain_encode(&message);
|
||||||
ogs_assert(pkbuf);
|
ogs_assert(pkbuf);
|
||||||
|
|
||||||
ogs_free(authorized_qos_rules->buffer);
|
if (pdu_session_modification_command->presencemask &
|
||||||
ogs_free(authorized_qos_flow_descriptions->buffer);
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_RULES_PRESENT) {
|
||||||
|
ogs_free(authorized_qos_rules->buffer);
|
||||||
|
}
|
||||||
|
if (pdu_session_modification_command->presencemask &
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT) {
|
||||||
|
ogs_free(authorized_qos_flow_descriptions->buffer);
|
||||||
|
}
|
||||||
|
|
||||||
return pkbuf;
|
return pkbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_pkbuf_t *gsm_build_pdu_session_modification_reject(
|
||||||
|
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause)
|
||||||
|
{
|
||||||
|
ogs_nas_5gs_message_t message;
|
||||||
|
ogs_nas_5gs_pdu_session_modification_reject_t *
|
||||||
|
pdu_session_modification_reject =
|
||||||
|
&message.gsm.pdu_session_modification_reject;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_assert(gsm_cause);
|
||||||
|
|
||||||
|
memset(&message, 0, sizeof(message));
|
||||||
|
message.gsm.h.extended_protocol_discriminator =
|
||||||
|
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
||||||
|
message.gsm.h.pdu_session_identity = sess->psi;
|
||||||
|
message.gsm.h.procedure_transaction_identity = sess->pti;
|
||||||
|
message.gsm.h.message_type = OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT;
|
||||||
|
|
||||||
|
pdu_session_modification_reject->gsm_cause = gsm_cause;
|
||||||
|
|
||||||
|
return ogs_nas_5gs_plain_encode(&message);
|
||||||
|
}
|
||||||
|
|
||||||
ogs_pkbuf_t *gsm_build_pdu_session_release_command(
|
ogs_pkbuf_t *gsm_build_pdu_session_release_command(
|
||||||
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause)
|
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause)
|
||||||
{
|
{
|
||||||
|
@ -415,6 +478,9 @@ ogs_pkbuf_t *gsm_build_pdu_session_release_command(
|
||||||
ogs_nas_5gs_pdu_session_release_command_t *pdu_session_release_command =
|
ogs_nas_5gs_pdu_session_release_command_t *pdu_session_release_command =
|
||||||
&message.gsm.pdu_session_release_command;
|
&message.gsm.pdu_session_release_command;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_assert(gsm_cause);
|
||||||
|
|
||||||
memset(&message, 0, sizeof(message));
|
memset(&message, 0, sizeof(message));
|
||||||
message.gsm.h.extended_protocol_discriminator =
|
message.gsm.h.extended_protocol_discriminator =
|
||||||
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
||||||
|
@ -434,6 +500,9 @@ ogs_pkbuf_t *gsm_build_pdu_session_release_reject(
|
||||||
ogs_nas_5gs_pdu_session_release_reject_t *
|
ogs_nas_5gs_pdu_session_release_reject_t *
|
||||||
pdu_session_release_reject = &message.gsm.pdu_session_release_reject;
|
pdu_session_release_reject = &message.gsm.pdu_session_release_reject;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
ogs_assert(gsm_cause);
|
||||||
|
|
||||||
memset(&message, 0, sizeof(message));
|
memset(&message, 0, sizeof(message));
|
||||||
message.gsm.h.extended_protocol_discriminator =
|
message.gsm.h.extended_protocol_discriminator =
|
||||||
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM;
|
||||||
|
|
|
@ -31,7 +31,10 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_reject(
|
||||||
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause);
|
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause);
|
||||||
|
|
||||||
ogs_pkbuf_t *gsm_build_qos_flow_modification_command(
|
ogs_pkbuf_t *gsm_build_qos_flow_modification_command(
|
||||||
smf_bearer_t *qos_flow, uint8_t pti);
|
smf_bearer_t *qos_flow, uint8_t pti,
|
||||||
|
uint8_t qos_rule_code, uint8_t qos_flow_description_code);
|
||||||
|
ogs_pkbuf_t *gsm_build_pdu_session_modification_reject(
|
||||||
|
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause);
|
||||||
|
|
||||||
ogs_pkbuf_t *gsm_build_pdu_session_release_command(
|
ogs_pkbuf_t *gsm_build_pdu_session_release_command(
|
||||||
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause);
|
smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause);
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
#include "sbi-path.h"
|
#include "sbi-path.h"
|
||||||
#include "pfcp-path.h"
|
#include "pfcp-path.h"
|
||||||
|
|
||||||
|
#include "ipfw/ipfw2.h"
|
||||||
|
|
||||||
#undef OGS_LOG_DOMAIN
|
#undef OGS_LOG_DOMAIN
|
||||||
#define OGS_LOG_DOMAIN __gsm_log_domain
|
#define OGS_LOG_DOMAIN __gsm_log_domain
|
||||||
|
|
||||||
|
@ -71,3 +73,454 @@ int gsm_handle_pdu_session_establishment_request(
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int reconfigure_packet_filter(
|
||||||
|
smf_pf_t *pf, ogs_nas_qos_rule_t *qos_rule, int i)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
ogs_assert(pf);
|
||||||
|
ogs_assert(qos_rule);
|
||||||
|
|
||||||
|
memset(&pf->ipfw_rule, 0, sizeof(ogs_ipfw_rule_t));
|
||||||
|
pf->direction = qos_rule->pf[i].direction;
|
||||||
|
for (j = 0; j < qos_rule->pf[i].content.num_of_component; j++) {
|
||||||
|
switch(qos_rule->pf[i].content.component[j].type) {
|
||||||
|
case OGS_PACKET_FILTER_PROTOCOL_IDENTIFIER_NEXT_HEADER_TYPE:
|
||||||
|
pf->ipfw_rule.proto = qos_rule->pf[i].content.component[j].proto;
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE:
|
||||||
|
pf->ipfw_rule.ipv4_dst = 1;
|
||||||
|
pf->ipfw_rule.ip.dst.addr[0] =
|
||||||
|
qos_rule->pf[i].content.component[j].ipv4.addr;
|
||||||
|
pf->ipfw_rule.ip.dst.mask[0] =
|
||||||
|
qos_rule->pf[i].content.component[j].ipv4.mask;
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE:
|
||||||
|
pf->ipfw_rule.ipv4_src = 1;
|
||||||
|
pf->ipfw_rule.ip.src.addr[0] =
|
||||||
|
qos_rule->pf[i].content.component[j].ipv4.addr;
|
||||||
|
pf->ipfw_rule.ip.src.mask[0] =
|
||||||
|
qos_rule->pf[i].content.component[j].ipv4.mask;
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE:
|
||||||
|
pf->ipfw_rule.ipv6_dst = 1;
|
||||||
|
memcpy(pf->ipfw_rule.ip.dst.addr,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6_mask.addr,
|
||||||
|
sizeof(pf->ipfw_rule.ip.dst.addr));
|
||||||
|
memcpy(pf->ipfw_rule.ip.dst.mask,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6_mask.mask,
|
||||||
|
sizeof(pf->ipfw_rule.ip.dst.mask));
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE:
|
||||||
|
pf->ipfw_rule.ipv6_dst = 1;
|
||||||
|
memcpy(pf->ipfw_rule.ip.dst.addr,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6_mask.addr,
|
||||||
|
sizeof(pf->ipfw_rule.ip.dst.addr));
|
||||||
|
n2mask((struct in6_addr *)pf->ipfw_rule.ip.dst.mask,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6.prefixlen);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_TYPE:
|
||||||
|
pf->ipfw_rule.ipv6_src = 1;
|
||||||
|
memcpy(pf->ipfw_rule.ip.src.addr,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6_mask.addr,
|
||||||
|
sizeof(pf->ipfw_rule.ip.src.addr));
|
||||||
|
memcpy(pf->ipfw_rule.ip.src.mask,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6_mask.mask,
|
||||||
|
sizeof(pf->ipfw_rule.ip.src.mask));
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE:
|
||||||
|
pf->ipfw_rule.ipv6_src = 1;
|
||||||
|
memcpy(pf->ipfw_rule.ip.src.addr,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6_mask.addr,
|
||||||
|
sizeof(pf->ipfw_rule.ip.src.addr));
|
||||||
|
n2mask((struct in6_addr *)pf->ipfw_rule.ip.src.mask,
|
||||||
|
qos_rule->pf[i].content.component[j].ipv6.prefixlen);
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_SINGLE_LOCAL_PORT_TYPE:
|
||||||
|
pf->ipfw_rule.port.src.low = pf->ipfw_rule.port.src.high =
|
||||||
|
qos_rule->pf[i].content.component[j].port.low;
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_SINGLE_REMOTE_PORT_TYPE:
|
||||||
|
pf->ipfw_rule.port.dst.low = pf->ipfw_rule.port.dst.high =
|
||||||
|
qos_rule->pf[i].content.component[j].port.low;
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE:
|
||||||
|
pf->ipfw_rule.port.src.low =
|
||||||
|
qos_rule->pf[i].content.component[j].port.low;
|
||||||
|
pf->ipfw_rule.port.src.high =
|
||||||
|
qos_rule->pf[i].content.component[j].port.high;
|
||||||
|
break;
|
||||||
|
case OGS_PACKET_FILTER_REMOTE_PORT_RANGE_TYPE:
|
||||||
|
pf->ipfw_rule.port.dst.low =
|
||||||
|
qos_rule->pf[i].content.component[j].port.low;
|
||||||
|
pf->ipfw_rule.port.dst.high =
|
||||||
|
qos_rule->pf[i].content.component[j].port.high;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ogs_error("Unknown Packet Filter Type(%d)",
|
||||||
|
qos_rule->pf[i].content.component[j].type);
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define qos_flow_find_or_add(list, node, member) \
|
||||||
|
do { \
|
||||||
|
smf_bearer_t *iter = NULL; \
|
||||||
|
bool found = false; \
|
||||||
|
\
|
||||||
|
ogs_assert(node); \
|
||||||
|
\
|
||||||
|
ogs_list_for_each_entry(list, iter, member) { \
|
||||||
|
if (iter->qfi == node->qfi) { \
|
||||||
|
found = true; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
if (found == false) { \
|
||||||
|
ogs_list_add(list, &node->member); \
|
||||||
|
} \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
int gsm_handle_pdu_session_modification_request(
|
||||||
|
smf_sess_t *sess, ogs_sbi_stream_t *stream,
|
||||||
|
ogs_nas_5gs_pdu_session_modification_request_t *
|
||||||
|
pdu_session_modification_request)
|
||||||
|
{
|
||||||
|
char *strerror = NULL;
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
uint64_t pfcp_flags = 0;
|
||||||
|
ogs_list_t update_list, delete_list;
|
||||||
|
smf_bearer_t *qos_flow = NULL;
|
||||||
|
smf_pf_t *pf = NULL;
|
||||||
|
|
||||||
|
ogs_nas_qos_rule_t qos_rule[OGS_NAS_MAX_NUM_OF_QOS_RULE];
|
||||||
|
ogs_nas_qos_flow_description_t
|
||||||
|
qos_flow_description[OGS_NAS_MAX_NUM_OF_QOS_FLOW_DESCRIPTION];
|
||||||
|
|
||||||
|
ogs_nas_qos_rules_t *requested_qos_rules =
|
||||||
|
&pdu_session_modification_request->requested_qos_rules;
|
||||||
|
ogs_nas_qos_flow_descriptions_t *requested_qos_flow_descriptions =
|
||||||
|
&pdu_session_modification_request->requested_qos_flow_descriptions;
|
||||||
|
|
||||||
|
smf_ue_t *smf_ue = NULL;
|
||||||
|
ogs_pkbuf_t *n1smbuf = NULL;
|
||||||
|
|
||||||
|
ogs_assert(sess);
|
||||||
|
smf_ue = sess->smf_ue;
|
||||||
|
ogs_assert(smf_ue);
|
||||||
|
ogs_assert(stream);
|
||||||
|
ogs_assert(pdu_session_modification_request);
|
||||||
|
|
||||||
|
ogs_list_init(&update_list);
|
||||||
|
ogs_list_init(&delete_list);
|
||||||
|
|
||||||
|
if (pdu_session_modification_request->presencemask &
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CAUSE_PRESENT) {
|
||||||
|
/* Nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdu_session_modification_request->presencemask &
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_QOS_RULES_PRESENT) {
|
||||||
|
int num_of_rule = 0;
|
||||||
|
|
||||||
|
num_of_rule = ogs_nas_parse_qos_rules(qos_rule, requested_qos_rules);
|
||||||
|
ogs_assert(num_of_rule > 0);
|
||||||
|
|
||||||
|
for (i = 0; i < num_of_rule; i++) {
|
||||||
|
qos_flow = smf_qos_flow_find_by_qfi(
|
||||||
|
sess, qos_rule[i].identifier);
|
||||||
|
if (!qos_flow) {
|
||||||
|
ogs_error("No Qos Flow");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_list_init(&qos_flow->pf_to_add_list);
|
||||||
|
|
||||||
|
if (qos_rule[i].code == OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE) {
|
||||||
|
smf_pf_remove_all(qos_flow);
|
||||||
|
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_REMOVE;
|
||||||
|
qos_flow_find_or_add(&delete_list, qos_flow, to_delete_node);
|
||||||
|
} else if (qos_rule[i].code ==
|
||||||
|
OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS) {
|
||||||
|
for (j = 0; j < qos_rule[i].num_of_packet_filter &&
|
||||||
|
j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) {
|
||||||
|
|
||||||
|
pf = smf_pf_find_by_id(
|
||||||
|
qos_flow, qos_rule[i].pf[j].identifier+1);
|
||||||
|
if (pf) {
|
||||||
|
ogs_assert(
|
||||||
|
reconfigure_packet_filter(pf, &qos_rule[i], i) > 0);
|
||||||
|
/*
|
||||||
|
* Refer to lib/ipfw/ogs-ipfw.h
|
||||||
|
* Issue #338
|
||||||
|
*
|
||||||
|
* <DOWNLINK>
|
||||||
|
* TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
* -->
|
||||||
|
* RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT>
|
||||||
|
*
|
||||||
|
* <UPLINK>
|
||||||
|
* TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
* -->
|
||||||
|
* RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
*/
|
||||||
|
if (pf->direction == OGS_FLOW_DOWNLINK_ONLY)
|
||||||
|
ogs_ipfw_rule_swap(&pf->ipfw_rule);
|
||||||
|
|
||||||
|
if (pf->flow_description)
|
||||||
|
ogs_free(pf->flow_description);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue #338
|
||||||
|
*
|
||||||
|
* <DOWNLINK>
|
||||||
|
* RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT>
|
||||||
|
* -->
|
||||||
|
* GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
* PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
*
|
||||||
|
* <UPLINK>
|
||||||
|
* RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
* -->
|
||||||
|
* GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
* PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
*/
|
||||||
|
if (pf->direction == OGS_FLOW_UPLINK_ONLY) {
|
||||||
|
ogs_ipfw_rule_t tmp;
|
||||||
|
ogs_ipfw_copy_and_swap(&tmp, &pf->ipfw_rule);
|
||||||
|
pf->flow_description =
|
||||||
|
ogs_ipfw_encode_flow_description(&tmp);
|
||||||
|
ogs_assert(pf->flow_description);
|
||||||
|
} else {
|
||||||
|
pf->flow_description =
|
||||||
|
ogs_ipfw_encode_flow_description(
|
||||||
|
&pf->ipfw_rule);
|
||||||
|
ogs_assert(pf->flow_description);
|
||||||
|
}
|
||||||
|
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_TFT_REPLACE;
|
||||||
|
qos_flow_find_or_add(
|
||||||
|
&update_list, qos_flow, to_update_node);
|
||||||
|
|
||||||
|
ogs_list_add(
|
||||||
|
&qos_flow->pf_to_add_list, &pf->to_add_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (qos_rule[i].code ==
|
||||||
|
OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE ||
|
||||||
|
qos_rule[i].code ==
|
||||||
|
OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) {
|
||||||
|
|
||||||
|
if (qos_rule[i].code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE)
|
||||||
|
smf_pf_remove_all(qos_flow);
|
||||||
|
|
||||||
|
for (j = 0; j < qos_rule[i].num_of_packet_filter &&
|
||||||
|
j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) {
|
||||||
|
|
||||||
|
pf = smf_pf_find_by_id(
|
||||||
|
qos_flow, qos_rule[i].pf[j].identifier+1);
|
||||||
|
if (!pf)
|
||||||
|
pf = smf_pf_add(qos_flow);
|
||||||
|
ogs_assert(pf);
|
||||||
|
|
||||||
|
ogs_assert(
|
||||||
|
reconfigure_packet_filter(pf, &qos_rule[i], i) > 0);
|
||||||
|
/*
|
||||||
|
* Refer to lib/ipfw/ogs-ipfw.h
|
||||||
|
* Issue #338
|
||||||
|
*
|
||||||
|
* <DOWNLINK>
|
||||||
|
* TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
* -->
|
||||||
|
* RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT>
|
||||||
|
*
|
||||||
|
* <UPLINK>
|
||||||
|
* TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
* -->
|
||||||
|
* RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
*/
|
||||||
|
if (pf->direction == OGS_FLOW_DOWNLINK_ONLY)
|
||||||
|
ogs_ipfw_rule_swap(&pf->ipfw_rule);
|
||||||
|
|
||||||
|
if (pf->flow_description)
|
||||||
|
ogs_free(pf->flow_description);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue #338
|
||||||
|
*
|
||||||
|
* <DOWNLINK>
|
||||||
|
* RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT>
|
||||||
|
* -->
|
||||||
|
* GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
* PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
*
|
||||||
|
* <UPLINK>
|
||||||
|
* RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT>
|
||||||
|
* -->
|
||||||
|
* GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
* PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT>
|
||||||
|
*/
|
||||||
|
if (pf->direction == OGS_FLOW_UPLINK_ONLY) {
|
||||||
|
ogs_ipfw_rule_t tmp;
|
||||||
|
ogs_ipfw_copy_and_swap(&tmp, &pf->ipfw_rule);
|
||||||
|
pf->flow_description =
|
||||||
|
ogs_ipfw_encode_flow_description(&tmp);
|
||||||
|
ogs_assert(pf->flow_description);
|
||||||
|
} else {
|
||||||
|
pf->flow_description =
|
||||||
|
ogs_ipfw_encode_flow_description(&pf->ipfw_rule);
|
||||||
|
ogs_assert(pf->flow_description);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qos_rule[i].code ==
|
||||||
|
OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE) {
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_TFT_NEW;
|
||||||
|
} else if (qos_rule[i].code ==
|
||||||
|
OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) {
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_TFT_ADD;
|
||||||
|
} else
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
|
||||||
|
qos_flow_find_or_add(
|
||||||
|
&update_list, qos_flow, to_update_node);
|
||||||
|
|
||||||
|
ogs_list_add(
|
||||||
|
&qos_flow->pf_to_add_list, &pf->to_add_node);
|
||||||
|
}
|
||||||
|
} else if (qos_rule[i].code ==
|
||||||
|
OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS) {
|
||||||
|
|
||||||
|
qos_flow->num_of_pf_to_delete = 0;
|
||||||
|
for (j = 0; j < qos_rule[i].num_of_packet_filter &&
|
||||||
|
j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) {
|
||||||
|
|
||||||
|
pf = smf_pf_find_by_id(
|
||||||
|
qos_flow, qos_rule[i].pf[j].identifier+1);
|
||||||
|
if (pf) {
|
||||||
|
qos_flow->pf_to_delete
|
||||||
|
[qos_flow->num_of_pf_to_delete++] =
|
||||||
|
qos_rule[i].pf[j].identifier;
|
||||||
|
smf_pf_remove(pf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ogs_list_count(&qos_flow->pf_list)) {
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_TFT_DELETE;
|
||||||
|
qos_flow_find_or_add(
|
||||||
|
&update_list, qos_flow, to_update_node);
|
||||||
|
} else {
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_REMOVE;
|
||||||
|
qos_flow_find_or_add(
|
||||||
|
&delete_list, qos_flow, to_delete_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdu_session_modification_request->presencemask &
|
||||||
|
OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_QOS_FLOW_DESCRIPTIONS_PRESENT) {
|
||||||
|
int num_of_description = 0;
|
||||||
|
|
||||||
|
num_of_description = ogs_nas_parse_qos_flow_descriptions(
|
||||||
|
qos_flow_description, requested_qos_flow_descriptions);
|
||||||
|
ogs_assert(num_of_description > 0);
|
||||||
|
|
||||||
|
for (i = 0; i < num_of_description; i++) {
|
||||||
|
qos_flow = smf_qos_flow_find_by_qfi(
|
||||||
|
sess, qos_flow_description[i].identifier);
|
||||||
|
if (!qos_flow) {
|
||||||
|
ogs_error("No Qos Flow");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < qos_flow_description[i].num_of_parameter; j++) {
|
||||||
|
switch(qos_flow_description[i].param[j].identifier) {
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_5QI:
|
||||||
|
/* Nothing */
|
||||||
|
break;
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_UPLINK:
|
||||||
|
qos_flow->qos.gbr.uplink = ogs_nas_bitrate_to_uint64(
|
||||||
|
&qos_flow_description[i].param[j].br);
|
||||||
|
break;
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_DOWNLINK:
|
||||||
|
qos_flow->qos.gbr.downlink = ogs_nas_bitrate_to_uint64(
|
||||||
|
&qos_flow_description[i].param[j].br);
|
||||||
|
break;
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_UPLINK:
|
||||||
|
qos_flow->qos.mbr.uplink = ogs_nas_bitrate_to_uint64(
|
||||||
|
&qos_flow_description[i].param[j].br);
|
||||||
|
break;
|
||||||
|
case OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_DOWNLINK:
|
||||||
|
qos_flow->qos.mbr.downlink = ogs_nas_bitrate_to_uint64(
|
||||||
|
&qos_flow_description[i].param[j].br);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ogs_fatal("Unknown qos_flow parameter identifier [%d]",
|
||||||
|
qos_flow_description[i].param[i].identifier);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pfcp_flags |= OGS_PFCP_MODIFY_QOS_MODIFY;
|
||||||
|
qos_flow_find_or_add(&update_list, qos_flow, to_update_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ogs_list_count(&update_list) + ogs_list_count(&delete_list)) != 1) {
|
||||||
|
strerror = ogs_msprintf("[%s:%d] Invalid modification request "
|
||||||
|
"[update:%d,delete:%d]", smf_ue->supi, sess->psi,
|
||||||
|
ogs_list_count(&update_list), ogs_list_count(&delete_list));
|
||||||
|
ogs_assert(strerror);
|
||||||
|
|
||||||
|
ogs_error("%s", strerror);
|
||||||
|
n1smbuf = gsm_build_pdu_session_modification_reject(sess,
|
||||||
|
OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION);
|
||||||
|
ogs_assert(n1smbuf);
|
||||||
|
|
||||||
|
smf_sbi_send_sm_context_update_error(stream,
|
||||||
|
OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
||||||
|
strerror, smf_ue->supi, n1smbuf, NULL);
|
||||||
|
ogs_free(strerror);
|
||||||
|
|
||||||
|
return OGS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_assert(qos_flow);
|
||||||
|
|
||||||
|
if (pfcp_flags & OGS_PFCP_MODIFY_REMOVE) {
|
||||||
|
|
||||||
|
ogs_assert(OGS_OK ==
|
||||||
|
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||||
|
qos_flow, stream,
|
||||||
|
OGS_PFCP_MODIFY_UE_REQUESTED|pfcp_flags));
|
||||||
|
|
||||||
|
} else if (pfcp_flags &
|
||||||
|
(OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD|
|
||||||
|
OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE|
|
||||||
|
OGS_PFCP_MODIFY_QOS_MODIFY)) {
|
||||||
|
|
||||||
|
if (pfcp_flags &
|
||||||
|
(OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD|
|
||||||
|
OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE))
|
||||||
|
smf_bearer_tft_update(qos_flow);
|
||||||
|
|
||||||
|
if (pfcp_flags & OGS_PFCP_MODIFY_QOS_MODIFY)
|
||||||
|
smf_bearer_qos_update(qos_flow);
|
||||||
|
|
||||||
|
ogs_assert(OGS_OK ==
|
||||||
|
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||||
|
qos_flow, stream, OGS_PFCP_MODIFY_UE_REQUESTED|pfcp_flags));
|
||||||
|
} else {
|
||||||
|
ogs_fatal("Unknown PFCP-Flags : [0x%llx]", (long long)pfcp_flags);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -31,6 +31,11 @@ int gsm_handle_pdu_session_establishment_request(
|
||||||
ogs_nas_5gs_pdu_session_establishment_request_t *
|
ogs_nas_5gs_pdu_session_establishment_request_t *
|
||||||
pdu_session_establishment_request);
|
pdu_session_establishment_request);
|
||||||
|
|
||||||
|
int gsm_handle_pdu_session_modification_request(
|
||||||
|
smf_sess_t *sess, ogs_sbi_stream_t *stream,
|
||||||
|
ogs_nas_5gs_pdu_session_modification_request_t *
|
||||||
|
pdu_session_modification_request);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -155,13 +155,12 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
||||||
|
|
||||||
CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL)
|
CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL)
|
||||||
stream = e->sbi.data;
|
stream = e->sbi.data;
|
||||||
ogs_assert(stream);
|
|
||||||
|
|
||||||
state = e->sbi.state;
|
state = e->sbi.state;
|
||||||
|
|
||||||
SWITCH(sbi_message->h.resource.component[0])
|
SWITCH(sbi_message->h.resource.component[0])
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_SM_POLICIES)
|
CASE(OGS_SBI_RESOURCE_NAME_SM_POLICIES)
|
||||||
if (!sbi_message->h.resource.component[1]) {
|
if (!sbi_message->h.resource.component[1]) {
|
||||||
|
ogs_assert(stream);
|
||||||
if (sbi_message->res_status !=
|
if (sbi_message->res_status !=
|
||||||
OGS_SBI_HTTP_STATUS_CREATED) {
|
OGS_SBI_HTTP_STATUS_CREATED) {
|
||||||
strerror = ogs_msprintf(
|
strerror = ogs_msprintf(
|
||||||
|
@ -193,10 +192,11 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
||||||
ogs_assert(strerror);
|
ogs_assert(strerror);
|
||||||
|
|
||||||
ogs_error("%s", strerror);
|
ogs_error("%s", strerror);
|
||||||
ogs_assert(true ==
|
if (stream)
|
||||||
ogs_sbi_server_send_error(stream,
|
ogs_assert(true ==
|
||||||
sbi_message->res_status,
|
ogs_sbi_server_send_error(stream,
|
||||||
sbi_message, strerror, NULL));
|
sbi_message->res_status,
|
||||||
|
sbi_message, strerror, NULL));
|
||||||
ogs_free(strerror);
|
ogs_free(strerror);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -213,10 +213,11 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
||||||
ogs_assert(strerror);
|
ogs_assert(strerror);
|
||||||
|
|
||||||
ogs_error("%s", strerror);
|
ogs_error("%s", strerror);
|
||||||
ogs_assert(true ==
|
if (stream)
|
||||||
ogs_sbi_server_send_error(stream,
|
ogs_assert(true ==
|
||||||
OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
ogs_sbi_server_send_error(stream,
|
||||||
sbi_message, strerror, NULL));
|
OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
||||||
|
sbi_message, strerror, NULL));
|
||||||
ogs_free(strerror);
|
ogs_free(strerror);
|
||||||
END
|
END
|
||||||
}
|
}
|
||||||
|
@ -240,7 +241,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
||||||
CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM)
|
CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM)
|
||||||
SWITCH(sbi_message->h.resource.component[0])
|
SWITCH(sbi_message->h.resource.component[0])
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS)
|
CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS)
|
||||||
smf_namf_comm_handler_n1_n2_message_transfer(
|
smf_namf_comm_handle_n1_n2_message_transfer(
|
||||||
sess, e->sbi.state, sbi_message);
|
sess, e->sbi.state, sbi_message);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -280,6 +281,16 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST:
|
||||||
|
rv = gsm_handle_pdu_session_modification_request(sess, stream,
|
||||||
|
&nas_message->gsm.pdu_session_modification_request);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("[%s:%d] Cannot handle NAS message",
|
||||||
|
smf_ue->supi, sess->psi);
|
||||||
|
OGS_FSM_TRAN(s, smf_gsm_state_exception);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE:
|
case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE:
|
||||||
ogs_assert(true == ogs_sbi_send_http_status_no_content(stream));
|
ogs_assert(true == ogs_sbi_send_http_status_no_content(stream));
|
||||||
break;
|
break;
|
||||||
|
@ -375,7 +386,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
||||||
case OpenAPI_n2_sm_info_type_PDU_RES_REL_RSP:
|
case OpenAPI_n2_sm_info_type_PDU_RES_REL_RSP:
|
||||||
ngap_state = sess->ngap_state.pdu_session_resource_release;
|
ngap_state = sess->ngap_state.pdu_session_resource_release;
|
||||||
|
|
||||||
if (ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_UE_REQUESTED) {
|
if (ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_UE_REQUESTED ||
|
||||||
|
ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_PCF_INITIATED) {
|
||||||
ogs_assert(true == ogs_sbi_send_http_status_no_content(stream));
|
ogs_assert(true == ogs_sbi_send_http_status_no_content(stream));
|
||||||
} else if (ngap_state ==
|
} else if (ngap_state ==
|
||||||
SMF_NGAP_STATE_ERROR_INDICATION_RECEIVED_FROM_5G_AN) {
|
SMF_NGAP_STATE_ERROR_INDICATION_RECEIVED_FROM_5G_AN) {
|
||||||
|
|
|
@ -75,9 +75,9 @@ void smf_gx_handle_cca_initial_request(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sess->num_of_pcc_rule = gx_message->session_data.num_of_pcc_rule;
|
sess->policy.num_of_pcc_rule = gx_message->session_data.num_of_pcc_rule;
|
||||||
for (i = 0; i < gx_message->session_data.num_of_pcc_rule; i++)
|
for (i = 0; i < gx_message->session_data.num_of_pcc_rule; i++)
|
||||||
OGS_STORE_PCC_RULE(&sess->pcc_rule[i],
|
OGS_STORE_PCC_RULE(&sess->policy.pcc_rule[i],
|
||||||
&gx_message->session_data.pcc_rule[i]);
|
&gx_message->session_data.pcc_rule[i]);
|
||||||
|
|
||||||
/* APN-AMBR
|
/* APN-AMBR
|
||||||
|
@ -298,9 +298,9 @@ void smf_gx_handle_re_auth_request(
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sess->num_of_pcc_rule = gx_message->session_data.num_of_pcc_rule;
|
sess->policy.num_of_pcc_rule = gx_message->session_data.num_of_pcc_rule;
|
||||||
for (i = 0; i < gx_message->session_data.num_of_pcc_rule; i++)
|
for (i = 0; i < gx_message->session_data.num_of_pcc_rule; i++)
|
||||||
OGS_STORE_PCC_RULE(&sess->pcc_rule[i],
|
OGS_STORE_PCC_RULE(&sess->policy.pcc_rule[i],
|
||||||
&gx_message->session_data.pcc_rule[i]);
|
&gx_message->session_data.pcc_rule[i]);
|
||||||
|
|
||||||
smf_bearer_binding(sess);
|
smf_bearer_binding(sess);
|
||||||
|
|
|
@ -323,7 +323,10 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_modification_request(
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (modify_flags & OGS_PFCP_MODIFY_TFT_UPDATE) {
|
if (modify_flags &
|
||||||
|
(OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD|
|
||||||
|
OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE|
|
||||||
|
OGS_PFCP_MODIFY_EPC_TFT_UPDATE)) {
|
||||||
ogs_pfcp_pdrbuf_init();
|
ogs_pfcp_pdrbuf_init();
|
||||||
|
|
||||||
/* Update PDR */
|
/* Update PDR */
|
||||||
|
@ -368,7 +371,9 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_modification_request(
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (modify_flags & OGS_PFCP_MODIFY_QOS_UPDATE) {
|
if (modify_flags &
|
||||||
|
(OGS_PFCP_MODIFY_QOS_MODIFY|
|
||||||
|
OGS_PFCP_MODIFY_EPC_QOS_UPDATE)) {
|
||||||
/* Update QER */
|
/* Update QER */
|
||||||
i = 0;
|
i = 0;
|
||||||
if (qos_flow->qer) {
|
if (qos_flow->qer) {
|
||||||
|
@ -382,7 +387,11 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_modification_request(
|
||||||
pfcp_message.h.type = type;
|
pfcp_message.h.type = type;
|
||||||
pkbuf = ogs_pfcp_build_msg(&pfcp_message);
|
pkbuf = ogs_pfcp_build_msg(&pfcp_message);
|
||||||
|
|
||||||
if (modify_flags & (OGS_PFCP_MODIFY_CREATE|OGS_PFCP_MODIFY_TFT_UPDATE)) {
|
if (modify_flags &
|
||||||
|
(OGS_PFCP_MODIFY_CREATE|
|
||||||
|
OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD|
|
||||||
|
OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE|
|
||||||
|
OGS_PFCP_MODIFY_EPC_TFT_UPDATE)) {
|
||||||
ogs_pfcp_pdrbuf_clear();
|
ogs_pfcp_pdrbuf_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue