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:
parent
f28f1ef9af
commit
bf7099262a
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue