diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index bcc215df9..58ca10495 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -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); diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c index b572f27f0..cd97695e6 100644 --- a/src/osmo-bsc/bsc_init.c +++ b/src/osmo-bsc/bsc_init.c @@ -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; +} diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c index 3c60f5f42..1a6cf0a68 100644 --- a/src/osmo-bsc/bsc_vty.c +++ b/src/osmo-bsc/bsc_vty.c @@ -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 */ diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index 2192c560f..08587d705 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -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[] = { diff --git a/src/osmo-bsc/bts_trx.c b/src/osmo-bsc/bts_trx.c index 6d98929b5..d67c9a174 100644 --- a/src/osmo-bsc/bts_trx.c +++ b/src/osmo-bsc/bts_trx.c @@ -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 diff --git a/src/osmo-bsc/neighbor_ident_vty.c b/src/osmo-bsc/neighbor_ident_vty.c index b9160ec67..12aca9d16 100644 --- a/src/osmo-bsc/neighbor_ident_vty.c +++ b/src/osmo-bsc/neighbor_ident_vty.c @@ -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; } diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c index 3069cc02f..fd41b7491 100644 --- a/src/osmo-bsc/osmo_bsc_main.c +++ b/src/osmo-bsc/osmo_bsc_main.c @@ -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,