Change in osmo-bts[master]: bts_model: Allow TS connect to be processed asynchronously

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Pau Espin Pedrol gerrit-no-reply at lists.osmocom.org
Mon Nov 26 13:09:44 UTC 2018


Pau Espin Pedrol has uploaded this change for review. ( https://gerrit.osmocom.org/11931


Change subject: bts_model: Allow TS connect to be processed asynchronously
......................................................................

bts_model: Allow TS connect to be processed asynchronously

This commit doesn't change internal logic of any model, only the API to
be able to return result of connect TS asyncrhonously since some models
(like osmo-bts-trx) require some time to process the result. This way
PDCH ACT/DEACT (N)ACK can be sent once the result of this long process
is known. For instance, nowadays in osmo-bts-trx we PDCH (DE)ACT ACK
before getting the result from SETSLOT on the TRX iface.

With this new API, bts_model_ts_connect doesn't return any value
synchronously. Instead, it is expected to always end up calling
cb_ts_connected with the return code from the TS activation process. 0
is considered a successs, while any other value is considered an error.

Change-Id: Ie073a4397dd2f1a691968d12b15b8b42f1e1b0cf
---
M include/osmo-bts/bts_model.h
M include/osmo-bts/rsl.h
M src/common/rsl.c
M src/osmo-bts-litecell15/oml.c
M src/osmo-bts-oc2g/oml.c
M src/osmo-bts-octphy/l1_oml.c
M src/osmo-bts-omldummy/bts_model.c
M src/osmo-bts-sysmo/oml.c
M src/osmo-bts-trx/l1_if.c
M src/osmo-bts-virtual/main.c
M tests/handover/handover_test.c
M tests/meas/meas_test.c
M tests/stubs.c
13 files changed, 63 insertions(+), 39 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/31/11931/1

diff --git a/include/osmo-bts/bts_model.h b/include/osmo-bts/bts_model.h
index f1f6830..be0480c 100644
--- a/include/osmo-bts/bts_model.h
+++ b/include/osmo-bts/bts_model.h
@@ -60,6 +60,6 @@
 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 731f6c0..0361841 100644
--- a/include/osmo-bts/rsl.h
+++ b/include/osmo-bts/rsl.h
@@ -40,7 +40,7 @@
 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 9b0de7c..507e8aa 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -2157,7 +2157,7 @@
  * 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 @@
  *    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 @@
 	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 @@
 	}
 }
 
-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 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 @@
 		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 da6c60e..f084f1b 100644
--- a/src/osmo-bts-litecell15/oml.c
+++ b/src/osmo-bts-litecell15/oml.c
@@ -1925,13 +1925,17 @@
 	       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 f76de92..6cf7e1d 100644
--- a/src/osmo-bts-oc2g/oml.c
+++ b/src/osmo-bts-oc2g/oml.c
@@ -2070,15 +2070,19 @@
 	       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 2ab9fcd..d44f721 100644
--- a/src/osmo-bts-octphy/l1_oml.c
+++ b/src/osmo-bts-octphy/l1_oml.c
@@ -1605,7 +1605,7 @@
 
 	msgb_free(resp);
 
-	cb_ts_connected(ts);
+	cb_ts_connected(ts, 0);
 
 	return 0;
 }
@@ -1805,9 +1805,10 @@
 	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 @@
 		     " 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 fa1aaf4..c011401 100644
--- a/src/osmo-bts-omldummy/bts_model.c
+++ b/src/osmo-bts-omldummy/bts_model.c
@@ -211,9 +211,9 @@
 	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 ce85a8b..ea7527d 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -1947,13 +1947,17 @@
 	       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 ccc13f4..da1b554 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -764,7 +764,7 @@
 	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 @@
 
 	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 88041fd..aa1c608 100644
--- a/src/osmo-bts-virtual/main.c
+++ b/src/osmo-bts-virtual/main.c
@@ -133,10 +133,9 @@
 	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 407ed95..a805554 100644
--- a/tests/handover/handover_test.c
+++ b/tests/handover/handover_test.c
@@ -278,6 +278,6 @@
 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 f580374..b2bf80e 100644
--- a/tests/meas/meas_test.c
+++ b/tests/meas/meas_test.c
@@ -659,9 +659,9 @@
 	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 d6f4d3d..7c64034 100644
--- a/tests/stubs.c
+++ b/tests/stubs.c
@@ -54,6 +54,6 @@
 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; }

-- 
To view, visit https://gerrit.osmocom.org/11931
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie073a4397dd2f1a691968d12b15b8b42f1e1b0cf
Gerrit-Change-Number: 11931
Gerrit-PatchSet: 1
Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181126/48c8d938/attachment.htm>


More information about the gerrit-log mailing list