static int create_trx1(struct gsm_bts *bts) { uint8_t bbsig1_attr[sizeof(obj_bbsig0_attr)+12]; uint8_t *cur = bbsig1_attr; struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, 1); if (!trx) trx = gsm_bts_trx_alloc(bts); fprintf(stdout, "Crating Objects for TRX1\n"); abis_nm_bs11_set_trx1_pw(bts, trx1_password); sleep(1); cur = tlv_put(cur, NM_ATT_BS11_PASSWORD, 10, (uint8_t *)trx1_password); memcpy(cur, obj_bbsig0_attr, sizeof(obj_bbsig0_attr)); abis_nm_bs11_create_object(bts, BS11_OBJ_BBSIG, 1, sizeof(bbsig1_attr), bbsig1_attr); abis_nm_bs11_create_object(bts, BS11_OBJ_PA, 1, sizeof(obj_pa0_attr), obj_pa0_attr); abis_nm_bs11_set_trx_power(trx, BS11_TRX_POWER_GSM_30mW); return 0; }
/* do some compiled-in configuration for our BTS/E1 setup */ int e1_config(struct gsm_bts *bts, int cardnr, int release_l2) { struct e1inp_line *line; struct e1inp_ts *sign_ts; struct e1inp_sign_link *oml_link, *rsl_link; 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 -EINVAL; } line = talloc_zero(tall_bsc_ctx, struct e1inp_line); if (!line) return -ENOMEM; /* create E1 timeslots for signalling and TRAU frames */ e1inp_ts_config(&line->ts[base_ts+1-1], line, E1INP_TS_TYPE_SIGN); e1inp_ts_config(&line->ts[base_ts+2-1], line, E1INP_TS_TYPE_TRAU); e1inp_ts_config(&line->ts[base_ts+3-1], line, E1INP_TS_TYPE_TRAU); /* create signalling links for TS1 */ sign_ts = &line->ts[base_ts+1-1]; oml_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_OML, trx, TEI_OML, SAPI_OML); rsl_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_RSL, trx, TEI_RSL, SAPI_RSL); /* create back-links from bts/trx */ bts->oml_link = oml_link; trx->rsl_link = rsl_link; /* enable subchannel demuxer on TS2 */ subch_demux_activate(&line->ts[base_ts+2-1].trau.demux, 1); subch_demux_activate(&line->ts[base_ts+2-1].trau.demux, 2); subch_demux_activate(&line->ts[base_ts+2-1].trau.demux, 3); /* enable subchannel demuxer on TS3 */ subch_demux_activate(&line->ts[base_ts+3-1].trau.demux, 0); subch_demux_activate(&line->ts[base_ts+3-1].trau.demux, 1); subch_demux_activate(&line->ts[base_ts+3-1].trau.demux, 2); subch_demux_activate(&line->ts[base_ts+3-1].trau.demux, 3); trx = gsm_bts_trx_num(bts, 1); if (trx) { /* create E1 timeslots for TRAU frames of TRX1 */ e1inp_ts_config(&line->ts[base_ts+4-1], line, E1INP_TS_TYPE_TRAU); e1inp_ts_config(&line->ts[base_ts+5-1], line, E1INP_TS_TYPE_TRAU); /* create RSL signalling link for TRX1 */ sign_ts = &line->ts[base_ts+1-1]; rsl_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_RSL, trx, TEI_RSL+1, SAPI_RSL); /* create back-links from trx */ trx->rsl_link = rsl_link; /* enable subchannel demuxer on TS2 */ subch_demux_activate(&line->ts[base_ts+4-1].trau.demux, 0); subch_demux_activate(&line->ts[base_ts+4-1].trau.demux, 1); subch_demux_activate(&line->ts[base_ts+4-1].trau.demux, 2); subch_demux_activate(&line->ts[base_ts+4-1].trau.demux, 3); /* enable subchannel demuxer on TS3 */ subch_demux_activate(&line->ts[base_ts+5-1].trau.demux, 0); subch_demux_activate(&line->ts[base_ts+5-1].trau.demux, 1); subch_demux_activate(&line->ts[base_ts+5-1].trau.demux, 2); subch_demux_activate(&line->ts[base_ts+5-1].trau.demux, 3); } return mi_setup(cardnr, line, release_l2); }
/*! \brief control interface lookup function for bsc/bts gsm_data * \param[in] data Private data passed to controlif_setup() * \param[in] vline Vector of the line holding the command string * \param[out] node_type type (CTRL_NODE_) that was determined * \param[out] node_data private dta of node that was determined * \param i Current index into vline, up to which it is parsed */ static int bsc_ctrl_node_lookup(void *data, vector vline, int *node_type, void **node_data, int *i) { struct gsm_network *net = data; struct gsm_bts *bts = NULL; struct gsm_bts_trx *trx = NULL; struct gsm_bts_trx_ts *ts = NULL; char *token = vector_slot(vline, *i); long num; /* TODO: We need to make sure that the following chars are digits * and/or use strtol to check if number conversion was successful * Right now something like net.bts_stats will not work */ if (!strcmp(token, "bts")) { if (*node_type != CTRL_NODE_ROOT || !net) goto err_missing; (*i)++; if (!ctrl_parse_get_num(vline, *i, &num)) goto err_index; bts = gsm_bts_num(net, num); if (!bts) goto err_missing; *node_data = bts; *node_type = CTRL_NODE_BTS; } else if (!strcmp(token, "trx")) { if (*node_type != CTRL_NODE_BTS || !*node_data) goto err_missing; bts = *node_data; (*i)++; if (!ctrl_parse_get_num(vline, *i, &num)) goto err_index; trx = gsm_bts_trx_num(bts, num); if (!trx) goto err_missing; *node_data = trx; *node_type = CTRL_NODE_TRX; } else if (!strcmp(token, "ts")) { if (*node_type != CTRL_NODE_TRX || !*node_data) goto err_missing; trx = *node_data; (*i)++; if (!ctrl_parse_get_num(vline, *i, &num)) goto err_index; if ((num >= 0) && (num < TRX_NR_TS)) ts = &trx->ts[num]; if (!ts) goto err_missing; *node_data = ts; *node_type = CTRL_NODE_TS; } else return 0; return 1; err_missing: return -ENODEV; err_index: return -ERANGE; }