From dfaf2f156727999382b5826503c6970cd07360c4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sun, 16 May 2021 11:26:40 +0900 Subject: [PATCH] [SMF] PF precedence generated by Pool (#1001) --- configs/open5gs/pcrf.yaml.in | 3 ++- src/smf/binding.c | 11 +-------- src/smf/context.c | 43 +++++++++++++++++++++++++++++++++--- src/smf/context.h | 14 +++++++----- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/configs/open5gs/pcrf.yaml.in b/configs/open5gs/pcrf.yaml.in index 67bb14a1e..37bc93266 100644 --- a/configs/open5gs/pcrf.yaml.in +++ b/configs/open5gs/pcrf.yaml.in @@ -41,7 +41,8 @@ pcrf: # prefer_ipv4: true # # o Legacy support for pre-release LTE 11 devices to do calling -# - Replace IPv4/v6 local addr field in AAR Media-Subcomponent AVP by any and port +# - Replace IPv4/v6 local addr field in AAR Media-Subcomponent AVP +# by 'any local port' # no_ipv4v6_local_addr_in_packet_filter: true # parameter: diff --git a/src/smf/binding.c b/src/smf/binding.c index c1d1e5448..8f3125104 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -95,7 +95,7 @@ static void encode_traffic_flow_template( while (pf) { tft->pf[i].direction = pf->direction; tft->pf[i].identifier = pf->identifier - 1; - tft->pf[i].precedence = pf->precedence; + tft->pf[i].precedence = pf->precedence - 1; ogs_pf_content_from_ipfw_rule( pf->direction, &tft->pf[i].content, &pf->ipfw_rule); @@ -120,9 +120,6 @@ void smf_bearer_binding(smf_sess_t *sess) ogs_pkbuf_t *pkbuf = NULL; smf_bearer_t *bearer = NULL; - int total_num_of_pcc_rules = 0; - smf_bearer_t *pf_bearer = NULL; - ogs_pcc_rule_t *pcc_rule = &sess->pcc_rule[i]; int bearer_created = 0; int qos_presence = 0; @@ -243,11 +240,6 @@ void smf_bearer_binding(smf_sess_t *sess) dl_pdr->num_of_flow = 0; ul_pdr->num_of_flow = 0; - // Compute total number of PCC rules for per DNN (used to set precedence) - ogs_list_for_each(&sess->bearer_list, pf_bearer) { - total_num_of_pcc_rules += ogs_list_count(&pf_bearer->pf_list); - } - for (j = 0; j < pcc_rule->num_of_flow; j++) { ogs_flow_t *flow = &pcc_rule->flow[j]; smf_pf_t *pf = NULL; @@ -271,7 +263,6 @@ void smf_bearer_binding(smf_sess_t *sess) pf->direction = flow->direction; pf->flow_description = ogs_strdup(flow->description); - pf->precedence = total_num_of_pcc_rules + j; rv = ogs_ipfw_compile_rule( &pf->ipfw_rule, pf->flow_description); diff --git a/src/smf/context.c b/src/smf/context.c index 2377bcebe..85004a37b 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -958,6 +958,7 @@ smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn) ogs_pfcp_pool_init(&sess->pfcp); smf_qfi_pool_init(sess); + smf_pf_precedence_pool_init(sess); sess->index = ogs_pool_index(&smf_sess_pool, sess); ogs_assert(sess->index > 0 && sess->index <= ogs_app()->pool.sess); @@ -1072,6 +1073,7 @@ smf_sess_t *smf_sess_add_by_psi(smf_ue_t *smf_ue, uint8_t psi) ogs_pfcp_pool_init(&sess->pfcp); smf_qfi_pool_init(sess); + smf_pf_precedence_pool_init(sess); sess->index = ogs_pool_index(&smf_sess_pool, sess); ogs_assert(sess->index > 0 && sess->index <= ogs_app()->pool.sess); @@ -1428,6 +1430,7 @@ void smf_sess_remove(smf_sess_t *sess) ogs_pfcp_pool_final(&sess->pfcp); smf_qfi_pool_final(sess); + smf_pf_precedence_pool_final(sess); ogs_pool_free(&smf_sess_pool, sess); @@ -2102,9 +2105,12 @@ void smf_sess_select_nf(smf_sess_t *sess, OpenAPI_nf_type_e nf_type) smf_pf_t *smf_pf_add(smf_bearer_t *bearer) { + smf_sess_t *sess = NULL; smf_pf_t *pf = NULL; ogs_assert(bearer); + sess = bearer->sess; + ogs_assert(sess); ogs_pool_alloc(&smf_pf_pool, &pf); ogs_assert(pf); @@ -2113,10 +2119,16 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer) ogs_pool_alloc(&bearer->pf_identifier_pool, &pf->identifier_node); ogs_assert(pf->identifier_node); - pf->index = *(pf->identifier_node); - ogs_assert(pf->index > 0 && pf->index <= OGS_MAX_NUM_OF_PF); + pf->identifier = *(pf->identifier_node); + ogs_assert(pf->identifier > 0 && pf->identifier <= OGS_MAX_NUM_OF_PF); + + ogs_pool_alloc(&sess->pf_precedence_pool, &pf->precedence_node); + ogs_assert(pf->precedence_node); + + pf->precedence = *(pf->precedence_node); + ogs_assert(pf->precedence > 0 && pf->precedence <= + (OGS_MAX_NUM_OF_BEARER * OGS_MAX_NUM_OF_PF)); - pf->identifier = pf->index; pf->bearer = bearer; ogs_list_add(&bearer->pf_list, pf); @@ -2128,6 +2140,7 @@ int smf_pf_remove(smf_pf_t *pf) { ogs_assert(pf); ogs_assert(pf->bearer); + ogs_assert(pf->bearer->sess); ogs_list_remove(&pf->bearer->pf_list, pf); if (pf->flow_description) @@ -2135,6 +2148,9 @@ int smf_pf_remove(smf_pf_t *pf) if (pf->identifier_node) ogs_pool_free(&pf->bearer->pf_identifier_pool, pf->identifier_node); + if (pf->precedence_node) + ogs_pool_free( + &pf->bearer->sess->pf_precedence_pool, pf->precedence_node); ogs_pool_free(&smf_pf_pool, pf); @@ -2387,6 +2403,27 @@ void smf_pf_identifier_pool_final(smf_bearer_t *bearer) ogs_index_final(&bearer->pf_identifier_pool); } +void smf_pf_precedence_pool_init(smf_sess_t *sess) +{ + int i; + + ogs_assert(sess); + + ogs_index_init(&sess->pf_precedence_pool, + OGS_MAX_NUM_OF_BEARER * OGS_MAX_NUM_OF_PF); + + for (i = 1; i <= OGS_MAX_NUM_OF_BEARER * OGS_MAX_NUM_OF_PF; i++) { + sess->pf_precedence_pool.array[i-1] = i; + } +} + +void smf_pf_precedence_pool_final(smf_sess_t *sess) +{ + ogs_assert(sess); + + ogs_index_final(&sess->pf_precedence_pool); +} + static void stats_add_smf_session(void) { num_of_smf_sess = num_of_smf_sess + 1; diff --git a/src/smf/context.h b/src/smf/context.h index b9fdd6da2..4de806413 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -128,15 +128,16 @@ typedef struct smf_sess_s smf_sess_t; typedef struct smf_pf_s { ogs_lnode_t lnode; - uint32_t index; ED3(uint8_t spare:2;, uint8_t direction:2;, uint8_t identifier:4;) - uint8_t precedence; + uint8_t precedence; /* Only used in EPC */ + uint8_t epc_precedence; /* Only used in EPC */ - uint8_t *identifier_node; /* Pool-Node for Identifier */ + uint8_t *identifier_node; /* Pool-Node for Identifier */ + uint8_t *precedence_node; /* Pool-Node for Precedence */ ogs_ipfw_rule_t ipfw_rule; char *flow_description; @@ -173,8 +174,6 @@ typedef struct smf_bearer_s { OGS_POOL(pf_identifier_pool, uint8_t); - /* Packet Filter Identifier Generator(1~15) */ - uint8_t pf_identifier; /* Packet Filter List */ ogs_list_t pf_list; @@ -206,6 +205,8 @@ typedef struct smf_sess_s { char *gx_sid; /* Gx Session ID */ + OGS_POOL(pf_precedence_pool, uint8_t); + #define CLEAR_QOS_FLOW_ID(__sESS) \ do { \ ogs_assert((__sESS)); \ @@ -417,6 +418,9 @@ void smf_qfi_pool_final(smf_sess_t *sess); void smf_pf_identifier_pool_init(smf_bearer_t *bearer); void smf_pf_identifier_pool_final(smf_bearer_t *bearer); +void smf_pf_precedence_pool_init(smf_sess_t *sess); +void smf_pf_precedence_pool_final(smf_sess_t *sess); + #ifdef __cplusplus } #endif