48 Commits

Author SHA1 Message Date
Pau Espin Pedrol
c45aa8f571 sccp: Handle N-NOTICE.ind (Routing Failure of SCCP CL messages)
ITU Q.714 2.8:
"""
When an end node is informed of a routing failure, this information
is forwarded towards the SCCP user by using the N-DISCONNECT primitive
(refer to reason for release in 2.1.1.2.4/Q.711) or the N-NOTICE primitive
(refer to reason for return in 2.2.2.2.4/Q.711)
"""

We are already handling N-DISCONNECT.ind for CO messages, but
N-NOTICE.ind for CL messages was not being handled.

If CL messages are not arriving to the Lb peer, then reset the link
and mark the peer as disconnected, until a new RESET can successfully fo
through.

Related: OS#5917
Change-Id: I4bfea43a99c768162faefde06558941f697bd718
2025-07-16 18:11:59 +02:00
Pau Espin Pedrol
1416f6497f Introduce stats msc.ran_peers.{total,active}
osmo_stats_init() was already being called despite no stats were being
used.

Change-Id: Ib01576036f34ac7f21c5bce0155b50932eb9b72a
2025-07-15 12:15:18 +02:00
Pau Espin Pedrol
576b13fb19 smlc: Initial implementation of N-PCSTATE.ind
Related: OS#5917
Change-Id: Id034a0c4d8bff0647a64658480dfa9b4cea563de
2025-07-15 12:15:18 +02:00
Pau Espin Pedrol
28748a57bb vty: Create smlc_vty.c
We already have a smlc_vty.h file, but no usual smlc_vty.c file where we
put commands or init functions existed yet.

Change-Id: I6899602c3a6e22ee6ff93540466f839b2bf5ccc1
2025-07-15 12:15:15 +02:00
Pau Espin Pedrol
9b3ab7372b cell_locations.h: Fix includes
No sigtran header is needed as a dependecy in that header.
struct gsm0808_cell_id is defined in gsm0808_utils.h.

Change-Id: Iceedd7a8c2e050e6631c5f471d2eb71ab8ee2432
2025-07-14 19:46:28 +02:00
Pau Espin Pedrol
b585ad15c9 lb_peer: Drop unused events CONNECTION_{SUCCESS,TIMEOUT}
Change-Id: If5d838e3c0cfdb08ea8a96330ea1de4fa73e091a
2025-07-14 19:12:49 +02:00
Pau Espin Pedrol
4f54a410f5 lb_peer: Mark multiple funcs as static
Change-Id: I7178608444f72bfb93b816a0bedee336a5b4cafe
2025-07-14 19:09:31 +02:00
Pau Espin Pedrol
310e21dbf1 lb_peer: Constify ptr arg in lb_peer_find()
Change-Id: Ia1da7ad3f6410a47c3e8d4e4f7f534073f2e0116
2025-07-14 19:05:52 +02:00
Oliver Smith
062390702c Bump version: 0.3.1.4-22f0 → 0.3.2
Change-Id: Iaca50b640d147f01c2c5adebd6e0853cf7502d86
2025-03-05 11:35:12 +01:00
Pau Espin Pedrol
22f0738935 Add missing required vty go_parent_cb for libosmo-sigtran
This callback is required when configuring SS7 network through VTY.

Change-Id: Ibab25aa1a9ed4d0680fb61999e79b56b9a7d08dc
2025-03-04 16:58:11 +01:00
Pau Espin Pedrol
39515ac59e jenkins.sh: No need to build libosmo-sigtran with doxygen
Change-Id: Ic63fbd92cc6e1a5f784ced2ccb5f998e6cabaf27
2024-12-10 16:56:59 +01:00
Pau Espin Pedrol
fea674ee2d jenkins.sh: Skip building unneeded libosmo-abis
Change-Id: I9e763963f22e7fb425faef3b70b821ebd7e7ce60
2024-12-10 16:25:35 +01:00
Oliver Smith
d5c7fd45b2 contrib/jenkins: libosmo-abis after libosmo-netif
Depends: libosmo-abis I079dc3999de508301dd37ed03e399356a58d3cab
Depends: libosmo-netif I13d6e88158f6d9ce017986283183ee9c2cc68cae
Change-Id: I00f1dc510823d947992c8a5b2ce97a22c322b43b
2024-11-22 13:19:26 +01:00
Oliver Smith
88731ffa1f Bump version: 0.3.0.2-bc0a → 0.3.1
Change-Id: I52964c60edfc09cf832b8acb2fff61d0ceed3837
2024-09-16 12:27:16 +02:00
Oliver Smith
bc0ae88168 contrib/jenkins: libosmo-sccp -> libosmo-sigtran
Change-Id: Ia17342097f781f5b8134b5f74c541af84110db78
2024-09-16 12:26:08 +02:00
Harald Welte
74450e80ea remove libosmo-sccp dependency; depend on libosmo-sigtran only
This follows the removal of the libsccp.a and the pkg-config
libosmo-sccp.pc from libosmo-sccp.git

Change-Id: Icacbc75d0cb3fac1920399e261ba4318221f3160
2024-09-10 09:49:56 +02:00
Oliver Smith
ccfd8e40ea Bump version: 0.2.4.7-ebf2 → 0.3.0
Change-Id: Ibdd991c03499926404b92bac9d76238aade4175c
2024-07-25 09:49:50 +02:00
Vadim Yanitskiy
ebf2429f39 README.md: cosmetic: fix a typo
Change-Id: I5cd00ad066223fa33cf76ff1c85fbd810f37062c
2024-06-05 18:34:07 +07:00
Oliver Smith
ddfea86880 debian/postinst: add checks, be verbose
Do not attempt to change permissions/ownership if the package gets
upgraded from a version higher than the next release.

Do not fail if the user deleted the config file.

Be verbose when changing permissions.

Related: OS#4107
Change-Id: I8994759df644d6edd8f937051b95690537b749be
2024-05-14 15:21:06 +02:00
Oliver Smith
b9e204f3bd contrib: remove rpm spec file
Related: https://osmocom.org/news/255
Related: OS#6446
Change-Id: I9e7a3beb861faab1b6852aa5b57847c590986976
2024-05-08 14:41:10 +02:00
Oliver Smith
7dbd34a37e .deb/.rpm: various fixes related to non-root
* Explicitly chown /var/lib/osmocom to osmocom:osmocom, instead of
  relying on systemd to do it when the service starts up. This does not
  work with the systemd versions in debian 10 and almalinux 8.
* deb: Use "useradd" instead of the interactive "adduser" perl script
  from Debian. This makes it consistent with how we do it in rpm, and
  avoids the dependency on "adduser".
* deb: Consistently use tabs through the file, instead of mixing tabs
  and spaces.
* deb: Remove support for the "dpkg-statoverride --list" logic. This
  seems to be a rather obscure feature to override permissions for
  certain files or directories, for which it does not seem to be a good
  idea to make the postinst script less maintainable. Something similar
  can be achieved by using your own Osmocom config file in a different
  path with different permissions.

Related: OS#4107
Change-Id: Ib129217f6aff713d1d0e7aa831b4b54823e9bade
2024-04-26 15:08:47 +02:00
Max
961e96bfd9 .deb/.rpm: add osmocom user during package install
Create osmocom user & group during package installation.
Fix the configuration dir/files permission to match.

Related: OS#4107
Tweaked-By: Oliver Smith <osmith@sysmocom.de>
Change-Id: I459ac6b80526afa0f5d47a8b56f40d5f636dbe28
2024-04-24 16:16:33 +02:00
Vadim Yanitskiy
4b739ac260 build: include README.md into the release tarball
Change-Id: Icef2122de065683ee6a18f507c1834066c950349
2024-01-26 23:38:57 +07:00
Andreas Eversberg
f66763e891 Use uniform log format for default config files
Related: OS#6272
Change-Id: I24f454bd83f32504b9c135d1620b7d02167e8bc6
2023-12-01 12:53:08 +01:00
Pau Espin Pedrol
e7535a4a9b Bump version: 0.2.3.12-7385-dirty → 0.2.4
Change-Id: Ib73d7f15f55a52479a7728f86e96e93bba699ec5
2023-09-12 17:14:42 +02:00
Vadim Yanitskiy
7385427397 configure.ac: migrate from python2 to python3
Fortunatelly we don't have any python2 specific code, so just bump.

Change-Id: Iaab94a1e896b78dc8699256e326edc165b0ed922
Related: OS#5950
2023-07-15 00:47:40 +07:00
Pau Espin Pedrol
81e12318ae Write explicit role & sctp-role fields in ASP configurations
Change-Id: Idf7b2288e93edb408b644da759f844ac0ce1210b
2023-06-08 19:42:04 +02:00
Oliver Smith
85f1cca096 systemd: depend on networking-online.target
Related: SYS#6400
Change-Id: Idadcbbf55e976ae035cfac4b85ccd870e0f27b82
2023-05-26 14:10:49 +02:00
Vadim Yanitskiy
e8c4967639 copyright: fix typo: sysmocom s/s.m.f.c./s.f.m.c./ GmbH
Change-Id: Ib155c44fb318cab38227c196919fc6cbba86c4bb
2023-05-18 17:22:27 +07:00
Neels Janosch Hofmeyr
d09e87c645 ctrl-test: drop bogus 'rm -f $(CTRL_TEST_DB)'
That is a copy-paste artifact from osmo-hlr.git and looks pretty
dangerous when CTRL_TEST_DB is not defined.

Change-Id: Idcf9296a6e7e520c2f0b42f8aace01d616bcfc56
2023-05-05 02:14:01 +02:00
Oliver Smith
386d5acdbe debian: set compat level to 10
Related: OS#5958
Change-Id: Ib45ad7c44cdefa4c5acab2da09f24796253a133d
2023-04-25 16:48:33 +02:00
Vadim Yanitskiy
8c11b24ca0 tests: execute osmotest{vty,config}.py against osmo-smlc
Change-Id: I61d970563a1902cce704d5c1a6adea9d8be438e4
2023-03-30 02:40:18 +07:00
Vadim Yanitskiy
8bcac6f928 tests: $(BUILT_SOURCES) is not defined, depend on osmo-smlc
Change-Id: I75a038b2730c7e0d4637db6dfb780839a49abc2e
2023-03-30 02:19:12 +07:00
Vadim Yanitskiy
74b4e61f36 Makefile.am: remove unneeded AM_LDFLAGS with LIBS
Change-Id: Ic6886d2e47c053fe39647bc9ec3be704c935bee5
2023-03-09 18:10:18 +07:00
Vadim Yanitskiy
7118875839 Makefile.am: remove $(COVERAGE_LDFLAGS) from osmo_smlc_LDADD
Change-Id: Ia7073d2baf4c758ebff167b6cf1b3ba9c1552821
2023-03-09 18:09:44 +07:00
Vadim Yanitskiy
cf29f44722 configure.ac: set -std=gnu11
Avoid using different dialects by accident (and resulting compiler
errors if compiler assumes a different dialect), like in
I72310886bef4db635078b75715c9d98ee45391cc.

Related: https://lists.osmocom.org/pipermail/openbsc/2019-September/013030.html
Related: https://lists.osmocom.org/pipermail/openbsc/2021-January/013360.html
Related: osmo-pcu Ia57ba101627e3cc0babeca82631e207a3e2e0960
Change-Id: I76ed877d160f98e3627293b0539bec5fac1e8469
2023-03-09 15:39:18 +07:00
arehbein
0fda654d29 Transition to use of 'telnet_init_default'
Related: OS#5809
Change-Id: Icc57c68337d55c6594c1c36e9bf41624d11dab0a
2023-02-25 17:48:58 +01:00
Pau Espin Pedrol
848316e9d4 Bump version: 0.2.2.4-5ac8-dirty → 0.2.3
Change-Id: I84d05f283cfd28298f3a4ef6df1c49265638969b
2023-02-07 17:42:01 +01:00
Max
5ac8ab7cd9 ctrl: take both address and port from vty config
Change-Id: I5d73257c0233ce6772847809a6163b6ca4c88f83
2022-12-17 21:32:29 +03:00
Max
518550e404 Set working directory in systemd service file
By default systemd will execute service with root directory
(or home directory for user instance) which might result in
attempts to create files in unexpected place. Let's set it
to 'osmocom' subdir of state directory
(/var/lib for system instance) instead.

Related: OS#4821
Change-Id: Ie8b014e8eac23221a6a7087bb2b886014323680b
2022-09-12 07:12:35 +00:00
Max
f2a03654bb Add git-review config
Change-Id: Ia16bb7936e9382dcc51d9122bd7582d75eb7ae15
2022-09-09 22:40:27 +07:00
Vadim Yanitskiy
accb1d1b25 contrib/jenkins.sh: execute distcheck/maintainer-clean with $PARALLEL_MAKE
Change-Id: I14b0e0343dc70b72cc9e14641bccaa6da2059e46
2022-08-29 00:33:10 +07:00
Pau Espin Pedrol
f30a8a1133 Bump version: 0.2.1.5-cd82-dirty → 0.2.2
Change-Id: I17fe1460bb04da7d10ebaa1410cdb0dd670ece24
2022-06-29 12:21:07 +02:00
Harald Welte
cd82cb23be Fill README with content; convert to markdown
Change-Id: I54297aba4dbb4f521caaeb555de9e5404f9e6dcd
2022-06-18 14:01:07 +02:00
Harald Welte
bc54ff06f8 update git URLs (git -> https; gitea)
Change-Id: I8788fa6b0495b8ee72b1bb5485f6cd3a4835eb0b
2022-06-18 14:01:07 +02:00
Vadim Yanitskiy
b9b65d953f tests: use 'check_PROGRAMS' instead of 'noinst_PROGRAMS'
When using 'check_PROGRAMS', autoconf/automake generates smarter
Makefiles, so that the test programs are not being compiled during
the normal 'make all', but only during 'make check'.

Change-Id: I9b60429c8c3922dd97809c72ed7960ffdc059d8b
2022-04-14 02:18:50 +03:00
Pau Espin Pedrol
454047c586 deb/rpm packaging: Drop dependency on autoconf-archive
it is not needed since ec37263a37.

Change-Id: I729b7dc0f2971b959810a46baa8a344e8b71e4a4
2022-01-11 18:26:44 +01:00
Oliver Smith
5b7f1fd5c8 treewide: remove FSF address
Remove the paragraph about writing to the Free Software Foundation's
mailing address. The FSF has changed addresses in the past, and may do
so again. In 2021 this is not useful, let's rather have a bit less
boilerplate at the start of source files.

Change-Id: Ieb4f9b4ad5073c9b5996cb960b248c450fd5f2dd
2021-12-14 12:22:00 +01:00
33 changed files with 585 additions and 200 deletions

4
.gitreview Normal file
View File

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

View File

@@ -19,7 +19,7 @@ SUBDIRS = \
BUILT_SOURCES = $(top_srcdir)/.version
EXTRA_DIST = \
.version \
contrib/osmo-smlc.spec.in \
README.md \
debian \
git-version-gen \
osmoappdesc.py \

4
README
View File

@@ -1,4 +0,0 @@
About OsmoSMLC
==============
FIXME

69
README.md Normal file
View File

@@ -0,0 +1,69 @@
osmo-smlc - Osmocom Serving Mobile Location Centre
==================================================
This repository contains a C-language implementation of a minimalistic
GSM Serving Mobile Location Centre (SMLC) for 2G (GSM). It is part of the
[Osmocom](https://osmocom.org/) Open Source Mobile Communications project.
OsmoSMLC exposes
* 3GPP Lb interface towards the BSC
* The Osmocom typical telnet VTY and CTRL interfaces.
* The Osmocom typical statsd exporter.
OsmoSMLC supports the following location methods:
* currently only the Timing Advance based method of determining a mobile station; operator must configure the
locations of the cells in the osmo-smlc configuration file
Homepage
--------
You can find the OsmoSMLC issue tracker and wiki online at
<https://osmocom.org/projects/osmo-smlc> and <https://osmocom.org/projects/osmo-smlc/wiki>
GIT Repository
--------------
You can clone from the official osmo-smlc.git repository using
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-smlc
There is a web interface at <https://gitea.osmocom.org/cellular-infrastructure/osmo-smlc>
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/osmosmlc-usermanual.pdf)
as well as the [VTY Reference Manual](https://ftp.osmocom.org/docs/latest/osmosmlc-vty-reference.pdf)
Mailing List
------------
Discussions related to osmo-smlc 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.
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-smlc can be seen at
<https://gerrit.osmocom.org/#/q/project:osmo-smlc+status:open>

9
TODO-RELEASE Normal file
View File

@@ -0,0 +1,9 @@
# 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

@@ -9,6 +9,8 @@ AC_CONFIG_AUX_DIR([.])
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])])
@@ -34,12 +36,11 @@ if test "x$PKG_CONFIG_INSTALLED" = "xno"; then
fi
PKG_PROG_PKG_CONFIG([0.20])
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.6.0)
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.6.0)
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.6.0)
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.6.0)
PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 1.5.0)
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 1.5.0)
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.10.0)
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.10.0)
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.10.0)
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.10.0)
PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 2.0.0)
dnl checks for header files
AC_HEADER_STDC
@@ -115,13 +116,13 @@ AC_ARG_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(PYTHON2_AVAIL,python2,yes)
if test "x$PYTHON2_AVAIL" != "xyes" ; then
AC_MSG_ERROR([Please install python2 to run the VTY/CTRL tests.])
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 git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])
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])
@@ -206,5 +207,4 @@ AC_OUTPUT(
doc/manuals/Makefile
contrib/Makefile
contrib/systemd/Makefile
contrib/osmo-smlc.spec
Makefile)

View File

@@ -31,9 +31,8 @@ export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
export PATH="$inst/bin:$PATH"
osmo-build-dep.sh libosmo-abis
osmo-build-dep.sh libosmo-netif
osmo-build-dep.sh libosmo-sccp
osmo-build-dep.sh libosmo-netif "" --disable-doxygen
osmo-build-dep.sh libosmo-sigtran "" --disable-doxygen
# Additional configure options and depends
CONFIG=""
@@ -58,12 +57,12 @@ LD_LIBRARY_PATH="$inst/lib" $MAKE check \
|| cat-testlogs.sh
LD_LIBRARY_PATH="$inst/lib" \
DISTCHECK_CONFIGURE_FLAGS="--enable-vty-tests --enable-external-tests --enable-werror $CONFIG" \
$MAKE distcheck \
$MAKE $PARALLEL_MAKE distcheck \
|| cat-testlogs.sh
if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then
make -C "$base/doc/manuals" publish
fi
$MAKE maintainer-clean
$MAKE $PARALLEL_MAKE maintainer-clean
osmo-clean-workspace.sh

View File

@@ -1,90 +0,0 @@
#
# spec file for package osmo-smlc
#
# 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.
## Disable LTO for now since it breaks compilation of the tests
## https://osmocom.org/issues/4113
%define _lto_cflags %{nil}
Name: osmo-smlc
Version: @VERSION@
Release: 0
Summary: OsmoSMLC: Osmocom's Location Service Center
License: AGPL-3.0-or-later
Group: Hardware/Mobile
URL: https://osmocom.org/projects/osmo-smlc
Source: %{name}-%{version}.tar.xz
BuildRequires: autoconf
BuildRequires: autoconf-archive
BuildRequires: automake >= 1.9
BuildRequires: libtool >= 2
BuildRequires: pkgconfig >= 0.20
%if 0%{?suse_version}
BuildRequires: systemd-rpm-macros
%endif
BuildRequires: pkgconfig(libosmo-netif) >= 1.1.0
BuildRequires: pkgconfig(libosmo-sccp) >= 1.5.0
BuildRequires: pkgconfig(libosmo-sigtran) >= 1.5.0
BuildRequires: pkgconfig(libosmocore) >= 1.6.0
BuildRequires: pkgconfig(libosmoctrl) >= 1.6.0
BuildRequires: pkgconfig(libosmogsm) >= 1.6.0
BuildRequires: pkgconfig(libosmovty) >= 1.6.0
BuildRequires: pkgconfig(talloc)
%{?systemd_requires}
%description
OsmoBSC: Osmocom's Base Station Controller for 2G circuit-switched mobile networks.
%prep
%setup -q
%build
echo "%{version}" >.tarball-version
autoreconf -fi
%configure \
--docdir=%{_docdir}/%{name} \
--with-systemdsystemunitdir=%{_unitdir}
make %{?_smp_mflags}
%install
%make_install
%if 0%{?suse_version}
%preun
%service_del_preun %{name}.service
%postun
%service_del_postun %{name}.service
%pre
%service_add_pre %{name}.service
%post
%service_add_post %{name}.service
%endif
%check
make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)
%files
%license COPYING
%doc AUTHORS README
%{_bindir}/osmo-smlc
%dir %{_docdir}/%{name}/examples
%dir %{_docdir}/%{name}/examples/osmo-smlc
%{_docdir}/%{name}/examples/osmo-smlc/osmo-smlc.cfg
%dir %{_sysconfdir}/osmocom
%config(noreplace) %{_sysconfdir}/osmocom/osmo-smlc.cfg
%{_unitdir}/%{name}.service
%changelog

View File

@@ -1,9 +1,15 @@
[Unit]
Description=Osmocom Serving Mobile Location Center (SMLC)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Restart=always
StateDirectory=osmocom
WorkingDirectory=%S/osmocom
User=osmocom
Group=osmocom
ExecStart=/usr/bin/osmo-smlc -c /etc/osmocom/osmo-smlc.cfg
RestartSec=2

96
debian/changelog vendored
View File

@@ -1,3 +1,99 @@
osmo-smlc (0.3.2) unstable; urgency=medium
[ Oliver Smith ]
* contrib/jenkins: libosmo-abis after libosmo-netif
[ Pau Espin Pedrol ]
* jenkins.sh: Skip building unneeded libosmo-abis
* jenkins.sh: No need to build libosmo-sigtran with doxygen
* Add missing required vty go_parent_cb for libosmo-sigtran
-- Oliver Smith <osmith@sysmocom.de> Wed, 05 Mar 2025 11:35:11 +0100
osmo-smlc (0.3.1) unstable; urgency=medium
[ Harald Welte ]
* remove libosmo-sccp dependency; depend on libosmo-sigtran only
[ Oliver Smith ]
* contrib/jenkins: libosmo-sccp -> libosmo-sigtran
-- Oliver Smith <osmith@sysmocom.de> Mon, 16 Sep 2024 12:26:33 +0200
osmo-smlc (0.3.0) unstable; urgency=medium
[ Andreas Eversberg ]
* Use uniform log format for default config files
[ Vadim Yanitskiy ]
* build: include README.md into the release tarball
* README.md: cosmetic: fix a typo
[ Max ]
* .deb/.rpm: add osmocom user during package install
[ Oliver Smith ]
* .deb/.rpm: various fixes related to non-root
* contrib: remove rpm spec file
* debian/postinst: add checks, be verbose
-- Oliver Smith <osmith@sysmocom.de> Thu, 25 Jul 2024 09:49:50 +0200
osmo-smlc (0.2.4) unstable; urgency=medium
[ arehbein ]
* Transition to use of 'telnet_init_default'
[ Vadim Yanitskiy ]
* configure.ac: set -std=gnu11
* Makefile.am: remove $(COVERAGE_LDFLAGS) from osmo_smlc_LDADD
* Makefile.am: remove unneeded AM_LDFLAGS with LIBS
* tests: $(BUILT_SOURCES) is not defined, depend on osmo-smlc
* tests: execute osmotest{vty,config}.py against osmo-smlc
* copyright: fix typo: sysmocom s/s.m.f.c./s.f.m.c./ GmbH
* configure.ac: migrate from python2 to python3
[ Oliver Smith ]
* debian: set compat level to 10
* systemd: depend on networking-online.target
[ Neels Janosch Hofmeyr ]
* ctrl-test: drop bogus 'rm -f $(CTRL_TEST_DB)'
[ Pau Espin Pedrol ]
* Write explicit role & sctp-role fields in ASP configurations
-- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 12 Sep 2023 17:14:41 +0200
osmo-smlc (0.2.3) unstable; urgency=medium
[ Vadim Yanitskiy ]
* contrib/jenkins.sh: execute distcheck/maintainer-clean with $PARALLEL_MAKE
[ Max ]
* Add git-review config
* Set working directory in systemd service file
* ctrl: take both address and port from vty config
-- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 07 Feb 2023 17:42:00 +0100
osmo-smlc (0.2.2) unstable; urgency=medium
[ Oliver Smith ]
* treewide: remove FSF address
[ Pau Espin Pedrol ]
* deb/rpm packaging: Drop dependency on autoconf-archive
[ Vadim Yanitskiy ]
* tests: use 'check_PROGRAMS' instead of 'noinst_PROGRAMS'
[ Harald Welte ]
* update git URLs (git -> https; gitea)
* Fill README with content; convert to markdown
-- Pau Espin Pedrol <pespin@sysmocom.de> Wed, 29 Jun 2022 12:21:06 +0200
osmo-smlc (0.2.1) unstable; urgency=medium
[ Pau Espin Pedrol ]

2
debian/compat vendored
View File

@@ -1 +1 @@
9
10

14
debian/control vendored
View File

@@ -2,23 +2,21 @@ Source: osmo-smlc
Section: net
Priority: extra
Maintainer: Osmocom team <openbsc@lists.osmocom.org>
Build-Depends: debhelper (>=9),
Build-Depends: debhelper (>= 10),
dh-autoreconf,
autotools-dev,
autoconf,
autoconf-archive,
automake,
libtool,
pkg-config,
libsctp-dev,
libtalloc-dev,
libosmocore-dev (>= 1.6.0),
libosmo-sccp-dev (>= 1.5.0),
libosmo-sigtran-dev (>= 1.5.0),
osmo-gsm-manuals-dev (>= 1.2.0)
libosmocore-dev (>= 1.10.0),
libosmo-sigtran-dev (>= 2.0.0),
osmo-gsm-manuals-dev (>= 1.6.0)
Standards-Version: 3.9.8
Vcs-Git: git://git.osmocom.org/osmo-smlc.git
Vcs-Browser: https://git.osmocom.org/osmo-smlc/
Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-smlc
Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-smlc
Homepage: https://osmocom.org/projects/osmo-smlc
Package: osmo-smlc

2
debian/copyright vendored
View File

@@ -1,6 +1,6 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: osmo-smlc
Source: git://git.osmocom.org/osmo-smlc
Source: https://gitea.osmocom.org/cellular-infrastructure/osmo-smlc
Files: *
Copyright: 2020 Harald Welte <laforge@osmocom.org>

38
debian/postinst vendored Executable file
View File

@@ -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 "0.3.0"; then
if [ -e /etc/osmocom/osmo-smlc.cfg ]; then
chown -v osmocom:osmocom /etc/osmocom/osmo-smlc.cfg
chmod -v 0660 /etc/osmocom/osmo-smlc.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,3 +1,11 @@
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
cells
lac-ci 23 42 lat 12.34567 lon 34.56789
cgi 262 42 17 5 lat 12.34765 lon 34.56987

View File

@@ -74,6 +74,7 @@ cs7 instance 0
point-code 1.23.6
asp asp-clnt-msc-0 2905 0 m3ua
remote-ip 127.0.0.1
role asp
sctp-role client
----

View File

@@ -17,17 +17,13 @@
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#pragma once
#include <stdint.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/gsm/gsm0808_utils.h>
struct osmo_gad;

View File

@@ -1,5 +1,7 @@
#pragma once
#include <stdint.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/gsm/gsm0808.h>
#include <osmocom/sigtran/sccp_sap.h>
@@ -49,8 +51,8 @@ enum lb_peer_event {
LB_PEER_EV_MSG_DOWN_CO,
LB_PEER_EV_RX_RESET,
LB_PEER_EV_RX_RESET_ACK,
LB_PEER_EV_CONNECTION_SUCCESS,
LB_PEER_EV_CONNECTION_TIMEOUT,
LB_PEER_EV_AVAILABLE,
LB_PEER_EV_UNAVAILABLE,
};
struct lb_peer_ev_ctx {
@@ -60,8 +62,8 @@ struct lb_peer_ev_ctx {
};
struct lb_peer *lb_peer_find_or_create(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr);
struct lb_peer *lb_peer_find(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr);
struct lb_peer *lb_peer_find(const struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr);
struct lb_peer *lb_peer_find_by_pc(const struct sccp_lb_inst *sli, uint32_t pc);
int lb_peer_up_l2(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *calling_addr, bool co, uint32_t conn_id,
struct msgb *l2);
void lb_peer_disconnect(struct sccp_lb_inst *sli, uint32_t conn_id);

View File

@@ -37,6 +37,7 @@ enum smlc_ctrl_node {
_LAST_CTRL_NODE_SMLC
};
/* rate_ctr */
enum {
SMLC_CTR_BSSMAP_LE_RX_UDT_RESET,
SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK,
@@ -58,3 +59,9 @@ enum {
SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_RESPONSE,
SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_TA_REQUEST,
};
/* osmo_stat */
enum {
SMLC_STAT_LB_PEERS_TOTAL,
SMLC_STAT_LB_PEERS_ACTIVE,
};

View File

@@ -17,10 +17,6 @@
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#pragma once

View File

@@ -5,3 +5,5 @@
enum smlc_vty_node {
CELLS_NODE = _LAST_OSMOVTY_NODE + 1,
};
void smlc_vty_init(struct vty_app_info *vty_app_info);

View File

@@ -14,12 +14,6 @@ AM_CFLAGS = \
$(COVERAGE_CFLAGS) \
$(NULL)
AM_LDFLAGS = \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOGSM_LIBS) \
$(COVERAGE_LDFLAGS) \
$(NULL)
SUBDIRS = \
osmo-smlc \
$(NULL)

View File

@@ -32,6 +32,7 @@ osmo_smlc_SOURCES = \
smlc_loc_req.c \
smlc_main.c \
smlc_subscr.c \
smlc_vty.c \
$(NULL)
osmo_smlc_LDADD = \
@@ -39,6 +40,5 @@ osmo_smlc_LDADD = \
$(LIBOSMOGSM_LIBS) \
$(LIBOSMOVTY_LIBS) \
$(LIBOSMOCTRL_LIBS) \
$(COVERAGE_LDFLAGS) \
$(LIBOSMOSIGTRAN_LIBS) \
$(NULL)

View File

@@ -17,10 +17,6 @@
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#include <limits.h>

View File

@@ -1,7 +1,7 @@
/* SMLC Lb connection implementation */
/*
* (C) 2020 by sysmocom s.m.f.c. <info@sysmocom.de>
* (C) 2020 by sysmocom s.f.m.c. <info@sysmocom.de>
* All Rights Reserved
*
* Author: Neels Hofmeyr

View File

@@ -1,5 +1,5 @@
/*
* (C) 2019 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
* (C) 2019-2025 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
* All Rights Reserved
*
* SPDX-License-Identifier: AGPL-3.0+
@@ -23,6 +23,7 @@
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/fsm.h>
#include <osmocom/core/stat_item.h>
#include <osmocom/gsm/bssmap_le.h>
#include <osmocom/sigtran/sccp_helpers.h>
@@ -57,6 +58,7 @@ static struct lb_peer *lb_peer_alloc(struct sccp_lb_inst *sli, const struct osmo
fi->priv = lbp;
llist_add(&lbp->entry, &sli->lb_peers);
osmo_stat_item_inc(osmo_stat_item_group_get_item(g_smlc->statg, SMLC_STAT_LB_PEERS_TOTAL), 1);
return lbp;
}
@@ -69,7 +71,7 @@ struct lb_peer *lb_peer_find_or_create(struct sccp_lb_inst *sli, const struct os
return lb_peer_alloc(sli, peer_addr);
}
struct lb_peer *lb_peer_find(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr)
struct lb_peer *lb_peer_find(const struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr)
{
struct lb_peer *lbp;
llist_for_each_entry(lbp, &sli->lb_peers, entry) {
@@ -80,6 +82,15 @@ struct lb_peer *lb_peer_find(struct sccp_lb_inst *sli, const struct osmo_sccp_ad
return NULL;
}
/* Find an lb_peer by its remote SCCP address */
struct lb_peer *lb_peer_find_by_pc(const struct sccp_lb_inst *sli, uint32_t pc)
{
struct osmo_sccp_addr rem_addr;
osmo_sccp_make_addr_pc_ssn(&rem_addr, pc, OSMO_SCCP_SSN_BSC_BSSAP_LE);
return lb_peer_find(sli, &rem_addr);
}
static const struct osmo_tdef_state_timeout lb_peer_fsm_timeouts[32] = {
[LB_PEER_ST_WAIT_RX_RESET_ACK] = { .T = -13 },
[LB_PEER_ST_DISCARDING] = { .T = -14 },
@@ -88,7 +99,7 @@ static const struct osmo_tdef_state_timeout lb_peer_fsm_timeouts[32] = {
#define lb_peer_state_chg(LB_PEER, NEXT_STATE) \
osmo_tdef_fsm_inst_state_chg((LB_PEER)->fi, NEXT_STATE, lb_peer_fsm_timeouts, g_smlc_tdefs, 5)
void lb_peer_discard_all_conns(struct lb_peer *lbp)
static void lb_peer_discard_all_conns(struct lb_peer *lbp)
{
struct lb_conn *lb_conn, *next;
@@ -137,7 +148,7 @@ static void lb_peer_rx_reset_ack(struct lb_peer *lbp, struct msgb* msg)
lb_peer_state_chg(lbp, LB_PEER_ST_READY);
}
void lb_peer_reset(struct lb_peer *lbp)
static void lb_peer_reset(struct lb_peer *lbp)
{
struct bssap_le_pdu reset = {
.discr = BSSAP_LE_MSG_DISCR_BSSMAP_LE,
@@ -167,7 +178,18 @@ void lb_peer_reset(struct lb_peer *lbp)
}
}
void lb_peer_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void lb_peer_disconnect(struct sccp_lb_inst *sli, uint32_t conn_id)
{
struct lb_conn *lb_conn;
llist_for_each_entry(lb_conn, &sli->lb_conns, entry) {
if (lb_conn->sccp_conn_id == conn_id) {
lb_conn_discard(lb_conn);
return;
}
}
}
static void lb_peer_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct lb_peer *lbp = fi->priv;
struct lb_peer_ev_ctx *ctx = data;
@@ -196,7 +218,7 @@ void lb_peer_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *dat
}
}
void lb_peer_st_wait_rx_reset(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void lb_peer_st_wait_rx_reset(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct lb_peer *lbp = fi->priv;
struct lb_peer_ev_ctx *ctx;
@@ -224,13 +246,22 @@ void lb_peer_st_wait_rx_reset(struct osmo_fsm_inst *fi, uint32_t event, void *da
lb_peer_rx_reset(lbp, msg);
return;
case LB_PEER_EV_AVAILABLE:
/* Send a RESET to the peer. */
lb_peer_reset(lbp);
return;
case LB_PEER_EV_UNAVAILABLE:
/* Do nothing, wait for peer to come up again. */
return;
default:
LOG_LB_PEER(lbp, LOGL_ERROR, "Unhandled event: %s\n", osmo_fsm_event_name(&lb_peer_fsm, event));
return;
}
}
void lb_peer_st_wait_rx_reset_ack(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void lb_peer_st_wait_rx_reset_ack(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct lb_peer *lbp = fi->priv;
struct lb_peer_ev_ctx *ctx;
@@ -259,13 +290,28 @@ void lb_peer_st_wait_rx_reset_ack(struct osmo_fsm_inst *fi, uint32_t event, void
lb_peer_rx_reset(lbp, msg);
return;
case LB_PEER_EV_AVAILABLE:
/* Send a RESET to the peer. */
lb_peer_reset(lbp);
return;
case LB_PEER_EV_UNAVAILABLE:
lb_peer_state_chg(lbp, LB_PEER_ST_WAIT_RX_RESET);
return;
default:
LOG_LB_PEER(lbp, LOGL_ERROR, "Unhandled event: %s\n", osmo_fsm_event_name(&lb_peer_fsm, event));
return;
}
}
void lb_peer_st_ready(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void lb_peer_st_ready_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
{
if (prev_state != LB_PEER_ST_READY)
osmo_stat_item_inc(osmo_stat_item_group_get_item(g_smlc->statg, SMLC_STAT_LB_PEERS_ACTIVE), 1);
}
static void lb_peer_st_ready(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct lb_peer *lbp = fi->priv;
struct lb_peer_ev_ctx *ctx;
@@ -323,12 +369,28 @@ void lb_peer_st_ready(struct osmo_fsm_inst *fi, uint32_t event, void *data)
lb_peer_rx_reset(lbp, msg);
return;
case LB_PEER_EV_AVAILABLE:
/* Send a RESET to the peer. */
lb_peer_reset(lbp);
return;
case LB_PEER_EV_UNAVAILABLE:
lb_peer_discard_all_conns(lbp);
lb_peer_state_chg(lbp, LB_PEER_ST_WAIT_RX_RESET);
return;
default:
LOG_LB_PEER(lbp, LOGL_ERROR, "Unhandled event: %s\n", osmo_fsm_event_name(&lb_peer_fsm, event));
return;
}
}
static void lb_peer_st_ready_onleave(struct osmo_fsm_inst *fi, uint32_t next_state)
{
if (next_state != LB_PEER_ST_READY)
osmo_stat_item_dec(osmo_stat_item_group_get_item(g_smlc->statg, SMLC_STAT_LB_PEERS_ACTIVE), 1);
}
static int lb_peer_fsm_timer_cb(struct osmo_fsm_inst *fi)
{
struct lb_peer *lbp = fi->priv;
@@ -336,10 +398,17 @@ static int lb_peer_fsm_timer_cb(struct osmo_fsm_inst *fi)
return 0;
}
void lb_peer_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
/* struct lb_peer destructor: */
static void lb_peer_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
{
struct lb_peer *lbp = fi->priv;
lb_peer_discard_all_conns(lbp);
if (lbp->fi->state == LB_PEER_ST_READY)
osmo_stat_item_dec(osmo_stat_item_group_get_item(g_smlc->statg, SMLC_STAT_LB_PEERS_ACTIVE), 1);
osmo_stat_item_dec(osmo_stat_item_group_get_item(g_smlc->statg, SMLC_STAT_LB_PEERS_TOTAL), 1);
llist_del(&lbp->entry);
}
@@ -352,8 +421,8 @@ static const struct value_string lb_peer_fsm_event_names[] = {
OSMO_VALUE_STRING(LB_PEER_EV_MSG_DOWN_CO),
OSMO_VALUE_STRING(LB_PEER_EV_RX_RESET),
OSMO_VALUE_STRING(LB_PEER_EV_RX_RESET_ACK),
OSMO_VALUE_STRING(LB_PEER_EV_CONNECTION_SUCCESS),
OSMO_VALUE_STRING(LB_PEER_EV_CONNECTION_TIMEOUT),
OSMO_VALUE_STRING(LB_PEER_EV_AVAILABLE),
OSMO_VALUE_STRING(LB_PEER_EV_UNAVAILABLE),
{}
};
@@ -367,7 +436,8 @@ static const struct osmo_fsm_state lb_peer_fsm_states[] = {
| S(LB_PEER_EV_RX_RESET)
| S(LB_PEER_EV_MSG_UP_CO_INITIAL)
| S(LB_PEER_EV_MSG_UP_CO)
| S(LB_PEER_EV_CONNECTION_TIMEOUT)
| S(LB_PEER_EV_AVAILABLE)
| S(LB_PEER_EV_UNAVAILABLE)
,
.out_state_mask = 0
| S(LB_PEER_ST_WAIT_RX_RESET)
@@ -384,7 +454,8 @@ static const struct osmo_fsm_state lb_peer_fsm_states[] = {
| S(LB_PEER_EV_RX_RESET_ACK)
| S(LB_PEER_EV_MSG_UP_CO_INITIAL)
| S(LB_PEER_EV_MSG_UP_CO)
| S(LB_PEER_EV_CONNECTION_TIMEOUT)
| S(LB_PEER_EV_AVAILABLE)
| S(LB_PEER_EV_UNAVAILABLE)
,
.out_state_mask = 0
| S(LB_PEER_ST_WAIT_RX_RESET)
@@ -396,6 +467,8 @@ static const struct osmo_fsm_state lb_peer_fsm_states[] = {
[LB_PEER_ST_READY] = {
.name = "READY",
.action = lb_peer_st_ready,
.onenter = lb_peer_st_ready_onenter,
.onleave = lb_peer_st_ready_onleave,
.in_event_mask = 0
| S(LB_PEER_EV_RX_RESET)
| S(LB_PEER_EV_MSG_UP_CO_INITIAL)
@@ -403,6 +476,8 @@ static const struct osmo_fsm_state lb_peer_fsm_states[] = {
| S(LB_PEER_EV_MSG_DOWN_CO_INITIAL)
| S(LB_PEER_EV_MSG_DOWN_CO)
| S(LB_PEER_EV_MSG_DOWN_CL)
| S(LB_PEER_EV_AVAILABLE)
| S(LB_PEER_EV_UNAVAILABLE)
,
.out_state_mask = 0
| S(LB_PEER_ST_WAIT_RX_RESET)
@@ -482,14 +557,3 @@ int lb_peer_up_l2(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *calling
return osmo_fsm_inst_dispatch(lb_peer->fi, event, &ctx);
}
void lb_peer_disconnect(struct sccp_lb_inst *sli, uint32_t conn_id)
{
struct lb_conn *lb_conn;
llist_for_each_entry(lb_conn, &sli->lb_conns, entry) {
if (lb_conn->sccp_conn_id == conn_id) {
lb_conn_discard(lb_conn);
return;
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* (C) 2020 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
* (C) 2020-2025 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
* All Rights Reserved
*
* SPDX-License-Identifier: AGPL-3.0+
@@ -85,6 +85,126 @@ struct sccp_lb_inst *sccp_lb_init(void *talloc_ctx, struct osmo_sccp_instance *s
return sli;
}
static void handle_notice_ind(struct sccp_lb_inst *sli, const struct osmo_scu_notice_param *ni)
{
struct lb_peer *lbp;
lbp = lb_peer_find(sli, &ni->calling_addr);
if (!lbp) {
LOG_SCCP_LB(sli, LOGL_DEBUG, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s' importance=%u didn't match any lb_peer, ignoring\n",
osmo_sccp_addr_dump(&ni->calling_addr),
ni->cause, osmo_sccp_return_cause_name(ni->cause),
ni->importance);
return;
}
LOG_LB_PEER(lbp, LOGL_NOTICE, "N-NOTICE.ind cause=%u='%s' importance=%u\n",
ni->cause, osmo_sccp_return_cause_name(ni->cause),
ni->importance);
switch (ni->cause) {
case SCCP_RETURN_CAUSE_SUBSYSTEM_CONGESTION:
case SCCP_RETURN_CAUSE_NETWORK_CONGESTION:
/* Transient failures (hopefully), keep going. */
return;
default:
break;
}
/* Messages are not arriving to lb_peer. Signal it is unavailable to update local state. */
osmo_fsm_inst_dispatch(lbp->fi, LB_PEER_EV_UNAVAILABLE, NULL);
}
static void handle_pcstate_ind(struct sccp_lb_inst *sli, const struct osmo_scu_pcstate_param *pcst)
{
struct osmo_ss7_instance *cs7 = osmo_sccp_get_ss7(sli->sccp);
struct lb_peer *lbp;
bool connected;
bool disconnected;
LOG_SCCP_LB(sli, LOGL_DEBUG, "N-PCSTATE ind: affected_pc=%u=%s sp_status=%s remote_sccp_status=%s\n",
pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc),
osmo_sccp_sp_status_name(pcst->sp_status),
osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status));
/* If we don't care about that point-code, ignore PCSTATE. */
lbp = lb_peer_find_by_pc(sli, pcst->affected_pc);
if (!lbp) {
LOG_SCCP_LB(sli, LOGL_DEBUG, "No lb_peer found under pc=%u=%s\n",
pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc));
return;
}
/* See if this marks the point code to have become available, or to have been lost.
*
* I want to detect two events:
* - connection event (both indicators say PC is reachable).
* - disconnection event (at least one indicator says the PC is not reachable).
*
* There are two separate incoming indicators with various possible values -- the incoming events can be:
*
* - neither connection nor disconnection indicated -- just indicating congestion
* connected == false, disconnected == false --> do nothing.
* - both incoming values indicate that we are connected
* --> trigger connected
* - both indicate we are disconnected
* --> trigger disconnected
* - one value indicates 'connected', the other indicates 'disconnected'
* --> trigger disconnected
*
* Congestion could imply that we're connected, but it does not indicate that a PC's reachability changed, so no need to
* trigger on that.
*/
connected = false;
disconnected = false;
switch (pcst->sp_status) {
case OSMO_SCCP_SP_S_ACCESSIBLE:
connected = true;
break;
case OSMO_SCCP_SP_S_INACCESSIBLE:
disconnected = true;
break;
default:
case OSMO_SCCP_SP_S_CONGESTED:
/* Neither connecting nor disconnecting */
break;
}
switch (pcst->remote_sccp_status) {
case OSMO_SCCP_REM_SCCP_S_AVAILABLE:
if (!disconnected)
connected = true;
break;
case OSMO_SCCP_REM_SCCP_S_UNAVAILABLE_UNKNOWN:
case OSMO_SCCP_REM_SCCP_S_UNEQUIPPED:
case OSMO_SCCP_REM_SCCP_S_INACCESSIBLE:
disconnected = true;
connected = false;
break;
default:
case OSMO_SCCP_REM_SCCP_S_CONGESTED:
/* Neither connecting nor disconnecting */
break;
}
if (disconnected) {
LOG_SCCP_LB(sli, LOGL_NOTICE,
"now unreachable: N-PCSTATE ind: pc=%u=%s sp_status=%s remote_sccp_status=%s\n",
pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc),
osmo_sccp_sp_status_name(pcst->sp_status),
osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status));
osmo_fsm_inst_dispatch(lbp->fi, LB_PEER_EV_UNAVAILABLE, NULL);
} else if (connected) {
LOG_SCCP_LB(sli, LOGL_NOTICE,
"now available: N-PCSTATE ind: pc=%u=%s sp_status=%s remote_sccp_status=%s\n",
pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc),
osmo_sccp_sp_status_name(pcst->sp_status),
osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status));
osmo_fsm_inst_dispatch(lbp->fi, LB_PEER_EV_AVAILABLE, NULL);
}
}
static int sccp_lb_sap_up(struct osmo_prim_hdr *oph, void *_scu)
{
struct osmo_sccp_user *scu = _scu;
@@ -163,6 +283,24 @@ static int sccp_lb_sap_up(struct osmo_prim_hdr *oph, void *_scu)
rc = lb_peer_up_l2(sli, peer_addr, false, 0, oph->msg);
break;
case OSMO_PRIM(OSMO_SCU_PRIM_N_NOTICE, PRIM_OP_INDICATION):
handle_notice_ind(sli, &prim->u.notice);
rc = 0;
break;
case OSMO_PRIM(OSMO_SCU_PRIM_N_PCSTATE, PRIM_OP_INDICATION):
handle_pcstate_ind(sli, &prim->u.pcstate);
rc = 0;
break;
case OSMO_PRIM(OSMO_SCU_PRIM_N_STATE, PRIM_OP_INDICATION):
LOG_SCCP_LB(sli, LOGL_INFO,
"SCCP-User-SAP: Ignoring %s.%s\n",
osmo_scu_prim_type_name(oph->primitive),
get_value_string(osmo_prim_op_names, oph->operation));
rc = 0;
break;
default:
LOG_SCCP_LB_CL(sli, NULL, LOGL_ERROR, "%s(%s) unsupported\n", __func__, osmo_scu_prim_name(oph));
rc = -1;

View File

@@ -54,6 +54,19 @@ static const struct rate_ctr_group_desc smlc_ctrg_desc = {
smlc_ctr_description,
};
static const struct osmo_stat_item_desc smlc_stat_item_description[] = {
[SMLC_STAT_LB_PEERS_TOTAL] = { "lb_peers.total", "Total Lb peers seen since startup", OSMO_STAT_ITEM_NO_UNIT, 4, 0},
[SMLC_STAT_LB_PEERS_ACTIVE] = { "lb_peers.active", "Currently active Lb peers", OSMO_STAT_ITEM_NO_UNIT, 4, 0},
};
static const struct osmo_stat_item_group_desc smlc_statg_desc = {
"smlc",
"serving mobile location center",
OSMO_STATS_CLASS_GLOBAL,
ARRAY_SIZE(smlc_stat_item_description),
smlc_stat_item_description,
};
struct smlc_state *smlc_state_alloc(void *ctx)
{
struct smlc_state *smlc = talloc_zero(ctx, struct smlc_state);
@@ -61,5 +74,14 @@ struct smlc_state *smlc_state_alloc(void *ctx)
INIT_LLIST_HEAD(&smlc->subscribers);
INIT_LLIST_HEAD(&smlc->cell_locations);
smlc->ctrs = rate_ctr_group_alloc(smlc, &smlc_ctrg_desc, 0);
smlc->statg = osmo_stat_item_group_alloc(smlc, &smlc_statg_desc, 0);
if (!smlc->statg)
goto ret_free;
return smlc;
ret_free:
rate_ctr_group_free(smlc->ctrs);
talloc_free(smlc);
return NULL;
}

View File

@@ -17,10 +17,6 @@
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#include <osmocom/smlc/smlc_data.h>

View File

@@ -19,7 +19,6 @@
#include <osmocom/ctrl/control_cmd.h>
#include <osmocom/ctrl/control_if.h>
#include <osmocom/ctrl/ports.h>
#include <osmocom/ctrl/control_vty.h>
#include <osmocom/core/application.h>
#include <osmocom/core/linuxlist.h>
@@ -29,17 +28,15 @@
#include <osmocom/core/rate_ctr.h>
#include <osmocom/vty/telnet_interface.h>
#include <osmocom/vty/ports.h>
#include <osmocom/vty/logging.h>
#include <osmocom/vty/command.h>
#include <osmocom/vty/misc.h>
#include <osmocom/sigtran/xua_msg.h>
#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/sigtran/osmo_ss7.h>
#include <osmocom/smlc/debug.h>
#include <osmocom/smlc/smlc_data.h>
#include <osmocom/smlc/sccp_lb_inst.h>
#include <osmocom/smlc/cell_locations.h>
#include <osmocom/smlc/smlc_vty.h>
#define _GNU_SOURCE
#include <getopt.h>
@@ -170,6 +167,7 @@ static struct vty_app_info vty_info = {
"This is free software: you are free to change and redistribute it.\r\n"
"There is NO WARRANTY, to the extent permitted by law.\r\n",
.version = PACKAGE_VERSION,
.go_parent_cb = osmo_ss7_vty_go_parent,
};
static void signal_handler(int signal)
@@ -239,17 +237,11 @@ int main(int argc, char **argv)
g_smlc = smlc_state_alloc(tall_smlc_ctx);
/* This needs to precede handle_options() */
vty_init(&vty_info);
logging_vty_add_cmds();
osmo_talloc_vty_add_cmds();
ctrl_vty_init(tall_smlc_ctx);
cell_locations_vty_init();
/* Initialize SS7 */
OSMO_ASSERT(osmo_ss7_init() == 0);
osmo_ss7_vty_init_asp(tall_smlc_ctx);
osmo_sccp_vty_init();
/* This needs to precede handle_options() */
smlc_vty_init(&vty_info);
/* parse options */
handle_options(argc, argv);
@@ -262,14 +254,13 @@ int main(int argc, char **argv)
}
/* Start telnet interface after reading config for vty_get_bind_addr() */
rc = telnet_init_dynif(tall_smlc_ctx, g_smlc, vty_get_bind_addr(), OSMO_VTY_PORT_SMLC);
rc = telnet_init_default(tall_smlc_ctx, g_smlc, OSMO_VTY_PORT_SMLC);
if (rc < 0)
exit(1);
/* start control interface after reading config for
* ctrl_vty_get_bind_addr() */
g_smlc->ctrl = ctrl_interface_setup_dynip2(g_smlc, ctrl_vty_get_bind_addr(), OSMO_CTRL_PORT_SMLC,
smlc_ctrl_node_lookup, _LAST_CTRL_NODE_SMLC);
g_smlc->ctrl = ctrl_interface_setup2(g_smlc, OSMO_CTRL_PORT_SMLC, smlc_ctrl_node_lookup, _LAST_CTRL_NODE_SMLC);
if (!g_smlc->ctrl) {
fprintf(stderr, "Failed to init the control interface. Exiting.\n");
exit(1);

48
src/osmo-smlc/smlc_vty.c Normal file
View File

@@ -0,0 +1,48 @@
/*
* (C) 2025 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
* All Rights Reserved
*
* SPDX-License-Identifier: AGPL-3.0+
*
* Author: Pau Espin Pedrol
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <osmocom/ctrl/control_vty.h>
#include <osmocom/vty/logging.h>
#include <osmocom/vty/misc.h>
#include <osmocom/vty/stats.h>
#include <osmocom/vty/vty.h>
#include <osmocom/sigtran/osmo_ss7.h>
#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/smlc/cell_locations.h>
void smlc_vty_init(struct vty_app_info *vty_app_info)
{
vty_init(vty_app_info);
logging_vty_add_cmds();
osmo_talloc_vty_add_cmds();
ctrl_vty_init(vty_app_info->tall_ctx);
osmo_fsm_vty_add_cmds();
osmo_stats_vty_add_cmds();
osmo_ss7_vty_init_asp(vty_app_info->tall_ctx);
osmo_sccp_vty_init();
cell_locations_vty_init();
}

View File

@@ -37,11 +37,13 @@ DISTCLEANFILES = \
$(NULL)
if ENABLE_EXT_TESTS
python-tests: $(BUILT_SOURCES)
python-tests: $(top_builddir)/src/osmo-smlc/osmo-smlc
$(MAKE) vty-test
$(MAKE) ctrl-test
osmotestvty.py -p $(abs_top_srcdir) -w $(abs_top_builddir) -v
osmotestconfig.py -p $(abs_top_srcdir) -w $(abs_top_builddir) -v
else
python-tests: $(BUILT_SOURCES)
python-tests:
echo "Not running python-based tests (determined at configure-time)"
endif
@@ -51,7 +53,7 @@ VTY_TEST ?= *.vty
# To update the VTY script from current application behavior,
# pass -u to vty_script_runner.py by doing:
# make vty-test U=-u
vty-test:
vty-test: $(top_builddir)/src/osmo-smlc/osmo-smlc
osmo_verify_transcript_vty.py -v \
-n OsmoSMLC -p 4271 \
-r "$(top_builddir)/src/osmo-smlc/osmo-smlc -c $(top_srcdir)/tests/osmo-smlc.cfg" \
@@ -60,14 +62,11 @@ vty-test:
# To update the CTRL script from current application behavior,
# pass -u to ctrl_script_runner.py by doing:
# make ctrl-test U=-u
ctrl-test:
-rm -f $(CTRL_TEST_DB)
ctrl-test: $(top_builddir)/src/osmo-smlc/osmo-smlc
osmo_verify_transcript_ctrl.py -v \
-p 4272 \
-r "$(top_builddir)/src/osmo-smlc/osmo-smlc -c $(top_srcdir)/tests/osmo-smlc.cfg" \
$(U) $(srcdir)/*.ctrl
-rm -f $(CTRL_TEST_DB)
-rm $(CTRL_TEST_DB)-*
check-local: atconfig $(TESTSUITE)
$(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)

View File

@@ -20,7 +20,7 @@ EXTRA_DIST = \
smlc_subscr_test.err \
$(NULL)
noinst_PROGRAMS = \
check_PROGRAMS = \
smlc_subscr_test \
$(NULL)