From 7dd5d27a71a414fe067f3bb6a3d3a5c3000602d4 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 2 Jun 2022 23:56:28 +0200 Subject: [PATCH] [GTPv1] Several QoS Profile IE enc/dec fixes and improvements (#1575) --- lib/gtp/v1/types.c | 58 ++++++++++++++++++++++++++++++++++++---------- lib/gtp/v1/types.h | 2 ++ 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/lib/gtp/v1/types.c b/lib/gtp/v1/types.c index 8b9549a6c..92907d994 100644 --- a/lib/gtp/v1/types.c +++ b/lib/gtp/v1/types.c @@ -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) diff --git a/lib/gtp/v1/types.h b/lib/gtp/v1/types.h index 73fc503d1..ed82486b8 100644 --- a/lib/gtp/v1/types.h +++ b/lib/gtp/v1/types.h @@ -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