From 4010f1e6f4d3f1c702be836a2342aefd8de73f2a Mon Sep 17 00:00:00 2001 From: Sylvain Munaut <246tnt@gmail.com> Date: Tue, 22 Dec 2009 13:43:26 +0100 Subject: bts: Allow config of RACH control parameters tx-integer & max retrans Tweaking theses can be useful especially tx-integer that influence both the spread of rach attemps and the delay between two attemps. Looking up GSM 04.08 3.3.1.1.2 & 10.5.2.29 can help determine good values. The default are choosed with a wide spacing between attemps (tx integer = 9 -> T=12 & S=217 (non-combined CCCH/SDCCH) or 115 (for combined CCCH/SDCCH)). This alleviates the problem of responding to several RACH attempts by a same MS, allocating several RF channels when only 1 is needed. Signed-off-by: Sylvain Munaut --- openbsc/src/gsm_data.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 12f439be2..d6ebd9224 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -175,6 +175,10 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, bts->si_common.cell_alloc.data = bts->si_common.data.cell_alloc; bts->si_common.cell_alloc.data_len = sizeof(bts->si_common.data.cell_alloc); + bts->si_common.rach_control.re = 1; /* no re-establishment */ + bts->si_common.rach_control.tx_integer = 9; /* 12 slots spread - 217/115 slots delay */ + bts->si_common.rach_control.max_trans = 3; /* 7 retransmissions */ + bts->si_common.rach_control.t2 = 4; /* no emergency calls */ for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) { bts->gprs.nsvc[i].bts = bts; -- cgit v1.2.3 From ffa55a4e8783419f60932ef2f9e872293cf932b9 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 22 Dec 2009 19:07:32 +0100 Subject: statistics: Introduce 'struct counter' instead of using unsigned long This has the advantage that counters can be added all over the code very easily, while having only one routine that stores all of the current counter values to the database. The counters are synced every 60 seconds, providing relatively fine grained statistics about the network usage as time passes by. --- openbsc/src/gsm_data.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index d6ebd9224..e2f56d539 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -28,6 +28,7 @@ #include #include #include +#include void *tall_bsc_ctx; @@ -226,6 +227,32 @@ struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_c INIT_LLIST_HEAD(&net->upqueue); INIT_LLIST_HEAD(&net->bts_list); + net->stats.chreq.total = counter_alloc("net.chreq.total"); + net->stats.chreq.no_channel = counter_alloc("net.chreq.no_channel"); + net->stats.handover.attempted = counter_alloc("net.handover.attempted"); + net->stats.handover.no_channel = counter_alloc("net.handover.no_channel"); + net->stats.handover.timeout = counter_alloc("net.handover.timeout"); + net->stats.handover.completed = counter_alloc("net.handover.completed"); + net->stats.handover.failed = counter_alloc("net.handover.failed"); + net->stats.loc_upd_type.attach = counter_alloc("net.loc_upd_type.attach"); + net->stats.loc_upd_type.normal = counter_alloc("net.loc_upd_type.normal"); + net->stats.loc_upd_type.periodic = counter_alloc("net.loc_upd_type.periodic"); + net->stats.loc_upd_type.detach = counter_alloc("net.imsi_detach.count"); + net->stats.loc_upd_resp.reject = counter_alloc("net.loc_upd_resp.reject"); + net->stats.loc_upd_resp.accept = counter_alloc("net.loc_upd_resp.accept"); + net->stats.paging.attempted = counter_alloc("net.paging.attempted"); + net->stats.paging.detached = counter_alloc("net.paging.detached"); + net->stats.paging.completed = counter_alloc("net.paging.completed"); + net->stats.paging.expired = counter_alloc("net.paging.expired"); + net->stats.sms.submitted = counter_alloc("net.sms.submitted"); + net->stats.sms.no_receiver = counter_alloc("net.sms.no_receiver"); + net->stats.sms.delivered = counter_alloc("net.sms.delivered"); + net->stats.sms.rp_err_mem = counter_alloc("net.sms.rp_err_mem"); + net->stats.sms.rp_err_other = counter_alloc("net.sms.rp_err_other"); + net->stats.call.dialled = counter_alloc("net.call.dialled"); + net->stats.call.alerted = counter_alloc("net.call.alerted"); + net->stats.call.connected = counter_alloc("net.call.connected"); + net->mncc_recv = mncc_recv; return net; -- cgit v1.2.3 From 240ce88185dc69265e4015cdfdc1a7af41006b8e Mon Sep 17 00:00:00 2001 From: "Harald Welte (local)" Date: Sat, 26 Dec 2009 19:43:11 +0100 Subject: add 'get_string_value()' as inverse function of 'get_value_string()' --- openbsc/src/gsm_data.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index e2f56d539..774a1ce2d 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -45,6 +45,19 @@ const char *get_value_string(const struct value_string *vs, u_int32_t val) return "unknown"; } +int get_string_value(const struct value_string *vs, const char *str) +{ + int i; + + for (i = 0;; i++) { + if (vs[i].value == 0 && vs[i].str == NULL) + break; + if (!strcasecmp(vs[i].str, str)) + return vs[i].value; + } + return -EINVAL; +} + 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) { -- cgit v1.2.3 From f6f2ef9d24d93ec339e5bedd8089138842813966 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 27 Dec 2009 11:24:55 +0100 Subject: move get_string_value() und get_value_string() into debug.c this makes bsc_mgcp and ipaccess-proxy compile again --- openbsc/src/gsm_data.c | 26 -------------------------- 1 file changed, 26 deletions(-) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 774a1ce2d..e216420c2 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -32,32 +32,6 @@ void *tall_bsc_ctx; -const char *get_value_string(const struct value_string *vs, u_int32_t val) -{ - int i; - - for (i = 0;; i++) { - if (vs[i].value == 0 && vs[i].str == NULL) - break; - if (vs[i].value == val) - return vs[i].str; - } - return "unknown"; -} - -int get_string_value(const struct value_string *vs, const char *str) -{ - int i; - - for (i = 0;; i++) { - if (vs[i].value == 0 && vs[i].str == NULL) - break; - if (!strcasecmp(vs[i].str, str)) - return vs[i].value; - } - return -EINVAL; -} - 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) { -- cgit v1.2.3 From ccd8845449bbeacf9d4e787be7995cef84f5db4b Mon Sep 17 00:00:00 2001 From: "Harald Welte (local)" Date: Sun, 27 Dec 2009 18:05:25 +0100 Subject: rename gsm_lchan_name() to gsm_lchant_name() --- openbsc/src/gsm_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index e216420c2..7fc969445 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -80,7 +80,7 @@ static const char *lchan_names[] = { [GSM_LCHAN_UNKNOWN] = "UNKNOWN", }; -const char *gsm_lchan_name(enum gsm_chan_t c) +const char *gsm_lchant_name(enum gsm_chan_t c) { if (c >= ARRAY_SIZE(lchan_names)) return "INVALID"; -- cgit v1.2.3 From 19ef62a0a56a9c61d65283d005019ef9563cd8ae Mon Sep 17 00:00:00 2001 From: "Harald Welte (local)" Date: Sun, 27 Dec 2009 18:16:36 +0100 Subject: Introduce and use gsm_lchan_name() in addition to gsm_ts_name() In many cases we actually want a name / unique ID for the lchan, not just for the on-air timeslot... especially in SDCCH/8 case, where 8 SDCCHs share one timeslot... --- openbsc/src/gsm_data.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 7fc969445..ae6d49e73 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -304,6 +304,16 @@ char *gsm_ts_name(struct gsm_bts_trx_ts *ts) return ts2str; } +char *gsm_lchan_name(struct gsm_lchan *lchan) +{ + struct gsm_bts_trx_ts *ts = lchan->ts; + + snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d,ss=%d)", + ts->trx->bts->nr, ts->trx->nr, ts->nr, lchan->nr); + + return ts2str; +} + static const char *bts_types[] = { [GSM_BTS_TYPE_UNKNOWN] = "unknown", [GSM_BTS_TYPE_BS11] = "bs11", -- cgit v1.2.3 From 7b37d9710d119675f374f10a780a8d93440c29d8 Mon Sep 17 00:00:00 2001 From: "Harald Welte (local)" Date: Sun, 27 Dec 2009 20:56:38 +0100 Subject: set the TRX nominal power by default and/or VTY --- openbsc/src/gsm_data.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index ae6d49e73..7e62aa846 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -133,6 +133,9 @@ struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) } } + if (trx->nr != 0) + trx->nominal_power = bts->c0->nominal_power; + llist_add_tail(&trx->list, &bts->trx_list); return trx; @@ -464,3 +467,18 @@ struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan) return meas_rep; } + +void gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type) +{ + bts->type = type; + + switch (bts->type) { + case GSM_BTS_TYPE_NANOBTS: + /* Set the default OML Stream ID to 0xff */ + bts->oml_tei = 0xff; + bts->c0->nominal_power = 23; + break; + case GSM_BTS_TYPE_BS11: + break; + } +} -- cgit v1.2.3 From 1887f9d153497adc37cec5b8db6b7423ff64d6c0 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 29 Dec 2009 10:52:38 +0100 Subject: Introduce gsm_lchans_name() for human readable lchan state name Also, use this new function to dump lchan state on VTY and to improve readability of RSL log messages. --- openbsc/src/gsm_data.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 7e62aa846..0dfd31f17 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -88,6 +88,20 @@ const char *gsm_lchant_name(enum gsm_chan_t c) return lchan_names[c]; } +static const struct value_string lchan_s_names[] = { + { LCHAN_S_NONE, "NONE" }, + { LCHAN_S_ACT_REQ, "ACTIVATION REQUESTED" }, + { LCHAN_S_ACTIVE, "ACTIVE" }, + { LCHAN_S_INACTIVE, "INACTIVE" }, + { LCHAN_S_REL_REQ, "RELEASE REQUESTED" }, + { 0, NULL }, +}; + +const char *gsm_lchans_name(enum gsm_lchan_state s) +{ + return get_value_string(lchan_s_names, s); +} + static const char *chreq_names[] = { [GSM_CHREQ_REASON_EMERG] = "EMERGENCY", [GSM_CHREQ_REASON_PAG] = "PAGING", -- cgit v1.2.3 From d48f4ebb24c13d7cbbcd9131648a16a57fbd9787 Mon Sep 17 00:00:00 2001 From: "Harald Welte (local)" Date: Mon, 28 Dec 2009 23:14:22 +0100 Subject: rsl: add new 'gsm_trx_name()' function and use it --- openbsc/src/gsm_data.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 0dfd31f17..21d9e4b27 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -313,6 +313,15 @@ struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num) static char ts2str[255]; +char *gsm_trx_name(struct gsm_bts_trx *trx) +{ + snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)", + trx->bts->nr, trx->nr); + + return ts2str; +} + + char *gsm_ts_name(struct gsm_bts_trx_ts *ts) { snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d)", -- cgit v1.2.3 From f31e4745bb32d120f55d8442669d666d88619fa0 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 31 Dec 2009 03:05:52 +0100 Subject: [misc] Utilize rf_locking by setting the nm_state.administrative * On start the vty code will call the abis_nm method and this will set the administrative state to unlock/lock * During startup the BTS will report its state as well and would possible overwrite the set administrative. We are only going to update the administrative if it was 0 before. This appears to work on all of my tests. In case this will not be the case for others we will have to split the administrative into two sets one for the BTS and one for the BSC. --- openbsc/src/gsm_data.c | 1 + 1 file changed, 1 insertion(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 21d9e4b27..291d407b6 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -128,6 +128,7 @@ struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) trx->bts = bts; trx->nr = bts->num_trx++; + trx->nm_state.administrative = NM_STATE_UNLOCKED; for (k = 0; k < TRX_NR_TS; k++) { struct gsm_bts_trx_ts *ts = &trx->ts[k]; -- cgit v1.2.3 From d0c540210a72ad1f1062b44a73ce7fe2d2bc2cf3 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 7 Jan 2010 16:08:42 +0100 Subject: Initialize reject_cause to a valid number Currently starting with the opencfg.cfg.nanobts and writing it out and then trying to start again will not work. The network reject_cause is initialized to 0 which is not a valid reject reason and when writing this to the config file and trying to parse it will fail. Pick roaming not allowed as a harmless option to those phones accidently trying to connect to the BTS. --- openbsc/src/gsm_data.c | 1 + 1 file changed, 1 insertion(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 291d407b6..446a82011 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -216,6 +216,7 @@ struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_c net->country_code = country_code; net->network_code = network_code; net->num_bts = 0; + net->reject_cause = GSM48_REJECT_ROAMING_NOT_ALLOWED; net->T3101 = GSM_T3101_DEFAULT; net->T3113 = GSM_T3113_DEFAULT; /* FIXME: initialize all other timers! */ -- cgit v1.2.3 From 6e670aab5af6a355ea69edafb5d4f8adf387557a Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 7 Jan 2010 20:44:32 +0100 Subject: introduce new gsm_bts_trx_by_nr() function --- openbsc/src/gsm_data.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 446a82011..d2676db1b 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -365,6 +365,17 @@ const char *btstype2str(enum gsm_bts_type type) return bts_types[type]; } +struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr) +{ + struct gsm_bts_trx *trx; + + llist_for_each_entry(trx, &bts->trx_list, list) { + if (trx->nr == nr) + return trx; + } + return NULL; +} + /* 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, -- cgit v1.2.3 From 39315c47989326275823d1589425ee62d15bc823 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 10 Jan 2010 18:01:52 +0100 Subject: [OML] parse attributes depending on BTS type Some NM attributes are defined differently depending on the BTS type. Having one big nm_att_tlvdef[] table for all BTS types is no longer sufficient. This patch * introduces 'struct gsm_bts_model' to describe a BTS model * adds definitions of gsm_bts_model for BS-11 and nanoBTS * changes the abis_nm_tlv_parse() function: include a bts pointer --- openbsc/src/gsm_data.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index d2676db1b..694ae06c6 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -32,6 +32,8 @@ void *tall_bsc_ctx; +static LLIST_HEAD(bts_models); + 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) { @@ -118,6 +120,29 @@ const char *gsm_chreq_name(enum gsm_chreq_reason_t c) return chreq_names[c]; } +static struct gsm_bts_model *bts_model_find(enum gsm_bts_type type) +{ + struct gsm_bts_model *model; + + llist_for_each_entry(model, &bts_models, list) { + if (model->type == type) + return model; + } + + return NULL; +} + +int gsm_bts_model_register(struct gsm_bts_model *model) +{ + if (bts_model_find(model->type)) + return -EEXIST; + + tlv_def_patch(&model->nm_att_tlvdef, &nm_att_tlvdef); + llist_add_tail(&model->list, &bts_models); + return 0; +} + + struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) { struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx); @@ -160,14 +185,21 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, u_int8_t tsc, u_int8_t bsic) { struct gsm_bts *bts = talloc_zero(net, struct gsm_bts); + struct gsm_bts_model *model = bts_model_find(type); int i; if (!bts) return NULL; + if (!model) { + talloc_free(bts); + return NULL; + } + bts->network = net; bts->nr = net->num_bts++; bts->type = type; + bts->model = model; bts->tsc = tsc; bts->bsic = bsic; bts->num_trx = 0; @@ -504,9 +536,16 @@ struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan) return meas_rep; } -void gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type) +int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type) { + struct gsm_bts_model *model; + + model = bts_model_find(type); + if (!model) + return -EINVAL; + bts->type = type; + bts->model = model; switch (bts->type) { case GSM_BTS_TYPE_NANOBTS: @@ -517,4 +556,6 @@ void gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type) case GSM_BTS_TYPE_BS11: break; } + + return 0; } -- cgit v1.2.3 From 6af56d1501244f4ce3cfd2e3bf07da19a59108da Mon Sep 17 00:00:00 2001 From: laforge Date: Tue, 12 Jan 2010 10:44:26 +0100 Subject: Fix allocation of BTS from VTY In 39315c47989326275823d1589425ee62d15bc823 we introduced per-bts OML attribute parser definitions and disallowed a BTS of type unknown. However, the VTY code first allocates a BTS with unknown type. --- openbsc/src/gsm_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 694ae06c6..1f2e1a1fc 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -191,7 +191,7 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, if (!bts) return NULL; - if (!model) { + if (!model && type != GSM_BTS_TYPE_UNKNOWN) { talloc_free(bts); return NULL; } -- cgit v1.2.3 From dfe6c7d910edbba238751d0cfddbb627bb08ef54 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 20 Feb 2010 16:24:02 +0100 Subject: split 'libosmocore' from openbsc codebase This library is intended to collect all generic/common funcitionality of all Osmocom.org projects, including OpenBSC but also OsmocomBB The library currently includes the following modules: bitvec, comp128, gsm_utils, msgb, select, signal, statistics, talloc, timer, tlv_parse, linuxlist msgb allocation error debugging had to be temporarily disabled as it depends on 'debug.c' functionality which at the moment remains in OpenBSC --- openbsc/src/gsm_data.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 1f2e1a1fc..a6b060c2d 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -26,9 +26,9 @@ #include #include -#include +#include #include -#include +#include void *tall_bsc_ctx; @@ -438,8 +438,14 @@ struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac, char *gsm_band_name(enum gsm_band band) { switch (band) { - case GSM_BAND_400: - return "GSM400"; + case GSM_BAND_450: + return "GSM450"; + case GSM_BAND_480: + return "GSM450"; + case GSM_BAND_750: + return "GSM750"; + case GSM_BAND_810: + return "GSM810"; case GSM_BAND_850: return "GSM850"; case GSM_BAND_900: @@ -461,8 +467,14 @@ enum gsm_band gsm_band_parse(const char* mhz) return -EINVAL; switch (atoi(mhz)) { - case 400: - return GSM_BAND_400; + case 450: + return GSM_BAND_450; + case 480: + return GSM_BAND_480; + case 750: + return GSM_BAND_750; + case 810: + return GSM_BAND_810; case 850: return GSM_BAND_850; case 900: -- cgit v1.2.3 From fbc5ca080beedf8ca032cdd409db30838843f79b Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 4 Mar 2010 10:39:50 +0100 Subject: move gsm_band_name() and gsm_band_parse() to libosmocore --- openbsc/src/gsm_data.c | 56 ++------------------------------------------------ 1 file changed, 2 insertions(+), 54 deletions(-) (limited to 'openbsc/src/gsm_data.c') diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index a6b060c2d..a951821fe 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -1,4 +1,4 @@ -/* (C) 2008-2009 by Harald Welte +/* (C) 2008-2010 by Harald Welte * * All Rights Reserved * @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -435,59 +436,6 @@ struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac, return NULL; } -char *gsm_band_name(enum gsm_band band) -{ - switch (band) { - case GSM_BAND_450: - return "GSM450"; - case GSM_BAND_480: - return "GSM450"; - case GSM_BAND_750: - return "GSM750"; - case GSM_BAND_810: - return "GSM810"; - case GSM_BAND_850: - return "GSM850"; - case GSM_BAND_900: - return "GSM900"; - case GSM_BAND_1800: - return "DCS1800"; - case GSM_BAND_1900: - return "PCS1900"; - } - return "invalid"; -} - -enum gsm_band gsm_band_parse(const char* mhz) -{ - while (*mhz && !isdigit(*mhz)) - mhz++; - - if (*mhz == '\0') - return -EINVAL; - - switch (atoi(mhz)) { - case 450: - return GSM_BAND_450; - case 480: - return GSM_BAND_480; - case 750: - return GSM_BAND_750; - case 810: - return GSM_BAND_810; - case 850: - return GSM_BAND_850; - case 900: - return GSM_BAND_900; - case 1800: - return GSM_BAND_1800; - case 1900: - return GSM_BAND_1900; - default: - return -EINVAL; - } -} - static const char *gsm_auth_policy_names[] = { [GSM_AUTH_POLICY_CLOSED] = "closed", [GSM_AUTH_POLICY_ACCEPT_ALL] = "accept-all", -- cgit v1.2.3