patch the SI and NM attr tables independently
This commit is contained in:
parent
37a7d361f4
commit
000c0f44f3
|
@ -63,6 +63,8 @@ static const char *database_name = "hlr.sqlite3";
|
||||||
static const char *config_file = "openbsc.cfg";
|
static const char *config_file = "openbsc.cfg";
|
||||||
extern int ipacc_rtp_direct;
|
extern int ipacc_rtp_direct;
|
||||||
|
|
||||||
|
static void patch_nm_tables(struct gsm_bts *bts);
|
||||||
|
static void patch_si_tables(struct gsm_bts *bts);
|
||||||
|
|
||||||
/* The following definitions are for OM and NM packets that we cannot yet
|
/* The following definitions are for OM and NM packets that we cannot yet
|
||||||
* generate by code but we just pass on */
|
* generate by code but we just pass on */
|
||||||
|
@ -390,6 +392,7 @@ int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
|
||||||
case NM_OC_BTS:
|
case NM_OC_BTS:
|
||||||
bts = obj;
|
bts = obj;
|
||||||
if (new_state->availability == 5) {
|
if (new_state->availability == 5) {
|
||||||
|
patch_nm_tables(bts);
|
||||||
abis_nm_set_bts_attr(bts, nanobts_attr_bts,
|
abis_nm_set_bts_attr(bts, nanobts_attr_bts,
|
||||||
sizeof(nanobts_attr_bts));
|
sizeof(nanobts_attr_bts));
|
||||||
abis_nm_opstart(bts, NM_OC_BTS,
|
abis_nm_opstart(bts, NM_OC_BTS,
|
||||||
|
@ -444,6 +447,7 @@ static int sw_activ_rep(struct msgb *mb)
|
||||||
NM_STATE_UNLOCKED);
|
NM_STATE_UNLOCKED);
|
||||||
break;
|
break;
|
||||||
case NM_OC_RADIO_CARRIER:
|
case NM_OC_RADIO_CARRIER:
|
||||||
|
patch_nm_tables(trx->bts);
|
||||||
abis_nm_set_radio_attr(trx, nanobts_attr_radio,
|
abis_nm_set_radio_attr(trx, nanobts_attr_radio,
|
||||||
sizeof(nanobts_attr_radio));
|
sizeof(nanobts_attr_radio));
|
||||||
abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
|
abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
|
||||||
|
@ -514,6 +518,8 @@ static void nm_reconfig_trx(struct gsm_bts_trx *trx)
|
||||||
struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
|
struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
patch_nm_tables(trx->bts);
|
||||||
|
|
||||||
switch (trx->bts->type) {
|
switch (trx->bts->type) {
|
||||||
case GSM_BTS_TYPE_BS11:
|
case GSM_BTS_TYPE_BS11:
|
||||||
/* FIXME: discover this by fetching an attribute */
|
/* FIXME: discover this by fetching an attribute */
|
||||||
|
@ -876,10 +882,41 @@ static int set_system_infos(struct gsm_bts_trx *trx)
|
||||||
* Patch the various SYSTEM INFORMATION tables to update
|
* Patch the various SYSTEM INFORMATION tables to update
|
||||||
* the LAI
|
* the LAI
|
||||||
*/
|
*/
|
||||||
static void patch_tables(struct gsm_bts *bts)
|
static void patch_nm_tables(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
|
u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
|
||||||
u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
|
u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
|
||||||
|
|
||||||
|
/* patch ARFCN into BTS Attributes */
|
||||||
|
bs11_attr_bts[69] &= 0xf0;
|
||||||
|
bs11_attr_bts[69] |= arfcn_high;
|
||||||
|
bs11_attr_bts[70] = arfcn_low;
|
||||||
|
nanobts_attr_bts[42] &= 0xf0;
|
||||||
|
nanobts_attr_bts[42] |= arfcn_high;
|
||||||
|
nanobts_attr_bts[43] = arfcn_low;
|
||||||
|
|
||||||
|
/* patch ARFCN into TRX Attributes */
|
||||||
|
bs11_attr_radio[2] &= 0xf0;
|
||||||
|
bs11_attr_radio[2] |= arfcn_high;
|
||||||
|
bs11_attr_radio[3] = arfcn_low;
|
||||||
|
nanobts_attr_radio[5] &= 0xf0;
|
||||||
|
nanobts_attr_radio[5] |= arfcn_high;
|
||||||
|
nanobts_attr_radio[6] = arfcn_low;
|
||||||
|
|
||||||
|
/* patch BSIC */
|
||||||
|
bs11_attr_bts[1] = bts->bsic;
|
||||||
|
nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Patch the various SYSTEM INFORMATION tables to update
|
||||||
|
* the LAI
|
||||||
|
*/
|
||||||
|
static void patch_si_tables(struct gsm_bts *bts)
|
||||||
|
{
|
||||||
|
u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
|
||||||
|
u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
|
||||||
|
|
||||||
/* covert the raw packet to the struct */
|
/* covert the raw packet to the struct */
|
||||||
struct gsm48_system_information_type_1 *type_1 =
|
struct gsm48_system_information_type_1 *type_1 =
|
||||||
(struct gsm48_system_information_type_1*)&si1;
|
(struct gsm48_system_information_type_1*)&si1;
|
||||||
|
@ -902,22 +939,6 @@ static void patch_tables(struct gsm_bts *bts)
|
||||||
type_4->lai = lai;
|
type_4->lai = lai;
|
||||||
type_6->lai = lai;
|
type_6->lai = lai;
|
||||||
|
|
||||||
/* patch ARFCN into BTS Attributes */
|
|
||||||
bs11_attr_bts[69] &= 0xf0;
|
|
||||||
bs11_attr_bts[69] |= arfcn_high;
|
|
||||||
bs11_attr_bts[70] = arfcn_low;
|
|
||||||
nanobts_attr_bts[42] &= 0xf0;
|
|
||||||
nanobts_attr_bts[42] |= arfcn_high;
|
|
||||||
nanobts_attr_bts[43] = arfcn_low;
|
|
||||||
|
|
||||||
/* patch ARFCN into TRX Attributes */
|
|
||||||
bs11_attr_radio[2] &= 0xf0;
|
|
||||||
bs11_attr_radio[2] |= arfcn_high;
|
|
||||||
bs11_attr_radio[3] = arfcn_low;
|
|
||||||
nanobts_attr_radio[5] &= 0xf0;
|
|
||||||
nanobts_attr_radio[5] |= arfcn_high;
|
|
||||||
nanobts_attr_radio[6] = arfcn_low;
|
|
||||||
|
|
||||||
type_4->data[2] &= 0xf0;
|
type_4->data[2] &= 0xf0;
|
||||||
type_4->data[2] |= arfcn_high;
|
type_4->data[2] |= arfcn_high;
|
||||||
type_4->data[3] = arfcn_low;
|
type_4->data[3] = arfcn_low;
|
||||||
|
@ -925,10 +946,6 @@ static void patch_tables(struct gsm_bts *bts)
|
||||||
/* patch Control Channel Description 10.5.2.11 */
|
/* patch Control Channel Description 10.5.2.11 */
|
||||||
type_3->control_channel_desc = bts->chan_desc;
|
type_3->control_channel_desc = bts->chan_desc;
|
||||||
|
|
||||||
/* patch BSIC */
|
|
||||||
bs11_attr_bts[1] = bts->bsic;
|
|
||||||
nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
|
|
||||||
|
|
||||||
/* patch TSC */
|
/* patch TSC */
|
||||||
si4[15] &= ~0xe0;
|
si4[15] &= ~0xe0;
|
||||||
si4[15] |= (bts->tsc & 7) << 5;
|
si4[15] |= (bts->tsc & 7) << 5;
|
||||||
|
@ -957,6 +974,7 @@ static void bootstrap_rsl(struct gsm_bts_trx *trx)
|
||||||
"using MCC=%u MNC=%u BSIC=%u TSC=%u\n",
|
"using MCC=%u MNC=%u BSIC=%u TSC=%u\n",
|
||||||
trx->bts->nr, trx->nr, gsmnet->country_code,
|
trx->bts->nr, trx->nr, gsmnet->country_code,
|
||||||
gsmnet->network_code, trx->bts->bsic, trx->bts->tsc);
|
gsmnet->network_code, trx->bts->bsic, trx->bts->tsc);
|
||||||
|
patch_si_tables(trx->bts);
|
||||||
set_system_infos(trx);
|
set_system_infos(trx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1013,8 +1031,6 @@ static int bootstrap_bts(struct gsm_bts *bts)
|
||||||
bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
|
bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
|
||||||
bts->chan_desc.t3212 = 0;
|
bts->chan_desc.t3212 = 0;
|
||||||
|
|
||||||
patch_tables(bts);
|
|
||||||
|
|
||||||
paging_init(bts);
|
paging_init(bts);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue