Compare commits

..

2 Commits

Author SHA1 Message Date
Andreas Eversberg
6a32f0499f Get RSSI from received uplink data and send to PCU
This bumps the PCU API version and thus requires a new version of the
code on the sysmoBTS side!
2013-03-17 17:11:58 +01:00
Harald Welte
a5608d092d measurement: use new 'struct gsm_meas_rep_unidir' of libosmocore 2013-03-17 17:10:35 +01:00
434 changed files with 5264 additions and 108793 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1 +0,0 @@
open_collective: osmocom

79
.gitignore vendored
View File

@@ -4,69 +4,29 @@ Makefile.in
Makefile
.deps
btsconfig.h
btsconfig.h.in
aclocal.m4
autom4te.cache
config.log
config.status
config.guess
config.sub
configure
compile
depcomp
install-sh
missing
stamp-h1
libtool
ltmain.sh
core
core.*
# git-version-gen magic
.tarball-version
.version
contrib/sysmobts-calib/sysmobts-calib
src/osmo-bts-sysmo/sysmobts-calib
src/osmo-bts-sysmo/l1fwd-proxy
src/osmo-bts-sysmo/osmo-bts-sysmo
src/osmo-bts-sysmo/osmo-bts-sysmo-remote
src/osmo-bts-sysmo/sysmobts
src/osmo-bts-sysmo/sysmobts-remote
src/osmo-bts-sysmo/sysmobts-mgr
src/osmo-bts-sysmo/sysmobts-util
src/osmo-bts-lc15/lc15bts-mgr
src/osmo-bts-lc15/lc15bts-util
src/osmo-bts-lc15/misc/.dirstamp
src/osmo-bts-lc15/osmo-bts-lc15
src/osmo-bts-trx/osmo-bts-trx
src/osmo-bts-octphy/osmo-bts-octphy
src/osmo-bts-virtual/osmo-bts-virtual
src/osmo-bts-omldummy/osmo-bts-omldummy
src/osmo-bts-oc2g/osmo-bts-oc2g
src/osmo-bts-oc2g/oc2gbts-mgr
src/osmo-bts-oc2g/oc2gbts-util
src/osmo-bts-oc2g/misc/.dirstamp
tests/atconfig
tests/package.m4
tests/amr/amr_test
tests/csd/csd_test
tests/agch/agch_test
tests/paging/paging_test
tests/cipher/cipher_test
tests/sysmobts/sysmobts_test
tests/meas/meas_test
tests/misc/misc_test
tests/handover/handover_test
tests/tx_power/tx_power_test
tests/ta_control/ta_control_test
tests/power/ms_power_loop_test
tests/power/bs_power_loop_test
tests/testsuite
tests/testsuite.log
@@ -74,39 +34,6 @@ tests/testsuite.log
doc/vty_reference.xml
# Backups, vi, merges
*~
*.sw?
*.orig
*.sav
# debian
.tarball-version
debian/autoreconf.after
debian/autoreconf.before
debian/files
debian/*.debhelper.log
debian/*.substvars
debian/osmo-bts-trx-dbg/
debian/osmo-bts-trx/
debian/tmp/
# manuals
doc/manuals/*.html
doc/manuals/*.svg
doc/manuals/*.pdf
doc/manuals/vty/*.pdf
doc/manuals/*__*.png
doc/manuals/*.check
doc/manuals/generated/
doc/manuals/vty/osmobts-*-vty-reference.xml
doc/manuals/vty/osmobts-*-vty-reference.xml.inc.gen
doc/manuals/vty/osmobts-*-vty-reference.xml.inc.merged
doc/manuals/osmomsc-usermanual.xml
doc/manuals/common
doc/manuals/build
contrib/osmo-bts.spec
contrib/ber/rtp_ber
contrib/ber/rtp_gen_map
arm-poky-linux-gnueabi-libtool

View File

@@ -1,3 +0,0 @@
[gerrit]
host=gerrit.osmocom.org
project=osmo-bts

View File

@@ -1,12 +0,0 @@
Harald Welte <laforge@gnumonks.org>
Harald Welte <laforge@gnumonks.org> <laflocal@hanuman.gnumonks.org>
Harald Welte <laforge@gnumonks.org> <laflocal@goeller.de.gnumonks.org>
Holger Hans Peter Freyther <holger@moiji-mobile.com> <zecke@selfish.org>
Holger Hans Peter Freyther <holger@moiji-mobile.com> <ich@tamarin.(none)>
Holger Hans Peter Freyther <holgre@moiji-mobile.com> <holger@freyther.de>
Andreas Eversberg <jolly@eversberg.eu>
Andreas Eversberg <jolly@eversberg.eu> <Andreas.Eversberg@versatel.de>
Andreas Eversberg <jolly@eversberg.eu> <root@nuedel.(none)>
Pablo Neira Ayuso <pablo@soleta.eu> <pablo@gnumonks.org>
Max Suraev <msuraev@sysmocom.de>
Tom Tsou <tom.tsou@ettus.com> <tom@tsou.cc>

View File

@@ -1,25 +1,14 @@
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
SUBDIRS = include src tests doc contrib
SUBDIRS = include src tests
# package the contrib and doc
EXTRA_DIST = \
.version \
README.md \
contrib/dump_docs.py \
debian \
git-version-gen \
$(NULL)
AM_DISTCHECK_CONFIGURE_FLAGS = \
--with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir)
@RELMAKE@
BUILT_SOURCES = $(top_srcdir)/.version
$(top_srcdir)/.version:
echo $(VERSION) > $@-t && mv $@-t $@
dist-hook:
echo $(VERSION) > $(distdir)/.tarball-version
contrib/dump_docs.py contrib/screenrc-l1fwd contrib/sysmobts.service \
contrib/l1fwd.init contrib/screenrc-sysmobts contrib/respawn.sh \
contrib/sysmobts.init contrib/sysmobts-calib/Makefile \
contrib/sysmobts-calib/sysmobts-calib.c \
contrib/sysmobts-calib/sysmobts-layer1.c \
contrib/sysmobts-calib/sysmobts-layer1.h \
doc/examples/osmo-bts.cfg

55
README Normal file
View File

@@ -0,0 +1,55 @@
Repository for new the Osmocom BTS implementation.
This code implementes the Layer 2 and higher of a more or less
conventional GSM BTS (Base Transceiver Station) - however, using an
Abis/IP interface, rather than the old-fashioned E1/T1.
Specificallt, this includes
* BTS-Side implementation of TS 08.58 (RSL) and TS 12.21 (OML)
* BTS-Side implementation of LAPDm (using libosmocore/libosmogsm)
* A somewhat separated interface between those higher layer parts
and the Layer1 interface.
Right now, only one hardware and Layer1 are supported: The sysmocom
sysmoBTS.
There is some experimental and way incomplete code to use a couple of
OsmocomBB phones and run them in the BTS. However, the required code
for the Calypso DSP code have not been written yet. This would still
require a lot of work.
Some additional work is being done in using some parts of the OpenBTS
L1FEC and glue it against omso-bts. However, this is also still in an
early, experimental stage.
== Known Limitations ==
As of June 3, 2012, the following known limitations exist in this
implementation:
=== Common Core ===
* No Extended BCCH support
* System Information limited to 1,2,2bis,2ter,2quater,3,4,5,6,9,13
* No RATSCCH in AMR
* No OML (TS 12.21) alarms yet (temperature, ...)
* Only single-TRX BTS at this point
* Will reject TS 12.21 STARTING TIME in SET BTS ATTR / SET CHAN ATTR
* No support for frequency hopping
* No reporting of interference levels as part of TS 08.58 RF RES IND
* No error reporting in case PAGING COMMAND fails due to queue overflow
* No hand-over support (planned)
* No use of TS 08.58 BS Power and MS Power parameters
* No support of TS 08.58 MultiRate Control
* No support of TS 08.58 Supported Codec Types
* No support of Bter frame / ENHANCED MEASUREMENT REPORT
=== osmo-bts-sysmo ===
* No CSD / ECSD support (not planned)
* No GPRS/EDGE support (planned)
* GSM-R frequency band supported, but no NCH/ASCI/SoLSA
* All timeslots on one TRX have to use same training sequence (TSC)
* No multi-TRX support yet, though hardware+L1 support stacking
* Makes no use of 12.21 Intave Parameters and Interference
Level Boundaries
* Makes no use of TS 12.21 T3105
* Doesn't yet include MAC address in Abis/IP Identity message

138
README.md
View File

@@ -1,138 +0,0 @@
osmo-bts - Osmocom BTS Implementation
====================================
This repository contains a C-language implementation of a GSM Base
Transceiver Station (BTS). It is part of the
[Osmocom](https://osmocom.org/) Open Source Mobile Communications
project.
This code implements Layer 2 and higher of a more or less conventional GSM BTS
(Base Transceiver Station) - however, using an Abis/IP interface, rather than
the old-fashioned E1/T1.
Specifically, this includes
* BTS-side implementation of TS 08.58 (RSL) and TS 12.21 (OML)
* BTS-side implementation of LAPDm (using libosmocore/libosmogsm)
* A somewhat separated interface between those higher layer parts and the
Layer1 interface.
Several kinds of BTS hardware are supported:
* sysmocom sysmoBTS
* Octasic octphy
* Nutaq litecell 1.5
* OpenCellular 2G (OC-2G)
* software-defined radio based osmo-bts-trx (e.g. USRP B210, UmTRX, LimeSDR)
Homepage
--------
The official homepage of the project is
<https://osmocom.org/projects/osmobts/wiki>
GIT Repository
--------------
You can clone from the official osmo-bts.git repository using
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-bts
There is a web interface at <https://gitea.osmocom.org/cellular-infrastructure/osmo-bts>
Documentation
-------------
User Manuals and VTY reference manuals are [optionally] built in PDF form
as part of the build process.
Pre-rendered PDF version of the current "master" can be found at
[User Manual](https://ftp.osmocom.org/docs/latest/osmobts-usermanual.pdf)
as well as the VTY reference manuals
* [VTY Reference Manual for osmo-bts-sysmo](https://ftp.osmocom.org/docs/latest/osmobts-sysmo-vty-reference.pdf)
* [VTY Reference Manual for osmo-bts-trx](https://ftp.osmocom.org/docs/latest/osmobts-trx-vty-reference.pdf)
* [VTY Reference Manual for osmo-bts-lc15](https://ftp.osmocom.org/docs/latest/osmobts-lc15-vty-reference.pdf)
* [VTY Reference Manual for osmo-bts-oc2g](https://ftp.osmocom.org/docs/latest/osmobts-oc2g-vty-reference.pdf)
* [VTY Reference Manual for osmo-bts-octphy](https://ftp.osmocom.org/docs/latest/osmobts-octphy-vty-reference.pdf)
There also is an
[Abis reference Manual](https://ftp.osmocom.org/docs/latest/osmobts-abis.pdf)
describing the OsmoBTS specific A-bis dialect.
Forum
-----
We welcome any osmo-bts related discussions in the
[Cellular Network Infrastructure -> 2G RAN (GERAN)](https://discourse.osmocom.org/c/cni/geran)
section of the osmocom discourse (web based Forum).
Mailing List
------------
Discussions related to osmo-bts are happening on the
openbsc@lists.osmocom.org mailing list, please see
https://lists.osmocom.org/mailman/listinfo/openbsc for subscription
options and the list archive.
Please observe the [Osmocom Mailing List
Rules](https://osmocom.org/projects/cellular-infrastructure/wiki/Mailing_List_Rules)
when posting.
Issue Tracker
-------------
We use the [issue tracker of the osmo-bts project on osmocom.org](https://osmocom.org/projects/osmobts/issues) for
tracking the state of bug reports and feature requests. Feel free to submit any issues you may find, or help
us out by resolving existing issues.
Contributing
------------
Our coding standards are described at
https://osmocom.org/projects/cellular-infrastructure/wiki/Coding_standards
We use a Gerrit based patch submission/review process for managing
contributions. Please see
https://osmocom.org/projects/cellular-infrastructure/wiki/Gerrit for
more details
The current patch queue for osmo-bts can be seen at
https://gerrit.osmocom.org/#/q/project:osmo-bts+status:open
Known Limitations
=================
As of January 2021, the following known limitations exist in this
implementation:
Common Core
-----------
* No Extended BCCH support
* System Information limited to 1,2,2bis,2ter,2quater,3,4,5,6,9,13
* No RATSCCH in AMR
* Will reject TS 12.21 STARTING TIME in SET BTS ATTR / SET CHAN ATTR
* No support of TS 08.58 MultiRate Control
* No support of TS 08.58 Supported Codec Types
* No support of Bter frame / ENHANCED MEASUREMENT REPORT
osmo-bts-sysmo
--------------
* No CSD / ECSD support (not planned)
* GSM-R frequency band supported, but no NCH/ASCI/SoLSA
* All timeslots on one TRX have to use same training sequence (TSC)
* No multi-TRX support yet, though hardware+L1 support stacking
* Makes no use of 12.21 Intave Parameters and Interference
Level Boundaries
* MphConfig.CNF can be returned to the wrong callback. E.g. with Tx Power
and ciphering. The dispatch should take a look at the hLayer3.
osmo-bts-octphy
---------------
* No support of EFR, HR voice codec (lack of PHY support?)
* No re-transmission of PHY primitives in case of time-out
* Link Quality / Measurement processing incomplete
* impossible to modify encryption parameters using RSL MODE MODIFY
* no clear indication of nominal transmit power, various power related
computations are likely off
* no OML attribute validation during bts_model_check_oml()

View File

@@ -1,9 +0,0 @@
# When cleaning up this file: bump API version in corresponding Makefile.am and rename corresponding debian/lib*.install
# according to https://osmocom.org/projects/cellular-infrastructure/wiki/Make_a_new_release
# In short: https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
# LIBVERSION=c:r:a
# If the library source code has changed at all since the last update, then increment revision: c:r + 1:a.
# If any interfaces have been added, removed, or changed since the last update: c + 1:0:a.
# If any interfaces have been added since the last public release: c:r:a + 1.
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line

View File

@@ -1,455 +1,63 @@
dnl Process this file with autoconf to produce a configure script
AC_INIT([osmo-bts],
m4_esyscmd([./git-version-gen .tarball-version]),
[openbsc@lists.osmocom.org])
dnl *This* is the root dir, even if an install-sh exists in ../ or ../../
AC_CONFIG_AUX_DIR([.])
[openbsc-devel@lists.openbsc.org])
AM_INIT_AUTOMAKE([dist-bzip2])
AC_CONFIG_TESTDIR(tests)
CFLAGS="$CFLAGS -std=gnu11"
dnl kernel style compile messages
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl include release helper
RELMAKE='-include osmo-release.mk'
AC_SUBST([RELMAKE])
dnl checks for programs
AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_INSTALL
LT_INIT
dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang
AS_CASE(["$LD"],[*clang*],
[AS_CASE(["${host_os}"],
[*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])
dnl check for pkg-config (explained in detail in libosmocore/configure.ac)
AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)
if test "x$PKG_CONFIG_INSTALLED" = "xno"; then
AC_MSG_WARN([You need to install pkg-config])
fi
PKG_PROG_PKG_CONFIG([0.20])
AC_PROG_RANLIB
dnl checks for header files
AC_HEADER_STDC
dnl Checks for typedefs, structures and compiler characteristics
AC_ARG_ENABLE(sanitize,
[AS_HELP_STRING([--enable-sanitize], [Compile with address sanitizer enabled], )],
[sanitize=$enableval], [sanitize="no"])
if test x"$sanitize" = x"yes"
then
CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined"
CPPFLAGS="$CPPFLAGS -fsanitize=address -fsanitize=undefined"
fi
AC_ARG_ENABLE(werror,
[AS_HELP_STRING(
[--enable-werror],
[Turn all compiler warnings into errors, with exceptions:
a) deprecation (allow upstream to mark deprecation without breaking builds);
b) "#warning" pragmas (allow to remind ourselves of errors without breaking builds)
]
)],
[werror=$enableval], [werror="no"])
if test x"$werror" = x"yes"
then
WERROR_FLAGS="-Werror"
WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations"
WERROR_FLAGS+=" -Wno-error=cpp" # "#warning"
CFLAGS="$CFLAGS $WERROR_FLAGS"
CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"
fi
dnl checks for libraries
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOCODEC, libosmocodec >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOCODING, libosmocoding >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 2.0.0)
PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 2.0.0)
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.6.0)
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.9)
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty)
PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 0.0.7)
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.3.3)
AC_MSG_CHECKING([whether to enable support for sysmobts calibration tool])
AC_ARG_ENABLE(sysmobts-calib,
AC_HELP_STRING([--enable-sysmobts-calib],
[enable code for sysmobts calibration tool [default=no]]),
[enable_sysmobts_calib="yes"],[enable_sysmobts_calib="no"])
AC_MSG_RESULT([$enable_sysmobts_calib])
AM_CONDITIONAL(ENABLE_SYSMOBTS_CALIB, test "x$enable_sysmobts_calib" = "xyes")
AC_MSG_CHECKING([whether to enable support for sysmoBTS L1/PHY support])
AC_MSG_CHECKING([whether to enable sysmocom-bts hardware support])
AC_ARG_ENABLE(sysmocom-bts,
AC_HELP_STRING([--enable-sysmocom-bts],
[enable code for sysmoBTS L1/PHY [default=no]]),
[enable code for sysmocom femto-bts [default=no]]),
[enable_sysmocom_bts="yes"],[enable_sysmocom_bts="no"])
AC_ARG_WITH([sysmobts], [AS_HELP_STRING([--with-sysmobts=INCLUDE_DIR], [Location of the sysmobts API header files, implies --enable-sysmocom-bts])],
[sysmobts_incdir="$withval"],[sysmobts_incdir="$incdir"])
if test "x$sysmobts_incdir" != "x"; then
# --with-sysmobts was passed, imply enable_sysmocom_bts
enable_sysmocom_bts="yes"
fi
AC_SUBST([SYSMOBTS_INCDIR], -I$sysmobts_incdir)
AC_MSG_RESULT([$enable_sysmocom_bts])
AM_CONDITIONAL(ENABLE_SYSMOBTS, test "x$enable_sysmocom_bts" = "xyes")
if test "$enable_sysmocom_bts" = "yes"; then
oldCPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $SYSMOBTS_INCDIR -I$srcdir/include"
AC_CHECK_HEADER([sysmocom/femtobts/superfemto.h],[],
[AC_MSG_ERROR([sysmocom/femtobts/superfemto.h can not be found in $sysmobts_incdir])],
[#include <sysmocom/femtobts/superfemto.h>])
# Check for the sbts2050_header.h that was added after the 3.6 release
AC_CHECK_HEADER([sysmocom/femtobts/sbts2050_header.h], [sysmo_uc_header="yes"], [])
if test "$sysmo_uc_header" = "yes" ; then
AC_DEFINE(BUILD_SBTS2050, 1, [Define if we want to build SBTS2050])
fi
# We share gsm_data.h with OpenBSC and need to be pointed to the source
# directory of OpenBSC for now.
AC_ARG_WITH([openbsc],
[AS_HELP_STRING([--with-openbsc=INCLUDE_DIR],
[OpenBSC include directory for openbsc/gsm_data_shared.h])],
[openbsc_incdir="$withval"],
[openbsc_incdir="`cd $srcdir; pwd`/../openbsc/openbsc/include"])
AC_SUBST([OPENBSC_INCDIR], $openbsc_incdir)
PKG_CHECK_MODULES(LIBGPS, libgps)
CPPFLAGS=$oldCPPFLAGS
fi
AM_CONDITIONAL(BUILD_SBTS2050, test "x$sysmo_uc_header" = "xyes")
AC_MSG_CHECKING([whether to enable support for osmo-trx based L1/PHY support])
AC_ARG_ENABLE(trx,
AC_HELP_STRING([--enable-trx],
[enable code for osmo-trx L1/PHY [default=no]]),
[enable_trx="yes"],[enable_trx="no"])
AC_MSG_RESULT([$enable_trx])
AM_CONDITIONAL(ENABLE_TRX, test "x$enable_trx" = "xyes")
AC_MSG_CHECKING([whether to enable support for Octasic OCTPHY-2G])
AC_ARG_ENABLE(octphy,
AC_HELP_STRING([--enable-octphy],
[enable code for Octasic OCTPHY-2G [default=no]]),
[enable_octphy="yes"],[enable_octphy="no"])
AC_ARG_WITH([octsdr-2g], [AS_HELP_STRING([--with-octsdr-2g], [Location of the OCTSDR-2G API header files])],
[octsdr2g_incdir="$withval"],[octsdr2g_incdir="`cd $srcdir; pwd`/src/osmo-bts-octphy/"])
AC_SUBST([OCTSDR2G_INCDIR], -I$octsdr2g_incdir)
AC_MSG_RESULT([$enable_octphy])
AM_CONDITIONAL(ENABLE_OCTPHY, test "x$enable_octphy" = "xyes")
if test "$enable_octphy" = "yes" ; then
oldCPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $OCTSDR2G_INCDIR -I$srcdir/include"
AC_CHECK_HEADER([octphy/octvc1/gsm/octvc1_gsm_default.h],[],
[AC_MSG_ERROR([octphy/octvc1/gsm/octvc1_gsm_default.h can not be found in $octsdr2g_incdir])],
[#include <octphy/octvc1/gsm/octvc1_gsm_default.h>])
AC_CHECK_MEMBER([tOCTVC1_GSM_TRX_CONFIG.usCentreArfcn],
AC_DEFINE([OCTPHY_MULTI_TRX],
[1],
[Define to 1 if your octphy header files support multi-trx]),
[],
[#include <octphy/octvc1/gsm/octvc1_gsm_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_RF_PORT_RX_STATS.Frequency],
AC_DEFINE([OCTPHY_USE_FREQUENCY],
[1],
[Define to 1 if your octphy header files support tOCTVC1_RADIO_FREQUENCY_VALUE type]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_RF_PORT_INFO_ANTENNA_TX_CONFIG_RSP.TxConfig],
AC_DEFINE([OCTPHY_USE_TX_CONFIG],
[1],
[Define to 1 if your octphy header files support tOCTVC1_HW_RF_PORT_ANTENNA_TX_CONFIG type]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_RF_PORT_INFO_ANTENNA_RX_CONFIG_RSP.RxConfig],
AC_DEFINE([OCTPHY_USE_RX_CONFIG],
[1],
[Define to 1 if your octphy header files support tOCTVC1_HW_RF_PORT_ANTENNA_RX_CONFIG type]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_GSM_RF_CONFIG.ulTxAntennaId],
AC_DEFINE([OCTPHY_USE_ANTENNA_ID],
[1],
[Define to 1 if your octphy header files support antenna ids in tOCTVC1_GSM_RF_CONFIG]),
[],
[#include <octphy/octvc1/gsm/octvc1_gsm_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_INFO_RSP.ulClkSourceSelection],
AC_DEFINE([OCTPHY_USE_CLK_SOURCE_SELECTION],
[1],
[Define to 1 if your octphy header files supports ulClkSourceSelection in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_INFO_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.lClockError],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_CLOCK_ERROR],
[1],
[Define to 1 if your octphy header files supports lClockError in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.lDroppedCycles],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_DROPPED_CYCLES],
[1],
[Define to 1 if your octphy header files supports lDroppedCycles in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulPllFreqHz],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_PLL_FREQ_HZ],
[1],
[Define to 1 if your octphy header files supports ulPllFreqHz in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulPllFractionalFreqHz],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_PLL_FRACTIONAL_FREQ_HZ],
[1],
[Define to 1 if your octphy header files supports ulPllFractionalFreqHz in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulSlipCnt],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_SLIP_CNT],
[1],
[Define to 1 if your octphy header files supports ulSlipCnt in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulSyncLosseCnt],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_SYNC_LOSSE_CNT],
[1],
[Define to 1 if your octphy header files supports ulSyncLosseCnt in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulSyncLossCnt],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_SYNC_LOSS_CNT],
[1],
[Define to 1 if your octphy header files supports ulSyncLossCnt in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulSourceState],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_SOURCE_STATE],
[1],
[Define to 1 if your octphy header files supports ulSourceState in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulDacState],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_DAC_STATE],
[1],
[Define to 1 if your octphy header files supports ulDacState in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP.ulDriftElapseTimeUs],
AC_DEFINE([OCTPHY_USE_CLOCK_SYNC_MGR_STATS_DRIFT_ELAPSE_TIME_US],
[1],
[Define to 1 if your octphy header files supports ulDriftElapseTimeUs in tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP]),
[],
[#include <octphy/octvc1/hw/octvc1_hw_api.h>])
AC_CHECK_MEMBER([tOCTVC1_GSM_MSG_OVERSAMPLE_SELECT_16X_MODIFY_CMD.ulOversample16xEnableFlag],
AC_DEFINE([OCTPHY_USE_16X_OVERSAMPLING],
[1],
[Define to 1 if your octphy header files support 16x oversampling]),
[],
[#include <octphy/octvc1/gsm/octvc1_gsm_api.h>])
CPPFLAGS=$oldCPPFLAGS
fi
AC_MSG_CHECKING([whether to enable NuRAN Wireless Litecell 1.5 hardware support])
AC_ARG_ENABLE(litecell15,
AC_HELP_STRING([--enable-litecell15],
[enable code for NuRAN Wireless Litecell15 bts [default=no]]),
[enable_litecell15="yes"],[enable_litecell15="no"])
AC_ARG_WITH([litecell15], [AS_HELP_STRING([--with-litecell15=INCLUDE_DIR], [Location of the litecell 1.5 API header files])],
[litecell15_incdir="$withval"],[litecell15_incdir="$incdir"])
AC_SUBST([LITECELL15_INCDIR], -I$litecell15_incdir)
AC_MSG_RESULT([$enable_litecell15])
AM_CONDITIONAL(ENABLE_LC15BTS, test "x$enable_litecell15" = "xyes")
if test "$enable_litecell15" = "yes"; then
oldCPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $LITECELL15_INCDIR -I$srcdir/include"
AC_CHECK_HEADER([nrw/litecell15/litecell15.h],[],
[AC_MSG_ERROR([nrw/litecell15/litecell15.h can not be found in $litecell15_incdir])],
[#include <nrw/litecell15/litecell15.h>])
PKG_CHECK_MODULES(LIBSYSTEMD, libsystemd)
CPPFLAGS=$oldCPPFLAGS
fi
AC_MSG_CHECKING([whether to enable NuRAN Wireless OC-2G hardware support])
AC_ARG_ENABLE(oc2g,
AC_HELP_STRING([--enable-oc2g],
[enable code for NuRAN Wireless OC-2G bts [default=no]]),
[enable_oc2g="yes"],[enable_oc2g="no"])
AC_ARG_WITH([oc2g], [AS_HELP_STRING([--with-oc2g=INCLUDE_DIR], [Location of the OC-2G API header files])],
[oc2g_incdir="$withval"],[oc2g_incdir="$incdir"])
AC_SUBST([OC2G_INCDIR], -I$oc2g_incdir)
AC_MSG_RESULT([$enable_oc2g])
AM_CONDITIONAL(ENABLE_OC2GBTS, test "x$enable_oc2g" = "xyes")
if test "$enable_oc2g" = "yes"; then
oldCPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $OC2G_INCDIR -I$srcdir/include"
AC_CHECK_HEADER([nrw/oc2g/oc2g.h],[],
[AC_MSG_ERROR([nrw/oc2g/oc2g.h can not be found in $oc2g_incdir])],
[#include <nrw/oc2g/oc2g.h>])
PKG_CHECK_MODULES(LIBSYSTEMD, libsystemd)
PKG_CHECK_MODULES(LIBGPS, libgps)
CPPFLAGS=$oldCPPFLAGS
fi
# Generate manuals
AC_ARG_ENABLE(manuals,
[AS_HELP_STRING(
[--enable-manuals],
[Generate manual PDFs [default=no]],
)],
[osmo_ac_build_manuals=$enableval], [osmo_ac_build_manuals="no"])
AM_CONDITIONAL([BUILD_MANUALS], [test x"$osmo_ac_build_manuals" = x"yes"])
AC_ARG_VAR(OSMO_GSM_MANUALS_DIR, [path to common osmo-gsm-manuals files, overriding pkg-config and "../osmo-gsm-manuals"
fallback])
if test x"$osmo_ac_build_manuals" = x"yes"
then
# Find OSMO_GSM_MANUALS_DIR (env, pkg-conf, fallback)
if test -n "$OSMO_GSM_MANUALS_DIR"; then
echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from env)"
else
OSMO_GSM_MANUALS_DIR="$($PKG_CONFIG osmo-gsm-manuals --variable=osmogsmmanualsdir 2>/dev/null)"
if test -n "$OSMO_GSM_MANUALS_DIR"; then
echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from pkg-conf)"
else
OSMO_GSM_MANUALS_DIR="../osmo-gsm-manuals"
echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (fallback)"
fi
fi
if ! test -d "$OSMO_GSM_MANUALS_DIR"; then
AC_MSG_ERROR("OSMO_GSM_MANUALS_DIR does not exist! Install osmo-gsm-manuals or set OSMO_GSM_MANUALS_DIR.")
fi
# Find and run check-depends
CHECK_DEPENDS="$OSMO_GSM_MANUALS_DIR/check-depends.sh"
if ! test -x "$CHECK_DEPENDS"; then
CHECK_DEPENDS="osmo-gsm-manuals-check-depends"
fi
if ! $CHECK_DEPENDS; then
AC_MSG_ERROR("missing dependencies for --enable-manuals")
fi
# Put in Makefile with absolute path
OSMO_GSM_MANUALS_DIR="$(realpath "$OSMO_GSM_MANUALS_DIR")"
AC_SUBST([OSMO_GSM_MANUALS_DIR])
fi
AC_ARG_ENABLE([external_tests],
AC_HELP_STRING([--enable-external-tests],
[Include the VTY/CTRL tests in make check [default=no]]),
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
if test "x$enable_ext_tests" = "xyes" ; then
AC_CHECK_PROG(PYTHON3_AVAIL,python3,yes)
if test "x$PYTHON3_AVAIL" != "xyes" ; then
AC_MSG_ERROR([Please install python3 to run the VTY/CTRL tests.])
fi
AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)
if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then
AC_MSG_ERROR([Please install https://gitea.osmocom.org/cellular-infrastructure/osmo-python-tests to run the VTY/CTRL tests.])
fi
fi
AC_MSG_CHECKING([whether to enable VTY/CTRL tests])
AC_MSG_RESULT([$enable_ext_tests])
AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")
#
# SystemTap support
#
AC_MSG_CHECKING([whether to include systemtap tracing support])
AC_ARG_ENABLE([systemtap],
[AS_HELP_STRING([--enable-systemtap],
[Enable inclusion of systemtap trace support])],
[ENABLE_SYSTEMTAP="${enableval}"], [ENABLE_SYSTEMTAP='no'])
AM_CONDITIONAL([ENABLE_SYSTEMTAP], [test x$ENABLE_SYSTEMTAP = xyes])
AC_MSG_RESULT(${ENABLE_SYSTEMTAP})
if test "x${ENABLE_SYSTEMTAP}" = xyes; then
# Additional configuration for --enable-systemtap is HERE
AC_CHECK_PROGS(DTRACE, dtrace)
if test -z "$DTRACE"; then
AC_MSG_ERROR([dtrace not found])
fi
AC_CHECK_HEADER([sys/sdt.h], [SDT_H_FOUND='yes'],
[SDT_H_FOUND='no';
AC_MSG_ERROR([systemtap support needs sys/sdt.h header])])
AC_DEFINE([HAVE_SYSTEMTAP], [1], [Define to 1 if using SystemTap probes.])
AC_ARG_WITH([tapset-install-dir],
[AS_HELP_STRING([--with-tapset-install-dir],
[The absolute path where the tapset dir will be installed])],
[if test "x${withval}" = x; then
ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"
else
ABS_TAPSET_DIR="${withval}"
fi], [ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"])
AC_SUBST(ABS_TAPSET_DIR)
fi
# https://www.freedesktop.org/software/systemd/man/daemon.html
AC_ARG_WITH([systemdsystemunitdir],
[AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files])],,
[with_systemdsystemunitdir=auto])
AS_IF([test "x$with_systemdsystemunitdir" = "xyes" -o "x$with_systemdsystemunitdir" = "xauto"], [
def_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
AS_IF([test "x$def_systemdsystemunitdir" = "x"],
[AS_IF([test "x$with_systemdsystemunitdir" = "xyes"],
[AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])])
with_systemdsystemunitdir=no],
[with_systemdsystemunitdir="$def_systemdsystemunitdir"])])
AS_IF([test "x$with_systemdsystemunitdir" != "xno"],
[AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])])
AM_CONDITIONAL([HAVE_SYSTEMD], [test "x$with_systemdsystemunitdir" != "xno"])
AC_MSG_RESULT([CFLAGS="$CFLAGS"])
AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"])
AM_CONFIG_HEADER(btsconfig.h)
oldCPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$OPENBSC_INCDIR $LIBOSMOCORE_CFLAGS"
AC_CHECK_HEADER([openbsc/gsm_data_shared.h],[],
[AC_MSG_ERROR([openbsc/gsm_data_shared.h can not be found in $openbsc_incdir])],
[])
CPPFLAGS=$oldCPPFLAGS
AC_OUTPUT(
src/Makefile
src/common/Makefile
src/osmo-bts-virtual/Makefile
src/osmo-bts-omldummy/Makefile
src/osmo-bts-sysmo/Makefile
src/osmo-bts-lc15/Makefile
src/osmo-bts-oc2g/Makefile
src/osmo-bts-trx/Makefile
src/osmo-bts-octphy/Makefile
dnl src/osmo-bts-bb/Makefile
include/Makefile
include/osmo-bts/Makefile
tests/Makefile
tests/paging/Makefile
tests/agch/Makefile
tests/cipher/Makefile
tests/sysmobts/Makefile
tests/misc/Makefile
tests/handover/Makefile
tests/ta_control/Makefile
tests/tx_power/Makefile
tests/power/Makefile
tests/meas/Makefile
tests/amr/Makefile
tests/csd/Makefile
doc/Makefile
doc/examples/Makefile
doc/manuals/Makefile
contrib/Makefile
contrib/ber/Makefile
contrib/systemd/Makefile
Makefile)

View File

@@ -1 +0,0 @@
SUBDIRS = systemd ber

View File

@@ -1,28 +0,0 @@
AM_CPPFLAGS = \
$(all_includes) \
-I$(top_srcdir)/include \
-I$(top_builddir)/include \
-I$(builddir) \
$(NULL)
AM_CFLAGS = \
-Wall \
$(LIBOSMOCORE_CFLAGS) \
$(LIBOSMOTRAU_CFLAGS) \
$(LIBOSMOCODEC_CFLAGS) \
$(NULL)
LDADD = \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOTRAU_LIBS) \
$(LIBOSMOCODEC_LIBS) \
$(NULL)
noinst_PROGRAMS = rtp_ber rtp_gen_map
rtp_ber_SOURCES = rtp_ber.c codec_bit_class.h
rtp_gen_map_SOURCES = rtp_gen_map.c
update_codec_bit_class_h: rtp_gen_map
$(AM_V_GEN)./$< > $(top_srcdir)/contrib/ber/codec_bit_class.h

View File

@@ -1,26 +0,0 @@
BER testing tool
----------------
* Check all configs (MSC/BSC/BTS) for proper codec support
- FR enabled
- EFR enabled
- AMR 12.2 enabled (and all other modes disabled !)
- Use `amr-payload octet-aligned` in BSC config
* Check BTS config
- Disable jitter buffer : `bts N / rtp jitter-buffer 0`
* Check BSC config
- Disable radio timeout : `network / bts n / radio-link-timeout infinite`
* Start BER testing tool
- `./rtp_ber 4000`
* On the MSC CLI, start a silent-call, then request GSM to test loop
- `subscriber imsi <XXX> silent-call start tch/f speech-amr`
- `subscriber imsi <XXX> ms-test close-loop b`
Don't forget to terminate the loop and terminate the silent call !
- `subscriber imsi <XXX> ms-test open-loop`
- `subscriber imsi <XXX> silent-call stop`

View File

@@ -1,59 +0,0 @@
static const int gsm_fr_bitclass[] = {
-1, -1, -1, -1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 2,
0, 0, 1, 2, 2, 0, 0, 1, 2, 2, 0, 1, 1, 2, 0, 1,
2, 2, 0, 1, 2, 1, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1,
1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1,
2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,
2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2,
1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1,
1, 2, 1, 1, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1,
1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1,
2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,
2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2,
1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1,
2, 2, 1, 2, 2, 1, 2, 2,
};
static const int gsm_efr_bitclass[] = {
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,
1, 1, 1, 1, 2, 2, 1, 2,
};
static const int gsm_amr_12_2_bitclass[] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, -1, -1, -1, -1,
};

View File

@@ -1,483 +0,0 @@
/* RTP based GSM BER testing for osmo-bts, implementing ideas described in
* https://osmocom.org/projects/osmobts/wiki/BER_Testing
*
* In short: The command transmits a PRBS sequence encapsulated in RTP frames, which are sent
* to the BTS, which transmits that data in the (unimpaired) downlink. The mobile station
* receives the data and is instructed to loop it back in the (possibly impaired) uplink.
* The BTS receives that uplink, puts in in RTP frames which end up being received back by this
* very tool. By correlating the received RTP with the PRBS sequence, this tool can compute
* the BER (Bit Error Rate) of the (possibly impaired) uplink. Doing this with different
* RF channel model simulators in the uplink allows to establish BER at different levels and
* channel conditions. */
/* (C) 2019 sysmocom - s.f.m.c. GmbH; Author: Sylvain Munaut
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <osmocom/codec/codec.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/prbs.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/utils.h>
#include <osmocom/trau/osmo_ortp.h>
#include <codec_bit_class.h>
struct app_state {
struct osmo_rtp_socket *rs;
enum {
WAIT_CONN = 0, /* Wait for incoming connection */
WAIT_LOOP, /* Wait for a somewhat valid packet to start measuring */
RUNNING, /* Main state */
} state;
int pt;
int ref_len;
uint8_t ref_bytes[GSM_FR_BYTES]; /* FR is the largest possible one */
ubit_t ref_bits[8*GSM_FR_BYTES];
struct osmo_timer_list rtp_timer;
uint16_t rx_last_seq;
uint32_t rx_last_ts;
uint32_t rx_idx;
uint32_t tx_idx;
const int *err_tbl; /* Classification table */
int err_frames; /* Number of accumulated frames */
int err_cnt[3]; /* Bit error counter */
int err_tot[3]; /* Total # bits in that class */
};
#define FLOW_REG_TX_MAX_ADVANCE 200
#define FLOW_REG_TX_MIN_ADVANCE 50
const struct log_info log_info;
static const uint8_t amr_size_by_ft[] = {
[0] = 12, /* 4.75 */
[1] = 13, /* 5.15 */
[2] = 15, /* 5.9 */
[3] = 17, /* 6.7 */
[4] = 19, /* 7.4 */
[5] = 20, /* 7.95 */
[6] = 26, /* 10.2 */
[7] = 31, /* 12.2 */
[8] = 5, /* SID */
};
static const char * const amr_rate_by_ft[] = {
[0] = "4.75",
[1] = "5.15",
[2] = "5.9",
[3] = "6.7",
[4] = "7.4",
[5] = "7.95",
[6] = "10.2",
[7] = "12.2",
[8] = "SID",
};
static void
_gsm_fr_gen_ref(struct app_state *as)
{
struct osmo_prbs_state pn9;
/* Length */
as->ref_len = GSM_FR_BYTES;
/* Marker */
as->ref_bits[0] = 1;
as->ref_bits[1] = 1;
as->ref_bits[2] = 0;
as->ref_bits[3] = 1;
/* PN */
osmo_prbs_state_init(&pn9, &osmo_prbs9);
pn9.state = 31;
osmo_prbs_get_ubits(&as->ref_bits[4], 260, &pn9);
/* Convert to bytes */
osmo_ubit2pbit_ext(as->ref_bytes, 0, as->ref_bits, 0, 8*GSM_FR_BYTES, 0);
/* Init error classes */
as->err_tot[0] = 50;
as->err_tot[1] = 132;
as->err_tot[2] = 78;
as->err_tbl = gsm_fr_bitclass;
}
static void
_gsm_efr_gen_ref(struct app_state *as)
{
struct osmo_prbs_state pn9;
/* Length */
as->ref_len = GSM_EFR_BYTES;
/* Marker */
as->ref_bits[0] = 1;
as->ref_bits[1] = 1;
as->ref_bits[2] = 0;
as->ref_bits[3] = 0;
/* PN */
osmo_prbs_state_init(&pn9, &osmo_prbs9);
pn9.state = 31;
osmo_prbs_get_ubits(&as->ref_bits[4], 244, &pn9);
/* Convert to bytes */
osmo_ubit2pbit_ext(as->ref_bytes, 0, as->ref_bits, 0, 8*GSM_EFR_BYTES, 0);
/* Init error classes */
as->err_tot[0] = 50;
as->err_tot[1] = 125;
as->err_tot[2] = 73;
as->err_tbl = gsm_efr_bitclass;
}
static void
_gsm_amr_gen_ref(struct app_state *as)
{
struct osmo_prbs_state pn9;
uint8_t hdr[2];
/* Length */
as->ref_len = 33;
/* Header */
hdr[0] = 0x70;
hdr[1] = 0x3c;
osmo_pbit2ubit_ext(as->ref_bits, 0, hdr, 0, 16, 0);
/* PN */
osmo_prbs_state_init(&pn9, &osmo_prbs9);
pn9.state = 31;
osmo_prbs_get_ubits(&as->ref_bits[16], 244, &pn9);
/* Unused bits */
as->ref_bits[260] = 0;
as->ref_bits[261] = 0;
as->ref_bits[262] = 0;
as->ref_bits[263] = 0;
/* Convert to bytes */
osmo_ubit2pbit_ext(as->ref_bytes, 0, as->ref_bits, 0, 264, 0);
/* Init error classes */
as->err_tot[0] = 81;
as->err_tot[1] = 163;
as->err_tot[2] = -1;
as->err_tbl = gsm_amr_12_2_bitclass;
}
static void
_gsm_gen_ref(struct app_state *as)
{
switch (as->pt) {
case RTP_PT_GSM_FULL:
_gsm_fr_gen_ref(as);
break;
case RTP_PT_GSM_EFR:
_gsm_efr_gen_ref(as);
break;
case RTP_PT_AMR:
_gsm_amr_gen_ref(as);
break;
default:
fprintf(stderr, "[!] Unsupported payload type for BER measurement\n");
}
}
static int
_gsm_ber(struct app_state *as, const uint8_t *payload, unsigned int payload_len)
{
ubit_t rx_bits[8*33];
int err[3]; /* Class 1a, 1b, 2 */
int ones;
int i, j;
if (payload) {
/* Process real-payload */
osmo_pbit2ubit_ext(rx_bits, 0, payload, 0, 8*payload_len, 0);
err[0] = err[1] = err[2] = 0;
ones = 0;
for (i = 0; i < 8 * payload_len; i++) {
j = as->err_tbl[i];
if (j >= 0) {
err[j] += rx_bits[i] ^ as->ref_bits[i];
ones += rx_bits[i];
}
}
if (ones < 32) { // This frames is probably us underrunning Tx, don't use it
fprintf(stderr, "[w] Frame ignored as probably TX underrun %d %d\n", as->tx_idx, as->rx_idx);
return 1;
}
} else {
/* No payload -> Lost frame completely */
err[0] = as->err_tot[0] / 2;
err[1] = as->err_tot[1] / 2;
err[2] = as->err_tot[2] / 2;
}
if (as->state == RUNNING) {
/* Update records */
if (err[0] != 0) {
/* Class 1a bits bad -> Frame error */
as->err_cnt[0]++;
}
as->err_cnt[1] += err[1]; /* Class 1b */
as->err_cnt[2] += err[2]; /* class 2 */
as->err_frames++;
/* Enough for a read-out ? */
if (as->err_frames == 200) {
printf("FBER: %4.2f C1b RBER: %5.3f C2 RBER: %5.3f\n",
100.0f * as->err_cnt[0] / as->err_frames,
100.0f * as->err_cnt[1] / (as->err_tot[1] * as->err_frames),
100.0f * as->err_cnt[2] / (as->err_tot[2] * as->err_frames)
);
memset(as->err_cnt, 0, sizeof(as->err_cnt));
as->err_frames = 0;
}
}
return err[0] != 0;
}
static int
_rtp_check_payload_type(const uint8_t *payload, unsigned int payload_len)
{
uint8_t ft;
int pt = -1;
switch (payload_len) {
case GSM_FR_BYTES: /* FR or AMR 12.2k */
/* Check for AMR */
ft = (payload[1] >> 3) & 0xf;
if (ft == 7)
pt = RTP_PT_AMR;
/* Check for FR */
else if ((payload[0] & 0xF0) == 0xD0)
pt = RTP_PT_GSM_FULL;
/* None of the above */
else
fprintf(stderr, "[!] FR without 0xD0 signature or AMR with unknwon Frame Type ?!?\n");
break;
case GSM_EFR_BYTES: /* EFR */
if ((payload[0] & 0xF0) != 0xC0)
fprintf(stderr, "[!] EFR without 0xC0 signature ?!?\n");
pt = RTP_PT_GSM_EFR;
break;
case GSM_HR_BYTES: /* HR */
pt = RTP_PT_GSM_HALF;
break;
default: /* AMR */
{
uint8_t cmr, cmi, sti;
cmr = payload[0] >> 4;
ft = (payload[1] >> 3) & 0xf;
if (payload_len != amr_size_by_ft[ft]+2)
fprintf(stderr, "AMR FT %u(%s) but size %u\n",
ft, amr_rate_by_ft[ft], payload_len);
switch (ft) {
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
cmi = ft;
printf("AMR SPEECH with FT/CMI %u(%s), "
"CMR %u\n",
cmi, amr_rate_by_ft[cmi],
cmr);
break;
case 8: /* SID */
cmi = (payload[2+4] >> 1) & 0x7;
sti = payload[2+4] & 0x10;
printf("AMR SID %s with CMI %u(%s), CMR %u(%s)\n",
sti ? "UPDATE" : "FIRST",
cmi, amr_rate_by_ft[cmi],
cmr, amr_rate_by_ft[cmr]);
break;
}
}
break;
}
return pt;
}
static void
rtp_timer_cb(void *priv)
{
struct app_state *as = (struct app_state *)priv;
/* Send at least one frame if we're not too far ahead */
if (as->tx_idx < (as->rx_idx + FLOW_REG_TX_MAX_ADVANCE)) {
osmo_rtp_send_frame(as->rs, as->ref_bytes, as->ref_len, GSM_RTP_DURATION);
as->tx_idx++;
} else {
fprintf(stderr, "Skipped\n");
}
/* Then maybe a second one to try and catch up to RX */
if (as->tx_idx < (as->rx_idx + FLOW_REG_TX_MIN_ADVANCE)) {
osmo_rtp_send_frame(as->rs, as->ref_bytes, as->ref_len, GSM_RTP_DURATION);
as->tx_idx++;
}
/* Re-schedule */
osmo_timer_schedule(&as->rtp_timer, 0, 20000);
}
static int
rtp_seq_num_diff(uint16_t new, uint16_t old)
{
int d = (int)new - (int)old;
while (d > 49152)
d -= 65536;
while (d < -49152)
d += 65536;
return d;
}
static void
rtp_rx_cb(struct osmo_rtp_socket *rs,
const uint8_t *payload, unsigned int payload_len,
uint16_t seq_number, uint32_t timestamp, bool marker)
{
struct app_state *as = (struct app_state *)rs->priv;
int pt, rc, d;
// printf("Rx(%u, %d, %d, %d): %s\n", payload_len, seq_number, timestamp, marker, osmo_hexdump(payload, payload_len));
/* Identify payload */
pt = _rtp_check_payload_type(payload, payload_len);
/* First packet ? */
if (as->state == WAIT_CONN) {
/* Setup for this payload type */
as->pt = pt;
osmo_rtp_socket_set_pt(as->rs, pt);
_gsm_gen_ref(as);
/* Timer every 20 ms */
osmo_timer_setup(&as->rtp_timer, rtp_timer_cb, as);
osmo_timer_add(&as->rtp_timer);
osmo_timer_schedule(&as->rtp_timer, 0, 20000);
/* Init our time tracking */
as->rx_last_seq = seq_number;
as->rx_last_ts = timestamp;
/* Now we wait for a loop */
as->state = WAIT_LOOP;
}
/* RX sequence & timstamp tracking */
if (rtp_seq_num_diff(seq_number, as->rx_last_seq) > 1)
fprintf(stderr, "[!] RTP sequence number discontinuity (%d -> %d)\n", as->rx_last_seq, seq_number);
d = (timestamp - as->rx_last_ts) / GSM_RTP_DURATION;
as->rx_idx += d;
as->rx_last_seq = seq_number;
as->rx_last_ts = timestamp;
/* Account for missing frames in BER tracking */
if (d > 1) {
fprintf(stderr, "[!] RTP %d missing frames assumed lost @%d\n", d-1, seq_number);
while (--d)
_gsm_ber(as, NULL, 0);
}
/* BER analysis */
rc = _gsm_ber(as, payload, payload_len);
if ((as->state == WAIT_LOOP) && (rc == 0))
as->state = RUNNING;
}
int main(int argc, char **argv)
{
struct app_state _as, *as = &_as;
int rc, port;
/* Args */
if (argc < 2)
return -1;
port = atoi(argv[1]);
/* App init */
memset(as, 0x00, sizeof(struct app_state));
log_init(&log_info, NULL);
osmo_rtp_init(NULL);
/* Start auto-connect RTP socket */
as->rs = osmo_rtp_socket_create(NULL, 0);
as->rs->priv = as;
as->rs->rx_cb = rtp_rx_cb;
/* Jitter buffer gets in the way, we want the raw traffic */
osmo_rtp_socket_set_param(as->rs, OSMO_RTP_P_JIT_ADAP, 0);
osmo_rtp_socket_set_param(as->rs, OSMO_RTP_P_JITBUF, 0);
/* Bind to requested port */
fprintf(stderr, "[+] Binding RTP socket on port %u...\n", port);
rc = osmo_rtp_socket_bind(as->rs, "0.0.0.0", port);
if (rc < 0) {
fprintf(stderr, "[!] error binding RTP socket: %d\n", rc);
return rc;
}
/* We 'connect' to the first source we hear from */
osmo_rtp_socket_autoconnect(as->rs);
/* Main loop */
while (1)
osmo_select_main(0);
return 0;
}

View File

@@ -1,145 +0,0 @@
/* utility to generate codec_bit_class.h, a file with structures
* describing which [protection] class each bit of a given codec frame belongs to */
/* (C) 2019 sysmocom - s.f.m.c. GmbH; Author: Sylvain Munaut
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <osmocom/codec/codec.h>
static int
gen_table_fr(int *tbl)
{
int i, j;
tbl[0] = tbl[1] = tbl[2] = tbl[3] = -1;
for (i = 0; i < 260; i++) {
j = 4 + gsm610_bitorder[i];
if (i < 50)
tbl[j] = 0; /* Class 1a */
else if (i < 182)
tbl[j] = 1; /* Class 1b */
else
tbl[j] = 2; /* Class 2 */
}
return GSM_FR_BYTES * 8;
}
static int
gen_table_efr(int *tbl)
{
int i, j, k;
tbl[0] = tbl[1] = tbl[2] = tbl[3] = -1;
for (i = 0; i < 260; i++) {
j = gsm660_bitorder[i];
if (j < 71)
k = j;
else if (j < 73)
k = 71;
else if (j < 123)
k = j - 2;
else if (j < 125)
k = 119;
else if (j < 178)
k = j - 4;
else if (j < 180)
k = 172;
else if (j < 230)
k = j - 6;
else if (j < 232)
k = 222;
else if (j < 252)
k = j - 8;
else
continue;
if (i < 50)
tbl[k] = 0; /* Class 1a */
else if (i < 182)
tbl[k] = 1; /* Class 1b */
else
tbl[k] = 2; /* Class 2 */
}
return GSM_EFR_BYTES * 8;
}
static int
gen_table_amr_12_2(int *tbl)
{
int i;
for (i = 0; i < 16; i++)
tbl[i] = -1;
for (i = 0; i < 244; i++)
tbl[i+16] = i < 81 ? 0 : 1;
for (i = 0; i < 4; i++)
tbl[i+16+244] = -1;
return 8 * 33;
}
static void
print_table(const char *name, int *tbl, int len)
{
int i;
printf("static const int %s[] = {\n", name);
for (i = 0; i < len; i++) {
if ((i & 15) == 0)
printf("\t");
printf("%2d", tbl[i]);
if (((i & 15) == 15) || (i == len-1))
printf(",\n");
else
printf(", ");
}
printf("};\n\n");
}
int main(int argc, char *argv[])
{
int tbl[33*8];
int rv;
rv = gen_table_fr(tbl);
print_table("gsm_fr_bitclass", tbl, rv);
rv = gen_table_efr(tbl);
print_table("gsm_efr_bitclass", tbl, rv);
rv = gen_table_amr_12_2(tbl);
print_table("gsm_amr_12_2_bitclass", tbl, rv);
return 0;
}

View File

@@ -1,89 +0,0 @@
#!/usr/bin/gawk -f
# Expected input format: FN TYPE
BEGIN {
DELTA = 0
ERR = 0
FORCE = 0
FN = 0
SILENCE = 0
TYPE = ""
CHK = ""
U_MAX = 8 * 20 + 120 / 26
U_MIN = 8 * 20 - 120 / 26
F_MAX = 3 * 20 + 120 / 26
F_MIN = 3 * 20 - 120 / 26
}
{
if (NR > 2) { # we have data from previous record to compare to
DELTA = ($1 - FN) * 120 / 26
CHK = "OK"
if ("FACCH" == $2 && "ONSET" == TYPE) { # ONSET due to FACCH is NOT a talkspurt
SILENCE = 1
}
if (("UPDATE" == TYPE || "FIRST" == TYPE) && ("FACCH" == $2 || "SPEECH" == $2)) { # check for missing ONSET:
CHK = "FAIL: missing ONSET (" $2 ") after " TYPE "."
ERR++
}
if ("SID_P1" == $2) {
CHK = "FAIL: regular AMR payload with FT SID and STI=0 (should be either pyaload Update or STI=1)."
ERR++
}
if ("FORCED_FIRST" == $2 || "FORCED_NODATA" == $2 || "FORCED_F_P2" == $2 || "FORCED_F_INH" == $2 || "FORCED_U_INH" == $2) {
CHK = "FAIL: event " $2 " inserted by DSP."
FORCE++
ERR++
}
if ("FIRST_P2" != $2 && "FIRST_P1" == TYPE) {
CHK = "FAIL: " TYPE " followed by " $2 " instead of P2."
ERR++
}
if ("FIRST" == $2 && "FIRST" == TYPE) {
CHK = "FAIL: multiple SID FIRST in a row."
ERR++
}
if ("OK" == CHK && "ONSET" != $2) { # check inter-SID distances:
if ("UPDATE" == TYPE) {
if (DELTA > U_MAX) {
CHK = "FAIL: delta (" $1 - FN "fn) from previous SID UPDATE (@" FN ") too big " DELTA "ms > " U_MAX "ms."
ERR++
}
if ("UPDATE" == $2 && DELTA < U_MIN) {
CHK = "FAIL: delta (" $1 - FN "fn) from previous SID UPDATE (@" FN ") too small " DELTA "ms < " U_MIN "ms."
ERR++
}
}
if ("FIRST" == TYPE) {
if (DELTA > F_MAX) {
CHK = "FAIL: delta (" $1 - FN "fn) from previous SID FIRST (@" FN ") too big " DELTA "ms > " F_MAX "ms."
ERR++
}
if ("UPDATE" == $2 && DELTA < F_MIN) {
CHK = "FAIL: delta (" $1 - FN "fn) from previous SID UPDATE (@" FN ") too small " DELTA "ms < " F_MIN "ms."
ERR++
}
}
}
if ("FACCH" == TYPE && "FIRST" != $2 && "FACCH" != $2 && 1 == SILENCE) { # check FACCH handling
CHK = "FAIL: incorrect silence resume with " $2 " after FACCH."
ERR++
}
}
if ("SPEECH" == $2 || "ONSET" == $2) { # talkspurt
SILENCE = 0
}
if ("UPDATE" == $2 || "FIRST" == $2) { # silence
SILENCE = 1
}
print $1, $2, CHK
if ($2 != "EMPTY") { # skip over EMPTY records
TYPE = $2
FN = $1
}
}
END {
print "Check completed: found " ERR " errors (" FORCE " events inserted by DSP) in " NR " records."
}

View File

@@ -10,7 +10,7 @@ env = os.environ
env['L1FWD_BTS_HOST'] = '127.0.0.1'
bts_proc = subprocess.Popen(["./src/osmo-bts-sysmo/sysmobts-remote",
"-c", "./doc/examples/sysmo/osmo-bts-sysmo.cfg"], env = env,
"-c", "./doc/examples/osmo-bts.cfg"], env = env,
stdin=None, stdout=None)
time.sleep(1)

View File

@@ -1,91 +0,0 @@
/* GPLv3+ to read sysmobts-v2 revD or later EEPROM from userspace */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
/* Can read a 16bit at24 eeprom with 8192 byte in storage (24c64) */
static int dump_eeprom(int fd, int out)
{
#define STEP 8192
#define SIZE 8192
uint8_t buf[STEP + 2];
int rc = 0;
int i;
for (i = 0; i < SIZE; i += STEP) {
/* write the address */
buf[0] = i >> 8;
buf[1] = i;
rc = write(fd, buf, 2);
if (rc != 2) {
fprintf(stderr, "writing address failed: %d/%d/%s\n", rc, errno, strerror(errno));
return 1;
}
/* execute step amount of reads */
rc = read(fd, buf, STEP);
if (rc != STEP) {
fprintf(stderr, "Failed to read: %d/%d/%s\n", rc, errno, strerror(errno));
return 1;
}
write(out, buf, STEP);
}
return 0;
}
int main(int argc, char **argv)
{
int i2c_fd, out_fd;
char *filename = "/dev/i2c-1";
char *out_file = "eeprom.out";
int addr = 0x50;
int rc;
i2c_fd = open(filename, O_RDWR);
if (i2c_fd < 0) {
fprintf(stderr, "Failed to open i2c device %d/%d/%s\n",
i2c_fd, errno, strerror(errno));
return EXIT_FAILURE;
}
/* force using that address it is already bound with a driver */
rc = ioctl(i2c_fd, I2C_SLAVE_FORCE, addr);
if (rc < 0) {
fprintf(stderr, "Failed to claim i2c device %d/%d/%s\n",
rc, errno, strerror(errno));
return EXIT_FAILURE;
}
if (argc >= 2)
out_file = argv[1];
out_fd = open(out_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (out_fd < 0) {
fprintf(stderr, "Failed to open out device %s %d/%d/%s\n",
out_file, rc, errno, strerror(errno));
return EXIT_FAILURE;
}
if (dump_eeprom(i2c_fd, out_fd) != 0) {
unlink(out_file);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

View File

@@ -1,57 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts. This is how we build on jenkins.osmocom.org
#
# environment variables:
# * FIRMWARE_VERSION: which firmware version to build ("master", "femtobts_v2.7", ...)
# * WITH_MANUALS: build manual PDFs if set to "1"
# * PUBLISH: upload manuals after building if set to "1" (ignored without WITH_MANUALS = "1")
#
# usage: jenkins_bts_model.sh BTS_MODEL
# * BTS_MODEL: which BTS model specific script to run ("sysmo", "oct", ...)
#
bts_model="$1"
if [ "x$bts_model" = "x" ]; then
echo "Error: You have to specify the BTS model as first argument, e.g. $0 sysmo"
exit 2
fi
if [ ! -d "./contrib" ]; then
echo "Run ./contrib/jenkins_bts_model.sh from the root of the osmo-bts tree"
exit 1
fi
set -x -e
case "$bts_model" in
sysmo)
./contrib/jenkins_sysmobts.sh
;;
oct)
./contrib/jenkins_oct.sh
;;
lc15)
./contrib/jenkins_lc15.sh
;;
oc2g)
./contrib/jenkins_oc2g.sh
;;
trx)
./contrib/jenkins_bts_trx.sh
;;
oct+trx)
./contrib/jenkins_oct_and_bts_trx.sh
;;
*)
set +x
echo "Unknown BTS model '$bts_model'"
;;
esac

View File

@@ -1,25 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts-trx
# shellcheck source=contrib/jenkins_common.sh
. $(dirname "$0")/jenkins_common.sh
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
osmo-build-dep.sh libosmocore "" --disable-doxygen
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-abis "" --disable-dahdi
cd "$deps"
configure_flags="\
--enable-sanitize \
--enable-werror \
--enable-trx \
--enable-external-tests \
"
build_bts "osmo-bts-trx" "$configure_flags"
osmo-clean-workspace.sh

View File

@@ -1,61 +0,0 @@
#!/bin/sh
# this is a common helper script that is shared among all BTS model
# specific helper scripts like jenkins_sysmobts.sh. You shouldn't call
# this directly, but rather indirectly via the bts-specific scripts
if ! [ -x "$(command -v osmo-deps.sh)" ]; then
echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"
exit 2
fi
set -ex
base="$PWD"
deps="$base/deps"
inst="$deps/install"
export deps inst
osmo-clean-workspace.sh
mkdir -p "$deps"
verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
# generic project build function, usage:
# build "PROJECT-NAME" "CONFIGURE OPTIONS"
build_bts() {
set +x
echo
echo
echo
echo " =============================== $1 ==============================="
echo
set -x
cd $deps
osmo-deps.sh libosmocore
cd $base
shift
# Manuals: build
conf_flags="$*"
if [ "$WITH_MANUALS" = "1" ]; then
conf_flags="$conf_flags --enable-manuals"
export PATH="$inst/bin:$PATH"
fi
autoreconf --install --force
./configure $conf_flags
$MAKE $PARALLEL_MAKE
$MAKE check || cat-testlogs.sh
DISTCHECK_CONFIGURE_FLAGS="$conf_flags" $MAKE $PARALLEL_MAKE distcheck || cat-testlogs.sh
# Manuals: publish
if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then
$MAKE -C "$base/doc/manuals" publish
fi
$MAKE $PARALLEL_MAKE maintainer-clean
}

View File

@@ -1,25 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts-lc15
# shellcheck source=contrib/jenkins_common.sh
. $(dirname "$0")/jenkins_common.sh
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
osmo-build-dep.sh libosmocore "" --disable-doxygen
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-abis "" --disable-dahdi
cd "$deps"
osmo-layer1-headers.sh lc15 "$FIRMWARE_VERSION"
configure_flags="\
--enable-sanitize \
--with-litecell15=$deps/layer1-headers/inc/ \
--enable-litecell15 \
"
build_bts "osmo-bts-lc15" "$configure_flags"
osmo-clean-workspace.sh

View File

@@ -1,25 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts-oc2g
# shellcheck source=contrib/jenkins_common.sh
. $(dirname "$0")/jenkins_common.sh
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
osmo-build-dep.sh libosmocore "" --disable-doxygen
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-abis "" --disable-dahdi
cd "$deps"
osmo-layer1-headers.sh oc2g "$FIRMWARE_VERSION"
configure_flags="\
--enable-sanitize \
--with-oc2g=$deps/layer1-headers/inc/ \
--enable-oc2g \
"
build_bts "osmo-bts-oc2g" "$configure_flags"
osmo-clean-workspace.sh

View File

@@ -1,26 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts-octphy
# shellcheck source=contrib/jenkins_common.sh
. $(dirname "$0")/jenkins_common.sh
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
osmo-build-dep.sh libosmocore "" --disable-doxygen
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-abis "" --disable-dahdi
cd "$deps"
osmo-layer1-headers.sh oct "$FIRMWARE_VERSION"
configure_flags="\
--enable-sanitize \
--enable-werror \
--with-octsdr-2g=$deps/layer1-headers/ \
--enable-octphy \
"
build_bts "osmo-bts-octphy" "$configure_flags"
osmo-clean-workspace.sh

View File

@@ -1,28 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts-octphy + osmo-bts-trx
# shellcheck source=contrib/jenkins_common.sh
. $(dirname "$0")/jenkins_common.sh
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
osmo-build-dep.sh libosmocore "" --disable-doxygen
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-abis "" --disable-dahdi
cd "$deps"
osmo-layer1-headers.sh oct "$FIRMWARE_VERSION"
configure_flags="\
--enable-werror \
--with-octsdr-2g=$deps/layer1-headers/ \
--enable-octphy \
--enable-trx \
--enable-external-tests \
"
build_bts "osmo-bts-octphy+trx" "$configure_flags"
osmo-clean-workspace.sh

View File

@@ -1,34 +0,0 @@
#!/bin/sh
# jenkins build helper script for osmo-bts-sysmo
# shellcheck source=contrib/jenkins_common.sh
. $(dirname "$0")/jenkins_common.sh
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
osmo-build-dep.sh libosmocore "" --disable-doxygen
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-abis "" --disable-dahdi
cd "$deps"
osmo-layer1-headers.sh sysmo "$FIRMWARE_VERSION"
mkdir -p "$inst/include/sysmocom/femtobts"
ln -s $deps/layer1-headers/include/* "$inst/include/sysmocom/femtobts/"
configure_flags="\
--enable-sanitize \
--enable-werror \
--enable-sysmocom-bts \
--with-sysmobts=$inst/include/ \
--enable-external-tests \
"
# This will not work for the femtobts
if [ $FIRMWARE_VERSION != "femtobts_v2.7" ]; then
configure_flags="$configure_flags --enable-sysmobts-calib"
fi
build_bts "osmo-bts-sysmo" "$configure_flags"
osmo-clean-workspace.sh

31
contrib/l1fwd.init Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: l1fwd
# Required-Start:
# Required-Stop: $local_fs
# Default-Start: 5
# Default-Stop: 0 6
# Short-Description: Start screen session with l1fwd software
# Description:
### END INIT INFO
. /etc/default/rcS
case "$1" in
start)
/usr/bin/screen -d -m -c /etc/osmocom/screenrc-l1fwd
;;
stop)
echo "This script doesn't support stop"
exit 1
;;
restart|reload|force-reload)
exit 0
;;
show)
;;
*)
echo "Usage: sysmobts {start|stop|show|reload|restart}" >&2
exit 1
;;
esac

13
contrib/respawn-only.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
PID=$$
echo "-1000" > /proc/$PID/oom_score_adj
trap "{ kill 0; kill -2 0; }" EXIT
while [ -f $1 ]; do
(echo "0" > /proc/self/oom_score_adj && exec nice -n -20 $*) &
LAST_PID=$!
wait $LAST_PID
sleep 10s
done

18
contrib/respawn.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/sh
PID=$$
echo "-1000" > /proc/$PID/oom_score_adj
trap "kill 0" EXIT
while [ -e /etc/passwd ]; do
cat /lib/firmware/sysmobts-v?.bit > /dev/fpgadl_par0
sleep 2s
cat /lib/firmware/sysmobts-v?.out > /dev/dspdl_dm644x_0
sleep 1s
echo "0" > /sys/class/leds/activity_led/brightness
(echo "0" > /proc/self/oom_score_adj && exec nice -n -20 $*) &
LAST_PID=$!
wait $LAST_PID
sleep 10s
done

3
contrib/screenrc-l1fwd Normal file
View File

@@ -0,0 +1,3 @@
chdir /tmp
screen -t BTS 0 /etc/osmocom/respawn.sh /usr/bin/l1fwd-proxy
detach

View File

@@ -0,0 +1,4 @@
chdir /tmp
screen -t BTS 0 /etc/osmocom/respawn.sh /usr/bin/sysmobts -c /etc/osmocom/osmo-bts.cfg -M
screen -t PCU 1 /etc/osmocom/respawn-only.sh /usr/bin/osmo-pcu -c /etc/osmocom/osmo-pcu.cfg
detach

View File

@@ -1,91 +0,0 @@
#!/usr/bin/gawk -f
# Usage example:
# tshark -2 -t r -E 'header=n' -E 'separator=,' -E 'quote=n' -T fields -e gsmtap.frame_nr -e gsmtap.ts -e gsmtap.arfcn -e _ws.col.Info -Y 'gsmtap' -r test.pcapng.gz | grep Information | env ARFCN=878 ./si_check.gawk
# read summary on number of bis/ter messages and adjust BT_BOTH and BT_NONE environment variables accordingly
BEGIN {
FS = ","
FAILED = 0
IGNORE = 0
BIS = 0
TER = 0
QUA = 0
BT_BOTH = ENVIRON["BOTH"]
BT_NONE = ENVIRON["NONE"]
TC_INDEX = 0
TC4[4] = 0
}
{ # expected .csv input as follows: gsmtap.frame_nr,gsmtap.ts,gsmtap.arfcn,_ws.col.Info
if ("ARFCN" in ENVIRON) { # ARFCN filtering is enabled
if (ENVIRON["ARFCN"] != $3) { # ignore other ARFCNs
IGNORE++
next
}
}
type = get_si_type($4)
tc = get_tc($1)
result = "FAIL"
if (1 == check_si_tc(tc, type)) { result = "OK" }
else { FAILED++ }
if (4 == tc) {
TC4[TC_INDEX] = type
TC_INDEX = int((TC_INDEX + 1) % 4)
if (0 == check_tc4c(type) && "OK" == result) {
result = "FAIL"
FAILED++
}
}
if (type == "2bis") { BIS++ }
if (type == "2ter") { TER++ }
if (type == "2quater") { QUA++ }
# for (i in TC4) print TC4[i] # debugging
printf "ARFCN=%d FN=%d TS=%d TC=%d TYPE=%s %s\n", $3, $1, $2, tc, type, result
}
END {
printf "check completed: total %d, failed %d, ignored %d, ok %d\nSI2bis = %d, SI2ter = %d, SI2quater = %d\n", NR, FAILED, IGNORE, NR - FAILED - IGNORE, BIS, TER, QUA
if ((BIS > 0 || TER > 0) && BT_NONE) { printf "please re-run with correct environment: unset 'NONE' variable\n" }
if ((BIS > 0 && TER > 0) && !BT_BOTH) { printf "please re-run with correct environment: set 'BOTH' variable\n" }
}
func get_si_type(s, x) { # we rely on format of Info column in wireshark output - if it's changed we're screwed
return x[split(s, x, " ")]
}
func get_tc(f) { # N. B: all numbers in awk are float
return int(int(f / 51) % 8)
}
func check_tc4c(si, count) { # check for "once in 4 consecutive occurrences" rule
count = 0
if ("2quater" != si || "2ter" != si) { return 1 } # rules is not applicable to other types
if (BT_NONE && "2quater" == si) { return 0 } # should be on TC=5 instead
if (!BT_BOTH && "2ter" == si) { return 0 } # should be on TC=5 instead
if (0 in TC4 && 1 in TC4 && 2 in TC4 && 3 in TC4) { # only check if we have 4 consecutive occurrences already
if (si == TC4[0]) { count++ }
if (si == TC4[1]) { count++ }
if (si == TC4[2]) { count++ }
if (si == TC4[3]) { count++ }
if (0 == count) { return 0 }
}
return 1
}
func check_si_tc(tc, si) { # check that SI scheduling on BCCH Norm is matching rules from 3GPP TS 05.02 § 6.3.1.3
switch (si) {
case "1": return (0 == tc) ? 1 : 0
case "2": return (1 == tc) ? 1 : 0
case "2bis": return (5 == tc) ? 1 : 0
case "13": return (4 == tc) ? 1 : 0
case "9": return (4 == tc) ? 1 : 0
case "2ter": if (BT_BOTH) { return (4 == tc) ? 1 : 0 } else { return (5 == tc) ? 1 : 0 }
case "2quater": if (BT_NONE) { return (5 == tc) ? 1 : 0 } else { return (4 == tc) ? 1 : 0 }
case "3": return (2 == tc || 6 == tc) ? 1 : 0
case "4": return (3 == tc || 7 == tc) ? 1 : 0
}
return 0
}

View File

@@ -1,110 +0,0 @@
#!/bin/sh
# Split common DSP call log file (produced by superfemto-compatible firmware) into 4 separate call leg files (MO/MT & DL/UL) with events in format "FN EVENT_TYPE":
# MO Mobile Originated
# MT Mobile Terminated
# DL DownLink (BTS -> L1)
# UL UpLink (L1 -> BTS)
if [ -z $1 ]; then
echo "expecting DSP log file name as parameter"
exit 1
fi
# MO handle appear 1st in the logs
MO=$(grep 'h=' $1 | head -n 1 | cut -f2 -d',' | cut -f2 -d= | cut -f1 -d']')
# direction markers:
DLST="_CodeBurst"
ULST="_DecodeAndIdentify"
# DL sed filters:
D_EMP='s/ Empty frame request!/EMPTY/i'
D_FAC='s/ Coding a FACCH\/. frame !!/FACCH/i'
D_FST='s/ Coding a RTP SID First frame !!/FIRST/i'
D_FS1='s/ Coding a SID First P1 frame !!/FIRST_P1/i'
D_FS2='s/ Coding a SID First P2 frame !!/FIRST_P2/i'
D_RP1='s/ Coding a RTP SID P1 frame !!/SID_P1/i'
D_UPD='s/ Coding a RTP SID Update frame !!/UPDATE/i'
D_SPE='s/ Coding a RTP Speech frame !!/SPEECH/i'
D_ONS='s/ Coding a Onset frame !!/ONSET/i'
D_FO1='s/ A speech frame is following a NoData or SID First without an Onset./FORCED_FIRST/i'
D_FO2='s/ A speech frame is following a NoData without an Onset./FORCED_NODATA/i'
D_FP2='s/ A speech frame is following a NoData or SID_FIRST_P2 without an Onset./FORCED_F_P2/i'
D_FIN='s/ A speech frame is following a SID_FIRST without inhibit. A SID_FIRST_INH will be inserted./FORCED_F_INH/i'
D_UIN='s/ A speech frame is following a SID_UPDATE without inhibit. A SID_UPDATE_INH will be inserted./FORCED_U_INH/i'
# UL sed filters:
U_NOD='s/ It is a No Data frame !!/NODATA/i'
U_ONS='s/ It is an ONSET frame !!/ONSET/i'
U_UPD='s/ It is a SID UPDATE frame !!/UPDATE/i'
U_FST='s/ It is a SID FIRST frame !!/FIRST/i'
U_FP1='s/ It is a SID-First P1 frame !!/FIRST_P1/i'
U_FP2='s/ It is a SID-First P2 frame !!/FIRST_P2/i'
U_SPE='s/ It is a SPEECH frame *!!/SPEECH/i'
U_UIN='s/ It is a SID update InH frame !!/UPD_INH/i'
U_FIN='s/ It is a SID-First InH frame !!/FST_INH/i'
U_RAT='s/ It is a RATSCCH data frame !!/RATSCCH/i'
DL () { # filter downlink-related entries
grep $DLST $1 > $1.DL.tmp
}
UL () { # uplink does not require special fix
grep $ULST $1 > $1.UL.tmp.fix
}
DL $1
UL $1
FIX() { # add MO/MT marker from preceding line to inserted ONSETs so filtering works as expected
cat $1.DL.tmp | awk 'BEGIN{ FS=" h="; H="" } { if (NF > 1) { H = $2; print $1 "h=" $2 } else { print $1 ", h=" H } }' > $1.DL.tmp.fix
}
FIX $1
MO() { # filter MO call DL or UL logs
grep "h=$MO" $1.tmp.fix > $1.MO.raw
}
MT() { # filter MT call DL or UL logs
grep -v "h=$MO" $1.tmp.fix > $1.MT.raw
}
MO $1.DL
MT $1.DL
MO $1.UL
MT $1.UL
PREP() { # prepare logs for reformatting
cat $1.raw | cut -f2 -d')' | cut -f1 -d',' | cut -f2 -d'>' | sed 's/\[u32Fn/fn/' | sed 's/\[ u32Fn/fn/' | sed 's/fn = /fn=/' | sed 's/fn=//' | sed 's/\[Fn=//' | sed 's/ An Onset will be inserted.//' > $1.tmp1
}
PREP "$1.DL.MT"
PREP "$1.DL.MO"
PREP "$1.UL.MT"
PREP "$1.UL.MO"
RD() { # reformat DL logs for consistency checks
cat $1.tmp1 | sed "$D_FST" | sed "$D_SPE" | sed "$D_FS1" | sed "$D_FS2" | sed "$D_UIN" | sed "$D_FIN" | sed "$D_UPD" | sed "$D_INH" | sed "$D_RP1" | sed "$D_ONS" | sed "$D_EMP" | sed "$D_FAC" | sed "$D_FO1" | sed "$D_FO2" | sed "$D_FP2" > $1.tmp2
}
RU() { # reformat UL logs for consistency checks
cat $1.tmp1 | sed "$U_FST" | sed "$U_SPE" | sed "$U_FP1" | sed "$U_FP2" | sed "$U_UPD" | sed "$U_ONS" | sed "$U_NOD" | sed "$U_UIN" | sed "$U_FIN" | sed "$U_RAT" > $1.tmp2
}
RD "$1.DL.MT"
RD "$1.DL.MO"
RU "$1.UL.MT"
RU "$1.UL.MO"
SW() { # swap fields
cat $1.tmp2 | awk '{ print $2, $1 }' > $1
}
SW "$1.DL.MT"
SW "$1.DL.MO"
SW "$1.UL.MT"
SW "$1.UL.MO"
rm $1.*.tmp*

View File

@@ -0,0 +1,10 @@
CFLAGS=`pkg-config --cflags libosmocore` -Wall -Werror
LIBS=`pkg-config --libs libosmocore libosmogsm`
all: sysmobts-calib
sysmobts-calib: sysmobts-calib.o sysmobts-layer1.o
$(CC) $(CPPFLAGS) -o $@ $^ -lrt $(LIBS)
clean:
@rm -f sysmobts-calib *.o

View File

@@ -318,16 +318,6 @@ static int calib_get_clock_error(void)
return -1;
}
/*
* Empiric gps error determination. With revE and firmware v3.3
* the clock error for TCXO to GPS appears to have a different
* sign. The device in question doesn't have a networklisten mode
* so it is impossible to verify that this only applies to GPS.
*/
if (source == SuperFemto_ClkSrcId_GpsPps)
clkErr *= -1;
/* this is an absolute clock error */
printf("The calibration value is: %d\n", clkErr);
return 0;

View File

@@ -310,36 +310,19 @@ int print_system_info()
#ifdef FEMTOBTS_NO_BOARD_VERSION
#define BOARD_REV(x) -1
#define BOARD_OPT(x) -1
#define COMPILED_MAJOR (FEMTOBTS_API_VERSION >> 16)
#define COMPILED_MINOR ((FEMTOBTS_API_VERSION >> 8) & 0xff)
#define COMPILED_BUILD (FEMTOBTS_API_VERSION & 0xff)
#else
#define BOARD_REV(x) x.u.systemInfoCnf.boardVersion.rev
#define BOARD_OPT(x) x.u.systemInfoCnf.boardVersion.option
#define COMPILED_MAJOR (SUPERFEMTO_API_VERSION >> 16)
#define COMPILED_MINOR ((SUPERFEMTO_API_VERSION >> 8) & 0xff)
#define COMPILED_BUILD (SUPERFEMTO_API_VERSION & 0xff)
#endif
printf("Compiled against: v%u.%u.%u\n",
COMPILED_MAJOR, COMPILED_MINOR, COMPILED_BUILD);
printf("Running DSP v%d.%d.%d FPGA v%d.%d.%d Rev: %d Option: %d\n",
printf("DSP v%d.%d.%d FPGA v%d.%d.%d Rev: %d Option: %d\n",
INFO_DSP(prim).major, INFO_DSP(prim).minor, INFO_DSP(prim).build,
INFO_FPGA(prim).major, INFO_FPGA(prim).minor, INFO_FPGA(prim).build,
BOARD_REV(prim), BOARD_OPT(prim));
if (COMPILED_MAJOR != INFO_DSP(prim).major || COMPILED_MINOR != INFO_DSP(prim).minor) {
printf("WARNING! WARNING! WARNING! WARNING! WARNING\n");
printf("You might run this against an incompatible firmware.\n");
printf("Continuing anyway but the result might be broken\n");
}
#undef INFO_DSP
#undef INFO_FPGA
#undef BOARD_REV
#undef BOARD_OPT
#undef COMPILED_MAJOR
#undef COMPILED_MINOR
#undef COMPILED_BUILD
return 0;
}
@@ -437,6 +420,7 @@ int follow_sch(int band, int arfcn, int clock, int ref, HANDLE *layer1)
prim.u.mphConnectReq.hLayer1 = *layer1;
prim.u.mphConnectReq.u8Tn = 0;
prim.u.mphConnectReq.logChComb = GsmL1_LogChComb_IV;
printf("FIVE\n");
rc = send_recv_sig_prim(GsmL1_PrimId_MphConnectReq, &prim);
if (rc != 0) {
printf("Failed to connect.\n");
@@ -622,7 +606,7 @@ int set_clock_cor(int clock_cor, int calib, int source)
return -1;
}
if (prim.u.rfClockSetupCnf.status != GsmL1_Status_Success) {
printf("Clock setup was not successful.\n");
printf("Clock setup was not successfull.\n");
return -2;
}

15
contrib/sysmobts.service Normal file
View File

@@ -0,0 +1,15 @@
[Unit]
Description=sysmocom sysmoBTS
[Service]
Type=simple
ExecStartPre=/bin/sh -c 'echo 0 > /sys/class/leds/activity_led/brightness'
ExecStart=/usr/bin/sysmobts -s -c /etc/osmocom/osmo-bts.cfg
ExecStartPost=/bin/sh -c 'echo 0 > /sys/class/leds/activity_led/brightness'
ExecStartPost=/bin/sh -c 'cat /lib/firmware/sysmobts-v?.out > /dev/dspdl_dm644x_0'
Restart=always
RestartSec=2
# The msg queues must be read fast enough
CPUSchedulingPolicy=rr
CPUSchedulingPriority=1

View File

@@ -1,32 +0,0 @@
EXTRA_DIST = \
lc15bts-mgr.service \
oc2gbts-mgr.service \
osmo-bts-lc15.service \
osmo-bts-oc2g.service \
osmo-bts-sysmo.service \
osmo-bts-trx.service \
osmo-bts-virtual.service \
sysmobts-mgr.service
if HAVE_SYSTEMD
SYSTEMD_SERVICES = osmo-bts-virtual.service
if ENABLE_SYSMOBTS
SYSTEMD_SERVICES += osmo-bts-sysmo.service sysmobts-mgr.service
endif
if ENABLE_TRX
SYSTEMD_SERVICES += osmo-bts-trx.service
endif
if ENABLE_LC15BTS
SYSTEMD_SERVICES += osmo-bts-lc15.service lc15bts-mgr.service
endif
if ENABLE_OC2GBTS
SYSTEMD_SERVICES += osmo-bts-oc2g.service oc2gbts-mgr.service
endif
systemdsystemunit_DATA = $(SYSTEMD_SERVICES)
endif # HAVE_SYSTEMD

View File

@@ -1,33 +0,0 @@
[Unit]
Description=osmo-bts manager for LC15 / sysmoBTS 2100
After=lc15-sysdev-remap.service
Wants=lc15-sysdev-remap.service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
NotifyAccess=all
WatchdogSec=21780s
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Restart=always
RestartSec=2
# Make sure directories and symbolic link exist
ExecStartPre=/bin/sh -c 'test -d /mnt/storage/var/run/lc15bts-mgr || mkdir -p /mnt/storage/var/run/lc15bts-mgr ; test -d /var/run/lc15bts-mgr || ln -sf /mnt/storage/var/run/lc15bts-mgr/ /var/run'
# Make sure BTS operation hour exist
ExecStartPre=/bin/sh -c 'test -f /mnt/storage/var/run/lc15bts-mgr/hours-running || echo 0 > /mnt/storage/var/run/lc15bts-mgr/hours-running'
# Shutdown all PA correctly
ExecStartPre=/bin/sh -c 'echo disabled > /var/lc15/pa-state/pa0/state; echo disabled > /var/lc15/pa-state/pa1/state'
ExecStartPre=/bin/sh -c 'echo 0 > /var/lc15/pa-supply/max_microvolts; echo 0 > /var/lc15/pa-supply/min_microvolts'
ExecStart=/usr/bin/lc15bts-mgr -s -c /etc/osmocom/lc15bts-mgr.cfg
# Shutdown all PA correctly
ExecStopPost=/bin/sh -c 'echo disabled > /var/lc15/pa-state/pa0/state; echo disabled > /var/lc15/pa-state/pa1/state'
ExecStopPost=/bin/sh -c 'echo 0 > /var/lc15/pa-supply/max_microvolts; echo 0 > /var/lc15/pa-supply/min_microvolts'
[Install]
WantedBy=multi-user.target
Alias=osmo-bts-mgr.service

View File

@@ -1,33 +0,0 @@
[Unit]
Description=osmo-bts manager for OC-2G
After=oc2g-sysdev-remap.service
Wants=oc2g-sysdev-remap.service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
NotifyAccess=all
WatchdogSec=21780s
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Restart=always
RestartSec=2
# Make sure directories and symbolic link exist
ExecStartPre=/bin/sh -c 'test -d /mnt/storage/var/run/oc2gbts-mgr || mkdir -p /mnt/storage/var/run/oc2gbts-mgr ; test -d /var/run/oc2gbts-mgr || ln -sf /mnt/storage/var/run/oc2gbts-mgr/ /var/run'
# Make sure BTS operation hour exist
ExecStartPre=/bin/sh -c 'test -f /mnt/storage/var/run/oc2gbts-mgr/hours-running || echo 0 > /mnt/storage/var/run/oc2gbts-mgr/hours-running'
# Shutdown all PA correctly
ExecStartPre=/bin/sh -c 'echo disabled > /var/oc2g/pa-state/pa0/state;'
#ExecStartPre=/bin/sh -c 'echo 0 > /var/oc2g/pa-supply/max_microvolts; echo 0 > /var/oc2g/pa-supply/min_microvolts'
ExecStart=/usr/bin/oc2gbts-mgr -s -c /etc/osmocom/oc2gbts-mgr.cfg
# Shutdown all PA correctly
ExecStopPost=/bin/sh -c 'echo disabled > /var/oc2g/pa-state/pa0/state;'
#ExecStopPost=/bin/sh -c 'echo 0 > /var/oc2g/pa-supply/max_microvolts; echo 0 > /var/oc2g/pa-supply/min_microvolts'
[Install]
WantedBy=multi-user.target
Alias=osmo-bts-mgr.service

View File

@@ -1,23 +0,0 @@
[Unit]
Description=osmo-bts for LC15 / sysmoBTS 2100
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/osmo-bts-lc15 -t 2 -s -c /etc/osmocom/osmo-bts-lc15.cfg -M
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
RuntimeDirectory=osmo-bts
Restart=always
RestartSec=2
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
CPUSchedulingPriority=11
# See sched(7) for further details on real-time policies and priorities
[Install]
WantedBy=multi-user.target
Alias=osmo-bts.service

View File

@@ -1,23 +0,0 @@
[Unit]
Description=osmo-bts for OC-2G
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/osmo-bts-oc2g -s -c /etc/osmocom/osmo-bts-oc2g.cfg -M
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
RuntimeDirectory=osmo-bts
Restart=always
RestartSec=2
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
CPUSchedulingPriority=11
# See sched(7) for further details on real-time policies and priorities
[Install]
WantedBy=multi-user.target
Alias=osmo-bts.service

View File

@@ -1,26 +0,0 @@
[Unit]
Description=osmo-bts for sysmocom sysmoBTS
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStartPre=/bin/sh -c 'echo 0 > /sys/class/leds/activity_led/brightness'
ExecStart=/usr/bin/osmo-bts-sysmo -s -c /etc/osmocom/osmo-bts-sysmo.cfg -M
ExecStopPost=/bin/sh -c 'echo 0 > /sys/class/leds/activity_led/brightness'
ExecStopPost=/bin/sh -c 'cat /lib/firmware/sysmobts-v?.bit > /dev/fpgadl_par0 ; sleep 3s; cat /lib/firmware/sysmobts-v?.out > /dev/dspdl_dm644x_0; sleep 1s'
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Restart=always
RestartSec=2
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
CPUSchedulingPriority=20
# See sched(7) for further details on real-time policies and priorities
[Install]
WantedBy=multi-user.target
Alias=sysmobts.service
Alias=osmo-bts.service

View File

@@ -1,24 +0,0 @@
[Unit]
Description=Osmocom osmo-bts for osmo-trx
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/osmo-bts-trx -s -c /etc/osmocom/osmo-bts-trx.cfg
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Restart=always
RestartSec=2
User=osmocom
Group=osmocom
AmbientCapabilities=CAP_SYS_NICE
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
CPUSchedulingPriority=11
# See sched(7) for further details on real-time policies and priorities
[Install]
WantedBy=multi-user.target

View File

@@ -1,24 +0,0 @@
[Unit]
Description=Osmocom GSM BTS for virtual Um layer based on GSMTAP/UDP
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/osmo-bts-virtual -s -c /etc/osmocom/osmo-bts-virtual.cfg
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Restart=always
RestartSec=2
User=osmocom
Group=osmocom
AmbientCapabilities=CAP_SYS_NICE
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
CPUSchedulingPriority=11
# See sched(7) for further details on real-time policies and priorities
[Install]
WantedBy=multi-user.target

View File

@@ -1,16 +0,0 @@
[Unit]
Description=osmo-bts manager for sysmoBTS
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/sysmobts-mgr -ns -c /etc/osmocom/sysmobts-mgr.cfg
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
Alias=osmo-bts-mgr.service

2710
debian/changelog vendored

File diff suppressed because it is too large Load Diff

1
debian/compat vendored
View File

@@ -1 +0,0 @@
10

75
debian/control vendored
View File

@@ -1,75 +0,0 @@
Source: osmo-bts
Maintainer: Osmocom team <openbsc@lists.osmocom.org>
Section: net
Priority: optional
Build-Depends: debhelper (>= 10),
pkg-config,
dh-autoreconf,
autotools-dev,
pkg-config,
libosmocore-dev (>= 1.11.0),
libosmo-abis-dev (>= 2.0.0),
libosmo-netif-dev (>= 1.6.0),
libgps-dev,
txt2man,
osmo-gsm-manuals-dev (>= 1.6.0)
Standards-Version: 3.9.8
Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-bts
Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-bts
Homepage: https://projects.osmocom.org/projects/osmobts
Package: osmo-bts
Architecture: any
Depends: osmo-bts-trx, osmo-bts-virtual, ${misc:Depends}
Description: Base Transceiver Station for GSM
OsmoBTS is a software implementation of Layer2/3 of a BTS. It implements the
following protocols/interfaces:
LAPDm (GSM 04.06)
RTP
A-bis/IP in IPA multiplex
OML (GSM TS 12.21)
RSL (GSM TS 08.58)
.
OsmoBTS is modular and has support for multiple back-ends. A back-end talks to
a specific L1/PHY implementation of the respective BTS hardware. Based on this
architecture, it should be relatively easy to add a new back-end to support
so-far unsupported GSM PHY/L1 and associated hardware.
Package: osmo-bts-trx
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: osmo-bts-trx GSM BTS with osmo-trx
osmo-bts-trx to be used with the osmo-trx application
Package: osmo-bts-trx-dbg
Architecture: any
Section: debug
Priority: extra
Depends: osmo-bts-trx (= ${binary:Version}), ${misc:Depends}
Description: Debug symbols for the osmo-bts-trx
Make debugging possible
Package: osmo-bts-virtual
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Virtual Osmocom GSM BTS (no RF hardware; GSMTAP/UDP)
This version of OsmoBTS doesn't use actual GSM PHY/Hardware/RF, but
utilizes GSMTAP-over-UDP frames for the Um interface. This is useful
in fully virtualized setups e.g. in combination with OsmocomBB virt_phy.
Package: osmo-bts-virtual-dbg
Architecture: any
Section: debug
Priority: extra
Depends: osmo-bts-virtual (= ${binary:Version}), ${misc:Depends}
Description: Debug symbols for the osmo-bts-virtual
Make debugging possible
Package: osmo-bts-doc
Architecture: all
Section: doc
Priority: optional
Depends: ${misc:Depends}
Description: ${misc:Package} PDF documentation
Various manuals: user manual, VTY reference manual and/or
protocol/interface manuals.

81
debian/copyright vendored
View File

@@ -1,81 +0,0 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: osmo-bts
Source: http://cgit.osmocom.org/osmo-bts/
Files: *
Copyright: 2008-2014 Harald Welte <laforge@gnumonks.org>
2009,2011,2013 Andreas Eversberg <jolly@eversberg.eu>
2010,2011 On-Waves
2012-2015 Holger Hans Peter Freyther
2014 sysmocom s.f.m.c. Gmbh
2015 Alexander Chemeris <Alexander.Chemeris@fairwaves.co>
License: AGPL-3+
Files: src/osmo-bts-sysmo/eeprom.c
src/osmo-bts-sysmo/eeprom.h
Copyright: 2012 Nutaq
License: MIT
Comment: Yves Godin is the author
Files: src/common/pcu_sock.c
Copyright: 2008-2010 Harald Welte <laforge@gnumonks.org>
2009-2012 Andreas Eversberg <jolly@eversberg.eu>
2012 Holger Hans Peter Freyther
License: GPL-2+
Files: debian/*
Copyright: 2015-2016 Ruben Undheim <ruben.undheim@gmail.com>
License: AGPL-3+
License: AGPL-3+
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 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/>.
License: GPL-2+
This package is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 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 General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1 +0,0 @@
usr/share/doc/osmo-bts-doc/*.pdf

View File

@@ -1,5 +0,0 @@
etc/osmocom/osmo-bts-trx.cfg
lib/systemd/system/osmo-bts-trx.service
usr/bin/osmo-bts-trx
usr/share/doc/osmo-bts/examples/osmo-bts-trx/osmo-bts-trx.cfg
usr/share/doc/osmo-bts/examples/osmo-bts-trx/osmo-bts-trx-calypso.cfg

View File

@@ -1,39 +0,0 @@
#!/bin/sh -e
case "$1" in
configure)
# Create the osmocom group and user (if it doesn't exist yet)
if ! getent group osmocom >/dev/null; then
groupadd --system osmocom
fi
if ! getent passwd osmocom >/dev/null; then
useradd \
--system \
--gid osmocom \
--home-dir /var/lib/osmocom \
--shell /sbin/nologin \
--comment "Open Source Mobile Communications" \
osmocom
fi
# Fix permissions of previous (root-owned) install (OS#4107)
if dpkg --compare-versions "$2" le "1.13.0"; then
if [ -e /etc/osmocom/osmo-bts-trx.cfg ]; then
chown -v osmocom:osmocom /etc/osmocom/osmo-bts-trx.cfg
chmod -v 0660 /etc/osmocom/osmo-bts-trx.cfg
fi
if [ -d /etc/osmocom ]; then
chown -v root:osmocom /etc/osmocom
chmod -v 2775 /etc/osmocom
fi
mkdir -p /var/lib/osmocom
chown -R -v osmocom:osmocom /var/lib/osmocom
fi
;;
esac
# dh_installdeb(1) will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#

View File

@@ -1,5 +0,0 @@
etc/osmocom/osmo-bts-virtual.cfg
lib/systemd/system/osmo-bts-virtual.service
usr/bin/osmo-bts-virtual
usr/bin/osmo-bts-omldummy
usr/share/doc/osmo-bts/examples/osmo-bts-virtual/osmo-bts-virtual.cfg

View File

@@ -1,39 +0,0 @@
#!/bin/sh -e
case "$1" in
configure)
# Create the osmocom group and user (if it doesn't exist yet)
if ! getent group osmocom >/dev/null; then
groupadd --system osmocom
fi
if ! getent passwd osmocom >/dev/null; then
useradd \
--system \
--gid osmocom \
--home-dir /var/lib/osmocom \
--shell /sbin/nologin \
--comment "Open Source Mobile Communications" \
osmocom
fi
# Fix permissions of previous (root-owned) install (OS#4107)
if dpkg --compare-versions "$2" le "1.13.0"; then
if [ -e /etc/osmocom/osmo-bts-virtual.cfg ]; then
chown -v osmocom:osmocom /etc/osmocom/osmo-bts-virtual.cfg
chmod -v 0660 /etc/osmocom/osmo-bts-virtual.cfg
fi
if [ -d /etc/osmocom ]; then
chown -v root:osmocom /etc/osmocom
chmod -v 2775 /etc/osmocom
fi
mkdir -p /var/lib/osmocom
chown -R -v osmocom:osmocom /var/lib/osmocom
fi
;;
esac
# dh_installdeb(1) will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#

32
debian/rules vendored
View File

@@ -1,32 +0,0 @@
#!/usr/bin/make -f
DEBIAN := $(shell dpkg-parsechangelog | grep ^Version: | cut -d' ' -f2)
DEBVERS := $(shell echo '$(DEBIAN)' | cut -d- -f1)
VERSION := $(shell echo '$(DEBVERS)' | sed -e 's/[+-].*//' -e 's/~//g')
#export DH_VERBOSE=1
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
%:
dh $@ --with=systemd --with autoreconf --fail-missing
override_dh_strip:
dh_strip --package=osmo-bts-virtual --dbg-package=osmo-bts-virtual-dbg
dh_strip --package=osmo-bts-trx --dbg-package=osmo-bts-trx-dbg
override_dh_auto_configure:
dh_auto_configure -- --enable-trx --with-systemdsystemunitdir=/lib/systemd/system --enable-manuals
override_dh_clean:
dh_clean
$(RM) tests/package.m4
$(RM) tests/testsuite
# Print test results in case of a failure
override_dh_auto_test:
dh_auto_test || (find . -name testsuite.log -exec cat {} \; ; false)
# Don't create .pdf.gz files (barely saves space and they can't be opened directly by most pdf readers)
override_dh_compress:
dh_compress -X.pdf

View File

@@ -1 +0,0 @@
3.0 (native)

View File

@@ -1,4 +0,0 @@
SUBDIRS = \
examples \
manuals \
$(NULL)

View File

@@ -1,61 +0,0 @@
The osmo-bts control interface is currently supporting the following operations:
h2. generic
h3. trx.0.thermal-attenuation
The idea of this parameter is to attenuate the system output power as part of
thermal management. In some cases the PA might be passing a critical level,
so an external control process can use this attribute to reduce the system
output power.
Please note that all values in the context of transmit power calculation
are integers in milli-dB (1/10000 bel), so the below example is setting
the attenuation at 3 dB:
<pre>
bsc_control.py -d localhost -p 4238 -s trx.0.thermal-attenuation 3000
Got message: SET_REPLY 1 trx.0.thermal-attenuation 3000
</pre>
<pre>
bsc_control.py -d localhost -p 4238 -g trx.0.thermal-attenuation
Got message: GET_REPLY 1 trx.0.thermal-attenuation 3000
</pre>
h2. sysmobts specific
h3. trx.0.clock-info
obtain information on the current clock status:
<pre>
bsc_control.py -d localhost -p 4238 -g trx.0.clock-info
Got message: GET_REPLY 1 trx.0.clock-info -100,ocxo,0,0,gps
</pre>
which is to be interpreted as:
* current clock correction value is -100 ppb
* current clock source is OCXO
* deviation between clock source and calibration source is 0 ppb
* resolution of clock error measurement is 0 ppt (0 means no result yet)
* current calibration source is GPS
When this attribute is set, any value passed on is discarded, but the clock
calibration process is re-started.
h3. trx.0.clock-correction
This attribute can get and set the current clock correction value:
<pre>
bsc_control.py -d localhost -p 4238 -g trx.0.clock-correction
Got message: GET_REPLY 1 trx.0.clock-correction -100
</pre>
<pre>
bsc_control.py -d localhost -p 4238 -s trx.0.clock-correction -- -99
Got message: SET_REPLY 1 trx.0.clock-correction success
</pre>

View File

@@ -1,63 +0,0 @@
# all config examples must be listed here unconditionally, so that
# all of them end up in the release tarball (see OS#6349)
EXTRA_DIST = \
trx/osmo-bts-trx.cfg \
trx/osmo-bts-trx-calypso.cfg \
octphy/osmo-bts-trx2dsp1.cfg \
octphy/osmo-bts-octphy.cfg \
oc2g/osmo-bts-oc2g.cfg \
oc2g/oc2gbts-mgr.cfg \
sysmo/sysmobts-mgr.cfg \
sysmo/osmo-bts-sysmo.cfg \
litecell15/osmo-bts-lc15.cfg \
litecell15/lc15bts-mgr.cfg \
virtual/osmo-bts-virtual.cfg \
$(NULL)
doc_virtualdir = $(docdir)/examples/osmo-bts-virtual
doc_virtual_DATA = \
virtual/osmo-bts-virtual.cfg
OSMOCONF_FILES = virtual/osmo-bts-virtual.cfg
if ENABLE_SYSMOBTS
doc_sysmodir = $(docdir)/examples/osmo-bts-sysmo
doc_sysmo_DATA = \
sysmo/osmo-bts-sysmo.cfg \
sysmo/sysmobts-mgr.cfg
OSMOCONF_FILES += sysmo/osmo-bts-sysmo.cfg sysmo/sysmobts-mgr.cfg
endif
if ENABLE_TRX
doc_trxdir = $(docdir)/examples/osmo-bts-trx
doc_trx_DATA = \
trx/osmo-bts-trx.cfg \
trx/osmo-bts-trx-calypso.cfg
OSMOCONF_FILES += trx/osmo-bts-trx.cfg
endif
if ENABLE_OCTPHY
doc_octphydir = $(docdir)/examples/osmo-bts-octphy
doc_octphy_DATA = \
octphy/osmo-bts-trx2dsp1.cfg \
octphy/osmo-bts-octphy.cfg
OSMOCONF_FILES += octphy/osmo-bts-octphy.cfg
endif
if ENABLE_LC15BTS
doc_lc15dir = $(docdir)/examples/osmo-bts-lc15
doc_lc15_DATA = \
litecell15/osmo-bts-lc15.cfg \
litecell15/lc15bts-mgr.cfg
OSMOCONF_FILES += litecell15/osmo-bts-lc15.cfg litecell15/lc15bts-mgr.cfg
endif
if ENABLE_OC2GBTS
doc_oc2gdir = $(docdir)/examples/osmo-bts-oc2g
doc_oc2g_DATA = \
oc2g/osmo-bts-oc2g.cfg \
oc2g/oc2gbts-mgr.cfg
OSMOCONF_FILES += oc2g/osmo-bts-oc2g.cfg oc2g/oc2gbts-mgr.cfg
endif
osmoconfdir = $(sysconfdir)/osmocom
osmoconf_DATA = $(OSMOCONF_FILES)

View File

@@ -1,45 +0,0 @@
!
! lc15bts-mgr (0.3.0.284-a7c2-dirty) configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level temp info
logging level fw info
logging level find info
logging level calib info
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
!
line vty
no login
!
lc15bts-mgr
limits supply_volt
threshold warning min 17500
threshold critical min 19000
limits tx0_vswr
threshold warning max 1000
limits tx1_vswr
threshold warning max 1000
limits supply_pwr
threshold warning max 110
threshold critical max 120
limits pa0_pwr
threshold warning max 50
threshold critical max 60
limits pa1_pwr
threshold warning max 50
threshold critical max 60

View File

@@ -1,47 +0,0 @@
!
! OsmoBTS (0.0.1.100-0455-dirty) configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level abis notice
logging level rtp notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
!
line vty
no login
!
phy 0
instance 0
trx-calibration-path /mnt/rom/factory/calib
phy 1
instance 0
trx-calibration-path /mnt/rom/factory/calib
bts 0
band 900
ipa unit-id 6969 0
oml remote-ip 192.168.234.185
trx 0
phy 0 instance 0
trx 1
phy 1 instance 0

View File

@@ -1,35 +0,0 @@
!
! oc2gbts-mgr (0.3.0.284-a7c2-dirty) configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level temp info
logging level fw info
logging level find info
logging level calib info
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
!
line vty
no login
!
oc2gbts-mgr
limits supply_volt
threshold warning min 17500
threshold critical min 19000
limits supply_pwr
threshold warning max 110
threshold critical max 120

View File

@@ -1,42 +0,0 @@
!
! OsmoBTS (0.0.1.100-0455-dirty) configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level abis notice
logging level rtp notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
!
line vty
no login
!
phy 0
instance 0
trx-calibration-path /mnt/rom/factory/calib
bts 0
band 900
ipa unit-id 6969 0
oml remote-ip 10.42.0.1
trx 0
phy 0 instance 0

View File

@@ -1,35 +0,0 @@
!
! OsmoBTS () configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp info
logging level abis notice
!
line vty
no login
!
phy 0
octphy hw-addr 00:0C:90:2e:80:1e
octphy net-device eth0.2342
instance 0
bts 0
band 1800
ipa unit-id 6969 0
oml remote-ip 127.0.0.1
trx 0
phy 0 instance 0

View File

@@ -1,38 +0,0 @@
!
! OsmoBTS () configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp info
logging level abis notice
!
line vty
no login
!
phy 0
octphy hw-addr 00:0c:de:ad:fa:ce
octphy net-device eth2
instance 0
instance 1
bts 0
band 1800
ipa unit-id 6969 0
oml remote-ip 127.0.0.1
trx 0
phy 0 instance 0
trx 1
phy 0 instance 1

26
doc/examples/osmo-bts.cfg Normal file
View File

@@ -0,0 +1,26 @@
!
! OsmoBTS () configuration saved from vty
!!
!
log stderr
logging color 0
logging timestamp 0
logging level all everything
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level abis notice
!
line vty
no login
!
bts 0
band 1800
ipa unit-id 1234 0
oml remote-ip 192.168.100.11

View File

@@ -1,33 +0,0 @@
!
! OsmoBTS () configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp info
logging level abis notice
!
line vty
no login
!
phy 0
instance 0
bts 0
band 1800
ipa unit-id 6969 0
oml remote-ip 10.1.2.3
trx 0
phy 0 instance 0

View File

@@ -1,26 +0,0 @@
!
! SysmoMgr (0.3.0.141-33e5) configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level temp info
logging level fw info
logging level find info
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
!
line vty
no login
!
sysmobts-mgr

View File

@@ -1,40 +0,0 @@
!
! OsmoBTS configuration example for CalypsoBTS
! https://osmocom.org/projects/baseband/wiki/CalypsoBTS
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl notice
logging level oml notice
logging level rll notice
logging level rr notice
logging level meas error
logging level pag error
logging level l1c error
logging level l1p error
logging level dsp error
logging level abis error
!
line vty
no login
!
phy 0
instance 0
osmotrx ip local 127.0.0.1
osmotrx ip remote 127.0.0.1
osmotrx legacy-setbsic
osmotrx fn-advance 20
osmotrx rts-advance 5
bts 0
oml remote-ip 127.0.0.1
ipa unit-id 6969 0
band 900
trx 0
phy 0 instance 0
nominal-tx-power 23

View File

@@ -1,35 +0,0 @@
!
! OsmoBTS () configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl notice
logging level oml notice
logging level rll notice
logging level rr notice
logging level meas error
logging level pag error
logging level l1c error
logging level l1p error
logging level dsp error
logging level abis error
!
line vty
no login
!
phy 0
instance 0
osmotrx ip local 127.0.0.1
osmotrx ip remote 127.0.0.1
bts 0
band 1800
ipa unit-id 6969 0
oml remote-ip 127.0.0.1
trx 0
phy 0 instance 0

View File

@@ -1,62 +0,0 @@
!
! OsmoBTS (0.4.0.216-bc49-dirty) configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp error
logging level pcu notice
logging level ho debug
logging level trx notice
logging level loop notice
logging level abis debug
logging level rtp notice
logging level sum error
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats error
!
line vty
no login
!
e1_input
e1_line 0 driver ipa
e1_line 0 port 0
no e1_line 0 keepalive
phy 0
instance 0
bts 0
band DCS1800
ipa unit-id 6969 0
oml remote-ip 127.0.0.1
rtp jitter-buffer 100
paging queue-size 200
paging lifetime 0
min-qual-rach 50
min-qual-norm -5
trx 0
power-ramp max-initial 23000 mdBm
power-ramp step-size 2000 mdB
power-ramp step-interval 1
ms-power-control osmo
phy 0 instance 0

View File

@@ -1,49 +0,0 @@
EXTRA_DIST = dtx.dot \
osmobts-abis.adoc \
osmobts-abis-docinfo.xml \
osmobts-usermanual.adoc \
osmobts-usermanual-docinfo.xml \
rtp-amr.adoc \
rtp-amr-docinfo.xml \
regen_doc.sh \
abis \
chapters \
vty
if BUILD_MANUALS
ASCIIDOC = osmobts-usermanual.adoc osmobts-abis.adoc rtp-amr.adoc
include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc
osmobts-usermanual.pdf: $(srcdir)/chapters/*.adoc
osmobts-abis.pdf: $(srcdir)/abis/*.adoc $(srcdir)/abis/*.msc
rtp-amr.pdf: $(srcdir)/dtx.dot
# NOTE: osmo-bts-omldummy has no VTY interface
VARIANTS = virtual
if ENABLE_SYSMOBTS
VARIANTS += sysmo
endif
if ENABLE_TRX
VARIANTS += trx
endif
if ENABLE_OCTPHY
VARIANTS += octphy
endif
if ENABLE_LC15BTS
VARIANTS += lc15
endif
if ENABLE_OC2GBTS
VARIANTS += oc2g
endif
# This is a significantly modified, multi-target adopted copy of
# $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc
include $(srcdir)/vty/Makefile.vty-reference.inc
OSMO_REPOSITORY = osmo-bts
include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.common.inc
endif

View File

@@ -1,23 +0,0 @@
msc {
bts [label="BTS"], bsc [label="BSC"];
bts => bsc [label="TCP Connect (Port 3002, OML)"];
bts box bsc [label="IPA CCM Identification (Port 3002)"];
bts <= bsc [label="OML Configuration of BTS via OML"];
...;
bts <= bsc [label="OML (TRX=0) IPA RSL CONNECT"];
bts => bsc [label="TCP Connect (Port 3003, RSL, TRX 0)"];
bts box bsc [label="IPA CCM Identification Port 3003"];
bts <= bsc [label="RSL BCCH filling (System Information)"];
bts <= bsc [label="RSL SACCH filling (SI 5/6)"];
...;
bts <= bsc [label="OML (TRX=1) IPA RSL CONNECT"];
bts => bsc [label="TCP Connect (Port 3003, RSL, TRX 1)"];
bts box bsc [label="IPA CCM Identification (Port 3003)"];
bts <= bsc [label="RSL SACCH filling (SI 5/6)"];
...;
bts <= bsc [label="OML (TRX=N) IPA RSL CONNECT"];
bts => bsc [label="TCP Connect (Port 3003, RSL, TRX N)"];
bts box bsc [label="IPA CCM Identification (Port 3003)"];
bts <= bsc [label="RSL SACCH filling (SI 5/6)"];
}

View File

@@ -1,23 +0,0 @@
msc {
hscale = "1.2";
phy,bts,pcu,bsc;
phy box bsc [ label = "PDCH Deactivation" ];
bsc => bts [ label = "IPAC PDCH DEACT" ];
--- [ label = "Disconnect PDTCH" ];
bts => pcu [ label = "info ind (Deactivate)" ];
pcu => bts [ label = "chan Deactivate request" ];
bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ];
phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ];
bts => phy [ label = "L1 chan Disconnect PDTCH" ];
phy -> bts [ label = "L1 chan Disconnect confirm" ];
--- [ label = "Connect TCH" ];
bts => phy [ label = "L1 chan Connect TCH" ];
phy -> bts [ label = "L1 chan Connect confirm" ];
bts => bsc [ label = "IPAC PDCH DEACT ACK" ];
phy box bsc [ label = "Now BSC may use TCH (example)" ];
bsc => bts [ label = "Activate TCH/F" ];
bts => phy [ label = "L1 chan Activate SAPIs" ];
--- [ label = "Voice call..." ];
}

View File

@@ -1,22 +0,0 @@
msc {
hscale = "1.2";
phy,bts,pcu,bsc;
--- [ label = "...Voice call ends" ];
bsc => bts [ label = "Deactivate TCH/F" ];
bts => phy [ label = "L1 chan Deactivate SAPIs" ];
phy box bsc [ label = "PDCH Activation" ];
bsc => bts [ label = "IPAC PDCH ACT" ];
--- [ label = "Disconnect TCH" ];
bts => phy [ label = "L1 chan Disconnect TCH" ];
phy -> bts [ label = "L1 chan Disconnect confirm" ];
--- [ label = "Connect PDTCH" ];
bts => phy [ label = "L1 chan Connect PDTCH" ];
phy -> bts [ label = "L1 chan Connect confirm" ];
bts => pcu [ label = "info ind (Activate)" ];
pcu => bts [ label = "chan Activate request" ];
bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ];
phy -> bts [ label = "L1 chan Activate SAPIs confirm" ];
bts => bsc [ label = "IPAC PDCH ACT ACK" ];
}

View File

@@ -1,34 +0,0 @@
msc {
hscale = "1.5";
phy,bts,pcu,bsc;
bts => bsc [ label = "RSL Chan Requested" ];
phy box bsc [ label = "TS is in PDCH mode, deactivate" ];
bsc => bts [ label = "RSL RF Channel Release (PDCH)" ];
bts => pcu [ label = "Info Ind (Deactivate)" ];
pcu => bts [ label = "Chan Deactivate request" ];
bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ];
phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ];
bts -> bsc [ label = "RSL RF Channel Release Ack (PDCH)" ];
phy box bsc [ label = "Activate TCH/H" ];
bsc => bts [ label = "RSL Channel Activation (TCH/H)" ];
--- [ label = "BTS notices: chan still connected as PDTCH, reconnect" ];
bts => phy [ label = "L1 chan Disconnect PDTCH" ];
phy -> bts [ label = "L1 chan Disconnect confirm" ];
bts => phy [ label = "L1 chan Connect TCH/H" ];
phy -> bts [ label = "L1 chan Connect confirm" ];
--- [ label = "chan reconnect as TCH/H complete" ];
bts => phy [ label = "L1 chan Activate SAPIs" ];
bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ];
--- [ label = "Voice call 1 commences..." ];
phy box bsc [ label = "A second voice call is requested" ];
bts => bsc [ label = "RSL Chan Requested" ];
phy box bsc [ label = "BSC finds second slot on dynamic TS in TCH/H mode" ];
bsc => bts [ label = "RSL Channel Activation (TCH/H)" ];
bts => phy [ label = "L1 chan Activate SAPIs" ];
bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ];
--- [ label = "Voice call 2 commences..." ];
}

View File

@@ -1,31 +0,0 @@
msc {
hscale = "1.5";
phy,bts,pcu,bsc;
--- [ label = "...Voice call 1 ends" ];
bts => bsc [ label = "Release Ind" ];
bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ];
bts => phy [ label = "L1 chan Deactivate SAPIs" ];
bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ];
--- [ label = "BSC notices: one chan still in use"];
--- [ label = "...Voice call 2 ends" ];
bts => bsc [ label = "Release Ind" ];
bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ];
bts => phy [ label = "L1 chan Deactivate SAPIs" ];
bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ];
phy box bsc [ label = "If all channels on TS are released, PDCH Activation" ];
bsc => bts [ label = "RSL Channel Activation (PDCH)" ];
bts -> bsc [ label = "RSL Channel Activation Ack (PDCH) (unconditionally)" ];
--- [ label = "BTS notices: chan still connected as TCH/H, reconnect" ];
bts => phy [ label = "L1 chan Disconnect TCH/H" ];
phy -> bts [ label = "L1 chan Disconnect confirm" ];
bts => phy [ label = "L1 chan Connect PDTCH" ];
phy -> bts [ label = "L1 chan Connect confirm" ];
--- [ label = "chan reconnect as PDTCH complete" ];
bts => pcu [ label = "Info Ind (Activate)" ];
pcu => bts [ label = "chan Activate request" ];
bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ];
phy -> bts [ label = "L1 chan Activate SAPIs confirm" ];
}

View File

@@ -1,106 +0,0 @@
== IPA Multiplex
The ETSI/3GPP specifications for A-bis transport (ETSI/3GPP TS 08.56)
specify the transmission of RSL and OML messages over a LAPD based
framing on top of 64kBit/s signalling times slots (B-channels) on E1
lines.
OsmoBTS does not implement this LAPD based transport, but instead
implements A-bis over IP in a flavor first observed by ip.access nanoBTS
products. The OsmoBTS implementation is a clean-room re-implementation
based on the observation and dissection of protocol traces.
LAPD as used in E1 signalling channels provides in-order transmission
and reliable delivery. This is why TCP was chosen as Layer 4 transport
protocol on top of IP. TCP however, is a stream based transport
protocol, which doesn't preserve the boundaries of messages.
To work around this shortcoming, an additional framing layer called the
IPA multiplex was introduced between TCP and the RSL and OML messages.
.Protocol Stacking
[width="30%"]
|===
|RSL + OML (this document)
|IPA (this document)
|TCP (IETF RFC 793)
|IP (IETF RFC 791)
|Ethernet (IEEE 802.3)
|===
=== IPA Header
Each higher-layer PDU is encapsulated by a three-byte IPA header with
the following structure:
.IPA Header Structure
[options="header",cols="10%,15%,15%,60%"]
|===
|Offset (Octets)|Length|Name|Description
|0|2|Length|Length of the variable-length payload section in network
byte order (excluding the length of the IPA Header)
|2|1|Stream Identifier|Identifies the stream of the payload
|3|Variable|Payload|higher-layer PDU (i.e. RSL or OML message)
|===
=== IPA Stream Identifiers
The IPA Stream Identifier serves to differentiate different streams
within the multiplex. In the context of A-bis, it can be seen as
analogous to the LAPD TEI on classic A-bis over E1.
The following IPA stream identifiers are being used in A-bis/IP:
.IPA Stream Identifiers
[options="header",width="70%",cols="20%,20%,60%"]
|===
|Value (Hex)|Name|Description
|0x00|RSL|A-bis RSL according to this document, TRX 0
|0x01|RSL|A-bis RSL according to this document, TRX 1
|0x0n|RSL|A-bis RSL according to this document, TRX n
|0xfe|CCM|IPA Connection Management
|0xff|OML|A-bis OML according to this document
|===
=== IPA Connection Management (CCM)
The IPA Connection Management is a sub-layer underneath the IPA
multiplex which is used to manage the connection itself. It supports
functions like Identity Management and Keep-Alive.
==== Identity Management
When a BTS connects to the BSC, the BSC must identify the connected BTS
somehow. In ETSI/3GPP A-bis, the E1 multiplex + signalling timeslot
number is used for this. In IP, there is no similar usable identity.
Hence, the Unit ID is used for this purpose.
.Procedure for IPA peer identification is as follows
[options="header",cols="20%,80%"]
|===
|Direction|Operation
|BTS -> BSC|BTS connects the TCP connection to be used with IPA
|BTS <- BSC|BSC requests BTS identity with ID_GET
|BTS -> BSC|BTS responds BTS Unit ID with ID_RESP
|BTS <- BSC|BSC responds with ID_ACK, if the Unit ID is known to the BSC
|===
Following the above peer identification procedure, transfer of
higher-level messages such as OML or RSL commences.
==== IPA CCM Messages
IPA CCM supports the following messages
.IPA CCM Messages
[options="header"]
[cols="10%,15%,75%"]
|===
|Value|Name|Purpose
|0x00|PING|Request a PONG from the peer
|0x01|PONG|Response to a PING
|0x04|ID_GET|Request Identity from peer
|0x05|ID_RESP|Response to ID_GET
|0x06|ID_ACK|Identity Acknowledged
|===

View File

@@ -1,26 +0,0 @@
msc {
bts [label="BTS"], bsc [label="BSC"];
# this is for the BTS Object
--- [label="Initial state after establishing OML"];
bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"];
--- [label="MO requests software activation"];
bts => bsc [label="SW Activate Req"];
bts <= bsc [label="SW Activate Req Ack"];
--- [label="BTS instructs BTS to activate software"];
bts <= bsc [label="Activate SW"];
bts => bsc [label="Activate SW Ack"];
--- [label="MO reports new state after SW activation"];
bts => bsc [label="STATE CHG REP (Disabled/Dependency)"];
bts => bsc [label="SW Activated Report"];
--- [label="Configure the MO with its attributes"];
bts <= bsc [label="Set BTS Attributes"];
bts => bsc [label="Set BTS Attributes Ack"];
bts <= bsc [label="OPSTART"];
bts => bsc [label="OPSTART ACK"];
--- [label="As this object is locked, we need to unlock it"];
bts <= bsc [label="Change Adm State (Unlocked)"];
bts => bsc [label="Change Adm State Ack (Unlocked)"];
bts => bsc [label="STATE CHG REP (Disabled/Dependency/Unlocked)"];
--- [label="Initialize Radio Transceiver, Radio Carrier, Channels"];
bts => bsc [label="STATE CHG REP (Enabled/OK)"];
}

View File

@@ -1,24 +0,0 @@
msc {
bts [label="Radio Carrier"], bsc [label="BSC"];
--- [label="Initial state after establishing OML"];
bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"];
--- [label="MO requests software activation"];
bts => bsc [label="SW Activate Req"];
bts <= bsc [label="SW Activate Req Ack"];
--- [label="BTS instructs BTS to activate software"];
bts <= bsc [label="Activate SW"];
bts => bsc [label="Activate SW Ack"];
--- [label="MO reports new state after SW activation"];
bts => bsc [label="STATE CHG REP (Disabled/Offline)"];
bts => bsc [label="SW Activated Report"];
--- [label="Configure the MO with its attributes"];
bts <= bsc [label="Set Radio Carrier Attributes"];
bts => bsc [label="Set Radio Carrier Attributes Ack"];
bts <= bsc [label="OPSTART"];
bts => bsc [label="OPSTART ACK"];
--- [label="As this object is locked, we need to unlock it"];
bts <= bsc [label="Change Adm State (Unlocked)"];
bts => bsc [label="Change Adm State Ack (Unlocked)"];
bts => bsc [label="STATE CHG REP (Disabled/OK/Unlocked)"];
bts => bsc [label="STATE CHG REP (Enabled)"];
}

View File

@@ -1,20 +0,0 @@
msc {
bts [label="Channel"], bsc [label="BSC"];
--- [label="Initial state after establishing OML"];
bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"];
--- [label="MO reports new state after SW activation of Baseband Transceiver"];
bts => bsc [label="STATE CHG REP (Disabled/Dependency)"];
bts => bsc [label="SW Activated Report"];
--- [label="Configure the MO with its attributes"];
bts <= bsc [label="Set Channel Attributes"];
bts => bsc [label="Set Channel Attributes Ack"];
bts <= bsc [label="OPSTART"];
bts => bsc [label="OPSTART ACK"];
--- [label="As this object is locked, we need to unlock it"];
bts <= bsc [label="Change Adm State (Unlocked)"];
bts => bsc [label="Change Adm State Ack (Unlocked)"];
bts => bsc [label="STATE CHG REP (Disabled/Dependency/Unlocked)"];
--- [label="Initialize Radio Carrier / Baseband Transceiver"];
bts => bsc [label="STATE CHG REP (Disabled/Offline)"];
bts => bsc [label="STATE CHG REP (Enabled/OK)"];
}

View File

@@ -1,17 +0,0 @@
msc {
bts [label="Site Manager"], bsc [label="BSC"];
# this is for the Site Manager Object
--- [label="Initial state after establishing OML"];
bts => bsc [label="STATE CHG REP (Disabled/Notinstalled)"];
--- [label="MO requests software activation"];
bts => bsc [label="SW Activate Req"];
bts <= bsc [label="SW Activate Req Ack"];
--- [label="BTS instructs BTS to activate software"];
bts <= bsc [label="Activate SW"];
bts => bsc [label="Activate SW Ack"];
--- [label="MO reports new state after SW activation"];
bts => bsc [label="STATE CHG REP (Enabled)"];
bts => bsc [label="SW Activated Report"];
bts <= bsc [label="OPSTART"];
bts => bsc [label="OPSTART ACK"];
}

View File

@@ -1,23 +0,0 @@
msc {
bts [label="Baseband Transceiver"], bsc [label="BSC"];
--- [label="Initial state after establishing OML"];
bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"];
--- [label="MO requests software activation"];
bts => bsc [label="SW Activate Req"];
bts <= bsc [label="SW Activate Req Ack"];
--- [label="BTS instructs BTS to activate software"];
bts <= bsc [label="Activate SW"];
bts => bsc [label="Activate SW Ack"];
--- [label="MO reports new state after SW activation"];
bts => bsc [label="STATE CHG REP (Disabled/Dependency)"];
bts => bsc [label="SW Activated Report"];
--- [label="BSC requests RSL establishment"];
bts <= bsc [label="IPA RSL Connect"];
bts => bsc [label="IPA RSL Connect ACK"];
bts <= bsc [label="OPSTART"];
bts => bsc [label="OPSTART ACK"];
--- [label="As this object is locked, we need to unlock it"];
bts <= bsc [label="Change Adm State (Unlocked)"];
bts => bsc [label="Change Adm State Ack (Unlocked)"];
bts => bsc [label="STATE CHG REP (Disabled/Dependency/Unlocked)"];
}

View File

@@ -1,34 +0,0 @@
msc {
hscale = 2;
chan [label="Channel"], rc [label="Radio Carrier"], smg [label="Site Manager"], bts [label="BTS"], bsc [label="BSC"];
bts => bsc [label="TCP Connect (Port 3003, OML)"];
bts box bsc [label="IPA CCM Identification (Port 3003)"];
|||;
smg => bsc [label="(Site Mgr) STATE CHG REP (Disabled/NotInstalled)"];
bts => bsc [label="(BTS) STATE CHG REP (Disabled/NotInstalled/Locked)"];
rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 0) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 1) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 2) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 3) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 4) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 5) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 6) STATE CHG REP (Disabled/NotInstalled/Locked)"];
chan => bsc [label="(Ch 7) STATE CHG REP (Disabled/NotInstalled/Locked)"];
rc => bsc [label="(RC) STATE CHG REP (Disabled/NotInstalled/Locked)"];
bts => bsc [label="(GPRS-NSE) STATE CHG REP (Disabled/NotInstalled/Locked)"];
bts => bsc [label="(GPRS-CELL) STATE CHG REP (Disabled/NotInstalled/Locked)"];
bts => bsc [label="(GPRS-NSVC0) STATE CHG REP (Disabled/NotInstalled/Locked)"];
bts => bsc [label="(GPRS-NSVC1) STATE CHG REP (Disabled/NotInstalled/Locked)"];
|||;
smg => bsc [label="(Site Mgr) SW Activate Req"];
smg <= bsc [label="(Site Mgr) SW Activate Req Ack"];
smg <= bsc [label="(Site Mgr) Activate SW"];
smg => bsc [label="(Site Mgr) Activate SW Ack"];
smg => bsc [label="(Site Mgr) STATE CHG REP (Enabled)"];
smg => bsc [label="(Site Mgr) SW Activated Report"];
smg <= bsc [label="(Site Mgr) OPSTART"];
smg => bsc [label="(Site Mgr) OPSTART ACK"];
}

View File

@@ -1,50 +0,0 @@
msc {
hscale = 2;
chan [label="Channel"], rc [label="Radio Carrier"], bts [label="BTS"], bsc [label="BSC"];
bts box bsc [label="OML Connect + Site Manager Init"];
...;
bts => bsc [label="(BTS) SW Activate Req"];
bts <= bsc [label="(BTS) SW Activate Req Ack"];
bts <= bsc [label="(BTS) Activate SW"];
bts => bsc [label="(BTS) Activate SW Ack"];
bts => bsc [label="(BTS) STATE CHG REP (Disabled/Dependency)"];
bts => bsc [label="(BTS) SW Activated Report"];
|||;
rc => bsc [label="(TRANSC) SW Activate Req"];
rc => bsc [label="(RC) SW Activated Req"];
|||;
bts <= bsc [label="(BTS) Set BTS Attributes"];
bts => bsc [label="(BTS) Set BTS Attributes Ack"];
bts <= bsc [label="(BTS) OPSTART"];
bts => bsc [label="(BTS) OPSTART Ack"];
|||;
bts <= bsc [label="(BTS) Change Adm State (Unlocked)"];
bts => bsc [label="(BTS) Change Adm State ACK (Unlocked)"];
bts => bsc [label="(BTS) STATE CHG REP (Disabled/Dependency/Unlcoked)"];
|||;
rc <= bsc [label="(TRANSC) SW Activate Req Ack"];
rc <= bsc [label="(TRANSC) Activate SW"];
rc => bsc [label="(TRANSC) Activate SW Ack"];
rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/Dependency)"];
rc => bsc [label="(TRANSC) SW Activated Report"];
chan => bsc [label="(CHAN 0) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 1) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 2) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 3) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 4) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 5) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 6) STATE CHG REP (Disabled/Dependency)"];
chan => bsc [label="(CHAN 7) STATE CHG REP (Disabled/Dependency)"];
|||;
chan => bsc [label="(CHAN 0) SW Activated Report"];
chan => bsc [label="(CHAN 1) SW Activated Report"];
chan => bsc [label="(CHAN 2) SW Activated Report"];
chan => bsc [label="(CHAN 3) SW Activated Report"];
chan => bsc [label="(CHAN 4) SW Activated Report"];
chan => bsc [label="(CHAN 5) SW Activated Report"];
chan => bsc [label="(CHAN 6) SW Activated Report"];
chan => bsc [label="(CHAN 7) SW Activated Report"];
}

View File

@@ -1,51 +0,0 @@
msc {
hscale = 2;
chan [label="Channel"], rc [label="Radio Carrier"], bts [label="BTS"], bsc [label="BSC"];
...;
rc <= bsc [label="(RC) SW Activate Req Ack"];
rc <= bsc [label="(RC) Activate SW"];
rc => bsc [label="(RC) Activate SW Ack"];
rc => bsc [label="(RC) STATE CHG REP (Disabled/Offline)"];
rc => bsc [label="(RC) SW Activated Report"];
rc <= bsc [label="(TRANSC) IPA RSL Connect"];
rc => bsc [label="(TRANSC) IPA RSL Connect Ack"];
rc <= bsc [label="(TRANSC) OPSTART"];
rc => bsc [label="(TRANSC) OPSTART Ack"];
rc <= bsc [label="(TRANSC) Change Adm State (Unlocked)"];
rc => bsc [label="(TRANSC) Change Adm State Ack (Unlocked)"];
rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/Dependency/Unlocked)"];
|||;
chan <= bsc [label="(CHAN 0) Set Channel Attributes"];
chan => bsc [label="(CHAN 0) Set Channel Attributes Ack"];
chan <= bsc [label="(CHAN 0) OPSTART"];
chan => bsc [label="(CHAN 0) OPSTART Ack"];
chan <= bsc [label="(CHAN 0) Change Adm State (Unlocked)"];
chan => bsc [label="(CHAN 0) Change Adm State Ack (Unlocked)"];
chan => bsc [label="(CHAN 0) STATE CHG REP (Disabled/Dependency/Unlocked)"];
...;
chan <= bsc [label="(CHAN 7) Set Channel Attributes"];
chan => bsc [label="(CHAN 7) Set Channel Attributes Ack"];
chan <= bsc [label="(CHAN 7) OPSTART"];
chan => bsc [label="(CHAN 7) OPSTART Ack"];
chan <= bsc [label="(CHAN 7) Change Adm State (Unlocked)"];
chan => bsc [label="(CHAN 7) Change Adm State Ack (Unlocked)"];
chan => bsc [label="(CHAN 7) STATE CHG REP (Disabled/Dependency/Unlocked)"];
|||;
rc <= bsc [label="(RC) Set Radio Carrier Attributes"];
rc => bsc [label="(RC) Set Radio Carrier Attributes Ack"];
rc <= bsc [label="(RC) OPSTART"];
rc => bsc [label="(RC) OPSTART Ack"];
rc <= bsc [label="(RC) Change Adm State (Unlocked)"];
rc => bsc [label="(RC) Change Adm State Ack (Unlocked)"];
rc => bsc [label="(RC) STATE CHG REP (Disabled/OK/Unlocked)"];
rc => bsc [label="(RC) STATE CHG REP (Enabled)"];
rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/Offline)"];
rc => bsc [label="(TRANSC) STATE CHG REP (Enabled/OK)"];
|||;
chan => bsc [label="(CHAN 0) STATE CHG REP (Disabled/Offline)"];
chan => bsc [label="(CHAN 0) STATE CHG REP (Enabled/OK)"];
|||;
bts => bsc [label="(BTS) STATE CHG REP (Enabled/OK)"];
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@
msc {
bts [label="TRX"], bsc [label="BSC"];
bts => bsc [label="TCP Connect (Port 3003, RSL)"];
bts box bsc [label="IPA CCM Identification (Port 3003)"];
|||;
bts <= bsc [label="BCCH Information (SI1)"];
bts <= bsc [label="BCCH Information (SI2)"];
...;
bts <= bsc [label="BCCH Information (SI3)"];
bts <= bsc [label="BCCH Information (SI4)"];
|||;
bts <= bsc [label="SACCH FILLING (SI5)"];
...;
bts <= bsc [label="SACCH FILLING (SI6)"];
|||;
bts => bsc [label="RF Resource Indication"];
...;
bts => bsc [label="RF Resource Indication"];
...;
}

View File

@@ -1,16 +0,0 @@
msc {
bts [label="TRX"], bsc [label="BSC"];
bts => bsc [label="TCP Connect (Port 3003, RSL)"];
bts box bsc [label="IPA CCM Identification (Port 3003)"];
|||;
bts <= bsc [label="SACCH FILLING (SI5)"];
...;
bts <= bsc [label="SACCH FILLING (SI6)"];
|||;
bts => bsc [label="RF Resource Indication"];
...;
bts => bsc [label="RF Resource Indication"];
...;
}

View File

@@ -1,56 +0,0 @@
msc {
hscale = 2;
ms [label="MS"], bts [label="BTS"], bsc [label="BSC"], Msc [label="MSC"], mgw [label="MGW"];
ms => bts [label="L1 RACH burst"];
bts => bsc [label="RSL CHAN RQD"];
bts <= bsc [label="RSL CHAN ACT"];
bts => bsc [label="RSL CHAN ACT ACK"];
bts <= bsc [label="RSL IMM ASS CMD (RR IMM ASS)"];
ms <= bts [label="RR IMMEDIATE ASSIGN"];
ms => bts [label="LAPDm SABM (CM SERVICE REQ)"];
ms <= bts [label="LAPDm FIXME"];
bts => bsc [label="RSL ESTABLISH IND (CM SERVICE REQ)"];
bsc => Msc [label="CR (BSSAP COMPLETE L3 (CM SERVICE REQ))"];
...;
ms box Msc [label="MM Common Procedures (INFO, ID, AUTH, CIPH)"];
...;
ms => bts [label="CC SETUP"];
bts => bsc [label="RSL DATA IND (CC SETUP)"];
bsc => Msc [label="DT1 (DTAP (CC SETUP))"];
...;
ms box Msc [label="CC Signalling"];
...;
bsc <= Msc [label="BSSAP ASSIGNMENT CMD (TCH)"];
bts <= bsc [label="RSL IPA CRCX", id="1"];
bts => bsc [label="RSL IPA CRCX ACK (IP/Port @ BTS)"];
bsc => Msc [label="FIXME"];
Msc => mgw [label="FIXME"];
bts <- mgw [label="Start RTP + RTCP UDP Flows"];
bts <= bsc [label="RSL DATA REQ (RR CHAN MOD MODIFY)"];
ms <= bts [label="RR CHAN MOD MODIFY"];
ms => bts [label="RR CHAN MOD MODIFY ACK"];
bts => bsc [label="RSL DATA IND (RR CHAN MOD MODIFY ACK)"];
|||;
bts <= bsc [label="RSL MODE MODIFY REQ"];
bts => bsc [label="RSL MODE MODIFY ACK"];
Msc <= mgw [label="FIXME"];
bsc <= Msc [label="FIXME"];
bts <= bsc [label="RSL IPA MDCX (IP/Port @ MGW)", id="2"];
bts => bsc [label="RSL IPA MDCX ACK"];
bts -> mgw [label="Start RTP + RTCP UDP Flows"];
ms box mgw [label="Active Voice Call"];
bts => bsc [label="RSL MEAS RES"];
...;
bts <= bsc [label="RSL IPA DLCX"];
bts => bsc [label="RSL IPA DLCX ACK"];
bts -x mgw [label="Stop RTP + RTCP UDP Flows"];
bts <= bsc [label="RSL RF CHAN REL"];
bts => bsc [label="RSL RF CHAN REL ACK"];
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,33 +0,0 @@
== User-Plane Traffic via RTP
RTP (Realtime Transfer Protocol) is a protocol for streaming audio
and video data. It is specified by IETF RFC 1889.
OsmoBTS A-bis/IP implements RTP as transport medium for circuit-switched
user-plane traffic, contrary to the E1 sub-slot based transport
specified in 3GPP TS 08.60.
The RTP transport endpoint parameters are configured using the RSL User
Plane Transport Management procedures described in <<user_plane_txp_mgmt>>.
RTCP is implemented in addition to RTP, on a UDP port number of the RTP
port incremented by one.
=== RTP Payload Formats
The RTP payload format depends on the voice codec used on the radio
channel. The OsmoBTS is simply passing the GSM speech frames between
the Um radio interface channels and the RTP payload (and vice-versa).
No transcoding function is implemented in the BTS!
.RTP Payload formats
[options="header",width="60%",cols="15%,15%,70%"]
|===
| TCH | Codec | RTP payload format specification
| TCH/F | FR | IETF RFC 3551 Section 4.5.8
| TCH/F | EFR | IETF RFC 3551 Section 4.5.9
| TCH/F | AMR | IETF RFC 4867
| TCH/H | HR | IETF RFC 5993
| TCH/H | AMR | IETF RFC 4867
|===

View File

@@ -1,120 +0,0 @@
== OsmoBTS software architecture
=== OsmoBTS PHY interface abstraction
The OsmoBTS PHY interface serves as an internal abstraction layer
between given PHY hardware (as provided by the bts_model) and the actual
logical transceivers (TRXs) of a BTS inside the OsmoBTS code base.
==== PHY link
A PHY link is a physical connection / link towards a given PHY. This
might be, for example,
* a set of file descriptors to device nodes in the /dev/ directory
(sysmobts, litecell15)
* a packet socket for sending raw Ethernet frames to an OCTPHY
* a set of UDP sockets for interacting with OsmoTRX
Each PHY interface has a set of attribute/parameters and a list of 1 to
n PHY instances.
PHY links are numbered 0..n globally inside OsmoBTS.
Each PHY link is configured via the VTY using its individual top-level
vty node. Given the different bts-model / phy specific properties, the
VTY configuration options (if any) of the PHY instance differ between
BTS models.
The PHY links and instances must be configured above the BTS/TRX nodes
in the configuration file. If the file is saved via the VTY, the code
automatically ensures this.
==== PHY instance
A PHY instance is an instance of a PHY, accessed via a PHY link.
In the case of osmo-bts-sysmo and osmo-bts-trx, there is only one
instance in every PHY link. This is due to the fact that the API inside
that PHY link does not permit for distinguishing multiple different
logical TRXs.
Other PHY implementations like the OCTPHY however do support addressing
multiple PHY instances via a single PHY link.
PHY instances are numbered 0..n inside each PHY link.
Each PHY instance is configured via the VTY as a separate node beneath each
PHY link. Given the different bts-model / phy specific properties, the
VTY configuration options (if any) of the PHY instance differ between
BTS models.
==== Mapping PHY instances to TRXs
Each TRX node in the VTY must use the 'phy N instance M' command in
order to specify which PHY instance is allocated to this specific TRX.
=== Internal control flow
==== start-up / sequencing during OsmoBTS start
.Control flow at OsmoBTS start-up procedure
[options="header",cols="10%,35%,55%"]
|===
| section | function | description
| bts-specific | main() | Entering main() from glibc
| common | bts_main() | initialization of talloc contexts
| common | bts_log_init() | initialization of logging
| common | handle_options() | common option parsing
| bts-specific | bts_model_handle_options() | model-specific option parsing
| common | gsm_bts_alloc() | allocation of BTS/TRX/TS data structures
| common | vty_init() | Initialziation of VTY core, libosmo-abis and osmo-bts VTY
| common | main() | Setting of scheduler RR priority (if configured)
| common | main() | Initialization of GSMTAP (if configured)
| common | bts_init() | configuration of defaults in bts/trx/s object
| bts-specific | bts_model_init | ?
| common | abis_init() | Initialization of libosmo-abis
| common | vty_read_config_file() | Reading of configuration file
| bts-specific | bts_model_phy_link_set_defaults() | Called for every PHY link created
| bts-specific | bts_model_phy_instance_set_defaults() | Called for every PHY Instance created
| common | bts_controlif_setup() | Initialization of Control Interface
| bts-specific | bts_model_ctrl_cmds_install() | Install model-specific control interface commands
| common | telnet_init_default() | Initialization of telnet interface
| common | pcu_sock_init() | Initialization of PCU socket
| common | main() | Installation of signal handlers
| common | abis_open() | Start of the A-bis connection to BSC
| common | phy_links_open() | Iterate over list of configured PHY links
| bts-specific | bts_model_phy_link_open() | Open each of the configured PHY links
| bts-specific | bts_model_phy_link_close() | Close each of the configured PHY links
| common | osmo_daemonize() | Fork as daemon in background (if configured)
| common | bts_main() | Run main loop until global variable quit >= 2
|===
==== At time of OML establishment
.Control flow at time of OML establishment
[options="header",cols="10%,35%,55%"]
|===
| section | function | description
| bts-specific | bts_model_oml_estab() | Called by core once OML link is established
| bts-specific | bts_model_check_oml() | called each time OML sets some attributes on a MO, checks if attributes are valid
| bts-specific | bts_model_apply_oml() | called each time OML sets some attributes on a MO, stores attribute contents in data structures
| bts-specific | bts_model_opstart() | for NM_OC_BTS, NM_OC_SITE_MANAGER, NM_OC_GPRS_NSE, NM_OC_GPRS_CELL, NMO_OC_GPRS_NSVC
| bts-specific | bts_model_opstart() | for NM_OC_RADIO_CARRIER for each trx
| bts-specific | bts_model_opstart() | for NM_OC_BASEB_TRANSC for each trx
| bts-specific | bts_model_opstart() | for NM_OC_CHANNEL for each timeslot on each trx
| bts-specific | bts_model_change_power() | change transmit power for each trx (power ramp-up/ramp-down)
|===
==== At time of RSL connection loss
.Control flow at time of RSL connection loss
[options="header",cols="10%,35%,55%"]
|===
| section | function | description
| bts-specific | bts_model_abis_close() | called when either one of the RSL links or the OML link are down
|===

View File

@@ -1,483 +0,0 @@
[[osmobts_hardware_support]]
== OsmoBTS hardware support
OsmoBTS consists of a _common_ part that applies to all BTS models as well as
_hardware-specific_ parts for each BTS model. The hardware specific parts are
generally referred to as the _bts_model_ code.
The common part includes the core BTS architecture as well as code for
implementing the external interfaces such as Abis, control, PCU socket and
GSMTAP.
The bts_model parts include support for driving one particular
implementation of a GSM physical layer (PHY). Such a physical layer
implementation can come in many forms. Sometimes it runs on a general
purpose CPU, sometimes on a dedicated ARM core, a dedicated DSP, a
combination of DSP and FPGA.
Every PHY implementation offers some kind of primitives by which the PHY
can be controlled, and by which the PHY exchanges data with the higher
layers of the protocol stack in the OsmoBTS code.
The PHY-specific primitives are encapsulated in the bts_model code, and
offered as a PHY-independent _L1SAP_ interface towards the common part of
OsmoBTS.
In addition, each bts_model implements a set of functions that the
common part calls. Those functions are pre-fixed by _bts_model__.
Each bts_model may offer
* model-specific VTY commands for both configuration and run-time interaction
* model-specific command line arguments
* model-specific control interface commands
== `osmo-bts-sysmo` for sysmocom sysmoBTS
The sysmocom sysmoBTS is a range of GSM BTSs based around an embedded
system implementing the PHY in a combination of DSP+FPGA. The PHY is
configured by a set of primitives described by header files. Those
primitives are exchanged over a set of message queues exposed on the
Linux-running ARM core via device nodes in `/dev/msgq/`. Internally,
the message queues map to shared memory between the Linux-running ARM
core and the DSP running the PHY implementation.
The OsmoBTS bts_model code for the sysmoBTS can be found in the
`src/osmo-bts-sysmo` sub-directory of the OsmoBTS code base.
`osmo-bts-sysmo` has been the primary target platform for
OsmoBTS for many years and is thus the most feature-complete and mature
platform supported by OsmoBTS at this point.
The sysmoBTS PHY supports a direct PHY interface to OsmoPCU, reducing
the latency and amount of primitives that OsmoBTS would otherwise need
to pass through from the PHY message queues to the PCU socket and
vice-versa.
=== `osmo-bts-sysmo` specific command line arguments
*--dsp-trace 'DSPMASK'*::
Set the DSP trace flags (a single hexadecimal 32bit value).
This has been deprecated by VTY based commands, see
<<osmo-bts-sysmo-dsp-trace>> for further information.
*--pcu-direct*::
Indicate that an external PCU (e.g. OsmoPCU) will directly
open the DSP message queues to the PHY / PH-SAP, and only MPH
primitives are passed via OsmoBTS.
=== `osmo-bts-sysmo` specific VTY commands
For a auto-generated complete syntax reference of the VTY commands,
please see the associated _OsmoBTS VTY reference manual_
<<vty-ref-osmobts>>. The section
below only lists the most important commands.
==== at the 'SHOW' node
===== `show trx 0 clock-source`
Display the currently active clock source configuration for the TRX
[[osmo-bts-sysmo-dsp-trace]]
===== `show trx 0 dsp-trace-flags`
Show the currently active DSP trace flags for the TRX
===== `trx 0 dsp-trace-flag`
Use this command to enable/disable/configure the DSP tracing flags that
define what debug messages will appear on `/dev/rtfifo/dsp_trace`.
==== at the 'ENABLE' node
===== `trx 0 tx-power <-110-100>`
Change the current TRX transmit power to the given value in dBm.
===== `trx 0 rf-clock-info reset`
Part of the clock calibration procedure:
Reset the clock correction value.
===== `trx 0 rf-clock-info correct`
Part of the clock calibration procedure:
Apply the current measured correction value between the reference clock
and the local clock.
==== at the 'PHY instance' node
==== `clock-calibration eeprom`
Obtain clock calibration value from EEPROM.
==== `clock-calibration default`
Use hardware default clock calibration value.
==== `clock-calibration <-4095-4095>`
Use specified clock calibration value (not EEPROM/default).
==== `clock-source (tcxo|ocxo|ext|gps)`
Specify the clock source for the PHY:
tcxo::
Use the TCXO. This is the default on sysmoBTS 2050.
ocxo::
Use the OCXO (only valid on units equipped with OCXO). This is
the default on all sysmoBTS 1002/1020/1100 and SOB-BTS.
ext::
Use the external clock input.
gps::
Use the clock derived from GPS. You shouldn't use this clock
directly, but rather use the TCXO and regularly re-calibrate
against GPS.
==== `trx-calibration-path PATH`
Use calibration files from the given 'PATH', rather tan calibration
values from the EEPROM.
=== `osmo-bts-sysmo` specific control interface commands
==== trx.0.clock-info
Obtain information on the current clock status:
----
bsc_control.py -d localhost -p 4238 -g trx.0.clock-info
Got message: GET_REPLY 1 trx.0.clock-info -100,ocxo,0,0,gps
----
which is to be interpreted as:
* current clock correction value is -100 ppb
* current clock source is OCXO
* deviation between clock source and calibration source is 0 ppb
* resolution of clock error measurement is 0 ppt (0 means no result yet)
* current calibration source is GPS
When this attribute is set, any value passed on is discarded, but the clock
calibration process is re-started.
==== trx.0.clock-correction
This attribute can get and set the current clock correction value:
----
bsc_control.py -d localhost -p 4238 -g trx.0.clock-correction
Got message: GET_REPLY 1 trx.0.clock-correction -100
----
----
bsc_control.py -d localhost -p 4238 -s trx.0.clock-correction -- -99
Got message: SET_REPLY 1 trx.0.clock-correction success
----
== `osmo-bts-trx` for OsmoTRX
OsmoTRX is a C-language implementation of the GSM radio modem,
originally developed as the 'Transceiver' part of OpenBTS. This radio
modem offers an interface based on top of UDP streams.
The OsmoBTS bts_model code for OsmoTRX is called
`osmo-bts-trx`. It implements the UDP stream interface of
OsmoTRX, so both parts can be used together to implement a complete GSM
BTS based on general-purpose computing SDR.
As OsmoTRX is general-purpose software running on top of Linux, it is thus not
tied to any specific physical hardware. At the time of this writing, OsmoTRX
supports a variety of Lime Microsystems and Ettus USRP SDRs via the UHD driver,
as well as the Fairwaves UmTRX and derived products.
OsmoTRX is not a complete GSM PHY but 'just' the radio modem. This
means that all of the Layer 1 functionality such as scheduling,
convolutional coding, etc. is actually also implemented inside OsmoBTS.
As such, the boundary between OsmoTRX and `osmo-bts-trx` is at
a much lower interface, which is an internal interface of other more
traditional GSM PHY implementations.
Besides OsmoTRX, there are also other implementations (both Free
Software and proprietary) that implement the same UDP stream based radio
modem interface.
=== `osmo-bts-trx` specific VTY commands
For a auto-generated complete syntax reference of the VTY commands,
pleas see the associated _OsmoBTS VTY reference manual_
<<vty-ref-osmobts>>. The section below only lists the most important
commands.
==== at the 'SHOW' node
===== `show transceivers`
Display information about configured/connected OsmoTRX transceivers in
human-readable format to current VTY session.
==== at the 'PHY' configuration node
===== `osmotrx ip HOST`
Set the IP address for the OsmoTRX interface for both the local (OsmoBTS) and
remote (OsmoTRX) side of the UDP flows. This option has been deprecated by the
more detailed option `osmotrx ip (local|remote) A.B.C.D`.
===== `osmotrx ip (local|remote) A.B.C.D`
Set the IP address for the OsmoTRX interface for either the local (OsmoBTS) or
remote (OsmoTRX) side of the UDP flows.
===== `osmotrx base-port (local|remote) <0-65535>`
Configure the base UDP port for the OsmoTRX interface for either the
local (OsmoBTS) or remote (OsmoTRX) side of the UDP flows.
===== `osmotrx fn-advance <0-30>`
Set the number of frames to be transmitted to transceiver in advance of
current GSM frame number.
GSM is a TDMA (time division multiple access) system on the radio
interface. OsmoTRX is the "clock master" of that in the Osmocom
implementation. It informs OsmoBTS of the current GSM frame
number. However, as there is non-zero delays (UDP packet transmission
delay, operating system scheduler delay on both OsmoTRX and OsmoBTS
side, ...), OsmoBTS must compensate for that delay by "advancing"
the clock a certain amount of time.
In other words, if OsmoTRX informs us that the current frame number is N,
we advance it by `fn-advance` and transmit burst data for
`N + fn-advance` towards OsmoTRX.
The fn-advance should be kept as low as possible to avoid additional
delays to the user voice plane as well as to improve the performance
of the control plane (LAPDm) as well as GPRS.
However, fn-advance must be kept sufficiently high to ensure no
underruns on the OsmoTRX side.
The detailed value will depend on your underlying computer systems,
operating system and related tuning parameters. Running OsmoTRX
on a remote host will inevitably require a higher fn-advance than
running it on the same machine, where the UDP packets are just passed
over the loopback device.
The default value for `fn-advance` is 2 (corresponding to 9.2 milliseconds).
===== `osmotrx rts-advance <0-30>`
Set the number of frames to be requested from L1SAP in advance of current
frame number and fn-advance.
The value specified as `rts-advance` is added to the current GSM frame
number as reported by OsmoTRX *and* the `osmotrx fn-advance` in order
to generate the PH-RTS.ind (ready to send indications) across the L1SAP
interface inside osmo-bts. This will trigger the Layer 2 (LAPDm for
the control plane, RTP for the voice plane, and OsmoPCU for GPRS) to
generate a MAC block and input it into the osmo-bts-trx TDMA scheduler.
If OsmoTRX reported N as the current frame number, the actual frame number
reported on L1SAP to higher layers will be computed as follows:
N + fn-advance + rts-advance
The default value of `rts-advance` is 3 (corresponding to 14 milliseconds).
Do not change this unless you have a good reason!
===== `osmotrx rx-gain <0-50>`
Set the receiver gain (configured in the hardware) in dB.
===== `osmotrx tx-attenuation <0-50>`
Set the transmitter attenuation (configured in the hardware) in dB.
===== `osmotrx tx-attenuation oml`
Use the Value in the A-bis OML Attribute `MAX_POWER_REDUCTION` as
transmitter attenuation.
==== at the 'PHY Instance' configuration node
===== `slotmask (1|0) (1|0) (1|0) (1|0) (1|0) (1|0) (1|0) (1|0)`
Configure which timeslots should be active on this TRX. Normally all
timeslots are enabled, unless you are running on a cpu-constrained
deeply embedded system.
===== `osmotrx maxdly <0-31>`
Set the maximum delay for received symbols (in number of GSM symbols).
== `osmo-bts-octphy` for Octasic OCTPHY-2G
The Octasic OCTPHY-2G is a GSM PHY implementation inside an Octasic
proprietary 24-core DSP called OCTDSP.
This DSP has a built-in Gigabit Ethernet interface, over which it
exchanges PHY-layer primitives in raw Ethernet frames with the upper
layers running on another CPU attached to the same Ethernet. Those
primitives are described in a set of C-language header files.
OsmoBTS implements the raw Ethernet frame based primitives as well as
the associated transport protocol (OKTPKT/OCTVC1) in the
`osmo-btso-octphy` bts_model code.
You can run the `osmo-bts-octphy` on any system connected to the same
Ethernet as the OCTDSP running the OCTPHY. This can be either an
embedded ARM or x86 SoM part of the OCTBTS hardware, or it can be any
other Linux system attached via an Ethernet switch.
Each OCTDSP running OCTSDR-2G offers a set of primitives part of a
OCTPKT session, which is mapped to an OsmoBTS PHY link. Depending on
the OCTSDR-2G software version, you may create multiple software TRX by
creating multiple OsmoBTS PHY instances inside that PHY link.
Multiple DSPs may exist in one circuit board, then each of the DSPs is
interfaced by one OsmoBTS PHY link, and each of them may have one or
more OsmoBTS PHY instances creating a Multi-TRX configuration.
== `osmo-bts-litecell15` for Nutaq/Nuran LiteCell 1.5
The Nutaq/Nuran LiteCell 1.5 implements a dual-transceiver GSM BTS based
on a mixed ARM/DSP/FPGA architecture. The PHY layer is implemented on
DSP/FPGA and similar to that of the sysmoBTS: It exchanges primitives
described in a set of C-language header files over message queues
between the ARM and the DSP.
This interface is implemented in the `osmo-bts-litecell15` bts_model of
OsmoBTS. You would run `osmo-bts-litecell15` on the ARM/Linux processor
of the Litecell 1.5.
The two transceivers of the Litecell 1.5 each have their own set of DSP
message queues. Each set of message queues is wrapped into one OsmoBTS
PHY link, offering one OsmoBTS PHY instance.
The Litecell 1.5 PHY supports a direct PHY interface to OsmoPCU,
reducing the latency and amount of primitives that OsmoBTS would
otherwise need to pass through from the PHY message queues to the PCU
socket and vice-versa.
=== `osmo-bts-trx` specific VTY commands
For a auto-generated complete syntax reference of the VTY commands,
please see the associated _OsmoBTS VTY reference manual_
<<vty-ref-osmobts>>. The section below only lists the most important
commands.
==== at the 'SHOW' node
===== `show phy <0-255> system-information`
Show information about the hardware platform, DSP and OCTPHY-2G software
version.
===== `show phy <0-255> rf-port-stats <0-1>`
Show information about the RF port interfaces.
===== `show phy <0-255> clk-sync-stats`
Show information about the clock synchronization manager.
==== at the 'PHY' configuration node
===== `octphy hw-addr HWADDR`
Specify the Ethernet hardware address (mac address) of the DSP running
the OCTPHY-2G software for this PHY link.
===== `octphy net-device NAME`
Specify the Ethernet network device (like `eth0`) through which the DSP
can be reached from OsmoBTS.
===== `octphy rf-port-index <0-255>`
Specify which RF port should be used for this PHY link.
===== `octphy rx-gain <0-73>`
Configure the receiver gain in dB.
===== `octphy tx-attenuation <0-359>`
Configure the transmitter attenuation in quarter-dB
== `osmo-bts-virtual` for Virtual Um Interface
This is a special BTS model used for research, simulation and testing.
Rather than communicating over a wireless RF interface, the GSM Um
messages are encapsulated over GSMTAP/UDP/IP.
The Virtual Um interface (i.e. virtual radio layer) between OsmoBTS and
OsmocomBB allows us to run a complete GSM network with 1-N BTSs and 1-M
MSs without any actual radio hardware, which is of course excellent for
all kinds of testing scenarios.
The Virtual Um layer is based on sending L2 frames (blocks) encapsulated
via GSMTAP UDP multicast packets. There are two separate multicast
groups, one for uplink and one for downlink. The multicast nature
simulates the shared medium and enables any simulated phone to receive
the signal from multiple BTSs via the downlink multicast group.
In OsmoBTS, this is implemented via the `osmo-bts-virtual` BTS model.
Setting up OsmoBTS in its `osmo-bts-virtual` flavor isn't really much
different from setting it up with real hardware. The amount of required
configuration at the BTS configuration file is (as always) very minimal,
as in the GSM network architecture provides almost all relevant
configuration to the BTS from the BSC.
An example configuration file is provided as part of the osmo-bts source
code: `doc/examples/virtual/osmobts-virtual.cfg`
For more information see
http://osmocom.org/projects/cellular-infrastructure/wiki/Virtual_Um
=== `osmo-bts-virtual` specific VTY commands
For a auto-generated complete syntax reference of the VTY commands,
please see the associated _OsmoBTS VTY reference manual_
<<vty-ref-osmobts>>. The section below only lists the most important
commands.
==== at the 'PHY' config node
===== `virtual-um net-device NETDEV`
Configure the network device used for sending/receiving the virtual Um
interface messages (e.g. `eth0`).
===== `virtual-um ms-udp-port <0-65535>`
Configure the UDP port used for sending virtual Um
downlink messages towards the MS (default: GSMTAP 4729).
===== `virtual-um ms-multicast-group GROUP`
Configure the IP multicast group used for sending virtual
Um downlink messages towards the MS (default: 239.193.23.1)
===== `virtual-um bts-udp-port <0-65535>`
Configure the UDP port used for receiving virtual Um
uplink messages from the MS (default: GSMTAP 4729).
===== `virtual-um bts-multicast-group GROUP`
Configure the IP multicast group used for receiving virtual
Um uplink messages from the MS (default: 239.193.23.2)

View File

@@ -1,229 +0,0 @@
== BTS Configuration
The role of the BTS is to handle the GSM radio interface. When the BTS
application is starting, the A-bis OML connection is established towards
the BSC. Almost all BTS configuration (such as ARFCN, channel
configuration, transmit power, etc.) will be sent from the BSC to the
BTS via OML messages. After OML start-up has completed, the BSC will
instruct the BTS to establish the RSL connections.
Given that most configuration is downloaded from the BSC into the BTS at
start-up time, only some very basic settings have to be made in the
OsmoBTS software.
=== Command Line Options
The OsmoBTS executables (`osmo-bts-sysmo`, `osmo-bts-trx`,
`osmo-bts-octphy`, `osmo-bts-litecell15`, ...) share the following
generic command line options:
==== SYNOPSIS
*osmo-bts-sysmo* [-h|-V] [-d 'DBGMASK'] [-D] [-c 'CONFIGFILE' ] [-s] [-T] [-e 'LOGLEVEL']
==== OPTIONS
*-h, --help*::
Print a short help message about the supported options
*-V, --version*::
Print the compile-time version number of the OsmoBTS program
*-d, --debug 'DBGMASK','DBGLEVELS'*::
Set the log subsystems and levels for logging to stderr. This
has mostly been superseded by VTY-based logging configuration,
see <<logging>> for further information.
*-D, --daemonize*::
Fork the process as a daemon into background.
*-c, --config-file 'CONFIGFILE'*::
Specify the file and path name of the configuration file to be
used. If none is specified, use `osmo-bts.cfg` in the current
working directory.
*-s, --disable-color*::
Disable colors for logging to stderr. This has mostly been
deprecated by VTY based logging configuration, see <<logging>>
for further information.
*-T, --timestamp*::
Enable time-stamping of log messages to stderr. This has mostly
been deprecated by VTY based logging configuration, see
<<logging>> for further information.
*-e, --log-level 'LOGLEVEL'*::
Set the global log level for logging to stderr. This has mostly
been deprecated by VTY based logging configuration, see
<<logging>> for further information.
There may be additional, hardware specific command line options by the
different bts_model implementations.
=== Configuration using the VTY
Most configuration as well as run-time monitoring and system
introspection is implemented using a command-line based interface
called _VTY_. A full reference syntax of all existing VTY command is
available as a separate document.
See <<vty>> for further information on the VTY.
==== Required BTS/TRX configuration
There are some settings that have to be configured locally in the
sysmoBTS, as they cannot be set remotely from the BSC. Those
settings are stored in the OsmoBTS configuration file, which commonly
is stored in `/etc/osmocom/osmo-bts.cfg`.
.Example Minimal configuration file
----
!
! OsmoBTS (0.0.1.100-0455) configuration saved from vty
!!
!
phy 0 <1>
instance 0 <2>
bts 0 <3>
band DCS1800
ipa unit-id 1801 0 <4>
oml remote-ip 192.168.100.11 <5>
trx 0 <6>
phy 0 instance 0 <7>
----
<1> You must configure at least one PHY link by means of the PHY node
<2> You must configure at least one PHY instance in the PHY link
<3> There is always exactly one BTS (`bts 0`) configured in OsmoBTS
<4> The `ipa unit-id` is what is used to identify this BTS to the BSC
<5> The OML Remote IP is the IP address of the BSC, to which the BTS shall connect to.
<6> There must be at least one trx (`trx 0`) in each BTS
<7> Every TRX must be mapped to a specific PHY instance this way
For a full reference of all available VTY configuration parameters,
please refer to the OsmoBTS VTY Reference document.
[[gsmtap]]
==== Configuring GSMTAP tracing
In addition to being able to obtain pcap protocol traces of the A-bis
communication and the text-based logging from the OsmoBTS
software, there is also the capability of tracing all communication on
the radio interface. To do so, OsmoBTS can encapsulate
MAC blocks (23byte messages at the L2-L1 interface) into _GSMTAP_ and send
them via UDP/IP. At that point, they can be captured with utilities like
*tcpdump* or *tshark* for further analysis by the *wireshark* protocol
analyzer.
In order to activate this feature, you first need to make sure to specify
the remote address of _GSMTAP_ host in the configuration file. In most
cases, using 127.0.0.1 for passing the messages over the loopback (`lo`)
device will be sufficient:
.Example: Enabling GSMTAP Um-frame logging to localhost
----
bts 0
gsmtap-remote-host 127.0.0.1 <1>
----
<1> Destination address for _GSMTAP_ Um-frames
NOTE: Changing this parameter at run-time will not affect the existing
_GSMTAP_ connection, full program restart is required.
NOTE: Command line parameters `-i` and `--gsmtap-ip` have been deprecated.
OsmoBTS can selectively trace such messages by their L1 SAPI, for both
Rx and Tx. For a complete list of L1 SAPI values, please refer to the
_OsmoBTS VTY reference manual_ <<vty-ref-osmobts>>.
For example, to enable GSMTAP tracing for messages on all SDCCH
channels, you can use the gsmtap-sapi sdcch command at the CONFIG TRX
node of the OsmoBTS VTY.
.Example: Enabling GSMTAP for SDCCH
----
OsmoBTS> enable
OsmoBTS# configure terminal
OsmoBTS(config)# bts 0
OsmoBTS(bts)# gsmtap-sapi sdcch
OsmoBTS(trx)# write <1>
----
<1> the `write` command will make the configuration persistent in the
configuration file. This is not required if you wish to enable GSMTAP
only in the current session of OsmoBTS.
De-activation can be performed similarly by using the `no gsmtap-sapi
sdcch` command at the `bts` node of the OsmoBTS VTY.
It may be useful to enable all SAPIs with a few exceptions, or vice versa
disable everything using one command. For this purpose, the VTY provides
`gsmtap-sapi enable-all` and `gsmtap-sapi disable-all` commands.
.Example: Enabling all SAPIs except PDTCH and PTCCH
----
bts 0
gsmtap-sapi enable-all <1>
no gsmtap-sapi pdtch <2>
no gsmtap-sapi ptcch <2>
----
<1> Enable all available SAPIs
<2> Exclude PDTCH and PTCCH SAPIs
From the moment they are enabled via VTY, GSMTAP messages will be
generated and sent in UDP encapsulation to the IANA-registered UDP port
for GSMTAP (4729) of the specified remote address.
==== Configuring power ramping
OsmoBTS can ramp up the power of its trx over time. This helps reduce
cell congestion in busy environments.
Some models of OsmoBTS (such as osmo-bts-trx) also support ramping down the
transmit power over time until finally ceasing broadcast, for instance due to a
trx becoming administratively locked or due to the whole BTS being gracefully
shut down. This allows for mobile stations camping on the cell to gradually move
to other cells in the area once the signal drop is detected.
In this example, the trx starts with 5dBm output power which increases by 1dB
every two seconds until it reaches nominal power.
Power ramping can use the power-ramp commands at the CONFIG TRX node of the
OsmoBTS VTY.
.Example: Configure power ramping on trx 0
----
OsmoBTS> enable
OsmoBTS# configure terminal
OsmoBTS(config)# bts 0
OsmoBTS(bts)# trx 0
OsmoBTS(trx)# power-ramp max-initial 5 dBm
OsmoBTS(trx)# power-ramp step-size 1 dB
OsmoBTS(trx)# power-ramp step-interval 2
OsmoBTS(trx)# write <1>
----
<1> the `write` command will make the configuration persistent in the
configuration file.
De-activating power-ramping can be performed by setting the max-initial value
to the nominal power. The default max-initial value is 23 dBm.
==== Running multiple instances
It is possible to run multiple instances of `osmo-bts` on one and the same
machine, if the phy-interface is flexible enough to distinguish between
different phy hardware interfaces.
Since usually a BTS instance runs in conjunction with a dedicated PCU instance,
the socket path between PCU and BTS has to be distinguished between the running
instances. It is possible to change the default socket path via VTY config:
.Example: Personalize PCU socket path
----
bts 0
pcu-socket /tmp/pcu_bts_2
----
It is also necessary to separate the VTY anc CTRL interfaces of the different
instances. The VTY, as well as the CTRL interface can be bound to a free IP
address from the loopback range:
.Example: Binding VTY and CTRL interface to a specific IP address
----
line vty
bind 127.0.0.2
ctrl
bind 127.0.0.2
----

View File

@@ -1,24 +0,0 @@
[[control]]
== Control interface
The actual protocol is described in <<common-control-if>>, the variables
common to all programs using it are described in <<ctrl_common_vars>>. Here we
describe variables specific to OsmoBTS. The commands starting with prefix
"net.btsN." are specific to a certain BTS so N have to be replaced with BTS
number when issuing command. Similarly the
TRX-specific commands are additionally prefixed with TRX number e. g.
"net.bts1.trx2.thermal-attenuation".
.Variables available over control interface
[options="header",width="100%",cols="20%,5%,5%,50%,20%"]
|===
|Name|Access|Trap|Value|Comment
|net.btsN.trxM.thermal-attenuation|RW|No|integer|See <<ther>> for details.
|===
[[ther]]
=== thermal-attenuation
Allowed SET value for thermal attenuation is between 0 to 40 dB. Note: the value
is SET in dB units but GET will return value in mdB units used internally.

View File

@@ -1,4 +0,0 @@
[[counters]]
== Counters
include::./counters_generated.adoc[]

View File

@@ -1,64 +0,0 @@
// autogenerated by show asciidoc counters
These counters and their description based on OsmoBTS 0.8.1.346-33ed (OsmoBTS).
=== Rate Counters
// generating tables for rate_ctr_group
// rate_ctr_group table E1 Input subsystem
.e1inp - E1 Input subsystem
[options="header"]
|===
| Name | Reference | Description
| hdlc:abort | <<e1inp_hdlc:abort>> | HDLC abort
| hdlc:bad_fcs | <<e1inp_hdlc:bad_fcs>> | HLDC Bad FCS
| hdlc:overrun | <<e1inp_hdlc:overrun>> | HDLC Overrun
| alarm | <<e1inp_alarm>> | Alarm
| removed | <<e1inp_removed>> | Line removed
|===
// rate_ctr_group table cell broadcast channel
.cbch - cell broadcast channel
[options="header"]
|===
| Name | Reference | Description
| cbch:rcvd_queued | <<cbch_cbch:rcvd_queued>> | Received + queued CBCH messages (Abis)
| cbch:rcvd_dropped | <<cbch_cbch:rcvd_dropped>> | Received + dropped CBCH messages (Abis)
| cbch:sent_single | <<cbch_cbch:sent_single>> | Sent single CBCH messages (Um)
| cbch:sent_default | <<cbch_cbch:sent_default>> | Sent default CBCH messages (Um)
| cbch:sent_null | <<cbch_cbch:sent_null>> | Sent NULL CBCH messages (Um)
|===
// rate_ctr_group table cell broadcast channel
.cbch - cell broadcast channel
[options="header"]
|===
| Name | Reference | Description
| cbch:rcvd_queued | <<cbch_cbch:rcvd_queued>> | Received + queued CBCH messages (Abis)
| cbch:rcvd_dropped | <<cbch_cbch:rcvd_dropped>> | Received + dropped CBCH messages (Abis)
| cbch:sent_single | <<cbch_cbch:sent_single>> | Sent single CBCH messages (Um)
| cbch:sent_default | <<cbch_cbch:sent_default>> | Sent default CBCH messages (Um)
| cbch:sent_null | <<cbch_cbch:sent_null>> | Sent NULL CBCH messages (Um)
|===
// rate_ctr_group table base transceiver station
.bts - base transceiver station
[options="header"]
|===
| Name | Reference | Description
| paging:rcvd | <<bts_paging:rcvd>> | Received paging requests (Abis)
| paging:drop | <<bts_paging:drop>> | Dropped paging requests (Abis)
| paging:sent | <<bts_paging:sent>> | Sent paging requests (Um)
| rach:rcvd | <<bts_rach:rcvd>> | Received RACH requests (Um)
| rach:drop | <<bts_rach:drop>> | Dropped RACH requests (Um)
| rach:handover | <<bts_rach:handover>> | Received RACH requests (Handover)
| rach:cs | <<bts_rach:cs>> | Received RACH requests (CS/Abis)
| rach:ps | <<bts_rach:ps>> | Received RACH requests (PS/PCU)
| agch:rcvd | <<bts_agch:rcvd>> | Received AGCH requests (Abis)
| agch:sent | <<bts_agch:sent>> | Sent AGCH requests (Abis)
| agch:delete | <<bts_agch:delete>> | Sent AGCH DELETE IND (Abis)
|===
== Osmo Stat Items
// generating tables for osmo_stat_items
== Osmo Counters
// generating tables for osmo_counters
// there are no ungrouped osmo_counters

Some files were not shown because too many files have changed in this diff Show More