<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18953">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts_model: Convert bts_model_trx_close() to return asynchronously<br><br>Some backends like osmo-bts-trx require exchanging messages like<br>POWEROFF to close the TRX, and hence need some time. Switch the function<br>to expect result asynchronously by calling a callback.<br><br>This will be used later to wait until all TRX are really powered off<br>before exiting the process.<br><br>Change-Id: I7d76b600fc06e1114b35bf0c2d08eff5bbd1b69a<br>---<br>M include/osmo-bts/bts_model.h<br>M src/common/bts_shutdown_fsm.c<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>M tests/stubs.c<br>10 files changed, 62 insertions(+), 24 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/53/18953/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts_model.h b/include/osmo-bts/bts_model.h</span><br><span>index be0480c..b9f9ede 100644</span><br><span>--- a/include/osmo-bts/bts_model.h</span><br><span>+++ b/include/osmo-bts/bts_model.h</span><br><span>@@ -30,7 +30,9 @@</span><br><span>                         void *obj, uint8_t adm_state);</span><br><span> </span><br><span> int bts_model_trx_deact_rf(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Implementation should call bts_model_trx_close_cb when done */</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx);</span><br><span> </span><br><span> int bts_model_vty_init(struct gsm_bts *bts);</span><br><span> </span><br><span>@@ -62,4 +64,10 @@</span><br><span> int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts);</span><br><span> void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* BTS model specific implementations are expected to call this functions as a</span><br><span style="color: hsl(120, 100%, 40%);">+ * response to some of the APIs above:</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%);">+void bts_model_trx_close_cb(struct gsm_bts_trx *trx, int rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span>diff --git a/src/common/bts_shutdown_fsm.c b/src/common/bts_shutdown_fsm.c</span><br><span>index bff686a..afd6f30 100644</span><br><span>--- a/src/common/bts_shutdown_fsm.c</span><br><span>+++ b/src/common/bts_shutdown_fsm.c</span><br><span>@@ -173,3 +173,9 @@</span><br><span>   LOGPFSML(fi, LOGL_NOTICE, "Shutting down BTS, reason: %s\n", reason);</span><br><span>      osmo_fsm_inst_dispatch(fi, BTS_SHUTDOWN_EV_START, NULL);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close_cb(struct gsm_bts_trx *trx, int rc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_fsm_inst *fi = trx->bts->shutdown_fi;</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGPFSML(fi, LOGL_DEBUG, "%s Received TRX close cb rc=%d\n", gsm_trx_name(trx), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c</span><br><span>index 2f462b6..60fd1e7 100644</span><br><span>--- a/src/osmo-bts-litecell15/oml.c</span><br><span>+++ b/src/osmo-bts-litecell15/oml.c</span><br><span>@@ -441,20 +441,24 @@</span><br><span>                         void *data)</span><br><span> {</span><br><span>       msgb_free(l1_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    bts_model_trx_close_cb(trx, 0);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>   struct lc15l1_hdl *fl1h = trx_lc15l1_hdl(trx);</span><br><span>       struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span> </span><br><span>  msg = l1p_msgb_alloc();</span><br><span>      prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,</span><br><span>            l1p_handle_for_trx(trx));</span><br><span>  LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                bts_model_trx_close_cb(trx, rc);</span><br><span> }</span><br><span> </span><br><span> static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)</span><br><span>diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c</span><br><span>index cc8d02d..89ee0ac 100644</span><br><span>--- a/src/osmo-bts-oc2g/oml.c</span><br><span>+++ b/src/osmo-bts-oc2g/oml.c</span><br><span>@@ -457,20 +457,24 @@</span><br><span>                               void *data)</span><br><span> {</span><br><span>       msgb_free(l1_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    bts_model_trx_close_cb(trx, 0);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>   struct oc2gl1_hdl *fl1h = trx_oc2gl1_hdl(trx);</span><br><span>       struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span> </span><br><span>  msg = l1p_msgb_alloc();</span><br><span>      prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,</span><br><span>            l1p_handle_for_trx(trx));</span><br><span>  LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                bts_model_trx_close_cb(trx, rc);</span><br><span> }</span><br><span> </span><br><span> static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)</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 61d56bb..8cc078e 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>@@ -1678,7 +1678,7 @@</span><br><span>                     bts_model_trx_deact_rf(trx);</span><br><span> </span><br><span>                     /* Close TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-                 rc = bts_model_trx_close(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rc = trx_close(trx);</span><br><span>                         if (rc != 0) {</span><br><span>                               LOGP(DL1C, LOGL_ERROR,</span><br><span>                                    "Cannot close TRX %d, it is already closed.\n",</span><br><span>@@ -1716,10 +1716,11 @@</span><br><span>     return l1if_activate_rf(trx, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>    /* FIXME: close only one TRX */</span><br><span style="color: hsl(0, 100%, 40%);">- return trx_close(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc = trx_close(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_model_trx_close_cb(trx, rc);</span><br><span> }</span><br><span> </span><br><span> </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 a968381..dc0e041 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>@@ -50,10 +50,10 @@</span><br><span>         return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>  LOGP(DL1C, LOGL_NOTICE, "Unimplemented %s\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_model_trx_close_cb(trx, 0);</span><br><span> }</span><br><span> </span><br><span> int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)</span><br><span>diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c</span><br><span>index c3bf8b6..57eab12 100644</span><br><span>--- a/src/osmo-bts-sysmo/oml.c</span><br><span>+++ b/src/osmo-bts-sysmo/oml.c</span><br><span>@@ -437,20 +437,24 @@</span><br><span>                               void *data)</span><br><span> {</span><br><span>       msgb_free(l1_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    bts_model_trx_close_cb(trx, 0);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>   struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);</span><br><span>     struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span> </span><br><span>  msg = l1p_msgb_alloc();</span><br><span>      prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,</span><br><span>            l1p_handle_for_trx(trx));</span><br><span>  LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                bts_model_trx_close_cb(trx, rc);</span><br><span> }</span><br><span> </span><br><span> static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)</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 d577416..ccb2913 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>@@ -214,17 +214,27 @@</span><br><span>     plink->u.osmotrx.poweronoff_sent = false;</span><br><span> </span><br><span>     if (poweronoff) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rc == 0 && pinst->phy_link->state != PHY_LINK_CONNECTED) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (rc == 0 && plink->state != PHY_LINK_CONNECTED) {</span><br><span>                      trx_sched_clock_started(pinst->trx->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-                 phy_link_state_set(pinst->phy_link, PHY_LINK_CONNECTED);</span><br><span style="color: hsl(120, 100%, 40%);">+                   phy_link_state_set(plink, PHY_LINK_CONNECTED);</span><br><span> </span><br><span>                   /* Begin to ramp up the power on all TRX associated with this phy */</span><br><span>                         llist_for_each_entry(pinst, &plink->instances, list) {</span><br><span>                                l1if_trx_start_power_ramp(pinst->trx);</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (rc != 0 && pinst->phy_link->state != PHY_LINK_SHUTDOWN) {</span><br><span style="color: hsl(120, 100%, 40%);">+            } else if (rc != 0 && plink->state != PHY_LINK_SHUTDOWN) {</span><br><span>                        trx_sched_clock_stopped(pinst->trx->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-                 phy_link_state_set(pinst->phy_link, PHY_LINK_SHUTDOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+                    phy_link_state_set(plink, PHY_LINK_SHUTDOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (plink->state != PHY_LINK_SHUTDOWN) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   trx_sched_clock_stopped(pinst->trx->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+                       phy_link_state_set(plink, PHY_LINK_SHUTDOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Notify TRX close on all TRX associated with this phy */</span><br><span style="color: hsl(120, 100%, 40%);">+                    llist_for_each_entry(pinst, &plink->instances, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         bts_model_trx_close_cb(pinst->trx, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span>@@ -424,7 +434,7 @@</span><br><span> }</span><br><span> </span><br><span> /* deactivate transceiver */</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</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>@@ -433,12 +443,12 @@</span><br><span>       if (l1h->config.enabled) {</span><br><span>                l1h->config.enabled = false;</span><br><span>              l1if_provision_transceiver_trx(l1h);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (!pinst->phy_link->u.osmotrx.poweronoff_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+               bts_model_trx_close_cb(trx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       } /* else: poweroff in progress, cb will be called upon TRXC RSP */</span><br><span> </span><br><span>      /* Set to Operational State: Disabled */</span><br><span>     check_transceiver_availability_trx(l1h, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return 0;</span><br><span> }</span><br><span> </span><br><span> /* on RSL failure, deactivate transceiver */</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 b971af5..8db0201 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>@@ -50,10 +50,10 @@</span><br><span>        return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>  LOGP(DL1C, LOGL_NOTICE, "Unimplemented %s\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_model_trx_close_cb(trx, 0);</span><br><span> }</span><br><span> </span><br><span> int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)</span><br><span>diff --git a/tests/stubs.c b/tests/stubs.c</span><br><span>index 20ce512..4663a44 100644</span><br><span>--- a/tests/stubs.c</span><br><span>+++ b/tests/stubs.c</span><br><span>@@ -1,4 +1,5 @@</span><br><span> #include <osmo-bts/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/bts_model.h></span><br><span> </span><br><span> struct femtol1_hdl;</span><br><span> struct bts_model_set_dyn_pdch_data;</span><br><span>@@ -23,8 +24,8 @@</span><br><span> </span><br><span> int bts_model_trx_deact_rf(struct gsm_bts_trx *trx)</span><br><span> { return 0; }</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_trx_close(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{ bts_model_trx_close_cb(trx, 0); }</span><br><span> int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type,</span><br><span>                        struct tlv_parsed *old_attr, struct tlv_parsed *new_attr,</span><br><span>                    void *obj)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18953">change 18953</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/+/18953"/><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: I7d76b600fc06e1114b35bf0c2d08eff5bbd1b69a </div>
<div style="display:none"> Gerrit-Change-Number: 18953 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>