aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmo-bts/bts_model.h2
-rw-r--r--include/osmo-bts/rsl.h2
-rw-r--r--src/common/rsl.c32
-rw-r--r--src/osmo-bts-litecell15/oml.c10
-rw-r--r--src/osmo-bts-oc2g/oml.c10
-rw-r--r--src/osmo-bts-octphy/l1_oml.c11
-rw-r--r--src/osmo-bts-omldummy/bts_model.c4
-rw-r--r--src/osmo-bts-sysmo/oml.c10
-rw-r--r--src/osmo-bts-trx/l1_if.c8
-rw-r--r--src/osmo-bts-virtual/main.c3
-rw-r--r--tests/handover/handover_test.c2
-rw-r--r--tests/meas/meas_test.c4
-rw-r--r--tests/stubs.c4
13 files changed, 63 insertions, 39 deletions
diff --git a/include/osmo-bts/bts_model.h b/include/osmo-bts/bts_model.h
index f1f68307..be0480c1 100644
--- a/include/osmo-bts/bts_model.h
+++ b/include/osmo-bts/bts_model.h
@@ -60,6 +60,6 @@ void bts_model_phy_link_set_defaults(struct phy_link *plink);
void bts_model_phy_instance_set_defaults(struct phy_instance *pinst);
int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts);
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);
#endif
diff --git a/include/osmo-bts/rsl.h b/include/osmo-bts/rsl.h
index 731f6c02..0361841d 100644
--- a/include/osmo-bts/rsl.h
+++ b/include/osmo-bts/rsl.h
@@ -40,7 +40,7 @@ int rsl_tx_ccch_load_ind_rach(struct gsm_bts *bts, uint16_t total,
int rsl_tx_delete_ind(struct gsm_bts *bts, const uint8_t *ia, uint8_t ia_len);
void cb_ts_disconnected(struct gsm_bts_trx_ts *ts);
-void cb_ts_connected(struct gsm_bts_trx_ts *ts);
+void cb_ts_connected(struct gsm_bts_trx_ts *ts, int rc);
void ipacc_dyn_pdch_complete(struct gsm_bts_trx_ts *ts, int rc);
#endif // _RSL_H */
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 9b0de7cf..507e8aaf 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -2157,7 +2157,7 @@ static int rsl_tx_dyn_pdch_nack(struct gsm_lchan *lchan, bool pdch_act,
* 1. call bts_model_ts_disconnect() to disconnect TCH/F;
* 2. cb_ts_disconnected() is called when done;
* 3. call bts_model_ts_connect() to connect as PDTCH;
- * 4. cb_ts_connected() is called when done;
+ * 4. cb_ts_connected(rc) is called when done;
* 5. instruct the PCU to enable PDTCH;
* 6. the PCU will call back with an activation request;
* 7. l1sap_info_act_cnf() will call ipacc_dyn_pdch_complete() when SAPI
@@ -2171,7 +2171,7 @@ static int rsl_tx_dyn_pdch_nack(struct gsm_lchan *lchan, bool pdch_act,
* deactivations are done;
* 4. cb_ts_disconnected() is called when done;
* 5. call bts_model_ts_connect() to connect as TCH/F;
- * 6. cb_ts_connected() is called when done;
+ * 6. cb_ts_connected(rc) is called when done;
* 7. directly call ipacc_dyn_pdch_complete(), since no further action required
* for TCH/F;
* 8. send a PDCH DEACT ACK.
@@ -2276,7 +2276,8 @@ static void ipacc_dyn_pdch_ts_disconnected(struct gsm_bts_trx_ts *ts)
if (rc)
goto error_nack;
- rc = bts_model_ts_connect(ts, as_pchan);
+ bts_model_ts_connect(ts, as_pchan);
+ return;
error_nack:
/* Error? then NACK right now. */
@@ -2322,9 +2323,14 @@ void cb_ts_disconnected(struct gsm_bts_trx_ts *ts)
}
}
-static void ipacc_dyn_pdch_ts_connected(struct gsm_bts_trx_ts *ts)
+static void ipacc_dyn_pdch_ts_connected(struct gsm_bts_trx_ts *ts, int rc)
{
- int rc;
+ if (rc) {
+ LOGP(DRSL, LOGL_NOTICE, "%s PDCH ACT IPA operation failed (%d) in bts model\n",
+ gsm_lchan_name(ts->lchan), rc);
+ ipacc_dyn_pdch_complete(ts, rc);
+ return;
+ }
if (ts->flags & TS_F_PDCH_DEACT_PENDING) {
if (ts->lchan[0].type != GSM_LCHAN_TCH_F)
@@ -2373,12 +2379,18 @@ static void ipacc_dyn_pdch_ts_connected(struct gsm_bts_trx_ts *ts)
}
}
-static void osmo_dyn_ts_connected(struct gsm_bts_trx_ts *ts)
+static void osmo_dyn_ts_connected(struct gsm_bts_trx_ts *ts, int rc)
{
- int rc;
struct msgb *msg = ts->dyn.pending_chan_activ;
ts->dyn.pending_chan_activ = NULL;
+ if (rc) {
+ LOGP(DRSL, LOGL_NOTICE, "%s PDCH ACT OSMO operation failed (%d) in bts model\n",
+ gsm_lchan_name(ts->lchan), rc);
+ ipacc_dyn_pdch_complete(ts, rc);
+ return;
+ }
+
if (!msg) {
LOGP(DRSL, LOGL_ERROR,
"%s TS re-connected, but no chan activ msg pending\n",
@@ -2395,15 +2407,15 @@ static void osmo_dyn_ts_connected(struct gsm_bts_trx_ts *ts)
msgb_free(msg);
}
-void cb_ts_connected(struct gsm_bts_trx_ts *ts)
+void cb_ts_connected(struct gsm_bts_trx_ts *ts, int rc)
{
OSMO_ASSERT(ts);
switch (ts->pchan) {
case GSM_PCHAN_TCH_F_PDCH:
- return ipacc_dyn_pdch_ts_connected(ts);
+ return ipacc_dyn_pdch_ts_connected(ts, rc);
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
- return osmo_dyn_ts_connected(ts);
+ return osmo_dyn_ts_connected(ts, rc);
default:
return;
}
diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c
index da6c60e8..f084f1bf 100644
--- a/src/osmo-bts-litecell15/oml.c
+++ b/src/osmo-bts-litecell15/oml.c
@@ -1925,13 +1925,17 @@ static int ts_connect_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg,
ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "",
ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : "");
- cb_ts_connected(ts);
+ cb_ts_connected(ts, 0);
return 0;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
enum gsm_phys_chan_config as_pchan)
{
- return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ int rc;
+
+ rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ if (rc)
+ cb_ts_connected(ts, rc);
}
diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c
index f76de921..6cf7e1d5 100644
--- a/src/osmo-bts-oc2g/oml.c
+++ b/src/osmo-bts-oc2g/oml.c
@@ -2070,15 +2070,19 @@ static int ts_connect_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg,
ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "",
ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : "");
- cb_ts_connected(ts);
+ cb_ts_connected(ts, 0);
msgb_free(l1_msg);
return 0;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
enum gsm_phys_chan_config as_pchan)
{
- return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ int rc;
+
+ rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ if (rc)
+ cb_ts_connected(ts, rc);
}
diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c
index 2ab9fcd1..d44f7211 100644
--- a/src/osmo-bts-octphy/l1_oml.c
+++ b/src/osmo-bts-octphy/l1_oml.c
@@ -1605,7 +1605,7 @@ static int ts_connect_cb(struct octphy_hdl *fl1, struct msgb *resp, void *data)
msgb_free(resp);
- cb_ts_connected(ts);
+ cb_ts_connected(ts, 0);
return 0;
}
@@ -1805,9 +1805,10 @@ int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)
return l1if_req_compl(fl1h, msg, ts_disconnect_cb, NULL);
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
enum gsm_phys_chan_config as_pchan)
{
+ int rc;
if (as_pchan == GSM_PCHAN_TCH_F_PDCH
|| as_pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH) {
LOGP(DL1C, LOGL_ERROR,
@@ -1815,8 +1816,10 @@ int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
" expected a specific pchan instead\n",
gsm_ts_and_pchan_name(ts), gsm_pchan_name(as_pchan));
exit(1);
- return -EINVAL;
+ return;
}
- return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ if (rc)
+ cb_ts_connected(ts, rc);
}
diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c
index fa1aaf4c..c0114015 100644
--- a/src/osmo-bts-omldummy/bts_model.c
+++ b/src/osmo-bts-omldummy/bts_model.c
@@ -211,9 +211,9 @@ int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)
return -ENOTSUP;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)
{
- return -ENOTSUP;
+ return;
}
int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index ce85a8b9..ea7527dd 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -1947,13 +1947,17 @@ static int ts_connect_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg,
ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "",
ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : "");
- cb_ts_connected(ts);
+ cb_ts_connected(ts, 0);
return 0;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
enum gsm_phys_chan_config as_pchan)
{
- return ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ int rc;
+
+ rc = ts_connect_as(ts, as_pchan, ts_connect_cb, NULL);
+ if (rc)
+ cb_ts_connected(ts, rc);
}
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index ccc13f42..da1b554f 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -764,7 +764,7 @@ int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)
return 0;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
enum gsm_phys_chan_config as_pchan)
{
int rc;
@@ -773,12 +773,10 @@ int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
rc = trx_set_ts_as_pchan(ts, as_pchan);
if (rc)
- return rc;
+ cb_ts_connected(ts, rc);
LOGP(DL1C, LOGL_NOTICE, "%s bts_model_ts_connect(as_pchan=%s) success,"
" calling cb_ts_connected()\n",
gsm_ts_name(ts), gsm_pchan_name(as_pchan));
-
- cb_ts_connected(ts);
- return 0;
+ cb_ts_connected(ts, 0);
}
diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c
index 88041fd3..aa1c608e 100644
--- a/src/osmo-bts-virtual/main.c
+++ b/src/osmo-bts-virtual/main.c
@@ -133,10 +133,9 @@ int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)
return -ENOTSUP;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)
{
LOGP(DSUM, LOGL_NOTICE, "Unimplemented %s\n", __func__);
- return -ENOTSUP;
}
int main(int argc, char **argv)
diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c
index 407ed95d..a805554e 100644
--- a/tests/handover/handover_test.c
+++ b/tests/handover/handover_test.c
@@ -278,6 +278,6 @@ int bts_model_trx_close(struct gsm_bts_trx *trx) { return 0; }
void trx_get_hlayer1(void) {}
int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan) { return 0; }
int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts) { return 0; }
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan) { return 0; }
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan) { return; }
int bts_model_lchan_deactivate(struct gsm_lchan *lchan) { return 0; }
int bts_model_lchan_deactivate_sacch(struct gsm_lchan *lchan) { return 0; }
diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c
index f5803743..b2bf80e2 100644
--- a/tests/meas/meas_test.c
+++ b/tests/meas/meas_test.c
@@ -659,9 +659,9 @@ int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)
return 0;
}
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan)
{
- return 0;
+ return;
}
int bts_model_lchan_deactivate(struct gsm_lchan *lchan)
diff --git a/tests/stubs.c b/tests/stubs.c
index d6f4d3d8..7c64034b 100644
--- a/tests/stubs.c
+++ b/tests/stubs.c
@@ -54,6 +54,6 @@ void bts_model_abis_close(struct gsm_bts *bts)
int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)
{ return 0; }
-int bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
+void bts_model_ts_connect(struct gsm_bts_trx_ts *ts,
enum gsm_phys_chan_config as_pchan)
-{ return 0; }
+{ return; }