From 739cb599d1998d4f87199eeada323358f162744d Mon Sep 17 00:00:00 2001 From: mitmitmitm Date: Wed, 25 Jan 2023 12:30:38 +0100 Subject: [PATCH] [UDR] Read framed routes from DB send them in sm-data The framed routes are stored in mongo as { "imsi" : "$IMSI", ..., "slice" : [{ ..., "session" : ..., "ipv4_framed_routes" : ["10.45.33.0/24", "10.45.35.0/24"], }], }], }, --- lib/dbi/subscription.c | 58 ++++++++++++++++++++++++++++++++++++++++++ src/udr/nudr-handler.c | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/lib/dbi/subscription.c b/lib/dbi/subscription.c index be72cda9c..4f7f08163 100644 --- a/lib/dbi/subscription.c +++ b/lib/dbi/subscription.c @@ -697,6 +697,64 @@ int ogs_dbi_subscription_data(char *supi, } } + } else if (!strcmp(child4_key, "ipv4_framed_routes") && + BSON_ITER_HOLDS_ARRAY(&child4_iter)) { + int i; + + if (session->ipv4_framed_routes) { + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + if (!session->ipv4_framed_routes[i]) + break; + ogs_free(session->ipv4_framed_routes[i]); + } + } else { + session->ipv4_framed_routes = ogs_calloc( + OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, + sizeof(session->ipv4_framed_routes[0])); + } + bson_iter_recurse( + &child4_iter, &child5_iter); + i = 0; + while (bson_iter_next(&child5_iter)) { + const char *v; + + if (i >= OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI) + break; + + if (!BSON_ITER_HOLDS_UTF8(&child5_iter)) + continue; + v = bson_iter_utf8(&child5_iter, &length); + session->ipv4_framed_routes[i++] = ogs_strdup(v); + } + } else if (!strcmp(child4_key, "ipv6_framed_routes") && + BSON_ITER_HOLDS_ARRAY(&child4_iter)) { + int i; + + if (session->ipv6_framed_routes) { + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + if (!session->ipv6_framed_routes[i]) + break; + ogs_free(session->ipv6_framed_routes[i]); + } + } else { + session->ipv6_framed_routes = ogs_calloc( + OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI, + sizeof(session->ipv6_framed_routes[0])); + } + bson_iter_recurse( + &child4_iter, &child5_iter); + i = 0; + while (bson_iter_next(&child5_iter)) { + const char *v; + + if (i >= OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI) + break; + + if (!BSON_ITER_HOLDS_UTF8(&child5_iter)) + continue; + v = bson_iter_utf8(&child5_iter, &length); + session->ipv6_framed_routes[i++] = ogs_strdup(v); + } } } slice_data->num_of_session++; diff --git a/src/udr/nudr-handler.c b/src/udr/nudr-handler.c index 618d1536b..3927fee2f 100644 --- a/src/udr/nudr-handler.c +++ b/src/udr/nudr-handler.c @@ -648,6 +648,7 @@ bool udr_nudr_dr_handle_subscription_provisioned( OpenAPI_ambr_t *sessionAmbr = NULL; OpenAPI_list_t *staticIpAddress = NULL; OpenAPI_ip_address_t *ipAddress = NULL; + OpenAPI_list_t *FrameRouteList = NULL; OpenAPI_lnode_t *node = NULL, *node2 = NULL; if (!recvmsg->param.single_nssai_presence) { @@ -828,6 +829,34 @@ bool udr_nudr_dr_handle_subscription_provisioned( session->name, dnnConfiguration); ogs_assert(dnnConfigurationMap); OpenAPI_list_add(dnnConfigurationList, dnnConfigurationMap); + + if (session->ipv4_framed_routes) { + int i; + FrameRouteList = OpenAPI_list_create(); + + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + const char *route = session->ipv4_framed_routes[i]; + if (!route) break; + OpenAPI_list_add(FrameRouteList, + OpenAPI_frame_route_info_create( + ogs_strdup(route), NULL)); + } + dnnConfiguration->ipv4_frame_route_list = FrameRouteList; + } + + if (session->ipv6_framed_routes) { + int i; + FrameRouteList = OpenAPI_list_create(); + + for (i = 0; i < OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI; i++) { + const char *route = session->ipv6_framed_routes[i]; + if (!route) break; + OpenAPI_list_add(FrameRouteList, + OpenAPI_frame_route_info_create( + NULL, ogs_strdup(route))); + } + dnnConfiguration->ipv6_frame_route_list = FrameRouteList; + } } memset(&SessionManagementSubscriptionData, 0, @@ -905,6 +934,22 @@ bool udr_nudr_dr_handle_subscription_provisioned( OpenAPI_list_free(staticIpAddress); } + FrameRouteList = dnnConfiguration->ipv4_frame_route_list; + OpenAPI_list_for_each(FrameRouteList, node2) { + OpenAPI_frame_route_info_t *frame = node2->data; + if (frame) + ogs_free(frame); + } + OpenAPI_list_free(FrameRouteList); + + FrameRouteList = dnnConfiguration->ipv6_frame_route_list; + OpenAPI_list_for_each(FrameRouteList, node2) { + OpenAPI_frame_route_info_t *frame = node2->data; + if (frame) + ogs_free(frame); + } + OpenAPI_list_free(FrameRouteList); + ogs_free(dnnConfiguration); } ogs_free(dnnConfigurationMap);