diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-01-15 11:33:00 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-01-15 11:33:00 +0100 |
commit | c7de8ef0141c5df73c0fcff976b288e9dfd1f241 (patch) | |
tree | 58e0fc0c504b9f0f965016420e14dc6fa698b223 | |
parent | ba36bf4c5d78bb1469d259dfae958496d96ae48c (diff) | |
parent | 431ceada365a0979897153f62d0ed379618c8082 (diff) |
Merge branch 'zecke/feature/location-control'
Merge the code from the On-Waves branch. Use the internal RF control
interface to switch the TRXs on/off. This code has the necessary delays
to not crash the nanoBTS. Introduce signals for re-connection of the
BSC on the A-link.
-rw-r--r-- | openbsc/include/openbsc/osmo_bsc_rf.h | 1 | ||||
-rw-r--r-- | openbsc/include/openbsc/signal.h | 1 | ||||
-rw-r--r-- | openbsc/src/libbsc/bsc_rf_ctrl.c | 15 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 38 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_msc.c | 4 |
5 files changed, 50 insertions, 9 deletions
diff --git a/openbsc/include/openbsc/osmo_bsc_rf.h b/openbsc/include/openbsc/osmo_bsc_rf.h index d3e2caba4..c0ab6b251 100644 --- a/openbsc/include/openbsc/osmo_bsc_rf.h +++ b/openbsc/include/openbsc/osmo_bsc_rf.h @@ -56,5 +56,6 @@ enum osmo_bsc_rf_opstate osmo_bsc_rf_get_opstate_by_bts(struct gsm_bts *bts); enum osmo_bsc_rf_adminstate osmo_bsc_rf_get_adminstate_by_bts(struct gsm_bts *bts); enum osmo_bsc_rf_policy osmo_bsc_rf_get_policy_by_bts(struct gsm_bts *bts); struct osmo_bsc_rf *osmo_bsc_rf_create(const char *path, struct gsm_network *net); +void osmo_bsc_rf_schedule_lock(struct osmo_bsc_rf *rf, char cmd); #endif diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h index fd13ac719..39319f1c9 100644 --- a/openbsc/include/openbsc/signal.h +++ b/openbsc/include/openbsc/signal.h @@ -219,6 +219,7 @@ struct lchan_signal_data { enum signal_msc { S_MSC_LOST, S_MSC_CONNECTED, + S_MSC_AUTHENTICATED, }; struct osmo_msc_data; diff --git a/openbsc/src/libbsc/bsc_rf_ctrl.c b/openbsc/src/libbsc/bsc_rf_ctrl.c index 2f39f4346..89a0246b0 100644 --- a/openbsc/src/libbsc/bsc_rf_ctrl.c +++ b/openbsc/src/libbsc/bsc_rf_ctrl.c @@ -239,6 +239,11 @@ static void grace_timeout(void *_data) static int enter_grace(struct osmo_bsc_rf *rf) { + if (osmo_timer_pending(&rf->grace_timeout)) { + LOGP(DLINP, LOGL_NOTICE, "RF Grace timer is pending. Not restarting.\n"); + return 0; + } + rf->grace_timeout.cb = grace_timeout; rf->grace_timeout.data = rf; osmo_timer_schedule(&rf->grace_timeout, rf->gsm_network->bsc_data->mid_call_timeout, 0); @@ -298,9 +303,7 @@ static int rf_read_cmd(struct osmo_fd *fd) case RF_CMD_D_OFF: case RF_CMD_ON: case RF_CMD_OFF: - conn->rf->last_request = buf[0]; - if (!osmo_timer_pending(&conn->rf->delay_cmd)) - osmo_timer_schedule(&conn->rf->delay_cmd, 1, 0); + osmo_bsc_rf_schedule_lock(conn->rf, buf[0]); break; default: conn->rf->last_state_command = "Unknown command"; @@ -444,3 +447,9 @@ struct osmo_bsc_rf *osmo_bsc_rf_create(const char *path, struct gsm_network *net return rf; } +void osmo_bsc_rf_schedule_lock(struct osmo_bsc_rf *rf, char cmd) +{ + rf->last_request = cmd; + if (!osmo_timer_pending(&rf->delay_cmd)) + osmo_timer_schedule(&rf->delay_cmd, 1, 0); +} diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 8f0db7e88..e4c6fea1b 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -1,4 +1,5 @@ /* (C) 2011 by Daniel Willmann <daniel@totalueberwachung.de> + * (C) 2011 by Holger Hans Peter Freyther * (C) 2011 by On-Waves * All Rights Reserved * @@ -388,19 +389,19 @@ static int set_net_rf_lock(struct ctrl_cmd *cmd, void *data) { int locked = atoi(cmd->value); struct gsm_network *net = cmd->node; - struct gsm_bts *bts; if (!net) { cmd->reply = "net not found."; return CTRL_CMD_ERROR; } - llist_for_each_entry(bts, &net->bts_list, list) { - struct gsm_bts_trx *trx; - llist_for_each_entry(trx, &bts->trx_list, list) { - gsm_trx_lock_rf(trx, locked); - } + if (!net->bsc_data->rf_ctrl) { + cmd->reply = "RF Ctrl is not enabled in the BSC Configuration"; + return CTRL_CMD_ERROR; } + osmo_bsc_rf_schedule_lock(net->bsc_data->rf_ctrl, + locked == 1 ? '0' : '1'); + cmd->reply = talloc_asprintf(cmd, "%u", locked); if (!cmd->reply) { cmd->reply = "OOM."; @@ -420,6 +421,27 @@ static int verify_net_rf_lock(struct ctrl_cmd *cmd, const char *value, void *dat return 0; } +static int msc_signal_handler(unsigned int subsys, unsigned int signal, + void *handler_data, void *signal_data) +{ + struct msc_signal_data *msc; + struct gsm_network *net; + struct gsm_bts *bts; + + if (subsys != SS_MSC) + return 0; + if (signal != S_MSC_AUTHENTICATED) + return 0; + + msc = signal_data; + + net = msc->data->network; + llist_for_each_entry(bts, &net->bts_list, list) + generate_location_state_trap(bts, msc->data->msc_con); + + return 0; +} + int bsc_ctrl_cmds_install(struct gsm_network *net) { int rc; @@ -436,10 +458,14 @@ int bsc_ctrl_cmds_install(struct gsm_network *net) rc = osmo_signal_register_handler(SS_MSC, &msc_connection_status_trap_cb, net); if (rc) goto end; + rc = osmo_signal_register_handler(SS_MSC, msc_signal_handler, NULL); + if (rc) + goto end; rc = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_bts_connection_status); if (rc) goto end; rc = osmo_signal_register_handler(SS_L_INPUT, &bts_connection_status_trap_cb, net); + end: return rc; } diff --git a/openbsc/src/osmo-bsc/osmo_bsc_msc.c b/openbsc/src/osmo-bsc/osmo_bsc_msc.c index a97968175..5517d3080 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_msc.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_msc.c @@ -422,12 +422,16 @@ static void initialize_if_needed(struct bsc_msc_connection *conn) static void send_id_get_response(struct osmo_msc_data *data, int fd) { + struct msc_signal_data sig; struct msgb *msg; msg = bsc_msc_id_get_resp(data->bsc_token); if (!msg) return; msc_queue_write(data->msc_con, msg, IPAC_PROTO_IPACCESS); + + sig.data = data; + osmo_signal_dispatch(SS_MSC, S_MSC_AUTHENTICATED, &sig); } int osmo_bsc_msc_init(struct osmo_msc_data *data) |