aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/FUNDING.yml1
-rw-r--r--Makefile.am1
-rw-r--r--README.md26
-rw-r--r--TODO-RELEASE1
-rw-r--r--Transceiver52M/Makefile.am20
-rw-r--r--Transceiver52M/ms/bladerf_specific.h3
-rw-r--r--Transceiver52M/osmo-trx.cpp1
-rw-r--r--configure.ac2
-rwxr-xr-xcontrib/jenkins.sh3
-rw-r--r--contrib/osmo-trx.spec.in254
-rw-r--r--contrib/systemd/osmo-trx-ipc.service3
-rw-r--r--contrib/systemd/osmo-trx-lms.service3
-rw-r--r--contrib/systemd/osmo-trx-uhd.service3
-rw-r--r--contrib/systemd/osmo-trx-usrp1.service3
-rwxr-xr-xdebian/osmo-trx-ipc.postinst38
-rwxr-xr-xdebian/osmo-trx-lms.postinst38
-rwxr-xr-xdebian/osmo-trx-uhd.postinst38
-rwxr-xr-xdebian/osmo-trx-usrp1.postinst38
-rw-r--r--doc/manuals/chapters/code-architecture.adoc4
-rw-r--r--doc/manuals/chapters/ipc_if.adoc301
-rw-r--r--doc/manuals/chapters/trx-backends.adoc100
-rw-r--r--doc/manuals/osmotrx-usermanual.adoc2
m---------osmocom-bb0
23 files changed, 607 insertions, 276 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..7592deb
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+open_collective: osmocom
diff --git a/Makefile.am b/Makefile.am
index aee0d9d..33d8bfa 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -54,7 +54,6 @@ EXTRA_DIST = \
LEGAL \
COPYING \
README.md \
- contrib/osmo-trx.spec.in \
debian \
git-version-gen \
$(NULL)
diff --git a/README.md b/README.md
index b0e07a0..9361631 100644
--- a/README.md
+++ b/README.md
@@ -4,17 +4,17 @@ About OsmoTRX
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
physical layer of a BTS comprising the following 3GPP specifications:
-* TS 05.01 "Physical layer on the radio path"
-* TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
-* TS 05.04 "Modulation"
-* TS 05.10 "Radio subsystem synchronization"
+* TS 05.01 *Physical layer on the radio path*
+* TS 05.02 *Multiplexing and Multiple Access on the Radio Path*
+* TS 05.04 *Modulation*
+* TS 05.10 *Radio subsystem synchronization*
OsmoTRX is originally based on the transceiver code from the
[OpenBTS](https://osmocom.org/projects/osmobts/wiki/OpenBTS) project, but setup
to operate independently with the purpose of using with non-OpenBTS software and
projects, specifically within the Osmocom stack. Used together with
[OsmoBTS](https://osmocom.org/projects/osmobts/wiki) you can get a pretty
-standard GSM BTS with Abis interface as per the relevant 3GPP specifications.
+standard GSM/GPRS/EGPRS BTS with Abis interface as per the relevant 3GPP specifications.
Homepage
--------
@@ -27,7 +27,7 @@ GIT Repository
You can clone from the official osmo-trx.git repository using
- git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-trx`
+ git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-trx
There is a web interface at <https://gitea.osmocom.org/cellular-infrastructure/osmo-trx>
@@ -39,6 +39,13 @@ also available online for each of the sub-libraries at User Manual for OsmoTRX
can be generated during the build process, and is also available online at
<https://ftp.osmocom.org/docs/latest/osmotrx-usermanual.pdf>.
+Forum
+-----
+
+We welcome any osmo-trx related discussions in the
+[Cellular Network Infrastructure -> 2 RAN (GERAN)](https://discourse.osmocom.org/c/cni/geran)
+section of the osmocom discourse (web based Forum).
+
Mailing List
------------
@@ -50,6 +57,13 @@ 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-trx project on osmocom.org](https://osmocom.org/projects/osmotrx/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
------------
diff --git a/TODO-RELEASE b/TODO-RELEASE
index e69de29..1011784 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -0,0 +1 @@
+libosmocore > 1.9.2 requires log_cache_enable call
diff --git a/Transceiver52M/Makefile.am b/Transceiver52M/Makefile.am
index dadfde9..0b63b16 100644
--- a/Transceiver52M/Makefile.am
+++ b/Transceiver52M/Makefile.am
@@ -127,16 +127,16 @@ osmo_trx_uhd_LDADD = \
$(UHD_LIBS)
osmo_trx_uhd_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS)
-if ENABLE_MS_TRX
-bin_PROGRAMS += osmo-trx-ms-uhd
-osmo_trx_ms_uhd_SOURCES = $(MS_LOWER_SRC) $(MS_UPPER_SRC)
-osmo_trx_ms_uhd_LDADD = \
- $(builddir)/device/uhd/libdevice.la \
- $(COMMON_LDADD) \
- $(UHD_LIBS) \
- $(TRXCON_LDADD)
-osmo_trx_ms_uhd_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS) -DBUILDUHD
-endif
+#if ENABLE_MS_TRX
+#bin_PROGRAMS += osmo-trx-ms-uhd
+#osmo_trx_ms_uhd_SOURCES = $(MS_LOWER_SRC) $(MS_UPPER_SRC)
+#osmo_trx_ms_uhd_LDADD = \
+# $(builddir)/device/uhd/libdevice.la \
+# $(COMMON_LDADD) \
+# $(UHD_LIBS) \
+# $(TRXCON_LDADD)
+#osmo_trx_ms_uhd_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS) -DBUILDUHD
+#endif
endif
if DEVICE_USRP1
diff --git a/Transceiver52M/ms/bladerf_specific.h b/Transceiver52M/ms/bladerf_specific.h
index f4abe57..9db8bf0 100644
--- a/Transceiver52M/ms/bladerf_specific.h
+++ b/Transceiver52M/ms/bladerf_specific.h
@@ -269,7 +269,8 @@ struct blade_hw {
bool is_locked;
blade_check(bladerf_set_pll_enable, dev, true);
- blade_check(bladerf_set_pll_refclk, dev, 10000000UL);
+ uint64_t refclock = 10000000UL;
+ blade_check(bladerf_set_pll_refclk, dev, refclock);
for (int i = 0; i < 20; i++) {
usleep(50 * 1000);
bladerf_get_pll_lock_state(dev, &is_locked);
diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp
index 8f5cc85..c460e98 100644
--- a/Transceiver52M/osmo-trx.cpp
+++ b/Transceiver52M/osmo-trx.cpp
@@ -645,6 +645,7 @@ int main(int argc, char *argv[])
osmo_init_logging2(tall_trx_ctx, &log_info);
log_enable_multithread();
+ log_cache_enable();
osmo_stats_init(tall_trx_ctx);
vty_init(&g_vty_info);
logging_vty_add_cmds();
diff --git a/configure.ac b/configure.ac
index 8aecb27..e3a81f4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -240,7 +240,6 @@ AS_IF([test "x$with_sse" != "xno"], [
AM_CONDITIONAL(HAVE_SSE4_1, false)
])
-dnl Check if the compiler supports specified GCC's built-in function
AC_DEFUN([CHECK_BUILTIN_SUPPORT], [
AC_CACHE_CHECK(
[whether ${CC} has $1 built-in],
@@ -380,6 +379,5 @@ AC_CONFIG_FILES([\
contrib/Makefile \
contrib/systemd/Makefile \
doc/manuals/Makefile \
- contrib/osmo-trx.spec \
])
AC_OUTPUT
diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh
index f896b86..e19174a 100755
--- a/contrib/jenkins.sh
+++ b/contrib/jenkins.sh
@@ -79,7 +79,7 @@ osmo-clean-workspace.sh
mkdir "$deps" || true
osmo-build-dep.sh libosmocore "" "--enable-sanitize --disable-doxygen --disable-pcsc"
-PARALLEL_MAKE="" osmo-build-dep.sh libusrp
+PARALLEL_MAKE="" osmo-build-dep.sh libusrp osmith/wip
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
@@ -88,6 +88,7 @@ export PATH="$inst/bin:$PATH"
CONFIG="
--enable-sanitize
--enable-werror
+ --with-bladerf
--with-ipc
--with-lms
--with-mstrx
diff --git a/contrib/osmo-trx.spec.in b/contrib/osmo-trx.spec.in
deleted file mode 100644
index 5243d63..0000000
--- a/contrib/osmo-trx.spec.in
+++ /dev/null
@@ -1,254 +0,0 @@
-#
-# spec file for package osmo-trx
-#
-# Copyright (c) 2017, Martin Hauke <mardnh@gmx.de>
-#
-# All modifications and additions to the file contributed by third parties
-# remain the property of their copyright owners, unless otherwise agreed
-# upon. The license for this file, and modifications and additions to the
-# file, is the same license as for the pristine package itself (unless the
-# license for the pristine package is not an Open Source License, in which
-# case the license is the MIT License). An "Open Source License" is a
-# license that conforms to the Open Source Definition (Version 1.9)
-# published by the Open Source Initiative.
-
-Name: osmo-trx
-Version: @VERSION@
-Release: 0
-Summary: SDR transceiver that implements Layer 1 of a GSM BTS
-License: AGPL-3.0-or-later
-Group: Productivity/Telephony/Servers
-URL: https://osmocom.org/projects/osmotrx
-Source: %{name}-%{version}.tar.xz
-BuildRequires: autoconf
-BuildRequires: automake
-BuildRequires: fdupes
-BuildRequires: gcc-c++
-BuildRequires: libtool
-BuildRequires: pkgconfig >= 0.20
-%if 0%{?suse_version}
-BuildRequires: systemd-rpm-macros
-%endif
-%if ! 0%{?centos_ver}
-BuildRequires: pkgconfig(LimeSuite)
-BuildRequires: pkgconfig(usrp) >= 3.3
-%endif
-BuildRequires: pkgconfig(fftw3f)
-BuildRequires: pkgconfig(libosmocoding) >= 1.9.0
-BuildRequires: pkgconfig(libosmocore) >= 1.9.0
-BuildRequires: pkgconfig(libosmoctrl) >= 1.9.0
-BuildRequires: pkgconfig(libosmovty) >= 1.9.0
-BuildRequires: pkgconfig(libusb-1.0)
-BuildRequires: pkgconfig(uhd)
-%{?systemd_requires}
-%if 0%{?suse_version} > 1325
-BuildRequires: libboost_program_options-devel
-BuildRequires: libboost_system-devel
-BuildRequires: libboost_test-devel
-BuildRequires: libboost_thread-devel
-%else
-BuildRequires: boost-devel
-%endif
-
-%description
-OsmoTRX is a software-defined radio transceiver that implements the Layer 1
-physical layer of a BTS comprising the following 3GPP specifications:
-
-TS 05.01 "Physical layer on the radio path"
-TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
-TS 05.04 "Modulation"
-TS 05.10 "Radio subsystem synchronization"
-
-In this context, BTS is "Base transceiver station". It's the stations that
-connect mobile phones to the mobile network.
-
-3GPP is the "3rd Generation Partnership Project" which is the collaboration
-between different telecommunication associations for developing new
-generations of mobile phone networks. (post-2G/GSM)
-
-%package uhd
-Summary: SDR transceiver that implements Layer 1 of a GSM BTS (UHD)
-Group: Productivity/Telephony/Servers
-Requires: uhd-firmware
-
-%description uhd
-OsmoTRX is a software-defined radio transceiver that implements the Layer 1
-physical layer of a BTS comprising the following 3GPP specifications:
-
-TS 05.01 "Physical layer on the radio path"
-TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
-TS 05.04 "Modulation"
-TS 05.10 "Radio subsystem synchronization"
-
-In this context, BTS is "Base transceiver station". It's the stations that
-connect mobile phones to the mobile network.
-
-3GPP is the "3rd Generation Partnership Project" which is the collaboration
-between different telecommunication associations for developing new
-generations of mobile phone networks. (post-2G/GSM)
-
-%if ! 0%{?centos_ver}
-%package usrp1
-Summary: SDR transceiver that implements Layer 1 of a GSM BTS (USRP1)
-Group: Productivity/Telephony/Servers
-
-%description usrp1
-OsmoTRX is a software-defined radio transceiver that implements the Layer 1
-physical layer of a BTS comprising the following 3GPP specifications:
-
-TS 05.01 "Physical layer on the radio path"
-TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
-TS 05.04 "Modulation"
-TS 05.10 "Radio subsystem synchronization"
-
-In this context, BTS is "Base transceiver station". It's the stations that
-connect mobile phones to the mobile network.
-
-3GPP is the "3rd Generation Partnership Project" which is the collaboration
-between different telecommunication associations for developing new
-generations of mobile phone networks. (post-2G/GSM)
-
-%package lms
-Summary: SDR transceiver that implements Layer 1 of a GSM BTS (LimeSuite)
-Group: Productivity/Telephony/Servers
-
-%description lms
-OsmoTRX is a software-defined radio transceiver that implements the Layer 1
-physical layer of a BTS comprising the following 3GPP specifications:
-
-TS 05.01 "Physical layer on the radio path"
-TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
-TS 05.04 "Modulation"
-TS 05.10 "Radio subsystem synchronization"
-
-In this context, BTS is "Base transceiver station". It's the stations that
-connect mobile phones to the mobile network.
-
-3GPP is the "3rd Generation Partnership Project" which is the collaboration
-between different telecommunication associations for developing new
-generations of mobile phone networks. (post-2G/GSM)
-%endif
-
-%package ipc
-Summary: SDR transceiver that implements Layer 1 of a GSM BTS (IPC)
-Group: Productivity/Telephony/Servers
-
-%description ipc
-OsmoTRX is a software-defined radio transceiver that implements the Layer 1
-physical layer of a BTS comprising the following 3GPP specifications:
-
-TS 05.01 "Physical layer on the radio path"
-TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
-TS 05.04 "Modulation"
-TS 05.10 "Radio subsystem synchronization"
-
-In this context, BTS is "Base transceiver station". It's the stations that
-connect mobile phones to the mobile network.
-
-3GPP is the "3rd Generation Partnership Project" which is the collaboration
-between different telecommunication associations for developing new
-generations of mobile phone networks. (post-2G/GSM)
-
-%package ipc-test
-Summary: SDR transceiver that implements Layer 1 of a GSM BTS (IPC) driver test utility
-Group: Productivity/Telephony/Servers
-
-%description ipc-test
-OsmoTRX is a software-defined radio transceiver that implements the Layer 1
-physical layer of a BTS comprising the following 3GPP specifications:
-
-This package include the test tools for osmo-trx-ipc
-
-%prep
-%setup -q
-
-%build
-echo "%{version}" >.tarball-version
-autoreconf -fi
-
-%if 0%{?centos_ver}
-%configure \
- --docdir=%{_docdir}/%{name} \
- --with-systemdsystemunitdir=%{_unitdir} \
- --without-lms \
- --with-uhd \
- --without-usrp1 \
- --with-ipc
-%else
-%configure \
- --docdir=%{_docdir}/%{name} \
- --with-systemdsystemunitdir=%{_unitdir} \
- --with-lms \
- --with-uhd \
- --with-usrp1 \
- --with-ipc
-%endif
-
-make %{?_smp_mflags} V=1
-
-%check
-make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)
-
-%install
-%make_install
-%fdupes -s %{buildroot}/%{_datadir}
-
-%if 0%{?suse_version}
-%pre lms %service_add_pre osmo-trx-lms.service
-%post lms %service_add_post osmo-trx-lms.service
-%preun lms %service_del_preun osmo-trx-lms.service
-%postun lms %service_del_postun osmo-trx-lms.service
-%pre uhd %service_add_pre osmo-trx-uhd.service
-%post uhd %service_add_post osmo-trx-uhd.service
-%preun uhd %service_del_preun osmo-trx-uhd.service
-%postun uhd %service_del_postun osmo-trx-uhd.service
-%pre usrp1 %service_add_pre osmo-trx-usrp1.service
-%post usrp1 %service_add_post osmo-trx-usrp1.service
-%preun usrp1 %service_del_preun osmo-trx-usrp1.service
-%postun usrp1 %service_del_postun osmo-trx-usrp1.service
-%pre ipc %service_add_pre osmo-trx-ipc.service
-%post ipc %service_add_post osmo-trx-ipc.service
-%preun ipc %service_del_preun osmo-trx-ipc.service
-%postun ipc %service_del_postun osmo-trx-ipc.service
-%endif
-
-%files
-%license COPYING
-%doc README.md
-%doc %{_docdir}/%{name}/examples
-
-%if ! 0%{?centos_ver}
-%files lms
-%{_bindir}/osmo-trx-lms
-%dir %{_sysconfdir}/osmocom
-%config(noreplace) %{_sysconfdir}/osmocom/osmo-trx-lms.cfg
-%{_unitdir}/osmo-trx-lms.service
-%endif
-
-%files uhd
-%{_bindir}/osmo-trx-uhd
-%dir %{_sysconfdir}/osmocom
-%config(noreplace) %{_sysconfdir}/osmocom/osmo-trx-uhd.cfg
-%{_unitdir}/osmo-trx-uhd.service
-
-%if ! 0%{?centos_ver}
-%files usrp1
-%{_bindir}/osmo-trx-usrp1
-%dir %{_datadir}/usrp
-%dir %{_datadir}/usrp/rev2
-%dir %{_datadir}/usrp/rev4
-%{_datadir}/usrp/rev2/std_inband.rbf
-%{_datadir}/usrp/rev4/std_inband.rbf
-%{_unitdir}/osmo-trx-usrp1.service
-%endif
-
-%files ipc
-%{_bindir}/osmo-trx-ipc
-%dir %{_sysconfdir}/osmocom
-%config(noreplace) %{_sysconfdir}/osmocom/osmo-trx-ipc.cfg
-%{_unitdir}/osmo-trx-ipc.service
-
-%files ipc-test
-%{_bindir}/ipc-driver-test
-
-%changelog
diff --git a/contrib/systemd/osmo-trx-ipc.service b/contrib/systemd/osmo-trx-ipc.service
index c7f7c17..12372c0 100644
--- a/contrib/systemd/osmo-trx-ipc.service
+++ b/contrib/systemd/osmo-trx-ipc.service
@@ -8,8 +8,11 @@ Type=simple
Restart=always
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
+User=osmocom
+Group=osmocom
ExecStart=/usr/bin/osmo-trx-ipc -C /etc/osmocom/osmo-trx-ipc.cfg
RestartSec=2
+AmbientCapabilities=CAP_SYS_NICE
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
diff --git a/contrib/systemd/osmo-trx-lms.service b/contrib/systemd/osmo-trx-lms.service
index f51bd45..09c7475 100644
--- a/contrib/systemd/osmo-trx-lms.service
+++ b/contrib/systemd/osmo-trx-lms.service
@@ -8,8 +8,11 @@ Type=simple
Restart=always
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
+User=osmocom
+Group=osmocom
ExecStart=/usr/bin/osmo-trx-lms -C /etc/osmocom/osmo-trx-lms.cfg
RestartSec=2
+AmbientCapabilities=CAP_SYS_NICE
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
diff --git a/contrib/systemd/osmo-trx-uhd.service b/contrib/systemd/osmo-trx-uhd.service
index 6c5c2de..64eb510 100644
--- a/contrib/systemd/osmo-trx-uhd.service
+++ b/contrib/systemd/osmo-trx-uhd.service
@@ -9,8 +9,11 @@ Restart=always
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
Environment=HOME=%h
+User=osmocom
+Group=osmocom
ExecStart=/usr/bin/osmo-trx-uhd -C /etc/osmocom/osmo-trx-uhd.cfg
RestartSec=2
+AmbientCapabilities=CAP_SYS_NICE
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
diff --git a/contrib/systemd/osmo-trx-usrp1.service b/contrib/systemd/osmo-trx-usrp1.service
index 988c053..4e795a2 100644
--- a/contrib/systemd/osmo-trx-usrp1.service
+++ b/contrib/systemd/osmo-trx-usrp1.service
@@ -8,8 +8,11 @@ Type=simple
Restart=always
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
+User=osmocom
+Group=osmocom
ExecStart=/usr/bin/osmo-trx-usrp1 -C /etc/osmocom/osmo-trx-usrp1.cfg
RestartSec=2
+AmbientCapabilities=CAP_SYS_NICE
# CPU scheduling policy:
CPUSchedulingPolicy=rr
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
diff --git a/debian/osmo-trx-ipc.postinst b/debian/osmo-trx-ipc.postinst
new file mode 100755
index 0000000..ed0f889
--- /dev/null
+++ b/debian/osmo-trx-ipc.postinst
@@ -0,0 +1,38 @@
+#!/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-trx-ipc.cfg ]; then
+ chown -v osmocom:osmocom /etc/osmocom/osmo-trx-ipc.cfg
+ chmod -v 0660 /etc/osmocom/osmo-trx-ipc.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#
diff --git a/debian/osmo-trx-lms.postinst b/debian/osmo-trx-lms.postinst
new file mode 100755
index 0000000..4040e98
--- /dev/null
+++ b/debian/osmo-trx-lms.postinst
@@ -0,0 +1,38 @@
+#!/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-trx-lms.cfg ]; then
+ chown -v osmocom:osmocom /etc/osmocom/osmo-trx-lms.cfg
+ chmod -v 0660 /etc/osmocom/osmo-trx-lms.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#
diff --git a/debian/osmo-trx-uhd.postinst b/debian/osmo-trx-uhd.postinst
new file mode 100755
index 0000000..2d1f62d
--- /dev/null
+++ b/debian/osmo-trx-uhd.postinst
@@ -0,0 +1,38 @@
+#!/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-trx-uhd.cfg ]; then
+ chown -v osmocom:osmocom /etc/osmocom/osmo-trx-uhd.cfg
+ chmod -v 0660 /etc/osmocom/osmo-trx-uhd.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#
diff --git a/debian/osmo-trx-usrp1.postinst b/debian/osmo-trx-usrp1.postinst
new file mode 100755
index 0000000..93585e6
--- /dev/null
+++ b/debian/osmo-trx-usrp1.postinst
@@ -0,0 +1,38 @@
+#!/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-trx-usrp1.cfg ]; then
+ chown -v osmocom:osmocom /etc/osmocom/osmo-trx-usrp1.cfg
+ chmod -v 0660 /etc/osmocom/osmo-trx-usrp1.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#
diff --git a/doc/manuals/chapters/code-architecture.adoc b/doc/manuals/chapters/code-architecture.adoc
index f1feb2c..5311dbe 100644
--- a/doc/manuals/chapters/code-architecture.adoc
+++ b/doc/manuals/chapters/code-architecture.adoc
@@ -9,7 +9,7 @@ digraph hierarchy {
node[shape=record,style=filled,fillcolor=gray95]
edge[dir=back, arrowtail=empty]
-2[label = "{Transceiver|+ constructor()\l+ destructor()\l+ init()\l+ numChans()\l+ receiveFIFO()\l+ setSignalHandler()}"]
+2[label = "{Transceiver|+ constructor()\l+ destructor()\l+ init()\l+ numChans()\l+ receiveFIFO()\l+ setSignalHandler()\l}"]
3[label = "{RadioInterface|...}"]
4[label = "{RadioInterfaceResamp|...}"]
5[label = "{RadioInterfaceMulti|...}"]
@@ -17,6 +17,7 @@ edge[dir=back, arrowtail=empty]
7[label = "{UHDDevice|...}"]
8[label = "{LMSDevice|...}"]
9[label = "{USRPDevice|...}"]
+10[label = "{IPCDevice|...}"]
2->3[arrowtail=odiamond]
3->4[constraint=false]
@@ -25,6 +26,7 @@ edge[dir=back, arrowtail=empty]
6->7
6->8
6->9
+6->10
}
----
diff --git a/doc/manuals/chapters/ipc_if.adoc b/doc/manuals/chapters/ipc_if.adoc
new file mode 100644
index 0000000..9994693
--- /dev/null
+++ b/doc/manuals/chapters/ipc_if.adoc
@@ -0,0 +1,301 @@
+[[ipc_if]]
+== osmo-trx-ipc IPC Interface
+
+This interface is the one used by _osmo_trx_ipc_ backend to communicate to a
+third party process in charge of driving the lowest layer device-specific bits
+(from now on the Driver).
+
+It consists of a set of Unix Domain (UD) sockets for the control plane, plus a
+shared memory region for the data plane.
+
+Related code can be found in the
+https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc[Transceiver52M/device/ipc/]
+directory in _osmo-trx.git_.
+
+If you are a potential driver implementator, the
+various primitives and data structures are publicly available in header file
+https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h].
+
+=== Control plane
+
+Control plane protocol is transmitted over Unix Domain (UD) sockets using
+message based primitives. Each primitive has a type identified by an integer,
+and each type of primitive has a number of extra attributes attached to it. The
+IPC interface consists of 2 types of UD sockets:
+
+* _Master_ UD socket: One per osmo-trx-ipc process.
+
+* _Channel_ UD socket: One for each channel managed by osmo-trx-ipc process.
+
+The _Driver_ is in all cases expected to take the server role when creating UD
+sockets, while _osmo-trx-ipc_ takes the client role and connects to sockets
+provided by the driver.
+
+=== Master UD socket
+
+During startup, _osmo-trx-ipc_ will try connecting to the _Driver_ Master UD
+socket located in the path provided by its own (VTY) configuration. As a result,
+it means the _Driver_ process must be running and listening on the Master UD
+socket before _osmo-trx-ipc_ is started, otherwise _osmo-trx-ipc_ will fail and
+exit.
+
+Once connected, _osmo-trx-ipc_ will submit a `GREETING_REQ` message primitive
+announcing the maximum supported protocol version (first version ever is `1`,
+increasing over time).
+
+The _Driver_ shall then answer in `GREETING_CNF` message primitive with its own
+maximum supported version (`<=` version received), providing 0 if none is
+supported.
+
+If _osmo-trx-ipc_ receives back the requested version, then both sides agreed
+on the protocol version to use.
+If _osmo-trx-ipc_ receives back a lower version, it shall decide to continue
+with version negotiation using a lower version, until a supported version or 0
+is received. If finally 0 is received, _osmo-trx-ipc_ will disconnect and exit
+with failure.
+
+Once the version is negotiated (`v1` as of current date), _osmo-trx-ipc_ will
+ask for device information and available characeristics to the _Driver_ using
+the `INFO_REQ` message primitive.
+
+The _Driver_ shall then answer with a `INFO_CNF` message
+containing information, such as:
+
+* String containing device description
+
+* Available reference clocks,
+
+* {rx,tx} I/Q scaling factors
+
+* Maximum number of channels supported
+
+* for each channel:
+
+** List of available {rx,tx} paths/antennas.
+
+** {min,max}{rx,tx} gains
+
+** Nominal transmit power
+
+All the information received from the _Driver_ during `INFO_CNF` will be used by
+_osmo-trx-ipc_ to decide whether it can fullfil the requested configuration from
+the user, and proceed to open the device, or exit with a failure (for instance
+number of channels, referece clock or tx/rx antenna selected by the user cannot
+be fullfilled).
+
+_osmo-trx-ipc_ will then proceed to open the device and do an initial
+configuration using an `OPEN_REQ` message, where it will provide the _Driver_
+with the desired selected configuration (such as number of channels, rx/tx
+paths, clock reference, bandwidth filters, etc.).
+
+The _Driver_ shall then configure the device and send back a `OPEN_CNF` with:
+
+* `return_code` integer attribute set to `0` on success or `!0` on error.
+
+* Name of the Posix Shared Memory region where data plane is going to be
+transmitted.
+
+* One path for each channel, containing the just-created UD socket to manage
+that channel (for instance by taking Master UD socket path and appending
+`_$chan_idx`).
+
+* Path Delay: this is the loopback path delay in samples (= used as a timestamp
+offset internally by _osmo-trx-ipc_), this value contains the analog delay as
+well as the delay introduced by the digital filters in the fpga in the sdr
+devices, and is therefore device type and bandwidth/sample rate dependant. This
+can not be omitted, wrong values will lead to a _osmo-trx-ipc_ that just doesn't
+detect any bursts.
+
+Finally, _osmo-trx-ipc_ will connect to each channel's UD socket (see next
+section).
+
+Upon _osmo-trx-ipc_ closing the UD master socket connection, the _Driver_ shall
+go into _closed_ state: stop all processing and instruct the device to power
+off.
+
+TIP: See
+https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h]
+for the detailed definition of all the related message primitives and data
+types for this socket.
+
+=== Channel UD Socket
+
+This socket can be used by _osmo-trx-ipc_ to start/stop data plane processing or
+change channel's parameters such as Rx/Tx Frequency, Rx/Tx gains, etc.
+
+A channel can be either in _started_ or _stopped_ state. When a channel is
+created (during `OPEN_REQ` in the Master UD Socket), it's by default in
+_stopped_ state. `START_REQ` and `STOP_REQ` messages control this state, and
+eventual failures can be reported through `START_CNF` and `STOP_CNF` by the
+_Driver_.
+
+The message `START_REQ` instructs the _Driver_ to start processing data in the
+data plane. Similary, `STOP_REQ` instructs the _Driver_ to stop processing data
+in the data plane.
+
+Some parameters are usually changed only when the channel is in stopped mode,
+for instance Rx/Tx Frequency.
+
+TIP: See
+https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h]
+for the detailed definition of all the related message primitives and data
+types for this socket.
+
+=== Data Plane
+
+Data plane protocol is implemented by means of a ring buffer structure on top of
+Posix Shared Memory (see `man 7 shm_overview`) between _osmo-trx-ipc_ process
+and the _Driver_.
+
+The Posix Shared Memory region is created and its memory structure prepared by
+the _Driver_ and its name shared with _osmo-trx-ipc_ during _OPEN_CNF_ message
+in the Master UD Socket from the Control Plane. Resource allocation for the
+shared memory area and cleanup is up to the ipc server, as is mutex
+initialization for the buffers.
+
+==== Posix Shared Memory structure
+
+[[fig-shm-structure]]
+.General overview of Posix Shared Memory structure
+[graphviz]
+----
+digraph hierarchy {
+node[shape=record,style=filled,fillcolor=gray95]
+edge[dir=back, arrowtail=empty]
+
+SHM[label = "{Posix Shared Memory region|+ num_chans\l+ Channels[]\l}"]
+CHAN0[label = "{Channel 0|...}"]
+CHAN1[label = "{Channel 1|...}"]
+CHANN[label = "{Channel ...|}"]
+STREAM0_UL[label = "{UL Stream|+ semaphore\l+ read_next\l+ write_next\l+ buffer_size /* In samples */\l+ num_buffers\l+ sample_buffers[]\l}"]
+STREAM0_DL[label = "{DL Stream|+ semaphore\l+ read_next\l+ write_next\l+ buffer_size /* In samples */\l+ num_buffers\l+ sample_buffers[]\l}"]
+STREAM1_UL[label = "{UL Stream|...}"]
+STREAM1_DL[label = "{DL Stream|...}"]
+STREAMN_UL[label = "{UL Stream|...}"]
+STREAMN_DL[label = "{DL Stream|...}"]
+BUF_0DL0[label = "{DL Sample Buffer 0|+ timestamp\l+ buffer_size /* In samples */\l+ samples[] = [16bit I + 16bit Q,...]\l}"]
+BUF_0DLN[label = "{DL Sample Buffer ....|...}"]
+BUF_0UL0[label = "{UL Sample Buffer 0|+ timestamp\l+ buffer_size /* In samples */\l+ samples[] = [16bit I + 16bit Q,...]\l}"]
+BUF_0ULN[label = "{UL Sample Buffer ...|...}"]
+
+SHM->CHAN0
+SHM->CHAN1
+SHM->CHANN
+
+CHAN0->STREAM0_DL
+CHAN0->STREAM0_UL
+STREAM0_DL->BUF_0DL0
+STREAM0_DL->BUF_0DLN
+STREAM0_UL->BUF_0UL0
+STREAM0_UL->BUF_0ULN
+
+CHAN1->STREAM1_UL
+CHAN1->STREAM1_DL
+
+CHANN->STREAMN_UL
+CHANN->STREAMN_DL
+}
+----
+
+The Posix Shared Memory region contains an array of _Channels_.
+
+Each _Channel_ contains 2 Streams:
+
+* Downlink _Stream_
+
+* Uplink _Stream_
+
+Each _Stream_ handles a ring buffer, which is implemented as:
+
+* An array of pointers to _Sample Buffer_ structures.
+
+* Variables containing the number of buffers in the array, as well as the
+maximum size in samples for each Sample Buffer.
+
+* Variables containing `next_read` and `next_write` _Sample Buffer_ (its index
+in the array of pointers).
+
+* Unnamed Posix semaphores to do the required locking while using the ring
+buffer.
+
+Each _Sample Buffer_ contains:
+
+* A `timestamp` variable, containing the position in the stream of the first
+sample in the buffer
+
+* A `data_len` variable, containing the amount of samples available to process
+in the buffer
+
+* An array of samples of size specified by the stream struct it is part of.
+
+==== Posix Shared Memory format
+
+The Posix Shared memory region shall be formatted applying the following
+considerations:
+
+* All pointers in the memory region are encoded as offsets from the start
+address of the region itself, to allow different processes with different
+address spaces to decode them.
+
+* All structs must be force-aligned to 8 bytes
+
+* Number of buffers must be power of 2 (2,4,8,16,...) - 4 appears to be plenty
+
+* IQ samples format: One (complex) sample consists of 16bit i + 16bit q, so the
+buffer size is number of IQ pairs.
+
+* A reasonable per-buffer size (in samples) is 2500, since this happens to be
+the ususal TX (downlink) buffer size used by _osmo-trx-ipc_ with the b210 (rx
+over-the-wire packet size for the b210 is 2040 samples, so the larger value of
+both is convenient).
+
+TIP: See
+https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h]
+for the detailed definition of all the objects being part of the Posix Shared
+memory region structure
+
+==== Posix Shared Memory procedures
+
+The queue in the shared memory area is not supposed to be used for actual
+buffering of data, only for exchange, so the general expectation is that it is
+mostly empty. The only exception to that might be minor processing delays, and
+during startup.
+
+Care must be taken to ensure that only timed waits for the mutex protecting it
+and the condition variables are used, in order to ensure that no deadlock occurs
+should the other side die/quit.
+
+Thread cancellation should be disabled during reads/writes from/to the queue. In
+general a timeout can be considered a non recoverable error during regular
+processing after startup, at least with the current timeout value of one second.
+
+Should over- or underflows occur a corresponding message should be sent towards
+_osmo-trx-ipc_.
+
+Upon **read** of `N` samples, the reader does something like:
+
+. Acquire the semaphore in the channel's stream object.
+
+. Read `stream->next_read`, if `next_read==next_write`, become blocked in
+another sempahore (unlocking the previous one) until writer signals us, then
+`buff = stream->buffers[next_read]`
+
+. Read `buff->data_len` samples, reset the buffer data (`data_len=0`),
+increment `next_read` and if read samples is `<N`, continue with next buffer
+until `next_read==next_write`, then block again or if timeout elapsed, then we
+reach conditon buffer underflow and `return len < N`.
+
+. Release the semaphore
+
+Upon **write** of `N` samples, the writer does something like:
+
+. Acquire the semapore in the channel's stream object.
+
+. Write samples to `buff = stream->buffers[next_write]`. If `data_len!=0`,
+signal `buffer_overflow` (increase field in stream object) and probably
+increase next_read`.
+
+. Increase `next_write`.
+
+. If `next_write` was `== next_read`, signal the reader through the other
+semaphore that it can continue reading. \ No newline at end of file
diff --git a/doc/manuals/chapters/trx-backends.adoc b/doc/manuals/chapters/trx-backends.adoc
index 78bc45d..021c6f4 100644
--- a/doc/manuals/chapters/trx-backends.adoc
+++ b/doc/manuals/chapters/trx-backends.adoc
@@ -71,3 +71,103 @@ with a memory buffer. In this mode, data written to the USRP is actually stored
in a buffer, and read commands to the USRP simply pull data from this buffer.
This was very useful in early testing, and still may be useful in testing basic
Transceiver and radioInterface functionality.
+
+
+[[backend_ipc]]
+=== `osmo-trx-ipc` Inter Process Communication backend
+
+This OsmoTRX model provides its own Inter Process Communication (IPC) interface
+to drive the radio device driver (from now on the Driver), allowing for third
+party processes to implement the lowest layer device-specific bits without being
+affected by copyleft licenses of OsmoTRX.
+
+For more information on such interface, see section <<ipc_if>>.
+
+[[fig-backend-ipc]]
+.Architecture with _osmo-trx-ipc_ and its IPC _Driver_
+[graphviz]
+----
+digraph G {
+ rankdir=LR;
+ MS0 [label="MS"];
+ MS1 [label="MS"];
+ OsmoTRX [label="osmo-trx-ipc", color=red];
+ BTS;
+
+ subgraph cluster_ipc_driver {
+ label = "IPC Driver";
+ color=red;
+ RE [label = "Radio Equipment"];
+ REC [label="Radio Equipment Controller"];
+ RE->REC;
+ }
+
+ REC->OsmoTRX [label="IPC Interface", color=red];
+
+ MS0->RE [label="Um"];
+ MS1->RE [label="Um"];
+ OsmoTRX->BTS [label="bursts over UDP"];
+
+}
+----
+
+A sample config file for this OsmoTRX model can be found in _osmo-trx.git_ https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/doc/examples/osmo-trx-ipc/osmo-trx-ipc.cfg[doc/examples/osmo-trx-ipc/osmo-trx-ipc.cfg]
+
+In the config file, the following VTY command can be used to set up the IPC UD Master Socket _osmo-trx-ipc_ will connect to at startup:
+
+.Example: _osmo-trx-ipc_ will connect to UD Master Socket /tmp/ipc_sock0 upon startup
+----
+dev-args ipc_msock=/tmp/ipc_sock0
+----
+
+==== ipc-device-test
+
+When built with `--with-ipc --with-uhd` configure options, _osmo-trx.git_ will
+build the test program called _ipc-driver-test_. This program implements the
+_Driver_ side of the osmo-trx-ipc interface (see <<ipc_if>> for more
+information) on one side, and also interacts internally with UHD (eg B210 as
+when using osmo-trx-uhd).
+
+You can use this small program as a reference to:
+
+* Test and experiment with _osmo-trx-ipc_.
+
+* Write your own IPC _Driver_ connecting to osmo-trx-ipc.
+
+[[fig-backend-ipc-device-test]]
+.Architecture with _osmo-trx-ipc_ and ipc-device-test as IPC _Driver_
+[graphviz]
+----
+digraph G {
+ rankdir=LR;
+ MS0 [label="MS"];
+ MS1 [label="MS"];
+ SDR;
+ ipc_device_test[label = "ipc-device-test", color=red];
+ OsmoTRX [label="osmo-trx-ipc", color=red];
+ BTS;
+
+ MS0->SDR [label="Um"];
+ MS1->SDR [label="Um"];
+ SDR->ipc_device_test [label="UHD"];
+ ipc_device_test->OsmoTRX [label="IPC Interface", color=red];
+ OsmoTRX->BTS [label="bursts over UDP"];
+}
+----
+
+The code for this app is found here:
+
+* https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/ipc-driver-test.h[Transceiver52M/device/ipc/ipc-driver-test.h]
+
+* https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/ipc-driver-test.c[Transceiver52M/device/ipc/ipc-driver-test.c]
+
+Those files use the server-side (_Driver_ side) code to operate the Posix Shared
+Memory region implemented in files `shm.c`, `shm.h`, `ipc_shm.c` and `ipc_shm.h`
+in the same directory.
+
+Most of the code in that same directory is deliverately released under a BSD
+license (unlike most of _osmo-trx.git_), allowing third parties to reuse/recycle
+the code on their implemented _Driver_ program no matter it being proprietary or
+under an open license. However, care must be taken with external dependencies,
+as for instance shm.c uses the talloc memory allocator, which is GPL licensed
+and hence cannot be used in a proprietary driver. \ No newline at end of file
diff --git a/doc/manuals/osmotrx-usermanual.adoc b/doc/manuals/osmotrx-usermanual.adoc
index 2d1caad..b768306 100644
--- a/doc/manuals/osmotrx-usermanual.adoc
+++ b/doc/manuals/osmotrx-usermanual.adoc
@@ -35,6 +35,8 @@ include::./common/chapters/vty_cpu_sched.adoc[]
include::./common/chapters/trx_if.adoc[]
+include::{srcdir}/chapters/ipc_if.adoc[]
+
include::./common/chapters/port_numbers.adoc[]
include::./common/chapters/bibliography.adoc[]
diff --git a/osmocom-bb b/osmocom-bb
-Subproject a41ca4bbc42bc66557cdc7c646c539d1a4c1e30
+Subproject f12b17dffb782c7428a563620aa83ec047fd99c