aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@netfilter.org>2009-08-10 12:31:31 +0200
committerHarald Welte <laforge@netfilter.org>2009-08-10 12:31:31 +0200
commit349aba603c8a08556847e6313c041f6d81866894 (patch)
tree9c45ebcce0f6b37f222533b582763d1d5ae32dfe
parent21bd3a52f180080869a5cd2da797061441bd729a (diff)
perform A-bis OML configuration based on config file
This means that the config file is now finally the central source of not only the E1 configuration on the BSC, but also the E1 and GSM channel configuration on the BTS.
-rw-r--r--openbsc/src/bsc_hack.c201
1 files changed, 77 insertions, 124 deletions
diff --git a/openbsc/src/bsc_hack.c b/openbsc/src/bsc_hack.c
index 8d8d82abf..db47bfc78 100644
--- a/openbsc/src/bsc_hack.c
+++ b/openbsc/src/bsc_hack.c
@@ -488,27 +488,88 @@ static void bootstrap_om_nanobts(struct gsm_bts *bts)
/* We don't do callback based bootstrapping, but event driven (see above) */
}
-static void bootstrap_om_bs11(struct gsm_bts *bts)
+static void nm_reconfig_ts(struct gsm_bts_trx_ts *ts)
{
- struct gsm_bts_trx *trx = bts->c0;
- int base_ts;
+ enum abis_nm_chan_comb ccomb = abis_nm_chcomb4pchan(ts->pchan);
+ struct gsm_e1_subslot *e1l = &ts->e1_link;
+
+ abis_nm_set_channel_attr(ts, ccomb);
- switch (bts->nr) {
- case 0:
- /* First BTS uses E1 TS 01,02,03,04,05 */
- base_ts = HARDCODED_BTS0_TS - 1;
+ if (is_ipaccess_bts(ts->trx->bts))
+ return;
+
+ switch (ts->pchan) {
+ case GSM_PCHAN_TCH_F:
+ case GSM_PCHAN_TCH_H:
+ abis_nm_conn_terr_traf(ts, e1l->e1_nr, e1l->e1_ts,
+ e1l->e1_ts_ss);
break;
- case 1:
- /* Second BTS uses E1 TS 06,07,08,09,10 */
- base_ts = HARDCODED_BTS1_TS - 1;
+ default:
+ break;
+ }
+}
+
+static void nm_reconfig_trx(struct gsm_bts_trx *trx)
+{
+ struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
+ int i;
+
+ switch (trx->bts->type) {
+ case GSM_BTS_TYPE_BS11:
+ abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
+ e1l->e1_ts_ss);
+ abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
+ e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei);
+
+ /* Set Radio Attributes */
+ if (trx == trx->bts->c0)
+ abis_nm_set_radio_attr(trx, bs11_attr_radio,
+ sizeof(bs11_attr_radio));
+ else {
+ u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
+ u_int8_t arfcn_low = trx->arfcn & 0xff;
+ u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
+ memcpy(trx1_attr_radio, bs11_attr_radio,
+ sizeof(trx1_attr_radio));
+
+ /* patch ARFCN into TRX Attributes */
+ trx1_attr_radio[2] &= 0xf0;
+ trx1_attr_radio[2] |= arfcn_high;
+ trx1_attr_radio[3] = arfcn_low;
+
+ abis_nm_set_radio_attr(trx, trx1_attr_radio,
+ sizeof(trx1_attr_radio));
+ }
break;
- case 2:
- /* Third BTS uses E1 TS 11,12,13,14,15 */
- base_ts = HARDCODED_BTS2_TS - 1;
default:
- return;
+ break;
}
+ for (i = 0; i < TRX_NR_TS; i++)
+ nm_reconfig_ts(&trx->ts[i]);
+}
+
+static void nm_reconfig_bts(struct gsm_bts *bts)
+{
+ struct gsm_bts_trx *trx;
+
+ switch (bts->type) {
+ case GSM_BTS_TYPE_BS11:
+ abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
+ abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
+ abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
+ abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
+ break;
+ default:
+ break;
+ }
+
+ llist_for_each_entry(trx, &bts->trx_list, list)
+ nm_reconfig_trx(trx);
+}
+
+static void bootstrap_om_bs11(struct gsm_bts *bts)
+{
/* stop sending event reports */
abis_nm_event_reports(bts, 0);
@@ -524,116 +585,8 @@ static void bootstrap_om_bs11(struct gsm_bts *bts)
/* begin DB transmission */
abis_nm_bs11_db_transmission(bts, 1);
- abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
- abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
- abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
- abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
-
- /* Connect signalling of bts0/trx0 to e1_0/ts1/64kbps */
- abis_nm_conn_terr_sign(trx, 0, base_ts+1, 0xff);
- abis_nm_set_radio_attr(trx, bs11_attr_radio, sizeof(bs11_attr_radio));
-
- /* Use TEI 1 for signalling */
- abis_nm_establish_tei(bts, 0, 0, base_ts+1, 0xff, 0x01);
- abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_BCCHComb);
-
- /* SET CHANNEL ATTRIBUTE TS1 */
- abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts1 to e1_0/ts2/b */
- abis_nm_conn_terr_traf(&trx->ts[1], 0, base_ts+2, 1);
-
- /* SET CHANNEL ATTRIBUTE TS2 */
- abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts2 to e1_0/ts2/c */
- abis_nm_conn_terr_traf(&trx->ts[2], 0, base_ts+2, 2);
-
- /* SET CHANNEL ATTRIBUTE TS3 */
- abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts3 to e1_0/ts2/d */
- abis_nm_conn_terr_traf(&trx->ts[3], 0, base_ts+2, 3);
-
- /* SET CHANNEL ATTRIBUTE TS4 */
- abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts4 to e1_0/ts3/a */
- abis_nm_conn_terr_traf(&trx->ts[4], 0, base_ts+3, 0);
-
- /* SET CHANNEL ATTRIBUTE TS5 */
- abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts5 to e1_0/ts3/b */
- abis_nm_conn_terr_traf(&trx->ts[5], 0, base_ts+3, 1);
-
- /* SET CHANNEL ATTRIBUTE TS6 */
- abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts6 to e1_0/ts3/c */
- abis_nm_conn_terr_traf(&trx->ts[6], 0, base_ts+3, 2);
-
- /* SET CHANNEL ATTRIBUTE TS7 */
- abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts7 to e1_0/ts3/d */
- abis_nm_conn_terr_traf(&trx->ts[7], 0, base_ts+3, 3);
-
- trx = gsm_bts_trx_num(bts, 1);
- if (trx) {
- u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
- u_int8_t arfcn_low = trx->arfcn & 0xff;
- u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
- memcpy(trx1_attr_radio, bs11_attr_radio,
- sizeof(trx1_attr_radio));
-
- /* patch ARFCN into TRX Attributes */
- trx1_attr_radio[2] &= 0xf0;
- trx1_attr_radio[2] |= arfcn_high;
- trx1_attr_radio[3] = arfcn_low;
-
- /* Connect signalling of TRX1 to e1_0/ts1/64kbps */
- abis_nm_conn_terr_sign(trx, 0, base_ts+1, 0xff);
- /* FIXME: TRX ATTRIBUTE */
- abis_nm_set_radio_attr(trx, trx1_attr_radio,
- sizeof(trx1_attr_radio));
-
- /* Use TEI 2 for signalling */
- abis_nm_establish_tei(bts, 1, 0, base_ts+1, 0xff, 0x02);
-
- /* SET CHANNEL ATTRIBUTE TS0 */
- abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH);
- /* Connect traffic of bts0/trx0/ts0 to e1_0/ts4/a */
- abis_nm_conn_terr_traf(&trx->ts[0], 0, base_ts+4, 0);
-
- /* SET CHANNEL ATTRIBUTE TS1 */
- abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts1 to e1_0/ts4/b */
- abis_nm_conn_terr_traf(&trx->ts[1], 0, base_ts+4, 1);
-
- /* SET CHANNEL ATTRIBUTE TS2 */
- abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts2 to e1_0/ts4/c */
- abis_nm_conn_terr_traf(&trx->ts[2], 0, base_ts+4, 2);
-
- /* SET CHANNEL ATTRIBUTE TS3 */
- abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts3 to e1_0/ts4/d */
- abis_nm_conn_terr_traf(&trx->ts[3], 0, base_ts+4, 3);
-
- /* SET CHANNEL ATTRIBUTE TS4 */
- abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts4 to e1_0/ts5/a */
- abis_nm_conn_terr_traf(&trx->ts[4], 0, base_ts+5, 0);
-
- /* SET CHANNEL ATTRIBUTE TS5 */
- abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts5 to e1_0/ts5/b */
- abis_nm_conn_terr_traf(&trx->ts[5], 0, base_ts+5, 1);
-
- /* SET CHANNEL ATTRIBUTE TS6 */
- abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts6 to e1_0/ts5/c */
- abis_nm_conn_terr_traf(&trx->ts[6], 0, base_ts+5, 2);
-
- /* SET CHANNEL ATTRIBUTE TS7 */
- abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
- /* Connect traffic of bts0/trx0/ts7 to e1_0/ts5/d */
- abis_nm_conn_terr_traf(&trx->ts[7], 0, base_ts+5, 3);
- }
+ /* reconfigure BTS with all TRX and all TS */
+ nm_reconfig_bts(bts);
/* end DB transmission */
abis_nm_bs11_db_transmission(bts, 0);