Add the modified Bearer level QoS if PCRF changes them (#457)

* Add the modified Bearer level QoS if PCRF changes them

* Add the AMBR if PCRF changes them
This commit is contained in:
Supreeth Herle 2020-06-04 21:12:32 +02:00 committed by GitHub
parent 72370ff0b2
commit 8702605b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 2 deletions

View File

@ -61,6 +61,9 @@ void mme_s11_handle_create_session_response(
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
ogs_pdn_t *pdn = NULL;
ogs_gtp_bearer_qos_t bearer_qos;
ogs_gtp_ambr_t *ambr = NULL;
uint16_t decoded = 0;
ogs_assert(xact);
ogs_assert(rsp);
@ -151,6 +154,27 @@ void mme_s11_handle_create_session_response(
&rsp->protocol_configuration_options);
}
/* Bearer QoS */
if (rsp->bearer_contexts_created.bearer_level_qos.presence) {
decoded = ogs_gtp_parse_bearer_qos(&bearer_qos,
&rsp->bearer_contexts_created.bearer_level_qos);
ogs_assert(rsp->bearer_contexts_created.bearer_level_qos.len ==
decoded);
pdn->qos.qci = bearer_qos.qci;
pdn->qos.arp.priority_level = bearer_qos.priority_level;
pdn->qos.arp.pre_emption_capability =
bearer_qos.pre_emption_capability;
pdn->qos.arp.pre_emption_vulnerability =
bearer_qos.pre_emption_vulnerability;
}
/* AMBR */
if (rsp->aggregate_maximum_bit_rate.presence) {
ambr = rsp->aggregate_maximum_bit_rate.data;
pdn->ambr.downlink = be32toh(ambr->downlink) * 1000;
pdn->ambr.uplink = be32toh(ambr->uplink) * 1000;
}
/* Data Plane(UL) : SGW-S1U */
sgw_s1u_teid = rsp->bearer_contexts_created.s1_u_enodeb_f_teid.data;
bearer->sgw_s1u_teid = ntohl(sgw_s1u_teid->teid);

View File

@ -36,6 +36,9 @@ ogs_pkbuf_t *pgw_s5c_build_create_session_response(
ogs_gtp_cause_t cause;
ogs_gtp_f_teid_t pgw_s5c_teid, pgw_s5u_teid;
ogs_gtp_ambr_t ambr;
ogs_gtp_bearer_qos_t bearer_qos;
char bearer_qos_buf[GTP_BEARER_QOS_LEN];
int len;
uint8_t pco_buf[OGS_MAX_PCO_LEN];
int16_t pco_len;
@ -91,8 +94,20 @@ ogs_pkbuf_t *pgw_s5c_build_create_session_response(
rsp->apn_restriction.presence = 1;
rsp->apn_restriction.u8 = OGS_GTP_APN_NO_RESTRICTION;
/* TODO : APN-AMBR
/* APN-AMBR
* if PCRF changes APN-AMBR, this should be included. */
if ((gx_message->pdn.ambr.uplink &&
sess->pdn.ambr.uplink != gx_message->pdn.ambr.uplink) ||
(gx_message->pdn.ambr.downlink &&
sess->pdn.ambr.downlink != gx_message->pdn.ambr.downlink)) {
memset(&ambr, 0, sizeof(ogs_gtp_ambr_t));
ambr.uplink = htobe32(gx_message->pdn.ambr.uplink / 1000);
ambr.downlink = htobe32(gx_message->pdn.ambr.downlink / 1000);
rsp->aggregate_maximum_bit_rate.presence = 1;
rsp->aggregate_maximum_bit_rate.data = &ambr;
rsp->aggregate_maximum_bit_rate.len = sizeof(ambr);
}
/* PCO */
if (sess->ue_pco.presence && sess->ue_pco.len && sess->ue_pco.data) {
@ -113,8 +128,27 @@ ogs_pkbuf_t *pgw_s5c_build_create_session_response(
rsp->bearer_contexts_created.cause.len = sizeof(cause);
rsp->bearer_contexts_created.cause.data = &cause;
/* TODO : Bearer QoS
/* Bearer QoS
* if PCRF changes Bearer QoS, this should be included. */
if ((gx_message->pdn.qos.qci &&
sess->pdn.qos.qci != gx_message->pdn.qos.qci) ||
(gx_message->pdn.qos.arp.priority_level &&
sess->pdn.qos.arp.priority_level != gx_message->pdn.qos.arp.priority_level) ||
sess->pdn.qos.arp.pre_emption_capability != gx_message->pdn.qos.arp.pre_emption_capability ||
sess->pdn.qos.arp.pre_emption_vulnerability != gx_message->pdn.qos.arp.pre_emption_vulnerability) {
memset(&bearer_qos, 0, sizeof(bearer_qos));
bearer_qos.qci = gx_message->pdn.qos.qci;
bearer_qos.priority_level = gx_message->pdn.qos.arp.priority_level;
bearer_qos.pre_emption_capability =
gx_message->pdn.qos.arp.pre_emption_capability;
bearer_qos.pre_emption_vulnerability =
gx_message->pdn.qos.arp.pre_emption_vulnerability;
rsp->bearer_contexts_created.bearer_level_qos.presence = 1;
ogs_gtp_build_bearer_qos(&rsp->bearer_contexts_created.bearer_level_qos,
&bearer_qos, bearer_qos_buf, GTP_BEARER_QOS_LEN);
}
/* Data Plane(UL) : PGW-S5U */
memset(&pgw_s5u_teid, 0, sizeof(ogs_gtp_f_teid_t));