aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2021-04-18 15:58:35 +0200
committerneels <nhofmeyr@sysmocom.de>2021-04-22 18:50:32 +0000
commitc1a5310a3ed75ff24dc2d6a48c09d8dfc89d944c (patch)
tree8473c2a0a7af782ff80dee2b9e7c3737bc5cdd22
parent5bc54d6ce88fb25bfd211d1659b2aa366ae8077e (diff)
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
-rw-r--r--include/osmocom/bsc/bts.h1
-rw-r--r--src/osmo-bsc/bsc_init.c12
-rw-r--r--src/osmo-bsc/bsc_vty.c17
-rw-r--r--src/osmo-bsc/bts.c5
-rw-r--r--src/osmo-bsc/bts_trx.c4
-rw-r--r--src/osmo-bsc/neighbor_ident_vty.c8
-rw-r--r--src/osmo-bsc/osmo_bsc_main.c4
7 files changed, 48 insertions, 3 deletions
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,