From 1cba3fce705c2d103952811599ed1bf9781c9e09 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 11 Oct 2013 13:01:38 +0200 Subject: dyn PDCH: Add new_lchan argument to bsc_handover_start() This is useful if the caller already allocated a new lchan, which will be used to dynamically re-assign lchans. The old behavior is maintained by passing NULL. Change-Id: I2b7151f32f0c04c22f294eb5dd3c7d7dfddf35e7 --- openbsc/src/libbsc/handover_decision.c | 2 +- openbsc/src/libbsc/handover_logic.c | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'openbsc/src/libbsc') diff --git a/openbsc/src/libbsc/handover_decision.c b/openbsc/src/libbsc/handover_decision.c index 0f07bcac6..8b9217749 100644 --- a/openbsc/src/libbsc/handover_decision.c +++ b/openbsc/src/libbsc/handover_decision.c @@ -48,7 +48,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); + return bsc_handover_start(lchan, NULL, new_bts); } /* did we get a RXLEV for a given cell in the given report? */ diff --git a/openbsc/src/libbsc/handover_logic.c b/openbsc/src/libbsc/handover_logic.c index 56b623a69..de8052679 100644 --- a/openbsc/src/libbsc/handover_logic.c +++ b/openbsc/src/libbsc/handover_logic.c @@ -87,10 +87,13 @@ static struct bsc_handover *bsc_ho_by_old_lchan(struct gsm_lchan *old_lchan) /*! \brief Hand over the specified logical channel to the specified new BTS. * This is the main entry point for the actual handover algorithm, after the - * decision whether to initiate HO to a specific BTS. */ -int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts) + * decision whether to initiate HO to a specific BTS. + * + * If new_lchan is NULL, allocate a new lchan. If not NULL, new_lchan must be a + * newly allocated lchan passed in by the caller. */ +int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan, + struct gsm_bts *new_bts) { - struct gsm_lchan *new_lchan; struct bsc_handover *ho; static uint8_t ho_ref; int rc; @@ -101,19 +104,20 @@ int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts) return -EBUSY; DEBUGP(DHO, "(old_lchan on BTS %u, new BTS %u)\n", - old_lchan->ts->trx->bts->nr, bts->nr); + old_lchan->ts->trx->bts->nr, new_bts->nr); - osmo_counter_inc(bts->network->stats.handover.attempted); + osmo_counter_inc(new_bts->network->stats.handover.attempted); if (!old_lchan->conn) { LOGP(DHO, LOGL_ERROR, "Old lchan lacks connection data.\n"); return -ENOSPC; } - new_lchan = lchan_alloc(bts, old_lchan->type, 0); + if (!new_lchan) + new_lchan = lchan_alloc(new_bts, old_lchan->type, 0); if (!new_lchan) { LOGP(DHO, LOGL_NOTICE, "No free channel\n"); - osmo_counter_inc(bts->network->stats.handover.no_channel); + osmo_counter_inc(new_bts->network->stats.handover.no_channel); return -ENOSPC; } -- cgit v1.2.3