<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/20407">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Change NM Channel availability Dependency->Offline when RadioCarrier becomes enabled<br><br>This fix allows osmo-bts to play fine with newer osmo-bsc NM OML FSMs,<br>which expectes for non-nanoBTS types to follow TS 12.21 guidelines.<br>Until now, BSC simply waited to received State Event Change Dependency<br>for each TS and then sent all required commands (Set Chan Attr, Adm<br>Unlock and Opstart). In newer osmo-bsc FSMs, Opstart is only sent when<br>in Offline state, so we need to transit to that state. For the above<br>mentioned reason, since we pass through the Dependency state anyway<br>after this patch, older osmo-bscs will work correctly too.<br><br>Change-Id: Id9e61f8d773e6e6170c68b5b836d276c747d8d69<br>---<br>M src/osmo-bts-litecell15/oml.c<br>M src/osmo-bts-oc2g/oml.c<br>M src/osmo-bts-octphy/l1_oml.c<br>M src/osmo-bts-omldummy/bts_model.c<br>M src/osmo-bts-sysmo/oml.c<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-virtual/bts_model.c<br>7 files changed, 83 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c</span><br><span>index f14f808..194ba7f 100644</span><br><span>--- a/src/osmo-bts-litecell15/oml.c</span><br><span>+++ b/src/osmo-bts-litecell15/oml.c</span><br><span>@@ -268,6 +268,8 @@</span><br><span> {</span><br><span>         GsmL1_Prim_t *l1p = msgb_l1prim(l1_msg);</span><br><span>     GsmL1_Status_t status = prim_status(l1p);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_trx *trx = gsm_bts_trx_num(mo->bts, mo->obj_inst.trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t tn;</span><br><span> </span><br><span>      if (status != GsmL1_Status_Success) {</span><br><span>                LOGP(DL1C, LOGL_ERROR, "Rx %s, status: %s\n",</span><br><span>@@ -282,6 +284,16 @@</span><br><span>       /* Set to Operational State: Enabled */</span><br><span>      oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (mo->obj_class == NM_OC_RADIO_CARRIER) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx->ts[tn].mo.nm_state.availability ==  NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */</span><br><span>  if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 &&</span><br><span>          mo->obj_inst.ts_nr == 0) {</span><br><span>diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c</span><br><span>index f9faacf..695850c 100644</span><br><span>--- a/src/osmo-bts-oc2g/oml.c</span><br><span>+++ b/src/osmo-bts-oc2g/oml.c</span><br><span>@@ -268,6 +268,8 @@</span><br><span> {</span><br><span>        GsmL1_Prim_t *l1p = msgb_l1prim(l1_msg);</span><br><span>     GsmL1_Status_t status = prim_status(l1p);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_trx *trx = gsm_bts_trx_num(mo->bts, mo->obj_inst.trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t tn;</span><br><span> </span><br><span>      if (status != GsmL1_Status_Success) {</span><br><span>                LOGP(DL1C, LOGL_ERROR, "Rx %s, status: %s\n",</span><br><span>@@ -282,6 +284,16 @@</span><br><span>       /* Set to Operational State: Enabled */</span><br><span>      oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (mo->obj_class == NM_OC_RADIO_CARRIER) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx->ts[tn].mo.nm_state.availability ==  NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */</span><br><span>  if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 &&</span><br><span>          mo->obj_inst.ts_nr == 0) {</span><br><span>diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c</span><br><span>index 300d618..7c203eb 100644</span><br><span>--- a/src/osmo-bts-octphy/l1_oml.c</span><br><span>+++ b/src/osmo-bts-octphy/l1_oml.c</span><br><span>@@ -185,11 +185,23 @@</span><br><span> </span><br><span> static int opstart_compl(struct gsm_abis_mo *mo)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *trx = gsm_bts_trx_num(mo->bts, mo->obj_inst.trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t tn;</span><br><span>  /* TODO: Send NACK in case of error! */</span><br><span> </span><br><span>  /* Set to Operational State: Enabled */</span><br><span>      oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (mo->obj_class == NM_OC_RADIO_CARRIER) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx->ts[tn].mo.nm_state.availability ==  NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */</span><br><span>       if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 &&</span><br><span>          mo->obj_inst.ts_nr == 7) {</span><br><span>diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c</span><br><span>index edf3e6b..8a54107 100644</span><br><span>--- a/src/osmo-bts-omldummy/bts_model.c</span><br><span>+++ b/src/osmo-bts-omldummy/bts_model.c</span><br><span>@@ -122,9 +122,22 @@</span><br><span> int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj)</span><br><span> {</span><br><span>      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx* trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t tn;</span><br><span> </span><br><span>      switch (mo->obj_class) {</span><br><span>  case NM_OC_RADIO_CARRIER:</span><br><span style="color: hsl(120, 100%, 40%);">+             trx = (struct gsm_bts_trx*) obj;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx->ts[tn].mo.nm_state.availability == NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = oml_mo_opstart_ack(mo);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>  case NM_OC_SITE_MANAGER:</span><br><span>     case NM_OC_BASEB_TRANSC:</span><br><span>diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c</span><br><span>index 472a7ae..cc53d72 100644</span><br><span>--- a/src/osmo-bts-sysmo/oml.c</span><br><span>+++ b/src/osmo-bts-sysmo/oml.c</span><br><span>@@ -267,6 +267,8 @@</span><br><span> {</span><br><span>     GsmL1_Prim_t *l1p = msgb_l1prim(l1_msg);</span><br><span>     GsmL1_Status_t status = prim_status(l1p);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_trx *trx = gsm_bts_trx_num(mo->bts, mo->obj_inst.trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t tn;</span><br><span> </span><br><span>      if (status != GsmL1_Status_Success) {</span><br><span>                LOGP(DL1C, LOGL_ERROR, "Rx %s, status: %s\n",</span><br><span>@@ -281,6 +283,16 @@</span><br><span>       /* Set to Operational State: Enabled */</span><br><span>      oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (mo->obj_class == NM_OC_RADIO_CARRIER) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx->ts[tn].mo.nm_state.availability ==  NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */</span><br><span>  if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 &&</span><br><span>          mo->obj_inst.ts_nr == 0) {</span><br><span>diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index bd3661c..8ad004e 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.c</span><br><span>+++ b/src/osmo-bts-trx/l1_if.c</span><br><span>@@ -199,6 +199,7 @@</span><br><span>         struct phy_instance *pinst = trx_phy_instance(trx);</span><br><span>  struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span>       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t tn;</span><br><span> </span><br><span>      rc = osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_CFG_ENABLE, (void*)(intptr_t)true);</span><br><span>    if (rc != 0)</span><br><span>@@ -207,6 +208,14 @@</span><br><span>  if (trx == trx->bts->c0)</span><br><span>               lchan_init_lapdm(&trx->ts[0].lchan[CCCH_LCHAN]);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+              trx->ts[tn].mo.nm_state.availability ==  NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Send OPSTART ack */</span><br><span>       return oml_mo_opstart_ack(&trx->mo);</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c</span><br><span>index dfce81f..74ad31d 100644</span><br><span>--- a/src/osmo-bts-virtual/bts_model.c</span><br><span>+++ b/src/osmo-bts-virtual/bts_model.c</span><br><span>@@ -139,9 +139,22 @@</span><br><span> int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj)</span><br><span> {</span><br><span>   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx* trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t tn;</span><br><span> </span><br><span>      switch (mo->obj_class) {</span><br><span>  case NM_OC_RADIO_CARRIER:</span><br><span style="color: hsl(120, 100%, 40%);">+             trx = (struct gsm_bts_trx*) obj;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx->ts[tn].mo.nm_state.availability == NM_AVSTATE_DEPENDENCY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = oml_mo_opstart_ack(mo);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>  case NM_OC_SITE_MANAGER:</span><br><span>     case NM_OC_BASEB_TRANSC:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/20407">change 20407</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/c/osmo-bts/+/20407"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id9e61f8d773e6e6170c68b5b836d276c747d8d69 </div>
<div style="display:none"> Gerrit-Change-Number: 20407 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>