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_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); 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); 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 #endif

View File

@@ -219,6 +219,7 @@ struct lchan_signal_data {
enum signal_msc { enum signal_msc {
S_MSC_LOST, S_MSC_LOST,
S_MSC_CONNECTED, S_MSC_CONNECTED,
S_MSC_AUTHENTICATED,
}; };
struct osmo_msc_data; 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) 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.cb = grace_timeout;
rf->grace_timeout.data = rf; rf->grace_timeout.data = rf;
osmo_timer_schedule(&rf->grace_timeout, rf->gsm_network->bsc_data->mid_call_timeout, 0); 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_D_OFF:
case RF_CMD_ON: case RF_CMD_ON:
case RF_CMD_OFF: case RF_CMD_OFF:
conn->rf->last_request = buf[0]; osmo_bsc_rf_schedule_lock(conn->rf, buf[0]);
if (!osmo_timer_pending(&conn->rf->delay_cmd))
osmo_timer_schedule(&conn->rf->delay_cmd, 1, 0);
break; break;
default: default:
conn->rf->last_state_command = "Unknown command"; 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; 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 Daniel Willmann <daniel@totalueberwachung.de>
* (C) 2011 by Holger Hans Peter Freyther
* (C) 2011 by On-Waves * (C) 2011 by On-Waves
* All Rights Reserved * All Rights Reserved
* *
@@ -388,19 +389,19 @@ static int set_net_rf_lock(struct ctrl_cmd *cmd, void *data)
{ {
int locked = atoi(cmd->value); int locked = atoi(cmd->value);
struct gsm_network *net = cmd->node; struct gsm_network *net = cmd->node;
struct gsm_bts *bts;
if (!net) { if (!net) {
cmd->reply = "net not found."; cmd->reply = "net not found.";
return CTRL_CMD_ERROR; return CTRL_CMD_ERROR;
} }
llist_for_each_entry(bts, &net->bts_list, list) { if (!net->bsc_data->rf_ctrl) {
struct gsm_bts_trx *trx; cmd->reply = "RF Ctrl is not enabled in the BSC Configuration";
llist_for_each_entry(trx, &bts->trx_list, list) { return CTRL_CMD_ERROR;
gsm_trx_lock_rf(trx, locked);
}
} }
osmo_bsc_rf_schedule_lock(net->bsc_data->rf_ctrl,
locked == 1 ? '0' : '1');
cmd->reply = talloc_asprintf(cmd, "%u", locked); cmd->reply = talloc_asprintf(cmd, "%u", locked);
if (!cmd->reply) { if (!cmd->reply) {
cmd->reply = "OOM."; cmd->reply = "OOM.";
@@ -420,6 +421,27 @@ static int verify_net_rf_lock(struct ctrl_cmd *cmd, const char *value, void *dat
return 0; 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 bsc_ctrl_cmds_install(struct gsm_network *net)
{ {
int rc; int rc;
@@ -434,12 +456,16 @@ int bsc_ctrl_cmds_install(struct gsm_network *net)
if (rc) if (rc)
goto end; goto end;
rc = osmo_signal_register_handler(SS_MSC, &msc_connection_status_trap_cb, 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) if (rc)
goto end; goto end;
rc = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_bts_connection_status); rc = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_bts_connection_status);
if (rc) if (rc)
goto end; goto end;
rc = osmo_signal_register_handler(SS_L_INPUT, &bts_connection_status_trap_cb, net); rc = osmo_signal_register_handler(SS_L_INPUT, &bts_connection_status_trap_cb, net);
end: end:
return rc; 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) static void send_id_get_response(struct osmo_msc_data *data, int fd)
{ {
struct msc_signal_data sig;
struct msgb *msg; struct msgb *msg;
msg = bsc_msc_id_get_resp(data->bsc_token); msg = bsc_msc_id_get_resp(data->bsc_token);
if (!msg) if (!msg)
return; return;
msc_queue_write(data->msc_con, msg, IPAC_PROTO_IPACCESS); 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) int osmo_bsc_msc_init(struct osmo_msc_data *data)