aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bts-trx/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osmo-bts-trx/main.c')
-rw-r--r--src/osmo-bts-trx/main.c125
1 files changed, 103 insertions, 22 deletions
diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c
index b1fa2079..ddc44285 100644
--- a/src/osmo-bts-trx/main.c
+++ b/src/osmo-bts-trx/main.c
@@ -13,7 +13,7 @@
* 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 General Public License for more details.
+ * 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/>.
@@ -43,6 +43,8 @@
#include <osmocom/core/gsmtap.h>
#include <osmocom/core/gsmtap_util.h>
#include <osmocom/core/bits.h>
+#include <osmocom/core/rate_ctr.h>
+#include <osmocom/core/stats.h>
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/phy_link.h>
@@ -59,8 +61,34 @@
#include "l1_if.h"
#include "trx_if.h"
+static const struct rate_ctr_desc btstrx_ctr_desc[] = {
+ [BTSTRX_CTR_SCHED_DL_MISS_FN] = {
+ "trx_clk:sched_dl_miss_fn",
+ "Downlink frames scheduled later than expected due to missed timerfd event (due to high system load)"
+ },
+ [BTSTRX_CTR_SCHED_DL_FH_NO_CARRIER] = {
+ "trx_sched:dl_fh_no_carrier",
+ "Frequency hopping: no carrier found for a Downlink burst (check hopping parameters)"
+ },
+ [BTSTRX_CTR_SCHED_DL_FH_CACHE_MISS] = {
+ "trx_sched:dl_fh_cache_miss",
+ "Frequency hopping: no Downlink carrier found in cache (lookup performed)"
+ },
+ [BTSTRX_CTR_SCHED_UL_FH_NO_CARRIER] = {
+ "trx_sched:ul_fh_no_carrier",
+ "Frequency hopping: no carrier found for an Uplink burst (check hopping parameters)"
+ },
+};
+static const struct rate_ctr_group_desc btstrx_ctrg_desc = {
+ "bts-trx",
+ "osmo-bts-trx specific counters",
+ OSMO_STATS_CLASS_GLOBAL,
+ ARRAY_SIZE(btstrx_ctr_desc),
+ btstrx_ctr_desc
+};
+
/* dummy, since no direct dsp support */
-uint32_t trx_get_hlayer1(struct gsm_bts_trx *trx)
+uint32_t trx_get_hlayer1(const struct gsm_bts_trx *trx)
{
return 0;
}
@@ -97,29 +125,85 @@ int bts_model_handle_options(int argc, char **argv)
int bts_model_init(struct gsm_bts *bts)
{
+ struct bts_trx_priv *bts_trx = talloc_zero(bts, struct bts_trx_priv);
+ bts_trx->clk_s.fn_timer_ofd.fd = -1;
+ bts_trx->ctrs = rate_ctr_group_alloc(bts_trx, &btstrx_ctrg_desc, 0);
+
+ bts->model_priv = bts_trx;
bts->variant = BTS_OSMO_TRX;
- bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
+ bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3) | CIPHER_A5(4);
+ bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS
+ | NM_IPAC_MASK_GPRS_CODING_MCS;
- /* FIXME: this needs to be overridden with the real hardrware
- * value */
+ /* The nominal value for each TRX is later overwritten through VTY cmd
+ * 'nominal-tx-power' if present, otherwise through TRXC cmd NOMTXPOWER.
+ */
bts->c0->nominal_power = 23;
- gsm_bts_set_feature(bts, BTS_FEAT_GPRS);
- gsm_bts_set_feature(bts, BTS_FEAT_OML_ALERTS);
- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);
- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);
- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);
- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);
- gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);
- gsm_bts_set_feature(bts, BTS_FEAT_CBCH);
-
- bts_model_vty_init(bts);
+ /* order alphabetically */
+ osmo_bts_set_feature(bts->features, BTS_FEAT_ACCH_REP);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_ACCH_TEMP_OVP);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_BCCH_POWER_RED);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_EGPRS);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_GPRS);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_HOPPING);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_MULTI_TSC);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_OML_ALERTS);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_AMR);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_EFR);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_F_V1);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_AMR);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_SPEECH_H_V1);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_VAMOS);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_VGCS);
+ osmo_bts_set_feature(bts->features, BTS_FEAT_VBS);
+
+ bts_internal_flag_set(bts, BTS_INTERNAL_FLAG_MEAS_PAYLOAD_COMB);
+ bts_internal_flag_set(bts, BTS_INTERNAL_FLAG_INTERF_MEAS);
+
+ /* The default HR codec output format in the absence of saved
+ * vty config needs to match what was implemented previously,
+ * for the sake of existing deployments, i.e., to avoid
+ * a surprise functional change upon software update. */
+ bts->emit_hr_rfc5993 = true;
+
+ /* For the same reason as the above, rtp internal-uplink-ecu
+ * needs to be enabled by default on osmo-bts-trx model only. */
+ bts->use_ul_ecu = true;
return 0;
}
int bts_model_trx_init(struct gsm_bts_trx *trx)
{
+ /* Frequency bands indicated to the BSC */
+ trx->support.freq_bands = NM_IPAC_F_FREQ_BAND_PGSM
+ | NM_IPAC_F_FREQ_BAND_EGSM
+ | NM_IPAC_F_FREQ_BAND_RGSM
+ | NM_IPAC_F_FREQ_BAND_DCS
+ | NM_IPAC_F_FREQ_BAND_PCS
+ | NM_IPAC_F_FREQ_BAND_850
+ | NM_IPAC_F_FREQ_BAND_480
+ | NM_IPAC_F_FREQ_BAND_450;
+
+ /* Channel types and modes indicated to the BSC */
+ trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON
+ | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH
+ | NM_IPAC_F_CHANT_SDCCH8_CBCH
+ | NM_IPAC_F_CHANT_PDCHF
+ | NM_IPAC_F_CHANT_TCHF_PDCHF;
+ trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH
+ | NM_IPAC_MASK_CHANM_CSD_NT
+ | NM_IPAC_MASK_CHANM_CSD_T;
+ /* TODO: missing rate adaptation for TCH/F14.4 (see OS#6167) */
+ trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_T_14k4;
+ trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_NT_14k4;
+
+ /* The nominal value for each TRX is later overwritten through VTY cmd
+ * 'nominal-tx-power' if present, otherwise through TRXC cmd NOMTXPOWER.
+ */
+ l1if_trx_set_nominal_power(trx, trx->bts->c0->nominal_power);
return 0;
}
@@ -129,13 +213,10 @@ void bts_model_phy_link_set_defaults(struct phy_link *plink)
plink->u.osmotrx.remote_ip = talloc_strdup(plink, "127.0.0.1");
plink->u.osmotrx.base_port_local = 5800;
plink->u.osmotrx.base_port_remote = 5700;
- plink->u.osmotrx.clock_advance = 20;
- plink->u.osmotrx.rts_advance = 5;
- plink->u.osmotrx.trx_ta_loop = true;
- plink->u.osmotrx.trx_ms_power_loop = false;
- plink->u.osmotrx.trx_target_rssi = -10;
+ plink->u.osmotrx.clock_advance = 2;
+ plink->u.osmotrx.rts_advance = 3;
/* attempt use newest TRXD version by default: */
- plink->u.osmotrx.trxd_hdr_ver_max = TRX_DATA_FORMAT_VER;
+ plink->u.osmotrx.trxd_pdu_ver_max = TRX_DATA_PDU_VER;
}
void bts_model_phy_instance_set_defaults(struct phy_instance *pinst)
@@ -144,7 +225,7 @@ void bts_model_phy_instance_set_defaults(struct phy_instance *pinst)
l1h = trx_l1h_alloc(tall_bts_ctx, pinst);
pinst->u.osmotrx.hdl = l1h;
- l1h->config.power_oml = 1;
+ l1h->config.forced_max_power_red = -1;
}
int main(int argc, char **argv)