Change in osmo-bts[master]: bts_model: Convert bts_model_trx_close() to return 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/.

pespin gerrit-no-reply at lists.osmocom.org
Mon Jun 22 11:43:14 UTC 2020


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/18953 )


Change subject: bts_model: Convert bts_model_trx_close() to return asynchronously
......................................................................

bts_model: Convert bts_model_trx_close() to return asynchronously

Some backends like osmo-bts-trx require exchanging messages like
POWEROFF to close the TRX, and hence need some time. Switch the function
to expect result asynchronously by calling a callback.

This will be used later to wait until all TRX are really powered off
before exiting the process.

Change-Id: I7d76b600fc06e1114b35bf0c2d08eff5bbd1b69a
---
M include/osmo-bts/bts_model.h
M src/common/bts_shutdown_fsm.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/bts_model.c
M tests/stubs.c
10 files changed, 62 insertions(+), 24 deletions(-)



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

diff --git a/include/osmo-bts/bts_model.h b/include/osmo-bts/bts_model.h
index be0480c..b9f9ede 100644
--- a/include/osmo-bts/bts_model.h
+++ b/include/osmo-bts/bts_model.h
@@ -30,7 +30,9 @@
 			    void *obj, uint8_t adm_state);
 
 int bts_model_trx_deact_rf(struct gsm_bts_trx *trx);
-int bts_model_trx_close(struct gsm_bts_trx *trx);
+
+/* Implementation should call bts_model_trx_close_cb when done */
+void bts_model_trx_close(struct gsm_bts_trx *trx);
 
 int bts_model_vty_init(struct gsm_bts *bts);
 
@@ -62,4 +64,10 @@
 int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts);
 void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);
 
+/* BTS model specific implementations are expected to call this functions as a
+ * response to some of the APIs above:
+ */
+
+void bts_model_trx_close_cb(struct gsm_bts_trx *trx, int rc);
+
 #endif
diff --git a/src/common/bts_shutdown_fsm.c b/src/common/bts_shutdown_fsm.c
index bff686a..afd6f30 100644
--- a/src/common/bts_shutdown_fsm.c
+++ b/src/common/bts_shutdown_fsm.c
@@ -173,3 +173,9 @@
 	LOGPFSML(fi, LOGL_NOTICE, "Shutting down BTS, reason: %s\n", reason);
 	osmo_fsm_inst_dispatch(fi, BTS_SHUTDOWN_EV_START, NULL);
 }
+
+void bts_model_trx_close_cb(struct gsm_bts_trx *trx, int rc)
+{
+	struct osmo_fsm_inst *fi = trx->bts->shutdown_fi;
+	LOGPFSML(fi, LOGL_DEBUG, "%s Received TRX close cb rc=%d\n", gsm_trx_name(trx), rc);
+}
diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c
index 2f462b6..60fd1e7 100644
--- a/src/osmo-bts-litecell15/oml.c
+++ b/src/osmo-bts-litecell15/oml.c
@@ -441,20 +441,24 @@
 			      void *data)
 {
 	msgb_free(l1_msg);
+	bts_model_trx_close_cb(trx, 0);
 	return 0;
 }
 
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	struct lc15l1_hdl *fl1h = trx_lc15l1_hdl(trx);
 	struct msgb *msg;
+	int rc;
 
 	msg = l1p_msgb_alloc();
 	prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,
 		  l1p_handle_for_trx(trx));
 	LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);
 
-	return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+	rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+	if (rc < 0)
+		bts_model_trx_close_cb(trx, rc);
 }
 
 static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)
diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c
index cc8d02d..89ee0ac 100644
--- a/src/osmo-bts-oc2g/oml.c
+++ b/src/osmo-bts-oc2g/oml.c
@@ -457,20 +457,24 @@
 			      void *data)
 {
 	msgb_free(l1_msg);
+	bts_model_trx_close_cb(trx, 0);
 	return 0;
 }
 
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	struct oc2gl1_hdl *fl1h = trx_oc2gl1_hdl(trx);
 	struct msgb *msg;
+	int rc;
 
 	msg = l1p_msgb_alloc();
 	prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,
 		  l1p_handle_for_trx(trx));
 	LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);
 
-	return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+	rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+	if (rc < 0)
+		bts_model_trx_close_cb(trx, rc);
 }
 
 static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)
diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c
index 61d56bb..8cc078e 100644
--- a/src/osmo-bts-octphy/l1_oml.c
+++ b/src/osmo-bts-octphy/l1_oml.c
@@ -1678,7 +1678,7 @@
 			bts_model_trx_deact_rf(trx);
 
 			/* Close TRX */
-			rc = bts_model_trx_close(trx);
+			rc = trx_close(trx);
 			if (rc != 0) {
 				LOGP(DL1C, LOGL_ERROR,
 				     "Cannot close TRX %d, it is already closed.\n",
@@ -1716,10 +1716,11 @@
 	return l1if_activate_rf(trx, 0);
 }
 
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	/* FIXME: close only one TRX */
-	return trx_close(trx);
+	int rc = trx_close(trx);
+	bts_model_trx_close_cb(trx, rc);
 }
 
 
diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c
index a968381..dc0e041 100644
--- a/src/osmo-bts-omldummy/bts_model.c
+++ b/src/osmo-bts-omldummy/bts_model.c
@@ -50,10 +50,10 @@
 	return -1;
 }
 
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	LOGP(DL1C, LOGL_NOTICE, "Unimplemented %s\n", __func__);
-	return 0;
+	bts_model_trx_close_cb(trx, 0);
 }
 
 int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index c3bf8b6..57eab12 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -437,20 +437,24 @@
 			      void *data)
 {
 	msgb_free(l1_msg);
+	bts_model_trx_close_cb(trx, 0);
 	return 0;
 }
 
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
 	struct msgb *msg;
+	int rc;
 
 	msg = l1p_msgb_alloc();
 	prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,
 		  l1p_handle_for_trx(trx));
 	LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);
 
-	return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+	rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+	if (rc < 0)
+		bts_model_trx_close_cb(trx, rc);
 }
 
 static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index d577416..ccb2913 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -214,17 +214,27 @@
 	plink->u.osmotrx.poweronoff_sent = false;
 
 	if (poweronoff) {
-		if (rc == 0 && pinst->phy_link->state != PHY_LINK_CONNECTED) {
+		if (rc == 0 && plink->state != PHY_LINK_CONNECTED) {
 			trx_sched_clock_started(pinst->trx->bts);
-			phy_link_state_set(pinst->phy_link, PHY_LINK_CONNECTED);
+			phy_link_state_set(plink, PHY_LINK_CONNECTED);
 
 			/* Begin to ramp up the power on all TRX associated with this phy */
 			llist_for_each_entry(pinst, &plink->instances, list) {
 				l1if_trx_start_power_ramp(pinst->trx);
 			}
-		} else if (rc != 0 && pinst->phy_link->state != PHY_LINK_SHUTDOWN) {
+		} else if (rc != 0 && plink->state != PHY_LINK_SHUTDOWN) {
 			trx_sched_clock_stopped(pinst->trx->bts);
-			phy_link_state_set(pinst->phy_link, PHY_LINK_SHUTDOWN);
+			phy_link_state_set(plink, PHY_LINK_SHUTDOWN);
+		}
+	} else {
+		if (plink->state != PHY_LINK_SHUTDOWN) {
+			trx_sched_clock_stopped(pinst->trx->bts);
+			phy_link_state_set(plink, PHY_LINK_SHUTDOWN);
+
+			/* Notify TRX close on all TRX associated with this phy */
+			llist_for_each_entry(pinst, &plink->instances, list) {
+				bts_model_trx_close_cb(pinst->trx, rc);
+			}
 		}
 	}
 }
@@ -424,7 +434,7 @@
 }
 
 /* deactivate transceiver */
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	struct phy_instance *pinst = trx_phy_instance(trx);
 	struct trx_l1h *l1h = pinst->u.osmotrx.hdl;
@@ -433,12 +443,12 @@
 	if (l1h->config.enabled) {
 		l1h->config.enabled = false;
 		l1if_provision_transceiver_trx(l1h);
-	}
+	} else if (!pinst->phy_link->u.osmotrx.poweronoff_sent) {
+		bts_model_trx_close_cb(trx, 0);
+	} /* else: poweroff in progress, cb will be called upon TRXC RSP */
 
 	/* Set to Operational State: Disabled */
 	check_transceiver_availability_trx(l1h, 0);
-
-	return 0;
 }
 
 /* on RSL failure, deactivate transceiver */
diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c
index b971af5..8db0201 100644
--- a/src/osmo-bts-virtual/bts_model.c
+++ b/src/osmo-bts-virtual/bts_model.c
@@ -50,10 +50,10 @@
 	return -1;
 }
 
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
 {
 	LOGP(DL1C, LOGL_NOTICE, "Unimplemented %s\n", __func__);
-	return 0;
+	bts_model_trx_close_cb(trx, 0);
 }
 
 int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)
diff --git a/tests/stubs.c b/tests/stubs.c
index 20ce512..4663a44 100644
--- a/tests/stubs.c
+++ b/tests/stubs.c
@@ -1,4 +1,5 @@
 #include <osmo-bts/bts.h>
+#include <osmo-bts/bts_model.h>
 
 struct femtol1_hdl;
 struct bts_model_set_dyn_pdch_data;
@@ -23,8 +24,8 @@
 
 int bts_model_trx_deact_rf(struct gsm_bts_trx *trx)
 { return 0; }
-int bts_model_trx_close(struct gsm_bts_trx *trx)
-{ return 0; }
+void bts_model_trx_close(struct gsm_bts_trx *trx)
+{ bts_model_trx_close_cb(trx, 0); }
 int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type,
 			struct tlv_parsed *old_attr, struct tlv_parsed *new_attr,
 			void *obj)

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/18953
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I7d76b600fc06e1114b35bf0c2d08eff5bbd1b69a
Gerrit-Change-Number: 18953
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200622/ced1c4cb/attachment.htm>


More information about the gerrit-log mailing list