[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"],
         }],
     }],
 },
This commit is contained in:
mitmitmitm 2023-01-25 12:30:38 +01:00 committed by Sukchan Lee
parent 11568bbff7
commit 739cb599d1
2 changed files with 103 additions and 0 deletions

View File

@ -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++;

View File

@ -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);