From ed0374ffebd502677dedea39ba18ccb95ed4c652 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 17 Aug 2011 17:37:16 +0200 Subject: [PATCH 1/6] bsc: Introduce an authenticated signal for the MSC connection Send the signal whenever a MSC appears to be authenticated. --- openbsc/include/openbsc/signal.h | 1 + openbsc/src/osmo-bsc/osmo_bsc_msc.c | 4 ++++ 2 files changed, 5 insertions(+) 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/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) From baa1a2df2086b1c920053c1aaa6062929f2256e4 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 25 Aug 2011 09:15:40 +0200 Subject: [PATCH 2/6] bsc: Do not re-start the grace timer when we are in the grace period --- openbsc/src/libbsc/bsc_rf_ctrl.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openbsc/src/libbsc/bsc_rf_ctrl.c b/openbsc/src/libbsc/bsc_rf_ctrl.c index 2f39f4346..2744666b7 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); From 7b6ea56f4185a7c11b7ba50ee373854ca2074368 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 16 Aug 2011 14:29:53 +0200 Subject: [PATCH 3/6] bsc: Use the BSC RF CTRL to change the RF state of the TRXs Use the delayed scheduling feature of the osmo_bsc_rf class to avoid crashing the site controller of the nanoBTS. --- openbsc/include/openbsc/osmo_bsc_rf.h | 1 + openbsc/src/libbsc/bsc_rf_ctrl.c | 10 +++++++--- openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 12 ++++++------ 3 files changed, 14 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/src/libbsc/bsc_rf_ctrl.c b/openbsc/src/libbsc/bsc_rf_ctrl.c index 2744666b7..89a0246b0 100644 --- a/openbsc/src/libbsc/bsc_rf_ctrl.c +++ b/openbsc/src/libbsc/bsc_rf_ctrl.c @@ -303,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"; @@ -449,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..6802b4252 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -388,19 +388,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 not enabled"; + 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."; From 23446844a8884dace5982e86e5c1e5562b9e4049 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 16 Aug 2011 20:10:40 +0200 Subject: [PATCH 4/6] bsc: Send a TRAP with the locations on a MSC connection Send the current position when the MSC connection is established. --- openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 6802b4252..96e727e58 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 + * (C) 2011 by Holger Hans Peter Freyther * (C) 2011 by On-Waves * All Rights Reserved * @@ -420,6 +421,42 @@ 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 ctrl_cmd *cmd; + struct msc_signal_data *msc; + struct gsm_network *net; + struct gsm_bts *bts; + char *loc_fmt = "net.bts.%i.location"; + + if (subsys != SS_MSC) + return 0; + if (signal != S_MSC_AUTHENTICATED) + return 0; + + msc = signal_data; + cmd = ctrl_cmd_create(msc->data, CTRL_TYPE_TRAP); + if (!cmd) { + LOGP(DCTRL, LOGL_ERROR, "Failed to create TRAP for location.\n"); + return 0; + } + + cmd->id = "0"; + + net = msc->data->network; + llist_for_each_entry(bts, &net->bts_list, list) { + cmd->node = bts; + cmd->variable = talloc_asprintf(cmd, loc_fmt, bts->nr); + get_bts_loc(cmd, NULL); + osmo_bsc_send_trap(cmd, msc->data->msc_con); + talloc_free(cmd->variable); + } + + talloc_free(cmd); + return 0; +} + int bsc_ctrl_cmds_install(struct gsm_network *net) { int rc; @@ -434,12 +471,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; } From 25eca0bfdccf56ce5e25d9c9c8f05f16f1984086 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 22 Aug 2011 23:29:00 +0200 Subject: [PATCH 5/6] bsc: Simplify the trap sending by using the location state method --- openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 96e727e58..40658c11b 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -424,11 +424,9 @@ static int verify_net_rf_lock(struct ctrl_cmd *cmd, const char *value, void *dat static int msc_signal_handler(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data) { - struct ctrl_cmd *cmd; struct msc_signal_data *msc; struct gsm_network *net; struct gsm_bts *bts; - char *loc_fmt = "net.bts.%i.location"; if (subsys != SS_MSC) return 0; @@ -436,24 +434,11 @@ static int msc_signal_handler(unsigned int subsys, unsigned int signal, return 0; msc = signal_data; - cmd = ctrl_cmd_create(msc->data, CTRL_TYPE_TRAP); - if (!cmd) { - LOGP(DCTRL, LOGL_ERROR, "Failed to create TRAP for location.\n"); - return 0; - } - - cmd->id = "0"; net = msc->data->network; - llist_for_each_entry(bts, &net->bts_list, list) { - cmd->node = bts; - cmd->variable = talloc_asprintf(cmd, loc_fmt, bts->nr); - get_bts_loc(cmd, NULL); - osmo_bsc_send_trap(cmd, msc->data->msc_con); - talloc_free(cmd->variable); - } + llist_for_each_entry(bts, &net->bts_list, list) + generate_location_state_trap(bts, msc->data->msc_con); - talloc_free(cmd); return 0; } From 431ceada365a0979897153f62d0ed379618c8082 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 19 Nov 2011 22:56:12 +0100 Subject: [PATCH 6/6] bsc: Create a better error message for when RF commands are rejected Provide an error message that makes it more clear that the command is rejected because RF handling is not enabled in the BSC. --- openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 40658c11b..e4c6fea1b 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -395,7 +395,7 @@ static int set_net_rf_lock(struct ctrl_cmd *cmd, void *data) } if (!net->bsc_data->rf_ctrl) { - cmd->reply = "RF Ctrl not enabled"; + cmd->reply = "RF Ctrl is not enabled in the BSC Configuration"; return CTRL_CMD_ERROR; }