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>