aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-05-12 16:44:01 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-05-12 17:16:18 +0800
commite75eb4ca25590b85e607dcc7a9c013d66613e9c3 (patch)
treeafc6b398f7c86e9f07ffa55c9847d7eda2fe17d7
parent566737a4b8ea5ed5e51c8af3c2f08469598161be (diff)
ipaccess: Wait for the BASEBAND_TRANSCEIVER and then bootstrap OML
Currently we are connecting to the BTS and once the OML is established we are bootstrapping the OML. This does not work for a multi TRX setup as we will need to use a trx_nr != 0 for it. Change the code to wait for a message (in this case NM OC_BASEBAND_TRANSC) to detect the trx_nr used by the BTS and then use that TRX to bootstrap the network. I have tested setting the unit id on a single and multi trx system for the first and second trx.
-rw-r--r--openbsc/src/ipaccess/ipaccess-config.c33
1 files changed, 16 insertions, 17 deletions
diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c
index 28173afcb..046460530 100644
--- a/openbsc/src/ipaccess/ipaccess-config.c
+++ b/openbsc/src/ipaccess/ipaccess-config.c
@@ -1,8 +1,8 @@
/* ip.access nanoBTS configuration tool */
/* (C) 2009 by Harald Welte <laforge@gnumonks.org>
- * (C) 2009 by Holger Hans Peter Freyther
- * (C) 2009 by On Waves
+ * (C) 2009,2010 by Holger Hans Peter Freyther
+ * (C) 2009,2010 by On Waves
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
@@ -59,7 +59,7 @@ static int sw_load_state = 0;
static int oml_state = 0;
static int dump_files = 0;
static char *firmware_analysis = NULL;
-static int trx_nr = 0;
+static int found_trx = 0;
struct sw_load {
u_int8_t file_id[255];
@@ -299,13 +299,14 @@ static int swload_cbfn(unsigned int hook, unsigned int event, struct msgb *_msg,
return 0;
}
-static void bootstrap_om(struct gsm_bts *bts)
+static void bootstrap_om(struct gsm_bts_trx *trx)
{
int len;
static u_int8_t buf[1024];
u_int8_t *cur = buf;
+ struct gsm_bts *bts = trx->bts;
- printf("OML link established\n");
+ printf("OML link established using TRX %d\n", trx->nr);
if (unit_id) {
len = strlen(unit_id);
@@ -317,8 +318,7 @@ static void bootstrap_om(struct gsm_bts *bts)
memcpy(buf+3, unit_id, len);
buf[3+len] = 0;
printf("setting Unit ID to '%s'\n", unit_id);
- abis_nm_ipaccess_set_nvattr(gsm_bts_trx_by_nr(bts, trx_nr),
- buf, 3+len+1);
+ abis_nm_ipaccess_set_nvattr(trx, buf, 3+len+1);
}
if (prim_oml_ip) {
struct in_addr ia;
@@ -356,8 +356,7 @@ static void bootstrap_om(struct gsm_bts *bts)
*cur++ = nv_mask >> 8;
printf("setting NV Flags/Mask to 0x%04x/0x%04x\n",
nv_flags, nv_mask);
- abis_nm_ipaccess_set_nvattr(gsm_bts_trx_by_nr(bts, trx_nr),
- buf, 3+len);
+ abis_nm_ipaccess_set_nvattr(trx, buf, 3+len);
}
if (restart && !prim_oml_ip && !software) {
@@ -373,7 +372,6 @@ void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
case EVT_E1_TEI_UP:
switch (type) {
case E1INP_SIGN_OML:
- bootstrap_om(trx->bts);
break;
case E1INP_SIGN_RSL:
/* FIXME */
@@ -395,7 +393,13 @@ int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
struct gsm_nm_state *old_state, struct gsm_nm_state *new_state,
struct abis_om_obj_inst *obj_inst)
{
- if (evt == EVT_STATECHG_OPER &&
+ if (obj_class == NM_OC_BASEB_TRANSC) {
+ if (!found_trx && obj_inst->trx_nr != 0xff) {
+ struct gsm_bts_trx *trx = container_of(obj, struct gsm_bts_trx, bb_transc);
+ bootstrap_om(trx);
+ found_trx = 1;
+ }
+ } else if (evt == EVT_STATECHG_OPER &&
obj_class == NM_OC_RADIO_CARRIER &&
new_state->availability == 3) {
struct gsm_bts_trx *trx = obj;
@@ -609,7 +613,6 @@ static void print_help(void)
printf(" -d --software firmware\n");
printf(" -f --firmware firmware Provide firmware information\n");
printf(" -w --write-firmware. This will dump the firmware parts to the filesystem. Use with -f.\n");
- printf(" -t --trx NR. The TRX to use for the Unit ID and NVRAM attributes.\n");
}
int main(int argc, char **argv)
@@ -644,11 +647,10 @@ int main(int argc, char **argv)
{ "software", 1, 0, 'd' },
{ "firmware", 1, 0, 'f' },
{ "write-firmware", 0, 0, 'w' },
- { "trx", 1, 0, 't' },
{ 0, 0, 0, 0 },
};
- c = getopt_long(argc, argv, "u:o:rn:l:hs:d:f:wt:", long_options,
+ c = getopt_long(argc, argv, "u:o:rn:l:hs:d:f:w", long_options,
&option_index);
if (c == -1)
@@ -690,9 +692,6 @@ int main(int argc, char **argv)
case 'w':
dump_files = 1;
break;
- case 't':
- trx_nr = atoi(optarg);
- break;
case 'h':
print_usage();
print_help();