ctrl: Add setting access control class

Change-Id: I7abbf0adc3798e9224834a68d7cdce4bbe03c9a3
This commit is contained in:
Matan Perelman 2023-04-26 23:48:37 +03:00
parent a8fcc1bb73
commit ba3fe2c908
1 changed files with 79 additions and 0 deletions

View File

@ -882,6 +882,83 @@ static int get_bts_rach_access_control_class(struct ctrl_cmd *cmd, void *data)
CTRL_CMD_DEFINE_RO(bts_rach_access_control_class, "rach-access-control-classes");
static int verify_access_control_class(struct ctrl_cmd *cmd, const char *value)
{
int acc;
if (strcmp(value, "emergency") == 0)
return 0;
acc = atoi(value);
if (acc < 0 || acc > 15) {
cmd->reply = "Value is out of range";
return 1;
} else if (acc == 10) {
cmd->reply = "Access control class 10 does not exist, consider using \"emergency\" instead";
return 1;
}
return 0;
}
static int set_access_control_class(struct ctrl_cmd *cmd, bool allow)
{
int acc;
struct gsm_bts *bts = cmd->node;
if (strcmp(cmd->value, "emergency") == 0) {
if (allow)
bts->si_common.rach_control.t2 &= ~0x4;
else
bts->si_common.rach_control.t2 |= 0x4;
cmd->reply = "OK";
return CTRL_CMD_REPLY;
}
acc = atoi(cmd->value);
if (acc < 8)
if (allow)
bts->si_common.rach_control.t3 &= ~(0x1 << acc);
else
bts->si_common.rach_control.t3 |= (0x1 << acc);
else
if (allow)
bts->si_common.rach_control.t2 &= ~(0x1 << (acc - 8));
else
bts->si_common.rach_control.t2 |= (0x1 << (acc - 8));
if (acc < 10)
acc_mgr_perm_subset_changed(&bts->acc_mgr, &bts->si_common.rach_control);
cmd->reply = "OK";
return CTRL_CMD_REPLY;
}
static int verify_bts_rach_access_control_class_bar(struct ctrl_cmd *cmd, const char *value, void *_data)
{
return verify_access_control_class(cmd, value);
}
static int set_bts_rach_access_control_class_bar(struct ctrl_cmd *cmd, void *data)
{
return set_access_control_class(cmd, false);
}
CTRL_CMD_DEFINE_WO(bts_rach_access_control_class_bar, "rach-access-control-class bar");
static int verify_bts_rach_access_control_class_allow(struct ctrl_cmd *cmd, const char *value, void *_data)
{
return verify_access_control_class(cmd, value);
}
static int set_bts_rach_access_control_class_allow(struct ctrl_cmd *cmd, void *data)
{
return set_access_control_class(cmd, true);
}
CTRL_CMD_DEFINE_WO(bts_rach_access_control_class_allow, "rach-access-control-class allow");
int bsc_bts_ctrl_cmds_install(void)
{
int rc = 0;
@ -908,6 +985,8 @@ int bsc_bts_ctrl_cmds_install(void)
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_cell_reselection_penalty_time);
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_cell_reselection_hysteresis);
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rach_access_control_class);
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rach_access_control_class_bar);
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rach_access_control_class_allow);
rc |= neighbor_ident_ctrl_init();