From 3e980e006fab7afaef75892e1654515eed9f7ced Mon Sep 17 00:00:00 2001 From: mitmitmitm Date: Wed, 18 Jan 2023 12:18:39 +0100 Subject: [PATCH] [PCF] Handle framed routes, forward them to BSF --- src/pcf/context.c | 3 +++ src/pcf/context.h | 3 +++ src/pcf/nbsf-build.c | 3 +++ src/pcf/npcf-handler.c | 24 ++++++++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/src/pcf/context.c b/src/pcf/context.c index 71f3fa6f5..bf8456890 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -314,6 +314,9 @@ void pcf_sess_remove(pcf_sess_t *sess) clear_ipv4addr(sess); clear_ipv6prefix(sess); + OpenAPI_clear_and_free_string_list(sess->ipv4_frame_route_list); + OpenAPI_clear_and_free_string_list(sess->ipv6_frame_route_list); + if (sess->subscribed_sess_ambr) OpenAPI_ambr_free(sess->subscribed_sess_ambr); if (sess->subscribed_default_qos) diff --git a/src/pcf/context.h b/src/pcf/context.h index cc92a0c40..0dbd446a8 100644 --- a/src/pcf/context.h +++ b/src/pcf/context.h @@ -96,6 +96,9 @@ struct pcf_sess_s { char *ipv4addr_string; char *ipv6prefix_string; + OpenAPI_list_t *ipv4_frame_route_list; + OpenAPI_list_t *ipv6_frame_route_list; + uint32_t ipv4addr; struct { uint8_t len; diff --git a/src/pcf/nbsf-build.c b/src/pcf/nbsf-build.c index d86277ab7..03b6c4006 100644 --- a/src/pcf/nbsf-build.c +++ b/src/pcf/nbsf-build.c @@ -59,6 +59,9 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( PcfBinding.ipv4_addr = sess->ipv4addr_string; PcfBinding.ipv6_prefix = sess->ipv6prefix_string; + PcfBinding.ipv4_frame_route_list = sess->ipv4_frame_route_list; + PcfBinding.ipv6_frame_route_list = sess->ipv6_frame_route_list; + if (!sess->dnn) { ogs_error("No DNN"); goto end; diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index 7030f29ed..97cbfc04d 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -296,6 +296,30 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, pcf_sess_set_ipv6prefix( sess, SmPolicyContextData->ipv6_address_prefix)); + if (SmPolicyContextData->ipv4_frame_route_list) { + OpenAPI_lnode_t *node = NULL; + + OpenAPI_clear_and_free_string_list(sess->ipv4_frame_route_list); + sess->ipv4_frame_route_list = OpenAPI_list_create(); + OpenAPI_list_for_each(SmPolicyContextData->ipv4_frame_route_list, node) { + if (!node->data) + continue; + OpenAPI_list_add(sess->ipv4_frame_route_list, ogs_strdup(node->data)); + } + } + + if (SmPolicyContextData->ipv6_frame_route_list) { + OpenAPI_lnode_t *node = NULL; + + OpenAPI_clear_and_free_string_list(sess->ipv4_frame_route_list); + sess->ipv6_frame_route_list = OpenAPI_list_create(); + OpenAPI_list_for_each(SmPolicyContextData->ipv6_frame_route_list, node) { + if (!node->data) + continue; + OpenAPI_list_add(sess->ipv6_frame_route_list, ogs_strdup(node->data)); + } + } + sess->s_nssai.sst = sliceInfo->sst; sess->s_nssai.sd = ogs_s_nssai_sd_from_string(sliceInfo->sd);