HO: add new_lchan_type arg to bsc_handover_start()
Upcoming handover_decision_2 will want to be able to handover to a differing TCH type, hence add a parameter to bsc_handover_start(); adjust current callers to pass the old lchan type. Tweak the 'bts' argument to 'new_bts'. Change-Id: I4478ebcaada00897cc38c5a299e07661139ed3c5
This commit is contained in:
parent
ef497b86ba
commit
6dff51d583
|
@ -4,7 +4,8 @@ struct gsm_lchan;
|
||||||
struct gsm_bts;
|
struct gsm_bts;
|
||||||
struct gsm_subscriber_connection;
|
struct gsm_subscriber_connection;
|
||||||
|
|
||||||
int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts);
|
int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *new_bts,
|
||||||
|
enum gsm_chan_t new_lchan_type);
|
||||||
void bsc_clear_handover(struct gsm_subscriber_connection *conn, int free_lchan);
|
void bsc_clear_handover(struct gsm_subscriber_connection *conn, int free_lchan);
|
||||||
struct gsm_lchan *bsc_handover_pending(struct gsm_lchan *new_lchan);
|
struct gsm_lchan *bsc_handover_pending(struct gsm_lchan *new_lchan);
|
||||||
|
|
||||||
|
|
|
@ -1399,7 +1399,7 @@ static int trigger_ho_or_as(struct vty *vty, struct gsm_lchan *from_lchan, struc
|
||||||
} else
|
} else
|
||||||
LOGP(DHO, LOGL_NOTICE, "%s (ARFCN %u) --> BTS %u Manually triggering Handover from VTY\n",
|
LOGP(DHO, LOGL_NOTICE, "%s (ARFCN %u) --> BTS %u Manually triggering Handover from VTY\n",
|
||||||
gsm_lchan_name(from_lchan), from_lchan->ts->trx->arfcn, to_bts->nr);
|
gsm_lchan_name(from_lchan), from_lchan->ts->trx->arfcn, to_bts->nr);
|
||||||
rc = bsc_handover_start(from_lchan, to_bts);
|
rc = bsc_handover_start(from_lchan, to_bts, from_lchan->type);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
vty_out(vty, "bsc_handover_start() returned %d=%s%s", rc,
|
vty_out(vty, "bsc_handover_start() returned %d=%s%s", rc,
|
||||||
strerror(-rc), VTY_NEWLINE);
|
strerror(-rc), VTY_NEWLINE);
|
||||||
|
|
|
@ -70,7 +70,7 @@ static int handover_to_arfcn_bsic(struct gsm_lchan *lchan,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* and actually try to handover to that cell */
|
/* and actually try to handover to that cell */
|
||||||
return bsc_handover_start(lchan, new_bts);
|
return bsc_handover_start(lchan, new_bts, lchan->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* did we get a RXLEV for a given cell in the given report? */
|
/* did we get a RXLEV for a given cell in the given report? */
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <osmocom/core/talloc.h>
|
#include <osmocom/core/talloc.h>
|
||||||
#include <osmocom/bsc/bsc_subscriber.h>
|
#include <osmocom/bsc/bsc_subscriber.h>
|
||||||
#include <osmocom/bsc/gsm_04_08_utils.h>
|
#include <osmocom/bsc/gsm_04_08_utils.h>
|
||||||
|
#include <osmocom/bsc/handover.h>
|
||||||
|
|
||||||
struct bsc_handover {
|
struct bsc_handover {
|
||||||
struct llist_head list;
|
struct llist_head list;
|
||||||
|
@ -86,10 +87,11 @@ static struct bsc_handover *bsc_ho_by_old_lchan(struct gsm_lchan *old_lchan)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Hand over the specified logical channel to the specified new BTS.
|
/*! Hand over the specified logical channel to the specified new BTS and possibly change the lchan type.
|
||||||
* This is the main entry point for the actual handover algorithm, after the
|
* This is the main entry point for the actual handover algorithm, after the decision whether to initiate
|
||||||
* decision whether to initiate HO to a specific BTS. */
|
* HO to a specific BTS. To not change the lchan type, pass old_lchan->type. */
|
||||||
int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts)
|
int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *new_bts,
|
||||||
|
enum gsm_chan_t new_lchan_type)
|
||||||
{
|
{
|
||||||
struct gsm_lchan *new_lchan;
|
struct gsm_lchan *new_lchan;
|
||||||
struct bsc_handover *ho;
|
struct bsc_handover *ho;
|
||||||
|
@ -103,19 +105,19 @@ int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts)
|
||||||
|
|
||||||
DEBUGP(DHO, "Beginning with handover operation"
|
DEBUGP(DHO, "Beginning with handover operation"
|
||||||
"(old_lchan on BTS %u, new BTS %u) ...\n",
|
"(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);
|
||||||
|
|
||||||
rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_ATTEMPTED]);
|
rate_ctr_inc(&new_bts->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_ATTEMPTED]);
|
||||||
|
|
||||||
if (!old_lchan->conn) {
|
if (!old_lchan->conn) {
|
||||||
LOGP(DHO, LOGL_ERROR, "Old lchan lacks connection data.\n");
|
LOGP(DHO, LOGL_ERROR, "Old lchan lacks connection data.\n");
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_lchan = lchan_alloc(bts, old_lchan->type, 0);
|
new_lchan = lchan_alloc(new_bts, new_lchan_type, 0);
|
||||||
if (!new_lchan) {
|
if (!new_lchan) {
|
||||||
LOGP(DHO, LOGL_NOTICE, "No free channel\n");
|
LOGP(DHO, LOGL_NOTICE, "No free channel for %s\n", gsm_lchant_name(new_lchan_type));
|
||||||
rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_NO_CHANNEL]);
|
rate_ctr_inc(&new_bts->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_NO_CHANNEL]);
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +130,7 @@ int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts)
|
||||||
ho->old_lchan = old_lchan;
|
ho->old_lchan = old_lchan;
|
||||||
ho->new_lchan = new_lchan;
|
ho->new_lchan = new_lchan;
|
||||||
ho->ho_ref = ho_ref++;
|
ho->ho_ref = ho_ref++;
|
||||||
if (old_lchan->ts->trx->bts != bts) {
|
if (old_lchan->ts->trx->bts != new_bts) {
|
||||||
ho->inter_cell = true;
|
ho->inter_cell = true;
|
||||||
ho->async = true;
|
ho->async = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue