aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-07-29 02:27:27 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-07-29 03:08:47 +0800
commitb6dd348df2837f71a3c482b028e69995937d2693 (patch)
tree0ed4b6f324d40597241a47da4f8812131fadf188
parentb43e2afb3eb14107cb6a49231b223bbb8ea37f2e (diff)
bsc_msc_rf: Add a grace command, send a signal
-rw-r--r--openbsc/include/openbsc/signal.h12
-rw-r--r--openbsc/src/bsc_msc_rf.c15
2 files changed, 27 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index fcc69186d..dbf15d499 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -43,6 +43,7 @@ enum signal_subsystems {
SS_SCALL,
SS_GLOBAL,
SS_CHALLOC,
+ SS_RF,
};
/* SS_PAGING signals */
@@ -118,6 +119,13 @@ enum signal_global {
S_GLOBAL_SHUTDOWN,
};
+/* SS_RF signals */
+enum signal_rf {
+ S_RF_OFF,
+ S_RF_ON,
+ S_RF_GRACE,
+};
+
struct paging_signal_data {
struct gsm_subscriber *subscr;
struct gsm_bts *bts;
@@ -143,4 +151,8 @@ struct challoc_signal_data {
enum gsm_chan_t type;
};
+struct rf_signal_data {
+ struct gsm_network *net;
+};
+
#endif
diff --git a/openbsc/src/bsc_msc_rf.c b/openbsc/src/bsc_msc_rf.c
index 9822ef73a..f85cc6567 100644
--- a/openbsc/src/bsc_msc_rf.c
+++ b/openbsc/src/bsc_msc_rf.c
@@ -24,6 +24,7 @@
#include <openbsc/bsc_msc_rf.h>
#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
+#include <openbsc/signal.h>
#include <osmocore/talloc.h>
#include <osmocore/protocol/gsm_12_21.h>
@@ -37,6 +38,7 @@
#define RF_CMD_QUERY '?'
#define RF_CMD_OFF '0'
#define RF_CMD_ON '1'
+#define RF_CMD_GRACE 'g'
static int lock_each_trx(struct gsm_network *net, int lock)
{
@@ -90,6 +92,14 @@ static void handle_query(struct bsc_msc_rf_conn *conn)
return;
}
+static void send_signal(struct bsc_msc_rf_conn *conn, int val)
+{
+ struct rf_signal_data sig;
+ sig.net = conn->gsm_network;
+
+ dispatch_signal(SS_RF, val, &sig);
+}
+
static int rf_read_cmd(struct bsc_fd *fd)
{
struct bsc_msc_rf_conn *conn = fd->data;
@@ -112,9 +122,14 @@ static int rf_read_cmd(struct bsc_fd *fd)
break;
case RF_CMD_OFF:
lock_each_trx(conn->gsm_network, 1);
+ send_signal(conn, S_RF_OFF);
break;
case RF_CMD_ON:
lock_each_trx(conn->gsm_network, 0);
+ send_signal(conn, S_RF_ON);
+ break;
+ case RF_CMD_GRACE:
+ send_signal(conn, S_RF_GRACE);
break;
default:
LOGP(DINP, LOGL_ERROR, "Unknown command %d\n", buf[0]);