aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2023-08-30 02:08:32 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2023-09-13 23:04:11 +0200
commite6fa760e9a11119e94d178778aa6d60995c6c41a (patch)
tree965173a425993634f8c4c1276d34aef0327ea117
parentdb8c258f550420e5cf764d0d64716f5babf62ae9 (diff)
ranap RAB: set min/max bitrates dynamically
-rw-r--r--src/ranap_msg_factory.c27
-rw-r--r--tests/test-ranap.ok8
2 files changed, 28 insertions, 7 deletions
diff --git a/src/ranap_msg_factory.c b/src/ranap_msg_factory.c
index 48e557a..c0a2697 100644
--- a/src/ranap_msg_factory.c
+++ b/src/ranap_msg_factory.c
@@ -545,6 +545,18 @@ new_format_info_pars(long sdu_size)
return fmti;
}
+static int amr_mode_to_bitrate[OSMO_RANAP_RAB_MODE_COUNT] = {
+ [OSMO_RANAP_RAB_MODE_AMR_4_75] = 4750,
+ [OSMO_RANAP_RAB_MODE_AMR_5_15] = 5150,
+ [OSMO_RANAP_RAB_MODE_AMR_5_90] = 5900,
+ [OSMO_RANAP_RAB_MODE_AMR_6_70] = 6700,
+ [OSMO_RANAP_RAB_MODE_AMR_7_40] = 7400,
+ [OSMO_RANAP_RAB_MODE_AMR_7_95] = 7950,
+ [OSMO_RANAP_RAB_MODE_AMR_10_2] = 10200,
+ [OSMO_RANAP_RAB_MODE_AMR_12_2] = 12200,
+ /* Unset values remain 0 */
+};
+
enum sdu_par_profile {
SDUPAR_P_VOICE0 = 0,
SDUPAR_P_VOICE1 = 1,
@@ -675,17 +687,26 @@ static RANAP_RAB_Parameters_t *new_rab_par_voice(uint16_t modes)
RANAP_RAB_Parameters_t *rab = CALLOC(1, sizeof(*rab));
RANAP_SDU_ParameterItem_t *sdui;
- int bitrate_guaranteed = 6700;
- int bitrate_max = 12200;
+ int bitrate_min = INT_MAX;
+ int bitrate_max = 0;
int sdu_size_max = 0;
int i;
for (i = 0; i < OSMO_RANAP_RAB_MODE_COUNT && (1 << i) <= modes; i++) {
+ int bitrate;
int sdu_size;
/* only add modes that are present in the bitmask */
if ((modes & (1 << i)) == 0)
continue;
+ bitrate = amr_mode_to_bitrate[i];
+ if (bitrate) {
+ if (bitrate < bitrate_min)
+ bitrate_min = bitrate;
+ if (bitrate > bitrate_max)
+ bitrate_max = bitrate;
+ }
+
sdu_size = amr_mode_to_sdu_size(i);
if (sdu_size > sdu_size_max)
sdu_size_max = sdu_size;
@@ -696,7 +717,7 @@ static RANAP_RAB_Parameters_t *new_rab_par_voice(uint16_t modes)
ASN_SEQUENCE_ADD(&rab->maxBitrate.list, new_long(bitrate_max));
rab->guaranteedBitRate = CALLOC(1, sizeof(*rab->guaranteedBitRate));
- ASN_SEQUENCE_ADD(rab->guaranteedBitRate, new_long(bitrate_guaranteed));
+ ASN_SEQUENCE_ADD(rab->guaranteedBitRate, new_long(bitrate_min));
rab->deliveryOrder = RANAP_DeliveryOrder_delivery_order_requested;
rab->maxSDU_Size = sdu_size_max;
diff --git a/tests/test-ranap.ok b/tests/test-ranap.ok
index a0ea521..213085e 100644
--- a/tests/test-ranap.ok
+++ b/tests/test-ranap.ok
@@ -88,7 +88,7 @@ Decoded Cause Misc=115
<id>53</id>
<firstCriticality><reject/></firstCriticality>
<firstValue>
- 78 02 CD 80 10 2F A7 20 1A 2C 00 00 F4 4C 08 0A
+ 78 02 CD 80 10 2F A7 20 2F A8 00 00 F4 4C 08 0A
02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22
28 14 00 3C 40 00 00 00 50 3D 02 00 02 27 C0 35
00 01 0A 0B 0C 0D 00 00 00 00 00 00 00 00 00 00
@@ -101,15 +101,15 @@ Decoded Cause Misc=115
<id>54</id>
<criticality><ignore/></criticality>
<value>
- 00 00 01 00 35 00 48 78 02 CD 80 10 2F A7 20 1A
- 2C 00 00 F4 4C 08 0A 02 80 00 51 40 00 27 20 28
+ 00 00 01 00 35 00 48 78 02 CD 80 10 2F A7 20 2F
+ A8 00 00 F4 4C 08 0A 02 80 00 51 40 00 27 20 28
14 00 67 40 00 00 22 28 14 00 3C 40 00 00 00 50
3D 02 00 02 27 C0 35 00 01 0A 0B 0C 0D 00 00 00
00 00 00 00 00 00 00 00 00 00 40 09 26 00 00 40
01 00
</value>
</RANAP_IE>
-00 00 00 59 00 00 01 00 36 40 52 00 00 01 00 35 00 48 78 02 cd 80 10 2f a7 20 1a 2c 00 00 f4 4c 08 0a 02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22 28 14 00 3c 40 00 00 00 50 3d 02 00 02 27 c0 35 00 01 0a 0b 0c 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 40 09 26 00 00 40 01 00
+00 00 00 59 00 00 01 00 36 40 52 00 00 01 00 35 00 48 78 02 cd 80 10 2f a7 20 2f a8 00 00 f4 4c 08 0a 02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22 28 14 00 3c 40 00 00 00 50 3d 02 00 02 27 c0 35 00 01 0a 0b 0c 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 40 09 26 00 00 40 01 00
==> RAB ASSIGNMENT COMMAND (DATA)
<RANAP_ProtocolIE-FieldPair>