summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-05-23 13:56:40 +0000
committerHarald Welte <laforge@gnumonks.org>2009-05-23 13:56:40 +0000
commitbe99149e72a22180a1b8acaa0a6182b02c5387c3 (patch)
treed1db473c5e38b8079bf3e9ec46641e156ea2ac45
parentc1d2aaecb57e00e07275c3618c85e1bf85a4dc1e (diff)
add new function gsm_bts_by_lac() to search for BTS based on location area
-rw-r--r--include/openbsc/gsm_data.h2
-rw-r--r--src/gsm_data.c27
2 files changed, 29 insertions, 0 deletions
diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h
index 4da9e3aa6..0e3a380d7 100644
--- a/include/openbsc/gsm_data.h
+++ b/include/openbsc/gsm_data.h
@@ -349,6 +349,8 @@ void set_ts_e1link(struct gsm_bts_trx_ts *ts, u_int8_t e1_nr,
u_int8_t e1_ts, u_int8_t e1_ts_ss);
enum gsm_bts_type parse_btstype(char *arg);
char *btstype2str(enum gsm_bts_type type);
+struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
+ struct gsm_bts *start_bts);
static inline int is_ipaccess_bts(struct gsm_bts *bts)
{
diff --git a/src/gsm_data.c b/src/gsm_data.c
index f654d909f..78f976514 100644
--- a/src/gsm_data.c
+++ b/src/gsm_data.c
@@ -179,3 +179,30 @@ char *btstype2str(enum gsm_bts_type type)
return "undefined";
return bts_types[type];
}
+
+/* Search for a BTS in the given Location Area; optionally start searching
+ * with start_bts (for continuing to search after the first result) */
+struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
+ struct gsm_bts *start_bts)
+{
+ int i;
+ struct gsm_bts *bts;
+ int skip = 0;
+
+ if (start_bts)
+ skip = 1;
+
+ for (i = 0; i < net->num_bts; i++) {
+ bts = &net->bts[i];
+
+ if (skip) {
+ if (start_bts == bts)
+ skip = 0;
+ continue;
+ }
+
+ if (bts->location_area_code == lac)
+ return bts;
+ }
+ return NULL;
+}