<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9650">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fix dyn TS init: properly identify BTS on OML OPSTART ACK<br><br>Commit "dyn ts, bts_ipaccess_nanobts.c: init PDCH on Chan OPSTART ACK"<br>bf7099262adf0f27e71a08387747c5cb0d459360 Icf6e25ff068e8a2600562d52726ead65e864ec02<br>introduced signal S_NM_OPSTART_ACK and passed the FOM header to identify the BTS<br>by. But the FOM header's BTS number is zero on each Abis/IP link, and the BTS<br>and TRX are actually identified by msgb->dst == e1inp_sign_link, member trx. So<br>the initial implementation associated *all* Channel OPSTART ACKs with BTS 0.<br><br>Pass the entire msgb as S_NM_OPSTART_ACK signal argument, implement a<br>abis_nm_get_ts() to retrieve the proper timeslot and use that during timeslot<br>init.<br><br>Related: OS#3351 OS#3205<br>Change-Id: I45ce5c24cb62d00f350df1af1be6c11104d74193<br>---<br>M include/osmocom/bsc/abis_nm.h<br>M include/osmocom/bsc/signal.h<br>M src/osmo-bsc/abis_nm.c<br>M src/osmo-bsc/bts_ipaccess_nanobts.c<br>4 files changed, 37 insertions(+), 27 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/50/9650/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/abis_nm.h b/include/osmocom/bsc/abis_nm.h</span><br><span>index 9586ded..ef9e4f5 100644</span><br><span>--- a/include/osmocom/bsc/abis_nm.h</span><br><span>+++ b/include/osmocom/bsc/abis_nm.h</span><br><span>@@ -171,4 +171,6 @@</span><br><span> /* Helper functions for updating attributes */</span><br><span> int abis_nm_update_max_power_red(struct gsm_bts_trx *trx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx_ts *abis_nm_get_ts(const struct msgb *oml_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _NM_H */</span><br><span>diff --git a/include/osmocom/bsc/signal.h b/include/osmocom/bsc/signal.h</span><br><span>index 1dde267..1b351aa 100644</span><br><span>--- a/include/osmocom/bsc/signal.h</span><br><span>+++ b/include/osmocom/bsc/signal.h</span><br><span>@@ -71,7 +71,7 @@</span><br><span>       S_NM_STATECHG_OPER,     /* Operational State changed*/</span><br><span>       S_NM_STATECHG_ADM,      /* Administrative State changed */</span><br><span>   S_NM_OM2K_CONF_RES,     /* OM2K Configuration Result */</span><br><span style="color: hsl(0, 100%, 40%);">- S_NM_OPSTART_ACK,       /* Received OPSTART ACK, arg is struct abis_om_fom_hdr* */</span><br><span style="color: hsl(120, 100%, 40%);">+    S_NM_OPSTART_ACK,       /* Received OPSTART ACK, arg is struct msgb *oml_msg */</span><br><span> };</span><br><span> </span><br><span> /* SS_LCHAN signals */</span><br><span>diff --git a/src/osmo-bsc/abis_nm.c b/src/osmo-bsc/abis_nm.c</span><br><span>index 9dc1f62..cb1cc56 100644</span><br><span>--- a/src/osmo-bsc/abis_nm.c</span><br><span>+++ b/src/osmo-bsc/abis_nm.c</span><br><span>@@ -671,11 +671,36 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* From a received OML message, determine the matching struct gsm_bts_trx_ts instance.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Note that the BTS-TRX-TS numbers received in the FOM header do not correspond to the local bts->nr and</span><br><span style="color: hsl(120, 100%, 40%);">+ * bts->trx->nr. Rather, the trx is identified by the e1inp_sign_link* found in msg->dst, and the TS is</span><br><span style="color: hsl(120, 100%, 40%);">+ * then obtained by the FOM header's TS number. */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx_ts *abis_nm_get_ts(const struct msgb *oml_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct abis_om_fom_hdr *foh = msgb_l3(oml_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct e1inp_sign_link *sign_link = oml_msg->dst;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx = sign_link->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t ts_nr = foh->obj_inst.ts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!trx) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DNM, LOGL_ERROR, "%s Channel OPSTART ACK for sign_link without trx\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              abis_nm_dump_foh(foh));</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ts_nr >= ARRAY_SIZE(trx->ts)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DNM, LOGL_ERROR, "bts%u-trx%u %s Channel OPSTART ACK for non-existent TS\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                trx->bts->nr, trx->nr, abis_nm_dump_foh(foh));</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     return &trx->ts[ts_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int abis_nm_rx_opstart_ack(struct msgb *mb)</span><br><span> {</span><br><span>       struct abis_om_fom_hdr *foh = msgb_l3(mb);</span><br><span style="color: hsl(0, 100%, 40%);">-      DEBUGPFOH(DNM, foh, "Opstart ACK\n");</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_signal_dispatch(SS_NM, S_NM_OPSTART_ACK, foh);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct e1inp_sign_link *sign_link = mb->dst;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx *trx = sign_link->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+  DEBUGPFOH(DNM, foh, "bts=%u trx=%u Opstart ACK\n", trx->bts->nr, trx->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_signal_dispatch(SS_NM, S_NM_OPSTART_ACK, mb);</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>index 843f264..0e23955 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>@@ -298,40 +298,23 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsm_bts_trx_ts *gsm_bts_trx_ts(struct gsm_network *net,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      int bts_nr, int trx_nr, int ts_nr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        bts = gsm_bts_num(net, bts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!bts)</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    trx = gsm_bts_trx_by_nr(bts, trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!trx)</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ts_nr < 0 || ts_nr > ARRAY_SIZE(trx->ts))</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    return &trx->ts[ts_nr];</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void nm_rx_opstart_ack_chan(struct abis_om_fom_hdr *foh)</span><br><span style="color: hsl(120, 100%, 40%);">+static void nm_rx_opstart_ack_chan(struct msgb *oml_msg)</span><br><span> {</span><br><span>        struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(0, 100%, 40%);">-      ts = gsm_bts_trx_ts(bsc_gsmnet, foh->obj_inst.bts_nr, foh->obj_inst.trx_nr, foh->obj_inst.ts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!ts) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DNM, LOGL_ERROR, "%s Channel OPSTART ACK for non-existent TS\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              abis_nm_dump_foh(foh));</span><br><span style="color: hsl(120, 100%, 40%);">+  ts = abis_nm_get_ts(oml_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ts)</span><br><span style="color: hsl(120, 100%, 40%);">+              /* error already logged in abis_nm_get_ts() */</span><br><span>               return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span> </span><br><span>        gsm_ts_check_init(ts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void nm_rx_opstart_ack(struct abis_om_fom_hdr *foh)</span><br><span style="color: hsl(120, 100%, 40%);">+static void nm_rx_opstart_ack(struct msgb *oml_msg)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct abis_om_fom_hdr *foh = msgb_l3(oml_msg);</span><br><span>      switch (foh->obj_class) {</span><br><span>         case NM_OC_CHANNEL:</span><br><span style="color: hsl(0, 100%, 40%);">-             nm_rx_opstart_ack_chan(foh);</span><br><span style="color: hsl(120, 100%, 40%);">+          nm_rx_opstart_ack_chan(oml_msg);</span><br><span>             break;</span><br><span>       default:</span><br><span>             break;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9650">change 9650</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9650"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I45ce5c24cb62d00f350df1af1be6c11104d74193 </div>
<div style="display:none"> Gerrit-Change-Number: 9650 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>