Change in osmo-bsc[master]: Implement ip.access coding of MS/BS Power Control Parameters

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.org
Sat Dec 12 02:52:49 UTC 2020


fixeria 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 = &params->rxlev_meas;
+		break;
+	case POWER_MEAS_PARAM_RXQUAL:
+		mp = &params->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>


More information about the gerrit-log mailing list