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_OPER, /* Operational State changed*/
|
||||||
S_NM_STATECHG_ADM, /* Administrative State changed */
|
S_NM_STATECHG_ADM, /* Administrative State changed */
|
||||||
S_NM_OM2K_CONF_RES, /* OM2K Configuration Result */
|
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 */
|
/* SS_LCHAN signals */
|
||||||
|
|
|
@ -678,6 +678,14 @@ static int abis_nm_rx_lmt_event(struct msgb *mb)
|
||||||
return 0;
|
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)
|
bool all_trx_rsl_connected_unlocked(const struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
const struct gsm_bts_trx *trx;
|
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);
|
ret = abis_nm_rx_lmt_event(mb);
|
||||||
break;
|
break;
|
||||||
case NM_MT_OPSTART_ACK:
|
case NM_MT_OPSTART_ACK:
|
||||||
DEBUGPFOH(DNM, foh, "Opstart ACK\n");
|
abis_nm_rx_opstart_ack(mb);
|
||||||
break;
|
break;
|
||||||
case NM_MT_SET_CHAN_ATTR_ACK:
|
case NM_MT_SET_CHAN_ATTR_ACK:
|
||||||
DEBUGPFOH(DNM, foh, "Set Channel Attributes ACK\n");
|
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)
|
if (bts->type == GSM_BTS_TYPE_BS11)
|
||||||
msgb_tlv_put(msg, 0x59, 1, &zero);
|
msgb_tlv_put(msg, 0x59, 1, &zero);
|
||||||
|
|
||||||
|
DEBUGPFOH(DNM, foh, "%s(): sending %s\n", __func__, msgb_hexdump(msg));
|
||||||
return abis_nm_sendmsg(bts, 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++) {
|
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
|
||||||
generate_ma_for_ts(&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;
|
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 */
|
/* 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,
|
static int bts_ipa_nm_sig_cb(unsigned int subsys, unsigned int signal,
|
||||||
void *handler_data, void *signal_data)
|
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_OPER:
|
||||||
case S_NM_STATECHG_ADM:
|
case S_NM_STATECHG_ADM:
|
||||||
return nm_statechg_event(signal, signal_data);
|
return nm_statechg_event(signal, signal_data);
|
||||||
|
case S_NM_OPSTART_ACK:
|
||||||
|
nm_rx_opstart_ack(signal_data);
|
||||||
|
return 0;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue