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.
This commit is contained in:
Holger Hans Peter Freyther
2013-01-15 11:33:00 +01:00
5 changed files with 50 additions and 9 deletions

View File

@@ -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

View File

@@ -219,6 +219,7 @@ struct lchan_signal_data {
enum signal_msc {
S_MSC_LOST,
S_MSC_CONNECTED,
S_MSC_AUTHENTICATED,
};
struct osmo_msc_data;

View File

@@ -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);
}

View File

@@ -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;
@@ -434,12 +456,16 @@ int bsc_ctrl_cmds_install(struct gsm_network *net)
if (rc)
goto end;
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;
}

View File

@@ -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)