diff options
Diffstat (limited to 'openbsc/src/bsc_hack.c')
-rw-r--r-- | openbsc/src/bsc_hack.c | 195 |
1 files changed, 158 insertions, 37 deletions
diff --git a/openbsc/src/bsc_hack.c b/openbsc/src/bsc_hack.c index 1bfb7068b..82cb7886a 100644 --- a/openbsc/src/bsc_hack.c +++ b/openbsc/src/bsc_hack.c @@ -61,9 +61,12 @@ static int BSIC = HARDCODED_BSIC; static int ARFCN = HARDCODED_ARFCN; static int cardnr = 0; static int release_l2 = 0; +static int bs11_has_trx1 = 0; +static int bs11_has_bts1 = 0; static enum gsm_bts_type BTS_TYPE = GSM_BTS_TYPE_BS11; static enum gsm_band BAND = GSM_BAND_900; static const char *database_name = "hlr.sqlite3"; +extern int ipacc_rtp_direct; struct nano_bts_id { struct llist_head entry; @@ -501,6 +504,23 @@ static void bootstrap_om_nanobts(struct gsm_bts *bts) static void bootstrap_om_bs11(struct gsm_bts *bts) { struct gsm_bts_trx *trx = bts->c0; + int base_ts; + + switch (bts->nr) { + case 0: + /* First BTS uses E1 TS 01,02,03,04,05 */ + base_ts = HARDCODED_BTS0_TS - 1; + break; + case 1: + /* Second BTS uses E1 TS 06,07,08,09,10 */ + base_ts = HARDCODED_BTS1_TS - 1; + break; + case 2: + /* Third BTS uses E1 TS 11,12,13,14,15 */ + base_ts = HARDCODED_BTS2_TS - 1; + default: + return; + } /* stop sending event reports */ abis_nm_event_reports(bts, 0); @@ -523,54 +543,110 @@ static void bootstrap_om_bs11(struct gsm_bts *bts) 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, 1, 0xff); + 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, 1, 0xff, 0x01); + abis_nm_establish_tei(bts, 0, 0, base_ts+1, 0xff, 0x01); abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH); -#ifdef HAVE_TRX1 - /* TRX 1 */ - abis_nm_conn_terr_sign(&bts->trx[1], 0, 1, 0xff); - /* FIXME: TRX ATTRIBUTE */ - abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x02); -#endif - /* 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, 2, 1); + 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, 2, 2); + 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, 2, 3); + 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, 3, 0); + 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, 3, 1); + 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, 3, 2); + 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, 3, 3); + 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_TCHFull); + /* 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); + } /* end DB transmission */ abis_nm_bs11_db_transmission(bts, 0); @@ -601,6 +677,8 @@ static void bootstrap_om(struct gsm_bts *bts) static int shutdown_om(struct gsm_bts *bts) { + fprintf(stdout, "shutting down OML for BTS %u\n", bts->nr); + /* stop sending event reports */ abis_nm_event_reports(bts, 0); @@ -832,10 +910,12 @@ static int set_system_infos(struct gsm_bts_trx *trx) { int i; - for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) { - rsl_bcch_info(trx, bcch_infos[i].type, - bcch_infos[i].data, - bcch_infos[i].len); + if (trx == trx->bts->c0) { + for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) { + rsl_bcch_info(trx, bcch_infos[i].type, + bcch_infos[i].data, + bcch_infos[i].len); + } } rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5)); rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6)); @@ -906,7 +986,7 @@ static void bootstrap_rsl(struct gsm_bts_trx *trx) { fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) " "using MCC=%u MNC=%u BSIC=%u TSC=%u\n", - trx->nr, trx->bts->nr, MCC, MNC, BSIC, TSC); + trx->bts->nr, trx->nr, MCC, MNC, BSIC, TSC); set_system_infos(trx); } @@ -961,18 +1041,20 @@ static int bootstrap_bts(struct gsm_bts *bts) set_ts_e1link(&trx->ts[5], 0, 3, 1); set_ts_e1link(&trx->ts[6], 0, 3, 2); set_ts_e1link(&trx->ts[7], 0, 3, 3); -#ifdef HAVE_TRX1 + /* TRX 1 */ - trx = &bts->trx[1]; - set_ts_e1link(&trx->ts[0], 0, 1, 0xff); - set_ts_e1link(&trx->ts[1], 0, 2, 1); - set_ts_e1link(&trx->ts[2], 0, 2, 2); - set_ts_e1link(&trx->ts[3], 0, 2, 3); - set_ts_e1link(&trx->ts[4], 0, 3, 0); - set_ts_e1link(&trx->ts[5], 0, 3, 1); - set_ts_e1link(&trx->ts[6], 0, 3, 2); - set_ts_e1link(&trx->ts[7], 0, 3, 3); -#endif + trx = gsm_bts_trx_num(bts, 1); + if (trx) { + trx = gsm_bts_trx_num(bts, 1); + set_ts_e1link(&trx->ts[0], 0, 4, 0); + set_ts_e1link(&trx->ts[1], 0, 4, 1); + set_ts_e1link(&trx->ts[2], 0, 4, 2); + set_ts_e1link(&trx->ts[3], 0, 4, 3); + set_ts_e1link(&trx->ts[4], 0, 5, 0); + set_ts_e1link(&trx->ts[5], 0, 5, 1); + set_ts_e1link(&trx->ts[6], 0, 5, 2); + set_ts_e1link(&trx->ts[7], 0, 5, 3); + } } return 0; @@ -980,6 +1062,8 @@ static int bootstrap_bts(struct gsm_bts *bts) static int bootstrap_network(void) { + int rc; + switch(BTS_TYPE) { case GSM_BTS_TYPE_NANOBTS_1800: if (ARFCN < 512 || ARFCN > 885) { @@ -1027,10 +1111,32 @@ static int bootstrap_network(void) /* E1 mISDN input setup */ if (BTS_TYPE == GSM_BTS_TYPE_BS11) { struct gsm_bts *bts = gsm_bts_alloc(gsmnet, BTS_TYPE, TSC, BSIC); + + if (bs11_has_trx1) { + struct gsm_bts_trx *trx1; + trx1 = gsm_bts_trx_alloc(bts); + trx1->arfcn = ARFCN + 2; + } bootstrap_bts(bts); + rc = e1_config(bts, cardnr, release_l2); + if (rc < 0) { + fprintf(stderr, "Error during E1 config of BTS 0\n"); + return rc; + } - gsmnet->num_bts = 1; - return e1_config(bts, cardnr, release_l2); + if (bs11_has_bts1) { + bts = gsm_bts_alloc(gsmnet, BTS_TYPE, TSC, BSIC); + if (bs11_has_trx1) { + struct gsm_bts_trx *trx1; + trx1 = gsm_bts_trx_alloc(bts); + trx1->arfcn = ARFCN + 2; + } + bootstrap_bts(bts); + rc = e1_config(bts, cardnr+1, release_l2); + if (rc < 0) + fprintf(stderr, "Error during E1 config of BTS 1\n"); + } + return rc; } else { struct nano_bts_id *bts_id; struct gsm_bts *bts; @@ -1086,6 +1192,7 @@ static void print_help() printf(" -i --bts-id=NUMBER The known nanoBTS device numbers. Can be specified multiple times.\n"); printf(" -C --cardnr number For bs11 select E1 card number other than 0\n"); printf(" -R --release-l2 Releases mISDN layer 2 after exit, to unload driver.\n"); + printf(" -2 --second-bs11 Configure + Use a second BS-11\n"); printf(" -h --help this text\n"); } @@ -1113,10 +1220,13 @@ static void handle_options(int argc, char** argv) {"bts-id", 1, 0, 'i'}, {"tsc", 1, 0, 'S'}, {"bsic", 1, 0, 'B'}, + {"rtp-proxy", 0, 0, 'P'}, + {"trx1", 0, 0, '1'}, + {"second-bs11", 0, 0, '2'}, {0, 0, 0, 0} }; - c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:C:RL:l:Tb:i:S:B:", + c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:C:RL:l:Tb:i:S:B:P12", long_options, &option_index); if (c == -1) break; @@ -1187,6 +1297,15 @@ static void handle_options(int argc, char** argv) case 'B': BSIC = atoi(optarg); break; + case 'P': + ipacc_rtp_direct = 0; + break; + case '1': + bs11_has_trx1 = 1; + break; + case '2': + bs11_has_bts1 = 1; + break; } default: /* ignore */ @@ -1200,9 +1319,11 @@ static void signal_handler(int signal) fprintf(stdout, "signal %u received\n", signal); switch (signal) { - case SIGHUP: + case SIGINT: case SIGABRT: shutdown_net(gsmnet); + sleep(3); + exit(0); break; case SIGUSR1: talloc_report_full(tall_bsc_ctx, stderr); @@ -1228,7 +1349,7 @@ int main(int argc, char **argv) if (rc < 0) exit(1); - signal(SIGHUP, &signal_handler); + signal(SIGINT, &signal_handler); signal(SIGABRT, &signal_handler); signal(SIGUSR1, &signal_handler); |