pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/38087?usp=email )
Change subject: Introduce hashtable to lookup bts by LAC ......................................................................
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(-)
Approvals: fixeria: Looks good to me, but someone else must approve laforge: Looks good to me, but someone else must approve pespin: Looks good to me, approved Jenkins Builder: Verified
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);