Change in osmo-ttcn3-hacks[master]: BTS_Tests: add test cases for dynamic BS power control

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
Thu Dec 3 12:12:40 UTC 2020


fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21491 )


Change subject: BTS_Tests: add test cases for dynamic BS power control
......................................................................

BTS_Tests: add test cases for dynamic BS power control

Change-Id: Ia4c188aa923b10833162bdeb21238444193df65c
Related: SYS#4918
---
M bts/BTS_Tests.ttcn
1 file changed, 168 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/91/21491/1

diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 94bb0d6..d303257 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -103,6 +103,8 @@
 	integer mp_timing_offset_256syms_exp := 512;
 	integer mp_uplink_power_target := -75;
 	integer mp_uplink_power_hysteresis := 8; /* -83 .. -67 */
+	integer mp_downlink_power_target := -80;
+	integer mp_downlink_power_hysteresis := 5; /* -85 .. -75 */
 	/* Time to wait for RSL conn from BTS during startup of test */
 	float mp_ipa_up_timeout := 15.0;
 	float mp_ipa_up_delay := 0.0;
@@ -1881,7 +1883,7 @@
 		/* According to 3GPP TS 44.018, section 10.5.2.20, we should pad with zeroes */
 		var octetstring l2 := f_pad_oct(enc_LapdmFrameAB(valueof(lb)), 21, '00'O);
 
-		log("Sending Measurement Report: ", l1h, l2);
+		log("Sending Measurement Report: ", l1h, lb);
 		L1CTL.send(ts_L1CTL_DATA_REQ_SACCH(g_chan_nr, ts_RslLinkID_SACCH(0), l1h, l2));
 		if (do_loop)
 			{ repeat; }
@@ -7155,6 +7157,171 @@
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }
 
+private type record of DlPwrStep DlPwrTest;
+private type record DlPwrStep {
+	/* Expected power reduction level */
+	integer txred_exp,
+	/* Indicated measurement values */
+	record {
+		boolean valid,
+		MeasElem full,
+		MeasElem sub
+	} meas
+};
+
+private template (present) DlPwrStep.meas
+tp_DlPwrMeasFS(integer rxlev_full,
+	       integer rxlev_sub,
+	       uint3_t rxqual_full := 0,
+	       uint3_t rxqual_sub := 0,
+	       boolean valid := true) := {
+	valid := valid,
+	full := { rxlev_full, rxqual_full },
+	sub := { rxlev_sub, rxqual_sub }
+}
+
+/* Shortcut for FULL == SUB */
+private template (present) DlPwrStep.meas
+tp_DlPwrMeas(integer rxlev,
+	     uint3_t rxqual := 0,
+	     boolean valid := true) :=
+	tp_DlPwrMeasFS(rxlev, rxlev, rxqual, rxqual, valid);
+
+private function f_TC_bs_pwr_ctrl_common(template (present) DlPwrTest tests)
+runs on ConnHdlr {
+	var integer num_steps := lengthof(tests);
+	timer T := 2.0 + 0.5 * int2float(num_steps);
+	var integer rxlev_sum := 0;
+	var integer rxlev_num := 0;
+	var L1ctlDlMessage l1_dl;
+	var integer step := -1;
+
+	f_l1_tune(L1CTL);
+	RSL.clear;
+
+	/* These IEs are needed for autonomous BS power control */
+	var template (value) RSL_IE_List ies := {
+		t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{
+			/* NOTE: this is actually power reduction (2 dB steps) */
+			bs_power := ts_RSL_IE_BS_Power(10) /* up to 20 dB */
+		}),
+		t_RSL_IE(RSL_IE_BS_POWER_PARAM, RSL_IE_Body:{
+			/* vendor-specific stuff */
+			bs_power_params := ts_RSL_LV(''O)
+		})
+	};
+
+	/* These values will be indicated in the first SACCH block */
+	g_pars.l1_pars.meas_ul.full := valueof(tests[0].meas.full);
+	g_pars.l1_pars.meas_ul.sub := valueof(tests[0].meas.sub);
+	g_pars.l1_pars.meas_valid := valueof(tests[0].meas.valid);
+
+	/* Establish a dedicated channel */
+	f_est_dchan(more_ies := valueof(ies));
+
+	T.start;
+	alt {
+	/* Align to the first DL SACCH block, this is where we start collecting samples */
+	[step == -1] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) {
+		log("Step #", step, ": aligned to the first DL SACCH block");
+		step := step + 1;
+		}
+	/* This altstep collects RxLev samples from all received DCCH/FACCH blocks */
+	[step >= 0] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_DCCH(?))) -> value l1_dl {
+		log("Step #", step, ": new RxLev sample ", l1_dl.dl_info.rx_level);
+		rxlev_sum := rxlev_sum + l1_dl.dl_info.rx_level;
+		rxlev_num := rxlev_num + 1;
+		repeat;
+		}
+	/* This altstep sends Measurement Reports with tests[step].meas */
+	[step >= 0] as_l1_sacch(do_loop := false) {
+		log("Step #", step, ": indicated ", tests[step].meas);
+
+		var integer rxlev_avg := rxlev_sum / rxlev_num;
+		var integer txred := mp_rxlev_exp - rxlev_avg;
+
+		log("Step #", step, ": checking rxlev_avg := ", rxlev_avg, " ",
+		    "(txred := ", txred, " vs expected ", tests[step].txred_exp, ")");
+
+		if (not match(txred, tests[step].txred_exp)) {
+			setverdict(fail, "DL attenuation ", txred, " dB does not ",
+				   "match ", tests[step].txred_exp, " at step #", step);
+		}
+
+		step := step + 1;
+
+		if (step < num_steps) {
+			/* These values will be indicated in the next UL SACCH block */
+			g_pars.l1_pars.meas_ul.full := valueof(tests[step].meas.full);
+			g_pars.l1_pars.meas_ul.sub := valueof(tests[step].meas.sub);
+			g_pars.l1_pars.meas_valid := valueof(tests[step].meas.valid);
+
+			rxlev_sum := 0;
+			rxlev_num := 0;
+			repeat;
+			}
+		}
+	/* At this step, tests[0].meas is received by the IUT */
+	[false] L1CTL.receive(tr_L1CTL_MsgType(L1CTL_DATA_CONF)) {
+		var integer rxlev_avg := rxlev_sum / rxlev_num;
+		var integer txred := mp_rxlev_exp - rxlev_avg;
+
+		log("Step #", step, ": checking rxlev_avg := ", rxlev_avg, " ",
+		    "(txred := ", txred, " vs expected ", tests[step].txred_exp, ")");
+
+		if (not match(txred, tests[step].txred_exp)) {
+			setverdict(fail, "DL attenuation ", txred, " dB does not ",
+				   "match ", tests[step].txred_exp, " at step #", step);
+		}
+
+		rxlev_sum := 0;
+		rxlev_num := 0;
+		}
+	[] L1CTL.receive { repeat; }
+	[] T.timeout {
+		setverdict(fail, "Timeout at step #", step, " ", tests[step]);
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+		}
+	}
+
+	setverdict(pass);
+}
+
+private function f_TC_bs_pwr_ctrl(charstring id)
+runs on ConnHdlr {
+	f_TC_bs_pwr_ctrl_common(DlPwrTest:{
+		{ txred_exp := ?, meas := tp_DlPwrMeas(mp_rxlev_exp) },
+		{ txred_exp := 0, meas := tp_DlPwrMeas(mp_rxlev_exp) },
+		{ txred_exp := 0, meas := tp_DlPwrMeas(mp_rxlev_exp) },
+		{ txred_exp := 0, meas := tp_DlPwrMeas(mp_rxlev_exp) },
+		{ txred_exp := 0, meas := tp_DlPwrMeas(mp_rxlev_exp) }
+	});
+}
+testcase TC_bs_pwr_ctrl() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init(trx_nr := 1);
+
+	/* Explicitly disable DL Power filtering for this set of tests */
+	f_vty_config(BTSVTY, "bts 0", "no downlink-power-filtering");
+	/* Explicitly configure the Downlink power range (target and hysteresis) */
+	f_vty_config(BTSVTY, "bts 0", "downlink-power-target " & int2str(mp_downlink_power_target)
+					      & " hysteresis " & int2str(mp_downlink_power_hysteresis));
+
+	/* Wait until Pau ramping is completed */
+	f_sleep(4.0);
+
+	/* Pick any timeslot/subslot on TRX1 (TODO: use g_AllChanTypes) */
+	pars := valueof(t_Pars(g_AllChannels[0], ts_RSL_ChanMode_SIGN, 1));
+
+	vc_conn := f_start_handler(refers(f_TC_bs_pwr_ctrl), pars);
+	vc_conn.done;
+
+	/* No need to reset Uplink power parameters - the IUT restarts anyway */
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
 private function f_TC_speech_no_rtp(charstring id) runs on ConnHdlr {
 	var template L1ctlDlMessage tr_bad_frame;
 	var L1ctlDlMessage l1_dl;

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21491
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ia4c188aa923b10833162bdeb21238444193df65c
Gerrit-Change-Number: 21491
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/20201203/5fda9917/attachment.htm>


More information about the gerrit-log mailing list