From bc814501e8a28f72e16a4662250af01aaa2a1489 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 19 Dec 2009 21:41:52 +0100 Subject: [handover] add VTY parameter to enable/disable handover --- openbsc/include/openbsc/gsm_data.h | 3 +++ openbsc/src/handover_decision.c | 18 +++++++++++------- openbsc/src/vty_interface.c | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 67465e460..f4e4d2172 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -452,6 +452,9 @@ struct gsm_network { int a5_encryption; int neci; int send_mm_info; + struct { + int active; + } handover; /* layer 4 */ int (*mncc_recv) (struct gsm_network *net, int msg_type, void *arg); diff --git a/openbsc/src/handover_decision.c b/openbsc/src/handover_decision.c index 3605a8e0a..4c08c6664 100644 --- a/openbsc/src/handover_decision.c +++ b/openbsc/src/handover_decision.c @@ -88,15 +88,19 @@ static int process_meas_rep(struct gsm_meas_rep *mr) } } - if (mr_cell) { - LOGP(DHO, LOGL_INFO, "Cell on ARFCN %u is better, starting " - "handover\n", mr_cell->arfcn); - return handover_to_arfcn_bsic(mr->lchan, mr_cell->arfcn, - mr_cell->bsic); + if (!mr_cell) { + DEBUGPC(DHO, "No better cell\n"); + return 0; } - DEBUGPC(DHO, "No better cell\n"); - return 0; + LOGP(DHO, LOGL_INFO, "Cell on ARFCN %u is better: ", mr_cell->arfcn); + if (!mr->lchan->ts->trx->bts->network->handover.active) { + LOGPC(DHO, LOGL_INFO, "Skipping, Handover disabled\n"); + return 0; + } + + LOGPC(DHO, LOGL_INFO, "Starting handover\n"); + return handover_to_arfcn_bsic(mr->lchan, mr_cell->arfcn, mr_cell->bsic); } static int ho_dec_sig_cb(unsigned int subsys, unsigned int signal, diff --git a/openbsc/src/vty_interface.c b/openbsc/src/vty_interface.c index d5344edac..20df9091d 100644 --- a/openbsc/src/vty_interface.c +++ b/openbsc/src/vty_interface.c @@ -95,6 +95,8 @@ static void net_dump_vty(struct vty *vty, struct gsm_network *net) VTY_NEWLINE); vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off", VTY_NEWLINE); + vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off", + VTY_NEWLINE); } DEFUN(show_net, show_net_cmd, "show network", @@ -296,6 +298,7 @@ static int config_write_net(struct vty *vty) vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode), VTY_NEWLINE); vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE); + vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE); vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE); vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE); vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE); @@ -863,6 +866,16 @@ DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd, return CMD_SUCCESS; } +DEFUN(cfg_net_handover, cfg_net_handover_cmd, + "handover (0|1)", + "Whether or not to use in-call handover") +{ + gsmnet->handover.active = atoi(argv[0]); + + return CMD_SUCCESS; +} + + #define DECLARE_TIMER(number) \ DEFUN(cfg_net_T##number, \ cfg_net_T##number##_cmd, \ @@ -1371,6 +1384,7 @@ int bsc_vty_init(struct gsm_network *net) install_element(GSMNET_NODE, &cfg_net_neci_cmd); install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd); install_element(GSMNET_NODE, &cfg_net_mm_info_cmd); + install_element(GSMNET_NODE, &cfg_net_handover_cmd); install_element(GSMNET_NODE, &cfg_net_T3101_cmd); install_element(GSMNET_NODE, &cfg_net_T3103_cmd); install_element(GSMNET_NODE, &cfg_net_T3105_cmd); -- cgit v1.2.3