mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-10-23 08:12:01 +00:00
Compare commits
254 Commits
1.0.2
...
sysmocom/i
Author | SHA1 | Date | |
---|---|---|---|
|
6950d14c5b | ||
|
cf2ca648e9 | ||
|
62ee416d95 | ||
|
e42a2ab158 | ||
|
9336cede84 | ||
|
8c6732909b | ||
|
960d28087e | ||
|
a27b295100 | ||
|
9015d4db52 | ||
|
3cda077541 | ||
|
c3da27fa98 | ||
|
bfc190e0fc | ||
|
f959ad8991 | ||
|
f3bcdd272b | ||
|
1d125c902f | ||
|
35ebbbea7a | ||
|
a95927c1de | ||
|
03ded61060 | ||
|
26d0326157 | ||
|
885a11b33e | ||
|
99f2477653 | ||
|
a9791df3b9 | ||
|
d9202b342c | ||
|
c902bd4032 | ||
|
ad21c3b8e3 | ||
|
28fdbdcd53 | ||
|
903ad2e135 | ||
|
04bfcdd6c2 | ||
|
3a9c52a5dc | ||
|
c6580c5b2c | ||
|
fb845bb1df | ||
|
6f4e83beb0 | ||
|
214302b306 | ||
|
defe78f1e1 | ||
|
061787878c | ||
|
00007897d4 | ||
|
5c4386c692 | ||
|
fc68c83ddb | ||
|
74101106a1 | ||
|
db916bfd8d | ||
|
a54358879f | ||
|
a54b47b048 | ||
|
3b922064a4 | ||
|
5b3fd465d1 | ||
|
0991c684d3 | ||
|
dc4b14b269 | ||
|
687270de3a | ||
|
96f88fda06 | ||
|
2ae1f5b7e0 | ||
|
63b99ced83 | ||
|
0b8e6dd2df | ||
|
9f2eaf8f56 | ||
|
afce55a4bc | ||
|
f3a1ca5d04 | ||
|
c7fcdeb18e | ||
|
3aa8b30bb3 | ||
|
208250558f | ||
|
bdb3f26668 | ||
|
69d3c26e43 | ||
|
3f18cfce85 | ||
|
658d1c3e14 | ||
|
6d1df9ad96 | ||
|
9bc1ddc849 | ||
|
90e2c751e9 | ||
|
15f6c9f1e8 | ||
|
5d5a25bc5a | ||
|
95c9f29634 | ||
|
30753e4a28 | ||
|
8fe0feb21b | ||
|
444a516f18 | ||
|
0f3bce4aef | ||
|
edafdc14f3 | ||
|
54fc3a1318 | ||
|
baefda5d64 | ||
|
8dfe9690c5 | ||
|
fafb074268 | ||
|
a3dfdcb308 | ||
|
bae2594424 | ||
|
5e007d9445 | ||
|
42024336fe | ||
|
bb81326719 | ||
|
276192d27c | ||
|
c4b9b4edbb | ||
|
b70dfa610d | ||
|
4b940126a3 | ||
|
debb0e3868 | ||
|
d025a3cfbb | ||
|
4b3b13e10c | ||
|
fa48a98e71 | ||
|
9fd87ecd11 | ||
|
8e5c63f032 | ||
|
2cd36e87ae | ||
|
0bc6c11cbf | ||
|
182adecb98 | ||
|
3d0a500f2d | ||
|
a5c9cea22c | ||
|
f45dc35321 | ||
|
2f6c4b6479 | ||
|
2385074cba | ||
|
d8b0b61ca8 | ||
|
19f0735752 | ||
|
ffd9968d3a | ||
|
deb227b98e | ||
|
5e611021b0 | ||
|
d04db9d907 | ||
|
3c94c2c597 | ||
|
372a3bd346 | ||
|
51bf76ef47 | ||
|
aa60582036 | ||
|
6b2623d944 | ||
|
8b1272a6d3 | ||
|
080921a551 | ||
|
8e7f4c6f21 | ||
|
4a9b871de5 | ||
|
93f6fa5a81 | ||
|
f1777ee843 | ||
|
9e8e0e6a29 | ||
|
cf3d2a1fad | ||
|
e4baf402cb | ||
|
53d782fc38 | ||
|
33a343858d | ||
|
15b1fce69c | ||
|
2f8117d214 | ||
|
8927bb46d5 | ||
|
d52b1c4342 | ||
|
5d9004bc9b | ||
|
a4198d1922 | ||
|
544a203f67 | ||
|
b40df4c09e | ||
|
5c1c0bad89 | ||
|
1e361301d1 | ||
|
9e8322ca0c | ||
|
9bd121b75b | ||
|
fa029f08c2 | ||
|
db9c064dd4 | ||
|
a0da2dbe9e | ||
|
7df5705251 | ||
|
da7424cc54 | ||
|
8146cfa782 | ||
|
330898afb7 | ||
|
77544a65b5 | ||
|
4e5ddfa91a | ||
|
cba441f3de | ||
|
3acbc817f6 | ||
|
bcb98b1754 | ||
|
2a7426d7cb | ||
|
b9bb2a4f54 | ||
|
098c14800f | ||
|
a46c651a4a | ||
|
4cc1f72cb7 | ||
|
4f143e52b6 | ||
|
e3407f8884 | ||
|
7d1b6b1c79 | ||
|
656d7cd0b4 | ||
|
553d2a8ceb | ||
|
23f22b1183 | ||
|
090aabe052 | ||
|
be37fbd85d | ||
|
3cc0836b1a | ||
|
8cd32937da | ||
|
377a9f5dea | ||
|
b8df4d5318 | ||
|
daa0652d3f | ||
|
f7436b22b3 | ||
|
711333c113 | ||
|
91f04dfe3a | ||
|
4371ff8cce | ||
|
92223cc32e | ||
|
2f5cc8abe0 | ||
|
ba47b525ff | ||
|
cf1707af7f | ||
|
d6d0d8b86f | ||
|
38137e84f7 | ||
|
82724653e7 | ||
|
da8d9bc355 | ||
|
c59e52a6aa | ||
|
24c4af1d82 | ||
|
f918920d65 | ||
|
292f1ce533 | ||
|
23e7f28c5c | ||
|
243c7cb044 | ||
|
cf2591f6fc | ||
|
6a2d8985bf | ||
|
c6794eed1d | ||
|
7a70a4f52a | ||
|
c6172a320b | ||
|
5280ed558c | ||
|
b36b910366 | ||
|
b47e52c958 | ||
|
267f6c7e0d | ||
|
5e47b1a1d3 | ||
|
b9e5403ef4 | ||
|
b6769b99de | ||
|
39daffd7a5 | ||
|
71d1e17e5e | ||
|
2c9e65051c | ||
|
a2ce4aa615 | ||
|
ee1541d504 | ||
|
9dcae17866 | ||
|
c2c5176328 | ||
|
a2c182df6d | ||
|
070f673b12 | ||
|
e2a10dbe35 | ||
|
bf30ec26e5 | ||
|
dcbc852125 | ||
|
48e091ea2b | ||
|
712074cb17 | ||
|
a34aedf7f9 | ||
|
2e5c13129d | ||
|
da5b3fcd32 | ||
|
5291ee5c16 | ||
|
5773987881 | ||
|
836b904e77 | ||
|
444d50b77f | ||
|
b3b8ccfa54 | ||
|
231aa60ce4 | ||
|
8b713f817d | ||
|
ce3b41fdb6 | ||
|
0f93bb80e4 | ||
|
477a054c2c | ||
|
52ddce4378 | ||
|
2945fd4611 | ||
|
2449c0ce58 | ||
|
5d145b5477 | ||
|
45b13244f0 | ||
|
cb91aa7e6c | ||
|
7ef6d9893f | ||
|
6aeee0a0d9 | ||
|
17d061bd8e | ||
|
ef3548c0a1 | ||
|
add0953692 | ||
|
ca3977c8fe | ||
|
a234287d09 | ||
|
8440c9f04b | ||
|
2cb732aeb9 | ||
|
a7551e033e | ||
|
08ed1d73f2 | ||
|
af9bfac58d | ||
|
ac9951e54a | ||
|
75cdeaf1e3 | ||
|
41f8f047bc | ||
|
195d2dc724 | ||
|
315abfd46b | ||
|
648b9db47f | ||
|
8291623054 | ||
|
5331cf8dbd | ||
|
cf8e56cd1e | ||
|
e157174447 | ||
|
493534bf56 | ||
|
342f59d92e | ||
|
aefb0c45e9 | ||
|
692f31446e | ||
|
2cde90e904 | ||
|
f6672ab8b0 |
82
.gitignore
vendored
82
.gitignore
vendored
@@ -1,83 +1 @@
|
||||
debian/*.log
|
||||
*.o
|
||||
*.lo
|
||||
*.a
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
bscconfig.h
|
||||
bscconfig.h.in
|
||||
openbsc.pc
|
||||
src/osmo-nitb/osmo-nitb
|
||||
src/osmo-bsc_mgcp/osmo-bsc_mgcp
|
||||
src/osmo-bsc/osmo-bsc
|
||||
src/utils/meas_vis
|
||||
src/utils/meas_json
|
||||
src/utils/osmo-meas-pcap2db
|
||||
src/utils/osmo-meas-udp2db
|
||||
src/utils/smpp_mirror
|
||||
*.*~
|
||||
*.sw?
|
||||
.libs
|
||||
*.pyc
|
||||
*.gcda
|
||||
*.gcno
|
||||
|
||||
#configure
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
config.log
|
||||
config.status
|
||||
config.guess
|
||||
config.sub
|
||||
configure
|
||||
compile
|
||||
depcomp
|
||||
install-sh
|
||||
missing
|
||||
stamp-h1
|
||||
libtool
|
||||
ltmain.sh
|
||||
|
||||
# git-version-gen magic
|
||||
.tarball-version
|
||||
.version
|
||||
|
||||
|
||||
# apps and app data
|
||||
hlr.sqlite3
|
||||
src/utils/bs11_config
|
||||
src/ipaccess/ipaccess-config
|
||||
src/ipaccess/abisip-find
|
||||
src/ipaccess/ipaccess-firmware
|
||||
src/ipaccess/ipaccess-proxy
|
||||
src/utils/isdnsync
|
||||
src/nat/bsc_nat
|
||||
src/gprs/osmo-sgsn
|
||||
src/gprs/osmo-gbproxy
|
||||
src/gprs/osmo-gtphub
|
||||
src/osmo-bsc_nat/osmo-bsc_nat
|
||||
src/libcommon/gsup_test_client
|
||||
src/osmo-msc/osmo-msc
|
||||
|
||||
#tests
|
||||
tests/testsuite.dir
|
||||
tests/*/*_test
|
||||
# ignore compiled binaries like msc_vlr_test_foo; do not ignore
|
||||
# msc_vlr_test_foo.{c,ok,err}, but do still ignore the corresponding .o object
|
||||
# files:
|
||||
tests/msc_vlr/msc_vlr_test_*
|
||||
!tests/msc_vlr/msc_vlr_test_*.*
|
||||
tests/msc_vlr/msc_vlr_test_*.o
|
||||
|
||||
|
||||
tests/atconfig
|
||||
tests/atlocal
|
||||
tests/package.m4
|
||||
tests/testsuite
|
||||
tests/testsuite.log
|
||||
|
||||
gsn_restart
|
||||
src/openbsc.cfg*
|
||||
writtenconfig/
|
||||
gtphub_restart_count
|
||||
|
@@ -1,3 +0,0 @@
|
||||
[gerrit]
|
||||
host=gerrit.osmocom.org
|
||||
project=osmo-mgw
|
12
.mailmap
12
.mailmap
@@ -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>
|
33
Makefile.am
33
Makefile.am
@@ -1,33 +0,0 @@
|
||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
|
||||
|
||||
## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac
|
||||
## remove line below when OE toolchain is updated to version which include those
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
AM_CPPFLAGS = \
|
||||
$(all_includes) \
|
||||
-I$(top_srcdir)/include \
|
||||
$(NULL)
|
||||
|
||||
SUBDIRS = \
|
||||
doc \
|
||||
include \
|
||||
src \
|
||||
tests \
|
||||
contrib \
|
||||
$(NULL)
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = \
|
||||
libosmo-legacy-mgcp.pc \
|
||||
libosmo-mgcp-client.pc \
|
||||
$(NULL)
|
||||
|
||||
BUILT_SOURCES = $(top_srcdir)/.version
|
||||
EXTRA_DIST = git-version-gen osmoappdesc.py .version
|
||||
|
||||
@RELMAKE@
|
||||
|
||||
$(top_srcdir)/.version:
|
||||
echo $(VERSION) > $@-t && mv $@-t $@
|
||||
dist-hook:
|
||||
echo $(VERSION) > $(distdir)/.tarball-version
|
28
README
28
README
@@ -1,28 +0,0 @@
|
||||
About OsmoMGW
|
||||
=============
|
||||
|
||||
OsmoMGW originated from the OpenBSC project, which started as a minimalistic
|
||||
all-in-one implementation of the GSM Network. In 2017, OpenBSC had reached
|
||||
maturity and diversity (including M3UA SIGTRAN and 3G support in the form of
|
||||
IuCS and IuPS interfaces) that naturally lead to a separation of the all-in-one
|
||||
approach to fully independent separate programs as in typical GSM networks.
|
||||
|
||||
OsmoMGW was one of the parts split off from the old openbsc.git. It originated
|
||||
as a solution to merely navigate RTP streams through a NAT, but has since
|
||||
matured to a Media Gateway implementation that is capable of streaming RTP for
|
||||
2G (AoIP) and 3G (IuCS) GSM networks as well as (still not implemented at time
|
||||
of writing) transcoding between TRAU, various RTP payloads and IuUP.
|
||||
|
||||
The OsmoMGW program exposes an MGCP interface towards clients like OsmoMSC and
|
||||
OsmoBSC, and receives and sends RTP streams as configured via MGCP.
|
||||
|
||||
The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC (found
|
||||
in osmo-msc.git) to instruct OsmoMGW via its MGCP service.
|
||||
|
||||
The libosmo-mgcp library exposes MGCP server utilities used by e.g. OsmoBSC-NAT
|
||||
(found in osmo-bsc.git) to navigate RTP streams through a NAT.
|
||||
(At time of writing, this is still called libosmo-legacy-mgcp.)
|
||||
|
||||
Find OsmoMGW issue tracker and wiki online at
|
||||
https://osmocom.org/projects/osmo-mgw
|
||||
https://osmocom.org/projects/osmo-mgw/wiki
|
@@ -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://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
|
||||
# In short:
|
||||
# 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:0.
|
||||
# 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
|
137
configure.ac
137
configure.ac
@@ -1,137 +0,0 @@
|
||||
dnl Process this file with autoconf to produce a configure script
|
||||
AC_INIT([osmo-mgw],
|
||||
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([.])
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||
AC_CONFIG_TESTDIR(tests)
|
||||
|
||||
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 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])
|
||||
|
||||
dnl check for AX_CHECK_COMPILE_FLAG
|
||||
m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [
|
||||
AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])
|
||||
])
|
||||
|
||||
dnl checks for libraries
|
||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
|
||||
AC_SUBST(LIBRARY_DL)
|
||||
|
||||
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.9.5)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0)
|
||||
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.0.1)
|
||||
|
||||
# Enable/disable transcoding within osmo-bsc_mgcp?
|
||||
AC_ARG_ENABLE([mgcp-transcoding], [AS_HELP_STRING([--enable-mgcp-transcoding], [Build the MGCP gateway with internal transcoding enabled.])],
|
||||
[osmo_ac_mgcp_transcoding="$enableval"],[osmo_ac_mgcp_transcoding="no"])
|
||||
AC_ARG_WITH([g729], [AS_HELP_STRING([--with-g729], [Enable G.729 encoding/decoding.])], [osmo_ac_with_g729="$withval"],[osmo_ac_with_g729="no"])
|
||||
|
||||
if test "$osmo_ac_mgcp_transcoding" = "yes" ; then
|
||||
AC_SEARCH_LIBS([gsm_create], [gsm], [LIBRARY_GSM="$LIBS";LIBS=""], [AC_MSG_ERROR([--enable-mgcp-transcoding: cannot find usable libgsm])])
|
||||
AC_SUBST(LIBRARY_GSM)
|
||||
if test "$osmo_ac_with_g729" = "yes" ; then
|
||||
PKG_CHECK_MODULES(LIBBCG729, libbcg729 >= 0.1, [AC_DEFINE([HAVE_BCG729], [1], [Use bgc729 decoder/encoder])])
|
||||
fi
|
||||
AC_DEFINE(BUILD_MGCP_TRANSCODING, 1, [Define if we want to build the MGCP gateway with transcoding support])
|
||||
fi
|
||||
AM_CONDITIONAL(BUILD_MGCP_TRANSCODING, test "x$osmo_ac_mgcp_transcoding" = "xyes")
|
||||
AC_SUBST(osmo_ac_mgcp_transcoding)
|
||||
|
||||
dnl Checks for typedefs, structures and compiler characteristics
|
||||
|
||||
# The following test is taken from WebKit's webkit.m4
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fvisibility=hidden "
|
||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
SYMBOL_VISIBILITY="-fvisibility=hidden"],
|
||||
AC_MSG_RESULT([no]))
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
AC_SUBST(SYMBOL_VISIBILITY)
|
||||
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=null-dereference], [CFLAGS="$CFLAGS -Werror=null-dereference"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])
|
||||
|
||||
# Coverage build taken from WebKit's configure.in
|
||||
AC_MSG_CHECKING([whether to enable code coverage support])
|
||||
AC_ARG_ENABLE(coverage,
|
||||
AC_HELP_STRING([--enable-coverage],
|
||||
[enable code coverage support [default=no]]),
|
||||
[],[enable_coverage="no"])
|
||||
AC_MSG_RESULT([$enable_coverage])
|
||||
if test "$enable_coverage" = "yes"; then
|
||||
COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
AC_SUBST([COVERAGE_CFLAGS])
|
||||
AC_SUBST([COVERAGE_LDFLAGS])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([vty_tests],
|
||||
AC_HELP_STRING([--enable-vty-tests],
|
||||
[Include the VTY/CTRL tests in make check (deprecated)
|
||||
[default=no]]),
|
||||
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
|
||||
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
|
||||
AM_PATH_PYTHON
|
||||
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.])
|
||||
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")
|
||||
|
||||
dnl Generate the output
|
||||
AM_CONFIG_HEADER(bscconfig.h)
|
||||
|
||||
AC_OUTPUT(
|
||||
libosmo-legacy-mgcp.pc
|
||||
libosmo-mgcp-client.pc
|
||||
include/Makefile
|
||||
include/osmocom/Makefile
|
||||
include/osmocom/legacy_mgcp/Makefile
|
||||
include/osmocom/mgcp_client/Makefile
|
||||
src/Makefile
|
||||
src/libosmo-legacy-mgcp/Makefile
|
||||
src/libosmo-mgcp-client/Makefile
|
||||
src/osmo-bsc_mgcp/Makefile
|
||||
tests/Makefile
|
||||
tests/atlocal
|
||||
tests/legacy_mgcp/Makefile
|
||||
tests/mgcp_client/Makefile
|
||||
doc/Makefile
|
||||
doc/examples/Makefile
|
||||
contrib/Makefile
|
||||
Makefile)
|
@@ -1 +0,0 @@
|
||||
EXTRA_DIST = ipa.py
|
278
contrib/ipa.py
278
contrib/ipa.py
@@ -1,278 +0,0 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- mode: python-mode; py-indent-tabs-mode: nil -*-
|
||||
"""
|
||||
/*
|
||||
* Copyright (C) 2016 sysmocom s.f.m.c. GmbH
|
||||
*
|
||||
* 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 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 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.
|
||||
*/
|
||||
"""
|
||||
|
||||
import struct, random, sys
|
||||
|
||||
class IPA(object):
|
||||
"""
|
||||
Stateless IPA protocol multiplexer: add/remove/parse (extended) header
|
||||
"""
|
||||
version = "0.0.5"
|
||||
TCP_PORT_OML = 3002
|
||||
TCP_PORT_RSL = 3003
|
||||
# OpenBSC extensions: OSMO, MGCP_OLD
|
||||
PROTO = dict(RSL=0x00, CCM=0xFE, SCCP=0xFD, OML=0xFF, OSMO=0xEE, MGCP_OLD=0xFC)
|
||||
# ...OML Router Control, GSUP GPRS extension, Osmocom Authn Protocol
|
||||
EXT = dict(CTRL=0, MGCP=1, LAC=2, SMSC=3, ORC=4, GSUP=5, OAP=6)
|
||||
# OpenBSC extension: SCCP_OLD
|
||||
MSGT = dict(PING=0x00, PONG=0x01, ID_GET=0x04, ID_RESP=0x05, ID_ACK=0x06, SCCP_OLD=0xFF)
|
||||
_IDTAG = dict(SERNR=0, UNITNAME=1, LOCATION=2, TYPE=3, EQUIPVERS=4, SWVERSION=5, IPADDR=6, MACADDR=7, UNIT=8)
|
||||
CTRL_GET = 'GET'
|
||||
CTRL_SET = 'SET'
|
||||
CTRL_REP = 'REPLY'
|
||||
CTRL_ERR = 'ERR'
|
||||
CTRL_TRAP = 'TRAP'
|
||||
|
||||
def _l(self, d, p):
|
||||
"""
|
||||
Reverse dictionary lookup: return key for a given value
|
||||
"""
|
||||
if p is None:
|
||||
return 'UNKNOWN'
|
||||
return list(d.keys())[list(d.values()).index(p)]
|
||||
|
||||
def _tag(self, t, v):
|
||||
"""
|
||||
Create TAG as TLV data
|
||||
"""
|
||||
return struct.pack(">HB", len(v) + 1, t) + v
|
||||
|
||||
def proto(self, p):
|
||||
"""
|
||||
Lookup protocol name
|
||||
"""
|
||||
return self._l(self.PROTO, p)
|
||||
|
||||
def ext(self, p):
|
||||
"""
|
||||
Lookup protocol extension name
|
||||
"""
|
||||
return self._l(self.EXT, p)
|
||||
|
||||
def msgt(self, p):
|
||||
"""
|
||||
Lookup message type name
|
||||
"""
|
||||
return self._l(self.MSGT, p)
|
||||
|
||||
def idtag(self, p):
|
||||
"""
|
||||
Lookup ID tag name
|
||||
"""
|
||||
return self._l(self._IDTAG, p)
|
||||
|
||||
def ext_name(self, proto, exten):
|
||||
"""
|
||||
Return proper extension byte name depending on the protocol used
|
||||
"""
|
||||
if self.PROTO['CCM'] == proto:
|
||||
return self.msgt(exten)
|
||||
if self.PROTO['OSMO'] == proto:
|
||||
return self.ext(exten)
|
||||
return None
|
||||
|
||||
def add_header(self, data, proto, ext=None):
|
||||
"""
|
||||
Add IPA header (with extension if necessary), data must be represented as bytes
|
||||
"""
|
||||
if ext is None:
|
||||
return struct.pack(">HB", len(data) + 1, proto) + data
|
||||
return struct.pack(">HBB", len(data) + 1, proto, ext) + data
|
||||
|
||||
def del_header(self, data):
|
||||
"""
|
||||
Strip IPA protocol header correctly removing extension if present
|
||||
Returns data length, IPA protocol, extension (or None if not defined for a give protocol) and the data without header
|
||||
"""
|
||||
if not len(data):
|
||||
return None, None, None, None
|
||||
(dlen, proto) = struct.unpack('>HB', data[:3])
|
||||
if self.PROTO['OSMO'] == proto or self.PROTO['CCM'] == proto: # there's extension which we have to unpack
|
||||
return struct.unpack('>HBB', data[:4]) + (data[4:], ) # length, protocol, extension, data
|
||||
return dlen, proto, None, data[3:] # length, protocol, _, data
|
||||
|
||||
def split_combined(self, data):
|
||||
"""
|
||||
Split the data which contains multiple concatenated IPA messages into tuple (first, rest) where rest contains remaining messages, first is the single IPA message
|
||||
"""
|
||||
(length, _, _, _) = self.del_header(data)
|
||||
return data[:(length + 3)], data[(length + 3):]
|
||||
|
||||
def tag_serial(self, data):
|
||||
"""
|
||||
Make TAG for serial number
|
||||
"""
|
||||
return self._tag(self._IDTAG['SERNR'], data)
|
||||
|
||||
def tag_name(self, data):
|
||||
"""
|
||||
Make TAG for unit name
|
||||
"""
|
||||
return self._tag(self._IDTAG['UNITNAME'], data)
|
||||
|
||||
def tag_loc(self, data):
|
||||
"""
|
||||
Make TAG for location
|
||||
"""
|
||||
return self._tag(self._IDTAG['LOCATION'], data)
|
||||
|
||||
def tag_type(self, data):
|
||||
"""
|
||||
Make TAG for unit type
|
||||
"""
|
||||
return self._tag(self._IDTAG['TYPE'], data)
|
||||
|
||||
def tag_equip(self, data):
|
||||
"""
|
||||
Make TAG for equipment version
|
||||
"""
|
||||
return self._tag(self._IDTAG['EQUIPVERS'], data)
|
||||
|
||||
def tag_sw(self, data):
|
||||
"""
|
||||
Make TAG for software version
|
||||
"""
|
||||
return self._tag(self._IDTAG['SWVERSION'], data)
|
||||
|
||||
def tag_ip(self, data):
|
||||
"""
|
||||
Make TAG for IP address
|
||||
"""
|
||||
return self._tag(self._IDTAG['IPADDR'], data)
|
||||
|
||||
def tag_mac(self, data):
|
||||
"""
|
||||
Make TAG for MAC address
|
||||
"""
|
||||
return self._tag(self._IDTAG['MACADDR'], data)
|
||||
|
||||
def tag_unit(self, data):
|
||||
"""
|
||||
Make TAG for unit ID
|
||||
"""
|
||||
return self._tag(self._IDTAG['UNIT'], data)
|
||||
|
||||
def identity(self, unit=b'', mac=b'', location=b'', utype=b'', equip=b'', sw=b'', name=b'', serial=b''):
|
||||
"""
|
||||
Make IPA IDENTITY tag list, by default returns empty concatenated bytes of tag list
|
||||
"""
|
||||
return self.tag_unit(unit) + self.tag_mac(mac) + self.tag_loc(location) + self.tag_type(utype) + self.tag_equip(equip) + self.tag_sw(sw) + self.tag_name(name) + self.tag_serial(serial)
|
||||
|
||||
def ping(self):
|
||||
"""
|
||||
Make PING message
|
||||
"""
|
||||
return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PING'])
|
||||
|
||||
def pong(self):
|
||||
"""
|
||||
Make PONG message
|
||||
"""
|
||||
return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PONG'])
|
||||
|
||||
def id_ack(self):
|
||||
"""
|
||||
Make ID_ACK CCM message
|
||||
"""
|
||||
return self.add_header(b'', self.PROTO['CCM'], self.MSGT['ID_ACK'])
|
||||
|
||||
def id_get(self):
|
||||
"""
|
||||
Make ID_GET CCM message
|
||||
"""
|
||||
return self.add_header(self.identity(), self.PROTO['CCM'], self.MSGT['ID_GET'])
|
||||
|
||||
def id_resp(self, data):
|
||||
"""
|
||||
Make ID_RESP CCM message
|
||||
"""
|
||||
return self.add_header(data, self.PROTO['CCM'], self.MSGT['ID_RESP'])
|
||||
|
||||
class Ctrl(IPA):
|
||||
"""
|
||||
Osmocom CTRL protocol implemented on top of IPA multiplexer
|
||||
"""
|
||||
def __init__(self):
|
||||
random.seed()
|
||||
|
||||
def add_header(self, data):
|
||||
"""
|
||||
Add CTRL header
|
||||
"""
|
||||
return super(Ctrl, self).add_header(data.encode('utf-8'), IPA.PROTO['OSMO'], IPA.EXT['CTRL'])
|
||||
|
||||
def rem_header(self, data):
|
||||
"""
|
||||
Remove CTRL header, check for appropriate protocol and extension
|
||||
"""
|
||||
(_, proto, ext, d) = super(Ctrl, self).del_header(data)
|
||||
if self.PROTO['OSMO'] != proto or self.EXT['CTRL'] != ext:
|
||||
return None
|
||||
return d
|
||||
|
||||
def parse(self, data, op=None):
|
||||
"""
|
||||
Parse Ctrl string returning (var, value) pair
|
||||
var could be None in case of ERROR message
|
||||
value could be None in case of GET message
|
||||
"""
|
||||
(s, i, v) = data.split(' ', 2)
|
||||
if s == self.CTRL_ERR:
|
||||
return None, v
|
||||
if s == self.CTRL_GET:
|
||||
return v, None
|
||||
(s, i, var, val) = data.split(' ', 3)
|
||||
if s == self.CTRL_TRAP and i != '0':
|
||||
return None, '%s with non-zero id %s' % (s, i)
|
||||
if op is not None and i != op:
|
||||
if s == self.CTRL_GET + '_' + self.CTRL_REP or s == self.CTRL_SET + '_' + self.CTRL_REP:
|
||||
return None, '%s with unexpected id %s' % (s, i)
|
||||
return var, val
|
||||
|
||||
def trap(self, var, val):
|
||||
"""
|
||||
Make TRAP message with given (vak, val) pair
|
||||
"""
|
||||
return self.add_header("%s 0 %s %s" % (self.CTRL_TRAP, var, val))
|
||||
|
||||
def cmd(self, var, val=None):
|
||||
"""
|
||||
Make SET/GET command message: returns (r, m) tuple where r is random operation id and m is assembled message
|
||||
"""
|
||||
r = random.randint(1, sys.maxsize)
|
||||
if val is not None:
|
||||
return r, self.add_header("%s %s %s %s" % (self.CTRL_SET, r, var, val))
|
||||
return r, self.add_header("%s %s %s" % (self.CTRL_GET, r, var))
|
||||
|
||||
def verify(self, reply, r, var, val=None):
|
||||
"""
|
||||
Verify reply to SET/GET command: returns (b, v) tuple where v is True/False verification result and v is the variable value
|
||||
"""
|
||||
(k, v) = self.parse(reply)
|
||||
if k != var or (val is not None and v != val):
|
||||
return False, v
|
||||
return True, v
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("IPA multiplexer v%s loaded." % IPA.version)
|
@@ -1,47 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
# jenkins build helper script for openbsc. This is how we build on jenkins.osmocom.org
|
||||
|
||||
if ! [ -x "$(command -v osmo-build-dep.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
|
||||
rm -rf deps/install
|
||||
mkdir deps || true
|
||||
export LD_LIBRARY_PATH=$PWD/deps/install/lib
|
||||
cd deps
|
||||
osmo-deps.sh libosmocore
|
||||
|
||||
mkdir "$deps" || true
|
||||
rm -rf "$inst"
|
||||
|
||||
osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
|
||||
|
||||
verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
|
||||
|
||||
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
export LD_LIBRARY_PATH="$inst/lib"
|
||||
|
||||
osmo-build-dep.sh libosmo-abis
|
||||
osmo-build-dep.sh libosmo-netif
|
||||
|
||||
set +x
|
||||
echo
|
||||
echo
|
||||
echo
|
||||
echo " =============================== osmo-mgw ==============================="
|
||||
echo
|
||||
set -x
|
||||
|
||||
cd "$base"
|
||||
cd libosmocore
|
||||
autoreconf --install --force
|
||||
./configure $MGCP --enable-vty-tests --enable-external-tests
|
||||
$MAKE $PARALLEL_MAKE
|
||||
LD_LIBRARY_PATH="$inst/lib" $MAKE check \
|
||||
|| cat-testlogs.sh
|
||||
LD_LIBRARY_PATH="$inst/lib" \
|
||||
DISTCHECK_CONFIGURE_FLAGS="$MGCP --enable-vty-tests --enable-external-tests" \
|
||||
$MAKE distcheck \
|
||||
|| cat-testlogs.sh
|
||||
./configure --prefix=$PWD/../install
|
||||
$MAKE $PARALLEL_MAKE install
|
||||
|
||||
|
||||
cd ../
|
||||
osmo-deps.sh libosmo-abis
|
||||
cd libosmo-abis
|
||||
autoreconf --install --force
|
||||
PKG_CONFIG_PATH=$PWD/../install/lib/pkgconfig ./configure --prefix=$PWD/../install
|
||||
PKG_CONFIG_PATH=$PWD/..//install/lib/pkgconfig $MAKE $PARALLEL_MAKE install
|
||||
|
||||
cd ../
|
||||
osmo-deps.sh libosmo-netif
|
||||
cd libosmo-netif
|
||||
autoreconf --install --force
|
||||
PKG_CONFIG_PATH=$PWD/../install/lib/pkgconfig ./configure --prefix=$PWD/../install
|
||||
PKG_CONFIG_PATH=$PWD/..//install/lib/pkgconfig $MAKE $PARALLEL_MAKE install
|
||||
|
||||
cd ../
|
||||
osmo-deps.sh libosmo-sccp
|
||||
cd libosmo-sccp
|
||||
autoreconf --install --force
|
||||
PKG_CONFIG_PATH=$PWD/../install/lib/pkgconfig ./configure --prefix=$PWD/../install
|
||||
PKG_CONFIG_PATH=$PWD/..//install/lib/pkgconfig $MAKE $PARALLEL_MAKE install
|
||||
|
||||
cd ../
|
||||
osmo-deps.sh libsmpp34
|
||||
cd libsmpp34
|
||||
autoreconf --install --force
|
||||
./configure --prefix=$PWD/../install
|
||||
$MAKE install
|
||||
|
||||
cd ../
|
||||
osmo-deps.sh openggsn
|
||||
cd openggsn
|
||||
autoreconf --install --force
|
||||
PKG_CONFIG_PATH=$PWD/../install/lib/pkgconfig ./configure --prefix=$PWD/../install
|
||||
PKG_CONFIG_PATH=$PWD/..//install/lib/pkgconfig $MAKE $PARALLEL_MAKE install
|
||||
|
||||
cd ../../openbsc
|
||||
autoreconf --install --force
|
||||
PKG_CONFIG_PATH=$PWD/../deps/install/lib/pkgconfig ./configure --enable-osmo-bsc --enable-nat $SMPP $MGCP --enable-vty-tests --enable-external-tests
|
||||
PKG_CONFIG_PATH=$PWD/../deps/install/lib/pkgconfig $MAKE $PARALLEL_MAKE
|
||||
PKG_CONFIG_PATH=$PWD/../deps/install/lib/pkgconfig LD_LIBRARY_PATH=$PWD/../deps/install/lib $MAKE check
|
||||
PKG_CONFIG_PATH=$PWD/../deps/install/lib/pkgconfig LD_LIBRARY_PATH=$PWD/../deps/install/lib $MAKE distcheck
|
||||
|
1
debian/autoreconf
vendored
Normal file
1
debian/autoreconf
vendored
Normal file
@@ -0,0 +1 @@
|
||||
openbsc
|
67
debian/changelog
vendored
67
debian/changelog
vendored
@@ -1,12 +1,67 @@
|
||||
osmo-mgw (1.0.2) unstable; urgency=low
|
||||
openbsc (0.14.0) UNRELEASED; urgency=low
|
||||
|
||||
* First release after major rename.
|
||||
* New upstream tag and additional patches.
|
||||
|
||||
-- Max Suraev <msuraev@sysmocom.de> Thu, 14 Sep 2017 18:41:05 +0200
|
||||
-- Holger Hans Peter Freyther <holger@freyther.de> Sat, 14 Mar 2015 20:33:25 +0100
|
||||
|
||||
openbsc (0.12.0+git26-7) unstable; urgency=low
|
||||
|
||||
osmo-mgw (0.1.0) unstable; urgency=low
|
||||
* 64bit fix for the MGCP rewriting
|
||||
|
||||
* Initial release.
|
||||
-- Holger Hans Peter Freyther <holger@freyther.de> Wed, 07 Nov 2012 11:39:34 +0100
|
||||
|
||||
-- Alexander Couzens <lynxis@fe80.eu> Tue, 08 Aug 2017 01:12:53 +0000
|
||||
openbsc (0.12.0+git26-6) precise; urgency=low
|
||||
|
||||
* Added init script for osmocom-sgsn.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Fri, 24 Aug 2012 21:04:32 -0700
|
||||
|
||||
openbsc (0.12.0+git26-5) precise; urgency=low
|
||||
|
||||
* Don't enable MNCC sock by default.
|
||||
* Automatically create important directories.
|
||||
* Fix init script 'stop' command.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Fri, 24 Aug 2012 20:56:33 -0700
|
||||
|
||||
openbsc (0.12.0+git26-4) precise; urgency=low
|
||||
|
||||
* Specify HLR path and enable RTP proxy.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Mon, 20 Aug 2012 00:21:07 -0700
|
||||
|
||||
openbsc (0.12.0+git26-3) precise; urgency=low
|
||||
|
||||
* Fix init script.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Sun, 19 Aug 2012 16:05:44 -0700
|
||||
|
||||
openbsc (0.12.0+git26-2) precise; urgency=low
|
||||
|
||||
* Fix libdbi package dependency.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Wed, 15 Aug 2012 00:35:37 -0700
|
||||
|
||||
openbsc (0.12.0+git26-1) precise; urgency=low
|
||||
|
||||
* Fix version issue.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Tue, 14 Aug 2012 21:00:51 -0700
|
||||
|
||||
openbsc (0.12.0+git26) precise; urgency=low
|
||||
|
||||
* Updated ubuntu package.
|
||||
|
||||
-- Eric Butler <eric@codebutler.com> Tue, 14 Aug 2012 17:36:51 -0700
|
||||
|
||||
openbsc (0.9.13.115.eb113-1) natty; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Wed, 11 May 2011 18:41:24 +0000
|
||||
|
||||
openbsc (0.9.4-1) unstable; urgency=low
|
||||
|
||||
* Initial release
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Tue, 24 Aug 2010 13:34:24 +0200
|
||||
|
2
debian/compat
vendored
2
debian/compat
vendored
@@ -1 +1 @@
|
||||
9
|
||||
7
|
||||
|
147
debian/control
vendored
147
debian/control
vendored
@@ -1,50 +1,121 @@
|
||||
Source: osmo-mgw
|
||||
Source: openbsc
|
||||
Section: net
|
||||
Priority: optional
|
||||
Maintainer: Harald Welte <laforge@gnumonks.org>
|
||||
Build-Depends: debhelper (>= 7.0.0~), autotools-dev, pkg-config, libgtp0-dev, libosmocore-dev, libosmo-sccp-dev, libdbi0-dev, dh-autoreconf, libosmo-abis-dev, libosmo-netif-dev, libdbd-sqlite3, libpcap-dev, libssl-dev, libc-ares-dev, libsmpp34-dev
|
||||
Standards-Version: 3.8.4
|
||||
Homepage: http://openbsc.osmocom.org/
|
||||
Vcs-Git: git://bs11-abis.gnumonks.org/openbsc.git
|
||||
Vcs-Browser: http://openbsc.osmocom.org/trac/browser
|
||||
|
||||
Package: osmocom-bsc
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: GSM Base Station Controller; BSC-only version of OpenBSC. Needs a real MSC!
|
||||
Classical BSC which requires MSC to operate.
|
||||
|
||||
Package: osmocom-nitb
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libdbd-sqlite3
|
||||
Description: GSM Network-in-a-Box, implements BSC, MSC, SMSC, HLR, VLR
|
||||
All the GSM network components bundled together.
|
||||
|
||||
Package: osmocom-ipaccess-utils
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Command line utilities for ip.access nanoBTS
|
||||
Utilities specific for ip.access unit.
|
||||
|
||||
Package: osmocom-bs11-utils
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Command line utilities for Siemens BS-11 BTS
|
||||
Utilities specific for BS-11 unit.
|
||||
|
||||
Package: osmocom-sgsn
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Osmocom Serving GPRS Support Node
|
||||
SGSN implementation.
|
||||
|
||||
Package: osmocom-gbproxy
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Osmocom GPRS Gb Interface Proxy
|
||||
Proxy for Gb interface.
|
||||
|
||||
Package: osmocom-bsc-nat
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Osmocom Base Station Controller Network Address Translation
|
||||
Network address translation for BSC.
|
||||
|
||||
Package: osmo-gtphub
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Osmocom GTP Hub
|
||||
Proxy for comms between multiple SGSNs and GGSNs.
|
||||
|
||||
Package: osmocom-bsc-dbg
|
||||
Architecture: any
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Maintainer: Alexander Couzens <lynxis@fe80.eu>
|
||||
Build-Depends: debhelper (>=9),
|
||||
dh-autoreconf,
|
||||
pkg-config,
|
||||
autotools-dev,
|
||||
libosmocore-dev,
|
||||
libosmo-netif-dev
|
||||
Standards-Version: 3.9.8
|
||||
Vcs-Git: git://git.osmocom.org/osmo-mgw.git
|
||||
Vcs-Browser: https://git.osmocom.org/osmo-mgw/
|
||||
Homepage: https://osmocom.org/projects/osmo-mgw
|
||||
Depends: osmocom-bsc (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC BSC
|
||||
Make debugging possible
|
||||
|
||||
Package: osmo-mgw
|
||||
Package: osmocom-nitb-dbg
|
||||
Architecture: any
|
||||
Multi-Arch: foreign
|
||||
Depends: libosmo-legacy-mgcp0, ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: OsmoMGW: Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmocom-nitb (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC NITB
|
||||
Make debugging possible
|
||||
|
||||
Package: libosmo-legacy-mgcp0
|
||||
Section: libs
|
||||
Package: osmocom-ipaccess-utils-dbg
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: libosmo-legacy-mgcp: Osmocom's Media Gateway server library
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmocom-ipaccess-utils (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC ip.access utils
|
||||
Make debugging possible
|
||||
|
||||
Package: libosmo-legacy-mgcp-dev
|
||||
Section: libdevel
|
||||
Package: osmocom-bs11-utils-dbg
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Depends: libosmo-legacy-mgcp0 (= ${binary:Version}), ${misc:Depends}
|
||||
Description: libosmo-legacy-mgcp: Osmocom's Media Gateway server library
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmocom-bs11-utils (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC BS11 utils
|
||||
Make debugging possible
|
||||
|
||||
Package: libosmo-mgcp-client1
|
||||
Section: libs
|
||||
Package: osmocom-sgsn-dbg
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmocom-sgsn (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC Serving GPRS Support Node
|
||||
Make debugging possible
|
||||
|
||||
Package: libosmo-mgcp-client-dev
|
||||
Section: libdevel
|
||||
Package: osmocom-gbproxy-dbg
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Depends: libosmo-mgcp-client1 (= ${binary:Version}), ${misc:Depends}
|
||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmocom-gbproxy (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC GPRS GBProxy
|
||||
Make debugging possible
|
||||
|
||||
Package: osmocom-bsc-nat-dbg
|
||||
Architecture: any
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmocom-bsc-nat (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for the OpenBSC Network Address Translation
|
||||
Make debugging possible
|
||||
|
||||
Package: osmo-gtphub-dbg
|
||||
Architecture: any
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: osmo-gtphub (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Debug symbols for Osmocom GTP Hub
|
||||
Make debugging possible
|
||||
|
117
debian/copyright
vendored
117
debian/copyright
vendored
@@ -1,82 +1,47 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: osmo-mgw
|
||||
Source: git://git.osmocom.org/osmo-mgw
|
||||
This work was packaged for Debian by:
|
||||
|
||||
Files: *
|
||||
Copyright: 2009-2014 On-Waves
|
||||
2009-2015 Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
2013 Jacob Erlbeck <jerlbeck@sysmocom.de>
|
||||
2016-2017 sysmocom s.m.f.c. GmbH <info@sysmocom.de>
|
||||
License: AGPL-3.0+
|
||||
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/>.
|
||||
Harald Welte <laforge@gnumonks.org> on Tue, 24 Aug 2010 10:55:04 +0200
|
||||
|
||||
Files: src/libosmo-legacy-mgcp/g711common.h
|
||||
Copyright: 2000 Abramo Bagnara <abramo@alsa-project.org>
|
||||
License: GPL-2.0+
|
||||
Wrapper for linphone Codec class by Simon Morlat <simon.morlat@linphone.org>
|
||||
.
|
||||
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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
.
|
||||
The FSF address in the above text is the old one.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General Public License
|
||||
Version 2 can be found in `/usr/share/common-licenses/GPL-2'.
|
||||
It was downloaded from:
|
||||
|
||||
Files: tests/vty_test_runner.py
|
||||
Copyright: 2013 Holger Hans Peter Freyther
|
||||
2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
|
||||
License: GPL-3.0+
|
||||
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 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 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 3 can be found in `/usr/share/common-licenses/GPL-3'.
|
||||
git://bs11-abis.gnumonks.org/openbsc.git
|
||||
|
||||
Files: osmoappdesc.py
|
||||
Copyright: 2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
|
||||
License: GPL-3.0+
|
||||
Upstream Authors:
|
||||
|
||||
Files: src/libosmo-legacy-mgcp/mgcp_osmux.c
|
||||
Copyright: 2012-2013 On Waves ehf <http://www.on-waves.com>
|
||||
2012-2013 Pablo Neira Ayuso <pablo@gnumonks.org>
|
||||
License: AGPL-3.0+
|
||||
All rights not specifically granted under this license are reserved.
|
||||
.
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Affero General Public License as published by the
|
||||
Free Software Foundation; either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
Harald Welte <laforge@gnumonks.org>
|
||||
Dieter Spaar <spaar@mirider.augusta.de>
|
||||
Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
Sylvain Munaut <tnt@246tNt.com>
|
||||
Daniel Willmann <daniel@totalueberwachung.de>
|
||||
Jan Luebbe <jluebbe@debian.org>
|
||||
Mike Haben <michael.haben@btinternet.com>
|
||||
Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
||||
|
||||
Copyright:
|
||||
|
||||
Copyright (C) 2008-2010 Harald Welte <laforge@gnumonks.org>
|
||||
Copyright (C) 2008-2009 Dieter Spaar <spaar@mirider.augusta.de>
|
||||
Copyright (C) 2008-2010 Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
Copyright (C) 2009-2010 Sylvain Munaut <tnt@246tNt.com>
|
||||
Copyright (C) 2009-2010 On-Waves
|
||||
Copyright (C) 2008 Daniel Willmann <daniel@totalueberwachung.de>
|
||||
Copyright (C) 2008 Jan Luebbe <jluebbe@debian.org>
|
||||
Copyright (C) 2009 by Mike Haben <michael.haben@btinternet.com>
|
||||
Copyright (C) 2009 Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
||||
|
||||
License:
|
||||
|
||||
GNU General Public License, Version 2 or later
|
||||
|
||||
The Debian packaging is:
|
||||
|
||||
Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
# Please chose a license for your packaging work. If the program you package
|
||||
# uses a mainstream license, using the same license is the safest choice.
|
||||
# Please avoid to pick license terms that are more restrictive than the
|
||||
# packaged work, as it may make Debian's contributions unacceptable upstream.
|
||||
# If you just want it to be GPL version 3, leave the following lines in.
|
||||
|
||||
and is licensed under the GPL version 3,
|
||||
see "/usr/share/common-licenses/GPL-3".
|
||||
|
1
debian/docs
vendored
Normal file
1
debian/docs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
openbsc/README
|
4
debian/libosmo-legacy-mgcp-dev.install
vendored
4
debian/libosmo-legacy-mgcp-dev.install
vendored
@@ -1,4 +0,0 @@
|
||||
usr/include/osmocom/legacy_mgcp
|
||||
usr/lib/*/*legacy-mgcp*.so
|
||||
usr/lib/*/*legacy-mgcp*.a
|
||||
usr/lib/*/pkgconfig/*legacy-mgcp*.pc
|
1
debian/libosmo-legacy-mgcp0.install
vendored
1
debian/libosmo-legacy-mgcp0.install
vendored
@@ -1 +0,0 @@
|
||||
usr/lib/*/*legacy-mgcp*.so.*
|
4
debian/libosmo-mgcp-client-dev.install
vendored
4
debian/libosmo-mgcp-client-dev.install
vendored
@@ -1,4 +0,0 @@
|
||||
usr/include/osmocom/mgcp_client
|
||||
usr/lib/*/libosmo-mgcp-client.so
|
||||
usr/lib/*/libosmo-mgcp-client.a
|
||||
usr/lib/*/pkgconfig/libosmo-mgcp-client.pc
|
1
debian/libosmo-mgcp-client1.install
vendored
1
debian/libosmo-mgcp-client1.install
vendored
@@ -1 +0,0 @@
|
||||
usr/lib/*/*mgcp-client*.so.*
|
2
debian/osmo-gtphub.default
vendored
Normal file
2
debian/osmo-gtphub.default
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
CONFIG_FILE="/etc/osmocom/osmo-gtphub.cfg"
|
||||
|
1
debian/osmo-gtphub.examples
vendored
Normal file
1
debian/osmo-gtphub.examples
vendored
Normal file
@@ -0,0 +1 @@
|
||||
openbsc/doc/examples/osmo-gtphub
|
150
debian/osmo-gtphub.init
vendored
Executable file
150
debian/osmo-gtphub.init
vendored
Executable file
@@ -0,0 +1,150 @@
|
||||
#!/bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: osmo-gtphub
|
||||
# Required-Start: $network $local_fs
|
||||
# Required-Stop:
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Osmocom GTP hub
|
||||
# Description: Osmocom GTP hub
|
||||
### END INIT INFO
|
||||
|
||||
# Author: Neels Hofmeyr <nhofmeyr@sysmocom.de>
|
||||
|
||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||
NAME=osmo-gtphub # Introduce the short server's name here
|
||||
DESC="Osmocom GTP hub" # Introduce a short description here
|
||||
DAEMON=/usr/bin/osmo-gtphub # Introduce the server's location here
|
||||
SCRIPTNAME=/etc/init.d/osmo-gtphub
|
||||
|
||||
# Exit if the package is not installed
|
||||
[ -x $DAEMON ] || exit 0
|
||||
|
||||
# Read configuration variable file if it is present
|
||||
[ -r /etc/default/osmo-gtphub ] && . /etc/default/osmo-gtphub
|
||||
|
||||
# Load the VERBOSE setting and other rcS variables
|
||||
. /lib/init/vars.sh
|
||||
|
||||
# Define LSB log_* functions.
|
||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
DAEMON_ARGS="$DAEMON_ARGS -D -c $CONFIG_FILE"
|
||||
|
||||
#
|
||||
# Function that starts the daemon/service
|
||||
#
|
||||
do_start()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been started
|
||||
# 1 if daemon was already running
|
||||
# 2 if daemon could not be started
|
||||
start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
|
||||
|| return 1
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- \
|
||||
$DAEMON_ARGS \
|
||||
|| return 2
|
||||
# Add code here, if necessary, that waits for the process to be ready
|
||||
# to handle requests from services started subsequently which depend
|
||||
# on this one. As a last resort, sleep for some time.
|
||||
}
|
||||
|
||||
#
|
||||
# Function that stops the daemon/service
|
||||
#
|
||||
do_stop()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been stopped
|
||||
# 1 if daemon was already stopped
|
||||
# 2 if daemon could not be stopped
|
||||
# other if a failure occurred
|
||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
|
||||
RETVAL="$?"
|
||||
[ "$RETVAL" = 2 ] && return 2
|
||||
# Wait for children to finish too if this is a daemon that forks
|
||||
# and if the daemon is only ever run from this initscript.
|
||||
# If the above conditions are not satisfied then add some other code
|
||||
# that waits for the process to drop all resources that could be
|
||||
# needed by services started subsequently. A last resort is to
|
||||
# sleep for some time.
|
||||
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||
[ "$?" = 2 ] && return 2
|
||||
return "$RETVAL"
|
||||
}
|
||||
|
||||
#
|
||||
# Function that sends a SIGHUP to the daemon/service
|
||||
#
|
||||
do_reload() {
|
||||
#
|
||||
# If the daemon can reload its configuration without
|
||||
# restarting (for example, when it is sent a SIGHUP),
|
||||
# then implement that here.
|
||||
#
|
||||
start-stop-daemon --stop --signal 1 --quiet $PIDFILE --name $NAME
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
|
||||
do_start
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
stop)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
status)
|
||||
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||
;;
|
||||
#reload|force-reload)
|
||||
#
|
||||
# If do_reload() is not implemented then leave this commented out
|
||||
# and leave 'force-reload' as an alias for 'restart'.
|
||||
#
|
||||
#log_daemon_msg "Reloading $DESC" "$NAME"
|
||||
#do_reload
|
||||
#log_end_msg $?
|
||||
#;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented then remove the
|
||||
# 'force-reload' alias
|
||||
#
|
||||
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1)
|
||||
do_start
|
||||
case "$?" in
|
||||
0) log_end_msg 0 ;;
|
||||
1) log_end_msg 1 ;; # Old process is still running
|
||||
*) log_end_msg 1 ;; # Failed to start
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# Failed to stop
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
:
|
1
debian/osmo-gtphub.install
vendored
Normal file
1
debian/osmo-gtphub.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/usr/bin/osmo-gtphub
|
1
debian/osmo-mgw.install
vendored
1
debian/osmo-mgw.install
vendored
@@ -1 +0,0 @@
|
||||
usr/bin
|
2
debian/osmocom-bs11-utils.install
vendored
Normal file
2
debian/osmocom-bs11-utils.install
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/usr/bin/bs11_config
|
||||
/usr/bin/isdnsync
|
153
debian/osmocom-bsc-nat.init
vendored
Executable file
153
debian/osmocom-bsc-nat.init
vendored
Executable file
@@ -0,0 +1,153 @@
|
||||
#!/bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: osmocom-bsc-nat
|
||||
# Required-Start: $network $local_fs
|
||||
# Required-Stop:
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Osmocom GSM network-in-a-box
|
||||
# Description: A minimal implementation of the GSM Base Station Controller,
|
||||
# Mobile Switching Center, Home Location regster and all other
|
||||
# components to run a self-contained GSM network.
|
||||
### END INIT INFO
|
||||
|
||||
# Author: Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||
NAME=osmo-bsc_nat # Introduce the short server's name here
|
||||
DESC="Osmocom GSM BSC Multiplexer (NAT)" # Introduce a short description here
|
||||
DAEMON=/usr/bin/osmo-bsc_nat # Introduce the server's location here
|
||||
SCRIPTNAME=/etc/init.d/osmocom-bsc-nat
|
||||
CONFIG_FILE=/etc/osmocom/osmocom-bsc-nat.cfg
|
||||
|
||||
# Exit if the package is not installed
|
||||
[ -x $DAEMON ] || exit 0
|
||||
|
||||
# Read configuration variable file if it is present
|
||||
[ -r /etc/default/osmocom-bsc-nat ] && . /etc/default/osmocom-bsc-nat
|
||||
|
||||
# Load the VERBOSE setting and other rcS variables
|
||||
. /lib/init/vars.sh
|
||||
|
||||
# Define LSB log_* functions.
|
||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
DAEMON_ARGS="-D -c $CONFIG_FILE"
|
||||
|
||||
#
|
||||
# Function that starts the daemon/service
|
||||
#
|
||||
do_start()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been started
|
||||
# 1 if daemon was already running
|
||||
# 2 if daemon could not be started
|
||||
start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
|
||||
|| return 1
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- \
|
||||
$DAEMON_ARGS \
|
||||
|| return 2
|
||||
# Add code here, if necessary, that waits for the process to be ready
|
||||
# to handle requests from services started subsequently which depend
|
||||
# on this one. As a last resort, sleep for some time.
|
||||
}
|
||||
|
||||
#
|
||||
# Function that stops the daemon/service
|
||||
#
|
||||
do_stop()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been stopped
|
||||
# 1 if daemon was already stopped
|
||||
# 2 if daemon could not be stopped
|
||||
# other if a failure occurred
|
||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
|
||||
RETVAL="$?"
|
||||
[ "$RETVAL" = 2 ] && return 2
|
||||
# Wait for children to finish too if this is a daemon that forks
|
||||
# and if the daemon is only ever run from this initscript.
|
||||
# If the above conditions are not satisfied then add some other code
|
||||
# that waits for the process to drop all resources that could be
|
||||
# needed by services started subsequently. A last resort is to
|
||||
# sleep for some time.
|
||||
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||
[ "$?" = 2 ] && return 2
|
||||
return "$RETVAL"
|
||||
}
|
||||
|
||||
#
|
||||
# Function that sends a SIGHUP to the daemon/service
|
||||
#
|
||||
do_reload() {
|
||||
#
|
||||
# If the daemon can reload its configuration without
|
||||
# restarting (for example, when it is sent a SIGHUP),
|
||||
# then implement that here.
|
||||
#
|
||||
start-stop-daemon --stop --signal 1 --quiet $PIDFILE --name $NAME
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
|
||||
do_start
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
stop)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
status)
|
||||
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||
;;
|
||||
#reload|force-reload)
|
||||
#
|
||||
# If do_reload() is not implemented then leave this commented out
|
||||
# and leave 'force-reload' as an alias for 'restart'.
|
||||
#
|
||||
#log_daemon_msg "Reloading $DESC" "$NAME"
|
||||
#do_reload
|
||||
#log_end_msg $?
|
||||
#;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented then remove the
|
||||
# 'force-reload' alias
|
||||
#
|
||||
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1)
|
||||
do_start
|
||||
case "$?" in
|
||||
0) log_end_msg 0 ;;
|
||||
1) log_end_msg 1 ;; # Old process is still running
|
||||
*) log_end_msg 1 ;; # Failed to start
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# Failed to stop
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
:
|
1
debian/osmocom-bsc-nat.install
vendored
Normal file
1
debian/osmocom-bsc-nat.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/usr/bin/osmo-bsc_nat
|
1
debian/osmocom-bsc.examples
vendored
Normal file
1
debian/osmocom-bsc.examples
vendored
Normal file
@@ -0,0 +1 @@
|
||||
openbsc/doc/examples/osmo-bsc_mgcp
|
2
debian/osmocom-bsc.install
vendored
Normal file
2
debian/osmocom-bsc.install
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/usr/bin/osmo-bsc_mgcp
|
||||
/usr/bin/osmo-bsc
|
151
debian/osmocom-gbproxy.init
vendored
Executable file
151
debian/osmocom-gbproxy.init
vendored
Executable file
@@ -0,0 +1,151 @@
|
||||
#!/bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: osmo-gbproxy
|
||||
# Required-Start: $network $local_fs
|
||||
# Required-Stop:
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Osmocom GBproxy
|
||||
# Description: A tool to proxy the GPRS Gb interface.
|
||||
### END INIT INFO
|
||||
|
||||
# Author: Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||
NAME=osmo-gbproxy # Introduce the short server's name here
|
||||
DESC="Osmocom GBProxy" # Introduce a short description here
|
||||
DAEMON=/usr/bin/osmo-gbproxy # Introduce the server's location here
|
||||
SCRIPTNAME=/etc/init.d/osmocom-gbproxy
|
||||
CONFIG_FILE=/etc/osmocom/osmocom-gbproxy.cfg
|
||||
|
||||
# Exit if the package is not installed
|
||||
[ -x $DAEMON ] || exit 0
|
||||
|
||||
# Read configuration variable file if it is present
|
||||
[ -r /etc/default/osmocom-gbproxy ] && . /etc/default/osmocom-gbproxy
|
||||
|
||||
# Load the VERBOSE setting and other rcS variables
|
||||
. /lib/init/vars.sh
|
||||
|
||||
# Define LSB log_* functions.
|
||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
DAEMON_ARGS="-D -c $CONFIG_FILE"
|
||||
|
||||
#
|
||||
# Function that starts the daemon/service
|
||||
#
|
||||
do_start()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been started
|
||||
# 1 if daemon was already running
|
||||
# 2 if daemon could not be started
|
||||
start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
|
||||
|| return 1
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- \
|
||||
$DAEMON_ARGS \
|
||||
|| return 2
|
||||
# Add code here, if necessary, that waits for the process to be ready
|
||||
# to handle requests from services started subsequently which depend
|
||||
# on this one. As a last resort, sleep for some time.
|
||||
}
|
||||
|
||||
#
|
||||
# Function that stops the daemon/service
|
||||
#
|
||||
do_stop()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been stopped
|
||||
# 1 if daemon was already stopped
|
||||
# 2 if daemon could not be stopped
|
||||
# other if a failure occurred
|
||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
|
||||
RETVAL="$?"
|
||||
[ "$RETVAL" = 2 ] && return 2
|
||||
# Wait for children to finish too if this is a daemon that forks
|
||||
# and if the daemon is only ever run from this initscript.
|
||||
# If the above conditions are not satisfied then add some other code
|
||||
# that waits for the process to drop all resources that could be
|
||||
# needed by services started subsequently. A last resort is to
|
||||
# sleep for some time.
|
||||
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||
[ "$?" = 2 ] && return 2
|
||||
return "$RETVAL"
|
||||
}
|
||||
|
||||
#
|
||||
# Function that sends a SIGHUP to the daemon/service
|
||||
#
|
||||
do_reload() {
|
||||
#
|
||||
# If the daemon can reload its configuration without
|
||||
# restarting (for example, when it is sent a SIGHUP),
|
||||
# then implement that here.
|
||||
#
|
||||
start-stop-daemon --stop --signal 1 --quiet $PIDFILE --name $NAME
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
|
||||
do_start
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
stop)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
status)
|
||||
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||
;;
|
||||
#reload|force-reload)
|
||||
#
|
||||
# If do_reload() is not implemented then leave this commented out
|
||||
# and leave 'force-reload' as an alias for 'restart'.
|
||||
#
|
||||
#log_daemon_msg "Reloading $DESC" "$NAME"
|
||||
#do_reload
|
||||
#log_end_msg $?
|
||||
#;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented then remove the
|
||||
# 'force-reload' alias
|
||||
#
|
||||
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1)
|
||||
do_start
|
||||
case "$?" in
|
||||
0) log_end_msg 0 ;;
|
||||
1) log_end_msg 1 ;; # Old process is still running
|
||||
*) log_end_msg 1 ;; # Failed to start
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# Failed to stop
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
:
|
1
debian/osmocom-gbproxy.install
vendored
Normal file
1
debian/osmocom-gbproxy.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/usr/bin/osmo-gbproxy
|
3
debian/osmocom-ipaccess-utils.install
vendored
Normal file
3
debian/osmocom-ipaccess-utils.install
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
/usr/bin/ipaccess-config
|
||||
/usr/bin/abisip-find
|
||||
/usr/bin/ipaccess-proxy
|
8
debian/osmocom-nitb.default
vendored
Normal file
8
debian/osmocom-nitb.default
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
CONFIG_FILE="/etc/osmocom/osmo-nitb.cfg"
|
||||
HLR_FILE="/var/lib/osmocom/hlr.sqlite3"
|
||||
|
||||
DAEMON_ARGS="-P"
|
||||
|
||||
# Uncomment if using LCR+Asterisk
|
||||
# DAEMON_ARGS="-m -P"
|
||||
|
3
debian/osmocom-nitb.dirs
vendored
Normal file
3
debian/osmocom-nitb.dirs
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
/etc/osmocom
|
||||
/var/log/osmocom
|
||||
/var/lib/osmocom
|
1
debian/osmocom-nitb.examples
vendored
Normal file
1
debian/osmocom-nitb.examples
vendored
Normal file
@@ -0,0 +1 @@
|
||||
openbsc/doc/examples/osmo-nitb
|
152
debian/osmocom-nitb.init
vendored
Executable file
152
debian/osmocom-nitb.init
vendored
Executable file
@@ -0,0 +1,152 @@
|
||||
#!/bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: osmo-nitb
|
||||
# Required-Start: $network $local_fs
|
||||
# Required-Stop:
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Osmocom GSM network-in-a-box
|
||||
# Description: A minimal implementation of the GSM Base Station Controller,
|
||||
# Mobile Switching Center, Home Location regster and all other
|
||||
# components to run a self-contained GSM network.
|
||||
### END INIT INFO
|
||||
|
||||
# Author: Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||
NAME=osmo-nitb # Introduce the short server's name here
|
||||
DESC="Osmocom GSM Network-in-a-Box" # Introduce a short description here
|
||||
DAEMON=/usr/bin/osmo-nitb # Introduce the server's location here
|
||||
SCRIPTNAME=/etc/init.d/osmocom-nitb
|
||||
|
||||
# Exit if the package is not installed
|
||||
[ -x $DAEMON ] || exit 0
|
||||
|
||||
# Read configuration variable file if it is present
|
||||
[ -r /etc/default/osmocom-nitb ] && . /etc/default/osmocom-nitb
|
||||
|
||||
# Load the VERBOSE setting and other rcS variables
|
||||
. /lib/init/vars.sh
|
||||
|
||||
# Define LSB log_* functions.
|
||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
DAEMON_ARGS="$DAEMON_ARGS -D -c $CONFIG_FILE -l $HLR_FILE"
|
||||
|
||||
#
|
||||
# Function that starts the daemon/service
|
||||
#
|
||||
do_start()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been started
|
||||
# 1 if daemon was already running
|
||||
# 2 if daemon could not be started
|
||||
start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
|
||||
|| return 1
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- \
|
||||
$DAEMON_ARGS \
|
||||
|| return 2
|
||||
# Add code here, if necessary, that waits for the process to be ready
|
||||
# to handle requests from services started subsequently which depend
|
||||
# on this one. As a last resort, sleep for some time.
|
||||
}
|
||||
|
||||
#
|
||||
# Function that stops the daemon/service
|
||||
#
|
||||
do_stop()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been stopped
|
||||
# 1 if daemon was already stopped
|
||||
# 2 if daemon could not be stopped
|
||||
# other if a failure occurred
|
||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
|
||||
RETVAL="$?"
|
||||
[ "$RETVAL" = 2 ] && return 2
|
||||
# Wait for children to finish too if this is a daemon that forks
|
||||
# and if the daemon is only ever run from this initscript.
|
||||
# If the above conditions are not satisfied then add some other code
|
||||
# that waits for the process to drop all resources that could be
|
||||
# needed by services started subsequently. A last resort is to
|
||||
# sleep for some time.
|
||||
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||
[ "$?" = 2 ] && return 2
|
||||
return "$RETVAL"
|
||||
}
|
||||
|
||||
#
|
||||
# Function that sends a SIGHUP to the daemon/service
|
||||
#
|
||||
do_reload() {
|
||||
#
|
||||
# If the daemon can reload its configuration without
|
||||
# restarting (for example, when it is sent a SIGHUP),
|
||||
# then implement that here.
|
||||
#
|
||||
start-stop-daemon --stop --signal 1 --quiet $PIDFILE --name $NAME
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
|
||||
do_start
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
stop)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
status)
|
||||
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||
;;
|
||||
#reload|force-reload)
|
||||
#
|
||||
# If do_reload() is not implemented then leave this commented out
|
||||
# and leave 'force-reload' as an alias for 'restart'.
|
||||
#
|
||||
#log_daemon_msg "Reloading $DESC" "$NAME"
|
||||
#do_reload
|
||||
#log_end_msg $?
|
||||
#;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented then remove the
|
||||
# 'force-reload' alias
|
||||
#
|
||||
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1)
|
||||
do_start
|
||||
case "$?" in
|
||||
0) log_end_msg 0 ;;
|
||||
1) log_end_msg 1 ;; # Old process is still running
|
||||
*) log_end_msg 1 ;; # Failed to start
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# Failed to stop
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
:
|
1
debian/osmocom-nitb.install
vendored
Normal file
1
debian/osmocom-nitb.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/usr/bin/osmo-nitb
|
2
debian/osmocom-sgsn.default
vendored
Normal file
2
debian/osmocom-sgsn.default
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
CONFIG_FILE="/etc/osmocom/osmo-sgsn.cfg"
|
||||
|
1
debian/osmocom-sgsn.examples
vendored
Normal file
1
debian/osmocom-sgsn.examples
vendored
Normal file
@@ -0,0 +1 @@
|
||||
openbsc/doc/examples/osmo-sgsn
|
150
debian/osmocom-sgsn.init
vendored
Executable file
150
debian/osmocom-sgsn.init
vendored
Executable file
@@ -0,0 +1,150 @@
|
||||
#!/bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: osmo-sgsn
|
||||
# Required-Start: $network $local_fs
|
||||
# Required-Stop:
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Osmocom Serving GPRS Support Node
|
||||
# Description: Osmocom Serving GPRS Support Node
|
||||
### END INIT INFO
|
||||
|
||||
# Author: Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||
NAME=osmo-sgsn # Introduce the short server's name here
|
||||
DESC="Osmocom Serving GPRS Support Node" # Introduce a short description here
|
||||
DAEMON=/usr/bin/osmo-sgsn # Introduce the server's location here
|
||||
SCRIPTNAME=/etc/init.d/osmocom-sgsn
|
||||
|
||||
# Exit if the package is not installed
|
||||
[ -x $DAEMON ] || exit 0
|
||||
|
||||
# Read configuration variable file if it is present
|
||||
[ -r /etc/default/osmocom-sgsn ] && . /etc/default/osmocom-sgsn
|
||||
|
||||
# Load the VERBOSE setting and other rcS variables
|
||||
. /lib/init/vars.sh
|
||||
|
||||
# Define LSB log_* functions.
|
||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
DAEMON_ARGS="$DAEMON_ARGS -D -c $CONFIG_FILE"
|
||||
|
||||
#
|
||||
# Function that starts the daemon/service
|
||||
#
|
||||
do_start()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been started
|
||||
# 1 if daemon was already running
|
||||
# 2 if daemon could not be started
|
||||
start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
|
||||
|| return 1
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- \
|
||||
$DAEMON_ARGS \
|
||||
|| return 2
|
||||
# Add code here, if necessary, that waits for the process to be ready
|
||||
# to handle requests from services started subsequently which depend
|
||||
# on this one. As a last resort, sleep for some time.
|
||||
}
|
||||
|
||||
#
|
||||
# Function that stops the daemon/service
|
||||
#
|
||||
do_stop()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been stopped
|
||||
# 1 if daemon was already stopped
|
||||
# 2 if daemon could not be stopped
|
||||
# other if a failure occurred
|
||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
|
||||
RETVAL="$?"
|
||||
[ "$RETVAL" = 2 ] && return 2
|
||||
# Wait for children to finish too if this is a daemon that forks
|
||||
# and if the daemon is only ever run from this initscript.
|
||||
# If the above conditions are not satisfied then add some other code
|
||||
# that waits for the process to drop all resources that could be
|
||||
# needed by services started subsequently. A last resort is to
|
||||
# sleep for some time.
|
||||
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||
[ "$?" = 2 ] && return 2
|
||||
return "$RETVAL"
|
||||
}
|
||||
|
||||
#
|
||||
# Function that sends a SIGHUP to the daemon/service
|
||||
#
|
||||
do_reload() {
|
||||
#
|
||||
# If the daemon can reload its configuration without
|
||||
# restarting (for example, when it is sent a SIGHUP),
|
||||
# then implement that here.
|
||||
#
|
||||
start-stop-daemon --stop --signal 1 --quiet $PIDFILE --name $NAME
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
|
||||
do_start
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
stop)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
status)
|
||||
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||
;;
|
||||
#reload|force-reload)
|
||||
#
|
||||
# If do_reload() is not implemented then leave this commented out
|
||||
# and leave 'force-reload' as an alias for 'restart'.
|
||||
#
|
||||
#log_daemon_msg "Reloading $DESC" "$NAME"
|
||||
#do_reload
|
||||
#log_end_msg $?
|
||||
#;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented then remove the
|
||||
# 'force-reload' alias
|
||||
#
|
||||
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1)
|
||||
do_start
|
||||
case "$?" in
|
||||
0) log_end_msg 0 ;;
|
||||
1) log_end_msg 1 ;; # Old process is still running
|
||||
*) log_end_msg 1 ;; # Failed to start
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# Failed to stop
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
:
|
1
debian/osmocom-sgsn.install
vendored
Normal file
1
debian/osmocom-sgsn.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/usr/bin/osmo-sgsn
|
53
debian/rules
vendored
53
debian/rules
vendored
@@ -1,33 +1,42 @@
|
||||
#!/usr/bin/make -f
|
||||
# You must remove unused comment lines for the released package.
|
||||
# See debhelper(7) (uncomment to enable)
|
||||
# This is an autogenerated template for debian/rules.
|
||||
# -*- makefile -*-
|
||||
# Sample debian/rules that uses debhelper.
|
||||
#
|
||||
# Output every command that modifies files on the build system.
|
||||
#export DH_VERBOSE = 1
|
||||
# This file was originally written by Joey Hess and Craig Small.
|
||||
# As a special exception, when this file is copied by dh-make into a
|
||||
# dh-make output file, you may use that output file without restriction.
|
||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
||||
#
|
||||
# Modified to make a template file for a multi-binary package with separated
|
||||
# build-arch and build-indep targets by Bill Allombert 2001
|
||||
|
||||
DEBIAN := $(shell dpkg-parsechangelog | grep '^Version:' | cut -d' ' -f2)
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
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')
|
||||
|
||||
CFLAGS += -g
|
||||
export DEB_BUILD_HARDENING=1
|
||||
|
||||
# main packaging script based on dh7 syntax
|
||||
%:
|
||||
dh $@ --with autoreconf
|
||||
|
||||
# debmake generated override targets
|
||||
# Set options for ./configure
|
||||
#CONFIGURE_FLAGS = <options for ./configure>
|
||||
#overrride_dh_configure:
|
||||
# dh_configure -- $(CONFIGURE_FLAGS)
|
||||
#
|
||||
# Do not install libtool archive, python .pyc .pyo
|
||||
#override_dh_install:
|
||||
# dh_install --list-missing -X.la -X.pyc -X.pyo
|
||||
dh --sourcedirectory=openbsc --with autoreconf $@
|
||||
|
||||
# This is needed for debian stable (squeeze)
|
||||
override_dh_autoreconf:
|
||||
echo $(VERSION) > .tarball-version
|
||||
dh_autoreconf
|
||||
cd openbsc && autoreconf --install --force
|
||||
|
||||
override_dh_strip:
|
||||
dh_strip -posmocom-bsc --dbg-package=osmocom-bsc-dbg
|
||||
dh_strip -posmocom-nitb --dbg-package=osmocom-nitb-dbg
|
||||
dh_strip -posmocom-ipaccess-utils --dbg-package=osmocom-ipaccess-utils-dbg
|
||||
dh_strip -posmocom-bs11-utils --dbg-package=osmocom-bs11-utils-dbg
|
||||
dh_strip -posmocom-sgsn --dbg-package=osmocom-sgsn-dbg
|
||||
dh_strip -posmocom-gbproxy --dbg-package=osmocom-gbproxy-dbg
|
||||
dh_strip -posmocom-bsc-nat --dbg-package=osmocom-bsc-nat-dbg
|
||||
dh_strip -posmo-gtphub --dbg-package=osmo-gtphub-dbg
|
||||
|
||||
override_dh_auto_configure:
|
||||
echo $(VERSION) > openbsc/.tarball-version
|
||||
dh_auto_configure --sourcedirectory=openbsc -- --enable-nat --enable-osmo-bsc --enable-smpp
|
||||
|
||||
# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg
|
||||
|
@@ -1,3 +0,0 @@
|
||||
SUBDIRS = \
|
||||
examples \
|
||||
$(NULL)
|
@@ -1,14 +0,0 @@
|
||||
!
|
||||
! MGCP configuration example
|
||||
!
|
||||
mgcp
|
||||
!local ip 10.23.24.2
|
||||
!bts ip 10.24.24.1
|
||||
!bind ip 10.23.24.1
|
||||
bind port 2427
|
||||
rtp base 4000
|
||||
rtp force-ptime 20
|
||||
sdp audio payload number 98
|
||||
sdp audio payload name AMR/8000
|
||||
number endpoints 31
|
||||
no rtcp-omit
|
@@ -1,10 +0,0 @@
|
||||
SUBDIRS = \
|
||||
osmocom \
|
||||
$(NULL)
|
||||
|
||||
nobase_include_HEADERS = \
|
||||
osmocom/legacy_mgcp/mgcp.h \
|
||||
osmocom/legacy_mgcp/mgcp_internal.h \
|
||||
osmocom/legacy_mgcp/osmux.h \
|
||||
osmocom/mgcp_client/mgcp_client.h \
|
||||
$(NULL)
|
@@ -1,4 +0,0 @@
|
||||
SUBDIRS = \
|
||||
legacy_mgcp \
|
||||
mgcp_client \
|
||||
$(NULL)
|
@@ -1,4 +0,0 @@
|
||||
noinst_HEADERS = \
|
||||
mgcp_transcode.h \
|
||||
vty.h \
|
||||
$(NULL)
|
@@ -1,3 +0,0 @@
|
||||
noinst_HEADERS = \
|
||||
mgcp_client_internal.h \
|
||||
$(NULL)
|
@@ -1,73 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define MGCP_CLIENT_LOCAL_ADDR_DEFAULT "0.0.0.0"
|
||||
#define MGCP_CLIENT_LOCAL_PORT_DEFAULT 0
|
||||
#define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
|
||||
#define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427
|
||||
|
||||
struct msgb;
|
||||
struct vty;
|
||||
struct mgcp_client;
|
||||
|
||||
struct mgcp_client_conf {
|
||||
const char *local_addr;
|
||||
int local_port;
|
||||
const char *remote_addr;
|
||||
int remote_port;
|
||||
uint16_t first_endpoint;
|
||||
uint16_t last_endpoint;
|
||||
uint16_t bts_base;
|
||||
};
|
||||
|
||||
typedef unsigned int mgcp_trans_id_t;
|
||||
|
||||
struct mgcp_response_head {
|
||||
int response_code;
|
||||
mgcp_trans_id_t trans_id;
|
||||
const char *comment;
|
||||
};
|
||||
|
||||
struct mgcp_response {
|
||||
char *body;
|
||||
struct mgcp_response_head head;
|
||||
uint16_t audio_port;
|
||||
};
|
||||
|
||||
void mgcp_client_conf_init(struct mgcp_client_conf *conf);
|
||||
void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
|
||||
int mgcp_client_config_write(struct vty *vty, const char *indent);
|
||||
struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
|
||||
|
||||
struct mgcp_client *mgcp_client_init(void *ctx,
|
||||
struct mgcp_client_conf *conf);
|
||||
int mgcp_client_connect(struct mgcp_client *mgcp);
|
||||
|
||||
const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
|
||||
uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
|
||||
uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
|
||||
|
||||
int mgcp_client_next_endpoint(struct mgcp_client *client);
|
||||
void mgcp_client_release_endpoint(uint16_t id, struct mgcp_client *client);
|
||||
|
||||
/* Invoked when an MGCP response is received or sending failed. When the
|
||||
* response is passed as NULL, this indicates failure during transmission. */
|
||||
typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
|
||||
int mgcp_response_parse_params(struct mgcp_response *r);
|
||||
|
||||
int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
|
||||
mgcp_response_cb_t response_cb, void *priv);
|
||||
|
||||
enum mgcp_connection_mode;
|
||||
|
||||
struct msgb *mgcp_msg_crcx(struct mgcp_client *mgcp,
|
||||
uint16_t rtp_endpoint, unsigned int call_id,
|
||||
enum mgcp_connection_mode mode);
|
||||
|
||||
struct msgb *mgcp_msg_mdcx(struct mgcp_client *mgcp,
|
||||
uint16_t rtp_endpoint, const char *rtp_conn_addr,
|
||||
uint16_t rtp_port, enum mgcp_connection_mode mode);
|
||||
|
||||
struct msgb *mgcp_msg_dlcx(struct mgcp_client *mgcp, uint16_t rtp_endpoint,
|
||||
unsigned int call_id);
|
@@ -1,33 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#define MSGB_CB_MGCP_TRANS_ID 0
|
||||
|
||||
struct mgcp_client {
|
||||
struct mgcp_client_conf actual;
|
||||
uint32_t remote_addr;
|
||||
struct osmo_wqueue wq;
|
||||
mgcp_trans_id_t next_trans_id;
|
||||
struct llist_head responses_pending;
|
||||
struct llist_head inuse_endpoints;
|
||||
};
|
||||
|
||||
struct mgcp_inuse_endpoint {
|
||||
struct llist_head entry;
|
||||
uint16_t id;
|
||||
};
|
||||
|
||||
struct mgcp_response_pending {
|
||||
struct llist_head entry;
|
||||
|
||||
mgcp_trans_id_t trans_id;
|
||||
mgcp_response_cb_t response_cb;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
int mgcp_client_rx(struct mgcp_client *mgcp, struct msgb *msg);
|
||||
|
||||
struct mgcp_response_pending * mgcp_client_pending_add(
|
||||
struct mgcp_client *mgcp,
|
||||
mgcp_trans_id_t trans_id,
|
||||
mgcp_response_cb_t response_cb,
|
||||
void *priv);
|
@@ -1,10 +0,0 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: Osmocom legacy Media Gateway Control Protocol library
|
||||
Description: C Utility Library
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -losmo-legacy-mgcp
|
||||
Cflags: -I${includedir}/
|
@@ -1,10 +0,0 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: Osmocom Media Gateway Control Protocol Client library
|
||||
Description: C Utility Library
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -losmo-mgcp-client
|
||||
Cflags: -I${includedir}/
|
@@ -1,3 +0,0 @@
|
||||
We want to avoid creating too many external build-time dependencies
|
||||
like this one to autoconf-archive. This directory provides a local
|
||||
copy of required m4 rules.
|
@@ -1,74 +0,0 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the current language's compiler
|
||||
# or gives an error. (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# 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 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 General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_COMPILE_FLAGS
|
94
openbsc/.gitignore
vendored
Normal file
94
openbsc/.gitignore
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
*.o
|
||||
*.lo
|
||||
*.a
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
bscconfig.h
|
||||
bscconfig.h.in
|
||||
openbsc.pc
|
||||
src/osmo-nitb/osmo-nitb
|
||||
src/osmo-bsc_mgcp/osmo-bsc_mgcp
|
||||
src/osmo-bsc/osmo-bsc
|
||||
src/utils/meas_vis
|
||||
src/utils/osmo-meas-pcap2db
|
||||
src/utils/osmo-meas-udp2db
|
||||
src/utils/smpp_mirror
|
||||
*.*~
|
||||
*.sw?
|
||||
.libs
|
||||
*.pyc
|
||||
*.gcda
|
||||
*.gcno
|
||||
|
||||
#configure
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
config.log
|
||||
config.status
|
||||
config.guess
|
||||
config.sub
|
||||
configure
|
||||
compile
|
||||
depcomp
|
||||
install-sh
|
||||
missing
|
||||
stamp-h1
|
||||
libtool
|
||||
ltmain.sh
|
||||
|
||||
# git-version-gen magic
|
||||
.tarball-version
|
||||
.version
|
||||
|
||||
|
||||
# apps and app data
|
||||
hlr.sqlite3
|
||||
src/utils/bs11_config
|
||||
src/ipaccess/ipaccess-config
|
||||
src/ipaccess/abisip-find
|
||||
src/ipaccess/ipaccess-firmware
|
||||
src/ipaccess/ipaccess-proxy
|
||||
src/utils/isdnsync
|
||||
src/nat/bsc_nat
|
||||
src/gprs/osmo-sgsn
|
||||
src/gprs/osmo-gbproxy
|
||||
src/gprs/osmo-gtphub
|
||||
src/osmo-bsc_nat/osmo-bsc_nat
|
||||
src/osmo-cscn/osmo-cscn
|
||||
|
||||
#tests
|
||||
tests/testsuite.dir
|
||||
tests/bsc-nat/bsc_nat_test
|
||||
tests/bsc-nat-trie/bsc_nat_trie_test
|
||||
tests/channel/channel_test
|
||||
tests/db/db_test
|
||||
tests/debug/debug_test
|
||||
tests/gsm0408/gsm0408_test
|
||||
tests/mgcp/mgcp_test
|
||||
tests/sccp/sccp_test
|
||||
tests/sms/sms_test
|
||||
tests/timer/timer_test
|
||||
tests/gprs/gprs_test
|
||||
tests/gbproxy/gbproxy_test
|
||||
tests/abis/abis_test
|
||||
tests/si/si_test
|
||||
tests/smpp/smpp_test
|
||||
tests/bsc/bsc_test
|
||||
tests/trau/trau_test
|
||||
tests/mgcp/mgcp_transcoding_test
|
||||
tests/sgsn/sgsn_test
|
||||
tests/subscr/subscr_test
|
||||
tests/oap/oap_test
|
||||
tests/gtphub/gtphub_test
|
||||
tests/mm_auth/mm_auth_test
|
||||
|
||||
tests/atconfig
|
||||
tests/atlocal
|
||||
tests/package.m4
|
||||
tests/testsuite
|
||||
tests/testsuite.log
|
||||
|
||||
src/openbsc.cfg*
|
||||
writtenconfig/
|
||||
gtphub_restart_count
|
14
openbsc/Makefile.am
Normal file
14
openbsc/Makefile.am
Normal file
@@ -0,0 +1,14 @@
|
||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
|
||||
|
||||
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
|
||||
SUBDIRS = doc include src tests
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = openbsc.pc
|
||||
|
||||
BUILT_SOURCES = $(top_srcdir)/.version
|
||||
EXTRA_DIST = git-version-gen osmoappdesc.py .version
|
||||
$(top_srcdir)/.version:
|
||||
echo $(VERSION) > $@-t && mv $@-t $@
|
||||
dist-hook:
|
||||
echo $(VERSION) > $(distdir)/.tarball-version
|
39
openbsc/README
Normal file
39
openbsc/README
Normal file
@@ -0,0 +1,39 @@
|
||||
About OpenBSC
|
||||
=============
|
||||
|
||||
OpenBSC started as a minimalistic all-in-one implementation of the GSM Network,
|
||||
with particular emphasis on the functionality typically provided by the BSC,
|
||||
MSC, HLR, VLR and SMSC. Today it is a growing suite of libraries and programs,
|
||||
implementing protocol stacks and functional elements, including
|
||||
|
||||
* OsmoBSC - a pure GSM BSC, speaking Abis/IP to the BTS and A/IP to the MSC
|
||||
* OsmoBSC-MGCP - MGCP helper to the OsmoBSC software
|
||||
* OsmoNITB - a BSC+MSC+VLR+HLR+SMSC "Network in the box".
|
||||
* OsmoCSCN - a voice CN with A/IP and IuCS/IP towards the BSC and/or HNB-GW
|
||||
* OsmoSGSN - a GPRS SGSN with Gb/IP and IuPS/IP towards the PCU and/or HNB-GW
|
||||
* Osmo-GbProxy - a Proxy to aggregate many Gb links as one Gb link to the SGSN
|
||||
* OsmoBSCNAT - a gateway aggregating many A links as one A link to the MSC
|
||||
* OsmoGTPHUB - a hub aggregating many GTP links (between SGSN and GGSN)
|
||||
* ipaccess-utils - some tools to discover + configure ip.access nanoBTS
|
||||
* bs11_config - a tool to configure the Siemens BS-11 microBTS
|
||||
|
||||
Various interfaces towards the BTS are supported, among which are:
|
||||
|
||||
* Classic A-bis over E1 using a mISDN based E1 interface. In other
|
||||
words, you can connect existing GSM Base Transceiver Station (BTS)
|
||||
through E1 to OpenBSC. So far, we have made it work with the Siemens BS-11,
|
||||
various Ericsson RBS2xxx BTS models and the Nokia MetroSite.
|
||||
|
||||
* A-bis over IP as used by the ip.access nanoBTS product family as well as
|
||||
the Open Source OsmoBTS software (by the same authors as OpenBSC). OsmoBTS
|
||||
in turn supports various transceiver hardware, including the sysmoBTS
|
||||
product family, as well as SDR transceivers supported by OsmoTRX, such as
|
||||
the UmTRX or USRP boardss.
|
||||
|
||||
* IuCS and IuPS over IP towards an HNB-GW (see osmo-iuh) for UMTS (3G)
|
||||
voice and data links.
|
||||
|
||||
Find OpenBSC online at
|
||||
http://openbsc.osmocom.org/
|
||||
|
||||
Harald Welte <laforge@gnumonks.org>
|
228
openbsc/configure.ac
Normal file
228
openbsc/configure.ac
Normal file
@@ -0,0 +1,228 @@
|
||||
dnl Process this file with autoconf to produce a configure script
|
||||
AC_INIT([openbsc],
|
||||
m4_esyscmd([./git-version-gen .tarball-version]),
|
||||
[openbsc@lists.osmocom.org])
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||
AC_CONFIG_TESTDIR(tests)
|
||||
|
||||
dnl kernel style compile messages
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
dnl checks for programs
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_RANLIB
|
||||
|
||||
dnl checks for libraries
|
||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
|
||||
AC_SUBST(LIBRARY_DL)
|
||||
|
||||
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.6.4)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl)
|
||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.7.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.2.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOGB, libosmogb >= 0.6.4)
|
||||
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.0.1)
|
||||
PKG_CHECK_MODULES(LIBCRYPTO, libcrypto >= 0.9.5)
|
||||
PKG_CHECK_MODULES(LIBASN1C, libasn1c)
|
||||
PKG_CHECK_MODULES(LIBOSMORANAP, libosmo-ranap)
|
||||
PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran)
|
||||
|
||||
# Enabke/disable the NAT?
|
||||
AC_ARG_ENABLE([nat], [AS_HELP_STRING([--enable-nat], [Build the BSC NAT. Requires SCCP])],
|
||||
[osmo_ac_build_nat="$enableval"],[osmo_ac_build_nat="no"])
|
||||
if test "$osmo_ac_build_nat" = "yes" ; then
|
||||
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.2)
|
||||
fi
|
||||
AM_CONDITIONAL(BUILD_NAT, test "x$osmo_ac_build_nat" = "xyes")
|
||||
AC_SUBST(osmo_ac_build_nat)
|
||||
|
||||
# Enable/disable the BSC?
|
||||
AC_ARG_ENABLE([osmo-bsc], [AS_HELP_STRING([--enable-osmo-bsc], [Build the Osmo BSC])],
|
||||
[osmo_ac_build_bsc="$enableval"],[osmo_ac_build_bsc="no"])
|
||||
if test "$osmo_ac_build_bsc" = "yes" ; then
|
||||
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.6)
|
||||
fi
|
||||
AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes")
|
||||
AC_SUBST(osmo_ac_build_bsc)
|
||||
|
||||
# Enable/disable smpp support in the cscn?
|
||||
AC_ARG_ENABLE([smpp], [AS_HELP_STRING([--enable-smpp], [Build the SMPP interface])],
|
||||
[osmo_ac_build_smpp="$enableval"],[osmo_ac_build_smpp="no"])
|
||||
if test "$osmo_ac_build_smpp" = "yes" ; then
|
||||
PKG_CHECK_MODULES(LIBSMPP34, libsmpp34 >= 1.10)
|
||||
AC_DEFINE(BUILD_SMPP, 1, [Define if we want to build SMPP])
|
||||
fi
|
||||
AM_CONDITIONAL(BUILD_SMPP, test "x$osmo_ac_build_smpp" = "xyes")
|
||||
AC_SUBST(osmo_ac_build_smpp)
|
||||
|
||||
# Enable/disable transcoding within osmo-bsc_mgcp?
|
||||
AC_ARG_ENABLE([mgcp-transcoding], [AS_HELP_STRING([--enable-mgcp-transcoding], [Build the MGCP gateway with internal transcoding enabled.])],
|
||||
[osmo_ac_mgcp_transcoding="$enableval"],[osmo_ac_mgcp_transcoding="no"])
|
||||
AC_ARG_WITH([g729], [AS_HELP_STRING([--with-g729], [Enable G.729 encoding/decoding.])], [osmo_ac_with_g729="$withval"],[osmo_ac_with_g729="no"])
|
||||
|
||||
if test "$osmo_ac_mgcp_transcoding" = "yes" ; then
|
||||
AC_SEARCH_LIBS([gsm_create], [gsm], [LIBRARY_GSM="$LIBS";LIBS=""])
|
||||
AC_SUBST(LIBRARY_GSM)
|
||||
if test "$osmo_ac_with_g729" = "yes" ; then
|
||||
PKG_CHECK_MODULES(LIBBCG729, libbcg729 >= 0.1, [AC_DEFINE([HAVE_BCG729], [1], [Use bgc729 decoder/encoder])])
|
||||
fi
|
||||
AC_DEFINE(BUILD_MGCP_TRANSCODING, 1, [Define if we want to build the MGCP gateway with transcoding support])
|
||||
fi
|
||||
AM_CONDITIONAL(BUILD_MGCP_TRANSCODING, test "x$osmo_ac_mgcp_transcoding" = "xyes")
|
||||
AC_SUBST(osmo_ac_mgcp_transcoding)
|
||||
|
||||
|
||||
found_libgtp=yes
|
||||
PKG_CHECK_MODULES(LIBGTP, libgtp >= 0.92, , found_libgtp=no)
|
||||
AM_CONDITIONAL(HAVE_LIBGTP, test "$found_libgtp" = yes)
|
||||
AC_SUBST(found_libgtp)
|
||||
|
||||
found_libcares=yes
|
||||
PKG_CHECK_MODULES([LIBCARES], [libcares], [], [found_libcares=no])
|
||||
AM_CONDITIONAL(HAVE_LIBCARES, test "$found_libcares" = yes)
|
||||
AC_SUBST(found_libcares)
|
||||
|
||||
found_libgtp_and_libcares=no
|
||||
if test "$found_libgtp" = "yes" -a "$found_libcares" = "yes"; then
|
||||
found_libgtp_and_libcares=yes
|
||||
fi
|
||||
AC_SUBST(found_libgtp_and_libcares)
|
||||
|
||||
dnl checks for header files
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS(dbi/dbd.h,,AC_MSG_ERROR(DBI library is not installed))
|
||||
AC_CHECK_HEADERS(pcap/pcap.h,,AC_MSG_ERROR(PCAP library is not installed))
|
||||
|
||||
found_cdk=yes
|
||||
AC_CHECK_HEADERS(cdk/cdk.h,,found_cdk=no)
|
||||
AM_CONDITIONAL(HAVE_LIBCDK, test "$found_cdk" = yes)
|
||||
|
||||
found_sqlite3=yes
|
||||
PKG_CHECK_MODULES(SQLITE3, sqlite3, ,found_sqlite3=no)
|
||||
AM_CONDITIONAL(HAVE_SQLITE3, test "$found_sqlite3" = yes)
|
||||
AC_SUBST(found_sqlite3)
|
||||
|
||||
|
||||
dnl Checks for typedefs, structures and compiler characteristics
|
||||
|
||||
# The following test is taken from WebKit's webkit.m4
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fvisibility=hidden "
|
||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
SYMBOL_VISIBILITY="-fvisibility=hidden"],
|
||||
AC_MSG_RESULT([no]))
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
AC_SUBST(SYMBOL_VISIBILITY)
|
||||
|
||||
# Coverage build taken from WebKit's configure.in
|
||||
AC_MSG_CHECKING([whether to enable code coverage support])
|
||||
AC_ARG_ENABLE(coverage,
|
||||
AC_HELP_STRING([--enable-coverage],
|
||||
[enable code coverage support [default=no]]),
|
||||
[],[enable_coverage="no"])
|
||||
AC_MSG_RESULT([$enable_coverage])
|
||||
if test "$enable_coverage" = "yes"; then
|
||||
COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
AC_SUBST([COVERAGE_CFLAGS])
|
||||
AC_SUBST([COVERAGE_LDFLAGS])
|
||||
fi
|
||||
|
||||
AC_DEFUN([CHECK_TM_INCLUDES_TM_GMTOFF], [
|
||||
AC_CACHE_CHECK(
|
||||
[whether struct tm has tm_gmtoff member],
|
||||
osmo_cv_tm_includes_tm_gmtoff,
|
||||
[AC_LINK_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#include <time.h>
|
||||
], [
|
||||
time_t t = time(NULL);
|
||||
struct tm* lt = localtime(&t);
|
||||
int off = lt->tm_gmtoff;
|
||||
])
|
||||
],
|
||||
osmo_cv_tm_includes_tm_gmtoff=yes,
|
||||
osmo_cv_tm_includes_tm_gmtoff=no
|
||||
)]
|
||||
)
|
||||
if test "x$osmo_cv_tm_includes_tm_gmtoff" = xyes; then
|
||||
AC_DEFINE(HAVE_TM_GMTOFF_IN_TM, 1,
|
||||
[Define if struct tm has tm_gmtoff member.])
|
||||
fi
|
||||
])
|
||||
|
||||
CHECK_TM_INCLUDES_TM_GMTOFF
|
||||
|
||||
AC_ARG_ENABLE([vty_tests],
|
||||
AC_HELP_STRING([--enable-vty-tests],
|
||||
[Include the VTY/CTRL tests in make check (deprecated)
|
||||
[default=no]]),
|
||||
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
|
||||
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
|
||||
AM_PATH_PYTHON
|
||||
AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)
|
||||
if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then
|
||||
AC_MSG_ERROR([Please install osmocom-python 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")
|
||||
|
||||
dnl Generate the output
|
||||
AM_CONFIG_HEADER(bscconfig.h)
|
||||
|
||||
AC_OUTPUT(
|
||||
openbsc.pc
|
||||
include/openbsc/Makefile
|
||||
include/Makefile
|
||||
src/Makefile
|
||||
src/libtrau/Makefile
|
||||
src/libbsc/Makefile
|
||||
src/libmsc/Makefile
|
||||
src/libmgcp/Makefile
|
||||
src/libcommon/Makefile
|
||||
src/libfilter/Makefile
|
||||
src/libiu/Makefile
|
||||
src/libxsc/Makefile
|
||||
src/osmo-cscn/Makefile
|
||||
src/osmo-bsc/Makefile
|
||||
src/osmo-bsc_nat/Makefile
|
||||
src/osmo-bsc_mgcp/Makefile
|
||||
src/ipaccess/Makefile
|
||||
src/utils/Makefile
|
||||
src/gprs/Makefile
|
||||
tests/Makefile
|
||||
tests/atlocal
|
||||
tests/libiudummy/Makefile
|
||||
tests/gsm0408/Makefile
|
||||
tests/db/Makefile
|
||||
tests/channel/Makefile
|
||||
tests/bsc/Makefile
|
||||
tests/bsc-nat/Makefile
|
||||
tests/bsc-nat-trie/Makefile
|
||||
tests/mgcp/Makefile
|
||||
tests/gprs/Makefile
|
||||
tests/gbproxy/Makefile
|
||||
tests/abis/Makefile
|
||||
tests/smpp/Makefile
|
||||
tests/trau/Makefile
|
||||
tests/sgsn/Makefile
|
||||
tests/subscr/Makefile
|
||||
tests/oap/Makefile
|
||||
tests/gtphub/Makefile
|
||||
tests/mm_auth/Makefile
|
||||
doc/Makefile
|
||||
doc/examples/Makefile
|
||||
Makefile)
|
170
openbsc/contrib/a-link/sccp-split-by-con.lua
Normal file
170
openbsc/contrib/a-link/sccp-split-by-con.lua
Normal file
@@ -0,0 +1,170 @@
|
||||
-- Split trace based on SCCP Source
|
||||
-- There are still bugs to find... bugs bugs bugs... hmm
|
||||
do
|
||||
local function init_listener()
|
||||
print("CREATED LISTENER")
|
||||
local tap = Listener.new("ip", "sccp && (ip.src == 172.16.1.81 || ip.dst == 172.16.1.81)")
|
||||
local sccp_type_field = Field.new("sccp.message_type")
|
||||
local sccp_src_field = Field.new("sccp.slr")
|
||||
local sccp_dst_field = Field.new("sccp.dlr")
|
||||
local msg_type_field = Field.new("gsm_a.dtap_msg_mm_type")
|
||||
local lu_rej_field = Field.new("gsm_a.dtap.rej_cause")
|
||||
local ip_src_field = Field.new("ip.src")
|
||||
local ip_dst_field = Field.new("ip.dst")
|
||||
|
||||
--
|
||||
local bssmap_msgtype_field = Field.new("gsm_a.bssmap_msgtype")
|
||||
-- assignment failure 0x03
|
||||
--
|
||||
|
||||
--
|
||||
local dtap_cause_field = Field.new("gsm_a_dtap.cause")
|
||||
local dtap_cc_field = Field.new("gsm_a.dtap_msg_cc_type")
|
||||
|
||||
local connections = {}
|
||||
|
||||
function check_failure(con)
|
||||
check_lu_reject(con)
|
||||
check_disconnect(con)
|
||||
check_failures(con)
|
||||
end
|
||||
|
||||
-- cipher mode reject
|
||||
function check_failures(con)
|
||||
local msgtype = bssmap_msgtype_field()
|
||||
if not msgtype then
|
||||
return
|
||||
end
|
||||
|
||||
msgtype = tonumber(msgtype)
|
||||
if msgtype == 89 then
|
||||
print("Cipher mode reject")
|
||||
con[4] = true
|
||||
elseif msgtype == 0x03 then
|
||||
print("Assignment failure")
|
||||
con[4] = true
|
||||
elseif msgtype == 0x22 then
|
||||
print("Clear Request... RF failure?")
|
||||
con[4] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- check if a DISCONNECT is normal
|
||||
function check_disconnect(con)
|
||||
local msg_type = dtap_cc_field()
|
||||
if not msg_type then
|
||||
return
|
||||
end
|
||||
|
||||
if tonumber(msg_type) ~= 0x25 then
|
||||
return
|
||||
end
|
||||
|
||||
local cause = dtap_cause_field()
|
||||
if not cause then
|
||||
return
|
||||
end
|
||||
|
||||
cause = tonumber(cause)
|
||||
if cause ~= 0x10 then
|
||||
print("DISCONNECT != Normal")
|
||||
con[4] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- check if we have a LU Reject
|
||||
function check_lu_reject(con)
|
||||
local msg_type = msg_type_field()
|
||||
if not msg_type then
|
||||
return
|
||||
end
|
||||
|
||||
msg_type = tonumber(tostring(msg_type))
|
||||
if msg_type == 0x04 then
|
||||
print("LU REJECT with " .. tostring(lu_rej_field()))
|
||||
con[4] = true
|
||||
end
|
||||
end
|
||||
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local ip_src = tostring(ip_src_field())
|
||||
local ip_dst = tostring(ip_dst_field())
|
||||
local sccp_type = tonumber(tostring(sccp_type_field()))
|
||||
local sccp_src = sccp_src_field()
|
||||
local sccp_dst = sccp_dst_field()
|
||||
|
||||
local con
|
||||
|
||||
if sccp_type == 0x01 then
|
||||
elseif sccp_type == 0x2 then
|
||||
local src = string.format("%s-%s", ip_src, tostring(sccp_src))
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
local datestring = os.date("%Y%m%d%H%M%S")
|
||||
local pcap_name = string.format("alink_trace_%s-%s_%s.pcap", src, dst, datestring)
|
||||
local dumper = Dumper.new_for_current(pcap_name)
|
||||
|
||||
local con = { ip_src, tostring(sccp_src), tostring(sccp_dst), false, dumper, pcap_name }
|
||||
|
||||
dumper:dump_current()
|
||||
connections[src] = con
|
||||
connections[dst] = con
|
||||
elseif sccp_type == 0x4 then
|
||||
-- close a connection... remove it from the list
|
||||
local src = string.format("%s-%s", ip_src, tostring(sccp_src))
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
|
||||
local con = connections[src]
|
||||
if not con then
|
||||
return
|
||||
end
|
||||
|
||||
con[5]:dump_current()
|
||||
con[5]:flush()
|
||||
|
||||
-- this causes a crash on unpacted wireshark
|
||||
con[5]:close()
|
||||
|
||||
-- the connection had a failure
|
||||
if con[4] == true then
|
||||
local datestring = os.date("%Y%m%d%H%M%S")
|
||||
local new_name = string.format("alink_failure_%s_%s-%s.pcap", datestring, con[2], con[3])
|
||||
os.rename(con[6], new_name)
|
||||
else
|
||||
os.remove(con[6])
|
||||
end
|
||||
|
||||
|
||||
-- clear the old connection
|
||||
connections[src] = nil
|
||||
connections[dst] = nil
|
||||
|
||||
elseif sccp_type == 0x5 then
|
||||
-- not handled yet... we should verify stuff here...
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
local con = connections[dst]
|
||||
if not con then
|
||||
return
|
||||
end
|
||||
con[5]:dump_current()
|
||||
elseif sccp_type == 0x6 then
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
local con = connections[dst]
|
||||
if not con then
|
||||
print("DON'T KNOW THIS CONNECTION for " .. ip_dst)
|
||||
return
|
||||
end
|
||||
con[5]:dump_current()
|
||||
check_failure(con)
|
||||
end
|
||||
|
||||
end
|
||||
function tap.draw()
|
||||
print("DRAW")
|
||||
end
|
||||
function tap.reset()
|
||||
print("RESET")
|
||||
end
|
||||
end
|
||||
|
||||
init_listener()
|
||||
end
|
1
openbsc/contrib/bsc-test/README
Normal file
1
openbsc/contrib/bsc-test/README
Normal file
@@ -0,0 +1 @@
|
||||
Some crazy scripts call testing... and MSC link failure simulation
|
8
openbsc/contrib/bsc-test/all_dial
Normal file
8
openbsc/contrib/bsc-test/all_dial
Normal file
@@ -0,0 +1,8 @@
|
||||
ABORT BUSY
|
||||
ABORT 'NO CARRIER'
|
||||
ABORT 'OK'
|
||||
|
||||
'' AT
|
||||
SAY "Dialing a number\n"
|
||||
'OK' ATD05660066;
|
||||
|
11
openbsc/contrib/bsc-test/dial.sh
Executable file
11
openbsc/contrib/bsc-test/dial.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
# Evil dial script..
|
||||
|
||||
while true;
|
||||
do
|
||||
chat -v -f all_dial < /dev/ttyACM0 > /dev/ttyACM0
|
||||
sleep 5s
|
||||
chat -v -f hangup < /dev/ttyACM0 > /dev/ttyACM0
|
||||
sleep 2s
|
||||
done
|
||||
|
6
openbsc/contrib/bsc-test/drop-oml.sh
Executable file
6
openbsc/contrib/bsc-test/drop-oml.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
sleep 3
|
||||
echo "enable"
|
||||
sleep 1
|
||||
echo "drop bts connection 0 oml"
|
||||
sleep 1
|
8
openbsc/contrib/bsc-test/drop.sh
Executable file
8
openbsc/contrib/bsc-test/drop.sh
Executable file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
while true;
|
||||
do
|
||||
echo "Going to drop the OML connection"
|
||||
./drop-oml.sh | telnet 127.0.0.1 4242
|
||||
sleep 58m
|
||||
done
|
4
openbsc/contrib/bsc-test/hangup
Normal file
4
openbsc/contrib/bsc-test/hangup
Normal file
@@ -0,0 +1,4 @@
|
||||
TIMEOUT 10
|
||||
'' ^Z
|
||||
SAY "Waiting for hangup confirm\n"
|
||||
'' ATH;
|
8
openbsc/contrib/bsc-test/msc.sh
Executable file
8
openbsc/contrib/bsc-test/msc.sh
Executable file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
while true;
|
||||
do
|
||||
echo "Kill the osmo-bsc"
|
||||
/usr/bin/kill -s SIGUSR2 `pidof osmo-bsc`
|
||||
sleep 58s
|
||||
done
|
104
openbsc/contrib/bsc_control.py
Executable file
104
openbsc/contrib/bsc_control.py
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys,os
|
||||
from optparse import OptionParser
|
||||
import socket
|
||||
import struct
|
||||
|
||||
verbose = False
|
||||
|
||||
def prefix_ipa_ctrl_header(data):
|
||||
return struct.pack(">HBB", len(data)+1, 0xee, 0) + data
|
||||
|
||||
def remove_ipa_ctrl_header(data):
|
||||
if (len(data) < 4):
|
||||
raise BaseException("Answer too short!")
|
||||
(plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", data[:4])
|
||||
if (plen + 3 > len(data)):
|
||||
print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3)
|
||||
if (ipa_proto != 0xee or osmo_proto != 0):
|
||||
raise BaseException("Wrong protocol in answer!")
|
||||
|
||||
return data[4:plen+3], data[plen+3:]
|
||||
|
||||
def connect(host, port):
|
||||
if verbose:
|
||||
print "Connecting to host %s:%i" % (host, port)
|
||||
|
||||
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sck.setblocking(1)
|
||||
sck.connect((host, port))
|
||||
return sck
|
||||
|
||||
def send(sck, data):
|
||||
if verbose:
|
||||
print "Sending \"%s\"" %(data)
|
||||
data = prefix_ipa_ctrl_header(data)
|
||||
sck.send(data)
|
||||
|
||||
def do_set(var, value, id, sck):
|
||||
setmsg = "SET %s %s %s" %(options.id, var, value)
|
||||
send(sck, setmsg)
|
||||
|
||||
def do_get(var, id, sck):
|
||||
getmsg = "GET %s %s" %(options.id, var)
|
||||
send(sck, getmsg)
|
||||
|
||||
parser = OptionParser("Usage: %prog [options] var [value]")
|
||||
parser.add_option("-d", "--host", dest="host",
|
||||
help="connect to HOST", metavar="HOST")
|
||||
parser.add_option("-p", "--port", dest="port", type="int",
|
||||
help="use PORT", metavar="PORT", default=4249)
|
||||
parser.add_option("-g", "--get", action="store_true",
|
||||
dest="cmd_get", help="perform GET operation")
|
||||
parser.add_option("-s", "--set", action="store_true",
|
||||
dest="cmd_set", help="perform SET operation")
|
||||
parser.add_option("-i", "--id", dest="id", default="1",
|
||||
help="set id manually", metavar="ID")
|
||||
parser.add_option("-v", "--verbose", action="store_true",
|
||||
dest="verbose", help="be verbose", default=False)
|
||||
parser.add_option("-m", "--monitor", action="store_true",
|
||||
dest="monitor", help="monitor the connection for traps", default=False)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
verbose = options.verbose
|
||||
|
||||
if options.cmd_set and options.cmd_get:
|
||||
parser.error("Get and set options are mutually exclusive!")
|
||||
|
||||
if not (options.cmd_get or options.cmd_set or options.monitor):
|
||||
parser.error("One of -m, -g, or -s must be set")
|
||||
|
||||
if not (options.host):
|
||||
parser.error("Destination host and port required!")
|
||||
|
||||
sock = connect(options.host, options.port)
|
||||
|
||||
if options.cmd_set:
|
||||
if len(args) < 2:
|
||||
parser.error("Set requires var and value arguments")
|
||||
do_set(args[0], ' '.join(args[1:]), options.id, sock)
|
||||
|
||||
if options.cmd_get:
|
||||
if len(args) != 1:
|
||||
parser.error("Get requires the var argument")
|
||||
do_get(args[0], options.id, sock)
|
||||
|
||||
data = sock.recv(1024)
|
||||
while (len(data)>0):
|
||||
(answer, data) = remove_ipa_ctrl_header(data)
|
||||
print "Got message:", answer
|
||||
|
||||
if options.monitor:
|
||||
while (True):
|
||||
data = sock.recv(1024)
|
||||
if len(data) == 0:
|
||||
print "Connection is gone."
|
||||
break
|
||||
|
||||
while (len(data)>0):
|
||||
(answer, data) = remove_ipa_ctrl_header(data)
|
||||
print "Got message:", answer
|
||||
|
||||
sock.close()
|
33
openbsc/contrib/bt.py
Executable file
33
openbsc/contrib/bt.py
Executable file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
|
||||
f = open("unbalanced")
|
||||
lines = []
|
||||
for line in f:
|
||||
lines.append(line)
|
||||
|
||||
filenames = {}
|
||||
|
||||
output = []
|
||||
for line in lines:
|
||||
if "[0x" in line:
|
||||
start = line.find("[")
|
||||
end = line.find("]")
|
||||
addr = line[start+1:end]
|
||||
try:
|
||||
file = filenames[addr]
|
||||
except KeyError:
|
||||
r = os.popen("addr2line -fs -e ./bsc_hack %s" % addr)
|
||||
all = r.read().replace("\n", ",")
|
||||
file = all
|
||||
filenames[addr] = file
|
||||
|
||||
line = line.replace(addr, file)
|
||||
output.append(line)
|
||||
|
||||
g = open("unbalanced.2", "w")
|
||||
g.write("".join(output))
|
||||
|
||||
|
||||
|
37
openbsc/contrib/convert_to_enum.py
Executable file
37
openbsc/contrib/convert_to_enum.py
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#
|
||||
# Convert ETSI documents to an enum
|
||||
#
|
||||
|
||||
import re, sys
|
||||
|
||||
def convert(string):
|
||||
string = string.strip().replace(" ", "").rjust(8, "0")
|
||||
var = 0
|
||||
offset = 7
|
||||
for char in string:
|
||||
assert offset >= 0
|
||||
var = var | (int(char) << offset)
|
||||
offset = offset - 1
|
||||
|
||||
return var
|
||||
|
||||
def string(name):
|
||||
name = name.replace(" ", "_")
|
||||
name = name.replace('"', "")
|
||||
name = name.replace('/', '_')
|
||||
name = name.replace('(', '_')
|
||||
name = name.replace(')', '_')
|
||||
return "%s_%s" % (sys.argv[2], name.upper())
|
||||
|
||||
file = open(sys.argv[1])
|
||||
|
||||
|
||||
for line in file:
|
||||
m = re.match(r"[ \t]*(?P<value>[01 ]+)[ ]+(?P<name>[a-zA-Z /0-9()]+)", line[:-1])
|
||||
|
||||
if m:
|
||||
print "\t%s\t\t= %d," % (string(m.groupdict()["name"]), convert(m.groupdict()["value"]))
|
||||
else:
|
||||
print line[:-1]
|
58
openbsc/contrib/gprs/gb-proxy-unblock-bug.py
Executable file
58
openbsc/contrib/gprs/gb-proxy-unblock-bug.py
Executable file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""
|
||||
demonstrate a unblock bug on the GB Proxy..
|
||||
"""
|
||||
|
||||
bts_ns_reset = "\x02\x00\x81\x01\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
|
||||
ns_reset_ack = "\x03\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
|
||||
|
||||
bts_ns_unblock = "\x06"
|
||||
ns_unblock_ack = "\x07"
|
||||
|
||||
bts_bvc_reset_0 = "\x00\x00\x00\x00\x22\x04\x82\x00\x00\x07\x81\x03\x3b\x81\x02"
|
||||
ns_bvc_reset_0_ack = "\x00\x00\x00\x00\x23\x04\x82\x00\x00"
|
||||
|
||||
bts_bvc_reset_8167 = "\x00\x00\x00\x00\x22\x04\x82\x1f\xe7\x07\x81\x08\x08\x88\x72\xf4\x80\x10\x1c\x00\x9c\x40"
|
||||
|
||||
|
||||
import socket
|
||||
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
socket.bind(("0.0.0.0", 0))
|
||||
socket.setblocking(1)
|
||||
|
||||
|
||||
import sys
|
||||
port = int(sys.argv[1])
|
||||
print "Sending data to port: %d" % port
|
||||
|
||||
def send_and_receive(packet):
|
||||
socket.sendto(packet, ("127.0.0.1", port))
|
||||
|
||||
try:
|
||||
data, addr = socket.recvfrom(4096)
|
||||
except socket.error, e:
|
||||
print "ERROR", e
|
||||
import sys
|
||||
sys.exit(0)
|
||||
return data
|
||||
|
||||
#send stuff once
|
||||
|
||||
to_send = [
|
||||
(bts_ns_reset, ns_reset_ack, "reset ack"),
|
||||
(bts_ns_unblock, ns_unblock_ack, "unblock ack"),
|
||||
(bts_bvc_reset_0, ns_bvc_reset_0_ack, "BVCI=0 reset ack"),
|
||||
]
|
||||
|
||||
|
||||
for (out, inp, type) in to_send:
|
||||
res = send_and_receive(out)
|
||||
if res != inp:
|
||||
print "Failed to get the %s" % type
|
||||
sys.exit(-1)
|
||||
|
||||
import time
|
||||
time.sleep(3)
|
||||
res = send_and_receive(bts_bvc_reset_8167)
|
||||
print "Sent all messages... check wireshark for the last response"
|
78
openbsc/contrib/gprs/gprs-bssgp-histogram.lua
Normal file
78
openbsc/contrib/gprs/gprs-bssgp-histogram.lua
Normal file
@@ -0,0 +1,78 @@
|
||||
-- Simple LUA script to print the size of BSSGP messages over their type...
|
||||
|
||||
do
|
||||
local ip_bucket = {}
|
||||
|
||||
local pdu_types = {}
|
||||
pdu_types[ 6] = "PAGING"
|
||||
pdu_types[11] = "SUSPEND"
|
||||
pdu_types[12] = "SUSPEND-ACK"
|
||||
pdu_types[32] = "BVC-BLOCK"
|
||||
pdu_types[33] = "BVC-BLOCK-ACK"
|
||||
pdu_types[34] = "BVC-RESET"
|
||||
pdu_types[35] = "BVC-RESET-ACK"
|
||||
pdu_types[36] = "UNBLOCK"
|
||||
pdu_types[37] = "UNBLOCK-ACK"
|
||||
pdu_types[38] = "FLOW-CONTROL-BVC"
|
||||
pdu_types[39] = "FLOW-CONTROL-BVC-ACK"
|
||||
pdu_types[40] = "FLOW-CONTROL-MS"
|
||||
pdu_types[41] = "FLOW-CONTROL-MS-ACK"
|
||||
pdu_types[44] = "LLC-DISCARDED"
|
||||
|
||||
local function init_listener()
|
||||
-- handle the port as NS over IP
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
-- bssgp filters
|
||||
local bssgp_pdu_get = Field.new("bssgp.pdu_type")
|
||||
local udp_length_get = Field.new("udp.length")
|
||||
|
||||
local tap = Listener.new("ip", "udp.port == 23000")
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local pdu = bssgp_pdu_get()
|
||||
local len = udp_length_get()
|
||||
|
||||
-- only handle bssgp, but we also want the IP frame
|
||||
if not pdu then
|
||||
return
|
||||
end
|
||||
|
||||
pdu = tostring(pdu)
|
||||
if tonumber(pdu) == 0 or tonumber(pdu) == 1 then
|
||||
return
|
||||
end
|
||||
|
||||
local ip_src = tostring(ip.ip_src)
|
||||
local bssgp_histo = ip_bucket[ip_src]
|
||||
if not bssgp_histo then
|
||||
bssgp_histo = {}
|
||||
ip_bucket[ip_src] = bssgp_histo
|
||||
end
|
||||
|
||||
local key = pdu
|
||||
local bucket = bssgp_histo[key]
|
||||
if not bucket then
|
||||
bucket = {}
|
||||
bssgp_histo[key] = bucket
|
||||
end
|
||||
|
||||
table.insert(bucket, tostring(len))
|
||||
print("IP: " .. ip_src .. " PDU: " .. pdu_types[tonumber(pdu)] .. " Length: " .. tostring(len))
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
-- well... this will not be called...
|
||||
-- for ip,bssgp_histo in pairs(dumpers) do
|
||||
-- print("IP " .. ip)
|
||||
-- end
|
||||
end
|
||||
|
||||
function tap.reset()
|
||||
-- well... this will not be called...
|
||||
end
|
||||
end
|
||||
|
||||
init_listener()
|
||||
end
|
80
openbsc/contrib/gprs/gprs-buffer-count.lua
Normal file
80
openbsc/contrib/gprs/gprs-buffer-count.lua
Normal file
@@ -0,0 +1,80 @@
|
||||
-- I count the buffer space needed for LLC PDUs in the worse case and print it
|
||||
|
||||
do
|
||||
local function init_listener()
|
||||
-- handle the port as NS over IP
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
-- bssgp filters
|
||||
local bssgp_pdu_get = Field.new("bssgp.pdu_type")
|
||||
local bssgp_delay_get = Field.new("bssgp.delay_val")
|
||||
local llcgprs_get = Field.new("llcgprs")
|
||||
local pdus = nil
|
||||
|
||||
print("START...")
|
||||
|
||||
local tap = Listener.new("ip", "udp.port == 23000 && bssgp.pdu_type == 0")
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local pdu = bssgp_pdu_get()
|
||||
local len = llcgprs_get().len
|
||||
local delay = bssgp_delay_get()
|
||||
|
||||
-- only handle bssgp, but we also want the IP frame
|
||||
if not pdu then
|
||||
return
|
||||
end
|
||||
|
||||
if tonumber(tostring(delay)) == 65535 then
|
||||
pdus = { next = pdus,
|
||||
len = len,
|
||||
expires = -1 }
|
||||
else
|
||||
local off = tonumber(tostring(delay)) / 100.0
|
||||
pdus = { next = pdus,
|
||||
len = len,
|
||||
expires = pinfo.rel_ts + off }
|
||||
end
|
||||
local now_time = tonumber(tostring(pinfo.rel_ts))
|
||||
local now_size = 0
|
||||
local l = pdus
|
||||
local prev = nil
|
||||
local count = 0
|
||||
while l do
|
||||
if now_time < l.expires or l.expires == -1 then
|
||||
now_size = now_size + l.len
|
||||
prev = l
|
||||
l = l.next
|
||||
count = count + 1
|
||||
else
|
||||
-- delete things
|
||||
if prev == nil then
|
||||
pdus = nil
|
||||
l = nil
|
||||
else
|
||||
prev.next = l.next
|
||||
l = l.next
|
||||
end
|
||||
end
|
||||
end
|
||||
-- print("TOTAL: " .. now_time .. " PDU_SIZE: " .. now_size)
|
||||
print(now_time .. " " .. now_size / 1024.0 .. " " .. count)
|
||||
-- print("NOW: " .. tostring(pinfo.rel_ts) .. " Delay: " .. tostring(delay) .. " Length: " .. tostring(len))
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
-- well... this will not be called...
|
||||
-- for ip,bssgp_histo in pairs(dumpers) do
|
||||
-- print("IP " .. ip)
|
||||
-- end
|
||||
print("END")
|
||||
end
|
||||
|
||||
function tap.reset()
|
||||
-- well... this will not be called...
|
||||
end
|
||||
end
|
||||
|
||||
init_listener()
|
||||
end
|
46
openbsc/contrib/gprs/gprs-split-trace-by-tlli.lua
Normal file
46
openbsc/contrib/gprs/gprs-split-trace-by-tlli.lua
Normal file
@@ -0,0 +1,46 @@
|
||||
-- Create a file named by_ip/''ip_addess''.cap with all ip traffic of each ip host. (works for tshark only)
|
||||
-- Dump files are created for both source and destination hosts
|
||||
do
|
||||
local dir = "by_tlli"
|
||||
local dumpers = {}
|
||||
local function init_listener()
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
local field_tlli = Field.new("bssgp.tlli")
|
||||
local tap = Listener.new("ip", "udp.port == 23000")
|
||||
|
||||
-- we will be called once for every IP Header.
|
||||
-- If there's more than one IP header in a given packet we'll dump the packet once per every header
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local tlli = field_tlli()
|
||||
if not tlli then
|
||||
return
|
||||
end
|
||||
|
||||
local tlli_str = tostring(tlli)
|
||||
tlli_dmp = dumpers[tlli_str]
|
||||
if not tlli_dmp then
|
||||
local tlli_hex = string.format("0x%x", tonumber(tlli_str))
|
||||
print("Creating dump for TLLI " .. tlli_hex)
|
||||
tlli_dmp = Dumper.new_for_current(dir .. "/" .. tlli_hex .. ".pcap")
|
||||
dumpers[tlli_str] = tlli_dmp
|
||||
end
|
||||
tlli_dmp:dump_current()
|
||||
tlli_dmp:flush()
|
||||
end
|
||||
function tap.draw()
|
||||
for tlli,dumper in pairs(dumpers) do
|
||||
dumper:flush()
|
||||
end
|
||||
end
|
||||
function tap.reset()
|
||||
for tlli,dumper in pairs(dumpers) do
|
||||
dumper:close()
|
||||
end
|
||||
dumpers = {}
|
||||
end
|
||||
end
|
||||
init_listener()
|
||||
end
|
59
openbsc/contrib/gprs/gprs-verify-nu.lua
Normal file
59
openbsc/contrib/gprs/gprs-verify-nu.lua
Normal file
@@ -0,0 +1,59 @@
|
||||
-- This script verifies that the N(U) is increasing...
|
||||
--
|
||||
do
|
||||
local nu_state_src = {}
|
||||
|
||||
local function init_listener()
|
||||
-- handle the port as NS over IP
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
-- we want to look here...
|
||||
local llc_sapi_get = Field.new("llcgprs.sapib")
|
||||
local llc_nu_get = Field.new("llcgprs.nu")
|
||||
local bssgp_tlli_get = Field.new("bssgp.tlli")
|
||||
|
||||
local tap = Listener.new("ip", "udp.port == 23000")
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local llc_sapi = llc_sapi_get()
|
||||
local llc_nu = llc_nu_get()
|
||||
local bssgp_tlli = bssgp_tlli_get()
|
||||
|
||||
if not llc_sapi or not llc_nu or not bssgp_tlli then
|
||||
return
|
||||
end
|
||||
|
||||
local ip_src = tostring(ip.ip_src)
|
||||
local bssgp_tlli = tostring(bssgp_tlli)
|
||||
local llc_nu = tostring(llc_nu)
|
||||
local llc_sapi = tostring(llc_sapi)
|
||||
|
||||
local src_key = ip_src .. "-" .. bssgp_tlli .. "-" .. llc_sapi
|
||||
local last_nu = nu_state_src[src_key]
|
||||
if not last_nu then
|
||||
-- print("Establishing mapping for " .. src_key)
|
||||
nu_state_src[src_key] = llc_nu
|
||||
return
|
||||
end
|
||||
|
||||
local function tohex(number)
|
||||
return string.format("0x%x", tonumber(number))
|
||||
end
|
||||
|
||||
nu_state_src[src_key] = llc_nu
|
||||
if tonumber(last_nu) + 1 ~= tonumber(llc_nu) then
|
||||
print("JUMP in N(U) on TLLI " .. tohex(bssgp_tlli) .. " and SAPI: " .. llc_sapi .. " src: " .. ip_src)
|
||||
print("\t last: " .. last_nu .. " now: " .. llc_nu)
|
||||
end
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
end
|
||||
|
||||
function tap.reset()
|
||||
end
|
||||
end
|
||||
init_listener()
|
||||
end
|
||||
|
18
openbsc/contrib/hlr-remove-old.sql
Normal file
18
openbsc/contrib/hlr-remove-old.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
-- Remove old data from the database
|
||||
DELETE FROM Subscriber
|
||||
WHERE id != 1 AND datetime('now', '-10 days') > updated AND authorized != 1;
|
||||
DELETE FROM Equipment
|
||||
WHERE datetime('now', '-10 days') > updated;
|
||||
DELETE FROM EquipmentWatch
|
||||
WHERE datetime('now', '-10 days') > updated;
|
||||
DELETE FROM SMS
|
||||
WHERE datetime('now', '-10 days') > created;
|
||||
DELETE FROM VLR
|
||||
WHERE datetime('now', '-10 days') > updated;
|
||||
DELETE FROM ApduBlobs
|
||||
WHERE datetime('now', '-10 days') > created;
|
||||
DELETE FROM Counters
|
||||
WHERE datetime('now', '-10 days') > timestamp;
|
||||
DELETE FROM RateCounters
|
||||
WHERE datetime('now', '-10 days') > timestamp;
|
||||
VACUUM;
|
125
openbsc/contrib/hlrsync/hlrsync.py
Executable file
125
openbsc/contrib/hlrsync/hlrsync.py
Executable file
@@ -0,0 +1,125 @@
|
||||
#!/usr/bin/python2.5
|
||||
|
||||
from __future__ import with_statement
|
||||
|
||||
from pysqlite2 import dbapi2 as sqlite3
|
||||
import sys
|
||||
|
||||
hlr = sqlite3.connect(sys.argv[1])
|
||||
web = sqlite3.connect(sys.argv[2])
|
||||
|
||||
# switch to autocommit
|
||||
hlr.isolation_level = None
|
||||
web.isolation_level = None
|
||||
|
||||
hlr.row_factory = sqlite3.Row
|
||||
web.row_factory = sqlite3.Row
|
||||
|
||||
with hlr:
|
||||
hlr_subscrs = hlr.execute("""
|
||||
SELECT * FROM Subscriber
|
||||
""").fetchall()
|
||||
hlr_tokens = hlr.execute("""
|
||||
SELECT * FROM AuthToken
|
||||
""").fetchall()
|
||||
|
||||
with web:
|
||||
web_tokens = web.execute("""
|
||||
SELECT * FROM reg_tokens
|
||||
""").fetchall()
|
||||
web_sms = web.execute("""
|
||||
SELECT * FROM sms_queue
|
||||
""").fetchall()
|
||||
|
||||
# index by subscr id
|
||||
hlr_subscrs_by_id = {}
|
||||
hlr_subscrs_by_ext = {}
|
||||
hlr_tokens_by_subscr_id = {}
|
||||
for x in hlr_subscrs:
|
||||
hlr_subscrs_by_id[x['id']] = x
|
||||
hlr_subscrs_by_ext[x['extension']] = x
|
||||
del hlr_subscrs
|
||||
for x in hlr_tokens:
|
||||
hlr_tokens_by_subscr_id[x['subscriber_id']] = x
|
||||
del hlr_tokens
|
||||
|
||||
web_tokens_by_subscr_id = {}
|
||||
for x in web_tokens:
|
||||
web_tokens_by_subscr_id[x['subscriber_id']] = x
|
||||
del web_tokens
|
||||
|
||||
# remove leftover web_tokens and correct inconsistent fields
|
||||
with web:
|
||||
for x in web_tokens_by_subscr_id.values():
|
||||
subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
|
||||
if subscr is None:
|
||||
web.execute("""
|
||||
DELETE FROM reg_tokens WHERE subscriber_id = ?
|
||||
""", (x['subscriber_id'],))
|
||||
del web_tokens_by_subscr_id[x['subscriber_id']]
|
||||
continue
|
||||
if str(x['imsi']) != str(subscr['imsi']) or \
|
||||
x['extension'] != subscr['extension'] or \
|
||||
x['tmsi'] != subscr['tmsi'] or \
|
||||
x['lac'] != subscr['lac']:
|
||||
web.execute("""
|
||||
UPDATE reg_tokens
|
||||
SET imsi = ?, extension = ?, tmsi = ?, lac = ?
|
||||
WHERE subscriber_id = ?
|
||||
""", (str(subscr['imsi']), subscr['extension'],
|
||||
subscr['tmsi'], subscr['lac'], x['subscriber_id']))
|
||||
|
||||
# add missing web_tokens
|
||||
with web:
|
||||
for x in hlr_tokens_by_subscr_id.values():
|
||||
subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
|
||||
if subscr is None:
|
||||
hlr.execute("""
|
||||
DELETE FROM AuthToken WHERE subscriber_id = ?
|
||||
""", (x['subscriber_id'],))
|
||||
del hlr_tokens_by_subscr_id[x['subscriber_id']]
|
||||
continue
|
||||
webtoken = web_tokens_by_subscr_id.get(x['subscriber_id'], None)
|
||||
if webtoken is None:
|
||||
web.execute("""
|
||||
INSERT INTO reg_tokens
|
||||
(subscriber_id, extension, reg_completed, name, email, lac, imsi, token, tmsi)
|
||||
VALUES
|
||||
(?, ?, 0, ?, '', ?, ?, ?, ?)
|
||||
""", (x['subscriber_id'], subscr['extension'], subscr['name'],
|
||||
subscr['lac'], str(subscr['imsi']), x['token'], subscr['tmsi']))
|
||||
|
||||
# authorize subscribers
|
||||
with hlr:
|
||||
for x in web_tokens_by_subscr_id.values():
|
||||
subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
|
||||
if x['reg_completed'] and not subscr['authorized']:
|
||||
hlr.execute("""
|
||||
UPDATE Subscriber
|
||||
SET authorized = 1
|
||||
WHERE id = ?
|
||||
""", (x['subscriber_id'],))
|
||||
|
||||
# Sync SMS from web to hlr
|
||||
with hlr:
|
||||
for sms in web_sms:
|
||||
subscr = hlr_subscrs_by_ext.get(sms['receiver_ext'])
|
||||
if subscr is None:
|
||||
print '%s not found' % sms['receiver_ext']
|
||||
continue
|
||||
hlr.execute("""
|
||||
INSERT INTO SMS
|
||||
(created, sender_id, receiver_id, reply_path_req, status_rep_req, protocol_id, data_coding_scheme, ud_hdr_ind, text)
|
||||
VALUES
|
||||
(?, 1, ?, 0, 0, 0, 0, 0, ?)
|
||||
""", (sms['created'], subscr['id'], sms['text']))
|
||||
with web:
|
||||
for sms in web_sms:
|
||||
web.execute("""
|
||||
DELETE FROM sms_queue WHERE id = ?
|
||||
""", (sms['id'],))
|
||||
|
||||
|
||||
hlr.close()
|
||||
web.close()
|
||||
|
30
openbsc/contrib/nat/test_regexp.c
Normal file
30
openbsc/contrib/nat/test_regexp.c
Normal file
@@ -0,0 +1,30 @@
|
||||
/* make test_regexp */
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
regex_t reg;
|
||||
regmatch_t matches[2];
|
||||
|
||||
if (argc != 4) {
|
||||
printf("Invoke with: test_regexp REGEXP REPLACE NR\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (regcomp(®, argv[1], REG_EXTENDED) != 0) {
|
||||
fprintf(stderr, "Regexp '%s' is not valid.\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (regexec(®, argv[3], 2, matches, 0) == 0 && matches[1].rm_eo != -1)
|
||||
printf("New Number: %s%s\n", argv[2], &argv[3][matches[1].rm_so]);
|
||||
else
|
||||
printf("No match.\n");
|
||||
|
||||
regfree(®);
|
||||
|
||||
return 0;
|
||||
}
|
65
openbsc/contrib/nat/ussd_example.py
Normal file
65
openbsc/contrib/nat/ussd_example.py
Normal file
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python2.7
|
||||
|
||||
"""
|
||||
AGPLv3+ 2016 Copyright Holger Hans Peter Freyther
|
||||
|
||||
Example of how to connect to the USSD side-channel and how to respond
|
||||
with a fixed message.
|
||||
"""
|
||||
|
||||
import socket
|
||||
import struct
|
||||
|
||||
ussdSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ussdSocket.connect(('127.0.0.1', 5001))
|
||||
|
||||
def send_dt1(dstref, data):
|
||||
dlen = struct.pack('B', len(data)).encode('hex')
|
||||
hex = '06' + dstref.encode('hex') + '00' + '01' + dlen + data.encode('hex')
|
||||
pdata = hex.decode('hex')
|
||||
out = struct.pack('>HB', len(pdata), 0xfd) + pdata
|
||||
ussdSocket.send(out)
|
||||
|
||||
def send_rel(srcref, dstref):
|
||||
hex = '04' + dstref.encode('hex') + srcref.encode('hex') + '000100'
|
||||
pdata = hex.decode('hex')
|
||||
out = struct.pack('>HB', len(pdata), 0xfd) + pdata
|
||||
ussdSocket.send(out)
|
||||
|
||||
def recv_one():
|
||||
plen = ussdSocket.recv(3)
|
||||
(plen,ptype) = struct.unpack(">HB", plen)
|
||||
data = ussdSocket.recv(plen)
|
||||
|
||||
return ptype, data
|
||||
|
||||
# Assume this is the ID request
|
||||
data = ussdSocket.recv(4)
|
||||
ussdSocket.send("\x00\x08\xfe\x05\x00" + "\x05\x01" + "ussd")
|
||||
# ^len ^len of tag ... and ignore
|
||||
|
||||
# Expect a fake message. see struct ipac_msgt_sccp_state
|
||||
ptype, data = recv_one()
|
||||
print("%d %s" % (ptype, data.encode('hex')))
|
||||
(srcref, dstref, transid, invokeid) = struct.unpack("<3s3sBB", data[1:9])
|
||||
print("New transID %d invoke %d" % (transid, invokeid))
|
||||
|
||||
# Expect a the invocation.. todo.. extract invoke id
|
||||
ptype, data = recv_one()
|
||||
print("%d %s" % (ptype, data.encode('hex')))
|
||||
|
||||
# Reply with BSSAP + GSM 04.08 + MAP portion
|
||||
# 00 == invoke id 0f == DCS
|
||||
res = "01002a9b2a0802e1901c22a220020100301b02013b301604010f041155e7d2f9bc3a41412894991c06a9c9a713"
|
||||
send_dt1(dstref, res.decode('hex'))
|
||||
|
||||
clear = "000420040109"
|
||||
send_dt1(dstref, clear.decode('hex'))
|
||||
|
||||
# should be the clear complete
|
||||
send_rel(srcref, dstref)
|
||||
|
||||
# Give it some time to handle connection shutdown properly
|
||||
print("Gracefully sleeping")
|
||||
import time
|
||||
time.sleep(3)
|
420
openbsc/contrib/rtp/gen_rtp_header.erl
Executable file
420
openbsc/contrib/rtp/gen_rtp_header.erl
Executable file
@@ -0,0 +1,420 @@
|
||||
#!/usr/bin/env escript
|
||||
%% -*- erlang -*-
|
||||
%%! -smp disable
|
||||
-module(gen_rtp_header).
|
||||
|
||||
% -mode(compile).
|
||||
|
||||
-define(VERSION, "0.1").
|
||||
|
||||
-export([main/1]).
|
||||
|
||||
-record(rtp_packet,
|
||||
{
|
||||
version = 2,
|
||||
padding = 0,
|
||||
marker = 0,
|
||||
payload_type = 0,
|
||||
seqno = 0,
|
||||
timestamp = 0,
|
||||
ssrc = 0,
|
||||
csrcs = [],
|
||||
extension = <<>>,
|
||||
payload = <<>>,
|
||||
realtime
|
||||
}).
|
||||
|
||||
|
||||
main(Args) ->
|
||||
DefaultOpts = [{format, state},
|
||||
{ssrc, 16#11223344},
|
||||
{rate, 8000},
|
||||
{pt, 98}],
|
||||
{PosArgs, Opts} = getopts_checked(Args, DefaultOpts),
|
||||
log(debug, fun (Dev) ->
|
||||
io:format(Dev, "Initial options:~n", []),
|
||||
dump_opts(Dev, Opts),
|
||||
io:format(Dev, "~s: ~p~n", ["Args", PosArgs])
|
||||
end, [], Opts),
|
||||
main(PosArgs, Opts).
|
||||
|
||||
main([First | RemArgs], Opts) ->
|
||||
try
|
||||
F = list_to_integer(First),
|
||||
Format = proplists:get_value(format, Opts, state),
|
||||
PayloadData = proplists:get_value(payload, Opts, undef),
|
||||
InFile = proplists:get_value(file, Opts, undef),
|
||||
|
||||
Payload = case {PayloadData, InFile} of
|
||||
{undef, undef} ->
|
||||
% use default value
|
||||
#rtp_packet{}#rtp_packet.payload;
|
||||
{P, undef} -> P;
|
||||
{_, File} ->
|
||||
log(info, "Loading file '~s'~n", [File], Opts),
|
||||
{ok, InDev} = file:open(File, [read]),
|
||||
DS = [ Pl#rtp_packet.payload || {_T, Pl} <- read_packets(InDev, Opts)],
|
||||
file:close(InDev),
|
||||
log(debug, "File '~s' closed, ~w packets read.~n", [File, length(DS)], Opts),
|
||||
DS
|
||||
end,
|
||||
Dev = standard_io,
|
||||
write_packet_pre(Dev, Format),
|
||||
do_groups(Dev, Payload, F, RemArgs, Opts),
|
||||
write_packet_post(Dev, Format),
|
||||
0
|
||||
catch
|
||||
_:_ ->
|
||||
log(debug, "~p~n", [hd(erlang:get_stacktrace())], Opts),
|
||||
usage(),
|
||||
halt(1)
|
||||
end
|
||||
;
|
||||
|
||||
main(_, _Opts) ->
|
||||
usage(),
|
||||
halt(1).
|
||||
|
||||
%%% group (count + offset) handling %%%
|
||||
|
||||
do_groups(_Dev, _Pl, _F, [], _Opts) ->
|
||||
ok;
|
||||
|
||||
do_groups(Dev, Pl, F, [L], Opts) ->
|
||||
do_groups(Dev, Pl, F, [L, 0], Opts);
|
||||
|
||||
do_groups(Dev, Pl, First, [L, O | Args], Opts) ->
|
||||
Ssrc = proplists:get_value(ssrc, Opts, #rtp_packet.ssrc),
|
||||
PT = proplists:get_value(pt, Opts, #rtp_packet.payload_type),
|
||||
Len = list_to_num(L),
|
||||
Offs = list_to_num(O),
|
||||
log(info, "Starting group: Ssrc=~.16B, PT=~B, First=~B, Len=~B, Offs=~B~n",
|
||||
[Ssrc, PT, First, Len, Offs], Opts),
|
||||
Pkg = #rtp_packet{ssrc = Ssrc, payload_type = PT},
|
||||
Pl2 = write_packets(Dev, Pl, Pkg, First, Len, Offs, Opts),
|
||||
{Args2, Opts2} = getopts_checked(Args, Opts),
|
||||
log(debug, fun (Io) ->
|
||||
io:format(Io, "Changed options:~n", []),
|
||||
dump_opts(Io, Opts2 -- Opts)
|
||||
end, [], Opts),
|
||||
do_groups(Dev, Pl2, First+Len, Args2, Opts2).
|
||||
|
||||
%%% error handling helpers %%%
|
||||
|
||||
getopts_checked(Args, Opts) ->
|
||||
try
|
||||
getopts(Args, Opts)
|
||||
catch
|
||||
C:R ->
|
||||
log(error, "~s~n",
|
||||
[explain_error(C, R, erlang:get_stacktrace(), Opts)], Opts),
|
||||
usage(),
|
||||
halt(1)
|
||||
end.
|
||||
|
||||
explain_error(error, badarg, [{erlang,list_to_integer,[S,B]} | _ ], _Opts) ->
|
||||
io_lib:format("Invalid number '~s' (base ~B)", [S, B]);
|
||||
explain_error(error, badarg, [{erlang,list_to_integer,[S]} | _ ], _Opts) ->
|
||||
io_lib:format("Invalid decimal number '~s'", [S]);
|
||||
explain_error(C, R, [Hd | _ ], _Opts) ->
|
||||
io_lib:format("~p, ~p:~p", [Hd, C, R]);
|
||||
explain_error(_, _, [], _Opts) ->
|
||||
"".
|
||||
|
||||
%%% usage and options %%%
|
||||
|
||||
myname() ->
|
||||
filename:basename(escript:script_name()).
|
||||
|
||||
usage(Text) ->
|
||||
io:format(standard_error, "~s: ~s~n", [myname(), Text]),
|
||||
usage().
|
||||
|
||||
usage() ->
|
||||
io:format(standard_error,
|
||||
"Usage: ~s [Options] Start Count1 Offs1 [[Options] Count2 Offs2 ...]~n",
|
||||
[myname()]).
|
||||
|
||||
show_version() ->
|
||||
io:format(standard_io,
|
||||
"~s ~s~n", [myname(), ?VERSION]).
|
||||
|
||||
show_help() ->
|
||||
io:format(standard_io,
|
||||
"Usage: ~s [Options] Start Count1 Offs1 [[Options] Count2 Offs2 ...]~n~n" ++
|
||||
"Options:~n" ++
|
||||
" -h, --help this text~n" ++
|
||||
" --version show version info~n" ++
|
||||
" -i, --file=FILE reads payload from file (state format by default)~n" ++
|
||||
" -f, --frame-size=N read payload as binary frames of size N instead~n" ++
|
||||
" -p, --payload=HEX set constant payload~n" ++
|
||||
" --verbose=N set verbosity~n" ++
|
||||
" -v increase verbosity~n" ++
|
||||
" --format=state use state format for output (default)~n" ++
|
||||
" -C, --format=c use simple C lines for output~n" ++
|
||||
" --format=carray use a C array for output~n" ++
|
||||
" -s, --ssrc=SSRC set the SSRC~n" ++
|
||||
" -t, --type=N set the payload type~n" ++
|
||||
" -r, --rate=N set the RTP rate [8000]~n" ++
|
||||
" -D, --duration=N set the packet duration in RTP time units [160]~n" ++
|
||||
" -d, --delay=FLOAT add offset to playout timestamp~n" ++
|
||||
"~n" ++
|
||||
"Arguments:~n" ++
|
||||
" Start initial packet (sequence) number~n" ++
|
||||
" Count number of packets~n" ++
|
||||
" Offs timestamp offset (in RTP units)~n" ++
|
||||
"", [myname()]).
|
||||
|
||||
getopts([ "--file=" ++ File | R], Opts) ->
|
||||
getopts(R, [{file, File} | Opts]);
|
||||
getopts([ "-i" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--file", T, R, Opts);
|
||||
getopts([ "--frame-size=" ++ N | R], Opts) ->
|
||||
Size = list_to_integer(N),
|
||||
getopts(R, [{frame_size, Size}, {in_format, bin} | Opts]);
|
||||
getopts([ "-f" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--frame-size", T, R, Opts);
|
||||
getopts([ "--duration=" ++ N | R], Opts) ->
|
||||
Duration = list_to_integer(N),
|
||||
getopts(R, [{duration, Duration} | Opts]);
|
||||
getopts([ "-D" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--duration", T, R, Opts);
|
||||
getopts([ "--rate=" ++ N | R], Opts) ->
|
||||
Rate = list_to_integer(N),
|
||||
getopts(R, [{rate, Rate} | Opts]);
|
||||
getopts([ "-r" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--rate", T, R, Opts);
|
||||
getopts([ "--version" | _], _Opts) ->
|
||||
show_version(),
|
||||
halt(0);
|
||||
getopts([ "--help" | _], _Opts) ->
|
||||
show_help(),
|
||||
halt(0);
|
||||
getopts([ "-h" ++ T | R], Opts) ->
|
||||
getopts_alias_no_arg("--help", T, R, Opts);
|
||||
getopts([ "--verbose=" ++ V | R], Opts) ->
|
||||
Verbose = list_to_integer(V),
|
||||
getopts(R, [{verbose, Verbose} | Opts]);
|
||||
getopts([ "-v" ++ T | R], Opts) ->
|
||||
Verbose = proplists:get_value(verbose, Opts, 0),
|
||||
getopts_short_no_arg(T, R, [ {verbose, Verbose+1} | Opts]);
|
||||
getopts([ "--format=state" | R], Opts) ->
|
||||
getopts(R, [{format, state} | Opts]);
|
||||
getopts([ "--format=c" | R], Opts) ->
|
||||
getopts(R, [{format, c} | Opts]);
|
||||
getopts([ "-C" ++ T | R], Opts) ->
|
||||
getopts_alias_no_arg("--format=c", T, R, Opts);
|
||||
getopts([ "--format=carray" | R], Opts) ->
|
||||
getopts(R, [{format, carray} | Opts]);
|
||||
getopts([ "--payload=" ++ Hex | R], Opts) ->
|
||||
getopts(R, [{payload, hex_to_bin(Hex)} | Opts]);
|
||||
getopts([ "--ssrc=" ++ Num | R], Opts) ->
|
||||
getopts(R, [{ssrc, list_to_num(Num)} | Opts]);
|
||||
getopts([ "-s" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--ssrc", T, R, Opts);
|
||||
getopts([ "--type=" ++ Num | R], Opts) ->
|
||||
getopts(R, [{pt, list_to_num(Num)} | Opts]);
|
||||
getopts([ "-t" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--type", T, R, Opts);
|
||||
getopts([ "--delay=" ++ Num | R], Opts) ->
|
||||
getopts(R, [{delay, list_to_float(Num)} | Opts]);
|
||||
getopts([ "-d" ++ T | R], Opts) ->
|
||||
getopts_alias_arg("--delay", T, R, Opts);
|
||||
|
||||
% parsing helpers
|
||||
getopts([ "--" | R], Opts) ->
|
||||
{R, normalize_opts(Opts)};
|
||||
getopts([ O = "--" ++ _ | _], _Opts) ->
|
||||
usage("Invalid option: " ++ O),
|
||||
halt(1);
|
||||
getopts([ [ $-, C | _] | _], _Opts) when C < $0; C > $9 ->
|
||||
usage("Invalid option: -" ++ [C]),
|
||||
halt(1);
|
||||
|
||||
getopts(R, Opts) ->
|
||||
{R, normalize_opts(Opts)}.
|
||||
|
||||
getopts_short_no_arg([], R, Opts) -> getopts(R, Opts);
|
||||
getopts_short_no_arg(T, R, Opts) -> getopts([ "-" ++ T | R], Opts).
|
||||
|
||||
getopts_alias_no_arg(A, [], R, Opts) -> getopts([A | R], Opts);
|
||||
getopts_alias_no_arg(A, T, R, Opts) -> getopts([A, "-" ++ T | R], Opts).
|
||||
|
||||
getopts_alias_arg(A, [], [T | R], Opts) -> getopts([A ++ "=" ++ T | R], Opts);
|
||||
getopts_alias_arg(A, T, R, Opts) -> getopts([A ++ "=" ++ T | R], Opts).
|
||||
|
||||
normalize_opts(Opts) ->
|
||||
[ proplists:lookup(E, Opts) || E <- proplists:get_keys(Opts) ].
|
||||
|
||||
%%% conversions %%%
|
||||
|
||||
bin_to_hex(Bin) -> [hd(integer_to_list(N,16)) || <<N:4>> <= Bin].
|
||||
hex_to_bin(Hex) -> << <<(list_to_integer([Nib],16)):4>> || Nib <- Hex>>.
|
||||
|
||||
list_to_num("-" ++ Str) -> -list_to_num(Str);
|
||||
list_to_num("0x" ++ Str) -> list_to_integer(Str, 16);
|
||||
list_to_num("0b" ++ Str) -> list_to_integer(Str, 2);
|
||||
list_to_num(Str = [ $0 | _ ]) -> list_to_integer(Str, 8);
|
||||
list_to_num(Str) -> list_to_integer(Str, 10).
|
||||
|
||||
%%% dumping data %%%
|
||||
|
||||
dump_opts(Dev, Opts) ->
|
||||
dump_opts2(Dev, Opts, proplists:get_keys(Opts)).
|
||||
|
||||
dump_opts2(Dev, Opts, [OptName | R]) ->
|
||||
io:format(Dev, " ~-10s: ~p~n",
|
||||
[OptName, proplists:get_value(OptName, Opts)]),
|
||||
dump_opts2(Dev, Opts, R);
|
||||
dump_opts2(_Dev, _Opts, []) -> ok.
|
||||
|
||||
%%% logging %%%
|
||||
|
||||
log(L, Fmt, Args, Opts) when is_list(Opts) ->
|
||||
log(L, Fmt, Args, proplists:get_value(verbose, Opts, 0), Opts).
|
||||
|
||||
log(debug, Fmt, Args, V, Opts) when V > 2 -> log2("DEBUG", Fmt, Args, Opts);
|
||||
log(info, Fmt, Args, V, Opts) when V > 1 -> log2("INFO", Fmt, Args, Opts);
|
||||
log(notice, Fmt, Args, V, Opts) when V > 0 -> log2("NOTICE", Fmt, Args, Opts);
|
||||
log(warn, Fmt, Args, _V, Opts) -> log2("WARNING", Fmt, Args, Opts);
|
||||
log(error, Fmt, Args, _V, Opts) -> log2("ERROR", Fmt, Args, Opts);
|
||||
|
||||
log(Lvl, Fmt, Args, V, Opts) when V >= Lvl -> log2("", Fmt, Args, Opts);
|
||||
|
||||
log(_, _, _, _i, _) -> ok.
|
||||
|
||||
log2(Type, Fmt, Args, _Opts) when is_list(Fmt) ->
|
||||
io:format(standard_error, "~s: " ++ Fmt, [Type | Args]);
|
||||
log2("", Fmt, Args, _Opts) when is_list(Fmt) ->
|
||||
io:format(standard_error, Fmt, Args);
|
||||
log2(_Type, Fun, _Args, _Opts) when is_function(Fun, 1) ->
|
||||
Fun(standard_error).
|
||||
|
||||
%%% RTP packets %%%
|
||||
|
||||
make_rtp_packet(P = #rtp_packet{version = 2}) ->
|
||||
<< (P#rtp_packet.version):2,
|
||||
0:1, % P
|
||||
0:1, % X
|
||||
0:4, % CC
|
||||
(P#rtp_packet.marker):1,
|
||||
(P#rtp_packet.payload_type):7,
|
||||
(P#rtp_packet.seqno):16,
|
||||
(P#rtp_packet.timestamp):32,
|
||||
(P#rtp_packet.ssrc):32,
|
||||
(P#rtp_packet.payload)/bytes
|
||||
>>.
|
||||
|
||||
parse_rtp_packet(
|
||||
<< 2:2, % Version 2
|
||||
0:1, % P (not supported yet)
|
||||
0:1, % X (not supported yet)
|
||||
0:4, % CC (not supported yet)
|
||||
M:1,
|
||||
PT:7,
|
||||
SeqNo: 16,
|
||||
TS:32,
|
||||
Ssrc:32,
|
||||
Payload/bytes >>) ->
|
||||
#rtp_packet{
|
||||
version = 0,
|
||||
marker = M,
|
||||
payload_type = PT,
|
||||
seqno = SeqNo,
|
||||
timestamp = TS,
|
||||
ssrc = Ssrc,
|
||||
payload = Payload}.
|
||||
|
||||
%%% payload generation %%%
|
||||
|
||||
next_payload(F) when is_function(F) ->
|
||||
{F(), F};
|
||||
next_payload({F, D}) when is_function(F) ->
|
||||
{P, D2} = F(D),
|
||||
{P, {F, D2}};
|
||||
next_payload([P | R]) ->
|
||||
{P, R};
|
||||
next_payload([]) ->
|
||||
undef;
|
||||
next_payload(Bin = <<_/bytes>>) ->
|
||||
{Bin, Bin}.
|
||||
|
||||
%%% real writing work %%%
|
||||
|
||||
write_packets(_Dev, DS, _P, _F, 0, _O, _Opts) ->
|
||||
DS;
|
||||
write_packets(Dev, DataSource, P = #rtp_packet{}, F, L, O, Opts) ->
|
||||
Format = proplists:get_value(format, Opts, state),
|
||||
Ptime = proplists:get_value(duration, Opts, 160),
|
||||
Delay = proplists:get_value(delay, Opts, 0),
|
||||
Rate = proplists:get_value(rate, Opts, 8000),
|
||||
case next_payload(DataSource) of
|
||||
{Payload, DataSource2} ->
|
||||
write_packet(Dev, Ptime * F / Rate + Delay,
|
||||
P#rtp_packet{seqno = F, timestamp = F*Ptime+O,
|
||||
payload = Payload},
|
||||
Format),
|
||||
write_packets(Dev, DataSource2, P, F+1, L-1, O, Opts);
|
||||
Other -> Other
|
||||
end.
|
||||
|
||||
write_packet(Dev, Time, P = #rtp_packet{}, Format) ->
|
||||
Bin = make_rtp_packet(P),
|
||||
|
||||
write_packet_line(Dev, Time, P, Bin, Format).
|
||||
|
||||
write_packet_pre(Dev, carray) ->
|
||||
io:format(Dev,
|
||||
"struct {float t; int len; char *data;} packets[] = {~n", []);
|
||||
|
||||
write_packet_pre(_Dev, _) -> ok.
|
||||
|
||||
write_packet_post(Dev, carray) ->
|
||||
io:format(Dev, "};~n", []);
|
||||
|
||||
write_packet_post(_Dev, _) -> ok.
|
||||
|
||||
write_packet_line(Dev, Time, _P, Bin, state) ->
|
||||
io:format(Dev, "~f ~s~n", [Time, bin_to_hex(Bin)]);
|
||||
|
||||
write_packet_line(Dev, Time, #rtp_packet{seqno = N, timestamp = TS}, Bin, c) ->
|
||||
ByteList = [ [ $0, $x | integer_to_list(Byte, 16) ] || <<Byte:8>> <= Bin ],
|
||||
ByteStr = string:join(ByteList, ", "),
|
||||
io:format(Dev, "/* time=~f, SeqNo=~B, TS=~B */ {~s}~n", [Time, N, TS, ByteStr]);
|
||||
|
||||
write_packet_line(Dev, Time, #rtp_packet{seqno = N, timestamp = TS}, Bin, carray) ->
|
||||
io:format(Dev, " /* RTP: SeqNo=~B, TS=~B */~n", [N, TS]),
|
||||
io:format(Dev, " {~f, ~B, \"", [Time, size(Bin)]),
|
||||
[ io:format(Dev, "\\x~2.16.0B", [Byte]) || <<Byte:8>> <= Bin ],
|
||||
io:format(Dev, "\"},~n", []).
|
||||
|
||||
%%% real reading work %%%
|
||||
|
||||
read_packets(Dev, Opts) ->
|
||||
Format = proplists:get_value(in_format, Opts, state),
|
||||
|
||||
read_packets(Dev, Opts, Format).
|
||||
|
||||
read_packets(Dev, Opts, Format) ->
|
||||
case read_packet(Dev, Opts, Format) of
|
||||
eof -> [];
|
||||
Tuple -> [Tuple | read_packets(Dev, Opts, Format)]
|
||||
end.
|
||||
|
||||
read_packet(Dev, Opts, bin) ->
|
||||
Size = proplists:get_value(frame_size, Opts),
|
||||
case file:read(Dev, Size) of
|
||||
{ok, Data} -> {0, #rtp_packet{payload = iolist_to_binary(Data)}};
|
||||
eof -> eof
|
||||
end;
|
||||
read_packet(Dev, _Opts, Format) ->
|
||||
case read_packet_line(Dev, Format) of
|
||||
{Time, Bin} -> {Time, parse_rtp_packet(Bin)};
|
||||
eof -> eof
|
||||
end.
|
||||
|
||||
read_packet_line(Dev, state) ->
|
||||
case io:fread(Dev, "", "~f ~s") of
|
||||
{ok, [Time, Hex]} -> {Time, hex_to_bin(Hex)};
|
||||
eof -> eof
|
||||
end.
|
21
openbsc/contrib/rtp/rtp_replay.st
Normal file
21
openbsc/contrib/rtp/rtp_replay.st
Normal file
@@ -0,0 +1,21 @@
|
||||
"
|
||||
Simple UDP replay from the state files
|
||||
"
|
||||
|
||||
PackageLoader fileInPackage: #Sockets.
|
||||
FileStream fileIn: 'rtp_replay_shared.st'.
|
||||
|
||||
|
||||
Eval [
|
||||
| replay file host dport |
|
||||
|
||||
file := Smalltalk arguments at: 1 ifAbsent: [ 'rtpstream.state' ].
|
||||
host := Smalltalk arguments at: 2 ifAbsent: [ '127.0.0.1' ].
|
||||
dport := (Smalltalk arguments at: 3 ifAbsent: [ '4000' ]) asInteger.
|
||||
sport := (Smalltalk arguments at: 4 ifAbsent: [ '0' ]) asInteger.
|
||||
|
||||
replay := RTPReplay on: file fromPort: sport.
|
||||
|
||||
Transcript nextPutAll: 'Going to stream now'; nl.
|
||||
replay streamAudio: host port: dport.
|
||||
]
|
118
openbsc/contrib/rtp/rtp_replay_shared.st
Normal file
118
openbsc/contrib/rtp/rtp_replay_shared.st
Normal file
@@ -0,0 +1,118 @@
|
||||
"
|
||||
Simple UDP replay from the state files
|
||||
"
|
||||
|
||||
PackageLoader fileInPackage: #Sockets.
|
||||
|
||||
Object subclass: SDPUtils [
|
||||
"Look into using PetitParser."
|
||||
SDPUtils class >> findPort: aSDP [
|
||||
aSDP linesDo: [:line |
|
||||
(line startsWith: 'm=audio ') ifTrue: [
|
||||
| stream |
|
||||
stream := line readStream
|
||||
skip: 'm=audio ' size;
|
||||
yourself.
|
||||
^ Number readFrom: stream.
|
||||
]
|
||||
].
|
||||
|
||||
^ self error: 'Not found'.
|
||||
]
|
||||
|
||||
SDPUtils class >> findHost: aSDP [
|
||||
aSDP linesDo: [:line |
|
||||
(line startsWith: 'c=IN IP4 ') ifTrue: [
|
||||
| stream |
|
||||
^ stream := line readStream
|
||||
skip: 'c=IN IP4 ' size;
|
||||
upToEnd.
|
||||
]
|
||||
].
|
||||
|
||||
^ self error: 'Not found'.
|
||||
]
|
||||
]
|
||||
|
||||
Object subclass: RTPReplay [
|
||||
| filename socket |
|
||||
RTPReplay class >> on: aFile [
|
||||
^ self new
|
||||
initialize;
|
||||
file: aFile; yourself
|
||||
]
|
||||
|
||||
RTPReplay class >> on: aFile fromPort: aPort [
|
||||
^ self new
|
||||
initialize: aPort;
|
||||
file: aFile; yourself
|
||||
]
|
||||
|
||||
initialize [
|
||||
self initialize: 0.
|
||||
]
|
||||
|
||||
initialize: aPort [
|
||||
socket := Sockets.DatagramSocket local: '0.0.0.0' port: aPort.
|
||||
]
|
||||
|
||||
file: aFile [
|
||||
filename := aFile
|
||||
]
|
||||
|
||||
localPort [
|
||||
^ socket port
|
||||
]
|
||||
|
||||
streamAudio: aHost port: aPort [
|
||||
| file last_time last_image udp_send dest |
|
||||
|
||||
last_time := nil.
|
||||
last_image := nil.
|
||||
file := FileStream open: filename mode: #read.
|
||||
|
||||
"Send the payload"
|
||||
dest := Sockets.SocketAddress byName: aHost.
|
||||
udp_send := [:payload | | datagram |
|
||||
datagram := Sockets.Datagram data: payload contents address: dest port: aPort.
|
||||
socket nextPut: datagram
|
||||
].
|
||||
|
||||
[file atEnd] whileFalse: [
|
||||
| lineStream time data now_image |
|
||||
lineStream := file nextLine readStream.
|
||||
|
||||
"Read the time, skip the blank, parse the data"
|
||||
time := Number readFrom: lineStream.
|
||||
lineStream skip: 1.
|
||||
|
||||
data := WriteStream on: (ByteArray new: 30).
|
||||
[lineStream atEnd] whileFalse: [
|
||||
| hex |
|
||||
hex := lineStream next: 2.
|
||||
data nextPut: (Number readFrom: hex readStream radix: 16).
|
||||
].
|
||||
|
||||
last_time isNil
|
||||
ifTrue: [
|
||||
"First time, send it right now"
|
||||
last_time := time.
|
||||
last_image := Time millisecondClockValue.
|
||||
udp_send value: data.
|
||||
]
|
||||
ifFalse: [
|
||||
| wait_image new_image_time |
|
||||
|
||||
"How long to wait?"
|
||||
wait_image := last_image + ((time - last_time) * 1000).
|
||||
[ wait_image > Time millisecondClockValue ]
|
||||
whileTrue: [Processor yield].
|
||||
|
||||
udp_send value: data.
|
||||
last_time := time.
|
||||
last_image := wait_image.
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
87
openbsc/contrib/rtp/rtp_replay_sip.st
Normal file
87
openbsc/contrib/rtp/rtp_replay_sip.st
Normal file
@@ -0,0 +1,87 @@
|
||||
"""
|
||||
Create a SIP connection and then stream...
|
||||
"""
|
||||
|
||||
PackageLoader
|
||||
fileInPackage: #OsmoSIP.
|
||||
|
||||
"Load for the replay code"
|
||||
FileStream fileIn: 'rtp_replay_shared.st'.
|
||||
|
||||
|
||||
Osmo.SIPCall subclass: StreamCall [
|
||||
| sem stream |
|
||||
|
||||
createCall: aSDP [
|
||||
| sdp |
|
||||
stream := RTPReplay on: 'rtp_ssrc6976010.240.240.1_to_10.240.240.50.state'.
|
||||
sdp := aSDP % {stream localPort}.
|
||||
^ super createCall: sdp.
|
||||
]
|
||||
|
||||
sem: aSemaphore [
|
||||
sem := aSemaphore
|
||||
]
|
||||
|
||||
sessionNew [
|
||||
| host port |
|
||||
Transcript nextPutAll: 'The call has started'; nl.
|
||||
Transcript nextPutAll: sdp_result; nl.
|
||||
|
||||
host := SDPUtils findHost: sdp_result.
|
||||
port := SDPUtils findPort: sdp_result.
|
||||
|
||||
[
|
||||
stream streamAudio: host port: port.
|
||||
Transcript nextPutAll: 'Streaming has finished.'; nl.
|
||||
] fork.
|
||||
]
|
||||
|
||||
sessionFailed [
|
||||
sem signal
|
||||
]
|
||||
|
||||
sessionEnd [
|
||||
sem signal
|
||||
]
|
||||
]
|
||||
|
||||
Eval [
|
||||
| transport agent call sem sdp_fr sdp_amr |
|
||||
|
||||
|
||||
sdp_fr := (WriteStream on: String new)
|
||||
nextPutAll: 'v=0'; cr; nl;
|
||||
nextPutAll: 'o=twinkle 1739517580 1043400482 IN IP4 127.0.0.1'; cr; nl;
|
||||
nextPutAll: 's=-'; cr; nl;
|
||||
nextPutAll: 'c=IN IP4 127.0.0.1'; cr; nl;
|
||||
nextPutAll: 't=0 0'; cr; nl;
|
||||
nextPutAll: 'm=audio %1 RTP/AVP 0 101'; cr; nl;
|
||||
nextPutAll: 'a=rtpmap:0 PCMU/8000'; cr; nl;
|
||||
nextPutAll: 'a=rtpmap:101 telephone-event/8000'; cr; nl;
|
||||
nextPutAll: 'a=fmtp:101 0-15'; cr; nl;
|
||||
nextPutAll: 'a=ptime:20'; cr; nl;
|
||||
contents.
|
||||
|
||||
sem := Semaphore new.
|
||||
transport := Osmo.SIPUdpTransport
|
||||
startOn: '0.0.0.0' port: 5066.
|
||||
agent := Osmo.SIPUserAgent createOn: transport.
|
||||
transport start.
|
||||
|
||||
call := (StreamCall
|
||||
fromUser: 'sip:1000@sip.zecke.osmocom.org'
|
||||
host: '127.0.0.1'
|
||||
port: 5060
|
||||
to: 'sip:123456@127.0.0.1'
|
||||
on: agent)
|
||||
sem: sem; yourself.
|
||||
|
||||
call createCall: sdp_fr.
|
||||
|
||||
|
||||
"Wait for the stream to have ended"
|
||||
sem wait.
|
||||
|
||||
(Delay forSeconds: 4) wait.
|
||||
]
|
28
openbsc/contrib/rtp/timestamp_rtp.lua
Normal file
28
openbsc/contrib/rtp/timestamp_rtp.lua
Normal file
@@ -0,0 +1,28 @@
|
||||
print("Ni hao")
|
||||
|
||||
|
||||
do
|
||||
local tap = Listener.new("ip", "rtp")
|
||||
local rtp_ssrc = Field.new("rtp.ssrc")
|
||||
local frame_time = Field.new("frame.time_relative")
|
||||
local rtp = Field.new("rtp")
|
||||
|
||||
function tap.packet(pinfo, tvb, ip)
|
||||
local ip_src, ip_dst = tostring(ip.ip_src), tostring(ip.ip_dst)
|
||||
local rtp_data = rtp()
|
||||
local filename = "rtp_ssrc" .. rtp_ssrc() "_src_" .. ip_src .. "_to_" .. ip_dst .. ".state"
|
||||
local f = io.open(filename, "a")
|
||||
|
||||
f:write(tostring(frame_time()) .. " ")
|
||||
f:write(tostring(rtp_data.value))
|
||||
f:write("\n")
|
||||
f:close()
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
print("DRAW")
|
||||
end
|
||||
function tap.reset()
|
||||
print("RESET")
|
||||
end
|
||||
end
|
66
openbsc/contrib/sms/fill-hlr.st
Normal file
66
openbsc/contrib/sms/fill-hlr.st
Normal file
@@ -0,0 +1,66 @@
|
||||
"I create output for some simple SQL statements for the HLR db"
|
||||
|
||||
|
||||
Eval [
|
||||
|
||||
"Create tables if they don't exist"
|
||||
Transcript show: 'CREATE TABLE SMS (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
created TIMESTAMP NOT NULL,
|
||||
sent TIMESTAMP,
|
||||
sender_id INTEGER NOT NULL,
|
||||
receiver_id INTEGER NOT NULL,
|
||||
deliver_attempts INTEGER NOT NULL DEFAULT 0,
|
||||
valid_until TIMESTAMP,
|
||||
reply_path_req INTEGER NOT NULL,
|
||||
status_rep_req INTEGER NOT NULL,
|
||||
protocol_id INTEGER NOT NULL,
|
||||
data_coding_scheme INTEGER NOT NULL,
|
||||
ud_hdr_ind INTEGER NOT NULL,
|
||||
dest_addr TEXT,
|
||||
user_data BLOB,
|
||||
header BLOB,
|
||||
text TEXT);'; nl;
|
||||
show: 'CREATE TABLE Subscriber (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
created TIMESTAMP NOT NULL,
|
||||
updated TIMESTAMP NOT NULL,
|
||||
imsi NUMERIC UNIQUE NOT NULL,
|
||||
name TEXT,
|
||||
extension TEXT UNIQUE,
|
||||
authorized INTEGER NOT NULL DEFAULT 0,
|
||||
tmsi TEXT UNIQUE,
|
||||
lac INTEGER NOT NULL DEFAULT 0);'; nl.
|
||||
|
||||
"Create some dummy subscribers"
|
||||
num_sub := 1000.
|
||||
num_sms := 30.
|
||||
lac := 1.
|
||||
|
||||
Transcript show: 'BEGIN;'; nl.
|
||||
|
||||
1 to: num_sub do: [:each |
|
||||
Transcript show: 'INSERT INTO Subscriber
|
||||
(imsi, created, updated, authorized, lac, extension)
|
||||
VALUES
|
||||
(%1, datetime(''now''), datetime(''now''), 1, %2, %3);' %
|
||||
{(274090000000000 + each). lac. each}; nl.
|
||||
].
|
||||
|
||||
1 to: num_sms do: [:sms |
|
||||
1 to: num_sub do: [:sub |
|
||||
Transcript show: 'INSERT INTO SMS
|
||||
(created, sender_id, receiver_id, valid_until,
|
||||
reply_path_req, status_rep_req, protocol_id,
|
||||
data_coding_scheme, ud_hdr_ind, dest_addr,
|
||||
text) VALUES
|
||||
(datetime(''now''), 1, %1, ''2222-2-2'',
|
||||
0, 0, 0,
|
||||
0, 0, ''123456'',
|
||||
''abc'');' % {sub}; nl.
|
||||
]
|
||||
].
|
||||
|
||||
Transcript show: 'COMMIT;'; nl.
|
||||
|
||||
]
|
10
openbsc/contrib/sms/hlr-query.st
Normal file
10
openbsc/contrib/sms/hlr-query.st
Normal file
@@ -0,0 +1,10 @@
|
||||
"Query for one SMS"
|
||||
|
||||
Eval [
|
||||
1 to: 100 do: [:each |
|
||||
Transcript show: 'SELECT SMS.* FROM SMS
|
||||
JOIN Subscriber ON SMS.receiver_id = Subscriber.id
|
||||
WHERE SMS.id >= 1 AND SMS.sent IS NULL AND Subscriber.lac > 0
|
||||
ORDER BY SMS.id LIMIT 1;'; nl.
|
||||
].
|
||||
]
|
5
openbsc/contrib/sms/sqlite-probe.tap.d
Normal file
5
openbsc/contrib/sms/sqlite-probe.tap.d
Normal file
@@ -0,0 +1,5 @@
|
||||
probe process("/usr/lib/libsqlite3.so.0.8.6").function("sqlite3_get_table")
|
||||
{
|
||||
a = user_string($zSql);
|
||||
printf("sqlite3_get_table called '%s'\n", a);
|
||||
}
|
12
openbsc/contrib/systemd/osmo-bsc.service
Normal file
12
openbsc/contrib/systemd/osmo-bsc.service
Normal file
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=OpenBSC BSC
|
||||
Wants=osmo-bsc-mgcp.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
ExecStart=/usr/bin/osmo-bsc -c /etc/osmocom/osmo-bsc.cfg -s
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
11
openbsc/contrib/systemd/osmo-nitb.service
Normal file
11
openbsc/contrib/systemd/osmo-nitb.service
Normal file
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=OpenBSC Network In the Box (NITB)
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
ExecStart=/usr/bin/osmo-nitb -s -C -c /etc/osmocom/osmo-nitb.cfg -l /var/lib/osmocom/hlr.sqlite3
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
11
openbsc/contrib/systemd/osmo-sgsn.service
Normal file
11
openbsc/contrib/systemd/osmo-sgsn.service
Normal file
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=OpenBSC SGSN
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
ExecStart=/usr/bin/osmo-sgsn -c /etc/osmocom/osmo-sgsn.cfg
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
16
openbsc/contrib/testconv/Makefile
Normal file
16
openbsc/contrib/testconv/Makefile
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
OBJS = testconv_main.o
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -O0 -ggdb -Wall
|
||||
LDFLAGS =
|
||||
CPPFLAGS = -I../.. -I../../include $(shell pkg-config --cflags libosmocore) $(shell pkg-config --cflags libbcg729)
|
||||
LIBS = ../../src/libmgcp/libmgcp.a ../../src/libcommon/libcommon.a $(shell pkg-config --libs libosmocore) $(shell pkg-config --libs libbcg729) -lgsm -lrt
|
||||
|
||||
testconv: $(OBJS)
|
||||
$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
|
||||
|
||||
testconv_main.o: testconv_main.c
|
||||
|
||||
$(OBJS):
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
|
133
openbsc/contrib/testconv/testconv_main.c
Normal file
133
openbsc/contrib/testconv/testconv_main.c
Normal file
@@ -0,0 +1,133 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <err.h>
|
||||
|
||||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/core/application.h>
|
||||
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/gsm_data.h>
|
||||
#include <openbsc/mgcp.h>
|
||||
#include <openbsc/mgcp_internal.h>
|
||||
|
||||
#include "bscconfig.h"
|
||||
#ifndef BUILD_MGCP_TRANSCODING
|
||||
#error "Requires MGCP transcoding enabled (see --enable-mgcp-transcoding)"
|
||||
#endif
|
||||
|
||||
#include "openbsc/mgcp_transcode.h"
|
||||
|
||||
static int audio_name_to_type(const char *name)
|
||||
{
|
||||
if (!strcasecmp(name, "gsm"))
|
||||
return 3;
|
||||
#ifdef HAVE_BCG729
|
||||
else if (!strcasecmp(name, "g729"))
|
||||
return 18;
|
||||
#endif
|
||||
else if (!strcasecmp(name, "pcma"))
|
||||
return 8;
|
||||
else if (!strcasecmp(name, "l16"))
|
||||
return 11;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int mgcp_get_trans_frame_size(void *state_, int nsamples, int dst);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char buf[4096] = {0x80, 0};
|
||||
int cc, rc;
|
||||
struct mgcp_rtp_end *dst_end;
|
||||
struct mgcp_rtp_end *src_end;
|
||||
struct mgcp_trunk_config tcfg = {{0}};
|
||||
struct mgcp_endpoint endp = {0};
|
||||
struct mgcp_process_rtp_state *state;
|
||||
int in_size;
|
||||
int in_samples = 160;
|
||||
int out_samples = 0;
|
||||
uint32_t ts = 0;
|
||||
uint16_t seq = 0;
|
||||
|
||||
osmo_init_logging(&log_info);
|
||||
|
||||
tcfg.endpoints = &endp;
|
||||
tcfg.number_endpoints = 1;
|
||||
endp.tcfg = &tcfg;
|
||||
mgcp_initialize_endp(&endp);
|
||||
|
||||
dst_end = &endp.bts_end;
|
||||
src_end = &endp.net_end;
|
||||
|
||||
if (argc <= 2)
|
||||
errx(1, "Usage: {gsm|g729|pcma|l16} {gsm|g729|pcma|l16} [SPP]");
|
||||
|
||||
if ((src_end->codec.payload_type = audio_name_to_type(argv[1])) == -1)
|
||||
errx(1, "invalid input format '%s'", argv[1]);
|
||||
if ((dst_end->codec.payload_type = audio_name_to_type(argv[2])) == -1)
|
||||
errx(1, "invalid output format '%s'", argv[2]);
|
||||
if (argc > 3)
|
||||
out_samples = atoi(argv[3]);
|
||||
|
||||
if (out_samples) {
|
||||
dst_end->codec.frame_duration_den = dst_end->codec.rate;
|
||||
dst_end->codec.frame_duration_num = out_samples;
|
||||
dst_end->frames_per_packet = 1;
|
||||
}
|
||||
|
||||
rc = mgcp_transcoding_setup(&endp, dst_end, src_end);
|
||||
if (rc < 0)
|
||||
errx(1, "setup failed: %s", strerror(-rc));
|
||||
|
||||
state = dst_end->rtp_process_data;
|
||||
OSMO_ASSERT(state != NULL);
|
||||
|
||||
in_size = mgcp_transcoding_get_frame_size(state, in_samples, 0);
|
||||
OSMO_ASSERT(sizeof(buf) >= in_size + 12);
|
||||
|
||||
buf[1] = src_end->codec.payload_type;
|
||||
*(uint16_t*)(buf+2) = htons(1);
|
||||
*(uint32_t*)(buf+4) = htonl(0);
|
||||
*(uint32_t*)(buf+8) = htonl(0xaabbccdd);
|
||||
|
||||
while ((cc = read(0, buf + 12, in_size))) {
|
||||
int cont;
|
||||
int len;
|
||||
|
||||
if (cc != in_size)
|
||||
err(1, "read");
|
||||
|
||||
*(uint16_t*)(buf+2) = htonl(seq);
|
||||
*(uint32_t*)(buf+4) = htonl(ts);
|
||||
|
||||
seq += 1;
|
||||
ts += in_samples;
|
||||
|
||||
cc += 12; /* include RTP header */
|
||||
|
||||
len = cc;
|
||||
|
||||
do {
|
||||
cont = mgcp_transcoding_process_rtp(&endp, dst_end,
|
||||
buf, &len, sizeof(buf));
|
||||
if (cont == -EAGAIN) {
|
||||
fprintf(stderr, "Got EAGAIN\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (cont < 0)
|
||||
errx(1, "processing failed: %s", strerror(-cont));
|
||||
|
||||
len -= 12; /* ignore RTP header */
|
||||
|
||||
if (write(1, buf + 12, len) != len)
|
||||
err(1, "write");
|
||||
|
||||
len = cont;
|
||||
} while (len > 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
31
openbsc/doc/BS11-OML.txt
Normal file
31
openbsc/doc/BS11-OML.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
The Siemens BS-11 supports the following additional GSM 12.21 OML operations:
|
||||
|
||||
|
||||
CREATE OBJECT
|
||||
|
||||
abis_om_fom_hdr.obj_class can be
|
||||
A3:
|
||||
A5: ALCO, BBSIG, CCLK, GPSU, LI, PA
|
||||
A8: EnvaBTSE
|
||||
A9: BPORT
|
||||
|
||||
the abis_om_obj_inst.trx_nr field indicates the index of object, whereas the
|
||||
abis_om_fom_hdr.bts_nr indicates the type of the object.
|
||||
|
||||
enum abis_bs11_objtype {
|
||||
BS11_OBJ_ALCO = 0x01,
|
||||
BS11_OBJ_BBSIG = 0x02, /* obj_class: 0,1 */
|
||||
BS11_OBJ_TRX1 = 0x03, /* only DEACTIVATE TRX1 */
|
||||
BS11_OBJ_CCLK = 0x04,
|
||||
BS11_OBJ_GPSU = 0x06,
|
||||
BS11_OBJ_LI = 0x07,
|
||||
BS11_OBJ_PA = 0x09, /* obj_class: 0, 1*/
|
||||
};
|
||||
|
||||
In case of CREATE ENVABTSE, the abis_om_obj_inst.trx_nr indicates the EnvaBTSEx
|
||||
number.
|
||||
|
||||
In case of A9 (CREAETE BPORT), the abis_om_obj_inst.bts_nr indicates which BPORT
|
||||
shall be used.
|
||||
|
||||
|
1
openbsc/doc/Makefile.am
Normal file
1
openbsc/doc/Makefile.am
Normal file
@@ -0,0 +1 @@
|
||||
SUBDIRS = examples
|
608
openbsc/doc/call-graphs-MSC-BSC-HNBGW.txt
Normal file
608
openbsc/doc/call-graphs-MSC-BSC-HNBGW.txt
Normal file
@@ -0,0 +1,608 @@
|
||||
gprs_iu_tx
|
||||
|
||||
-- WORK IN PROGRESS --
|
||||
|
||||
This is an incomplete collection of call graphs between MSC and Osmo-BSC,
|
||||
partly including Osmo-BTS. These traces helped understanding the separation of
|
||||
the BSC part from Osmo-NITB. The aim: obtain a clearly separated "A" interface
|
||||
towards the BSC, and have an Iu-CS interface to operate with HNB-GW and hNodeB.
|
||||
The working title for the result is Osmo-CSCN (Circuit Switched Core Network),
|
||||
combining an MSC with various other core network components, but without the
|
||||
BSC parts.
|
||||
|
||||
|
||||
Some Specs and Overview
|
||||
|
||||
0408: Radio interface
|
||||
0411: PP-SMS on Radio interface
|
||||
0802: A Interface MSC<->BSS (BSS = BSC + BTS)
|
||||
0804: A Interface L1 MSC<->BSS
|
||||
0806: A Interface L2 MSC<->BSS
|
||||
0808: A Interface L3 MSC<->BSS
|
||||
0808: Figure 1: A MSC<->BSS
|
||||
0820: RA (Rate Adaption) MSC<->BSS
|
||||
|
||||
0851,0852: A-bis general BSC<->BTS
|
||||
1221: A-bis NM BSC<->BTS
|
||||
1201: Figure 9: A-bis BSC<->BTS
|
||||
|
||||
MS <-> BTS <-> BSC <-> MSC <-> cn
|
||||
| | | | |
|
||||
|<-------0408=DTAP----->| |
|
||||
|<-------0411---------->| |
|
||||
| | |<--0808>| |
|
||||
| | |<BSSMAP>| |
|
||||
| | | | |
|
||||
| Abis | A |
|
||||
|
||||
MS <-> hNodeB <-> HNB-GW <-> MSC <-> cn
|
||||
| | | | |
|
||||
|<-0408->|<--Iu--->|<-Iu-cs->| |
|
||||
|<-0411->| | | |
|
||||
| | | | |
|
||||
|
||||
Entry/Exit points
|
||||
|
||||
Osmo-BSC <--A--> MSC or Osmo-CSCN
|
||||
format: BSSAP/SCCP (where BSSAP = DTAP + BSSMAP)
|
||||
Osmo-BSC
|
||||
read from MSC: sccp_system_incoming_ctx()
|
||||
write to MSC: sccp_connection_write() <-- osmo-bsc/osmo_bsc_sccp.c:bsc_queue_for_msc()
|
||||
MSC:
|
||||
third party
|
||||
Osmo-CSCN:
|
||||
read: does not exist yet
|
||||
write: does not exist yet
|
||||
|
||||
HNB-GW <--Iu-CS--> Osmo-CSCN
|
||||
format: CC+MM/RANAP/SUA
|
||||
HNB-GW:
|
||||
read: does not exist yet
|
||||
write: does not exist yet
|
||||
Osmo-CSCN:
|
||||
read: does not exist yet
|
||||
write: does not exist yet
|
||||
|
||||
Osmo-BTS <-Abis-> Osmo-BSC
|
||||
Osmo-BSC:
|
||||
read: libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg)
|
||||
write: libosmo-abis/src/e1_input.c:abis_sendmsg() (e1inp_sign_link*)msg->dst;
|
||||
|
||||
Osmo-BTS <-Abis-> Osmo-NITB
|
||||
Osmo-NITB:
|
||||
read:
|
||||
osmo_signal_dispatch():
|
||||
from on_dso_load_token() libmsc/token_auth.c
|
||||
SS_SUBSCR: token_subscr_cb() libmsc/token_auth.c
|
||||
SS_SMS: token_sms_cb() libmsc/token_auth.c
|
||||
from subscr_sig_cb() libmsc/rrlp.c
|
||||
SS_SUBSCR: subscr_sig_cb() libmsc/rrlp.c
|
||||
SS_PAGING: paging_sig_cb() libmsc/rrlp.c
|
||||
from on_dso_load_ho_dec() libbsc/handover_decision.c
|
||||
SS_LCHAN: ho_dec_sig_cb() libbsc/handover_decision.c
|
||||
from e1inp_init() libosmo-abis/src/e1_input.c
|
||||
SS_L_GLOBAL: e1i_sig_cb() libosmo-abis/src/e1_input.c
|
||||
|
||||
bts_model_bs11_init();
|
||||
bts_model_rbs2k_init();
|
||||
bts_model_nanobts_init();
|
||||
bts_model_nokia_site_init();
|
||||
bts_model_sysmobts_init();
|
||||
|
||||
bsc_bootstrap_network():
|
||||
osmo_signal_register_handler(SS_NM, nm_sig_cb, NULL);
|
||||
osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);
|
||||
|
||||
|
||||
Call Trees
|
||||
|
||||
- A Interface
|
||||
|
||||
Osmo-BSC sends to MSC:
|
||||
|
||||
sccp_connection_write(conn->sccp, msg);
|
||||
^ bsc_queue_for_msc()
|
||||
^
|
||||
| osmo-bsc/osmo_bsc_api.c:
|
||||
| bsc_clear_request()
|
||||
| queue_msg_or_return() osmo-bsc/osmo_bsc_api.c
|
||||
| ^ bsc_sapi_n_reject()
|
||||
| | ^send_sapi_reject()
|
||||
| | ^ gsm0808_submit_dtap() libbsc/bsc_api.c
|
||||
| | | ^ gsm48_conn_sendmsg() libmsc/gsm_04_08.c
|
||||
| | | | ^ gsm48_cc_tx_notify_ss() libmsc/gsm_04_08.c
|
||||
| | | | | mm_tx_identity_req() libmsc/gsm_04_08.c
|
||||
| | | | | gsm48_tx_mm_info() libmsc/gsm_04_08.c
|
||||
| | | | | gsm48_tx_mm_auth_req()
|
||||
| | | | | gsm48_send_rr_app_info()
|
||||
| | | | | gsm48_cc_tx_status()
|
||||
| | | | | gsm48_tx_simple()
|
||||
| | | | | ^ gsm48_tx_mm_auth_rej()
|
||||
| | | | | gsm48_cc_tx_setup()
|
||||
| | | | | gsm48_cc_tx_call_proc()
|
||||
| | | | | gsm48_cc_tx_alerting()
|
||||
| | | | | gsm48_cc_tx_progress()
|
||||
| | | | | gsm48_cc_tx_connect()
|
||||
| | | | | gsm48_cc_tx_connect_ack()
|
||||
| | | | | gsm48_cc_tx_disconnect()
|
||||
| | | | | gsm48_cc_tx_release()
|
||||
| | | | | gsm48_cc_tx_release_compl()
|
||||
| | | | | gsm48_cc_tx_facility()
|
||||
| | | | | gsm48_cc_tx_hold_ack()
|
||||
| | | | | gsm48_cc_tx_hold_rej()
|
||||
| | | | | gsm48_cc_tx_retrieve_ack()
|
||||
| | | | | gsm48_cc_tx_retrieve_rej()
|
||||
| | | | | gsm48_cc_tx_start_dtmf_ack()
|
||||
| | | | | gsm48_cc_tx_start_dtmf_rej()
|
||||
| | | | | gsm48_cc_tx_stop_dtmf_ack()
|
||||
| | | | | gsm48_cc_tx_modify()
|
||||
| | | | | gsm48_cc_tx_modify_complete()
|
||||
| | | | | gsm48_cc_tx_modify_reject()
|
||||
| | | | | gsm48_cc_tx_notify()
|
||||
| | | | | gsm48_cc_tx_userinfo()
|
||||
| | | |
|
||||
| | | | gsm0480_send_ussd_response() libmsc/gsm_04_80.c
|
||||
| | | | gsm0480_send_ussd_reject() libmsc/gsm_04_80.c
|
||||
| | | | gsm0480_send_ussdNotify() libmsc/gsm_04_80.c
|
||||
| | | | ^ bsc_send_ussd_no_srv() osmo-bsc/osmo_bsc_api.c
|
||||
| | | | gsm0480_send_releaseComplete() libmsc/gsm_04_80.c
|
||||
| | | | ^ bsc_send_ussd_no_srv() osmo-bsc/osmo_bsc_api.c
|
||||
| | | |
|
||||
| | | | gsm411_sendmsg() libmsc/gsm_04_11.c
|
||||
| | | |
|
||||
| | | | bsc_maybe_lu_reject() osmo-bsc/osmo_bsc_api.c
|
||||
| | | | ^ complete_layer3()
|
||||
| | | | | bsc_dtap()
|
||||
| | | |
|
||||
| | | | dtap_rcvmsg() osmo-bsc/osmo_bsc_bssap.c
|
||||
| | | |
|
||||
| | | | gsm48_tx_mm_serv_ack() libbsc/gsm_04_08_utils.c
|
||||
| | | | ^ _gsm48_rx_mm_serv_req_sec_cb()
|
||||
| | | | | bsc_send_ussd_no_srv() osmo-bsc/osmo_bsc_api.c
|
||||
| | | |
|
||||
| | | | gsm48_tx_mm_serv_rej() libbsc/gsm_04_08_utils.c
|
||||
| | |
|
||||
| | | bsc_rll_req.cb = rll_ind_cb() from rll_establish() from gsm0808_submit_dtap()
|
||||
| | | ^ complete_rllr() libbsc/bsc_rll.c
|
||||
| | | | ^ timer_cb() libbsc/bsc_rll.c
|
||||
| | | | | rll_indication() libbsc/bsc_rll.c
|
||||
| | | | | rll_lchan_signal() libbsc/bsc_rll.c
|
||||
| |
|
||||
| | bsc_cipher_mode_compl()
|
||||
| | ^ bsc_api.cipher_mode_compl()
|
||||
| | | dispatch_dtap() (2)
|
||||
| | | with GSM48_MT_RR_CIPH_M_COMPL
|
||||
| |
|
||||
| | bsc_dtap()
|
||||
| | ^ cb from osmo-bsc/osmo_bsc_api.c
|
||||
| | bsc_api.dtap()
|
||||
| | ^ libbsc/bsc_api.c:
|
||||
| | | dispatch_dtap() (2)
|
||||
| | | case GSM48_MT_RR_APP_INFO
|
||||
| | | case unknown 04.08 RR
|
||||
| |
|
||||
| | bsc_assign_compl()
|
||||
| | ^ osmo-bsc/osmo_bsc_api.c
|
||||
| | bsc_api.assign_compl()
|
||||
| | ^ libbsc/bsc_api.c:
|
||||
| | | dispatch_dtap() (2)
|
||||
| | | case GSM48_MT_RR_CHAN_MODE_MODIF_ACK
|
||||
| | | handle_ass_compl()
|
||||
| | | ^ dispatch_dtap() (2)
|
||||
| | | | case GSM48_MT_RR_ASS_COMPL
|
||||
| |
|
||||
| | bsc_assign_fail()
|
||||
| |
|
||||
| | bsc_cm_update()
|
||||
|
|
||||
| osmo-bsc/osmo_bsc_bssap.c:
|
||||
| bssmap_handle_clear_command()
|
||||
| bssmap_handle_cipher_mode()
|
||||
| bssmap_handle_assignm_req()
|
||||
|
|
||||
|
||||
|
||||
Osmo-BSC receives from MSC:
|
||||
sccp_system_incoming_ctx() (libosmo-sccp)
|
||||
| L2 type:
|
||||
v SCCP_MSG_TYPE_CR: _sccp_handle_connection_request(msgb, ctx);
|
||||
SCCP_MSG_TYPE_RLSD: _sccp_handle_connection_released(msgb);
|
||||
SCCP_MSG_TYPE_CREF: _sccp_handle_connection_refused(msgb);
|
||||
SCCP_MSG_TYPE_CC: _sccp_handle_connection_confirm(msgb);
|
||||
SCCP_MSG_TYPE_RLC: _sccp_handle_connection_release_complete(msgb);
|
||||
|
||||
SCCP_MSG_TYPE_DT1: _sccp_handle_connection_dt1(msgb);
|
||||
Note: a dt1 target entry was created during one of:
|
||||
- bsc_open_connection() (SCCP connections are established by the BSC, exclusively)
|
||||
sccp_connection_connect()
|
||||
_sccp_send_connection_request()
|
||||
llist_add_tail(&connection->list, &sccp_connections);
|
||||
- sccp_system_incoming_ctx()
|
||||
SCCP_MSG_TYPE_CR:
|
||||
_sccp_handle_connection_request(struct msgb *msgb, void *ctx)
|
||||
cb->accept_cb() = msc_sccp_accept()
|
||||
|
||||
SCCP_MSG_TYPE_UDT: _sccp_handle_read(msgb) --read_cb--> osmo-bsc/osmo_bsc_sccp.c:msc_sccp_read()
|
||||
msc_sccp_read()
|
||||
| bsc_handle_udt() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:494
|
||||
v bssmap_rcvmsg_udt() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:387
|
||||
gsm0808_bssmap_name() ./libosmocore/src/gsm/gsm0808.c:535
|
||||
bssmap_handle_reset_ack() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:91
|
||||
LOGP()
|
||||
bssmap_handle_paging() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:99
|
||||
GSM0808_IE_IMSI
|
||||
GSM0808_IE_CELL_IDENTIFIER_LIST
|
||||
GSM0808_IE_TMSI
|
||||
CELL_IDENT_LAC
|
||||
CELL_IDENT_BSS
|
||||
GSM0808_IE_CHANNEL_NEEDED
|
||||
GSM0808_IE_EMLPP_PRIORITY
|
||||
subscr_get_or_create() ./openbsc/openbsc/src/libcommon/gsm_subscriber_base.c:101
|
||||
subscr_group
|
||||
LOGL_INFO
|
||||
bsc_grace_paging_request() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_grace.c:87
|
||||
normal_paging() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_grace.c:37
|
||||
if (msc->core_lac != -1)
|
||||
paging_request_bts() ./openbsc/openbsc/src/libbsc/paging.c:307
|
||||
trx_is_usable() ./openbsc/openbsc/src/libbsc/chan_alloc.c:49
|
||||
if is_ipaccess_bts() and nm_is_running(): 0
|
||||
else: 1
|
||||
paging_init_if_needed() ./openbsc/openbsc/src/libbsc/paging.c:224
|
||||
LAUNCH TIMER:
|
||||
bts->paging.work_timer.cb = paging_worker;
|
||||
paging_worker() ./openbsc/openbsc/src/libbsc/paging.c:217
|
||||
paging_handle_pending_requests() ./openbsc/openbsc/src/libbsc/paging.c:169 (R):
|
||||
paging_give_credit() ./openbsc/openbsc/src/libbsc/paging.c:107 (R):
|
||||
recurse paging_handle_pending_requests()
|
||||
can_send_pag_req() ./openbsc/openbsc/src/libbsc/paging.c:116
|
||||
page_ms() ./openbsc/openbsc/src/libbsc/paging.c:69
|
||||
gsm0808_page() ./openbsc/openbsc/src/libbsc/bsc_api.c:415
|
||||
rsl_paging_cmd() ./openbsc/openbsc/src/libbsc/abis_rsl.c:751
|
||||
abis_rsl_dchan_hdr
|
||||
RSL_MT_PAGING_CMD
|
||||
RSL_CHAN_PCH_AGCH
|
||||
init_dchan_hdr() ./openbsc/openbsc/src/libbsc/abis_rsl.c:99
|
||||
mdisc_by_msgtype() ./openbsc/openbsc/src/libbsc/abis_rsl.c:80
|
||||
ABIS_RSL_MDISC_RLL
|
||||
ABIS_RSL_MDISC_TRX
|
||||
ABIS_RSL_MDISC_COM_CHAN
|
||||
ABIS_RSL_MDISC_DED_CHAN
|
||||
ABIS_RSL_MDISC_LOC
|
||||
RSL_IE_CHAN_NR
|
||||
RSL_IE_PAGING_GROUP
|
||||
RSL_IE_MS_IDENTITY
|
||||
RSL_IE_CHAN_NEEDED
|
||||
abis_rsl_sendmsg() ./libosmo-abis/src/e1_input.c:258
|
||||
_paging_request() ./openbsc/openbsc/src/libbsc/paging.c:279
|
||||
llist_add_tail(&req->entry, &bts_entry->pending_requests);
|
||||
paging_schedule_if_needed() ./openbsc/openbsc/src/libbsc/paging.c:96
|
||||
if (msc->core_lac == -1)
|
||||
paging_request()
|
||||
gsm_bts_by_lac() ./openbsc/openbsc/src/libcommon/gsm_data.c:135
|
||||
paging_request_bts() ./openbsc/openbsc/src/libbsc/paging.c:307
|
||||
(see above)
|
||||
if err
|
||||
paging_request_stop()
|
||||
(see below)
|
||||
locked_paging() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_grace.c:54
|
||||
paging_request_bts() ./openbsc/openbsc/src/libbsc/paging.c:307
|
||||
(see above)
|
||||
|
||||
|
||||
- A-bis Interface
|
||||
|
||||
Osmo-BSC to BTS:
|
||||
abis_sendmsg()
|
||||
^
|
||||
| libosmo-abis/src/e1_input.c:abis_rsl_sendmsg()
|
||||
| ^
|
||||
| | libbsc/abis_rsl.c: 23 callers
|
||||
| | rsl_bcch_info()
|
||||
| | rsl_sacch_filling()
|
||||
| | rsl_sacch_info_modify()
|
||||
| | rsl_chan_bs_power_ctrl()
|
||||
| | rsl_chan_ms_power_ctrl()
|
||||
| | rsl_chan_activate_lchan()
|
||||
| | rsl_chan_mode_modify_req()
|
||||
| | rsl_encryption_cmd()
|
||||
| | rsl_deact_sacch()
|
||||
| | rsl_rf_chan_release()
|
||||
| | rsl_paging_cmd()
|
||||
| | rsl_imm_assign_cmd()
|
||||
| | rsl_siemens_mrpci()
|
||||
| | rsl_data_request()
|
||||
| | rsl_establish_request()
|
||||
| | rsl_release_request()
|
||||
| | rsl_ipacc_crcx()
|
||||
| | rsl_ipacc_mdcx()
|
||||
| | rsl_ipacc_pdch_activate()
|
||||
| | rsl_sms_cb_command()
|
||||
| | rsl_nokia_si_begin()
|
||||
| | rsl_nokia_si_end()
|
||||
| | rsl_bs_power_control()
|
||||
|
|
||||
| libbsc/bts_nokia_site.c:nokia_abis_nm_queue_send_next()
|
||||
|
|
||||
| libbsc/abis_nm.c:_abis_nm_sendmsg()
|
||||
| ^ abis_nm_sendmsg()
|
||||
| | abis_nm_sendmsg_direct()
|
||||
|
|
||||
| osmo-bts/src/common/abis.c:abis_oml_sendmsg()
|
||||
| osmo-bts/src/common/abis.c:abis_bts_rsl_sendmsg()
|
||||
|
||||
|
||||
|
||||
libbsc/e1_config.c:bts_isdn_e1inp_line_ops.sign_link =
|
||||
libbsc/e1_config.c:bts_isdn_sign_link(struct msgb *msg)
|
||||
case E1INP_SIGN_RSL:
|
||||
libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg) (1)
|
||||
case E1INP_SIGN_OML:
|
||||
ret = bts->model->oml_rcvmsg(msg);
|
||||
|
||||
libbsc/bts_ipaccess_nanobts.c:ipaccess_e1inp_line_ops.sign_link =
|
||||
ipaccess_sign_link(struct msgb *msg)
|
||||
case E1INP_SIGN_RSL:
|
||||
libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg) (1)
|
||||
case E1INP_SIGN_OML:
|
||||
libbsc/abis_nm.c:abis_nm_rcvmsg(msg);
|
||||
|
||||
|
||||
(1)
|
||||
libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg)
|
||||
case ABIS_RSL_MDISC_RLL:
|
||||
libbsc/abis_rsl.c:abis_rsl_rx_rll(msg)
|
||||
case DATA_IND, EST_IND:
|
||||
libbsc/bsc_api.c:gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id)
|
||||
msg->lchan->ts->trx->bts->network->bsc_api;
|
||||
if (lchan->conn)
|
||||
libbsc/bsc_api.c:dispatch_dtap() (2)
|
||||
else
|
||||
lchan->conn = subscr_con_allocate(msg->lchan);
|
||||
rc = api->compl_l3(lchan->conn, msg, 0); (3)
|
||||
|
||||
case ABIS_RSL_MDISC_DED_CHAN:
|
||||
rc = abis_rsl_rx_dchan(msg);
|
||||
|
||||
case ABIS_RSL_MDISC_COM_CHAN:
|
||||
rc = abis_rsl_rx_cchan(msg);
|
||||
|
||||
case ABIS_RSL_MDISC_TRX:
|
||||
rc = abis_rsl_rx_trx(msg);
|
||||
|
||||
case ABIS_RSL_MDISC_IPACCESS:
|
||||
rc = abis_rsl_rx_ipacc(msg);
|
||||
break;
|
||||
|
||||
case ABIS_RSL_MDISC_LOC:
|
||||
LOGP(DRSL, LOGL_NOTICE, "unimplemented RSL msg disc 0x%02x\n",
|
||||
|
||||
|
||||
(2)
|
||||
libbsc/bsc_api.c:dispatch_dtap()
|
||||
struct bsc_api *api = msg->lchan->ts->trx->bts->network->bsc_api;
|
||||
|
||||
default:
|
||||
if (api->dtap)
|
||||
api->dtap(conn, link_id, msg); (5)
|
||||
|
||||
case GSM48_PDISC_RR:
|
||||
case GSM48_MT_RR_HANDO_COMPL:
|
||||
handle_rr_ho_compl(msg);
|
||||
|
||||
case GSM48_MT_RR_HANDO_FAIL:
|
||||
handle_rr_ho_fail(msg);
|
||||
|
||||
case GSM48_MT_RR_CIPH_M_COMPL:
|
||||
if (api->cipher_mode_compl)
|
||||
api->cipher_mode_compl(conn, msg, (4)
|
||||
conn->lchan->encr.alg_id);
|
||||
|
||||
case GSM48_MT_RR_ASS_COMPL:
|
||||
handle_ass_compl(conn, msg);
|
||||
|
||||
case GSM48_MT_RR_ASS_FAIL:
|
||||
handle_ass_fail(conn, msg);
|
||||
|
||||
case GSM48_MT_RR_CHAN_MODE_MODIF_ACK:
|
||||
rc = gsm48_rx_rr_modif_ack(msg);
|
||||
if (rc < 0) {
|
||||
api->assign_fail(conn, GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE)
|
||||
else
|
||||
api->assign_compl()
|
||||
|
||||
case GSM48_MT_RR_CLSM_CHG:
|
||||
handle_classmark_chg(conn, msg);
|
||||
|
||||
case GSM48_MT_RR_APP_INFO:
|
||||
if (api->dtap)
|
||||
api->dtap(conn, link_id, msg); (5)
|
||||
|
||||
default:
|
||||
if (api->dtap)
|
||||
api->dtap(conn, link_id, msg); (5)
|
||||
|
||||
case GSM48_MT_RR_GPRS_SUSP_REQ:
|
||||
DEBUGP(DRR, "GRPS SUSPEND REQUEST\n");
|
||||
|
||||
case GSM48_MT_RR_STATUS:
|
||||
LOGP(DRR, LOGL_NOTICE, "RR STATUS (cause: %s)\n",
|
||||
|
||||
case GSM48_MT_RR_MEAS_REP:
|
||||
LOGP(DMEAS, LOGL_ERROR, "DIRECT GSM48 MEASUREMENT REPORT ?!? ");
|
||||
|
||||
|
||||
(3)[0]
|
||||
msc_bsc_api().compl_l3 =
|
||||
libmsc/osmo_msc.c: msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg,
|
||||
libmsc/gsm0408.c: gsm0408_dispatch() (6)
|
||||
|
||||
(3)[1]
|
||||
osmo_bsc_api().compl_l3 =
|
||||
osmo-bsc/osmo_bsc_api.c:bsc_compl_l3()
|
||||
msc = bsc_find_msc(conn, msg);
|
||||
complete_layer3(conn, msg, msc)
|
||||
bsc_filter_initial(msc->network->bsc_data, msc, conn, msg,
|
||||
&imsi, &con_type, &lu_cause);
|
||||
bsc_create_new_connection(conn, msc, send_ping);
|
||||
sccp->state_cb = msc_outgoing_sccp_state()
|
||||
sccp->data_cb = msc_outgoing_sccp_data()
|
||||
bsc_con->send_ping = send_ping()
|
||||
bsc_con->sccp_it_timeout.cb = sccp_it_timeout()
|
||||
bsc_con->sccp_cc_timeout.cb = sccp_cc_timeout()
|
||||
bsc_scan_bts_msg(conn, msg); (7)
|
||||
resp = gsm0808_create_layer3(msg, network_code, country_code, lac, ci);
|
||||
|
||||
(5)[0]
|
||||
msc_bsc_api().dtap =
|
||||
libmsc/osmo_msc.c: msc_dtap(conn, link_id, msg)
|
||||
gsm0408_dispatch(conn, msg) (6)
|
||||
|
||||
(5)[1]
|
||||
osmo_bsc_api().dtap =
|
||||
osmo-bsc/osmo_bsc_api.c: bsc_dtap(conn, link_id, msg)
|
||||
if (handle_cc_setup(conn, msg) >= 1) return;
|
||||
if (bsc_filter_data(conn, msg, &lu_cause) < 0)
|
||||
bsc_maybe_lu_reject()
|
||||
return;
|
||||
bsc_scan_bts_msg(conn, msg); (7)
|
||||
resp = gsm0808_create_dtap(msg, link_id);
|
||||
queue_msg_or_return(resp);
|
||||
|
||||
(7)
|
||||
bsc_scan_bts_msg() <osmo-bsc/osmo_bsc_filter.c:212>:
|
||||
if GSM48_PDISC_MM, GSM48_MT_MM_LOC_UPD_REQUEST
|
||||
handle_lu_request() <osmo-bsc/osmo_bsc_filter.c:29>:
|
||||
gsm48_generate_lai()
|
||||
if GSM48_PDISC_RR, GSM48_MT_RR_PAG_RESP
|
||||
handle_page_resp() <osmo-bsc/osmo_bsc_filter.c:97>:
|
||||
extract_sub() <osmo-bsc/osmo_bsc_filter.c:57>
|
||||
paging_request_stop() <libbsc/paging.c:390>:
|
||||
log_set_context()
|
||||
_paging_request_stop() <libbsc/paging.c:359>:
|
||||
paging_init_if_needed() <libbsc/paging.c:224>:
|
||||
paging_worker() <libbsc/paging.c:217>:
|
||||
paging_handle_pending_requests() <libbsc/paging.c:169> (R):
|
||||
cb()
|
||||
paging_give_credit() <libbsc/paging.c:107> (R):
|
||||
paging_handle_pending_requests() <libbsc/paging.c:169> (recursive: see 37)
|
||||
can_send_pag_req() <libbsc/paging.c:116>:
|
||||
page_ms() <libbsc/paging.c:69>:
|
||||
gsm0808_page() <libbsc/bsc_api.c:415>:
|
||||
rsl_paging_cmd() <libbsc/abis_rsl.c:751>:
|
||||
abis_rsl_dchan_hdr = RSL_IE_CHAN_NR
|
||||
mdisc_by_msgtype() <libbsc/abis_rsl.c:80>:
|
||||
ABIS_RSL_MDISC_RLL
|
||||
ABIS_RSL_MDISC_TRX
|
||||
ABIS_RSL_MDISC_COM_CHAN
|
||||
ABIS_RSL_MDISC_DED_CHAN
|
||||
ABIS_RSL_MDISC_LOC
|
||||
msgb_tv_put(msg, RSL_IE_PAGING_GROUP, paging_group);
|
||||
msgb_tlv_put(msg, RSL_IE_MS_IDENTITY, len-2, ms_ident+2);
|
||||
msgb_tv_put(msg, RSL_IE_CHAN_NEEDED, chan_needed);
|
||||
rsl_link
|
||||
abis_rsl_sendmsg()
|
||||
cbfn() (8)
|
||||
paging_remove_request() <libbsc/paging.c:60>:
|
||||
subscr_put() <libcommon/gsm_subscriber_base.c:89>
|
||||
subscr_put() <libcommon/gsm_subscriber_base.c:89>
|
||||
|
||||
(8)[0]
|
||||
libmsc/gsm_04_08.c:mncc_tx_to_cc()
|
||||
req->cbfn =
|
||||
libmsc/gsm_04_08.c:setup_trig_pag_evt
|
||||
|
||||
(8)[1]
|
||||
libmsc/gsm_04_11.c:gsm411_send_sms_subscr()
|
||||
req->cbfn =
|
||||
libmsc/gsm_04_11.c:paging_cb_send_sms
|
||||
|
||||
(9)
|
||||
bsc_scan_msc_msg() ./osmo-bsc/osmo_bsc_filter.c:330
|
||||
gsm48_hdr
|
||||
send_welcome_ussd() ./osmo-bsc/osmo_bsc_filter.c:229
|
||||
LOGP()
|
||||
DMSC
|
||||
LOGL_DEBUG
|
||||
ussd_welcome_txt
|
||||
BSS_SEND_USSD
|
||||
GSM48_MT_MM_INFO
|
||||
bsc_patch_mm_info() ./osmo-bsc/osmo_bsc_filter.c:255
|
||||
uint8_t
|
||||
tzbsd
|
||||
dst
|
||||
tlv_parse()
|
||||
gsm48_mm_att_tlvdef
|
||||
override
|
||||
hr
|
||||
mn
|
||||
TLVP_PRESENT()
|
||||
GSM48_IE_UTC
|
||||
LOGP()
|
||||
DMSC
|
||||
LOGL_DEBUG
|
||||
TLVP_VAL()
|
||||
GSM48_IE_NET_TIME_TZ
|
||||
GSM48_IE_NET_DST
|
||||
|
||||
|
||||
(6)
|
||||
libmsc/gsm0408.c: gsm0408_dispatch() (MSC rx from BSC)
|
||||
if (silent_call_reroute(conn, msg))
|
||||
return silent_call_rx(conn, msg);
|
||||
|
||||
case gsm48_pdisc_cc:
|
||||
rc = gsm0408_rcv_cc(conn, msg);
|
||||
|
||||
case gsm48_pdisc_mm:
|
||||
rc = gsm0408_rcv_mm(conn, msg);
|
||||
|
||||
case gsm48_pdisc_rr:
|
||||
rc = gsm0408_rcv_rr(conn, msg);
|
||||
|
||||
case gsm48_pdisc_sms:
|
||||
rc = gsm0411_rcv_sms(conn, msg);
|
||||
|
||||
case gsm48_pdisc_nc_ss:
|
||||
rc = handle_rcv_ussd(conn, msg);
|
||||
|
||||
case gsm48_pdisc_mm_gprs:
|
||||
case gsm48_pdisc_sm_gprs:
|
||||
logp(drll, logl_notice, "unimplemented "
|
||||
|
||||
msc_bsc_api().assign_compl =
|
||||
msc_assign_compl()
|
||||
nothing
|
||||
|
||||
(4)[0]
|
||||
libmsc/osmo_msc.c:msc_bsc_api().cipher_mode_compl =
|
||||
msc_ciph_m_compl(conn, msg, alg_id)
|
||||
conn->sec_operation->cb(GSM_HOOK_RR_SECURITY, GSM_SECURITY_SUCCEEDED,
|
||||
NULL, conn, conn->sec_operation->cb_data)
|
||||
release_security_operation(conn);
|
||||
msc_release_connection(conn)
|
||||
bsc_api.c:gsm0808_clear(conn)
|
||||
libbsc/handover_logic.c:bsc_clear_handover(conn, 1)
|
||||
libbsc/chan_alloc.c:lchan_release(ho->new_lchan, 0, RSL_REL_LOCAL_END);
|
||||
libbsc/chan_alloc.c:lchan_release(conn->secondary_lchan, 0, RSL_REL_LOCAL_END),
|
||||
(conn->lchan, 1, RSL_REL_NORMAL)
|
||||
bsc_api.c:subscr_con_free(conn)
|
||||
libcommon/gsm_subscriber_base.c:subscr_put(conn->subscr);
|
||||
|
||||
(4)[1]
|
||||
osmo-bsc/osmo_bsc_api.c:osmo_bsc_api().cipher_mode_compl =
|
||||
bsc_cipher_mode_compl()
|
||||
queue_msg_or_return() osmo-bsc/osmo_bsc_api.c
|
||||
bsc_queue_for_msc()
|
||||
|
||||
|
||||
libbsc/abis_nm.c:abis_nm_rcvmsg(msg);
|
||||
case ABIS_OM_MDISC_FOM:
|
||||
rc = abis_nm_rcvmsg_fom(msg);
|
||||
|
||||
case ABIS_OM_MDISC_MANUF:
|
||||
rc = abis_nm_rcvmsg_manuf(msg);
|
||||
|
||||
case ABIS_OM_MDISC_MMI:
|
||||
case ABIS_OM_MDISC_TRAU:
|
||||
LOGP(DNM, LOGL_ERROR, "unimplemented ABIS OML message discriminator 0x%x\n",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user