aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-01-29 20:57:17 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-02-05 22:32:53 +0100
commitb631bd21d21b10f8e0344dc47af34ef09306d0fb (patch)
treec9f73e170e640be1700d6e35ac0f1fcec0edd0cd
parent579651bf300de002731dfd3bd39985c9fd15616c (diff)
power: Make it possible to force a power level
Use the standard RSL commands to order a logical channel to use a fixed power level. The code is not fully verified and there was a last minute change to invoke bts_model_adjst_ms_pwr.
-rw-r--r--src/common/rsl.c23
-rw-r--r--tests/stubs.c4
2 files changed, 27 insertions, 0 deletions
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 80940a4e..0c9acf54 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -1116,6 +1116,26 @@ static int rsl_rx_mode_modif(struct msgb *msg)
return rc;
}
+/* 8.4.15 MS POWER CONTROL */
+static int rsl_rx_ms_pwr_ctrl(struct msgb *msg)
+{
+ struct gsm_lchan *lchan = msg->lchan;
+ struct tlv_parsed tp;
+
+ rsl_tlv_parse(&tp, msgb_l3(msg), msgb_l3len(msg));
+ if (TLVP_PRESENT(&tp, RSL_IE_MS_POWER)) {
+ uint8_t pwr = *TLVP_VAL(&tp, RSL_IE_MS_POWER) & 0x1F;
+ lchan->ms_power_ctrl.fixed = 1;
+ lchan->ms_power_ctrl.current = pwr;
+
+ LOGP(DRSL, LOGL_NOTICE, "%s forcing power to %d\n",
+ gsm_lchan_name(lchan), lchan->ms_power_ctrl.current);
+ bts_model_adjst_ms_pwr(lchan);
+ }
+
+ return 0;
+}
+
/* 8.4.20 SACCH INFO MODify */
static int rsl_rx_sacch_inf_mod(struct msgb *msg)
{
@@ -1780,6 +1800,9 @@ static int rsl_rx_dchan(struct gsm_bts_trx *trx, struct msgb *msg)
case RSL_MT_MODE_MODIFY_REQ:
ret = rsl_rx_mode_modif(msg);
break;
+ case RSL_MT_MS_POWER_CONTROL:
+ ret = rsl_rx_ms_pwr_ctrl(msg);
+ break;
case RSL_MT_PHY_CONTEXT_REQ:
case RSL_MT_PREPROC_CONFIG:
case RSL_MT_RTD_REP:
diff --git a/tests/stubs.c b/tests/stubs.c
index f2540523..39604ab5 100644
--- a/tests/stubs.c
+++ b/tests/stubs.c
@@ -53,3 +53,7 @@ int bts_model_oml_estab(struct gsm_bts *bts)
int l1if_set_txpower(struct femtol1_hdl *fl1h, float tx_power)
{ return 0; }
+
+
+int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)
+{ return 0; }