/* * Copyright (C) 2019,2020 by Sukchan Lee * * This file is part of Open5GS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "npcf-build.h" ogs_sbi_request_t *af_npcf_policyauthorization_build_create( af_sess_t *sess, void *data) { ogs_sbi_message_t message; ogs_sbi_request_t *request = NULL; ogs_sbi_server_t *server = NULL; ogs_sbi_header_t header; OpenAPI_app_session_context_t AppSessionContext; OpenAPI_app_session_context_req_data_t AscReqData; OpenAPI_events_subsc_req_data_t evSubsc; OpenAPI_list_t *EventList = NULL; OpenAPI_af_event_subscription_t *Event = NULL; OpenAPI_snssai_t sNssai; OpenAPI_list_t *MediaComponentList = NULL; OpenAPI_map_t *MediaComponentMap = NULL; OpenAPI_media_component_t *MediaComponent = NULL; OpenAPI_list_t *SubComponentList = NULL; OpenAPI_map_t *SubComponentMap = NULL; OpenAPI_media_sub_component_t *SubComponent = NULL; OpenAPI_list_t *fDescList = NULL; OpenAPI_list_t *codecList = NULL; OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; int i = 0, j = 0; af_npcf_policyauthorization_param_t *af_param; ogs_assert(sess); ogs_assert(sess->app_session.af.id); af_param = data; ogs_assert(af_param); ogs_assert(af_param->med_type); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; message.h.api.version = (char *)OGS_SBI_API_V1; message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; message.AppSessionContext = &AppSessionContext; memset(&AppSessionContext, 0, sizeof(AppSessionContext)); AppSessionContext.asc_req_data = &AscReqData; memset(&AscReqData, 0, sizeof(AscReqData)); server = ogs_sbi_server_first(); ogs_assert(server); memset(&header, 0, sizeof(header)); header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; header.api.version = (char *)OGS_SBI_API_V1; header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; header.resource.component[1] = (char *)sess->app_session.af.id; AscReqData.notif_uri = ogs_sbi_server_uri(server, &header); ogs_assert(AscReqData.notif_uri); AscReqData.supp_feat = ogs_uint64_to_string(sess->policyauthorization_features); ogs_assert(AscReqData.supp_feat); AscReqData.ue_ipv4 = sess->ipv4addr; AscReqData.ue_ipv6 = sess->ipv6addr; AscReqData.dnn = sess->dnn; memset(&evSubsc, 0, sizeof(evSubsc)); EventList = OpenAPI_list_create(); ogs_assert(EventList); Event = ogs_calloc(1, sizeof(*Event)); ogs_assert(Event); Event->event = OpenAPI_npcf_af_event_CHARGING_CORRELATION; OpenAPI_list_add(EventList, Event); Event = ogs_calloc(1, sizeof(*Event)); ogs_assert(Event); Event->event = OpenAPI_npcf_af_event_ANI_REPORT; Event->notif_method = OpenAPI_af_notif_method_ONE_TIME; OpenAPI_list_add(EventList, Event); evSubsc.events = EventList; AscReqData.ev_subsc = &evSubsc; memset(&sNssai, 0, sizeof(sNssai)); if (sess->s_nssai.sst) { sNssai.sst = sess->s_nssai.sst; sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); AscReqData.slice_info = &sNssai; } AscReqData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED; AscReqData.supi = sess->supi; AscReqData.gpsi = sess->gpsi; AscReqData.af_app_id = (char *)"IMS Services"; AscReqData.res_prio = OpenAPI_reserv_priority_PRIO_1; MediaComponentList = OpenAPI_list_create(); ogs_assert(MediaComponentList); MediaComponent = ogs_calloc(1, sizeof(*MediaComponent)); ogs_assert(MediaComponent); MediaComponent->med_comp_n = (i++); MediaComponent->f_status = OpenAPI_flow_status_ENABLED; MediaComponent->med_type = af_param->med_type; if (af_param->qos_type == 1) { MediaComponent->mar_bw_dl = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->mar_bw_ul = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->rr_bw = ogs_sbi_bitrate_to_string( 2400, OGS_SBI_BITRATE_BPS); MediaComponent->rs_bw = ogs_sbi_bitrate_to_string( 2400, OGS_SBI_BITRATE_BPS); } else if (af_param->qos_type == 2) { MediaComponent->mar_bw_dl = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->mar_bw_ul = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->rr_bw = ogs_sbi_bitrate_to_string( 88000, OGS_SBI_BITRATE_BPS); MediaComponent->rs_bw = ogs_sbi_bitrate_to_string( 88000, OGS_SBI_BITRATE_BPS); } /* Codec */ codecList = OpenAPI_list_create(); ogs_assert(codecList); OpenAPI_list_add(codecList, ogs_strdup("downlink\noffer\n" "m=audio 49000 RTP/AVP 116 99 97 105 100\r\nb=AS:41\r\n" "b=RS:512\r\nb=RR:1537\r\na=maxptime:240\r\n" "a=des:qos mandatory local sendrecv\r\na=curr:qos local none\r\n" "a=des:qos option")); OpenAPI_list_add(codecList, ogs_strdup("uplink\nanswer\nm=audio 50020 RTP/AVP 99 105\r\n" "b=AS:41\r\nb=RS:600\r\nb=RR:2000\r\na=rtpmap:99 AMR-WB/16000/1\r\n" "a=fmtp:99 mode-change-capability=2;max-red=0\r\n" "a=rtpmap:105 telephone-event/16")); ogs_assert(codecList->count); MediaComponent->codecs = codecList; MediaComponentMap = OpenAPI_map_create( ogs_msprintf("%d", MediaComponent->med_comp_n), MediaComponent); ogs_assert(MediaComponentMap); ogs_assert(MediaComponentMap->key); OpenAPI_list_add(MediaComponentList, MediaComponentMap); /* Sub Component */ SubComponentList = OpenAPI_list_create(); ogs_assert(SubComponentList); /* Sub Component #1 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_NO_INFO; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); if (af_param->flow_type == 0) { /* Nothing */ } else if (af_param->flow_type == 1) { OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 172.20.166.84 to 10.45.0.2 20001")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.2 to 172.20.166.84 20360")); } else if (af_param->flow_type == 2) { OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 172.20.166.84 to 10.45.0.2 30001")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.2 to 172.20.166.84 30360")); } else if (af_param->flow_type == 99) { OpenAPI_list_add(fDescList, ogs_strdup("permit out icmp from any to any")); OpenAPI_list_add(fDescList, ogs_strdup("permit in icmp from any to any")); } else { ogs_assert_if_reached(); } if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); /* Sub Component #2 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_RTCP; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); if (af_param->flow_type == 0) { /* Nothing */ } else if (af_param->flow_type == 1 || af_param->flow_type == 99) { OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 172.20.166.84 to 10.45.0.2 20002")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.2 to 172.20.166.84 20361")); } else if (af_param->flow_type == 2) { OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 172.20.166.84 to 10.45.0.2 30002")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.2 to 172.20.166.84 30361")); } else { ogs_assert_if_reached(); } if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); ogs_assert(SubComponentList->count); MediaComponent->med_sub_comps = SubComponentList; ogs_assert(MediaComponentList->count); AscReqData.med_components = MediaComponentList; request = ogs_sbi_build_request(&message); ogs_expect(request); if (AscReqData.notif_uri) ogs_free(AscReqData.notif_uri); if (AscReqData.supp_feat) ogs_free(AscReqData.supp_feat); EventList = evSubsc.events; OpenAPI_list_for_each(EventList, node) { Event = node->data; if (Event) ogs_free(Event); } OpenAPI_list_free(EventList); if (sNssai.sd) ogs_free(sNssai.sd); OpenAPI_list_for_each(MediaComponentList, node) { MediaComponentMap = node->data; if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { if (MediaComponent->mar_bw_dl) ogs_free(MediaComponent->mar_bw_dl); if (MediaComponent->mar_bw_ul) ogs_free(MediaComponent->mar_bw_ul); if (MediaComponent->mir_bw_dl) ogs_free(MediaComponent->mir_bw_dl); if (MediaComponent->mir_bw_ul) ogs_free(MediaComponent->mir_bw_ul); if (MediaComponent->rr_bw) ogs_free(MediaComponent->rr_bw); if (MediaComponent->rs_bw) ogs_free(MediaComponent->rs_bw); codecList = MediaComponent->codecs; OpenAPI_list_for_each(codecList, node2) { if (node2->data) ogs_free(node2->data); } OpenAPI_list_free(codecList); SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { SubComponentMap = node2->data; if (SubComponentMap) { SubComponent = SubComponentMap->value; if (SubComponent) { fDescList = SubComponent->f_descs; OpenAPI_list_for_each(fDescList, node3) { if (node3->data) ogs_free(node3->data); } OpenAPI_list_free(fDescList); ogs_free(SubComponent); } if (SubComponentMap->key) ogs_free(SubComponentMap->key); ogs_free(SubComponentMap); } } OpenAPI_list_free(SubComponentList); ogs_free(MediaComponent); } if (MediaComponentMap->key) ogs_free(MediaComponentMap->key); ogs_free(MediaComponentMap); } } OpenAPI_list_free(MediaComponentList); return request; } ogs_sbi_request_t *af_npcf_policyauthorization_build_update( af_sess_t *sess, void *data) { ogs_sbi_message_t message; ogs_sbi_request_t *request = NULL; OpenAPI_app_session_context_update_data_patch_t AppSessionContextUpdateDataPatch; OpenAPI_app_session_context_update_data_t AscUpdateData; OpenAPI_list_t *MediaComponentList = NULL; OpenAPI_map_t *MediaComponentMap = NULL; OpenAPI_media_component_rm_t *MediaComponent = NULL; OpenAPI_list_t *SubComponentList = NULL; OpenAPI_map_t *SubComponentMap = NULL; OpenAPI_media_sub_component_rm_t *SubComponent = NULL; OpenAPI_list_t *fDescList = NULL; OpenAPI_list_t *codecList = NULL; OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; int i = 0, j = 0; af_npcf_policyauthorization_param_t *af_param; ogs_assert(sess); ogs_assert(sess->app_session.pcf.resource_uri); af_param = data; ogs_assert(af_param); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_PATCH; message.h.uri = sess->app_session.pcf.resource_uri; message.AppSessionContextUpdateDataPatch = &AppSessionContextUpdateDataPatch; memset(&AppSessionContextUpdateDataPatch, 0, sizeof(AppSessionContextUpdateDataPatch)); AppSessionContextUpdateDataPatch.asc_req_data = &AscUpdateData; memset(&AscUpdateData, 0, sizeof(AscUpdateData)); AscUpdateData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED; AscUpdateData.af_app_id = (char *)"IMS Services"; AscUpdateData.res_prio = OpenAPI_reserv_priority_PRIO_1; MediaComponentList = OpenAPI_list_create(); ogs_assert(MediaComponentList); MediaComponent = ogs_calloc(1, sizeof(*MediaComponent)); ogs_assert(MediaComponent); MediaComponent->med_comp_n = (i++); MediaComponent->f_status = OpenAPI_flow_status_ENABLED; MediaComponent->med_type = OpenAPI_media_type_AUDIO; if (af_param->qos_type == 1) { MediaComponent->mar_bw_dl = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->mar_bw_ul = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->rr_bw = ogs_sbi_bitrate_to_string( 2400, OGS_SBI_BITRATE_BPS); MediaComponent->rs_bw = ogs_sbi_bitrate_to_string( 2400, OGS_SBI_BITRATE_BPS); } else if (af_param->qos_type == 2) { MediaComponent->mar_bw_dl = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->mar_bw_ul = ogs_sbi_bitrate_to_string( 96000, OGS_SBI_BITRATE_BPS); MediaComponent->mir_bw_dl = ogs_sbi_bitrate_to_string( 88000, OGS_SBI_BITRATE_BPS); MediaComponent->mir_bw_ul = ogs_sbi_bitrate_to_string( 88000, OGS_SBI_BITRATE_BPS); } /* Codec */ codecList = OpenAPI_list_create(); ogs_assert(codecList); OpenAPI_list_add(codecList, ogs_strdup("downlink\noffer\n" "m=audio 49000 RTP/AVP 116 99 97 105 100\r\nb=AS:41\r\n" "b=RS:512\r\nb=RR:1537\r\na=maxptime:240\r\n" "a=des:qos mandatory local sendrecv\r\na=curr:qos local none\r\n" "a=des:qos option")); OpenAPI_list_add(codecList, ogs_strdup("uplink\nanswer\nm=audio 50020 RTP/AVP 99 105\r\n" "b=AS:41\r\nb=RS:600\r\nb=RR:2000\r\na=rtpmap:99 AMR-WB/16000/1\r\n" "a=fmtp:99 mode-change-capability=2;max-red=0\r\n" "a=rtpmap:105 telephone-event/16")); ogs_assert(codecList->count); MediaComponent->codecs = codecList; MediaComponentMap = OpenAPI_map_create( ogs_msprintf("%d", MediaComponent->med_comp_n), MediaComponent); ogs_assert(MediaComponentMap); ogs_assert(MediaComponentMap->key); OpenAPI_list_add(MediaComponentList, MediaComponentMap); /* Sub Component */ SubComponentList = OpenAPI_list_create(); ogs_assert(SubComponentList); /* Sub Component #1 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_NO_INFO; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); if (af_param->flow_type == 0) { /* Nothing */ } else if (af_param->flow_type == 1) { OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 172.20.166.84 to 10.45.0.2 20001")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.2 to 172.20.166.84 20360")); } else if (af_param->flow_type == 99) { OpenAPI_list_add(fDescList, ogs_strdup("permit out icmp from any to any")); OpenAPI_list_add(fDescList, ogs_strdup("permit in icmp from any to any")); } else { ogs_assert_if_reached(); } if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); /* Sub Component #2 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_RTCP; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); if (af_param->flow_type) { OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 172.20.166.84 to 10.45.0.2 20002")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.2 to 172.20.166.84 20361")); } if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); ogs_assert(SubComponentList->count); MediaComponent->med_sub_comps = SubComponentList; ogs_assert(MediaComponentList->count); AscUpdateData.med_components = MediaComponentList; request = ogs_sbi_build_request(&message); ogs_expect(request); OpenAPI_list_for_each(MediaComponentList, node) { MediaComponentMap = node->data; if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { if (MediaComponent->mar_bw_dl) ogs_free(MediaComponent->mar_bw_dl); if (MediaComponent->mar_bw_ul) ogs_free(MediaComponent->mar_bw_ul); if (MediaComponent->mir_bw_dl) ogs_free(MediaComponent->mir_bw_dl); if (MediaComponent->mir_bw_ul) ogs_free(MediaComponent->mir_bw_ul); if (MediaComponent->rr_bw) ogs_free(MediaComponent->rr_bw); if (MediaComponent->rs_bw) ogs_free(MediaComponent->rs_bw); codecList = MediaComponent->codecs; OpenAPI_list_for_each(codecList, node2) { if (node2->data) ogs_free(node2->data); } OpenAPI_list_free(codecList); SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { SubComponentMap = node2->data; if (SubComponentMap) { SubComponent = SubComponentMap->value; if (SubComponent) { fDescList = SubComponent->f_descs; OpenAPI_list_for_each(fDescList, node3) { if (node3->data) ogs_free(node3->data); } OpenAPI_list_free(fDescList); ogs_free(SubComponent); } if (SubComponentMap->key) ogs_free(SubComponentMap->key); ogs_free(SubComponentMap); } } OpenAPI_list_free(SubComponentList); ogs_free(MediaComponent); } if (MediaComponentMap->key) ogs_free(MediaComponentMap->key); ogs_free(MediaComponentMap); } } OpenAPI_list_free(MediaComponentList); return request; } ogs_sbi_request_t *af_npcf_policyauthorization_build_delete( af_sess_t *sess, void *data) { ogs_sbi_message_t message; ogs_sbi_request_t *request = NULL; ogs_assert(sess); ogs_assert(sess->app_session.pcf.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.uri = ogs_msprintf("%s/%s", sess->app_session.pcf.resource_uri, OGS_SBI_RESOURCE_NAME_DELETE); request = ogs_sbi_build_request(&message); ogs_expect(request); ogs_free(message.h.uri); return request; } ogs_sbi_request_t *af_npcf_policyauthorization_build_create_video( af_sess_t *sess, void *data) { ogs_sbi_message_t message; ogs_sbi_request_t *request = NULL; ogs_sbi_server_t *server = NULL; ogs_sbi_header_t header; OpenAPI_app_session_context_t AppSessionContext; OpenAPI_app_session_context_req_data_t AscReqData; OpenAPI_events_subsc_req_data_t evSubsc; OpenAPI_list_t *EventList = NULL; OpenAPI_af_event_subscription_t *Event = NULL; OpenAPI_snssai_t sNssai; OpenAPI_list_t *MediaComponentList = NULL; OpenAPI_map_t *MediaComponentMap = NULL; OpenAPI_media_component_t *MediaComponent = NULL; OpenAPI_list_t *SubComponentList = NULL; OpenAPI_map_t *SubComponentMap = NULL; OpenAPI_media_sub_component_t *SubComponent = NULL; OpenAPI_list_t *fDescList = NULL; OpenAPI_list_t *codecList = NULL; OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; int i = 0, j = 0; af_npcf_policyauthorization_param_t *af_param; ogs_assert(sess); ogs_assert(sess->app_session.af.id); af_param = data; ogs_assert(af_param); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; message.h.api.version = (char *)OGS_SBI_API_V1; message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; message.AppSessionContext = &AppSessionContext; memset(&AppSessionContext, 0, sizeof(AppSessionContext)); AppSessionContext.asc_req_data = &AscReqData; memset(&AscReqData, 0, sizeof(AscReqData)); server = ogs_sbi_server_first(); ogs_assert(server); memset(&header, 0, sizeof(header)); header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; header.api.version = (char *)OGS_SBI_API_V1; header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; header.resource.component[1] = (char *)sess->app_session.af.id; AscReqData.notif_uri = ogs_sbi_server_uri(server, &header); ogs_assert(AscReqData.notif_uri); AscReqData.supp_feat = ogs_uint64_to_string(sess->policyauthorization_features); ogs_assert(AscReqData.supp_feat); AscReqData.ue_ipv4 = sess->ipv4addr; AscReqData.ue_ipv6 = sess->ipv6addr; AscReqData.dnn = sess->dnn; memset(&evSubsc, 0, sizeof(evSubsc)); EventList = OpenAPI_list_create(); ogs_assert(EventList); Event = ogs_calloc(1, sizeof(*Event)); ogs_assert(Event); Event->event = OpenAPI_npcf_af_event_CHARGING_CORRELATION; OpenAPI_list_add(EventList, Event); Event = ogs_calloc(1, sizeof(*Event)); ogs_assert(Event); Event->event = OpenAPI_npcf_af_event_ANI_REPORT; Event->notif_method = OpenAPI_af_notif_method_ONE_TIME; OpenAPI_list_add(EventList, Event); evSubsc.events = EventList; AscReqData.ev_subsc = &evSubsc; memset(&sNssai, 0, sizeof(sNssai)); if (sess->s_nssai.sst) { sNssai.sst = sess->s_nssai.sst; sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); AscReqData.slice_info = &sNssai; } AscReqData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED; AscReqData.supi = sess->supi; AscReqData.gpsi = sess->gpsi; AscReqData.af_app_id = (char *)"IMS Services"; AscReqData.res_prio = OpenAPI_reserv_priority_PRIO_1; MediaComponentList = OpenAPI_list_create(); ogs_assert(MediaComponentList); MediaComponent = ogs_calloc(1, sizeof(*MediaComponent)); ogs_assert(MediaComponent); MediaComponent->med_comp_n = (i++); MediaComponent->f_status = OpenAPI_flow_status_ENABLED; MediaComponent->med_type = OpenAPI_media_type_AUDIO; MediaComponent->mar_bw_dl = ogs_sbi_bitrate_to_string( 41000, OGS_SBI_BITRATE_BPS); MediaComponent->mar_bw_ul = ogs_sbi_bitrate_to_string( 41000, OGS_SBI_BITRATE_BPS); MediaComponent->rr_bw = ogs_sbi_bitrate_to_string( 2000, OGS_SBI_BITRATE_BPS); MediaComponent->rs_bw = ogs_sbi_bitrate_to_string( 600, OGS_SBI_BITRATE_BPS); /* Codec */ codecList = OpenAPI_list_create(); ogs_assert(codecList); OpenAPI_list_add(codecList, ogs_strdup("downlink\noffer\nm=audio 50026 RTP/AVP 104 102 96 97\r\n" \ "b=AS:41\r\n" \ "b=RS:600\r\n" \ "b=RR:2000\r\n" \ "a=rtpmap:104 AMR-WB/16000/1\r\n" \ "a=fmtp:104 mode-change-capability=2;max-red=0\r\n" \ "a=rtpmap:102 AMR/8000/1\r\n" \ "a=fmtp:102 mode-change-capability=2;max-red=0\r\n" \ "a=rtpmap:96 telephone-event/16000\r\n" \ "a=fmtp:96 0-15\r\n" \ "a=rtpmap:97 telephone-event/8000\r\n" \ "a=fmtp:97 0-15\r\n" \ "a=curr:qos local none\r\n" \ "a=curr:qos remote none\r\n" \ "a=des:qos mandatory local sendrecv\r\n" \ "a=des:qos optional remote sendrecv\r\n" \ "a=sendrecv\r\n" \ "a=maxptime:240\r\n" \ "a=ptime:20\r\n")); OpenAPI_list_add(codecList, ogs_strdup("uplink\nanswer\nm=audio 50022 RTP/AVP 104 96\r\n" \ "b=AS:41\r\n" \ "b=RS:600\r\n" \ "b=RR:2000\r\n" \ "a=rtpmap:104 AMR-WB/16000/1\r\n" \ "a=fmtp:104 mode-change-capability=2;max-red=0\r\n" \ "a=rtpmap:96 telephone-event/16000\r\n" \ "a=fmtp:96 0-15\r\n" \ "a=curr:qos local none\r\n" \ "a=curr:qos remote none\r\n" \ "a=des:qos mandatory local sendrecv\r\n" \ "a=des:qos mandatory remote sendrecv\r\n" \ "a=conf:qos remote sendrecv\r\n" \ "a=sendrecv\r\n" \ "a=maxptime:240\r\n" \ "a=ptime:20\r\n")); ogs_assert(codecList->count); MediaComponent->codecs = codecList; MediaComponentMap = OpenAPI_map_create( ogs_msprintf("%d", MediaComponent->med_comp_n), MediaComponent); ogs_assert(MediaComponentMap); ogs_assert(MediaComponentMap->key); OpenAPI_list_add(MediaComponentList, MediaComponentMap); /* Sub Component */ SubComponentList = OpenAPI_list_create(); ogs_assert(SubComponentList); j = 0; /* Sub Component #1 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_NO_INFO; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 10.45.0.5 50026 to 10.45.0.3 50022")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.3 50022 to 10.45.0.5 50026")); if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); /* Sub Component #2 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_NO_INFO; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 10.45.0.5 50027 to 10.45.0.3 50023")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.3 50023 to 10.45.0.5 50027")); if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); ogs_assert(SubComponentList->count); MediaComponent->med_sub_comps = SubComponentList; MediaComponent = ogs_calloc(1, sizeof(*MediaComponent)); ogs_assert(MediaComponent); MediaComponent->med_comp_n = (i++); MediaComponent->f_status = OpenAPI_flow_status_ENABLED; MediaComponent->med_type = OpenAPI_media_type_VIDEO; MediaComponent->mar_bw_dl = ogs_sbi_bitrate_to_string( 401000, OGS_SBI_BITRATE_BPS); MediaComponent->mar_bw_ul = ogs_sbi_bitrate_to_string( 401000, OGS_SBI_BITRATE_BPS); MediaComponent->rr_bw = ogs_sbi_bitrate_to_string( 2000, OGS_SBI_BITRATE_BPS); MediaComponent->rs_bw = ogs_sbi_bitrate_to_string( 600, OGS_SBI_BITRATE_BPS); /* Codec */ codecList = OpenAPI_list_create(); ogs_assert(codecList); OpenAPI_list_add(codecList, ogs_strdup("downlink\noffer\nm=video 60010 RTP/AVP 114 113\r\n" \ "b=AS:401\r\n" \ "b=RS:600\r\n" \ "b=RR:2000\r\n" \ "a=rtpmap:114 H264/90000\r\n" \ "a=fmtp:114 profile-level-id=42C00C;packetization-mode=1;sar-understood=16;sar-supported=1;sprop-parameter-sets=Z0LADNoPCmgG0KE1,aM4G4g==\r\n" \ "a=rtpmap:113 H264/90000\r\n" \ "a=fmtp:113 profile-level-id=42C00C;packetization-mode=0;sar-understood=16;sar-supported=1;sprop-parameter-sets=Z0LADNoPCmgG0KE1,aM4G4g==\r\n" \ "a=curr:qos local none\r\n" \ "a=curr:qos remote none\r\n" \ "a=des:qos mandatory local sendrecv\r\n" \ "a=des:qos optional remote sendrecv\r\n" \ "a=rtcp-fb:* nack\r\n" \ "a=rtcp-fb:* nack pli\r\n" \ "a=rtcp-fb:* ccm fir\r\n" \ "a=rtcp-fb:* ccm tmmbr\r\n" \ "a=sendrecv\r\n" \ "a=tcap:1 RTP/AVPF\r\n" \ "a=pcfg:1 t=1\r\n" \ "a=extmap:2 urn:3gpp:video-orientation\r\n")); OpenAPI_list_add(codecList, ogs_strdup("uplink\nanswer\nm=video 60010 RTP/AVPF 114\r\n" \ "b=AS:401\r\n" \ "b=RS:600\r\n" \ "b=RR:2000\r\n" \ "a=rtpmap:114 H264/90000\r\n" \ "a=fmtp:114 profile-level-id=42C00C;packetization-mode=1;sar-understood=16;sar-supported=1;sprop-parameter-sets=Z0LADNoPCmgG0KE1,aM4G4g==\r\n" \ "a=curr:qos local none\r\n" \ "a=curr:qos remote none\r\n" \ "a=des:qos mandatory local sendrecv\r\n" \ "a=des:qos mandatory remote sendrecv\r\n" \ "a=conf:qos remote sendrecv\r\n" \ "a=rtcp-fb:* nack\r\n" \ "a=rtcp-fb:* nack pli\r\n" \ "a=rtcp-fb:* ccm fir\r\n" \ "a=rtcp-fb:* ccm tmmbr\r\n" \ "a=sendrecv\r\n" \ "a=extmap:2 urn:3gpp:video-orientation\r\n" \ "a=acfg:1 t=1\r\n")); ogs_assert(codecList->count); MediaComponent->codecs = codecList; MediaComponentMap = OpenAPI_map_create( ogs_msprintf("%d", MediaComponent->med_comp_n), MediaComponent); ogs_assert(MediaComponentMap); ogs_assert(MediaComponentMap->key); OpenAPI_list_add(MediaComponentList, MediaComponentMap); /* Sub Component */ SubComponentList = OpenAPI_list_create(); ogs_assert(SubComponentList); j = 0; /* Sub Component #1 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_NO_INFO; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 10.45.0.5 60010 to 10.45.0.3 60010")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.3 60010 to 10.45.0.5 60010")); if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); /* Sub Component #2 */ SubComponent = ogs_calloc(1, sizeof(*SubComponent)); ogs_assert(SubComponent); SubComponent->f_num = (j++); SubComponent->flow_usage = OpenAPI_flow_usage_NO_INFO; SubComponentMap = OpenAPI_map_create( ogs_msprintf("%d", SubComponent->f_num), SubComponent); ogs_assert(SubComponentMap); ogs_assert(SubComponentMap->key); OpenAPI_list_add(SubComponentList, SubComponentMap); /* Flow Description */ fDescList = OpenAPI_list_create(); ogs_assert(fDescList); OpenAPI_list_add(fDescList, ogs_strdup("permit out 17 from 10.45.0.5 60011 to 10.45.0.3 60011")); OpenAPI_list_add(fDescList, ogs_strdup("permit in 17 from 10.45.0.3 60011 to 10.45.0.5 60011")); if (fDescList->count) SubComponent->f_descs = fDescList; else OpenAPI_list_free(fDescList); ogs_assert(SubComponentList->count); MediaComponent->med_sub_comps = SubComponentList; ogs_assert(MediaComponentList->count); AscReqData.med_components = MediaComponentList; request = ogs_sbi_build_request(&message); ogs_expect(request); if (AscReqData.notif_uri) ogs_free(AscReqData.notif_uri); if (AscReqData.supp_feat) ogs_free(AscReqData.supp_feat); EventList = evSubsc.events; OpenAPI_list_for_each(EventList, node) { Event = node->data; if (Event) ogs_free(Event); } OpenAPI_list_free(EventList); if (sNssai.sd) ogs_free(sNssai.sd); OpenAPI_list_for_each(MediaComponentList, node) { MediaComponentMap = node->data; if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { if (MediaComponent->mar_bw_dl) ogs_free(MediaComponent->mar_bw_dl); if (MediaComponent->mar_bw_ul) ogs_free(MediaComponent->mar_bw_ul); if (MediaComponent->mir_bw_dl) ogs_free(MediaComponent->mir_bw_dl); if (MediaComponent->mir_bw_ul) ogs_free(MediaComponent->mir_bw_ul); if (MediaComponent->rr_bw) ogs_free(MediaComponent->rr_bw); if (MediaComponent->rs_bw) ogs_free(MediaComponent->rs_bw); codecList = MediaComponent->codecs; OpenAPI_list_for_each(codecList, node2) { if (node2->data) ogs_free(node2->data); } OpenAPI_list_free(codecList); SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { SubComponentMap = node2->data; if (SubComponentMap) { SubComponent = SubComponentMap->value; if (SubComponent) { fDescList = SubComponent->f_descs; OpenAPI_list_for_each(fDescList, node3) { if (node3->data) ogs_free(node3->data); } OpenAPI_list_free(fDescList); ogs_free(SubComponent); } if (SubComponentMap->key) ogs_free(SubComponentMap->key); ogs_free(SubComponentMap); } } OpenAPI_list_free(SubComponentList); ogs_free(MediaComponent); } if (MediaComponentMap->key) ogs_free(MediaComponentMap->key); ogs_free(MediaComponentMap); } } OpenAPI_list_free(MediaComponentList); return request; }