mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-11-03 21:43:32 +00:00 
			
		
		
		
	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:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user