[SMF] PF precedence generated by Pool (#1001)
This commit is contained in:
parent
b6a030d82b
commit
dfaf2f1567
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue