add signal handlers for clean shutdown of BTS via OML on shutdown of program
diff --git a/src/bsc_hack.c b/src/bsc_hack.c
index e2746e3..dba7933 100644
--- a/src/bsc_hack.c
+++ b/src/bsc_hack.c
@@ -26,6 +26,7 @@
#include <time.h>
#include <string.h>
#include <errno.h>
+#include <signal.h>
#define _GNU_SOURCE
#include <getopt.h>
@@ -348,7 +349,35 @@
abis_nm_event_reports(bts, 1);
}
+static int shutdown_om(struct gsm_bts *bts)
+{
+ /* stop sending event reports */
+ abis_nm_event_reports(bts, 0);
+ /* begin DB transmission */
+ abis_nm_db_transmission(bts, 1);
+
+ /* end DB transmission */
+ abis_nm_db_transmission(bts, 0);
+
+ /* Reset BTS Site manager resource */
+ abis_nm_reset_resource(bts);
+
+ return 0;
+}
+
+static int shutdown_net(struct gsm_network *net)
+{
+ int i;
+ for (i = 0; i < net->num_bts; i++) {
+ int rc;
+ rc = shutdown_om(&net->bts[i]);
+ if (rc < 0)
+ return rc;
+ }
+
+ return 0;
+}
struct bcch_info {
u_int8_t type;
@@ -918,6 +947,20 @@
pag_timer_cb(0);
}
+static void signal_handler(int signal)
+{
+ fprintf(stdout, "signal %u received\n", signal);
+
+ switch (signal) {
+ case SIGHUP:
+ case SIGABRT:
+ shutdown_net(gsmnet);
+ break;
+ default:
+ break;
+ }
+}
+
int main(int argc, char **argv)
{
/* parse options */
@@ -937,6 +980,9 @@
bootstrap_network();
+ signal(SIGHUP, &signal_handler);
+ signal(SIGABRT, &signal_handler);
+
while (1) {
bsc_select_main();
}