HO: vty: rename ho decision 1 vty to 'handover1' with 'handover' alias

Handover decision 2 arguments are now configured by 'handover2 foo'. To match
that scheme, rename the previously 'handover foo' args for handover decision 1
to 'handover1 foo'.

For backwards compatibility, still provide aliases of the original VTY
commands. Writing back the config will result in 'handover1' though.

Change-Id: I7305ae7c04cc70082cd80d42b2ba32ffa399f51a
This commit is contained in:
Neels Hofmeyr 2018-02-15 03:59:17 +01:00
parent 909e972787
commit 444f9e2bb0
6 changed files with 127 additions and 93 deletions

View File

@ -11,12 +11,12 @@ network
paging any use tch 0
handover 0
handover algorithm 1
handover window rxlev averaging 10
handover window rxqual averaging 1
handover window rxlev neighbor averaging 10
handover power budget interval 6
handover power budget hysteresis 3
handover maximum distance 9999
handover1 window rxlev averaging 10
handover1 window rxqual averaging 1
handover1 window rxlev neighbor averaging 10
handover1 power budget interval 6
handover1 power budget hysteresis 3
handover1 maximum distance 9999
dyn_ts_allow_tch_f 0
periodic location update 30
bts 0

View File

@ -10,12 +10,12 @@ network
paging any use tch 0
handover 0
handover algorithm 1
handover window rxlev averaging 10
handover window rxqual averaging 1
handover window rxlev neighbor averaging 10
handover power budget interval 6
handover power budget hysteresis 3
handover maximum distance 9999
handover1 window rxlev averaging 10
handover1 window rxqual averaging 1
handover1 window rxlev neighbor averaging 10
handover1 power budget interval 6
handover1 power budget hysteresis 3
handover1 maximum distance 9999
dyn_ts_allow_tch_f 0
periodic location update 30
bts 0

View File

@ -64,6 +64,7 @@ static inline const char *tdma2a(bool val)
* TYPE: a type name like int.
* NAME: a variable name suitable for a struct member.
* DEFAULT_VAL: default value, as passed to the VTY, e.g. '0' or 'foo', without quotes.
* VTY_CMD_PREFIX: "handover1 ", "handover2 ", ... or just "" for the common general items.
* VTY_CMD: a command string for VTY without any arguments.
* VTY_CMD_ARG: VTY value range like '<0-23>' or 'foo|bar', will become '(VTY_CMD_ARG|default)'.
* VTY_ARG_EVAL: function name for parsing the VTY arg[0], e.g. 'atoi'.
@ -74,14 +75,14 @@ static inline const char *tdma2a(bool val)
#define HO_GENERAL_CFG_ALL_MEMBERS \
\
HO_CFG_ONE_MEMBER(bool, ho_active, 0, \
"handover", "0|1", a2bool, "%d", bool2i, \
"", "handover", "0|1", a2bool, "%d", bool2i, \
"Handover general config\n" \
"Disable in-call handover\n" \
"Enable in-call handover\n" \
"Enable/disable handover: ") \
\
HO_CFG_ONE_MEMBER(int, algorithm, 1, \
"handover algorithm", "1|2", atoi, "%d", as_is, \
"", "handover algorithm", "1|2", atoi, "%d", as_is, \
"Handover general config\n" \
"Choose algorithm for handover decision\n" \
"Algorithm 1: trigger handover based on comparing current cell and neighbor RxLev and RxQual," \
@ -93,21 +94,21 @@ static inline const char *tdma2a(bool val)
#define HODEC1_CFG_ALL_MEMBERS \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec1_rxlev_avg_win, 10, \
"handover window rxlev averaging", "<1-10>", atoi, "%u", as_is, \
"handover1 ", "window rxlev averaging", "<1-10>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER1 \
HO_CFG_STR_WIN_RXLEV \
"How many RxLev measurements are used for averaging\n" \
"RxLev averaging: " HO_CFG_STR_AVG_COUNT) \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec1_rxqual_avg_win, 1, \
"handover window rxqual averaging", "<1-10>", atoi, "%u", as_is, \
"handover1 ", "window rxqual averaging", "<1-10>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER1 \
HO_CFG_STR_WIN_RXQUAL \
"How many RxQual measurements are used for averaging\n" \
"RxQual averaging: " HO_CFG_STR_AVG_COUNT) \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec1_rxlev_neigh_avg_win, 10, \
"handover window rxlev neighbor averaging", "<1-10>", atoi, "%u", as_is, \
"handover1 ", "window rxlev neighbor averaging", "<1-10>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER1 \
HO_CFG_STR_WIN_RXLEV \
"How many Neighbor RxLev measurements are used for averaging\n" \
@ -115,21 +116,21 @@ static inline const char *tdma2a(bool val)
"Neighbor RxLev averaging: " HO_CFG_STR_AVG_COUNT) \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec1_pwr_interval, 6, \
"handover power budget interval", "<1-99>", atoi, "%u", as_is, \
"handover1 ", "power budget interval", "<1-99>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER1 \
HO_CFG_STR_POWER_BUDGET \
"How often to check for a better cell (SACCH frames)\n" \
"Check for stronger neighbor every N number of SACCH frames\n") \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec1_pwr_hysteresis, 3, \
"handover power budget hysteresis", "<0-999>", atoi, "%u", as_is, \
"handover1 ", "power budget hysteresis", "<0-999>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER1 \
HO_CFG_STR_POWER_BUDGET \
"How many dBm stronger must a neighbor be to become a HO candidate\n" \
"Neighbor's strength difference in dBm\n") \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec1_max_distance, 9999, \
"handover maximum distance" , "<0-9999>", atoi, "%u", as_is, \
"handover1 ", "maximum distance" , "<0-9999>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER1 \
"Maximum Timing-Advance value (i.e. MS distance) before triggering HO\n" \
"Maximum Timing-Advance value (i.e. MS distance) before triggering HO\n" \
@ -139,21 +140,21 @@ static inline const char *tdma2a(bool val)
#define HODEC2_CFG_ALL_MEMBERS \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec2_rxlev_avg_win, 10, \
"handover2 window rxlev averaging", "<1-10>", atoi, "%u", as_is, \
"handover2 ", "window rxlev averaging", "<1-10>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_WIN_RXLEV \
"How many RxLev measurements are used for averaging\n" \
"RxLev averaging: " HO_CFG_STR_AVG_COUNT) \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec2_rxqual_avg_win, 1, \
"handover2 window rxqual averaging", "<1-10>", atoi, "%u", as_is, \
"handover2 ", "window rxqual averaging", "<1-10>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_WIN_RXQUAL \
"How many RxQual measurements are used for averaging\n" \
"RxQual averaging: " HO_CFG_STR_AVG_COUNT) \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec2_rxlev_neigh_avg_win, 10, \
"handover2 window rxlev neighbor averaging", "<1-10>", atoi, "%u", as_is, \
"handover2 ", "window rxlev neighbor averaging", "<1-10>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_WIN_RXLEV \
"How many Neighbor RxLev measurements are used for averaging\n" \
@ -161,111 +162,111 @@ static inline const char *tdma2a(bool val)
"Neighbor RxLev averaging: " HO_CFG_STR_AVG_COUNT) \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec2_pwr_interval, 6, \
"handover2 power budget interval", "<1-99>", atoi, "%u", as_is, \
"handover2 ", "power budget interval", "<1-99>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_POWER_BUDGET \
"How often to check for a better cell (SACCH frames)\n" \
"Check for stronger neighbor every N number of SACCH frames\n") \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec2_pwr_hysteresis, 3, \
"handover2 power budget hysteresis", "<0-999>", atoi, "%u", as_is, \
"handover2 ", "power budget hysteresis", "<0-999>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_POWER_BUDGET \
"How many dBm stronger must a neighbor be to become a HO candidate\n" \
"Neighbor's strength difference in dBm\n") \
\
HO_CFG_ONE_MEMBER(unsigned int, hodec2_max_distance, 9999, \
"handover2 maximum distance" , "<0-9999>", atoi, "%u", as_is, \
"handover2 ", "maximum distance" , "<0-9999>", atoi, "%u", as_is, \
HO_CFG_STR_HANDOVER2 \
"Maximum Timing-Advance value (i.e. MS distance) before triggering HO\n" \
"Maximum Timing-Advance value (i.e. MS distance) before triggering HO\n" \
"Maximum Timing-Advance value (i.e. MS distance) before triggering HO\n") \
\
HO_CFG_ONE_MEMBER(bool, hodec2_as_active, 0, \
"handover2 assignment", "0|1", a2bool, "%d", bool2i, \
"handover2 ", "assignment", "0|1", a2bool, "%d", bool2i, \
HO_CFG_STR_HANDOVER2 \
"Enable or disable in-call channel re-assignment" HO_CFG_STR_2 \
"Disable in-call assignment\n" \
"Enable in-call assignment\n") \
\
HO_CFG_ONE_MEMBER(bool, hodec2_full_tdma, subset, \
"handover2 tdma-measurement", "full|subset", a2tdma, "%s", tdma2a, \
"handover2 ", "tdma-measurement", "full|subset", a2tdma, "%s", tdma2a, \
HO_CFG_STR_HANDOVER2 \
"Define measurement set of TDMA frames" HO_CFG_STR_2 \
"Full set of 102/104 TDMA frames\n" \
"Sub set of 4 TDMA frames (SACCH)\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_min_rxlev, -100, \
"handover2 min rxlev", "<-110--50>", atoi, "%d", as_is, \
"handover2 ", "min rxlev", "<-110--50>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_MIN \
"How weak may RxLev of an MS become before triggering HO\n" \
"minimum RxLev (dBm)\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_min_rxqual, 5, \
"handover2 min rxqual", "<0-7>", atoi, "%d", as_is, \
"handover2 ", "min rxqual", "<0-7>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_MIN \
"How bad may RxQual of an MS become before triggering HO\n" \
"minimum RxQual (dBm)\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_afs_bias_rxlev, 0, \
"handover2 afs-bias rxlev", "<0-20>", atoi, "%d", as_is, \
"handover2 ", "afs-bias rxlev", "<0-20>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_AFS_BIAS \
"RxLev improvement bias for AFS over other codecs\n" \
"Virtual RxLev improvement (dBm)\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_afs_bias_rxqual, 0, \
"handover2 afs-bias rxqual", "<0-7>", atoi, "%d", as_is, \
"handover2 ", "afs-bias rxqual", "<0-7>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_AFS_BIAS \
"RxQual improvement bias for AFS over other codecs\n" \
"Virtual RxQual improvement (dBm)\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_tchf_min_slots, 0, \
"handover2 min-free-slots tch/f", "<0-9999>", atoi, "%d", as_is, \
"handover2 ", "min-free-slots tch/f", "<0-9999>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_MIN_TCH \
"Minimum free TCH/F timeslots before cell is considered congested\n" \
"Number of TCH/F slots\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_tchh_min_slots, 0, \
"handover2 min-free-slots tch/h", "<0-9999>", atoi, "%d", as_is, \
"handover2 ", "min-free-slots tch/h", "<0-9999>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_MIN_TCH \
"Minimum free TCH/H timeslots before cell is considered congested\n" \
"Number of TCH/H slots\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_ho_max, 9999, \
"handover2 max-handovers", "<1-9999>", atoi, "%d", as_is, \
"handover2 ", "max-handovers", "<1-9999>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
"Maximum number of concurrent handovers allowed per cell" HO_CFG_STR_2 \
"Number\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_penalty_max_dist, 300, \
"handover2 penalty-time max-distance", "<0-99999>", atoi, "%d", as_is, \
"handover2 ", "penalty-time max-distance", "<0-99999>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_PENALTY_TIME \
"Time to suspend handovers after leaving this cell due to exceeding max distance\n" \
"Seconds\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_penalty_failed_ho, 60, \
"handover2 penalty-time failed-ho", "<0-99999>", atoi, "%d", as_is, \
"handover2 ", "penalty-time failed-ho", "<0-99999>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_PENALTY_TIME \
"Time to suspend handovers after handover failure to this cell\n" \
"Seconds\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_penalty_failed_as, 60, \
"handover2 penalty-time failed-assignment", "<0-99999>", atoi, "%d", as_is, \
"handover2 ", "penalty-time failed-assignment", "<0-99999>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
HO_CFG_STR_PENALTY_TIME \
"Time to suspend handovers after assignment failure in this cell\n" \
"Seconds\n") \
\
HO_CFG_ONE_MEMBER(int, hodec2_retries, 0, \
"handover2 retries", "<0-9>", atoi, "%d", as_is, \
"handover2 ", "retries", "<0-9>", atoi, "%d", as_is, \
HO_CFG_STR_HANDOVER2 \
"Immediately retry on handover/assignment failure" HO_CFG_STR_2 \
"Number of retries\n") \
@ -278,7 +279,7 @@ static inline const char *tdma2a(bool val)
/* Declare public API for handover cfg parameters... */
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY0, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
TYPE ho_get_##NAME(struct handover_cfg *ho); \
void ho_set_##NAME(struct handover_cfg *ho, TYPE val); \
bool ho_isset_##NAME(struct handover_cfg *ho); \

View File

@ -30,7 +30,7 @@
struct handover_cfg {
struct handover_cfg *higher_level_cfg;
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY0, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
TYPE NAME; \
bool has_##NAME;
@ -46,7 +46,7 @@ struct handover_cfg *ho_cfg_init(void *ctx, struct handover_cfg *higher_level_cf
return ho;
}
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY1, VTY2, VTY_ARG_EVAL, VTY4, VTY5, VTY6) \
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY0, VTY1, VTY2, VTY_ARG_EVAL, VTY4, VTY5, VTY6) \
TYPE ho_get_##NAME(struct handover_cfg *ho) \
{ \
if (ho->has_##NAME) \

View File

@ -40,11 +40,11 @@ static struct handover_cfg *ho_cfg_from_vty(struct vty *vty)
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, \
VTY_CMD, VTY_CMD_ARG, VTY_ARG_EVAL, \
VTY_CMD_PREFIX, VTY_CMD, VTY_CMD_ARG, VTY_ARG_EVAL, \
VTY_WRITE_FMT, VTY_WRITE_CONV, \
VTY_DOC) \
DEFUN(cfg_ho_##NAME, cfg_ho_##NAME##_cmd, \
VTY_CMD " (" VTY_CMD_ARG "|default)", \
VTY_CMD_PREFIX VTY_CMD " (" VTY_CMD_ARG "|default)", \
VTY_DOC \
"Use default (" #DEFAULT_VAL "), remove explicit setting on this node\n") \
{ \
@ -57,7 +57,7 @@ DEFUN(cfg_ho_##NAME, cfg_ho_##NAME##_cmd, \
msg = "setting removed, now is"; \
} else \
msg = "already was unset, still is"; \
vty_out(vty, "%% '" VTY_CMD "' %s " VTY_WRITE_FMT "%s%s", \
vty_out(vty, "%% '" VTY_CMD_PREFIX VTY_CMD "' %s " VTY_WRITE_FMT "%s%s", \
msg, VTY_WRITE_CONV( ho_get_##NAME(ho) ), \
ho_isset_on_parent_##NAME(ho)? " (set on higher level node)" : "", \
VTY_NEWLINE); \
@ -71,6 +71,19 @@ HO_CFG_ALL_MEMBERS
#undef HO_CFG_ONE_MEMBER
/* Aliases of 'handover' for 'handover1' for backwards compat */
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, \
VTY_CMD_PREFIX, VTY_CMD, VTY_CMD_ARG, VTY_ARG_EVAL, \
VTY_WRITE_FMT, VTY_WRITE_CONV, \
VTY_DOC) \
ALIAS(cfg_ho_##NAME, cfg_ho_##NAME##_cmd_alias, \
"handover " VTY_CMD " (" VTY_CMD_ARG "|default)", \
VTY_DOC \
"Use default (" #DEFAULT_VAL "), remove explicit setting on this node\n");
HODEC1_CFG_ALL_MEMBERS
#undef HO_CFG_ONE_MEMBER
static inline const int a2congestion_check_interval(const char *arg)
{
if (!strcmp(arg, "disabled"))
@ -109,11 +122,11 @@ DEFUN(cfg_net_ho_congestion_check_interval, cfg_net_ho_congestion_check_interval
static void ho_vty_write(struct vty *vty, const char *indent, struct handover_cfg *ho)
{
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, \
VTY_CMD, VTY_CMD_ARG, VTY_ARG_EVAL, \
VTY_CMD_PREFIX, VTY_CMD, VTY_CMD_ARG, VTY_ARG_EVAL, \
VTY_WRITE_FMT, VTY_WRITE_CONV, \
VTY_DOC) \
if (ho_isset_##NAME(ho)) \
vty_out(vty, "%s" VTY_CMD " " VTY_WRITE_FMT "%s", indent, \
vty_out(vty, "%s" VTY_CMD_PREFIX VTY_CMD " " VTY_WRITE_FMT "%s", indent, \
VTY_WRITE_CONV( ho_get_##NAME(ho) ), VTY_NEWLINE);
HO_CFG_ALL_MEMBERS
@ -130,17 +143,24 @@ void ho_vty_write_net(struct vty *vty, struct gsm_network *net)
ho_vty_write(vty, " ", net->ho);
if (net->hodec2.congestion_check_interval_s != HO_CFG_CONGESTION_CHECK_DEFAULT)
vty_out(vty, " handover congestion-check %s%s",
vty_out(vty, " handover2 congestion-check %s%s",
congestion_check_interval2a(net->hodec2.congestion_check_interval_s),
VTY_NEWLINE);
}
static void ho_vty_init_cmds(int parent_node)
{
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY0, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
install_element(parent_node, &cfg_ho_##NAME##_cmd);
HO_CFG_ALL_MEMBERS
#undef HO_CFG_ONE_MEMBER
/* Aliases of 'handover' for 'handover1' for backwards compat */
#define HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL, VTY0, VTY1, VTY2, VTY3, VTY4, VTY5, VTY6) \
install_element(parent_node, &cfg_ho_##NAME##_cmd_alias);
HODEC1_CFG_ALL_MEMBERS
#undef HO_CFG_ONE_MEMBER
}

View File

@ -38,7 +38,7 @@ OsmoBSC(config-net-bts)# do show network
...
OsmoBSC(config-net-bts)# ### Add arbitrary handover config item for bts 1:
OsmoBSC(config-net-bts)# handover power budget interval 23
OsmoBSC(config-net-bts)# handover1 power budget interval 23
OsmoBSC(config-net-bts)# exit
OsmoBSC(config-net)# ### HO is 'on' globally, bts 0 disables it, bts 1 tweaks a param:
OsmoBSC(config-net)# show running-config
@ -53,7 +53,7 @@ network
... !handover
bts 1
... !handover
handover power budget interval 23
handover1 power budget interval 23
... !handover
OsmoBSC(config-net)# ### Set global default to 'off', now bts 1 also uses the global default of 'off':
@ -74,7 +74,7 @@ network
... !handover
bts 1
... !handover
handover power budget interval 23
handover1 power budget interval 23
... !handover
OsmoBSC(config-net)# ### Remove the global setting, i.e. use the factory default net level, with same effect:
@ -96,7 +96,7 @@ network
... !handover
bts 1
... !handover
handover power budget interval 23
handover1 power budget interval 23
... !handover
OsmoBSC(config-net)# ### Re-enable net-level handover, but bts 0 remains disabled explicitly
@ -117,7 +117,7 @@ network
... !handover
bts 1
... !handover
handover power budget interval 23
handover1 power budget interval 23
... !handover
OsmoBSC(config-net)# ### Remove explicit setting of bts 0 to also use the global setting:
@ -140,7 +140,7 @@ network
... !handover
bts 1
... !handover
handover power budget interval 23
handover1 power budget interval 23
... !handover
OsmoBSC(config-net-bts)# ### Verify that 'min rxlev' value range stops at -50
@ -165,12 +165,12 @@ OsmoBSC(config-net)# list
...
handover (0|1|default)
handover algorithm (1|2|default)
handover window rxlev averaging (<1-10>|default)
handover window rxqual averaging (<1-10>|default)
handover window rxlev neighbor averaging (<1-10>|default)
handover power budget interval (<1-99>|default)
handover power budget hysteresis (<0-999>|default)
handover maximum distance (<0-9999>|default)
handover1 window rxlev averaging (<1-10>|default)
handover1 window rxqual averaging (<1-10>|default)
handover1 window rxlev neighbor averaging (<1-10>|default)
handover1 power budget interval (<1-99>|default)
handover1 power budget hysteresis (<0-999>|default)
handover1 maximum distance (<0-9999>|default)
handover2 window rxlev averaging (<1-10>|default)
handover2 window rxqual averaging (<1-10>|default)
handover2 window rxlev neighbor averaging (<1-10>|default)
@ -190,12 +190,16 @@ OsmoBSC(config-net)# list
handover2 penalty-time failed-ho (<0-99999>|default)
handover2 penalty-time failed-assignment (<0-99999>|default)
handover2 retries (<0-9>|default)
... !handover2
handover2 congestion-check (disabled|<1-999>|now)
...
OsmoBSC(config-net)# handover?
handover Handover general config
OsmoBSC(config-net)# handover1?
handover1 Handover options for handover decision algorithm 1
OsmoBSC(config-net)# handover2?
handover2 Handover options for handover decision algorithm 2
@ -204,9 +208,12 @@ OsmoBSC(config-net)# handover ?
1 Enable in-call handover
default Enable/disable handover: Use default (0), remove explicit setting on this node
algorithm Choose algorithm for handover decision
window Measurement averaging settings
power Neighbor cell power triggering
maximum Maximum Timing-Advance value (i.e. MS distance) before triggering HO
...
OsmoBSC(config-net)# handover1 ?
window Measurement averaging settings
power Neighbor cell power triggering
maximum Maximum Timing-Advance value (i.e. MS distance) before triggering HO
OsmoBSC(config-net)# handover2 ?
window Measurement averaging settings
@ -227,51 +234,51 @@ OsmoBSC(config-net)# handover algorithm ?
2 Algorithm 2: trigger handover on RxLev/RxQual, and also to balance the load across several cells. Consider available codecs. Prevent repeated handover by penalty timers.
default Use default (1), remove explicit setting on this node
OsmoBSC(config-net)# handover window ?
OsmoBSC(config-net)# handover1 window ?
rxlev Received-Level averaging
rxqual Received-Quality averaging
OsmoBSC(config-net)# handover window rxlev ?
OsmoBSC(config-net)# handover1 window rxlev ?
averaging How many RxLev measurements are used for averaging
neighbor How many Neighbor RxLev measurements are used for averaging
OsmoBSC(config-net)# handover window rxlev averaging ?
OsmoBSC(config-net)# handover1 window rxlev averaging ?
<1-10> RxLev averaging: Number of values to average over
default Use default (10), remove explicit setting on this node
OsmoBSC(config-net)# handover window rxlev neighbor ?
OsmoBSC(config-net)# handover1 window rxlev neighbor ?
averaging How many Neighbor RxLev measurements are used for averaging
OsmoBSC(config-net)# handover window rxlev neighbor averaging ?
OsmoBSC(config-net)# handover1 window rxlev neighbor averaging ?
<1-10> Neighbor RxLev averaging: Number of values to average over
default Use default (10), remove explicit setting on this node
OsmoBSC(config-net)# handover window rxqual ?
OsmoBSC(config-net)# handover1 window rxqual ?
averaging How many RxQual measurements are used for averaging
OsmoBSC(config-net)# handover window rxqual averaging ?
OsmoBSC(config-net)# handover1 window rxqual averaging ?
<1-10> RxQual averaging: Number of values to average over
default Use default (1), remove explicit setting on this node
OsmoBSC(config-net)# handover power ?
OsmoBSC(config-net)# handover1 power ?
budget Neighbor cell power triggering
OsmoBSC(config-net)# handover power budget ?
OsmoBSC(config-net)# handover1 power budget ?
interval How often to check for a better cell (SACCH frames)
hysteresis How many dBm stronger must a neighbor be to become a HO candidate
OsmoBSC(config-net)# handover power budget interval ?
OsmoBSC(config-net)# handover1 power budget interval ?
<1-99> Check for stronger neighbor every N number of SACCH frames
default Use default (6), remove explicit setting on this node
OsmoBSC(config-net)# handover power budget hysteresis ?
OsmoBSC(config-net)# handover1 power budget hysteresis ?
<0-999> Neighbor's strength difference in dBm
default Use default (3), remove explicit setting on this node
OsmoBSC(config-net)# handover maximum ?
OsmoBSC(config-net)# handover1 maximum ?
distance Maximum Timing-Advance value (i.e. MS distance) before triggering HO
OsmoBSC(config-net)# handover maximum distance ?
OsmoBSC(config-net)# handover1 maximum distance ?
<0-9999> Maximum Timing-Advance value (i.e. MS distance) before triggering HO
default Use default (9999), remove explicit setting on this node
@ -409,6 +416,9 @@ OsmoBSC(config-net)# bts 0
OsmoBSC(config-net-bts)# handover?
handover Handover general config
OsmoBSC(config-net-bts)# handover1?
handover1 Handover options for handover decision algorithm 1
OsmoBSC(config-net-bts)# handover2?
handover2 Handover options for handover decision algorithm 2
@ -417,9 +427,12 @@ OsmoBSC(config-net-bts)# handover ?
1 Enable in-call handover
default Enable/disable handover: Use default (0), remove explicit setting on this node
algorithm Choose algorithm for handover decision
window Measurement averaging settings
power Neighbor cell power triggering
maximum Maximum Timing-Advance value (i.e. MS distance) before triggering HO
...
OsmoBSC(config-net-bts)# handover1 ?
window Measurement averaging settings
power Neighbor cell power triggering
maximum Maximum Timing-Advance value (i.e. MS distance) before triggering HO
OsmoBSC(config-net-bts)# handover2 ?
window Measurement averaging settings
@ -439,51 +452,51 @@ OsmoBSC(config-net-bts)# handover algorithm ?
2 Algorithm 2: trigger handover on RxLev/RxQual, and also to balance the load across several cells. Consider available codecs. Prevent repeated handover by penalty timers.
default Use default (1), remove explicit setting on this node
OsmoBSC(config-net-bts)# handover window ?
OsmoBSC(config-net-bts)# handover1 window ?
rxlev Received-Level averaging
rxqual Received-Quality averaging
OsmoBSC(config-net-bts)# handover window rxlev ?
OsmoBSC(config-net-bts)# handover1 window rxlev ?
averaging How many RxLev measurements are used for averaging
neighbor How many Neighbor RxLev measurements are used for averaging
OsmoBSC(config-net-bts)# handover window rxlev averaging ?
OsmoBSC(config-net-bts)# handover1 window rxlev averaging ?
<1-10> RxLev averaging: Number of values to average over
default Use default (10), remove explicit setting on this node
OsmoBSC(config-net-bts)# handover window rxlev neighbor ?
OsmoBSC(config-net-bts)# handover1 window rxlev neighbor ?
averaging How many Neighbor RxLev measurements are used for averaging
OsmoBSC(config-net-bts)# handover window rxlev neighbor averaging ?
OsmoBSC(config-net-bts)# handover1 window rxlev neighbor averaging ?
<1-10> Neighbor RxLev averaging: Number of values to average over
default Use default (10), remove explicit setting on this node
OsmoBSC(config-net-bts)# handover window rxqual ?
OsmoBSC(config-net-bts)# handover1 window rxqual ?
averaging How many RxQual measurements are used for averaging
OsmoBSC(config-net-bts)# handover window rxqual averaging ?
OsmoBSC(config-net-bts)# handover1 window rxqual averaging ?
<1-10> RxQual averaging: Number of values to average over
default Use default (1), remove explicit setting on this node
OsmoBSC(config-net-bts)# handover power ?
OsmoBSC(config-net-bts)# handover1 power ?
budget Neighbor cell power triggering
OsmoBSC(config-net-bts)# handover power budget ?
OsmoBSC(config-net-bts)# handover1 power budget ?
interval How often to check for a better cell (SACCH frames)
hysteresis How many dBm stronger must a neighbor be to become a HO candidate
OsmoBSC(config-net-bts)# handover power budget interval ?
OsmoBSC(config-net-bts)# handover1 power budget interval ?
<1-99> Check for stronger neighbor every N number of SACCH frames
default Use default (6), remove explicit setting on this node
OsmoBSC(config-net-bts)# handover power budget hysteresis ?
OsmoBSC(config-net-bts)# handover1 power budget hysteresis ?
<0-999> Neighbor's strength difference in dBm
default Use default (3), remove explicit setting on this node
OsmoBSC(config-net-bts)# handover maximum ?
OsmoBSC(config-net-bts)# handover1 maximum ?
distance Maximum Timing-Advance value (i.e. MS distance) before triggering HO
OsmoBSC(config-net-bts)# handover maximum distance ?
OsmoBSC(config-net-bts)# handover1 maximum distance ?
<0-9999> Maximum Timing-Advance value (i.e. MS distance) before triggering HO
default Use default (9999), remove explicit setting on this node