Coverage Report

Created: 2026-08-17 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/open5gs/lib/sbi/message.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
3
 *
4
 * This file is part of Open5GS.
5
 *
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU Affero General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
18
 */
19
20
#include "ogs-sbi.h"
21
#include "yuarel.h"
22
23
#include "contrib/multipart_parser.h"
24
25
static OGS_POOL(request_pool, ogs_sbi_request_t);
26
static OGS_POOL(response_pool, ogs_sbi_response_t);
27
28
static char *build_json(ogs_sbi_message_t *message);
29
static int parse_json(ogs_sbi_message_t *message,
30
        char *content_type, char *json);
31
32
static bool build_content(
33
        ogs_sbi_http_message_t *http, ogs_sbi_message_t *message);
34
static int parse_content(
35
        ogs_sbi_message_t *message, ogs_sbi_http_message_t *http);
36
37
static bool build_multipart(
38
        ogs_sbi_http_message_t *http, ogs_sbi_message_t *message);
39
static int parse_multipart(
40
        ogs_sbi_message_t *sbi_message, ogs_sbi_http_message_t *http);
41
42
static void http_message_free(ogs_sbi_http_message_t *http);
43
44
void ogs_sbi_message_init(int num_of_request_pool, int num_of_response_pool)
45
2
{
46
2
    ogs_pool_init(&request_pool, num_of_request_pool);
47
2
    ogs_pool_init(&response_pool, num_of_response_pool);
48
2
}
49
50
void ogs_sbi_message_final(void)
51
0
{
52
0
    ogs_pool_final(&request_pool);
53
0
    ogs_pool_final(&response_pool);
54
0
}
55
56
void ogs_sbi_message_free(ogs_sbi_message_t *message)
57
9.92k
{
58
9.92k
    int i;
59
60
9.92k
    ogs_assert(message);
61
62
    /* Discovery Option */
63
9.92k
    if (message->param.discovery_option)
64
0
        ogs_sbi_discovery_option_free(message->param.discovery_option);
65
66
    /* Query parameters */
67
9.92k
    for (i = 0; i < message->param.num_of_fields; i++)
68
0
        ogs_free(message->param.fields[i]);
69
9.92k
    for (i = 0; i < message->param.num_of_dataset_names; i++)
70
0
        ogs_free(message->param.dataset_names[i]);
71
72
    /* JSON Data */
73
9.92k
    if (message->NFProfile)
74
8.22k
        OpenAPI_nf_profile_free(message->NFProfile);
75
9.92k
    if (message->ProblemDetails)
76
0
        OpenAPI_problem_details_free(message->ProblemDetails);
77
9.92k
    if (message->PatchItemList) {
78
0
        OpenAPI_lnode_t *node = NULL;
79
0
        OpenAPI_list_for_each(message->PatchItemList, node)
80
0
            OpenAPI_patch_item_free(node->data);
81
0
        OpenAPI_list_free(message->PatchItemList);
82
0
    }
83
84
9.92k
    if (message->SubscriptionData)
85
0
        OpenAPI_subscription_data_free(message->SubscriptionData);
86
9.92k
    if (message->NotificationData)
87
0
        OpenAPI_notification_data_free(message->NotificationData);
88
9.92k
    if (message->SearchResult)
89
0
        OpenAPI_search_result_free(message->SearchResult);
90
9.92k
    if (message->AuthenticationInfo)
91
0
        OpenAPI_authentication_info_free(message->AuthenticationInfo);
92
9.92k
    if (message->AuthenticationInfoRequest)
93
0
        OpenAPI_authentication_info_request_free(
94
0
                message->AuthenticationInfoRequest);
95
9.92k
    if (message->AuthenticationInfoResult)
96
0
        OpenAPI_authentication_info_result_free(
97
0
                message->AuthenticationInfoResult);
98
9.92k
    if (message->AuthenticationSubscription)
99
0
        OpenAPI_authentication_subscription_free(
100
0
                message->AuthenticationSubscription);
101
9.92k
    if (message->UeAuthenticationCtx)
102
0
        OpenAPI_ue_authentication_ctx_free(message->UeAuthenticationCtx);
103
9.92k
    if (message->ConfirmationData)
104
0
        OpenAPI_confirmation_data_free(message->ConfirmationData);
105
9.92k
    if (message->ConfirmationDataResponse)
106
0
        OpenAPI_confirmation_data_response_free(
107
0
                message->ConfirmationDataResponse);
108
9.92k
    if (message->AuthEvent)
109
0
        OpenAPI_auth_event_free(message->AuthEvent);
110
9.92k
    if (message->Amf3GppAccessRegistration)
111
0
        OpenAPI_amf3_gpp_access_registration_free(
112
0
                message->Amf3GppAccessRegistration);
113
9.92k
    if (message->Amf3GppAccessRegistrationModification)
114
0
        OpenAPI_amf3_gpp_access_registration_modification_free(
115
0
                message->Amf3GppAccessRegistrationModification);
116
9.92k
    if (message->SmfRegistration)
117
0
        OpenAPI_smf_registration_free(message->SmfRegistration);
118
9.92k
    if (message->ProvisionedDataSets)
119
0
        OpenAPI_provisioned_data_sets_free(message->ProvisionedDataSets);
120
9.92k
    if (message->Nssai)
121
0
        OpenAPI_nssai_free(message->Nssai);
122
9.92k
    if (message->AccessAndMobilitySubscriptionData)
123
0
        OpenAPI_access_and_mobility_subscription_data_free(
124
0
                message->AccessAndMobilitySubscriptionData);
125
9.92k
    if (message->SmfSelectionSubscriptionData)
126
0
        OpenAPI_smf_selection_subscription_data_free(
127
0
                message->SmfSelectionSubscriptionData);
128
9.92k
    if (message->UeContextInSmfData)
129
0
        OpenAPI_ue_context_in_smf_data_free(message->UeContextInSmfData);
130
9.92k
    if (message->SmContextCreateData)
131
1.70k
        OpenAPI_sm_context_create_data_free(message->SmContextCreateData);
132
9.92k
    if (message->SmContextCreatedData)
133
0
        OpenAPI_sm_context_created_data_free(message->SmContextCreatedData);
134
9.92k
    if (message->SmContextCreateError)
135
0
        OpenAPI_sm_context_create_error_free(message->SmContextCreateError);
136
9.92k
    if (message->SmContextUpdateData)
137
0
        OpenAPI_sm_context_update_data_free(message->SmContextUpdateData);
138
9.92k
    if (message->SmContextUpdatedData)
139
0
        OpenAPI_sm_context_updated_data_free(message->SmContextUpdatedData);
140
9.92k
    if (message->SmContextUpdateError)
141
0
        OpenAPI_sm_context_update_error_free(message->SmContextUpdateError);
142
9.92k
    if (message->SmContextReleaseData)
143
0
        OpenAPI_sm_context_release_data_free(message->SmContextReleaseData);
144
9.92k
    if (message->SmContextReleasedData)
145
0
        OpenAPI_sm_context_released_data_free(message->SmContextReleasedData);
146
9.92k
    if (message->PduSessionCreateData)
147
0
        OpenAPI_pdu_session_create_data_free(message->PduSessionCreateData);
148
9.92k
    if (message->PduSessionCreatedData)
149
0
        OpenAPI_pdu_session_created_data_free(message->PduSessionCreatedData);
150
9.92k
    if (message->PduSessionCreateError)
151
0
        OpenAPI_pdu_session_create_error_free(message->PduSessionCreateError);
152
9.92k
    if (message->HsmfUpdateData)
153
0
        OpenAPI_hsmf_update_data_free(message->HsmfUpdateData);
154
9.92k
    if (message->HsmfUpdatedData)
155
0
        OpenAPI_hsmf_updated_data_free(message->HsmfUpdatedData);
156
9.92k
    if (message->HsmfUpdateError)
157
0
        OpenAPI_hsmf_update_error_free(message->HsmfUpdateError);
158
9.92k
    if (message->VsmfUpdateData)
159
0
        OpenAPI_vsmf_update_data_free(message->VsmfUpdateData);
160
9.92k
    if (message->VsmfUpdatedData)
161
0
        OpenAPI_vsmf_updated_data_free(message->VsmfUpdatedData);
162
9.92k
    if (message->VsmfUpdateError)
163
0
        OpenAPI_vsmf_update_error_free(message->VsmfUpdateError);
164
9.92k
    if (message->ReleaseData)
165
0
        OpenAPI_release_data_free(message->ReleaseData);
166
9.92k
    if (message->ReleasedData)
167
0
        OpenAPI_released_data_free(message->ReleasedData);
168
9.92k
    if (message->StatusNotification)
169
0
        OpenAPI_status_notification_free(message->StatusNotification);
170
9.92k
    if (message->SessionManagementSubscriptionDataList) {
171
0
        OpenAPI_lnode_t *node = NULL;
172
0
        OpenAPI_list_for_each(message->SessionManagementSubscriptionDataList, node)
173
0
            OpenAPI_session_management_subscription_data_free(node->data);
174
0
        OpenAPI_list_free(message->SessionManagementSubscriptionDataList);
175
0
    }
176
9.92k
    if (message->N1N2MessageTransferReqData)
177
0
        OpenAPI_n1_n2_message_transfer_req_data_free(
178
0
                message->N1N2MessageTransferReqData);
179
9.92k
    if (message->N1N2MessageTransferRspData)
180
0
        OpenAPI_n1_n2_message_transfer_rsp_data_free(
181
0
                message->N1N2MessageTransferRspData);
182
9.92k
    if (message->N1N2MsgTxfrFailureNotification)
183
0
        OpenAPI_n1_n2_msg_txfr_failure_notification_free(
184
0
                message->N1N2MsgTxfrFailureNotification);
185
9.92k
    if (message->SmContextStatusNotification)
186
0
        OpenAPI_sm_context_status_notification_free(
187
0
                message->SmContextStatusNotification);
188
9.92k
    if (message->PolicyAssociationRequest)
189
0
        OpenAPI_policy_association_request_free(
190
0
                message->PolicyAssociationRequest);
191
9.92k
    if (message->PolicyAssociation)
192
0
        OpenAPI_policy_association_free(message->PolicyAssociation);
193
9.92k
    if (message->AmPolicyData)
194
0
        OpenAPI_am_policy_data_free(message->AmPolicyData);
195
9.92k
    if (message->SmPolicyContextData)
196
0
        OpenAPI_sm_policy_context_data_free(message->SmPolicyContextData);
197
9.92k
    if (message->SmPolicyDecision)
198
0
        OpenAPI_sm_policy_decision_free(message->SmPolicyDecision);
199
9.92k
    if (message->SmPolicyData)
200
0
        OpenAPI_sm_policy_data_free(message->SmPolicyData);
201
9.92k
    if (message->SmPolicyDeleteData)
202
0
        OpenAPI_sm_policy_delete_data_free(message->SmPolicyDeleteData);
203
9.92k
    if (message->AuthorizedNetworkSliceInfo)
204
0
        OpenAPI_authorized_network_slice_info_free(
205
0
                message->AuthorizedNetworkSliceInfo);
206
9.92k
    if (message->PcfBinding)
207
0
        OpenAPI_pcf_binding_free(message->PcfBinding);
208
9.92k
    if (message->AppSessionContext)
209
0
        OpenAPI_app_session_context_free(message->AppSessionContext);
210
9.92k
    if (message->AppSessionContextUpdateDataPatch)
211
0
        OpenAPI_app_session_context_update_data_patch_free(message->AppSessionContextUpdateDataPatch);
212
9.92k
    if (message->TerminationInfo)
213
0
        OpenAPI_termination_info_free(message->TerminationInfo);
214
9.92k
    if (message->SmPolicyNotification)
215
0
        OpenAPI_sm_policy_notification_free(message->SmPolicyNotification);
216
9.92k
    if (message->TerminationNotification)
217
0
        OpenAPI_termination_notification_free(message->TerminationNotification);
218
9.92k
    if (message->DeregistrationData)
219
0
        OpenAPI_deregistration_data_free(message->DeregistrationData);
220
9.92k
    if (message->SDMSubscription)
221
0
        OpenAPI_sdm_subscription_free(message->SDMSubscription);
222
9.92k
    if (message->ModificationNotification)
223
0
        OpenAPI_modification_notification_free(message->ModificationNotification);
224
9.92k
    if (message->SecNegotiateReqData)
225
0
        OpenAPI_sec_negotiate_req_data_free(message->SecNegotiateReqData);
226
9.92k
    if (message->SecNegotiateRspData)
227
0
        OpenAPI_sec_negotiate_rsp_data_free(message->SecNegotiateRspData);
228
9.92k
    if (message->UeContextTransferReqData)
229
0
        OpenAPI_ue_context_transfer_req_data_free(message->UeContextTransferReqData);
230
9.92k
    if (message->UeContextTransferRspData)
231
0
        OpenAPI_ue_context_transfer_rsp_data_free(message->UeContextTransferRspData);
232
9.92k
    if (message->UeRegStatusUpdateReqData)
233
0
        OpenAPI_ue_reg_status_update_req_data_free(message->UeRegStatusUpdateReqData);
234
9.92k
    if (message->UeRegStatusUpdateRspData)
235
0
        OpenAPI_ue_reg_status_update_rsp_data_free(message->UeRegStatusUpdateRspData);
236
9.92k
    if (message->links) {
237
0
        OpenAPI_clear_and_free_string_list(message->links->items);
238
0
        if (message->links->self)
239
0
            ogs_free(message->links->self);
240
241
0
        ogs_free(message->links);
242
0
    }
243
244
    /* HTTP Part */
245
9.92k
    for (i = 0; i < message->num_of_part; i++) {
246
0
        if (message->part[i].pkbuf)
247
0
            ogs_pkbuf_free(message->part[i].pkbuf);
248
0
    }
249
9.92k
}
250
251
ogs_sbi_request_t *ogs_sbi_request_new(void)
252
0
{
253
0
    ogs_sbi_request_t *request = NULL;
254
255
0
    ogs_pool_alloc(&request_pool, &request);
256
0
    if (!request) {
257
0
        ogs_error("ogs_pool_alloc() failed");
258
0
        return NULL;
259
0
    }
260
0
    memset(request, 0, sizeof(ogs_sbi_request_t));
261
262
0
    request->http.params = ogs_hash_make();
263
0
    if (!request->http.params) {
264
0
        ogs_error("ogs_hash_make() failed");
265
0
        ogs_sbi_request_free(request);
266
0
        return NULL;
267
0
    }
268
0
    request->http.headers = ogs_hash_make();
269
0
    if (!request->http.headers) {
270
0
        ogs_error("ogs_hash_make() failed");
271
0
        ogs_sbi_request_free(request);
272
0
        return NULL;
273
0
    }
274
275
0
    return request;
276
0
}
277
278
ogs_sbi_response_t *ogs_sbi_response_new(void)
279
22.2k
{
280
22.2k
    ogs_sbi_response_t *response = NULL;
281
282
22.2k
    ogs_pool_alloc(&response_pool, &response);
283
22.2k
    if (!response) {
284
0
        ogs_error("ogs_pool_alloc() failed");
285
0
        return NULL;
286
0
    }
287
22.2k
    memset(response, 0, sizeof(ogs_sbi_response_t));
288
289
22.2k
    response->http.params = ogs_hash_make();
290
22.2k
    if (!response->http.params) {
291
0
        ogs_error("ogs_hash_make() failed");
292
0
        ogs_sbi_response_free(response);
293
0
        return NULL;
294
0
    }
295
22.2k
    response->http.headers = ogs_hash_make();
296
22.2k
    if (!response->http.headers) {
297
0
        ogs_error("ogs_hash_make() failed");
298
0
        ogs_sbi_response_free(response);
299
0
        return NULL;
300
0
    }
301
302
22.2k
    return response;
303
22.2k
}
304
305
void ogs_sbi_request_free(ogs_sbi_request_t *request)
306
0
{
307
0
    ogs_assert(request);
308
309
0
    if (request->h.uri)
310
0
        ogs_free(request->h.uri);
311
312
0
    ogs_sbi_header_free(&request->h);
313
0
    http_message_free(&request->http);
314
315
0
    ogs_pool_free(&request_pool, request);
316
0
}
317
318
void ogs_sbi_response_free(ogs_sbi_response_t *response)
319
22.2k
{
320
22.2k
    ogs_assert(response);
321
322
22.2k
    if (response->h.uri)
323
22.2k
        ogs_free(response->h.uri);
324
325
22.2k
    ogs_sbi_header_free(&response->h);
326
22.2k
    http_message_free(&response->http);
327
328
22.2k
    ogs_pool_free(&response_pool, response);
329
22.2k
}
330
331
ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
332
0
{
333
0
    int i;
334
0
    ogs_sbi_request_t *request = NULL;
335
0
    OpenAPI_nf_type_e nf_type = OpenAPI_nf_type_NULL;
336
337
0
    char sender_timestamp[OGS_SBI_RFC7231_DATE_LEN];
338
0
    char *max_rsp_time = NULL;
339
340
0
    ogs_assert(message);
341
342
0
    request = ogs_sbi_request_new();
343
0
    if (!request) {
344
0
        ogs_error("ogs_pool_alloc() failed");
345
0
        return NULL;
346
0
    }
347
348
0
    if (!message->h.method) {
349
0
        ogs_error("No Method");
350
0
        ogs_sbi_request_free(request);
351
0
        return NULL;
352
0
    }
353
0
    request->h.method = ogs_strdup(message->h.method);
354
0
    if (!request->h.method) {
355
0
        ogs_error("ogs_strdup() failed");
356
0
        ogs_sbi_request_free(request);
357
0
        return NULL;
358
0
    }
359
0
    if (message->h.uri) {
360
0
        request->h.uri = ogs_strdup(message->h.uri);
361
0
        if (!request->h.uri) {
362
0
            ogs_error("ogs_strdup() failed");
363
0
            ogs_sbi_request_free(request);
364
0
            return NULL;
365
0
        }
366
0
    } else {
367
0
        if (!message->h.service.name) {
368
0
            ogs_error("No Service Name");
369
0
            ogs_sbi_request_free(request);
370
0
            return NULL;
371
0
        }
372
0
        request->h.service.name = ogs_strdup(message->h.service.name);
373
0
        if (!request->h.service.name) {
374
0
            ogs_error("ogs_strdup() failed");
375
0
            ogs_sbi_request_free(request);
376
0
            return NULL;
377
0
        }
378
0
        if (!message->h.api.version) {
379
0
            ogs_error("No API Version");
380
0
            ogs_sbi_request_free(request);
381
0
            return NULL;
382
0
        }
383
0
        request->h.api.version = ogs_strdup(message->h.api.version);
384
0
        if (!request->h.api.version) {
385
0
            ogs_error("ogs_strdup() failed");
386
0
            ogs_sbi_request_free(request);
387
0
            return NULL;
388
0
        }
389
390
0
        if (!message->h.resource.component[0]) {
391
0
            ogs_error("No Resource");
392
0
            ogs_sbi_request_free(request);
393
0
            return NULL;
394
0
        }
395
0
        for (i = 0; i < OGS_SBI_MAX_NUM_OF_RESOURCE_COMPONENT &&
396
0
                            message->h.resource.component[i]; i++) {
397
0
            request->h.resource.component[i] = ogs_strdup(
398
0
                    message->h.resource.component[i]);
399
0
            if (!request->h.resource.component[i]) {
400
0
                ogs_error("ogs_strdup() failed");
401
0
                ogs_sbi_request_free(request);
402
0
                return NULL;
403
0
            }
404
0
        }
405
0
    }
406
407
    /* Discovery Parameter */
408
0
    if (message->param.target_nf_type) {
409
0
        char *v = OpenAPI_nf_type_ToString(message->param.target_nf_type);
410
0
        if (!v) {
411
0
            ogs_error("OpenAPI_nf_type_ToString() failed");
412
0
            ogs_sbi_request_free(request);
413
0
            return NULL;
414
0
        }
415
0
        ogs_sbi_header_set(request->http.params,
416
0
                OGS_SBI_PARAM_TARGET_NF_TYPE, v);
417
0
    }
418
0
    if (message->param.requester_nf_type) {
419
0
        char *v = OpenAPI_nf_type_ToString(message->param.requester_nf_type);
420
0
        if (!v) {
421
0
            ogs_error("OpenAPI_nf_type_ToString() failed");
422
0
            ogs_sbi_request_free(request);
423
0
            return NULL;
424
0
        }
425
0
        ogs_sbi_header_set(request->http.params,
426
0
                OGS_SBI_PARAM_REQUESTER_NF_TYPE, v);
427
0
    }
428
429
    /* Discovery Option Parameter */
430
0
    if (message->param.discovery_option) {
431
0
        ogs_sbi_discovery_option_t *discovery_option =
432
0
                message->param.discovery_option;
433
434
0
        if (discovery_option->target_nf_instance_id) {
435
0
            ogs_sbi_header_set(request->http.params,
436
0
                    OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID,
437
0
                    discovery_option->target_nf_instance_id);
438
0
        }
439
0
        if (discovery_option->requester_nf_instance_id) {
440
0
            ogs_sbi_header_set(request->http.params,
441
0
                    OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID,
442
0
                    discovery_option->requester_nf_instance_id);
443
0
        }
444
0
        if (discovery_option->guami_presence) {
445
0
            char *v = ogs_sbi_discovery_option_build_guami(discovery_option);
446
0
            if (v) {
447
0
                ogs_sbi_header_set(request->http.params,
448
0
                        OGS_SBI_PARAM_GUAMI, v);
449
0
                ogs_free(v);
450
0
            } else {
451
0
                ogs_error("build failed: guami[PLMN_ID:%06x,AMF_ID:%d]",
452
0
                            ogs_plmn_id_hexdump(
453
0
                                &discovery_option->guami.plmn_id),
454
0
                            ogs_amf_id_hexdump(
455
0
                                &discovery_option->guami.amf_id));
456
0
            }
457
0
        }
458
0
        if (discovery_option->num_of_service_names) {
459
460
    /*
461
     * Issues #1730
462
     * Send NF discovery query with service-names delimited with comma
463
     *
464
     * OpenAPI specification for sending NF discovery query with
465
     * "service-names" parameter is defined as folowing:
466
     *   name: service-names
467
     *   ...
468
     *   style: form
469
     *   explode: false
470
     *
471
     * According to OpenAPI specification, this means array items
472
     * should be delimited with a comma character (example: /users?id=3,4,5).
473
     *
474
     * See also https://swagger.io/docs/specification/serialization/
475
     */
476
477
            /* send array items separated by a comma */
478
0
            char *v = ogs_sbi_discovery_option_build_service_names(
479
0
                        discovery_option);
480
0
            if (v) {
481
0
                ogs_sbi_header_set(request->http.params,
482
0
                        OGS_SBI_PARAM_SERVICE_NAMES, v);
483
0
                ogs_free(v);
484
0
            } else {
485
0
                ogs_warn("build failed: service-names[%d:%s]",
486
0
                            discovery_option->num_of_service_names,
487
0
                            OpenAPI_service_name_ToString(
488
0
                                discovery_option->service_names[0]));
489
0
            }
490
0
        }
491
0
        if (discovery_option->num_of_snssais) {
492
0
            char *v = ogs_sbi_discovery_option_build_snssais(discovery_option);
493
0
            if (v) {
494
            /*
495
             * In http.params, the CURL library automatically encodes the URL.
496
             * http.headers implements open5gs to directly encode URLs.
497
             *
498
             * Since it is http.params, the result is sent as is.
499
             */
500
0
                ogs_sbi_header_set(request->http.params,
501
0
                        OGS_SBI_PARAM_SNSSAIS, v);
502
0
                ogs_free(v);
503
0
            } else {
504
0
                ogs_error("build failed: snssais(%d)[SST:%d SD:0x%x]",
505
0
                            discovery_option->num_of_snssais,
506
0
                            discovery_option->snssais[0].sst,
507
0
                            discovery_option->snssais[0].sd.v);
508
0
            }
509
0
        }
510
0
        if (discovery_option->dnn) {
511
0
            ogs_sbi_header_set(request->http.params,
512
0
                    OGS_SBI_PARAM_DNN, discovery_option->dnn);
513
0
        }
514
0
        if (discovery_option->tai_presence) {
515
0
            char *v = ogs_sbi_discovery_option_build_tai(discovery_option);
516
0
            if (v) {
517
0
                ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_TAI, v);
518
0
                ogs_free(v);
519
0
            } else {
520
0
                ogs_error("build failed: tai[PLMN_ID:%06x,TAC:%d]",
521
0
                            ogs_plmn_id_hexdump(
522
0
                                &discovery_option->tai.plmn_id),
523
0
                            discovery_option->tai.tac.v);
524
0
            }
525
0
        }
526
527
0
        if (discovery_option->num_of_target_plmn_list) {
528
0
            char *v = ogs_sbi_discovery_option_build_plmn_list(
529
0
                    discovery_option->target_plmn_list,
530
0
                    discovery_option->num_of_target_plmn_list);
531
0
            if (v) {
532
0
                ogs_sbi_header_set(request->http.params,
533
0
                        OGS_SBI_PARAM_TARGET_PLMN_LIST, v);
534
0
                ogs_free(v);
535
0
            } else {
536
0
                ogs_warn("invalid target-plmn-list failed[%d:%06x]",
537
0
                            discovery_option->num_of_target_plmn_list,
538
0
                            ogs_plmn_id_hexdump(
539
0
                                &discovery_option->target_plmn_list[0]));
540
0
            }
541
0
        }
542
0
        if (discovery_option->num_of_requester_plmn_list) {
543
0
            char *v = ogs_sbi_discovery_option_build_plmn_list(
544
0
                    discovery_option->requester_plmn_list,
545
0
                    discovery_option->num_of_requester_plmn_list);
546
0
            if (v) {
547
0
                ogs_sbi_header_set(request->http.params,
548
0
                        OGS_SBI_PARAM_REQUESTER_PLMN_LIST, v);
549
0
                ogs_free(v);
550
0
            } else {
551
0
                ogs_warn("invalid target-plmn-list failed[%d:%06x]",
552
0
                            discovery_option->num_of_requester_plmn_list,
553
0
                            ogs_plmn_id_hexdump(
554
0
                                &discovery_option->requester_plmn_list[0]));
555
0
            }
556
0
        }
557
0
        if (discovery_option->hnrf_uri) {
558
0
            ogs_sbi_header_set(request->http.params,
559
0
                    OGS_SBI_PARAM_HNRF_URI, discovery_option->hnrf_uri);
560
0
        }
561
0
        if (discovery_option->requester_features) {
562
0
            char *v = ogs_uint64_to_string(
563
0
                    discovery_option->requester_features);
564
0
            if (!v) {
565
0
                ogs_error("ogs_uint64_to_string[0x%llx] failed",
566
0
                        (long long)discovery_option->requester_features);
567
0
                ogs_sbi_request_free(request);
568
0
                return false;
569
0
            }
570
571
0
            ogs_sbi_header_set(request->http.params,
572
0
                    OGS_SBI_PARAM_REQUESTER_FEATURES, v);
573
0
            ogs_free(v);
574
0
        }
575
0
    }
576
577
    /* URL Query Paramemter */
578
0
    if (message->param.nf_id) {
579
0
        ogs_sbi_header_set(request->http.params,
580
0
                OGS_SBI_PARAM_NF_ID, message->param.nf_id);
581
0
    }
582
0
    if (message->param.nf_type) {
583
0
        char *v = OpenAPI_nf_type_ToString(message->param.nf_type);
584
0
        if (!v) {
585
0
            ogs_error("OpenAPI_nf_type_ToString() failed");
586
0
            ogs_sbi_request_free(request);
587
0
            return NULL;
588
0
        }
589
0
        ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_NF_TYPE, v);
590
0
    }
591
0
    if (message->param.limit) {
592
0
        char *v = ogs_msprintf("%d", message->param.limit);
593
0
        if (!v) {
594
0
            ogs_error("OpenAPI_nf_type_ToString() failed");
595
0
            ogs_sbi_request_free(request);
596
0
            return NULL;
597
0
        }
598
0
        ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_LIMIT, v);
599
0
        ogs_free(v);
600
0
    }
601
0
    if (message->param.dnn) {
602
0
        ogs_sbi_header_set(request->http.params,
603
0
                OGS_SBI_PARAM_DNN, message->param.dnn);
604
0
    }
605
0
    if (message->param.plmn_id_presence) {
606
0
        OpenAPI_plmn_id_t plmn_id;
607
608
0
        plmn_id.mnc = ogs_plmn_id_mnc_string(&message->param.plmn_id);
609
0
        plmn_id.mcc = ogs_plmn_id_mcc_string(&message->param.plmn_id);
610
611
0
        if (plmn_id.mnc && plmn_id.mcc) {
612
0
            char *v = NULL;
613
0
            cJSON *item = NULL;
614
615
0
            item = OpenAPI_plmn_id_convertToJSON(&plmn_id);
616
0
            if (!item) {
617
0
                ogs_error("OpenAPI_plmn_id_convertToJSON() failed");
618
0
                ogs_sbi_request_free(request);
619
0
                return NULL;
620
0
            }
621
0
            if (plmn_id.mnc) ogs_free(plmn_id.mnc);
622
0
            if (plmn_id.mcc) ogs_free(plmn_id.mcc);
623
624
0
            v = cJSON_PrintUnformatted(item);
625
0
            if (!v) {
626
0
                ogs_error("cJSON_PrintUnformatted() failed");
627
0
                ogs_sbi_request_free(request);
628
0
                return NULL;
629
0
            }
630
0
            cJSON_Delete(item);
631
632
0
            ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_PLMN_ID, v);
633
0
            ogs_free(v);
634
0
        }
635
0
    }
636
0
    if (message->param.single_nssai_presence) {
637
0
        char *v = ogs_sbi_s_nssai_to_json(&message->param.s_nssai);
638
0
        if (!v) {
639
0
            ogs_error("ogs_sbi_s_nssai_to_json() failed");
640
0
            ogs_sbi_request_free(request);
641
0
            return NULL;
642
0
        }
643
0
        ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_SINGLE_NSSAI, v);
644
0
        ogs_free(v);
645
0
    }
646
0
    if (message->param.snssai_presence) {
647
0
        char *v = ogs_sbi_s_nssai_to_json(&message->param.s_nssai);
648
0
        if (!v) {
649
0
            ogs_error("ogs_sbi_s_nssai_to_json() failed");
650
0
            ogs_sbi_request_free(request);
651
0
            return NULL;
652
0
        }
653
0
        ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_SNSSAI, v);
654
0
        ogs_free(v);
655
0
    }
656
0
    if (message->param.slice_info_for_pdu_session_presence) {
657
0
        OpenAPI_slice_info_for_pdu_session_t SliceInfoForPDUSession;
658
0
        OpenAPI_snssai_t sNssai, homeSnssai;
659
660
0
        char *v = NULL;
661
0
        cJSON *item = NULL;
662
663
0
        if (!message->param.snssai_presence) {
664
0
            ogs_error("No S-NSSAI");
665
0
            ogs_sbi_request_free(request);
666
0
            return NULL;
667
0
        }
668
0
        if (!message->param.roaming_indication) {
669
0
            ogs_error("No Roaming Indication");
670
0
            ogs_sbi_request_free(request);
671
0
            return NULL;
672
0
        }
673
674
0
        memset(&sNssai, 0, sizeof(sNssai));
675
0
        sNssai.sst = message->param.s_nssai.sst;
676
0
        sNssai.sd = ogs_s_nssai_sd_to_string(message->param.s_nssai.sd);
677
678
0
        memset(&homeSnssai, 0, sizeof(homeSnssai));
679
0
        if (message->param.home_snssai_presence) {
680
0
            homeSnssai.sst = message->param.home_snssai.sst;
681
0
            homeSnssai.sd = ogs_s_nssai_sd_to_string(
682
0
                    message->param.home_snssai.sd);
683
0
        }
684
685
0
        memset(&SliceInfoForPDUSession, 0, sizeof(SliceInfoForPDUSession));
686
687
0
        SliceInfoForPDUSession.s_nssai = &sNssai;
688
0
        SliceInfoForPDUSession.roaming_indication =
689
0
            message->param.roaming_indication;
690
0
        if (homeSnssai.sst)
691
0
            SliceInfoForPDUSession.home_snssai = &homeSnssai;
692
693
0
        item = OpenAPI_slice_info_for_pdu_session_convertToJSON(
694
0
                &SliceInfoForPDUSession);
695
0
        if (!item) {
696
0
            ogs_error("OpenAPI_slice_info_for_pdu_session_convertToJSON() "
697
0
                    "failed");
698
699
0
            if (sNssai.sd)
700
0
                ogs_free(sNssai.sd);
701
0
            if (homeSnssai.sd)
702
0
                ogs_free(homeSnssai.sd);
703
0
            ogs_sbi_request_free(request);
704
705
0
            return NULL;
706
0
        }
707
708
0
        v = cJSON_PrintUnformatted(item);
709
0
        if (!v) {
710
0
            ogs_error("cJSON_PrintUnformatted() failed");
711
0
            ogs_sbi_request_free(request);
712
713
0
            if (sNssai.sd)
714
0
                ogs_free(sNssai.sd);
715
0
            if (homeSnssai.sd)
716
0
                ogs_free(homeSnssai.sd);
717
718
0
            return NULL;
719
0
        }
720
0
        cJSON_Delete(item);
721
722
0
        ogs_sbi_header_set(request->http.params,
723
0
                OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION, v);
724
0
        ogs_free(v);
725
726
0
        if (sNssai.sd)
727
0
            ogs_free(sNssai.sd);
728
0
        if (homeSnssai.sd)
729
0
            ogs_free(homeSnssai.sd);
730
0
    }
731
0
    if (message->param.num_of_fields) {
732
0
        char *fields;
733
734
0
        fields = ogs_strdup(message->param.fields[0]);
735
0
        if (!fields) {
736
0
            ogs_error("ogs_strdup() failed");
737
0
            return NULL;
738
0
        }
739
740
0
        for (i = 1; i < message->param.num_of_fields; i++)
741
0
            fields = ogs_mstrcatf(
742
0
                    fields, ",%s", message->param.fields[i]);
743
744
0
        if (fields) {
745
0
            ogs_sbi_header_set(request->http.params,
746
0
                    OGS_SBI_PARAM_FIELDS, fields);
747
0
            ogs_free(fields);
748
0
        }
749
0
    }
750
0
    if (message->param.num_of_dataset_names) {
751
0
        char *dataset_names;
752
753
0
        dataset_names = ogs_strdup(message->param.dataset_names[0]);
754
0
        if (!dataset_names) {
755
0
            ogs_error("ogs_strdup() failed");
756
0
            return NULL;
757
0
        }
758
759
0
        for (i = 1; i < message->param.num_of_dataset_names; i++)
760
0
            dataset_names = ogs_mstrcatf(
761
0
                    dataset_names, ",%s", message->param.dataset_names[i]);
762
763
0
        if (dataset_names) {
764
0
            ogs_sbi_header_set(request->http.params,
765
0
                    OGS_SBI_PARAM_DATASET_NAMES, dataset_names);
766
0
            ogs_free(dataset_names);
767
0
        }
768
0
    }
769
0
    if (message->param.ipv4addr) {
770
0
        ogs_sbi_header_set(request->http.params,
771
0
                OGS_SBI_PARAM_IPV4ADDR, message->param.ipv4addr);
772
0
    }
773
0
    if (message->param.ipv6prefix) {
774
0
        ogs_sbi_header_set(request->http.params,
775
0
                OGS_SBI_PARAM_IPV6PREFIX, message->param.ipv6prefix);
776
0
    }
777
778
0
    if (message->param.home_plmn_id_presence) {
779
0
        OpenAPI_plmn_id_t home_plmn_id;
780
781
0
        home_plmn_id.mnc = ogs_plmn_id_mnc_string(&message->param.home_plmn_id);
782
0
        home_plmn_id.mcc = ogs_plmn_id_mcc_string(&message->param.home_plmn_id);
783
784
0
        if (home_plmn_id.mnc && home_plmn_id.mcc) {
785
0
            char *v = NULL;
786
0
            cJSON *item = NULL;
787
788
0
            item = OpenAPI_plmn_id_convertToJSON(&home_plmn_id);
789
0
            if (!item) {
790
0
                ogs_error("OpenAPI_plmn_id_convertToJSON() failed");
791
0
                ogs_sbi_request_free(request);
792
0
                return NULL;
793
0
            }
794
0
            if (home_plmn_id.mnc) ogs_free(home_plmn_id.mnc);
795
0
            if (home_plmn_id.mcc) ogs_free(home_plmn_id.mcc);
796
797
0
            v = cJSON_PrintUnformatted(item);
798
0
            if (!v) {
799
0
                ogs_error("cJSON_PrintUnformatted() failed");
800
0
                ogs_sbi_request_free(request);
801
0
                return NULL;
802
0
            }
803
0
            cJSON_Delete(item);
804
805
0
            ogs_sbi_header_set(
806
0
                    request->http.params, OGS_SBI_PARAM_HOME_PLMN_ID, v);
807
0
            ogs_free(v);
808
0
        }
809
0
    }
810
811
0
    if (message->param.tai_presence) {
812
0
        OpenAPI_tai_t tai;
813
814
0
        memset(&tai, 0, sizeof(tai));
815
0
        tai.plmn_id = ogs_sbi_build_plmn_id(&message->param.tai.plmn_id);
816
0
        tai.tac = ogs_uint24_to_0string(message->param.tai.tac);
817
818
0
        if (tai.plmn_id && tai.tac) {
819
0
            char *v = NULL;
820
0
            cJSON *item = NULL;
821
822
0
            item = OpenAPI_tai_convertToJSON(&tai);
823
0
            if (!item) {
824
0
                ogs_error("OpenAPI_tai_convertToJSON() failed");
825
0
                ogs_sbi_request_free(request);
826
0
                return NULL;
827
0
            }
828
0
            if (tai.plmn_id) ogs_sbi_free_plmn_id(tai.plmn_id);
829
0
            if (tai.tac) ogs_free(tai.tac);
830
831
0
            v = cJSON_PrintUnformatted(item);
832
0
            if (!v) {
833
0
                ogs_error("cJSON_PrintUnformatted() failed");
834
0
                ogs_sbi_request_free(request);
835
0
                return NULL;
836
0
            }
837
0
            cJSON_Delete(item);
838
839
0
            ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_TAI, v);
840
0
            ogs_free(v);
841
0
        }
842
0
    }
843
844
0
    if (build_content(&request->http, message) == false) {
845
0
        ogs_error("build_content() failed");
846
0
        ogs_sbi_request_free(request);
847
0
        return NULL;
848
0
    }
849
850
0
    if (message->http.accept) {
851
0
        ogs_sbi_header_set(request->http.headers, OGS_SBI_ACCEPT,
852
0
                message->http.accept);
853
0
    } else {
854
0
        SWITCH(message->h.method)
855
0
        CASE(OGS_SBI_HTTP_METHOD_DELETE)
856
0
            ogs_sbi_header_set(request->http.headers, OGS_SBI_ACCEPT,
857
0
                OGS_SBI_CONTENT_PROBLEM_TYPE);
858
0
            break;
859
0
        DEFAULT
860
0
            ogs_sbi_header_set(request->http.headers, OGS_SBI_ACCEPT,
861
0
                OGS_SBI_CONTENT_JSON_TYPE "," OGS_SBI_CONTENT_PROBLEM_TYPE);
862
0
            break;
863
0
        END
864
0
    }
865
866
0
    nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance);
867
0
    if (nf_type) {
868
0
        char *user_agent = OpenAPI_nf_type_ToString(nf_type);
869
0
        if (user_agent)
870
0
            ogs_sbi_header_set(request->http.headers,
871
0
                    OGS_SBI_USER_AGENT, user_agent);
872
0
    }
873
874
0
    ogs_assert(OGS_OK ==
875
0
            ogs_sbi_rfc7231_string(sender_timestamp, ogs_time_now()));
876
0
    ogs_sbi_header_set(request->http.headers,
877
0
            OGS_SBI_OPTIONAL_CUSTOM_SENDER_TIMESTAMP, sender_timestamp);
878
879
0
    ogs_assert(ogs_time_to_msec(ogs_local_conf()->time.message.duration));
880
0
    max_rsp_time = ogs_msprintf("%d",
881
0
            (int)ogs_time_to_msec(ogs_local_conf()->time.message.duration));
882
0
    ogs_sbi_header_set(request->http.headers,
883
0
            OGS_SBI_OPTIONAL_CUSTOM_MAX_RSP_TIME, max_rsp_time);
884
0
    ogs_free(max_rsp_time);
885
886
0
    if (message->http.content_encoding)
887
0
        ogs_sbi_header_set(request->http.headers,
888
0
                OGS_SBI_ACCEPT_ENCODING, message->http.content_encoding);
889
890
0
    if (message->http.custom.callback)
891
0
        ogs_sbi_header_set(request->http.headers,
892
0
                OGS_SBI_CUSTOM_CALLBACK, message->http.custom.callback);
893
894
0
    if (message->http.custom.nrf_uri)
895
0
        ogs_sbi_header_set(request->http.headers,
896
0
                OGS_SBI_CUSTOM_NRF_URI, message->http.custom.nrf_uri);
897
898
0
    return request;
899
0
}
900
901
ogs_sbi_response_t *ogs_sbi_build_response(
902
        ogs_sbi_message_t *message, int status)
903
0
{
904
0
    ogs_sbi_response_t *response = NULL;
905
906
0
    ogs_assert(message);
907
908
0
    response = ogs_sbi_response_new();
909
0
    if (!response) {
910
0
        ogs_error("ogs_pool_alloc() failed");
911
0
        return NULL;
912
0
    }
913
914
0
    response->status = status;
915
916
0
    if (response->status != OGS_SBI_HTTP_STATUS_NO_CONTENT) {
917
0
        if (build_content(&response->http, message) == false) {
918
0
            ogs_error("build_content() failed");
919
0
            ogs_sbi_response_free(response);
920
0
            return NULL;
921
0
        }
922
0
    }
923
924
0
    if (message->http.location) {
925
0
        ogs_sbi_header_set(response->http.headers, "Location",
926
0
                message->http.location);
927
0
    }
928
0
    if (message->http.cache_control)
929
0
        ogs_sbi_header_set(response->http.headers, "Cache-Control",
930
0
                message->http.cache_control);
931
932
0
    return response;
933
0
}
934
935
int ogs_sbi_parse_request(
936
        ogs_sbi_message_t *message, ogs_sbi_request_t *request)
937
0
{
938
0
    int rv;
939
0
    ogs_hash_index_t *hi;
940
0
    ogs_sbi_discovery_option_t *discovery_option = NULL;
941
0
    bool discovery_option_presence = false;
942
943
0
    ogs_assert(request);
944
0
    ogs_assert(message);
945
946
0
    rv = ogs_sbi_parse_header(message, &request->h);
947
0
    if (rv != OGS_OK) {
948
0
        ogs_error("ogs_sbi_parse_header() failed");
949
0
        return OGS_ERROR;
950
0
    }
951
952
0
    discovery_option_presence = false;
953
0
    discovery_option = ogs_sbi_discovery_option_new();
954
0
    ogs_assert(discovery_option);
955
956
0
    for (hi = ogs_hash_first(request->http.params);
957
0
            hi; hi = ogs_hash_next(hi)) {
958
        /* Discovery Parameter */
959
0
        if (!strcmp(ogs_hash_this_key(hi),
960
0
                    OGS_SBI_PARAM_TARGET_NF_TYPE)) {
961
0
            message->param.target_nf_type =
962
0
                OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
963
0
        } else if (!strcmp(ogs_hash_this_key(hi),
964
0
                    OGS_SBI_PARAM_REQUESTER_NF_TYPE)) {
965
0
            message->param.requester_nf_type =
966
0
                OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
967
968
        /* Discovery Option Parameter */
969
0
        } else if (!strcmp(ogs_hash_this_key(hi),
970
0
                    OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID)) {
971
0
            char *v = ogs_hash_this_val(hi);
972
973
0
            if (v) {
974
0
                ogs_sbi_discovery_option_set_target_nf_instance_id(
975
0
                        discovery_option, v);
976
0
                discovery_option_presence = true;
977
0
            }
978
0
        } else if (!strcmp(ogs_hash_this_key(hi),
979
0
                    OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID)) {
980
0
            char *v = ogs_hash_this_val(hi);
981
982
0
            if (v) {
983
0
                ogs_sbi_discovery_option_set_requester_nf_instance_id(
984
0
                        discovery_option, v);
985
0
                discovery_option_presence = true;
986
0
            }
987
0
        } else if (!strcmp(ogs_hash_this_key(hi),
988
0
                    OGS_SBI_PARAM_SERVICE_NAMES)) {
989
    /*
990
     * Issues #1730
991
     * Send NF discovery query with service-names delimited with comma
992
     *
993
     * OpenAPI specification for sending NF discovery query with
994
     * "service-names" parameter is defined as folowing:
995
     *   name: service-names
996
     *   ...
997
     *   style: form
998
     *   explode: false
999
     *
1000
     * According to OpenAPI specification, this means array items
1001
     * should be delimited with a comma character (example: /users?id=3,4,5).
1002
     *
1003
     * See also https://swagger.io/docs/specification/serialization/
1004
     */
1005
0
            char *v = ogs_hash_this_val(hi);
1006
0
            if (v) {
1007
0
                if (ogs_sbi_discovery_option_parse_service_names(
1008
0
                            discovery_option, v) != OGS_OK) {
1009
0
                    ogs_sbi_discovery_option_free(discovery_option);
1010
0
                    return OGS_ERROR;
1011
0
                }
1012
0
                discovery_option_presence = true;
1013
0
            }
1014
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SNSSAIS)) {
1015
0
            char *v = ogs_hash_this_val(hi);
1016
0
            if (v) {
1017
0
                if (ogs_sbi_discovery_option_parse_snssais(
1018
0
                            discovery_option, v) != OGS_OK) {
1019
0
                    ogs_sbi_discovery_option_free(discovery_option);
1020
0
                    return OGS_ERROR;
1021
0
                }
1022
0
                discovery_option_presence = true;
1023
0
            }
1024
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_GUAMI)) {
1025
0
            char *v = ogs_hash_this_val(hi);
1026
0
            if (v) {
1027
0
                if (ogs_sbi_discovery_option_parse_guami(
1028
0
                            discovery_option, v) != OGS_OK) {
1029
0
                    ogs_sbi_discovery_option_free(discovery_option);
1030
0
                    return OGS_ERROR;
1031
0
                }
1032
0
                discovery_option_presence = true;
1033
0
            }
1034
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_DNN)) {
1035
0
            char *v = ogs_hash_this_val(hi);
1036
0
            if (v) {
1037
0
                ogs_sbi_discovery_option_set_dnn(discovery_option, v);
1038
0
                discovery_option_presence = true;
1039
0
            }
1040
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_TAI)) {
1041
0
            char *v = ogs_hash_this_val(hi);
1042
0
            if (v) {
1043
0
                if (ogs_sbi_discovery_option_parse_tai(
1044
0
                            discovery_option, v) != OGS_OK) {
1045
0
                    ogs_sbi_discovery_option_free(discovery_option);
1046
0
                    return OGS_ERROR;
1047
0
                }
1048
0
                discovery_option_presence = true;
1049
0
            }
1050
0
        } else if (!strcmp(ogs_hash_this_key(hi),
1051
0
                    OGS_SBI_PARAM_TARGET_PLMN_LIST)) {
1052
0
            char *v = ogs_hash_this_val(hi);
1053
0
            if (v) {
1054
0
                int n = ogs_sbi_discovery_option_parse_plmn_list(
1055
0
                        discovery_option->target_plmn_list, v);
1056
0
                if (n < 0) {
1057
0
                    ogs_sbi_discovery_option_free(discovery_option);
1058
0
                    return OGS_ERROR;
1059
0
                }
1060
0
                discovery_option->num_of_target_plmn_list = n;
1061
0
                discovery_option_presence = true;
1062
0
            }
1063
0
        } else if (!strcmp(ogs_hash_this_key(hi),
1064
0
                    OGS_SBI_PARAM_REQUESTER_PLMN_LIST)) {
1065
0
            char *v = ogs_hash_this_val(hi);
1066
0
            if (v) {
1067
0
                int n = ogs_sbi_discovery_option_parse_plmn_list(
1068
0
                        discovery_option->requester_plmn_list, v);
1069
0
                if (n < 0) {
1070
0
                    ogs_sbi_discovery_option_free(discovery_option);
1071
0
                    return OGS_ERROR;
1072
0
                }
1073
0
                discovery_option->num_of_requester_plmn_list = n;
1074
0
                discovery_option_presence = true;
1075
0
            }
1076
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_HNRF_URI)) {
1077
0
            char *v = ogs_hash_this_val(hi);
1078
0
            if (v) {
1079
0
                ogs_sbi_discovery_option_set_hnrf_uri(discovery_option, v);
1080
0
                discovery_option_presence = true;
1081
0
            }
1082
0
        } else if (!strcmp(ogs_hash_this_key(hi),
1083
0
                    OGS_SBI_PARAM_REQUESTER_FEATURES)) {
1084
0
            char *v = ogs_hash_this_val(hi);
1085
0
            if (v) {
1086
0
                discovery_option->requester_features =
1087
0
                    ogs_uint64_from_string_hexadecimal(v);
1088
0
                if (ogs_errno == EINVAL || ogs_errno == ERANGE) {
1089
0
                    ogs_error("ogs_uint64_from_string_hexadecimal() failed");
1090
0
                    ogs_sbi_discovery_option_free(discovery_option);
1091
0
                    return OGS_ERROR;
1092
0
                }
1093
0
                discovery_option_presence = true;
1094
0
            }
1095
0
        }
1096
1097
        /* URL Query Parameter */
1098
0
        if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) {
1099
0
            message->param.nf_id = ogs_hash_this_val(hi);
1100
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_TYPE)) {
1101
0
            message->param.nf_type =
1102
0
                OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
1103
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_LIMIT)) {
1104
0
            message->param.limit = atoi(ogs_hash_this_val(hi));
1105
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_DNN)) {
1106
0
            message->param.dnn = ogs_hash_this_val(hi);
1107
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_PLMN_ID)) {
1108
0
            char *v = NULL;
1109
0
            cJSON *item = NULL;
1110
0
            OpenAPI_plmn_id_t *plmn_id = NULL;
1111
1112
0
            v = ogs_hash_this_val(hi);
1113
0
            if (v) {
1114
0
                item = cJSON_Parse(v);
1115
0
                if (item) {
1116
0
                    plmn_id = OpenAPI_plmn_id_parseFromJSON(item);
1117
0
                    if (plmn_id && plmn_id->mnc && plmn_id->mcc) {
1118
0
                        ogs_plmn_id_build(&message->param.plmn_id,
1119
0
                            atoi(plmn_id->mcc),
1120
0
                            atoi(plmn_id->mnc), strlen(plmn_id->mnc));
1121
0
                        message->param.plmn_id_presence = true;
1122
0
                        OpenAPI_plmn_id_free(plmn_id);
1123
0
                    }
1124
0
                    cJSON_Delete(item);
1125
0
                }
1126
0
            }
1127
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SINGLE_NSSAI)) {
1128
0
            char *v = ogs_hash_this_val(hi);
1129
0
            if (v) {
1130
0
                bool rc = ogs_sbi_s_nssai_from_json(&message->param.s_nssai, v);
1131
0
                if (rc == true)
1132
0
                    message->param.single_nssai_presence = true;
1133
0
            }
1134
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SNSSAI)) {
1135
0
            char *v = ogs_hash_this_val(hi);
1136
0
            if (v) {
1137
0
                bool rc = ogs_sbi_s_nssai_from_json(&message->param.s_nssai, v);
1138
0
                if (rc == true)
1139
0
                    message->param.snssai_presence = true;
1140
0
            }
1141
0
        } else if (!strcmp(ogs_hash_this_key(hi),
1142
0
                    OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION)) {
1143
0
            char *v = NULL;
1144
0
            cJSON *item = NULL;
1145
0
            OpenAPI_slice_info_for_pdu_session_t *SliceInfoForPduSession = NULL;
1146
1147
0
            v = ogs_hash_this_val(hi);
1148
0
            if (v) {
1149
0
                item = cJSON_Parse(v);
1150
0
                if (item) {
1151
0
                    SliceInfoForPduSession =
1152
0
                        OpenAPI_slice_info_for_pdu_session_parseFromJSON(item);
1153
0
                    if (SliceInfoForPduSession) {
1154
0
                        OpenAPI_snssai_t *s_nssai = NULL, *home_snssai = NULL;
1155
1156
0
                        s_nssai = SliceInfoForPduSession->s_nssai;
1157
0
                        if (s_nssai) {
1158
0
                            message->param.s_nssai.sst = s_nssai->sst;
1159
0
                            message->param.s_nssai.sd =
1160
0
                                ogs_s_nssai_sd_from_string(s_nssai->sd);
1161
0
                            message->param.snssai_presence = true;
1162
0
                        }
1163
1164
0
                        message->param.roaming_indication =
1165
0
                            SliceInfoForPduSession->roaming_indication;
1166
1167
0
                        home_snssai = SliceInfoForPduSession->home_snssai;
1168
0
                        if (home_snssai) {
1169
0
                            message->param.home_snssai.sst = home_snssai->sst;
1170
0
                            message->param.home_snssai.sd =
1171
0
                                ogs_s_nssai_sd_from_string(home_snssai->sd);
1172
0
                            message->param.home_snssai_presence = true;
1173
0
                        }
1174
1175
0
                        message->param.
1176
0
                            slice_info_for_pdu_session_presence = true;
1177
1178
0
                        OpenAPI_slice_info_for_pdu_session_free(
1179
0
                                SliceInfoForPduSession);
1180
1181
0
                    }
1182
0
                    cJSON_Delete(item);
1183
0
                }
1184
0
            }
1185
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_FIELDS)) {
1186
0
            char *_v = ogs_hash_this_val(hi), *v = NULL;
1187
0
            char *token = NULL;
1188
0
            char *saveptr = NULL;
1189
1190
0
            v = ogs_strdup(_v);
1191
0
            ogs_assert(v);
1192
1193
0
            token = ogs_strtok_r(v, ",", &saveptr);
1194
0
            while (token != NULL) {
1195
0
                if (message->param.num_of_fields < OGS_SBI_MAX_NUM_OF_FIELDS) {
1196
0
                        message->param.fields
1197
0
                        [message->param.num_of_fields] = ogs_strdup(token);
1198
0
                    ogs_assert(message->param.fields
1199
0
                        [message->param.num_of_fields]);
1200
0
                    message->param.num_of_fields++;
1201
0
                    token = ogs_strtok_r(NULL, ",", &saveptr);
1202
0
                } else {
1203
0
                    ogs_error("Fields in query exceed MAX_NUM_OF_FIELDS");
1204
0
                    break;
1205
0
                }
1206
0
            }
1207
1208
0
            ogs_free(v);
1209
0
        } else if (!strcmp(ogs_hash_this_key(hi),
1210
0
                OGS_SBI_PARAM_DATASET_NAMES)) {
1211
0
            char *_v = ogs_hash_this_val(hi), *v = NULL;
1212
0
            char *token = NULL;
1213
0
            char *saveptr = NULL;
1214
1215
0
            v = ogs_strdup(_v);
1216
0
            ogs_assert(v);
1217
1218
0
            token = ogs_strtok_r(v, ",", &saveptr);
1219
0
            while (token != NULL) {
1220
0
                if (message->param.num_of_dataset_names <
1221
0
                        OGS_SBI_MAX_NUM_OF_DATASETNAMES) {
1222
0
                    message->param.dataset_names
1223
0
                        [message->param.num_of_dataset_names] =
1224
0
                                ogs_strdup(token);
1225
0
                    ogs_assert(message->param.dataset_names
1226
0
                        [message->param.num_of_dataset_names]);
1227
0
                    message->param.num_of_dataset_names++;
1228
0
                    token = ogs_strtok_r(NULL, ",", &saveptr);
1229
0
                } else {
1230
0
                    ogs_error("Datasetnames in query exceeds "
1231
0
                                "MAX_NUM_OF_DATASETNAMES");
1232
0
                    break;
1233
0
                }
1234
0
            }
1235
1236
0
            ogs_free(v);
1237
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_IPV4ADDR)) {
1238
0
            message->param.ipv4addr = ogs_hash_this_val(hi);
1239
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_IPV6PREFIX)) {
1240
0
            message->param.ipv6prefix = ogs_hash_this_val(hi);
1241
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_HOME_PLMN_ID)) {
1242
0
            char *v = NULL;
1243
0
            cJSON *item = NULL;
1244
0
            OpenAPI_plmn_id_t *home_plmn_id = NULL;
1245
1246
0
            v = ogs_hash_this_val(hi);
1247
0
            if (v) {
1248
0
                item = cJSON_Parse(v);
1249
0
                if (item) {
1250
0
                    home_plmn_id = OpenAPI_plmn_id_parseFromJSON(item);
1251
0
                    if (home_plmn_id &&
1252
0
                            home_plmn_id->mnc && home_plmn_id->mcc) {
1253
0
                        ogs_plmn_id_build(&message->param.home_plmn_id,
1254
0
                            atoi(home_plmn_id->mcc),
1255
0
                            atoi(home_plmn_id->mnc), strlen(home_plmn_id->mnc));
1256
0
                        message->param.home_plmn_id_presence = true;
1257
0
                        OpenAPI_plmn_id_free(home_plmn_id);
1258
0
                    }
1259
0
                    cJSON_Delete(item);
1260
0
                }
1261
0
            }
1262
0
        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_TAI)) {
1263
0
            char *v = NULL;
1264
0
            cJSON *item = NULL;
1265
0
            OpenAPI_tai_t *tai = NULL;
1266
1267
0
            v = ogs_hash_this_val(hi);
1268
0
            if (v) {
1269
0
                item = cJSON_Parse(v);
1270
0
                if (item) {
1271
0
                    tai = OpenAPI_tai_parseFromJSON(item);
1272
0
                    if (tai && tai->plmn_id && tai->tac) {
1273
0
                        ogs_sbi_parse_plmn_id(
1274
0
                                &message->param.tai.plmn_id, tai->plmn_id);
1275
0
                        message->param.tai.tac =
1276
0
                            ogs_uint24_from_string_hexadecimal(tai->tac);
1277
0
                        message->param.tai_presence = true;
1278
0
                        OpenAPI_tai_free(tai);
1279
0
                    }
1280
0
                    cJSON_Delete(item);
1281
0
                }
1282
0
            }
1283
0
        }
1284
0
    }
1285
1286
0
    if (discovery_option_presence == true)
1287
        /* message->param.discovery_option will be freed()
1288
         * in ogs_sbi_message_free() */
1289
0
        message->param.discovery_option = discovery_option;
1290
0
    else
1291
0
        ogs_sbi_discovery_option_free(discovery_option);
1292
1293
0
    for (hi = ogs_hash_first(request->http.headers);
1294
0
            hi; hi = ogs_hash_next(hi)) {
1295
        /*
1296
         * <RFC 2616>
1297
         *  Each header field consists of a name followed by a colon (":")
1298
         *  and the field value. Field names are case-insensitive.
1299
         */
1300
0
        if (!ogs_strcasecmp(ogs_hash_this_key(hi), OGS_SBI_ACCEPT_ENCODING)) {
1301
0
            message->http.content_encoding = ogs_hash_this_val(hi);
1302
0
        } else if (!ogs_strcasecmp(
1303
0
                    ogs_hash_this_key(hi), OGS_SBI_CONTENT_TYPE)) {
1304
0
            message->http.content_type = ogs_hash_this_val(hi);
1305
0
        } else if (!ogs_strcasecmp(ogs_hash_this_key(hi), OGS_SBI_ACCEPT)) {
1306
0
            message->http.accept = ogs_hash_this_val(hi);
1307
0
        } else if (!ogs_strcasecmp(ogs_hash_this_key(hi),
1308
0
                    OGS_SBI_CUSTOM_CALLBACK)) {
1309
0
            message->http.custom.callback = ogs_hash_this_val(hi);
1310
0
        }
1311
0
    }
1312
1313
0
    if (parse_content(message, &request->http) != OGS_OK) {
1314
0
        ogs_error("parse_content() failed");
1315
0
        return OGS_ERROR;
1316
0
    }
1317
1318
0
    return OGS_OK;
1319
0
}
1320
1321
int ogs_sbi_parse_response(
1322
        ogs_sbi_message_t *message, ogs_sbi_response_t *response)
1323
22.2k
{
1324
22.2k
    int rv;
1325
22.2k
    ogs_hash_index_t *hi;
1326
1327
22.2k
    ogs_assert(response);
1328
22.2k
    ogs_assert(message);
1329
1330
22.2k
    rv = ogs_sbi_parse_header(message, &response->h);
1331
22.2k
    if (rv != OGS_OK) {
1332
0
        ogs_error("ogs_sbi_parse_header() failed");
1333
0
        return OGS_ERROR;
1334
0
    }
1335
1336
22.2k
    for (hi = ogs_hash_first(response->http.headers);
1337
44.4k
            hi; hi = ogs_hash_next(hi)) {
1338
22.2k
        if (!ogs_strcasecmp(ogs_hash_this_key(hi), OGS_SBI_CONTENT_TYPE)) {
1339
22.2k
            message->http.content_type = ogs_hash_this_val(hi);
1340
22.2k
        } else if (!ogs_strcasecmp(ogs_hash_this_key(hi), OGS_SBI_LOCATION)) {
1341
0
            message->http.location = ogs_hash_this_val(hi);
1342
0
        }
1343
22.2k
    }
1344
1345
22.2k
    message->res_status = response->status;
1346
1347
22.2k
    if (parse_content(message, &response->http) != OGS_OK) {
1348
12.3k
        ogs_error("parse_content() failed");
1349
12.3k
        return OGS_ERROR;
1350
12.3k
    }
1351
1352
9.92k
    return OGS_OK;
1353
22.2k
}
1354
1355
ogs_pkbuf_t *ogs_sbi_find_part_by_content_id(
1356
        ogs_sbi_message_t *message, char *content_id)
1357
0
{
1358
0
    int i;
1359
1360
0
    ogs_assert(message);
1361
0
    ogs_assert(content_id);
1362
1363
0
    for (i = 0; i < message->num_of_part; i++) {
1364
0
        if (message->part[i].content_id &&
1365
0
            strcmp(message->part[i].content_id, content_id) == 0)
1366
0
            return message->part[i].pkbuf;
1367
0
    }
1368
1369
0
    return NULL;
1370
0
}
1371
1372
int ogs_sbi_parse_header(ogs_sbi_message_t *message, ogs_sbi_header_t *header)
1373
22.2k
{
1374
22.2k
    struct yuarel yuarel;
1375
22.2k
    char *saveptr = NULL;
1376
22.2k
    char *uri = NULL, *p = NULL;
1377
1378
22.2k
    char *component = NULL;
1379
22.2k
    int i = 0;
1380
1381
22.2k
    ogs_assert(message);
1382
22.2k
    ogs_assert(header);
1383
1384
22.2k
    memset(message, 0, sizeof(ogs_sbi_message_t));
1385
1386
22.2k
    message->h.method = header->method;
1387
22.2k
    message->h.uri = header->uri;
1388
22.2k
    ogs_assert(message->h.uri);
1389
1390
22.2k
    uri = ogs_strdup(header->uri);
1391
22.2k
    ogs_assert(uri);
1392
22.2k
    p = uri;
1393
1394
22.2k
    if (p[0] != '/') {
1395
0
        int rv = yuarel_parse(&yuarel, p);
1396
0
        if (rv != OGS_OK) {
1397
0
            ogs_error("yuarel_parse() failed");
1398
0
            ogs_free(uri);
1399
0
            return OGS_ERROR;
1400
0
        }
1401
1402
0
        p = yuarel.path;
1403
0
    }
1404
1405
22.2k
    header->service.name = ogs_sbi_parse_uri(p, "/", &saveptr);
1406
22.2k
    if (!header->service.name) {
1407
0
        ogs_error("ogs_sbi_parse_uri() failed");
1408
0
        ogs_free(uri);
1409
0
        return OGS_ERROR;
1410
0
    }
1411
22.2k
    message->h.service.name = header->service.name;
1412
1413
22.2k
    header->api.version = ogs_sbi_parse_uri(NULL, "/", &saveptr);
1414
22.2k
    if (!header->api.version) {
1415
0
        ogs_error("ogs_sbi_parse_uri() failed");
1416
0
        ogs_free(uri);
1417
0
        return OGS_ERROR;
1418
0
    }
1419
22.2k
    message->h.api.version = header->api.version;
1420
1421
62.4k
    for (i = 0; i < OGS_SBI_MAX_NUM_OF_RESOURCE_COMPONENT &&
1422
62.4k
            (component = ogs_sbi_parse_uri(NULL, "/", &saveptr)) != NULL;
1423
40.1k
         i++) {
1424
40.1k
        header->resource.component[i] = component;
1425
40.1k
        message->h.resource.component[i] = component;
1426
40.1k
    }
1427
1428
22.2k
    ogs_free(uri);
1429
1430
22.2k
    return OGS_OK;
1431
22.2k
}
1432
1433
void ogs_sbi_header_free(ogs_sbi_header_t *h)
1434
22.2k
{
1435
22.2k
    int i;
1436
22.2k
    ogs_assert(h);
1437
1438
22.2k
    if (h->method) ogs_free(h->method);
1439
22.2k
    if (h->service.name) ogs_free(h->service.name);
1440
22.2k
    if (h->api.version) ogs_free(h->api.version);
1441
1442
62.4k
    for (i = 0; i < OGS_SBI_MAX_NUM_OF_RESOURCE_COMPONENT &&
1443
62.4k
                        h->resource.component[i]; i++)
1444
40.1k
        ogs_free(h->resource.component[i]);
1445
22.2k
}
1446
1447
void ogs_sbi_http_hash_free(ogs_hash_t *hash)
1448
44.4k
{
1449
44.4k
    ogs_hash_index_t *hi;
1450
1451
44.4k
    ogs_assert(hash);
1452
1453
66.7k
    for (hi = ogs_hash_first(hash); hi; hi = ogs_hash_next(hi)) {
1454
22.2k
        char *key = (char *)ogs_hash_this_key(hi);
1455
22.2k
        char *val = ogs_hash_this_val(hi);
1456
22.2k
        ogs_hash_set(hash, key, strlen(key), NULL);
1457
22.2k
        ogs_free(key);
1458
22.2k
        ogs_free(val);
1459
22.2k
    }
1460
44.4k
    ogs_hash_destroy(hash);
1461
44.4k
}
1462
1463
static char *build_json(ogs_sbi_message_t *message)
1464
0
{
1465
0
    char *content = NULL;
1466
0
    cJSON *item = NULL;
1467
1468
0
    ogs_assert(message);
1469
1470
0
    if (message->ProblemDetails) {
1471
0
        item = OpenAPI_problem_details_convertToJSON(message->ProblemDetails);
1472
0
        ogs_assert(item);
1473
0
    } else if (message->NFProfile) {
1474
0
        item = OpenAPI_nf_profile_convertToJSON(message->NFProfile);
1475
0
        ogs_assert(item);
1476
0
    } else if (message->PatchItemList) {
1477
0
        OpenAPI_lnode_t *node = NULL;
1478
1479
0
        item = cJSON_CreateArray();
1480
0
        ogs_assert(item);
1481
1482
0
        OpenAPI_list_for_each(message->PatchItemList, node) {
1483
0
            cJSON *patchItem = OpenAPI_patch_item_convertToJSON(node->data);
1484
0
            ogs_assert(patchItem);
1485
0
            cJSON_AddItemToArray(item, patchItem);
1486
0
        }
1487
0
    } else if (message->SubscriptionData) {
1488
0
        item = OpenAPI_subscription_data_convertToJSON(
1489
0
                message->SubscriptionData);
1490
0
        ogs_assert(item);
1491
0
    } else if (message->NotificationData) {
1492
0
        item = OpenAPI_notification_data_convertToJSON(
1493
0
                message->NotificationData);
1494
0
        ogs_assert(item);
1495
0
    } else if (message->SearchResult) {
1496
0
        item = OpenAPI_search_result_convertToJSON(message->SearchResult);
1497
0
        ogs_assert(item);
1498
0
    } else if (message->links) {
1499
0
        item = ogs_sbi_links_convertToJSON(message->links);
1500
0
        ogs_assert(item);
1501
0
    } else if (message->AuthenticationInfo) {
1502
0
        item = OpenAPI_authentication_info_convertToJSON(
1503
0
                message->AuthenticationInfo);
1504
0
        ogs_assert(item);
1505
0
    } else if (message->AuthenticationInfoRequest) {
1506
0
        item = OpenAPI_authentication_info_request_convertToJSON(
1507
0
                message->AuthenticationInfoRequest);
1508
0
        ogs_assert(item);
1509
0
    } else if (message->AuthenticationInfoResult) {
1510
0
        item = OpenAPI_authentication_info_result_convertToJSON(
1511
0
                message->AuthenticationInfoResult);
1512
0
        ogs_assert(item);
1513
0
    } else if (message->AuthenticationSubscription) {
1514
0
        item = OpenAPI_authentication_subscription_convertToJSON(
1515
0
                message->AuthenticationSubscription);
1516
0
        ogs_assert(item);
1517
0
    } else if (message->UeAuthenticationCtx) {
1518
0
        item = OpenAPI_ue_authentication_ctx_convertToJSON(
1519
0
                message->UeAuthenticationCtx);
1520
0
        ogs_assert(item);
1521
0
    } else if (message->ConfirmationData) {
1522
0
        item = OpenAPI_confirmation_data_convertToJSON(
1523
0
                message->ConfirmationData);
1524
0
        ogs_assert(item);
1525
0
    } else if (message->ConfirmationDataResponse) {
1526
0
        item = OpenAPI_confirmation_data_response_convertToJSON(
1527
0
                message->ConfirmationDataResponse);
1528
0
        ogs_assert(item);
1529
0
    } else if (message->AuthEvent) {
1530
0
        item = OpenAPI_auth_event_convertToJSON(message->AuthEvent);
1531
0
        ogs_assert(item);
1532
0
    } else if (message->Amf3GppAccessRegistration) {
1533
0
        item = OpenAPI_amf3_gpp_access_registration_convertToJSON(
1534
0
                message->Amf3GppAccessRegistration);
1535
0
        ogs_assert(item);
1536
0
    } else if (message->Amf3GppAccessRegistrationModification) {
1537
0
        item = OpenAPI_amf3_gpp_access_registration_modification_convertToJSON(
1538
0
                message->Amf3GppAccessRegistrationModification);
1539
0
        ogs_assert(item);
1540
0
    } else if (message->SmfRegistration) {
1541
0
        item = OpenAPI_smf_registration_convertToJSON(message->SmfRegistration);
1542
0
        ogs_assert(item);
1543
0
    } else if (message->ProvisionedDataSets) {
1544
0
        item = OpenAPI_provisioned_data_sets_convertToJSON(
1545
0
                message->ProvisionedDataSets);
1546
0
        ogs_assert(item);
1547
0
    } else if (message->Nssai) {
1548
0
        item = OpenAPI_nssai_convertToJSON(message->Nssai);
1549
0
        ogs_assert(item);
1550
0
    } else if (message->AccessAndMobilitySubscriptionData) {
1551
0
        item = OpenAPI_access_and_mobility_subscription_data_convertToJSON(
1552
0
                message->AccessAndMobilitySubscriptionData);
1553
0
        ogs_assert(item);
1554
0
    } else if (message->SmfSelectionSubscriptionData) {
1555
0
        item = OpenAPI_smf_selection_subscription_data_convertToJSON(
1556
0
                message->SmfSelectionSubscriptionData);
1557
0
        ogs_assert(item);
1558
0
    } else if (message->UeContextInSmfData) {
1559
0
        item = OpenAPI_ue_context_in_smf_data_convertToJSON(
1560
0
                message->UeContextInSmfData);
1561
0
        ogs_assert(item);
1562
0
    } else if (message->SmContextCreateData) {
1563
0
        item = OpenAPI_sm_context_create_data_convertToJSON(
1564
0
                message->SmContextCreateData);
1565
0
        ogs_assert(item);
1566
0
    } else if (message->SmContextCreatedData) {
1567
0
        item = OpenAPI_sm_context_created_data_convertToJSON(
1568
0
                message->SmContextCreatedData);
1569
0
        ogs_assert(item);
1570
0
    } else if (message->SmContextCreateError) {
1571
0
        item = OpenAPI_sm_context_create_error_convertToJSON(
1572
0
                message->SmContextCreateError);
1573
0
        ogs_assert(item);
1574
0
    } else if (message->SmContextUpdateData) {
1575
0
        item = OpenAPI_sm_context_update_data_convertToJSON(
1576
0
                message->SmContextUpdateData);
1577
0
        ogs_assert(item);
1578
0
    } else if (message->SmContextUpdatedData) {
1579
0
        item = OpenAPI_sm_context_updated_data_convertToJSON(
1580
0
                message->SmContextUpdatedData);
1581
0
        ogs_assert(item);
1582
0
    } else if (message->SmContextUpdateError) {
1583
0
        item = OpenAPI_sm_context_update_error_convertToJSON(
1584
0
                message->SmContextUpdateError);
1585
0
        ogs_assert(item);
1586
0
    } else if (message->SmContextReleaseData) {
1587
0
        item = OpenAPI_sm_context_release_data_convertToJSON(
1588
0
                message->SmContextReleaseData);
1589
0
        ogs_assert(item);
1590
0
    } else if (message->SmContextReleasedData) {
1591
0
        item = OpenAPI_sm_context_released_data_convertToJSON(
1592
0
                message->SmContextReleasedData);
1593
0
        ogs_assert(item);
1594
0
    } else if (message->PduSessionCreateData) {
1595
0
        item = OpenAPI_pdu_session_create_data_convertToJSON(
1596
0
                message->PduSessionCreateData);
1597
0
        ogs_assert(item);
1598
0
    } else if (message->PduSessionCreatedData) {
1599
0
        item = OpenAPI_pdu_session_created_data_convertToJSON(
1600
0
                message->PduSessionCreatedData);
1601
0
        ogs_assert(item);
1602
0
    } else if (message->PduSessionCreateError) {
1603
0
        item = OpenAPI_pdu_session_create_error_convertToJSON(
1604
0
                message->PduSessionCreateError);
1605
0
        ogs_assert(item);
1606
0
    } else if (message->HsmfUpdateData) {
1607
0
        item = OpenAPI_hsmf_update_data_convertToJSON(
1608
0
                message->HsmfUpdateData);
1609
0
        ogs_assert(item);
1610
0
    } else if (message->HsmfUpdatedData) {
1611
0
        item = OpenAPI_hsmf_updated_data_convertToJSON(
1612
0
                message->HsmfUpdatedData);
1613
0
        ogs_assert(item);
1614
0
    } else if (message->HsmfUpdateError) {
1615
0
        item = OpenAPI_hsmf_update_error_convertToJSON(
1616
0
                message->HsmfUpdateError);
1617
0
        ogs_assert(item);
1618
0
    } else if (message->VsmfUpdateData) {
1619
0
        item = OpenAPI_vsmf_update_data_convertToJSON(
1620
0
                message->VsmfUpdateData);
1621
0
        ogs_assert(item);
1622
0
    } else if (message->VsmfUpdatedData) {
1623
0
        item = OpenAPI_vsmf_updated_data_convertToJSON(
1624
0
                message->VsmfUpdatedData);
1625
0
        ogs_assert(item);
1626
0
    } else if (message->VsmfUpdateError) {
1627
0
        item = OpenAPI_vsmf_update_error_convertToJSON(
1628
0
                message->VsmfUpdateError);
1629
0
        ogs_assert(item);
1630
0
    } else if (message->ReleaseData) {
1631
0
        item = OpenAPI_release_data_convertToJSON(message->ReleaseData);
1632
0
        ogs_assert(item);
1633
0
    } else if (message->ReleasedData) {
1634
0
        item = OpenAPI_released_data_convertToJSON(message->ReleasedData);
1635
0
        ogs_assert(item);
1636
0
    } else if (message->StatusNotification) {
1637
0
        item = OpenAPI_status_notification_convertToJSON(
1638
0
                message->StatusNotification);
1639
0
        ogs_assert(item);
1640
0
    } else if (message->SessionManagementSubscriptionDataList) {
1641
0
        OpenAPI_lnode_t *node = NULL;
1642
1643
0
        item = cJSON_CreateArray();
1644
0
        ogs_assert(item);
1645
1646
0
        OpenAPI_list_for_each(message->SessionManagementSubscriptionDataList, node) {
1647
0
            cJSON *smSubDataItem = 
1648
0
                OpenAPI_session_management_subscription_data_convertToJSON(node->data);
1649
0
            ogs_assert(smSubDataItem);
1650
0
            cJSON_AddItemToArray(item, smSubDataItem);
1651
0
        }
1652
0
    } else if (message->N1N2MessageTransferReqData) {
1653
0
        item = OpenAPI_n1_n2_message_transfer_req_data_convertToJSON(
1654
0
                message->N1N2MessageTransferReqData);
1655
0
        ogs_assert(item);
1656
0
    } else if (message->N1N2MessageTransferRspData) {
1657
0
        item = OpenAPI_n1_n2_message_transfer_rsp_data_convertToJSON(
1658
0
                message->N1N2MessageTransferRspData);
1659
0
        ogs_assert(item);
1660
0
    } else if (message->N1N2MsgTxfrFailureNotification) {
1661
0
        item = OpenAPI_n1_n2_msg_txfr_failure_notification_convertToJSON(
1662
0
                message->N1N2MsgTxfrFailureNotification);
1663
0
        ogs_assert(item);
1664
0
    } else if (message->SmContextStatusNotification) {
1665
0
        item = OpenAPI_sm_context_status_notification_convertToJSON(
1666
0
                message->SmContextStatusNotification);
1667
0
        ogs_assert(item);
1668
0
    } else if (message->PolicyAssociationRequest) {
1669
0
        item = OpenAPI_policy_association_request_convertToJSON(
1670
0
                message->PolicyAssociationRequest);
1671
0
        ogs_assert(item);
1672
0
    } else if (message->PolicyAssociation) {
1673
0
        item = OpenAPI_policy_association_convertToJSON(
1674
0
                message->PolicyAssociation);
1675
0
        ogs_assert(item);
1676
0
    } else if (message->AmPolicyData) {
1677
0
        item = OpenAPI_am_policy_data_convertToJSON(message->AmPolicyData);
1678
0
        ogs_assert(item);
1679
0
    } else if (message->SmPolicyContextData) {
1680
0
        item = OpenAPI_sm_policy_context_data_convertToJSON(
1681
0
                message->SmPolicyContextData);
1682
0
        ogs_assert(item);
1683
0
    } else if (message->SmPolicyDecision) {
1684
0
        item = OpenAPI_sm_policy_decision_convertToJSON(
1685
0
                message->SmPolicyDecision);
1686
0
        ogs_assert(item);
1687
0
    } else if (message->SmPolicyData) {
1688
0
        item = OpenAPI_sm_policy_data_convertToJSON(message->SmPolicyData);
1689
0
        ogs_assert(item);
1690
0
    } else if (message->SmPolicyDeleteData) {
1691
0
        item = OpenAPI_sm_policy_delete_data_convertToJSON(
1692
0
                message->SmPolicyDeleteData);
1693
0
        ogs_assert(item);
1694
0
    } else if (message->AuthorizedNetworkSliceInfo) {
1695
0
        item = OpenAPI_authorized_network_slice_info_convertToJSON(
1696
0
                message->AuthorizedNetworkSliceInfo);
1697
0
        ogs_assert(item);
1698
0
    } else if (message->PcfBinding) {
1699
0
        item = OpenAPI_pcf_binding_convertToJSON(message->PcfBinding);
1700
0
        ogs_assert(item);
1701
0
    } else if (message->AppSessionContext) {
1702
0
        item = OpenAPI_app_session_context_convertToJSON(
1703
0
                message->AppSessionContext);
1704
0
        ogs_assert(item);
1705
0
    } else if (message->AppSessionContextUpdateDataPatch) {
1706
0
        item = OpenAPI_app_session_context_update_data_patch_convertToJSON(
1707
0
                message->AppSessionContextUpdateDataPatch);
1708
0
        ogs_assert(item);
1709
0
    } else if (message->TerminationInfo) {
1710
0
        item = OpenAPI_termination_info_convertToJSON(
1711
0
                message->TerminationInfo);
1712
0
        ogs_assert(item);
1713
0
    } else if (message->SmPolicyNotification) {
1714
0
        item = OpenAPI_sm_policy_notification_convertToJSON(
1715
0
                message->SmPolicyNotification);
1716
0
        ogs_assert(item);
1717
0
    } else if (message->TerminationNotification) {
1718
0
        item = OpenAPI_termination_notification_convertToJSON(
1719
0
                message->TerminationNotification);
1720
0
        ogs_assert(item);
1721
0
    } else if (message->DeregistrationData) {
1722
0
        item = OpenAPI_deregistration_data_convertToJSON(
1723
0
                message->DeregistrationData);
1724
0
        ogs_assert(item);
1725
0
    } else if (message->SDMSubscription) {
1726
0
        item = OpenAPI_sdm_subscription_convertToJSON(
1727
0
                message->SDMSubscription);
1728
0
        ogs_assert(item);
1729
0
    } else if (message->ModificationNotification) {
1730
0
        item = OpenAPI_modification_notification_convertToJSON(
1731
0
            message->ModificationNotification);
1732
0
        ogs_assert(item);
1733
0
    } else if (message->SecNegotiateReqData) {
1734
0
        item = OpenAPI_sec_negotiate_req_data_convertToJSON(
1735
0
            message->SecNegotiateReqData);
1736
0
        ogs_assert(item);
1737
0
    } else if (message->SecNegotiateRspData) {
1738
0
        item = OpenAPI_sec_negotiate_rsp_data_convertToJSON(
1739
0
            message->SecNegotiateRspData);
1740
0
        ogs_assert(item);
1741
0
    } else if (message->UeContextTransferReqData) {
1742
0
        item = OpenAPI_ue_context_transfer_req_data_convertToJSON(
1743
0
                message->UeContextTransferReqData);
1744
0
        ogs_assert(item);
1745
0
    } else if (message->UeContextTransferRspData) {
1746
0
        item = OpenAPI_ue_context_transfer_rsp_data_convertToJSON(
1747
0
                message->UeContextTransferRspData);
1748
0
        ogs_assert(item);
1749
0
    } else if (message->UeRegStatusUpdateReqData) {
1750
0
        item = OpenAPI_ue_reg_status_update_req_data_convertToJSON(
1751
0
                message->UeRegStatusUpdateReqData);
1752
0
        ogs_assert(item);
1753
0
    } else if (message->UeRegStatusUpdateRspData) {
1754
0
        item = OpenAPI_ue_reg_status_update_rsp_data_convertToJSON(
1755
0
                message->UeRegStatusUpdateRspData);
1756
0
        ogs_assert(item);
1757
0
    }
1758
1759
0
    if (item) {
1760
0
        content = cJSON_PrintUnformatted(item);
1761
0
        ogs_assert(content);
1762
0
        ogs_log_print(OGS_LOG_TRACE, "%s", content);
1763
0
        cJSON_Delete(item);
1764
0
    }
1765
1766
0
    return content;
1767
0
}
1768
1769
static int parse_json(ogs_sbi_message_t *message,
1770
        char *content_type, char *json)
1771
22.2k
{
1772
22.2k
    int rv = OGS_OK;
1773
22.2k
    int service_name_id = OpenAPI_service_name_NULL;
1774
22.2k
    cJSON *item = NULL;
1775
1776
22.2k
    ogs_assert(message);
1777
1778
22.2k
    if (!json)
1779
0
        return OGS_OK;
1780
1781
22.2k
    if (!content_type) {
1782
0
        ogs_error("No Content-type");
1783
0
        return OGS_ERROR;
1784
0
    }
1785
1786
22.2k
    ogs_log_print(OGS_LOG_TRACE, "%s", json);
1787
22.2k
    item = cJSON_Parse(json);
1788
22.2k
    if (!item) {
1789
1.59k
        ogs_error("JSON parse error [%s]", json);
1790
1.59k
        return OGS_ERROR;
1791
1.59k
    }
1792
1793
20.6k
    if (content_type &&
1794
20.6k
        !strncmp(content_type, OGS_SBI_CONTENT_PROBLEM_TYPE,
1795
20.6k
            strlen(OGS_SBI_CONTENT_PROBLEM_TYPE))) {
1796
0
        message->ProblemDetails = OpenAPI_problem_details_parseFromJSON(item);
1797
20.6k
    } else if (content_type &&
1798
20.6k
                !strncmp(content_type, OGS_SBI_CONTENT_PATCH_TYPE,
1799
20.6k
                    strlen(OGS_SBI_CONTENT_PATCH_TYPE))) {
1800
0
        if (item) {
1801
0
            OpenAPI_patch_item_t *patch_item = NULL;
1802
0
            cJSON *patchJSON = NULL;
1803
0
            message->PatchItemList = OpenAPI_list_create();
1804
0
            cJSON_ArrayForEach(patchJSON, item) {
1805
0
                if (!cJSON_IsObject(patchJSON)) {
1806
0
                    rv = OGS_ERROR;
1807
0
                    ogs_error("Unknown JSON");
1808
0
                    goto cleanup;
1809
0
                }
1810
1811
0
                patch_item = OpenAPI_patch_item_parseFromJSON(patchJSON);
1812
0
                if (!patch_item) {
1813
0
                    rv = OGS_ERROR;
1814
0
                    ogs_error("No PatchItem");
1815
0
                    goto cleanup;
1816
0
                }
1817
0
                OpenAPI_list_add(message->PatchItemList, patch_item);
1818
0
            }
1819
0
        }
1820
20.6k
    } else {
1821
20.6k
        service_name_id = ogs_sbi_service_name_id_from_string(
1822
20.6k
                message->h.service.name);
1823
20.6k
        switch (service_name_id) {
1824
17.1k
        case OpenAPI_service_name_nnrf_nfm:
1825
1826
17.1k
            SWITCH(message->h.resource.component[0])
1827
17.1k
            CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES)
1828
17.1k
                if (message->h.resource.component[1]) {
1829
17.1k
                    if (message->res_status < 300) {
1830
17.1k
                        message->NFProfile =
1831
17.1k
                            OpenAPI_nf_profile_parseFromJSON(item);
1832
17.1k
                        if (!message->NFProfile) {
1833
8.94k
                            rv = OGS_ERROR;
1834
8.94k
                            ogs_error("JSON parse error");
1835
8.94k
                        }
1836
17.1k
                    } else {
1837
0
                        ogs_error("HTTP ERROR Status : %d", message->res_status);
1838
0
                    }
1839
17.1k
                } else {
1840
0
                    if (message->res_status < 300) {
1841
0
                        message->links = ogs_sbi_links_parseFromJSON(item);
1842
0
                        if (!message->links) {
1843
0
                            rv = OGS_ERROR;
1844
0
                            ogs_error("JSON parse error");
1845
0
                        }
1846
0
                    } else {
1847
0
                        ogs_error("HTTP ERROR Status : %d", message->res_status);
1848
0
                    }
1849
0
                }
1850
17.1k
                break;
1851
1852
17.1k
            CASE(OGS_SBI_RESOURCE_NAME_SUBSCRIPTIONS)
1853
0
                if (message->res_status < 300) {
1854
0
                    message->SubscriptionData =
1855
0
                        OpenAPI_subscription_data_parseFromJSON(item);
1856
0
                    if (!message->SubscriptionData) {
1857
0
                        rv = OGS_ERROR;
1858
0
                        ogs_error("JSON parse error");
1859
0
                    }
1860
0
                } else {
1861
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
1862
0
                }
1863
0
                break;
1864
1865
0
            CASE(OGS_SBI_RESOURCE_NAME_NF_STATUS_NOTIFY)
1866
0
                if (message->res_status < 300) {
1867
0
                    message->NotificationData =
1868
0
                        OpenAPI_notification_data_parseFromJSON(item);
1869
0
                    if (!message->NotificationData) {
1870
0
                        rv = OGS_ERROR;
1871
0
                        ogs_error("JSON parse error");
1872
0
                    }
1873
0
                } else {
1874
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
1875
0
                }
1876
0
                break;
1877
1878
0
            DEFAULT
1879
0
                rv = OGS_ERROR;
1880
0
                ogs_error("Unknown resource name [%s]",
1881
0
                        message->h.resource.component[0]);
1882
0
            END
1883
17.1k
            break;
1884
1885
0
        case OpenAPI_service_name_nnrf_disc:
1886
0
            SWITCH(message->h.resource.component[0])
1887
0
            CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES)
1888
0
                if (message->res_status < 300) {
1889
0
                    message->SearchResult =
1890
0
                        OpenAPI_search_result_parseFromJSON(item);
1891
0
                    if (!message->SearchResult) {
1892
0
                        rv = OGS_ERROR;
1893
0
                        ogs_error("JSON parse error");
1894
0
                    }
1895
0
                } else {
1896
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
1897
0
                }
1898
0
                break;
1899
1900
0
            DEFAULT
1901
0
                rv = OGS_ERROR;
1902
0
                ogs_error("Unknown resource name [%s]",
1903
0
                        message->h.resource.component[0]);
1904
0
            END
1905
0
            break;
1906
1907
0
        case OpenAPI_service_name_nausf_auth:
1908
0
            SWITCH(message->h.resource.component[0])
1909
0
            CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS)
1910
0
                SWITCH(message->h.method)
1911
0
                CASE(OGS_SBI_HTTP_METHOD_POST)
1912
0
                    if (message->res_status == 0) {
1913
0
                        message->AuthenticationInfo =
1914
0
                            OpenAPI_authentication_info_parseFromJSON(item);
1915
0
                        if (!message->AuthenticationInfo) {
1916
0
                            rv = OGS_ERROR;
1917
0
                            ogs_error("JSON parse error");
1918
0
                        }
1919
0
                    } else if (message->res_status ==
1920
0
                            OGS_SBI_HTTP_STATUS_CREATED) {
1921
0
                        message->UeAuthenticationCtx =
1922
0
                        OpenAPI_ue_authentication_ctx_parseFromJSON(item);
1923
0
                        if (!message->UeAuthenticationCtx) {
1924
0
                            rv = OGS_ERROR;
1925
0
                            ogs_error("JSON parse error");
1926
0
                        }
1927
0
                    }
1928
0
                    break;
1929
0
                CASE(OGS_SBI_HTTP_METHOD_PUT)
1930
0
                    if (message->res_status == 0) {
1931
0
                        message->ConfirmationData =
1932
0
                            OpenAPI_confirmation_data_parseFromJSON(item);
1933
0
                        if (!message->ConfirmationData) {
1934
0
                            rv = OGS_ERROR;
1935
0
                            ogs_error("JSON parse error");
1936
0
                        }
1937
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
1938
0
                        message->ConfirmationDataResponse =
1939
0
                            OpenAPI_confirmation_data_response_parseFromJSON(
1940
0
                                    item);
1941
0
                        if (!message->ConfirmationDataResponse) {
1942
0
                            rv = OGS_ERROR;
1943
0
                            ogs_error("JSON parse error");
1944
0
                        }
1945
0
                    }
1946
0
                    break;
1947
0
                DEFAULT
1948
0
                    rv = OGS_ERROR;
1949
0
                    ogs_error("Unknown method [%s]", message->h.method);
1950
0
                END
1951
0
                break;
1952
1953
0
            DEFAULT
1954
0
                rv = OGS_ERROR;
1955
0
                ogs_error("Unknown resource name [%s]",
1956
0
                        message->h.resource.component[0]);
1957
0
            END
1958
0
            break;
1959
1960
0
        case OpenAPI_service_name_nudm_ueau:
1961
0
            SWITCH(message->h.resource.component[1])
1962
0
            CASE(OGS_SBI_RESOURCE_NAME_SECURITY_INFORMATION)
1963
0
                SWITCH(message->h.resource.component[2])
1964
0
                CASE(OGS_SBI_RESOURCE_NAME_GENERATE_AUTH_DATA)
1965
0
                    if (message->res_status == 0) {
1966
0
                        message->AuthenticationInfoRequest =
1967
0
                        OpenAPI_authentication_info_request_parseFromJSON(
1968
0
                                item);
1969
0
                        if (!message->AuthenticationInfoRequest) {
1970
0
                            rv = OGS_ERROR;
1971
0
                            ogs_error("JSON parse error");
1972
0
                        }
1973
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
1974
0
                        message->AuthenticationInfoResult =
1975
0
                        OpenAPI_authentication_info_result_parseFromJSON(
1976
0
                                item);
1977
0
                        if (!message->AuthenticationInfoResult) {
1978
0
                            rv = OGS_ERROR;
1979
0
                            ogs_error("JSON parse error");
1980
0
                        }
1981
0
                    }
1982
0
                    break;
1983
0
                DEFAULT
1984
0
                    rv = OGS_ERROR;
1985
0
                    ogs_error("Unknown resource name [%s]",
1986
0
                            message->h.resource.component[2]);
1987
0
                END
1988
0
                break;
1989
1990
0
            CASE(OGS_SBI_RESOURCE_NAME_AUTH_EVENTS)
1991
0
                if (message->res_status < 300) {
1992
0
                    message->AuthEvent = OpenAPI_auth_event_parseFromJSON(item);
1993
0
                    if (!message->AuthEvent) {
1994
0
                        rv = OGS_ERROR;
1995
0
                        ogs_error("JSON parse error");
1996
0
                    }
1997
0
                } else {
1998
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
1999
0
                }
2000
0
                break;
2001
2002
0
            DEFAULT
2003
0
                rv = OGS_ERROR;
2004
0
                ogs_error("Unknown resource name [%s]",
2005
0
                        message->h.resource.component[1]);
2006
0
            END
2007
0
            break;
2008
2009
0
        case OpenAPI_service_name_nudm_uecm:
2010
0
            SWITCH(message->h.resource.component[1])
2011
0
            CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS)
2012
0
                SWITCH(message->h.resource.component[2])
2013
0
                CASE(OGS_SBI_RESOURCE_NAME_AMF_3GPP_ACCESS)
2014
0
                    SWITCH(message->h.method)
2015
0
                    CASE(OGS_SBI_HTTP_METHOD_PUT)
2016
0
                        if (message->res_status < 300) {
2017
0
                            message->Amf3GppAccessRegistration =
2018
0
                                OpenAPI_amf3_gpp_access_registration_parseFromJSON(
2019
0
                                        item);
2020
0
                            if (!message->Amf3GppAccessRegistration) {
2021
0
                                rv = OGS_ERROR;
2022
0
                                ogs_error("JSON parse error");
2023
0
                            }
2024
0
                        } else {
2025
0
                            ogs_error("HTTP ERROR Status : %d",
2026
0
                                    message->res_status);
2027
0
                        }
2028
0
                        break;
2029
0
                    CASE(OGS_SBI_HTTP_METHOD_PATCH)
2030
0
                        if (message->res_status < 300) {
2031
0
                            message->Amf3GppAccessRegistrationModification =
2032
0
                                OpenAPI_amf3_gpp_access_registration_modification_parseFromJSON(
2033
0
                                        item);
2034
0
                            if (!message->Amf3GppAccessRegistrationModification) {
2035
0
                                rv = OGS_ERROR;
2036
0
                                ogs_error("JSON parse error");
2037
0
                            }
2038
0
                        } else {
2039
0
                            ogs_error("HTTP ERROR Status : %d",
2040
0
                                    message->res_status);
2041
0
                        }
2042
0
                        break;
2043
0
                    DEFAULT
2044
0
                        rv = OGS_ERROR;
2045
0
                        ogs_error("Unknown method [%s]", message->h.method);
2046
0
                    END
2047
0
                    break;
2048
2049
0
                CASE(OGS_SBI_RESOURCE_NAME_SMF_REGISTRATIONS)
2050
0
                    if (message->res_status < 300) {
2051
0
                        message->SmfRegistration =
2052
0
                            OpenAPI_smf_registration_parseFromJSON(item);
2053
0
                        if (!message->SmfRegistration) {
2054
0
                            rv = OGS_ERROR;
2055
0
                            ogs_error("JSON parse error");
2056
0
                        }
2057
0
                    } else {
2058
0
                        ogs_error("HTTP ERROR Status : %d",
2059
0
                                message->res_status);
2060
0
                    }
2061
0
                    break;
2062
2063
0
                DEFAULT
2064
0
                    rv = OGS_ERROR;
2065
0
                    ogs_error("Unknown resource name [%s]",
2066
0
                            message->h.resource.component[2]);
2067
0
                END
2068
0
                break;
2069
2070
0
            DEFAULT
2071
0
                rv = OGS_ERROR;
2072
0
                ogs_error("Unknown resource name [%s]",
2073
0
                        message->h.resource.component[1]);
2074
0
            END
2075
0
            break;
2076
2077
0
        case OpenAPI_service_name_nudm_sdm:
2078
0
            if (!message->h.resource.component[1]) {
2079
                /*
2080
                 * Combined SDM retrieval:
2081
                 *   GET /nudm-sdm/v2/{supi}?dataset-names=AM,SMF_SEL
2082
                 *
2083
                 * The UDM relays the ProvisionedDataSets that the UDR
2084
                 * built from the requested dataset-names, so parse the
2085
                 * whole set here in a single response.
2086
                 */
2087
0
                if (message->res_status < 300) {
2088
0
                    message->ProvisionedDataSets =
2089
0
                        OpenAPI_provisioned_data_sets_parseFromJSON(item);
2090
0
                    if (!message->ProvisionedDataSets) {
2091
0
                        rv = OGS_ERROR;
2092
0
                        ogs_error("JSON parse error");
2093
0
                    }
2094
0
                } else {
2095
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2096
0
                }
2097
0
                break;
2098
0
            }
2099
2100
0
            SWITCH(message->h.resource.component[1])
2101
0
            CASE(OGS_SBI_RESOURCE_NAME_NSSAI)
2102
0
                if (message->res_status < 300) {
2103
0
                    message->Nssai = OpenAPI_nssai_parseFromJSON(item);
2104
0
                    if (!message->Nssai) {
2105
0
                        rv = OGS_ERROR;
2106
0
                        ogs_error("JSON parse error");
2107
0
                    }
2108
0
                } else {
2109
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2110
0
                }
2111
0
                break;
2112
2113
0
            CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
2114
0
                if (message->res_status < 300) {
2115
0
                    message->AccessAndMobilitySubscriptionData =
2116
0
                        OpenAPI_access_and_mobility_subscription_data_parseFromJSON(
2117
0
                                item);
2118
0
                    if (!message->AccessAndMobilitySubscriptionData) {
2119
0
                        rv = OGS_ERROR;
2120
0
                        ogs_error("JSON parse error");
2121
0
                    }
2122
0
                } else {
2123
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2124
0
                }
2125
0
                break;
2126
2127
0
            CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA)
2128
0
                if (message->res_status < 300) {
2129
0
                    message->SmfSelectionSubscriptionData =
2130
0
                        OpenAPI_smf_selection_subscription_data_parseFromJSON(
2131
0
                                item);
2132
0
                    if (!message->SmfSelectionSubscriptionData) {
2133
0
                        rv = OGS_ERROR;
2134
0
                        ogs_error("JSON parse error");
2135
0
                    }
2136
0
                } else {
2137
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2138
0
                }
2139
0
                break;
2140
2141
0
            CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
2142
0
                if (message->res_status < 300) {
2143
0
                    message->UeContextInSmfData =
2144
0
                        OpenAPI_ue_context_in_smf_data_parseFromJSON(item);
2145
0
                    if (!message->UeContextInSmfData) {
2146
0
                        rv = OGS_ERROR;
2147
0
                        ogs_error("JSON parse error");
2148
0
                    }
2149
0
                } else {
2150
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2151
0
                }
2152
0
                break;
2153
2154
0
            CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
2155
0
                if (message->res_status < 300) {
2156
0
                    if (item) {
2157
0
                        OpenAPI_session_management_subscription_data_t
2158
0
                            *smsub_item = NULL;
2159
0
                        cJSON *smsubJSON = NULL;
2160
0
                        message->SessionManagementSubscriptionDataList =
2161
0
                            OpenAPI_list_create();
2162
0
                        cJSON_ArrayForEach(smsubJSON, item) {
2163
0
                            if (!cJSON_IsObject(smsubJSON)) {
2164
0
                                rv = OGS_ERROR;
2165
0
                                ogs_error("Unknown JSON");
2166
0
                                goto cleanup;
2167
0
                            }
2168
2169
0
                            smsub_item = OpenAPI_session_management_subscription_data_parseFromJSON(smsubJSON);
2170
0
                            if (!smsub_item) {
2171
0
                                rv = OGS_ERROR;
2172
0
                                ogs_error("No smsub_item");
2173
0
                                goto cleanup;
2174
0
                            }
2175
0
                            OpenAPI_list_add(message->SessionManagementSubscriptionDataList, smsub_item);
2176
0
                        }
2177
0
                    }
2178
0
                } else {
2179
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2180
0
                }
2181
0
                break;
2182
2183
0
            CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS)
2184
0
                if (message->res_status < 300) {
2185
0
                    message->SDMSubscription =
2186
0
                        OpenAPI_sdm_subscription_parseFromJSON(item);
2187
0
                    if (!message->SDMSubscription) {
2188
0
                        rv = OGS_ERROR;
2189
0
                        ogs_error("JSON parse error");
2190
0
                    }
2191
0
                } else {
2192
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
2193
0
                }
2194
0
                break;
2195
2196
0
            DEFAULT
2197
0
                rv = OGS_ERROR;
2198
0
                ogs_error("Unknown resource name [%s]",
2199
0
                        message->h.resource.component[1]);
2200
0
            END
2201
0
            break;
2202
2203
0
        case OpenAPI_service_name_nudr_dr:
2204
0
            SWITCH(message->h.resource.component[0])
2205
0
            CASE(OGS_SBI_RESOURCE_NAME_SUBSCRIPTION_DATA)
2206
0
                SWITCH(message->h.resource.component[2])
2207
0
                CASE(OGS_SBI_RESOURCE_NAME_AUTHENTICATION_DATA)
2208
0
                    SWITCH(message->h.resource.component[3])
2209
0
                    CASE(OGS_SBI_RESOURCE_NAME_AUTHENTICATION_SUBSCRIPTION)
2210
0
                        if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2211
0
                            message->AuthenticationSubscription =
2212
0
                                OpenAPI_authentication_subscription_parseFromJSON(item);
2213
0
                            if (!message->AuthenticationSubscription) {
2214
0
                                rv = OGS_ERROR;
2215
0
                                ogs_error("JSON parse error");
2216
0
                            }
2217
0
                        }
2218
0
                        break;
2219
0
                    CASE(OGS_SBI_RESOURCE_NAME_AUTHENTICATION_STATUS)
2220
0
                        if (message->res_status < 300) {
2221
0
                            message->AuthEvent =
2222
0
                                OpenAPI_auth_event_parseFromJSON(item);
2223
0
                            if (!message->AuthEvent) {
2224
0
                                rv = OGS_ERROR;
2225
0
                                ogs_error("JSON parse error");
2226
0
                            }
2227
0
                        } else {
2228
0
                            ogs_error("HTTP ERROR Status : %d",
2229
0
                                    message->res_status);
2230
0
                        }
2231
0
                        break;
2232
0
                    DEFAULT
2233
0
                        rv = OGS_ERROR;
2234
0
                        ogs_error("Unknown resource name [%s]",
2235
0
                                message->h.resource.component[3]);
2236
0
                    END
2237
0
                    break;
2238
2239
0
                CASE(OGS_SBI_RESOURCE_NAME_CONTEXT_DATA)
2240
0
                    SWITCH(message->h.resource.component[3])
2241
0
                    CASE(OGS_SBI_RESOURCE_NAME_AMF_3GPP_ACCESS)
2242
0
                        if (message->res_status < 300) {
2243
0
                            message->Amf3GppAccessRegistration =
2244
0
                                OpenAPI_amf3_gpp_access_registration_parseFromJSON(
2245
0
                                        item);
2246
0
                            if (!message->Amf3GppAccessRegistration) {
2247
0
                                rv = OGS_ERROR;
2248
0
                                ogs_error("JSON parse error");
2249
0
                            }
2250
0
                        } else {
2251
0
                            ogs_error("HTTP ERROR Status : %d",
2252
0
                                    message->res_status);
2253
0
                        }
2254
0
                        break;
2255
0
                    CASE(OGS_SBI_RESOURCE_NAME_SMF_REGISTRATIONS)
2256
0
                        if (message->res_status < 300) {
2257
0
                            message->SmfRegistration =
2258
0
                                OpenAPI_smf_registration_parseFromJSON(item);
2259
0
                            if (!message->SmfRegistration) {
2260
0
                                rv = OGS_ERROR;
2261
0
                                ogs_error("JSON parse error");
2262
0
                            }
2263
0
                        } else {
2264
0
                            ogs_error("HTTP ERROR Status : %d",
2265
0
                                    message->res_status);
2266
0
                        }
2267
0
                        break;
2268
0
                    DEFAULT
2269
0
                        rv = OGS_ERROR;
2270
0
                        ogs_error("Unknown resource name [%s]",
2271
0
                                message->h.resource.component[3]);
2272
0
                    END
2273
0
                    break;
2274
2275
0
                DEFAULT
2276
0
                    SWITCH(message->h.resource.component[3])
2277
0
                    CASE(OGS_SBI_RESOURCE_NAME_PROVISIONED_DATA)
2278
0
                        if (!message->h.resource.component[4]) {
2279
0
                            if (message->res_status < 300) {
2280
0
                                message->ProvisionedDataSets =
2281
0
                                    OpenAPI_provisioned_data_sets_parseFromJSON(item);
2282
0
                                if (!message->ProvisionedDataSets) {
2283
0
                                    rv = OGS_ERROR;
2284
0
                                    ogs_error("JSON parse error");
2285
0
                                }
2286
0
                            } else {
2287
0
                                ogs_error("HTTP ERROR Status : %d",
2288
0
                                        message->res_status);
2289
0
                            }
2290
0
                            break;
2291
0
                        }
2292
0
                        SWITCH(message->h.resource.component[4])
2293
0
                        CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
2294
0
                            if (message->res_status < 300) {
2295
0
                                message->AccessAndMobilitySubscriptionData =
2296
0
                                    OpenAPI_access_and_mobility_subscription_data_parseFromJSON(item);
2297
0
                                if (!message->
2298
0
                                        AccessAndMobilitySubscriptionData) {
2299
0
                                    rv = OGS_ERROR;
2300
0
                                    ogs_error("JSON parse error");
2301
0
                                }
2302
0
                            } else {
2303
0
                                ogs_error("HTTP ERROR Status : %d",
2304
0
                                        message->res_status);
2305
0
                            }
2306
0
                            break;
2307
2308
0
                        CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECTION_SUBSCRIPTION_DATA)
2309
0
                            if (message->res_status < 300) {
2310
0
                                message->SmfSelectionSubscriptionData =
2311
0
                                    OpenAPI_smf_selection_subscription_data_parseFromJSON(item);
2312
0
                                if (!message->SmfSelectionSubscriptionData) {
2313
0
                                    rv = OGS_ERROR;
2314
0
                                    ogs_error("JSON parse error");
2315
0
                                }
2316
0
                            } else {
2317
0
                                ogs_error("HTTP ERROR Status : %d",
2318
0
                                        message->res_status);
2319
0
                            }
2320
0
                            break;
2321
2322
0
                        CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
2323
0
                            if (message->res_status < 300) {
2324
0
                                message->UeContextInSmfData =
2325
0
                                    OpenAPI_ue_context_in_smf_data_parseFromJSON(
2326
0
                                            item);
2327
0
                                if (!message->UeContextInSmfData) {
2328
0
                                    rv = OGS_ERROR;
2329
0
                                    ogs_error("JSON parse error");
2330
0
                                }
2331
0
                            } else {
2332
0
                                ogs_error("HTTP ERROR Status : %d",
2333
0
                                        message->res_status);
2334
0
                            }
2335
0
                            break;
2336
2337
0
                        CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
2338
0
                            if (message->res_status < 300) {
2339
0
                                if (item) {
2340
0
                                    OpenAPI_session_management_subscription_data_t *smsub_item = NULL;
2341
0
                                    cJSON *smsubJSON = NULL;
2342
0
                                    message->SessionManagementSubscriptionDataList = OpenAPI_list_create();
2343
0
                                    cJSON_ArrayForEach(smsubJSON, item) {
2344
0
                                        if (!cJSON_IsObject(smsubJSON)) {
2345
0
                                            rv = OGS_ERROR;
2346
0
                                            ogs_error("Unknown JSON");
2347
0
                                            goto cleanup;
2348
0
                                        }
2349
2350
0
                                        smsub_item = OpenAPI_session_management_subscription_data_parseFromJSON(smsubJSON);
2351
0
                                        if (!smsub_item) {
2352
0
                                            rv = OGS_ERROR;
2353
0
                                            ogs_error("No smsub_item");
2354
0
                                            goto cleanup;
2355
0
                                        }
2356
0
                                        OpenAPI_list_add(message->SessionManagementSubscriptionDataList, smsub_item);
2357
0
                                    }
2358
0
                                }
2359
0
                            } else {
2360
0
                                ogs_error("HTTP ERROR Status : %d",
2361
0
                                        message->res_status);
2362
0
                            }
2363
0
                            break;
2364
2365
0
                        DEFAULT
2366
0
                            rv = OGS_ERROR;
2367
0
                            ogs_error("Unknown resource name [%s]",
2368
0
                                    message->h.resource.component[4]);
2369
0
                        END
2370
0
                        break;
2371
2372
0
                    DEFAULT
2373
0
                        rv = OGS_ERROR;
2374
0
                        ogs_error("Unknown resource name [%s]",
2375
0
                                message->h.resource.component[3]);
2376
0
                    END
2377
0
                END
2378
0
                break;
2379
2380
0
            CASE(OGS_SBI_RESOURCE_NAME_POLICY_DATA)
2381
0
                SWITCH(message->h.resource.component[1])
2382
0
                CASE(OGS_SBI_RESOURCE_NAME_UES)
2383
0
                    SWITCH(message->h.resource.component[3])
2384
0
                    CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
2385
0
                        if (message->res_status < 300) {
2386
0
                            message->AmPolicyData =
2387
0
                                OpenAPI_am_policy_data_parseFromJSON(item);
2388
0
                            if (!message->AmPolicyData) {
2389
0
                                rv = OGS_ERROR;
2390
0
                                ogs_error("JSON parse error");
2391
0
                            }
2392
0
                        } else {
2393
0
                            ogs_error("HTTP ERROR Status : %d",
2394
0
                                    message->res_status);
2395
0
                        }
2396
0
                        break;
2397
2398
0
                    CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
2399
0
                        if (message->res_status < 300) {
2400
0
                            message->SmPolicyData =
2401
0
                                OpenAPI_sm_policy_data_parseFromJSON(item);
2402
0
                            if (!message->SmPolicyData) {
2403
0
                                rv = OGS_ERROR;
2404
0
                                ogs_error("JSON parse error");
2405
0
                            }
2406
0
                        } else {
2407
0
                            ogs_error("HTTP ERROR Status : %d",
2408
0
                                    message->res_status);
2409
0
                        }
2410
0
                        break;
2411
2412
0
                    DEFAULT
2413
0
                        rv = OGS_ERROR;
2414
0
                        ogs_error("Unknown resource name [%s]",
2415
0
                                message->h.resource.component[3]);
2416
0
                    END
2417
0
                    break;
2418
2419
0
                DEFAULT
2420
0
                    rv = OGS_ERROR;
2421
0
                    ogs_error("Unknown resource name [%s]",
2422
0
                            message->h.resource.component[1]);
2423
0
                END
2424
0
                break;
2425
2426
0
            DEFAULT
2427
0
                rv = OGS_ERROR;
2428
0
                ogs_error("Unknown resource name [%s]",
2429
0
                        message->h.resource.component[0]);
2430
0
            END
2431
0
            break;
2432
2433
3.48k
        case OpenAPI_service_name_nsmf_pdusession:
2434
3.48k
            SWITCH(message->h.resource.component[0])
2435
3.48k
            CASE(OGS_SBI_RESOURCE_NAME_SM_CONTEXTS)
2436
3.48k
                SWITCH(message->h.resource.component[2])
2437
3.48k
                CASE(OGS_SBI_RESOURCE_NAME_MODIFY)
2438
0
                    if (message->res_status == 0) {
2439
0
                        message->SmContextUpdateData =
2440
0
                            OpenAPI_sm_context_update_data_parseFromJSON(item);
2441
0
                        if (!message->SmContextUpdateData) {
2442
0
                            rv = OGS_ERROR;
2443
0
                            ogs_error("JSON parse error");
2444
0
                        }
2445
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2446
0
                        message->SmContextUpdatedData =
2447
0
                            OpenAPI_sm_context_updated_data_parseFromJSON(item);
2448
0
                        if (!message->SmContextUpdatedData) {
2449
0
                            rv = OGS_ERROR;
2450
0
                            ogs_error("JSON parse error");
2451
0
                        }
2452
0
                    } else if (message->res_status ==
2453
0
                            OGS_SBI_HTTP_STATUS_BAD_REQUEST ||
2454
0
                                message->res_status ==
2455
0
                                    OGS_SBI_HTTP_STATUS_FORBIDDEN ||
2456
0
                                message->res_status ==
2457
0
                                    OGS_SBI_HTTP_STATUS_NOT_FOUND ||
2458
0
                                message->res_status ==
2459
0
                                    OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR ||
2460
0
                                message->res_status ==
2461
0
                                    OGS_SBI_HTTP_STATUS_SERVICE_UNAVAILABLE ||
2462
0
                                message->res_status ==
2463
0
                                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT) {
2464
0
                        message->SmContextUpdateError =
2465
0
                            OpenAPI_sm_context_update_error_parseFromJSON(item);
2466
0
                        if (!message->SmContextUpdateError) {
2467
0
                            rv = OGS_ERROR;
2468
0
                            ogs_error("JSON parse error");
2469
0
                        }
2470
0
                    }
2471
0
                    break;
2472
0
                CASE(OGS_SBI_RESOURCE_NAME_RELEASE)
2473
0
                    if (message->res_status == 0) {
2474
0
                        message->SmContextReleaseData =
2475
0
                            OpenAPI_sm_context_release_data_parseFromJSON(item);
2476
0
                        if (!message->SmContextReleaseData) {
2477
0
                            rv = OGS_ERROR;
2478
0
                            ogs_error("JSON parse error");
2479
0
                        }
2480
0
                    } else if (message->res_status ==
2481
0
                            OGS_SBI_HTTP_STATUS_NO_CONTENT) {
2482
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2483
0
                        message->SmContextReleasedData =
2484
0
                            OpenAPI_sm_context_released_data_parseFromJSON(
2485
0
                                    item);
2486
0
                        if (!message->SmContextReleasedData) {
2487
0
                            rv = OGS_ERROR;
2488
0
                            ogs_error("JSON parse error");
2489
0
                        }
2490
0
                    }
2491
0
                    break;
2492
3.48k
                DEFAULT
2493
3.48k
                    if (message->res_status == 0) {
2494
3.48k
                        message->SmContextCreateData =
2495
3.48k
                            OpenAPI_sm_context_create_data_parseFromJSON(item);
2496
3.48k
                        if (!message->SmContextCreateData) {
2497
1.77k
                            rv = OGS_ERROR;
2498
1.77k
                            ogs_error("JSON parse error");
2499
1.77k
                        }
2500
3.48k
                    } else if (message->res_status ==
2501
0
                            OGS_SBI_HTTP_STATUS_CREATED) {
2502
0
                        message->SmContextCreatedData =
2503
0
                            OpenAPI_sm_context_created_data_parseFromJSON(item);
2504
0
                        if (!message->SmContextCreatedData) {
2505
0
                            rv = OGS_ERROR;
2506
0
                            ogs_error("JSON parse error");
2507
0
                        }
2508
0
                    } else if (message->res_status ==
2509
0
                            OGS_SBI_HTTP_STATUS_BAD_REQUEST ||
2510
0
                                message->res_status ==
2511
0
                                    OGS_SBI_HTTP_STATUS_FORBIDDEN ||
2512
0
                                message->res_status ==
2513
0
                                    OGS_SBI_HTTP_STATUS_NOT_FOUND ||
2514
0
                                message->res_status ==
2515
0
                                    OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR ||
2516
0
                                message->res_status ==
2517
0
                                    OGS_SBI_HTTP_STATUS_SERVICE_UNAVAILABLE ||
2518
0
                                message->res_status ==
2519
0
                                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT) {
2520
0
                        message->SmContextCreateError =
2521
0
                            OpenAPI_sm_context_create_error_parseFromJSON(item);
2522
0
                        if (!message->SmContextCreateError) {
2523
0
                            rv = OGS_ERROR;
2524
0
                            ogs_error("JSON parse error");
2525
0
                        }
2526
0
                    }
2527
3.48k
                END
2528
3.48k
                break;
2529
2530
3.48k
            CASE(OGS_SBI_RESOURCE_NAME_PDU_SESSIONS)
2531
0
                SWITCH(message->h.resource.component[2])
2532
0
                CASE(OGS_SBI_RESOURCE_NAME_MODIFY)
2533
0
                    if (message->res_status == 0) {
2534
0
                        message->HsmfUpdateData =
2535
0
                            OpenAPI_hsmf_update_data_parseFromJSON(item);
2536
0
                        if (!message->HsmfUpdateData) {
2537
0
                            rv = OGS_ERROR;
2538
0
                            ogs_error("JSON parse error");
2539
0
                        }
2540
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2541
0
                        message->HsmfUpdatedData =
2542
0
                            OpenAPI_hsmf_updated_data_parseFromJSON(item);
2543
0
                        if (!message->HsmfUpdatedData) {
2544
0
                            rv = OGS_ERROR;
2545
0
                            ogs_error("JSON parse error");
2546
0
                        }
2547
0
                    } else if (message->res_status ==
2548
0
                            OGS_SBI_HTTP_STATUS_BAD_REQUEST ||
2549
0
                                message->res_status ==
2550
0
                                    OGS_SBI_HTTP_STATUS_FORBIDDEN ||
2551
0
                                message->res_status ==
2552
0
                                    OGS_SBI_HTTP_STATUS_NOT_FOUND ||
2553
0
                                message->res_status ==
2554
0
                                    OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR ||
2555
0
                                message->res_status ==
2556
0
                                    OGS_SBI_HTTP_STATUS_SERVICE_UNAVAILABLE ||
2557
0
                                message->res_status ==
2558
0
                                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT) {
2559
0
                        message->HsmfUpdateError =
2560
0
                            OpenAPI_hsmf_update_error_parseFromJSON(item);
2561
0
                        if (!message->HsmfUpdateError) {
2562
0
                            rv = OGS_ERROR;
2563
0
                            ogs_error("JSON parse error");
2564
0
                        }
2565
0
                    }
2566
0
                    break;
2567
0
                CASE(OGS_SBI_RESOURCE_NAME_RELEASE)
2568
0
                    if (message->res_status == 0) {
2569
0
                        message->ReleaseData =
2570
0
                            OpenAPI_release_data_parseFromJSON(item);
2571
0
                        if (!message->ReleaseData) {
2572
0
                            rv = OGS_ERROR;
2573
0
                            ogs_error("JSON parse error");
2574
0
                        }
2575
0
                    } else if (message->res_status ==
2576
0
                            OGS_SBI_HTTP_STATUS_NO_CONTENT) {
2577
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2578
0
                        message->ReleasedData =
2579
0
                            OpenAPI_released_data_parseFromJSON(item);
2580
0
                        if (!message->ReleasedData) {
2581
0
                            rv = OGS_ERROR;
2582
0
                            ogs_error("JSON parse error");
2583
0
                        }
2584
0
                    }
2585
0
                    break;
2586
0
                DEFAULT
2587
0
                    if (message->res_status == 0) {
2588
0
                        message->PduSessionCreateData =
2589
0
                            OpenAPI_pdu_session_create_data_parseFromJSON(item);
2590
0
                        if (!message->PduSessionCreateData) {
2591
0
                            rv = OGS_ERROR;
2592
0
                            ogs_error("JSON parse error");
2593
0
                        }
2594
0
                    } else if (message->res_status ==
2595
0
                            OGS_SBI_HTTP_STATUS_CREATED) {
2596
0
                        message->PduSessionCreatedData =
2597
0
                            OpenAPI_pdu_session_created_data_parseFromJSON(
2598
0
                                    item);
2599
0
                        if (!message->PduSessionCreatedData) {
2600
0
                            rv = OGS_ERROR;
2601
0
                            ogs_error("JSON parse error");
2602
0
                        }
2603
0
                    } else if (message->res_status ==
2604
0
                            OGS_SBI_HTTP_STATUS_BAD_REQUEST ||
2605
0
                                message->res_status ==
2606
0
                                    OGS_SBI_HTTP_STATUS_FORBIDDEN ||
2607
0
                                message->res_status ==
2608
0
                                    OGS_SBI_HTTP_STATUS_NOT_FOUND ||
2609
0
                                message->res_status ==
2610
0
                                    OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR ||
2611
0
                                message->res_status ==
2612
0
                                    OGS_SBI_HTTP_STATUS_SERVICE_UNAVAILABLE ||
2613
0
                                message->res_status ==
2614
0
                                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT) {
2615
0
                        message->PduSessionCreateError =
2616
0
                            OpenAPI_pdu_session_create_error_parseFromJSON(
2617
0
                                    item);
2618
0
                        if (!message->PduSessionCreateError) {
2619
0
                            rv = OGS_ERROR;
2620
0
                            ogs_error("JSON parse error");
2621
0
                        }
2622
0
                    }
2623
0
                END
2624
0
                break;
2625
0
            CASE(OGS_SBI_RESOURCE_NAME_VSMF_PDU_SESSIONS)
2626
0
                SWITCH(message->h.resource.component[2])
2627
0
                CASE(OGS_SBI_RESOURCE_NAME_MODIFY)
2628
0
                    if (message->res_status == 0) {
2629
0
                        message->VsmfUpdateData =
2630
0
                            OpenAPI_vsmf_update_data_parseFromJSON(item);
2631
0
                        if (!message->VsmfUpdateData) {
2632
0
                            rv = OGS_ERROR;
2633
0
                            ogs_error("JSON parse error");
2634
0
                        }
2635
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2636
0
                        message->VsmfUpdatedData =
2637
0
                            OpenAPI_vsmf_updated_data_parseFromJSON(item);
2638
0
                        if (!message->VsmfUpdatedData) {
2639
0
                            rv = OGS_ERROR;
2640
0
                            ogs_error("JSON parse error");
2641
0
                        }
2642
0
                    } else if (message->res_status ==
2643
0
                            OGS_SBI_HTTP_STATUS_BAD_REQUEST ||
2644
0
                                message->res_status ==
2645
0
                                    OGS_SBI_HTTP_STATUS_FORBIDDEN ||
2646
0
                                message->res_status ==
2647
0
                                    OGS_SBI_HTTP_STATUS_NOT_FOUND ||
2648
0
                                message->res_status ==
2649
0
                                    OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR ||
2650
0
                                message->res_status ==
2651
0
                                    OGS_SBI_HTTP_STATUS_SERVICE_UNAVAILABLE ||
2652
0
                                message->res_status ==
2653
0
                                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT) {
2654
0
                        message->VsmfUpdateError =
2655
0
                            OpenAPI_vsmf_update_error_parseFromJSON(item);
2656
0
                        if (!message->VsmfUpdateError) {
2657
0
                            rv = OGS_ERROR;
2658
0
                            ogs_error("JSON parse error");
2659
0
                        }
2660
0
                    }
2661
0
                    break;
2662
0
                DEFAULT
2663
0
                    if (message->res_status < 300) {
2664
0
                        message->StatusNotification =
2665
0
                            OpenAPI_status_notification_parseFromJSON(item);
2666
0
                        if (!message->StatusNotification) {
2667
0
                            rv = OGS_ERROR;
2668
0
                            ogs_error("JSON parse error");
2669
0
                        }
2670
0
                    } else {
2671
0
                        ogs_error("HTTP ERROR Status : %d",
2672
0
                                message->res_status);
2673
0
                    }
2674
0
                END
2675
0
                break;
2676
2677
0
            DEFAULT
2678
0
                rv = OGS_ERROR;
2679
0
                ogs_error("Unknown resource name [%s]",
2680
0
                        message->h.resource.component[0]);
2681
0
            END
2682
3.48k
            break;
2683
2684
0
        case OpenAPI_service_name_namf_comm:
2685
0
            SWITCH(message->h.resource.component[0])
2686
0
            CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS)
2687
0
                SWITCH(message->h.resource.component[2])
2688
0
                CASE(OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES)
2689
0
                    if (message->res_status == 0) {
2690
0
                        message->N1N2MessageTransferReqData =
2691
0
                            OpenAPI_n1_n2_message_transfer_req_data_parseFromJSON(item);
2692
0
                        if (!message->N1N2MessageTransferReqData) {
2693
0
                            rv = OGS_ERROR;
2694
0
                            ogs_error("JSON parse error");
2695
0
                        }
2696
0
                    } else if (message->res_status ==
2697
0
                                OGS_SBI_HTTP_STATUS_OK ||
2698
0
                                message->res_status ==
2699
0
                                    OGS_SBI_HTTP_STATUS_ACCEPTED) {
2700
0
                        message->N1N2MessageTransferRspData =
2701
0
                            OpenAPI_n1_n2_message_transfer_rsp_data_parseFromJSON(item);
2702
0
                        if (!message->N1N2MessageTransferRspData) {
2703
0
                            rv = OGS_ERROR;
2704
0
                            ogs_error("JSON parse error");
2705
0
                        }
2706
0
                    }
2707
0
                    break;
2708
2709
0
                CASE(OGS_SBI_RESOURCE_NAME_TRANSFER)
2710
0
                    if (message->res_status == 0) {
2711
0
                        message->UeContextTransferReqData =
2712
0
                            OpenAPI_ue_context_transfer_req_data_parseFromJSON(item);
2713
0
                        if (!message->UeContextTransferReqData) {
2714
0
                            rv = OGS_ERROR;
2715
0
                            ogs_error("JSON parse error");
2716
0
                        }
2717
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2718
0
                        message->UeContextTransferRspData =
2719
0
                            OpenAPI_ue_context_transfer_rsp_data_parseFromJSON(item);
2720
0
                        if (!message->UeContextTransferRspData) {
2721
0
                            rv = OGS_ERROR;
2722
0
                            ogs_error("JSON parse error");
2723
0
                        }
2724
0
                    } else {
2725
0
                        ogs_error("HTTP ERROR Status : %d",
2726
0
                            message->res_status);
2727
0
                    }
2728
0
                    break;
2729
2730
0
                CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE)
2731
0
                    if (message->res_status == 0) {
2732
0
                        message->UeRegStatusUpdateReqData =
2733
0
                            OpenAPI_ue_reg_status_update_req_data_parseFromJSON(item);
2734
0
                        if (!message->UeRegStatusUpdateReqData) {
2735
0
                            rv = OGS_ERROR;
2736
0
                            ogs_error("JSON parse error");
2737
0
                        }
2738
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2739
0
                        message->UeRegStatusUpdateRspData =
2740
0
                            OpenAPI_ue_reg_status_update_rsp_data_parseFromJSON(item);
2741
0
                        if (!message->UeRegStatusUpdateRspData) {
2742
0
                            rv = OGS_ERROR;
2743
0
                            ogs_error("JSON parse error");
2744
0
                        }
2745
0
                    } else {
2746
0
                        ogs_error("HTTP ERROR Status : %d",
2747
0
                            message->res_status);
2748
0
                    }
2749
0
                    break;
2750
2751
0
                DEFAULT
2752
0
                    rv = OGS_ERROR;
2753
0
                    ogs_error("Unknown resource name [%s]",
2754
0
                            message->h.resource.component[2]);
2755
0
                END
2756
0
                break;
2757
2758
0
            DEFAULT
2759
0
                rv = OGS_ERROR;
2760
0
                ogs_error("Unknown resource name [%s]",
2761
0
                        message->h.resource.component[0]);
2762
0
            END
2763
0
            break;
2764
0
        case OpenAPI_service_name_npcf_am_policy_control:
2765
0
            SWITCH(message->h.resource.component[0])
2766
0
            CASE(OGS_SBI_RESOURCE_NAME_POLICIES)
2767
0
                if (message->res_status == 0) {
2768
0
                    message->PolicyAssociationRequest =
2769
0
                        OpenAPI_policy_association_request_parseFromJSON(item);
2770
0
                    if (!message->PolicyAssociationRequest) {
2771
0
                        rv = OGS_ERROR;
2772
0
                        ogs_error("JSON parse error");
2773
0
                    }
2774
0
                } else if (message->res_status ==
2775
0
                        OGS_SBI_HTTP_STATUS_CREATED) {
2776
0
                    message->PolicyAssociation =
2777
0
                        OpenAPI_policy_association_parseFromJSON(item);
2778
0
                    if (!message->PolicyAssociation) {
2779
0
                        rv = OGS_ERROR;
2780
0
                        ogs_error("JSON parse error");
2781
0
                    }
2782
0
                }
2783
0
                break;
2784
0
            DEFAULT
2785
0
                rv = OGS_ERROR;
2786
0
                ogs_error("Unknown resource name [%s]",
2787
0
                        message->h.resource.component[0]);
2788
0
            END
2789
0
            break;
2790
2791
0
        case OpenAPI_service_name_npcf_smpolicycontrol:
2792
0
            SWITCH(message->h.resource.component[0])
2793
0
            CASE(OGS_SBI_RESOURCE_NAME_SM_POLICIES)
2794
0
                if (!message->h.resource.component[1]) {
2795
0
                    if (message->res_status == 0) {
2796
0
                        message->SmPolicyContextData =
2797
0
                            OpenAPI_sm_policy_context_data_parseFromJSON(item);
2798
0
                        if (!message->SmPolicyContextData) {
2799
0
                            rv = OGS_ERROR;
2800
0
                            ogs_error("JSON parse error");
2801
0
                        }
2802
0
                    } else if (message->res_status ==
2803
0
                            OGS_SBI_HTTP_STATUS_CREATED) {
2804
0
                        message->SmPolicyDecision =
2805
0
                            OpenAPI_sm_policy_decision_parseFromJSON(item);
2806
0
                        if (!message->SmPolicyDecision) {
2807
0
                            rv = OGS_ERROR;
2808
0
                            ogs_error("JSON parse error");
2809
0
                        }
2810
0
                    }
2811
0
                } else {
2812
0
                    SWITCH(message->h.resource.component[2])
2813
0
                    CASE(OGS_SBI_RESOURCE_NAME_DELETE)
2814
0
                        if (message->res_status == 0) {
2815
0
                            message->SmPolicyDeleteData =
2816
0
                                OpenAPI_sm_policy_delete_data_parseFromJSON(
2817
0
                                        item);
2818
0
                            if (!message->SmPolicyDeleteData) {
2819
0
                                rv = OGS_ERROR;
2820
0
                                ogs_error("JSON parse error");
2821
0
                            }
2822
0
                        }
2823
0
                        break;
2824
0
                    DEFAULT
2825
0
                        rv = OGS_ERROR;
2826
0
                        ogs_error("Unknown resource name [%s]",
2827
0
                                message->h.resource.component[2]);
2828
0
                    END
2829
0
                }
2830
0
                break;
2831
2832
0
            DEFAULT
2833
0
                rv = OGS_ERROR;
2834
0
                ogs_error("Unknown resource name [%s]",
2835
0
                        message->h.resource.component[0]);
2836
0
            END
2837
0
            break;
2838
2839
0
        case OpenAPI_service_name_nnssf_nsselection:
2840
0
            SWITCH(message->h.resource.component[0])
2841
0
            CASE(OGS_SBI_RESOURCE_NAME_NETWORK_SLICE_INFORMATION)
2842
0
                if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2843
0
                    message->AuthorizedNetworkSliceInfo =
2844
0
                        OpenAPI_authorized_network_slice_info_parseFromJSON(
2845
0
                                item);
2846
0
                    if (!message->AuthorizedNetworkSliceInfo) {
2847
0
                        rv = OGS_ERROR;
2848
0
                        ogs_error("JSON parse error");
2849
0
                    }
2850
0
                }
2851
0
                break;
2852
2853
0
            DEFAULT
2854
0
                rv = OGS_ERROR;
2855
0
                ogs_error("Unknown resource name [%s]",
2856
0
                        message->h.resource.component[0]);
2857
0
            END
2858
0
            break;
2859
2860
0
        case OpenAPI_service_name_nbsf_management:
2861
0
            SWITCH(message->h.resource.component[0])
2862
0
            CASE(OGS_SBI_RESOURCE_NAME_PCF_BINDINGS)
2863
0
                if (message->h.resource.component[1]) {
2864
0
                    if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2865
0
                        message->PcfBinding =
2866
0
                            OpenAPI_pcf_binding_parseFromJSON(item);
2867
0
                        if (!message->PcfBinding) {
2868
0
                            rv = OGS_ERROR;
2869
0
                            ogs_error("JSON parse error");
2870
0
                        }
2871
0
                    }
2872
0
                    break;
2873
0
                } else {
2874
0
                    SWITCH(message->h.method)
2875
0
                    CASE(OGS_SBI_HTTP_METHOD_POST)
2876
0
                        if (message->res_status == 0 ||
2877
0
                            message->res_status ==
2878
0
                                OGS_SBI_HTTP_STATUS_CREATED) {
2879
0
                            message->PcfBinding =
2880
0
                                OpenAPI_pcf_binding_parseFromJSON(item);
2881
0
                            if (!message->PcfBinding) {
2882
0
                                rv = OGS_ERROR;
2883
0
                                ogs_error("JSON parse error");
2884
0
                            }
2885
0
                        }
2886
0
                        break;
2887
2888
0
                    CASE(OGS_SBI_HTTP_METHOD_GET)
2889
0
                        if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2890
0
                            message->PcfBinding =
2891
0
                                OpenAPI_pcf_binding_parseFromJSON(item);
2892
0
                            if (!message->PcfBinding) {
2893
0
                                rv = OGS_ERROR;
2894
0
                                ogs_error("JSON parse error");
2895
0
                            }
2896
0
                        }
2897
0
                        break;
2898
0
                    DEFAULT
2899
0
                        rv = OGS_ERROR;
2900
0
                        ogs_error("Unknown method [%s]", message->h.method);
2901
0
                    END
2902
0
                    break;
2903
0
                }
2904
2905
0
            DEFAULT
2906
0
                rv = OGS_ERROR;
2907
0
                ogs_error("Unknown resource name [%s]",
2908
0
                        message->h.resource.component[0]);
2909
0
            END
2910
0
            break;
2911
2912
0
        case OpenAPI_service_name_npcf_policyauthorization:
2913
0
            SWITCH(message->h.resource.component[0])
2914
0
            CASE(OGS_SBI_RESOURCE_NAME_APP_SESSIONS)
2915
0
                if (message->h.resource.component[1]) {
2916
0
                    if (message->h.resource.component[2]) {
2917
0
                        SWITCH(message->h.resource.component[2])
2918
0
                        CASE(OGS_SBI_RESOURCE_NAME_DELETE)
2919
                            /* Nothing */
2920
0
                            break;
2921
0
                        CASE(OGS_SBI_RESOURCE_NAME_TERMINATE)
2922
0
                            message->TerminationInfo =
2923
0
                                OpenAPI_termination_info_parseFromJSON(item);
2924
0
                            if (!message->TerminationInfo) {
2925
0
                                rv = OGS_ERROR;
2926
0
                                ogs_error("JSON parse error");
2927
0
                            }
2928
0
                            break;
2929
0
                        DEFAULT
2930
0
                            rv = OGS_ERROR;
2931
0
                            ogs_error("JSON parse error");
2932
0
                        END
2933
0
                    } else {
2934
0
                        SWITCH(message->h.method)
2935
0
                        CASE(OGS_SBI_HTTP_METHOD_PATCH)
2936
0
                            if (message->res_status < 300) {
2937
0
                                message->AppSessionContextUpdateDataPatch =
2938
0
                                    OpenAPI_app_session_context_update_data_patch_parseFromJSON(item);
2939
0
                                if (!message->AppSessionContextUpdateDataPatch) {
2940
0
                                    rv = OGS_ERROR;
2941
0
                                    ogs_error("JSON parse error");
2942
0
                                }
2943
0
                            } else {
2944
0
                                ogs_error("HTTP ERROR Status : %d",
2945
0
                                        message->res_status);
2946
0
                            }
2947
0
                            break;
2948
0
                        DEFAULT
2949
0
                            rv = OGS_ERROR;
2950
0
                            ogs_error("JSON parse error");
2951
0
                        END
2952
0
                    }
2953
0
                } else {
2954
0
                    SWITCH(message->h.method)
2955
0
                    CASE(OGS_SBI_HTTP_METHOD_POST)
2956
0
                        if (message->res_status == 0 ||
2957
0
                            message->res_status ==
2958
0
                                OGS_SBI_HTTP_STATUS_CREATED) {
2959
0
                            message->AppSessionContext =
2960
0
                                OpenAPI_app_session_context_parseFromJSON(item);
2961
0
                            if (!message->AppSessionContext) {
2962
0
                                rv = OGS_ERROR;
2963
0
                                ogs_error("JSON parse error");
2964
0
                            }
2965
0
                        }
2966
0
                        break;
2967
0
                    DEFAULT
2968
0
                        rv = OGS_ERROR;
2969
0
                        ogs_error("Unknown method [%s]", message->h.method);
2970
0
                    END
2971
0
                }
2972
0
                break;
2973
0
            DEFAULT
2974
0
                rv = OGS_ERROR;
2975
0
                ogs_error("Unknown resource name [%s]",
2976
0
                        message->h.resource.component[0]);
2977
0
            END
2978
0
            break;
2979
2980
0
        case OGS_SBI_SERVICE_NAME_ID_N32C_HANDSHAKE:
2981
0
            SWITCH(message->h.resource.component[0])
2982
0
            CASE(OGS_SBI_RESOURCE_NAME_EXCHANGE_CAPABILITY)
2983
0
                SWITCH(message->h.method)
2984
0
                CASE(OGS_SBI_HTTP_METHOD_POST)
2985
0
                    if (message->res_status == 0) {
2986
0
                        message->SecNegotiateReqData =
2987
0
                            OpenAPI_sec_negotiate_req_data_parseFromJSON(item);
2988
0
                        if (!message->SecNegotiateReqData) {
2989
0
                            rv = OGS_ERROR;
2990
0
                            ogs_error("JSON parse error");
2991
0
                        }
2992
0
                    } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
2993
0
                        message->SecNegotiateRspData =
2994
0
                            OpenAPI_sec_negotiate_rsp_data_parseFromJSON(item);
2995
0
                        if (!message->SecNegotiateRspData) {
2996
0
                            rv = OGS_ERROR;
2997
0
                            ogs_error("JSON parse error");
2998
0
                        }
2999
0
                    }
3000
0
                    break;
3001
0
                DEFAULT
3002
0
                    rv = OGS_ERROR;
3003
0
                    ogs_error("Unknown method [%s]", message->h.method);
3004
0
                END
3005
0
                break;
3006
0
            DEFAULT
3007
0
                rv = OGS_ERROR;
3008
0
                ogs_error("Unknown resource name [%s]",
3009
0
                        message->h.resource.component[0]);
3010
0
            END
3011
0
            break;
3012
3013
0
        case OGS_SBI_SERVICE_NAME_ID_NAMF_CALLBACK:
3014
0
            SWITCH(message->h.resource.component[1])
3015
0
            CASE(OGS_SBI_RESOURCE_NAME_SM_CONTEXT_STATUS)
3016
0
                if (message->res_status < 300) {
3017
0
                    message->SmContextStatusNotification =
3018
0
                        OpenAPI_sm_context_status_notification_parseFromJSON(
3019
0
                                item);
3020
0
                    if (!message->SmContextStatusNotification) {
3021
0
                        rv = OGS_ERROR;
3022
0
                        ogs_error("JSON parse error");
3023
0
                    }
3024
0
                } else {
3025
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
3026
0
                }
3027
0
                break;
3028
3029
0
            CASE(OGS_SBI_RESOURCE_NAME_DEREG_NOTIFY)
3030
0
                if (message->res_status < 300) {
3031
0
                    message->DeregistrationData =
3032
0
                        OpenAPI_deregistration_data_parseFromJSON(item);
3033
0
                    if (!message->DeregistrationData) {
3034
0
                        rv = OGS_ERROR;
3035
0
                        ogs_error("JSON parse error");
3036
0
                    }
3037
0
                } else {
3038
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
3039
0
                }
3040
0
                break;
3041
3042
0
            CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY)
3043
0
                if (message->res_status < 300) {
3044
0
                    message->ModificationNotification =
3045
0
                        OpenAPI_modification_notification_parseFromJSON(item);
3046
0
                    if (!message->ModificationNotification) {
3047
0
                        rv = OGS_ERROR;
3048
0
                        ogs_error("JSON parse error");
3049
0
                    }
3050
0
                } else {
3051
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
3052
0
                }
3053
0
                break;
3054
3055
0
            DEFAULT
3056
0
                rv = OGS_ERROR;
3057
0
                ogs_error("Unknown resource name [%s]",
3058
0
                        message->h.resource.component[1]);
3059
0
            END
3060
0
            break;
3061
3062
0
        case OGS_SBI_SERVICE_NAME_ID_NSMF_CALLBACK:
3063
0
            SWITCH(message->h.resource.component[0])
3064
0
            CASE(OGS_SBI_RESOURCE_NAME_N1_N2_FAILURE_NOTIFY)
3065
0
                if (message->res_status < 300) {
3066
0
                    message->N1N2MsgTxfrFailureNotification =
3067
0
                        OpenAPI_n1_n2_msg_txfr_failure_notification_parseFromJSON(
3068
0
                                item);
3069
0
                    if (!message->N1N2MsgTxfrFailureNotification) {
3070
0
                        rv = OGS_ERROR;
3071
0
                        ogs_error("JSON parse error");
3072
0
                    }
3073
0
                } else {
3074
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
3075
0
                }
3076
0
                break;
3077
3078
0
            CASE(OGS_SBI_RESOURCE_NAME_SM_POLICY_NOTIFY)
3079
0
                SWITCH(message->h.resource.component[2])
3080
0
                CASE(OGS_SBI_RESOURCE_NAME_UPDATE)
3081
0
                    if (message->res_status < 300) {
3082
0
                        message->SmPolicyNotification =
3083
0
                            OpenAPI_sm_policy_notification_parseFromJSON(item);
3084
0
                        if (!message->SmPolicyNotification) {
3085
0
                            rv = OGS_ERROR;
3086
0
                            ogs_error("JSON parse error");
3087
0
                        }
3088
0
                    } else {
3089
0
                        ogs_error("HTTP ERROR Status : %d",
3090
0
                                message->res_status);
3091
0
                    }
3092
0
                    break;
3093
0
                CASE(OGS_SBI_RESOURCE_NAME_TERMINATE)
3094
0
                    if (message->res_status < 300) {
3095
0
                        message->TerminationNotification =
3096
0
                            OpenAPI_termination_notification_parseFromJSON(item);
3097
0
                        if (!message->TerminationNotification) {
3098
0
                            rv = OGS_ERROR;
3099
0
                            ogs_error("JSON parse error");
3100
0
                        }
3101
0
                    } else {
3102
0
                        ogs_error("HTTP ERROR Status : %d",
3103
0
                                message->res_status);
3104
0
                    }
3105
0
                    break;
3106
3107
0
                DEFAULT
3108
0
                    rv = OGS_ERROR;
3109
0
                    ogs_error("Unknown resource name [%s]",
3110
0
                            message->h.resource.component[2]);
3111
0
                END
3112
0
                break;
3113
3114
0
            CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY)
3115
0
                if (message->res_status < 300) {
3116
0
                    message->ModificationNotification =
3117
0
                        OpenAPI_modification_notification_parseFromJSON(item);
3118
0
                    if (!message->ModificationNotification) {
3119
0
                        rv = OGS_ERROR;
3120
0
                        ogs_error("JSON parse error");
3121
0
                    }
3122
0
                } else {
3123
0
                    ogs_error("HTTP ERROR Status : %d", message->res_status);
3124
0
                }
3125
0
                break;
3126
3127
0
            DEFAULT
3128
0
                rv = OGS_ERROR;
3129
0
                ogs_error("Unknown resource name [%s]",
3130
0
                        message->h.resource.component[0]);
3131
0
            END
3132
0
            break;
3133
3134
0
        default:
3135
0
            rv = OGS_ERROR;
3136
0
            ogs_error("Not implemented API name [%s]",
3137
20.6k
                    message->h.service.name);
3138
20.6k
        }
3139
20.6k
    }
3140
3141
20.6k
cleanup:
3142
3143
20.6k
    cJSON_Delete(item);
3144
20.6k
    return rv;
3145
20.6k
}
3146
3147
static int parse_content(
3148
        ogs_sbi_message_t *message, ogs_sbi_http_message_t *http)
3149
22.2k
{
3150
22.2k
    ogs_assert(message);
3151
22.2k
    ogs_assert(http);
3152
3153
22.2k
    if (message->http.content_type &&
3154
22.2k
        !strncmp(message->http.content_type, OGS_SBI_CONTENT_MULTIPART_TYPE,
3155
22.2k
            strlen(OGS_SBI_CONTENT_MULTIPART_TYPE))) {
3156
0
        return parse_multipart(message, http);
3157
22.2k
    } else {
3158
22.2k
        return parse_json(message, message->http.content_type, http->content);
3159
22.2k
    }
3160
22.2k
}
3161
3162
static bool build_content(
3163
        ogs_sbi_http_message_t *http, ogs_sbi_message_t *message)
3164
0
{
3165
0
    ogs_assert(message);
3166
0
    ogs_assert(http);
3167
3168
0
    if (message->num_of_part) {
3169
0
        if (build_multipart(http, message) == false) {
3170
0
            ogs_error("build_multipart() failed");
3171
0
            return false;
3172
0
        }
3173
0
    } else {
3174
0
        http->content = build_json(message);
3175
0
        if (http->content) {
3176
0
            http->content_length = strlen(http->content);
3177
0
            if (message->http.content_type) {
3178
0
                ogs_sbi_header_set(http->headers,
3179
0
                        OGS_SBI_CONTENT_TYPE, message->http.content_type);
3180
0
            } else {
3181
0
                ogs_sbi_header_set(http->headers,
3182
0
                        OGS_SBI_CONTENT_TYPE, OGS_SBI_CONTENT_JSON_TYPE);
3183
0
            }
3184
0
        }
3185
0
    }
3186
3187
0
    return true;
3188
0
}
3189
3190
typedef struct multipart_part_data_s {
3191
    char *content_type;
3192
    char *content_id;
3193
    char *content;
3194
    size_t content_length;
3195
} multipart_part_data_t;
3196
3197
typedef struct multipart_parser_data_s {
3198
    int num_of_part;
3199
    multipart_part_data_t part[OGS_SBI_MAX_NUM_OF_PART];
3200
3201
    bool parse_error;
3202
3203
    char *header_field;
3204
} multipart_parser_data_t;
3205
3206
static void multipart_parser_data_free(multipart_parser_data_t *data)
3207
0
{
3208
0
    int i;
3209
3210
0
    ogs_assert(data);
3211
3212
0
    for (i = 0; i < OGS_SBI_MAX_NUM_OF_PART; i++) {
3213
0
        if (data->part[i].content_type)
3214
0
            ogs_free(data->part[i].content_type);
3215
0
        if (data->part[i].content_id)
3216
0
            ogs_free(data->part[i].content_id);
3217
0
        if (data->part[i].content)
3218
0
            ogs_free(data->part[i].content);
3219
0
    }
3220
3221
0
    if (data->header_field)
3222
0
        ogs_free(data->header_field);
3223
0
}
3224
3225
static int on_header_field(
3226
        multipart_parser *parser, const char *at, size_t length)
3227
0
{
3228
0
    multipart_parser_data_t *data = NULL;
3229
3230
0
    ogs_assert(parser);
3231
0
    data = multipart_parser_get_data(parser);
3232
0
    ogs_assert(data);
3233
3234
    /*
3235
     * The multipart state machine emits a zero-length field name when a
3236
     * header line begins with ':' (e.g. ":application/json"). Such input is
3237
     * malformed; rejecting it here prevents a NULL data->header_field from
3238
     * propagating into on_header_value(). See Issues #4608
3239
     */
3240
0
    if (!at || !length) {
3241
0
        ogs_error("Invalid multipart header field");
3242
0
        data->parse_error = true;
3243
0
        return 0;
3244
0
    }
3245
3246
0
    if (data->header_field)
3247
0
        ogs_free(data->header_field);
3248
0
    data->header_field = ogs_strndup(at, length);
3249
0
    ogs_assert(data->header_field);
3250
3251
0
    return 0;
3252
0
}
3253
3254
static int on_header_value(
3255
        multipart_parser *parser, const char *at, size_t length)
3256
0
{
3257
0
    multipart_parser_data_t *data = NULL;
3258
3259
0
    ogs_assert(parser);
3260
0
    data = multipart_parser_get_data(parser);
3261
0
    ogs_assert(data);
3262
3263
    /*
3264
     * Defense in depth: a header value must be preceded by a valid field
3265
     * name. on_header_field() already rejects empty names, but guard here as
3266
     * well so ogs_strcasecmp() (plain strcasecmp, not NULL-safe) is never
3267
     * called with a NULL data->header_field.
3268
     */
3269
0
    if (!data->header_field) {
3270
0
        ogs_error("Multipart header value without field name");
3271
0
        data->parse_error = true;
3272
0
        return 0;
3273
0
    }
3274
3275
0
    if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART && at && length) {
3276
0
        if (!ogs_strcasecmp(data->header_field, OGS_SBI_CONTENT_TYPE)) {
3277
0
            ogs_assert(data->part[data->num_of_part].content_type == NULL);
3278
0
            data->part[data->num_of_part].content_type =
3279
0
                ogs_strndup(at, length);
3280
0
            ogs_assert(data->part[data->num_of_part].content_type);
3281
0
        } else if (!ogs_strcasecmp(data->header_field, OGS_SBI_CONTENT_ID)) {
3282
0
            ogs_assert(data->part[data->num_of_part].content_id == NULL);
3283
0
            data->part[data->num_of_part].content_id =
3284
0
                ogs_strndup(at, length);
3285
0
            ogs_assert(data->part[data->num_of_part].content_id);
3286
0
        } else {
3287
0
            ogs_error("Unknown header field [%s]", data->header_field);
3288
0
        }
3289
0
    }
3290
3291
0
    return 0;
3292
0
}
3293
3294
static int on_part_data(
3295
        multipart_parser *parser, const char *at, size_t length)
3296
0
{
3297
0
    multipart_parser_data_t *data = NULL;
3298
3299
0
    ogs_assert(parser);
3300
0
    data = multipart_parser_get_data(parser);
3301
0
    ogs_assert(data);
3302
3303
0
    if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART && at && length) {
3304
0
        SWITCH(data->part[data->num_of_part].content_type)
3305
0
        CASE(OGS_SBI_CONTENT_JSON_TYPE)
3306
0
        CASE(OGS_SBI_CONTENT_5GNAS_TYPE)
3307
0
        CASE(OGS_SBI_CONTENT_NGAP_TYPE)
3308
0
            size_t offset = 0;
3309
3310
0
            if (data->part[data->num_of_part].content == NULL) {
3311
0
                data->part[data->num_of_part].content_length = length;
3312
0
                data->part[data->num_of_part].content =
3313
0
                    (char *)ogs_malloc(length + 1);
3314
0
                ogs_assert(data->part[data->num_of_part].content);
3315
0
            } else {
3316
0
                offset = data->part[data->num_of_part].content_length;
3317
0
                if ((data->part[data->num_of_part].content_length + length) >
3318
0
                        OGS_MAX_SDU_LEN) {
3319
0
                    ogs_error("Overflow length [%d:%d]",
3320
0
                        (int)data->part[data->num_of_part].content_length,
3321
0
                        (int)length);
3322
0
                    data->parse_error = true;
3323
0
                    return 0;
3324
0
                }
3325
0
                data->part[data->num_of_part].content_length += length;
3326
0
                data->part[data->num_of_part].content = (char *)ogs_realloc(
3327
0
                    data->part[data->num_of_part].content,
3328
0
                    data->part[data->num_of_part].content_length + 1);
3329
0
                ogs_assert(data->part[data->num_of_part].content);
3330
0
            }
3331
0
            memcpy(data->part[data->num_of_part].content + offset, at, length);
3332
0
            data->part[data->num_of_part].content[
3333
0
                data->part[data->num_of_part].content_length] = 0;
3334
0
            break;
3335
3336
0
        DEFAULT
3337
0
            ogs_error("Unknown content_type [%s]",
3338
0
                    data->part[data->num_of_part].content_type);
3339
0
            ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)at, length);
3340
0
        END
3341
0
    }
3342
0
    return 0;
3343
0
}
3344
3345
static int on_part_data_end(multipart_parser *parser)
3346
0
{
3347
0
    multipart_parser_data_t *data = NULL;
3348
3349
0
    ogs_assert(parser);
3350
0
    data = multipart_parser_get_data(parser);
3351
0
    ogs_assert(data);
3352
3353
0
    if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART) {
3354
0
        data->num_of_part++;
3355
0
    }
3356
3357
0
    return 0;
3358
0
}
3359
3360
static int parse_multipart(
3361
        ogs_sbi_message_t *message, ogs_sbi_http_message_t *http)
3362
0
{
3363
0
    char *boundary = NULL;
3364
0
    int i, preamble, rv;
3365
0
    size_t parsed;
3366
3367
0
    multipart_parser_settings settings;
3368
0
    multipart_parser_data_t data;
3369
3370
0
    multipart_parser *parser = NULL;
3371
3372
0
    ogs_assert(message);
3373
0
    ogs_assert(http);
3374
3375
0
    if (!http->content) {
3376
0
        ogs_error("HTTP content NULL [%d]", (int)http->content_length);
3377
0
        return OGS_ERROR;
3378
0
    }
3379
3380
0
    if (http->content_length < 2) {
3381
0
        ogs_error("Invalid HTTP content_length [%d]",
3382
0
                (int)http->content_length);
3383
0
        return OGS_ERROR;
3384
0
    }
3385
3386
0
    memset(&settings, 0, sizeof(settings));
3387
0
    settings.on_header_field = &on_header_field;
3388
0
    settings.on_header_value = &on_header_value;
3389
0
    settings.on_part_data = &on_part_data;
3390
0
    settings.on_part_data_end = &on_part_data_end;
3391
3392
0
    preamble = 0;
3393
0
    if (http->content[0] == '\r' && http->content[1] == '\n')
3394
0
        preamble = 2;
3395
3396
0
    for (i = preamble; i < (http->content_length-preamble); i++) {
3397
0
        if (http->content[i] == '\r' && http->content[i+1] == '\n')
3398
0
            break;
3399
0
    }
3400
3401
0
    if (i >= (http->content_length-preamble)) {
3402
0
        ogs_error("Invalid HTTP content [%d]", i);
3403
0
        ogs_log_hexdump(OGS_LOG_ERROR,
3404
0
                (unsigned char *)http->content, http->content_length);
3405
0
        return OGS_ERROR;
3406
0
    }
3407
3408
0
    boundary = ogs_strndup(http->content+preamble, i-preamble);
3409
0
    ogs_assert(boundary);
3410
3411
0
    parser = multipart_parser_init(boundary, &settings);
3412
0
    ogs_assert(parser);
3413
3414
0
    memset(&data, 0, sizeof(data));
3415
0
    multipart_parser_set_data(parser, &data);
3416
0
    parsed = multipart_parser_execute(parser,
3417
0
            http->content+preamble, http->content_length-preamble);
3418
3419
0
    rv = OGS_ERROR;
3420
3421
0
    if (parsed != (http->content_length - preamble) || data.parse_error) {
3422
0
        ogs_error("Multipart parse failed [%d:%d],[len:%d,preamble:%d,err:%d]",
3423
0
                (int)parsed, (int)(http->content_length - preamble),
3424
0
                (int)http->content_length, preamble, data.parse_error);
3425
0
        ogs_log_hexdump(OGS_LOG_ERROR,
3426
0
                (unsigned char *)http->content, http->content_length);
3427
0
        goto cleanup;
3428
0
    }
3429
3430
0
    if (data.num_of_part > OGS_SBI_MAX_NUM_OF_PART) {
3431
        /* Overflow Issues #1247 */
3432
0
        ogs_error("Overflow num_of_part[%d]", data.num_of_part);
3433
0
        ogs_log_hexdump(OGS_LOG_ERROR,
3434
0
                (unsigned char *)http->content, http->content_length);
3435
0
        goto cleanup;
3436
0
    }
3437
3438
0
    rv = OGS_OK;
3439
3440
0
cleanup:
3441
3442
0
    multipart_parser_free(parser);
3443
0
    ogs_free(boundary);
3444
3445
0
    if (rv != OGS_OK) {
3446
0
        multipart_parser_data_free(&data);
3447
0
        return OGS_ERROR;
3448
0
    }
3449
3450
0
    for (i = 0; i < data.num_of_part; i++) {
3451
0
        SWITCH(data.part[i].content_type)
3452
0
        CASE(OGS_SBI_CONTENT_JSON_TYPE)
3453
0
            parse_json(message,
3454
0
                    data.part[i].content_type, data.part[i].content);
3455
3456
0
            if (data.part[i].content_id)
3457
0
                ogs_free(data.part[i].content_id);
3458
0
            if (data.part[i].content_type)
3459
0
                ogs_free(data.part[i].content_type);
3460
0
            if (data.part[i].content)
3461
0
                ogs_free(data.part[i].content);
3462
3463
0
            break;
3464
3465
0
        CASE(OGS_SBI_CONTENT_5GNAS_TYPE)
3466
0
        CASE(OGS_SBI_CONTENT_NGAP_TYPE)
3467
0
            http->part[http->num_of_part].content_id =
3468
0
                data.part[i].content_id;
3469
0
            http->part[http->num_of_part].content_type =
3470
0
                data.part[i].content_type;
3471
0
            http->part[http->num_of_part].pkbuf =
3472
0
                ogs_pkbuf_alloc(NULL, data.part[i].content_length);
3473
0
            if (!(http->part[http->num_of_part].pkbuf)) {
3474
0
                ogs_error("ogs_pkbuf_copy() failed");
3475
3476
0
                if (data.part[i].content_id)
3477
0
                    ogs_free(data.part[i].content_id);
3478
0
                if (data.part[i].content_type)
3479
0
                    ogs_free(data.part[i].content_type);
3480
0
                if (data.part[i].content)
3481
0
                    ogs_free(data.part[i].content);
3482
3483
0
                if (data.header_field)
3484
0
                    ogs_free(data.header_field);
3485
3486
0
                return OGS_ERROR;
3487
0
            }
3488
0
            ogs_pkbuf_put_data(http->part[http->num_of_part].pkbuf,
3489
0
                data.part[i].content, data.part[i].content_length);
3490
3491
0
            message->part[message->num_of_part].content_id =
3492
0
                http->part[http->num_of_part].content_id;
3493
0
            message->part[message->num_of_part].content_type =
3494
0
                http->part[http->num_of_part].content_type;
3495
0
            message->part[message->num_of_part].pkbuf =
3496
0
                ogs_pkbuf_copy(http->part[http->num_of_part].pkbuf);
3497
0
            if (!(message->part[http->num_of_part].pkbuf)) {
3498
0
                ogs_error("ogs_pkbuf_copy() failed");
3499
3500
0
                if (data.part[i].content_id)
3501
0
                    ogs_free(data.part[i].content_id);
3502
0
                if (data.part[i].content_type)
3503
0
                    ogs_free(data.part[i].content_type);
3504
0
                if (data.part[i].content)
3505
0
                    ogs_free(data.part[i].content);
3506
3507
0
                if (data.header_field)
3508
0
                    ogs_free(data.header_field);
3509
3510
0
                if (http->part[http->num_of_part].pkbuf)
3511
0
                    ogs_pkbuf_free(http->part[http->num_of_part].pkbuf);
3512
3513
0
                return OGS_ERROR;
3514
0
            }
3515
3516
0
            http->num_of_part++;
3517
0
            message->num_of_part++;
3518
3519
0
            if (data.part[i].content)
3520
0
                ogs_free(data.part[i].content);
3521
0
            break;
3522
3523
0
        DEFAULT
3524
0
            ogs_error("Unknown content-type[%s]", data.part[i].content_type);
3525
3526
0
            if (data.part[i].content_id)
3527
0
                ogs_free(data.part[i].content_id);
3528
0
            if (data.part[i].content_type)
3529
0
                ogs_free(data.part[i].content_type);
3530
0
        END
3531
0
    }
3532
3533
0
    if (data.header_field)
3534
0
        ogs_free(data.header_field);
3535
3536
0
    return OGS_OK;
3537
0
}
3538
3539
static bool build_multipart(
3540
        ogs_sbi_http_message_t *http, ogs_sbi_message_t *message)
3541
0
{
3542
0
    int i;
3543
3544
0
    char boundary[32];
3545
0
    unsigned char digest[16];
3546
0
    char *p = NULL, *last;
3547
3548
0
    char *content_type = NULL;
3549
0
    char *json = NULL;
3550
3551
0
    size_t remaining;
3552
0
    size_t closing_boundary_len;
3553
3554
0
    ogs_assert(message);
3555
0
    ogs_assert(http);
3556
3557
0
    ogs_random(digest, 16);
3558
0
    strcpy(boundary, "=-");
3559
0
    ogs_assert(ogs_base64_encode_from_buffer(
3560
0
            boundary + 2, sizeof(boundary) - 2, digest, sizeof(digest)) > 0);
3561
3562
0
    closing_boundary_len =
3563
0
        sizeof("\r\n--") - 1 + strlen(boundary) + sizeof("--\r\n") - 1;
3564
3565
0
    p = http->content = ogs_calloc(1, OGS_MAX_SDU_LEN);
3566
0
    if (!p) {
3567
0
        ogs_error("ogs_calloc() failed");
3568
0
        return false;
3569
0
    }
3570
0
    last = p + OGS_MAX_SDU_LEN;
3571
3572
#if SBI_MIME_PREAMBLE_CRLF /* Preamble CLRF */
3573
    p = ogs_slprintf(p, last, "\r\n");
3574
#endif
3575
3576
    /* First boundary */
3577
0
    p = ogs_slprintf(p, last, "--%s\r\n", boundary);
3578
3579
    /* Encapsulated multipart part (application/json) */
3580
0
    json = build_json(message);
3581
0
    if (!json) {
3582
0
        ogs_error("build_json() failed");
3583
0
        return false;
3584
0
    }
3585
3586
0
    p = ogs_slprintf(p, last, "%s\r\n\r\n%s",
3587
0
            OGS_SBI_CONTENT_TYPE ": " OGS_SBI_CONTENT_JSON_TYPE, json);
3588
3589
0
    ogs_free(json);
3590
3591
    /* Add part */
3592
0
    for (i = 0; i < message->num_of_part; i++) {
3593
0
        p = ogs_slprintf(p, last, "\r\n--%s\r\n", boundary);
3594
0
        p = ogs_slprintf(p, last, "%s: %s\r\n",
3595
0
                OGS_SBI_CONTENT_ID, message->part[i].content_id);
3596
0
        p = ogs_slprintf(p, last, "%s: %s\r\n\r\n",
3597
0
                OGS_SBI_CONTENT_TYPE, message->part[i].content_type);
3598
3599
        /*
3600
         * The part body is copied with memcpy() below, which is not bounded
3601
         * by `last` (unlike ogs_slprintf() above). Reserve space for the
3602
         * closing boundary before copying the part body.
3603
         */
3604
0
        remaining = (p < last) ? (size_t)(last - p) : 0;
3605
0
        if (remaining < closing_boundary_len + 1 ||
3606
0
                message->part[i].pkbuf->len >
3607
0
                remaining - closing_boundary_len - 1) {
3608
0
            ogs_error("Multipart part too large to build "
3609
0
                    "[part:%d content-id:%s len:%u remaining:%zu]",
3610
0
                    i, message->part[i].content_id,
3611
0
                    message->part[i].pkbuf->len, remaining);
3612
0
            return false;
3613
0
        }
3614
3615
0
        memcpy(p, message->part[i].pkbuf->data, message->part[i].pkbuf->len);
3616
0
        p += message->part[i].pkbuf->len;
3617
0
    }
3618
3619
    /* Last boundary */
3620
0
    remaining = (p < last) ? (size_t)(last - p) : 0;
3621
0
    if (remaining < closing_boundary_len + 1) {
3622
0
        ogs_error("Multipart content too large to build "
3623
0
                "[closing-boundary:%zu remaining:%zu]",
3624
0
                closing_boundary_len, remaining);
3625
0
        return false;
3626
0
    }
3627
0
    p = ogs_slprintf(p, last, "\r\n--%s--\r\n", boundary);
3628
3629
0
    http->content_length = p - http->content;
3630
3631
0
    content_type = ogs_msprintf("%s; boundary=\"%s\"",
3632
0
            OGS_SBI_CONTENT_MULTIPART_TYPE, boundary);
3633
0
    if (!content_type) {
3634
0
        ogs_error("ogs_msprintf() failed");
3635
0
        return false;
3636
0
    }
3637
3638
0
    ogs_sbi_header_set(http->headers, OGS_SBI_CONTENT_TYPE, content_type);
3639
3640
0
    ogs_free(content_type);
3641
3642
0
    return true;
3643
0
}
3644
3645
static void http_message_free(ogs_sbi_http_message_t *http)
3646
22.2k
{
3647
22.2k
    int i;
3648
22.2k
    ogs_assert(http);
3649
3650
22.2k
    if (http->params)
3651
22.2k
        ogs_sbi_http_hash_free(http->params);
3652
3653
22.2k
    if (http->headers)
3654
22.2k
        ogs_sbi_http_hash_free(http->headers);
3655
3656
22.2k
    if (http->content)
3657
22.2k
        ogs_free(http->content);
3658
3659
22.2k
    for (i = 0; i < http->num_of_part; i++) {
3660
0
        if (http->part[i].pkbuf)
3661
0
            ogs_pkbuf_free(http->part[i].pkbuf);
3662
0
        if (http->part[i].content_id)
3663
0
            ogs_free(http->part[i].content_id);
3664
0
        if (http->part[i].content_type)
3665
0
            ogs_free(http->part[i].content_type);
3666
0
    }
3667
22.2k
}
3668
3669
ogs_sbi_discovery_option_t *ogs_sbi_discovery_option_new(void)
3670
0
{
3671
0
    ogs_sbi_discovery_option_t *discovery_option = NULL;
3672
3673
0
    discovery_option = ogs_calloc(1, sizeof(*discovery_option));
3674
0
    ogs_assert(discovery_option);
3675
3676
0
    return discovery_option;
3677
0
}
3678
void ogs_sbi_discovery_option_free(
3679
        ogs_sbi_discovery_option_t *discovery_option)
3680
0
{
3681
0
    ogs_assert(discovery_option);
3682
3683
0
    if (discovery_option->target_nf_instance_id)
3684
0
        ogs_free(discovery_option->target_nf_instance_id);
3685
0
    if (discovery_option->requester_nf_instance_id)
3686
0
        ogs_free(discovery_option->requester_nf_instance_id);
3687
0
    if (discovery_option->dnn)
3688
0
        ogs_free(discovery_option->dnn);
3689
3690
0
    if (discovery_option->hnrf_uri)
3691
0
        ogs_free(discovery_option->hnrf_uri);
3692
3693
0
    ogs_free(discovery_option);
3694
0
}
3695
3696
void ogs_sbi_discovery_option_set_target_nf_instance_id(
3697
        ogs_sbi_discovery_option_t *discovery_option,
3698
        char *target_nf_instance_id)
3699
0
{
3700
0
    ogs_assert(discovery_option);
3701
0
    ogs_assert(target_nf_instance_id);
3702
3703
0
    ogs_assert(!discovery_option->target_nf_instance_id);
3704
0
    discovery_option->target_nf_instance_id = ogs_strdup(target_nf_instance_id);
3705
0
    ogs_assert(discovery_option->target_nf_instance_id);
3706
0
}
3707
void ogs_sbi_discovery_option_set_requester_nf_instance_id(
3708
        ogs_sbi_discovery_option_t *discovery_option,
3709
        char *requester_nf_instance_id)
3710
0
{
3711
0
    ogs_assert(discovery_option);
3712
0
    ogs_assert(requester_nf_instance_id);
3713
3714
0
    ogs_assert(!discovery_option->requester_nf_instance_id);
3715
0
    discovery_option->requester_nf_instance_id =
3716
0
        ogs_strdup(requester_nf_instance_id);
3717
0
    ogs_assert(discovery_option->requester_nf_instance_id);
3718
0
}
3719
void ogs_sbi_discovery_option_set_dnn(
3720
        ogs_sbi_discovery_option_t *discovery_option, char *dnn)
3721
0
{
3722
0
    ogs_assert(discovery_option);
3723
0
    ogs_assert(dnn);
3724
3725
0
    ogs_assert(!discovery_option->dnn);
3726
0
    discovery_option->dnn = ogs_strdup(dnn);
3727
0
    ogs_assert(discovery_option->dnn);
3728
0
}
3729
3730
void ogs_sbi_discovery_option_add_service_names(
3731
        ogs_sbi_discovery_option_t *discovery_option,
3732
        OpenAPI_service_name_e service_name)
3733
0
{
3734
0
    ogs_assert(discovery_option);
3735
0
    ogs_assert(service_name);
3736
3737
0
    ogs_assert(discovery_option->num_of_service_names <
3738
0
                OGS_SBI_MAX_NUM_OF_SERVICE_NAME);
3739
3740
0
    discovery_option->service_names[discovery_option->num_of_service_names] =
3741
0
        service_name;
3742
0
    ogs_assert(discovery_option->service_names
3743
0
                [discovery_option->num_of_service_names]);
3744
0
    discovery_option->num_of_service_names++;
3745
0
}
3746
3747
char *ogs_sbi_discovery_option_build_service_names(
3748
        ogs_sbi_discovery_option_t *discovery_option)
3749
0
{
3750
0
    int i;
3751
0
    char *name = NULL;
3752
0
    char *service_names = NULL;
3753
3754
0
    ogs_assert(discovery_option);
3755
3756
0
    name = OpenAPI_service_name_ToString(
3757
0
                discovery_option->service_names[0]);
3758
0
    if (!name) {
3759
0
        ogs_error("Invalid service_names[%d]",
3760
0
                discovery_option->service_names[0]);
3761
0
        return NULL;
3762
0
    }
3763
3764
0
    service_names = ogs_strdup(name);
3765
0
    if (!service_names) {
3766
0
        ogs_error("ogs_strdup() failed");
3767
0
        return NULL;;
3768
0
    }
3769
3770
    /*
3771
     * Issues #1730
3772
     * Send NF discovery query with service-names delimited with comma
3773
     *
3774
     * OpenAPI specification for sending NF discovery query with
3775
     * "service-names" parameter is defined as folowing:
3776
     *   name: service-names
3777
     *   ...
3778
     *   style: form
3779
     *   explode: false
3780
     *
3781
     * According to OpenAPI specification, this means array items
3782
     * should be delimited with a comma character (example: /users?id=3,4,5).
3783
     *
3784
     * See also https://swagger.io/docs/specification/serialization/
3785
     */
3786
0
    if (discovery_option->num_of_service_names > 1) {
3787
0
        for (i = 1; i < discovery_option->num_of_service_names; i++) {
3788
0
            name = OpenAPI_service_name_ToString(
3789
0
                        discovery_option->service_names[i]);
3790
0
            if (name)
3791
0
                service_names = ogs_mstrcatf(service_names, ",%s", name);
3792
0
            else
3793
0
                ogs_error("Invalid service_names[%d]",
3794
0
                        discovery_option->service_names[i]);
3795
0
        }
3796
0
    }
3797
3798
0
    return service_names;
3799
0
}
3800
3801
int ogs_sbi_discovery_option_parse_service_names(
3802
        ogs_sbi_discovery_option_t *discovery_option,
3803
        char *service_names)
3804
0
{
3805
0
    char *v = NULL;
3806
0
    char *token = NULL;
3807
0
    char *saveptr = NULL;
3808
3809
0
    ogs_assert(discovery_option);
3810
0
    ogs_assert(service_names);
3811
3812
0
    v = ogs_sbi_url_decode(service_names);
3813
0
    if (!v) {
3814
0
        ogs_error("ogs_sbi_url_decode() failed : service_names[%s]",
3815
0
                service_names);
3816
0
        return OGS_ERROR;
3817
0
    }
3818
3819
    /*
3820
     * Issues #1730
3821
     * Send NF discovery query with service-names delimited with comma
3822
     *
3823
     * OpenAPI specification for sending NF discovery query with
3824
     * "service-names" parameter is defined as folowing:
3825
     *   name: service-names
3826
     *   ...
3827
     *   style: form
3828
     *   explode: false
3829
     *
3830
     * According to OpenAPI specification, this means array items
3831
     * should be delimited with a comma character (example: /users?id=3,4,5).
3832
     *
3833
     * See also https://swagger.io/docs/specification/serialization/
3834
     */
3835
0
    token = ogs_strtok_r(v, ",", &saveptr);
3836
0
    while (token != NULL) {
3837
0
        OpenAPI_service_name_e name = OpenAPI_service_name_NULL;
3838
3839
0
        if (discovery_option->num_of_service_names >=
3840
0
                OGS_SBI_MAX_NUM_OF_SERVICE_NAME) {
3841
0
            ogs_error("Too many service-names [%d:%d]",
3842
0
                    discovery_option->num_of_service_names + 1,
3843
0
                    OGS_SBI_MAX_NUM_OF_SERVICE_NAME);
3844
0
            ogs_free(v);
3845
0
            return OGS_ERROR;
3846
0
        }
3847
3848
0
        name = OpenAPI_service_name_FromString(token);
3849
0
        if (name)
3850
0
            ogs_sbi_discovery_option_add_service_names(discovery_option, name);
3851
0
        else
3852
0
            ogs_error("Invalid token[%s]", token);
3853
3854
0
        token = ogs_strtok_r(NULL, ",", &saveptr);
3855
0
    }
3856
3857
0
    ogs_free(v);
3858
0
    return OGS_OK;
3859
0
}
3860
3861
void ogs_sbi_discovery_option_add_snssais(
3862
        ogs_sbi_discovery_option_t *discovery_option, ogs_s_nssai_t *s_nssai)
3863
0
{
3864
0
    ogs_assert(discovery_option);
3865
0
    ogs_assert(s_nssai);
3866
3867
0
    ogs_assert(discovery_option->num_of_snssais < OGS_MAX_NUM_OF_SLICE);
3868
3869
0
    memcpy(&discovery_option->snssais[discovery_option->num_of_snssais],
3870
0
            s_nssai, sizeof(ogs_s_nssai_t));
3871
0
    discovery_option->num_of_snssais++;
3872
0
}
3873
char *ogs_sbi_discovery_option_build_snssais(
3874
        ogs_sbi_discovery_option_t *discovery_option)
3875
0
{
3876
0
    cJSON *item = NULL;
3877
0
    char *v = NULL;
3878
0
    int i;
3879
3880
0
    ogs_assert(discovery_option);
3881
3882
0
    item = cJSON_CreateArray();
3883
0
    if (!item) {
3884
0
        ogs_error("cJSON_CreateArray() failed");
3885
0
        return NULL;
3886
0
    }
3887
3888
0
    for (i = 0; i < discovery_option->num_of_snssais; i++) {
3889
0
        OpenAPI_snssai_t sNSSAI;
3890
0
        cJSON *snssaiItem = NULL;
3891
3892
0
        memset(&sNSSAI, 0, sizeof(sNSSAI));
3893
3894
0
        sNSSAI.sst = discovery_option->snssais[i].sst;
3895
0
        sNSSAI.sd = ogs_s_nssai_sd_to_string(discovery_option->snssais[i].sd);
3896
3897
0
        snssaiItem = OpenAPI_snssai_convertToJSON(&sNSSAI);
3898
0
        ogs_assert(snssaiItem);
3899
0
        cJSON_AddItemToArray(item, snssaiItem);
3900
3901
0
        if (sNSSAI.sd)
3902
0
            ogs_free(sNSSAI.sd);
3903
0
    }
3904
3905
0
    v = cJSON_PrintUnformatted(item);
3906
0
    ogs_expect(v);
3907
0
    cJSON_Delete(item);
3908
3909
0
    return v;
3910
0
}
3911
int ogs_sbi_discovery_option_parse_snssais(
3912
        ogs_sbi_discovery_option_t *discovery_option, char *snssais)
3913
0
{
3914
0
    cJSON *item = NULL;
3915
0
    cJSON *snssaiItem = NULL;
3916
0
    char *v = NULL;
3917
3918
0
    ogs_assert(discovery_option);
3919
0
    ogs_assert(snssais);
3920
3921
0
    v = ogs_sbi_url_decode(snssais);
3922
0
    if (!v) {
3923
0
        ogs_error("ogs_sbi_url_decode() failed : snssais[%s]", snssais);
3924
0
        return OGS_ERROR;
3925
0
    }
3926
3927
0
    item = cJSON_Parse(v);
3928
0
    if (!item) {
3929
0
        ogs_error("Cannot parse snssais[%s]", snssais);
3930
0
        ogs_free(v);
3931
0
        return OGS_ERROR;
3932
0
    }
3933
3934
0
    if (!cJSON_IsArray(item)) {
3935
0
        ogs_error("snssais is not a JSON array [%s]", snssais);
3936
0
        cJSON_Delete(item);
3937
0
        ogs_free(v);
3938
0
        return OGS_ERROR;
3939
0
    }
3940
3941
0
    cJSON_ArrayForEach(snssaiItem, item) {
3942
0
        OpenAPI_snssai_t *sNSSAI = NULL;
3943
0
        ogs_s_nssai_t s_nssai;
3944
3945
0
        if (discovery_option->num_of_snssais >= OGS_MAX_NUM_OF_SLICE) {
3946
0
            ogs_error("Too many snssais [%d:%d]",
3947
0
                    discovery_option->num_of_snssais + 1,
3948
0
                    OGS_MAX_NUM_OF_SLICE);
3949
0
            cJSON_Delete(item);
3950
0
            ogs_free(v);
3951
0
            return OGS_ERROR;
3952
0
        }
3953
3954
0
        if (!cJSON_IsObject(snssaiItem)) {
3955
0
            ogs_error("Invalid cJSON Type in snssais[%s]", snssais);
3956
0
            cJSON_Delete(item);
3957
0
            ogs_free(v);
3958
0
            return OGS_ERROR;
3959
0
        }
3960
3961
0
        sNSSAI = OpenAPI_snssai_parseFromJSON(snssaiItem);
3962
0
        if (!sNSSAI) {
3963
0
            ogs_error("OpenAPI_snssai_parseFromJSON() failed : snssais[%s]",
3964
0
                    snssais);
3965
0
            cJSON_Delete(item);
3966
0
            ogs_free(v);
3967
0
            return OGS_ERROR;
3968
0
        }
3969
3970
0
        s_nssai.sst = sNSSAI->sst;
3971
0
        s_nssai.sd = ogs_s_nssai_sd_from_string(sNSSAI->sd);
3972
3973
0
        ogs_sbi_discovery_option_add_snssais(discovery_option, &s_nssai);
3974
0
        OpenAPI_snssai_free(sNSSAI);
3975
0
    }
3976
0
    cJSON_Delete(item);
3977
3978
0
    ogs_free(v);
3979
0
    return OGS_OK;
3980
0
}
3981
3982
void ogs_sbi_discovery_option_set_guami(
3983
        ogs_sbi_discovery_option_t *discovery_option, ogs_guami_t *guami)
3984
0
{
3985
0
    ogs_assert(discovery_option);
3986
0
    ogs_assert(guami);
3987
3988
0
    ogs_assert(discovery_option->guami_presence == false);
3989
3990
0
    memcpy(&discovery_option->guami, guami, sizeof(ogs_guami_t));
3991
0
    discovery_option->guami_presence = true;
3992
0
}
3993
3994
char *ogs_sbi_discovery_option_build_guami(
3995
        ogs_sbi_discovery_option_t *discovery_option)
3996
0
{
3997
0
    OpenAPI_guami_t *Guami = NULL;
3998
0
    cJSON *guamiItem = NULL;
3999
0
    char *v = NULL;
4000
4001
0
    ogs_assert(discovery_option);
4002
0
    ogs_assert(discovery_option->guami_presence);
4003
4004
0
    Guami = ogs_sbi_build_guami(&discovery_option->guami);
4005
0
    ogs_assert(Guami);
4006
0
    guamiItem = OpenAPI_guami_convertToJSON(Guami);
4007
0
    ogs_assert(guamiItem);
4008
0
    ogs_sbi_free_guami(Guami);
4009
4010
0
    v = cJSON_PrintUnformatted(guamiItem);
4011
0
    ogs_expect(v);
4012
0
    cJSON_Delete(guamiItem);
4013
4014
0
    return v;
4015
0
}
4016
4017
int ogs_sbi_discovery_option_parse_guami(
4018
        ogs_sbi_discovery_option_t *discovery_option, char *guami)
4019
0
{
4020
0
    OpenAPI_guami_t *Guami = NULL;
4021
0
    ogs_guami_t parsed_guami;
4022
0
    cJSON *guamItem = NULL;
4023
0
    char *v = NULL;
4024
4025
0
    ogs_assert(discovery_option);
4026
0
    ogs_assert(guami);
4027
4028
0
    v = ogs_sbi_url_decode(guami);
4029
0
    if (!v) {
4030
0
        ogs_error("ogs_sbi_url_decode() failed : guami[%s]", guami);
4031
0
        return OGS_ERROR;
4032
0
    }
4033
4034
0
    guamItem = cJSON_Parse(v);
4035
0
    if (!guamItem) {
4036
0
        ogs_error("Cannot parse guami[%s]", guami);
4037
0
        ogs_free(v);
4038
0
        return OGS_ERROR;
4039
0
    }
4040
4041
0
    if (!cJSON_IsObject(guamItem)) {
4042
0
        ogs_error("guami is not a JSON object [%s]", guami);
4043
0
        cJSON_Delete(guamItem);
4044
0
        ogs_free(v);
4045
0
        return OGS_ERROR;
4046
0
    }
4047
4048
0
    Guami = OpenAPI_guami_parseFromJSON(guamItem);
4049
0
    if (!Guami) {
4050
0
        ogs_error("OpenAPI_guami_parseFromJSON() failed : guami[%s]", guami);
4051
0
        cJSON_Delete(guamItem);
4052
0
        ogs_free(v);
4053
0
        return OGS_ERROR;
4054
0
    }
4055
4056
0
    ogs_sbi_parse_guami(&parsed_guami, Guami);
4057
0
    ogs_sbi_discovery_option_set_guami(discovery_option, &parsed_guami);
4058
0
    OpenAPI_guami_free(Guami);
4059
0
    cJSON_Delete(guamItem);
4060
4061
0
    ogs_free(v);
4062
0
    return OGS_OK;
4063
0
}
4064
4065
void ogs_sbi_discovery_option_set_tai(
4066
        ogs_sbi_discovery_option_t *discovery_option, ogs_5gs_tai_t *tai)
4067
0
{
4068
0
    ogs_assert(discovery_option);
4069
0
    ogs_assert(tai);
4070
4071
0
    ogs_assert(discovery_option->tai_presence == false);
4072
4073
0
    memcpy(&discovery_option->tai, tai, sizeof(ogs_5gs_tai_t));
4074
0
    discovery_option->tai_presence = true;
4075
0
}
4076
char *ogs_sbi_discovery_option_build_tai(
4077
        ogs_sbi_discovery_option_t *discovery_option)
4078
0
{
4079
0
    OpenAPI_tai_t Tai;
4080
0
    cJSON *taiItem = NULL;
4081
0
    char *v = NULL;
4082
4083
0
    ogs_assert(discovery_option);
4084
0
    ogs_assert(discovery_option->tai_presence);
4085
4086
0
    memset(&Tai, 0, sizeof(Tai));
4087
4088
0
    Tai.plmn_id = ogs_sbi_build_plmn_id(&discovery_option->tai.plmn_id);
4089
0
    ogs_assert(Tai.plmn_id);
4090
0
    Tai.tac = ogs_uint24_to_0string(discovery_option->tai.tac);
4091
0
    ogs_assert(Tai.tac);
4092
4093
0
    taiItem = OpenAPI_tai_convertToJSON(&Tai);
4094
0
    ogs_assert(taiItem);
4095
4096
0
    ogs_sbi_free_plmn_id(Tai.plmn_id);
4097
0
    ogs_free(Tai.tac);
4098
4099
0
    v = cJSON_PrintUnformatted(taiItem);
4100
0
    ogs_expect(v);
4101
0
    cJSON_Delete(taiItem);
4102
4103
0
    return v;
4104
0
}
4105
int ogs_sbi_discovery_option_parse_tai(
4106
        ogs_sbi_discovery_option_t *discovery_option, char *tai)
4107
0
{
4108
0
    OpenAPI_tai_t *Tai = NULL;
4109
0
    ogs_5gs_tai_t parsed_tai;
4110
0
    cJSON *taiItem = NULL;
4111
0
    char *v = NULL;
4112
4113
0
    ogs_assert(discovery_option);
4114
0
    ogs_assert(tai);
4115
4116
0
    v = ogs_sbi_url_decode(tai);
4117
0
    if (!v) {
4118
0
        ogs_error("ogs_sbi_url_decode() failed : tai[%s]", tai);
4119
0
        return OGS_ERROR;
4120
0
    }
4121
4122
0
    taiItem = cJSON_Parse(v);
4123
0
    if (!taiItem) {
4124
0
        ogs_error("Cannot parse tai[%s]", tai);
4125
0
        ogs_free(v);
4126
0
        return OGS_ERROR;
4127
0
    }
4128
4129
0
    if (!cJSON_IsObject(taiItem)) {
4130
0
        ogs_error("tai is not a JSON object [%s]", tai);
4131
0
        cJSON_Delete(taiItem);
4132
0
        ogs_free(v);
4133
0
        return OGS_ERROR;
4134
0
    }
4135
4136
0
    Tai = OpenAPI_tai_parseFromJSON(taiItem);
4137
0
    if (!Tai) {
4138
0
        ogs_error("OpenAPI_tai_parseFromJSON() failed : tai[%s]", tai);
4139
0
        cJSON_Delete(taiItem);
4140
0
        ogs_free(v);
4141
0
        return OGS_ERROR;
4142
0
    }
4143
4144
0
    memset(&parsed_tai, 0, sizeof(parsed_tai));
4145
4146
0
    if (Tai->plmn_id)
4147
0
        ogs_sbi_parse_plmn_id(&parsed_tai.plmn_id, Tai->plmn_id);
4148
0
    if (Tai->tac)
4149
0
        parsed_tai.tac = ogs_uint24_from_string_hexadecimal(Tai->tac);
4150
4151
0
    ogs_sbi_discovery_option_set_tai(discovery_option, &parsed_tai);
4152
4153
0
    OpenAPI_tai_free(Tai);
4154
0
    cJSON_Delete(taiItem);
4155
4156
0
    ogs_free(v);
4157
0
    return OGS_OK;
4158
0
}
4159
4160
void ogs_sbi_discovery_option_add_target_plmn_list(
4161
        ogs_sbi_discovery_option_t *discovery_option,
4162
        ogs_plmn_id_t *target_plmn_id)
4163
0
{
4164
0
    ogs_assert(discovery_option);
4165
0
    ogs_assert(target_plmn_id);
4166
4167
0
    ogs_assert(discovery_option->num_of_target_plmn_list <
4168
0
                OGS_MAX_NUM_OF_PLMN);
4169
4170
0
    memcpy(&discovery_option->target_plmn_list[
4171
0
        discovery_option->num_of_target_plmn_list],
4172
0
        target_plmn_id, OGS_PLMN_ID_LEN);
4173
0
    discovery_option->num_of_target_plmn_list++;
4174
0
}
4175
4176
void ogs_sbi_discovery_option_add_requester_plmn_list(
4177
        ogs_sbi_discovery_option_t *discovery_option,
4178
        ogs_plmn_id_t *requester_plmn_id)
4179
0
{
4180
0
    ogs_assert(discovery_option);
4181
0
    ogs_assert(requester_plmn_id);
4182
4183
0
    ogs_assert(discovery_option->num_of_requester_plmn_list <
4184
0
                OGS_MAX_NUM_OF_PLMN);
4185
4186
0
    memcpy(&discovery_option->requester_plmn_list[
4187
0
        discovery_option->num_of_requester_plmn_list],
4188
0
        requester_plmn_id, OGS_PLMN_ID_LEN);
4189
0
    discovery_option->num_of_requester_plmn_list++;
4190
0
}
4191
4192
char *ogs_sbi_discovery_option_build_plmn_list(
4193
        ogs_plmn_id_t *plmn_list, int num_of_plmn_list)
4194
0
{
4195
0
    OpenAPI_list_t *PlmnList = NULL;
4196
0
    OpenAPI_plmn_id_t *PlmnId = NULL;
4197
0
    OpenAPI_lnode_t *node = NULL;
4198
0
    cJSON *item = NULL;
4199
4200
0
    char *v = NULL;
4201
4202
0
    ogs_assert(plmn_list);
4203
0
    ogs_assert(num_of_plmn_list);
4204
4205
0
    PlmnList = ogs_sbi_build_plmn_list(plmn_list, num_of_plmn_list);
4206
0
    ogs_assert(PlmnList);
4207
4208
0
    item = cJSON_CreateArray();
4209
0
    ogs_assert(item);
4210
4211
0
    OpenAPI_list_for_each(PlmnList, node) {
4212
0
        PlmnId = node->data;
4213
0
        if (PlmnId) {
4214
0
            cJSON *PlmnIdItem = OpenAPI_plmn_id_convertToJSON(PlmnId);
4215
0
            ogs_assert(PlmnIdItem);
4216
0
            cJSON_AddItemToArray(item, PlmnIdItem);
4217
0
        }
4218
0
    }
4219
4220
0
    v = cJSON_PrintUnformatted(item);
4221
0
    ogs_assert(v);
4222
4223
0
    cJSON_Delete(item);
4224
4225
0
    ogs_sbi_free_plmn_list(PlmnList);
4226
4227
0
    return v;
4228
0
}
4229
4230
int ogs_sbi_discovery_option_parse_plmn_list(
4231
        ogs_plmn_id_t *plmn_list, char *v)
4232
0
{
4233
0
    cJSON *item = NULL;
4234
0
    cJSON *PlmnIdJSON = NULL;
4235
0
    OpenAPI_list_t *PlmnList = NULL;
4236
0
    OpenAPI_plmn_id_t *PlmnId = NULL;
4237
0
    int num_of_plmn_list = -1;
4238
4239
0
    ogs_assert(v);
4240
0
    ogs_assert(plmn_list);
4241
4242
0
    item = cJSON_Parse(v);
4243
0
    if (!item) {
4244
0
        ogs_error("Cannot parse PLMN list [%s]", v);
4245
0
        return -1;
4246
0
    }
4247
4248
0
    if (!cJSON_IsArray(item)) {
4249
0
        ogs_error("PLMN list is not a JSON array [%s]", v);
4250
0
        goto cleanup;
4251
0
    }
4252
4253
0
    if (cJSON_GetArraySize(item) > OGS_MAX_NUM_OF_PLMN) {
4254
0
        ogs_error("Too many PLMN IDs in list [%d:%d]",
4255
0
                cJSON_GetArraySize(item), OGS_MAX_NUM_OF_PLMN);
4256
0
        goto cleanup;
4257
0
    }
4258
4259
0
    PlmnList = OpenAPI_list_create();
4260
0
    ogs_assert(PlmnList);
4261
4262
0
    cJSON_ArrayForEach(PlmnIdJSON, item) {
4263
0
        if (!cJSON_IsObject(PlmnIdJSON)) {
4264
0
            ogs_error("Invalid cJSON Type in PLMN list [%s]", v);
4265
0
            goto cleanup;
4266
0
        }
4267
4268
0
        PlmnId = OpenAPI_plmn_id_parseFromJSON(PlmnIdJSON);
4269
0
        if (!PlmnId) {
4270
0
            ogs_error("OpenAPI_plmn_id_parseFromJSON() failed [%s]", v);
4271
0
            goto cleanup;
4272
0
        }
4273
4274
0
        OpenAPI_list_add(PlmnList, PlmnId);
4275
0
    }
4276
4277
0
    num_of_plmn_list = ogs_sbi_parse_plmn_list(plmn_list, PlmnList);
4278
4279
0
cleanup:
4280
0
    if (PlmnList)
4281
0
        ogs_sbi_free_plmn_list(PlmnList);
4282
0
    cJSON_Delete(item);
4283
4284
0
    return num_of_plmn_list;
4285
0
}
4286
4287
void ogs_sbi_discovery_option_set_hnrf_uri(
4288
        ogs_sbi_discovery_option_t *discovery_option, char *hnrf_uri)
4289
0
{
4290
0
    ogs_assert(discovery_option);
4291
0
    ogs_assert(hnrf_uri);
4292
4293
0
    ogs_assert(!discovery_option->hnrf_uri);
4294
0
    discovery_option->hnrf_uri = ogs_strdup(hnrf_uri);
4295
0
    ogs_assert(discovery_option->hnrf_uri);
4296
0
}
4297
4298
void ogs_sbi_discovery_option_clear_hnrf_uri(
4299
        ogs_sbi_discovery_option_t *discovery_option)
4300
0
{
4301
0
    ogs_assert(discovery_option);
4302
0
    ogs_free(discovery_option->hnrf_uri);
4303
    discovery_option->hnrf_uri = NULL;
4304
0
}