From 40d1c3fef1376b8f570e51b8e9c67327b5029f70 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 6 Mar 2011 23:20:28 +0100 Subject: RBS2000: Automatically connect/start/configure/enable most MOs --- openbsc/src/libbsc/abis_om2000.c | 31 ++++++++++++++++++++----------- openbsc/src/libbsc/bts_ericsson_rbs2000.c | 26 +++++++++++++++++++------- 2 files changed, 39 insertions(+), 18 deletions(-) (limited to 'openbsc/src/libbsc') diff --git a/openbsc/src/libbsc/abis_om2000.c b/openbsc/src/libbsc/abis_om2000.c index 6b83a9849..a5f5d4f88 100644 --- a/openbsc/src/libbsc/abis_om2000.c +++ b/openbsc/src/libbsc/abis_om2000.c @@ -1400,11 +1400,14 @@ static int process_conf_res(struct gsm_bts *bts, struct msgb *msg) { struct abis_om2k_hdr *o2h = msgb_l2(msg); uint16_t msg_type = ntohs(o2h->msg_type); + struct nm_om2k_signal_data nsd; struct tlv_parsed tp; uint8_t acc; unsigned int log_level; int ret; + memset(&nsd, 0, sizeof(nsd)); + abis_om2k_msg_tlv_parse(&tp, o2h); if (!TLVP_PRESENT(&tp, OM2K_DEI_ACCORDANCE_IND)) return -EIO; @@ -1427,6 +1430,12 @@ static int process_conf_res(struct gsm_bts *bts, struct msgb *msg) get_value_string(om2k_msgcode_vals, msg_type), get_value_string(om2k_accordance_strings, acc)); + nsd.bts = bts; + nsd.obj = mo2obj(bts, &o2h->mo); + nsd.om2k_mo = &o2h->mo; + nsd.accordance_ind = acc; + dispatch_signal(SS_NM, S_NM_OM2K_CONF_RES, &nsd); + return ret; } @@ -1490,42 +1499,42 @@ int abis_om2k_rcvmsg(struct msgb *msg) rc = abis_om2k_cal_time_resp(bts); break; case OM2K_MSGT_FAULT_REP: - process_mo_state(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_FAULT_REP_ACK); + process_mo_state(bts, msg); break; case OM2K_MSGT_NEGOT_REQ: rc = om2k_rx_negot_req(msg); break; case OM2K_MSGT_START_RES: - process_mo_state(bts, msg); rc = om2k_rx_start_res(msg); + process_mo_state(bts, msg); break; case OM2K_MSGT_OP_INFO_ACK: rc = om2k_rx_op_info_ack(msg); break; case OM2K_MSGT_IS_CONF_RES: - process_conf_res(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_IS_CONF_RES_ACK); + process_conf_res(bts, msg); break; case OM2K_MSGT_CON_CONF_RES: - process_conf_res(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_CON_CONF_RES_ACK); + process_conf_res(bts, msg); break; case OM2K_MSGT_TX_CONF_RES: - process_conf_res(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TX_CONF_RES_ACK); + process_conf_res(bts, msg); break; case OM2K_MSGT_RX_CONF_RES: - process_conf_res(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_RX_CONF_RES_ACK); + process_conf_res(bts, msg); break; case OM2K_MSGT_TS_CONF_RES: - process_conf_res(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TS_CONF_RES_ACK); + process_conf_res(bts, msg); break; case OM2K_MSGT_TF_CONF_RES: - process_conf_res(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TF_CONF_RES_ACK); + process_conf_res(bts, msg); break; case OM2K_MSGT_CONNECT_COMPL: rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_RESET_CMD); @@ -1534,16 +1543,16 @@ int abis_om2k_rcvmsg(struct msgb *msg) rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_START_REQ); break; case OM2K_MSGT_ENABLE_RES: - process_mo_state(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_ENABLE_RES_ACK); + process_mo_state(bts, msg); break; case OM2K_MSGT_DISABLE_RES: - process_mo_state(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_DISABLE_RES_ACK); + process_mo_state(bts, msg); break; case OM2K_MSGT_TEST_RES: - process_mo_state(bts, msg); rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TEST_RES_ACK); + process_mo_state(bts, msg); break; case OM2K_MSGT_STATUS_RESP: process_mo_state(bts, msg); diff --git a/openbsc/src/libbsc/bts_ericsson_rbs2000.c b/openbsc/src/libbsc/bts_ericsson_rbs2000.c index 6480d34a5..1b64b369a 100644 --- a/openbsc/src/libbsc/bts_ericsson_rbs2000.c +++ b/openbsc/src/libbsc/bts_ericsson_rbs2000.c @@ -161,13 +161,12 @@ static void nm_statechg_evt(unsigned int signal, case OM2K_MO_CLS_IS: if (nsd->new_state->availability == OM2K_MO_S_ENABLED) { /* IS is enabled, we can proceed with TRXC/RX/TX/TS */ + break; } - if (nsd->new_state->operational != NM_OPSTATE_ENABLED || - nsd->new_state->availability == OM2K_MO_S_DISABLED) + if (nsd->new_state->operational != NM_OPSTATE_ENABLED) break; /* IS has started, we can configure + enable it */ abis_om2k_tx_is_conf_req(nsd->bts); - abis_om2k_tx_enable_req(nsd->bts, nsd->om2k_mo); break; case OM2K_MO_CLS_TF: if (nsd->new_state->operational != NM_OPSTATE_ENABLED || @@ -176,12 +175,10 @@ static void nm_statechg_evt(unsigned int signal, if (nsd->new_state->availability == OM2K_MO_S_STARTED) { /* TF has started, configure + enable it */ abis_om2k_tx_is_conf_req(nsd->bts); - abis_om2k_tx_enable_req(nsd->bts, nsd->om2k_mo); } break; case OM2K_MO_CLS_TRXC: - if (nsd->new_state->operational != NM_OPSTATE_ENABLED || - nsd->new_state->availability != OM2K_MO_S_STARTED) + if (nsd->new_state->availability != OM2K_MO_S_STARTED) break; /* TRXC is started, connect the TX and RX objects */ memcpy(&mo, nsd->om2k_mo, sizeof(mo)); @@ -196,7 +193,6 @@ static void nm_statechg_evt(unsigned int signal, break; /* RX is started, configure + enable it */ abis_om2k_tx_rx_conf_req(nsd->obj); - abis_om2k_tx_enable_req(nsd->bts, nsd->om2k_mo); break; case OM2K_MO_CLS_TX: if (nsd->new_state->operational != NM_OPSTATE_ENABLED || @@ -204,6 +200,18 @@ static void nm_statechg_evt(unsigned int signal, break; /* RX is started, configure + enable it */ abis_om2k_tx_tx_conf_req(nsd->obj); + break; + } +} + +static void nm_conf_res(struct nm_om2k_signal_data *nsd) +{ + switch (nsd->om2k_mo->class) { + case OM2K_MO_CLS_IS: + case OM2K_MO_CLS_TF: + case OM2K_MO_CLS_RX: + case OM2K_MO_CLS_TX: + /* If configuration was a success, enable it */ abis_om2k_tx_enable_req(nsd->bts, nsd->om2k_mo); break; } @@ -219,6 +227,10 @@ static int nm_sig_cb(unsigned int subsys, unsigned int signal, case S_NM_STATECHG_OPER: case S_NM_STATECHG_ADM: nm_statechg_evt(signal, signal_data); + break; + case S_NM_OM2K_CONF_RES: + nm_conf_res(signal_data); + break; default: break; } -- cgit v1.2.3