diff options
-rw-r--r-- | openbsc/src/bsc_hack.c | 201 |
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); |