diff --git a/src/upf/context.c b/src/upf/context.c index 663c9ae97..61bf58cb1 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -243,7 +243,8 @@ int upf_sess_remove(upf_sess_t *sess) ogs_pool_free(&upf_n4_seid_pool, sess->upf_n4_seid_node); ogs_pool_free(&upf_sess_pool, sess); - + if (sess->apn_dnn) + ogs_free(sess->apn_dnn); upf_metrics_inst_global_dec(UPF_METR_GLOB_GAUGE_UPF_SESSIONNBR); ogs_info("[Removed] Number of UPF-sessions is now %d", diff --git a/src/upf/context.h b/src/upf/context.h index 9153ce937..4dbb2a065 100644 --- a/src/upf/context.h +++ b/src/upf/context.h @@ -122,6 +122,7 @@ typedef struct upf_sess_s { /* Accounting: */ upf_sess_urr_acc_t urr_acc[OGS_MAX_NUM_OF_URR]; /* FIXME: This probably needs to be mved to a hashtable or alike */ + char *apn_dnn; /* APN/DNN Item */ } upf_sess_t; void upf_context_init(void); diff --git a/src/upf/n4-handler.c b/src/upf/n4-handler.c index c273ef441..378a0bd73 100644 --- a/src/upf/n4-handler.c +++ b/src/upf/n4-handler.c @@ -104,17 +104,24 @@ void upf_n4_handle_session_establishment_request( if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) goto cleanup; + if (req->apn_dnn.presence) { + char apn_dnn[OGS_MAX_DNN_LEN+1]; + + ogs_assert(0 < ogs_fqdn_parse(apn_dnn, req->apn_dnn.data, + ogs_min(req->apn_dnn.len, OGS_MAX_DNN_LEN))); + + if (sess->apn_dnn) + ogs_free(sess->apn_dnn); + sess->apn_dnn = ogs_strdup(apn_dnn); + ogs_assert(sess->apn_dnn); + } + for (i = 0; i < OGS_MAX_NUM_OF_QER; i++) { if (ogs_pfcp_handle_create_qer(&sess->pfcp, &req->create_qer[i], &cause_value, &offending_ie_value) == NULL) break; - if (req->apn_dnn.presence == 1) { - upf_metrics_inst_by_dnn_add(req->apn_dnn.data, - UPF_METR_GAUGE_UPF_QOSFLOWS, 1); - } else { - upf_metrics_inst_by_dnn_add(NULL, - UPF_METR_GAUGE_UPF_QOSFLOWS, 1); - } + upf_metrics_inst_by_dnn_add(sess->apn_dnn, + UPF_METR_GAUGE_UPF_QOSFLOWS, 1); } if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) goto cleanup; @@ -329,7 +336,7 @@ void upf_n4_handle_session_modification_request( if (ogs_pfcp_handle_create_qer(&sess->pfcp, &req->create_qer[i], &cause_value, &offending_ie_value) == NULL) break; - upf_metrics_inst_by_dnn_add(NULL, + upf_metrics_inst_by_dnn_add(sess->apn_dnn, UPF_METR_GAUGE_UPF_QOSFLOWS, 1); } if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) @@ -347,7 +354,7 @@ void upf_n4_handle_session_modification_request( if (ogs_pfcp_handle_remove_qer(&sess->pfcp, &req->remove_qer[i], &cause_value, &offending_ie_value) == false) break; - upf_metrics_inst_by_dnn_add(NULL, + upf_metrics_inst_by_dnn_add(sess->apn_dnn, UPF_METR_GAUGE_UPF_QOSFLOWS, -1); } if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) @@ -426,7 +433,7 @@ void upf_n4_handle_session_deletion_request( ogs_list_for_each(&sess->pfcp.pdr_list, pdr) { ogs_list_for_each(&sess->pfcp.qer_list, qer) { - upf_metrics_inst_by_dnn_add(NULL, + upf_metrics_inst_by_dnn_add(sess->apn_dnn, UPF_METR_GAUGE_UPF_QOSFLOWS, -1); } break;