aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2009-06-10 10:48:14 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2009-06-10 10:48:14 +0200
commit500f3ca19dfe4eba2d20e3a6d68fdb32b93e17a5 (patch)
tree1db3e4c7f843424d53bd4e105931316353ccbaf6 /openbsc
parente91f57879d4f6f919c56c28316e6ac7e75b91e13 (diff)
[o&m] Dispatch a signal for nacked O&M messages
When trying to operate a nanoBTS900 on channels for 1800 or the other way around the "SET BTS ATTRIBUTES" message will be nacked. Dispatch all nacked messages from abis_nm via signals. Handle this in bsc_hack.c, print a small hint and exit the application as this is considered a fatal unrecoverable error (the exit is in the app, so a library can be more robust).
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/signal.h1
-rw-r--r--openbsc/src/abis_nm.c3
-rw-r--r--openbsc/src/bsc_hack.c14
3 files changed, 18 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index 4a583f68..c065f900 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -54,6 +54,7 @@ enum signal_abisip {
enum signal_nm {
S_NM_SW_ACTIV_REP, /* GSM 12.21 software activated report */
S_NM_FAIL_REP, /* GSM 12.21 failure event report */
+ S_NM_NACK, /* GSM 12.21 various NM_MT_*_NACK happened */
};
/* SS_LCHAN signals */
diff --git a/openbsc/src/abis_nm.c b/openbsc/src/abis_nm.c
index 74dba237..83e6bbb4 100644
--- a/openbsc/src/abis_nm.c
+++ b/openbsc/src/abis_nm.c
@@ -893,6 +893,9 @@ static int abis_nm_rcvmsg_fom(struct msgb *mb)
nack_cause_name(*TLVP_VAL(&tp, NM_ATT_NACK_CAUSES)));
else
DEBUGPC(DNM, "\n");
+
+ dispatch_signal(SS_NM, S_NM_NACK, (void*) ((long)mt));
+ return 0;
}
#if 0
/* check if last message is to be acked */
diff --git a/openbsc/src/bsc_hack.c b/openbsc/src/bsc_hack.c
index 687be33c..38884079 100644
--- a/openbsc/src/bsc_hack.c
+++ b/openbsc/src/bsc_hack.c
@@ -454,6 +454,18 @@ static int sw_activ_rep(struct msgb *mb)
return 0;
}
+/* Callback function for NACK on the OML NM */
+static int oml_msg_nack(int mt)
+{
+ if (mt == NM_MT_SET_BTS_ATTR_NACK) {
+ fprintf(stderr, "Failed to set BTS attributes. That is fatal. "
+ "Was the bts type and frequency properly specified?\n");
+ exit(-1);
+ }
+
+ return 0;
+}
+
/* Callback function to be called every time we receive a signal from NM */
static int nm_sig_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data)
@@ -461,6 +473,8 @@ static int nm_sig_cb(unsigned int subsys, unsigned int signal,
switch (signal) {
case S_NM_SW_ACTIV_REP:
return sw_activ_rep(signal_data);
+ case S_NM_NACK:
+ return oml_msg_nack((int)signal_data);
default:
break;
}