pespin submitted this change.

View Change

Approvals: daniel: Looks good to me, but someone else must approve osmith: Looks good to me, approved Jenkins Builder: Verified
Fix missing LAC/CI hashtable update upon CTRL SET

Add functions to set LAC/CI on a BTS and update hashtables

Use these function from both the vty and the control interface.

This commit fixes the issue where an update to LAC or CI
via the control interface was not resulting in updated
hashtables and therefore the BTS was not found during paging.

Related: OS#6840
Fixes: 15284337ece94e3ff3ebf9575096290f67d69a88

Change-Id: If9509534bd4a75f8ed8fb3e0a6bec701c7596861
(cherry picked from commit e6b593f3a9dee85deb8682a7cfea0134db8d3982)
---
M include/osmocom/bsc/bts.h
M src/osmo-bsc/bts.c
M src/osmo-bsc/bts_ctrl.c
M src/osmo-bsc/bts_vty.c
4 files changed, 99 insertions(+), 17 deletions(-)

diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h
index 0264dcf..a10d3c4 100644
--- a/include/osmocom/bsc/bts.h
+++ b/include/osmocom/bsc/bts.h
@@ -825,6 +825,9 @@
int gsm_set_bts_model(struct gsm_bts *bts, struct gsm_bts_model *model);
int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);

+void gsm_bts_set_lac(struct gsm_bts *bts, uint16_t lac);
+void gsm_bts_set_ci(struct gsm_bts *bts, uint16_t ci);
+
struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);

int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode);
diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c
index dd60ef8..730cf7a 100644
--- a/src/osmo-bsc/bts.c
+++ b/src/osmo-bsc/bts.c
@@ -758,6 +758,30 @@
return 0;
}

+void gsm_bts_set_lac(struct gsm_bts *bts, uint16_t lac)
+{
+ bts->location_area_code = lac;
+
+ hash_del(&bts->node_by_lac);
+ hash_del(&bts->node_by_lac_ci);
+ hash_add(bts->network->bts_by_lac, &bts->node_by_lac, bts->location_area_code);
+ hash_add(bts->network->bts_by_lac_ci, &bts->node_by_lac_ci,
+ LAC_CI_HASHTABLE_KEY(bts->location_area_code, bts->cell_identity));
+}
+
+void gsm_bts_set_ci(struct gsm_bts *bts, uint16_t ci)
+{
+ bts->cell_identity = ci;
+
+ hash_del(&bts->node_by_ci);
+ hash_add(bts->network->bts_by_ci, &bts->node_by_ci, bts->cell_identity);
+ if (bts->location_area_code != GSM_LAC_RESERVED_DETACHED) {
+ hash_del(&bts->node_by_lac_ci);
+ hash_add(bts->network->bts_by_lac_ci, &bts->node_by_lac_ci,
+ LAC_CI_HASHTABLE_KEY(bts->location_area_code, bts->cell_identity));
+ }
+}
+
int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode)
{
if (mode != BTS_GPRS_NONE &&
diff --git a/src/osmo-bsc/bts_ctrl.c b/src/osmo-bsc/bts_ctrl.c
index 2efa661..d63ad89 100644
--- a/src/osmo-bsc/bts_ctrl.c
+++ b/src/osmo-bsc/bts_ctrl.c
@@ -21,6 +21,7 @@

#include <errno.h>
#include <time.h>
+#include <inttypes.h>

#include <osmocom/ctrl/control_cmd.h>

@@ -244,9 +245,76 @@
return 1;
}

+static int get_bts_lac(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts *bts = cmd->node;
+ cmd->reply = talloc_asprintf(cmd, "%" PRIu16, bts->location_area_code);
+ if (!cmd->reply) {
+ cmd->reply = "OOM";
+ return CTRL_CMD_ERROR;
+ }
+ return CTRL_CMD_REPLY;
+}
+
+static int set_bts_lac(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts *bts = cmd->node;
+ int lac;
+
+ osmo_str_to_int(&lac, cmd->value, 0, 0, 0xffff);
+ gsm_bts_set_lac(bts, lac);
+ return get_bts_lac(cmd, data);
+}
+
+static int verify_bts_lac(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+ int lac;
+
+ if (osmo_str_to_int(&lac, cmd->value, 0, 0, 0xffff) < 0) {
+ cmd->reply = "Input not within the range";
+ return -1;
+ }
+ if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
+ cmd->reply = talloc_asprintf(cmd, "LAC %d is reserved by GSM 04.08", lac);
+ return -1;
+ }
+ return 0;
+}
+
+static int get_bts_ci(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts *bts = cmd->node;
+ cmd->reply = talloc_asprintf(cmd, "%" PRIu16, bts->cell_identity);
+ if (!cmd->reply) {
+ cmd->reply = "OOM";
+ return CTRL_CMD_ERROR;
+ }
+ return CTRL_CMD_REPLY;
+}
+
+static int set_bts_ci(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts *bts = cmd->node;
+ int ci;
+
+ osmo_str_to_int(&ci, cmd->value, 0, 0, 0xffff);
+ gsm_bts_set_ci(bts, ci);
+ return get_bts_ci(cmd, data);
+}
+
+static int verify_bts_ci(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+ int ci;
+
+ if (osmo_str_to_int(&ci, cmd->value, 0, 0, 0xffff) < 0) {
+ cmd->reply = "Input not within the range";
+ return -1;
+ }
+ return 0;
+}
/* BTS related commands below */
-CTRL_CMD_DEFINE_RANGE(bts_lac, "location-area-code", struct gsm_bts, location_area_code, 0, 65535);
-CTRL_CMD_DEFINE_RANGE(bts_ci, "cell-identity", struct gsm_bts, cell_identity, 0, 65535);
+CTRL_CMD_DEFINE(bts_lac, "location-area-code");
+CTRL_CMD_DEFINE(bts_ci, "cell-identity");
CTRL_CMD_DEFINE_RANGE(bts_bsic, "bsic", struct gsm_bts, bsic, 0, 63);
CTRL_CMD_DEFINE_RANGE(bts_rach_max_delay, "rach-max-delay", struct gsm_bts, rach_max_delay, 1, 127);
CTRL_CMD_DEFINE_RANGE(bts_rach_expiry_timeout, "rach-expiry-timeout", struct gsm_bts, rach_expiry_timeout, 4, 64);
diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c
index 1babd4d..660439a 100644
--- a/src/osmo-bsc/bts_vty.c
+++ b/src/osmo-bsc/bts_vty.c
@@ -274,15 +274,8 @@
ci, VTY_NEWLINE);
return CMD_WARNING;
}
- bts->cell_identity = ci;
- hash_del(&bts->node_by_ci);
- hash_add(bts->network->bts_by_ci, &bts->node_by_ci, bts->cell_identity);
- if (bts->location_area_code != GSM_LAC_RESERVED_DETACHED) {
- hash_del(&bts->node_by_lac_ci);
- hash_add(bts->network->bts_by_lac_ci, &bts->node_by_lac_ci,
- LAC_CI_HASHTABLE_KEY(bts->location_area_code, bts->cell_identity));
- }

+ gsm_bts_set_ci(bts, ci);
return CMD_SUCCESS;
}

@@ -305,13 +298,7 @@
return CMD_WARNING;
}

- bts->location_area_code = lac;
- hash_del(&bts->node_by_lac);
- hash_del(&bts->node_by_lac_ci);
- hash_add(bts->network->bts_by_lac, &bts->node_by_lac, bts->location_area_code);
- hash_add(bts->network->bts_by_lac_ci, &bts->node_by_lac_ci,
- LAC_CI_HASHTABLE_KEY(bts->location_area_code, bts->cell_identity));
-
+ gsm_bts_set_lac(bts, lac);
return CMD_SUCCESS;
}


To view, visit change 40996. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: osmo-bsc
Gerrit-Branch: pespin/rel-1.13.1
Gerrit-Change-Id: If9509534bd4a75f8ed8fb3e0a6bec701c7596861
Gerrit-Change-Number: 40996
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <dwillmann@sysmocom.de>
Gerrit-Reviewer: osmith <osmith@sysmocom.de>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>
Gerrit-CC: keith <keith@rhizomatica.org>