[SMF] PF precedence generated by Pool (#1001)

This commit is contained in:
Sukchan Lee 2021-05-16 11:26:40 +09:00
parent b6a030d82b
commit dfaf2f1567
4 changed files with 52 additions and 19 deletions

View File

@ -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:

View File

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

View File

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

View File

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