aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Sperling <ssperling@sysmocom.de>2018-02-08 18:06:42 +0100
committerStefan Sperling <ssperling@sysmocom.de>2018-02-08 18:06:42 +0100
commitc862d2548105bb444e607f0378354c6897248ad2 (patch)
tree9142f825b8fe77592099e7cb629239b9ef0db2db
parentea0e993bc464e4118ab7753855a65a01d91317ed (diff)
add VTY command to configure ramping step interval
-rw-r--r--include/osmocom/bsc/acc_ramp.h18
-rw-r--r--src/libbsc/acc_ramp.c7
-rw-r--r--src/libbsc/bsc_vty.c35
3 files changed, 47 insertions, 13 deletions
diff --git a/include/osmocom/bsc/acc_ramp.h b/include/osmocom/bsc/acc_ramp.h
index f4bcd4096..a4ce0d2d6 100644
--- a/include/osmocom/bsc/acc_ramp.h
+++ b/include/osmocom/bsc/acc_ramp.h
@@ -31,16 +31,12 @@
* a lot of MS would discover the new cell and try to connect to it all at once.
*/
-enum acc_ramp_step_size {
- ACC_RAMP_STEP_SIZE_MIN = 1, /* allow at most 1 new ACC per ramp step */
- ACC_RAMP_STEP_SIZE_DEFAULT = ACC_RAMP_STEP_SIZE_MIN,
- ACC_RAMP_STEP_SIZE_MAX = 10, /* allow all ACC in one step (effectively disables ramping) */
-};
+#define ACC_RAMP_STEP_SIZE_MIN 1 /* allow at most 1 new ACC per ramp step */
+#define ACC_RAMP_STEP_SIZE_DEFAULT ACC_RAMP_STEP_SIZE_MIN
+#define ACC_RAMP_STEP_SIZE_MAX 10 /* allow all ACC in one step (effectively disables ramping) */
-enum acc_ramp_step_interval {
- ACC_RAMP_STEP_INTERVAL_MIN = 30, /* 30 seconds */
- ACC_RAMP_STEP_INTERVAL_MAX = 600, /* 10 minutes */
-};
+#define ACC_RAMP_STEP_INTERVAL_MIN 30 /* 30 seconds */
+#define ACC_RAMP_STEP_INTERVAL_MAX 600 /* 10 minutes */
struct acc_ramp {
struct gsm_bts *bts; /* backpointer to BTS using this ACC ramp */
@@ -63,7 +59,7 @@ struct acc_ramp {
* This value can be changed by VTY configuration.
* A value of ACC_RAMP_STEP_SIZE_MAX effectively disables ramping.
*/
- enum acc_ramp_step_size step_size;
+ unsigned int step_size;
/*
* Ramping step interval in seconds.
@@ -90,7 +86,7 @@ struct acc_ramp {
void acc_ramp_init(struct acc_ramp *acc_ramp, struct gsm_bts *bts);
/* Change the ramping step size. Returns negative on error (step_size out of range), else zero. */
-int acc_ramp_set_step_size(struct acc_ramp *acc_ramp, enum acc_ramp_step_size step_size);
+int acc_ramp_set_step_size(struct acc_ramp *acc_ramp, unsigned int step_size);
/*
* Change the ramping step interval to a fixed value. Unless this function is called,
diff --git a/src/libbsc/acc_ramp.c b/src/libbsc/acc_ramp.c
index 73df4fe93..8825188a5 100644
--- a/src/libbsc/acc_ramp.c
+++ b/src/libbsc/acc_ramp.c
@@ -161,12 +161,13 @@ void acc_ramp_init(struct acc_ramp *acc_ramp, struct gsm_bts *bts)
allow_all_allowed_accs(acc_ramp);
}
-int acc_ramp_set_step_size(struct acc_ramp *acc_ramp, enum acc_ramp_step_size step_size)
+int acc_ramp_set_step_size(struct acc_ramp *acc_ramp, unsigned int step_size)
{
if (step_size < ACC_RAMP_STEP_SIZE_MIN || step_size > ACC_RAMP_STEP_SIZE_MAX)
return -ERANGE;
acc_ramp->step_size = step_size;
+ LOGP(DRLL, LOGL_DEBUG, "(bts=%d) ACC RAMP: ramping step size set to %u\n", acc_ramp->bts->nr, step_size);
return 0;
}
@@ -177,12 +178,16 @@ int acc_ramp_set_step_interval(struct acc_ramp *acc_ramp, unsigned int step_inte
acc_ramp->step_interval_sec = step_interval;
acc_ramp->step_interval_is_fixed = true;
+ LOGP(DRLL, LOGL_DEBUG, "(bts=%d) ACC RAMP: ramping step interval set to %u seconds\n",
+ acc_ramp->bts->nr, step_interval);
return 0;
}
void acc_ramp_set_step_interval_dynamic(struct acc_ramp *acc_ramp)
{
acc_ramp->step_interval_is_fixed = false;
+ LOGP(DRLL, LOGL_DEBUG, "(bts=%d) ACC RAMP: ramping step interval set to 'dynamic'\n",
+ acc_ramp->bts->nr);
}
void acc_ramp_start(struct acc_ramp *acc_ramp)
diff --git a/src/libbsc/bsc_vty.c b/src/libbsc/bsc_vty.c
index b02ac2bbf..171d5a72a 100644
--- a/src/libbsc/bsc_vty.c
+++ b/src/libbsc/bsc_vty.c
@@ -1756,6 +1756,7 @@ DEFUN(cfg_bts,
/* allocate a new one */
bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
HARDCODED_BSIC);
+ acc_ramp_init(&bts->acc_ramp, bts);
} else
bts = gsm_bts_num(gsmnet, bts_nr);
@@ -3111,7 +3112,7 @@ DEFUN(cfg_bts_pcu_sock, cfg_bts_pcu_sock_cmd,
DEFUN(cfg_bts_acc_ramping,
cfg_bts_acc_ramping_cmd,
"access-control-class-ramping enabled (0|1)",
- "Enable or disable Access Control Class ramping\n"
+ "Conigure Access Control Class ramping\n"
"Enable or disable Access Control Class ramping\n"
"Disable Access Control Class ramping\n" "Enable Access Control Class ramping\n")
{
@@ -3133,6 +3134,37 @@ DEFUN(cfg_bts_acc_ramping,
return CMD_SUCCESS;
}
+DEFUN(cfg_bts_acc_ramping_step_interval,
+ cfg_bts_acc_ramping_step_interval_cmd,
+ "access-control-class-ramping step-interval (<"
+ OSMO_STRINGIFY_VAL(ACC_RAMP_STEP_INTERVAL_MIN) "-"
+ OSMO_STRINGIFY_VAL(ACC_RAMP_STEP_INTERVAL_MAX) ">|dynamic)",
+ "Conigure Access Control Class ramping\n"
+ "Configure Access Control Class ramping step interval\n"
+ "Set a fixed step interval (in seconds)\n"
+ "Use dynamic step interval based on BTS channel load (this is the default)\n")
+{
+ struct gsm_bts *bts = vty->index;
+ bool dynamic = (strcmp(argv[0], "dynamic") == 0);
+ int error;
+
+ if (dynamic) {
+ acc_ramp_set_step_interval_dynamic(&bts->acc_ramp);
+ return CMD_SUCCESS;
+ }
+
+ error = acc_ramp_set_step_interval(&bts->acc_ramp, atoi(argv[0]));
+ if (error != 0) {
+ if (error == -ERANGE)
+ vty_out(vty, "Unable to set ACC ramp step interval: value out of range%s", VTY_NEWLINE);
+ else
+ vty_out(vty, "Unable to set ACC ramp step interval: unknown error%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
@@ -4466,6 +4498,7 @@ int bsc_vty_init(struct gsm_network *network)
install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
install_element(BTS_NODE, &cfg_bts_pcu_sock_cmd);
install_element(BTS_NODE, &cfg_bts_acc_ramping_cmd);
+ install_element(BTS_NODE, &cfg_bts_acc_ramping_step_interval_cmd);
/* See also handover commands added on bts level from handover_vty.c */
install_element(BTS_NODE, &cfg_trx_cmd);