pespin submitted this change.
Introduce hashtable to lookup bts by LAC
The BTS is not added to the hashtable during allocation, because the
default LAC value is 0, which is GSM_LAC_RESERVED_DETACHED
(reserved by GSM 04.08), so it's also detached from the hashtable
(cannot be found based on a reserved value).
Related: SYS#7062
Change-Id: Id523027b49e0f58cd2c8c9b4dee619de415dbd15
---
M include/osmocom/bsc/bts.h
M include/osmocom/bsc/gsm_data.h
M src/osmo-bsc/bts.c
M src/osmo-bsc/bts_vty.c
M src/osmo-bsc/neighbor_ident.c
M src/osmo-bsc/net_init.c
M src/osmo-bsc/osmo_bsc_bssap.c
7 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h
index 8e530ef..9e70ee5 100644
--- a/include/osmocom/bsc/bts.h
+++ b/include/osmocom/bsc/bts.h
@@ -343,6 +343,8 @@
/*! Entry in hash table network->bts_by_nr. */
struct hlist_node node_by_nr;
+ /*! Entry in hash table network->bts_by_lac. */
+ struct hlist_node node_by_lac;
/* number of this BTS in network */
gsm_bts_nr_t nr;
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 5ed339d..1dda9ae 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -988,6 +988,7 @@
struct llist_head bts_list;
struct llist_head bts_rejected;
DECLARE_HASHTABLE(bts_by_nr, 10);
+ DECLARE_HASHTABLE(bts_by_lac, 10);
/* BTS-based counters when we can't find the actual BTS
* e.g. when conn->lchan is NULL */
diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c
index 38e5f11..d928a4b 100644
--- a/src/osmo-bsc/bts.c
+++ b/src/osmo-bsc/bts.c
@@ -160,6 +160,7 @@
llist_del(&bts->list);
hash_del(&bts->node_by_nr);
+ hash_del(&bts->node_by_lac);
paging_destructor(bts);
bts_setup_ramp_remove(bts);
@@ -205,6 +206,9 @@
hash_add(net->bts_by_nr, &bts->node_by_nr, bts->nr);
net->num_bts++;
+ /* Default bts->location_area_code == GSM_LAC_RESERVED_DETACHED, don't add to hashtable: */
+ INIT_HLIST_NODE(&bts->node_by_lac);
+
bts->num_trx = 0;
INIT_LLIST_HEAD(&bts->trx_list);
bts->network = net;
diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c
index 81c4022..4ef582f 100644
--- a/src/osmo-bsc/bts_vty.c
+++ b/src/osmo-bsc/bts_vty.c
@@ -278,8 +278,8 @@
X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK),
"location_area_code (<0-65535>|<0x0000-0xffff>)",
"Set the Location Area Code (LAC) of this BTS\n"
- "LAC in decimal format\n"
- "LAC in hexadecimal format\n")
+ "LAC in decimal format (default 0, reserved by GSM 04.08)\n"
+ "LAC in hexadecimal format (default 0x0000, reserved by GSM 04.08)\n")
{
struct gsm_bts *bts = vty->index;
int lac;
@@ -293,6 +293,8 @@
}
bts->location_area_code = lac;
+ hash_del(&bts->node_by_lac);
+ hash_add(bts->network->bts_by_lac, &bts->node_by_lac, bts->location_area_code);
return CMD_SUCCESS;
}
diff --git a/src/osmo-bsc/neighbor_ident.c b/src/osmo-bsc/neighbor_ident.c
index 3e42c5f..4d52c50 100644
--- a/src/osmo-bsc/neighbor_ident.c
+++ b/src/osmo-bsc/neighbor_ident.c
@@ -377,7 +377,7 @@
struct gsm_bts *local_neighbor = NULL;
struct gsm0808_cell_id_list2 remote_neighbors = { 0 };
- llist_for_each_entry(bts_tmp, &net->bts_list, list) {
+ hash_for_each_possible(net->bts_by_lac, bts_tmp, node_by_lac, lac) {
if (bts_tmp->location_area_code != lac)
continue;
if (bts_tmp->cell_identity != cell_id)
diff --git a/src/osmo-bsc/net_init.c b/src/osmo-bsc/net_init.c
index fc29d43..62b3ee4 100644
--- a/src/osmo-bsc/net_init.c
+++ b/src/osmo-bsc/net_init.c
@@ -125,6 +125,7 @@
INIT_LLIST_HEAD(&net->bts_list);
net->num_bts = 0;
hash_init(net->bts_by_nr);
+ hash_init(net->bts_by_lac);
net->T_defs = gsm_network_T_defs;
osmo_tdefs_reset(net->T_defs);
diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c
index c9e8e5e..82bdeb7 100644
--- a/src/osmo-bsc/osmo_bsc_bssap.c
+++ b/src/osmo-bsc/osmo_bsc_bssap.c
@@ -150,7 +150,7 @@
if (!osmo_plmn_cmp(&id->lai.plmn, &bsc_gsmnet->plmn)) {
int paged = 0;
struct gsm_bts *bts;
- llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
+ hash_for_each_possible(bsc_gsmnet->bts_by_lac, bts, node_by_lac, id->lai.lac) {
if (bts->location_area_code != id->lai.lac)
continue;
if (bts->cell_identity != id->cell_identity)
@@ -179,7 +179,7 @@
const struct osmo_lac_and_ci_id *id = ¶ms->cil.id_list[i].lac_and_ci;
int paged = 0;
struct gsm_bts *bts;
- llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
+ hash_for_each_possible(bsc_gsmnet->bts_by_lac, bts, node_by_lac, id->lac) {
if (bts->location_area_code != id->lac)
continue;
if (bts->cell_identity != id->ci)
@@ -222,7 +222,7 @@
if (!osmo_plmn_cmp(&id->plmn, &bsc_gsmnet->plmn)) {
int paged = 0;
struct gsm_bts *bts;
- llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
+ hash_for_each_possible(bsc_gsmnet->bts_by_lac, bts, node_by_lac, id->lac) {
if (bts->location_area_code != id->lac)
continue;
page_subscriber(params, bts, id->lac);
@@ -248,7 +248,7 @@
uint16_t lac = params->cil.id_list[i].lac;
int paged = 0;
struct gsm_bts *bts;
- llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
+ hash_for_each_possible(bsc_gsmnet->bts_by_lac, bts, node_by_lac, lac) {
if (bts->location_area_code != lac)
continue;
page_subscriber(params, bts, lac);
To view, visit change 38087. To unsubscribe, or for help writing mail filters, visit settings.