mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-03 05:23:43 +00:00
Compare commits
74 Commits
1.0.1
...
openbsc/0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
503f445d2c | ||
|
|
7c13f4b975 | ||
|
|
158a382212 | ||
|
|
82e5339504 | ||
|
|
63c2c828c0 | ||
|
|
1979e7227f | ||
|
|
ff4ded5903 | ||
|
|
684908e167 | ||
|
|
bb976dada9 | ||
|
|
614da5e88a | ||
|
|
fee372e673 | ||
|
|
34ae47f8d3 | ||
|
|
649f5a41e3 | ||
|
|
be20696c67 | ||
|
|
44da0a3949 | ||
|
|
4d888fc3ca | ||
|
|
f87cc7156a | ||
|
|
7b08c794e5 | ||
|
|
aa54e28857 | ||
|
|
a8a5ffa1dc | ||
|
|
eca2b31f62 | ||
|
|
45a833b4cd | ||
|
|
7c3524922b | ||
|
|
735c714a74 | ||
|
|
935eac12aa | ||
|
|
5135fbefd0 | ||
|
|
934355a268 | ||
|
|
6bceb8a5b0 | ||
|
|
4084e87af9 | ||
|
|
6545f7c6b7 | ||
|
|
deafac1ad0 | ||
|
|
ddb93a6e5e | ||
|
|
6d447a765e | ||
|
|
1b69ddc65f | ||
|
|
6e7e0fe514 | ||
|
|
6cadfa7328 | ||
|
|
6c21ff3d2e | ||
|
|
d7ff30eb62 | ||
|
|
c4cc3aab64 | ||
|
|
b59f450314 | ||
|
|
68399ea77e | ||
|
|
eabdf75936 | ||
|
|
d9e70a3e07 | ||
|
|
fc6fc13826 | ||
|
|
7c6405b5ce | ||
|
|
efda919e2d | ||
|
|
1bb18c8e61 | ||
|
|
67e2f74d01 | ||
|
|
ccdc490c33 | ||
|
|
65e4168e8e | ||
|
|
b63c4be047 | ||
|
|
5fff97fa1c | ||
|
|
e3e4f9c4b4 | ||
|
|
d70ea4dd0a | ||
|
|
4caacdf15f | ||
|
|
b09d1a8fa6 | ||
|
|
40f917f3a6 | ||
|
|
5c5bfc4e3c | ||
|
|
91914cbec2 | ||
|
|
4af112527a | ||
|
|
1b7e0c0385 | ||
|
|
c61beefa50 | ||
|
|
691a68926d | ||
|
|
9748a9c1c0 | ||
|
|
d13f32ccd8 | ||
|
|
505ccabd64 | ||
|
|
58534aa408 | ||
|
|
73f3f2866f | ||
|
|
d280f2dfbd | ||
|
|
72feed7c70 | ||
|
|
e7a75b6be2 | ||
|
|
81671d54b0 | ||
|
|
145c58df93 | ||
|
|
f997e56945 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
debian/*.log
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
[gerrit]
|
|
||||||
host=gerrit.osmocom.org
|
|
||||||
project=openbsc
|
|
||||||
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>
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
base="$PWD"
|
|
||||||
deps="$base/deps"
|
|
||||||
inst="$deps/install"
|
|
||||||
export deps inst
|
|
||||||
|
|
||||||
mkdir "$deps" || true
|
|
||||||
rm -rf "$inst"
|
|
||||||
|
|
||||||
osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
|
|
||||||
|
|
||||||
"$deps"/libosmocore/contrib/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"
|
|
||||||
|
|
||||||
if [ "x$IU" = "x--enable-iu" ]; then
|
|
||||||
sccp_branch="old_sua"
|
|
||||||
fi
|
|
||||||
|
|
||||||
osmo-build-dep.sh libosmo-abis
|
|
||||||
osmo-build-dep.sh libosmo-netif
|
|
||||||
osmo-build-dep.sh libosmo-sccp $sccp_branch
|
|
||||||
PARALLEL_MAKE="" osmo-build-dep.sh libsmpp34
|
|
||||||
osmo-build-dep.sh openggsn
|
|
||||||
|
|
||||||
if [ "x$IU" = "x--enable-iu" ]; then
|
|
||||||
osmo-build-dep.sh libasn1c
|
|
||||||
#osmo-build-dep.sh asn1c aper-prefix # only needed for make regen in osmo-iuh
|
|
||||||
osmo-build-dep.sh osmo-iuh
|
|
||||||
fi
|
|
||||||
|
|
||||||
set +x
|
|
||||||
echo
|
|
||||||
echo
|
|
||||||
echo
|
|
||||||
echo " =============================== openbsc ==============================="
|
|
||||||
echo
|
|
||||||
set -x
|
|
||||||
|
|
||||||
cd "$base"
|
|
||||||
cd openbsc
|
|
||||||
autoreconf --install --force
|
|
||||||
./configure --enable-osmo-bsc --enable-nat $SMPP $MGCP $IU --enable-vty-tests --enable-external-tests
|
|
||||||
$MAKE $PARALLEL_MAKE
|
|
||||||
LD_LIBRARY_PATH="$inst/lib" $MAKE check \
|
|
||||||
|| cat-testlogs.sh
|
|
||||||
LD_LIBRARY_PATH="$inst/lib" $MAKE distcheck \
|
|
||||||
|| cat-testlogs.sh
|
|
||||||
1
debian/autoreconf
vendored
1
debian/autoreconf
vendored
@@ -1 +0,0 @@
|
|||||||
openbsc
|
|
||||||
75
debian/changelog
vendored
75
debian/changelog
vendored
@@ -1,75 +0,0 @@
|
|||||||
openbsc (0.15.1) UNRELEASED; urgency=medium
|
|
||||||
|
|
||||||
* Move forward toward a new release.
|
|
||||||
* Prevent SGSN starting with 'auth-policy remote' when no 'gsup remote-*' are configured.
|
|
||||||
Note: such configs are broken without extra workarounds anyway.
|
|
||||||
|
|
||||||
-- Holger Hans Peter Freyther <holger@moiji-mobile.com> Tue, 24 May 2016 23:14:31 +0200
|
|
||||||
|
|
||||||
openbsc (0.14.0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream tag and additional patches.
|
|
||||||
|
|
||||||
-- Holger Hans Peter Freyther <holger@freyther.de> Sat, 14 Mar 2015 20:33:25 +0100
|
|
||||||
|
|
||||||
openbsc (0.12.0+git26-7) unstable; urgency=low
|
|
||||||
|
|
||||||
* 64bit fix for the MGCP rewriting
|
|
||||||
|
|
||||||
-- Holger Hans Peter Freyther <holger@freyther.de> Wed, 07 Nov 2012 11:39:34 +0100
|
|
||||||
|
|
||||||
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
|
|
||||||
1
debian/compat
vendored
1
debian/compat
vendored
@@ -1 +0,0 @@
|
|||||||
9
|
|
||||||
181
debian/control
vendored
181
debian/control
vendored
@@ -1,181 +0,0 @@
|
|||||||
Source: openbsc
|
|
||||||
Maintainer: Harald Welte <laforge@gnumonks.org>
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Build-Depends: debhelper (>= 9),
|
|
||||||
autotools-dev,
|
|
||||||
autoconf-archive,
|
|
||||||
pkg-config,
|
|
||||||
libgtp-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.9.8
|
|
||||||
Vcs-Git: git://bs11-abis.gnumonks.org/openbsc.git
|
|
||||||
Vcs-Browser: http://openbsc.osmocom.org/trac/browser
|
|
||||||
Homepage: https://projects.osmocom.org/projects/openbsc
|
|
||||||
|
|
||||||
Package: osmocom-bsc
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends}
|
|
||||||
Description: GSM Base Station Controller
|
|
||||||
This is the BSC-only version of OpenBSC. It requires a Mobile Switching Center
|
|
||||||
(MSC) to operate.
|
|
||||||
.
|
|
||||||
You might rather prefer to use osmocom-nitb which is considered a
|
|
||||||
"GSM Network-in-a-Box" and does not depend on a MSC.
|
|
||||||
|
|
||||||
Package: osmocom-nitb
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends},
|
|
||||||
libdbd-sqlite3
|
|
||||||
Description: GSM Network-in-a-Box, implements BSC, MSC, SMSC, HLR, VLR
|
|
||||||
This is the Network-in-a-Box version of OpenBSC. It has all the GSM network
|
|
||||||
components bundled together. When using osmocom-nitb, there is no need for a
|
|
||||||
Mobile Switching Center (MSC) which is needed when using osmocom-bsc.
|
|
||||||
|
|
||||||
Package: osmocom-ipaccess-utils
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends}
|
|
||||||
Description: Command line utilities for ip.access nanoBTS
|
|
||||||
This package contains utilities that are specific for nanoBTS when being used
|
|
||||||
together with OpenBSC. It contains mainly three tools: ipaccess-find,
|
|
||||||
ipaccess-config and ipaccess-proxy.
|
|
||||||
|
|
||||||
Package: osmocom-bs11-utils
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends}
|
|
||||||
Description: Command line utilities for Siemens BS-11 BTS
|
|
||||||
There is a tool in this package for configuring the Siemens BS-11 BTS.
|
|
||||||
Additionally, it contains one tool for making use of an ISDN-card and the
|
|
||||||
public telephone network as frequency standard for the E1 line.
|
|
||||||
|
|
||||||
Package: osmocom-sgsn
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends}
|
|
||||||
Suggests: osmocom-bsc
|
|
||||||
Description: Osmocom Serving GPRS Support Node
|
|
||||||
This is an implementation of the GPRS Serving GPRS Support Node (SGSN). As
|
|
||||||
such it implements the GPRS Mobility Management (GMM) and SM (Session
|
|
||||||
Management).
|
|
||||||
.
|
|
||||||
The SGSN connects via the Gb-interface to the BSS (like the osmo-pcu or an
|
|
||||||
ip.access nanoBTS), and it connects via the GTP protocol to a Gateway GPRS
|
|
||||||
Support Node (GGSN) like openggsn.
|
|
||||||
|
|
||||||
Package: osmocom-gbproxy
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends}
|
|
||||||
Recommends: osmocom-sgsn
|
|
||||||
Description: Osmocom GPRS Gb Interface Proxy
|
|
||||||
The purpose of the Gb proxy is to aggregate the Gb links of multiple
|
|
||||||
BSS's and present them in one Gb link to the SGSN.
|
|
||||||
.
|
|
||||||
This package is part of OpenBSC and closely related to osmocom-sgsn.
|
|
||||||
|
|
||||||
Package: osmocom-bsc-nat
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends},
|
|
||||||
${misc:Depends}
|
|
||||||
Recommends: osmocom-bsc
|
|
||||||
Description: Osmocom Base Station Controller Network Address Translation
|
|
||||||
This NAT is useful for masquerading multiple BSCs behind one. It listens
|
|
||||||
for incoming BSCs on port 5000 and connects to a specified Mobile Switching
|
|
||||||
Center (MSC).
|
|
||||||
.
|
|
||||||
This package is part of OpenBSC and closely related to osmocom-bsc.
|
|
||||||
|
|
||||||
Package: openbsc-dev
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${misc:Depends}
|
|
||||||
Description: Header file needed by tools tightly integrated
|
|
||||||
Some other programs depend on gsm_data_shared.h and gsm_data_shared.c
|
|
||||||
from OpenBSC. This package installs these files to your file system so
|
|
||||||
that the other packages can build-depend on this package.
|
|
||||||
.
|
|
||||||
The directory structure is copied after the structure in the repository
|
|
||||||
and the header and .c file are installed into /usr/src/osmocom/openbsc/.
|
|
||||||
|
|
||||||
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
|
|
||||||
Depends: osmocom-bsc (= ${binary:Version}), ${misc:Depends}
|
|
||||||
Description: Debug symbols for the OpenBSC BSC
|
|
||||||
Make debugging possible
|
|
||||||
|
|
||||||
Package: osmocom-nitb-dbg
|
|
||||||
Architecture: any
|
|
||||||
Section: debug
|
|
||||||
Priority: extra
|
|
||||||
Depends: osmocom-nitb (= ${binary:Version}), ${misc:Depends}
|
|
||||||
Description: Debug symbols for the OpenBSC NITB
|
|
||||||
Make debugging possible
|
|
||||||
|
|
||||||
Package: osmocom-ipaccess-utils-dbg
|
|
||||||
Architecture: any
|
|
||||||
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: osmocom-bs11-utils-dbg
|
|
||||||
Architecture: any
|
|
||||||
Section: debug
|
|
||||||
Priority: extra
|
|
||||||
Depends: osmocom-bs11-utils (= ${binary:Version}), ${misc:Depends}
|
|
||||||
Description: Debug symbols for the OpenBSC BS11 utils
|
|
||||||
Make debugging possible
|
|
||||||
|
|
||||||
Package: osmocom-sgsn-dbg
|
|
||||||
Architecture: any
|
|
||||||
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: osmocom-gbproxy-dbg
|
|
||||||
Architecture: any
|
|
||||||
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
|
|
||||||
137
debian/copyright
vendored
137
debian/copyright
vendored
@@ -1,137 +0,0 @@
|
|||||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: OpenBSC
|
|
||||||
Source: http://openbsc.osmocom.org/
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2008-2015 Harald Welte <laforge@gnumonks.org>
|
|
||||||
2008-2015 Holger Hans Peter Freyther <zecke@selfish.org>
|
|
||||||
2009-2015 On-Waves
|
|
||||||
2008 Jan Luebbe <jluebbe@debian.org>
|
|
||||||
2008,2010-2011 Daniel Willmann <daniel@totalueberwachung.de>
|
|
||||||
2009,2011,2013 Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
|
||||||
2009,2011 Dieter Spaar <spaar@mirider.augusta.de>
|
|
||||||
2009 Mike Haben <michael.haben@btinternet.com>
|
|
||||||
2010 Sylvain Munaut <246tnt@gmail.com>
|
|
||||||
2012-2013 Pablo Neira Ayuso <pablo@gnumonks.org>
|
|
||||||
2013-2015 Sysmocom s.f.m.c. GmbH (Jacob Erlbeck)
|
|
||||||
2014 Alexander Chemeris <Alexander.Chemeris@fairwaves.co>
|
|
||||||
License: AGPL-3+
|
|
||||||
Comment: Contributions by Stefan Schmidt <stefan@datenfreihafen.org> as well
|
|
||||||
|
|
||||||
Files: wireshark/0001-abis_oml.patch
|
|
||||||
wireshark/0002-ericsson_rbs2409.patch
|
|
||||||
wireshark/0003-lucent-hnb.patch
|
|
||||||
wireshark/0005-rsl-hsl.patch
|
|
||||||
Copyright: 1998 Gerald Combs <gerald@wireshark.org>
|
|
||||||
2007,2011 Anders Broman <anders.broman@ericsson.com>
|
|
||||||
2009 Holger Hans Peter Freyther <zecke@selfish.org>
|
|
||||||
2009-2011 Harald Welte <laforge@gnumonks.org>
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
Files: openbsc/include/mISDNif.h
|
|
||||||
Copyright: 2008 Karsten Keil <kkeil@novell.com>
|
|
||||||
License: LGPL-2.1
|
|
||||||
|
|
||||||
Files: openbsc/src/libmgcp/g711common.h
|
|
||||||
Copyright: 2009 Abramo Bagnara <abramo@alsa-project.org>
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
Files: openbsc/git-version-gen
|
|
||||||
Copyright: 2007-2010 Free Software Foundation
|
|
||||||
License: GPL-3+
|
|
||||||
|
|
||||||
Files: openbsc/osmoappdesc.py
|
|
||||||
openbsc/tests/smpp_test_runner.py
|
|
||||||
openbsc/tests/ctrl_test_runner.py
|
|
||||||
openbsc/tests/vty_test_runner.py
|
|
||||||
Copyright: 2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
|
|
||||||
2013 Jacob Erlbeck <jerlbeck@sysmocom.de>
|
|
||||||
2013-2014 Holger Hans Peter Freyther <zecke@selfish.org>
|
|
||||||
License: GPL-3+
|
|
||||||
|
|
||||||
Files: openbsc/src/libbsc/bsc_ctrl_lookup.c
|
|
||||||
Copyright: 2010-2011 Daniel Willmann <daniel@totalueberwachung.de>
|
|
||||||
2010-2011 On-Waves
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
Files: openbsc/src/libmsc/mncc_sock.c
|
|
||||||
openbsc/src/libmsc/mncc_builtin.c
|
|
||||||
Copyright: 2008-2010 Harald Welte <laforge@gnumonks.org>
|
|
||||||
2009 Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
|
||||||
2012 Holger Hans Peter Freyther <zecke@selfish.org>
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
Files: debian/*
|
|
||||||
Copyright: 2012-2015 Holger Hans Peter Freyther <zecke@selfish.org>
|
|
||||||
2016 Ruben Undheim <ruben.undheim@gmail.com>
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
|
|
||||||
License: AGPL-3+
|
|
||||||
This package is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
.
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
.
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
License: GPL-2+
|
|
||||||
This package is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 2 of the License, or (at
|
|
||||||
your option) any later version.
|
|
||||||
.
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
.
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
.
|
|
||||||
On Debian systems, the complete text of the GNU General Public
|
|
||||||
License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
|
||||||
|
|
||||||
|
|
||||||
License: GPL-3+
|
|
||||||
This package is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 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".
|
|
||||||
|
|
||||||
|
|
||||||
License: LGPL-2.1
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; version
|
|
||||||
2.1 of the License.
|
|
||||||
.
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
.
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
||||||
.
|
|
||||||
On Debian systems, the complete text of the GNU Lesser General
|
|
||||||
Public License version 2.1 can be found in
|
|
||||||
"/usr/share/common-licenses/LGPL-2.1".
|
|
||||||
1
debian/docs
vendored
1
debian/docs
vendored
@@ -1 +0,0 @@
|
|||||||
openbsc/README
|
|
||||||
4
debian/openbsc-dev.install
vendored
4
debian/openbsc-dev.install
vendored
@@ -1,4 +0,0 @@
|
|||||||
openbsc/include/openbsc/gsm_data_shared.h usr/src/osmocom/openbsc/openbsc/include/openbsc/
|
|
||||||
openbsc/include/openbsc/common_cs.h usr/src/osmocom/openbsc/openbsc/include/openbsc/
|
|
||||||
openbsc/src/libcommon/gsm_data_shared.c usr/src/osmocom/openbsc/openbsc/src/libcommon/
|
|
||||||
usr/lib/*/pkgconfig/openbsc.pc
|
|
||||||
2
debian/osmo-gtphub.default
vendored
2
debian/osmo-gtphub.default
vendored
@@ -1,2 +0,0 @@
|
|||||||
CONFIG_FILE="/etc/osmocom/osmo-gtphub.cfg"
|
|
||||||
|
|
||||||
1
debian/osmo-gtphub.examples
vendored
1
debian/osmo-gtphub.examples
vendored
@@ -1 +0,0 @@
|
|||||||
openbsc/doc/examples/osmo-gtphub
|
|
||||||
150
debian/osmo-gtphub.init
vendored
150
debian/osmo-gtphub.init
vendored
@@ -1,150 +0,0 @@
|
|||||||
#!/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
1
debian/osmo-gtphub.install
vendored
@@ -1 +0,0 @@
|
|||||||
/usr/bin/osmo-gtphub
|
|
||||||
153
debian/osmocom-bsc-nat.init
vendored
153
debian/osmocom-bsc-nat.init
vendored
@@ -1,153 +0,0 @@
|
|||||||
#!/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.examples
vendored
1
debian/osmocom-bsc.examples
vendored
@@ -1 +0,0 @@
|
|||||||
openbsc/doc/examples/osmo-bsc_mgcp
|
|
||||||
2
debian/osmocom-bsc.install
vendored
2
debian/osmocom-bsc.install
vendored
@@ -1,2 +0,0 @@
|
|||||||
/usr/bin/osmo-bsc_mgcp
|
|
||||||
/usr/bin/osmo-bsc
|
|
||||||
151
debian/osmocom-gbproxy.init
vendored
151
debian/osmocom-gbproxy.init
vendored
@@ -1,151 +0,0 @@
|
|||||||
#!/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
|
|
||||||
|
|
||||||
:
|
|
||||||
8
debian/osmocom-nitb.default
vendored
8
debian/osmocom-nitb.default
vendored
@@ -1,8 +0,0 @@
|
|||||||
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
3
debian/osmocom-nitb.dirs
vendored
@@ -1,3 +0,0 @@
|
|||||||
/etc/osmocom
|
|
||||||
/var/log/osmocom
|
|
||||||
/var/lib/osmocom
|
|
||||||
1
debian/osmocom-nitb.examples
vendored
1
debian/osmocom-nitb.examples
vendored
@@ -1 +0,0 @@
|
|||||||
openbsc/doc/examples/osmo-nitb
|
|
||||||
2
debian/osmocom-nitb.install
vendored
2
debian/osmocom-nitb.install
vendored
@@ -1,2 +0,0 @@
|
|||||||
/usr/bin/osmo-nitb
|
|
||||||
openbsc/contrib/*.py usr/bin/
|
|
||||||
2
debian/osmocom-sgsn.default
vendored
2
debian/osmocom-sgsn.default
vendored
@@ -1,2 +0,0 @@
|
|||||||
CONFIG_FILE="/etc/osmocom/osmo-sgsn.cfg"
|
|
||||||
|
|
||||||
1
debian/osmocom-sgsn.examples
vendored
1
debian/osmocom-sgsn.examples
vendored
@@ -1 +0,0 @@
|
|||||||
openbsc/doc/examples/osmo-sgsn
|
|
||||||
150
debian/osmocom-sgsn.init
vendored
150
debian/osmocom-sgsn.init
vendored
@@ -1,150 +0,0 @@
|
|||||||
#!/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
|
|
||||||
|
|
||||||
:
|
|
||||||
32
debian/rules
vendored
32
debian/rules
vendored
@@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
|
|
||||||
# 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')
|
|
||||||
|
|
||||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --sourcedirectory=openbsc --with autoreconf
|
|
||||||
|
|
||||||
# This is needed for debian stable (squeeze)
|
|
||||||
override_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
|
|
||||||
|
|
||||||
1
debian/source/format
vendored
1
debian/source/format
vendored
@@ -1 +0,0 @@
|
|||||||
3.0 (native)
|
|
||||||
144
linux-kernel/linux-2.6.27.4-misdn-abis.diff
Normal file
144
linux-kernel/linux-2.6.27.4-misdn-abis.diff
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
diff -Nru --exclude-from /sunbeam/home/laforge/scripts/dontdiff linux-2.6.27.4-clean/drivers/isdn/mISDN/layer2.c linux-2.6.27.4/drivers/isdn/mISDN/layer2.c
|
||||||
|
--- linux-2.6.27.4-clean/drivers/isdn/mISDN/layer2.c 2008-10-26 00:05:07.000000000 +0200
|
||||||
|
+++ linux-2.6.27.4/drivers/isdn/mISDN/layer2.c 2008-12-23 16:16:29.000000000 +0100
|
||||||
|
@@ -94,8 +94,10 @@
|
||||||
|
struct layer2 *l2 = fi->userdata;
|
||||||
|
va_list va;
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
if (!(*debug & DEBUG_L2_FSM))
|
||||||
|
return;
|
||||||
|
+#endif
|
||||||
|
va_start(va, fmt);
|
||||||
|
printk(KERN_DEBUG "l2 (tei %d): ", l2->tei);
|
||||||
|
vprintk(fmt, va);
|
||||||
|
@@ -882,6 +884,8 @@
|
||||||
|
l2->va = 0;
|
||||||
|
l2->vr = 0;
|
||||||
|
l2->sow = 0;
|
||||||
|
+ l2->sapi = skb->data[0] >> 2;
|
||||||
|
+ set_channel_address(&l2->ch, l2->sapi, l2->tei);
|
||||||
|
clear_exception(l2);
|
||||||
|
send_uframe(l2, NULL, UA | get_PollFlag(l2, skb), RSP);
|
||||||
|
mISDN_FsmChangeState(fi, ST_L2_7);
|
||||||
|
@@ -898,6 +902,7 @@
|
||||||
|
struct layer2 *l2 = fi->userdata;
|
||||||
|
struct sk_buff *skb = arg;
|
||||||
|
|
||||||
|
+ printk(KERN_DEBUG "l2_send_UA()\n");
|
||||||
|
send_uframe(l2, skb, UA | get_PollFlag(l2, skb), RSP);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -931,6 +936,8 @@
|
||||||
|
l2->va = 0;
|
||||||
|
l2->vr = 0;
|
||||||
|
l2->sow = 0;
|
||||||
|
+ l2->sapi = skb->data[0] >> 2;
|
||||||
|
+ set_channel_address(&l2->ch, l2->sapi, l2->tei);
|
||||||
|
mISDN_FsmChangeState(fi, ST_L2_7);
|
||||||
|
stop_t200(l2, 3);
|
||||||
|
mISDN_FsmRestartTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 3);
|
||||||
|
@@ -982,6 +989,8 @@
|
||||||
|
} else if (l2->vs != l2->va) {
|
||||||
|
skb_queue_purge(&l2->i_queue);
|
||||||
|
pr = DL_ESTABLISH_IND;
|
||||||
|
+ //l2->sapi = skb->data[0] >> 2;
|
||||||
|
+ //set_channel_address(&l2->ch, l2->sapi, l2->tei);
|
||||||
|
}
|
||||||
|
stop_t200(l2, 5);
|
||||||
|
l2->vr = 0;
|
||||||
|
@@ -1841,11 +1850,14 @@
|
||||||
|
u_int l;
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
+ printk(KERN_DEBUG "ph_data_indication 0x%x 0x%x 0x%x\n", datap[0], datap[1], datap[2]);
|
||||||
|
+
|
||||||
|
l = l2addrsize(l2);
|
||||||
|
if (skb->len <= l) {
|
||||||
|
mISDN_FsmEvent(&l2->l2m, EV_L2_FRAME_ERROR, (void *) 'N');
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
+#if 0
|
||||||
|
if (test_bit(FLG_LAPD, &l2->flag)) { /* Maybe not needed */
|
||||||
|
psapi = *datap++;
|
||||||
|
ptei = *datap++;
|
||||||
|
@@ -1875,6 +1887,7 @@
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
+#endif
|
||||||
|
datap += l;
|
||||||
|
if (!(*datap & 1)) { /* I-Frame */
|
||||||
|
c = iframe_error(l2, skb);
|
||||||
|
@@ -1890,6 +1903,7 @@
|
||||||
|
ret = mISDN_FsmEvent(&l2->l2m, EV_L2_UI, skb);
|
||||||
|
} else if (IsSABME(datap, l2)) {
|
||||||
|
c = unnum_error(l2, skb, CMD);
|
||||||
|
+ printk(KERN_DEBUG "IsSABME() returned true, unnum_error=%d\n", c);
|
||||||
|
if (!c)
|
||||||
|
ret = mISDN_FsmEvent(&l2->l2m, EV_L2_SABME, skb);
|
||||||
|
} else if (IsUA(datap)) {
|
||||||
|
@@ -2087,7 +2101,7 @@
|
||||||
|
test_and_set_bit(FLG_LAPD, &l2->flag);
|
||||||
|
test_and_set_bit(FLG_LAPD_NET, &l2->flag);
|
||||||
|
test_and_set_bit(FLG_MOD128, &l2->flag);
|
||||||
|
- l2->sapi = 0;
|
||||||
|
+ l2->sapi = 62;
|
||||||
|
l2->maxlen = MAX_DFRAME_LEN;
|
||||||
|
if (test_bit(OPTION_L2_PMX, &options))
|
||||||
|
l2->window = 7;
|
||||||
|
diff -Nru --exclude-from /sunbeam/home/laforge/scripts/dontdiff linux-2.6.27.4-clean/drivers/isdn/mISDN/tei.c linux-2.6.27.4/drivers/isdn/mISDN/tei.c
|
||||||
|
--- linux-2.6.27.4-clean/drivers/isdn/mISDN/tei.c 2008-10-26 00:05:07.000000000 +0200
|
||||||
|
+++ linux-2.6.27.4/drivers/isdn/mISDN/tei.c 2008-12-23 16:32:59.000000000 +0100
|
||||||
|
@@ -830,18 +830,29 @@
|
||||||
|
int tei, ri;
|
||||||
|
struct layer2 *l2;
|
||||||
|
|
||||||
|
+ printk(KERN_DEBUG "new tei request: tei=%d\n", dp[3] >> 1);
|
||||||
|
+
|
||||||
|
ri = dp[0] << 8;
|
||||||
|
ri += dp[1];
|
||||||
|
- if (!mgr->up)
|
||||||
|
- goto denied;
|
||||||
|
- tei = get_free_tei(mgr);
|
||||||
|
- if (tei < 0) {
|
||||||
|
- printk(KERN_WARNING "%s:No free tei\n", __func__);
|
||||||
|
+ if (!mgr->up) {
|
||||||
|
+ printk(KERN_DEBUG "mgr->up == NULL\n");
|
||||||
|
goto denied;
|
||||||
|
}
|
||||||
|
+ if (dp[3] != 0xff) {
|
||||||
|
+ /* This is a TEI request according to 3GPP TS 08.56 6.1.11.2 */
|
||||||
|
+ tei = dp[3] >> 1;
|
||||||
|
+ } else {
|
||||||
|
+ tei = get_free_tei(mgr);
|
||||||
|
+ if (tei < 0) {
|
||||||
|
+ printk(KERN_WARNING "%s:No free tei\n", __func__);
|
||||||
|
+ goto denied;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
l2 = create_new_tei(mgr, tei);
|
||||||
|
- if (!l2)
|
||||||
|
+ if (!l2) {
|
||||||
|
+ printk(KERN_DEBUG "create_new_tei == NULL\n");
|
||||||
|
goto denied;
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
mISDN_FsmEvent(&l2->tm->tei_m, EV_ASSIGN_REQ, dp);
|
||||||
|
return;
|
||||||
|
@@ -1159,12 +1170,14 @@
|
||||||
|
return -ENOTCONN;
|
||||||
|
if (skb->len != 3)
|
||||||
|
return -ENOTCONN;
|
||||||
|
+#if 0
|
||||||
|
if (skb->data[0] != 0)
|
||||||
|
/* only SAPI 0 command */
|
||||||
|
return -ENOTCONN;
|
||||||
|
+#endif
|
||||||
|
if (!(skb->data[1] & 1)) /* invalid EA1 */
|
||||||
|
return -EINVAL;
|
||||||
|
- tei = skb->data[1] >> 0;
|
||||||
|
+ tei = skb->data[1] >> 1;
|
||||||
|
if (tei > 63) /* not a fixed tei */
|
||||||
|
return -ENOTCONN;
|
||||||
|
if ((skb->data[2] & ~0x10) != SABME)
|
||||||
486
linux-kernel/linux-2.6.30-hfcmulti-multibts.patch
Normal file
486
linux-kernel/linux-2.6.30-hfcmulti-multibts.patch
Normal file
@@ -0,0 +1,486 @@
|
|||||||
|
This experimental patch splits one E1 card into three virtual cards,
|
||||||
|
|
||||||
|
TS 1,2,3,4,5 is card 0
|
||||||
|
TS 6,7,8,9,10 is card 1
|
||||||
|
TS 11,12,13,14 is card 2
|
||||||
|
|
||||||
|
This allows you to run one L2 TEI handler on each of the virtual cards,
|
||||||
|
which is required if you want to run multiple BTS on a single E1 link.
|
||||||
|
|
||||||
|
Thanks to Andreas Eversberg for this patch.
|
||||||
|
|
||||||
|
diff --git a/drivers/isdn/hardware/mISDN/hfc_multi.h b/drivers/isdn/hardware/mISDN/hfc_multi.h
|
||||||
|
index 0c77386..02dd4a1 100644
|
||||||
|
--- a/drivers/isdn/hardware/mISDN/hfc_multi.h
|
||||||
|
+++ b/drivers/isdn/hardware/mISDN/hfc_multi.h
|
||||||
|
@@ -209,14 +209,17 @@ struct hfc_multi {
|
||||||
|
u_long ledstate; /* save last state of leds */
|
||||||
|
int opticalsupport; /* has the e1 board */
|
||||||
|
/* an optical Interface */
|
||||||
|
- int dslot; /* channel # of d-channel (E1) default 16 */
|
||||||
|
+
|
||||||
|
+ u_int bmask[32]; /* bitmask of bchannels for port */
|
||||||
|
+ u_char dnum[32]; /* array of used dchannel numbers for port */
|
||||||
|
+ u_char created[32]; /* what port is created */
|
||||||
|
+ u_int activity[32]; /* if there is any action on this */
|
||||||
|
+ /* port (will be cleared after */
|
||||||
|
+ /* showing led-states) */
|
||||||
|
|
||||||
|
u_long wdcount; /* every 500 ms we need to */
|
||||||
|
/* send the watchdog a signal */
|
||||||
|
u_char wdbyte; /* watchdog toggle byte */
|
||||||
|
- u_int activity[8]; /* if there is any action on this */
|
||||||
|
- /* port (will be cleared after */
|
||||||
|
- /* showing led-states) */
|
||||||
|
int e1_state; /* keep track of last state */
|
||||||
|
int e1_getclock; /* if sync is retrieved from interface */
|
||||||
|
int syncronized; /* keep track of existing sync interface */
|
||||||
|
@@ -233,7 +236,6 @@ struct hfc_multi {
|
||||||
|
* the bch->channel is equvalent to the hfc-channel
|
||||||
|
*/
|
||||||
|
struct hfc_chan chan[32];
|
||||||
|
- u_char created[8]; /* what port is created */
|
||||||
|
signed char slot_owner[256]; /* owner channel of slot */
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c
|
||||||
|
index e1dab30..4fe2d27 100644
|
||||||
|
--- a/drivers/isdn/hardware/mISDN/hfcmulti.c
|
||||||
|
+++ b/drivers/isdn/hardware/mISDN/hfcmulti.c
|
||||||
|
@@ -1619,8 +1619,8 @@ hfcmulti_leds(struct hfc_multi *hc)
|
||||||
|
* left red: frame sync, but no L1
|
||||||
|
* right green: L2 active
|
||||||
|
*/
|
||||||
|
- if (hc->chan[hc->dslot].sync != 2) { /* no frame sync */
|
||||||
|
- if (hc->chan[hc->dslot].dch->dev.D.protocol
|
||||||
|
+ if (hc->chan[hc->dnum[0]].sync != 2) { /* no frame sync */
|
||||||
|
+ if (hc->chan[hc->dnum[0]].dch->dev.D.protocol
|
||||||
|
!= ISDN_P_NT_E1) {
|
||||||
|
led[0] = 1;
|
||||||
|
led[1] = 1;
|
||||||
|
@@ -2428,55 +2428,56 @@ handle_timer_irq(struct hfc_multi *hc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hc->ctype == HFC_TYPE_E1 && hc->created[0]) {
|
||||||
|
- dch = hc->chan[hc->dslot].dch;
|
||||||
|
- if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dslot].cfg)) {
|
||||||
|
+#warning todo: put interface parameters to hc
|
||||||
|
+ dch = hc->chan[hc->dnum[0]].dch;
|
||||||
|
+ if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[0]].cfg)) {
|
||||||
|
/* LOS */
|
||||||
|
temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_SIG_LOS;
|
||||||
|
- if (!temp && hc->chan[hc->dslot].los)
|
||||||
|
+ if (!temp && hc->chan[hc->dnum[0]].los)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_LOS_ON,
|
||||||
|
"LOS detected");
|
||||||
|
- if (temp && !hc->chan[hc->dslot].los)
|
||||||
|
+ if (temp && !hc->chan[hc->dnum[0]].los)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_LOS_OFF,
|
||||||
|
"LOS gone");
|
||||||
|
- hc->chan[hc->dslot].los = temp;
|
||||||
|
+ hc->chan[hc->dnum[0]].los = temp;
|
||||||
|
}
|
||||||
|
- if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dslot].cfg)) {
|
||||||
|
+ if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dnum[0]].cfg)) {
|
||||||
|
/* AIS */
|
||||||
|
temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_AIS;
|
||||||
|
- if (!temp && hc->chan[hc->dslot].ais)
|
||||||
|
+ if (!temp && hc->chan[hc->dnum[0]].ais)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_AIS_ON,
|
||||||
|
"AIS detected");
|
||||||
|
- if (temp && !hc->chan[hc->dslot].ais)
|
||||||
|
+ if (temp && !hc->chan[hc->dnum[0]].ais)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_AIS_OFF,
|
||||||
|
"AIS gone");
|
||||||
|
- hc->chan[hc->dslot].ais = temp;
|
||||||
|
+ hc->chan[hc->dnum[0]].ais = temp;
|
||||||
|
}
|
||||||
|
- if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dslot].cfg)) {
|
||||||
|
+ if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dnum[0]].cfg)) {
|
||||||
|
/* SLIP */
|
||||||
|
temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_RX;
|
||||||
|
- if (!temp && hc->chan[hc->dslot].slip_rx)
|
||||||
|
+ if (!temp && hc->chan[hc->dnum[0]].slip_rx)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_SLIP_RX,
|
||||||
|
" bit SLIP detected RX");
|
||||||
|
- hc->chan[hc->dslot].slip_rx = temp;
|
||||||
|
+ hc->chan[hc->dnum[0]].slip_rx = temp;
|
||||||
|
temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_TX;
|
||||||
|
- if (!temp && hc->chan[hc->dslot].slip_tx)
|
||||||
|
+ if (!temp && hc->chan[hc->dnum[0]].slip_tx)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_SLIP_TX,
|
||||||
|
" bit SLIP detected TX");
|
||||||
|
- hc->chan[hc->dslot].slip_tx = temp;
|
||||||
|
+ hc->chan[hc->dnum[0]].slip_tx = temp;
|
||||||
|
}
|
||||||
|
- if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dslot].cfg)) {
|
||||||
|
+ if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dnum[0]].cfg)) {
|
||||||
|
/* RDI */
|
||||||
|
temp = HFC_inb_nodebug(hc, R_RX_SL0_0) & V_A;
|
||||||
|
- if (!temp && hc->chan[hc->dslot].rdi)
|
||||||
|
+ if (!temp && hc->chan[hc->dnum[0]].rdi)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_RDI_ON,
|
||||||
|
"RDI detected");
|
||||||
|
- if (temp && !hc->chan[hc->dslot].rdi)
|
||||||
|
+ if (temp && !hc->chan[hc->dnum[0]].rdi)
|
||||||
|
signal_state_up(dch, L1_SIGNAL_RDI_OFF,
|
||||||
|
"RDI gone");
|
||||||
|
- hc->chan[hc->dslot].rdi = temp;
|
||||||
|
+ hc->chan[hc->dnum[0]].rdi = temp;
|
||||||
|
}
|
||||||
|
temp = HFC_inb_nodebug(hc, R_JATT_DIR);
|
||||||
|
- switch (hc->chan[hc->dslot].sync) {
|
||||||
|
+ switch (hc->chan[hc->dnum[0]].sync) {
|
||||||
|
case 0:
|
||||||
|
if ((temp & 0x60) == 0x60) {
|
||||||
|
if (debug & DEBUG_HFCMULTI_SYNC)
|
||||||
|
@@ -2485,10 +2486,10 @@ handle_timer_irq(struct hfc_multi *hc)
|
||||||
|
"in clock sync\n",
|
||||||
|
__func__, hc->id);
|
||||||
|
HFC_outb(hc, R_RX_OFF,
|
||||||
|
- hc->chan[hc->dslot].jitter | V_RX_INIT);
|
||||||
|
+ hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
|
||||||
|
HFC_outb(hc, R_TX_OFF,
|
||||||
|
- hc->chan[hc->dslot].jitter | V_RX_INIT);
|
||||||
|
- hc->chan[hc->dslot].sync = 1;
|
||||||
|
+ hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
|
||||||
|
+ hc->chan[hc->dnum[0]].sync = 1;
|
||||||
|
goto check_framesync;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -2499,7 +2500,7 @@ handle_timer_irq(struct hfc_multi *hc)
|
||||||
|
"%s: (id=%d) E1 "
|
||||||
|
"lost clock sync\n",
|
||||||
|
__func__, hc->id);
|
||||||
|
- hc->chan[hc->dslot].sync = 0;
|
||||||
|
+ hc->chan[hc->dnum[0]].sync = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
check_framesync:
|
||||||
|
@@ -2510,7 +2511,7 @@ check_framesync:
|
||||||
|
"%s: (id=%d) E1 "
|
||||||
|
"now in frame sync\n",
|
||||||
|
__func__, hc->id);
|
||||||
|
- hc->chan[hc->dslot].sync = 2;
|
||||||
|
+ hc->chan[hc->dnum[0]].sync = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
@@ -2520,7 +2521,7 @@ check_framesync:
|
||||||
|
"%s: (id=%d) E1 lost "
|
||||||
|
"clock & frame sync\n",
|
||||||
|
__func__, hc->id);
|
||||||
|
- hc->chan[hc->dslot].sync = 0;
|
||||||
|
+ hc->chan[hc->dnum[0]].sync = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
temp = HFC_inb_nodebug(hc, R_SYNC_STA);
|
||||||
|
@@ -2530,7 +2531,7 @@ check_framesync:
|
||||||
|
"%s: (id=%d) E1 "
|
||||||
|
"lost frame sync\n",
|
||||||
|
__func__, hc->id);
|
||||||
|
- hc->chan[hc->dslot].sync = 1;
|
||||||
|
+ hc->chan[hc->dnum[0]].sync = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -2746,7 +2747,8 @@ hfcmulti_interrupt(int intno, void *dev_id)
|
||||||
|
if (r_irq_misc & V_STA_IRQ) {
|
||||||
|
if (hc->ctype == HFC_TYPE_E1) {
|
||||||
|
/* state machine */
|
||||||
|
- dch = hc->chan[hc->dslot].dch;
|
||||||
|
+#warning todo
|
||||||
|
+ dch = hc->chan[hc->dnum[0]].dch;
|
||||||
|
e1_syncsta = HFC_inb_nodebug(hc, R_SYNC_STA);
|
||||||
|
if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
|
||||||
|
&& hc->e1_getclock) {
|
||||||
|
@@ -2768,7 +2770,15 @@ hfcmulti_interrupt(int intno, void *dev_id)
|
||||||
|
}
|
||||||
|
dch->state = HFC_inb_nodebug(hc, R_E1_RD_STA)
|
||||||
|
& 0x7;
|
||||||
|
+#warning todo hack!!! broadcast state change!!!
|
||||||
|
+ dch = hc->chan[hc->dnum[0]].dch;
|
||||||
|
schedule_event(dch, FLG_PHCHANGE);
|
||||||
|
+ dch = hc->chan[hc->dnum[1]].dch;
|
||||||
|
+ dch->state = HFC_inb_nodebug(hc, R_E1_RD_STA)
|
||||||
|
+ & 0x7;
|
||||||
|
+ schedule_event(dch, FLG_PHCHANGE);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
if (debug & DEBUG_HFCMULTI_STATE)
|
||||||
|
printk(KERN_DEBUG
|
||||||
|
"%s: E1 (id=%d) newstate %x\n",
|
||||||
|
@@ -3851,31 +3861,35 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||||
|
if (debug & DEBUG_HFCMULTI_INIT)
|
||||||
|
printk(KERN_DEBUG "%s: entered\n", __func__);
|
||||||
|
|
||||||
|
+ i = dch->slot;
|
||||||
|
+ pt = hc->chan[i].port;
|
||||||
|
if (hc->ctype == HFC_TYPE_E1) {
|
||||||
|
- hc->chan[hc->dslot].slot_tx = -1;
|
||||||
|
- hc->chan[hc->dslot].slot_rx = -1;
|
||||||
|
- hc->chan[hc->dslot].conf = -1;
|
||||||
|
- if (hc->dslot) {
|
||||||
|
- mode_hfcmulti(hc, hc->dslot, dch->dev.D.protocol,
|
||||||
|
+ /* E1 */
|
||||||
|
+#warning todo: don''t do it if dnum == 0
|
||||||
|
+ hc->chan[hc->dnum[pt]].slot_tx = -1;
|
||||||
|
+ hc->chan[hc->dnum[pt]].slot_rx = -1;
|
||||||
|
+ hc->chan[hc->dnum[pt]].conf = -1;
|
||||||
|
+ if (hc->dnum[pt]) {
|
||||||
|
+ mode_hfcmulti(hc, dch->slot, dch->dev.D.protocol,
|
||||||
|
-1, 0, -1, 0);
|
||||||
|
dch->timer.function = (void *) hfcmulti_dbusy_timer;
|
||||||
|
dch->timer.data = (long) dch;
|
||||||
|
init_timer(&dch->timer);
|
||||||
|
}
|
||||||
|
for (i = 1; i <= 31; i++) {
|
||||||
|
- if (i == hc->dslot)
|
||||||
|
+ if (!((1 << i) & hc->bmask[pt])) /* skip unused channel */
|
||||||
|
continue;
|
||||||
|
hc->chan[i].slot_tx = -1;
|
||||||
|
hc->chan[i].slot_rx = -1;
|
||||||
|
hc->chan[i].conf = -1;
|
||||||
|
mode_hfcmulti(hc, i, ISDN_P_NONE, -1, 0, -1, 0);
|
||||||
|
}
|
||||||
|
- /* E1 */
|
||||||
|
- if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dslot].cfg)) {
|
||||||
|
+#warning todo (global)
|
||||||
|
+ if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[pt]].cfg)) {
|
||||||
|
HFC_outb(hc, R_LOS0, 255); /* 2 ms */
|
||||||
|
HFC_outb(hc, R_LOS1, 255); /* 512 ms */
|
||||||
|
}
|
||||||
|
- if (test_bit(HFC_CFG_OPTICAL, &hc->chan[hc->dslot].cfg)) {
|
||||||
|
+ if (test_bit(HFC_CFG_OPTICAL, &hc->chan[hc->dnum[pt]].cfg)) {
|
||||||
|
HFC_outb(hc, R_RX0, 0);
|
||||||
|
hc->hw.r_tx0 = 0 | V_OUT_EN;
|
||||||
|
} else {
|
||||||
|
@@ -3888,12 +3902,12 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||||
|
HFC_outb(hc, R_TX_FR0, 0x00);
|
||||||
|
HFC_outb(hc, R_TX_FR1, 0xf8);
|
||||||
|
|
||||||
|
- if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dslot].cfg))
|
||||||
|
+ if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[pt]].cfg))
|
||||||
|
HFC_outb(hc, R_TX_FR2, V_TX_MF | V_TX_E | V_NEG_E);
|
||||||
|
|
||||||
|
HFC_outb(hc, R_RX_FR0, V_AUTO_RESYNC | V_AUTO_RECO | 0);
|
||||||
|
|
||||||
|
- if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dslot].cfg))
|
||||||
|
+ if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[pt]].cfg))
|
||||||
|
HFC_outb(hc, R_RX_FR1, V_RX_MF | V_RX_MF_SYNC);
|
||||||
|
|
||||||
|
if (dch->dev.D.protocol == ISDN_P_NT_E1) {
|
||||||
|
@@ -3957,7 +3971,7 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||||
|
plxsd_checksync(hc, 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- i = dch->slot;
|
||||||
|
+ /* ST */
|
||||||
|
hc->chan[i].slot_tx = -1;
|
||||||
|
hc->chan[i].slot_rx = -1;
|
||||||
|
hc->chan[i].conf = -1;
|
||||||
|
@@ -3973,8 +3987,6 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||||
|
hc->chan[i - 1].slot_rx = -1;
|
||||||
|
hc->chan[i - 1].conf = -1;
|
||||||
|
mode_hfcmulti(hc, i - 1, ISDN_P_NONE, -1, 0, -1, 0);
|
||||||
|
- /* ST */
|
||||||
|
- pt = hc->chan[i].port;
|
||||||
|
/* select interface */
|
||||||
|
HFC_outb(hc, R_ST_SEL, pt);
|
||||||
|
/* undocumented: delay after R_ST_SEL */
|
||||||
|
@@ -4557,6 +4569,8 @@ release_port(struct hfc_multi *hc, struct dchannel *dch)
|
||||||
|
}
|
||||||
|
/* free channels */
|
||||||
|
for (i = 0; i <= 31; i++) {
|
||||||
|
+ if (!((1 << i) & hc->bmask[pt])) /* skip unused channel */
|
||||||
|
+ continue;
|
||||||
|
if (hc->chan[i].bch) {
|
||||||
|
if (debug & DEBUG_HFCMULTI_INIT)
|
||||||
|
printk(KERN_DEBUG
|
||||||
|
@@ -4680,12 +4694,13 @@ release_card(struct hfc_multi *hc)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
+init_e1_port(struct hfc_multi *hc, struct hm_map *m, int pt)
|
||||||
|
{
|
||||||
|
struct dchannel *dch;
|
||||||
|
struct bchannel *bch;
|
||||||
|
int ch, ret = 0;
|
||||||
|
char name[MISDN_MAX_IDLEN];
|
||||||
|
+ int bcount = 0;
|
||||||
|
|
||||||
|
dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
|
||||||
|
if (!dch)
|
||||||
|
@@ -4698,13 +4713,12 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
(1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
|
||||||
|
dch->dev.D.send = handle_dmsg;
|
||||||
|
dch->dev.D.ctrl = hfcm_dctrl;
|
||||||
|
- dch->dev.nrbchan = (hc->dslot) ? 30 : 31;
|
||||||
|
- dch->slot = hc->dslot;
|
||||||
|
- hc->chan[hc->dslot].dch = dch;
|
||||||
|
- hc->chan[hc->dslot].port = 0;
|
||||||
|
- hc->chan[hc->dslot].nt_timer = -1;
|
||||||
|
+ dch->slot = hc->dnum[pt];
|
||||||
|
+ hc->chan[hc->dnum[pt]].dch = dch;
|
||||||
|
+ hc->chan[hc->dnum[pt]].port = pt;
|
||||||
|
+ hc->chan[hc->dnum[pt]].nt_timer = -1;
|
||||||
|
for (ch = 1; ch <= 31; ch++) {
|
||||||
|
- if (ch == hc->dslot) /* skip dchannel */
|
||||||
|
+ if (!((1 << ch) & hc->bmask[pt])) /* skip unused channel */
|
||||||
|
continue;
|
||||||
|
bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
|
||||||
|
if (!bch) {
|
||||||
|
@@ -4733,7 +4747,10 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
hc->chan[ch].bch = bch;
|
||||||
|
hc->chan[ch].port = 0;
|
||||||
|
set_channelmap(bch->nr, dch->dev.channelmap);
|
||||||
|
+ bcount++;
|
||||||
|
}
|
||||||
|
+ dch->dev.nrbchan = bcount;
|
||||||
|
+#warning todo: must be set globally, and must be a seperate function
|
||||||
|
/* set optical line type */
|
||||||
|
if (port[Port_cnt] & 0x001) {
|
||||||
|
if (!m->opticalsupport) {
|
||||||
|
@@ -4749,7 +4766,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
__func__,
|
||||||
|
HFC_cnt + 1, 1);
|
||||||
|
test_and_set_bit(HFC_CFG_OPTICAL,
|
||||||
|
- &hc->chan[hc->dslot].cfg);
|
||||||
|
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* set LOS report */
|
||||||
|
@@ -4759,7 +4776,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
"LOS report: card(%d) port(%d)\n",
|
||||||
|
__func__, HFC_cnt + 1, 1);
|
||||||
|
test_and_set_bit(HFC_CFG_REPORT_LOS,
|
||||||
|
- &hc->chan[hc->dslot].cfg);
|
||||||
|
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||||
|
}
|
||||||
|
/* set AIS report */
|
||||||
|
if (port[Port_cnt] & 0x008) {
|
||||||
|
@@ -4768,7 +4785,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
"AIS report: card(%d) port(%d)\n",
|
||||||
|
__func__, HFC_cnt + 1, 1);
|
||||||
|
test_and_set_bit(HFC_CFG_REPORT_AIS,
|
||||||
|
- &hc->chan[hc->dslot].cfg);
|
||||||
|
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||||
|
}
|
||||||
|
/* set SLIP report */
|
||||||
|
if (port[Port_cnt] & 0x010) {
|
||||||
|
@@ -4778,7 +4795,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
"card(%d) port(%d)\n",
|
||||||
|
__func__, HFC_cnt + 1, 1);
|
||||||
|
test_and_set_bit(HFC_CFG_REPORT_SLIP,
|
||||||
|
- &hc->chan[hc->dslot].cfg);
|
||||||
|
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||||
|
}
|
||||||
|
/* set RDI report */
|
||||||
|
if (port[Port_cnt] & 0x020) {
|
||||||
|
@@ -4788,7 +4805,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
"card(%d) port(%d)\n",
|
||||||
|
__func__, HFC_cnt + 1, 1);
|
||||||
|
test_and_set_bit(HFC_CFG_REPORT_RDI,
|
||||||
|
- &hc->chan[hc->dslot].cfg);
|
||||||
|
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||||
|
}
|
||||||
|
/* set CRC-4 Mode */
|
||||||
|
if (!(port[Port_cnt] & 0x100)) {
|
||||||
|
@@ -4797,7 +4814,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
" card(%d) port(%d)\n",
|
||||||
|
__func__, HFC_cnt + 1, 1);
|
||||||
|
test_and_set_bit(HFC_CFG_CRC4,
|
||||||
|
- &hc->chan[hc->dslot].cfg);
|
||||||
|
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||||
|
} else {
|
||||||
|
if (debug & DEBUG_HFCMULTI_INIT)
|
||||||
|
printk(KERN_DEBUG "%s: PORT turn off CRC4"
|
||||||
|
@@ -4829,20 +4846,23 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||||
|
}
|
||||||
|
/* set elastic jitter buffer */
|
||||||
|
if (port[Port_cnt] & 0x3000) {
|
||||||
|
- hc->chan[hc->dslot].jitter = (port[Port_cnt]>>12) & 0x3;
|
||||||
|
+ hc->chan[hc->dnum[pt]].jitter = (port[Port_cnt]>>12) & 0x3;
|
||||||
|
if (debug & DEBUG_HFCMULTI_INIT)
|
||||||
|
printk(KERN_DEBUG
|
||||||
|
"%s: PORT set elastic "
|
||||||
|
"buffer to %d: card(%d) port(%d)\n",
|
||||||
|
- __func__, hc->chan[hc->dslot].jitter,
|
||||||
|
+ __func__, hc->chan[hc->dnum[pt]].jitter,
|
||||||
|
HFC_cnt + 1, 1);
|
||||||
|
} else
|
||||||
|
- hc->chan[hc->dslot].jitter = 2; /* default */
|
||||||
|
- snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
|
||||||
|
+ hc->chan[hc->dnum[pt]].jitter = 2; /* default */
|
||||||
|
+ if (hc->ports > 1)
|
||||||
|
+ snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d-%d", HFC_cnt + 1, pt+1);
|
||||||
|
+ else
|
||||||
|
+ snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
|
||||||
|
ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
|
||||||
|
if (ret)
|
||||||
|
goto free_chan;
|
||||||
|
- hc->created[0] = 1;
|
||||||
|
+ hc->created[pt] = 1;
|
||||||
|
return ret;
|
||||||
|
free_chan:
|
||||||
|
release_port(hc, dch);
|
||||||
|
@@ -5009,18 +5029,30 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
|
||||||
|
hc->id = HFC_cnt;
|
||||||
|
hc->pcm = pcm[HFC_cnt];
|
||||||
|
hc->io_mode = iomode[HFC_cnt];
|
||||||
|
+#warning todo: rework module parameters for customizing e1 fragments.... yea, let''s call it: fragments
|
||||||
|
if (dslot[HFC_cnt] < 0 && hc->ctype == HFC_TYPE_E1) {
|
||||||
|
- hc->dslot = 0;
|
||||||
|
+ hc->dnum[0] = 0;
|
||||||
|
printk(KERN_INFO "HFC-E1 card has disabled D-channel, but "
|
||||||
|
"31 B-channels\n");
|
||||||
|
}
|
||||||
|
if (dslot[HFC_cnt] > 0 && dslot[HFC_cnt] < 32
|
||||||
|
&& hc->ctype == HFC_TYPE_E1) {
|
||||||
|
- hc->dslot = dslot[HFC_cnt];
|
||||||
|
+ hc->dnum[0] = dslot[HFC_cnt];
|
||||||
|
printk(KERN_INFO "HFC-E1 card has alternating D-channel on "
|
||||||
|
"time slot %d\n", dslot[HFC_cnt]);
|
||||||
|
} else
|
||||||
|
- hc->dslot = 16;
|
||||||
|
+ hc->dnum[0] = 16;
|
||||||
|
+
|
||||||
|
+#warning todo HACK!!! just a small map of two "fragments"
|
||||||
|
+ if (hc->ctype == HFC_TYPE_E1) {
|
||||||
|
+ hc->dnum[0] = 1;
|
||||||
|
+ hc->bmask[0] = 0x0000003c;
|
||||||
|
+ hc->dnum[1] = 6;
|
||||||
|
+ hc->bmask[1] = 0x00000780;
|
||||||
|
+ hc->dnum[2] = 11;
|
||||||
|
+ hc->bmask[2] = 0x00007800;
|
||||||
|
+ hc->ports = 3;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* set chip specific features */
|
||||||
|
hc->masterclk = -1;
|
||||||
|
@@ -5103,7 +5135,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
|
||||||
|
goto free_card;
|
||||||
|
}
|
||||||
|
if (hc->ctype == HFC_TYPE_E1)
|
||||||
|
- ret_err = init_e1_port(hc, m);
|
||||||
|
+ ret_err = init_e1_port(hc, m, pt);
|
||||||
|
else
|
||||||
|
ret_err = init_multi_port(hc, pt);
|
||||||
|
if (debug & DEBUG_HFCMULTI_INIT)
|
||||||
|
@@ -5115,10 +5147,14 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
|
||||||
|
if (ret_err) {
|
||||||
|
while (pt) { /* release already registered ports */
|
||||||
|
pt--;
|
||||||
|
- release_port(hc, hc->chan[(pt << 2) + 2].dch);
|
||||||
|
+ if (hc->ctype == HFC_TYPE_E1)
|
||||||
|
+ release_port(hc, hc->chan[hc->dnum[pt]].dch);
|
||||||
|
+ else
|
||||||
|
+ release_port(hc, hc->chan[(pt << 2) + 2].dch);
|
||||||
|
}
|
||||||
|
goto free_card;
|
||||||
|
}
|
||||||
|
+#warning todo: count it right, add additional "fragment" counter...
|
||||||
|
Port_cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
52
openbsc/.gitignore
vendored
52
openbsc/.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
*.o
|
*.o
|
||||||
*.lo
|
|
||||||
*.a
|
*.a
|
||||||
.deps
|
.deps
|
||||||
Makefile
|
Makefile
|
||||||
@@ -8,35 +7,21 @@ bscconfig.h
|
|||||||
bscconfig.h.in
|
bscconfig.h.in
|
||||||
openbsc.pc
|
openbsc.pc
|
||||||
src/osmo-nitb/osmo-nitb
|
src/osmo-nitb/osmo-nitb
|
||||||
src/osmo-bsc_mgcp/osmo-bsc_mgcp
|
bsc_mgcp
|
||||||
src/osmo-bsc/osmo-bsc
|
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?
|
*.sw?
|
||||||
.libs
|
|
||||||
*.pyc
|
|
||||||
*.gcda
|
|
||||||
*.gcno
|
|
||||||
|
|
||||||
#configure
|
#configure
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache/
|
autom4te.cache/
|
||||||
config.log
|
config.log
|
||||||
config.status
|
config.status
|
||||||
config.guess
|
|
||||||
config.sub
|
|
||||||
configure
|
configure
|
||||||
compile
|
|
||||||
depcomp
|
depcomp
|
||||||
install-sh
|
install-sh
|
||||||
missing
|
missing
|
||||||
stamp-h1
|
stamp-h1
|
||||||
libtool
|
|
||||||
ltmain.sh
|
|
||||||
|
|
||||||
# git-version-gen magic
|
# git-version-gen magic
|
||||||
.tarball-version
|
.tarball-version
|
||||||
@@ -47,21 +32,17 @@ ltmain.sh
|
|||||||
hlr.sqlite3
|
hlr.sqlite3
|
||||||
src/utils/bs11_config
|
src/utils/bs11_config
|
||||||
src/ipaccess/ipaccess-config
|
src/ipaccess/ipaccess-config
|
||||||
src/ipaccess/abisip-find
|
src/ipaccess/ipaccess-find
|
||||||
src/ipaccess/ipaccess-firmware
|
src/ipaccess/ipaccess-firmware
|
||||||
src/ipaccess/ipaccess-proxy
|
src/ipaccess/ipaccess-proxy
|
||||||
src/utils/isdnsync
|
src/utils/isdnsync
|
||||||
src/nat/bsc_nat
|
src/nat/bsc_nat
|
||||||
src/gprs/osmo-sgsn
|
src/gprs/osmo-sgsn
|
||||||
src/gprs/osmo-gbproxy
|
src/gprs/osmo-gbproxy
|
||||||
src/gprs/osmo-gtphub
|
|
||||||
src/osmo-bsc_nat/osmo-bsc_nat
|
src/osmo-bsc_nat/osmo-bsc_nat
|
||||||
src/libcommon/gsup_test_client
|
|
||||||
|
|
||||||
#tests
|
#tests
|
||||||
tests/testsuite.dir
|
|
||||||
tests/bsc-nat/bsc_nat_test
|
tests/bsc-nat/bsc_nat_test
|
||||||
tests/bsc-nat-trie/bsc_nat_trie_test
|
|
||||||
tests/channel/channel_test
|
tests/channel/channel_test
|
||||||
tests/db/db_test
|
tests/db/db_test
|
||||||
tests/debug/debug_test
|
tests/debug/debug_test
|
||||||
@@ -70,34 +51,5 @@ tests/mgcp/mgcp_test
|
|||||||
tests/sccp/sccp_test
|
tests/sccp/sccp_test
|
||||||
tests/sms/sms_test
|
tests/sms/sms_test
|
||||||
tests/timer/timer_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/subscr/bsc_subscr_test
|
|
||||||
tests/oap/oap_test
|
|
||||||
tests/gtphub/gtphub_test
|
|
||||||
tests/mm_auth/mm_auth_test
|
|
||||||
tests/xid/xid_test
|
|
||||||
tests/sndcp_xid/sndcp_xid_test
|
|
||||||
tests/slhc/slhc_test
|
|
||||||
tests/v42bis/v42bis_test
|
|
||||||
tests/nanobts_omlattr/nanobts_omlattr_test
|
|
||||||
tests/oap/oap_client_test
|
|
||||||
|
|
||||||
tests/atconfig
|
|
||||||
tests/atlocal
|
|
||||||
tests/package.m4
|
|
||||||
tests/testsuite
|
|
||||||
tests/testsuite.log
|
|
||||||
|
|
||||||
gsn_restart
|
|
||||||
src/openbsc.cfg*
|
src/openbsc.cfg*
|
||||||
writtenconfig/
|
|
||||||
gtphub_restart_count
|
|
||||||
|
|||||||
@@ -5,5 +5,3 @@ Stefan Schmidt <stefan@datenfreihafen.org>
|
|||||||
Daniel Willmann <daniel@totalueberwachung.de>
|
Daniel Willmann <daniel@totalueberwachung.de>
|
||||||
Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
||||||
Sylvain Munaut <246tnt@gmail.com>
|
Sylvain Munaut <246tnt@gmail.com>
|
||||||
Jacob Erlbeck <jerlbeck@sysmocom.de>
|
|
||||||
Neels Hofmeyr <nhofmeyr@sysmocom.de>
|
|
||||||
|
|||||||
@@ -1,25 +1,13 @@
|
|||||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
|
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
|
INCLUDES = $(all_includes) -I$(top_srcdir)/include
|
||||||
## remove line below when OE toolchain is updated to version which include those
|
SUBDIRS = doc include src tests
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
AM_CPPFLAGS = \
|
|
||||||
$(all_includes) \
|
|
||||||
-I$(top_srcdir)/include \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
SUBDIRS = \
|
|
||||||
doc \
|
|
||||||
include \
|
|
||||||
src \
|
|
||||||
tests \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = openbsc.pc
|
pkgconfig_DATA = openbsc.pc
|
||||||
|
|
||||||
BUILT_SOURCES = $(top_srcdir)/.version
|
BUILT_SOURCES = $(top_srcdir)/.version
|
||||||
EXTRA_DIST = git-version-gen osmoappdesc.py .version
|
EXTRA_DIST = git-version-gen
|
||||||
$(top_srcdir)/.version:
|
$(top_srcdir)/.version:
|
||||||
echo $(VERSION) > $@-t && mv $@-t $@
|
echo $(VERSION) > $@-t && mv $@-t $@
|
||||||
dist-hook:
|
dist-hook:
|
||||||
|
|||||||
@@ -1,39 +1,32 @@
|
|||||||
About OpenBSC
|
About OpenBSC
|
||||||
=============
|
=============
|
||||||
|
|
||||||
OpenBSC started as a minimalistic all-in-one implementation of the GSM Network,
|
OpenBSC is a minimalistic implementation of the GSM Network, with
|
||||||
with particular emphasis on the functionality typically provided by the BSC,
|
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,
|
MSC, HLR, VLR and SMSC.
|
||||||
implementing protocol stacks and functional elements, including
|
|
||||||
|
|
||||||
* OsmoBSC - a pure GSM BSC, speaking Abis/IP to the BTS and A/IP to the MSC
|
Its currently supported interfaces towards the BTS are:
|
||||||
* OsmoBSC-MGCP - MGCP helper to the OsmoBSC software
|
|
||||||
* OsmoNITB - a BSC+MSC+VLR+HLR+SMSC "Network in the box".
|
|
||||||
* OsmoMSC - 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
|
* Classic A-bis over E1 using a mISDN based E1 interface. In other
|
||||||
words, you can connect existing GSM Base Transceiver Station (BTS)
|
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,
|
through E1 to OpenBSC. So far, we have only tested the Siemens BS-11
|
||||||
various Ericsson RBS2xxx BTS models and the Nokia MetroSite.
|
Test reports with other BTS are much appreciated!
|
||||||
|
|
||||||
* A-bis over IP as used by the ip.access nanoBTS product family as well as
|
* A-bis over IP as used by the ip.access nanoBTS product family
|
||||||
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)
|
You can find the project documentation at http://openbsc.gnumonks.org/
|
||||||
voice and data links.
|
|
||||||
|
|
||||||
Find OpenBSC online at
|
This project is still in its early days, and there are lots of areas where it
|
||||||
http://openbsc.osmocom.org/
|
doesn't behave as per GSM spec.
|
||||||
|
|
||||||
Harald Welte <laforge@gnumonks.org>
|
Harald Welte <laforge@gnumonks.org>
|
||||||
|
|
||||||
|
|
||||||
|
libosmocore
|
||||||
|
===========
|
||||||
|
|
||||||
|
Please note that as of March 2010, OpenBSC has a dependency to a library
|
||||||
|
called "libosmocore". You can obtain that library from
|
||||||
|
|
||||||
|
git://git.osmocom.org/libosmocore.git
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
To run the configuration parsing and output (VTY) test suite, first install
|
|
||||||
|
|
||||||
git://git.osmocom.org/python/osmo-python-tests
|
|
||||||
|
|
||||||
and pass the following configure options here:
|
|
||||||
|
|
||||||
./configure --enable-vty-tests --enable-external-tests
|
|
||||||
|
|
||||||
The VTY tests are then included in the standard check target:
|
|
||||||
|
|
||||||
make check
|
|
||||||
@@ -1,13 +1,9 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script
|
dnl Process this file with autoconf to produce a configure script
|
||||||
AC_INIT([openbsc],
|
AC_INIT([openbsc],
|
||||||
m4_esyscmd([./git-version-gen .tarball-version]),
|
m4_esyscmd([./git-version-gen .tarball-version]),
|
||||||
[openbsc@lists.osmocom.org])
|
[openbsc-devel@lists.openbsc.org])
|
||||||
|
|
||||||
dnl *This* is the root dir, even if an install-sh exists in ../ or ../../
|
|
||||||
AC_CONFIG_AUX_DIR([.])
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||||
AC_CONFIG_TESTDIR(tests)
|
|
||||||
|
|
||||||
dnl kernel style compile messages
|
dnl kernel style compile messages
|
||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
@@ -16,124 +12,46 @@ dnl checks for programs
|
|||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
LT_INIT
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
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
|
dnl checks for libraries
|
||||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
|
AC_SEARCH_LIBS(crypt, crypt,
|
||||||
AC_SUBST(LIBRARY_DL)
|
[LIBCRYPT="-lcrypt"; AC_DEFINE([VTY_CRYPT_PW], [], [Use crypt functionality of vty.])])
|
||||||
|
AC_SEARCH_LIBS(gtp_new, gtp,
|
||||||
|
[LIBCRYPT="-lgtp"; AC_SUBST([GPRS_LIBGTP], [1])])
|
||||||
|
|
||||||
|
AM_CONDITIONAL(HAVE_LIBGTP, test "x$GPRS_LIBGTP" != "x")
|
||||||
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.9.5)
|
|
||||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0)
|
|
||||||
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl)
|
|
||||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.9.5)
|
|
||||||
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)
|
|
||||||
|
|
||||||
# Enabke/disable the NAT?
|
|
||||||
AC_ARG_ENABLE([nat], [AS_HELP_STRING([--enable-nat], [Build the BSC NAT. Requires SCCP])],
|
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)
|
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.2)
|
||||||
fi
|
osmo_ac_build_nat="yes"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
osmo_ac_build_nat="no"
|
||||||
|
])
|
||||||
AM_CONDITIONAL(BUILD_NAT, test "x$osmo_ac_build_nat" = "xyes")
|
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])],
|
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)
|
||||||
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.6)
|
osmo_ac_build_bsc="yes"
|
||||||
fi
|
],
|
||||||
|
[
|
||||||
|
osmo_ac_build_bsc="no"
|
||||||
|
])
|
||||||
AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes")
|
AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes")
|
||||||
AC_SUBST(osmo_ac_build_bsc)
|
|
||||||
|
|
||||||
# Enable/disable smpp support in the nitb?
|
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.2)
|
||||||
AC_ARG_ENABLE([smpp], [AS_HELP_STRING([--enable-smpp], [Build the SMPP interface])],
|
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0)
|
||||||
[osmo_ac_build_smpp="$enableval"],[osmo_ac_build_smpp="no"])
|
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.3.0)
|
||||||
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_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)
|
|
||||||
|
|
||||||
# Enable/disable 3G aka IuPS + IuCS support?
|
|
||||||
AC_ARG_ENABLE([iu], [AS_HELP_STRING([--enable-iu], [Build 3G support, aka IuPS and IuCS interfaces])],
|
|
||||||
[osmo_ac_iu="$enableval"],[osmo_ac_iu="no"])
|
|
||||||
if test "x$osmo_ac_iu" = "xyes" ; then
|
|
||||||
PKG_CHECK_MODULES(LIBASN1C, libasn1c) # TODO version?
|
|
||||||
PKG_CHECK_MODULES(LIBOSMORANAP, libosmo-ranap) # TODO version?
|
|
||||||
PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran) # TODO version?
|
|
||||||
AC_DEFINE(BUILD_IU, 1, [Define if we want to build IuPS and IuCS interfaces support])
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(BUILD_IU, test "x$osmo_ac_iu" = "xyes")
|
|
||||||
AC_SUBST(osmo_ac_iu)
|
|
||||||
|
|
||||||
|
|
||||||
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
|
dnl checks for header files
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built))
|
||||||
AC_CHECK_HEADERS(dbi/dbd.h,,AC_MSG_ERROR(DBI library is not installed))
|
AC_CHECK_HEADERS(dbi/dbd.h,,AC_MSG_ERROR(DBI library is not installed))
|
||||||
|
|
||||||
found_pcap=yes
|
|
||||||
AC_CHECK_HEADERS(pcap/pcap.h,,found_pcap=no)
|
|
||||||
AM_CONDITIONAL(HAVE_PCAP, test "$found_pcap" = yes)
|
|
||||||
|
|
||||||
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
|
dnl Checks for typedefs, structures and compiler characteristics
|
||||||
|
|
||||||
@@ -148,13 +66,6 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
|||||||
CFLAGS="$saved_CFLAGS"
|
CFLAGS="$saved_CFLAGS"
|
||||||
AC_SUBST(SYMBOL_VISIBILITY)
|
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
|
# Coverage build taken from WebKit's configure.in
|
||||||
AC_MSG_CHECKING([whether to enable code coverage support])
|
AC_MSG_CHECKING([whether to enable code coverage support])
|
||||||
AC_ARG_ENABLE(coverage,
|
AC_ARG_ENABLE(coverage,
|
||||||
@@ -169,50 +80,6 @@ if test "$enable_coverage" = "yes"; then
|
|||||||
AC_SUBST([COVERAGE_LDFLAGS])
|
AC_SUBST([COVERAGE_LDFLAGS])
|
||||||
fi
|
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
|
dnl Generate the output
|
||||||
AM_CONFIG_HEADER(bscconfig.h)
|
AM_CONFIG_HEADER(bscconfig.h)
|
||||||
@@ -223,44 +90,27 @@ AC_OUTPUT(
|
|||||||
include/Makefile
|
include/Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libtrau/Makefile
|
src/libtrau/Makefile
|
||||||
|
src/libabis/Makefile
|
||||||
src/libbsc/Makefile
|
src/libbsc/Makefile
|
||||||
|
src/libctrl/Makefile
|
||||||
src/libmsc/Makefile
|
src/libmsc/Makefile
|
||||||
src/libmgcp/Makefile
|
src/libmgcp/Makefile
|
||||||
src/libcommon/Makefile
|
src/libcommon/Makefile
|
||||||
src/libfilter/Makefile
|
|
||||||
src/libiu/Makefile
|
|
||||||
src/libcommon-cs/Makefile
|
|
||||||
src/osmo-nitb/Makefile
|
src/osmo-nitb/Makefile
|
||||||
src/osmo-bsc/Makefile
|
src/osmo-bsc/Makefile
|
||||||
src/osmo-bsc_nat/Makefile
|
src/osmo-bsc_nat/Makefile
|
||||||
src/osmo-bsc_mgcp/Makefile
|
src/osmo-bsc_mgcp/Makefile
|
||||||
src/ipaccess/Makefile
|
src/ipaccess/Makefile
|
||||||
src/utils/Makefile
|
src/utils/Makefile
|
||||||
|
src/libgb/Makefile
|
||||||
src/gprs/Makefile
|
src/gprs/Makefile
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
tests/atlocal
|
tests/debug/Makefile
|
||||||
tests/gsm0408/Makefile
|
tests/gsm0408/Makefile
|
||||||
tests/db/Makefile
|
tests/db/Makefile
|
||||||
tests/channel/Makefile
|
tests/channel/Makefile
|
||||||
tests/bsc/Makefile
|
|
||||||
tests/bsc-nat/Makefile
|
tests/bsc-nat/Makefile
|
||||||
tests/bsc-nat-trie/Makefile
|
|
||||||
tests/mgcp/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
|
|
||||||
tests/xid/Makefile
|
|
||||||
tests/sndcp_xid/Makefile
|
|
||||||
tests/slhc/Makefile
|
|
||||||
tests/v42bis/Makefile
|
|
||||||
tests/nanobts_omlattr/Makefile
|
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/examples/Makefile
|
doc/examples/Makefile
|
||||||
Makefile)
|
Makefile)
|
||||||
|
|||||||
@@ -1,120 +1,104 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- 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 sys,os
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
from ipa import Ctrl
|
|
||||||
import socket
|
import socket
|
||||||
|
import struct
|
||||||
|
|
||||||
verbose = False
|
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):
|
def connect(host, port):
|
||||||
if verbose:
|
if verbose:
|
||||||
print "Connecting to host %s:%i" % (host, port)
|
print "Connecting to host %s:%i" % (host, port)
|
||||||
|
|
||||||
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
sck.setblocking(1)
|
sck.setblocking(1)
|
||||||
sck.connect((host, port))
|
sck.connect((host, port))
|
||||||
return sck
|
return sck
|
||||||
|
|
||||||
def do_set_get(sck, var, value = None):
|
def send(sck, data):
|
||||||
(r, c) = Ctrl().cmd(var, value)
|
if verbose:
|
||||||
sck.send(c)
|
print "Sending \"%s\"" %(data)
|
||||||
answer = Ctrl().rem_header(sck.recv(4096))
|
data = prefix_ipa_ctrl_header(data)
|
||||||
return (answer,) + Ctrl().verify(answer, r, var, value)
|
sck.send(data)
|
||||||
|
|
||||||
def set_var(sck, var, val):
|
def do_set(var, value, id, sck):
|
||||||
(a, _, _) = do_set_get(sck, var, val)
|
setmsg = "SET %s %s %s" %(options.id, var, value)
|
||||||
return a
|
send(sck, setmsg)
|
||||||
|
|
||||||
def get_var(sck, var):
|
def do_get(var, id, sck):
|
||||||
(_, _, v) = do_set_get(sck, var)
|
getmsg = "GET %s %s" %(options.id, var)
|
||||||
return v
|
send(sck, getmsg)
|
||||||
|
|
||||||
def _leftovers(sck, fl):
|
parser = OptionParser("Usage: %prog [options] var [value]")
|
||||||
"""
|
parser.add_option("-d", "--host", dest="host",
|
||||||
Read outstanding data if any according to flags
|
help="connect to HOST", metavar="HOST")
|
||||||
"""
|
parser.add_option("-p", "--port", dest="port", type="int",
|
||||||
try:
|
help="use PORT", metavar="PORT", default=4249)
|
||||||
data = sck.recv(1024, fl)
|
parser.add_option("-g", "--get", action="store_true",
|
||||||
except socket.error as (s_errno, strerror):
|
dest="cmd_get", help="perform GET operation")
|
||||||
return False
|
parser.add_option("-s", "--set", action="store_true",
|
||||||
if len(data) != 0:
|
dest="cmd_set", help="perform SET operation")
|
||||||
tail = data
|
parser.add_option("-i", "--id", dest="id", default="1",
|
||||||
while True:
|
help="set id manually", metavar="ID")
|
||||||
(head, tail) = Ctrl().split_combined(tail)
|
parser.add_option("-v", "--verbose", action="store_true",
|
||||||
print "Got message:", Ctrl().rem_header(head)
|
dest="verbose", help="be verbose", default=False)
|
||||||
if len(tail) == 0:
|
parser.add_option("-m", "--monitor", action="store_true",
|
||||||
break
|
dest="monitor", help="monitor the connection for traps", default=False)
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
(options, args) = parser.parse_args()
|
||||||
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("-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
|
||||||
|
|
||||||
verbose = options.verbose
|
if options.cmd_set and options.cmd_get:
|
||||||
|
parser.error("Get and set options are mutually exclusive!")
|
||||||
|
|
||||||
if options.cmd_set and options.cmd_get:
|
if not (options.cmd_get or options.cmd_set or options.monitor):
|
||||||
parser.error("Get and set options are mutually exclusive!")
|
parser.error("One of -m, -g, or -s must be set")
|
||||||
|
|
||||||
if not (options.cmd_get or options.cmd_set or options.monitor):
|
if not (options.host):
|
||||||
parser.error("One of -m, -g, or -s must be set")
|
parser.error("Destination host and port required!")
|
||||||
|
|
||||||
if not (options.host):
|
sock = connect(options.host, options.port)
|
||||||
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_set:
|
if options.cmd_get:
|
||||||
if len(args) < 2:
|
if len(args) != 1:
|
||||||
parser.error("Set requires var and value arguments")
|
parser.error("Get requires the var argument")
|
||||||
_leftovers(sock, socket.MSG_DONTWAIT)
|
do_get(args[0], options.id, sock)
|
||||||
print "Got message:", set_var(sock, args[0], ' '.join(args[1:]))
|
|
||||||
|
|
||||||
if options.cmd_get:
|
data = sock.recv(1024)
|
||||||
if len(args) != 1:
|
while (len(data)>0):
|
||||||
parser.error("Get requires the var argument")
|
(answer, data) = remove_ipa_ctrl_header(data)
|
||||||
_leftovers(sock, socket.MSG_DONTWAIT)
|
print "Got message:", answer
|
||||||
(a, _, _) = do_set_get(sock, args[0])
|
|
||||||
print "Got message:", a
|
|
||||||
|
|
||||||
if options.monitor:
|
if options.monitor:
|
||||||
while True:
|
while (True):
|
||||||
if not _leftovers(sock, 0):
|
data = sock.recv(1024)
|
||||||
print "Connection is gone."
|
if len(data) == 0:
|
||||||
break
|
print "Connection is gone."
|
||||||
sock.close()
|
break
|
||||||
|
|
||||||
|
while (len(data)>0):
|
||||||
|
(answer, data) = remove_ipa_ctrl_header(data)
|
||||||
|
print "Got message:", answer
|
||||||
|
|
||||||
|
sock.close()
|
||||||
|
|||||||
@@ -1,147 +0,0 @@
|
|||||||
#!/usr/bin/python2
|
|
||||||
|
|
||||||
mod_license = '''
|
|
||||||
/*
|
|
||||||
* 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 sys, argparse, random, logging, tornado.ioloop, tornado.web, tornado.tcpclient, tornado.httpclient, eventsource, bsc_control
|
|
||||||
from eventsource import listener, request
|
|
||||||
|
|
||||||
'''
|
|
||||||
N. B: this is not an example of building proper REST API or building secure web application.
|
|
||||||
It's only purpose is to illustrate conversion of Osmocom's Control Interface to web-friendly API.
|
|
||||||
Exposing this to Internet while connected to production network might lead to all sorts of mischief and mayhem
|
|
||||||
from NSA' TAO breaking into your network to zombie apocalypse. Do NOT do that.
|
|
||||||
'''
|
|
||||||
|
|
||||||
token = None
|
|
||||||
stream = None
|
|
||||||
url = None
|
|
||||||
|
|
||||||
'''
|
|
||||||
Returns json according to following schema - see http://json-schema.org/documentation.html for details:
|
|
||||||
{
|
|
||||||
"title": "Ctrl Schema",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"variable": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"varlue": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"required": ["interface", "variable", "value"]
|
|
||||||
}
|
|
||||||
Example validation from command-line:
|
|
||||||
json validate --schema-file=schema.json --document-file=data.json
|
|
||||||
The interface is represented as string because it might look different for IPv4 vs v6.
|
|
||||||
'''
|
|
||||||
|
|
||||||
def read_header(data):
|
|
||||||
t_length = bsc_control.ipa_ctrl_header(data)
|
|
||||||
if (t_length):
|
|
||||||
stream.read_bytes(t_length - 1, callback = read_trap)
|
|
||||||
else:
|
|
||||||
print >> sys.stderr, "protocol error: length missing in %s!" % data
|
|
||||||
|
|
||||||
@tornado.gen.coroutine
|
|
||||||
def read_trap(data):
|
|
||||||
(t, z, v, p) = data.split()
|
|
||||||
if (t != 'TRAP' or int(z) != 0):
|
|
||||||
print >> sys.stderr, "protocol error: TRAP != %s or 0! = %d" % (t, int(z))
|
|
||||||
else:
|
|
||||||
yield tornado.httpclient.AsyncHTTPClient().fetch(tornado.httpclient.HTTPRequest(url = "%s/%s/%s" % (url, "ping", token),
|
|
||||||
method = 'POST',
|
|
||||||
headers = {'Content-Type': 'application/json'},
|
|
||||||
body = tornado.escape.json_encode({ 'variable' : v, 'value' : p })))
|
|
||||||
stream.read_bytes(4, callback = read_header)
|
|
||||||
|
|
||||||
@tornado.gen.coroutine
|
|
||||||
def trap_setup(host, port, target_host, target_port, tk):
|
|
||||||
global stream
|
|
||||||
global url
|
|
||||||
global token
|
|
||||||
token = tk
|
|
||||||
url = "http://%s:%s/sse" % (host, port)
|
|
||||||
stream = yield tornado.tcpclient.TCPClient().connect(target_host, target_port)
|
|
||||||
stream.read_bytes(4, callback = read_header)
|
|
||||||
|
|
||||||
def get_v(s, v):
|
|
||||||
return { 'variable' : v, 'value' : bsc_control.get_var(s, tornado.escape.native_str(v)) }
|
|
||||||
|
|
||||||
class CtrlHandler(tornado.web.RequestHandler):
|
|
||||||
def initialize(self):
|
|
||||||
self.skt = bsc_control.connect(self.settings['ctrl_host'], self.settings['ctrl_port'])
|
|
||||||
|
|
||||||
def get(self, v):
|
|
||||||
self.write(get_v(self.skt, v))
|
|
||||||
|
|
||||||
def post(self):
|
|
||||||
self.write(get_v(self.skt, self.get_argument("variable")))
|
|
||||||
|
|
||||||
class SetCtrl(CtrlHandler):
|
|
||||||
def get(self, var, val):
|
|
||||||
bsc_control.set_var(self.skt, tornado.escape.native_str(var), tornado.escape.native_str(val))
|
|
||||||
super(SetCtrl, self).get(tornado.escape.native_str(var))
|
|
||||||
|
|
||||||
def post(self):
|
|
||||||
bsc_control.set_var(self.skt, tornado.escape.native_str(self.get_argument("variable")), tornado.escape.native_str(self.get_argument("value")))
|
|
||||||
super(SetCtrl, self).post()
|
|
||||||
|
|
||||||
class Slash(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
self.write('<html><head><title>%s</title></head><body>Using Tornado framework v%s'
|
|
||||||
'<form action="/get" method="POST">'
|
|
||||||
'<input type="text" name="variable">'
|
|
||||||
'<input type="submit" value="GET">'
|
|
||||||
'</form>'
|
|
||||||
'<form action="/set" method="POST">'
|
|
||||||
'<input type="text" name="variable">'
|
|
||||||
'<input type="text" name="value">'
|
|
||||||
'<input type="submit" value="SET">'
|
|
||||||
'</form>'
|
|
||||||
'</body></html>' % ("Osmocom Control Interface Proxy", tornado.version))
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
p = argparse.ArgumentParser(description='Osmocom Control Interface proxy.')
|
|
||||||
p.add_argument('-c', '--control-port', type = int, default = 4252, help = "Target Control Interface port")
|
|
||||||
p.add_argument('-a', '--control-host', default = 'localhost', help = "Target Control Interface adress")
|
|
||||||
p.add_argument('-b', '--host', default = 'localhost', help = "Adress to bind proxy's web interface")
|
|
||||||
p.add_argument('-p', '--port', type = int, default = 6969, help = "Port to bind proxy's web interface")
|
|
||||||
p.add_argument('-d', '--debug', action='store_true', help = "Activate debugging (default off)")
|
|
||||||
p.add_argument('-t', '--token', default = 'osmocom', help = "Token to be used by SSE client in URL e. g. http://127.0.0.1:8888/poll/osmocom where 'osmocom' is default token value")
|
|
||||||
p.add_argument('-k', '--keepalive', type = int, default = 5000, help = "Timeout betwwen keepalive messages, in milliseconds, defaults to 5000")
|
|
||||||
args = p.parse_args()
|
|
||||||
random.seed()
|
|
||||||
tornado.netutil.Resolver.configure('tornado.netutil.ThreadedResolver') # Use non-blocking resolver
|
|
||||||
logging.basicConfig()
|
|
||||||
application = tornado.web.Application([
|
|
||||||
(r"/", Slash),
|
|
||||||
(r"/get", CtrlHandler),
|
|
||||||
(r"/get/(.*)", CtrlHandler),
|
|
||||||
(r"/set", SetCtrl),
|
|
||||||
(r"/set/(.*)/(.*)", SetCtrl),
|
|
||||||
(r"/sse/(.*)/(.*)", listener.EventSourceHandler, dict(event_class = listener.JSONIdEvent, keepalive = args.keepalive)),
|
|
||||||
], debug = args.debug, ctrl_host = args.control_host, ctrl_port = args.control_port)
|
|
||||||
application.listen(address = args.host, port = args.port)
|
|
||||||
trap_setup(args.host, args.port, application.settings['ctrl_host'], application.settings['ctrl_port'], args.token)
|
|
||||||
tornado.ioloop.IOLoop.instance().start()
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
-- 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;
|
|
||||||
@@ -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,65 +0,0 @@
|
|||||||
#!/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)
|
|
||||||
@@ -1,420 +0,0 @@
|
|||||||
#!/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.
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
"
|
|
||||||
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.
|
|
||||||
]
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
"
|
|
||||||
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.
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
"""
|
|
||||||
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.
|
|
||||||
]
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -1,188 +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.
|
|
||||||
*/
|
|
||||||
"""
|
|
||||||
|
|
||||||
__version__ = "v0.7" # bump this on every non-trivial change
|
|
||||||
|
|
||||||
from twisted.internet import defer, reactor
|
|
||||||
from twisted_ipa import CTRL, IPAFactory, __version__ as twisted_ipa_version
|
|
||||||
from ipa import Ctrl
|
|
||||||
from treq import post, collect
|
|
||||||
from suds.client import Client
|
|
||||||
from functools import partial
|
|
||||||
from distutils.version import StrictVersion as V # FIXME: use NormalizedVersion from PEP-386 when available
|
|
||||||
import argparse, datetime, signal, sys, os, logging, logging.handlers
|
|
||||||
|
|
||||||
# we don't support older versions of TwistedIPA module
|
|
||||||
assert V(twisted_ipa_version) > V('0.4')
|
|
||||||
|
|
||||||
# keys from OpenBSC openbsc/src/libbsc/bsc_rf_ctrl.c, values SOAP-specific
|
|
||||||
oper = { 'inoperational' : 0, 'operational' : 1 }
|
|
||||||
admin = { 'locked' : 0, 'unlocked' : 1 }
|
|
||||||
policy = { 'off' : 0, 'on' : 1, 'grace' : 2, 'unknown' : 3 }
|
|
||||||
|
|
||||||
# keys from OpenBSC openbsc/src/libbsc/bsc_vty.c
|
|
||||||
fix = { 'invalid' : 0, 'fix2d' : 1, 'fix3d' : 1 } # SOAP server treats it as boolean but expects int
|
|
||||||
|
|
||||||
|
|
||||||
def handle_reply(p, f, log, r):
|
|
||||||
"""
|
|
||||||
Reply handler: takes function p to process raw SOAP server reply r, function f to run for each command and verbosity flag v
|
|
||||||
"""
|
|
||||||
repl = p(r) # result is expected to have both commands[] array and error string (could be None)
|
|
||||||
bsc_id = repl.commands[0].split()[0].split('.')[3] # we expect 1st command to have net.0.bsc.666.bts.2.trx.1 location prefix format
|
|
||||||
log.info("Received SOAP response for BSC %s with %d commands, error status: %s" % (bsc_id, len(repl.commands), repl.error))
|
|
||||||
log.debug("BSC %s commands: %s" % (bsc_id, repl.commands))
|
|
||||||
for t in repl.commands: # Process OpenBscCommands format from .wsdl
|
|
||||||
(_, m) = Ctrl().cmd(*t.split())
|
|
||||||
f(m)
|
|
||||||
|
|
||||||
|
|
||||||
class Trap(CTRL):
|
|
||||||
"""
|
|
||||||
TRAP handler (agnostic to factory's client object)
|
|
||||||
"""
|
|
||||||
def ctrl_TRAP(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Parse CTRL TRAP and dispatch to appropriate handler after normalization
|
|
||||||
"""
|
|
||||||
(l, r) = v.split()
|
|
||||||
loc = l.split('.')
|
|
||||||
t_type = loc[-1]
|
|
||||||
p = partial(lambda a, i: a[i] if len(a) > i else None, loc) # parse helper
|
|
||||||
method = getattr(self, 'handle_' + t_type.replace('-', ''), lambda: "Unhandled %s trap" % t_type)
|
|
||||||
method(p(1), p(3), p(5), p(7), r) # we expect net.0.bsc.666.bts.2.trx.1 format for trap prefix
|
|
||||||
|
|
||||||
def ctrl_SET_REPLY(self, data, _, v):
|
|
||||||
"""
|
|
||||||
Debug log for replies to our commands
|
|
||||||
"""
|
|
||||||
self.factory.log.debug('SET REPLY %s' % v)
|
|
||||||
|
|
||||||
def ctrl_ERROR(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
We want to know if smth went wrong
|
|
||||||
"""
|
|
||||||
self.factory.log.debug('CTRL ERROR [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def connectionMade(self):
|
|
||||||
"""
|
|
||||||
Logging wrapper, calling super() is necessary not to break reconnection logic
|
|
||||||
"""
|
|
||||||
self.factory.log.info("Connected to CTRL@%s:%d" % (self.factory.host, self.factory.port))
|
|
||||||
super(CTRL, self).connectionMade()
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
|
||||||
def handle_locationstate(self, net, bsc, bts, trx, data):
|
|
||||||
"""
|
|
||||||
Handle location-state TRAP: parse trap content, build SOAP context and use treq's routines to post it while setting up async handlers
|
|
||||||
"""
|
|
||||||
(ts, fx, lat, lon, height, opr, adm, pol, mcc, mnc) = data.split(',')
|
|
||||||
tstamp = datetime.datetime.fromtimestamp(float(ts)).isoformat()
|
|
||||||
self.factory.log.debug('location-state@%s.%s.%s.%s (%s) [%s/%s] => %s' % (net, bsc, bts, trx, tstamp, mcc, mnc, data))
|
|
||||||
ctx = self.factory.client.registerSiteLocation(bsc, float(lon), float(lat), fix.get(fx, 0), tstamp, oper.get(opr, 2), admin.get(adm, 2), policy.get(pol, 3))
|
|
||||||
d = post(self.factory.location, ctx.envelope)
|
|
||||||
d.addCallback(collect, partial(handle_reply, ctx.process_reply, self.transport.write, self.factory.log)) # treq's collect helper is handy to get all reply content at once using closure on ctx
|
|
||||||
d.addErrback(lambda e, bsc: self.factory.log.critical("HTTP POST error %s while trying to register BSC %s" % (e, bsc)), bsc) # handle HTTP errors
|
|
||||||
# Ensure that we run only limited number of requests in parallel:
|
|
||||||
yield self.factory.semaphore.acquire()
|
|
||||||
yield d # we end up here only if semaphore is available which means it's ok to fire the request without exceeding the limit
|
|
||||||
self.factory.semaphore.release()
|
|
||||||
|
|
||||||
def handle_notificationrejectionv1(self, net, bsc, bts, trx, data):
|
|
||||||
"""
|
|
||||||
Handle notification-rejection-v1 TRAP: just an example to show how more message types can be handled
|
|
||||||
"""
|
|
||||||
self.factory.log.debug('notification-rejection-v1@bsc-id %s => %s' % (bsc, data))
|
|
||||||
|
|
||||||
|
|
||||||
class TrapFactory(IPAFactory):
|
|
||||||
"""
|
|
||||||
Store SOAP client object so TRAP handler can use it for requests
|
|
||||||
"""
|
|
||||||
location = None
|
|
||||||
log = None
|
|
||||||
semaphore = None
|
|
||||||
client = None
|
|
||||||
host = None
|
|
||||||
port = None
|
|
||||||
def __init__(self, host, port, proto, semaphore, log, wsdl=None, location=None):
|
|
||||||
self.host = host # for logging only,
|
|
||||||
self.port = port # seems to be no way to get it from ReconnectingClientFactory
|
|
||||||
self.log = log
|
|
||||||
self.semaphore = semaphore
|
|
||||||
soap = Client(wsdl, location=location, nosend=True) # make async SOAP client
|
|
||||||
self.location = location.encode() if location else soap.wsdl.services[0].ports[0].location # necessary for dispatching HTTP POST via treq
|
|
||||||
self.client = soap.service
|
|
||||||
level = self.log.getEffectiveLevel()
|
|
||||||
self.log.setLevel(logging.WARNING) # we do not need excessive debug from lower levels
|
|
||||||
super(TrapFactory, self).__init__(proto, self.log)
|
|
||||||
self.log.setLevel(level)
|
|
||||||
self.log.debug("Using IPA %s, SUDS client: %s" % (Ctrl.version, soap))
|
|
||||||
|
|
||||||
|
|
||||||
def reloader(path, script, log, dbg1, dbg2, signum, _):
|
|
||||||
"""
|
|
||||||
Signal handler: we have to use execl() because twisted's reactor is not restartable due to some bug in twisted implementation
|
|
||||||
"""
|
|
||||||
log.info("Received Signal %d - restarting..." % signum)
|
|
||||||
if signum == signal.SIGUSR1 and dbg1 not in sys.argv and dbg2 not in sys.argv:
|
|
||||||
sys.argv.append(dbg1) # enforce debug
|
|
||||||
if signum == signal.SIGUSR2 and (dbg1 in sys.argv or dbg2 in sys.argv): # disable debug
|
|
||||||
if dbg1 in sys.argv:
|
|
||||||
sys.argv.remove(dbg1)
|
|
||||||
if dbg2 in sys.argv:
|
|
||||||
sys.argv.remove(dbg2)
|
|
||||||
os.execl(path, script, *sys.argv[1:])
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
p = argparse.ArgumentParser(description='Proxy between given SOAP service and Osmocom CTRL protocol.')
|
|
||||||
p.add_argument('-v', '--version', action='version', version=("%(prog)s " + __version__))
|
|
||||||
p.add_argument('-p', '--port', type=int, default=4250, help="Port to use for CTRL interface, defaults to 4250")
|
|
||||||
p.add_argument('-c', '--ctrl', default='localhost', help="Adress to use for CTRL interface, defaults to localhost")
|
|
||||||
p.add_argument('-w', '--wsdl', required=True, help="WSDL URL for SOAP")
|
|
||||||
p.add_argument('-n', '--num', type=int, default=5, help="Max number of concurrent HTTP requests to SOAP server")
|
|
||||||
p.add_argument('-d', '--debug', action='store_true', help="Enable debug log")
|
|
||||||
p.add_argument('-o', '--output', action='store_true', help="Log to STDOUT in addition to SYSLOG")
|
|
||||||
p.add_argument('-l', '--location', help="Override location found in WSDL file (don't use unless you know what you're doing)")
|
|
||||||
args = p.parse_args()
|
|
||||||
|
|
||||||
log = logging.getLogger('CTRL2SOAP')
|
|
||||||
if args.debug:
|
|
||||||
log.setLevel(logging.DEBUG)
|
|
||||||
else:
|
|
||||||
log.setLevel(logging.INFO)
|
|
||||||
log.addHandler(logging.handlers.SysLogHandler('/dev/log'))
|
|
||||||
if args.output:
|
|
||||||
log.addHandler(logging.StreamHandler(sys.stdout))
|
|
||||||
|
|
||||||
reboot = partial(reloader, os.path.abspath(__file__), os.path.basename(__file__), log, '-d', '--debug') # keep in sync with add_argument() call above
|
|
||||||
signal.signal(signal.SIGHUP, reboot)
|
|
||||||
signal.signal(signal.SIGQUIT, reboot)
|
|
||||||
signal.signal(signal.SIGUSR1, reboot) # restart and enabled debug output
|
|
||||||
signal.signal(signal.SIGUSR2, reboot) # restart and disable debug output
|
|
||||||
|
|
||||||
log.info("SOAP proxy %s starting with PID %d ..." % (__version__, os.getpid()))
|
|
||||||
reactor.connectTCP(args.ctrl, args.port, TrapFactory(args.ctrl, args.port, Trap, defer.DeferredSemaphore(args.num), log, args.wsdl, args.location))
|
|
||||||
reactor.run()
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=OpenBSC MGCP
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
Restart=always
|
|
||||||
ExecStart=/usr/bin/osmo-bsc_mgcp -s -c /etc/osmocom/osmo-bsc-mgcp.cfg
|
|
||||||
RestartSec=2
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
[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
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=Osmocom Gb proxy
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/usr/bin/osmo-gbproxy -c /etc/osmocom/osmo-gbproxy.cfg
|
|
||||||
Restart=always
|
|
||||||
RestartSec=2
|
|
||||||
RestartPreventExitStatus=1
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[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
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[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
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
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 $@ $<
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,384 +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.
|
|
||||||
*/
|
|
||||||
"""
|
|
||||||
|
|
||||||
__version__ = "0.6" # bump this on every non-trivial change
|
|
||||||
|
|
||||||
from ipa import Ctrl, IPA
|
|
||||||
from twisted.internet.protocol import ReconnectingClientFactory
|
|
||||||
from twisted.internet import reactor
|
|
||||||
from twisted.protocols import basic
|
|
||||||
import argparse, logging
|
|
||||||
|
|
||||||
class IPACommon(basic.Int16StringReceiver):
|
|
||||||
"""
|
|
||||||
Generic IPA protocol handler: include some routines for simpler subprotocols.
|
|
||||||
It's not intended as full implementation of all subprotocols, rather common ground and example code.
|
|
||||||
"""
|
|
||||||
def dbg(self, line):
|
|
||||||
"""
|
|
||||||
Debug print helper
|
|
||||||
"""
|
|
||||||
self.factory.log.debug(line)
|
|
||||||
|
|
||||||
def osmo_CTRL(self, data):
|
|
||||||
"""
|
|
||||||
OSMO CTRL protocol
|
|
||||||
Placeholder, see corresponding derived class
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
def osmo_MGCP(self, data):
|
|
||||||
"""
|
|
||||||
OSMO MGCP extension
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO MGCP received %s' % data)
|
|
||||||
|
|
||||||
def osmo_LAC(self, data):
|
|
||||||
"""
|
|
||||||
OSMO LAC extension
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO LAC received %s' % data)
|
|
||||||
|
|
||||||
def osmo_SMSC(self, data):
|
|
||||||
"""
|
|
||||||
OSMO SMSC extension
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO SMSC received %s' % data)
|
|
||||||
|
|
||||||
def osmo_ORC(self, data):
|
|
||||||
"""
|
|
||||||
OSMO ORC extension
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO ORC received %s' % data)
|
|
||||||
|
|
||||||
def osmo_GSUP(self, data):
|
|
||||||
"""
|
|
||||||
OSMO GSUP extension
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO GSUP received %s' % data)
|
|
||||||
|
|
||||||
def osmo_OAP(self, data):
|
|
||||||
"""
|
|
||||||
OSMO OAP extension
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO OAP received %s' % data)
|
|
||||||
|
|
||||||
def osmo_UNKNOWN(self, data):
|
|
||||||
"""
|
|
||||||
OSMO defaul extension handler
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO unknown extension received %s' % data)
|
|
||||||
|
|
||||||
def handle_RSL(self, data, proto, extension):
|
|
||||||
"""
|
|
||||||
RSL protocol handler
|
|
||||||
"""
|
|
||||||
self.dbg('IPA RSL received message with extension %s' % extension)
|
|
||||||
|
|
||||||
def handle_CCM(self, data, proto, msgt):
|
|
||||||
"""
|
|
||||||
CCM (IPA Connection Management)
|
|
||||||
Placeholder, see corresponding derived class
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
def handle_SCCP(self, data, proto, extension):
|
|
||||||
"""
|
|
||||||
SCCP protocol handler
|
|
||||||
"""
|
|
||||||
self.dbg('IPA SCCP received message with extension %s' % extension)
|
|
||||||
|
|
||||||
def handle_OML(self, data, proto, extension):
|
|
||||||
"""
|
|
||||||
OML protocol handler
|
|
||||||
"""
|
|
||||||
self.dbg('IPA OML received message with extension %s' % extension)
|
|
||||||
|
|
||||||
def handle_OSMO(self, data, proto, extension):
|
|
||||||
"""
|
|
||||||
Dispatcher point for OSMO subprotocols based on extension name, lambda default should never happen
|
|
||||||
"""
|
|
||||||
method = getattr(self, 'osmo_' + IPA().ext(extension), lambda: "extension dispatch failure")
|
|
||||||
method(data)
|
|
||||||
|
|
||||||
def handle_MGCP(self, data, proto, extension):
|
|
||||||
"""
|
|
||||||
MGCP protocol handler
|
|
||||||
"""
|
|
||||||
self.dbg('IPA MGCP received message with attribute %s' % extension)
|
|
||||||
|
|
||||||
def handle_UNKNOWN(self, data, proto, extension):
|
|
||||||
"""
|
|
||||||
Default protocol handler
|
|
||||||
"""
|
|
||||||
self.dbg('IPA received message for %s (%s) protocol with attribute %s' % (IPA().proto(proto), proto, extension))
|
|
||||||
|
|
||||||
def process_chunk(self, data):
|
|
||||||
"""
|
|
||||||
Generic message dispatcher for IPA (sub)protocols based on protocol name, lambda default should never happen
|
|
||||||
"""
|
|
||||||
(_, proto, extension, content) = IPA().del_header(data)
|
|
||||||
if content is not None:
|
|
||||||
self.dbg('IPA received %s::%s [%d/%d] %s' % (IPA().proto(proto), IPA().ext_name(proto, extension), len(data), len(content), content))
|
|
||||||
method = getattr(self, 'handle_' + IPA().proto(proto), lambda: "protocol dispatch failure")
|
|
||||||
method(content, proto, extension)
|
|
||||||
|
|
||||||
def dataReceived(self, data):
|
|
||||||
"""
|
|
||||||
Override for dataReceived from Int16StringReceiver because of inherently incompatible interpretation of length
|
|
||||||
If default handler is used than we would always get off-by-1 error (Int16StringReceiver use equivalent of l + 2)
|
|
||||||
"""
|
|
||||||
if len(data):
|
|
||||||
(head, tail) = IPA().split_combined(data)
|
|
||||||
self.process_chunk(head)
|
|
||||||
self.dataReceived(tail)
|
|
||||||
|
|
||||||
def connectionMade(self):
|
|
||||||
"""
|
|
||||||
We have to resetDelay() here to drop internal state to default values to make reconnection logic work
|
|
||||||
Make sure to call this via super() if overriding to keep reconnection logic intact
|
|
||||||
"""
|
|
||||||
addr = self.transport.getPeer()
|
|
||||||
self.dbg('IPA connected to %s:%d peer' % (addr.host, addr.port))
|
|
||||||
self.factory.resetDelay()
|
|
||||||
|
|
||||||
|
|
||||||
class CCM(IPACommon):
|
|
||||||
"""
|
|
||||||
Implementation of CCM protocol for IPA multiplex
|
|
||||||
"""
|
|
||||||
def ack(self):
|
|
||||||
self.transport.write(IPA().id_ack())
|
|
||||||
|
|
||||||
def ping(self):
|
|
||||||
self.transport.write(IPA().ping())
|
|
||||||
|
|
||||||
def pong(self):
|
|
||||||
self.transport.write(IPA().pong())
|
|
||||||
|
|
||||||
def handle_CCM(self, data, proto, msgt):
|
|
||||||
"""
|
|
||||||
CCM (IPA Connection Management)
|
|
||||||
Only basic logic necessary for tests is implemented (ping-pong, id ack etc)
|
|
||||||
"""
|
|
||||||
if msgt == IPA.MSGT['ID_GET']:
|
|
||||||
self.transport.getHandle().sendall(IPA().id_resp(self.factory.ccm_id))
|
|
||||||
# if we call
|
|
||||||
# self.transport.write(IPA().id_resp(self.factory.test_id))
|
|
||||||
# instead, than we would have to also call
|
|
||||||
# reactor.callLater(1, self.ack)
|
|
||||||
# instead of self.ack()
|
|
||||||
# otherwise the writes will be glued together - hence the necessity for ugly hack with 1s timeout
|
|
||||||
# Note: this still might work depending on the IPA implementation details on the other side
|
|
||||||
self.ack()
|
|
||||||
# schedule PING in 4s
|
|
||||||
reactor.callLater(4, self.ping)
|
|
||||||
if msgt == IPA.MSGT['PING']:
|
|
||||||
self.pong()
|
|
||||||
|
|
||||||
|
|
||||||
class CTRL(IPACommon):
|
|
||||||
"""
|
|
||||||
Implementation of Osmocom control protocol for IPA multiplex
|
|
||||||
"""
|
|
||||||
def ctrl_SET(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Handle CTRL SET command
|
|
||||||
"""
|
|
||||||
self.dbg('CTRL SET [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def ctrl_SET_REPLY(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Handle CTRL SET reply
|
|
||||||
"""
|
|
||||||
self.dbg('CTRL SET REPLY [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def ctrl_GET(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Handle CTRL GET command
|
|
||||||
"""
|
|
||||||
self.dbg('CTRL GET [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def ctrl_GET_REPLY(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Handle CTRL GET reply
|
|
||||||
"""
|
|
||||||
self.dbg('CTRL GET REPLY [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def ctrl_TRAP(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Handle CTRL TRAP command
|
|
||||||
"""
|
|
||||||
self.dbg('CTRL TRAP [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def ctrl_ERROR(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
Handle CTRL ERROR reply
|
|
||||||
"""
|
|
||||||
self.dbg('CTRL ERROR [%s] %s' % (op_id, v))
|
|
||||||
|
|
||||||
def osmo_CTRL(self, data):
|
|
||||||
"""
|
|
||||||
OSMO CTRL message dispatcher, lambda default should never happen
|
|
||||||
For basic tests only, appropriate handling routines should be replaced: see CtrlServer for example
|
|
||||||
"""
|
|
||||||
self.dbg('OSMO CTRL received %s::%s' % Ctrl().parse(data.decode('utf-8')))
|
|
||||||
(cmd, op_id, v) = data.decode('utf-8').split(' ', 2)
|
|
||||||
method = getattr(self, 'ctrl_' + cmd, lambda: "CTRL unknown command")
|
|
||||||
method(data, op_id, v)
|
|
||||||
|
|
||||||
|
|
||||||
class IPAServer(CCM):
|
|
||||||
"""
|
|
||||||
Test implementation of IPA server
|
|
||||||
Demonstrate CCM opearation by overriding necessary bits from CCM
|
|
||||||
"""
|
|
||||||
def connectionMade(self):
|
|
||||||
"""
|
|
||||||
Keep reconnection logic working by calling routine from CCM
|
|
||||||
Initiate CCM upon connection
|
|
||||||
"""
|
|
||||||
addr = self.transport.getPeer()
|
|
||||||
self.factory.log.info('IPA server: connection from %s:%d client' % (addr.host, addr.port))
|
|
||||||
super(IPAServer, self).connectionMade()
|
|
||||||
self.transport.write(IPA().id_get())
|
|
||||||
|
|
||||||
|
|
||||||
class CtrlServer(CTRL):
|
|
||||||
"""
|
|
||||||
Test implementation of CTRL server
|
|
||||||
Demonstarte CTRL handling by overriding simpler routines from CTRL
|
|
||||||
"""
|
|
||||||
def connectionMade(self):
|
|
||||||
"""
|
|
||||||
Keep reconnection logic working by calling routine from CTRL
|
|
||||||
Send TRAP upon connection
|
|
||||||
Note: we can't use sendString() because of it's incompatibility with IPA interpretation of length prefix
|
|
||||||
"""
|
|
||||||
addr = self.transport.getPeer()
|
|
||||||
self.factory.log.info('CTRL server: connection from %s:%d client' % (addr.host, addr.port))
|
|
||||||
super(CtrlServer, self).connectionMade()
|
|
||||||
self.transport.write(Ctrl().trap('LOL', 'what'))
|
|
||||||
self.transport.write(Ctrl().trap('rulez', 'XXX'))
|
|
||||||
|
|
||||||
def reply(self, r):
|
|
||||||
self.transport.write(Ctrl().add_header(r))
|
|
||||||
|
|
||||||
def ctrl_SET(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
CTRL SET command: always succeed
|
|
||||||
"""
|
|
||||||
self.dbg('SET [%s] %s' % (op_id, v))
|
|
||||||
self.reply('SET_REPLY %s %s' % (op_id, v))
|
|
||||||
|
|
||||||
def ctrl_GET(self, data, op_id, v):
|
|
||||||
"""
|
|
||||||
CTRL GET command: always fail
|
|
||||||
"""
|
|
||||||
self.dbg('GET [%s] %s' % (op_id, v))
|
|
||||||
self.reply('ERROR %s No variable found' % op_id)
|
|
||||||
|
|
||||||
|
|
||||||
class IPAFactory(ReconnectingClientFactory):
|
|
||||||
"""
|
|
||||||
Generic IPA Client Factory which can be used to store state for various subprotocols and manage connections
|
|
||||||
Note: so far we do not really need separate Factory for acting as a server due to protocol simplicity
|
|
||||||
"""
|
|
||||||
protocol = IPACommon
|
|
||||||
log = None
|
|
||||||
ccm_id = IPA().identity(unit=b'1515/0/1', mac=b'b0:0b:fa:ce:de:ad:be:ef', utype=b'sysmoBTS', name=b'StingRay', location=b'hell', sw=IPA.version.encode('utf-8'))
|
|
||||||
|
|
||||||
def __init__(self, proto=None, log=None, ccm_id=None):
|
|
||||||
if proto:
|
|
||||||
self.protocol = proto
|
|
||||||
if ccm_id:
|
|
||||||
self.ccm_id = ccm_id
|
|
||||||
if log:
|
|
||||||
self.log = log
|
|
||||||
else:
|
|
||||||
self.log = logging.getLogger('IPAFactory')
|
|
||||||
self.log.setLevel(logging.CRITICAL)
|
|
||||||
self.log.addHandler(logging.NullHandler)
|
|
||||||
|
|
||||||
def clientConnectionFailed(self, connector, reason):
|
|
||||||
"""
|
|
||||||
Only necessary for as debugging aid - if we can somehow set parent's class noisy attribute then we can omit this method
|
|
||||||
"""
|
|
||||||
self.log.warning('IPAFactory connection failed: %s' % reason.getErrorMessage())
|
|
||||||
ReconnectingClientFactory.clientConnectionFailed(self, connector, reason)
|
|
||||||
|
|
||||||
def clientConnectionLost(self, connector, reason):
|
|
||||||
"""
|
|
||||||
Only necessary for as debugging aid - if we can somehow set parent's class noisy attribute then we can omit this method
|
|
||||||
"""
|
|
||||||
self.log.warning('IPAFactory connection lost: %s' % reason.getErrorMessage())
|
|
||||||
ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
p = argparse.ArgumentParser("Twisted IPA (module v%s) app" % IPA.version)
|
|
||||||
p.add_argument('-v', '--version', action='version', version="%(prog)s v" + __version__)
|
|
||||||
p.add_argument('-p', '--port', type=int, default=4250, help="Port to use for CTRL interface")
|
|
||||||
p.add_argument('-d', '--host', default='localhost', help="Adress to use for CTRL interface")
|
|
||||||
cs = p.add_mutually_exclusive_group()
|
|
||||||
cs.add_argument("-c", "--client", action='store_true', help="asume client role")
|
|
||||||
cs.add_argument("-s", "--server", action='store_true', help="asume server role")
|
|
||||||
ic = p.add_mutually_exclusive_group()
|
|
||||||
ic.add_argument("--ipa", action='store_true', help="use IPA protocol")
|
|
||||||
ic.add_argument("--ctrl", action='store_true', help="use CTRL protocol")
|
|
||||||
args = p.parse_args()
|
|
||||||
test = False
|
|
||||||
|
|
||||||
log = logging.getLogger('TwistedIPA')
|
|
||||||
log.setLevel(logging.DEBUG)
|
|
||||||
log.addHandler(logging.StreamHandler(sys.stdout))
|
|
||||||
|
|
||||||
if args.ctrl:
|
|
||||||
if args.client:
|
|
||||||
# Start osmo-bsc to receive TRAP messages when osmo-bts-* connects to it
|
|
||||||
print('CTRL client, connecting to %s:%d' % (args.host, args.port))
|
|
||||||
reactor.connectTCP(args.host, args.port, IPAFactory(CTRL, log))
|
|
||||||
test = True
|
|
||||||
if args.server:
|
|
||||||
# Use bsc_control.py to issue set/get commands
|
|
||||||
print('CTRL server, listening on port %d' % args.port)
|
|
||||||
reactor.listenTCP(args.port, IPAFactory(CtrlServer, log))
|
|
||||||
test = True
|
|
||||||
if args.ipa:
|
|
||||||
if args.client:
|
|
||||||
# Start osmo-nitb which would initiate A-bis/IP session
|
|
||||||
print('IPA client, connecting to %s ports %d and %d' % (args.host, IPA.TCP_PORT_OML, IPA.TCP_PORT_RSL))
|
|
||||||
reactor.connectTCP(args.host, IPA.TCP_PORT_OML, IPAFactory(CCM, log))
|
|
||||||
reactor.connectTCP(args.host, IPA.TCP_PORT_RSL, IPAFactory(CCM, log))
|
|
||||||
test = True
|
|
||||||
if args.server:
|
|
||||||
# Start osmo-bts-* which would attempt to connect to us
|
|
||||||
print('IPA server, listening on ports %d and %d' % (IPA.TCP_PORT_OML, IPA.TCP_PORT_RSL))
|
|
||||||
reactor.listenTCP(IPA.TCP_PORT_RSL, IPAFactory(IPAServer, log))
|
|
||||||
reactor.listenTCP(IPA.TCP_PORT_OML, IPAFactory(IPAServer, log))
|
|
||||||
test = True
|
|
||||||
if test:
|
|
||||||
reactor.run()
|
|
||||||
else:
|
|
||||||
print("Please specify which protocol in which role you'd like to test.")
|
|
||||||
11
openbsc/debian/changelog
Normal file
11
openbsc/debian/changelog
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
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 (Closes: #nnnn) <nnnn is the bug number of your ITP>
|
||||||
|
|
||||||
|
-- Harald Welte <laforge@gnumonks.org> Tue, 24 Aug 2010 13:34:24 +0200
|
||||||
1
openbsc/debian/compat
Normal file
1
openbsc/debian/compat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
7
|
||||||
44
openbsc/debian/control
Normal file
44
openbsc/debian/control
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
Source: openbsc
|
||||||
|
Section: net
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Harald Welte <laforge@gnumonks.org>
|
||||||
|
Build-Depends: debhelper (>= 7.0.0~), autotools-dev, pkg-config, libgtp, libosmocore-dev, libosmo-sccp-dev, libdbi0-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}, libosmocore, libosmo-sccp
|
||||||
|
Description: GSM Base Station Controller; BSC-only version of OpenBSC. Needs a real MSC!
|
||||||
|
|
||||||
|
Package: osmocom-nitb
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libdbd-sqlite3, libdbi0
|
||||||
|
Description: GSM Network-in-a-Box, implements BSC, MSC, SMSC, HLR, VLR
|
||||||
|
|
||||||
|
Package: osmocom-ipaccess-utils
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||||
|
Description: Command line utilities for ip.access nanoBTS
|
||||||
|
|
||||||
|
Package: osmocom-bs11-utils
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||||
|
Description: Command line utilities for Siemens BS-11 BTS
|
||||||
|
|
||||||
|
Package: osmocom-sgsn
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libgtp
|
||||||
|
Description: Osmocom Serving GPRS Support Node
|
||||||
|
|
||||||
|
Package: osmocom-gbproxy
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||||
|
Description: Osmocom GPRS Gb Interface Proxy
|
||||||
|
|
||||||
|
Package: osmocom-bsc-nat
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||||
|
Description: Osmocom Base Station Controller Network Address Translation
|
||||||
50
openbsc/debian/copyright
Normal file
50
openbsc/debian/copyright
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
This work was packaged for Debian by:
|
||||||
|
|
||||||
|
Harald Welte <laforge@gnumonks.org> on Tue, 24 Aug 2010 10:55:04 +0200
|
||||||
|
|
||||||
|
It was downloaded from:
|
||||||
|
|
||||||
|
git://bs11-abis.gnumonks.org/openbsc.git
|
||||||
|
|
||||||
|
Upstream Author(s):
|
||||||
|
|
||||||
|
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".
|
||||||
|
|
||||||
|
# Please also look if there are files or directories which have a
|
||||||
|
# different copyright/license attached and list them here.
|
||||||
1
openbsc/debian/docs
Normal file
1
openbsc/debian/docs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
README
|
||||||
1
openbsc/debian/osmocom-bsc.examples
Normal file
1
openbsc/debian/osmocom-bsc.examples
Normal file
@@ -0,0 +1 @@
|
|||||||
|
doc/examples/osmo-bsc_mgcp
|
||||||
2
openbsc/debian/osmocom-bsc.install
Normal file
2
openbsc/debian/osmocom-bsc.install
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/usr/bin/bsc_mgcp
|
||||||
|
/usr/bin/osmo-bsc
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
/usr/bin/ipaccess-config
|
/usr/bin/ipaccess-config
|
||||||
/usr/bin/abisip-find
|
/usr/bin/ipaccess-find
|
||||||
/usr/bin/ipaccess-proxy
|
/usr/bin/ipaccess-proxy
|
||||||
2
openbsc/debian/osmocom-nitb.default
Normal file
2
openbsc/debian/osmocom-nitb.default
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Configuration file
|
||||||
|
CONFIG_FILE="/etc/osmocom/osmo-nitb.cfg"
|
||||||
1
openbsc/debian/osmocom-nitb.examples
Normal file
1
openbsc/debian/osmocom-nitb.examples
Normal file
@@ -0,0 +1 @@
|
|||||||
|
doc/examples/osmo-nitb
|
||||||
@@ -15,16 +15,18 @@
|
|||||||
|
|
||||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||||
NAME=osmo-nitb # Introduce the short server's name here
|
DESC=osmo-nitb # Introduce a short description here
|
||||||
DESC="Osmocom GSM Network-in-a-Box" # Introduce a short description here
|
NAME=osmo-nitb # Introduce the short server's name here
|
||||||
DAEMON=/usr/bin/osmo-nitb # Introduce the server's location here
|
DAEMON=/usr/sbin/osmo-nitb # Introduce the server's location here
|
||||||
SCRIPTNAME=/etc/init.d/osmocom-nitb
|
DAEMON_ARGS="-D" # Arguments to run the daemon with
|
||||||
|
PIDFILE=/var/run/$NAME.pid
|
||||||
|
SCRIPTNAME=/etc/init.d/$NAME
|
||||||
|
|
||||||
# Exit if the package is not installed
|
# Exit if the package is not installed
|
||||||
[ -x $DAEMON ] || exit 0
|
[ -x $DAEMON ] || exit 0
|
||||||
|
|
||||||
# Read configuration variable file if it is present
|
# Read configuration variable file if it is present
|
||||||
[ -r /etc/default/osmocom-nitb ] && . /etc/default/osmocom-nitb
|
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
|
||||||
|
|
||||||
# Load the VERBOSE setting and other rcS variables
|
# Load the VERBOSE setting and other rcS variables
|
||||||
. /lib/init/vars.sh
|
. /lib/init/vars.sh
|
||||||
@@ -33,7 +35,7 @@ SCRIPTNAME=/etc/init.d/osmocom-nitb
|
|||||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||||
. /lib/lsb/init-functions
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
DAEMON_ARGS="$DAEMON_ARGS -D -c $CONFIG_FILE -l $HLR_FILE"
|
DAEMON_ARGS="$DAEMON_ARGS -c $CONFIG_FILE"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Function that starts the daemon/service
|
# Function that starts the daemon/service
|
||||||
@@ -44,9 +46,9 @@ do_start()
|
|||||||
# 0 if daemon has been started
|
# 0 if daemon has been started
|
||||||
# 1 if daemon was already running
|
# 1 if daemon was already running
|
||||||
# 2 if daemon could not be started
|
# 2 if daemon could not be started
|
||||||
start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
|
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|
||||||
|| return 1
|
|| return 1
|
||||||
start-stop-daemon --start --quiet --exec $DAEMON -- \
|
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
|
||||||
$DAEMON_ARGS \
|
$DAEMON_ARGS \
|
||||||
|| return 2
|
|| return 2
|
||||||
# Add code here, if necessary, that waits for the process to be ready
|
# Add code here, if necessary, that waits for the process to be ready
|
||||||
@@ -64,7 +66,7 @@ do_stop()
|
|||||||
# 1 if daemon was already stopped
|
# 1 if daemon was already stopped
|
||||||
# 2 if daemon could not be stopped
|
# 2 if daemon could not be stopped
|
||||||
# other if a failure occurred
|
# other if a failure occurred
|
||||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
|
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
|
||||||
RETVAL="$?"
|
RETVAL="$?"
|
||||||
[ "$RETVAL" = 2 ] && return 2
|
[ "$RETVAL" = 2 ] && return 2
|
||||||
# Wait for children to finish too if this is a daemon that forks
|
# Wait for children to finish too if this is a daemon that forks
|
||||||
@@ -75,6 +77,8 @@ do_stop()
|
|||||||
# sleep for some time.
|
# sleep for some time.
|
||||||
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||||
[ "$?" = 2 ] && return 2
|
[ "$?" = 2 ] && return 2
|
||||||
|
# Many daemons don't delete their pidfiles when they exit.
|
||||||
|
rm -f $PIDFILE
|
||||||
return "$RETVAL"
|
return "$RETVAL"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +91,7 @@ do_reload() {
|
|||||||
# restarting (for example, when it is sent a SIGHUP),
|
# restarting (for example, when it is sent a SIGHUP),
|
||||||
# then implement that here.
|
# then implement that here.
|
||||||
#
|
#
|
||||||
start-stop-daemon --stop --signal 1 --quiet $PIDFILE --name $NAME
|
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
1
openbsc/debian/osmocom-nitb.install
Normal file
1
openbsc/debian/osmocom-nitb.install
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/usr/bin/osmo-nitb
|
||||||
29
openbsc/debian/patches/debian-changes-0.9.4-1
Normal file
29
openbsc/debian/patches/debian-changes-0.9.4-1
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
Description: Upstream changes introduced in version 0.9.4-1
|
||||||
|
This patch has been created by dpkg-source during the package build.
|
||||||
|
Here's the last changelog entry, hopefully it gives details on why
|
||||||
|
those changes were made:
|
||||||
|
.
|
||||||
|
openbsc (0.9.4-1) unstable; urgency=low
|
||||||
|
.
|
||||||
|
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
|
||||||
|
.
|
||||||
|
The person named in the Author field signed this changelog entry.
|
||||||
|
Author: Harald Welte <laforge@gnumonks.org>
|
||||||
|
|
||||||
|
---
|
||||||
|
The information above should follow the Patch Tagging Guidelines, please
|
||||||
|
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
|
||||||
|
are templates for supplementary fields that you might want to add:
|
||||||
|
|
||||||
|
Origin: <vendor|upstream|other>, <url of original patch>
|
||||||
|
Bug: <url in upstream bugtracker>
|
||||||
|
Bug-Debian: http://bugs.debian.org/<bugnumber>
|
||||||
|
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
|
||||||
|
Forwarded: <no|not-needed|url proving that it has been forwarded>
|
||||||
|
Reviewed-By: <name and email of someone who approved the patch>
|
||||||
|
Last-Update: <YYYY-MM-DD>
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ openbsc-0.9.4/.version
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+0.9.4
|
||||||
1
openbsc/debian/patches/series
Normal file
1
openbsc/debian/patches/series
Normal file
@@ -0,0 +1 @@
|
|||||||
|
debian-changes-0.9.4-1
|
||||||
31
openbsc/debian/rules
Executable file
31
openbsc/debian/rules
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
# -*- makefile -*-
|
||||||
|
# Sample debian/rules that uses debhelper.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
# This has to be exported to make some magic below work.
|
||||||
|
export DH_OPTIONS
|
||||||
|
|
||||||
|
# this requires debhelper 7.0.50 or above, which lenny doesn't have yet!
|
||||||
|
#override_dh_auto_configure:
|
||||||
|
# dh_auto_configure -- --enable-nat --enable-osmo-bsc
|
||||||
|
|
||||||
|
build: build-stamp
|
||||||
|
build-stamp:
|
||||||
|
dh build --before configure
|
||||||
|
dh_auto_configure -- --enable-nat --enable-osmo-bsc
|
||||||
|
dh build --after configure
|
||||||
|
touch build-stamp
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@
|
||||||
1
openbsc/debian/source/format
Normal file
1
openbsc/debian/source/format
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3.0 (quilt)
|
||||||
@@ -1,3 +1 @@
|
|||||||
SUBDIRS = \
|
SUBDIRS = examples
|
||||||
examples \
|
|
||||||
$(NULL)
|
|
||||||
|
|||||||
@@ -55,22 +55,22 @@ bsc_api.c:gsm0808_clear
|
|||||||
* Release a channel used for handover
|
* Release a channel used for handover
|
||||||
* Release the primary lchan with normal release, SACH deactivate
|
* Release the primary lchan with normal release, SACH deactivate
|
||||||
|
|
||||||
chan_alloc.c:lchan_release(chan, sacch_deactivate, reason)
|
chan_alloc.c:lchan_release(chan, sach_deactivate, reason)
|
||||||
* Start the release procedure. It is working in steps with callbacks
|
* Start release procedure. It is working in steps with callbacks
|
||||||
coming from the abis_rsl.c code.
|
coming from the abis_rsl.c code.
|
||||||
* Release all SAPI's > 0 as local end (The BTS should send a
|
* Release all SAPI's > 0, wait for them to be released
|
||||||
REL_CONF a message)
|
* Send SACH Deactivate on SAPI=0
|
||||||
* Send SACH Deactivate on SAPI=0 if required.
|
* Finally Release the channel
|
||||||
* Start T3109 (stop it when the main signalling link is disconnected)
|
|
||||||
or when the channel released. On timeout start the error handling.
|
|
||||||
* abis_rsl.c schedules the RSL_MT_RF_CHAN_REL once all SAPI's are
|
|
||||||
released and after T3111 has timed out or there is an error.
|
|
||||||
|
|
||||||
RX of RELease INDication:
|
RX of RELease INDication:
|
||||||
* Calls internal rsl_handle_release which might release the RF.
|
* Calls internal rsl_handle_release which might release the RF.
|
||||||
|
* Informs chan_alloc.c about the release with
|
||||||
|
rsl_lchan_rll_release.
|
||||||
|
|
||||||
RX of RELease CONFirmation:
|
RX of RELease CONFimem:
|
||||||
* Calls internal rsl_handle_release which might release the RF.
|
* Calls internal rsl_handle_release which might release the RF.
|
||||||
|
* Informs chan_alloc.c about the release with
|
||||||
|
rsl_lchan_rll_release.
|
||||||
|
|
||||||
* RX of RF_CHAN_REL_ACK
|
* RX of RF_CHAN_REL_ACK
|
||||||
* call lchan_free()
|
* call lchan_free()
|
||||||
|
|||||||
21
openbsc/doc/control-interface.txt
Normal file
21
openbsc/doc/control-interface.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The protocol for the control interface is wrapped inside the ip.access header
|
||||||
|
with the IPAC_PROTO_OSMO protocol ID (0xee). Inside the ip.access header is
|
||||||
|
a struct ipaccess_head_ext with protocol ID 0x00 which indicates the control
|
||||||
|
interface.
|
||||||
|
|
||||||
|
After that the actual protocol is text based:
|
||||||
|
|
||||||
|
* Getting the value of a variable
|
||||||
|
-> GET <id> <var>
|
||||||
|
<- GET_REPLY <id> <var> <val>
|
||||||
|
or ERROR <id> <reason>
|
||||||
|
|
||||||
|
* Setting the value of a variable
|
||||||
|
-> SET <id> <var> <val>
|
||||||
|
<- SET_REPLY <id> <var> <val>
|
||||||
|
or ERROR <id> <reason>
|
||||||
|
|
||||||
|
* A value changes which triggers a trap
|
||||||
|
<- TRAP <var> <val>
|
||||||
|
|
||||||
|
<id> needs to be unique within a connection. '0' is not allowed
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'
|
CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
|
|||||||
@@ -3,12 +3,42 @@
|
|||||||
!!
|
!!
|
||||||
password foo
|
password foo
|
||||||
!
|
!
|
||||||
|
log stderr
|
||||||
|
logging color 1
|
||||||
|
logging timestamp 0
|
||||||
|
logging level all everything
|
||||||
|
logging level rll notice
|
||||||
|
logging level cc notice
|
||||||
|
logging level mm notice
|
||||||
|
logging level rr notice
|
||||||
|
logging level rsl notice
|
||||||
|
logging level nm info
|
||||||
|
logging level mncc notice
|
||||||
|
logging level sms notice
|
||||||
|
logging level pag notice
|
||||||
|
logging level meas notice
|
||||||
|
logging level mi notice
|
||||||
|
logging level mib notice
|
||||||
|
logging level mux notice
|
||||||
|
logging level inp notice
|
||||||
|
logging level sccp notice
|
||||||
|
logging level msc notice
|
||||||
|
logging level mgcp notice
|
||||||
|
logging level ho notice
|
||||||
|
logging level db notice
|
||||||
|
logging level ref notice
|
||||||
|
logging level gprs debug
|
||||||
|
logging level ns info
|
||||||
|
logging level bssgp debug
|
||||||
|
logging level llc debug
|
||||||
|
logging level sndcp debug
|
||||||
|
logging level nat notice
|
||||||
|
logging level lglobal notice
|
||||||
|
logging level llapdm notice
|
||||||
!
|
!
|
||||||
line vty
|
line vty
|
||||||
no login
|
no login
|
||||||
!
|
!
|
||||||
e1_input
|
|
||||||
e1_line 0 driver ipa
|
|
||||||
network
|
network
|
||||||
network country code 1
|
network country code 1
|
||||||
mobile network code 1
|
mobile network code 1
|
||||||
@@ -40,6 +70,7 @@ network
|
|||||||
timer t3119 0
|
timer t3119 0
|
||||||
timer t3122 0
|
timer t3122 0
|
||||||
timer t3141 0
|
timer t3141 0
|
||||||
|
dtx-used 0
|
||||||
subscriber-keep-in-ram 0
|
subscriber-keep-in-ram 0
|
||||||
bts 0
|
bts 0
|
||||||
type nanobts
|
type nanobts
|
||||||
@@ -54,10 +85,8 @@ network
|
|||||||
channel allocator ascending
|
channel allocator ascending
|
||||||
rach tx integer 9
|
rach tx integer 9
|
||||||
rach max transmission 7
|
rach max transmission 7
|
||||||
dtx uplink force
|
|
||||||
dtx downlink
|
|
||||||
ip.access unit_id 0 0
|
ip.access unit_id 0 0
|
||||||
oml ip.access stream_id 255 line 0
|
oml ip.access stream_id 255
|
||||||
neighbor-list mode manual-si5
|
neighbor-list mode manual-si5
|
||||||
neighbor-list add arfcn 100
|
neighbor-list add arfcn 100
|
||||||
neighbor-list add arfcn 200
|
neighbor-list add arfcn 200
|
||||||
@@ -70,37 +99,33 @@ network
|
|||||||
nominal power 23
|
nominal power 23
|
||||||
max_power_red 20
|
max_power_red 20
|
||||||
rsl e1 tei 0
|
rsl e1 tei 0
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
msc
|
msc
|
||||||
ip.access rtp-base 4000
|
ip.access rtp-base 4000
|
||||||
timeout-ping 20
|
timeout-ping 20
|
||||||
timeout-pong 5
|
timeout-pong 5
|
||||||
|
mid-call-timeout 0
|
||||||
dest 192.168.100.11 6666 0
|
dest 192.168.100.11 6666 0
|
||||||
access-list-name msc-list
|
|
||||||
no access-list-name
|
|
||||||
bsc
|
|
||||||
no access-list-name
|
|
||||||
access-list-name bsc-list
|
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ line vty
|
|||||||
mgcp
|
mgcp
|
||||||
! local ip 213.167.134.14
|
! local ip 213.167.134.14
|
||||||
bts ip 172.16.252.43
|
bts ip 172.16.252.43
|
||||||
bind ip 127.0.0.1
|
bind ip 213.167.134.141
|
||||||
bind port 2427
|
bind port 2427
|
||||||
|
bind early 1
|
||||||
rtp base 4000
|
rtp base 4000
|
||||||
rtp force-ptime 20
|
|
||||||
sdp audio payload number 98
|
sdp audio payload number 98
|
||||||
sdp audio payload name AMR/8000
|
sdp audio payload name AMR/8000
|
||||||
number endpoints 31
|
number endpoints 31
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
678012512671923:6:6:
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
nat
|
|
||||||
bsc 0
|
|
||||||
token lol
|
|
||||||
location_area_code 1234
|
|
||||||
description bsc
|
|
||||||
max-endpoints 32
|
|
||||||
paging forbidden 0
|
|
||||||
bsc 1
|
|
||||||
token wat
|
|
||||||
location_area_code 5678
|
|
||||||
description bsc
|
|
||||||
max-endpoints 32
|
|
||||||
paging forbidden 0
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
!
|
|
||||||
! OsmoBSCNAT (0.12.0.266-2daa9) configuration saved from vty
|
|
||||||
!!
|
|
||||||
!
|
|
||||||
log stderr
|
|
||||||
logging filter all 1
|
|
||||||
logging color 1
|
|
||||||
logging timestamp 0
|
|
||||||
logging level all debug
|
|
||||||
logging level rll notice
|
|
||||||
logging level cc notice
|
|
||||||
logging level mm notice
|
|
||||||
logging level rr notice
|
|
||||||
logging level rsl notice
|
|
||||||
logging level nm info
|
|
||||||
logging level mncc notice
|
|
||||||
logging level pag notice
|
|
||||||
logging level meas notice
|
|
||||||
logging level sccp notice
|
|
||||||
logging level msc notice
|
|
||||||
logging level mgcp notice
|
|
||||||
logging level ho notice
|
|
||||||
logging level db notice
|
|
||||||
logging level ref notice
|
|
||||||
logging level gprs debug
|
|
||||||
logging level ns info
|
|
||||||
logging level bssgp debug
|
|
||||||
logging level llc debug
|
|
||||||
logging level sndcp debug
|
|
||||||
logging level nat notice
|
|
||||||
logging level ctrl notice
|
|
||||||
logging level smpp debug
|
|
||||||
logging level lglobal notice
|
|
||||||
logging level llapd notice
|
|
||||||
logging level linp notice
|
|
||||||
logging level lmux notice
|
|
||||||
logging level lmi notice
|
|
||||||
logging level lmib notice
|
|
||||||
logging level lsms notice
|
|
||||||
!
|
|
||||||
line vty
|
|
||||||
no login
|
|
||||||
!
|
|
||||||
mgcp
|
|
||||||
bind ip 0.0.0.0
|
|
||||||
bind port 2427
|
|
||||||
rtp bts-base 4000
|
|
||||||
rtp net-base 16000
|
|
||||||
rtp ip-dscp 0
|
|
||||||
no rtcp-omit
|
|
||||||
sdp audio-payload number 126
|
|
||||||
sdp audio-payload name AMR/8000
|
|
||||||
loop 0
|
|
||||||
number endpoints 1
|
|
||||||
call-agent ip 127.0.0.1
|
|
||||||
rtp transcoder-base 0
|
|
||||||
transcoder-remote-base 4000
|
|
||||||
nat
|
|
||||||
msc ip 127.0.0.1
|
|
||||||
msc port 5000
|
|
||||||
timeout auth 2
|
|
||||||
timeout ping 20
|
|
||||||
timeout pong 5
|
|
||||||
ip-dscp 0
|
|
||||||
bscs-config-file bscs.config
|
|
||||||
access-list bla imsi-allow ^11$
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
!
|
|
||||||
! OsmoGbProxy (UNKNOWN) configuration saved from vty
|
|
||||||
!!
|
|
||||||
!
|
|
||||||
log stderr
|
|
||||||
logging filter all 1
|
|
||||||
logging color 1
|
|
||||||
logging timestamp 0
|
|
||||||
logging level all debug
|
|
||||||
logging level gprs debug
|
|
||||||
logging level ns info
|
|
||||||
logging level bssgp debug
|
|
||||||
logging level lglobal notice
|
|
||||||
logging level llapd notice
|
|
||||||
logging level linp notice
|
|
||||||
logging level lmux notice
|
|
||||||
logging level lmi notice
|
|
||||||
logging level lmib notice
|
|
||||||
logging level lsms notice
|
|
||||||
!
|
|
||||||
line vty
|
|
||||||
no login
|
|
||||||
!
|
|
||||||
ns
|
|
||||||
nse 666 nsvci 666
|
|
||||||
nse 666 remote-role sgsn
|
|
||||||
! nse 666 encapsulation framerelay-gre
|
|
||||||
! nse 666 remote-ip 172.16.1.70
|
|
||||||
! nse 666 fr-dlci 666
|
|
||||||
timer tns-block 3
|
|
||||||
timer tns-block-retries 3
|
|
||||||
timer tns-reset 3
|
|
||||||
timer tns-reset-retries 3
|
|
||||||
timer tns-test 30
|
|
||||||
timer tns-alive 3
|
|
||||||
timer tns-alive-retries 10
|
|
||||||
encapsulation udp local-port 23000
|
|
||||||
! encapsulation framerelay-gre enabled 1
|
|
||||||
gbproxy
|
|
||||||
sgsn nsei 666
|
|
||||||
core-mobile-country-code 666
|
|
||||||
core-mobile-network-code 6
|
|
||||||
core-access-point-name none match-imsi ^666066|^66607
|
|
||||||
tlli-list max-length 200
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
Here is a simple setup to test GTPHub operations. The IP addresses picked will
|
|
||||||
work well only on a system that creates local addresses (127.0.0.123) on the
|
|
||||||
fly (like linux) -- you may pick of course different IP addresses.
|
|
||||||
|
|
||||||
Overview of the example setup:
|
|
||||||
|
|
||||||
sgsnemu gtphub ggsn
|
|
||||||
127.0.0.1 <--> 127.0.0.3 127.0.0.4 <--> 127.0.0.2
|
|
||||||
|
|
||||||
Prerequisites: openggsn.
|
|
||||||
|
|
||||||
Have a local directory where you store config files and from which you launch
|
|
||||||
the GSNs and the hub (they will store restart counter files in that dir).
|
|
||||||
In it, have these config files:
|
|
||||||
|
|
||||||
ggsn.conf:
|
|
||||||
|
|
||||||
# GGSN local address
|
|
||||||
listen 127.0.0.2
|
|
||||||
|
|
||||||
# End User Addresses are picked from this range
|
|
||||||
net 10.23.42.0/24
|
|
||||||
|
|
||||||
pcodns1 8.8.8.8
|
|
||||||
|
|
||||||
logfile /tmp/foo
|
|
||||||
|
|
||||||
gtphub.conf:
|
|
||||||
|
|
||||||
gtphub
|
|
||||||
bind-to-sgsns 127.0.0.3
|
|
||||||
bind-to-ggsns 127.0.0.4
|
|
||||||
ggsn-proxy 127.0.0.2
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
(
|
|
||||||
You may omit the ggsn-proxy if GRX ares is working, or if you add the GRX
|
|
||||||
address and GGSN IP address to /etc/hosts something like:
|
|
||||||
|
|
||||||
127.0.0.2 internet.mnc070.mcc901.gprs
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
Once the config files are in place, start the programs, in separate terminals.
|
|
||||||
GGSN and SGSN need to be started with root priviliges to be able to create tun
|
|
||||||
interfaces. GTPHub may run as unprivileged user.
|
|
||||||
|
|
||||||
The LD_LIBRARY_PATH below may be needed if OpenGGSN installed to /usr/local.
|
|
||||||
|
|
||||||
|
|
||||||
1. GGSN:
|
|
||||||
|
|
||||||
sudo -s
|
|
||||||
cd <your-test-dir>
|
|
||||||
LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/ggsn -f -c ./ggsn.conf
|
|
||||||
|
|
||||||
2. GTPHub:
|
|
||||||
|
|
||||||
cd <your-test-dir>
|
|
||||||
path/to/openbsc/openbsc/src/gprs/osmo-gtphub -c gtphub.conf #-e 1 #for DEBUG level
|
|
||||||
|
|
||||||
3. SGSN tests:
|
|
||||||
|
|
||||||
sudo -s
|
|
||||||
cd <your-test-dir>
|
|
||||||
/usr/local/bin/sgsnemu --createif -l 127.0.0.1 -r 127.0.0.3 --imsi 420001214365100 --contexts=3
|
|
||||||
|
|
||||||
Add more SGSNs using different IMSIs and local ports (if the same IMSI is used,
|
|
||||||
the GGSN will reuse TEIs and tunnels will be discarded automatically):
|
|
||||||
|
|
||||||
/usr/local/bin/sgsnemu --createif -l 127.0.0.11 -r 127.0.0.3 --imsi 420001214365300 --contexts=3
|
|
||||||
|
|
||||||
This shows the basic setup of GTPHub. Testing internet traffic via sgsnemu
|
|
||||||
still needs some effort to announce a mobile subscriber or the like (I have
|
|
||||||
used a real BTS, osmo-sgsn and a testing SIM in a web phone, instead).
|
|
||||||
|
|
||||||
The core capability of GTPHub is to manage more than two GSNs, e.g. an SGSN
|
|
||||||
contacting various GGSNs over the single GTPHub link. You would configure the
|
|
||||||
SGSN to use one fixed GGSN (sending to gtphub) and gtphub will resolve the
|
|
||||||
GGSNs once it has received the messages. So the SGSN may be behind NAT (add
|
|
||||||
"sgsn-use-sender" to gtphub.conf) and communicate to various GGSNs over a
|
|
||||||
single link to gtphub.
|
|
||||||
|
|
||||||
I hope this helps to get you going.
|
|
||||||
Any suggestions/patches are welcome!
|
|
||||||
|
|
||||||
~Neels
|
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
!
|
|
||||||
! Osmocom gtphub configuration
|
|
||||||
!
|
|
||||||
! This file is used for VTY tests, referenced by openbsc/osmoappdesc.py
|
|
||||||
! For the test, try to use most config commands.
|
|
||||||
!
|
|
||||||
|
|
||||||
line vty
|
|
||||||
no login
|
|
||||||
|
|
||||||
gtphub
|
|
||||||
! Local addresses to listen on and send from, both on one interface.
|
|
||||||
! The side towards SGSN uses nonstandard ports.
|
|
||||||
bind-to-sgsns ctrl 127.0.0.1 12123 user 127.0.0.1 12153
|
|
||||||
! The GGSN side with standard ports.
|
|
||||||
bind-to-ggsns 127.0.0.1
|
|
||||||
|
|
||||||
! Proxy: unconditionally direct all traffic to...
|
|
||||||
sgsn-proxy 127.0.0.4
|
|
||||||
|
|
||||||
! Proxy with nonstandard ports or separate IPs:
|
|
||||||
ggsn-proxy ctrl 127.0.0.3 2123 user 127.0.0.5 2152
|
|
||||||
|
|
||||||
! Add a name server for GGSN resolution
|
|
||||||
grx-dns-add 192.168.0.1
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
!
|
|
||||||
! Osmocom gtphub configuration
|
|
||||||
!
|
|
||||||
|
|
||||||
line vty
|
|
||||||
no login
|
|
||||||
|
|
||||||
gtphub
|
|
||||||
! Local addresses to listen on and send from, each on standard ports
|
|
||||||
! 2123 and 2152. Setting these addresses is mandatory.
|
|
||||||
bind-to-sgsns 127.0.0.1
|
|
||||||
bind-to-ggsns 127.0.0.2
|
|
||||||
|
|
||||||
! Local nonstandard ports or separate IPs:
|
|
||||||
!bind-to-sgsns ctrl 127.0.0.1 2342 user 127.0.0.1 4223
|
|
||||||
|
|
||||||
! Proxy: unconditionally direct all traffic to...
|
|
||||||
!ggsn-proxy 127.0.0.3
|
|
||||||
!sgsn-proxy 127.0.0.4
|
|
||||||
|
|
||||||
! Proxy with nonstandard ports or separate IPs:
|
|
||||||
!ggsn-proxy ctrl 127.0.0.3 2123 user 127.0.0.5 2152
|
|
||||||
|
|
||||||
! Add a name server for GGSN resolution
|
|
||||||
!grx-dns-add 192.168.0.1
|
|
||||||
@@ -30,7 +30,7 @@ network
|
|||||||
timer t3103 0
|
timer t3103 0
|
||||||
timer t3105 0
|
timer t3105 0
|
||||||
timer t3107 0
|
timer t3107 0
|
||||||
timer t3109 4
|
timer t3109 0
|
||||||
timer t3111 0
|
timer t3111 0
|
||||||
timer t3113 60
|
timer t3113 60
|
||||||
timer t3115 0
|
timer t3115 0
|
||||||
@@ -60,38 +60,38 @@ network
|
|||||||
max_power_red 12
|
max_power_red 12
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 1
|
rsl e1 tei 1
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH
|
phys_chan_config CCCH
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 1 sub-slot full
|
e1 line 0 timeslot 1 sub-slot full
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 2 sub-slot 1
|
e1 line 0 timeslot 2 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 2 sub-slot 2
|
e1 line 0 timeslot 2 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 2 sub-slot 3
|
e1 line 0 timeslot 2 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 0
|
e1 line 0 timeslot 3 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 1
|
e1 line 0 timeslot 3 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 2
|
e1 line 0 timeslot 3 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 3
|
e1 line 0 timeslot 3 sub-slot 3
|
||||||
trx 1
|
trx 1
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
arfcn 119
|
arfcn 119
|
||||||
@@ -99,66 +99,66 @@ network
|
|||||||
max_power_red 12
|
max_power_red 12
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 2
|
rsl e1 tei 2
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config SDCCH8
|
phys_chan_config SDCCH8
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 4 sub-slot 1
|
e1 line 0 timeslot 4 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 4 sub-slot 2
|
e1 line 0 timeslot 4 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 4 sub-slot 3
|
e1 line 0 timeslot 4 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 5 sub-slot 0
|
e1 line 0 timeslot 5 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 5 sub-slot 1
|
e1 line 0 timeslot 5 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 5 sub-slot 2
|
e1 line 0 timeslot 5 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 1
|
hopping enabled 1
|
||||||
hopping sequence-number 0
|
hopping sequence-number 0
|
||||||
hopping maio 0
|
hopping maio 0
|
||||||
hopping arfcn add 117
|
hopping arfcn add 117
|
||||||
hopping arfcn add 119
|
hopping arfcn add 119
|
||||||
e1 line 0 timeslot 5 sub-slot 3
|
e1 line 0 timeslot 5 sub-slot 3
|
||||||
|
|||||||
@@ -29,56 +29,56 @@ network
|
|||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 1
|
rsl e1 tei 1
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
e1 line 0 timeslot 1 sub-slot full
|
e1 line 0 timeslot 1 sub-slot full
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config SDCCH8
|
phys_chan_config SDCCH8
|
||||||
e1 line 0 timeslot 2 sub-slot 1
|
e1 line 0 timeslot 2 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 2
|
e1 line 0 timeslot 2 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 3
|
e1 line 0 timeslot 2 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 0
|
e1 line 0 timeslot 3 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 1
|
e1 line 0 timeslot 3 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 2
|
e1 line 0 timeslot 3 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 3
|
e1 line 0 timeslot 3 sub-slot 3
|
||||||
trx 1
|
trx 1
|
||||||
arfcn 123
|
arfcn 123
|
||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 2
|
rsl e1 tei 2
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 0
|
e1 line 0 timeslot 4 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 1
|
e1 line 0 timeslot 4 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 2
|
e1 line 0 timeslot 4 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 3
|
e1 line 0 timeslot 4 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 0
|
e1 line 0 timeslot 5 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 1
|
e1 line 0 timeslot 5 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 2
|
e1 line 0 timeslot 5 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 3
|
e1 line 0 timeslot 5 sub-slot 3
|
||||||
|
|||||||
@@ -27,59 +27,59 @@ network
|
|||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 1
|
rsl e1 tei 1
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
e1 line 0 timeslot 1 sub-slot full
|
e1 line 0 timeslot 1 sub-slot full
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 1
|
e1 line 0 timeslot 2 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 2
|
e1 line 0 timeslot 2 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 3
|
e1 line 0 timeslot 2 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 0
|
e1 line 0 timeslot 3 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 1
|
e1 line 0 timeslot 3 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 2
|
e1 line 0 timeslot 3 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 3
|
e1 line 0 timeslot 3 sub-slot 3
|
||||||
trx 1
|
trx 1
|
||||||
arfcn 123
|
arfcn 123
|
||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 2
|
rsl e1 tei 2
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 0
|
e1 line 0 timeslot 4 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 1
|
e1 line 0 timeslot 4 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 2
|
e1 line 0 timeslot 4 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 4 sub-slot 3
|
e1 line 0 timeslot 4 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 0
|
e1 line 0 timeslot 5 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 1
|
e1 line 0 timeslot 5 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 2
|
e1 line 0 timeslot 5 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 5 sub-slot 3
|
e1 line 0 timeslot 5 sub-slot 3
|
||||||
bts 1
|
bts 1
|
||||||
type bs11
|
type bs11
|
||||||
band GSM900
|
band GSM900
|
||||||
@@ -93,56 +93,56 @@ network
|
|||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 1 timeslot 6 sub-slot full
|
rsl e1 line 1 timeslot 6 sub-slot full
|
||||||
rsl e1 tei 1
|
rsl e1 tei 1
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
e1 line 1 timeslot 7 sub-slot 0
|
e1 line 1 timeslot 7 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config SDCCH8
|
phys_chan_config SDCCH8
|
||||||
e1 line 1 timeslot 7 sub-slot 1
|
e1 line 1 timeslot 7 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 7 sub-slot 2
|
e1 line 1 timeslot 7 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 7 sub-slot 3
|
e1 line 1 timeslot 7 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 8 sub-slot 0
|
e1 line 1 timeslot 8 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 8 sub-slot 1
|
e1 line 1 timeslot 8 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 8 sub-slot 2
|
e1 line 1 timeslot 8 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 8 sub-slot 3
|
e1 line 1 timeslot 8 sub-slot 3
|
||||||
trx 1
|
trx 1
|
||||||
arfcn 124
|
arfcn 124
|
||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 1 timeslot 6 sub-slot full
|
rsl e1 line 1 timeslot 6 sub-slot full
|
||||||
rsl e1 tei 2
|
rsl e1 tei 2
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 9 sub-slot 0
|
e1 line 1 timeslot 9 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 9 sub-slot 1
|
e1 line 1 timeslot 9 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 9 sub-slot 2
|
e1 line 1 timeslot 9 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 9 sub-slot 3
|
e1 line 1 timeslot 9 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 10 sub-slot 0
|
e1 line 1 timeslot 10 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 10 sub-slot 1
|
e1 line 1 timeslot 10 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 10 sub-slot 2
|
e1 line 1 timeslot 10 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 1 timeslot 10 sub-slot 3
|
e1 line 1 timeslot 10 sub-slot 3
|
||||||
|
|||||||
@@ -29,28 +29,28 @@ network
|
|||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 1
|
rsl e1 tei 1
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
e1 line 0 timeslot 1 sub-slot full
|
e1 line 0 timeslot 1 sub-slot full
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 1
|
e1 line 0 timeslot 2 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 2
|
e1 line 0 timeslot 2 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 2 sub-slot 3
|
e1 line 0 timeslot 2 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 0
|
e1 line 0 timeslot 3 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 1
|
e1 line 0 timeslot 3 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 2
|
e1 line 0 timeslot 3 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
e1 line 0 timeslot 3 sub-slot 3
|
e1 line 0 timeslot 3 sub-slot 3
|
||||||
|
|
||||||
|
|||||||
87
openbsc/doc/examples/osmo-nitb/hsl/openbsc.cfg
Normal file
87
openbsc/doc/examples/osmo-nitb/hsl/openbsc.cfg
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
!
|
||||||
|
! OpenBSC (0.9.11.261-32c0) configuration saved from vty
|
||||||
|
!!
|
||||||
|
password foo
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
no login
|
||||||
|
!
|
||||||
|
network
|
||||||
|
network country code 262
|
||||||
|
mobile network code 42
|
||||||
|
short name OpenBSC
|
||||||
|
long name OpenBSC
|
||||||
|
auth policy closed
|
||||||
|
location updating reject cause 13
|
||||||
|
encryption a5 0
|
||||||
|
neci 1
|
||||||
|
paging any use tch 0
|
||||||
|
rrlp mode none
|
||||||
|
mm info 0
|
||||||
|
handover 0
|
||||||
|
handover window rxlev averaging 10
|
||||||
|
handover window rxqual averaging 1
|
||||||
|
handover window rxlev neighbor averaging 10
|
||||||
|
handover power budget interval 6
|
||||||
|
handover power budget hysteresis 3
|
||||||
|
handover maximum distance 9999
|
||||||
|
timer t3101 10
|
||||||
|
timer t3103 0
|
||||||
|
timer t3105 0
|
||||||
|
timer t3107 0
|
||||||
|
timer t3109 0
|
||||||
|
timer t3111 0
|
||||||
|
timer t3113 60
|
||||||
|
timer t3115 0
|
||||||
|
timer t3117 0
|
||||||
|
timer t3119 0
|
||||||
|
timer t3122 0
|
||||||
|
timer t3141 0
|
||||||
|
dtx-used 1
|
||||||
|
subscriber-keep-in-ram 0
|
||||||
|
bts 0
|
||||||
|
type hsl_femto
|
||||||
|
band DCS1800
|
||||||
|
cell_identity 0
|
||||||
|
location_area_code 1
|
||||||
|
training_sequence_code 0
|
||||||
|
base_station_id_code 0
|
||||||
|
ms max power 15
|
||||||
|
cell reselection hysteresis 4
|
||||||
|
rxlev access min 0
|
||||||
|
channel allocator ascending
|
||||||
|
rach tx integer 9
|
||||||
|
rach max transmission 1
|
||||||
|
hsl serial-number 8303701
|
||||||
|
neighbor-list mode automatic
|
||||||
|
gprs mode none
|
||||||
|
trx 0
|
||||||
|
rf_locked 0
|
||||||
|
arfcn 871
|
||||||
|
nominal power 23
|
||||||
|
max_power_red 20
|
||||||
|
rsl e1 tei 0
|
||||||
|
timeslot 0
|
||||||
|
phys_chan_config CCCH+SDCCH4
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 1
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 2
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 3
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 4
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 5
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 6
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
|
timeslot 7
|
||||||
|
phys_chan_config TCH/F
|
||||||
|
hopping enabled 0
|
||||||
@@ -6,8 +6,6 @@ password foo
|
|||||||
line vty
|
line vty
|
||||||
no login
|
no login
|
||||||
!
|
!
|
||||||
e1_input
|
|
||||||
e1_line 0 driver ipa
|
|
||||||
network
|
network
|
||||||
network country code 1
|
network country code 1
|
||||||
mobile network code 1
|
mobile network code 1
|
||||||
@@ -30,7 +28,7 @@ network
|
|||||||
timer t3103 0
|
timer t3103 0
|
||||||
timer t3105 0
|
timer t3105 0
|
||||||
timer t3107 0
|
timer t3107 0
|
||||||
timer t3109 4
|
timer t3109 0
|
||||||
timer t3111 0
|
timer t3111 0
|
||||||
timer t3113 60
|
timer t3113 60
|
||||||
timer t3115 0
|
timer t3115 0
|
||||||
@@ -51,7 +49,7 @@ network
|
|||||||
rach tx integer 9
|
rach tx integer 9
|
||||||
rach max transmission 7
|
rach max transmission 7
|
||||||
ip.access unit_id 1800 0
|
ip.access unit_id 1800 0
|
||||||
oml ip.access stream_id 255 line 0
|
oml ip.access stream_id 255
|
||||||
gprs mode none
|
gprs mode none
|
||||||
trx 0
|
trx 0
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
@@ -59,41 +57,41 @@ network
|
|||||||
nominal power 23
|
nominal power 23
|
||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 tei 0
|
rsl e1 tei 0
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config SDCCH8
|
phys_chan_config SDCCH8
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
trx 1
|
trx 1
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
arfcn 873
|
arfcn 873
|
||||||
nominal power 23
|
nominal power 23
|
||||||
max_power_red 0
|
max_power_red 0
|
||||||
rsl e1 tei 0
|
rsl e1 tei 0
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config SDCCH8
|
phys_chan_config SDCCH8
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ password foo
|
|||||||
line vty
|
line vty
|
||||||
no login
|
no login
|
||||||
!
|
!
|
||||||
e1_input
|
|
||||||
e1_line 0 driver ipa
|
|
||||||
network
|
network
|
||||||
network country code 1
|
network country code 1
|
||||||
mobile network code 1
|
mobile network code 1
|
||||||
@@ -30,7 +28,7 @@ network
|
|||||||
timer t3103 0
|
timer t3103 0
|
||||||
timer t3105 0
|
timer t3105 0
|
||||||
timer t3107 0
|
timer t3107 0
|
||||||
timer t3109 4
|
timer t3109 0
|
||||||
timer t3111 0
|
timer t3111 0
|
||||||
timer t3113 60
|
timer t3113 60
|
||||||
timer t3115 0
|
timer t3115 0
|
||||||
@@ -51,7 +49,7 @@ network
|
|||||||
rach tx integer 9
|
rach tx integer 9
|
||||||
rach max transmission 7
|
rach max transmission 7
|
||||||
ip.access unit_id 1801 0
|
ip.access unit_id 1801 0
|
||||||
oml ip.access stream_id 255 line 0
|
oml ip.access stream_id 255
|
||||||
gprs mode none
|
gprs mode none
|
||||||
trx 0
|
trx 0
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
@@ -59,19 +57,19 @@ network
|
|||||||
nominal power 23
|
nominal power 23
|
||||||
max_power_red 20
|
max_power_red 20
|
||||||
rsl e1 tei 0
|
rsl e1 tei 0
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config SDCCH8
|
phys_chan_config SDCCH8
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
|
|||||||
@@ -1,117 +0,0 @@
|
|||||||
!
|
|
||||||
! OpenBSC configuration saved from vty
|
|
||||||
! !
|
|
||||||
password foo
|
|
||||||
!
|
|
||||||
line vty
|
|
||||||
no login
|
|
||||||
!
|
|
||||||
e1_input
|
|
||||||
e1_line 0 driver misdn
|
|
||||||
network
|
|
||||||
network country code 1
|
|
||||||
mobile network code 1
|
|
||||||
short name OpenBSC
|
|
||||||
long name OpenBSC
|
|
||||||
timer t3101 10
|
|
||||||
timer t3113 60
|
|
||||||
bts 0
|
|
||||||
type nokia_site
|
|
||||||
band GSM1800
|
|
||||||
cell_identity 1
|
|
||||||
location_area_code 1
|
|
||||||
base_station_id_code 63
|
|
||||||
training_sequence_code 7
|
|
||||||
|
|
||||||
oml e1 line 0 timeslot 1 sub-slot full
|
|
||||||
oml e1 tei 1
|
|
||||||
|
|
||||||
trx 0
|
|
||||||
arfcn 866
|
|
||||||
max_power_red 24
|
|
||||||
rsl e1 line 0 timeslot 2 sub-slot full
|
|
||||||
rsl e1 tei 1
|
|
||||||
timeslot 0
|
|
||||||
phys_chan_config CCCH+SDCCH4
|
|
||||||
e1 line 0 timeslot 6 sub-slot full
|
|
||||||
timeslot 1
|
|
||||||
phys_chan_config SDCCH8
|
|
||||||
e1 line 0 timeslot 6 sub-slot 1
|
|
||||||
timeslot 2
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 6 sub-slot 2
|
|
||||||
timeslot 3
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 6 sub-slot 3
|
|
||||||
timeslot 4
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 7 sub-slot 0
|
|
||||||
timeslot 5
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 7 sub-slot 1
|
|
||||||
timeslot 6
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 7 sub-slot 2
|
|
||||||
timeslot 7
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 7 sub-slot 3
|
|
||||||
|
|
||||||
trx 1
|
|
||||||
arfcn 870
|
|
||||||
max_power_red 24
|
|
||||||
rsl e1 line 0 timeslot 3 sub-slot full
|
|
||||||
rsl e1 tei 2
|
|
||||||
timeslot 0
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 8 sub-slot 0
|
|
||||||
timeslot 1
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 8 sub-slot 1
|
|
||||||
timeslot 2
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 8 sub-slot 2
|
|
||||||
timeslot 3
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 8 sub-slot 3
|
|
||||||
timeslot 4
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 9 sub-slot 0
|
|
||||||
timeslot 5
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 9 sub-slot 1
|
|
||||||
timeslot 6
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 9 sub-slot 2
|
|
||||||
timeslot 7
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 9 sub-slot 3
|
|
||||||
|
|
||||||
trx 2
|
|
||||||
arfcn 874
|
|
||||||
max_power_red 24
|
|
||||||
rsl e1 line 0 timeslot 4 sub-slot full
|
|
||||||
rsl e1 tei 3
|
|
||||||
timeslot 0
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 10 sub-slot 0
|
|
||||||
timeslot 1
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 10 sub-slot 1
|
|
||||||
timeslot 2
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 10 sub-slot 2
|
|
||||||
timeslot 3
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 10 sub-slot 3
|
|
||||||
timeslot 4
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 11 sub-slot 0
|
|
||||||
timeslot 5
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 11 sub-slot 1
|
|
||||||
timeslot 6
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 11 sub-slot 2
|
|
||||||
timeslot 7
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
e1 line 0 timeslot 11 sub-slot 3
|
|
||||||
@@ -29,7 +29,7 @@ network
|
|||||||
timer t3103 0
|
timer t3103 0
|
||||||
timer t3105 0
|
timer t3105 0
|
||||||
timer t3107 0
|
timer t3107 0
|
||||||
timer t3109 4
|
timer t3109 0
|
||||||
timer t3111 0
|
timer t3111 0
|
||||||
timer t3113 60
|
timer t3113 60
|
||||||
timer t3115 0
|
timer t3115 0
|
||||||
@@ -37,6 +37,7 @@ network
|
|||||||
timer t3119 0
|
timer t3119 0
|
||||||
timer t3122 0
|
timer t3122 0
|
||||||
timer t3141 0
|
timer t3141 0
|
||||||
|
dtx-used 0
|
||||||
subscriber-keep-in-ram 0
|
subscriber-keep-in-ram 0
|
||||||
bts 0
|
bts 0
|
||||||
type rbs2000
|
type rbs2000
|
||||||
@@ -66,38 +67,38 @@ network
|
|||||||
max_power_red 12
|
max_power_red 12
|
||||||
rsl e1 line 0 timeslot 1 sub-slot full
|
rsl e1 line 0 timeslot 1 sub-slot full
|
||||||
rsl e1 tei 0
|
rsl e1 tei 0
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config CCCH+SDCCH4
|
phys_chan_config CCCH+SDCCH4
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 1 sub-slot full
|
e1 line 0 timeslot 1 sub-slot full
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 2 sub-slot 1
|
e1 line 0 timeslot 2 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 2 sub-slot 2
|
e1 line 0 timeslot 2 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 2 sub-slot 3
|
e1 line 0 timeslot 2 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 0
|
e1 line 0 timeslot 3 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 1
|
e1 line 0 timeslot 3 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 2
|
e1 line 0 timeslot 3 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 3 sub-slot 3
|
e1 line 0 timeslot 3 sub-slot 3
|
||||||
trx 1
|
trx 1
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
arfcn 57
|
arfcn 57
|
||||||
@@ -105,38 +106,38 @@ network
|
|||||||
max_power_red 12
|
max_power_red 12
|
||||||
rsl e1 line 0 timeslot 4 sub-slot full
|
rsl e1 line 0 timeslot 4 sub-slot full
|
||||||
rsl e1 tei 1
|
rsl e1 tei 1
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 5 sub-slot 0
|
e1 line 0 timeslot 5 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 5 sub-slot 1
|
e1 line 0 timeslot 5 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 5 sub-slot 2
|
e1 line 0 timeslot 5 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 5 sub-slot 3
|
e1 line 0 timeslot 5 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 6 sub-slot 0
|
e1 line 0 timeslot 6 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 6 sub-slot 1
|
e1 line 0 timeslot 6 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 6 sub-slot 2
|
e1 line 0 timeslot 6 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 6 sub-slot 3
|
e1 line 0 timeslot 6 sub-slot 3
|
||||||
trx 2
|
trx 2
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
arfcn 59
|
arfcn 59
|
||||||
@@ -144,38 +145,38 @@ network
|
|||||||
max_power_red 12
|
max_power_red 12
|
||||||
rsl e1 line 0 timeslot 7 sub-slot full
|
rsl e1 line 0 timeslot 7 sub-slot full
|
||||||
rsl e1 tei 2
|
rsl e1 tei 2
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 8 sub-slot 0
|
e1 line 0 timeslot 8 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 8 sub-slot 1
|
e1 line 0 timeslot 8 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 8 sub-slot 2
|
e1 line 0 timeslot 8 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 8 sub-slot 3
|
e1 line 0 timeslot 8 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 9 sub-slot 0
|
e1 line 0 timeslot 9 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 9 sub-slot 1
|
e1 line 0 timeslot 9 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 9 sub-slot 2
|
e1 line 0 timeslot 9 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 9 sub-slot 3
|
e1 line 0 timeslot 9 sub-slot 3
|
||||||
trx 3
|
trx 3
|
||||||
rf_locked 0
|
rf_locked 0
|
||||||
arfcn 61
|
arfcn 61
|
||||||
@@ -183,38 +184,38 @@ network
|
|||||||
max_power_red 12
|
max_power_red 12
|
||||||
rsl e1 line 0 timeslot 10 sub-slot full
|
rsl e1 line 0 timeslot 10 sub-slot full
|
||||||
rsl e1 tei 3
|
rsl e1 tei 3
|
||||||
timeslot 0
|
timeslot 0
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 11 sub-slot 0
|
e1 line 0 timeslot 11 sub-slot 0
|
||||||
timeslot 1
|
timeslot 1
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 11 sub-slot 1
|
e1 line 0 timeslot 11 sub-slot 1
|
||||||
timeslot 2
|
timeslot 2
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 11 sub-slot 2
|
e1 line 0 timeslot 11 sub-slot 2
|
||||||
timeslot 3
|
timeslot 3
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 11 sub-slot 3
|
e1 line 0 timeslot 11 sub-slot 3
|
||||||
timeslot 4
|
timeslot 4
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 12 sub-slot 0
|
e1 line 0 timeslot 12 sub-slot 0
|
||||||
timeslot 5
|
timeslot 5
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 12 sub-slot 1
|
e1 line 0 timeslot 12 sub-slot 1
|
||||||
timeslot 6
|
timeslot 6
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 12 sub-slot 2
|
e1 line 0 timeslot 12 sub-slot 2
|
||||||
timeslot 7
|
timeslot 7
|
||||||
phys_chan_config TCH/F
|
phys_chan_config TCH/F
|
||||||
hopping enabled 0
|
hopping enabled 0
|
||||||
e1 line 0 timeslot 12 sub-slot 3
|
e1 line 0 timeslot 12 sub-slot 3
|
||||||
|
|
||||||
e1_input
|
e1_input
|
||||||
e1_line 0 driver dahdi
|
e1_line 0 driver dahdi
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
!
|
|
||||||
! OpenBSC configuration saved from vty
|
|
||||||
! !
|
|
||||||
password foo
|
|
||||||
!
|
|
||||||
line vty
|
|
||||||
no login
|
|
||||||
!
|
|
||||||
e1_input
|
|
||||||
e1_line 0 driver ipa
|
|
||||||
network
|
|
||||||
network country code 1
|
|
||||||
mobile network code 1
|
|
||||||
short name OpenBSC
|
|
||||||
long name OpenBSC
|
|
||||||
auth policy closed
|
|
||||||
location updating reject cause 13
|
|
||||||
encryption a5 0
|
|
||||||
neci 1
|
|
||||||
rrlp mode none
|
|
||||||
mm info 1
|
|
||||||
handover 0
|
|
||||||
handover window rxlev averaging 10
|
|
||||||
handover window rxqual averaging 1
|
|
||||||
handover window rxlev neighbor averaging 10
|
|
||||||
handover power budget interval 6
|
|
||||||
handover power budget hysteresis 3
|
|
||||||
handover maximum distance 9999
|
|
||||||
timer t3101 10
|
|
||||||
timer t3103 0
|
|
||||||
timer t3105 0
|
|
||||||
timer t3107 0
|
|
||||||
timer t3109 4
|
|
||||||
timer t3111 0
|
|
||||||
timer t3113 60
|
|
||||||
timer t3115 0
|
|
||||||
timer t3117 0
|
|
||||||
timer t3119 0
|
|
||||||
timer t3141 0
|
|
||||||
bts 0
|
|
||||||
type sysmobts
|
|
||||||
band DCS1800
|
|
||||||
cell_identity 0
|
|
||||||
location_area_code 1
|
|
||||||
training_sequence_code 7
|
|
||||||
base_station_id_code 63
|
|
||||||
ms max power 15
|
|
||||||
cell reselection hysteresis 4
|
|
||||||
rxlev access min 0
|
|
||||||
channel allocator ascending
|
|
||||||
rach tx integer 9
|
|
||||||
rach max transmission 7
|
|
||||||
ip.access unit_id 1801 0
|
|
||||||
oml ip.access stream_id 255 line 0
|
|
||||||
gprs mode none
|
|
||||||
trx 0
|
|
||||||
rf_locked 0
|
|
||||||
arfcn 514
|
|
||||||
nominal power 23
|
|
||||||
max_power_red 20
|
|
||||||
rsl e1 tei 0
|
|
||||||
timeslot 0
|
|
||||||
phys_chan_config CCCH+SDCCH4
|
|
||||||
timeslot 1
|
|
||||||
phys_chan_config SDCCH8
|
|
||||||
timeslot 2
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
timeslot 3
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
timeslot 4
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
timeslot 5
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
timeslot 6
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
timeslot 7
|
|
||||||
phys_chan_config TCH/F
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user