diff --git a/lib/proto/types.h b/lib/proto/types.h index 5bb8587f5..c2d499a27 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -452,8 +452,6 @@ typedef struct ogs_pcc_rule_s { } while(0) -typedef struct OpenAPI_list_s OpenAPI_list_t; - /********************************** * PDN Structure */ typedef struct ogs_session_s { @@ -485,8 +483,8 @@ typedef struct ogs_session_s { ogs_paa_t paa; ogs_ip_t ue_ip; - OpenAPI_list_t *ipv4_framed_routes; - OpenAPI_list_t *ipv6_framed_routes; + char **ipv4_framed_routes; + char **ipv6_framed_routes; ogs_ip_t smf_ip; } ogs_session_t; diff --git a/src/smf/context.c b/src/smf/context.c index f01935bc3..df46fe6ca 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1699,7 +1699,6 @@ void smf_sess_remove(smf_sess_t *sess) int i; smf_ue_t *smf_ue = NULL; smf_event_t e; - OpenAPI_lnode_t *node; char buf1[OGS_ADDRSTRLEN]; char buf2[OGS_ADDRSTRLEN]; @@ -1764,12 +1763,22 @@ void smf_sess_remove(smf_sess_t *sess) if (sess->session.name) ogs_free(sess->session.name); - OpenAPI_list_for_each(sess->session.ipv4_framed_routes, node) - OpenAPI_frame_route_info_free(node->data); - OpenAPI_list_for_each(sess->session.ipv6_framed_routes, node) - OpenAPI_frame_route_info_free(node->data); - OpenAPI_list_free(sess->session.ipv4_framed_routes); - OpenAPI_list_free(sess->session.ipv6_framed_routes); + if (sess->session.ipv4_framed_routes) { + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + if (!sess->session.ipv4_framed_routes[i]) + break; + ogs_free(sess->session.ipv4_framed_routes[i]); + } + ogs_free(sess->session.ipv4_framed_routes); + } + if (sess->session.ipv6_framed_routes) { + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + if (!sess->session.ipv6_framed_routes[i]) + break; + ogs_free(sess->session.ipv6_framed_routes[i]); + } + ogs_free(sess->session.ipv6_framed_routes); + } if (sess->upf_n3_addr) ogs_freeaddrinfo(sess->upf_n3_addr); diff --git a/src/smf/npcf-build.c b/src/smf/npcf-build.c index 8ece2a237..fb98a2bac 100644 --- a/src/smf/npcf-build.c +++ b/src/smf/npcf-build.c @@ -108,35 +108,25 @@ ogs_sbi_request_t *smf_npcf_smpolicycontrol_build_create( } if (sess->session.ipv4_framed_routes) { + int i; OpenAPI_list_t *FrameRouteList = OpenAPI_list_create(); - OpenAPI_lnode_t *node; - OpenAPI_list_for_each(sess->session.ipv4_framed_routes, node) { - OpenAPI_frame_route_info_t *route = node->data; - if (!route) - continue; - if (!route->ipv4_mask) { - ogs_error("Invalid FrameRouteInfo"); - continue; - } - OpenAPI_list_add(FrameRouteList, ogs_strdup(route->ipv4_mask)); + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + const char *route = sess->session.ipv4_framed_routes[i]; + if (!route) break; + OpenAPI_list_add(FrameRouteList, ogs_strdup(route)); } SmPolicyContextData.ipv4_frame_route_list = FrameRouteList; } if (sess->session.ipv6_framed_routes) { + int i; OpenAPI_list_t *FrameRouteList = OpenAPI_list_create(); - OpenAPI_lnode_t *node; - OpenAPI_list_for_each(sess->session.ipv6_framed_routes, node) { - OpenAPI_frame_route_info_t *route = node->data; - if (!route) - continue; - if (!route->ipv6_prefix) { - ogs_error("Invalid FrameRouteInfo"); - continue; - } - OpenAPI_list_add(FrameRouteList, ogs_strdup(route->ipv6_prefix)); + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + const char *route = sess->session.ipv6_framed_routes[i]; + if (!route) break; + OpenAPI_list_add(FrameRouteList, ogs_strdup(route)); } SmPolicyContextData.ipv6_frame_route_list = FrameRouteList; } diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index c1cbbe344..c682c3d43 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -494,48 +494,33 @@ bool smf_npcf_smpolicycontrol_handle_create( if (sess->session.ipv4_framed_routes && sess->pfcp_node->up_function_features.frrt) { - OpenAPI_frame_route_info_t *FrameRouteInfo = NULL; int i = 0; - OpenAPI_list_for_each(sess->session.ipv4_framed_routes, node) { - FrameRouteInfo = node->data; - if (i >= OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI) - break; - if (!FrameRouteInfo) - continue; - if (!FrameRouteInfo->ipv4_mask) { - ogs_error("Invalid FrameRouteInfo"); - continue; - } + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + const char *route = sess->session.ipv4_framed_routes[i]; + if (!route) break; if (!dl_pdr->ipv4_framed_routes) { dl_pdr->ipv4_framed_routes = ogs_calloc(OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, sizeof(dl_pdr->ipv4_framed_routes[0])); ogs_assert(dl_pdr->ipv4_framed_routes); } - dl_pdr->ipv4_framed_routes[i++] = ogs_strdup(FrameRouteInfo->ipv4_mask); + dl_pdr->ipv4_framed_routes[i] = ogs_strdup(route); } } if (sess->session.ipv6_framed_routes && sess->pfcp_node->up_function_features.frrt) { - OpenAPI_frame_route_info_t *FrameRouteInfo = NULL; int i = 0; - OpenAPI_list_for_each(sess->session.ipv6_framed_routes, node) { - FrameRouteInfo = node->data; - if (i >= OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI) - continue; - if (!FrameRouteInfo) - continue; - if (!FrameRouteInfo->ipv6_prefix) { - ogs_error("Invalid FrameRouteInfo"); - continue; - } + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + const char *route = sess->session.ipv6_framed_routes[i]; + if (!route) break; if (!dl_pdr->ipv6_framed_routes) { dl_pdr->ipv6_framed_routes = - ogs_malloc(OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI); + ogs_calloc(OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, + sizeof(dl_pdr->ipv6_framed_routes[0])); ogs_assert(dl_pdr->ipv6_framed_routes); } - dl_pdr->ipv6_framed_routes[i++] = ogs_strdup(FrameRouteInfo->ipv6_prefix); + dl_pdr->ipv6_framed_routes[i] = ogs_strdup(route); } } diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index 69b64eba5..58c637bea 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -246,31 +246,45 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ipv4FrameRouteList = dnnConfiguration->ipv4_frame_route_list; if (ipv4FrameRouteList) { - if (sess->session.ipv4_framed_routes) { - OpenAPI_list_for_each(sess->session.ipv4_framed_routes, node2) - OpenAPI_frame_route_info_free(node2->data); - OpenAPI_list_clear(sess->session.ipv4_framed_routes); - } else { - sess->session.ipv4_framed_routes = OpenAPI_list_create(); + int i; + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + if (!sess->session.ipv4_framed_routes || + !sess->session.ipv4_framed_routes[i]) + break; + ogs_free(sess->session.ipv4_framed_routes[i]); } + if (!sess->session.ipv4_framed_routes) + sess->session.ipv4_framed_routes = ogs_calloc( + OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, + sizeof(sess->session.ipv4_framed_routes[0])); + i = 0; OpenAPI_list_for_each(ipv4FrameRouteList, node2) { - OpenAPI_list_add(sess->session.ipv4_framed_routes, - OpenAPI_frame_route_info_copy(NULL, node2->data)); + OpenAPI_frame_route_info_t *route = node2->data; + if (i >= OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI) break; + if (!route) continue; + sess->session.ipv4_framed_routes[i++] = ogs_strdup(route->ipv4_mask); } } ipv6FrameRouteList = dnnConfiguration->ipv6_frame_route_list; if (ipv6FrameRouteList) { - if (sess->session.ipv6_framed_routes) { - OpenAPI_list_for_each(sess->session.ipv6_framed_routes, node2) - OpenAPI_frame_route_info_free(node2->data); - OpenAPI_list_clear(sess->session.ipv6_framed_routes); - } else { - sess->session.ipv6_framed_routes = OpenAPI_list_create(); + int i; + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + if (!sess->session.ipv6_framed_routes || + !sess->session.ipv6_framed_routes[i]) + break; + ogs_free(sess->session.ipv6_framed_routes[i]); } + if (!sess->session.ipv6_framed_routes) + sess->session.ipv6_framed_routes = ogs_calloc( + OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, + sizeof(sess->session.ipv6_framed_routes[0])); + i = 0; OpenAPI_list_for_each(ipv6FrameRouteList, node2) { - OpenAPI_list_add(sess->session.ipv6_framed_routes, - OpenAPI_frame_route_info_copy(NULL, node2->data)); + OpenAPI_frame_route_info_t *route = node2->data; + if (i >= OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI) break; + if (!route) continue; + sess->session.ipv6_framed_routes[i++] = ogs_strdup(route->ipv6_prefix); } }