This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
pespin gerrit-no-reply at lists.osmocom.orgpespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/25611 ) Change subject: MS Power Control Loop: Allow Turn off/on C/I independent from value setting ...................................................................... MS Power Control Loop: Allow Turn off/on C/I independent from value setting Improve the current VTY support to allow enabling/disabling C/I logic independent from value setting. This way C/I support can be quickly disabled & enabled. Reminder: changing power parameters still require VTY Command "bts NR resend-power-control-defaults" to be excuted prior to new parameters being applied on the BTS. Related: SYS#4917 Change-Id: Id1224c2d9a52db2ed805c49e048d3086ed0167f5 --- M doc/manuals/chapters/power_control.adoc M include/osmocom/bsc/gsm_data.h M src/osmo-bsc/bts_osmobts.c M src/osmo-bsc/bts_vty.c M src/osmo-bsc/gsm_data.c M tests/power_ctrl.vty 6 files changed, 126 insertions(+), 65 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/11/25611/1 diff --git a/doc/manuals/chapters/power_control.adoc b/doc/manuals/chapters/power_control.adoc index bc112aa..51a38cb 100644 --- a/doc/manuals/chapters/power_control.adoc +++ b/doc/manuals/chapters/power_control.adoc @@ -33,6 +33,7 @@ other hand, OsmoBTS may support some extra parameters coming in Osmocom specific IEs not supported by nanoBTS, such as those configuring C/I measurement thresholds. +[[apply_pwr_ctrl]] ==== When the parameters come into effect? It depends on how the power control parameters are signaled to the BTS. If a given @@ -337,21 +338,24 @@ bts 0 ms-power-control mode dyn-bts <1> - ci-thresh amr-fr lower 7 upper 11 <2> - ci-thresh-comp amr-fr lower 2 10 <3> upper 3 4 <4> + ci-thresh amr-fr enable <2> + ci-thresh amr-fr lower 7 upper 11 <3> + ci-thresh-comp amr-fr lower 2 10 <4> upper 3 4 <5> ---- <1> MS power control is to be performed by the BTS autonomously. -<2> L_CI_AMR_FR_XX_P=7, U_CI_AMR_FR_XX_P=11. -<3> P0=2 out of N1=10 averages < L_CI_AMR_FR_XX_P => increase power. -<4> P1=3 out of N2=4 averages > U_CI_AMR_FR_XX_P => decrease power. +<2> MS power control loop should take C/I into account. +<3> L_CI_AMR_FR_XX_P=7, U_CI_AMR_FR_XX_P=11. +<4> P0=2 out of N1=10 averages < L_CI_AMR_FR_XX_P => increase power. +<5> P1=3 out of N2=4 averages > U_CI_AMR_FR_XX_P => decrease power. NOTE: The BSC can instruct a BTS to disable C/I related logic in its autonomous MS Power Control Loop for a given channel type (hence not taking C/I measurements into account) by means of setting both related LOWER_CMP_N and UPPER_CMP_N parameters to zero (see _ci-thresh-comp_ VTY command). For the sake of easing configuration, a placeholder VTY command to disable C/I for all -channel types is available under VTY node _ms-power-control_ as *_ci-thresh-comp -disable all_*. +channel types is available under VTY node _ms-power-control_ as *_ci-thresh +all disable_*. Afterwards, the new configuration must be deployed to the target +BTS (see <<apply_pwr_ctrl>>). ==== Measurement averaging process diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index b166146..1fd7015 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -1289,6 +1289,9 @@ /* MS/BS Power related measurement parameters */ struct gsm_power_ctrl_meas_params { + /* Are this measurement paremeters to be taken into account by loop? */ + bool enabled; + /* Thresholds (see 3GPP TS 45.008, section A.3.2.1) */ uint8_t lower_thresh; /* lower (decreasing) direction */ uint8_t upper_thresh; /* upper (increasing) direction */ diff --git a/src/osmo-bsc/bts_osmobts.c b/src/osmo-bsc/bts_osmobts.c index 5007d2b..5c535be 100644 --- a/src/osmo-bsc/bts_osmobts.c +++ b/src/osmo-bsc/bts_osmobts.c @@ -112,8 +112,15 @@ ie_len = msgb_tl_put(msg, RSL_IPAC_EIE_OSMO_MS_PWR_CTL); osmo_thresh = (struct osmo_preproc_pc_thresh *) msgb_put(msg, sizeof(*osmo_thresh)); #define ENC_THRESH_CI(TYPE) \ - osmo_thresh->l_##TYPE = cp->TYPE##_meas.lower_thresh; \ - osmo_thresh->u_##TYPE = cp->TYPE##_meas.upper_thresh + do { \ + if (cp->TYPE##_meas.enabled) { \ + osmo_thresh->l_##TYPE = cp->TYPE##_meas.lower_thresh; \ + osmo_thresh->u_##TYPE = cp->TYPE##_meas.upper_thresh; \ + } else { \ + osmo_thresh->l_##TYPE = 0; \ + osmo_thresh->u_##TYPE = 0; \ + } \ + } while (0) ENC_THRESH_CI(ci_fr); ENC_THRESH_CI(ci_hr); ENC_THRESH_CI(ci_amr_fr); @@ -128,10 +135,19 @@ ie_len = msgb_tl_put(msg, RSL_IPAC_EIE_OSMO_PC_THRESH_COMP); osmo_thresh_comp = (struct osmo_preproc_pc_comp *) msgb_put(msg, sizeof(*osmo_thresh_comp)); #define ENC_THRESH_CI(TYPE) \ - osmo_thresh_comp->TYPE.lower_p = cp->TYPE##_meas.lower_cmp_p & 0x1f; \ - osmo_thresh_comp->TYPE.lower_n = cp->TYPE##_meas.lower_cmp_n & 0x1f; \ - osmo_thresh_comp->TYPE.upper_p = cp->TYPE##_meas.upper_cmp_p & 0x1f; \ - osmo_thresh_comp->TYPE.upper_n = cp->TYPE##_meas.upper_cmp_n & 0x1f + do { \ + if (cp->TYPE##_meas.enabled) { \ + osmo_thresh_comp->TYPE.lower_p = cp->TYPE##_meas.lower_cmp_p & 0x1f; \ + osmo_thresh_comp->TYPE.lower_n = cp->TYPE##_meas.lower_cmp_n & 0x1f; \ + osmo_thresh_comp->TYPE.upper_p = cp->TYPE##_meas.upper_cmp_p & 0x1f; \ + osmo_thresh_comp->TYPE.upper_n = cp->TYPE##_meas.upper_cmp_n & 0x1f; \ + } else { \ + osmo_thresh_comp->TYPE.lower_p = 0; \ + osmo_thresh_comp->TYPE.lower_n = 0; \ + osmo_thresh_comp->TYPE.upper_p = 0; \ + osmo_thresh_comp->TYPE.upper_n = 0; \ + } \ + } while (0) ENC_THRESH_CI(ci_fr); ENC_THRESH_CI(ci_hr); ENC_THRESH_CI(ci_amr_fr); diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c index 7a502d7..fb11520 100644 --- a/src/osmo-bsc/bts_vty.c +++ b/src/osmo-bsc/bts_vty.c @@ -3093,6 +3093,7 @@ } #define VTY_CMD_CI_TYPE "(fr-efr|hr|amr-fr|amr-hr|sdcch|gprs)" +#define VTY_CMD_CI_OR_ALL_TYPE "(fr-efr|hr|amr-fr|amr-hr|sdcch|gprs|all)" #define VTY_DESC_CI_TYPE \ "Channel Type FR/EFR\n" \ "Channel Type HR\n" \ @@ -3100,6 +3101,8 @@ "Channel Type AMR HR\n" \ "Channel Type SDCCH\n" \ "Channel Type (E)GPRS\n" +#define VTY_DESC_CI_OR_ALL_TYPE VTY_DESC_CI_TYPE "All Channel Types\n" + static struct gsm_power_ctrl_meas_params *ci_thresh_by_conn_type(struct gsm_power_ctrl_params *params, const char *type) { if (!strcmp(type, "fr-efr")) @@ -3155,6 +3158,35 @@ return CMD_SUCCESS; } +DEFUN_USRATTR(cfg_power_ctrl_ci_thresh_disable, + cfg_power_ctrl_ci_thresh_disable_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + "ci-thresh " VTY_CMD_CI_OR_ALL_TYPE " (enable|disable)", + "Set target C/I thresholds (for dynamic mode), only available in ms-power-control\n" + VTY_DESC_CI_OR_ALL_TYPE + "Enable C/I comparison in control loop\n" + "Disable C/I comparison in control loop\n") +{ + struct gsm_power_ctrl_params *params = vty->index; + + bool enable = strcmp(argv[1], "enable") == 0; + + if (strcmp(argv[0], "all") == 0) { + params->ci_fr_meas.enabled = enable; + params->ci_hr_meas.enabled = enable; + params->ci_amr_fr_meas.enabled = enable; + params->ci_amr_hr_meas.enabled = enable; + params->ci_sdcch_meas.enabled = enable; + params->ci_gprs_meas.enabled = enable; + } else { + struct gsm_power_ctrl_meas_params *meas_params = ci_thresh_by_conn_type(params, argv[0]); + meas_params->enabled = enable; + } + + return CMD_SUCCESS; +} + #define POWER_CONTROL_MEAS_THRESH_COMP_CMD(meas) \ meas " lower <0-31> <0-31> upper <0-31> <0-31>" #define POWER_CONTROL_MEAS_THRESH_COMP_DESC(meas, opt_param, lp, ln, up, un) \ @@ -3272,35 +3304,6 @@ return CMD_SUCCESS; } -DEFUN_USRATTR(cfg_power_ctrl_ci_thresh_comp_disable, - cfg_power_ctrl_ci_thresh_comp_disable_cmd, - X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | - X(BSC_VTY_ATTR_NEW_LCHAN), - "ci-thresh-comp disable all", - "Set Carrier-to_interference (C/I) threshold comparators (for dynamic mode)\n" - "Disable C/I comparison in control loop (sets LOWER_CMP_N and UPPER_CMP_N to zero)\n" - "Disable C/I comparison for all channel types\n") -{ - struct gsm_power_ctrl_params *params = vty->index; - -#define DISABLE_MEAS_PC(PARAMS, TYPE) \ - (PARAMS)->TYPE##_meas.lower_cmp_p = 0; \ - (PARAMS)->TYPE##_meas.lower_cmp_n = 0; \ - (PARAMS)->TYPE##_meas.upper_cmp_p = 0; \ - (PARAMS)->TYPE##_meas.upper_cmp_n = 0 - - DISABLE_MEAS_PC(params, ci_fr); - DISABLE_MEAS_PC(params, ci_hr); - DISABLE_MEAS_PC(params, ci_amr_fr); - DISABLE_MEAS_PC(params, ci_amr_hr); - DISABLE_MEAS_PC(params, ci_sdcch); - DISABLE_MEAS_PC(params, ci_gprs); - -#undef DISABLE_MEAS_PC - - return CMD_SUCCESS; -} - #define POWER_CONTROL_MEAS_AVG_CMD \ "(rxlev-avg|rxqual-avg)" #define POWER_CONTROL_MEAS_AVG_DESC \ @@ -3898,6 +3901,12 @@ const struct gsm_power_ctrl_meas_params *mp, const char *param, const char *param2) { + if (strcmp(param, "ci") == 0) { + cfg_out("%s-thresh%s %s%s", + param, param2, mp->enabled ? "enable" : "disable", + VTY_NEWLINE); + } + cfg_out("%s-thresh%s lower %u upper %u%s", param, param2, mp->lower_thresh, mp->upper_thresh, VTY_NEWLINE); @@ -3932,6 +3941,7 @@ } static void config_write_power_ctrl(struct vty *vty, unsigned int indent, + const struct gsm_bts *bts, const struct gsm_power_ctrl_params *cp) { const char *node_name; @@ -3965,7 +3975,7 @@ /* Measurement processing / averaging parameters */ config_write_power_ctrl_meas(vty, indent + 1, &cp->rxlev_meas, "rxlev", ""); config_write_power_ctrl_meas(vty, indent + 1, &cp->rxqual_meas, "rxqual", ""); - if (cp->dir == GSM_PWR_CTRL_DIR_UL) { + if (cp->dir == GSM_PWR_CTRL_DIR_UL && is_osmobts(bts)) { config_write_power_ctrl_meas(vty, indent + 1, &cp->ci_fr_meas, "ci", " fr-efr"); config_write_power_ctrl_meas(vty, indent + 1, &cp->ci_hr_meas, "ci", " hr"); config_write_power_ctrl_meas(vty, indent + 1, &cp->ci_amr_fr_meas, "ci", " amr-fr"); @@ -4285,8 +4295,8 @@ } /* BS/MS Power Control parameters */ - config_write_power_ctrl(vty, 2, &bts->bs_power_ctrl); - config_write_power_ctrl(vty, 2, &bts->ms_power_ctrl); + config_write_power_ctrl(vty, 2, bts, &bts->bs_power_ctrl); + config_write_power_ctrl(vty, 2, bts, &bts->ms_power_ctrl); config_write_bts_model(vty, bts); } @@ -4470,11 +4480,11 @@ install_element(POWER_CTRL_NODE, &cfg_power_ctrl_step_size_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxqual_thresh_cmd); + install_element(POWER_CTRL_NODE, &cfg_power_ctrl_ci_thresh_disable_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_ci_thresh_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_comp_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxqual_thresh_comp_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_ci_thresh_comp_cmd); - install_element(POWER_CTRL_NODE, &cfg_power_ctrl_ci_thresh_comp_disable_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_no_avg_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_params_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_algo_cmd); diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c index a6c54d8..c8108e8 100644 --- a/src/osmo-bsc/gsm_data.c +++ b/src/osmo-bsc/gsm_data.c @@ -1146,6 +1146,7 @@ /* RxLev measurement parameters */ .rxlev_meas = { + .enabled = true, /* Thresholds for RxLev (see 3GPP TS 45.008, A.3.2.1) */ .lower_thresh = 32, /* L_RXLEV_XX_P (-78 dBm) */ .upper_thresh = 38, /* U_RXLEV_XX_P (-72 dBm) */ @@ -1170,6 +1171,7 @@ /* RxQual measurement parameters */ .rxqual_meas = { + .enabled = true, /* Thresholds for RxQual (see 3GPP TS 45.008, A.3.2.1) */ .lower_thresh = 3, /* L_RXQUAL_XX_P (0.8% <= BER < 1.6%) */ .upper_thresh = 0, /* U_RXQUAL_XX_P (BER < 0.2%) */ @@ -1198,6 +1200,7 @@ * above the target. */ .ci_fr_meas = { /* FR: Target C/I = 15 dB, Soft blocking threshold = 10 dB */ + .enabled = true, .lower_thresh = 13, .upper_thresh = 17, @@ -1219,6 +1222,7 @@ .h_reqt = 6, /* TODO: investigate a reasonable default value */ }, .ci_hr_meas = { /* HR: Target C/I = 18 dB, Soft blocking threshold = 13 dB */ + .enabled = true, .lower_thresh = 16, .upper_thresh = 21, @@ -1240,6 +1244,7 @@ .h_reqt = 6, /* TODO: investigate a reasonable default value */ }, .ci_amr_fr_meas = { /* AMR-FR: Target C/I = 9 dB, Soft blocking threshold = 4 dB */ + .enabled = true, .lower_thresh = 7, .upper_thresh = 11, @@ -1261,6 +1266,7 @@ .h_reqt = 6, /* TODO: investigate a reasonable default value */ }, .ci_amr_hr_meas = { /* AMR-HR: Target C/I = 15 dB, Soft blocking threshold = 10 dB */ + .enabled = true, .lower_thresh = 13, .upper_thresh = 17, @@ -1282,6 +1288,7 @@ .h_reqt = 6, /* TODO: investigate a reasonable default value */ }, .ci_sdcch_meas = { /* SDCCH: Target C/I = 14 dB, Soft blocking threshold = 9 dB */ + .enabled = true, .lower_thresh = 12, .upper_thresh = 16, @@ -1303,6 +1310,7 @@ .h_reqt = 6, /* TODO: investigate a reasonable default value */ }, .ci_gprs_meas = { /* GPRS: Target C/I = 20 dB, Soft blocking threshold = 15 dB */ + .enabled = true, .lower_thresh = 18, .upper_thresh = 24, diff --git a/tests/power_ctrl.vty b/tests/power_ctrl.vty index b14a905..491adca 100644 --- a/tests/power_ctrl.vty +++ b/tests/power_ctrl.vty @@ -34,11 +34,11 @@ . lv step-size inc <2-6> red <2-4> . lv rxlev-thresh lower <0-63> upper <0-63> . lv rxqual-thresh lower <0-7> upper <0-7> + . lv ci-thresh (fr-efr|hr|amr-fr|amr-hr|sdcch|gprs|all) (enable|disable) . lv ci-thresh (fr-efr|hr|amr-fr|amr-hr|sdcch|gprs) lower <0-30> upper <0-30> . lv rxlev-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31> . lv rxqual-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31> . lv ci-thresh-comp (fr-efr|hr|amr-fr|amr-hr|sdcch|gprs) lower <0-31> <0-31> upper <0-31> <0-31> - . lv ci-thresh-comp disable all . lv no (rxlev-avg|rxqual-avg) . lv (rxlev-avg|rxqual-avg) params hreqave <1-31> hreqt <1-31> . lv (rxlev-avg|rxqual-avg) algo (unweighted|weighted|mod-median) @@ -115,11 +115,11 @@ . lv step-size inc <2-6> red <2-4> . lv rxlev-thresh lower <0-63> upper <0-63> . lv rxqual-thresh lower <0-7> upper <0-7> + . lv ci-thresh (fr-efr|hr|amr-fr|amr-hr|sdcch|gprs|all) (enable|disable) . lv ci-thresh (fr-efr|hr|amr-fr|amr-hr|sdcch|gprs) lower <0-30> upper <0-30> . lv rxlev-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31> . lv rxqual-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31> . lv ci-thresh-comp (fr-efr|hr|amr-fr|amr-hr|sdcch|gprs) lower <0-31> <0-31> upper <0-31> <0-31> - . lv ci-thresh-comp disable all . lv no (rxlev-avg|rxqual-avg) . lv (rxlev-avg|rxqual-avg) params hreqave <1-31> hreqt <1-31> . lv (rxlev-avg|rxqual-avg) algo (unweighted|weighted|mod-median) @@ -143,16 +143,22 @@ rxlev-thresh-comp lower 10 12 upper 19 20 rxqual-thresh lower 3 upper 0 rxqual-thresh-comp lower 5 7 upper 15 18 + ci-thresh fr-efr enable ci-thresh fr-efr lower 13 upper 17 ci-thresh-comp fr-efr lower 5 7 upper 15 18 + ci-thresh hr enable ci-thresh hr lower 16 upper 21 ci-thresh-comp hr lower 5 7 upper 15 18 + ci-thresh amr-fr enable ci-thresh amr-fr lower 7 upper 11 ci-thresh-comp amr-fr lower 5 7 upper 15 18 + ci-thresh amr-hr enable ci-thresh amr-hr lower 13 upper 17 ci-thresh-comp amr-hr lower 5 7 upper 15 18 + ci-thresh sdcch enable ci-thresh sdcch lower 12 upper 16 ci-thresh-comp sdcch lower 5 7 upper 15 18 + ci-thresh gprs enable ci-thresh gprs lower 18 upper 24 ci-thresh-comp gprs lower 5 7 upper 15 18 ... @@ -304,33 +310,47 @@ ... ms-power-control ... + ci-thresh fr-efr enable + ci-thresh fr-efr lower 13 upper 17 ci-thresh-comp fr-efr lower 5 7 upper 15 18 -... + ci-thresh hr enable + ci-thresh hr lower 16 upper 21 ci-thresh-comp hr lower 5 7 upper 15 18 -... + ci-thresh amr-fr enable + ci-thresh amr-fr lower 7 upper 11 ci-thresh-comp amr-fr lower 5 7 upper 15 18 -... + ci-thresh amr-hr enable + ci-thresh amr-hr lower 13 upper 17 ci-thresh-comp amr-hr lower 5 7 upper 15 18 -... + ci-thresh sdcch enable + ci-thresh sdcch lower 12 upper 16 ci-thresh-comp sdcch lower 5 7 upper 15 18 -... + ci-thresh gprs enable + ci-thresh gprs lower 18 upper 24 ci-thresh-comp gprs lower 5 7 upper 15 18 ... -OsmoBSC(config-ms-power-ctrl)# ci-thresh-comp disable all +OsmoBSC(config-ms-power-ctrl)# ci-thresh all disable OsmoBSC(config-ms-power-ctrl)# show running-config ... ms-power-control ... - ci-thresh-comp fr-efr lower 0 0 upper 0 0 -... - ci-thresh-comp hr lower 0 0 upper 0 0 -... - ci-thresh-comp amr-fr lower 0 0 upper 0 0 -... - ci-thresh-comp amr-hr lower 0 0 upper 0 0 -... - ci-thresh-comp sdcch lower 0 0 upper 0 0 -... - ci-thresh-comp gprs lower 0 0 upper 0 0 + ci-thresh fr-efr disable + ci-thresh fr-efr lower 13 upper 17 + ci-thresh-comp fr-efr lower 5 7 upper 15 18 + ci-thresh hr disable + ci-thresh hr lower 16 upper 21 + ci-thresh-comp hr lower 5 7 upper 15 18 + ci-thresh amr-fr disable + ci-thresh amr-fr lower 7 upper 11 + ci-thresh-comp amr-fr lower 5 7 upper 15 18 + ci-thresh amr-hr disable + ci-thresh amr-hr lower 13 upper 17 + ci-thresh-comp amr-hr lower 5 7 upper 15 18 + ci-thresh sdcch disable + ci-thresh sdcch lower 12 upper 16 + ci-thresh-comp sdcch lower 5 7 upper 15 18 + ci-thresh gprs disable + ci-thresh gprs lower 18 upper 24 + ci-thresh-comp gprs lower 5 7 upper 15 18 ... -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/25611 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: Id1224c2d9a52db2ed805c49e048d3086ed0167f5 Gerrit-Change-Number: 25611 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210927/480e2cac/attachment.htm>