diff options
author | Stefan Sperling <ssperling@sysmocom.de> | 2018-02-08 18:06:42 +0100 |
---|---|---|
committer | Stefan Sperling <ssperling@sysmocom.de> | 2018-02-08 18:06:42 +0100 |
commit | c862d2548105bb444e607f0378354c6897248ad2 (patch) | |
tree | 9142f825b8fe77592099e7cb629239b9ef0db2db | |
parent | ea0e993bc464e4118ab7753855a65a01d91317ed (diff) |
add VTY command to configure ramping step interval
Change-Id: I6a296afb9be58a1528f19993251a975caee0855b
-rw-r--r-- | include/osmocom/bsc/acc_ramp.h | 18 | ||||
-rw-r--r-- | src/libbsc/acc_ramp.c | 7 | ||||
-rw-r--r-- | src/libbsc/bsc_vty.c | 35 |
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); |