properly reset the MO state of all MO on Abis disconnect

When we loose the A-bis link, we should properly re-set the
administrative, operational and availability state of all MOs
This commit is contained in:
Harald Welte 2011-06-29 16:49:03 +02:00
parent c7921c9205
commit b7849987e5
3 changed files with 38 additions and 10 deletions

View File

@ -568,6 +568,8 @@ char *gsm_lchan_name(struct gsm_lchan *lchan);
const char *gsm_lchans_name(enum gsm_lchan_state s);
void gsm_abis_mo_reset(struct gsm_abis_mo *mo);
struct gsm_abis_mo *
gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
struct abis_om_obj_inst *obj_inst);
@ -579,6 +581,9 @@ void *
gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,
struct abis_om_obj_inst *obj_inst);
/* reset the state of all MO in the BTS */
void gsm_bts_mo_reset(struct gsm_bts *bts);
uint8_t gsm_ts2chan_nr(const struct gsm_bts_trx_ts *ts, uint8_t lchan_nr);
uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);

View File

@ -292,15 +292,9 @@ static int inp_sig_cb(unsigned int subsys, unsigned int signal,
lchan_free(&ts->lchan[lchan_no]);
lchan_reset(&ts->lchan[lchan_no]);
}
ts->mo.nm_state.operational = 0;
ts->mo.nm_state.availability = 0;
}
trx->mo.nm_state.operational = 0;
trx->mo.nm_state.availability = 0;
trx->bb_transc.mo.nm_state.operational = 0;
trx->bb_transc.mo.nm_state.availability = 0;
gsm_bts_mo_reset(trx->bts);
abis_nm_clear_queue(trx->bts);
break;

View File

@ -34,6 +34,13 @@
#include <openbsc/gsm_data.h>
void gsm_abis_mo_reset(struct gsm_abis_mo *mo)
{
mo->nm_state.administrative = NM_STATE_NULL;
mo->nm_state.operational = NM_OPSTATE_NULL;
mo->nm_state.availability = NM_AVSTATE_POWER_OFF;
}
static void gsm_mo_init(struct gsm_abis_mo *mo, struct gsm_bts *bts,
uint8_t obj_class, uint8_t p1, uint8_t p2, uint8_t p3)
{
@ -42,9 +49,7 @@ static void gsm_mo_init(struct gsm_abis_mo *mo, struct gsm_bts *bts,
mo->obj_inst.bts_nr = p1;
mo->obj_inst.trx_nr = p2;
mo->obj_inst.ts_nr = p3;
mo->nm_state.administrative = NM_STATE_NULL;
mo->nm_state.operational = NM_OPSTATE_NULL;
mo->nm_state.availability = NM_AVSTATE_POWER_OFF;
gsm_abis_mo_reset(mo);
}
static const struct value_string pchan_names[] = {
@ -217,6 +222,30 @@ struct gsm_bts *gsm_bts_alloc(void *ctx)
return bts;
}
/* reset the state of all MO in the BTS */
void gsm_bts_mo_reset(struct gsm_bts *bts)
{
struct gsm_bts_trx *trx;
unsigned int i;
gsm_abis_mo_reset(&bts->mo);
gsm_abis_mo_reset(&bts->site_mgr.mo);
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++)
gsm_abis_mo_reset(&bts->gprs.nsvc[i].mo);
gsm_abis_mo_reset(&bts->gprs.nse.mo);
gsm_abis_mo_reset(&bts->gprs.cell.mo);
llist_for_each_entry(trx, &bts->trx_list, list) {
gsm_abis_mo_reset(&trx->mo);
gsm_abis_mo_reset(&trx->bb_transc.mo);
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
struct gsm_bts_trx_ts *ts = &trx->ts[i];
gsm_abis_mo_reset(&ts->mo);
}
}
}
struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num)
{
struct gsm_bts_trx *trx;