fixeria submitted this change.

View Change

Approvals: Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, approved
bts: gsm_bts_alloc(): use reasonable multi-rate config defaults

The current multi-rate configuration uses the same threshold and
the same hysteresis values for all modes: 32 and 8, respectively.
This basically forces the AMR link adoptation loop in the BTS to
stick to the initial codec mode during an lchan's lifetime.

Let's use more reasonable default values from 3GPP TS 51.010-1
(version 13.11.0), sections 14.2.19.4.1 and 14.2.20.4.1 for
AMR-FR and AMR-HR, respectively.

^ C/I (dB) | FR / HR |
| |
| |
MODE4 | |
= | ----+---- THR_MX_Up(3) | 20.5 / 18.0 |
| | |
| = ----+---- THR_MX_Dn(4) | 18.5 / 16.0 |
MODE3 | |
| = ----+---- THR_MX_Up(2) | 14.5 / 14.0 |
| | |
= | ----+---- THR_MX_Dn(3) | 12.5 / 12.0 |
MODE2 | |
= | ----+---- THR_MX_Up(1) | 8.5 / 10.0 |
| | |
| = ----+---- THR_MX_Dn(2) | 6.5 / 8.0 |
MODE1 | |
| |
| |

Change-Id: Ic5f8d55d250976d8d4c9cae2d89480fd52326717
Related: SYS#5917, OS#4984
---
M src/osmo-bsc/bts.c
1 file changed, 59 insertions(+), 17 deletions(-)

diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c
index c335963..f4c90e0 100644
--- a/src/osmo-bsc/bts.c
+++ b/src/osmo-bsc/bts.c
@@ -334,51 +334,93 @@
};

/* Set reasonable defaults for AMR-FR and AMR-HR rate configuration.
- * (see also 3GPP TS 28.062, Table 7.11.3.1.3-2) */
+ * The values are taken from 3GPP TS 51.010-1 (version 13.11.0).
+ * See 14.2.19.4.1 and 14.2.20.4.1 for AMR-FR and AMR-HR, respectively. */
static const struct gsm48_multi_rate_conf amr_fr_mr_cfg = {
.m4_75 = 1,
.m5_90 = 1,
- .m7_40 = 1,
+ .m7_95 = 1,
.m12_2 = 1
};
static const struct gsm48_multi_rate_conf amr_hr_mr_cfg = {
.m4_75 = 1,
.m5_90 = 1,
- .m7_40 = 1,
+ .m6_70 = 1,
+ .m7_95 = 1,
};

memcpy(bts->mr_full.gsm48_ie, &amr_fr_mr_cfg, sizeof(bts->mr_full.gsm48_ie));
memcpy(bts->mr_half.gsm48_ie, &amr_hr_mr_cfg, sizeof(bts->mr_half.gsm48_ie));

- static const struct amr_mode amr_ms_bts_mode[] = {
+ /* ^ C/I (dB) | FR / HR |
+ * | |
+ * | |
+ * MODE4 | |
+ * = | ----+---- THR_MX_Up(3) | 20.5 / 18.0 |
+ * | | |
+ * | = ----+---- THR_MX_Dn(4) | 18.5 / 16.0 |
+ * MODE3 | |
+ * | = ----+---- THR_MX_Up(2) | 14.5 / 14.0 |
+ * | | |
+ * = | ----+---- THR_MX_Dn(3) | 12.5 / 12.0 |
+ * MODE2 | |
+ * = | ----+---- THR_MX_Up(1) | 8.5 / 10.0 |
+ * | | |
+ * | = ----+---- THR_MX_Dn(2) | 6.5 / 8.0 |
+ * MODE1 | |
+ * | |
+ * | |
+ */
+ static const struct amr_mode amr_fr_ms_bts_mode[] = {
{
.mode = 0, /* 4.75k */
- .threshold = 32,
- .hysteresis = 8,
+ .threshold = 13, /* THR_MX_Dn(2): 6.5 dB */
+ .hysteresis = 4, /* THR_MX_Up(1): 8.5 dB */
},
{
.mode = 2, /* 5.90k */
- .threshold = 32,
- .hysteresis = 8,
+ .threshold = 25, /* THR_MX_Dn(3): 12.5 dB */
+ .hysteresis = 4, /* THR_MX_Up(2): 14.5 dB */
},
{
- .mode = 4, /* 7.40k */
- .threshold = 32,
- .hysteresis = 8,
+ .mode = 5, /* 7.95k */
+ .threshold = 37, /* THR_MX_Dn(4): 18.5 dB */
+ .hysteresis = 4, /* THR_MX_Up(3): 20.5 dB */
},
{
.mode = 7, /* 12.2k */
/* this is the last mode, so no threshold */
},
};
+ static const struct amr_mode amr_hr_ms_bts_mode[] = {
+ {
+ .mode = 0, /* 4.75k */
+ .threshold = 16, /* THR_MX_Dn(2): 8.0 dB */
+ .hysteresis = 4, /* THR_MX_Up(1): 10.0 dB */
+ },
+ {
+ .mode = 2, /* 5.90k */
+ .threshold = 24, /* THR_MX_Dn(3): 12.0 dB */
+ .hysteresis = 4, /* THR_MX_Up(2): 14.0 dB */
+ },
+ {
+ .mode = 3, /* 6.70k */
+ .threshold = 32, /* THR_MX_Dn(4): 16.0 dB */
+ .hysteresis = 4, /* THR_MX_Up(3): 18.0 dB */
+ },
+ {
+ .mode = 5, /* 7.95k */
+ /* this is the last mode, so no threshold */
+ },
+ };

- memcpy(&bts->mr_full.ms_mode[0], &amr_ms_bts_mode[0], sizeof(amr_ms_bts_mode));
- memcpy(&bts->mr_full.bts_mode[0], &amr_ms_bts_mode[0], sizeof(amr_ms_bts_mode));
- bts->mr_full.num_modes = 4;
+ memcpy(&bts->mr_full.ms_mode[0], &amr_fr_ms_bts_mode[0], sizeof(amr_fr_ms_bts_mode));
+ memcpy(&bts->mr_full.bts_mode[0], &amr_fr_ms_bts_mode[0], sizeof(amr_fr_ms_bts_mode));
+ bts->mr_full.num_modes = ARRAY_SIZE(amr_fr_ms_bts_mode);

- memcpy(&bts->mr_half.ms_mode[0], &amr_ms_bts_mode[0], sizeof(amr_ms_bts_mode));
- memcpy(&bts->mr_half.bts_mode[0], &amr_ms_bts_mode[0], sizeof(amr_ms_bts_mode));
- bts->mr_half.num_modes = 3;
+ memcpy(&bts->mr_half.ms_mode[0], &amr_hr_ms_bts_mode[0], sizeof(amr_hr_ms_bts_mode));
+ memcpy(&bts->mr_half.bts_mode[0], &amr_hr_ms_bts_mode[0], sizeof(amr_hr_ms_bts_mode));
+ bts->mr_half.num_modes = ARRAY_SIZE(amr_hr_ms_bts_mode);

bts_init_cbch_state(&bts->cbch_basic, bts);
bts_init_cbch_state(&bts->cbch_extended, bts);

To view, visit change 27745. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: Ic5f8d55d250976d8d4c9cae2d89480fd52326717
Gerrit-Change-Number: 27745
Gerrit-PatchSet: 2
Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: laforge <laforge@osmocom.org>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>
Gerrit-MessageType: merged