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/.
fixeria gerrit-no-reply at lists.osmocom.orgfixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/21683 ) Change subject: Implement ip.access coding of MS/BS Power Control Parameters ...................................................................... Implement ip.access coding of MS/BS Power Control Parameters Change-Id: I3798a6a02132bafe8f1fef6e93bbb42036d76ac9 Related: SYS#4918 --- M include/osmocom/bsc/bts.h M include/osmocom/bsc/bts_trx.h M src/osmo-bsc/abis_rsl.c M src/osmo-bsc/bts_ipaccess_nanobts.c M src/osmo-bsc/bts_trx.c 5 files changed, 302 insertions(+), 6 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/83/21683/1 diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index 2b05418..ff246f6 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -188,6 +188,10 @@ void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx); void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts); + /* MS/BS Power Control paramaters encoding functions (optional) */ + void (*enc_ms_power_params)(struct msgb *msg, const struct gsm_bts_trx *trx); + void (*enc_bs_power_params)(struct msgb *msg, const struct gsm_bts_trx *trx); + /* Should SI2bis and SI2ter be disabled by default on this BTS model? */ bool force_combined_si; diff --git a/include/osmocom/bsc/bts_trx.h b/include/osmocom/bsc/bts_trx.h index 5888c63..eff3fdd 100644 --- a/include/osmocom/bsc/bts_trx.h +++ b/include/osmocom/bsc/bts_trx.h @@ -22,6 +22,74 @@ struct gsm_abis_mo mo; }; +/* MS/BS Power related measurement averaging algo */ +enum trx_power_ctrl_meas_avg_algo { + TRX_PWR_CTRL_MEAS_AVG_ALGO_NONE = 0x00, + TRX_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED = 0x01, + TRX_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED = 0x02, + TRX_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN = 0x03, + /* EWMA is an Osmocom specific algo */ + TRX_PWR_CTRL_MEAS_AVG_ALGO_EWMA = 0x04, +}; + +/* MS/BS Power related measurement parameters */ +struct trx_power_ctrl_meas_params { + /* 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 */ + + /* Threshold Comparators for lower (decreasing) direction */ + uint8_t lower_cmp_p; /* P1 for RxLev, P3 for RxQual */ + uint8_t lower_cmp_n; /* N1 for RxLev, N3 for RxQual */ + /* Threshold Comparators for upper (increasing) direction */ + uint8_t upper_cmp_p; /* P2 for RxLev, P4 for RxQual */ + uint8_t upper_cmp_n; /* N2 for RxLev, N4 for RxQual */ + + /* Hreqave and Hreqt (see 3GPP TS 45.008, Annex A) */ + uint8_t h_reqave; + uint8_t h_reqt; + + /* AVG algorithm and its specific parameters */ + enum trx_power_ctrl_meas_avg_algo algo; + union { + /* Exponentially Weighted Moving Average */ + struct { + /* Smoothing factor: higher the value - less smoothing */ + uint8_t alpha; /* 1 .. 99 (in %) */ + } ewma; + }; +}; + +enum trx_power_ctrl_dir { + TRX_PWR_CTRL_DIR_UL, /* MS Power Control */ + TRX_PWR_CTRL_DIR_DL, /* BS Power Control */ +}; + +enum trx_power_ctrl_mode { + /* Do not send MS/BS Power Control IEs */ + TRX_PWR_CTRL_MODE_NONE = 0, + /* Send MS/BS Power IE only (with target level) */ + TRX_PWR_CTRL_MODE_STATIC, + /* Send MS/BS Power [Parameters] IEs (dynamic mode) */ + TRX_PWR_CTRL_MODE_DYN_BTS, +}; + +/* MS/BS Power Control Parameters */ +struct trx_power_ctrl_params { + /* Power Control direction: Uplink or Downlink */ + enum trx_power_ctrl_dir dir; + /* Power Control mode to be used by the BTS */ + enum trx_power_ctrl_mode mode; + + /* Power change step size (dynamic mode only) */ + uint8_t inc_step_size_db; /* increasing direction */ + uint8_t red_step_size_db; /* reducing direction */ + + /* Measurement averaging parameters for RxLev & RxQual */ + struct trx_power_ctrl_meas_params rxqual_meas; + struct trx_power_ctrl_meas_params rxlev_meas; +}; + /* One TRX in a BTS */ struct gsm_bts_trx { /* list header in bts->trx_list */ @@ -51,6 +119,10 @@ int nominal_power; /* in dBm */ unsigned int max_power_red; /* in actual dB */ + /* MS/BS Power Control parameters */ + struct trx_power_ctrl_params ms_power_ctrl; + struct trx_power_ctrl_params bs_power_ctrl; + union { struct { struct { diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index f8ea5a5..0793bea 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -486,6 +486,39 @@ } } +static void enc_power_control_params(struct msgb *msg, + const struct gsm_bts_trx *trx, + enum trx_power_ctrl_dir dir) +{ + const struct gsm_bts_model *model = trx->bts->model; + uint8_t *ie_len; + + /* Since IE {MS,BS}_POWER_PARAM content is operator dependent, it's not + * known if non-osmocom BTS models will support an empty IE, so let's + * better skip sending it unless we know for sure what each expects. */ + switch (dir) { + case TRX_PWR_CTRL_DIR_UL: + if (trx->ms_power_ctrl.mode != TRX_PWR_CTRL_MODE_DYN_BTS) + return; + if (model->enc_ms_power_params == NULL) + return; + ie_len = msgb_tl_put(msg, RSL_IE_MS_POWER_PARAM); + model->enc_ms_power_params(msg, trx); + break; + case TRX_PWR_CTRL_DIR_DL: + if (trx->bs_power_ctrl.mode != TRX_PWR_CTRL_MODE_DYN_BTS) + return; + if (model->enc_bs_power_params == NULL) + return; + ie_len = msgb_tl_put(msg, RSL_IE_BS_POWER_PARAM); + model->enc_bs_power_params(msg, trx); + break; + } + + /* Update length part of the containing IE */ + *ie_len = msg->tail - (ie_len + 1); +} + /* Chapter 8.4.1 */ int rsl_tx_chan_activ(struct gsm_lchan *lchan, uint8_t act_type, uint8_t ho_ref) { @@ -573,12 +606,10 @@ msgb_tv_put(msg, RSL_IE_BS_POWER, lchan->bs_power); msgb_tv_put(msg, RSL_IE_MS_POWER, lchan->ms_power); msgb_tv_put(msg, RSL_IE_TIMING_ADVANCE, ta); - /* indicate MS power control to be performed by BTS: */ - if (bts->type == GSM_BTS_TYPE_OSMOBTS) - msgb_tl_put(msg, RSL_IE_MS_POWER_PARAM); - /* else: Since IE MS_POWER_PARAM content is operator dependent, it's not - known if non-osmocom BTS models will support an empty IE, so let's - better skip sending it unless we know for sure what each expects. */ + + /* BS/MS Power Control Parameters (if supported by BTS model) */ + enc_power_control_params(msg, trx, TRX_PWR_CTRL_DIR_DL); + enc_power_control_params(msg, trx, TRX_PWR_CTRL_DIR_UL); mr_config_for_bts(lchan, msg); rep_acch_cap_for_bts(lchan, msg); diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c index c84d750..179e9b5 100644 --- a/src/osmo-bsc/bts_ipaccess_nanobts.c +++ b/src/osmo-bsc/bts_ipaccess_nanobts.c @@ -52,6 +52,9 @@ static int bts_model_nanobts_start(struct gsm_network *net); static void bts_model_nanobts_e1line_bind_ops(struct e1inp_line *line); +static void enc_ms_power_params(struct msgb *msg, const struct gsm_bts_trx *trx); +static void enc_bs_power_params(struct msgb *msg, const struct gsm_bts_trx *trx); + static char *get_oml_status(const struct gsm_bts *bts) { if (bts->oml_link) @@ -67,6 +70,8 @@ .oml_rcvmsg = &abis_nm_rcvmsg, .oml_status = &get_oml_status, .e1line_bind_ops = bts_model_nanobts_e1line_bind_ops, + .enc_ms_power_params = &enc_ms_power_params, + .enc_bs_power_params = &enc_bs_power_params, /* Some nanoBTS firmwares (if not all) don't support SI2ter and cause * problems on some MS if it is enabled, see OS#3063. Disable it by * default, can still be enabled through VTY cmd with same name. @@ -801,3 +806,131 @@ { e1inp_line_bind_ops(line, &ipaccess_e1inp_line_ops); } + +/* ip.access specific Power Control IEs */ +enum ipaccess_power_ctrl_param_iei { + POWER_CTRL_MEAS_AVG_PARAMS_IEI = 0x04, + POWER_CTRL_BS_THRESH_IEI = 0x05, + POWER_CTRL_MS_THRESH_IEI = 0x06, + POWER_CTRL_THRESH_COMP_IEI = 0x0a, +}; + +enum ipaccess_power_meas_param_type { + POWER_MEAS_PARAM_RXLEV = 0x00, + POWER_MEAS_PARAM_RXQUAL = 0x01, + POWER_MEAS_PARAM_MS_BTS_DIST = 0x02, +}; + +static void enc_meas_avg_params(struct msgb *msg, + const struct trx_power_ctrl_params *params, + enum ipaccess_power_meas_param_type ptype) +{ + const struct trx_power_ctrl_meas_params *mp; + uint8_t *ie_len, u8; + + switch (ptype) { + case POWER_MEAS_PARAM_RXLEV: + mp = ¶ms->rxlev_meas; + break; + case POWER_MEAS_PARAM_RXQUAL: + mp = ¶ms->rxqual_meas; + break; + /* FIXME: MS/BTS Distance is not supported */ + case POWER_MEAS_PARAM_MS_BTS_DIST: + default: + OSMO_ASSERT(0); + } + + /* No averaging => no Measurement Averaging parameters */ + if (mp->algo == TRX_PWR_CTRL_MEAS_AVG_ALGO_NONE) + return; + + /* (TLV) Measurement Averaging parameters for RxLev/RxQual */ + ie_len = msgb_tl_put(msg, POWER_CTRL_MEAS_AVG_PARAMS_IEI); + + /* Parameter ID and H_REQAVE */ + u8 = ((ptype & 0x07) << 5) | (mp->h_reqave & 0x1f); + msgb_v_put(msg, u8); + + /* Algorithm ID and H_REQT */ + u8 = ((mp->algo - 1) << 5) | (mp->h_reqt & 0x1f); + msgb_v_put(msg, u8); + + /* Averaging parameters */ + switch (mp->algo) { + case TRX_PWR_CTRL_MEAS_AVG_ALGO_EWMA: + msgb_v_put(msg, mp->ewma.alpha); + break; + case TRX_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED: + case TRX_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN: + /* FIXME: unknown format */ + break; + case TRX_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED: + case TRX_PWR_CTRL_MEAS_AVG_ALGO_NONE: + /* No parameters here */ + break; + } + + /* Update length part of the containing IE */ + *ie_len = msg->tail - (ie_len + 1); +} + +static void enc_power_params(struct msgb *msg, const struct trx_power_ctrl_params *params) +{ + uint8_t u8; + + /* These parameters are valid for dynamic mode only */ + OSMO_ASSERT(params->mode == TRX_PWR_CTRL_MODE_DYN_BTS); + + /* (TV) Thresholds: {L,U}_RXLEV_XX_P and {L,U}_RXQUAL_XX_P */ + if (params->dir == TRX_PWR_CTRL_DIR_UL) + msgb_v_put(msg, POWER_CTRL_MS_THRESH_IEI); + else + msgb_v_put(msg, POWER_CTRL_BS_THRESH_IEI); + + /* {L,U}_RXLEV_XX_P (see 3GPP TS 45.008, A.3.2.1, a & b) */ + msgb_v_put(msg, params->rxlev_meas.lower_thresh & 0x3f); + msgb_v_put(msg, params->rxlev_meas.upper_thresh & 0x3f); + + /* {L,U}_RXQUAL_XX_P (see 3GPP TS 45.008, A.3.2.1, c & d) */ + u8 = ((params->rxqual_meas.lower_thresh & 0x07) << 4) + | ((params->rxqual_meas.upper_thresh & 0x07) << 0); + msgb_v_put(msg, u8); + + /* (TV) PC Threshold Comparators */ + msgb_v_put(msg, POWER_CTRL_THRESH_COMP_IEI); + + /* RxLev: P1, N1, P2, N2 (see 3GPP TS 45.008, A.3.2.1, a & b) */ + msgb_v_put(msg, params->rxlev_meas.lower_cmp_p & 0x1f); + msgb_v_put(msg, params->rxlev_meas.lower_cmp_n & 0x1f); + msgb_v_put(msg, params->rxlev_meas.upper_cmp_p & 0x1f); + msgb_v_put(msg, params->rxlev_meas.upper_cmp_n & 0x1f); + + /* RxQual: P3, N3, P4, N4 (see 3GPP TS 45.008, A.3.2.1, c & d) */ + msgb_v_put(msg, params->rxqual_meas.lower_cmp_p & 0x1f); + msgb_v_put(msg, params->rxqual_meas.lower_cmp_n & 0x1f); + msgb_v_put(msg, params->rxqual_meas.upper_cmp_p & 0x1f); + msgb_v_put(msg, params->rxqual_meas.upper_cmp_n & 0x1f); + + /* FIXME: TIMER_PWR_CON_INTERVAL (P_Con_INTERVAL) */ + msgb_v_put(msg, 0x00); /* 0 .. 30 seconds */ + + /* Change step limitations: POWER_{INC,RED}_STEP_SIZE */ + u8 = ((params->inc_step_size_db & 0x0f) << 4) + | ((params->red_step_size_db & 0x0f) << 0); + msgb_v_put(msg, u8); + + /* (TLV) Measurement Averaging Configure */ + enc_meas_avg_params(msg, params, POWER_MEAS_PARAM_RXLEV); + enc_meas_avg_params(msg, params, POWER_MEAS_PARAM_RXQUAL); +} + +static void enc_ms_power_params(struct msgb *msg, const struct gsm_bts_trx *trx) +{ + enc_power_params(msg, &trx->ms_power_ctrl); +} + +static void enc_bs_power_params(struct msgb *msg, const struct gsm_bts_trx *trx) +{ + enc_power_params(msg, &trx->bs_power_ctrl); +} diff --git a/src/osmo-bsc/bts_trx.c b/src/osmo-bsc/bts_trx.c index 0e52238..f1dd0fb 100644 --- a/src/osmo-bsc/bts_trx.c +++ b/src/osmo-bsc/bts_trx.c @@ -32,6 +32,54 @@ #include <osmocom/bsc/debug.h> #include <osmocom/bsc/nm_common_fsm.h> +/* Default MS/BS Power Control parameters (see 3GPP TS 45.008, table A.1) */ +static const struct trx_power_ctrl_params power_ctrl_params_def = { + /* Static Power Control is the safe default */ + .mode = TRX_PWR_CTRL_MODE_STATIC, + + /* Power increasing/reducing step size */ + .inc_step_size_db = 4, /* 2, 4, or 6 dB */ + .red_step_size_db = 2, /* 2 or 4 dB */ + + /* RxLev measurement parameters */ + .rxlev_meas = { + /* 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) */ + + /* Increase {UL,DL}_TXPWR if at least LOWER_CMP_P averages + * out of LOWER_CMP_N averages are lower than L_RXLEV_XX_P */ + .lower_cmp_p = 10, /* P1 as in 3GPP TS 45.008, A.3.2.1 (case a) */ + .lower_cmp_n = 12, /* N1 as in 3GPP TS 45.008, A.3.2.1 (case a) */ + /* Decrease {UL,DL}_TXPWR if at least UPPER_CMP_P averages + * out of UPPER_CMP_N averages are greater than L_RXLEV_XX_P */ + .upper_cmp_p = 19, /* P2 as in 3GPP TS 45.008, A.3.2.1 (case b) */ + .upper_cmp_n = 20, /* N2 as in 3GPP TS 45.008, A.3.2.1 (case b) */ + + /* No averaging (filtering) by default */ + .algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_NONE, + }, + + /* RxQual measurement parameters */ + .rxqual_meas = { + /* Thresholds for RxQual (see 3GPP TS 45.008, A.3.2.1) */ + .lower_thresh = 0, /* L_RXQUAL_XX_P (BER < 0.2%) */ + .upper_thresh = 3, /* U_RXQUAL_XX_P (0.8% <= BER < 1.6%) */ + + /* Increase {UL,DL}_TXPWR if at least LOWER_CMP_P averages + * out of LOWER_CMP_N averages are lower than L_RXLEV_XX_P */ + .lower_cmp_p = 5, /* P3 as in 3GPP TS 45.008, A.3.2.1 (case c) */ + .lower_cmp_n = 7, /* N3 as in 3GPP TS 45.008, A.3.2.1 (case c) */ + /* Decrease {UL,DL}_TXPWR if at least UPPER_CMP_P averages + * out of UPPER_CMP_N averages are greater than L_RXLEV_XX_P */ + .upper_cmp_p = 15, /* P4 as in 3GPP TS 45.008, A.3.2.1 (case d) */ + .upper_cmp_n = 18, /* N4 as in 3GPP TS 45.008, A.3.2.1 (case d) */ + + /* No averaging (filtering) by default */ + .algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_NONE, + }, +}; + static int gsm_bts_trx_talloc_destructor(struct gsm_bts_trx *trx) { unsigned int i; @@ -120,6 +168,14 @@ if (trx->nr != 0) trx->nominal_power = bts->c0->nominal_power; + /* MS Power Control parameters (defaults) */ + trx->ms_power_ctrl = power_ctrl_params_def; + trx->ms_power_ctrl.dir = TRX_PWR_CTRL_DIR_UL; + + /* BS Power Control parameters (defaults) */ + trx->bs_power_ctrl = power_ctrl_params_def; + trx->bs_power_ctrl.dir = TRX_PWR_CTRL_DIR_DL; + llist_add_tail(&trx->list, &bts->trx_list); return trx; -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/21683 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: I3798a6a02132bafe8f1fef6e93bbb42036d76ac9 Gerrit-Change-Number: 21683 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201212/55a4fac6/attachment.htm>