forked from acouzens/open5gs
Merge branch 'herlesupreeth-issue1099' into main
This commit is contained in:
commit
3e7d2398a2
|
@ -30,8 +30,6 @@ extern "C" {
|
|||
|
||||
#define OGS_MAX_NUM_OF_SESS 4 /* Num of APN(Session) per UE */
|
||||
#define OGS_MAX_NUM_OF_BEARER 4 /* Num of Bearer per Session */
|
||||
#define OGS_MAX_NUM_OF_RULE 4 /* Num of Rule per Session */
|
||||
#define OGS_MAX_NUM_OF_PF 16 /* Num of PacketFilter per Bearer */
|
||||
#define OGS_MAX_NUM_OF_PACKET_BUFFER 64 /* Num of PacketBuffer per UE */
|
||||
|
||||
/* Num of PacketFilter per Bearer(GTP) or QoS(NAS-5GS) */
|
||||
|
|
|
@ -238,7 +238,7 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_response(uint8_t type,
|
|||
static struct {
|
||||
ogs_pfcp_f_teid_t f_teid;
|
||||
char dnn[OGS_MAX_DNN_LEN];
|
||||
char *sdf_filter[OGS_MAX_NUM_OF_RULE];
|
||||
char *sdf_filter[OGS_PFCP_MAX_NUM_OF_RULE];
|
||||
} pdrbuf[OGS_MAX_NUM_OF_PDR];
|
||||
|
||||
void ogs_pfcp_pdrbuf_init(void)
|
||||
|
@ -250,7 +250,7 @@ void ogs_pfcp_pdrbuf_clear(void)
|
|||
{
|
||||
int i, j;
|
||||
for (i = 0; i < OGS_MAX_NUM_OF_PDR; i++) {
|
||||
for (j = 0; j < OGS_MAX_NUM_OF_RULE; j++) {
|
||||
for (j = 0; j < OGS_PFCP_MAX_NUM_OF_RULE; j++) {
|
||||
if (pdrbuf[i].sdf_filter[j])
|
||||
ogs_free(pdrbuf[i].sdf_filter[j]);
|
||||
}
|
||||
|
@ -261,7 +261,7 @@ void ogs_pfcp_build_create_pdr(
|
|||
ogs_pfcp_tlv_create_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr)
|
||||
{
|
||||
ogs_pfcp_far_t *far = NULL;
|
||||
ogs_pfcp_sdf_filter_t pfcp_sdf_filter[OGS_MAX_NUM_OF_RULE];
|
||||
ogs_pfcp_sdf_filter_t pfcp_sdf_filter[OGS_PFCP_MAX_NUM_OF_RULE];
|
||||
int j = 0;
|
||||
int len = 0;
|
||||
|
||||
|
@ -376,7 +376,7 @@ void ogs_pfcp_build_created_pdr(
|
|||
void ogs_pfcp_build_update_pdr(
|
||||
ogs_pfcp_tlv_update_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr)
|
||||
{
|
||||
ogs_pfcp_sdf_filter_t pfcp_sdf_filter[OGS_MAX_NUM_OF_RULE];
|
||||
ogs_pfcp_sdf_filter_t pfcp_sdf_filter[OGS_PFCP_MAX_NUM_OF_RULE];
|
||||
int j = 0;
|
||||
int len = 0;
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ void ogs_pfcp_context_init(void)
|
|||
ogs_app()->pool.sess * OGS_MAX_NUM_OF_BAR);
|
||||
|
||||
ogs_pool_init(&ogs_pfcp_rule_pool,
|
||||
ogs_app()->pool.sess * OGS_MAX_NUM_OF_RULE);
|
||||
ogs_app()->pool.sess * OGS_PFCP_MAX_NUM_OF_RULE);
|
||||
|
||||
ogs_pool_init(&ogs_pfcp_dev_pool, OGS_MAX_NUM_OF_DEV);
|
||||
ogs_pool_init(&ogs_pfcp_subnet_pool, OGS_MAX_NUM_OF_SUBNET);
|
||||
|
|
|
@ -173,7 +173,8 @@ typedef struct ogs_pfcp_pdr_s {
|
|||
ogs_pfcp_qer_t *qer;
|
||||
|
||||
int num_of_flow;
|
||||
char *flow_description[OGS_MAX_NUM_OF_RULE];
|
||||
#define OGS_PFCP_MAX_NUM_OF_RULE 8 /* Num of Rule per Session */
|
||||
char *flow_description[OGS_PFCP_MAX_NUM_OF_RULE];
|
||||
|
||||
ogs_list_t rule_list; /* Rule List */
|
||||
|
||||
|
|
|
@ -313,7 +313,7 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_create_pdr(ogs_pfcp_sess_t *sess,
|
|||
|
||||
ogs_pfcp_rule_remove_all(pdr);
|
||||
|
||||
for (i = 0; i < OGS_MAX_NUM_OF_RULE; i++) {
|
||||
for (i = 0; i < OGS_PFCP_MAX_NUM_OF_RULE; i++) {
|
||||
ogs_pfcp_sdf_filter_t sdf_filter;
|
||||
ogs_pfcp_rule_t *rule = NULL;
|
||||
ogs_pfcp_rule_t *oppsite_direction_rule = NULL;
|
||||
|
@ -558,7 +558,7 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_update_pdr(ogs_pfcp_sess_t *sess,
|
|||
|
||||
ogs_pfcp_rule_remove_all(pdr);
|
||||
|
||||
for (i = 0; i < OGS_MAX_NUM_OF_RULE; i++) {
|
||||
for (i = 0; i < OGS_PFCP_MAX_NUM_OF_RULE; i++) {
|
||||
ogs_pfcp_sdf_filter_t sdf_filter;
|
||||
ogs_pfcp_rule_t *rule = NULL;
|
||||
ogs_pfcp_rule_t *oppsite_direction_rule = NULL;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by pfcp-tlv.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 10:58:38.385939 by acetcom
|
||||
* Created on: 2021-07-27 20:23:21.045510 by acetcom
|
||||
* from 29244-g10.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by pfcp-tlv.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 10:58:38.379862 by acetcom
|
||||
* Created on: 2021-07-27 20:23:21.038999 by acetcom
|
||||
* from 29244-g10.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ void smf_context_init(void)
|
|||
ogs_pool_init(&smf_sess_pool, ogs_app()->pool.sess);
|
||||
ogs_pool_init(&smf_bearer_pool, ogs_app()->pool.bearer);
|
||||
|
||||
ogs_pool_init(&smf_pf_pool, ogs_app()->pool.bearer * OGS_MAX_NUM_OF_PF);
|
||||
ogs_pool_init(&smf_pf_pool, ogs_app()->pool.bearer * MAX_NUM_OF_PF);
|
||||
|
||||
self.supi_hash = ogs_hash_make();
|
||||
ogs_assert(self.supi_hash);
|
||||
|
@ -2143,14 +2143,14 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer)
|
|||
ogs_assert(pf->identifier_node);
|
||||
|
||||
pf->identifier = *(pf->identifier_node);
|
||||
ogs_assert(pf->identifier > 0 && pf->identifier <= OGS_MAX_NUM_OF_PF);
|
||||
ogs_assert(pf->identifier > 0 && pf->identifier <= 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));
|
||||
(OGS_MAX_NUM_OF_BEARER * MAX_NUM_OF_PF));
|
||||
|
||||
pf->bearer = bearer;
|
||||
|
||||
|
@ -2427,9 +2427,9 @@ void smf_pf_identifier_pool_init(smf_bearer_t *bearer)
|
|||
|
||||
ogs_assert(bearer);
|
||||
|
||||
ogs_index_init(&bearer->pf_identifier_pool, OGS_MAX_NUM_OF_PF);
|
||||
ogs_index_init(&bearer->pf_identifier_pool, MAX_NUM_OF_PF);
|
||||
|
||||
for (i = 1; i <= OGS_MAX_NUM_OF_PF; i++) {
|
||||
for (i = 1; i <= MAX_NUM_OF_PF; i++) {
|
||||
bearer->pf_identifier_pool.array[i-1] = i;
|
||||
}
|
||||
}
|
||||
|
@ -2448,9 +2448,9 @@ void smf_pf_precedence_pool_init(smf_sess_t *sess)
|
|||
ogs_assert(sess);
|
||||
|
||||
ogs_index_init(&sess->pf_precedence_pool,
|
||||
OGS_MAX_NUM_OF_BEARER * OGS_MAX_NUM_OF_PF);
|
||||
OGS_MAX_NUM_OF_BEARER * MAX_NUM_OF_PF);
|
||||
|
||||
for (i = 1; i <= OGS_MAX_NUM_OF_BEARER * OGS_MAX_NUM_OF_PF; i++) {
|
||||
for (i = 1; i <= OGS_MAX_NUM_OF_BEARER * MAX_NUM_OF_PF; i++) {
|
||||
sess->pf_precedence_pool.array[i-1] = i;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -177,6 +177,8 @@ typedef struct smf_bearer_s {
|
|||
|
||||
OGS_POOL(pf_identifier_pool, uint8_t);
|
||||
|
||||
#define MAX_NUM_OF_PF 16 /* Num of PacketFilter per Bearer */
|
||||
|
||||
/* Packet Filter List */
|
||||
ogs_list_t pf_list;
|
||||
ogs_list_t pf_to_add_list;
|
||||
|
|
|
@ -631,6 +631,7 @@ static void smf_gx_cca_cb(void *data, struct msg **msg)
|
|||
ogs_diam_gx_message_t *gx_message = NULL;
|
||||
uint16_t gxbuf_len = 0;
|
||||
uint32_t cc_request_number = 0;
|
||||
smf_bearer_t *bearer = NULL;
|
||||
|
||||
ogs_debug("[Credit-Control-Answer]");
|
||||
|
||||
|
@ -887,6 +888,15 @@ static void smf_gx_cca_cb(void *data, struct msg **msg)
|
|||
|
||||
pcc_rule->type = OGS_PCC_RULE_TYPE_INSTALL;
|
||||
gx_message->session_data.num_of_pcc_rule++;
|
||||
|
||||
/* Check for maximum number of flow rules per bearer */
|
||||
bearer = smf_bearer_find_by_pcc_rule_name(
|
||||
sess_data->sess, pcc_rule->name);
|
||||
if (bearer &&
|
||||
((ogs_list_count(&bearer->pf_list) +
|
||||
pcc_rule->num_of_flow) > MAX_NUM_OF_PF)) {
|
||||
error++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ogs_error("Not supported(%d)", hdr->avp_code);
|
||||
|
@ -1009,6 +1019,7 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
|||
smf_sess_t *sess = NULL;
|
||||
ogs_diam_gx_message_t *gx_message = NULL;
|
||||
ogs_pcc_rule_t *pcc_rule = NULL;
|
||||
smf_bearer_t *bearer = NULL;
|
||||
|
||||
uint32_t result_code = OGS_DIAM_UNKNOWN_SESSION_ID;
|
||||
|
||||
|
@ -1078,6 +1089,16 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
|||
|
||||
pcc_rule->type = OGS_PCC_RULE_TYPE_INSTALL;
|
||||
gx_message->session_data.num_of_pcc_rule++;
|
||||
|
||||
/* Check for maximum number of flow rules per bearer */
|
||||
bearer = smf_bearer_find_by_pcc_rule_name(
|
||||
sess_data->sess, pcc_rule->name);
|
||||
if (bearer &&
|
||||
((ogs_list_count(&bearer->pf_list) +
|
||||
pcc_rule->num_of_flow) > MAX_NUM_OF_PF)) {
|
||||
result_code = ER_DIAMETER_UNABLE_TO_COMPLY;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ogs_error("Not supported(%d)", hdr->avp_code);
|
||||
|
|
Loading…
Reference in New Issue