<p>Pau Espin Pedrol <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11931">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts_model: Allow TS connect to be processed asynchronously<br><br>This commit doesn't change internal logic of any model, only the API to<br>be able to return result of connect TS asyncrhonously since some models<br>(like osmo-bts-trx) require some time to process the result. This way<br>PDCH ACT/DEACT (N)ACK can be sent once the result of this long process<br>is known. For instance, nowadays in osmo-bts-trx we PDCH (DE)ACT ACK<br>before getting the result from SETSLOT on the TRX iface.<br><br>With this new API, bts_model_ts_connect doesn't return any value<br>synchronously. Instead, it is expected to always end up calling<br>cb_ts_connected with the return code from the TS activation process. 0<br>is considered a successs, while any other value is considered an error.<br><br>Change-Id: Ie073a4397dd2f1a691968d12b15b8b42f1e1b0cf<br>---<br>M include/osmo-bts/bts_model.h<br>M include/osmo-bts/rsl.h<br>M src/common/rsl.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/main.c<br>M tests/handover/handover_test.c<br>M tests/meas/meas_test.c<br>M tests/stubs.c<br>13 files changed, 63 insertions(+), 39 deletions(-)<br><br></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 f1f6830..be0480c 100644</span><br><span>--- a/include/osmo-bts/bts_model.h</span><br><span>+++ b/include/osmo-bts/bts_model.h</span><br><span>@@ -60,6 +60,6 @@</span><br><span> void bts_model_phy_instance_set_defaults(struct phy_instance *pinst);</span><br><span> </span><br><span> int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);</span><br><span> </span><br><span> #endif</span><br><span>diff --git a/include/osmo-bts/rsl.h b/include/osmo-bts/rsl.h</span><br><span>index 731f6c0..0361841 100644</span><br><span>--- a/include/osmo-bts/rsl.h</span><br><span>+++ b/include/osmo-bts/rsl.h</span><br><span>@@ -40,7 +40,7 @@</span><br><span> int rsl_tx_delete_ind(struct gsm_bts *bts, const uint8_t *ia, uint8_t ia_len);</span><br><span> </span><br><span> void cb_ts_disconnected(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-void cb_ts_connected(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+void cb_ts_connected(struct gsm_bts_trx_ts *ts, int rc);</span><br><span> void ipacc_dyn_pdch_complete(struct gsm_bts_trx_ts *ts, int rc);</span><br><span> </span><br><span> #endif // _RSL_H */</span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 9b0de7c..507e8aa 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -2157,7 +2157,7 @@</span><br><span>  * 1. call bts_model_ts_disconnect() to disconnect TCH/F;</span><br><span>  * 2. cb_ts_disconnected() is called when done;</span><br><span>  * 3. call bts_model_ts_connect() to connect as PDTCH;</span><br><span style="color: hsl(0, 100%, 40%);">- * 4. cb_ts_connected() is called when done;</span><br><span style="color: hsl(120, 100%, 40%);">+ * 4. cb_ts_connected(rc) is called when done;</span><br><span>  * 5. instruct the PCU to enable PDTCH;</span><br><span>  * 6. the PCU will call back with an activation request;</span><br><span>  * 7. l1sap_info_act_cnf() will call ipacc_dyn_pdch_complete() when SAPI</span><br><span>@@ -2171,7 +2171,7 @@</span><br><span>  *    deactivations are done;</span><br><span>  * 4. cb_ts_disconnected() is called when done;</span><br><span>  * 5. call bts_model_ts_connect() to connect as TCH/F;</span><br><span style="color: hsl(0, 100%, 40%);">- * 6. cb_ts_connected() is called when done;</span><br><span style="color: hsl(120, 100%, 40%);">+ * 6. cb_ts_connected(rc) is called when done;</span><br><span>  * 7. directly call ipacc_dyn_pdch_complete(), since no further action required</span><br><span>  *    for TCH/F;</span><br><span>  * 8. send a PDCH DEACT ACK.</span><br><span>@@ -2276,7 +2276,8 @@</span><br><span>    if (rc)</span><br><span>              goto error_nack;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    rc = bts_model_ts_connect(ts, as_pchan);</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_model_ts_connect(ts, as_pchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   return;</span><br><span> </span><br><span> error_nack:</span><br><span>   /* Error? then NACK right now. */</span><br><span>@@ -2322,9 +2323,14 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void ipacc_dyn_pdch_ts_connected(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+static void ipacc_dyn_pdch_ts_connected(struct gsm_bts_trx_ts *ts, int rc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DRSL, LOGL_NOTICE, "%s PDCH ACT IPA operation failed (%d) in bts model\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_lchan_name(ts->lchan), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+               ipacc_dyn_pdch_complete(ts, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        if (ts->flags & TS_F_PDCH_DEACT_PENDING) {</span><br><span>            if (ts->lchan[0].type != GSM_LCHAN_TCH_F)</span><br><span>@@ -2373,12 +2379,18 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void osmo_dyn_ts_connected(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+static void osmo_dyn_ts_connected(struct gsm_bts_trx_ts *ts, int rc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       int rc;</span><br><span>      struct msgb *msg = ts->dyn.pending_chan_activ;</span><br><span>    ts->dyn.pending_chan_activ = NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DRSL, LOGL_NOTICE, "%s PDCH ACT OSMO operation failed (%d) in bts model\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 gsm_lchan_name(ts->lchan), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+               ipacc_dyn_pdch_complete(ts, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!msg) {</span><br><span>          LOGP(DRSL, LOGL_ERROR,</span><br><span>                    "%s TS re-connected, but no chan activ msg pending\n",</span><br><span>@@ -2395,15 +2407,15 @@</span><br><span>              msgb_free(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void cb_ts_connected(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+void cb_ts_connected(struct gsm_bts_trx_ts *ts, int rc)</span><br><span> {</span><br><span>        OSMO_ASSERT(ts);</span><br><span> </span><br><span>         switch (ts->pchan) {</span><br><span>      case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              return ipacc_dyn_pdch_ts_connected(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+               return ipacc_dyn_pdch_ts_connected(ts, rc);</span><br><span>  case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                return osmo_dyn_ts_connected(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+             return osmo_dyn_ts_connected(ts, rc);</span><br><span>        default:</span><br><span>             return;</span><br><span>      }</span><br><span>diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c</span><br><span>index da6c60e..f084f1b 100644</span><br><span>--- a/src/osmo-bts-litecell15/oml.c</span><br><span>+++ b/src/osmo-bts-litecell15/oml.c</span><br><span>@@ -1925,13 +1925,17 @@</span><br><span>                ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "",</span><br><span>          ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     cb_ts_connected(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+  cb_ts_connected(ts, 0);</span><br><span> </span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span>                   enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               cb_ts_connected(ts, rc);</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c</span><br><span>index f76de92..6cf7e1d 100644</span><br><span>--- a/src/osmo-bts-oc2g/oml.c</span><br><span>+++ b/src/osmo-bts-oc2g/oml.c</span><br><span>@@ -2070,15 +2070,19 @@</span><br><span>            ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "",</span><br><span>          ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     cb_ts_connected(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+  cb_ts_connected(ts, 0);</span><br><span> </span><br><span>  msgb_free(l1_msg);</span><br><span> </span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span>                   enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               cb_ts_connected(ts, rc);</span><br><span> }</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 2ab9fcd..d44f721 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>@@ -1605,7 +1605,7 @@</span><br><span> </span><br><span>       msgb_free(resp);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    cb_ts_connected(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+  cb_ts_connected(ts, 0);</span><br><span> </span><br><span>  return 0;</span><br><span> }</span><br><span>@@ -1805,9 +1805,10 @@</span><br><span>      return l1if_req_compl(fl1h, msg, ts_disconnect_cb, NULL);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span>                   enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span>      if (as_pchan == GSM_PCHAN_TCH_F_PDCH</span><br><span>             || as_pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH) {</span><br><span>             LOGP(DL1C, LOGL_ERROR,</span><br><span>@@ -1815,8 +1816,10 @@</span><br><span>                   " expected a specific pchan instead\n",</span><br><span>                    gsm_ts_and_pchan_name(ts), gsm_pchan_name(as_pchan));</span><br><span>           exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               cb_ts_connected(ts, rc);</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 fa1aaf4..c011401 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>@@ -211,9 +211,9 @@</span><br><span>         return -ENOTSUP;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)</span><br><span style="color: hsl(120, 100%, 40%);">+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(0, 100%, 40%);">- return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+      return;</span><br><span> }</span><br><span> </span><br><span> int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)</span><br><span>diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c</span><br><span>index ce85a8b..ea7527d 100644</span><br><span>--- a/src/osmo-bts-sysmo/oml.c</span><br><span>+++ b/src/osmo-bts-sysmo/oml.c</span><br><span>@@ -1947,13 +1947,17 @@</span><br><span>         ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "",</span><br><span>          ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     cb_ts_connected(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+  cb_ts_connected(ts, 0);</span><br><span> </span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span>                   enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               cb_ts_connected(ts, rc);</span><br><span> }</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 ccc13f4..da1b554 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>@@ -764,7 +764,7 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span>                   enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span>    int rc;</span><br><span>@@ -773,12 +773,10 @@</span><br><span> </span><br><span>  rc = trx_set_ts_as_pchan(ts, as_pchan);</span><br><span>      if (rc)</span><br><span style="color: hsl(0, 100%, 40%);">-         return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            cb_ts_connected(ts, rc);</span><br><span> </span><br><span>         LOGP(DL1C, LOGL_NOTICE, "%s bts_model_ts_connect(as_pchan=%s) success,"</span><br><span>         " calling cb_ts_connected()\n",</span><br><span>            gsm_ts_name(ts), gsm_pchan_name(as_pchan));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        cb_ts_connected(ts);</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     cb_ts_connected(ts, 0);</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c</span><br><span>index 88041fd..aa1c608 100644</span><br><span>--- a/src/osmo-bts-virtual/main.c</span><br><span>+++ b/src/osmo-bts-virtual/main.c</span><br><span>@@ -133,10 +133,9 @@</span><br><span>         return -ENOTSUP;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span>      LOGP(DSUM, LOGL_NOTICE, "Unimplemented %s\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-      return -ENOTSUP;</span><br><span> }</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 407ed95..a805554 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -278,6 +278,6 @@</span><br><span> void trx_get_hlayer1(void) {}</span><br><span> int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan) { return 0; }</span><br><span> int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts) { return 0; }</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan) { return; }</span><br><span> int bts_model_lchan_deactivate(struct gsm_lchan *lchan) { return 0; }</span><br><span> int bts_model_lchan_deactivate_sacch(struct gsm_lchan *lchan) { return 0; }</span><br><span>diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c</span><br><span>index f580374..b2bf80e 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -659,9 +659,9 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)</span><br><span style="color: hsl(120, 100%, 40%);">+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(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return;</span><br><span> }</span><br><span> </span><br><span> int bts_model_lchan_deactivate(struct gsm_lchan *lchan)</span><br><span>diff --git a/tests/stubs.c b/tests/stubs.c</span><br><span>index d6f4d3d..7c64034 100644</span><br><span>--- a/tests/stubs.c</span><br><span>+++ b/tests/stubs.c</span><br><span>@@ -54,6 +54,6 @@</span><br><span> int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)</span><br><span> { return 0; }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,</span><br><span>                      enum gsm_phys_chan_config as_pchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+{ return; }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11931">change 11931</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/11931"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ie073a4397dd2f1a691968d12b15b8b42f1e1b0cf </div>
<div style="display:none"> Gerrit-Change-Number: 11931 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>