[PATCH] osmo-bts[master]: Get rid of 'struct gsm_bts_role_bts'

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Sat Mar 17 11:26:09 UTC 2018


Review at  https://gerrit.osmocom.org/7337

Get rid of 'struct gsm_bts_role_bts'

gsm_bts_role_bts was introduced at a time when we still shared
gsm_data_shared.[ch] between BSC and BTS, and where we then subsequently
needed a BTS-private structure.  Since that sharing was abandoned quite
some time ago, we can merge gsm_bts_role_bts into gsm_bts and do away
with the bts/btsb dualism in a lot of the code.

Change-Id: I4fdd601ea873d9697f89a748cc77bcf7c978fa3e
---
M include/osmo-bts/gsm_data.h
M include/osmo-bts/gsm_data_shared.h
M include/osmo-bts/paging.h
M src/common/abis.c
M src/common/bts.c
M src/common/cbch.c
M src/common/handover.c
M src/common/l1sap.c
M src/common/load_indication.c
M src/common/main.c
M src/common/oml.c
M src/common/paging.c
M src/common/pcu_sock.c
M src/common/power_control.c
M src/common/rsl.c
M src/common/sysinfo.c
M src/common/vty.c
M src/osmo-bts-litecell15/l1_if.c
M src/osmo-bts-litecell15/main.c
M src/osmo-bts-litecell15/oml.c
M src/osmo-bts-litecell15/utils.c
M src/osmo-bts-octphy/l1_if.c
M src/osmo-bts-sysmo/l1_if.c
M src/osmo-bts-sysmo/main.c
M src/osmo-bts-sysmo/oml.c
M src/osmo-bts-sysmo/sysmobts_vty.c
M src/osmo-bts-sysmo/utils.c
M src/osmo-bts-trx/main.c
M src/osmo-bts-virtual/main.c
M src/osmo-bts-virtual/scheduler_virtbts.c
M tests/agch/agch_test.c
M tests/cipher/cipher_test.c
M tests/handover/handover_test.c
M tests/paging/paging_test.c
M tests/power/power_test.c
M tests/sysmobts/sysmobts_test.c
36 files changed, 371 insertions(+), 477 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/37/7337/1

diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index 31879b9..9e62cdf 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -24,107 +24,11 @@
 #define GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT 41
 #define GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT 91
 
-struct pcu_sock_state;
-struct smscb_msg;
-
 struct gsm_network {
 	struct llist_head bts_list;
 	unsigned int num_bts;
 	struct osmo_plmn_id plmn;
 	struct pcu_sock_state *pcu_state;
-};
-
-/* data structure for BTS related data specific to the BTS role */
-struct gsm_bts_role_bts {
-	struct gsm_bts *bts;
-	struct {
-		/* Interference Boundaries for OML */
-		int16_t boundary[6];
-		uint8_t intave;
-	} interference;
-	unsigned int t200_ms[7];
-	unsigned int t3105_ms;
-	struct {
-		uint8_t overload_period;
-		struct {
-			/* Input parameters from OML */
-			uint8_t load_ind_thresh;	/* percent */
-			uint8_t load_ind_period;	/* seconds */
-			/* Internal data */
-			struct osmo_timer_list timer;
-			unsigned int pch_total;
-			unsigned int pch_used;
-		} ccch;
-		struct {
-			/* Input parameters from OML */
-			int16_t busy_thresh;		/* in dBm */
-			uint16_t averaging_slots;
-			/* Internal data */
-			unsigned int total;	/* total nr */
-			unsigned int busy;	/* above busy_thresh */
-			unsigned int access;	/* access bursts */
-		} rach;
-	} load;
-	uint8_t ny1;
-	uint8_t max_ta;
-
-	/* AGCH queuing */
-	struct {
-		struct llist_head queue;
-		int length;
-		int max_length;
-
-		int thresh_level;	/* Cleanup threshold in percent of max len */
-		int low_level;		/* Low water mark in percent of max len */
-		int high_level;		/* High water mark in percent of max len */
-
-		/* TODO: Use a rate counter group instead */
-		uint64_t dropped_msgs;
-		uint64_t merged_msgs;
-		uint64_t rejected_msgs;
-		uint64_t agch_msgs;
-		uint64_t pch_msgs;
-	} agch_queue;
-
-	struct paging_state *paging_state;
-	char *bsc_oml_host;
-	struct llist_head oml_queue;
-	unsigned int rtp_jitter_buf_ms;
-	bool rtp_jitter_adaptive;
-	struct {
-		uint8_t ciphers;	/* flags A5/1==0x1, A5/2==0x2, A5/3==0x4 */
-	} support;
-	struct {
-		uint8_t tc4_ctr;
-	} si;
-	struct gsm_time gsm_time;
-	/* Radio Link Timeout counter. -1 disables timeout for
-	 * lab/measurement purpose */
-	int radio_link_timeout;
-
-	int ul_power_target;		/* Uplink Rx power target */
-
-	/* used by the sysmoBTS to adjust band */
-	uint8_t auto_band;
-
-	struct {
-		struct llist_head queue;	/* list of struct smscb_msg */
-		struct smscb_msg *cur_msg;	/* current SMS-CB */
-	} smscb_state;
-
-	float min_qual_rach;	/* minimum quality for RACH bursts */
-	float min_qual_norm;	/* minimum quality for normal daata */
-	uint16_t max_ber10k_rach;	/* Maximum permitted RACH BER in 0.01% */
-
-	struct {
-		char *sock_path;
-	} pcu;
-
-	struct {
-		uint32_t last_fn;
-		struct timeval tv_clock;
-		struct osmo_timer_list fn_timer;
-	} vbts;
 };
 
 enum lchan_ciph_state {
@@ -136,9 +40,6 @@
 	LCHAN_CIPH_RXTX_CONF,
 };
 
-#define bts_role_bts(x)	((struct gsm_bts_role_bts *)(x)->role)
-#define btsb_bts(x)	(x)->bts
-
 #include <osmo-bts/gsm_data_shared.h>
 
 void lchan_set_state(struct gsm_lchan *lchan, enum gsm_lchan_state state);
@@ -148,7 +49,7 @@
 /* cipher code */
 #define CIPHER_A5(x) (1 << (x-1))
 
-int bts_supports_cipher(struct gsm_bts_role_bts *bts, int rsl_cipher);
+int bts_supports_cipher(struct gsm_bts *bts, int rsl_cipher);
 
 bool ts_is_pdch(const struct gsm_bts_trx_ts *ts);
 
diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h
index e4ac9b0..b19bc90 100644
--- a/include/osmo-bts/gsm_data_shared.h
+++ b/include/osmo-bts/gsm_data_shared.h
@@ -78,6 +78,8 @@
 
 struct gsm_lchan;
 struct osmo_rtp_socket;
+struct pcu_sock_state;
+struct smscb_msg;
 
 /* Network Management State */
 struct gsm_nm_state {
@@ -626,7 +628,95 @@
 	struct rate_ctr_group *ctrs;
 	bool supp_meas_toa256;
 
-	void *role;
+	struct {
+		/* Interference Boundaries for OML */
+		int16_t boundary[6];
+		uint8_t intave;
+	} interference;
+	unsigned int t200_ms[7];
+	unsigned int t3105_ms;
+	struct {
+		uint8_t overload_period;
+		struct {
+			/* Input parameters from OML */
+			uint8_t load_ind_thresh;	/* percent */
+			uint8_t load_ind_period;	/* seconds */
+			/* Internal data */
+			struct osmo_timer_list timer;
+			unsigned int pch_total;
+			unsigned int pch_used;
+		} ccch;
+		struct {
+			/* Input parameters from OML */
+			int16_t busy_thresh;		/* in dBm */
+			uint16_t averaging_slots;
+			/* Internal data */
+			unsigned int total;	/* total nr */
+			unsigned int busy;	/* above busy_thresh */
+			unsigned int access;	/* access bursts */
+		} rach;
+	} load;
+	uint8_t ny1;
+	uint8_t max_ta;
+
+	/* AGCH queuing */
+	struct {
+		struct llist_head queue;
+		int length;
+		int max_length;
+
+		int thresh_level;	/* Cleanup threshold in percent of max len */
+		int low_level;		/* Low water mark in percent of max len */
+		int high_level;		/* High water mark in percent of max len */
+
+		/* TODO: Use a rate counter group instead */
+		uint64_t dropped_msgs;
+		uint64_t merged_msgs;
+		uint64_t rejected_msgs;
+		uint64_t agch_msgs;
+		uint64_t pch_msgs;
+	} agch_queue;
+
+	struct paging_state *paging_state;
+	char *bsc_oml_host;
+	struct llist_head oml_queue;
+	unsigned int rtp_jitter_buf_ms;
+	bool rtp_jitter_adaptive;
+	struct {
+		uint8_t ciphers;	/* flags A5/1==0x1, A5/2==0x2, A5/3==0x4 */
+	} support;
+	struct {
+		uint8_t tc4_ctr;
+	} si;
+	struct gsm_time gsm_time;
+	/* Radio Link Timeout counter. -1 disables timeout for
+	 * lab/measurement purpose */
+	int radio_link_timeout;
+
+	int ul_power_target;		/* Uplink Rx power target */
+
+	/* used by the sysmoBTS to adjust band */
+	uint8_t auto_band;
+
+	struct {
+		struct llist_head queue;	/* list of struct smscb_msg */
+		struct smscb_msg *cur_msg;	/* current SMS-CB */
+	} smscb_state;
+
+	float min_qual_rach;	/* minimum quality for RACH bursts */
+	float min_qual_norm;	/* minimum quality for normal daata */
+	uint16_t max_ber10k_rach;	/* Maximum permitted RACH BER in 0.01% */
+
+	struct {
+		char *sock_path;
+	} pcu;
+
+	struct {
+		uint32_t last_fn;
+		struct timeval tv_clock;
+		struct osmo_timer_list fn_timer;
+	} vbts;
+
 };
 
 
diff --git a/include/osmo-bts/paging.h b/include/osmo-bts/paging.h
index 38accd7..7fc0bf0 100644
--- a/include/osmo-bts/paging.h
+++ b/include/osmo-bts/paging.h
@@ -6,10 +6,10 @@
 #include <osmocom/gsm/protocol/gsm_04_08.h>
 
 struct paging_state;
-struct gsm_bts_role_bts;
+struct gsm_bts;
 
 /* initialize paging code */
-struct paging_state *paging_init(struct gsm_bts_role_bts *btsb, 
+struct paging_state *paging_init(struct gsm_bts *bts,
 				 unsigned int num_paging_max,
 				 unsigned int paging_lifetime);
 
diff --git a/src/common/abis.c b/src/common/abis.c
index 768d261..6402bdb 100644
--- a/src/common/abis.c
+++ b/src/common/abis.c
@@ -54,10 +54,9 @@
 int abis_oml_sendmsg(struct msgb *msg)
 {
 	struct gsm_bts *bts = msg->trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
 	if (!bts->oml_link) {
-		llist_add_tail(&msg->list, &btsb->oml_queue);
+		llist_add_tail(&msg->list, &bts->oml_queue);
 		return 0;
 	} else {
 		/* osmo-bts uses msg->trx internally, but libosmo-abis uses
@@ -69,10 +68,9 @@
 
 static void drain_oml_queue(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct msgb *msg, *msg2;
 
-	llist_for_each_entry_safe(msg, msg2, &btsb->oml_queue, list) {
+	llist_for_each_entry_safe(msg, msg2, &bts->oml_queue, list) {
 		/* osmo-bts uses msg->trx internally, but libosmo-abis uses
 		 * the signalling link at msg->dst */
 		llist_del(&msg->list);
diff --git a/src/common/bts.c b/src/common/bts.c
index 3ab6e87..74630cc 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -108,7 +108,6 @@
  * file reading */
 int bts_init(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb;
 	struct gsm_bts_trx *trx;
 	int rc, i;
 	static int initialized = 0;
@@ -119,11 +118,8 @@
 
 	bts->band = GSM_BAND_1800;
 
-	bts->role = btsb = talloc_zero(bts, struct gsm_bts_role_bts);
-	btsb->bts = bts;
-
-	INIT_LLIST_HEAD(&btsb->agch_queue.queue);
-	btsb->agch_queue.length = 0;
+	INIT_LLIST_HEAD(&bts->agch_queue.queue);
+	bts->agch_queue.length = 0;
 
 	bts->ctrs = rate_ctr_group_alloc(bts, &bts_ctrg_desc, bts->nr);
 
@@ -131,31 +127,31 @@
 	 * raise threshold to GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DISABLE to
 	 * disable this feature.
 	 */
-	btsb->agch_queue.low_level = GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT;
-	btsb->agch_queue.high_level = GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT;
-	btsb->agch_queue.thresh_level = GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT;
+	bts->agch_queue.low_level = GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT;
+	bts->agch_queue.high_level = GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT;
+	bts->agch_queue.thresh_level = GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT;
 
 	/* configurable via VTY */
-	btsb->paging_state = paging_init(btsb, 200, 0);
-	btsb->ul_power_target = -75;	/* dBm default */
-	btsb->rtp_jitter_adaptive = false;
+	bts->paging_state = paging_init(bts, 200, 0);
+	bts->ul_power_target = -75;	/* dBm default */
+	bts->rtp_jitter_adaptive = false;
 
 	/* configurable via OML */
-	btsb->load.ccch.load_ind_period = 112;
+	bts->load.ccch.load_ind_period = 112;
 	load_timer_start(bts);
-	btsb->rtp_jitter_buf_ms = 100;
-	btsb->max_ta = 63;
-	btsb->ny1 = 4;
-	btsb->t3105_ms = 300;
-	btsb->min_qual_rach = MIN_QUAL_RACH;
-	btsb->min_qual_norm = MIN_QUAL_NORM;
-	btsb->max_ber10k_rach = 1707; /* 7 of 41 bits is Eb/N0 of 0 dB = 0.1707 */
-	btsb->pcu.sock_path = talloc_strdup(btsb, PCU_SOCK_DEFAULT);
-	for (i = 0; i < ARRAY_SIZE(btsb->t200_ms); i++)
-		btsb->t200_ms[i] = oml_default_t200_ms[i];
+	bts->rtp_jitter_buf_ms = 100;
+	bts->max_ta = 63;
+	bts->ny1 = 4;
+	bts->t3105_ms = 300;
+	bts->min_qual_rach = MIN_QUAL_RACH;
+	bts->min_qual_norm = MIN_QUAL_NORM;
+	bts->max_ber10k_rach = 1707; /* 7 of 41 bits is Eb/N0 of 0 dB = 0.1707 */
+	bts->pcu.sock_path = talloc_strdup(bts, PCU_SOCK_DEFAULT);
+	for (i = 0; i < ARRAY_SIZE(bts->t200_ms); i++)
+		bts->t200_ms[i] = oml_default_t200_ms[i];
 
 	/* default RADIO_LINK_TIMEOUT */
-	btsb->radio_link_timeout = 32;
+	bts->radio_link_timeout = 32;
 
 	/* Start with the site manager */
 	oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);
@@ -205,8 +201,8 @@
 		initialized = 1;
 	}
 
-	INIT_LLIST_HEAD(&btsb->smscb_state.queue);
-	INIT_LLIST_HEAD(&btsb->oml_queue);
+	INIT_LLIST_HEAD(&bts->smscb_state.queue);
+	INIT_LLIST_HEAD(&bts->oml_queue);
 
 	/* register DTX DL FSM */
 	rc = osmo_fsm_register(&dtx_dl_amr_fsm);
@@ -387,22 +383,21 @@
 
 static void bts_update_agch_max_queue_length(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct gsm48_system_information_type_3 *si3;
-	int old_max_length = btsb->agch_queue.max_length;
+	int old_max_length = bts->agch_queue.max_length;
 
 	if (!(bts->si_valid & (1<<SYSINFO_TYPE_3)))
 		return;
 
 	si3 = GSM_BTS_SI(bts, SYSINFO_TYPE_3);
 
-	btsb->agch_queue.max_length =
+	bts->agch_queue.max_length =
 		bts_agch_max_queue_length(si3->rach_control.tx_integer,
 					  si3->control_channel_desc.ccch_conf);
 
-	if (btsb->agch_queue.max_length != old_max_length)
+	if (bts->agch_queue.max_length != old_max_length)
 		LOGP(DRSL, LOGL_INFO, "Updated AGCH max queue length to %d\n",
-		     btsb->agch_queue.max_length);
+		     bts->agch_queue.max_length);
 }
 
 #define REQ_REFS_PER_IMM_ASS_REJ 4
@@ -534,47 +529,45 @@
 
 int bts_agch_enqueue(struct gsm_bts *bts, struct msgb *msg)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	int hard_limit = 1000;
 	struct gsm48_imm_ass_rej *imm_ass_cmd = msgb_l3(msg);
 
-	if (btsb->agch_queue.length > hard_limit) {
+	if (bts->agch_queue.length > hard_limit) {
 		LOGP(DSUM, LOGL_ERROR,
 		     "AGCH: too many messages in queue, "
 		     "refusing message type 0x%02x, length = %d/%d\n",
 		     ((struct gsm48_imm_ass *)msgb_l3(msg))->msg_type,
-		     btsb->agch_queue.length, btsb->agch_queue.max_length);
+		     bts->agch_queue.length, bts->agch_queue.max_length);
 
-		btsb->agch_queue.rejected_msgs++;
+		bts->agch_queue.rejected_msgs++;
 		return -ENOMEM;
 	}
 
-	if (btsb->agch_queue.length > 0) {
+	if (bts->agch_queue.length > 0) {
 		struct msgb *last_msg =
-			llist_entry(btsb->agch_queue.queue.prev, struct msgb, list);
+			llist_entry(bts->agch_queue.queue.prev, struct msgb, list);
 		struct gsm48_imm_ass_rej *last_imm_ass_rej = msgb_l3(last_msg);
 
 		if (try_merge_imm_ass_rej(last_imm_ass_rej, imm_ass_cmd)) {
-			btsb->agch_queue.merged_msgs++;
+			bts->agch_queue.merged_msgs++;
 			msgb_free(msg);
 			return 0;
 		}
 	}
 
-	msgb_enqueue(&btsb->agch_queue.queue, msg);
-	btsb->agch_queue.length++;
+	msgb_enqueue(&bts->agch_queue.queue, msg);
+	bts->agch_queue.length++;
 
 	return 0;
 }
 
 struct msgb *bts_agch_dequeue(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
-	struct msgb *msg = msgb_dequeue(&btsb->agch_queue.queue);
+	struct msgb *msg = msgb_dequeue(&bts->agch_queue.queue);
 	if (!msg)
 		return NULL;
 
-	btsb->agch_queue.length--;
+	bts->agch_queue.length--;
 	return msg;
 }
 
@@ -586,19 +579,18 @@
  */
 static void compact_agch_queue(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct msgb *msg, *msg2;
 	int max_len, slope, offs;
-	int level_low = btsb->agch_queue.low_level;
-	int level_high = btsb->agch_queue.high_level;
-	int level_thres = btsb->agch_queue.thresh_level;
+	int level_low = bts->agch_queue.low_level;
+	int level_high = bts->agch_queue.high_level;
+	int level_thres = bts->agch_queue.thresh_level;
 
-	max_len = btsb->agch_queue.max_length;
+	max_len = bts->agch_queue.max_length;
 
 	if (max_len == 0)
 		max_len = 1;
 
-	if (btsb->agch_queue.length < max_len * level_thres / 100)
+	if (bts->agch_queue.length < max_len * level_thres / 100)
 		return;
 
 	/* p^
@@ -615,7 +607,7 @@
 	else
 		slope = 0x10000 * max_len; /* p_drop >= 1 if len > offs */
 
-	llist_for_each_entry_safe(msg, msg2, &btsb->agch_queue.queue, list) {
+	llist_for_each_entry_safe(msg, msg2, &bts->agch_queue.queue, list) {
 		struct gsm48_imm_ass *imm_ass_cmd = msgb_l3(msg);
 		int p_drop;
 
@@ -624,16 +616,16 @@
 
 		/* IMMEDIATE ASSIGN REJECT */
 
-		p_drop = (btsb->agch_queue.length - offs) * slope / max_len;
+		p_drop = (bts->agch_queue.length - offs) * slope / max_len;
 
 		if ((random() & 0xffff) >= p_drop)
 			return;
 
 		llist_del(&msg->list);
-		btsb->agch_queue.length--;
+		bts->agch_queue.length--;
 		msgb_free(msg);
 
-		btsb->agch_queue.dropped_msgs++;
+		bts->agch_queue.dropped_msgs++;
 	}
 	return;
 }
@@ -642,7 +634,6 @@
 		      int is_ag_res)
 {
 	struct msgb *msg = NULL;
-	struct gsm_bts_role_bts *btsb = bts->role;
 	int rc = 0;
 	int is_empty = 1;
 
@@ -655,7 +646,7 @@
 
 	/* Check for paging messages first if this is PCH */
 	if (!is_ag_res)
-		rc = paging_gen_msg(btsb->paging_state, out_buf, gt, &is_empty);
+		rc = paging_gen_msg(bts->paging_state, out_buf, gt, &is_empty);
 
 	/* Check whether the block may be overwritten */
 	if (!is_empty)
@@ -673,14 +664,14 @@
 	msgb_free(msg);
 
 	if (is_ag_res)
-		btsb->agch_queue.agch_msgs++;
+		bts->agch_queue.agch_msgs++;
 	else
-		btsb->agch_queue.pch_msgs++;
+		bts->agch_queue.pch_msgs++;
 
 	return rc;
 }
 
-int bts_supports_cipher(struct gsm_bts_role_bts *bts, int rsl_cipher)
+int bts_supports_cipher(struct gsm_bts *bts, int rsl_cipher)
 {
 	int sup;
 
@@ -702,9 +693,7 @@
 
 struct gsm_time *get_time(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts->role;
-
-	return &btsb->gsm_time;
+	return &bts->gsm_time;
 }
 
 int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan,
diff --git a/src/common/cbch.c b/src/common/cbch.c
index e511c67..b8f69c6 100644
--- a/src/common/cbch.c
+++ b/src/common/cbch.c
@@ -52,9 +52,8 @@
 static int get_smscb_block(struct gsm_bts *bts, uint8_t *out)
 {
 	int to_copy;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct gsm412_block_type *block_type;
-	struct smscb_msg *msg = btsb->smscb_state.cur_msg;
+	struct smscb_msg *msg = bts->smscb_state.cur_msg;
 
 	if (!msg) {
 		/* No message: Send NULL mesage */
@@ -86,8 +85,8 @@
 
 	if (block_type->lb == 1) {
 		/* remove/release the message memory */
-		talloc_free(btsb->smscb_state.cur_msg);
-		btsb->smscb_state.cur_msg = NULL;
+		talloc_free(bts->smscb_state.cur_msg);
+		bts->smscb_state.cur_msg = NULL;
 	}
 
 	return block_type->lb;
@@ -106,7 +105,6 @@
 			  struct rsl_ie_cb_cmd_type cmd_type,
 			  uint8_t msg_len, const uint8_t *msg)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct smscb_msg *scm;
 
 	if (msg_len > sizeof(scm->msg)) {
@@ -137,7 +135,7 @@
 		break;
 	}
 
-	llist_add_tail(&scm->list, &btsb->smscb_state.queue);
+	llist_add_tail(&scm->list, &bts->smscb_state.queue);
 
 	return 0;
 }
@@ -145,12 +143,11 @@
 static struct smscb_msg *select_next_smscb(struct gsm_bts *bts)
 {
 	struct smscb_msg *msg;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	if (llist_empty(&btsb->smscb_state.queue))
+	if (llist_empty(&bts->smscb_state.queue))
 		return NULL;
 
-	msg = llist_entry(btsb->smscb_state.queue.next,
+	msg = llist_entry(bts->smscb_state.queue.next,
 			  struct smscb_msg, list);
 
 	llist_del(&msg->list);
@@ -162,7 +159,6 @@
  * block for a given gsm_time.  outbuf must have 23 bytes of space. */
 int bts_cbch_get(struct gsm_bts *bts, uint8_t *outbuf, struct gsm_time *g_time)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	uint32_t fn = gsm_gsmtime2fn(g_time);
 	/* According to 05.02 Section 6.5.4 */
 	uint32_t tb = (fn / 51) % 8;
@@ -180,7 +176,7 @@
 	switch (tb) {
 	case 0:
 		/* select a new SMSCB message */
-		btsb->smscb_state.cur_msg = select_next_smscb(bts);
+		bts->smscb_state.cur_msg = select_next_smscb(bts);
 		rc = get_smscb_block(bts, outbuf);
 		break;
 	case 1: case 2: case 3:
diff --git a/src/common/handover.c b/src/common/handover.c
index 45ed040..54b131f 100644
--- a/src/common/handover.c
+++ b/src/common/handover.c
@@ -67,10 +67,9 @@
 {
 	struct gsm_lchan *lchan = data;
 	struct gsm_bts *bts = lchan->ts->trx->bts;
-	struct gsm_bts_role_bts *btsb = bts->role;
 
 	LOGP(DHO, LOGL_INFO, "%s T3105 timeout (%d resends left)\n",
-		gsm_lchan_name(lchan), btsb->ny1 - lchan->ho.phys_info_count);
+		gsm_lchan_name(lchan), bts->ny1 - lchan->ho.phys_info_count);
 
 	if (lchan->state != LCHAN_S_ACTIVE) {
 		LOGP(DHO, LOGL_NOTICE,
@@ -79,7 +78,7 @@
 		return;
 	}
 
-	if (lchan->ho.phys_info_count >= btsb->ny1) {
+	if (lchan->ho.phys_info_count >= bts->ny1) {
 		/* HO Abort */
 		LOGP(DHO, LOGL_NOTICE, "%s NY1 reached, sending CONNection "
 			"FAILure to BSC.\n", gsm_lchan_name(lchan));
@@ -89,14 +88,13 @@
 
 	ho_tx_phys_info(lchan);
 	lchan->ho.phys_info_count++;
-	osmo_timer_schedule(&lchan->ho.t3105, 0, btsb->t3105_ms * 1000);
+	osmo_timer_schedule(&lchan->ho.t3105, 0, bts->t3105_ms * 1000);
 }
 
 /* received random access on dedicated channel */
 void handover_rach(struct gsm_lchan *lchan, uint8_t ra, uint8_t acc_delay)
 {
 	struct gsm_bts *bts = lchan->ts->trx->bts;
-	struct gsm_bts_role_bts *btsb = bts->role;
 
 	/* Ignore invalid handover ref */
 	if (lchan->ho.ref != ra) {
@@ -141,10 +139,10 @@
 	/* Start T3105 */
 	LOGP(DHO, LOGL_DEBUG,
 		"%s Starting T3105 with %u ms\n",
-		gsm_lchan_name(lchan), btsb->t3105_ms);
+		gsm_lchan_name(lchan), bts->t3105_ms);
 	lchan->ho.t3105.cb = ho_t3105_cb;
 	lchan->ho.t3105.data = lchan;
-	osmo_timer_schedule(&lchan->ho.t3105, 0, btsb->t3105_ms * 1000);
+	osmo_timer_schedule(&lchan->ho.t3105, 0, bts->t3105_ms * 1000);
 }
 
 /* received frist valid data frame on dedicated channel */
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 8380175..0a229e1 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -448,29 +448,28 @@
 			       struct osmo_phsap_prim *l1sap,
 			       struct info_time_ind_param *info_time_ind)
 {
-	struct gsm_bts_role_bts *btsb = bts->role;
 	int frames_expired;
 
 	DEBUGPFN(DL1P, info_time_ind->fn, "Rx MPH_INFO time ind\n");
 
 	/* Calculate and check frame difference */
-	frames_expired = info_time_ind->fn - btsb->gsm_time.fn;
+	frames_expired = info_time_ind->fn - bts->gsm_time.fn;
 	if (frames_expired > 1) {
-		if (btsb->gsm_time.fn)
+		if (bts->gsm_time.fn)
 			LOGPFN(DL1P, LOGL_ERROR, info_time_ind->fn,
 			     "Invalid condition detected: Frame difference is %"PRIu32"-%"PRIu32"=%d > 1!\n",
-			     info_time_ind->fn, btsb->gsm_time.fn, frames_expired);
+			     info_time_ind->fn, bts->gsm_time.fn, frames_expired);
 	}
 
 	/* Update our data structures with the current GSM time */
-	gsm_fn2gsmtime(&btsb->gsm_time, info_time_ind->fn);
+	gsm_fn2gsmtime(&bts->gsm_time, info_time_ind->fn);
 
 	/* Update time on PCU interface */
 	pcu_tx_time_ind(info_time_ind->fn);
 
 	/* increment number of RACH slots that have passed by since the
 	 * last time indication */
-	btsb->load.rach.total +=
+	bts->load.rach.total +=
 	    calc_exprd_rach_frames(bts, info_time_ind->fn) * frames_expired;
 
 	return 0;
@@ -921,10 +920,10 @@
  * network operator." */
 static void radio_link_timeout(struct gsm_lchan *lchan, int bad_frame)
 {
-	struct gsm_bts_role_bts *btsb = lchan->ts->trx->bts->role;
+	struct gsm_bts *bts = lchan->ts->trx->bts;
 
 	/* Bypass radio link timeout if set to -1 */
-	if (btsb->radio_link_timeout < 0)
+	if (bts->radio_link_timeout < 0)
 		return;
 
 	/* if link loss criterion already reached */
@@ -944,11 +943,11 @@
 		return;
 	}
 
-	if (lchan->s < btsb->radio_link_timeout) {
+	if (lchan->s < bts->radio_link_timeout) {
 		/* count up radio link counter S */
 		lchan->s += 2;
-		if (lchan->s > btsb->radio_link_timeout)
-			lchan->s = btsb->radio_link_timeout;
+		if (lchan->s > bts->radio_link_timeout)
+			lchan->s = bts->radio_link_timeout;
 		DEBUGP(DMEAS, "%s counting up radio link counter S=%d\n",
 			gsm_lchan_name(lchan), lchan->s);
 	}
@@ -1105,12 +1104,12 @@
 static int l1sap_tch_ind(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap,
 	struct ph_tch_param *tch_ind)
 {
+	struct gsm_bts *bts = trx->bts;
 	struct msgb *msg = l1sap->oph.msg;
 	struct gsm_time g_time;
 	struct gsm_lchan *lchan;
 	uint8_t  chan_nr;
 	uint32_t fn;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(trx->bts);
 
 	chan_nr = tch_ind->chan_nr;
 	fn = tch_ind->fn;
@@ -1131,7 +1130,7 @@
 	 * the content is not available due to decoding issues. Content not
 	 * available is expected as empty payload. We also check if quality is
 	 * good enough. */
-	if (msg->len && tch_ind->lqual_cb / 10 >= btsb->min_qual_norm) {
+	if (msg->len && tch_ind->lqual_cb / 10 >= bts->min_qual_norm) {
 		/* hand msg to RTP code for transmission */
 		if (lchan->abis_ip.rtp_socket)
 			osmo_rtp_send_frame_ext(lchan->abis_ip.rtp_socket,
@@ -1161,16 +1160,15 @@
 
 #define RACH_MIN_TOA256 -2 * 256
 
-static bool rach_pass_filter(struct ph_rach_ind_param *rach_ind,
-	struct gsm_bts_role_bts *btsb)
+static bool rach_pass_filter(struct ph_rach_ind_param *rach_ind, struct gsm_bts *bts)
 {
 	int16_t toa256 = rach_ind->acc_delay_256bits;
 
 	/* Check for RACH exceeding BER threshold (ghost RACH) */
-	if (rach_ind->ber10k > btsb->max_ber10k_rach) {
+	if (rach_ind->ber10k > bts->max_ber10k_rach) {
 		LOGPFN(DL1C, LOGL_INFO, rach_ind->fn, "Ignoring RACH request: "
 			"BER10k(%u) > BER10k_MAX(%u)\n",
-			rach_ind->ber10k, btsb->max_ber10k_rach);
+			rach_ind->ber10k, bts->max_ber10k_rach);
 		return false;
 	}
 
@@ -1179,10 +1177,10 @@
 	 * We allow early arrival up to 2 symbols, and delay
 	 * according to maximal allowed Timing Advance value.
 	 */
-	if (toa256 < RACH_MIN_TOA256 || toa256 > btsb->max_ta * 256) {
+	if (toa256 < RACH_MIN_TOA256 || toa256 > bts->max_ta * 256) {
 		LOGPFN(DL1C, LOGL_INFO, rach_ind->fn, "Ignoring RACH request: "
 			"ToA(%d) exceeds the allowed range (%d..%d)\n",
-			toa256, RACH_MIN_TOA256, btsb->max_ta * 256);
+			toa256, RACH_MIN_TOA256, bts->max_ta * 256);
 		return false;
 	}
 
@@ -1194,7 +1192,7 @@
 	struct osmo_phsap_prim *l1sap, struct ph_rach_ind_param *rach_ind)
 {
 	/* Filter out noise / interference / ghosts */
-	if (!rach_pass_filter(rach_ind, trx->bts->role)) {
+	if (!rach_pass_filter(rach_ind, trx->bts)) {
 		rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_DROP);
 		return 0;
 	}
@@ -1211,7 +1209,6 @@
 	 struct osmo_phsap_prim *l1sap, struct ph_rach_ind_param *rach_ind)
 {
 	struct gsm_bts *bts = trx->bts;
-	struct gsm_bts_role_bts *btsb = bts->role;
 	struct lapdm_channel *lc;
 
 	DEBUGPFN(DL1P, rach_ind->fn, "Rx PH-RA.ind");
@@ -1225,17 +1222,17 @@
 	rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_RCVD);
 
 	/* increment number of busy RACH slots, if required */
-	if (rach_ind->rssi >= btsb->load.rach.busy_thresh)
-		btsb->load.rach.busy++;
+	if (rach_ind->rssi >= bts->load.rach.busy_thresh)
+		bts->load.rach.busy++;
 
 	/* Filter out noise / interference / ghosts */
-	if (!rach_pass_filter(rach_ind, btsb)) {
+	if (!rach_pass_filter(rach_ind, bts)) {
 		rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_DROP);
 		return 0;
 	}
 
 	/* increment number of RACH slots with valid non-handover RACH burst */
-	btsb->load.rach.access++;
+	bts->load.rach.access++;
 
 	lc = &trx->ts[0].lchan[CCCH_LCHAN].lapdm_ch;
 
@@ -1397,7 +1394,6 @@
 
 int l1sap_chan_act(struct gsm_bts_trx *trx, uint8_t chan_nr, struct tlv_parsed *tp)
 {
-	struct gsm_bts_role_bts *btsb = trx->bts->role;
 	struct gsm_lchan *lchan = get_lchan_by_chan_nr(trx, chan_nr);
 	struct gsm48_chan_desc *cd;
 	int rc;
@@ -1423,7 +1419,7 @@
 	}
 
 	lchan->sacch_deact = 0;
-	lchan->s = btsb->radio_link_timeout;
+	lchan->s = lchan->ts->trx->bts->radio_link_timeout;
 
 	rc = l1sap_chan_act_dact_modify(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);
 	if (rc)
diff --git a/src/common/load_indication.c b/src/common/load_indication.c
index 4756d5a..e91f6d4 100644
--- a/src/common/load_indication.c
+++ b/src/common/load_indication.c
@@ -30,28 +30,25 @@
 
 static void reset_load_counters(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
-
 	/* re-set the counters */
-	btsb->load.ccch.pch_used = btsb->load.ccch.pch_total = 0;
+	bts->load.ccch.pch_used = bts->load.ccch.pch_total = 0;
 }
 
 static void load_timer_cb(void *data)
 {
 	struct gsm_bts *bts = data;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	unsigned int pch_percent, rach_percent;
 
 	/* compute percentages */
-	if (btsb->load.ccch.pch_total == 0)
+	if (bts->load.ccch.pch_total == 0)
 		pch_percent = 0;
 	else
-		pch_percent = (btsb->load.ccch.pch_used * 100) /
-					btsb->load.ccch.pch_total;
+		pch_percent = (bts->load.ccch.pch_used * 100) /
+					bts->load.ccch.pch_total;
 
-	if (pch_percent >= btsb->load.ccch.load_ind_thresh) {
+	if (pch_percent >= bts->load.ccch.load_ind_thresh) {
 		/* send RSL load indication message to BSC */
-		uint16_t buffer_space = paging_buffer_space(btsb->paging_state);
+		uint16_t buffer_space = paging_buffer_space(bts->paging_state);
 		rsl_tx_ccch_load_ind_pch(bts, buffer_space);
 	} else {
 		/* This is an extenstion of TS 08.58.  We don't only
@@ -61,41 +58,37 @@
 		rsl_tx_ccch_load_ind_pch(bts, 0xffff);
 	}
 
-	if (btsb->load.rach.total == 0)
+	if (bts->load.rach.total == 0)
 		rach_percent = 0;
 	else
-		rach_percent = (btsb->load.rach.busy * 100) /
-					btsb->load.rach.total;
+		rach_percent = (bts->load.rach.busy * 100) /
+					bts->load.rach.total;
 
-	if (rach_percent >= btsb->load.ccch.load_ind_thresh) {
+	if (rach_percent >= bts->load.ccch.load_ind_thresh) {
 		/* send RSL load indication message to BSC */
-		rsl_tx_ccch_load_ind_rach(bts, btsb->load.rach.total,
-					  btsb->load.rach.busy,
-					  btsb->load.rach.access);
+		rsl_tx_ccch_load_ind_rach(bts, bts->load.rach.total,
+					  bts->load.rach.busy,
+					  bts->load.rach.access);
 	}
 
 	reset_load_counters(bts);
 
 	/* re-schedule the timer */
-	osmo_timer_schedule(&btsb->load.ccch.timer,
-			    btsb->load.ccch.load_ind_period, 0);
+	osmo_timer_schedule(&bts->load.ccch.timer,
+			    bts->load.ccch.load_ind_period, 0);
 }
 
 void load_timer_start(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
-
-	if (!btsb->load.ccch.timer.data) {
-		btsb->load.ccch.timer.data = bts;
-		btsb->load.ccch.timer.cb = load_timer_cb;
+	if (!bts->load.ccch.timer.data) {
+		bts->load.ccch.timer.data = bts;
+		bts->load.ccch.timer.cb = load_timer_cb;
 		reset_load_counters(bts);
 	}
-	osmo_timer_schedule(&btsb->load.ccch.timer, btsb->load.ccch.load_ind_period, 0);
+	osmo_timer_schedule(&bts->load.ccch.timer, bts->load.ccch.load_ind_period, 0);
 }
 
 void load_timer_stop(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
-
-	osmo_timer_del(&btsb->load.ccch.timer);
+	osmo_timer_del(&bts->load.ccch.timer);
 }
diff --git a/src/common/main.c b/src/common/main.c
index d5dc4ea..0f6f529 100644
--- a/src/common/main.c
+++ b/src/common/main.c
@@ -226,7 +226,6 @@
 
 int bts_main(int argc, char **argv)
 {
-	struct gsm_bts_role_bts *btsb;
 	struct gsm_bts_trx *trx;
 	struct e1inp_line *line;
 	int rc, i;
@@ -289,7 +288,6 @@
 		fprintf(stderr, "unable to open bts\n");
 		exit(1);
 	}
-	btsb = bts_role_bts(bts);
 
 	abis_init(bts);
 
@@ -324,7 +322,7 @@
 		exit(1);
 	}
 
-	if (pcu_sock_init(btsb->pcu.sock_path)) {
+	if (pcu_sock_init(bts->pcu.sock_path)) {
 		fprintf(stderr, "PCU L1 socket failed\n");
 		exit(1);
 	}
@@ -336,12 +334,12 @@
 	signal(SIGUSR2, &signal_handler);
 	osmo_init_ignore_signals();
 
-	if (!btsb->bsc_oml_host) {
+	if (!bts->bsc_oml_host) {
 		fprintf(stderr, "Cannot start BTS without knowing BSC OML IP\n");
 		exit(1);
 	}
 
-	line = abis_open(bts, btsb->bsc_oml_host, "sysmoBTS");
+	line = abis_open(bts, bts->bsc_oml_host, "sysmoBTS");
 	if (!line) {
 		fprintf(stderr, "unable to connect to BSC\n");
 		exit(2);
diff --git a/src/common/oml.c b/src/common/oml.c
index 295d66f..139210e 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -486,29 +486,28 @@
 int oml_set_lchan_t200(struct gsm_lchan *lchan)
 {
 	struct gsm_bts *bts = lchan->ts->trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct lapdm_channel *lc = &lchan->lapdm_ch;
 	unsigned int t200_dcch, t200_dcch_sapi3, t200_acch, t200_acch_sapi3;
 
 	/* set T200 for main and associated channel */
 	switch (lchan->type) {
 	case GSM_LCHAN_SDCCH:
-		t200_dcch = btsb->t200_ms[T200_SDCCH];
-		t200_dcch_sapi3 = btsb->t200_ms[T200_SDCCH_SAPI3];
-		t200_acch = btsb->t200_ms[T200_SACCH_SDCCH];
-		t200_acch_sapi3 = btsb->t200_ms[T200_SACCH_SDCCH];
+		t200_dcch = bts->t200_ms[T200_SDCCH];
+		t200_dcch_sapi3 = bts->t200_ms[T200_SDCCH_SAPI3];
+		t200_acch = bts->t200_ms[T200_SACCH_SDCCH];
+		t200_acch_sapi3 = bts->t200_ms[T200_SACCH_SDCCH];
 		break;
 	case GSM_LCHAN_TCH_F:
-		t200_dcch = btsb->t200_ms[T200_FACCH_F];
-		t200_dcch_sapi3 = btsb->t200_ms[T200_FACCH_F];
-		t200_acch = btsb->t200_ms[T200_SACCH_TCH_SAPI0];
-		t200_acch_sapi3 = btsb->t200_ms[T200_SACCH_TCH_SAPI3];
+		t200_dcch = bts->t200_ms[T200_FACCH_F];
+		t200_dcch_sapi3 = bts->t200_ms[T200_FACCH_F];
+		t200_acch = bts->t200_ms[T200_SACCH_TCH_SAPI0];
+		t200_acch_sapi3 = bts->t200_ms[T200_SACCH_TCH_SAPI3];
 		break;
 	case GSM_LCHAN_TCH_H:
-		t200_dcch = btsb->t200_ms[T200_FACCH_H];
-		t200_dcch_sapi3 = btsb->t200_ms[T200_FACCH_H];
-		t200_acch = btsb->t200_ms[T200_SACCH_TCH_SAPI0];
-		t200_acch_sapi3 = btsb->t200_ms[T200_SACCH_TCH_SAPI3];
+		t200_dcch = bts->t200_ms[T200_FACCH_H];
+		t200_dcch_sapi3 = bts->t200_ms[T200_FACCH_H];
+		t200_acch = bts->t200_ms[T200_SACCH_TCH_SAPI0];
+		t200_acch_sapi3 = bts->t200_ms[T200_SACCH_TCH_SAPI3];
 		break;
 	default:
 		return -1;
@@ -572,7 +571,6 @@
 {
 	struct abis_om_fom_hdr *foh = msgb_l3(msg);
 	struct tlv_parsed tp, *tp_merged;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	int rc, i;
 	const uint8_t *payload;
 
@@ -627,12 +625,12 @@
 		payload = TLVP_VAL(&tp, NM_ATT_INTERF_BOUND);
 		for (i = 0; i < 6; i++) {
 			int16_t boundary = *payload;
-			btsb->interference.boundary[i] = -1 * boundary;
+			bts->interference.boundary[i] = -1 * boundary;
 		}
 	}
 	/* 9.4.24 Intave Parameter */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_INTAVE_PARAM, 1))
-		btsb->interference.intave = *TLVP_VAL(&tp, NM_ATT_INTAVE_PARAM);
+		bts->interference.intave = *TLVP_VAL(&tp, NM_ATT_INTAVE_PARAM);
 
 	/* 9.4.14 Connection Failure Criterion */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_CONN_FAIL_CRIT, 1)) {
@@ -642,12 +640,12 @@
 		case 0xFF: /* Osmocom specific Extension of TS 12.21 */
 			LOGP(DOML, LOGL_NOTICE, "WARNING: Radio Link Timeout "
 			     "explicitly disabled, only use this for lab testing!\n");
-			btsb->radio_link_timeout = -1;
+			bts->radio_link_timeout = -1;
 			break;
 		case 0x01: /* Based on uplink SACCH (radio link timeout) */
 			if (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) >= 2 &&
 			    val[1] >= 4 && val[1] <= 64) {
-				btsb->radio_link_timeout = val[1];
+				bts->radio_link_timeout = val[1];
 				break;
 			}
 			/* fall-through */
@@ -661,15 +659,15 @@
 	}
 
 	/* 9.4.53 T200 */
-	if (TLVP_PRES_LEN(&tp, NM_ATT_T200, ARRAY_SIZE(btsb->t200_ms))) {
+	if (TLVP_PRES_LEN(&tp, NM_ATT_T200, ARRAY_SIZE(bts->t200_ms))) {
 		payload = TLVP_VAL(&tp, NM_ATT_T200);
-		for (i = 0; i < ARRAY_SIZE(btsb->t200_ms); i++) {
+		for (i = 0; i < ARRAY_SIZE(bts->t200_ms); i++) {
 			uint32_t t200_ms = payload[i] * abis_nm_t200_ms[i];
 #if 0
-			btsb->t200_ms[i] = t200_ms;
+			bts->t200_ms[i] = t200_ms;
 			DEBUGP(DOML, "T200[%u]: OML=%u, mult=%u => %u ms\n",
 				i, payload[i], abis_nm_t200_mult[i],
-				btsb->t200_ms[i]);
+				bts->t200_ms[i]);
 #else
 			/* we'd rather use the 1s/2s (long) defaults by
 			 * libosmocore, as we appear to have some bug(s)
@@ -684,31 +682,31 @@
 
 	/* 9.4.31 Maximum Timing Advance */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_MAX_TA, 1))
-		btsb->max_ta = *TLVP_VAL(&tp, NM_ATT_MAX_TA);
+		bts->max_ta = *TLVP_VAL(&tp, NM_ATT_MAX_TA);
 
 	/* 9.4.39 Overload Period */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_OVERL_PERIOD, 1))
-		btsb->load.overload_period = *TLVP_VAL(&tp, NM_ATT_OVERL_PERIOD);
+		bts->load.overload_period = *TLVP_VAL(&tp, NM_ATT_OVERL_PERIOD);
 
 	/* 9.4.12 CCCH Load Threshold */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_CCCH_L_T, 1))
-		btsb->load.ccch.load_ind_thresh = *TLVP_VAL(&tp, NM_ATT_CCCH_L_T);
+		bts->load.ccch.load_ind_thresh = *TLVP_VAL(&tp, NM_ATT_CCCH_L_T);
 
 	/* 9.4.11 CCCH Load Indication Period */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_CCCH_L_I_P, 1)) {
-		btsb->load.ccch.load_ind_period = *TLVP_VAL(&tp, NM_ATT_CCCH_L_I_P);
+		bts->load.ccch.load_ind_period = *TLVP_VAL(&tp, NM_ATT_CCCH_L_I_P);
 		load_timer_start(bts);
 	}
 
 	/* 9.4.44 RACH Busy Threshold */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_RACH_B_THRESH, 1)) {
 		int16_t thresh = *TLVP_VAL(&tp, NM_ATT_RACH_B_THRESH);
-		btsb->load.rach.busy_thresh = -1 * thresh;
+		bts->load.rach.busy_thresh = -1 * thresh;
 	}
 
 	/* 9.4.45 RACH Load Averaging Slots */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_LDAVG_SLOTS, 2)) {
-		btsb->load.rach.averaging_slots =
+		bts->load.rach.averaging_slots =
 			ntohs(tlvp_val16_unal(&tp, NM_ATT_LDAVG_SLOTS));
 	}
 
@@ -720,13 +718,13 @@
 				"T3105 must have a value != 0.\n");
 			return oml_fom_ack_nack(msg, NM_NACK_PARAM_RANGE);
 		}
-		btsb->t3105_ms = t3105 * 10;
+		bts->t3105_ms = t3105 * 10;
 	}
 
 	/* 9.4.37 NY1 */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_NY1, 1))
-		btsb->ny1 = *TLVP_VAL(&tp, NM_ATT_NY1);
-	
+		bts->ny1 = *TLVP_VAL(&tp, NM_ATT_NY1);
+
 	/* 9.4.8 BCCH ARFCN */
 	if (TLVP_PRES_LEN(&tp, NM_ATT_BCCH_ARFCN, 2))
 		bts->c0->arfcn = ntohs(tlvp_val16_unal(&tp, NM_ATT_BCCH_ARFCN));
diff --git a/src/common/paging.c b/src/common/paging.c
index d2acd70..aa604e7 100644
--- a/src/common/paging.c
+++ b/src/common/paging.c
@@ -68,7 +68,7 @@
 };
 
 struct paging_state {
-	struct gsm_bts_role_bts *btsb;
+	struct gsm_bts *bts;
 
 	/* parameters taken / interpreted from BCCH/CCCH configuration */
 	struct gsm48_control_channel_descr chan_desc;
@@ -181,19 +181,19 @@
 	int blocks = gsm48_number_of_paging_subchannels(&ps->chan_desc);
 	struct paging_record *pr;
 
-	rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_RCVD);
+	rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_RCVD);
 
 	if (paging_group >= blocks) {
 		LOGP(DPAG, LOGL_ERROR, "BSC Send PAGING for group %u, but number of paging "
 			"sub-channels is only %u\n", paging_group, blocks);
-		rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_DROP);
+		rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_DROP);
 		return -EINVAL;
 	}
 
 	if (ps->num_paging >= ps->num_paging_max) {
 		LOGP(DPAG, LOGL_NOTICE, "Dropping paging, queue full (%u)\n",
 			ps->num_paging);
-		rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_DROP);
+		rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_DROP);
 		return -ENOSPC;
 	}
 
@@ -399,7 +399,7 @@
 	int len;
 
 	*is_empty = 0;
-	ps->btsb->load.ccch.pch_total += 1;
+	ps->bts->load.ccch.pch_total += 1;
 
 	group = get_pag_subch_nr(ps, gt);
 	if (group < 0) {
@@ -423,7 +423,7 @@
 		time_t now = time(NULL);
 		unsigned int i, num_imsi = 0;
 
-		ps->btsb->load.ccch.pch_used += 1;
+		ps->bts->load.ccch.pch_used += 1;
 
 		/* get (if we have) up to four paging records */
 		for (i = 0; i < ARRAY_SIZE(pr); i++) {
@@ -519,7 +519,7 @@
 			/* skip those that we might have re-added above */
 			if (pr[i] == NULL)
 				continue;
-			rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_SENT);
+			rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_SENT);
 			/* check if we can expire the paging record,
 			 * or if we need to re-queue it */
 			if (pr[i]->u.paging.expiration_time <= now) {
@@ -551,8 +551,7 @@
 {
 	if (subsys == SS_GLOBAL && signal == S_NEW_SYSINFO) {
 		struct gsm_bts *bts = signal_data;
-		struct gsm_bts_role_bts *btsb = bts->role;
-		struct paging_state *ps = btsb->paging_state;
+		struct paging_state *ps = bts->paging_state;
 		struct gsm48_system_information_type_3 *si3 = (void *) bts->si_buf[SYSINFO_TYPE_3];
 
 		paging_si_update(ps, &si3->control_channel_desc);
@@ -562,18 +561,18 @@
 
 static int initialized = 0;
 
-struct paging_state *paging_init(struct gsm_bts_role_bts *btsb,
+struct paging_state *paging_init(struct gsm_bts *bts,
 				 unsigned int num_paging_max,
 				 unsigned int paging_lifetime)
 {
 	struct paging_state *ps;
 	unsigned int i;
 
-	ps  = talloc_zero(btsb, struct paging_state);
+	ps  = talloc_zero(bts, struct paging_state);
 	if (!ps)
 		return NULL;
 
-	ps->btsb = btsb;
+	ps->bts = bts;
 	ps->paging_lifetime = paging_lifetime;
 	ps->num_paging_max = num_paging_max;
 
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c
index 949a5fa..5f94050 100644
--- a/src/common/pcu_sock.c
+++ b/src/common/pcu_sock.c
@@ -325,14 +325,13 @@
 	struct gsm_pcu_if *pcu_prim;
 	struct gsm_pcu_if_data *data_ind;
 	struct gsm_bts *bts = ts->trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
 	LOGP(DPCU, LOGL_DEBUG, "Sending data indication: sapi=%s arfcn=%d block=%d data=%s\n",
 	     sapi_string[sapi], arfcn, block_nr, osmo_hexdump(data, len));
 
-	if (lqual / 10 < btsb->min_qual_norm) {
+	if (lqual / 10 < bts->min_qual_norm) {
 		LOGP(DPCU, LOGL_DEBUG, "Link quality %"PRId16" is below threshold %f, dropping packet\n",
-			lqual, btsb->min_qual_norm);
+			lqual, bts->min_qual_norm);
 		return 0;
 	}
 
@@ -487,10 +486,7 @@
 			 * This might not be required, if PCU_IF_MSG_DATA_REQ
 			 * is used instead. */
 		} else {
-			struct gsm_bts_role_bts *btsb = bts->role;
-
-			paging_add_imm_ass(btsb->paging_state, data_req->data,
-				data_req->len);
+			paging_add_imm_ass(bts->paging_state, data_req->data, data_req->len);
 		}
 		break;
 	case PCU_IF_SAPI_AGCH:
diff --git a/src/common/power_control.c b/src/common/power_control.c
index e040ee4..b172870 100644
--- a/src/common/power_control.c
+++ b/src/common/power_control.c
@@ -44,7 +44,6 @@
 	int rx;
 	int cur_dBm, new_dBm, new_pwr;
 	struct gsm_bts *bts = lchan->ts->trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	const enum gsm_band band = bts->band;
 
 	if (!trx_ms_pwr_ctrl_is_osmo(lchan->ts->trx))
@@ -57,7 +56,7 @@
 		return 0;
 
 	/* What is the difference between what we want and received? */
-	rx = btsb->ul_power_target - rxLevel;
+	rx = bts->ul_power_target - rxLevel;
 
 	cur_dBm = ms_pwr_dbm(band, ms_power);
 	new_dBm = cur_dBm + rx;
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 669a39b..5f3c17e 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -444,8 +444,8 @@
 /* 8.5.5 PAGING COMMAND */
 static int rsl_rx_paging_cmd(struct gsm_bts_trx *trx, struct msgb *msg)
 {
-	struct gsm_bts_role_bts *btsb = trx->bts->role;
 	struct tlv_parsed tp;
+	struct gsm_bts *bts = trx->bts;
 	uint8_t chan_needed = 0, paging_group;
 	const uint8_t *identity_lv;
 	int rc;
@@ -462,8 +462,7 @@
 	if (TLVP_PRES_LEN(&tp, RSL_IE_CHAN_NEEDED, 1))
 		chan_needed = *TLVP_VAL(&tp, RSL_IE_CHAN_NEEDED);
 
-	rc = paging_add_identity(btsb->paging_state, paging_group,
-				 identity_lv, chan_needed);
+	rc = paging_add_identity(bts->paging_state, paging_group, identity_lv, chan_needed);
 	if (rc < 0) {
 		/* FIXME: notfiy the BSC on other errors? */
 		if (rc == -ENOSPC)
@@ -818,10 +817,10 @@
 			   const uint8_t *val, uint8_t len)
 {
 	int rc;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(lchan->ts->trx->bts);
+	struct gsm_bts *bts = lchan->ts->trx->bts;
 
 	/* check if the encryption algorithm sent by BSC is supported! */
-	rc = bts_supports_cipher(btsb, *val);
+	rc = bts_supports_cipher(bts, *val);
 	if (rc != 1)
 		return rc;
 
@@ -1696,7 +1695,7 @@
 	struct abis_rsl_dchan_hdr *dch = msgb_l2(msg);
 	struct tlv_parsed tp;
 	struct gsm_lchan *lchan = msg->lchan;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(msg->lchan->ts->trx->bts);
+	struct gsm_bts *bts = lchan->ts->trx->bts;
 	const uint8_t *payload_type, *speech_mode, *payload_type2;
 	uint32_t connect_ip = 0;
 	uint16_t connect_port = 0;
@@ -1782,10 +1781,10 @@
 						 inc_ip_port, dch->c.msg_type);
 		}
 		rc = osmo_rtp_socket_set_param(lchan->abis_ip.rtp_socket,
-					       btsb->rtp_jitter_adaptive ?
+					       bts->rtp_jitter_adaptive ?
 					       OSMO_RTP_P_JIT_ADAP :
 					       OSMO_RTP_P_JITBUF,
-					       btsb->rtp_jitter_buf_ms);
+					       bts->rtp_jitter_buf_ms);
 		if (rc < 0)
 			LOGP(DRTP, LOGL_ERROR,
 			     "%s IPAC Failed to set RTP socket parameters: %s\n",
diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c
index b5fd061..f5f9c7e 100644
--- a/src/common/sysinfo.c
+++ b/src/common/sysinfo.c
@@ -38,7 +38,6 @@
 /* Apply the rules from 05.02 6.3.1.3 Mapping of BCCH Data */
 uint8_t *bts_sysinfo_get(struct gsm_bts *bts, const struct gsm_time *g_time)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	unsigned int tc4_cnt = 0;
 	unsigned int tc4_sub[4];
 
@@ -110,12 +109,12 @@
 			return GSM_BTS_SI(bts, SYSINFO_TYPE_2);
 		else {
 			/* increment static counter by one, modulo count */
-			btsb->si.tc4_ctr = (btsb->si.tc4_ctr + 1) % tc4_cnt;
+			bts->si.tc4_ctr = (bts->si.tc4_ctr + 1) % tc4_cnt;
 
-			if (tc4_sub[btsb->si.tc4_ctr] == SYSINFO_TYPE_2quater)
+			if (tc4_sub[bts->si.tc4_ctr] == SYSINFO_TYPE_2quater)
 				return get_si2q_inc_index(bts);
 
-			return GSM_BTS_SI(bts, tc4_sub[btsb->si.tc4_ctr]);
+			return GSM_BTS_SI(bts, tc4_sub[bts->si.tc4_ctr]);
 		}
 	case 5:
 		/* 2bis, 2ter, 2quater */
diff --git a/src/common/vty.c b/src/common/vty.c
index ca5ca7c..2716a7a 100644
--- a/src/common/vty.c
+++ b/src/common/vty.c
@@ -203,9 +203,8 @@
 	"Automatically select band for ARFCN based on configured band\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->auto_band = 1;
+	bts->auto_band = 1;
 	return CMD_SUCCESS;
 }
 
@@ -214,9 +213,8 @@
 	NO_STR "Automatically select band for ARFCN based on configured band\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->auto_band = 0;
+	bts->auto_band = 0;
 	return CMD_SUCCESS;
 }
 
@@ -247,7 +245,6 @@
 
 static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct gsm_bts_trx *trx;
 	char buf_casecnvt[256];
 	int i;
@@ -256,26 +253,26 @@
 	if (bts->description)
 		vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
 	vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
-	if (btsb->auto_band)
+	if (bts->auto_band)
 		vty_out(vty, " auto-band%s", VTY_NEWLINE);
 	vty_out(vty, " ipa unit-id %u %u%s",
 		bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
-	vty_out(vty, " oml remote-ip %s%s", btsb->bsc_oml_host, VTY_NEWLINE);
-	vty_out(vty, " rtp jitter-buffer %u", btsb->rtp_jitter_buf_ms);
-	if (btsb->rtp_jitter_adaptive)
+	vty_out(vty, " oml remote-ip %s%s", bts->bsc_oml_host, VTY_NEWLINE);
+	vty_out(vty, " rtp jitter-buffer %u", bts->rtp_jitter_buf_ms);
+	if (bts->rtp_jitter_adaptive)
 		vty_out(vty, " adaptive");
 	vty_out(vty, "%s", VTY_NEWLINE);
-	vty_out(vty, " paging queue-size %u%s", paging_get_queue_max(btsb->paging_state),
+	vty_out(vty, " paging queue-size %u%s", paging_get_queue_max(bts->paging_state),
 		VTY_NEWLINE);
-	vty_out(vty, " paging lifetime %u%s", paging_get_lifetime(btsb->paging_state),
+	vty_out(vty, " paging lifetime %u%s", paging_get_lifetime(bts->paging_state),
 		VTY_NEWLINE);
-	vty_out(vty, " uplink-power-target %d%s", btsb->ul_power_target, VTY_NEWLINE);
-	if (btsb->agch_queue.thresh_level != GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT
-		 || btsb->agch_queue.low_level != GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT
-		 || btsb->agch_queue.high_level != GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT)
+	vty_out(vty, " uplink-power-target %d%s", bts->ul_power_target, VTY_NEWLINE);
+	if (bts->agch_queue.thresh_level != GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT
+		 || bts->agch_queue.low_level != GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT
+		 || bts->agch_queue.high_level != GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT)
 		vty_out(vty, " agch-queue-mgmt threshold %d low %d high %d%s",
-			btsb->agch_queue.thresh_level, btsb->agch_queue.low_level,
-			btsb->agch_queue.high_level, VTY_NEWLINE);
+			bts->agch_queue.thresh_level, bts->agch_queue.low_level,
+			bts->agch_queue.high_level, VTY_NEWLINE);
 
 	for (i = 0; i < 32; i++) {
 		if (gsmtap_sapi_mask & (1 << i)) {
@@ -287,14 +284,14 @@
 		osmo_str2lower(buf_casecnvt, get_value_string(gsmtap_sapi_names, GSMTAP_CHANNEL_ACCH));
 		vty_out(vty, " gsmtap-sapi %s%s", buf_casecnvt, VTY_NEWLINE);
 	}
-	vty_out(vty, " min-qual-rach %.0f%s", btsb->min_qual_rach * 10.0f,
+	vty_out(vty, " min-qual-rach %.0f%s", bts->min_qual_rach * 10.0f,
 		VTY_NEWLINE);
-	vty_out(vty, " min-qual-norm %.0f%s", btsb->min_qual_norm * 10.0f,
+	vty_out(vty, " min-qual-norm %.0f%s", bts->min_qual_norm * 10.0f,
 		VTY_NEWLINE);
-	vty_out(vty, " max-ber10k-rach %u%s", btsb->max_ber10k_rach,
+	vty_out(vty, " max-ber10k-rach %u%s", bts->max_ber10k_rach,
 		VTY_NEWLINE);
-	if (strcmp(btsb->pcu.sock_path, PCU_SOCK_DEFAULT))
-		vty_out(vty, " pcu-socket %s%s", btsb->pcu.sock_path, VTY_NEWLINE);
+	if (strcmp(bts->pcu.sock_path, PCU_SOCK_DEFAULT))
+		vty_out(vty, " pcu-socket %s%s", bts->pcu.sock_path, VTY_NEWLINE);
 	if (bts->supp_meas_toa256)
 		vty_out(vty, " supp-meas-info toa256%s", VTY_NEWLINE);
 
@@ -454,12 +451,11 @@
       "OML Parameters\n" "OML IP Address\n" "OML IP Address\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	if (btsb->bsc_oml_host)
-		talloc_free(btsb->bsc_oml_host);
+	if (bts->bsc_oml_host)
+		talloc_free(bts->bsc_oml_host);
 
-	btsb->bsc_oml_host = talloc_strdup(btsb, argv[0]);
+	bts->bsc_oml_host = talloc_strdup(bts, argv[0]);
 
 	return CMD_SUCCESS;
 }
@@ -482,11 +478,10 @@
 	RTP_STR "RTP jitter buffer\n" "jitter buffer in ms\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->rtp_jitter_buf_ms = atoi(argv[0]);
+	bts->rtp_jitter_buf_ms = atoi(argv[0]);
 	if (argc > 1)
-		btsb->rtp_jitter_adaptive = true;
+		bts->rtp_jitter_adaptive = true;
 
 	return CMD_SUCCESS;
 }
@@ -500,9 +495,8 @@
 	        "Maximum length of BTS-internal paging queue\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	paging_set_queue_max(btsb->paging_state, atoi(argv[0]));
+	paging_set_queue_max(bts->paging_state, atoi(argv[0]));
 
 	return CMD_SUCCESS;
 }
@@ -514,9 +508,8 @@
 	        "Maximum lifetime of a paging record (secods)\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	paging_set_lifetime(btsb->paging_state, atoi(argv[0]));
+	paging_set_lifetime(bts->paging_state, atoi(argv[0]));
 
 	return CMD_SUCCESS;
 }
@@ -532,11 +525,10 @@
 	"High water mark for cleanup\nin %% of the maximum queue length\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->agch_queue.thresh_level = atoi(argv[0]);
-	btsb->agch_queue.low_level = atoi(argv[1]);
-	btsb->agch_queue.high_level = atoi(argv[2]);
+	bts->agch_queue.thresh_level = atoi(argv[0]);
+	bts->agch_queue.low_level = atoi(argv[1]);
+	bts->agch_queue.high_level = atoi(argv[2]);
 
 	return CMD_SUCCESS;
 }
@@ -548,11 +540,10 @@
 	"Reset clean parameters to default values\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->agch_queue.thresh_level = GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT;
-	btsb->agch_queue.low_level = GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT;
-	btsb->agch_queue.high_level = GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT;
+	bts->agch_queue.thresh_level = GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT;
+	bts->agch_queue.low_level = GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT;
+	bts->agch_queue.high_level = GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT;
 
 	return CMD_SUCCESS;
 }
@@ -563,9 +554,8 @@
 	"Target uplink Rx level in dBm\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->ul_power_target = atoi(argv[0]);
+	bts->ul_power_target = atoi(argv[0]);
 
 	return CMD_SUCCESS;
 }
@@ -576,9 +566,8 @@
 	"C/I level in tenth of dB\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->min_qual_rach = strtof(argv[0], NULL) / 10.0f;
+	bts->min_qual_rach = strtof(argv[0], NULL) / 10.0f;
 
 	return CMD_SUCCESS;
 }
@@ -589,9 +578,8 @@
 	"C/I level in tenth of dB\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->min_qual_norm = strtof(argv[0], NULL) / 10.0f;
+	bts->min_qual_norm = strtof(argv[0], NULL) / 10.0f;
 
 	return CMD_SUCCESS;
 }
@@ -602,9 +590,8 @@
 	"BER in 1/10000 units (0=no BER; 100=1% BER)\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	btsb->max_ber10k_rach = strtoul(argv[0], NULL, 10);
+	bts->max_ber10k_rach = strtoul(argv[0], NULL, 10);
 
 	return CMD_SUCCESS;
 }
@@ -614,13 +601,12 @@
 	"Configure the PCU socket file/path name\n")
 {
 	struct gsm_bts *bts = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	if (btsb->pcu.sock_path) {
+	if (bts->pcu.sock_path) {
 		/* FIXME: close the interface? */
-		talloc_free(btsb->pcu.sock_path);
+		talloc_free(bts->pcu.sock_path);
 	}
-	btsb->pcu.sock_path = talloc_strdup(btsb, argv[0]);
+	bts->pcu.sock_path = talloc_strdup(bts, argv[0]);
 	/* FIXME: re-open the interface? */
 
 	return CMD_SUCCESS;
@@ -795,7 +781,6 @@
 
 static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts->role;
 	struct gsm_bts_trx *trx;
 
 	vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
@@ -817,20 +802,20 @@
 		vty_out(vty, "  PCU version %s connected%s",
 			bts->pcu_version, VTY_NEWLINE);
 	vty_out(vty, "  Paging: Queue size %u, occupied %u, lifetime %us%s",
-		paging_get_queue_max(btsb->paging_state), paging_queue_length(btsb->paging_state),
-		paging_get_lifetime(btsb->paging_state), VTY_NEWLINE);
+		paging_get_queue_max(bts->paging_state), paging_queue_length(bts->paging_state),
+		paging_get_lifetime(bts->paging_state), VTY_NEWLINE);
 	vty_out(vty, "  AGCH: Queue limit %u, occupied %d, "
 		"dropped %"PRIu64", merged %"PRIu64", rejected %"PRIu64", "
 		"ag-res %"PRIu64", non-res %"PRIu64"%s",
-		btsb->agch_queue.max_length, btsb->agch_queue.length,
-		btsb->agch_queue.dropped_msgs, btsb->agch_queue.merged_msgs,
-		btsb->agch_queue.rejected_msgs, btsb->agch_queue.agch_msgs,
-		btsb->agch_queue.pch_msgs,
+		bts->agch_queue.max_length, bts->agch_queue.length,
+		bts->agch_queue.dropped_msgs, bts->agch_queue.merged_msgs,
+		bts->agch_queue.rejected_msgs, bts->agch_queue.agch_msgs,
+		bts->agch_queue.pch_msgs,
 		VTY_NEWLINE);
 	vty_out(vty, "  CBCH backlog queue length: %u%s",
-		llist_length(&btsb->smscb_state.queue), VTY_NEWLINE);
+		llist_length(&bts->smscb_state.queue), VTY_NEWLINE);
 	vty_out(vty, "  Paging: queue length %d, buffer space %d%s",
-		paging_queue_length(btsb->paging_state), paging_buffer_space(btsb->paging_state),
+		paging_queue_length(bts->paging_state), paging_buffer_space(bts->paging_state),
 		VTY_NEWLINE);
 	vty_out(vty, "  OML Link state: %s.%s",
 		bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
@@ -1476,7 +1461,6 @@
 {
 	struct gsm_network *net = gsmnet_from_vty(vty);
 	struct gsm_lchan *lchan;
-	struct gsm_bts_role_bts *btsb;
 	int jitbuf_ms = atoi(argv[4]), rc;
 
 	lchan = resolve_lchan(net, argv, 0);
@@ -1489,9 +1473,8 @@
 			VTY_NEWLINE);
 		return CMD_WARNING;
 	}
-	btsb = bts_role_bts(lchan->ts->trx->bts);
 	rc = osmo_rtp_socket_set_param(lchan->abis_ip.rtp_socket,
-				  btsb->rtp_jitter_adaptive ?
+				  lchan->ts->trx->bts->rtp_jitter_adaptive ?
 				  OSMO_RTP_P_JIT_ADAP : OSMO_RTP_P_JITBUF,
 				  jitbuf_ms);
 	if (rc < 0)
diff --git a/src/osmo-bts-litecell15/l1_if.c b/src/osmo-bts-litecell15/l1_if.c
index ea652a1..e6cdfd4 100644
--- a/src/osmo-bts-litecell15/l1_if.c
+++ b/src/osmo-bts-litecell15/l1_if.c
@@ -994,14 +994,13 @@
 {
 	struct gsm_bts_trx *trx = lc15l1_hdl_trx(fl1);
 	struct gsm_bts *bts = trx->bts;
-	struct gsm_bts_role_bts *btsb = bts->role;
 	struct gsm_lchan *lchan;
 	struct osmo_phsap_prim *l1sap;
 	int rc;
 	struct ph_rach_ind_param rach_ind_param;
 
 	/* FIXME: this should be deprecated/obsoleted as it bypasses rach.busy counting */
-	if (ra_ind->measParam.fLinkQuality < btsb->min_qual_rach) {
+	if (ra_ind->measParam.fLinkQuality < bts->min_qual_rach) {
 		msgb_free(l1p_msg);
 		return 0;
 	}
diff --git a/src/osmo-bts-litecell15/main.c b/src/osmo-bts-litecell15/main.c
index dcbd9f5..030c3ef 100644
--- a/src/osmo-bts-litecell15/main.c
+++ b/src/osmo-bts-litecell15/main.c
@@ -65,14 +65,12 @@
 int bts_model_init(struct gsm_bts *bts)
 {
 	struct gsm_bts_trx *trx;
-	struct gsm_bts_role_bts *btsb;
 	struct stat st;
 	static struct osmo_fd accept_fd, read_fd;
 	int rc;
 
 	bts->variant = BTS_OSMO_LITECELL15;
-	btsb = bts_role_bts(bts);
-	btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
+	bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
 
 	rc = oml_router_init(bts, OML_ROUTER_PATH, &accept_fd, &read_fd);
 	if (rc < 0) {
diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c
index 7b728f9..159196a 100644
--- a/src/osmo-bts-litecell15/oml.c
+++ b/src/osmo-bts-litecell15/oml.c
@@ -381,7 +381,6 @@
 static int trx_init(struct gsm_bts_trx *trx)
 {
 	struct lc15l1_hdl *fl1h = trx_lc15l1_hdl(trx);
-	struct gsm_bts_role_bts *btsb = bts_role_bts(trx->bts);
 	struct msgb *msg;
 	GsmL1_MphInitReq_t *mi_req;
 	GsmL1_DeviceParam_t *dev_par;
@@ -411,7 +410,7 @@
 	dev_par->u16BcchArfcn = trx->bts->c0->arfcn;
 	dev_par->u8NbTsc = trx->bts->bsic & 7;
 	dev_par->fRxPowerLevel = trx_ms_pwr_ctrl_is_osmo(trx)
-					? 0.0 : btsb->ul_power_target;
+					? 0.0 : bts->ul_power_target;
 
 	dev_par->fTxPowerLevel = 0.0;
 	LOGP(DL1C, LOGL_NOTICE, "Init TRX (Band %d, ARFCN %u, TSC %u, RxPower % 2f dBm, "
diff --git a/src/osmo-bts-litecell15/utils.c b/src/osmo-bts-litecell15/utils.c
index 59a621b..8c3eb5a 100644
--- a/src/osmo-bts-litecell15/utils.c
+++ b/src/osmo-bts-litecell15/utils.c
@@ -82,9 +82,8 @@
 {
 	enum gsm_band band;
 	struct gsm_bts *bts = trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	if (!btsb->auto_band)
+	if (!bts->auto_band)
 		return band_osmo2lc15(trx, bts->band);
 
 	/*
diff --git a/src/osmo-bts-octphy/l1_if.c b/src/osmo-bts-octphy/l1_if.c
index 32b86a0..0d63d51 100644
--- a/src/osmo-bts-octphy/l1_if.c
+++ b/src/osmo-bts-octphy/l1_if.c
@@ -767,13 +767,10 @@
 
 int bts_model_init(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb;
-
 	LOGP(DL1C, LOGL_NOTICE, "model_init()\n");
 
 	bts->variant = BTS_OSMO_OCTPHY;
-	btsb = bts_role_bts(bts);
-	btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
+	bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
 
 	/* FIXME: what is the nominal transmit power of the PHY/board? */
 	bts->c0->nominal_power = 15;
@@ -1166,7 +1163,6 @@
 {
 	struct gsm_bts_trx *trx = trx_by_l1h(fl1, ra_ind->TrxId.byTrxId);
 	struct gsm_bts *bts = trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct osmo_phsap_prim *l1sap;
 	int rc;
 	struct ph_rach_ind_param rach_ind_param;
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 9aa5477..57e2d5c 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -984,14 +984,13 @@
 {
 	struct gsm_bts_trx *trx = femtol1_hdl_trx(fl1);
 	struct gsm_bts *bts = trx->bts;
-	struct gsm_bts_role_bts *btsb = bts->role;
 	struct gsm_lchan *lchan;
 	struct osmo_phsap_prim *l1sap;
 	int rc;
 	struct ph_rach_ind_param rach_ind_param;
 
 	/* FIXME: this should be deprecated/obsoleted as it bypasses rach.busy counting */
-	if (ra_ind->measParam.fLinkQuality < btsb->min_qual_rach) {
+	if (ra_ind->measParam.fLinkQuality < bts->min_qual_rach) {
 		msgb_free(l1p_msg);
 		return 0;
 	}
diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c
index efcf4a8..b63d07e 100644
--- a/src/osmo-bts-sysmo/main.c
+++ b/src/osmo-bts-sysmo/main.c
@@ -57,14 +57,12 @@
 
 int bts_model_init(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb;
 	struct stat st;
 	static struct osmo_fd accept_fd, read_fd;
 	int rc;
 
 	bts->variant = BTS_OSMO_SYSMO;
-	btsb = bts_role_bts(bts);
-	btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
+	bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
 
 	rc = oml_router_init(bts, OML_ROUTER_PATH, &accept_fd, &read_fd);
 	if (rc < 0) {
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index 505a457..ce85a8b 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -384,7 +384,6 @@
 static int trx_init(struct gsm_bts_trx *trx)
 {
 	struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
-	struct gsm_bts_role_bts *btsb = bts_role_bts(trx->bts);
 	struct msgb *msg;
 	GsmL1_MphInitReq_t *mi_req;
 	GsmL1_DeviceParam_t *dev_par;
@@ -415,7 +414,7 @@
 	dev_par->u16BcchArfcn = trx->bts->c0->arfcn;
 	dev_par->u8NbTsc = trx->bts->bsic & 7;
 	dev_par->fRxPowerLevel = trx_ms_pwr_ctrl_is_osmo(trx)
-					? 0.0 : btsb->ul_power_target;
+					? 0.0 : trx->bts->ul_power_target;
 
 	dev_par->fTxPowerLevel = ((float) initial_mdBm) / 1000;
 	LOGP(DL1C, LOGL_NOTICE, "Init TRX (ARFCN %u, TSC %u, RxPower % 2f dBm, "
diff --git a/src/osmo-bts-sysmo/sysmobts_vty.c b/src/osmo-bts-sysmo/sysmobts_vty.c
index b5940dc..039236f 100644
--- a/src/osmo-bts-sysmo/sysmobts_vty.c
+++ b/src/osmo-bts-sysmo/sysmobts_vty.c
@@ -153,9 +153,8 @@
 	"Target uplink Rx level in dBm\n")
 {
 	struct gsm_bts_trx *trx = vty->index;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(trx->bts);
 
-	btsb->ul_power_target = atoi(argv[0]);
+	trx->bts->ul_power_target = atoi(argv[0]);
 
 	return CMD_SUCCESS;
 }
diff --git a/src/osmo-bts-sysmo/utils.c b/src/osmo-bts-sysmo/utils.c
index be6051a..7d1aca7 100644
--- a/src/osmo-bts-sysmo/utils.c
+++ b/src/osmo-bts-sysmo/utils.c
@@ -80,9 +80,8 @@
 {
 	enum gsm_band band;
 	struct gsm_bts *bts = trx->bts;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 
-	if (!btsb->auto_band)
+	if (!bts->auto_band)
 		return band_osmo2femto(trx, bts->band);
 
 	/*
diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c
index 5a5c97e..6e5a4ca 100644
--- a/src/osmo-bts-trx/main.c
+++ b/src/osmo-bts-trx/main.c
@@ -97,10 +97,8 @@
 
 int bts_model_init(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
-
 	bts->variant = BTS_OSMO_TRX;
-	btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2);
+	bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2);
 
 	/* FIXME: this needs to be overridden with the real hardrware
 	 * value */
diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c
index 7815a34..62376a7 100644
--- a/src/osmo-bts-virtual/main.c
+++ b/src/osmo-bts-virtual/main.c
@@ -56,10 +56,7 @@
 
 int bts_model_init(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb;
-
-	btsb = bts_role_bts(bts);
-	btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
+	bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
 
 	gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);
 	gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);
diff --git a/src/osmo-bts-virtual/scheduler_virtbts.c b/src/osmo-bts-virtual/scheduler_virtbts.c
index 5782c0a..de995e6 100644
--- a/src/osmo-bts-virtual/scheduler_virtbts.c
+++ b/src/osmo-bts-virtual/scheduler_virtbts.c
@@ -566,9 +566,8 @@
 static void vbts_fn_timer_cb(void *data)
 {
 	struct gsm_bts *bts = data;
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
 	struct timeval tv_now;
-	struct timeval *tv_clock = &btsb->vbts.tv_clock;
+	struct timeval *tv_clock = &bts->vbts.tv_clock;
 	int32_t elapsed_us;
 
 	gettimeofday(&tv_now, NULL);
@@ -592,30 +591,28 @@
 		};
 		timeradd(tv_clock, &tv_frame, tv_clock);
 		/* increment the frame number in the BTS model instance */
-		btsb->vbts.last_fn = (btsb->vbts.last_fn + 1) % GSM_HYPERFRAME;
-		vbts_sched_fn(bts, btsb->vbts.last_fn);
+		bts->vbts.last_fn = (bts->vbts.last_fn + 1) % GSM_HYPERFRAME;
+		vbts_sched_fn(bts, bts->vbts.last_fn);
 		elapsed_us -= FRAME_DURATION_uS;
 	}
 
 	/* re-schedule the timer */
 	/* timer is set to frame duration - elapsed time to guarantee that this cb method will be
 	 * periodically executed every 4.615ms */
-	osmo_timer_schedule(&btsb->vbts.fn_timer, 0, FRAME_DURATION_uS - elapsed_us);
+	osmo_timer_schedule(&bts->vbts.fn_timer, 0, FRAME_DURATION_uS - elapsed_us);
 }
 
 int vbts_sched_start(struct gsm_bts *bts)
 {
-	struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
-
 	LOGP(DL1P, LOGL_NOTICE, "starting VBTS scheduler\n");
 
-	memset(&btsb->vbts.fn_timer, 0, sizeof(btsb->vbts.fn_timer));
-	btsb->vbts.fn_timer.cb = vbts_fn_timer_cb;
-	btsb->vbts.fn_timer.data = bts;
+	memset(&bts->vbts.fn_timer, 0, sizeof(bts->vbts.fn_timer));
+	bts->vbts.fn_timer.cb = vbts_fn_timer_cb;
+	bts->vbts.fn_timer.data = bts;
 
-	gettimeofday(&btsb->vbts.tv_clock, NULL);
+	gettimeofday(&bts->vbts.tv_clock, NULL);
 	/* trigger the first timer after 4615us (a frame duration) */
-	osmo_timer_schedule(&btsb->vbts.fn_timer, 0, FRAME_DURATION_uS);
+	osmo_timer_schedule(&bts->vbts.fn_timer, 0, FRAME_DURATION_uS);
 
 	return 0;
 }
diff --git a/tests/agch/agch_test.c b/tests/agch/agch_test.c
index 89f113a..6efbc24 100644
--- a/tests/agch/agch_test.c
+++ b/tests/agch/agch_test.c
@@ -29,7 +29,6 @@
 #include <unistd.h>
 
 static struct gsm_bts *bts;
-static struct gsm_bts_role_bts *btsb;
 
 static int count_imm_ass_rej_refs(struct gsm48_imm_ass_rej *rej)
 {
@@ -116,11 +115,11 @@
 	g_time.t3 = 6;
 
 	printf("Testing AGCH messages queue handling.\n");
-	btsb->agch_queue.max_length = 32;
+	bts->agch_queue.max_length = 32;
 
-	btsb->agch_queue.low_level = 30;
-	btsb->agch_queue.high_level = 30;
-	btsb->agch_queue.thresh_level = 60;
+	bts->agch_queue.low_level = 30;
+	bts->agch_queue.high_level = 30;
+	bts->agch_queue.thresh_level = 60;
 
 	for (round = 1; round <= num_rounds; round++) {
 		for (idx = 0; idx < num_ima_per_round; idx++) {
@@ -143,10 +142,10 @@
 	       "dropped %"PRIu64", merged %"PRIu64", rejected %"PRIu64", "
 	       "ag-res %"PRIu64", non-res %"PRIu64"\n",
 	       count, imm_ass_count, imm_ass_rej_count, imm_ass_rej_ref_count,
-	       btsb->agch_queue.max_length, btsb->agch_queue.length,
-	       btsb->agch_queue.dropped_msgs, btsb->agch_queue.merged_msgs,
-	       btsb->agch_queue.rejected_msgs, btsb->agch_queue.agch_msgs,
-	       btsb->agch_queue.pch_msgs);
+	       bts->agch_queue.max_length, bts->agch_queue.length,
+	       bts->agch_queue.dropped_msgs, bts->agch_queue.merged_msgs,
+	       bts->agch_queue.rejected_msgs, bts->agch_queue.agch_msgs,
+	       bts->agch_queue.pch_msgs);
 
 	imm_ass_count = 0;
 	imm_ass_rej_count = 0;
@@ -182,10 +181,10 @@
 	       "dropped %"PRIu64", merged %"PRIu64", rejected %"PRIu64", "
 	       "ag-res %"PRIu64", non-res %"PRIu64"\n",
 	       multiframes, imm_ass_count, imm_ass_rej_count, imm_ass_rej_ref_count,
-	       btsb->agch_queue.max_length, btsb->agch_queue.length,
-	       btsb->agch_queue.dropped_msgs, btsb->agch_queue.merged_msgs,
-	       btsb->agch_queue.rejected_msgs, btsb->agch_queue.agch_msgs,
-	       btsb->agch_queue.pch_msgs);
+	       bts->agch_queue.max_length, bts->agch_queue.length,
+	       bts->agch_queue.dropped_msgs, bts->agch_queue.merged_msgs,
+	       bts->agch_queue.rejected_msgs, bts->agch_queue.agch_msgs,
+	       bts->agch_queue.pch_msgs);
 }
 
 static void test_agch_queue_length_computation(void)
@@ -231,7 +230,6 @@
 		exit(1);
 	}
 
-	btsb = bts_role_bts(bts);
 	test_agch_queue_length_computation();
 	test_agch_queue();
 	printf("Success\n");
diff --git a/tests/cipher/cipher_test.c b/tests/cipher/cipher_test.c
index 07d9fde..5e2bdc0 100644
--- a/tests/cipher/cipher_test.c
+++ b/tests/cipher/cipher_test.c
@@ -28,7 +28,6 @@
 #include <unistd.h>
 
 static struct gsm_bts *bts;
-static struct gsm_bts_role_bts *btsb;
 
 #define ASSERT_TRUE(rc) \
 	if (!(rc)) { \
@@ -41,27 +40,27 @@
 {
 	int i;
 
-	btsb->support.ciphers = 0;
+	bts->support.ciphers = 0;
 
 	/* always support A5/0 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x0) == -ENOTSUP);
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x1) == 1); /* A5/0 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x0) == -ENOTSUP);
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x1) == 1); /* A5/0 */
 	for (i = 2; i <= 8; ++i) {
-		ASSERT_TRUE(bts_supports_cipher(btsb, i) == 0);
+		ASSERT_TRUE(bts_supports_cipher(bts, i) == 0);
 	}
 
 	/* checking default A5/1 to A5/3 support */
-	btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x0) == -ENOTSUP);
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x1) == 1); /* A5/0 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x2) == 1); /* A5/1 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x3) == 1); /* A5/2 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x4) == 1); /* A5/3 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x5) == 0); /* A5/4 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x6) == 0); /* A5/5 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x7) == 0); /* A5/6 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x8) == 0); /* A5/7 */
-	ASSERT_TRUE(bts_supports_cipher(btsb, 0x9) == -ENOTSUP);
+	bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x0) == -ENOTSUP);
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x1) == 1); /* A5/0 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x2) == 1); /* A5/1 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x3) == 1); /* A5/2 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x4) == 1); /* A5/3 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x5) == 0); /* A5/4 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x6) == 0); /* A5/5 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x7) == 0); /* A5/6 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x8) == 0); /* A5/7 */
+	ASSERT_TRUE(bts_supports_cipher(bts, 0x9) == -ENOTSUP);
 }
 
 int main(int argc, char **argv)
@@ -77,7 +76,6 @@
 		exit(1);
 	}
 
-	btsb = bts_role_bts(bts);
 	test_cipher_parsing();
 	printf("Success\n");
 
diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c
index adc4d65..1c0a4da 100644
--- a/tests/handover/handover_test.c
+++ b/tests/handover/handover_test.c
@@ -56,7 +56,6 @@
 
 int main(int argc, char **argv)
 {
-	struct gsm_bts_role_bts *btsb;
 	void *tall_bts_ctx;
 	struct e1inp_line *line;
 	struct gsm_lchan *lchan;
@@ -86,8 +85,6 @@
 		fprintf(stderr, "unable to to open bts\n");
 		exit(1);
 	}
-
-	btsb = bts_role_bts(bts);
 
 	libosmo_abis_init(NULL);
 
@@ -170,7 +167,7 @@
 	OSMO_ASSERT(rslh->c.msg_type == RSL_MT_HANDO_DET);
 	OSMO_ASSERT(!msgb_dequeue(&trx->rsl_link->tx_list));
 
-	for (i = 0; i < btsb->ny1 - 1; i++) {
+	for (i = 0; i < bts->ny1 - 1; i++) {
 		/* expect T3105 running */
 		OSMO_ASSERT(osmo_timer_pending(&trx->ts[2].lchan[0].ho.t3105))
 
diff --git a/tests/paging/paging_test.c b/tests/paging/paging_test.c
index 2573b3f..f4f0934 100644
--- a/tests/paging/paging_test.c
+++ b/tests/paging/paging_test.c
@@ -28,7 +28,6 @@
 #include <unistd.h>
 
 static struct gsm_bts *bts;
-static struct gsm_bts_role_bts *btsb;
 
 static const uint8_t static_ilv[] = {
 	0x08, 0x59, 0x51, 0x30, 0x99, 0x00, 0x00, 0x00, 0x19
@@ -50,28 +49,28 @@
 	printf("Testing that paging messages expire.\n");
 
 	/* add paging entry */
-	rc = paging_add_identity(btsb->paging_state, 0, static_ilv, 0);
+	rc = paging_add_identity(bts->paging_state, 0, static_ilv, 0);
 	ASSERT_TRUE(rc == 0);
-	ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 1);
+	ASSERT_TRUE(paging_queue_length(bts->paging_state) == 1);
 
 	/* generate messages */
 	g_time.fn = 0;
 	g_time.t1 = 0;
 	g_time.t2 = 0;
 	g_time.t3 = 6;
-	rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time, &is_empty);
+	rc = paging_gen_msg(bts->paging_state, out_buf, &g_time, &is_empty);
 	ASSERT_TRUE(rc == 13);
 	ASSERT_TRUE(is_empty == 0);
 
-	ASSERT_TRUE(paging_group_queue_empty(btsb->paging_state, 0));
-	ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 0);
+	ASSERT_TRUE(paging_group_queue_empty(bts->paging_state, 0));
+	ASSERT_TRUE(paging_queue_length(bts->paging_state) == 0);
 
 	/* now test the empty queue */
 	g_time.fn = 0;
 	g_time.t1 = 0;
 	g_time.t2 = 0;
 	g_time.t3 = 6;
-	rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time, &is_empty);
+	rc = paging_gen_msg(bts->paging_state, out_buf, &g_time, &is_empty);
 	ASSERT_TRUE(rc == 6);
 	ASSERT_TRUE(is_empty == 1);
 
@@ -90,9 +89,9 @@
 	printf("Testing that paging messages expire with sleep.\n");
 
 	/* add paging entry */
-	rc = paging_add_identity(btsb->paging_state, 0, static_ilv, 0);
+	rc = paging_add_identity(bts->paging_state, 0, static_ilv, 0);
 	ASSERT_TRUE(rc == 0);
-	ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 1);
+	ASSERT_TRUE(paging_queue_length(bts->paging_state) == 1);
 
 	/* sleep */
 	sleep(1);
@@ -102,12 +101,12 @@
 	g_time.t1 = 0;
 	g_time.t2 = 0;
 	g_time.t3 = 6;
-	rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time, &is_empty);
+	rc = paging_gen_msg(bts->paging_state, out_buf, &g_time, &is_empty);
 	ASSERT_TRUE(rc == 13);
 	ASSERT_TRUE(is_empty == 0);
 
-	ASSERT_TRUE(paging_group_queue_empty(btsb->paging_state, 0));
-	ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 0);
+	ASSERT_TRUE(paging_group_queue_empty(bts->paging_state, 0));
+	ASSERT_TRUE(paging_queue_length(bts->paging_state) == 0);
 }
 
 int main(int argc, char **argv)
@@ -123,7 +122,6 @@
 		exit(1);
 	}
 
-	btsb = bts_role_bts(bts);
 	test_paging_smoke();
 	test_paging_sleep();
 	printf("Success\n");
diff --git a/tests/power/power_test.c b/tests/power/power_test.c
index 295f638..a46a430 100644
--- a/tests/power/power_test.c
+++ b/tests/power/power_test.c
@@ -35,13 +35,11 @@
 static void test_power_loop(void)
 {
 	struct gsm_bts bts;
-	struct gsm_bts_role_bts btsb;
 	struct gsm_bts_trx trx;
 	struct gsm_bts_trx_ts ts;
 	struct gsm_lchan *lchan;
 
 	memset(&bts, 0, sizeof(bts));
-	memset(&btsb, 0, sizeof(btsb));
 	memset(&trx, 0, sizeof(trx));
 	memset(&ts, 0, sizeof(ts));
 
@@ -49,10 +47,9 @@
 	lchan->ts = &ts;
 	ts.trx = &trx;
 	trx.bts = &bts;
-	bts.role = &btsb;
 	bts.band = GSM_BAND_1800;
 	trx.ms_power_control = 1;
-	btsb.ul_power_target = -75;
+	bts.ul_power_target = -75;
 
 	lchan->state = LCHAN_S_NONE;
 	lchan->ms_power_ctrl.current = ms_pwr_ctl_lvl(GSM_BAND_1800, 0);
diff --git a/tests/sysmobts/sysmobts_test.c b/tests/sysmobts/sysmobts_test.c
index 32d6e95..02490be 100644
--- a/tests/sysmobts/sysmobts_test.c
+++ b/tests/sysmobts/sysmobts_test.c
@@ -51,16 +51,13 @@
 static void test_sysmobts_auto_band(void)
 {
 	struct gsm_bts bts;
-	struct gsm_bts_role_bts btsb; 
 	struct gsm_bts_trx trx;
 	struct femtol1_hdl hdl;
 	int i;
 
 	memset(&bts, 0, sizeof(bts));
-	memset(&btsb, 0, sizeof(btsb));
 	memset(&trx, 0, sizeof(trx));
 	memset(&hdl, 0, sizeof(hdl));
-	bts.role = &btsb;
 	trx.bts = &bts;
 	trx.role_bts.l1h = &hdl;
 
@@ -74,7 +71,7 @@
 		uint16_t arfcn;
 		int res;
 
-		btsb.auto_band = 0;
+		bts.auto_band = 0;
 		bts.band = direct_map[i][0];
 		arfcn = direct_map[i][2];
 		res = sysmobts_select_femto_band(&trx, arfcn);
@@ -89,7 +86,7 @@
 		uint16_t arfcn;
 		int res;
 
-		btsb.auto_band = 1;
+		bts.auto_band = 1;
 		bts.band = direct_map[i][0];
 		arfcn = direct_map[i][2];
 		res = sysmobts_select_femto_band(&trx, arfcn);
@@ -104,7 +101,7 @@
 		uint16_t arfcn;
 		int res;
 
-		btsb.auto_band = 1;
+		bts.auto_band = 1;
 		bts.band = dcs_to_dcs[i][0];
 		arfcn = dcs_to_dcs[i][2];
 		res = sysmobts_select_femto_band(&trx, arfcn);
@@ -119,7 +116,7 @@
 		uint16_t arfcn;
 		int res;
 
-		btsb.auto_band = 1;
+		bts.auto_band = 1;
 		bts.band = pcs_to_pcs[i][0];
 		arfcn = pcs_to_pcs[i][2];
 		res = sysmobts_select_femto_band(&trx, arfcn);

-- 
To view, visit https://gerrit.osmocom.org/7337
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4fdd601ea873d9697f89a748cc77bcf7c978fa3e
Gerrit-PatchSet: 1
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list