aboutsummaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-07-03 17:27:01 +0200
committerpespin <pespin@sysmocom.de>2020-07-14 09:44:06 +0000
commit122ff83dd06e0a839dccc6d7a25ff87e69875784 (patch)
treee2b1df943e23ea8c96169c82a7554e9c34901ad8 /src/common
parentd5107c05836f3517958dd76abfa51cfc39a93f49 (diff)
Move struct gsm_bts_trx: gsm_data.* & bts.* => bts_trx.*
Move all struct gsm_bts_trx references from bulky gsm_data to its own file containing all related definitions and implementations. Also move a few functions clearly related to that object which were placed in bts.* Change-Id: Iebaf5b221c48b571f45408af867ce6f9c0cd9f4a
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Makefile.am1
-rw-r--r--src/common/abis.c1
-rw-r--r--src/common/bts.c88
-rw-r--r--src/common/bts_ctrl_lookup.c1
-rw-r--r--src/common/bts_trx.c205
-rw-r--r--src/common/gsm_data.c90
-rw-r--r--src/common/sysinfo.c1
-rw-r--r--src/common/tx_power.c1
8 files changed, 211 insertions, 177 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index 2fa55144..e3a72dc8 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -14,6 +14,7 @@ libbts_a_SOURCES = \
abis.c \
oml.c \
bts.c \
+ bts_trx.c \
rsl.c \
vty.c \
paging.c \
diff --git a/src/common/abis.c b/src/common/abis.c
index ad6fddcb..4c62e8f4 100644
--- a/src/common/abis.c
+++ b/src/common/abis.c
@@ -49,6 +49,7 @@
#include <osmo-bts/rsl.h>
#include <osmo-bts/oml.h>
#include <osmo-bts/bts_model.h>
+#include <osmo-bts/bts_trx.h>
static struct gsm_bts *g_bts;
diff --git a/src/common/bts.c b/src/common/bts.c
index 2f6a7004..983f61d9 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -383,40 +383,6 @@ int bts_init(struct gsm_bts *bts)
return rc;
}
-/* Initialize the TRX data structures, called before config
- * file reading */
-int bts_trx_init(struct gsm_bts_trx *trx)
-{
- /* initialize bts data structure */
- struct trx_power_params *tpp = &trx->power_params;
- int rc, i;
-
- for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
- struct gsm_bts_trx_ts *ts = &trx->ts[i];
- int k;
-
- for (k = 0; k < ARRAY_SIZE(ts->lchan); k++) {
- struct gsm_lchan *lchan = &ts->lchan[k];
- INIT_LLIST_HEAD(&lchan->dl_tch_queue);
- }
- }
- /* Default values for the power adjustments */
- tpp->ramp.max_initial_pout_mdBm = to_mdB(0);
- tpp->ramp.step_size_mdB = to_mdB(2);
- tpp->ramp.step_interval_sec = 1;
-
- /* IF BTS model doesn't DSP/HW support MS Power Control Loop, enable osmo algo by default: */
- if (!bts_internal_flag_get(trx->bts, BTS_INTERNAL_FLAG_MS_PWR_CTRL_DSP))
- trx->ms_pwr_ctl_soft = true;
-
- rc = bts_model_trx_init(trx);
- if (rc < 0) {
- llist_del(&trx->list);
- return rc;
- }
- return 0;
-}
-
/* main link is established, send status report */
int bts_link_estab(struct gsm_bts *bts)
{
@@ -451,55 +417,6 @@ int bts_link_estab(struct gsm_bts *bts)
return bts_model_oml_estab(bts);
}
-/* RSL link is established, send status report */
-int trx_link_estab(struct gsm_bts_trx *trx)
-{
- struct e1inp_sign_link *link = trx->rsl_link;
- uint8_t radio_state = link ? NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;
- int rc;
-
- LOGP(DSUM, LOGL_INFO, "RSL link (TRX %02x) state changed to %s, sending Status'.\n",
- trx->nr, link ? "up" : "down");
-
- oml_mo_state_chg(&trx->mo, radio_state, NM_AVSTATE_OK);
-
- if (link)
- rc = rsl_tx_rf_res(trx);
- else
- rc = bts_model_trx_deact_rf(trx);
- if (rc < 0) {
- oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL,
- link ?
- "Failed to establish RSL link (%d)" :
- "Failed to deactivate RF (%d)", rc);
- }
-
- return 0;
-}
-
-/* set the availability of the TRX (used by PHY driver) */
-int trx_set_available(struct gsm_bts_trx *trx, int avail)
-{
- int tn;
-
- LOGP(DSUM, LOGL_INFO, "TRX(%d): Setting available = %d\n",
- trx->nr, avail);
- if (avail) {
- int op_state = trx->rsl_link ? NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;
- oml_mo_state_chg(&trx->mo, op_state, NM_AVSTATE_OK);
- oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_OK);
- for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)
- oml_mo_state_chg(&trx->ts[tn].mo, op_state, NM_AVSTATE_OK);
- } else {
- oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
- oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_NOT_INSTALLED);
-
- for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)
- oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
- }
- return 0;
-}
-
/* prepare the per-SAPI T200 arrays for a given lchan */
static int t200_by_lchan(int *t200_ms_dcch, int *t200_ms_acch, struct gsm_lchan *lchan)
{
@@ -899,11 +816,6 @@ int bts_supports_cipher(struct gsm_bts *bts, int rsl_cipher)
return sup > 0;
}
-bool trx_ms_pwr_ctrl_is_osmo(struct gsm_bts_trx *trx)
-{
- return trx->ms_pwr_ctl_soft;
-}
-
struct gsm_time *get_time(struct gsm_bts *bts)
{
return &bts->gsm_time;
diff --git a/src/common/bts_ctrl_lookup.c b/src/common/bts_ctrl_lookup.c
index f0157e9a..a3e3c8bc 100644
--- a/src/common/bts_ctrl_lookup.c
+++ b/src/common/bts_ctrl_lookup.c
@@ -28,6 +28,7 @@
#include <osmo-bts/logging.h>
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/control_if.h>
+#include <osmo-bts/bts_trx.h>
extern vector ctrl_node_vec;
diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c
new file mode 100644
index 00000000..15640c66
--- /dev/null
+++ b/src/common/bts_trx.c
@@ -0,0 +1,205 @@
+/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <osmo-bts/logging.h>
+#include <osmo-bts/gsm_data.h>
+#include <osmo-bts/bts_trx.h>
+#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_model.h>
+#include <osmo-bts/rsl.h>
+
+struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)
+{
+ struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);
+ int k;
+
+ if (!trx)
+ return NULL;
+
+ trx->bts = bts;
+ trx->nr = bts->num_trx++;
+
+ gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,
+ bts->nr, trx->nr, 0xff);
+
+ gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,
+ bts->nr, trx->nr, 0xff);
+
+ for (k = 0; k < TRX_NR_TS; k++) {
+ struct gsm_bts_trx_ts *ts = &trx->ts[k];
+ int l;
+
+ ts->trx = trx;
+ ts->nr = k;
+ ts->pchan = GSM_PCHAN_NONE;
+ ts->dyn.pchan_is = GSM_PCHAN_NONE;
+ ts->dyn.pchan_want = GSM_PCHAN_NONE;
+ ts->tsc = -1;
+
+ gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,
+ bts->nr, trx->nr, ts->nr);
+
+ for (l = 0; l < TS_MAX_LCHAN; l++) {
+ struct gsm_lchan *lchan;
+ char *name;
+ lchan = &ts->lchan[l];
+
+ lchan->ts = ts;
+ lchan->nr = l;
+ lchan->type = GSM_LCHAN_NONE;
+
+ name = gsm_lchan_name_compute(lchan);
+ lchan->name = talloc_strdup(trx, name);
+ INIT_LLIST_HEAD(&lchan->sapi_cmds);
+ }
+ }
+
+ if (trx->nr != 0)
+ trx->nominal_power = bts->c0->nominal_power;
+
+ llist_add_tail(&trx->list, &bts->trx_list);
+
+ return trx;
+}
+
+/* Initialize the TRX data structures, called before config
+ * file reading */
+int bts_trx_init(struct gsm_bts_trx *trx)
+{
+ /* initialize bts data structure */
+ struct trx_power_params *tpp = &trx->power_params;
+ int rc, i;
+
+ for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
+ struct gsm_bts_trx_ts *ts = &trx->ts[i];
+ int k;
+
+ for (k = 0; k < ARRAY_SIZE(ts->lchan); k++) {
+ struct gsm_lchan *lchan = &ts->lchan[k];
+ INIT_LLIST_HEAD(&lchan->dl_tch_queue);
+ }
+ }
+ /* Default values for the power adjustments */
+ tpp->ramp.max_initial_pout_mdBm = to_mdB(0);
+ tpp->ramp.step_size_mdB = to_mdB(2);
+ tpp->ramp.step_interval_sec = 1;
+
+ /* IF BTS model doesn't DSP/HW support MS Power Control Loop, enable osmo algo by default: */
+ if (!bts_internal_flag_get(trx->bts, BTS_INTERNAL_FLAG_MS_PWR_CTRL_DSP))
+ trx->ms_pwr_ctl_soft = true;
+
+ rc = bts_model_trx_init(trx);
+ if (rc < 0) {
+ llist_del(&trx->list);
+ return rc;
+ }
+ return 0;
+}
+
+struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num)
+{
+ struct gsm_bts_trx *trx;
+
+ if (num >= bts->num_trx)
+ return NULL;
+
+ llist_for_each_entry(trx, &bts->trx_list, list) {
+ if (trx->nr == num)
+ return trx;
+ }
+
+ return NULL;
+}
+
+static char ts2str[255];
+
+char *gsm_trx_name(const struct gsm_bts_trx *trx)
+{
+ if (!trx)
+ snprintf(ts2str, sizeof(ts2str), "(trx=NULL)");
+ else
+ snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)",
+ trx->bts->nr, trx->nr);
+
+ return ts2str;
+}
+
+const char *gsm_trx_unit_id(struct gsm_bts_trx *trx)
+{
+ static char buf[23];
+
+ snprintf(buf, sizeof(buf), "%u/%u/%u", trx->bts->ip_access.site_id,
+ trx->bts->ip_access.bts_id, trx->nr);
+ return buf;
+}
+
+/* RSL link is established, send status report */
+int trx_link_estab(struct gsm_bts_trx *trx)
+{
+ struct e1inp_sign_link *link = trx->rsl_link;
+ uint8_t radio_state = link ? NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;
+ int rc;
+
+ LOGP(DSUM, LOGL_INFO, "RSL link (TRX %02x) state changed to %s, sending Status'.\n",
+ trx->nr, link ? "up" : "down");
+
+ oml_mo_state_chg(&trx->mo, radio_state, NM_AVSTATE_OK);
+
+ if (link)
+ rc = rsl_tx_rf_res(trx);
+ else
+ rc = bts_model_trx_deact_rf(trx);
+ if (rc < 0) {
+ oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL,
+ link ?
+ "Failed to establish RSL link (%d)" :
+ "Failed to deactivate RF (%d)", rc);
+ }
+
+ return 0;
+}
+
+/* set the availability of the TRX (used by PHY driver) */
+int trx_set_available(struct gsm_bts_trx *trx, int avail)
+{
+ int tn;
+
+ LOGP(DSUM, LOGL_INFO, "TRX(%d): Setting available = %d\n",
+ trx->nr, avail);
+ if (avail) {
+ int op_state = trx->rsl_link ? NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;
+ oml_mo_state_chg(&trx->mo, op_state, NM_AVSTATE_OK);
+ oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_OK);
+ for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)
+ oml_mo_state_chg(&trx->ts[tn].mo, op_state, NM_AVSTATE_OK);
+ } else {
+ oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
+ oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_NOT_INSTALLED);
+
+ for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)
+ oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
+ }
+ return 0;
+}
+
+
+bool trx_ms_pwr_ctrl_is_osmo(struct gsm_bts_trx *trx)
+{
+ return trx->ms_pwr_ctl_soft;
+}
diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c
index c63793c6..383a31d2 100644
--- a/src/common/gsm_data.c
+++ b/src/common/gsm_data.c
@@ -37,6 +37,7 @@
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_trx.h>
const struct value_string gsm_pchant_names[13] = {
{ GSM_PCHAN_NONE, "NONE" },
@@ -103,88 +104,8 @@ const char *gsm_lchans_name(enum gsm_lchan_state s)
return get_value_string(lchan_s_names, s);
}
-struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)
-{
- struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);
- int k;
-
- if (!trx)
- return NULL;
-
- trx->bts = bts;
- trx->nr = bts->num_trx++;
-
- gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,
- bts->nr, trx->nr, 0xff);
-
- gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,
- bts->nr, trx->nr, 0xff);
-
- for (k = 0; k < TRX_NR_TS; k++) {
- struct gsm_bts_trx_ts *ts = &trx->ts[k];
- int l;
-
- ts->trx = trx;
- ts->nr = k;
- ts->pchan = GSM_PCHAN_NONE;
- ts->dyn.pchan_is = GSM_PCHAN_NONE;
- ts->dyn.pchan_want = GSM_PCHAN_NONE;
- ts->tsc = -1;
-
- gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,
- bts->nr, trx->nr, ts->nr);
-
- for (l = 0; l < TS_MAX_LCHAN; l++) {
- struct gsm_lchan *lchan;
- char *name;
- lchan = &ts->lchan[l];
-
- lchan->ts = ts;
- lchan->nr = l;
- lchan->type = GSM_LCHAN_NONE;
-
- name = gsm_lchan_name_compute(lchan);
- lchan->name = talloc_strdup(trx, name);
- INIT_LLIST_HEAD(&lchan->sapi_cmds);
- }
- }
-
- if (trx->nr != 0)
- trx->nominal_power = bts->c0->nominal_power;
-
- llist_add_tail(&trx->list, &bts->trx_list);
-
- return trx;
-}
-
-struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num)
-{
- struct gsm_bts_trx *trx;
-
- if (num >= bts->num_trx)
- return NULL;
-
- llist_for_each_entry(trx, &bts->trx_list, list) {
- if (trx->nr == num)
- return trx;
- }
-
- return NULL;
-}
-
static char ts2str[255];
-char *gsm_trx_name(const struct gsm_bts_trx *trx)
-{
- if (!trx)
- snprintf(ts2str, sizeof(ts2str), "(trx=NULL)");
- else
- snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)",
- trx->bts->nr, trx->nr);
-
- return ts2str;
-}
-
char *gsm_ts_name(const struct gsm_bts_trx_ts *ts)
{
@@ -459,15 +380,6 @@ bool ts_is_tch(struct gsm_bts_trx_ts *ts)
return pchan_is_tch(ts_pchan(ts));
}
-const char *gsm_trx_unit_id(struct gsm_bts_trx *trx)
-{
- static char buf[23];
-
- snprintf(buf, sizeof(buf), "%u/%u/%u", trx->bts->ip_access.site_id,
- trx->bts->ip_access.bts_id, trx->nr);
- return buf;
-}
-
const struct value_string lchan_ciph_state_names[] = {
{ LCHAN_CIPH_NONE, "NONE" },
{ LCHAN_CIPH_RX_REQ, "RX_REQ" },
diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c
index 4a86c4e7..e35caeb4 100644
--- a/src/common/sysinfo.c
+++ b/src/common/sysinfo.c
@@ -26,6 +26,7 @@
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/pcu_if.h>
#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_trx.h>
/* properly increment SI2q index and return SI2q data for scheduling */
static inline uint8_t *get_si2q_inc_index(struct gsm_bts *bts)
diff --git a/src/common/tx_power.c b/src/common/tx_power.c
index 8292d9f5..8f50b0f5 100644
--- a/src/common/tx_power.c
+++ b/src/common/tx_power.c
@@ -29,6 +29,7 @@
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/tx_power.h>
+#include <osmo-bts/bts_trx.h>
static int get_pa_drive_level_mdBm(const struct power_amp *pa,
int desired_p_out_mdBm, unsigned int arfcn)