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.orgpespin has submitted this change. ( 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(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
diff --git a/include/osmo-bts/bts_model.h b/include/osmo-bts/bts_model.h
index be0480c..f62291c 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 these 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 e65fff4..81cd348 100644
--- a/src/common/bts_shutdown_fsm.c
+++ b/src/common/bts_shutdown_fsm.c
@@ -170,3 +170,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 2aa27a7..22b590a 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);
+ }
}
}
}
@@ -422,7 +432,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;
@@ -431,12 +441,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: 4
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200623/eb1e15de/attachment.htm>