[pcrf]: Gx: parse 3GPP Charging Characteristic
Also pass the 3GPP-Charging-Characteristics to the dbi session_data call
This commit is contained in:
parent
1a6ceca4b5
commit
8960372ed3
|
@ -267,7 +267,7 @@ int pcrf_context_parse_config(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcrf_db_qos_data(
|
int pcrf_db_qos_data(
|
||||||
char *imsi_bcd, char *apn, ogs_session_data_t *session_data)
|
char *imsi_bcd, char *apn, int32_t charging_char, ogs_session_data_t *session_data)
|
||||||
{
|
{
|
||||||
int rv, i;
|
int rv, i;
|
||||||
char *supi = NULL;
|
char *supi = NULL;
|
||||||
|
@ -281,7 +281,9 @@ int pcrf_db_qos_data(
|
||||||
ogs_assert(supi);
|
ogs_assert(supi);
|
||||||
|
|
||||||
/* For EPC, we'll use [S_NSSAI = NULL] */
|
/* For EPC, we'll use [S_NSSAI = NULL] */
|
||||||
rv = ogs_dbi_session_data(supi, NULL, apn, OGS_DBI_NO_CHARGING_CHAR, session_data);
|
rv = ogs_dbi_session_data(supi, NULL, apn, charging_char, session_data);
|
||||||
|
if (rv)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
/* For EPC, we need to inialize Flow-Status in Pcc-Rule */
|
/* For EPC, we need to inialize Flow-Status in Pcc-Rule */
|
||||||
for (i = 0; i < session_data->num_of_pcc_rule; i++) {
|
for (i = 0; i < session_data->num_of_pcc_rule; i++) {
|
||||||
|
@ -292,6 +294,11 @@ int pcrf_db_qos_data(
|
||||||
ogs_free(supi);
|
ogs_free(supi);
|
||||||
ogs_thread_mutex_unlock(&self.db_lock);
|
ogs_thread_mutex_unlock(&self.db_lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
ogs_thread_mutex_unlock(&self.db_lock);
|
||||||
|
ogs_free(supi);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ pcrf_context_t *pcrf_self(void);
|
||||||
int pcrf_context_parse_config(void);
|
int pcrf_context_parse_config(void);
|
||||||
|
|
||||||
int pcrf_db_qos_data(char *imsi_bcd, char *apn,
|
int pcrf_db_qos_data(char *imsi_bcd, char *apn,
|
||||||
ogs_session_data_t *session_data);
|
int32_t charging_char, ogs_session_data_t *session_data);
|
||||||
|
|
||||||
void pcrf_sess_set_ipv4(const void *key, uint8_t *sid);
|
void pcrf_sess_set_ipv4(const void *key, uint8_t *sid);
|
||||||
void pcrf_sess_set_ipv6(const void *key, uint8_t *sid);
|
void pcrf_sess_set_ipv6(const void *key, uint8_t *sid);
|
||||||
|
|
|
@ -39,11 +39,13 @@ struct sess_state {
|
||||||
char *imsi_bcd;
|
char *imsi_bcd;
|
||||||
char *apn;
|
char *apn;
|
||||||
|
|
||||||
ED3(uint8_t ipv4:1;,
|
ED4(uint8_t ipv4:1;,
|
||||||
uint8_t ipv6:1;,
|
uint8_t ipv6:1;,
|
||||||
uint8_t reserved:6;)
|
uint8_t charging:1;,
|
||||||
|
uint8_t reserved:5;)
|
||||||
uint32_t addr; /* Framed-IPv4-Address */
|
uint32_t addr; /* Framed-IPv4-Address */
|
||||||
uint8_t addr6[OGS_IPV6_LEN]; /* Framed-IPv6-Prefix */
|
uint8_t addr6[OGS_IPV6_LEN]; /* Framed-IPv6-Prefix */
|
||||||
|
int32_t charging_chr;
|
||||||
|
|
||||||
ogs_list_t rx_list;
|
ogs_list_t rx_list;
|
||||||
|
|
||||||
|
@ -352,6 +354,23 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
sess_data->ipv6 = 1;
|
sess_data->ipv6 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get 3GPP-Charging-Characteristics */
|
||||||
|
sess_data->charging_chr = -1;
|
||||||
|
ret = fd_msg_search_avp(qry, ogs_diam_gx_3gpp_charging_characteristics, &avp);
|
||||||
|
ogs_assert(ret == 0);
|
||||||
|
if (avp) {
|
||||||
|
ret = fd_msg_avp_hdr(avp, &hdr);
|
||||||
|
ogs_assert(ret == 0);
|
||||||
|
char charging_bin[OGS_CHRGCHARS_LEN];
|
||||||
|
memcpy(charging_bin,
|
||||||
|
OGS_HEX(hdr->avp_value->os.data, (int)hdr->avp_value->os.len, charging_bin), OGS_CHRGCHARS_LEN);
|
||||||
|
if (hdr->avp_value->os.len == 1)
|
||||||
|
sess_data->charging_chr = charging_bin[0];
|
||||||
|
else
|
||||||
|
sess_data->charging_chr = charging_bin[0] << 8 | charging_bin[1];
|
||||||
|
sess_data->charging = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get IMSI + APN */
|
/* Get IMSI + APN */
|
||||||
ret = fd_msg_search_avp(qry, ogs_diam_subscription_id, &avp);
|
ret = fd_msg_search_avp(qry, ogs_diam_subscription_id, &avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
@ -416,10 +435,10 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
/* Retrieve QoS Data from Database */
|
/* Retrieve QoS Data from Database */
|
||||||
rv = pcrf_db_qos_data(
|
rv = pcrf_db_qos_data(
|
||||||
sess_data->imsi_bcd, sess_data->apn, &gx_message.session_data);
|
sess_data->imsi_bcd, sess_data->apn, sess_data->charging_chr, &gx_message.session_data);
|
||||||
if (rv != OGS_OK) {
|
if (rv != OGS_OK) {
|
||||||
ogs_error("Cannot get data for IMSI(%s)+APN(%s)'",
|
ogs_error("Cannot get data for IMSI(%s)+APN(%s)+ChargingChr(%d)'",
|
||||||
sess_data->imsi_bcd, sess_data->apn);
|
sess_data->imsi_bcd, sess_data->apn, sess_data->charging_chr);
|
||||||
result_code = OGS_DIAM_UNKNOWN_SESSION_ID;
|
result_code = OGS_DIAM_UNKNOWN_SESSION_ID;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -725,7 +744,7 @@ int pcrf_gx_send_rar(
|
||||||
|
|
||||||
/* Retrieve QoS Data from Database */
|
/* Retrieve QoS Data from Database */
|
||||||
rv = pcrf_db_qos_data(
|
rv = pcrf_db_qos_data(
|
||||||
sess_data->imsi_bcd, sess_data->apn, &gx_message.session_data);
|
sess_data->imsi_bcd, sess_data->apn, sess_data->charging_chr, &gx_message.session_data);
|
||||||
if (rv != OGS_OK) {
|
if (rv != OGS_OK) {
|
||||||
ogs_error("Cannot get data for IMSI(%s)+APN(%s)'",
|
ogs_error("Cannot get data for IMSI(%s)+APN(%s)'",
|
||||||
sess_data->imsi_bcd, sess_data->apn);
|
sess_data->imsi_bcd, sess_data->apn);
|
||||||
|
|
Loading…
Reference in New Issue