[GTPv1] Several QoS Profile IE enc/dec fixes and improvements (#1575)

This commit is contained in:
Pau Espin 2022-06-02 23:56:28 +02:00 committed by GitHub
parent e32139009b
commit 7dd5d27a71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 12 deletions

View File

@ -222,6 +222,19 @@ int16_t ogs_gtp1_parse_qos_profile(
&source->data.extended.max_bit_rate_uplink : NULL,
decoded->bit_rate_uplink_extended2_present ?
&source->data.extended2.max_bit_rate_uplink : NULL);
/* GBR is encoded the same way as MBR: */
decoded->dec_gbr_kbps_dl = dec_mbr_kbps(
source->data.guaranteed_bit_rate_downlink,
decoded->bit_rate_downlink_extended_present ?
&source->data.extended.guaranteed_bit_rate_downlink : NULL,
decoded->bit_rate_downlink_extended2_present ?
&source->data.extended2.guaranteed_bit_rate_downlink : NULL);
decoded->dec_gbr_kbps_ul = dec_mbr_kbps(
source->data.guaranteed_bit_rate_uplink,
decoded->bit_rate_uplink_extended_present ?
&source->data.extended.guaranteed_bit_rate_uplink : NULL,
decoded->bit_rate_uplink_extended2_present ?
&source->data.extended2.guaranteed_bit_rate_uplink : NULL);
}
return octet->len;
@ -241,7 +254,9 @@ static uint8_t enc_transfer_delay_ms(uint16_t transfer_delay_ms)
}
if (transfer_delay_ms > 150)
transfer_delay_ms = 150;
return transfer_delay_ms / 10;
if (transfer_delay_ms >= 10)
return transfer_delay_ms / 10;
return 1; /* 0 is "Reserved" Network->MS */
}
#define CHECK_EXT1 0xfe
@ -323,6 +338,8 @@ int16_t ogs_gtp1_build_qos_profile(ogs_tlv_octet_t *octet,
const ogs_gtp1_qos_profile_decoded_t *decoded, void *data, int data_len)
{
ogs_gtp1_qos_profile_t *target;
int mbr_extended_dl, mbr_extended_ul;
int gbr_extended_dl, gbr_extended_ul;
int extended_dl, extended_ul;
ogs_assert(octet);
@ -332,22 +349,39 @@ int16_t ogs_gtp1_build_qos_profile(ogs_tlv_octet_t *octet,
octet->data = data;
target = (ogs_gtp1_qos_profile_t *)octet->data;
/* First, encode in the target position the decoded-provided fields: */
/* First, copy the encoded buffer as it is: */
memcpy(target, &decoded->qos_profile, sizeof(ogs_gtp1_qos_profile_t));
/* Avoid setting Traffic Handling to 0=Reserved even if ignored based on
* Interactive/Background Traffic Class: */
if (target->data.traffic_handling_priority == 0)
target->data.traffic_handling_priority = 1;
/* Then, encode in the target position the decoded-provided fields: */
if (decoded->data_octet6_to_13_present)
target->data.transfer_delay = enc_transfer_delay_ms(decoded->dec_transfer_delay);
/* TODO: prefill with default values the extended bytes */
extended_dl = enc_mbr_kbps(decoded->dec_mbr_kbps_dl,
&target->data.max_bit_rate_downlink,
&target->data.extended.max_bit_rate_downlink,
&target->data.extended2.max_bit_rate_downlink);
extended_ul = enc_mbr_kbps(decoded->dec_mbr_kbps_ul,
&target->data.max_bit_rate_uplink,
&target->data.extended.max_bit_rate_uplink,
&target->data.extended2.max_bit_rate_uplink);
mbr_extended_dl = enc_mbr_kbps(decoded->dec_mbr_kbps_dl,
&target->data.max_bit_rate_downlink,
&target->data.extended.max_bit_rate_downlink,
&target->data.extended2.max_bit_rate_downlink);
mbr_extended_ul = enc_mbr_kbps(decoded->dec_mbr_kbps_ul,
&target->data.max_bit_rate_uplink,
&target->data.extended.max_bit_rate_uplink,
&target->data.extended2.max_bit_rate_uplink);
/* GBR is encoded the same way as MBR: */
gbr_extended_dl = enc_mbr_kbps(decoded->dec_gbr_kbps_dl,
&target->data.guaranteed_bit_rate_downlink,
&target->data.extended.guaranteed_bit_rate_downlink,
&target->data.extended2.guaranteed_bit_rate_downlink);
gbr_extended_ul = enc_mbr_kbps(decoded->dec_gbr_kbps_ul,
&target->data.guaranteed_bit_rate_uplink,
&target->data.extended.guaranteed_bit_rate_uplink,
&target->data.extended2.guaranteed_bit_rate_uplink);
extended_dl = ogs_max(mbr_extended_dl, gbr_extended_dl);
extended_ul = ogs_max(mbr_extended_ul, gbr_extended_ul);
memcpy(target, &decoded->qos_profile, sizeof(ogs_gtp1_qos_profile_t));
/* Finally, set len based on the required octets to encode the fields: */
if (extended_ul == 2)
octet->len = 23;
else if (extended_dl == 2)

View File

@ -264,6 +264,8 @@ typedef struct ogs_gtp1_qos_profile_decoded_s {
uint16_t dec_transfer_delay;
uint32_t dec_mbr_kbps_dl; /* decoded MBR in kbps */
uint32_t dec_mbr_kbps_ul; /* decoded MBR in kbps */
uint32_t dec_gbr_kbps_dl; /* decoded GBR in kbps */
uint32_t dec_gbr_kbps_ul; /* decoded GBR in kbps */
} __attribute__ ((packed)) ogs_gtp1_qos_profile_decoded_t;
#define OGS_GTP1_QOS_TRAFFIC_CLASS_SUBSCRIBED 0