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 02:41:38 +0800
commit12b917d8390c4f8004beda1a465f93509323a058 (patch)
tree263deebd29f217324a548c0903201e2f54ade285
parentd0c32295903bf29206c8cb25ed3d9847b71a413b (diff)
osmo_bsc_rf: Add a grace command, send a signal
-rw-r--r--openbsc/include/openbsc/signal.h12
-rw-r--r--openbsc/src/bsc/osmo_bsc_rf.c15
2 files changed, 27 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index 49ae37402..9c9d64573 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -44,6 +44,7 @@ enum signal_subsystems {
SS_CHALLOC,
SS_NS,
SS_IPAC_NWL,
+ SS_RF,
};
/* SS_PAGING signals */
@@ -124,6 +125,13 @@ enum signal_global {
S_GLOBAL_SHUTDOWN,
};
+/* SS_RF signals */
+enum signal_rf {
+ S_RF_OFF,
+ S_RF_ON,
+ S_RF_GRACE,
+};
+
struct gsm_subscriber;
struct paging_signal_data {
@@ -156,6 +164,10 @@ struct challoc_signal_data {
enum gsm_chan_t type;
};
+struct rf_signal_data {
+ struct gsm_network *net;
+};
+
enum signal_ns {
S_NS_RESET,
S_NS_BLOCK,
diff --git a/openbsc/src/bsc/osmo_bsc_rf.c b/openbsc/src/bsc/osmo_bsc_rf.c
index 8cfbb7c43..e45474ccb 100644
--- a/openbsc/src/bsc/osmo_bsc_rf.c
+++ b/openbsc/src/bsc/osmo_bsc_rf.c
@@ -24,6 +24,7 @@
#include <openbsc/osmo_bsc_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 osmo_bsc_rf_conn *conn)
return;
}
+static void send_signal(struct osmo_bsc_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 osmo_bsc_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]);