aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-07-29 19:01:43 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-07-29 19:11:06 +0800
commit0dcacda1943591be9785cd5ea9063519a600cb9f (patch)
tree606829ba294858e2d1dc311b1389acfb84bfcac0 /openbsc
parent1a9ffe85ebd40264ff69cf70ab50e89c9877241e (diff)
osmo_rf: Keep the current policy inside the RF struct..
Keep a back pointer to the rf struct inside the connection, resolve the network through the back pointer. Also assume that the RF is on. In case we start with RF locked, the policy is on but we will not see any MS talking to us.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/bsc_msc_rf.h4
-rw-r--r--openbsc/src/bsc_msc_rf.c12
2 files changed, 10 insertions, 6 deletions
diff --git a/openbsc/include/openbsc/bsc_msc_rf.h b/openbsc/include/openbsc/bsc_msc_rf.h
index 2d611c59b..f72309923 100644
--- a/openbsc/include/openbsc/bsc_msc_rf.h
+++ b/openbsc/include/openbsc/bsc_msc_rf.h
@@ -6,13 +6,15 @@
struct gsm_network;
struct bsc_msc_rf {
+ /* the value of signal.h */
+ int policy;
struct bsc_fd listen;
struct gsm_network *gsm_network;
};
struct bsc_msc_rf_conn {
struct write_queue queue;
- struct gsm_network *gsm_network;
+ struct bsc_msc_rf *rf;
};
struct bsc_msc_rf *bsc_msc_rf_create(const char *path, struct gsm_network *net);
diff --git a/openbsc/src/bsc_msc_rf.c b/openbsc/src/bsc_msc_rf.c
index f85cc6567..b6901cc53 100644
--- a/openbsc/src/bsc_msc_rf.c
+++ b/openbsc/src/bsc_msc_rf.c
@@ -63,7 +63,7 @@ static void handle_query(struct bsc_msc_rf_conn *conn)
struct gsm_bts *bts;
char send = RF_CMD_OFF;
- llist_for_each_entry(bts, &conn->gsm_network->bts_list, list) {
+ llist_for_each_entry(bts, &conn->rf->gsm_network->bts_list, list) {
struct gsm_bts_trx *trx;
llist_for_each_entry(trx, &bts->trx_list, list) {
if (trx->nm_state.availability == NM_AVSTATE_OK &&
@@ -95,8 +95,9 @@ static void handle_query(struct bsc_msc_rf_conn *conn)
static void send_signal(struct bsc_msc_rf_conn *conn, int val)
{
struct rf_signal_data sig;
- sig.net = conn->gsm_network;
+ sig.net = conn->rf->gsm_network;
+ conn->rf->policy = val;
dispatch_signal(SS_RF, val, &sig);
}
@@ -121,11 +122,11 @@ static int rf_read_cmd(struct bsc_fd *fd)
handle_query(conn);
break;
case RF_CMD_OFF:
- lock_each_trx(conn->gsm_network, 1);
+ lock_each_trx(conn->rf->gsm_network, 1);
send_signal(conn, S_RF_OFF);
break;
case RF_CMD_ON:
- lock_each_trx(conn->gsm_network, 0);
+ lock_each_trx(conn->rf->gsm_network, 0);
send_signal(conn, S_RF_ON);
break;
case RF_CMD_GRACE:
@@ -180,7 +181,7 @@ static int rf_ctl_accept(struct bsc_fd *bfd, unsigned int what)
conn->queue.bfd.when = BSC_FD_READ | BSC_FD_WRITE;
conn->queue.read_cb = rf_read_cmd;
conn->queue.write_cb = rf_write_cmd;
- conn->gsm_network = rf->gsm_network;
+ conn->rf = rf;
if (bsc_register_fd(&conn->queue.bfd) != 0) {
close(fd);
@@ -258,6 +259,7 @@ struct bsc_msc_rf *bsc_msc_rf_create(const char *path, struct gsm_network *net)
}
rf->gsm_network = net;
+ rf->policy = S_RF_ON;
return rf;
}