aboutsummaryrefslogtreecommitdiffstats
path: root/src/libbsc/handover_decision.c
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-02-15 14:10:12 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2018-02-19 17:11:47 +0100
commit45e46d2c88f0bc9c72d89a9e03c78add4b318d0f (patch)
tree573bbd2a9494e0c5c0466f9b068cb35af8108254 /src/libbsc/handover_decision.c
parent047ac0dc009f685fbef17c31f8ffbe9dec721a25 (diff)
HO: introduce ho decision callbacks
Instead of reacting on S_LCHAN* signals in the handover decision code, introduce callbacks for the handover decision to be invoked by handover_logic.c at the appropriate time. The rationale is explained in a comment to struct handover_decision_callbacks, quoting: " All events that are interesting for handover decision are actually communicated by S_LCHAN_* signals, so theoretically, each handover algorithm could evaluate those. However, handover_logic.c cleans up handover operation state upon receiving some of these signals. To allow a handover decision algorithm to take advantage of e.g. the struct bsc_handover before it is discarded, the handover decision event handler needs to be invoked before handover_logic.c discards the state. For example, if the handover decision wants to place a penalty timer upon a handover failure, it still needs to know which target cell the handover failed for; handover_logic.c erases that knowledge on handover failure, since it needs to clean up the lchan's handover state. The most explicit and safest way to ensure the correct order of event handling is to invoke the handover decision algorithm's actions from handover_logic.c itself, before cleaning up. This struct provides the callback functions for this purpose. For consistency, also handle signals in this way that aren't actually in danger of interference from handover_logic.c (which also saves repeated lookup of handover state for lchans). Thus, handover decision algorithms should not register any signal handler at all. " Also: - Publish struct bsc_handover to use it as argument to above callbacks. - Add enum hodec_id to struct bsc_handover, to be able to signal the appropriate hodec algorithm per event. - Add hodec_id argument to bsc_handover_start*() to be placed in the bsc_handover struct. - Publish the LOGPHO logging macros in handover.h along with struct bsc_handover, convenient for logging in callback implementations. Replace handover_decision.c's signal handler with a registered handover_decision_callbacks instance. (Upcoming handover_decision_2 will use all of the callbacks introduced here.) Change-Id: Id5b64504007fe03e0406a4b395cd0359232b77d2
Diffstat (limited to 'src/libbsc/handover_decision.c')
-rw-r--r--src/libbsc/handover_decision.c27
1 files changed, 7 insertions, 20 deletions
diff --git a/src/libbsc/handover_decision.c b/src/libbsc/handover_decision.c
index e677b1fc2..887c2993f 100644
--- a/src/libbsc/handover_decision.c
+++ b/src/libbsc/handover_decision.c
@@ -70,7 +70,7 @@ static int handover_to_arfcn_bsic(struct gsm_lchan *lchan,
}
/* and actually try to handover to that cell */
- return bsc_handover_start(lchan, new_bts, lchan->type);
+ return bsc_handover_start(HODEC1, lchan, new_bts, lchan->type);
}
/* did we get a RXLEV for a given cell in the given report? */
@@ -257,7 +257,7 @@ static int attempt_handover(struct gsm_meas_rep *mr)
/* process an already parsed measurement report and decide if we want to
* attempt a handover */
-static void process_meas_rep(struct gsm_meas_rep *mr)
+static void on_measurement_report(struct gsm_meas_rep *mr)
{
struct gsm_bts *bts = mr->lchan->ts->trx->bts;
enum meas_rep_field dlev, dqual;
@@ -332,25 +332,12 @@ static void process_meas_rep(struct gsm_meas_rep *mr)
attempt_handover(mr);
}
-static int ho_dec_sig_cb(unsigned int subsys, unsigned int signal,
- void *handler_data, void *signal_data)
-{
- struct lchan_signal_data *lchan_data;
-
- if (subsys != SS_LCHAN)
- return 0;
-
- lchan_data = signal_data;
- switch (signal) {
- case S_LCHAN_MEAS_REP:
- process_meas_rep(lchan_data->mr);
- break;
- }
-
- return 0;
-}
+struct handover_decision_callbacks hodec1_callbacks = {
+ .hodec_id = HODEC1,
+ .on_measurement_report = on_measurement_report,
+};
void handover_decision_1_init(void)
{
- osmo_signal_register_handler(SS_LCHAN, ho_dec_sig_cb, NULL);
+ handover_decision_callbacks_register(&hodec1_callbacks);
}