Add support for extended SI2q parameters

* add vty command to set E-UTRAN_PRIORITY, THRESH_E-UTRAN_low and
  E-UTRAN_QRXLEVMIN according to 3GPP TS 44.018 Table 10.5.2.33b.1
* remove old command which does not support those parameters

Change-Id: I36dcc79f7b7a02036e74720923d0df1a2a2db504
Fixes: RT#8792
This commit is contained in:
Max 2017-02-15 13:51:37 +01:00 committed by Harald Welte
parent 87bfed259d
commit 2c16beeb64
1 changed files with 72 additions and 32 deletions

View File

@ -541,6 +541,7 @@ static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
{
int i;
uint8_t tmp;
vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
@ -694,15 +695,23 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
}
for (i = 0; i < MAX_EARFCN_LIST; i++) {
if (bts->si_common.si2quater_neigh_list.arfcn[i] !=
OSMO_EARFCN_INVALID) {
vty_out(vty, " si2quater neighbor-list add earfcn %u threshold %u",
bts->si_common.si2quater_neigh_list.arfcn[i],
bts->si_common.si2quater_neigh_list.thresh_hi);
if (bts->si_common.si2quater_neigh_list.meas_bw[i] !=
OSMO_EARFCN_MEAS_INVALID)
vty_out(vty, " %u",
bts->si_common.si2quater_neigh_list.meas_bw[i]);
struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
if (e->arfcn[i] != OSMO_EARFCN_INVALID) {
vty_out(vty, " si2quater neighbor-list add earfcn %u "
"thresh-hi %u", e->arfcn[i], e->thresh_hi);
vty_out(vty, " thresh-lo %u",
e->thresh_lo_valid ? e->thresh_lo : 32);
vty_out(vty, " prio %u",
e->prio_valid ? e->prio : 8);
vty_out(vty, " qrxlv %u",
e->qrxlm_valid ? e->qrxlm : 32);
tmp = e->meas_bw[i];
vty_out(vty, " meas %u",
(tmp != OSMO_EARFCN_MEAS_INVALID) ? tmp : 8);
vty_out(vty, "%s", VTY_NEWLINE);
}
@ -2746,42 +2755,73 @@ DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
return CMD_SUCCESS;
}
DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
"si2quater neighbor-list add earfcn <0-65535> threshold <0-31> "
"[<0-7>]", "SI2quater Neighbor List\n"
"SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
"EARFCN of neighbor\n" "EARFCN of neighbor\n" "threshold high bits\n"
"threshold high bits\n" "measurement bandwidth\n")
"si2quater neighbor-list add earfcn <0-65535> thresh-hi <0-31> "
"thresh-lo <0-32> prio <0-8> qrxlv <0-32> meas <0-8>",
"SI2quater Neighbor List\n" "SI2quater Neighbor List\n"
"Add to manual SI2quater neighbor list\n"
"EARFCN of neighbor\n" "EARFCN of neighbor\n"
"threshold high bits\n" "threshold high bits\n"
"threshold low bits\n" "threshold low bits (32 means NA)\n"
"priority\n" "priority (8 means NA)\n"
"QRXLEVMIN\n" "QRXLEVMIN (32 means NA)\n"
"measurement bandwidth\n" "measurement bandwidth (8 means NA)\n")
{
struct gsm_bts *bts = vty->index;
struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
uint16_t arfcn = atoi(argv[0]);
uint8_t meas = OSMO_EARFCN_MEAS_INVALID, thresh = atoi(argv[1]);
int r;
if (3 == argc)
meas = atoi(argv[2]);
r = osmo_earfcn_add(e, arfcn, meas);
uint8_t thresh_hi = atoi(argv[1]), thresh_lo = atoi(argv[2]),
prio = atoi(argv[3]), qrx = atoi(argv[4]), meas = atoi(argv[5]);
int r = osmo_earfcn_add(e, arfcn,
(meas < 8) ? meas : OSMO_EARFCN_MEAS_INVALID);
if (r < 0) {
vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(-r),
vty_out(vty, "Unable to add ARFCN %u: %s%s", arfcn, strerror(-r),
VTY_NEWLINE);
return CMD_WARNING;
}
if (si2q_size_check(bts)) {
if (e->thresh_hi && thresh != e->thresh_hi)
vty_out(vty, "Warning: multiple thresholds are not "
"supported, overriding previous threshold %u%s",
e->thresh_hi, VTY_NEWLINE);
e->thresh_hi = thresh;
return CMD_SUCCESS;
if (e->thresh_hi && thresh_hi != e->thresh_hi)
vty_out(vty, "Warning: multiple threshold-high are not "
"supported, overriding previous threshold %u%s",
e->thresh_hi, VTY_NEWLINE);
e->thresh_hi = thresh_hi;
if (thresh_lo != 32) {
if (e->thresh_lo_valid && e->thresh_lo != thresh_lo)
vty_out(vty, "Warning: multiple threshold-low are not "
"supported, overriding previous threshold %u%s",
e->thresh_lo, VTY_NEWLINE);
e->thresh_lo = thresh_lo;
e->thresh_lo_valid = true;
}
vty_out(vty, "Warning: not enough space in si2quater for a given arfcn%s"
, VTY_NEWLINE);
if (qrx != 32) {
if (e->qrxlm_valid && e->qrxlm != qrx)
vty_out(vty, "Warning: multiple QRXLEVMIN are not "
"supported, overriding previous value %u%s",
e->qrxlm, VTY_NEWLINE);
e->qrxlm = qrx;
e->qrxlm_valid = true;
}
if (prio != 8) {
if (e->prio_valid && e->prio != prio)
vty_out(vty, "Warning: multiple priorities are not "
"supported, overriding previous value %u%s",
e->prio, VTY_NEWLINE);
e->prio = prio;
e->prio_valid = true;
}
if (si2q_size_check(bts))
return CMD_SUCCESS;
vty_out(vty, "Warning: not enough space in SI2quater for a given EARFCN "
"%u%s", arfcn, VTY_NEWLINE);
osmo_earfcn_del(e, arfcn);
return CMD_WARNING;
}