diff options
authorStefan Sperling <ssperling@sysmocom.de>2018-04-11 20:46:38 +0200
committerStefan Sperling <ssperling@sysmocom.de>2018-04-12 09:38:59 +0200
commitb06c7a253752ecb67fd20cdf0b069688b561af0e (patch)
parent0ad90b39b9e638b5e3d926c9261d26e777ca478c (diff)
trigger acc ramping on state-changed-event reports
Trigger ACC ramping not only when an Administrative State Change ACK is received from a BTS, but also when an administrative state change is reported for TRX 0 in a State Changed Event Report. This should allow ACC ramping to work with any BTS which reports an administrative state change to 'unlock' using either of these OML messages. Tested with a sysmobts and a nanobts. The sysmobts only reports TRX locked/unlock changes in Administrative State Change ACKs, not via State Changed Event Reports. The nanobts is known to send both of these OML messages in quick succession, so do not re-trigger ramping if it's already in progress. Change-Id: I097a113a3a63de02bcb8277020beb59cf485b176 Related: OS#2591
1 files changed, 10 insertions, 2 deletions
diff --git a/src/libbsc/acc_ramp.c b/src/libbsc/acc_ramp.c
index 6d9be594d..16bce3f4b 100644
--- a/src/libbsc/acc_ramp.c
+++ b/src/libbsc/acc_ramp.c
@@ -144,7 +144,8 @@ static int acc_ramp_nm_sig_cb(unsigned int subsys, unsigned int signal, void *ha
struct acc_ramp *acc_ramp = handler_data;
struct gsm_bts_trx *trx = NULL;
- if (signal != S_NM_STATECHG_ADM)
+ /* Handled signals map to an Administrative State Change ACK, or a State Changed Event Report. */
+ if (signal != S_NM_STATECHG_ADM && signal != S_NM_STATECHG_OPER)
return 0;
if (nsd->obj_class != NM_OC_RADIO_CARRIER)
@@ -163,7 +164,14 @@ static int acc_ramp_nm_sig_cb(unsigned int subsys, unsigned int signal, void *ha
/* Trigger or abort ACC ramping based on the new 'RF lock' state of this TRX. */
switch (nsd->new_state->administrative) {
- acc_ramp_trigger(acc_ramp);
+ /*
+ * Do not re-trigger ACC ramping if ramping is already in progress.
+ * A BTS might send several "unlock" change events: One in the Administrative
+ * State Change ACK, and/or another in a State Changed Event Report.
+ * For instance, the nanobts is known to send both.
+ */
+ if (!osmo_timer_pending(&acc_ramp->step_timer))
+ acc_ramp_trigger(acc_ramp);