path: root/src/osmo-bsc/abis_nm.c
diff options
authorNeels Hofmeyr <neels@hofmeyr.de>2018-06-15 20:39:58 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2018-06-15 21:00:31 +0200
commitf0ff9a67117dc22d838769fe6eef67778abd43b9 (patch)
tree6e40d44dbc64f30b078175e48755ae928555d06c /src/osmo-bsc/abis_nm.c
parente7d29e34e4f3db0ec1a5f5b9263aec38a689a76d (diff)
fix dyn TS init: properly identify BTS on OML OPSTART ACK
Commit "dyn ts, bts_ipaccess_nanobts.c: init PDCH on Chan OPSTART ACK" bf7099262adf0f27e71a08387747c5cb0d459360 Icf6e25ff068e8a2600562d52726ead65e864ec02 introduced signal S_NM_OPSTART_ACK and passed the FOM header to identify the BTS by. But the FOM header's BTS number is zero on each Abis/IP link, and the BTS and TRX are actually identified by msgb->dst == e1inp_sign_link, member trx. So the initial implementation associated *all* Channel OPSTART ACKs with BTS 0. Pass the entire msgb as S_NM_OPSTART_ACK signal argument, implement a abis_nm_get_ts() to retrieve the proper timeslot and use that during timeslot init. Related: OS#3351 OS#3205 Change-Id: I45ce5c24cb62d00f350df1af1be6c11104d74193
Diffstat (limited to 'src/osmo-bsc/abis_nm.c')
1 files changed, 27 insertions, 2 deletions
diff --git a/src/osmo-bsc/abis_nm.c b/src/osmo-bsc/abis_nm.c
index 9dc1f62cb..cb1cc56ea 100644
--- a/src/osmo-bsc/abis_nm.c
+++ b/src/osmo-bsc/abis_nm.c
@@ -671,11 +671,36 @@ static int abis_nm_rx_lmt_event(struct msgb *mb)
return 0;
+/* From a received OML message, determine the matching struct gsm_bts_trx_ts instance.
+ * Note that the BTS-TRX-TS numbers received in the FOM header do not correspond to the local bts->nr and
+ * bts->trx->nr. Rather, the trx is identified by the e1inp_sign_link* found in msg->dst, and the TS is
+ * then obtained by the FOM header's TS number. */
+struct gsm_bts_trx_ts *abis_nm_get_ts(const struct msgb *oml_msg)
+ struct abis_om_fom_hdr *foh = msgb_l3(oml_msg);
+ struct e1inp_sign_link *sign_link = oml_msg->dst;
+ struct gsm_bts_trx *trx = sign_link->trx;
+ uint8_t ts_nr = foh->obj_inst.ts_nr;
+ if (!trx) {
+ LOGP(DNM, LOGL_ERROR, "%s Channel OPSTART ACK for sign_link without trx\n",
+ abis_nm_dump_foh(foh));
+ return NULL;
+ }
+ if (ts_nr >= ARRAY_SIZE(trx->ts)) {
+ LOGP(DNM, LOGL_ERROR, "bts%u-trx%u %s Channel OPSTART ACK for non-existent TS\n",
+ trx->bts->nr, trx->nr, abis_nm_dump_foh(foh));
+ return NULL;
+ }
+ return &trx->ts[ts_nr];
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);
+ struct e1inp_sign_link *sign_link = mb->dst;
+ struct gsm_bts_trx *trx = sign_link->trx;
+ DEBUGPFOH(DNM, foh, "bts=%u trx=%u Opstart ACK\n", trx->bts->nr, trx->nr);
+ osmo_signal_dispatch(SS_NM, S_NM_OPSTART_ACK, mb);
return 0;