RBS2000: Automatically connect/start/configure/enable most MOs

This commit is contained in:
Harald Welte 2011-03-06 23:20:28 +01:00
parent b66af0055a
commit e235c011a7
3 changed files with 48 additions and 18 deletions

View File

@ -84,6 +84,7 @@ enum signal_nm {
S_NM_TEST_REP, /* GSM 12.21 Test Report */
S_NM_STATECHG_OPER, /* Operational State changed*/
S_NM_STATECHG_ADM, /* Administrative State changed */
S_NM_OM2K_CONF_RES, /* OM2K Configuration Result */
};
/* SS_LCHAN signals */
@ -187,6 +188,14 @@ struct nm_statechg_signal_data {
struct abis_om2k_mo *om2k_mo;
};
struct nm_om2k_signal_data {
struct gsm_bts *bts;
void *obj;
struct abis_om2k_mo *om2k_mo;
uint8_t accordance_ind;
};
struct nm_nack_signal_data {
struct msgb *msg;
uint8_t mt;

View File

@ -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);

View File

@ -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;
}