osmo_bsc_rf: Add a grace command, send a signal
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index 49ae374..9c9d645 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -44,6 +44,7 @@
 	SS_CHALLOC,
 	SS_NS,
 	SS_IPAC_NWL,
+	SS_RF,
 };
 
 /* SS_PAGING signals */
@@ -124,6 +125,13 @@
 	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 @@
 	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 8cfbb7c..e45474c 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 @@
 	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 @@
 		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]);