update neighbor ARFCNs on startup and config changes

The effects of the neighbor configuration depend on the LAC, Cell
Identity, ARFCN, BSIC configuration of neighbor cells. Make sure that
the neighbor ARFCN list in the System Information is updated.

This may seem rather aggressive: updating the SI of all BTS if only one
config item changed. But indeed even modifying one config item of one
BTS may cause a change in the neighbor relations that many other BTS may
have to the changed BTS. For example, if many BTS configure a
'neighbor lac-ci 42 23', and this cell's config changes to LAC 43, all
of those other BTS need to update their neighbor ARFCNs.

Also update the system information even before the BTS are connected and
started up. The main benefit here is that the VTY 'show bts N' command
then already lists the correct neighbor ARFCNs.

In gsm_bts_trx_set_system_infos(), make sure that the updated SI is only
sent to TRXes that are actually usable, otherwise abis_rsl_sendmsg()
spams the log with complaints that a message's dst == NULL. Still return
an error rc in case a TRX is not connected, so that the CTRL command
bts.N.send-new-system-informations accurately returns whether SI were
actually sent to all TRXes.

The desire to have the ARFCNs listed in the VTY before starting up BTSes
came during analysis for Ifb54d9a91e9bca032c721f12c873c6216733e7b1,
which fixes a bug that is now much easier to verify being fixed.

Change-Id: I2222e029fc225152e124ed1e8887f1ffd4a107ef
This commit is contained in:
Neels Hofmeyr 2021-04-18 15:58:35 +02:00 committed by neels
parent 5bc54d6ce8
commit c1a5310a3e
7 changed files with 48 additions and 3 deletions

View File

@ -671,6 +671,7 @@ void gsm_bts_all_ts_dispatch(struct gsm_bts *bts, uint32_t ts_ev, void *data);
int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan);
int gsm_bts_set_system_infos(struct gsm_bts *bts);
int gsm_net_set_system_infos(void);
int gsm_bts_model_register(struct gsm_bts_model *model);
struct gsm_bts_model *bts_model_find(enum gsm_bts_type type);

View File

@ -168,3 +168,15 @@ struct gsm_bts *bsc_bts_alloc_register(struct gsm_network *net, enum gsm_bts_typ
return bts;
}
int gsm_net_set_system_infos(void)
{
struct gsm_bts *bts;
int ret = 0;
llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
int rc = gsm_bts_set_system_infos(bts);
if (rc)
ret = rc;
}
return ret;
}

View File

@ -2448,6 +2448,11 @@ DEFUN_USRATTR(cfg_bts_ci,
}
bts->cell_identity = ci;
/* Changing the CI of a BTS may affect the neighbor relations between cells, when other cells indicate a
* neighbor cell by CI. Update the neighbors list in System Information. */
if (vty->type != VTY_FILE)
gsm_net_set_system_infos();
return CMD_SUCCESS;
}
@ -2474,6 +2479,11 @@ DEFUN_USRATTR(cfg_bts_lac,
bts->location_area_code = lac;
/* Changing the LAC of a BTS may affect the neighbor relations between cells, when other cells indicate a
* neighbor cell by LAC. Update the neighbors list in System Information. */
if (vty->type != VTY_FILE)
gsm_net_set_system_infos();
return CMD_SUCCESS;
}
@ -2504,6 +2514,9 @@ DEFUN_USRATTR(cfg_bts_bsic,
}
bts->bsic = bsic;
if (vty->type != VTY_FILE)
gsm_net_set_system_infos();
return CMD_SUCCESS;
}
@ -5347,7 +5360,9 @@ DEFUN_USRATTR(cfg_trx_arfcn,
return CMD_WARNING;
}
/* FIXME: patch ARFCN into SYSTEM INFORMATION */
if (vty->type != VTY_FILE)
gsm_net_set_system_infos();
/* FIXME: use OML layer to update the ARFCN */
/* FIXME: use RSL layer to update SYSTEM INFORMATION */

View File

@ -722,6 +722,7 @@ int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan)
int gsm_bts_set_system_infos(struct gsm_bts *bts)
{
struct gsm_bts_trx *trx;
int ret = 0;
/* Generate a new ID */
bts->bcch_change_mark += 1;
@ -732,10 +733,10 @@ int gsm_bts_set_system_infos(struct gsm_bts *bts)
rc = gsm_bts_trx_set_system_infos(trx);
if (rc != 0)
return rc;
ret = rc;
}
return 0;
return ret;
}
const struct rate_ctr_desc bts_ctr_description[] = {

View File

@ -429,6 +429,10 @@ int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx)
/* Third, we send the selected SI via RSL */
/* If the BTS is not up and running yet, don't send anything. */
if (!trx_is_usable(trx))
return -1;
for (n = 0; n < n_si; n++) {
i = gen_si[n];
/* 3GPP TS 08.58 §8.5.1 BCCH INFORMATION. If we don't currently

View File

@ -183,6 +183,10 @@ static int add_neighbor(struct vty *vty, struct neighbor *n)
neighbor = talloc_zero(bts, struct neighbor);
*neighbor = *n;
llist_add_tail(&neighbor->entry, &bts->neighbors);
if (vty->type != VTY_FILE)
gsm_bts_set_system_infos(bts);
return CMD_SUCCESS;
}
@ -213,6 +217,10 @@ static int del_neighbor(struct vty *vty, struct neighbor *n)
llist_del(&neighbor->entry);
talloc_free(neighbor);
if (vty->type != VTY_FILE)
gsm_bts_set_system_infos(bts);
return CMD_SUCCESS;
}

View File

@ -942,6 +942,10 @@ int main(int argc, char **argv)
exit(1);
}
/* Make the 'show bts' information list the neighbor ARFCNs by updating the
* system_information.si_common.neigh_list. */
gsm_net_set_system_infos();
/* start control interface after reading config for
* ctrl_vty_get_bind_addr() */
bsc_gsmnet->ctrl = bsc_controlif_setup(bsc_gsmnet,