dyn ts, bts_ipaccess_nanobts.c: init PDCH on Chan OPSTART ACK

Sending PDCH activation upon RSL bootstrap is too early. Introduce OPSTART ACK
handling to call dyn_ts_init() only when the dynamic timeslot is indeed ready
to receive a PDCH activation.

Related: OS#3205
Change-Id: Icf6e25ff068e8a2600562d52726ead65e864ec02
This commit is contained in:
Neels Hofmeyr 2018-05-03 16:11:28 +02:00
parent f28f1ef9af
commit bf7099262a
4 changed files with 54 additions and 2 deletions

View File

@ -71,6 +71,7 @@ enum signal_nm {
S_NM_STATECHG_OPER, /* Operational State changed*/
S_NM_STATECHG_ADM, /* Administrative State changed */
S_NM_OM2K_CONF_RES, /* OM2K Configuration Result */
S_NM_OPSTART_ACK, /* Received OPSTART ACK, arg is struct abis_om_fom_hdr* */
};
/* SS_LCHAN signals */

View File

@ -678,6 +678,14 @@ static int abis_nm_rx_lmt_event(struct msgb *mb)
return 0;
}
static int abis_nm_rx_opstart_ack(struct msgb *mb)
{
struct abis_om_fom_hdr *foh = msgb_l3(mb);
DEBUGPFOH(DNM, foh, "Opstart ACK\n");
osmo_signal_dispatch(SS_NM, S_NM_OPSTART_ACK, foh);
return 0;
}
bool all_trx_rsl_connected_unlocked(const struct gsm_bts *bts)
{
const struct gsm_bts_trx *trx;
@ -802,7 +810,7 @@ static int abis_nm_rcvmsg_fom(struct msgb *mb)
ret = abis_nm_rx_lmt_event(mb);
break;
case NM_MT_OPSTART_ACK:
DEBUGPFOH(DNM, foh, "Opstart ACK\n");
abis_nm_rx_opstart_ack(mb);
break;
case NM_MT_SET_CHAN_ATTR_ACK:
DEBUGPFOH(DNM, foh, "Set Channel Attributes ACK\n");
@ -1896,6 +1904,7 @@ int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, uint8_t chan_comb)
if (bts->type == GSM_BTS_TYPE_BS11)
msgb_tlv_put(msg, 0x59, 1, &zero);
DEBUGPFOH(DNM, foh, "%s(): sending %s\n", __func__, msgb_hexdump(msg));
return abis_nm_sendmsg(bts, msg);
}

View File

@ -354,7 +354,6 @@ static void bootstrap_rsl(struct gsm_bts_trx *trx)
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
generate_ma_for_ts(&trx->ts[i]);
dyn_ts_init(&trx->ts[i]);
}
}

View File

@ -294,6 +294,46 @@ static int sw_activ_rep(struct msgb *mb)
return 0;
}
static struct gsm_bts_trx_ts *gsm_bts_trx_ts(struct gsm_network *net,
int bts_nr, int trx_nr, int ts_nr)
{
struct gsm_bts *bts;
struct gsm_bts_trx *trx;
bts = gsm_bts_num(net, bts_nr);
if (!bts)
return NULL;
trx = gsm_bts_trx_by_nr(bts, trx_nr);
if (!trx)
return NULL;
if (ts_nr < 0 || ts_nr > ARRAY_SIZE(trx->ts))
return NULL;
return &trx->ts[ts_nr];
}
static void nm_rx_opstart_ack_chan(struct abis_om_fom_hdr *foh)
{
struct gsm_bts_trx_ts *ts;
ts = gsm_bts_trx_ts(bsc_gsmnet, foh->obj_inst.bts_nr, foh->obj_inst.trx_nr, foh->obj_inst.ts_nr);
if (!ts) {
LOGP(DNM, LOGL_ERROR, "%s Channel OPSTART ACK for non-existent TS\n",
abis_nm_dump_foh(foh));
return;
}
dyn_ts_init(ts);
}
static void nm_rx_opstart_ack(struct abis_om_fom_hdr *foh)
{
switch (foh->obj_class) {
case NM_OC_CHANNEL:
nm_rx_opstart_ack_chan(foh);
break;
default:
break;
}
}
/* Callback function to be called every time we receive a signal from NM */
static int bts_ipa_nm_sig_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data)
@ -307,6 +347,9 @@ static int bts_ipa_nm_sig_cb(unsigned int subsys, unsigned int signal,
case S_NM_STATECHG_OPER:
case S_NM_STATECHG_ADM:
return nm_statechg_event(signal, signal_data);
case S_NM_OPSTART_ACK:
nm_rx_opstart_ack(signal_data);
return 0;
default:
break;
}