mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-11-04 05:53:26 +00:00 
			
		
		
		
	Compare commits
	
		
			93 Commits
		
	
	
		
			1.1.0
			...
			on-waves/0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					fdc64f6806 | ||
| 
						 | 
					ab46372e2a | ||
| 
						 | 
					ff0a562f9a | ||
| 
						 | 
					556008d724 | ||
| 
						 | 
					0094f84f30 | ||
| 
						 | 
					86069143ff | ||
| 
						 | 
					44f0be88a3 | ||
| 
						 | 
					5d88b372d7 | ||
| 
						 | 
					71c7bf5907 | ||
| 
						 | 
					869033148c | ||
| 
						 | 
					bc0f7c0988 | ||
| 
						 | 
					7d06063cfb | ||
| 
						 | 
					4e42b637fd | ||
| 
						 | 
					f44de9942b | ||
| 
						 | 
					3a110ae60b | ||
| 
						 | 
					bb84adc465 | ||
| 
						 | 
					8d123ea3c0 | ||
| 
						 | 
					88ca894df7 | ||
| 
						 | 
					42b0d6b494 | ||
| 
						 | 
					82d8b0457b | ||
| 
						 | 
					433d6ee1a2 | ||
| 
						 | 
					203a6eddf8 | ||
| 
						 | 
					56ef6249e3 | ||
| 
						 | 
					b2a96b1be7 | ||
| 
						 | 
					d4c29c1574 | ||
| 
						 | 
					3d947e6d67 | ||
| 
						 | 
					b62c9a19cf | ||
| 
						 | 
					ff5957568f | ||
| 
						 | 
					7d2e1ca4be | ||
| 
						 | 
					7ce2e0c8b0 | ||
| 
						 | 
					78d442420b | ||
| 
						 | 
					8cd2709ebf | ||
| 
						 | 
					41a1780102 | ||
| 
						 | 
					2f84715984 | ||
| 
						 | 
					7253154fc5 | ||
| 
						 | 
					6c1c76683f | ||
| 
						 | 
					a92fe9a4ca | ||
| 
						 | 
					e83a3f584e | ||
| 
						 | 
					118ddebc36 | ||
| 
						 | 
					bb53004d47 | ||
| 
						 | 
					6af20842cb | ||
| 
						 | 
					cc41cb07e7 | ||
| 
						 | 
					d6fb23523a | ||
| 
						 | 
					2aa0b45cc0 | ||
| 
						 | 
					619df61ad2 | ||
| 
						 | 
					893ea65f38 | ||
| 
						 | 
					64b811f113 | ||
| 
						 | 
					91fc9bf862 | ||
| 
						 | 
					111a58dd37 | ||
| 
						 | 
					d1a2563a74 | ||
| 
						 | 
					7d3ef919ce | ||
| 
						 | 
					cba98d87d6 | ||
| 
						 | 
					5c18ad0829 | ||
| 
						 | 
					0d9ed87d5c | ||
| 
						 | 
					ec7be0c969 | ||
| 
						 | 
					9be3347601 | ||
| 
						 | 
					3eef7b7d81 | ||
| 
						 | 
					9de4a6daa9 | ||
| 
						 | 
					851ace9f33 | ||
| 
						 | 
					d1dd069b48 | ||
| 
						 | 
					401db32ca2 | ||
| 
						 | 
					17e03d21d2 | ||
| 
						 | 
					26a9bff201 | ||
| 
						 | 
					80fb260a60 | ||
| 
						 | 
					55a0716da7 | ||
| 
						 | 
					c88fb75616 | ||
| 
						 | 
					d55a4dc326 | ||
| 
						 | 
					a4e6f2e6e1 | ||
| 
						 | 
					7f71d99cc3 | ||
| 
						 | 
					b92167cf80 | ||
| 
						 | 
					4b6a6dbe7e | ||
| 
						 | 
					763e8c7766 | ||
| 
						 | 
					823ff16088 | ||
| 
						 | 
					6f93c6a1e0 | ||
| 
						 | 
					f97e48b0de | ||
| 
						 | 
					761600b0fd | ||
| 
						 | 
					8549462bc6 | ||
| 
						 | 
					436e5c6308 | ||
| 
						 | 
					f8b9d844c1 | ||
| 
						 | 
					58ec07d580 | ||
| 
						 | 
					71465c21f4 | ||
| 
						 | 
					16d0a833f8 | ||
| 
						 | 
					ea72b62cac | ||
| 
						 | 
					49a84ec6e9 | ||
| 
						 | 
					42c636b6c8 | ||
| 
						 | 
					a0a55f555e | ||
| 
						 | 
					23ed00e410 | ||
| 
						 | 
					3fe910b9f1 | ||
| 
						 | 
					097bdeb77d | ||
| 
						 | 
					1b85de02e0 | ||
| 
						 | 
					2281d1835f | ||
| 
						 | 
					fb4433a129 | ||
| 
						 | 
					d954dcf9e1 | 
							
								
								
									
										83
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,83 +0,0 @@
 | 
			
		||||
debian/*.log
 | 
			
		||||
*.o
 | 
			
		||||
*.lo
 | 
			
		||||
*.a
 | 
			
		||||
.deps
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
bscconfig.h
 | 
			
		||||
bscconfig.h.in
 | 
			
		||||
openbsc.pc
 | 
			
		||||
src/osmo-nitb/osmo-nitb
 | 
			
		||||
src/osmo-bsc_mgcp/osmo-bsc_mgcp
 | 
			
		||||
src/osmo-bsc/osmo-bsc
 | 
			
		||||
src/utils/meas_vis
 | 
			
		||||
src/utils/meas_json
 | 
			
		||||
src/utils/osmo-meas-pcap2db
 | 
			
		||||
src/utils/osmo-meas-udp2db
 | 
			
		||||
src/utils/smpp_mirror
 | 
			
		||||
*.*~
 | 
			
		||||
*.sw?
 | 
			
		||||
.libs
 | 
			
		||||
*.pyc
 | 
			
		||||
*.gcda
 | 
			
		||||
*.gcno
 | 
			
		||||
 | 
			
		||||
#configure
 | 
			
		||||
aclocal.m4
 | 
			
		||||
autom4te.cache/
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
config.guess
 | 
			
		||||
config.sub
 | 
			
		||||
configure
 | 
			
		||||
compile
 | 
			
		||||
depcomp
 | 
			
		||||
install-sh
 | 
			
		||||
missing
 | 
			
		||||
stamp-h1
 | 
			
		||||
libtool
 | 
			
		||||
ltmain.sh
 | 
			
		||||
 | 
			
		||||
# git-version-gen magic
 | 
			
		||||
.tarball-version
 | 
			
		||||
.version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# apps and app data
 | 
			
		||||
hlr.sqlite3
 | 
			
		||||
src/utils/bs11_config
 | 
			
		||||
src/ipaccess/ipaccess-config
 | 
			
		||||
src/ipaccess/abisip-find
 | 
			
		||||
src/ipaccess/ipaccess-firmware
 | 
			
		||||
src/ipaccess/ipaccess-proxy
 | 
			
		||||
src/utils/isdnsync
 | 
			
		||||
src/nat/bsc_nat
 | 
			
		||||
src/gprs/osmo-sgsn
 | 
			
		||||
src/gprs/osmo-gbproxy
 | 
			
		||||
src/gprs/osmo-gtphub
 | 
			
		||||
src/osmo-bsc_nat/osmo-bsc_nat
 | 
			
		||||
src/libcommon/gsup_test_client
 | 
			
		||||
src/osmo-msc/osmo-msc
 | 
			
		||||
 | 
			
		||||
#tests
 | 
			
		||||
tests/testsuite.dir
 | 
			
		||||
tests/*/*_test
 | 
			
		||||
# ignore compiled binaries like msc_vlr_test_foo; do not ignore
 | 
			
		||||
# msc_vlr_test_foo.{c,ok,err}, but do still ignore the corresponding .o object
 | 
			
		||||
# files:
 | 
			
		||||
tests/msc_vlr/msc_vlr_test_*
 | 
			
		||||
!tests/msc_vlr/msc_vlr_test_*.*
 | 
			
		||||
tests/msc_vlr/msc_vlr_test_*.o
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
tests/atconfig
 | 
			
		||||
tests/atlocal
 | 
			
		||||
tests/package.m4
 | 
			
		||||
tests/testsuite
 | 
			
		||||
tests/testsuite.log
 | 
			
		||||
 | 
			
		||||
gsn_restart
 | 
			
		||||
src/openbsc.cfg*
 | 
			
		||||
writtenconfig/
 | 
			
		||||
gtphub_restart_count
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
[gerrit]
 | 
			
		||||
host=gerrit.osmocom.org
 | 
			
		||||
project=osmo-mgw
 | 
			
		||||
							
								
								
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							@@ -1,12 +0,0 @@
 | 
			
		||||
Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
Harald Welte <laforge@gnumonks.org> <laflocal@hanuman.gnumonks.org>
 | 
			
		||||
Harald Welte <laforge@gnumonks.org> <laflocal@goeller.de.gnumonks.org>
 | 
			
		||||
Holger Hans Peter Freyther <holger@moiji-mobile.com> <zecke@selfish.org>
 | 
			
		||||
Holger Hans Peter Freyther <holger@moiji-mobile.com> <ich@tamarin.(none)>
 | 
			
		||||
Holger Hans Peter Freyther <holgre@moiji-mobile.com> <holger@freyther.de>
 | 
			
		||||
Andreas Eversberg <jolly@eversberg.eu>
 | 
			
		||||
Andreas Eversberg <jolly@eversberg.eu> <Andreas.Eversberg@versatel.de>
 | 
			
		||||
Andreas Eversberg <jolly@eversberg.eu> <root@nuedel.(none)>
 | 
			
		||||
Pablo Neira Ayuso <pablo@soleta.eu> <pablo@gnumonks.org>
 | 
			
		||||
Max Suraev <msuraev@sysmocom.de>
 | 
			
		||||
Tom Tsou <tom.tsou@ettus.com> <tom@tsou.cc>
 | 
			
		||||
							
								
								
									
										661
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										661
									
								
								COPYING
									
									
									
									
									
								
							@@ -1,661 +0,0 @@
 | 
			
		||||
                    GNU AFFERO GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 3, 19 November 2007
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 | 
			
		||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
			
		||||
 of this license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
                            Preamble
 | 
			
		||||
 | 
			
		||||
  The GNU Affero General Public License is a free, copyleft license for
 | 
			
		||||
software and other kinds of works, specifically designed to ensure
 | 
			
		||||
cooperation with the community in the case of network server software.
 | 
			
		||||
 | 
			
		||||
  The licenses for most software and other practical works are designed
 | 
			
		||||
to take away your freedom to share and change the works.  By contrast,
 | 
			
		||||
our General Public Licenses are intended to guarantee your freedom to
 | 
			
		||||
share and change all versions of a program--to make sure it remains free
 | 
			
		||||
software for all its users.
 | 
			
		||||
 | 
			
		||||
  When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price.  Our General Public Licenses are designed to make sure that you
 | 
			
		||||
have the freedom to distribute copies of free software (and charge for
 | 
			
		||||
them if you wish), that you receive source code or can get it if you
 | 
			
		||||
want it, that you can change the software or use pieces of it in new
 | 
			
		||||
free programs, and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
  Developers that use our General Public Licenses protect your rights
 | 
			
		||||
with two steps: (1) assert copyright on the software, and (2) offer
 | 
			
		||||
you this License which gives you legal permission to copy, distribute
 | 
			
		||||
and/or modify the software.
 | 
			
		||||
 | 
			
		||||
  A secondary benefit of defending all users' freedom is that
 | 
			
		||||
improvements made in alternate versions of the program, if they
 | 
			
		||||
receive widespread use, become available for other developers to
 | 
			
		||||
incorporate.  Many developers of free software are heartened and
 | 
			
		||||
encouraged by the resulting cooperation.  However, in the case of
 | 
			
		||||
software used on network servers, this result may fail to come about.
 | 
			
		||||
The GNU General Public License permits making a modified version and
 | 
			
		||||
letting the public access it on a server without ever releasing its
 | 
			
		||||
source code to the public.
 | 
			
		||||
 | 
			
		||||
  The GNU Affero General Public License is designed specifically to
 | 
			
		||||
ensure that, in such cases, the modified source code becomes available
 | 
			
		||||
to the community.  It requires the operator of a network server to
 | 
			
		||||
provide the source code of the modified version running there to the
 | 
			
		||||
users of that server.  Therefore, public use of a modified version, on
 | 
			
		||||
a publicly accessible server, gives the public access to the source
 | 
			
		||||
code of the modified version.
 | 
			
		||||
 | 
			
		||||
  An older license, called the Affero General Public License and
 | 
			
		||||
published by Affero, was designed to accomplish similar goals.  This is
 | 
			
		||||
a different license, not a version of the Affero GPL, but Affero has
 | 
			
		||||
released a new version of the Affero GPL which permits relicensing under
 | 
			
		||||
this license.
 | 
			
		||||
 | 
			
		||||
  The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
 | 
			
		||||
                       TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
  0. Definitions.
 | 
			
		||||
 | 
			
		||||
  "This License" refers to version 3 of the GNU Affero General Public License.
 | 
			
		||||
 | 
			
		||||
  "Copyright" also means copyright-like laws that apply to other kinds of
 | 
			
		||||
works, such as semiconductor masks.
 | 
			
		||||
 | 
			
		||||
  "The Program" refers to any copyrightable work licensed under this
 | 
			
		||||
License.  Each licensee is addressed as "you".  "Licensees" and
 | 
			
		||||
"recipients" may be individuals or organizations.
 | 
			
		||||
 | 
			
		||||
  To "modify" a work means to copy from or adapt all or part of the work
 | 
			
		||||
in a fashion requiring copyright permission, other than the making of an
 | 
			
		||||
exact copy.  The resulting work is called a "modified version" of the
 | 
			
		||||
earlier work or a work "based on" the earlier work.
 | 
			
		||||
 | 
			
		||||
  A "covered work" means either the unmodified Program or a work based
 | 
			
		||||
on the Program.
 | 
			
		||||
 | 
			
		||||
  To "propagate" a work means to do anything with it that, without
 | 
			
		||||
permission, would make you directly or secondarily liable for
 | 
			
		||||
infringement under applicable copyright law, except executing it on a
 | 
			
		||||
computer or modifying a private copy.  Propagation includes copying,
 | 
			
		||||
distribution (with or without modification), making available to the
 | 
			
		||||
public, and in some countries other activities as well.
 | 
			
		||||
 | 
			
		||||
  To "convey" a work means any kind of propagation that enables other
 | 
			
		||||
parties to make or receive copies.  Mere interaction with a user through
 | 
			
		||||
a computer network, with no transfer of a copy, is not conveying.
 | 
			
		||||
 | 
			
		||||
  An interactive user interface displays "Appropriate Legal Notices"
 | 
			
		||||
to the extent that it includes a convenient and prominently visible
 | 
			
		||||
feature that (1) displays an appropriate copyright notice, and (2)
 | 
			
		||||
tells the user that there is no warranty for the work (except to the
 | 
			
		||||
extent that warranties are provided), that licensees may convey the
 | 
			
		||||
work under this License, and how to view a copy of this License.  If
 | 
			
		||||
the interface presents a list of user commands or options, such as a
 | 
			
		||||
menu, a prominent item in the list meets this criterion.
 | 
			
		||||
 | 
			
		||||
  1. Source Code.
 | 
			
		||||
 | 
			
		||||
  The "source code" for a work means the preferred form of the work
 | 
			
		||||
for making modifications to it.  "Object code" means any non-source
 | 
			
		||||
form of a work.
 | 
			
		||||
 | 
			
		||||
  A "Standard Interface" means an interface that either is an official
 | 
			
		||||
standard defined by a recognized standards body, or, in the case of
 | 
			
		||||
interfaces specified for a particular programming language, one that
 | 
			
		||||
is widely used among developers working in that language.
 | 
			
		||||
 | 
			
		||||
  The "System Libraries" of an executable work include anything, other
 | 
			
		||||
than the work as a whole, that (a) is included in the normal form of
 | 
			
		||||
packaging a Major Component, but which is not part of that Major
 | 
			
		||||
Component, and (b) serves only to enable use of the work with that
 | 
			
		||||
Major Component, or to implement a Standard Interface for which an
 | 
			
		||||
implementation is available to the public in source code form.  A
 | 
			
		||||
"Major Component", in this context, means a major essential component
 | 
			
		||||
(kernel, window system, and so on) of the specific operating system
 | 
			
		||||
(if any) on which the executable work runs, or a compiler used to
 | 
			
		||||
produce the work, or an object code interpreter used to run it.
 | 
			
		||||
 | 
			
		||||
  The "Corresponding Source" for a work in object code form means all
 | 
			
		||||
the source code needed to generate, install, and (for an executable
 | 
			
		||||
work) run the object code and to modify the work, including scripts to
 | 
			
		||||
control those activities.  However, it does not include the work's
 | 
			
		||||
System Libraries, or general-purpose tools or generally available free
 | 
			
		||||
programs which are used unmodified in performing those activities but
 | 
			
		||||
which are not part of the work.  For example, Corresponding Source
 | 
			
		||||
includes interface definition files associated with source files for
 | 
			
		||||
the work, and the source code for shared libraries and dynamically
 | 
			
		||||
linked subprograms that the work is specifically designed to require,
 | 
			
		||||
such as by intimate data communication or control flow between those
 | 
			
		||||
subprograms and other parts of the work.
 | 
			
		||||
 | 
			
		||||
  The Corresponding Source need not include anything that users
 | 
			
		||||
can regenerate automatically from other parts of the Corresponding
 | 
			
		||||
Source.
 | 
			
		||||
 | 
			
		||||
  The Corresponding Source for a work in source code form is that
 | 
			
		||||
same work.
 | 
			
		||||
 | 
			
		||||
  2. Basic Permissions.
 | 
			
		||||
 | 
			
		||||
  All rights granted under this License are granted for the term of
 | 
			
		||||
copyright on the Program, and are irrevocable provided the stated
 | 
			
		||||
conditions are met.  This License explicitly affirms your unlimited
 | 
			
		||||
permission to run the unmodified Program.  The output from running a
 | 
			
		||||
covered work is covered by this License only if the output, given its
 | 
			
		||||
content, constitutes a covered work.  This License acknowledges your
 | 
			
		||||
rights of fair use or other equivalent, as provided by copyright law.
 | 
			
		||||
 | 
			
		||||
  You may make, run and propagate covered works that you do not
 | 
			
		||||
convey, without conditions so long as your license otherwise remains
 | 
			
		||||
in force.  You may convey covered works to others for the sole purpose
 | 
			
		||||
of having them make modifications exclusively for you, or provide you
 | 
			
		||||
with facilities for running those works, provided that you comply with
 | 
			
		||||
the terms of this License in conveying all material for which you do
 | 
			
		||||
not control copyright.  Those thus making or running the covered works
 | 
			
		||||
for you must do so exclusively on your behalf, under your direction
 | 
			
		||||
and control, on terms that prohibit them from making any copies of
 | 
			
		||||
your copyrighted material outside their relationship with you.
 | 
			
		||||
 | 
			
		||||
  Conveying under any other circumstances is permitted solely under
 | 
			
		||||
the conditions stated below.  Sublicensing is not allowed; section 10
 | 
			
		||||
makes it unnecessary.
 | 
			
		||||
 | 
			
		||||
  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 | 
			
		||||
 | 
			
		||||
  No covered work shall be deemed part of an effective technological
 | 
			
		||||
measure under any applicable law fulfilling obligations under article
 | 
			
		||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
 | 
			
		||||
similar laws prohibiting or restricting circumvention of such
 | 
			
		||||
measures.
 | 
			
		||||
 | 
			
		||||
  When you convey a covered work, you waive any legal power to forbid
 | 
			
		||||
circumvention of technological measures to the extent such circumvention
 | 
			
		||||
is effected by exercising rights under this License with respect to
 | 
			
		||||
the covered work, and you disclaim any intention to limit operation or
 | 
			
		||||
modification of the work as a means of enforcing, against the work's
 | 
			
		||||
users, your or third parties' legal rights to forbid circumvention of
 | 
			
		||||
technological measures.
 | 
			
		||||
 | 
			
		||||
  4. Conveying Verbatim Copies.
 | 
			
		||||
 | 
			
		||||
  You may convey verbatim copies of the Program's source code as you
 | 
			
		||||
receive it, in any medium, provided that you conspicuously and
 | 
			
		||||
appropriately publish on each copy an appropriate copyright notice;
 | 
			
		||||
keep intact all notices stating that this License and any
 | 
			
		||||
non-permissive terms added in accord with section 7 apply to the code;
 | 
			
		||||
keep intact all notices of the absence of any warranty; and give all
 | 
			
		||||
recipients a copy of this License along with the Program.
 | 
			
		||||
 | 
			
		||||
  You may charge any price or no price for each copy that you convey,
 | 
			
		||||
and you may offer support or warranty protection for a fee.
 | 
			
		||||
 | 
			
		||||
  5. Conveying Modified Source Versions.
 | 
			
		||||
 | 
			
		||||
  You may convey a work based on the Program, or the modifications to
 | 
			
		||||
produce it from the Program, in the form of source code under the
 | 
			
		||||
terms of section 4, provided that you also meet all of these conditions:
 | 
			
		||||
 | 
			
		||||
    a) The work must carry prominent notices stating that you modified
 | 
			
		||||
    it, and giving a relevant date.
 | 
			
		||||
 | 
			
		||||
    b) The work must carry prominent notices stating that it is
 | 
			
		||||
    released under this License and any conditions added under section
 | 
			
		||||
    7.  This requirement modifies the requirement in section 4 to
 | 
			
		||||
    "keep intact all notices".
 | 
			
		||||
 | 
			
		||||
    c) You must license the entire work, as a whole, under this
 | 
			
		||||
    License to anyone who comes into possession of a copy.  This
 | 
			
		||||
    License will therefore apply, along with any applicable section 7
 | 
			
		||||
    additional terms, to the whole of the work, and all its parts,
 | 
			
		||||
    regardless of how they are packaged.  This License gives no
 | 
			
		||||
    permission to license the work in any other way, but it does not
 | 
			
		||||
    invalidate such permission if you have separately received it.
 | 
			
		||||
 | 
			
		||||
    d) If the work has interactive user interfaces, each must display
 | 
			
		||||
    Appropriate Legal Notices; however, if the Program has interactive
 | 
			
		||||
    interfaces that do not display Appropriate Legal Notices, your
 | 
			
		||||
    work need not make them do so.
 | 
			
		||||
 | 
			
		||||
  A compilation of a covered work with other separate and independent
 | 
			
		||||
works, which are not by their nature extensions of the covered work,
 | 
			
		||||
and which are not combined with it such as to form a larger program,
 | 
			
		||||
in or on a volume of a storage or distribution medium, is called an
 | 
			
		||||
"aggregate" if the compilation and its resulting copyright are not
 | 
			
		||||
used to limit the access or legal rights of the compilation's users
 | 
			
		||||
beyond what the individual works permit.  Inclusion of a covered work
 | 
			
		||||
in an aggregate does not cause this License to apply to the other
 | 
			
		||||
parts of the aggregate.
 | 
			
		||||
 | 
			
		||||
  6. Conveying Non-Source Forms.
 | 
			
		||||
 | 
			
		||||
  You may convey a covered work in object code form under the terms
 | 
			
		||||
of sections 4 and 5, provided that you also convey the
 | 
			
		||||
machine-readable Corresponding Source under the terms of this License,
 | 
			
		||||
in one of these ways:
 | 
			
		||||
 | 
			
		||||
    a) Convey the object code in, or embodied in, a physical product
 | 
			
		||||
    (including a physical distribution medium), accompanied by the
 | 
			
		||||
    Corresponding Source fixed on a durable physical medium
 | 
			
		||||
    customarily used for software interchange.
 | 
			
		||||
 | 
			
		||||
    b) Convey the object code in, or embodied in, a physical product
 | 
			
		||||
    (including a physical distribution medium), accompanied by a
 | 
			
		||||
    written offer, valid for at least three years and valid for as
 | 
			
		||||
    long as you offer spare parts or customer support for that product
 | 
			
		||||
    model, to give anyone who possesses the object code either (1) a
 | 
			
		||||
    copy of the Corresponding Source for all the software in the
 | 
			
		||||
    product that is covered by this License, on a durable physical
 | 
			
		||||
    medium customarily used for software interchange, for a price no
 | 
			
		||||
    more than your reasonable cost of physically performing this
 | 
			
		||||
    conveying of source, or (2) access to copy the
 | 
			
		||||
    Corresponding Source from a network server at no charge.
 | 
			
		||||
 | 
			
		||||
    c) Convey individual copies of the object code with a copy of the
 | 
			
		||||
    written offer to provide the Corresponding Source.  This
 | 
			
		||||
    alternative is allowed only occasionally and noncommercially, and
 | 
			
		||||
    only if you received the object code with such an offer, in accord
 | 
			
		||||
    with subsection 6b.
 | 
			
		||||
 | 
			
		||||
    d) Convey the object code by offering access from a designated
 | 
			
		||||
    place (gratis or for a charge), and offer equivalent access to the
 | 
			
		||||
    Corresponding Source in the same way through the same place at no
 | 
			
		||||
    further charge.  You need not require recipients to copy the
 | 
			
		||||
    Corresponding Source along with the object code.  If the place to
 | 
			
		||||
    copy the object code is a network server, the Corresponding Source
 | 
			
		||||
    may be on a different server (operated by you or a third party)
 | 
			
		||||
    that supports equivalent copying facilities, provided you maintain
 | 
			
		||||
    clear directions next to the object code saying where to find the
 | 
			
		||||
    Corresponding Source.  Regardless of what server hosts the
 | 
			
		||||
    Corresponding Source, you remain obligated to ensure that it is
 | 
			
		||||
    available for as long as needed to satisfy these requirements.
 | 
			
		||||
 | 
			
		||||
    e) Convey the object code using peer-to-peer transmission, provided
 | 
			
		||||
    you inform other peers where the object code and Corresponding
 | 
			
		||||
    Source of the work are being offered to the general public at no
 | 
			
		||||
    charge under subsection 6d.
 | 
			
		||||
 | 
			
		||||
  A separable portion of the object code, whose source code is excluded
 | 
			
		||||
from the Corresponding Source as a System Library, need not be
 | 
			
		||||
included in conveying the object code work.
 | 
			
		||||
 | 
			
		||||
  A "User Product" is either (1) a "consumer product", which means any
 | 
			
		||||
tangible personal property which is normally used for personal, family,
 | 
			
		||||
or household purposes, or (2) anything designed or sold for incorporation
 | 
			
		||||
into a dwelling.  In determining whether a product is a consumer product,
 | 
			
		||||
doubtful cases shall be resolved in favor of coverage.  For a particular
 | 
			
		||||
product received by a particular user, "normally used" refers to a
 | 
			
		||||
typical or common use of that class of product, regardless of the status
 | 
			
		||||
of the particular user or of the way in which the particular user
 | 
			
		||||
actually uses, or expects or is expected to use, the product.  A product
 | 
			
		||||
is a consumer product regardless of whether the product has substantial
 | 
			
		||||
commercial, industrial or non-consumer uses, unless such uses represent
 | 
			
		||||
the only significant mode of use of the product.
 | 
			
		||||
 | 
			
		||||
  "Installation Information" for a User Product means any methods,
 | 
			
		||||
procedures, authorization keys, or other information required to install
 | 
			
		||||
and execute modified versions of a covered work in that User Product from
 | 
			
		||||
a modified version of its Corresponding Source.  The information must
 | 
			
		||||
suffice to ensure that the continued functioning of the modified object
 | 
			
		||||
code is in no case prevented or interfered with solely because
 | 
			
		||||
modification has been made.
 | 
			
		||||
 | 
			
		||||
  If you convey an object code work under this section in, or with, or
 | 
			
		||||
specifically for use in, a User Product, and the conveying occurs as
 | 
			
		||||
part of a transaction in which the right of possession and use of the
 | 
			
		||||
User Product is transferred to the recipient in perpetuity or for a
 | 
			
		||||
fixed term (regardless of how the transaction is characterized), the
 | 
			
		||||
Corresponding Source conveyed under this section must be accompanied
 | 
			
		||||
by the Installation Information.  But this requirement does not apply
 | 
			
		||||
if neither you nor any third party retains the ability to install
 | 
			
		||||
modified object code on the User Product (for example, the work has
 | 
			
		||||
been installed in ROM).
 | 
			
		||||
 | 
			
		||||
  The requirement to provide Installation Information does not include a
 | 
			
		||||
requirement to continue to provide support service, warranty, or updates
 | 
			
		||||
for a work that has been modified or installed by the recipient, or for
 | 
			
		||||
the User Product in which it has been modified or installed.  Access to a
 | 
			
		||||
network may be denied when the modification itself materially and
 | 
			
		||||
adversely affects the operation of the network or violates the rules and
 | 
			
		||||
protocols for communication across the network.
 | 
			
		||||
 | 
			
		||||
  Corresponding Source conveyed, and Installation Information provided,
 | 
			
		||||
in accord with this section must be in a format that is publicly
 | 
			
		||||
documented (and with an implementation available to the public in
 | 
			
		||||
source code form), and must require no special password or key for
 | 
			
		||||
unpacking, reading or copying.
 | 
			
		||||
 | 
			
		||||
  7. Additional Terms.
 | 
			
		||||
 | 
			
		||||
  "Additional permissions" are terms that supplement the terms of this
 | 
			
		||||
License by making exceptions from one or more of its conditions.
 | 
			
		||||
Additional permissions that are applicable to the entire Program shall
 | 
			
		||||
be treated as though they were included in this License, to the extent
 | 
			
		||||
that they are valid under applicable law.  If additional permissions
 | 
			
		||||
apply only to part of the Program, that part may be used separately
 | 
			
		||||
under those permissions, but the entire Program remains governed by
 | 
			
		||||
this License without regard to the additional permissions.
 | 
			
		||||
 | 
			
		||||
  When you convey a copy of a covered work, you may at your option
 | 
			
		||||
remove any additional permissions from that copy, or from any part of
 | 
			
		||||
it.  (Additional permissions may be written to require their own
 | 
			
		||||
removal in certain cases when you modify the work.)  You may place
 | 
			
		||||
additional permissions on material, added by you to a covered work,
 | 
			
		||||
for which you have or can give appropriate copyright permission.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, for material you
 | 
			
		||||
add to a covered work, you may (if authorized by the copyright holders of
 | 
			
		||||
that material) supplement the terms of this License with terms:
 | 
			
		||||
 | 
			
		||||
    a) Disclaiming warranty or limiting liability differently from the
 | 
			
		||||
    terms of sections 15 and 16 of this License; or
 | 
			
		||||
 | 
			
		||||
    b) Requiring preservation of specified reasonable legal notices or
 | 
			
		||||
    author attributions in that material or in the Appropriate Legal
 | 
			
		||||
    Notices displayed by works containing it; or
 | 
			
		||||
 | 
			
		||||
    c) Prohibiting misrepresentation of the origin of that material, or
 | 
			
		||||
    requiring that modified versions of such material be marked in
 | 
			
		||||
    reasonable ways as different from the original version; or
 | 
			
		||||
 | 
			
		||||
    d) Limiting the use for publicity purposes of names of licensors or
 | 
			
		||||
    authors of the material; or
 | 
			
		||||
 | 
			
		||||
    e) Declining to grant rights under trademark law for use of some
 | 
			
		||||
    trade names, trademarks, or service marks; or
 | 
			
		||||
 | 
			
		||||
    f) Requiring indemnification of licensors and authors of that
 | 
			
		||||
    material by anyone who conveys the material (or modified versions of
 | 
			
		||||
    it) with contractual assumptions of liability to the recipient, for
 | 
			
		||||
    any liability that these contractual assumptions directly impose on
 | 
			
		||||
    those licensors and authors.
 | 
			
		||||
 | 
			
		||||
  All other non-permissive additional terms are considered "further
 | 
			
		||||
restrictions" within the meaning of section 10.  If the Program as you
 | 
			
		||||
received it, or any part of it, contains a notice stating that it is
 | 
			
		||||
governed by this License along with a term that is a further
 | 
			
		||||
restriction, you may remove that term.  If a license document contains
 | 
			
		||||
a further restriction but permits relicensing or conveying under this
 | 
			
		||||
License, you may add to a covered work material governed by the terms
 | 
			
		||||
of that license document, provided that the further restriction does
 | 
			
		||||
not survive such relicensing or conveying.
 | 
			
		||||
 | 
			
		||||
  If you add terms to a covered work in accord with this section, you
 | 
			
		||||
must place, in the relevant source files, a statement of the
 | 
			
		||||
additional terms that apply to those files, or a notice indicating
 | 
			
		||||
where to find the applicable terms.
 | 
			
		||||
 | 
			
		||||
  Additional terms, permissive or non-permissive, may be stated in the
 | 
			
		||||
form of a separately written license, or stated as exceptions;
 | 
			
		||||
the above requirements apply either way.
 | 
			
		||||
 | 
			
		||||
  8. Termination.
 | 
			
		||||
 | 
			
		||||
  You may not propagate or modify a covered work except as expressly
 | 
			
		||||
provided under this License.  Any attempt otherwise to propagate or
 | 
			
		||||
modify it is void, and will automatically terminate your rights under
 | 
			
		||||
this License (including any patent licenses granted under the third
 | 
			
		||||
paragraph of section 11).
 | 
			
		||||
 | 
			
		||||
  However, if you cease all violation of this License, then your
 | 
			
		||||
license from a particular copyright holder is reinstated (a)
 | 
			
		||||
provisionally, unless and until the copyright holder explicitly and
 | 
			
		||||
finally terminates your license, and (b) permanently, if the copyright
 | 
			
		||||
holder fails to notify you of the violation by some reasonable means
 | 
			
		||||
prior to 60 days after the cessation.
 | 
			
		||||
 | 
			
		||||
  Moreover, your license from a particular copyright holder is
 | 
			
		||||
reinstated permanently if the copyright holder notifies you of the
 | 
			
		||||
violation by some reasonable means, this is the first time you have
 | 
			
		||||
received notice of violation of this License (for any work) from that
 | 
			
		||||
copyright holder, and you cure the violation prior to 30 days after
 | 
			
		||||
your receipt of the notice.
 | 
			
		||||
 | 
			
		||||
  Termination of your rights under this section does not terminate the
 | 
			
		||||
licenses of parties who have received copies or rights from you under
 | 
			
		||||
this License.  If your rights have been terminated and not permanently
 | 
			
		||||
reinstated, you do not qualify to receive new licenses for the same
 | 
			
		||||
material under section 10.
 | 
			
		||||
 | 
			
		||||
  9. Acceptance Not Required for Having Copies.
 | 
			
		||||
 | 
			
		||||
  You are not required to accept this License in order to receive or
 | 
			
		||||
run a copy of the Program.  Ancillary propagation of a covered work
 | 
			
		||||
occurring solely as a consequence of using peer-to-peer transmission
 | 
			
		||||
to receive a copy likewise does not require acceptance.  However,
 | 
			
		||||
nothing other than this License grants you permission to propagate or
 | 
			
		||||
modify any covered work.  These actions infringe copyright if you do
 | 
			
		||||
not accept this License.  Therefore, by modifying or propagating a
 | 
			
		||||
covered work, you indicate your acceptance of this License to do so.
 | 
			
		||||
 | 
			
		||||
  10. Automatic Licensing of Downstream Recipients.
 | 
			
		||||
 | 
			
		||||
  Each time you convey a covered work, the recipient automatically
 | 
			
		||||
receives a license from the original licensors, to run, modify and
 | 
			
		||||
propagate that work, subject to this License.  You are not responsible
 | 
			
		||||
for enforcing compliance by third parties with this License.
 | 
			
		||||
 | 
			
		||||
  An "entity transaction" is a transaction transferring control of an
 | 
			
		||||
organization, or substantially all assets of one, or subdividing an
 | 
			
		||||
organization, or merging organizations.  If propagation of a covered
 | 
			
		||||
work results from an entity transaction, each party to that
 | 
			
		||||
transaction who receives a copy of the work also receives whatever
 | 
			
		||||
licenses to the work the party's predecessor in interest had or could
 | 
			
		||||
give under the previous paragraph, plus a right to possession of the
 | 
			
		||||
Corresponding Source of the work from the predecessor in interest, if
 | 
			
		||||
the predecessor has it or can get it with reasonable efforts.
 | 
			
		||||
 | 
			
		||||
  You may not impose any further restrictions on the exercise of the
 | 
			
		||||
rights granted or affirmed under this License.  For example, you may
 | 
			
		||||
not impose a license fee, royalty, or other charge for exercise of
 | 
			
		||||
rights granted under this License, and you may not initiate litigation
 | 
			
		||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
 | 
			
		||||
any patent claim is infringed by making, using, selling, offering for
 | 
			
		||||
sale, or importing the Program or any portion of it.
 | 
			
		||||
 | 
			
		||||
  11. Patents.
 | 
			
		||||
 | 
			
		||||
  A "contributor" is a copyright holder who authorizes use under this
 | 
			
		||||
License of the Program or a work on which the Program is based.  The
 | 
			
		||||
work thus licensed is called the contributor's "contributor version".
 | 
			
		||||
 | 
			
		||||
  A contributor's "essential patent claims" are all patent claims
 | 
			
		||||
owned or controlled by the contributor, whether already acquired or
 | 
			
		||||
hereafter acquired, that would be infringed by some manner, permitted
 | 
			
		||||
by this License, of making, using, or selling its contributor version,
 | 
			
		||||
but do not include claims that would be infringed only as a
 | 
			
		||||
consequence of further modification of the contributor version.  For
 | 
			
		||||
purposes of this definition, "control" includes the right to grant
 | 
			
		||||
patent sublicenses in a manner consistent with the requirements of
 | 
			
		||||
this License.
 | 
			
		||||
 | 
			
		||||
  Each contributor grants you a non-exclusive, worldwide, royalty-free
 | 
			
		||||
patent license under the contributor's essential patent claims, to
 | 
			
		||||
make, use, sell, offer for sale, import and otherwise run, modify and
 | 
			
		||||
propagate the contents of its contributor version.
 | 
			
		||||
 | 
			
		||||
  In the following three paragraphs, a "patent license" is any express
 | 
			
		||||
agreement or commitment, however denominated, not to enforce a patent
 | 
			
		||||
(such as an express permission to practice a patent or covenant not to
 | 
			
		||||
sue for patent infringement).  To "grant" such a patent license to a
 | 
			
		||||
party means to make such an agreement or commitment not to enforce a
 | 
			
		||||
patent against the party.
 | 
			
		||||
 | 
			
		||||
  If you convey a covered work, knowingly relying on a patent license,
 | 
			
		||||
and the Corresponding Source of the work is not available for anyone
 | 
			
		||||
to copy, free of charge and under the terms of this License, through a
 | 
			
		||||
publicly available network server or other readily accessible means,
 | 
			
		||||
then you must either (1) cause the Corresponding Source to be so
 | 
			
		||||
available, or (2) arrange to deprive yourself of the benefit of the
 | 
			
		||||
patent license for this particular work, or (3) arrange, in a manner
 | 
			
		||||
consistent with the requirements of this License, to extend the patent
 | 
			
		||||
license to downstream recipients.  "Knowingly relying" means you have
 | 
			
		||||
actual knowledge that, but for the patent license, your conveying the
 | 
			
		||||
covered work in a country, or your recipient's use of the covered work
 | 
			
		||||
in a country, would infringe one or more identifiable patents in that
 | 
			
		||||
country that you have reason to believe are valid.
 | 
			
		||||
 | 
			
		||||
  If, pursuant to or in connection with a single transaction or
 | 
			
		||||
arrangement, you convey, or propagate by procuring conveyance of, a
 | 
			
		||||
covered work, and grant a patent license to some of the parties
 | 
			
		||||
receiving the covered work authorizing them to use, propagate, modify
 | 
			
		||||
or convey a specific copy of the covered work, then the patent license
 | 
			
		||||
you grant is automatically extended to all recipients of the covered
 | 
			
		||||
work and works based on it.
 | 
			
		||||
 | 
			
		||||
  A patent license is "discriminatory" if it does not include within
 | 
			
		||||
the scope of its coverage, prohibits the exercise of, or is
 | 
			
		||||
conditioned on the non-exercise of one or more of the rights that are
 | 
			
		||||
specifically granted under this License.  You may not convey a covered
 | 
			
		||||
work if you are a party to an arrangement with a third party that is
 | 
			
		||||
in the business of distributing software, under which you make payment
 | 
			
		||||
to the third party based on the extent of your activity of conveying
 | 
			
		||||
the work, and under which the third party grants, to any of the
 | 
			
		||||
parties who would receive the covered work from you, a discriminatory
 | 
			
		||||
patent license (a) in connection with copies of the covered work
 | 
			
		||||
conveyed by you (or copies made from those copies), or (b) primarily
 | 
			
		||||
for and in connection with specific products or compilations that
 | 
			
		||||
contain the covered work, unless you entered into that arrangement,
 | 
			
		||||
or that patent license was granted, prior to 28 March 2007.
 | 
			
		||||
 | 
			
		||||
  Nothing in this License shall be construed as excluding or limiting
 | 
			
		||||
any implied license or other defenses to infringement that may
 | 
			
		||||
otherwise be available to you under applicable patent law.
 | 
			
		||||
 | 
			
		||||
  12. No Surrender of Others' Freedom.
 | 
			
		||||
 | 
			
		||||
  If conditions are imposed on you (whether by court order, agreement or
 | 
			
		||||
otherwise) that contradict the conditions of this License, they do not
 | 
			
		||||
excuse you from the conditions of this License.  If you cannot convey a
 | 
			
		||||
covered work so as to satisfy simultaneously your obligations under this
 | 
			
		||||
License and any other pertinent obligations, then as a consequence you may
 | 
			
		||||
not convey it at all.  For example, if you agree to terms that obligate you
 | 
			
		||||
to collect a royalty for further conveying from those to whom you convey
 | 
			
		||||
the Program, the only way you could satisfy both those terms and this
 | 
			
		||||
License would be to refrain entirely from conveying the Program.
 | 
			
		||||
 | 
			
		||||
  13. Remote Network Interaction; Use with the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, if you modify the
 | 
			
		||||
Program, your modified version must prominently offer all users
 | 
			
		||||
interacting with it remotely through a computer network (if your version
 | 
			
		||||
supports such interaction) an opportunity to receive the Corresponding
 | 
			
		||||
Source of your version by providing access to the Corresponding Source
 | 
			
		||||
from a network server at no charge, through some standard or customary
 | 
			
		||||
means of facilitating copying of software.  This Corresponding Source
 | 
			
		||||
shall include the Corresponding Source for any work covered by version 3
 | 
			
		||||
of the GNU General Public License that is incorporated pursuant to the
 | 
			
		||||
following paragraph.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, you have
 | 
			
		||||
permission to link or combine any covered work with a work licensed
 | 
			
		||||
under version 3 of the GNU General Public License into a single
 | 
			
		||||
combined work, and to convey the resulting work.  The terms of this
 | 
			
		||||
License will continue to apply to the part which is the covered work,
 | 
			
		||||
but the work with which it is combined will remain governed by version
 | 
			
		||||
3 of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
  14. Revised Versions of this License.
 | 
			
		||||
 | 
			
		||||
  The Free Software Foundation may publish revised and/or new versions of
 | 
			
		||||
the GNU Affero General Public License from time to time.  Such new versions
 | 
			
		||||
will be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
  Each version is given a distinguishing version number.  If the
 | 
			
		||||
Program specifies that a certain numbered version of the GNU Affero General
 | 
			
		||||
Public License "or any later version" applies to it, you have the
 | 
			
		||||
option of following the terms and conditions either of that numbered
 | 
			
		||||
version or of any later version published by the Free Software
 | 
			
		||||
Foundation.  If the Program does not specify a version number of the
 | 
			
		||||
GNU Affero General Public License, you may choose any version ever published
 | 
			
		||||
by the Free Software Foundation.
 | 
			
		||||
 | 
			
		||||
  If the Program specifies that a proxy can decide which future
 | 
			
		||||
versions of the GNU Affero General Public License can be used, that proxy's
 | 
			
		||||
public statement of acceptance of a version permanently authorizes you
 | 
			
		||||
to choose that version for the Program.
 | 
			
		||||
 | 
			
		||||
  Later license versions may give you additional or different
 | 
			
		||||
permissions.  However, no additional obligations are imposed on any
 | 
			
		||||
author or copyright holder as a result of your choosing to follow a
 | 
			
		||||
later version.
 | 
			
		||||
 | 
			
		||||
  15. Disclaimer of Warranty.
 | 
			
		||||
 | 
			
		||||
  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
 | 
			
		||||
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
 | 
			
		||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
 | 
			
		||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
 | 
			
		||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
			
		||||
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
 | 
			
		||||
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
 | 
			
		||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 | 
			
		||||
 | 
			
		||||
  16. Limitation of Liability.
 | 
			
		||||
 | 
			
		||||
  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
 | 
			
		||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
 | 
			
		||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
 | 
			
		||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
 | 
			
		||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
 | 
			
		||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
 | 
			
		||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
SUCH DAMAGES.
 | 
			
		||||
 | 
			
		||||
  17. Interpretation of Sections 15 and 16.
 | 
			
		||||
 | 
			
		||||
  If the disclaimer of warranty and limitation of liability provided
 | 
			
		||||
above cannot be given local legal effect according to their terms,
 | 
			
		||||
reviewing courts shall apply local law that most closely approximates
 | 
			
		||||
an absolute waiver of all civil liability in connection with the
 | 
			
		||||
Program, unless a warranty or assumption of liability accompanies a
 | 
			
		||||
copy of the Program in return for a fee.
 | 
			
		||||
 | 
			
		||||
                     END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
            How to Apply These Terms to Your New Programs
 | 
			
		||||
 | 
			
		||||
  If you develop a new program, and you want it to be of the greatest
 | 
			
		||||
possible use to the public, the best way to achieve this is to make it
 | 
			
		||||
free software which everyone can redistribute and change under these terms.
 | 
			
		||||
 | 
			
		||||
  To do so, attach the following notices to the program.  It is safest
 | 
			
		||||
to attach them to the start of each source file to most effectively
 | 
			
		||||
state the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software: you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
    the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU Affero General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper mail.
 | 
			
		||||
 | 
			
		||||
  If your software can interact with users remotely through a computer
 | 
			
		||||
network, you should also make sure that it provides a way for users to
 | 
			
		||||
get its source.  For example, if your program is a web application, its
 | 
			
		||||
interface could display a "Source" link that leads users to an archive
 | 
			
		||||
of the code.  There are many ways you could offer source, and different
 | 
			
		||||
solutions will be better for different programs; see section 13 for the
 | 
			
		||||
specific requirements.
 | 
			
		||||
 | 
			
		||||
  You should also get your employer (if you work as a programmer) or school,
 | 
			
		||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
 | 
			
		||||
For more information on this, and how to apply and follow the GNU AGPL, see
 | 
			
		||||
<http://www.gnu.org/licenses/>.
 | 
			
		||||
							
								
								
									
										34
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -1,34 +0,0 @@
 | 
			
		||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 | 
			
		||||
 | 
			
		||||
## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac
 | 
			
		||||
## remove line below when OE toolchain is updated to version which include those
 | 
			
		||||
ACLOCAL_AMFLAGS = -I m4
 | 
			
		||||
AM_CPPFLAGS = \
 | 
			
		||||
	$(all_includes) \
 | 
			
		||||
	-I$(top_srcdir)/include \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	doc \
 | 
			
		||||
	include \
 | 
			
		||||
	src \
 | 
			
		||||
	tests \
 | 
			
		||||
	contrib \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = \
 | 
			
		||||
	libosmo-legacy-mgcp.pc \
 | 
			
		||||
	libosmo-mgcp-client.pc \
 | 
			
		||||
	libosmo-mgcp.pc \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES = $(top_srcdir)/.version
 | 
			
		||||
EXTRA_DIST = git-version-gen osmoappdesc.py .version
 | 
			
		||||
 | 
			
		||||
@RELMAKE@
 | 
			
		||||
 | 
			
		||||
$(top_srcdir)/.version:
 | 
			
		||||
	echo $(VERSION) > $@-t && mv $@-t $@
 | 
			
		||||
dist-hook:
 | 
			
		||||
	echo $(VERSION) > $(distdir)/.tarball-version
 | 
			
		||||
							
								
								
									
										28
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README
									
									
									
									
									
								
							@@ -1,28 +0,0 @@
 | 
			
		||||
About OsmoMGW
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
OsmoMGW originated from the OpenBSC project, which started as a minimalistic
 | 
			
		||||
all-in-one implementation of the GSM Network. In 2017, OpenBSC had reached
 | 
			
		||||
maturity and diversity (including M3UA SIGTRAN and 3G support in the form of
 | 
			
		||||
IuCS and IuPS interfaces) that naturally lead to a separation of the all-in-one
 | 
			
		||||
approach to fully independent separate programs as in typical GSM networks.
 | 
			
		||||
 | 
			
		||||
OsmoMGW was one of the parts split off from the old openbsc.git. It originated
 | 
			
		||||
as a solution to merely navigate RTP streams through a NAT, but has since
 | 
			
		||||
matured to a Media Gateway implementation that is capable of streaming RTP for
 | 
			
		||||
2G (AoIP) and 3G (IuCS) GSM networks as well as (still not implemented at time
 | 
			
		||||
of writing) transcoding between TRAU, various RTP payloads and IuUP.
 | 
			
		||||
 | 
			
		||||
The OsmoMGW program exposes an MGCP interface towards clients like OsmoMSC and
 | 
			
		||||
OsmoBSC, and receives and sends RTP streams as configured via MGCP.
 | 
			
		||||
 | 
			
		||||
The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC (found
 | 
			
		||||
in osmo-msc.git) to instruct OsmoMGW via its MGCP service.
 | 
			
		||||
 | 
			
		||||
The libosmo-mgcp library exposes MGCP server utilities used by e.g. OsmoBSC-NAT
 | 
			
		||||
(found in osmo-bsc.git) to navigate RTP streams through a NAT.
 | 
			
		||||
(At time of writing, this is still called libosmo-legacy-mgcp.)
 | 
			
		||||
 | 
			
		||||
Find OsmoMGW issue tracker and wiki online at
 | 
			
		||||
https://osmocom.org/projects/osmo-mgw
 | 
			
		||||
https://osmocom.org/projects/osmo-mgw/wiki
 | 
			
		||||
@@ -1,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
 | 
			
		||||
							
								
								
									
										26
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								TODO-RELEASE
									
									
									
									
									
								
							@@ -1,26 +0,0 @@
 | 
			
		||||
# When cleaning up this file upon a release:
 | 
			
		||||
#
 | 
			
		||||
# - Note that the release version number is entirely unrelated to the API
 | 
			
		||||
#   versions. A release version 5.2.3 may happily have an API version of 42:7:5.
 | 
			
		||||
#
 | 
			
		||||
# - Bump API version in src/lib*/Makefile.am files according to chapter
 | 
			
		||||
#   "Library interface versions" of the libtool documentation.
 | 
			
		||||
#   https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
 | 
			
		||||
#
 | 
			
		||||
# - Iff the 'current' API version has changed, rename debian/lib*.install
 | 
			
		||||
#
 | 
			
		||||
# API version bumping for the impatient:
 | 
			
		||||
# LIBVERSION=c:r:a  (current:revision_of_current:backwards_compat_age)
 | 
			
		||||
# 5:2:4 means that
 | 
			
		||||
# - this implements version 5 of the API;
 | 
			
		||||
# - this is the 2nd (compatible) revision of API version 5;
 | 
			
		||||
# - this is backwards compatible to all APIs since 4 versions ago,
 | 
			
		||||
#   i.e. callers that need API versions from 1 to 5 can use this.
 | 
			
		||||
#
 | 
			
		||||
# Bumping API versions recipe:
 | 
			
		||||
# If the library source code has changed at all since the last update, r++;
 | 
			
		||||
# If any interfaces have been added, removed, or changed since the last update, c++, r=0;
 | 
			
		||||
# If any interfaces have been added since the last public release, a++;
 | 
			
		||||
# If any interfaces have been removed or changed since the last public release, a=0.
 | 
			
		||||
#
 | 
			
		||||
#library	what		description / commit summary line
 | 
			
		||||
							
								
								
									
										142
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										142
									
								
								configure.ac
									
									
									
									
									
								
							@@ -1,142 +0,0 @@
 | 
			
		||||
dnl Process this file with autoconf to produce a configure script
 | 
			
		||||
AC_INIT([osmo-mgw],
 | 
			
		||||
	m4_esyscmd([./git-version-gen .tarball-version]),
 | 
			
		||||
	[openbsc@lists.osmocom.org])
 | 
			
		||||
 | 
			
		||||
dnl *This* is the root dir, even if an install-sh exists in ../ or ../../
 | 
			
		||||
AC_CONFIG_AUX_DIR([.])
 | 
			
		||||
 | 
			
		||||
AM_INIT_AUTOMAKE([dist-bzip2])
 | 
			
		||||
AC_CONFIG_TESTDIR(tests)
 | 
			
		||||
 | 
			
		||||
dnl kernel style compile messages
 | 
			
		||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 | 
			
		||||
 | 
			
		||||
dnl include release helper
 | 
			
		||||
RELMAKE='-include osmo-release.mk'
 | 
			
		||||
AC_SUBST([RELMAKE])
 | 
			
		||||
 | 
			
		||||
dnl checks for programs
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
LT_INIT
 | 
			
		||||
 | 
			
		||||
dnl check for pkg-config (explained in detail in libosmocore/configure.ac)
 | 
			
		||||
AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)
 | 
			
		||||
if test "x$PKG_CONFIG_INSTALLED" = "xno"; then
 | 
			
		||||
        AC_MSG_WARN([You need to install pkg-config])
 | 
			
		||||
fi
 | 
			
		||||
PKG_PROG_PKG_CONFIG([0.20])
 | 
			
		||||
 | 
			
		||||
dnl check for AX_CHECK_COMPILE_FLAG
 | 
			
		||||
m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [
 | 
			
		||||
	AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])
 | 
			
		||||
	])
 | 
			
		||||
 | 
			
		||||
dnl checks for libraries
 | 
			
		||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
 | 
			
		||||
AC_SUBST(LIBRARY_DL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.10.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.10.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.1.0)
 | 
			
		||||
 | 
			
		||||
# Enable/disable transcoding within osmo-bsc_mgcp?
 | 
			
		||||
AC_ARG_ENABLE([mgcp-transcoding], [AS_HELP_STRING([--enable-mgcp-transcoding], [Build the MGCP gateway with internal transcoding enabled.])],
 | 
			
		||||
    [osmo_ac_mgcp_transcoding="$enableval"],[osmo_ac_mgcp_transcoding="no"])
 | 
			
		||||
AC_ARG_WITH([g729], [AS_HELP_STRING([--with-g729], [Enable G.729 encoding/decoding.])], [osmo_ac_with_g729="$withval"],[osmo_ac_with_g729="no"])
 | 
			
		||||
 | 
			
		||||
if test "$osmo_ac_mgcp_transcoding" = "yes" ; then
 | 
			
		||||
    AC_SEARCH_LIBS([gsm_create], [gsm], [LIBRARY_GSM="$LIBS";LIBS=""], [AC_MSG_ERROR([--enable-mgcp-transcoding: cannot find usable libgsm])])
 | 
			
		||||
    AC_SUBST(LIBRARY_GSM)
 | 
			
		||||
    if test "$osmo_ac_with_g729" = "yes" ; then
 | 
			
		||||
	PKG_CHECK_MODULES(LIBBCG729, libbcg729 >= 0.1, [AC_DEFINE([HAVE_BCG729], [1], [Use bgc729 decoder/encoder])])
 | 
			
		||||
    fi
 | 
			
		||||
    AC_DEFINE(BUILD_MGCP_TRANSCODING, 1, [Define if we want to build the MGCP gateway with transcoding support])
 | 
			
		||||
fi
 | 
			
		||||
AM_CONDITIONAL(BUILD_MGCP_TRANSCODING, test "x$osmo_ac_mgcp_transcoding" = "xyes")
 | 
			
		||||
AC_SUBST(osmo_ac_mgcp_transcoding)
 | 
			
		||||
 | 
			
		||||
dnl Checks for typedefs, structures and compiler characteristics
 | 
			
		||||
 | 
			
		||||
# The following test is taken from WebKit's webkit.m4
 | 
			
		||||
saved_CFLAGS="$CFLAGS"
 | 
			
		||||
CFLAGS="$CFLAGS -fvisibility=hidden "
 | 
			
		||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
 | 
			
		||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
 | 
			
		||||
      [ AC_MSG_RESULT([yes])
 | 
			
		||||
        SYMBOL_VISIBILITY="-fvisibility=hidden"],
 | 
			
		||||
        AC_MSG_RESULT([no]))
 | 
			
		||||
CFLAGS="$saved_CFLAGS"
 | 
			
		||||
AC_SUBST(SYMBOL_VISIBILITY)
 | 
			
		||||
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=null-dereference], [CFLAGS="$CFLAGS -Werror=null-dereference"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])
 | 
			
		||||
 | 
			
		||||
# Coverage build taken from WebKit's configure.in
 | 
			
		||||
AC_MSG_CHECKING([whether to enable code coverage support])
 | 
			
		||||
AC_ARG_ENABLE(coverage,
 | 
			
		||||
              AC_HELP_STRING([--enable-coverage],
 | 
			
		||||
                             [enable code coverage support [default=no]]),
 | 
			
		||||
              [],[enable_coverage="no"])
 | 
			
		||||
AC_MSG_RESULT([$enable_coverage])
 | 
			
		||||
if test "$enable_coverage" = "yes"; then
 | 
			
		||||
   COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
 | 
			
		||||
   COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
 | 
			
		||||
   AC_SUBST([COVERAGE_CFLAGS])
 | 
			
		||||
   AC_SUBST([COVERAGE_LDFLAGS])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE([vty_tests],
 | 
			
		||||
		AC_HELP_STRING([--enable-vty-tests],
 | 
			
		||||
				[Include the VTY/CTRL tests in make check (deprecated)
 | 
			
		||||
				[default=no]]),
 | 
			
		||||
		[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
 | 
			
		||||
AC_ARG_ENABLE([external_tests],
 | 
			
		||||
		AC_HELP_STRING([--enable-external-tests],
 | 
			
		||||
				[Include the VTY/CTRL tests in make check [default=no]]),
 | 
			
		||||
		[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
 | 
			
		||||
if test "x$enable_ext_tests" = "xyes" ; then
 | 
			
		||||
	AM_PATH_PYTHON
 | 
			
		||||
	AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)
 | 
			
		||||
	 if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then
 | 
			
		||||
		AC_MSG_ERROR([Please install git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
AC_MSG_CHECKING([whether to enable VTY/CTRL tests])
 | 
			
		||||
AC_MSG_RESULT([$enable_ext_tests])
 | 
			
		||||
AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")
 | 
			
		||||
 | 
			
		||||
dnl Generate the output
 | 
			
		||||
AM_CONFIG_HEADER(bscconfig.h)
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT(
 | 
			
		||||
    libosmo-legacy-mgcp.pc
 | 
			
		||||
    libosmo-mgcp-client.pc
 | 
			
		||||
    libosmo-mgcp.pc
 | 
			
		||||
    include/Makefile
 | 
			
		||||
    include/osmocom/Makefile
 | 
			
		||||
    include/osmocom/legacy_mgcp/Makefile
 | 
			
		||||
    include/osmocom/mgcp_client/Makefile
 | 
			
		||||
    include/osmocom/mgcp/Makefile
 | 
			
		||||
    src/Makefile
 | 
			
		||||
    src/libosmo-legacy-mgcp/Makefile
 | 
			
		||||
    src/libosmo-mgcp-client/Makefile
 | 
			
		||||
    src/libosmo-mgcp/Makefile
 | 
			
		||||
    src/osmo-bsc_mgcp/Makefile
 | 
			
		||||
    src/osmo-mgw/Makefile
 | 
			
		||||
    tests/Makefile
 | 
			
		||||
    tests/atlocal
 | 
			
		||||
    tests/legacy_mgcp/Makefile
 | 
			
		||||
    tests/mgcp_client/Makefile
 | 
			
		||||
    tests/mgcp/Makefile
 | 
			
		||||
    doc/Makefile
 | 
			
		||||
    doc/examples/Makefile
 | 
			
		||||
    contrib/Makefile
 | 
			
		||||
    Makefile)
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
EXTRA_DIST = ipa.py
 | 
			
		||||
							
								
								
									
										278
									
								
								contrib/ipa.py
									
									
									
									
									
								
							
							
						
						
									
										278
									
								
								contrib/ipa.py
									
									
									
									
									
								
							@@ -1,278 +0,0 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- mode: python-mode; py-indent-tabs-mode: nil -*-
 | 
			
		||||
"""
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2016 sysmocom s.f.m.c. GmbH
 | 
			
		||||
 *
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 */
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import struct, random, sys
 | 
			
		||||
 | 
			
		||||
class IPA(object):
 | 
			
		||||
    """
 | 
			
		||||
    Stateless IPA protocol multiplexer: add/remove/parse (extended) header
 | 
			
		||||
    """
 | 
			
		||||
    version = "0.0.5"
 | 
			
		||||
    TCP_PORT_OML = 3002
 | 
			
		||||
    TCP_PORT_RSL = 3003
 | 
			
		||||
    # OpenBSC extensions: OSMO, MGCP_OLD
 | 
			
		||||
    PROTO = dict(RSL=0x00, CCM=0xFE, SCCP=0xFD, OML=0xFF, OSMO=0xEE, MGCP_OLD=0xFC)
 | 
			
		||||
    # ...OML Router Control, GSUP GPRS extension, Osmocom Authn Protocol
 | 
			
		||||
    EXT = dict(CTRL=0, MGCP=1, LAC=2, SMSC=3, ORC=4, GSUP=5, OAP=6)
 | 
			
		||||
    # OpenBSC extension: SCCP_OLD
 | 
			
		||||
    MSGT = dict(PING=0x00, PONG=0x01, ID_GET=0x04, ID_RESP=0x05, ID_ACK=0x06, SCCP_OLD=0xFF)
 | 
			
		||||
    _IDTAG = dict(SERNR=0, UNITNAME=1, LOCATION=2, TYPE=3, EQUIPVERS=4, SWVERSION=5, IPADDR=6, MACADDR=7, UNIT=8)
 | 
			
		||||
    CTRL_GET = 'GET'
 | 
			
		||||
    CTRL_SET = 'SET'
 | 
			
		||||
    CTRL_REP = 'REPLY'
 | 
			
		||||
    CTRL_ERR = 'ERR'
 | 
			
		||||
    CTRL_TRAP = 'TRAP'
 | 
			
		||||
 | 
			
		||||
    def _l(self, d, p):
 | 
			
		||||
        """
 | 
			
		||||
        Reverse dictionary lookup: return key for a given value
 | 
			
		||||
        """
 | 
			
		||||
        if p is None:
 | 
			
		||||
            return 'UNKNOWN'
 | 
			
		||||
        return list(d.keys())[list(d.values()).index(p)]
 | 
			
		||||
 | 
			
		||||
    def _tag(self, t, v):
 | 
			
		||||
        """
 | 
			
		||||
        Create TAG as TLV data
 | 
			
		||||
        """
 | 
			
		||||
        return struct.pack(">HB", len(v) + 1, t) + v
 | 
			
		||||
 | 
			
		||||
    def proto(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup protocol name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self.PROTO, p)
 | 
			
		||||
 | 
			
		||||
    def ext(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup protocol extension name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self.EXT, p)
 | 
			
		||||
 | 
			
		||||
    def msgt(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup message type name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self.MSGT, p)
 | 
			
		||||
 | 
			
		||||
    def idtag(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup ID tag name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self._IDTAG, p)
 | 
			
		||||
 | 
			
		||||
    def ext_name(self, proto, exten):
 | 
			
		||||
        """
 | 
			
		||||
        Return proper extension byte name depending on the protocol used
 | 
			
		||||
        """
 | 
			
		||||
        if self.PROTO['CCM'] == proto:
 | 
			
		||||
            return self.msgt(exten)
 | 
			
		||||
        if self.PROTO['OSMO'] == proto:
 | 
			
		||||
            return self.ext(exten)
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def add_header(self, data, proto, ext=None):
 | 
			
		||||
        """
 | 
			
		||||
        Add IPA header (with extension if necessary), data must be represented as bytes
 | 
			
		||||
        """
 | 
			
		||||
        if ext is None:
 | 
			
		||||
            return struct.pack(">HB", len(data) + 1, proto) + data
 | 
			
		||||
        return struct.pack(">HBB", len(data) + 1, proto, ext) + data
 | 
			
		||||
 | 
			
		||||
    def del_header(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Strip IPA protocol header correctly removing extension if present
 | 
			
		||||
        Returns data length, IPA protocol, extension (or None if not defined for a give protocol) and the data without header
 | 
			
		||||
        """
 | 
			
		||||
        if not len(data):
 | 
			
		||||
            return None, None, None, None
 | 
			
		||||
        (dlen, proto) = struct.unpack('>HB', data[:3])
 | 
			
		||||
        if self.PROTO['OSMO'] == proto or self.PROTO['CCM'] == proto: # there's extension which we have to unpack
 | 
			
		||||
            return struct.unpack('>HBB', data[:4]) + (data[4:], ) # length, protocol, extension, data
 | 
			
		||||
        return dlen, proto, None, data[3:] # length, protocol, _, data
 | 
			
		||||
 | 
			
		||||
    def split_combined(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Split the data which contains multiple concatenated IPA messages into tuple (first, rest) where rest contains remaining messages, first is the single IPA message
 | 
			
		||||
        """
 | 
			
		||||
        (length, _, _, _) = self.del_header(data)
 | 
			
		||||
        return data[:(length + 3)], data[(length + 3):]
 | 
			
		||||
 | 
			
		||||
    def tag_serial(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for serial number
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['SERNR'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_name(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for unit name
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['UNITNAME'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_loc(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for location
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['LOCATION'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_type(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for unit type
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['TYPE'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_equip(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for equipment version
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['EQUIPVERS'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_sw(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for software version
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['SWVERSION'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_ip(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for IP address
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['IPADDR'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_mac(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for MAC address
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['MACADDR'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_unit(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for unit ID
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['UNIT'], data)
 | 
			
		||||
 | 
			
		||||
    def identity(self, unit=b'', mac=b'', location=b'', utype=b'', equip=b'', sw=b'', name=b'', serial=b''):
 | 
			
		||||
        """
 | 
			
		||||
        Make IPA IDENTITY tag list, by default returns empty concatenated bytes of tag list
 | 
			
		||||
        """
 | 
			
		||||
        return self.tag_unit(unit) + self.tag_mac(mac) + self.tag_loc(location) + self.tag_type(utype) + self.tag_equip(equip) + self.tag_sw(sw) + self.tag_name(name) + self.tag_serial(serial)
 | 
			
		||||
 | 
			
		||||
    def ping(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make PING message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PING'])
 | 
			
		||||
 | 
			
		||||
    def pong(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make PONG message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PONG'])
 | 
			
		||||
 | 
			
		||||
    def id_ack(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make ID_ACK CCM message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(b'', self.PROTO['CCM'], self.MSGT['ID_ACK'])
 | 
			
		||||
 | 
			
		||||
    def id_get(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make ID_GET CCM message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(self.identity(), self.PROTO['CCM'], self.MSGT['ID_GET'])
 | 
			
		||||
 | 
			
		||||
    def id_resp(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make ID_RESP CCM message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(data, self.PROTO['CCM'], self.MSGT['ID_RESP'])
 | 
			
		||||
 | 
			
		||||
class Ctrl(IPA):
 | 
			
		||||
    """
 | 
			
		||||
    Osmocom CTRL protocol implemented on top of IPA multiplexer
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        random.seed()
 | 
			
		||||
 | 
			
		||||
    def add_header(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Add CTRL header
 | 
			
		||||
        """
 | 
			
		||||
        return super(Ctrl, self).add_header(data.encode('utf-8'), IPA.PROTO['OSMO'], IPA.EXT['CTRL'])
 | 
			
		||||
 | 
			
		||||
    def rem_header(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Remove CTRL header, check for appropriate protocol and extension
 | 
			
		||||
        """
 | 
			
		||||
        (_, proto, ext, d) = super(Ctrl, self).del_header(data)
 | 
			
		||||
        if self.PROTO['OSMO'] != proto or self.EXT['CTRL'] != ext:
 | 
			
		||||
            return None
 | 
			
		||||
        return d
 | 
			
		||||
 | 
			
		||||
    def parse(self, data, op=None):
 | 
			
		||||
        """
 | 
			
		||||
        Parse Ctrl string returning (var, value) pair
 | 
			
		||||
        var could be None in case of ERROR message
 | 
			
		||||
        value could be None in case of GET message
 | 
			
		||||
        """
 | 
			
		||||
        (s, i, v) = data.split(' ', 2)
 | 
			
		||||
        if s == self.CTRL_ERR:
 | 
			
		||||
            return None, v
 | 
			
		||||
        if s == self.CTRL_GET:
 | 
			
		||||
            return v, None
 | 
			
		||||
        (s, i, var, val) = data.split(' ', 3)
 | 
			
		||||
        if s == self.CTRL_TRAP and i != '0':
 | 
			
		||||
            return None, '%s with non-zero id %s' % (s, i)
 | 
			
		||||
        if op is not None and i != op:
 | 
			
		||||
            if s == self.CTRL_GET + '_' + self.CTRL_REP or s == self.CTRL_SET + '_' + self.CTRL_REP:
 | 
			
		||||
                return None, '%s with unexpected id %s' % (s, i)
 | 
			
		||||
        return var, val
 | 
			
		||||
 | 
			
		||||
    def trap(self, var, val):
 | 
			
		||||
        """
 | 
			
		||||
        Make TRAP message with given (vak, val) pair
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header("%s 0 %s %s" % (self.CTRL_TRAP, var, val))
 | 
			
		||||
 | 
			
		||||
    def cmd(self, var, val=None):
 | 
			
		||||
        """
 | 
			
		||||
        Make SET/GET command message: returns (r, m) tuple where r is random operation id and m is assembled message
 | 
			
		||||
        """
 | 
			
		||||
        r = random.randint(1, sys.maxsize)
 | 
			
		||||
        if val is not None:
 | 
			
		||||
            return r, self.add_header("%s %s %s %s" % (self.CTRL_SET, r, var, val))
 | 
			
		||||
        return r, self.add_header("%s %s %s" % (self.CTRL_GET, r, var))
 | 
			
		||||
 | 
			
		||||
    def verify(self, reply, r, var, val=None):
 | 
			
		||||
        """
 | 
			
		||||
        Verify reply to SET/GET command: returns (b, v) tuple where v is True/False verification result and v is the variable value
 | 
			
		||||
        """
 | 
			
		||||
        (k, v) = self.parse(reply)
 | 
			
		||||
        if k != var or (val is not None and v != val):
 | 
			
		||||
            return False, v
 | 
			
		||||
        return True, v
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    print("IPA multiplexer v%s loaded." % IPA.version)
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# jenkins build helper script for openbsc.  This is how we build on jenkins.osmocom.org
 | 
			
		||||
 | 
			
		||||
if ! [ -x "$(command -v osmo-build-dep.sh)" ]; then
 | 
			
		||||
	echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"
 | 
			
		||||
	exit 2
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
base="$PWD"
 | 
			
		||||
deps="$base/deps"
 | 
			
		||||
inst="$deps/install"
 | 
			
		||||
export deps inst
 | 
			
		||||
 | 
			
		||||
mkdir "$deps" || true
 | 
			
		||||
rm -rf "$inst"
 | 
			
		||||
 | 
			
		||||
osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
 | 
			
		||||
 | 
			
		||||
verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
 | 
			
		||||
 | 
			
		||||
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
 | 
			
		||||
export LD_LIBRARY_PATH="$inst/lib"
 | 
			
		||||
 | 
			
		||||
osmo-build-dep.sh libosmo-abis
 | 
			
		||||
osmo-build-dep.sh libosmo-netif
 | 
			
		||||
 | 
			
		||||
set +x
 | 
			
		||||
echo
 | 
			
		||||
echo
 | 
			
		||||
echo
 | 
			
		||||
echo " =============================== osmo-mgw ==============================="
 | 
			
		||||
echo
 | 
			
		||||
set -x
 | 
			
		||||
 | 
			
		||||
cd "$base"
 | 
			
		||||
autoreconf --install --force
 | 
			
		||||
./configure $MGCP --enable-vty-tests --enable-external-tests
 | 
			
		||||
$MAKE $PARALLEL_MAKE
 | 
			
		||||
LD_LIBRARY_PATH="$inst/lib" $MAKE check \
 | 
			
		||||
  || cat-testlogs.sh
 | 
			
		||||
LD_LIBRARY_PATH="$inst/lib" \
 | 
			
		||||
  DISTCHECK_CONFIGURE_FLAGS="$MGCP --enable-vty-tests --enable-external-tests" \
 | 
			
		||||
  $MAKE distcheck \
 | 
			
		||||
  || cat-testlogs.sh
 | 
			
		||||
@@ -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
 | 
			
		||||
							
								
								
									
										18
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							@@ -1,18 +0,0 @@
 | 
			
		||||
osmo-mgw (1.1.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * New upstream release
 | 
			
		||||
 | 
			
		||||
 -- Harald Welte <lafore@gnumonks.org>  Sat, 28 Oct 2017 12:48:41 +0200
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.0.2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * First release after major rename.
 | 
			
		||||
 | 
			
		||||
 -- Max Suraev <msuraev@sysmocom.de>  Thu, 14 Sep 2017 18:41:05 +0200
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
osmo-mgw (0.1.0) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Initial release.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Couzens <lynxis@fe80.eu>  Tue, 08 Aug 2017 01:12:53 +0000
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
9
 | 
			
		||||
							
								
								
									
										71
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										71
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							@@ -1,71 +0,0 @@
 | 
			
		||||
Source: osmo-mgw
 | 
			
		||||
Section: net
 | 
			
		||||
Priority: extra
 | 
			
		||||
Maintainer: Alexander Couzens <lynxis@fe80.eu>
 | 
			
		||||
Build-Depends: debhelper (>=9),
 | 
			
		||||
               dh-autoreconf,
 | 
			
		||||
               pkg-config,
 | 
			
		||||
               autotools-dev,
 | 
			
		||||
               libosmocore-dev,
 | 
			
		||||
               libosmo-netif-dev
 | 
			
		||||
Standards-Version: 3.9.8
 | 
			
		||||
Vcs-Git: git://git.osmocom.org/osmo-mgw.git
 | 
			
		||||
Vcs-Browser: https://git.osmocom.org/osmo-mgw/
 | 
			
		||||
Homepage: https://osmocom.org/projects/osmo-mgw
 | 
			
		||||
 | 
			
		||||
Package: osmo-mgw
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: foreign
 | 
			
		||||
Depends: libosmo-mgcp0, ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: OsmoMGW: Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks
 | 
			
		||||
 | 
			
		||||
Package: libosmo-mgcp0
 | 
			
		||||
Section: libs
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Pre-Depends: ${misc:Pre-Depends}
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: libosmo-mgcp: Osmocom's Media Gateway server library
 | 
			
		||||
 | 
			
		||||
Package: libosmo-mgcp-dev
 | 
			
		||||
Section: libdevel
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Depends: libosmo-mgcp0 (= ${binary:Version}), ${misc:Depends}
 | 
			
		||||
Description: libosmo-mgcp: Osmocom's Media Gateway server library
 | 
			
		||||
 | 
			
		||||
Package: libosmo-mgcp-client1
 | 
			
		||||
Section: libs
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Pre-Depends: ${misc:Pre-Depends}
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
 | 
			
		||||
 | 
			
		||||
Package: libosmo-mgcp-client-dev
 | 
			
		||||
Section: libdevel
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Depends: libosmo-mgcp-client1 (= ${binary:Version}), ${misc:Depends}
 | 
			
		||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
 | 
			
		||||
 | 
			
		||||
Package: osmo-bsc-mgcp
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: foreign
 | 
			
		||||
Depends: libosmo-legacy-mgcp0, ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: OsmoBSC-MGCP: Osmocom's Legacy Media Gateway; use osmo-mgw instead.
 | 
			
		||||
 | 
			
		||||
Package: libosmo-legacy-mgcp0
 | 
			
		||||
Section: libs
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Pre-Depends: ${misc:Pre-Depends}
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: libosmo-legacy-mgcp: Osmocom's Legacy Media Gateway server library; use libosmo-mgcp instead.
 | 
			
		||||
 | 
			
		||||
Package: libosmo-legacy-mgcp-dev
 | 
			
		||||
Section: libdevel
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Depends: libosmo-legacy-mgcp0 (= ${binary:Version}), ${misc:Depends}
 | 
			
		||||
Description: libosmo-legacy-mgcp: Osmocom's Legacy Media Gateway server library; use libosmo-mgcp instead.
 | 
			
		||||
							
								
								
									
										82
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
								
							@@ -1,82 +0,0 @@
 | 
			
		||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 | 
			
		||||
Upstream-Name: osmo-mgw
 | 
			
		||||
Source: git://git.osmocom.org/osmo-mgw
 | 
			
		||||
 | 
			
		||||
Files:     *
 | 
			
		||||
Copyright: 2009-2014 On-Waves
 | 
			
		||||
           2009-2015 Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
           2013 Jacob Erlbeck <jerlbeck@sysmocom.de>
 | 
			
		||||
           2016-2017 sysmocom s.m.f.c. GmbH <info@sysmocom.de>
 | 
			
		||||
License:   AGPL-3.0+
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 (at your option) any later version.
 | 
			
		||||
 .
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU Affero General Public License for more details.
 | 
			
		||||
 .
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Files:     src/libosmo-legacy-mgcp/g711common.h
 | 
			
		||||
Copyright: 2000 Abramo Bagnara <abramo@alsa-project.org>
 | 
			
		||||
License:   GPL-2.0+
 | 
			
		||||
 Wrapper for linphone Codec class by Simon Morlat <simon.morlat@linphone.org>
 | 
			
		||||
 .
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 (at your option) any later version.
 | 
			
		||||
 .
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
 .
 | 
			
		||||
 You should have received a copy of the GNU General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 .
 | 
			
		||||
 The FSF address in the above text is the old one.
 | 
			
		||||
 .
 | 
			
		||||
 On Debian systems, the complete text of the GNU General Public License
 | 
			
		||||
 Version 2 can be found in `/usr/share/common-licenses/GPL-2'.
 | 
			
		||||
 | 
			
		||||
Files:     tests/vty_test_runner.py
 | 
			
		||||
Copyright: 2013 Holger Hans Peter Freyther
 | 
			
		||||
           2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
 | 
			
		||||
License:   GPL-3.0+
 | 
			
		||||
 This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU General Public License as published by
 | 
			
		||||
 the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 (at your option) any later version.
 | 
			
		||||
 .
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
 .
 | 
			
		||||
 You should have received a copy of the GNU General Public License
 | 
			
		||||
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 .
 | 
			
		||||
 On Debian systems, the complete text of the GNU General Public License
 | 
			
		||||
 Version 3 can be found in `/usr/share/common-licenses/GPL-3'.
 | 
			
		||||
 | 
			
		||||
Files:     osmoappdesc.py
 | 
			
		||||
Copyright: 2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
 | 
			
		||||
License:   GPL-3.0+
 | 
			
		||||
 | 
			
		||||
Files:     src/libosmo-legacy-mgcp/mgcp_osmux.c
 | 
			
		||||
Copyright: 2012-2013 On Waves ehf <http://www.on-waves.com>
 | 
			
		||||
           2012-2013 Pablo Neira Ayuso <pablo@gnumonks.org>
 | 
			
		||||
License:   AGPL-3.0+
 | 
			
		||||
 All rights not specifically granted under this license are reserved.
 | 
			
		||||
 .
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
 under the terms of the GNU Affero General Public License as published by the
 | 
			
		||||
 Free Software Foundation; either version 3 of the License, or (at your
 | 
			
		||||
 option) any later version.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								debian/libosmo-legacy-mgcp-dev.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/libosmo-legacy-mgcp-dev.install
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
usr/include/osmocom/legacy_mgcp
 | 
			
		||||
usr/lib/*/libosmo-legacy-mgcp.so
 | 
			
		||||
usr/lib/*/libosmo-legacy-mgcp.a
 | 
			
		||||
usr/lib/*/pkgconfig/libosmo-legacy-mgcp.pc
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/libosmo-legacy-mgcp0.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/libosmo-legacy-mgcp0.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/lib/*/libosmo-legacy-mgcp.so.*
 | 
			
		||||
							
								
								
									
										4
									
								
								debian/libosmo-mgcp-client-dev.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/libosmo-mgcp-client-dev.install
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
usr/include/osmocom/mgcp_client
 | 
			
		||||
usr/lib/*/libosmo-mgcp-client.so
 | 
			
		||||
usr/lib/*/libosmo-mgcp-client.a
 | 
			
		||||
usr/lib/*/pkgconfig/libosmo-mgcp-client.pc
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/libosmo-mgcp-client1.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/libosmo-mgcp-client1.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/lib/*/libosmo-mgcp-client.so.*
 | 
			
		||||
							
								
								
									
										4
									
								
								debian/libosmo-mgcp-dev.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/libosmo-mgcp-dev.install
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
usr/include/osmocom/mgcp
 | 
			
		||||
usr/lib/*/libosmo-mgcp.so
 | 
			
		||||
usr/lib/*/libosmo-mgcp.a
 | 
			
		||||
usr/lib/*/pkgconfig/libosmo-mgcp.pc
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/libosmo-mgcp0.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/libosmo-mgcp0.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/lib/*/libosmo-mgcp.so.*
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/osmo-bsc-mgcp.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/osmo-bsc-mgcp.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/bin/osmo-bsc_mgcp
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/osmo-bsc-mgcp.service
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/osmo-bsc-mgcp.service
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
../contrib/systemd/osmo-bsc-mgcp.service
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/bin/osmo-mgw
 | 
			
		||||
							
								
								
									
										36
									
								
								debian/rules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								debian/rules
									
									
									
									
										vendored
									
									
								
							@@ -1,36 +0,0 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
# You must remove unused comment lines for the released package.
 | 
			
		||||
# See debhelper(7) (uncomment to enable)
 | 
			
		||||
# This is an autogenerated template for debian/rules.
 | 
			
		||||
#
 | 
			
		||||
# Output every command that modifies files on the build system.
 | 
			
		||||
#export DH_VERBOSE = 1
 | 
			
		||||
 | 
			
		||||
DEBIAN  := $(shell dpkg-parsechangelog | grep '^Version:' | cut -d' ' -f2)
 | 
			
		||||
DEBVERS := $(shell echo '$(DEBIAN)' | cut -d- -f1)
 | 
			
		||||
VERSION := $(shell echo '$(DEBVERS)' | sed -e 's/[+-].*//' -e 's/~//g')
 | 
			
		||||
 | 
			
		||||
CFLAGS += -g
 | 
			
		||||
 | 
			
		||||
# main packaging script based on dh7 syntax
 | 
			
		||||
%:
 | 
			
		||||
	dh $@ --with autoreconf 
 | 
			
		||||
 | 
			
		||||
# debmake generated override targets
 | 
			
		||||
# Set options for ./configure
 | 
			
		||||
#CONFIGURE_FLAGS = <options for ./configure>
 | 
			
		||||
#overrride_dh_configure:
 | 
			
		||||
#	dh_configure -- $(CONFIGURE_FLAGS)
 | 
			
		||||
#
 | 
			
		||||
# Do not install libtool archive, python .pyc .pyo
 | 
			
		||||
#override_dh_install:
 | 
			
		||||
#	dh_install --list-missing -X.la -X.pyc -X.pyo
 | 
			
		||||
 | 
			
		||||
override_dh_auto_test:
 | 
			
		||||
	dh_auto_test || (find . -name testsuite.log -exec cat {} \; ; false)
 | 
			
		||||
 | 
			
		||||
override_dh_autoreconf:
 | 
			
		||||
	echo $(VERSION) > .tarball-version
 | 
			
		||||
	dh_autoreconf
 | 
			
		||||
 | 
			
		||||
# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/source/format
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/source/format
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
3.0 (native)
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	examples \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'
 | 
			
		||||
 | 
			
		||||
dist-hook:
 | 
			
		||||
	for f in $$($(CFG_FILES)); do \
 | 
			
		||||
		j="$(distdir)/$$f" && \
 | 
			
		||||
		mkdir -p "$$(dirname $$j)" && \
 | 
			
		||||
		$(INSTALL_DATA) $(srcdir)/$$f $$j; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
install-data-hook:
 | 
			
		||||
	for f in $$($(CFG_FILES)); do \
 | 
			
		||||
		j="$(DESTDIR)$(docdir)/examples/$$f" && \
 | 
			
		||||
		mkdir -p "$$(dirname $$j)" && \
 | 
			
		||||
		$(INSTALL_DATA) $(srcdir)/$$f $$j; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
uninstall-hook:
 | 
			
		||||
	@$(PRE_UNINSTALL)
 | 
			
		||||
	for f in $$($(CFG_FILES)); do \
 | 
			
		||||
		j="$(DESTDIR)$(docdir)/examples/$$f" && \
 | 
			
		||||
		$(RM) $$j; \
 | 
			
		||||
	done
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
!
 | 
			
		||||
! MGCP configuration example
 | 
			
		||||
!
 | 
			
		||||
mgcp
 | 
			
		||||
 !local ip 10.23.24.2
 | 
			
		||||
 !bts ip 10.24.24.1
 | 
			
		||||
 !bind ip 10.23.24.1
 | 
			
		||||
 bind port 2427
 | 
			
		||||
 rtp base 4000
 | 
			
		||||
 rtp force-ptime 20
 | 
			
		||||
 sdp audio payload number 98
 | 
			
		||||
 sdp audio payload name AMR/8000
 | 
			
		||||
 number endpoints 31
 | 
			
		||||
 no rtcp-omit
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
!
 | 
			
		||||
! MGCP configuration example
 | 
			
		||||
!
 | 
			
		||||
mgcp
 | 
			
		||||
 !local ip 10.23.24.2
 | 
			
		||||
 !bts ip 10.24.24.1
 | 
			
		||||
 !bind ip 10.23.24.1
 | 
			
		||||
 bind port 2427
 | 
			
		||||
 rtp force-ptime 20
 | 
			
		||||
 sdp audio payload number 98
 | 
			
		||||
 sdp audio payload name AMR/8000
 | 
			
		||||
 number endpoints 31
 | 
			
		||||
 no rtcp-omit
 | 
			
		||||
							
								
								
									
										151
									
								
								git-version-gen
									
									
									
									
									
								
							
							
						
						
									
										151
									
								
								git-version-gen
									
									
									
									
									
								
							@@ -1,151 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# Print a version string.
 | 
			
		||||
scriptversion=2010-01-28.01
 | 
			
		||||
 | 
			
		||||
# Copyright (C) 2007-2010 Free Software Foundation, Inc.
 | 
			
		||||
#
 | 
			
		||||
# This program is free software: you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope that it will be useful,
 | 
			
		||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
# GNU General Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
 | 
			
		||||
# It may be run two ways:
 | 
			
		||||
# - from a git repository in which the "git describe" command below
 | 
			
		||||
#   produces useful output (thus requiring at least one signed tag)
 | 
			
		||||
# - from a non-git-repo directory containing a .tarball-version file, which
 | 
			
		||||
#   presumes this script is invoked like "./git-version-gen .tarball-version".
 | 
			
		||||
 | 
			
		||||
# In order to use intra-version strings in your project, you will need two
 | 
			
		||||
# separate generated version string files:
 | 
			
		||||
#
 | 
			
		||||
# .tarball-version - present only in a distribution tarball, and not in
 | 
			
		||||
#   a checked-out repository.  Created with contents that were learned at
 | 
			
		||||
#   the last time autoconf was run, and used by git-version-gen.  Must not
 | 
			
		||||
#   be present in either $(srcdir) or $(builddir) for git-version-gen to
 | 
			
		||||
#   give accurate answers during normal development with a checked out tree,
 | 
			
		||||
#   but must be present in a tarball when there is no version control system.
 | 
			
		||||
#   Therefore, it cannot be used in any dependencies.  GNUmakefile has
 | 
			
		||||
#   hooks to force a reconfigure at distribution time to get the value
 | 
			
		||||
#   correct, without penalizing normal development with extra reconfigures.
 | 
			
		||||
#
 | 
			
		||||
# .version - present in a checked-out repository and in a distribution
 | 
			
		||||
#   tarball.  Usable in dependencies, particularly for files that don't
 | 
			
		||||
#   want to depend on config.h but do want to track version changes.
 | 
			
		||||
#   Delete this file prior to any autoconf run where you want to rebuild
 | 
			
		||||
#   files to pick up a version string change; and leave it stale to
 | 
			
		||||
#   minimize rebuild time after unrelated changes to configure sources.
 | 
			
		||||
#
 | 
			
		||||
# It is probably wise to add these two files to .gitignore, so that you
 | 
			
		||||
# don't accidentally commit either generated file.
 | 
			
		||||
#
 | 
			
		||||
# Use the following line in your configure.ac, so that $(VERSION) will
 | 
			
		||||
# automatically be up-to-date each time configure is run (and note that
 | 
			
		||||
# since configure.ac no longer includes a version string, Makefile rules
 | 
			
		||||
# should not depend on configure.ac for version updates).
 | 
			
		||||
#
 | 
			
		||||
# AC_INIT([GNU project],
 | 
			
		||||
#         m4_esyscmd([build-aux/git-version-gen .tarball-version]),
 | 
			
		||||
#         [bug-project@example])
 | 
			
		||||
#
 | 
			
		||||
# Then use the following lines in your Makefile.am, so that .version
 | 
			
		||||
# will be present for dependencies, and so that .tarball-version will
 | 
			
		||||
# exist in distribution tarballs.
 | 
			
		||||
#
 | 
			
		||||
# BUILT_SOURCES = $(top_srcdir)/.version
 | 
			
		||||
# $(top_srcdir)/.version:
 | 
			
		||||
#	echo $(VERSION) > $@-t && mv $@-t $@
 | 
			
		||||
# dist-hook:
 | 
			
		||||
#	echo $(VERSION) > $(distdir)/.tarball-version
 | 
			
		||||
 | 
			
		||||
case $# in
 | 
			
		||||
    1) ;;
 | 
			
		||||
    *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
tarball_version_file=$1
 | 
			
		||||
nl='
 | 
			
		||||
'
 | 
			
		||||
 | 
			
		||||
# First see if there is a tarball-only version file.
 | 
			
		||||
# then try "git describe", then default.
 | 
			
		||||
if test -f $tarball_version_file
 | 
			
		||||
then
 | 
			
		||||
    v=`cat $tarball_version_file` || exit 1
 | 
			
		||||
    case $v in
 | 
			
		||||
	*$nl*) v= ;; # reject multi-line output
 | 
			
		||||
	[0-9]*) ;;
 | 
			
		||||
	*) v= ;;
 | 
			
		||||
    esac
 | 
			
		||||
    test -z "$v" \
 | 
			
		||||
	&& echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test -n "$v"
 | 
			
		||||
then
 | 
			
		||||
    : # use $v
 | 
			
		||||
elif test -d ./.git \
 | 
			
		||||
    && v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
 | 
			
		||||
	  || git describe --abbrev=4 HEAD 2>/dev/null` \
 | 
			
		||||
    && case $v in
 | 
			
		||||
	 [0-9]*) ;;
 | 
			
		||||
	 v[0-9]*) ;;
 | 
			
		||||
	 *) (exit 1) ;;
 | 
			
		||||
       esac
 | 
			
		||||
then
 | 
			
		||||
    # Is this a new git that lists number of commits since the last
 | 
			
		||||
    # tag or the previous older version that did not?
 | 
			
		||||
    #   Newer: v6.10-77-g0f8faeb
 | 
			
		||||
    #   Older: v6.10-g0f8faeb
 | 
			
		||||
    case $v in
 | 
			
		||||
	*-*-*) : git describe is okay three part flavor ;;
 | 
			
		||||
	*-*)
 | 
			
		||||
	    : git describe is older two part flavor
 | 
			
		||||
	    # Recreate the number of commits and rewrite such that the
 | 
			
		||||
	    # result is the same as if we were using the newer version
 | 
			
		||||
	    # of git describe.
 | 
			
		||||
	    vtag=`echo "$v" | sed 's/-.*//'`
 | 
			
		||||
	    numcommits=`git rev-list "$vtag"..HEAD | wc -l`
 | 
			
		||||
	    v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
 | 
			
		||||
	    ;;
 | 
			
		||||
    esac
 | 
			
		||||
 | 
			
		||||
    # Change the first '-' to a '.', so version-comparing tools work properly.
 | 
			
		||||
    # Remove the "g" in git describe's output string, to save a byte.
 | 
			
		||||
    v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
 | 
			
		||||
else
 | 
			
		||||
    v=UNKNOWN
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
v=`echo "$v" |sed 's/^v//'`
 | 
			
		||||
 | 
			
		||||
# Don't declare a version "dirty" merely because a time stamp has changed.
 | 
			
		||||
git status > /dev/null 2>&1
 | 
			
		||||
 | 
			
		||||
dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty=
 | 
			
		||||
case "$dirty" in
 | 
			
		||||
    '') ;;
 | 
			
		||||
    *) # Append the suffix only if there isn't one already.
 | 
			
		||||
	case $v in
 | 
			
		||||
	  *-dirty) ;;
 | 
			
		||||
	  *) v="$v-dirty" ;;
 | 
			
		||||
	esac ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
 | 
			
		||||
echo "$v" | tr -d '\012'
 | 
			
		||||
 | 
			
		||||
# Local variables:
 | 
			
		||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
 | 
			
		||||
# time-stamp-start: "scriptversion="
 | 
			
		||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
 | 
			
		||||
# time-stamp-end: "$"
 | 
			
		||||
# End:
 | 
			
		||||
							
								
								
									
										125
									
								
								hlrsync/hlrsync.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										125
									
								
								hlrsync/hlrsync.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,125 @@
 | 
			
		||||
#!/usr/bin/python2.5
 | 
			
		||||
 | 
			
		||||
from __future__ import with_statement
 | 
			
		||||
 | 
			
		||||
from pysqlite2 import dbapi2 as sqlite3
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
hlr = sqlite3.connect(sys.argv[1])
 | 
			
		||||
web = sqlite3.connect(sys.argv[2])
 | 
			
		||||
 | 
			
		||||
# switch to autocommit
 | 
			
		||||
hlr.isolation_level = None
 | 
			
		||||
web.isolation_level = None
 | 
			
		||||
 | 
			
		||||
hlr.row_factory = sqlite3.Row
 | 
			
		||||
web.row_factory = sqlite3.Row
 | 
			
		||||
 | 
			
		||||
with hlr:
 | 
			
		||||
	hlr_subscrs = hlr.execute("""
 | 
			
		||||
		SELECT * FROM Subscriber
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
	hlr_tokens = hlr.execute("""
 | 
			
		||||
		SELECT * FROM AuthToken
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
 | 
			
		||||
with web:
 | 
			
		||||
	web_tokens = web.execute("""
 | 
			
		||||
		SELECT * FROM reg_tokens
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
	web_sms = web.execute("""
 | 
			
		||||
		SELECT * FROM sms_queue
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
 | 
			
		||||
# index by subscr id
 | 
			
		||||
hlr_subscrs_by_id = {}
 | 
			
		||||
hlr_subscrs_by_ext = {}
 | 
			
		||||
hlr_tokens_by_subscr_id = {}
 | 
			
		||||
for x in hlr_subscrs:
 | 
			
		||||
	hlr_subscrs_by_id[x['id']] = x
 | 
			
		||||
	hlr_subscrs_by_ext[x['extension']] = x
 | 
			
		||||
del hlr_subscrs
 | 
			
		||||
for x in hlr_tokens:
 | 
			
		||||
	hlr_tokens_by_subscr_id[x['subscriber_id']] = x
 | 
			
		||||
del hlr_tokens
 | 
			
		||||
 | 
			
		||||
web_tokens_by_subscr_id = {}
 | 
			
		||||
for x in web_tokens:
 | 
			
		||||
	web_tokens_by_subscr_id[x['subscriber_id']] = x
 | 
			
		||||
del web_tokens
 | 
			
		||||
 | 
			
		||||
# remove leftover web_tokens and correct inconsistent fields
 | 
			
		||||
with web:
 | 
			
		||||
	for x in web_tokens_by_subscr_id.values():
 | 
			
		||||
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if subscr is None:
 | 
			
		||||
			web.execute("""
 | 
			
		||||
				      DELETE FROM reg_tokens WHERE subscriber_id = ?
 | 
			
		||||
				   """, (x['subscriber_id'],))
 | 
			
		||||
			del web_tokens_by_subscr_id[x['subscriber_id']]
 | 
			
		||||
			continue
 | 
			
		||||
		if str(x['imsi']) != str(subscr['imsi']) or \
 | 
			
		||||
		   x['extension'] != subscr['extension'] or \
 | 
			
		||||
		   x['tmsi'] != subscr['tmsi'] or \
 | 
			
		||||
		   x['lac'] != subscr['lac']:
 | 
			
		||||
			web.execute("""
 | 
			
		||||
				      UPDATE reg_tokens
 | 
			
		||||
				      SET imsi = ?, extension = ?, tmsi = ?, lac = ?
 | 
			
		||||
				      WHERE subscriber_id = ?
 | 
			
		||||
				   """, (str(subscr['imsi']), subscr['extension'],
 | 
			
		||||
				   subscr['tmsi'], subscr['lac'], x['subscriber_id']))
 | 
			
		||||
 | 
			
		||||
# add missing web_tokens
 | 
			
		||||
with web:
 | 
			
		||||
	for x in hlr_tokens_by_subscr_id.values():
 | 
			
		||||
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if subscr is None:
 | 
			
		||||
			hlr.execute("""
 | 
			
		||||
				      DELETE FROM AuthToken WHERE subscriber_id = ?
 | 
			
		||||
				   """, (x['subscriber_id'],))
 | 
			
		||||
			del hlr_tokens_by_subscr_id[x['subscriber_id']]
 | 
			
		||||
			continue
 | 
			
		||||
		webtoken = web_tokens_by_subscr_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if webtoken is None:
 | 
			
		||||
			web.execute("""
 | 
			
		||||
				      INSERT INTO reg_tokens
 | 
			
		||||
				      (subscriber_id, extension, reg_completed, name, email, lac, imsi, token, tmsi)
 | 
			
		||||
				      VALUES
 | 
			
		||||
				      (?, ?, 0, ?, '', ?, ?, ?, ?)
 | 
			
		||||
				   """, (x['subscriber_id'], subscr['extension'], subscr['name'],
 | 
			
		||||
				   subscr['lac'], str(subscr['imsi']), x['token'], subscr['tmsi']))
 | 
			
		||||
 | 
			
		||||
# authorize subscribers
 | 
			
		||||
with hlr:
 | 
			
		||||
	for x in web_tokens_by_subscr_id.values():
 | 
			
		||||
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if x['reg_completed'] and not subscr['authorized']:
 | 
			
		||||
			hlr.execute("""
 | 
			
		||||
				      UPDATE Subscriber
 | 
			
		||||
				      SET authorized = 1
 | 
			
		||||
				      WHERE id = ?
 | 
			
		||||
				   """, (x['subscriber_id'],))
 | 
			
		||||
 | 
			
		||||
# Sync SMS from web to hlr
 | 
			
		||||
with hlr:
 | 
			
		||||
	for sms in web_sms:
 | 
			
		||||
		subscr = hlr_subscrs_by_ext.get(sms['receiver_ext'])
 | 
			
		||||
		if subscr is None:
 | 
			
		||||
			print '%s not found' % sms['receiver_ext']
 | 
			
		||||
			continue
 | 
			
		||||
		hlr.execute("""
 | 
			
		||||
				      INSERT INTO SMS
 | 
			
		||||
				      (created, sender_id, receiver_id, reply_path_req, status_rep_req, protocol_id, data_coding_scheme, ud_hdr_ind, text)
 | 
			
		||||
				      VALUES
 | 
			
		||||
				      (?, 1, ?, 0, 0, 0, 0, 0, ?)
 | 
			
		||||
				   """, (sms['created'], subscr['id'], sms['text']))
 | 
			
		||||
with web:
 | 
			
		||||
	for sms in web_sms:
 | 
			
		||||
		web.execute("""
 | 
			
		||||
				      DELETE FROM sms_queue WHERE id = ?
 | 
			
		||||
				   """, (sms['id'],))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
hlr.close()
 | 
			
		||||
web.close()
 | 
			
		||||
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	osmocom \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
nobase_include_HEADERS = \
 | 
			
		||||
	osmocom/legacy_mgcp/mgcp.h \
 | 
			
		||||
	osmocom/legacy_mgcp/mgcp_internal.h \
 | 
			
		||||
	osmocom/legacy_mgcp/osmux.h \
 | 
			
		||||
	osmocom/mgcp_client/mgcp_client.h \
 | 
			
		||||
	osmocom/mgcp_client/mgcp_common.h \
 | 
			
		||||
	osmocom/mgcp/mgcp.h \
 | 
			
		||||
	osmocom/mgcp/mgcp_common.h \
 | 
			
		||||
	osmocom/mgcp/mgcp_internal.h \
 | 
			
		||||
	osmocom/mgcp/osmux.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	legacy_mgcp \
 | 
			
		||||
	mgcp_client \
 | 
			
		||||
	mgcp \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
noinst_HEADERS = \
 | 
			
		||||
	mgcp_transcode.h \
 | 
			
		||||
	vty.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,292 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef OPENBSC_MGCP_H
 | 
			
		||||
#define OPENBSC_MGCP_H
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/core/write_queue.h>
 | 
			
		||||
#include <osmocom/core/timer.h>
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
#define RTP_PORT_DEFAULT 4000
 | 
			
		||||
#define RTP_PORT_NET_DEFAULT 16000
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Calculate the RTP audio port for the given multiplex
 | 
			
		||||
 * and the direction. This allows a semi static endpoint
 | 
			
		||||
 * to port calculation removing the need for the BSC
 | 
			
		||||
 * and the MediaGateway to communicate.
 | 
			
		||||
 *
 | 
			
		||||
 * Port usage explained:
 | 
			
		||||
 *       base + (multiplex * 2) + 0 == local port to wait for network packets
 | 
			
		||||
 *       base + (multiplex * 2) + 1 == local port for rtcp
 | 
			
		||||
 *
 | 
			
		||||
 * The above port will receive packets from the BTS that need
 | 
			
		||||
 * to be patched and forwarded to the network.
 | 
			
		||||
 * The above port will receive packets from the network that
 | 
			
		||||
 * need to be patched and forwarded to the BTS.
 | 
			
		||||
 *
 | 
			
		||||
 * We assume to have a static BTS IP address so we can differentiate
 | 
			
		||||
 * network and BTS.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
static inline int rtp_calculate_port(int multiplex, int base)
 | 
			
		||||
{
 | 
			
		||||
	return base + (multiplex * 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Handling of MGCP Endpoints and the MGCP Config
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_endpoint;
 | 
			
		||||
struct mgcp_config;
 | 
			
		||||
struct mgcp_trunk_config;
 | 
			
		||||
struct mgcp_rtp_end;
 | 
			
		||||
 | 
			
		||||
#define MGCP_ENDP_CRCX 1
 | 
			
		||||
#define MGCP_ENDP_DLCX 2
 | 
			
		||||
#define MGCP_ENDP_MDCX 3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * what to do with the msg?
 | 
			
		||||
 *	- continue as usual?
 | 
			
		||||
 *	- reject and send a failure code?
 | 
			
		||||
 *	- defer? do not send anything
 | 
			
		||||
 */
 | 
			
		||||
#define MGCP_POLICY_CONT	4
 | 
			
		||||
#define MGCP_POLICY_REJECT	5
 | 
			
		||||
#define MGCP_POLICY_DEFER	6
 | 
			
		||||
 | 
			
		||||
typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
 | 
			
		||||
typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
 | 
			
		||||
typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
 | 
			
		||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
 | 
			
		||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return:
 | 
			
		||||
 *   <  0 in case no audio was processed
 | 
			
		||||
 *   >= 0 in case audio was processed. The remaining payload
 | 
			
		||||
 *   length will be returned.
 | 
			
		||||
 */
 | 
			
		||||
typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
 | 
			
		||||
			       struct mgcp_rtp_end *dst_end,
 | 
			
		||||
			       char *data, int *len, int buf_size);
 | 
			
		||||
typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
 | 
			
		||||
				     struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				     struct mgcp_rtp_end *src_end);
 | 
			
		||||
 | 
			
		||||
typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
 | 
			
		||||
				int *payload_type,
 | 
			
		||||
				const char**subtype_name,
 | 
			
		||||
				const char**fmtp_extra);
 | 
			
		||||
 | 
			
		||||
#define PORT_ALLOC_STATIC	0
 | 
			
		||||
#define PORT_ALLOC_DYNAMIC	1
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This holds information on how to allocate ports
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_port_range {
 | 
			
		||||
	int mode;
 | 
			
		||||
 | 
			
		||||
	/* addr or NULL to fall-back to default */
 | 
			
		||||
	char *bind_addr;
 | 
			
		||||
 | 
			
		||||
	/* pre-allocated from a base? */
 | 
			
		||||
	int base_port;
 | 
			
		||||
 | 
			
		||||
	/* dynamically allocated */
 | 
			
		||||
	int range_start;
 | 
			
		||||
	int range_end;
 | 
			
		||||
	int last_port;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MGCP_KEEPALIVE_ONCE (-1)
 | 
			
		||||
 | 
			
		||||
struct mgcp_trunk_config {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
 | 
			
		||||
	int trunk_nr;
 | 
			
		||||
	int trunk_type;
 | 
			
		||||
 | 
			
		||||
	char *audio_fmtp_extra;
 | 
			
		||||
	char *audio_name;
 | 
			
		||||
	int audio_payload;
 | 
			
		||||
	int audio_send_ptime;
 | 
			
		||||
	int audio_send_name;
 | 
			
		||||
	int audio_loop;
 | 
			
		||||
 | 
			
		||||
	int no_audio_transcoding;
 | 
			
		||||
 | 
			
		||||
	int omit_rtcp;
 | 
			
		||||
	int keepalive_interval;
 | 
			
		||||
 | 
			
		||||
	/* RTP patching */
 | 
			
		||||
	int force_constant_ssrc; /* 0: don't, 1: once */
 | 
			
		||||
	int force_aligned_timing;
 | 
			
		||||
 | 
			
		||||
	/* spec handling */
 | 
			
		||||
	int force_realloc;
 | 
			
		||||
 | 
			
		||||
	/* timer */
 | 
			
		||||
	struct osmo_timer_list keepalive_timer;
 | 
			
		||||
 | 
			
		||||
	unsigned int number_endpoints;
 | 
			
		||||
	struct mgcp_endpoint *endpoints;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mgcp_role {
 | 
			
		||||
	MGCP_BSC = 0,
 | 
			
		||||
	MGCP_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mgcp_connection_mode {
 | 
			
		||||
	MGCP_CONN_NONE = 0,
 | 
			
		||||
	MGCP_CONN_RECV_ONLY = 1,
 | 
			
		||||
	MGCP_CONN_SEND_ONLY = 2,
 | 
			
		||||
	MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
 | 
			
		||||
	MGCP_CONN_LOOPBACK  = 4 | MGCP_CONN_RECV_SEND,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_config {
 | 
			
		||||
	int source_port;
 | 
			
		||||
	char *local_ip;
 | 
			
		||||
	char *source_addr;
 | 
			
		||||
	char *bts_ip;
 | 
			
		||||
	char *call_agent_addr;
 | 
			
		||||
 | 
			
		||||
	struct in_addr bts_in;
 | 
			
		||||
 | 
			
		||||
	/* transcoder handling */
 | 
			
		||||
	char *transcoder_ip;
 | 
			
		||||
	struct in_addr transcoder_in;
 | 
			
		||||
	int transcoder_remote_base;
 | 
			
		||||
 | 
			
		||||
	/* RTP processing */
 | 
			
		||||
	mgcp_processing rtp_processing_cb;
 | 
			
		||||
	mgcp_processing_setup setup_rtp_processing_cb;
 | 
			
		||||
 | 
			
		||||
	mgcp_get_format get_net_downlink_format_cb;
 | 
			
		||||
 | 
			
		||||
	struct osmo_wqueue gw_fd;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_port_range bts_ports;
 | 
			
		||||
	struct mgcp_port_range net_ports;
 | 
			
		||||
	struct mgcp_port_range transcoder_ports;
 | 
			
		||||
	int endp_dscp;
 | 
			
		||||
 | 
			
		||||
	int bts_force_ptime;
 | 
			
		||||
 | 
			
		||||
	mgcp_change change_cb;
 | 
			
		||||
	mgcp_policy policy_cb;
 | 
			
		||||
	mgcp_reset reset_cb;
 | 
			
		||||
	mgcp_realloc realloc_cb;
 | 
			
		||||
	mgcp_rqnt rqnt_cb;
 | 
			
		||||
	void *data;
 | 
			
		||||
 | 
			
		||||
	uint32_t last_call_id;
 | 
			
		||||
 | 
			
		||||
	/* trunk handling */
 | 
			
		||||
	struct mgcp_trunk_config trunk;
 | 
			
		||||
	struct llist_head trunks;
 | 
			
		||||
 | 
			
		||||
	/* only used for start with a static configuration */
 | 
			
		||||
	int last_net_port;
 | 
			
		||||
	int last_bts_port;
 | 
			
		||||
 | 
			
		||||
	enum mgcp_role role;
 | 
			
		||||
 | 
			
		||||
	/* osmux translator: 0 means disabled, 1 means enabled */
 | 
			
		||||
	int osmux;
 | 
			
		||||
	/* addr to bind the server to */
 | 
			
		||||
	char *osmux_addr;
 | 
			
		||||
	/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
 | 
			
		||||
	 * the osmux socket is already initialized.
 | 
			
		||||
	 */
 | 
			
		||||
	int osmux_init;
 | 
			
		||||
	/* osmux batch factor: from 1 to 4 maximum */
 | 
			
		||||
	int osmux_batch;
 | 
			
		||||
	/* osmux batch size (in bytes) */
 | 
			
		||||
	int osmux_batch_size;
 | 
			
		||||
	/* osmux port */
 | 
			
		||||
	uint16_t osmux_port;
 | 
			
		||||
	/* Pad circuit with dummy messages until we see the first voice
 | 
			
		||||
	 * message.
 | 
			
		||||
	 */
 | 
			
		||||
	uint16_t osmux_dummy;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* config management */
 | 
			
		||||
struct mgcp_config *mgcp_config_alloc(void);
 | 
			
		||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
 | 
			
		||||
		      enum mgcp_role role);
 | 
			
		||||
int mgcp_vty_init(void);
 | 
			
		||||
int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
 | 
			
		||||
void mgcp_release_endp(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_initialize_endp(struct mgcp_endpoint *endp);
 | 
			
		||||
int mgcp_reset_transcoder(struct mgcp_config *cfg);
 | 
			
		||||
void mgcp_format_stats(struct mgcp_endpoint *endp, char *stats, size_t size);
 | 
			
		||||
int mgcp_parse_stats(struct msgb *msg, uint32_t *ps, uint32_t *os, uint32_t *pr, uint32_t *_or, int *loss, uint32_t *jitter);
 | 
			
		||||
 | 
			
		||||
void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * format helper functions
 | 
			
		||||
 */
 | 
			
		||||
struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
/* adc helper */
 | 
			
		||||
static inline int mgcp_timeslot_to_endpoint(int multiplex, int timeslot)
 | 
			
		||||
{
 | 
			
		||||
	if (timeslot == 0) {
 | 
			
		||||
		LOGP(DLMGCP, LOGL_ERROR, "Timeslot should not be 0\n");
 | 
			
		||||
		timeslot = 255;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return timeslot + (32 * multiplex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void mgcp_endpoint_to_timeslot(int endpoint, int *multiplex, int *timeslot)
 | 
			
		||||
{
 | 
			
		||||
	*multiplex = endpoint / 32;
 | 
			
		||||
	*timeslot = endpoint % 32;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint);
 | 
			
		||||
int mgcp_send_reset_all(struct mgcp_config *cfg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
 | 
			
		||||
int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp, struct sockaddr_in *addr, char *buf, int rc);
 | 
			
		||||
int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,337 +0,0 @@
 | 
			
		||||
/* MGCP Private Data */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/select.h>
 | 
			
		||||
 | 
			
		||||
#define CI_UNUSED 0
 | 
			
		||||
 | 
			
		||||
enum mgcp_trunk_type {
 | 
			
		||||
	MGCP_TRUNK_VIRTUAL,
 | 
			
		||||
	MGCP_TRUNK_E1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_stream_state {
 | 
			
		||||
	uint32_t ssrc;
 | 
			
		||||
	uint16_t last_seq;
 | 
			
		||||
	uint32_t last_timestamp;
 | 
			
		||||
	uint32_t err_ts_counter;
 | 
			
		||||
	int32_t last_tsdelta;
 | 
			
		||||
	uint32_t last_arrival_time;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_state {
 | 
			
		||||
	int initialized;
 | 
			
		||||
	int patch_ssrc;
 | 
			
		||||
 | 
			
		||||
	uint32_t orig_ssrc;
 | 
			
		||||
 | 
			
		||||
	int seq_offset;
 | 
			
		||||
 | 
			
		||||
	int32_t  timestamp_offset;
 | 
			
		||||
	uint32_t packet_duration;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_rtp_stream_state in_stream;
 | 
			
		||||
	struct mgcp_rtp_stream_state out_stream;
 | 
			
		||||
 | 
			
		||||
	/* jitter and packet loss calculation */
 | 
			
		||||
	int stats_initialized;
 | 
			
		||||
	uint16_t stats_base_seq;
 | 
			
		||||
	uint16_t stats_max_seq;
 | 
			
		||||
	uint32_t stats_ssrc;
 | 
			
		||||
	uint32_t stats_jitter;
 | 
			
		||||
	int32_t stats_transit;
 | 
			
		||||
	int stats_cycles;
 | 
			
		||||
	bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_codec {
 | 
			
		||||
	uint32_t rate;
 | 
			
		||||
	int channels;
 | 
			
		||||
	uint32_t frame_duration_num;
 | 
			
		||||
	uint32_t frame_duration_den;
 | 
			
		||||
 | 
			
		||||
	int payload_type;
 | 
			
		||||
	char *audio_name;
 | 
			
		||||
	char *subtype_name;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_end {
 | 
			
		||||
	/* statistics */
 | 
			
		||||
	unsigned int packets;
 | 
			
		||||
	unsigned int octets;
 | 
			
		||||
	unsigned int dropped_packets;
 | 
			
		||||
	struct in_addr addr;
 | 
			
		||||
 | 
			
		||||
	/* in network byte order */
 | 
			
		||||
	int rtp_port, rtcp_port;
 | 
			
		||||
 | 
			
		||||
	/* audio codec information */
 | 
			
		||||
	struct mgcp_rtp_codec codec;
 | 
			
		||||
	struct mgcp_rtp_codec alt_codec; /* TODO/XXX: make it generic */
 | 
			
		||||
 | 
			
		||||
	/* per endpoint data */
 | 
			
		||||
	int  frames_per_packet;
 | 
			
		||||
	uint32_t packet_duration_ms;
 | 
			
		||||
	char *fmtp_extra;
 | 
			
		||||
	int output_enabled;
 | 
			
		||||
	int force_output_ptime;
 | 
			
		||||
 | 
			
		||||
	/* RTP patching */
 | 
			
		||||
	int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
 | 
			
		||||
	int force_aligned_timing;
 | 
			
		||||
	void *rtp_process_data;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Each end has a socket...
 | 
			
		||||
	 */
 | 
			
		||||
	struct osmo_fd rtp;
 | 
			
		||||
	struct osmo_fd rtcp;
 | 
			
		||||
 | 
			
		||||
	int local_port;
 | 
			
		||||
	int local_alloc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_TAP_BTS_IN,
 | 
			
		||||
	MGCP_TAP_BTS_OUT,
 | 
			
		||||
	MGCP_TAP_NET_IN,
 | 
			
		||||
	MGCP_TAP_NET_OUT,
 | 
			
		||||
 | 
			
		||||
	/* last element */
 | 
			
		||||
	MGCP_TAP_COUNT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_tap {
 | 
			
		||||
	int enabled;
 | 
			
		||||
	struct sockaddr_in forward;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_lco {
 | 
			
		||||
	char *string;
 | 
			
		||||
	char *codec;
 | 
			
		||||
	int pkt_period_min; /* time in ms */
 | 
			
		||||
	int pkt_period_max; /* time in ms */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mgcp_type {
 | 
			
		||||
	MGCP_RTP_DEFAULT	= 0,
 | 
			
		||||
	MGCP_RTP_TRANSCODED,
 | 
			
		||||
	MGCP_OSMUX_BSC,
 | 
			
		||||
	MGCP_OSMUX_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <osmocom/legacy_mgcp/osmux.h>
 | 
			
		||||
 | 
			
		||||
struct mgcp_endpoint {
 | 
			
		||||
	int allocated;
 | 
			
		||||
	uint32_t ci;
 | 
			
		||||
	char *callid;
 | 
			
		||||
	struct mgcp_lco local_options;
 | 
			
		||||
	int conn_mode;
 | 
			
		||||
	int orig_mode;
 | 
			
		||||
 | 
			
		||||
	/* backpointer */
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
	struct mgcp_trunk_config *tcfg;
 | 
			
		||||
 | 
			
		||||
	/* port status for bts/net */
 | 
			
		||||
	struct mgcp_rtp_end bts_end;
 | 
			
		||||
	struct mgcp_rtp_end net_end;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * For transcoding we will send from the local_port
 | 
			
		||||
	 * of trans_bts and it will arrive at trans_net from
 | 
			
		||||
	 * where we will forward it to the network.
 | 
			
		||||
	 */
 | 
			
		||||
	struct mgcp_rtp_end trans_bts;
 | 
			
		||||
	struct mgcp_rtp_end trans_net;
 | 
			
		||||
	enum mgcp_type type;
 | 
			
		||||
 | 
			
		||||
	/* sequence bits */
 | 
			
		||||
	struct mgcp_rtp_state net_state;
 | 
			
		||||
	struct mgcp_rtp_state bts_state;
 | 
			
		||||
 | 
			
		||||
	/* fields for re-transmission */
 | 
			
		||||
	char *last_trans;
 | 
			
		||||
	char *last_response;
 | 
			
		||||
 | 
			
		||||
	/* tap for the endpoint */
 | 
			
		||||
	struct mgcp_rtp_tap taps[MGCP_TAP_COUNT];
 | 
			
		||||
 | 
			
		||||
	struct {
 | 
			
		||||
		/* Osmux state: disabled, activating, active */
 | 
			
		||||
		enum osmux_state state;
 | 
			
		||||
		/* Allocated Osmux circuit ID for this endpoint */
 | 
			
		||||
		int allocated_cid;
 | 
			
		||||
		/* Used Osmux circuit ID for this endpoint */
 | 
			
		||||
		uint8_t cid;
 | 
			
		||||
		/* handle to batch messages */
 | 
			
		||||
		struct osmux_in_handle *in;
 | 
			
		||||
		/* handle to unbatch messages */
 | 
			
		||||
		struct osmux_out_handle out;
 | 
			
		||||
		/* statistics */
 | 
			
		||||
		struct {
 | 
			
		||||
			uint32_t chunks;
 | 
			
		||||
			uint32_t octets;
 | 
			
		||||
		} stats;
 | 
			
		||||
	} osmux;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define for_each_line(line, save)			\
 | 
			
		||||
	for (line = strline_r(NULL, &save); line;\
 | 
			
		||||
	     line = strline_r(NULL, &save))
 | 
			
		||||
 | 
			
		||||
static inline char *strline_r(char *str, char **saveptr)
 | 
			
		||||
{
 | 
			
		||||
	char *result;
 | 
			
		||||
 | 
			
		||||
	if (str)
 | 
			
		||||
		*saveptr = str;
 | 
			
		||||
 | 
			
		||||
	result = *saveptr;
 | 
			
		||||
 | 
			
		||||
	if (*saveptr != NULL) {
 | 
			
		||||
		*saveptr = strpbrk(*saveptr, "\r\n");
 | 
			
		||||
 | 
			
		||||
		if (*saveptr != NULL) {
 | 
			
		||||
			char *eos = *saveptr;
 | 
			
		||||
 | 
			
		||||
			if ((*saveptr)[0] == '\r' && (*saveptr)[1] == '\n')
 | 
			
		||||
				(*saveptr)++;
 | 
			
		||||
			(*saveptr)++;
 | 
			
		||||
			if ((*saveptr)[0] == '\0')
 | 
			
		||||
				*saveptr = NULL;
 | 
			
		||||
 | 
			
		||||
			*eos = '\0';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Internal structure while parsing a request
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_parse_data {
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
	struct mgcp_endpoint *endp;
 | 
			
		||||
	char *trans;
 | 
			
		||||
	char *save;
 | 
			
		||||
	int found;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mgcp_send_dummy(struct mgcp_endpoint *endp);
 | 
			
		||||
int mgcp_bind_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
 | 
			
		||||
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
 | 
			
		||||
int mgcp_bind_trans_bts_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
 | 
			
		||||
int mgcp_bind_trans_net_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
 | 
			
		||||
int mgcp_free_rtp_port(struct mgcp_rtp_end *end);
 | 
			
		||||
 | 
			
		||||
/* For transcoding we need to manage an in and an output that are connected */
 | 
			
		||||
static inline int endp_back_channel(int endpoint)
 | 
			
		||||
{
 | 
			
		||||
	return endpoint + 60;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
 | 
			
		||||
struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
 | 
			
		||||
 | 
			
		||||
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
 | 
			
		||||
			 struct mgcp_rtp_end *rtp);
 | 
			
		||||
uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
 | 
			
		||||
				  struct mgcp_rtp_end *rtp);
 | 
			
		||||
 | 
			
		||||
void mgcp_state_calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *,
 | 
			
		||||
			uint32_t *expected, int *loss);
 | 
			
		||||
uint32_t mgcp_state_calc_jitter(struct mgcp_rtp_state *);
 | 
			
		||||
 | 
			
		||||
/* payload processing default functions */
 | 
			
		||||
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				char *data, int *len, int buf_size);
 | 
			
		||||
 | 
			
		||||
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
 | 
			
		||||
				      struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				      struct mgcp_rtp_end *src_end);
 | 
			
		||||
 | 
			
		||||
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
 | 
			
		||||
					  int *payload_type,
 | 
			
		||||
					  const char**subtype_name,
 | 
			
		||||
					  const char**fmtp_extra);
 | 
			
		||||
 | 
			
		||||
/* internal RTP Annex A counting */
 | 
			
		||||
void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
 | 
			
		||||
			const uint16_t seq, const int32_t transit,
 | 
			
		||||
			const uint32_t ssrc);
 | 
			
		||||
 | 
			
		||||
int mgcp_set_ip_tos(int fd, int tos);
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_DEST_NET = 0,
 | 
			
		||||
	MGCP_DEST_BTS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MGCP_DUMMY_LOAD 0x23
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SDP related information
 | 
			
		||||
 */
 | 
			
		||||
/* Assume audio frame length of 20ms */
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_DEFAULT_RATE  8000
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
 | 
			
		||||
 | 
			
		||||
#define PTYPE_UNDEFINED (-1)
 | 
			
		||||
int mgcp_parse_sdp_data(struct mgcp_endpoint *endp, struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p);
 | 
			
		||||
int mgcp_set_audio_info(void *ctx, struct mgcp_rtp_codec *codec,
 | 
			
		||||
			int payload_type, const char *audio_name);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Internal network related
 | 
			
		||||
 */
 | 
			
		||||
static inline const char *mgcp_net_src_addr(struct mgcp_endpoint *endp)
 | 
			
		||||
{
 | 
			
		||||
	if (endp->cfg->net_ports.bind_addr)
 | 
			
		||||
		return endp->cfg->net_ports.bind_addr;
 | 
			
		||||
	return endp->cfg->source_addr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline const char *mgcp_bts_src_addr(struct mgcp_endpoint *endp)
 | 
			
		||||
{
 | 
			
		||||
	if (endp->cfg->bts_ports.bind_addr)
 | 
			
		||||
		return endp->cfg->bts_ports.bind_addr;
 | 
			
		||||
	return endp->cfg->source_addr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mgcp_msg_terminate_nul(struct msgb *msg);
 | 
			
		||||
@@ -1,90 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2014 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef OPENBSC_MGCP_TRANSCODE_H
 | 
			
		||||
#define OPENBSC_MGCP_TRANSCODE_H
 | 
			
		||||
 | 
			
		||||
#include "bscconfig.h"
 | 
			
		||||
 | 
			
		||||
#include <gsm.h>
 | 
			
		||||
#ifdef HAVE_BCG729
 | 
			
		||||
#include <bcg729/decoder.h>
 | 
			
		||||
#include <bcg729/encoder.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
enum audio_format {
 | 
			
		||||
	AF_INVALID,
 | 
			
		||||
	AF_S16,
 | 
			
		||||
	AF_L16,
 | 
			
		||||
	AF_GSM,
 | 
			
		||||
	AF_G729,
 | 
			
		||||
	AF_PCMA,
 | 
			
		||||
	AF_PCMU
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct mgcp_process_rtp_state {
 | 
			
		||||
	/* decoding */
 | 
			
		||||
	enum audio_format src_fmt;
 | 
			
		||||
	union {
 | 
			
		||||
		gsm gsm_handle;
 | 
			
		||||
#ifdef HAVE_BCG729
 | 
			
		||||
		bcg729DecoderChannelContextStruct *g729_dec;
 | 
			
		||||
#endif
 | 
			
		||||
	} src;
 | 
			
		||||
	size_t src_frame_size;
 | 
			
		||||
	size_t src_samples_per_frame;
 | 
			
		||||
 | 
			
		||||
	/* processing */
 | 
			
		||||
 | 
			
		||||
	/* encoding */
 | 
			
		||||
	enum audio_format dst_fmt;
 | 
			
		||||
	union {
 | 
			
		||||
		gsm gsm_handle;
 | 
			
		||||
#ifdef HAVE_BCG729
 | 
			
		||||
		bcg729EncoderChannelContextStruct *g729_enc;
 | 
			
		||||
#endif
 | 
			
		||||
	} dst;
 | 
			
		||||
	size_t dst_frame_size;
 | 
			
		||||
	size_t dst_samples_per_frame;
 | 
			
		||||
	int dst_packet_duration;
 | 
			
		||||
 | 
			
		||||
	int is_running;
 | 
			
		||||
	uint16_t next_seq;
 | 
			
		||||
	uint32_t next_time;
 | 
			
		||||
	int16_t samples[10*160];
 | 
			
		||||
	size_t sample_cnt;
 | 
			
		||||
	size_t sample_offs;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mgcp_transcoding_setup(struct mgcp_endpoint *endp,
 | 
			
		||||
			   struct mgcp_rtp_end *dst_end,
 | 
			
		||||
			   struct mgcp_rtp_end *src_end);
 | 
			
		||||
 | 
			
		||||
void mgcp_transcoding_net_downlink_format(struct mgcp_endpoint *endp,
 | 
			
		||||
					  int *payload_type,
 | 
			
		||||
					  const char**audio_name,
 | 
			
		||||
					  const char**fmtp_extra);
 | 
			
		||||
 | 
			
		||||
int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
 | 
			
		||||
				 struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				 char *data, int *len, int buf_size);
 | 
			
		||||
 | 
			
		||||
int mgcp_transcoding_get_frame_size(void *state_, int nsamples, int dst);
 | 
			
		||||
#endif /* OPENBSC_MGCP_TRANSCODE_H */
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
#ifndef _OPENBSC_OSMUX_H_
 | 
			
		||||
#define _OPENBSC_OSMUX_H_
 | 
			
		||||
 | 
			
		||||
#include <osmocom/netif/osmux.h>
 | 
			
		||||
 | 
			
		||||
#define OSMUX_PORT	1984
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	OSMUX_ROLE_BSC = 0,
 | 
			
		||||
	OSMUX_ROLE_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int osmux_init(int role, struct mgcp_config *cfg);
 | 
			
		||||
int osmux_enable_endpoint(struct mgcp_endpoint *endp, struct in_addr *addr, uint16_t port);
 | 
			
		||||
void osmux_disable_endpoint(struct mgcp_endpoint *endp);
 | 
			
		||||
void osmux_allocate_cid(struct mgcp_endpoint *endp);
 | 
			
		||||
void osmux_release_cid(struct mgcp_endpoint *endp);
 | 
			
		||||
 | 
			
		||||
int osmux_xfrm_to_rtp(struct mgcp_endpoint *endp, int type, char *buf, int rc);
 | 
			
		||||
int osmux_xfrm_to_osmux(int type, char *buf, int rc, struct mgcp_endpoint *endp);
 | 
			
		||||
 | 
			
		||||
int osmux_send_dummy(struct mgcp_endpoint *endp);
 | 
			
		||||
 | 
			
		||||
int osmux_get_cid(void);
 | 
			
		||||
void osmux_put_cid(uint8_t osmux_cid);
 | 
			
		||||
int osmux_used_cid(void);
 | 
			
		||||
 | 
			
		||||
enum osmux_state {
 | 
			
		||||
	OSMUX_STATE_DISABLED = 0,
 | 
			
		||||
	OSMUX_STATE_NEGOTIATING,
 | 
			
		||||
	OSMUX_STATE_ACTIVATING,
 | 
			
		||||
	OSMUX_STATE_ENABLED,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum osmux_usage {
 | 
			
		||||
	OSMUX_USAGE_OFF = 0,
 | 
			
		||||
	OSMUX_USAGE_ON = 1,
 | 
			
		||||
	OSMUX_USAGE_ONLY = 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
#ifndef OPENBSC_VTY_H
 | 
			
		||||
#define OPENBSC_VTY_H
 | 
			
		||||
 | 
			
		||||
#include <osmocom/vty/vty.h>
 | 
			
		||||
#include <osmocom/vty/buffer.h>
 | 
			
		||||
#include <osmocom/vty/command.h>
 | 
			
		||||
 | 
			
		||||
struct gsm_network;
 | 
			
		||||
struct vty;
 | 
			
		||||
 | 
			
		||||
void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *);
 | 
			
		||||
 | 
			
		||||
struct buffer *vty_argv_to_buffer(int argc, const char *argv[], int base);
 | 
			
		||||
 | 
			
		||||
extern struct cmd_element cfg_description_cmd;
 | 
			
		||||
extern struct cmd_element cfg_no_description_cmd;
 | 
			
		||||
 | 
			
		||||
enum mgcp_vty_node {
 | 
			
		||||
	MGCP_NODE = _LAST_OSMOVTY_NODE + 1,
 | 
			
		||||
	TRUNK_NODE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct log_info;
 | 
			
		||||
int bsc_vty_init(struct gsm_network *network);
 | 
			
		||||
int bsc_vty_init_extra(void);
 | 
			
		||||
 | 
			
		||||
void msc_vty_init(struct gsm_network *msc_network);
 | 
			
		||||
 | 
			
		||||
struct gsm_network *gsmnet_from_vty(struct vty *vty);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
noinst_HEADERS = \
 | 
			
		||||
	vty.h \
 | 
			
		||||
	mgcp_msg.h \
 | 
			
		||||
	mgcp_conn.h \
 | 
			
		||||
	mgcp_stat.h \
 | 
			
		||||
	mgcp_ep.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,261 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/core/write_queue.h>
 | 
			
		||||
#include <osmocom/core/timer.h>
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp_common.h>
 | 
			
		||||
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
#define RTP_PORT_DEFAULT_RANGE_START 16002
 | 
			
		||||
#define RTP_PORT_DEFAULT_RANGE_END RTP_PORT_DEFAULT_RANGE_START + 64
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Calculate the RTP audio port for the given multiplex
 | 
			
		||||
 * and the direction. This allows a semi static endpoint
 | 
			
		||||
 * to port calculation removing the need for the BSC
 | 
			
		||||
 * and the MediaGateway to communicate.
 | 
			
		||||
 *
 | 
			
		||||
 * Port usage explained:
 | 
			
		||||
 *       base + (multiplex * 2) + 0 == local port to wait for network packets
 | 
			
		||||
 *       base + (multiplex * 2) + 1 == local port for rtcp
 | 
			
		||||
 *
 | 
			
		||||
 * The above port will receive packets from the BTS that need
 | 
			
		||||
 * to be patched and forwarded to the network.
 | 
			
		||||
 * The above port will receive packets from the network that
 | 
			
		||||
 * need to be patched and forwarded to the BTS.
 | 
			
		||||
 *
 | 
			
		||||
 * We assume to have a static BTS IP address so we can differentiate
 | 
			
		||||
 * network and BTS.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
static inline int rtp_calculate_port(int multiplex, int base)
 | 
			
		||||
{
 | 
			
		||||
	return base + (multiplex * 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Handling of MGCP Endpoints and the MGCP Config
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_endpoint;
 | 
			
		||||
struct mgcp_config;
 | 
			
		||||
struct mgcp_trunk_config;
 | 
			
		||||
struct mgcp_rtp_end;
 | 
			
		||||
 | 
			
		||||
#define MGCP_ENDP_CRCX 1
 | 
			
		||||
#define MGCP_ENDP_DLCX 2
 | 
			
		||||
#define MGCP_ENDP_MDCX 3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * what to do with the msg?
 | 
			
		||||
 *	- continue as usual?
 | 
			
		||||
 *	- reject and send a failure code?
 | 
			
		||||
 *	- defer? do not send anything
 | 
			
		||||
 */
 | 
			
		||||
#define MGCP_POLICY_CONT	4
 | 
			
		||||
#define MGCP_POLICY_REJECT	5
 | 
			
		||||
#define MGCP_POLICY_DEFER	6
 | 
			
		||||
 | 
			
		||||
typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
 | 
			
		||||
typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
 | 
			
		||||
typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
 | 
			
		||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
 | 
			
		||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return:
 | 
			
		||||
 *   <  0 in case no audio was processed
 | 
			
		||||
 *   >= 0 in case audio was processed. The remaining payload
 | 
			
		||||
 *   length will be returned.
 | 
			
		||||
 */
 | 
			
		||||
typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
 | 
			
		||||
			       struct mgcp_rtp_end *dst_end,
 | 
			
		||||
			       char *data, int *len, int buf_size);
 | 
			
		||||
typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
 | 
			
		||||
				     struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				     struct mgcp_rtp_end *src_end);
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn_rtp;
 | 
			
		||||
typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
 | 
			
		||||
				int *payload_type,
 | 
			
		||||
				const char**subtype_name,
 | 
			
		||||
				const char**fmtp_extra,
 | 
			
		||||
				struct mgcp_conn_rtp *conn);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This holds information on how to allocate ports
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_port_range {
 | 
			
		||||
	/* addr or NULL to fall-back to default */
 | 
			
		||||
	char *bind_addr;
 | 
			
		||||
 | 
			
		||||
	/* dynamically allocated */
 | 
			
		||||
	int range_start;
 | 
			
		||||
	int range_end;
 | 
			
		||||
	int last_port;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MGCP_KEEPALIVE_ONCE (-1)
 | 
			
		||||
 | 
			
		||||
struct mgcp_trunk_config {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
 | 
			
		||||
	int trunk_nr;
 | 
			
		||||
	int trunk_type;
 | 
			
		||||
 | 
			
		||||
	char *audio_fmtp_extra;
 | 
			
		||||
	char *audio_name;
 | 
			
		||||
	int audio_payload;
 | 
			
		||||
	int audio_send_ptime;
 | 
			
		||||
	int audio_send_name;
 | 
			
		||||
	int audio_loop;
 | 
			
		||||
 | 
			
		||||
	int no_audio_transcoding;
 | 
			
		||||
 | 
			
		||||
	int omit_rtcp;
 | 
			
		||||
	int keepalive_interval;
 | 
			
		||||
 | 
			
		||||
	/* RTP patching */
 | 
			
		||||
	int force_constant_ssrc; /* 0: don't, 1: once */
 | 
			
		||||
	int force_aligned_timing;
 | 
			
		||||
 | 
			
		||||
	/* spec handling */
 | 
			
		||||
	int force_realloc;
 | 
			
		||||
 | 
			
		||||
	/* timer */
 | 
			
		||||
	struct osmo_timer_list keepalive_timer;
 | 
			
		||||
 | 
			
		||||
	/* When set, incoming RTP packets are not filtered
 | 
			
		||||
	 * when ports and ip-address do not match (debug) */
 | 
			
		||||
	int rtp_accept_all;
 | 
			
		||||
 | 
			
		||||
	unsigned int number_endpoints;
 | 
			
		||||
	struct mgcp_endpoint *endpoints;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mgcp_role {
 | 
			
		||||
	MGCP_BSC = 0,
 | 
			
		||||
	MGCP_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_config {
 | 
			
		||||
	int source_port;
 | 
			
		||||
	char *local_ip;
 | 
			
		||||
	char *source_addr;
 | 
			
		||||
	char *call_agent_addr;
 | 
			
		||||
 | 
			
		||||
	/* RTP processing */
 | 
			
		||||
	mgcp_processing rtp_processing_cb;
 | 
			
		||||
	mgcp_processing_setup setup_rtp_processing_cb;
 | 
			
		||||
 | 
			
		||||
	mgcp_get_format get_net_downlink_format_cb;
 | 
			
		||||
 | 
			
		||||
	struct osmo_wqueue gw_fd;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_port_range net_ports;
 | 
			
		||||
	int endp_dscp;
 | 
			
		||||
 | 
			
		||||
	int force_ptime;
 | 
			
		||||
 | 
			
		||||
	mgcp_change change_cb;
 | 
			
		||||
	mgcp_policy policy_cb;
 | 
			
		||||
	mgcp_reset reset_cb;
 | 
			
		||||
	mgcp_realloc realloc_cb;
 | 
			
		||||
	mgcp_rqnt rqnt_cb;
 | 
			
		||||
	void *data;
 | 
			
		||||
 | 
			
		||||
	uint32_t last_call_id;
 | 
			
		||||
 | 
			
		||||
	/* trunk handling */
 | 
			
		||||
	struct mgcp_trunk_config trunk;
 | 
			
		||||
	struct llist_head trunks;
 | 
			
		||||
 | 
			
		||||
	enum mgcp_role role;
 | 
			
		||||
 | 
			
		||||
	/* osmux translator: 0 means disabled, 1 means enabled */
 | 
			
		||||
	int osmux;
 | 
			
		||||
	/* addr to bind the server to */
 | 
			
		||||
	char *osmux_addr;
 | 
			
		||||
	/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
 | 
			
		||||
	 * the osmux socket is already initialized.
 | 
			
		||||
	 */
 | 
			
		||||
	int osmux_init;
 | 
			
		||||
	/* osmux batch factor: from 1 to 4 maximum */
 | 
			
		||||
	int osmux_batch;
 | 
			
		||||
	/* osmux batch size (in bytes) */
 | 
			
		||||
	int osmux_batch_size;
 | 
			
		||||
	/* osmux port */
 | 
			
		||||
	uint16_t osmux_port;
 | 
			
		||||
	/* Pad circuit with dummy messages until we see the first voice
 | 
			
		||||
	 * message.
 | 
			
		||||
	 */
 | 
			
		||||
	uint16_t osmux_dummy;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* config management */
 | 
			
		||||
struct mgcp_config *mgcp_config_alloc(void);
 | 
			
		||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
 | 
			
		||||
		      enum mgcp_role role);
 | 
			
		||||
int mgcp_vty_init(void);
 | 
			
		||||
int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
 | 
			
		||||
void mgcp_release_endp(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * format helper functions
 | 
			
		||||
 */
 | 
			
		||||
struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
/* adc helper */
 | 
			
		||||
static inline int mgcp_timeslot_to_endpoint(int multiplex, int timeslot)
 | 
			
		||||
{
 | 
			
		||||
	if (timeslot == 0) {
 | 
			
		||||
		LOGP(DLMGCP, LOGL_ERROR, "Timeslot should not be 0\n");
 | 
			
		||||
		timeslot = 255;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return timeslot + (32 * multiplex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void mgcp_endpoint_to_timeslot(int endpoint, int *multiplex, int *timeslot)
 | 
			
		||||
{
 | 
			
		||||
	*multiplex = endpoint / 32;
 | 
			
		||||
	*timeslot = endpoint % 32;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint);
 | 
			
		||||
int mgcp_send_reset_all(struct mgcp_config *cfg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
 | 
			
		||||
int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len);
 | 
			
		||||
@@ -1,71 +0,0 @@
 | 
			
		||||
/* MGCP common implementations.
 | 
			
		||||
 * These are used in libosmo-mgcp as well as libosmo-mgcp-client.
 | 
			
		||||
 * To avoid interdependency, these are implemented in .h file only. */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Two copies of this file are kept in osmocom/mgcp/ and osmocom/mgcp_client/.
 | 
			
		||||
 * Since both are by definition identical, use the old header exclusion ifdefs
 | 
			
		||||
 * instead of '#pragma once' to avoid including both of these files.
 | 
			
		||||
 * Though at the time of writing there are no such users, this allows including
 | 
			
		||||
 * both libosmo-mgcp and libosmo-mgcp-client headers in the same file. */
 | 
			
		||||
#ifndef OSMO_MGCP_COMMON_H
 | 
			
		||||
#define OSMO_MGCP_COMMON_H
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
 | 
			
		||||
#define for_each_non_empty_line(line, save)			\
 | 
			
		||||
	for (line = strtok_r(NULL, "\r\n", &save); line;	\
 | 
			
		||||
	     line = strtok_r(NULL, "\r\n", &save))
 | 
			
		||||
 | 
			
		||||
enum mgcp_connection_mode {
 | 
			
		||||
	MGCP_CONN_NONE = 0,
 | 
			
		||||
	MGCP_CONN_RECV_ONLY = 1,
 | 
			
		||||
	MGCP_CONN_SEND_ONLY = 2,
 | 
			
		||||
	MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
 | 
			
		||||
	MGCP_CONN_LOOPBACK  = 4 | MGCP_CONN_RECV_SEND,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Ensure that the msg->l2h is NUL terminated. */
 | 
			
		||||
static inline int mgcp_msg_terminate_nul(struct msgb *msg)
 | 
			
		||||
{
 | 
			
		||||
	unsigned char *tail = msg->l2h + msgb_l2len(msg); /* char after l2 data */
 | 
			
		||||
	if (tail[-1] == '\0')
 | 
			
		||||
		/* nothing to do */;
 | 
			
		||||
	else if (msgb_tailroom(msg) > 0)
 | 
			
		||||
		tail[0] = '\0';
 | 
			
		||||
	else if (tail[-1] == '\r' || tail[-1] == '\n')
 | 
			
		||||
		tail[-1] = '\0';
 | 
			
		||||
	else {
 | 
			
		||||
		LOGP(DLMGCP, LOGL_ERROR, "Cannot NUL terminate MGCP message: "
 | 
			
		||||
		     "Length: %d, Buffer size: %d\n",
 | 
			
		||||
		     msgb_l2len(msg), msg->data_len);
 | 
			
		||||
		return -ENOTSUP;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,40 +0,0 @@
 | 
			
		||||
/* Message connection list handling */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Philipp Maier
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp_internal.h>
 | 
			
		||||
#include <osmocom/core/linuxlist.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp,
 | 
			
		||||
				  uint32_t id, enum mgcp_conn_type type,
 | 
			
		||||
				  char *name);
 | 
			
		||||
struct mgcp_conn *mgcp_conn_get(struct mgcp_endpoint *endp, uint32_t id);
 | 
			
		||||
struct mgcp_conn_rtp *mgcp_conn_get_rtp(struct mgcp_endpoint *endp,
 | 
			
		||||
					uint32_t id);
 | 
			
		||||
void mgcp_conn_free(struct mgcp_endpoint *endp, uint32_t id);
 | 
			
		||||
void mgcp_conn_free_oldest(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_conn_free_all(struct mgcp_endpoint *endp);
 | 
			
		||||
char *mgcp_conn_dump(struct mgcp_conn *conn);
 | 
			
		||||
struct mgcp_conn *mgcp_find_dst_conn(struct mgcp_conn *conn);
 | 
			
		||||
@@ -1,50 +0,0 @@
 | 
			
		||||
/* Endpoint types */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Philipp Maier
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
struct sockaddr_in;
 | 
			
		||||
struct mgcp_conn;
 | 
			
		||||
 | 
			
		||||
/* Callback type for RTP dispatcher functions
 | 
			
		||||
   (e.g mgcp_dispatch_rtp_bridge_cb, see below) */
 | 
			
		||||
typedef int (*mgcp_dispatch_rtp_cb) (int proto, struct sockaddr_in * addr,
 | 
			
		||||
				     char *buf, unsigned int buf_size,
 | 
			
		||||
				     struct mgcp_conn * conn);
 | 
			
		||||
 | 
			
		||||
/*! MGCP endpoint properties */
 | 
			
		||||
struct mgcp_endpoint_type {
 | 
			
		||||
	/*!< maximum number of connections */
 | 
			
		||||
	int max_conns;
 | 
			
		||||
 | 
			
		||||
	/*!< callback that defines how to dispatch incoming RTP data */
 | 
			
		||||
	mgcp_dispatch_rtp_cb dispatch_rtp_cb;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! MGCP endpoint typeset */
 | 
			
		||||
struct mgcp_endpoint_typeset {
 | 
			
		||||
	struct mgcp_endpoint_type rtp;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! static MGCP endpoint typeset (pre-initalized, read-only) */
 | 
			
		||||
extern const struct mgcp_endpoint_typeset ep_typeset;
 | 
			
		||||
@@ -1,332 +0,0 @@
 | 
			
		||||
/* MGCP Private Data */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
#include <osmocom/core/select.h>
 | 
			
		||||
#include <osmocom/mgcp/mgcp.h>
 | 
			
		||||
#include <osmocom/core/linuxlist.h>
 | 
			
		||||
 | 
			
		||||
#define CI_UNUSED 0
 | 
			
		||||
 | 
			
		||||
#define CONN_ID_BTS 0
 | 
			
		||||
#define CONN_ID_NET 1
 | 
			
		||||
 | 
			
		||||
enum mgcp_trunk_type {
 | 
			
		||||
	MGCP_TRUNK_VIRTUAL,
 | 
			
		||||
	MGCP_TRUNK_E1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_stream_state {
 | 
			
		||||
	uint32_t ssrc;
 | 
			
		||||
	uint16_t last_seq;
 | 
			
		||||
	uint32_t last_timestamp;
 | 
			
		||||
	uint32_t err_ts_counter;
 | 
			
		||||
	int32_t last_tsdelta;
 | 
			
		||||
	uint32_t last_arrival_time;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_state {
 | 
			
		||||
	int initialized;
 | 
			
		||||
	int patch_ssrc;
 | 
			
		||||
 | 
			
		||||
	uint32_t orig_ssrc;
 | 
			
		||||
 | 
			
		||||
	int seq_offset;
 | 
			
		||||
 | 
			
		||||
	int32_t  timestamp_offset;
 | 
			
		||||
	uint32_t packet_duration;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_rtp_stream_state in_stream;
 | 
			
		||||
	struct mgcp_rtp_stream_state out_stream;
 | 
			
		||||
 | 
			
		||||
	/* jitter and packet loss calculation */
 | 
			
		||||
	int stats_initialized;
 | 
			
		||||
	uint16_t stats_base_seq;
 | 
			
		||||
	uint16_t stats_max_seq;
 | 
			
		||||
	uint32_t stats_ssrc;
 | 
			
		||||
	uint32_t stats_jitter;
 | 
			
		||||
	int32_t stats_transit;
 | 
			
		||||
	int stats_cycles;
 | 
			
		||||
	bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_codec {
 | 
			
		||||
	uint32_t rate;
 | 
			
		||||
	int channels;
 | 
			
		||||
	uint32_t frame_duration_num;
 | 
			
		||||
	uint32_t frame_duration_den;
 | 
			
		||||
 | 
			
		||||
	int payload_type;
 | 
			
		||||
	char *audio_name;
 | 
			
		||||
	char *subtype_name;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_end {
 | 
			
		||||
	/* statistics */
 | 
			
		||||
	unsigned int packets_rx;
 | 
			
		||||
	unsigned int octets_rx;
 | 
			
		||||
	unsigned int packets_tx;
 | 
			
		||||
	unsigned int octets_tx;
 | 
			
		||||
	unsigned int dropped_packets;
 | 
			
		||||
	struct in_addr addr;
 | 
			
		||||
 | 
			
		||||
	/* in network byte order */
 | 
			
		||||
	int rtp_port, rtcp_port;
 | 
			
		||||
 | 
			
		||||
	/* audio codec information */
 | 
			
		||||
	struct mgcp_rtp_codec codec;
 | 
			
		||||
	struct mgcp_rtp_codec alt_codec; /* TODO/XXX: make it generic */
 | 
			
		||||
 | 
			
		||||
	/* per endpoint data */
 | 
			
		||||
	int  frames_per_packet;
 | 
			
		||||
	uint32_t packet_duration_ms;
 | 
			
		||||
	char *fmtp_extra;
 | 
			
		||||
	int output_enabled;
 | 
			
		||||
	int force_output_ptime;
 | 
			
		||||
 | 
			
		||||
	/* RTP patching */
 | 
			
		||||
	int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
 | 
			
		||||
	int force_aligned_timing;
 | 
			
		||||
	void *rtp_process_data;
 | 
			
		||||
 | 
			
		||||
	/* Each end has a separate socket for RTP and RTCP */
 | 
			
		||||
	struct osmo_fd rtp;
 | 
			
		||||
	struct osmo_fd rtcp;
 | 
			
		||||
 | 
			
		||||
	int local_port;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_tap {
 | 
			
		||||
	int enabled;
 | 
			
		||||
	struct sockaddr_in forward;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_lco {
 | 
			
		||||
	char *string;
 | 
			
		||||
	char *codec;
 | 
			
		||||
	int pkt_period_min; /* time in ms */
 | 
			
		||||
	int pkt_period_max; /* time in ms */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Specific rtp connection type (see struct mgcp_conn_rtp) */
 | 
			
		||||
enum mgcp_conn_rtp_type {
 | 
			
		||||
	MGCP_RTP_DEFAULT	= 0,
 | 
			
		||||
	MGCP_OSMUX_BSC,
 | 
			
		||||
	MGCP_OSMUX_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/osmux.h>
 | 
			
		||||
struct mgcp_conn;
 | 
			
		||||
 | 
			
		||||
/* MGCP connection (RTP) */
 | 
			
		||||
struct mgcp_conn_rtp {
 | 
			
		||||
 | 
			
		||||
	/* Backpointer to conn struct */
 | 
			
		||||
	struct mgcp_conn *conn;
 | 
			
		||||
 | 
			
		||||
	/* Specific connection type */
 | 
			
		||||
	enum mgcp_conn_rtp_type type;
 | 
			
		||||
 | 
			
		||||
	/* Port status */
 | 
			
		||||
	struct mgcp_rtp_end end;
 | 
			
		||||
 | 
			
		||||
	/* Sequence bits */
 | 
			
		||||
	struct mgcp_rtp_state state;
 | 
			
		||||
 | 
			
		||||
	/* taps for the rtp connection */
 | 
			
		||||
	struct mgcp_rtp_tap tap_in;
 | 
			
		||||
	struct mgcp_rtp_tap tap_out;
 | 
			
		||||
 | 
			
		||||
	/* Osmux states (optional) */
 | 
			
		||||
	struct {
 | 
			
		||||
		/* Osmux state: disabled, activating, active */
 | 
			
		||||
		enum osmux_state state;
 | 
			
		||||
		/* Allocated Osmux circuit ID for this endpoint */
 | 
			
		||||
		int allocated_cid;
 | 
			
		||||
		/* Used Osmux circuit ID for this endpoint */
 | 
			
		||||
		uint8_t cid;
 | 
			
		||||
		/* handle to batch messages */
 | 
			
		||||
		struct osmux_in_handle *in;
 | 
			
		||||
		/* handle to unbatch messages */
 | 
			
		||||
		struct osmux_out_handle out;
 | 
			
		||||
		/* statistics */
 | 
			
		||||
		struct {
 | 
			
		||||
			uint32_t chunks;
 | 
			
		||||
			uint32_t octets;
 | 
			
		||||
		} stats;
 | 
			
		||||
	} osmux;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! Connection type, specifies which member of the union "u" in mgcp_conn
 | 
			
		||||
 *  contains a useful connection description (currently only RTP) */
 | 
			
		||||
enum mgcp_conn_type {
 | 
			
		||||
	MGCP_CONN_TYPE_RTP,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! MGCP connection (untyped) */
 | 
			
		||||
struct mgcp_conn {
 | 
			
		||||
	/*!< list head */
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	/*!< Backpointer to the endpoint where the conn belongs to */
 | 
			
		||||
	struct mgcp_endpoint *endp;
 | 
			
		||||
 | 
			
		||||
	/*!< type of the connection (union) */
 | 
			
		||||
	enum mgcp_conn_type type;
 | 
			
		||||
 | 
			
		||||
	/*!< mode of the connection */
 | 
			
		||||
	enum mgcp_connection_mode mode;
 | 
			
		||||
 | 
			
		||||
	/*!< copy of the mode to restore the original setting (VTY) */
 | 
			
		||||
	enum mgcp_connection_mode mode_orig;
 | 
			
		||||
 | 
			
		||||
	/*!< connection id to identify the conntion */
 | 
			
		||||
	uint32_t id;
 | 
			
		||||
 | 
			
		||||
	/*!< human readable name (vty, logging) */
 | 
			
		||||
	char name[256];
 | 
			
		||||
 | 
			
		||||
	/*!< union with connection description */
 | 
			
		||||
	union {
 | 
			
		||||
		struct mgcp_conn_rtp rtp;
 | 
			
		||||
	} u;
 | 
			
		||||
 | 
			
		||||
	/*!< pointer to optional private data */
 | 
			
		||||
	void *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp_conn.h>
 | 
			
		||||
 | 
			
		||||
struct mgcp_endpoint_type;
 | 
			
		||||
 | 
			
		||||
struct mgcp_endpoint {
 | 
			
		||||
	char *callid;
 | 
			
		||||
	struct mgcp_lco local_options;
 | 
			
		||||
 | 
			
		||||
	struct llist_head conns;
 | 
			
		||||
 | 
			
		||||
	/* backpointer */
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
	struct mgcp_trunk_config *tcfg;
 | 
			
		||||
 | 
			
		||||
	const struct mgcp_endpoint_type *type;
 | 
			
		||||
 | 
			
		||||
	/* fields for re-transmission */
 | 
			
		||||
	char *last_trans;
 | 
			
		||||
	char *last_response;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Internal structure while parsing a request
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_parse_data {
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
	struct mgcp_endpoint *endp;
 | 
			
		||||
	char *trans;
 | 
			
		||||
	char *save;
 | 
			
		||||
	int found;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct sockaddr_in *addr,
 | 
			
		||||
	      char *buf, int rc, struct mgcp_conn_rtp *conn_src,
 | 
			
		||||
	      struct mgcp_conn_rtp *conn_dst);
 | 
			
		||||
int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
 | 
			
		||||
int mgcp_dispatch_rtp_bridge_cb(int proto, struct sockaddr_in *addr, char *buf,
 | 
			
		||||
				unsigned int buf_size, struct mgcp_conn *conn);
 | 
			
		||||
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port,
 | 
			
		||||
			   struct mgcp_conn_rtp *conn);
 | 
			
		||||
void mgcp_free_rtp_port(struct mgcp_rtp_end *end);
 | 
			
		||||
 | 
			
		||||
/* For transcoding we need to manage an in and an output that are connected */
 | 
			
		||||
static inline int endp_back_channel(int endpoint)
 | 
			
		||||
{
 | 
			
		||||
	return endpoint + 60;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
 | 
			
		||||
struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
 | 
			
		||||
 | 
			
		||||
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
 | 
			
		||||
			 struct mgcp_rtp_end *rtp);
 | 
			
		||||
uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
 | 
			
		||||
				  struct mgcp_rtp_end *rtp);
 | 
			
		||||
 | 
			
		||||
/* payload processing default functions */
 | 
			
		||||
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				char *data, int *len, int buf_size);
 | 
			
		||||
 | 
			
		||||
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
 | 
			
		||||
				      struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				      struct mgcp_rtp_end *src_end);
 | 
			
		||||
 | 
			
		||||
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
 | 
			
		||||
					  int *payload_type,
 | 
			
		||||
					  const char**audio_name,
 | 
			
		||||
					  const char**fmtp_extra,
 | 
			
		||||
					  struct mgcp_conn_rtp *conn);
 | 
			
		||||
 | 
			
		||||
/* internal RTP Annex A counting */
 | 
			
		||||
void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
 | 
			
		||||
			const uint16_t seq, const int32_t transit,
 | 
			
		||||
			const uint32_t ssrc);
 | 
			
		||||
 | 
			
		||||
int mgcp_set_ip_tos(int fd, int tos);
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_DEST_NET = 0,
 | 
			
		||||
	MGCP_DEST_BTS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MGCP_DUMMY_LOAD 0x23
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SDP related information
 | 
			
		||||
 */
 | 
			
		||||
/* Assume audio frame length of 20ms */
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_DEFAULT_RATE  8000
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
 | 
			
		||||
 | 
			
		||||
#define PTYPE_UNDEFINED (-1)
 | 
			
		||||
int mgcp_parse_sdp_data(struct mgcp_endpoint *endp, struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p);
 | 
			
		||||
int mgcp_set_audio_info(void *ctx, struct mgcp_rtp_codec *codec,
 | 
			
		||||
			int payload_type, const char *audio_name);
 | 
			
		||||
 | 
			
		||||
/*! get the ip-address where the mgw application is bound on.
 | 
			
		||||
 *  \param[in] endp mgcp endpoint, that holds a copy of the VTY parameters
 | 
			
		||||
 *  \returns pointer to a string that contains the source ip-address */
 | 
			
		||||
static inline const char *mgcp_net_src_addr(struct mgcp_endpoint *endp)
 | 
			
		||||
{
 | 
			
		||||
	if (endp->cfg->net_ports.bind_addr)
 | 
			
		||||
		return endp->cfg->net_ports.bind_addr;
 | 
			
		||||
	return endp->cfg->source_addr;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,58 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
/* Message parser/generator utilities */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn;
 | 
			
		||||
struct mgcp_parse_data;
 | 
			
		||||
struct mgcp_endpoint;
 | 
			
		||||
 | 
			
		||||
void mgcp_disp_msg(unsigned char *message, unsigned int len, char *preamble);
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_conn_mode(const char *msg, struct mgcp_endpoint *endp,
 | 
			
		||||
			 struct mgcp_conn *conn);
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_header(struct mgcp_parse_data *pdata, char *data);
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_osmux_cid(const char *line);
 | 
			
		||||
 | 
			
		||||
int mgcp_check_param(const struct mgcp_endpoint *endp, const char *line);
 | 
			
		||||
 | 
			
		||||
int mgcp_verify_call_id(struct mgcp_endpoint *endp, const char *callid);
 | 
			
		||||
 | 
			
		||||
int mgcp_verify_ci(struct mgcp_endpoint *endp, const char *ci);
 | 
			
		||||
 | 
			
		||||
char *mgcp_strline(char *str, char **saveptr);
 | 
			
		||||
 | 
			
		||||
#define for_each_line(line, save)\
 | 
			
		||||
	for (line = mgcp_strline(NULL, &save); line;\
 | 
			
		||||
	     line = mgcp_strline(NULL, &save))
 | 
			
		||||
 | 
			
		||||
#define for_each_non_empty_line(line, save)\
 | 
			
		||||
	for (line = strtok_r(NULL, "\r\n", &save); line;\
 | 
			
		||||
	     line = strtok_r(NULL, "\r\n", &save))
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_ci(uint32_t *conn_id, const char *ci);
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
/* The statistics generator */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp_internal.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
void mgcp_format_stats(char *str, size_t str_len,  struct mgcp_conn *conn);
 | 
			
		||||
 | 
			
		||||
/* Exposed for test purposes only, do not use actively */
 | 
			
		||||
void calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *,
 | 
			
		||||
			uint32_t *expected, int *loss);
 | 
			
		||||
 | 
			
		||||
/* Exposed for test purposes only, do not use actively */
 | 
			
		||||
uint32_t calc_jitter(struct mgcp_rtp_state *);
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <osmocom/netif/osmux.h>
 | 
			
		||||
struct mgcp_conn_rtp;
 | 
			
		||||
 | 
			
		||||
#define OSMUX_PORT	1984
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	OSMUX_ROLE_BSC = 0,
 | 
			
		||||
	OSMUX_ROLE_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int osmux_init(int role, struct mgcp_config *cfg);
 | 
			
		||||
int osmux_enable_conn(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn,
 | 
			
		||||
		      struct in_addr *addr, uint16_t port);
 | 
			
		||||
void osmux_disable_conn(struct mgcp_conn_rtp *conn);
 | 
			
		||||
void osmux_allocate_cid(struct mgcp_conn_rtp *conn);
 | 
			
		||||
void osmux_release_cid(struct mgcp_conn_rtp *conn);
 | 
			
		||||
int osmux_xfrm_to_osmux(char *buf, int buf_len, struct mgcp_conn_rtp *conn);
 | 
			
		||||
int osmux_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
 | 
			
		||||
int osmux_get_cid(void);
 | 
			
		||||
void osmux_put_cid(uint8_t osmux_cid);
 | 
			
		||||
int osmux_used_cid(void);
 | 
			
		||||
 | 
			
		||||
enum osmux_state {
 | 
			
		||||
	OSMUX_STATE_DISABLED = 0,
 | 
			
		||||
	OSMUX_STATE_NEGOTIATING,
 | 
			
		||||
	OSMUX_STATE_ACTIVATING,
 | 
			
		||||
	OSMUX_STATE_ENABLED,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum osmux_usage {
 | 
			
		||||
	OSMUX_USAGE_OFF = 0,
 | 
			
		||||
	OSMUX_USAGE_ON = 1,
 | 
			
		||||
	OSMUX_USAGE_ONLY = 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
#ifndef OPENBSC_VTY_H
 | 
			
		||||
#define OPENBSC_VTY_H
 | 
			
		||||
 | 
			
		||||
#include <osmocom/vty/vty.h>
 | 
			
		||||
#include <osmocom/vty/buffer.h>
 | 
			
		||||
#include <osmocom/vty/command.h>
 | 
			
		||||
 | 
			
		||||
struct gsm_network;
 | 
			
		||||
struct vty;
 | 
			
		||||
 | 
			
		||||
void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *);
 | 
			
		||||
 | 
			
		||||
struct buffer *vty_argv_to_buffer(int argc, const char *argv[], int base);
 | 
			
		||||
 | 
			
		||||
extern struct cmd_element cfg_description_cmd;
 | 
			
		||||
extern struct cmd_element cfg_no_description_cmd;
 | 
			
		||||
 | 
			
		||||
enum mgcp_vty_node {
 | 
			
		||||
	MGCP_NODE = _LAST_OSMOVTY_NODE + 1,
 | 
			
		||||
	TRUNK_NODE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct log_info;
 | 
			
		||||
int bsc_vty_init(struct gsm_network *network);
 | 
			
		||||
int bsc_vty_init_extra(void);
 | 
			
		||||
 | 
			
		||||
void msc_vty_init(struct gsm_network *msc_network);
 | 
			
		||||
 | 
			
		||||
struct gsm_network *gsmnet_from_vty(struct vty *vty);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
BUILT_SOURCES = \
 | 
			
		||||
	mgcp_common.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS = \
 | 
			
		||||
	mgcp_client_internal.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
mgcp_common.h: $(top_srcdir)/include/osmocom/mgcp/mgcp_common.h
 | 
			
		||||
	echo -e "/*\n\n   DO NOT EDIT THIS FILE!\n   THIS IS OVERWRITTEN DURING BUILD\n   This is an automatic copy of <osmocom/mgcp/mgcp_common.h>\n\n */" > mgcp_common.h
 | 
			
		||||
	cat $(top_srcdir)/include/osmocom/mgcp/mgcp_common.h >> mgcp_common.h
 | 
			
		||||
 | 
			
		||||
CLEANFILES = mgcp_common.h
 | 
			
		||||
@@ -1,81 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp_client/mgcp_common.h>
 | 
			
		||||
 | 
			
		||||
#define MGCP_CLIENT_LOCAL_ADDR_DEFAULT "0.0.0.0"
 | 
			
		||||
#define MGCP_CLIENT_LOCAL_PORT_DEFAULT 0
 | 
			
		||||
#define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
 | 
			
		||||
#define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427
 | 
			
		||||
 | 
			
		||||
struct msgb;
 | 
			
		||||
struct vty;
 | 
			
		||||
struct mgcp_client;
 | 
			
		||||
 | 
			
		||||
struct mgcp_client_conf {
 | 
			
		||||
	const char *local_addr;
 | 
			
		||||
	int local_port;
 | 
			
		||||
	const char *remote_addr;
 | 
			
		||||
	int remote_port;
 | 
			
		||||
	uint16_t first_endpoint;
 | 
			
		||||
	uint16_t last_endpoint;
 | 
			
		||||
	uint16_t bts_base;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef unsigned int mgcp_trans_id_t;
 | 
			
		||||
 | 
			
		||||
struct mgcp_response_head {
 | 
			
		||||
       int response_code;
 | 
			
		||||
       mgcp_trans_id_t trans_id;
 | 
			
		||||
       const char *comment;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_response {
 | 
			
		||||
	char *body;
 | 
			
		||||
	struct mgcp_response_head head;
 | 
			
		||||
	uint16_t audio_port;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void mgcp_client_conf_init(struct mgcp_client_conf *conf);
 | 
			
		||||
void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
 | 
			
		||||
int mgcp_client_config_write(struct vty *vty, const char *indent);
 | 
			
		||||
struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
 | 
			
		||||
 | 
			
		||||
struct mgcp_client *mgcp_client_init(void *ctx,
 | 
			
		||||
				     struct mgcp_client_conf *conf);
 | 
			
		||||
int mgcp_client_connect(struct mgcp_client *mgcp);
 | 
			
		||||
 | 
			
		||||
const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
 | 
			
		||||
uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
 | 
			
		||||
uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
 | 
			
		||||
 | 
			
		||||
int mgcp_client_next_endpoint(struct mgcp_client *client);
 | 
			
		||||
void mgcp_client_release_endpoint(uint16_t id, struct mgcp_client *client);
 | 
			
		||||
 | 
			
		||||
/* Invoked when an MGCP response is received or sending failed.  When the
 | 
			
		||||
 * response is passed as NULL, this indicates failure during transmission. */
 | 
			
		||||
typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
 | 
			
		||||
int mgcp_response_parse_params(struct mgcp_response *r);
 | 
			
		||||
 | 
			
		||||
int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
 | 
			
		||||
		   mgcp_response_cb_t response_cb, void *priv);
 | 
			
		||||
 | 
			
		||||
enum mgcp_connection_mode;
 | 
			
		||||
 | 
			
		||||
struct msgb *mgcp_msg_crcx(struct mgcp_client *mgcp,
 | 
			
		||||
			   uint16_t rtp_endpoint, unsigned int call_id,
 | 
			
		||||
			   enum mgcp_connection_mode mode);
 | 
			
		||||
 | 
			
		||||
struct msgb *mgcp_msg_mdcx(struct mgcp_client *mgcp,
 | 
			
		||||
			   uint16_t rtp_endpoint, const char *rtp_conn_addr,
 | 
			
		||||
			   uint16_t rtp_port, enum mgcp_connection_mode mode);
 | 
			
		||||
 | 
			
		||||
struct msgb *mgcp_msg_dlcx(struct mgcp_client *mgcp, uint16_t rtp_endpoint,
 | 
			
		||||
			   unsigned int call_id);
 | 
			
		||||
 | 
			
		||||
extern const struct value_string mgcp_client_connection_mode_strs[];
 | 
			
		||||
static inline const char *mgcp_client_cmode_name(enum mgcp_connection_mode mode)
 | 
			
		||||
{
 | 
			
		||||
	return get_value_string(mgcp_client_connection_mode_strs, mode);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/write_queue.h>
 | 
			
		||||
 | 
			
		||||
#define MSGB_CB_MGCP_TRANS_ID 0
 | 
			
		||||
 | 
			
		||||
struct mgcp_client {
 | 
			
		||||
	struct mgcp_client_conf actual;
 | 
			
		||||
	uint32_t remote_addr;
 | 
			
		||||
	struct osmo_wqueue wq;
 | 
			
		||||
	mgcp_trans_id_t next_trans_id;
 | 
			
		||||
	struct llist_head responses_pending;
 | 
			
		||||
	struct llist_head inuse_endpoints;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_inuse_endpoint {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
	uint16_t id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_response_pending {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	mgcp_trans_id_t trans_id;
 | 
			
		||||
	mgcp_response_cb_t response_cb;
 | 
			
		||||
	void *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mgcp_client_rx(struct mgcp_client *mgcp, struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
struct mgcp_response_pending * mgcp_client_pending_add(
 | 
			
		||||
					struct mgcp_client *mgcp,
 | 
			
		||||
					mgcp_trans_id_t trans_id,
 | 
			
		||||
					mgcp_response_cb_t response_cb,
 | 
			
		||||
					void *priv);
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@
 | 
			
		||||
includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: Osmocom legacy Media Gateway Control Protocol library
 | 
			
		||||
Description: C Utility Library
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Libs: -L${libdir} -losmo-legacy-mgcp
 | 
			
		||||
Cflags: -I${includedir}/
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@
 | 
			
		||||
includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: Osmocom Media Gateway Control Protocol Client library
 | 
			
		||||
Description: C Utility Library
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Libs: -L${libdir} -losmo-mgcp-client
 | 
			
		||||
Cflags: -I${includedir}/
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@
 | 
			
		||||
includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: Osmocom Media Gateway Control Protocol library
 | 
			
		||||
Description: C Utility Library
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Libs: -L${libdir} -losmo-mgcp
 | 
			
		||||
Cflags: -I${includedir}/
 | 
			
		||||
							
								
								
									
										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++;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
We want to avoid creating too many external build-time dependencies
 | 
			
		||||
like this one to autoconf-archive.  This directory provides a local
 | 
			
		||||
copy of required m4 rules.
 | 
			
		||||
@@ -1,74 +0,0 @@
 | 
			
		||||
# ===========================================================================
 | 
			
		||||
#   http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
 | 
			
		||||
# ===========================================================================
 | 
			
		||||
#
 | 
			
		||||
# SYNOPSIS
 | 
			
		||||
#
 | 
			
		||||
#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
 | 
			
		||||
#
 | 
			
		||||
# DESCRIPTION
 | 
			
		||||
#
 | 
			
		||||
#   Check whether the given FLAG works with the current language's compiler
 | 
			
		||||
#   or gives an error.  (Warnings, however, are ignored)
 | 
			
		||||
#
 | 
			
		||||
#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
 | 
			
		||||
#   success/failure.
 | 
			
		||||
#
 | 
			
		||||
#   If EXTRA-FLAGS is defined, it is added to the current language's default
 | 
			
		||||
#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
 | 
			
		||||
#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
 | 
			
		||||
#   force the compiler to issue an error when a bad flag is given.
 | 
			
		||||
#
 | 
			
		||||
#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
 | 
			
		||||
#
 | 
			
		||||
#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
 | 
			
		||||
#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
 | 
			
		||||
#
 | 
			
		||||
# LICENSE
 | 
			
		||||
#
 | 
			
		||||
#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
 | 
			
		||||
#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
 | 
			
		||||
#
 | 
			
		||||
#   This program is free software: you can redistribute it and/or modify it
 | 
			
		||||
#   under the terms of the GNU General Public License as published by the
 | 
			
		||||
#   Free Software Foundation, either version 3 of the License, or (at your
 | 
			
		||||
#   option) any later version.
 | 
			
		||||
#
 | 
			
		||||
#   This program is distributed in the hope that it will be useful, but
 | 
			
		||||
#   WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 | 
			
		||||
#   Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
#   You should have received a copy of the GNU General Public License along
 | 
			
		||||
#   with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#
 | 
			
		||||
#   As a special exception, the respective Autoconf Macro's copyright owner
 | 
			
		||||
#   gives unlimited permission to copy, distribute and modify the configure
 | 
			
		||||
#   scripts that are the output of Autoconf when processing the Macro. You
 | 
			
		||||
#   need not follow the terms of the GNU General Public License when using
 | 
			
		||||
#   or distributing such scripts, even though portions of the text of the
 | 
			
		||||
#   Macro appear in them. The GNU General Public License (GPL) does govern
 | 
			
		||||
#   all other use of the material that constitutes the Autoconf Macro.
 | 
			
		||||
#
 | 
			
		||||
#   This special exception to the GPL applies to versions of the Autoconf
 | 
			
		||||
#   Macro released by the Autoconf Archive. When you make and distribute a
 | 
			
		||||
#   modified version of the Autoconf Macro, you may extend this special
 | 
			
		||||
#   exception to the GPL to apply to your modified version as well.
 | 
			
		||||
 | 
			
		||||
#serial 4
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
 | 
			
		||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
 | 
			
		||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
 | 
			
		||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
 | 
			
		||||
  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
 | 
			
		||||
  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
 | 
			
		||||
  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
 | 
			
		||||
    [AS_VAR_SET(CACHEVAR,[yes])],
 | 
			
		||||
    [AS_VAR_SET(CACHEVAR,[no])])
 | 
			
		||||
  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
 | 
			
		||||
AS_VAR_IF(CACHEVAR,yes,
 | 
			
		||||
  [m4_default([$2], :)],
 | 
			
		||||
  [m4_default([$3], :)])
 | 
			
		||||
AS_VAR_POPDEF([CACHEVAR])dnl
 | 
			
		||||
])dnl AX_CHECK_COMPILE_FLAGS
 | 
			
		||||
							
								
								
									
										39
									
								
								openbsc/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								openbsc/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
*.o
 | 
			
		||||
*.a
 | 
			
		||||
.deps
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
bsc_hack
 | 
			
		||||
bsc_msc_ip
 | 
			
		||||
*.*~
 | 
			
		||||
*.sw?
 | 
			
		||||
 | 
			
		||||
#configure
 | 
			
		||||
aclocal.m4
 | 
			
		||||
autom4te.cache/
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
configure
 | 
			
		||||
depcomp
 | 
			
		||||
install-sh
 | 
			
		||||
missing
 | 
			
		||||
stamp-h1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# apps and app data
 | 
			
		||||
hlr.sqlite3
 | 
			
		||||
bs11_config
 | 
			
		||||
ipaccess-config
 | 
			
		||||
ipaccess-find
 | 
			
		||||
isdnsync
 | 
			
		||||
 | 
			
		||||
#tests
 | 
			
		||||
tests/channel/channel_test
 | 
			
		||||
tests/db/db_test
 | 
			
		||||
tests/debug/debug_test
 | 
			
		||||
tests/gsm0408/gsm0408_test
 | 
			
		||||
tests/sccp/sccp_test
 | 
			
		||||
tests/sms/sms_test
 | 
			
		||||
tests/timer/timer_test
 | 
			
		||||
 | 
			
		||||
@@ -3,7 +3,3 @@ Holger Freyther <zecke@selfish.org>
 | 
			
		||||
Jan Luebbe <jluebbe@debian.org>
 | 
			
		||||
Stefan Schmidt <stefan@datenfreihafen.org>
 | 
			
		||||
Daniel Willmann <daniel@totalueberwachung.de>
 | 
			
		||||
Andreas Eversberg <Andreas.Eversberg@versatel.de>
 | 
			
		||||
Sylvain Munaut <246tnt@gmail.com>
 | 
			
		||||
Jacob Erlbeck <jerlbeck@sysmocom.de>
 | 
			
		||||
Neels Hofmeyr <nhofmeyr@sysmocom.de>
 | 
			
		||||
							
								
								
									
										339
									
								
								openbsc/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								openbsc/COPYING
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,339 @@
 | 
			
		||||
		    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
		       Version 2, June 1991
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 | 
			
		||||
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
			
		||||
 of this license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
			    Preamble
 | 
			
		||||
 | 
			
		||||
  The licenses for most software are designed to take away your
 | 
			
		||||
freedom to share and change it.  By contrast, the GNU General Public
 | 
			
		||||
License is intended to guarantee your freedom to share and change free
 | 
			
		||||
software--to make sure the software is free for all its users.  This
 | 
			
		||||
General Public License applies to most of the Free Software
 | 
			
		||||
Foundation's software and to any other program whose authors commit to
 | 
			
		||||
using it.  (Some other Free Software Foundation software is covered by
 | 
			
		||||
the GNU Lesser General Public License instead.)  You can apply it to
 | 
			
		||||
your programs, too.
 | 
			
		||||
 | 
			
		||||
  When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price.  Our General Public Licenses are designed to make sure that you
 | 
			
		||||
have the freedom to distribute copies of free software (and charge for
 | 
			
		||||
this service if you wish), that you receive source code or can get it
 | 
			
		||||
if you want it, that you can change the software or use pieces of it
 | 
			
		||||
in new free programs; and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
  To protect your rights, we need to make restrictions that forbid
 | 
			
		||||
anyone to deny you these rights or to ask you to surrender the rights.
 | 
			
		||||
These restrictions translate to certain responsibilities for you if you
 | 
			
		||||
distribute copies of the software, or if you modify it.
 | 
			
		||||
 | 
			
		||||
  For example, if you distribute copies of such a program, whether
 | 
			
		||||
gratis or for a fee, you must give the recipients all the rights that
 | 
			
		||||
you have.  You must make sure that they, too, receive or can get the
 | 
			
		||||
source code.  And you must show them these terms so they know their
 | 
			
		||||
rights.
 | 
			
		||||
 | 
			
		||||
  We protect your rights with two steps: (1) copyright the software, and
 | 
			
		||||
(2) offer you this license which gives you legal permission to copy,
 | 
			
		||||
distribute and/or modify the software.
 | 
			
		||||
 | 
			
		||||
  Also, for each author's protection and ours, we want to make certain
 | 
			
		||||
that everyone understands that there is no warranty for this free
 | 
			
		||||
software.  If the software is modified by someone else and passed on, we
 | 
			
		||||
want its recipients to know that what they have is not the original, so
 | 
			
		||||
that any problems introduced by others will not reflect on the original
 | 
			
		||||
authors' reputations.
 | 
			
		||||
 | 
			
		||||
  Finally, any free program is threatened constantly by software
 | 
			
		||||
patents.  We wish to avoid the danger that redistributors of a free
 | 
			
		||||
program will individually obtain patent licenses, in effect making the
 | 
			
		||||
program proprietary.  To prevent this, we have made it clear that any
 | 
			
		||||
patent must be licensed for everyone's free use or not licensed at all.
 | 
			
		||||
 | 
			
		||||
  The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
 | 
			
		||||
		    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
			
		||||
 | 
			
		||||
  0. This License applies to any program or other work which contains
 | 
			
		||||
a notice placed by the copyright holder saying it may be distributed
 | 
			
		||||
under the terms of this General Public License.  The "Program", below,
 | 
			
		||||
refers to any such program or work, and a "work based on the Program"
 | 
			
		||||
means either the Program or any derivative work under copyright law:
 | 
			
		||||
that is to say, a work containing the Program or a portion of it,
 | 
			
		||||
either verbatim or with modifications and/or translated into another
 | 
			
		||||
language.  (Hereinafter, translation is included without limitation in
 | 
			
		||||
the term "modification".)  Each licensee is addressed as "you".
 | 
			
		||||
 | 
			
		||||
Activities other than copying, distribution and modification are not
 | 
			
		||||
covered by this License; they are outside its scope.  The act of
 | 
			
		||||
running the Program is not restricted, and the output from the Program
 | 
			
		||||
is covered only if its contents constitute a work based on the
 | 
			
		||||
Program (independent of having been made by running the Program).
 | 
			
		||||
Whether that is true depends on what the Program does.
 | 
			
		||||
 | 
			
		||||
  1. You may copy and distribute verbatim copies of the Program's
 | 
			
		||||
source code as you receive it, in any medium, provided that you
 | 
			
		||||
conspicuously and appropriately publish on each copy an appropriate
 | 
			
		||||
copyright notice and disclaimer of warranty; keep intact all the
 | 
			
		||||
notices that refer to this License and to the absence of any warranty;
 | 
			
		||||
and give any other recipients of the Program a copy of this License
 | 
			
		||||
along with the Program.
 | 
			
		||||
 | 
			
		||||
You may charge a fee for the physical act of transferring a copy, and
 | 
			
		||||
you may at your option offer warranty protection in exchange for a fee.
 | 
			
		||||
 | 
			
		||||
  2. You may modify your copy or copies of the Program or any portion
 | 
			
		||||
of it, thus forming a work based on the Program, and copy and
 | 
			
		||||
distribute such modifications or work under the terms of Section 1
 | 
			
		||||
above, provided that you also meet all of these conditions:
 | 
			
		||||
 | 
			
		||||
    a) You must cause the modified files to carry prominent notices
 | 
			
		||||
    stating that you changed the files and the date of any change.
 | 
			
		||||
 | 
			
		||||
    b) You must cause any work that you distribute or publish, that in
 | 
			
		||||
    whole or in part contains or is derived from the Program or any
 | 
			
		||||
    part thereof, to be licensed as a whole at no charge to all third
 | 
			
		||||
    parties under the terms of this License.
 | 
			
		||||
 | 
			
		||||
    c) If the modified program normally reads commands interactively
 | 
			
		||||
    when run, you must cause it, when started running for such
 | 
			
		||||
    interactive use in the most ordinary way, to print or display an
 | 
			
		||||
    announcement including an appropriate copyright notice and a
 | 
			
		||||
    notice that there is no warranty (or else, saying that you provide
 | 
			
		||||
    a warranty) and that users may redistribute the program under
 | 
			
		||||
    these conditions, and telling the user how to view a copy of this
 | 
			
		||||
    License.  (Exception: if the Program itself is interactive but
 | 
			
		||||
    does not normally print such an announcement, your work based on
 | 
			
		||||
    the Program is not required to print an announcement.)
 | 
			
		||||
 | 
			
		||||
These requirements apply to the modified work as a whole.  If
 | 
			
		||||
identifiable sections of that work are not derived from the Program,
 | 
			
		||||
and can be reasonably considered independent and separate works in
 | 
			
		||||
themselves, then this License, and its terms, do not apply to those
 | 
			
		||||
sections when you distribute them as separate works.  But when you
 | 
			
		||||
distribute the same sections as part of a whole which is a work based
 | 
			
		||||
on the Program, the distribution of the whole must be on the terms of
 | 
			
		||||
this License, whose permissions for other licensees extend to the
 | 
			
		||||
entire whole, and thus to each and every part regardless of who wrote it.
 | 
			
		||||
 | 
			
		||||
Thus, it is not the intent of this section to claim rights or contest
 | 
			
		||||
your rights to work written entirely by you; rather, the intent is to
 | 
			
		||||
exercise the right to control the distribution of derivative or
 | 
			
		||||
collective works based on the Program.
 | 
			
		||||
 | 
			
		||||
In addition, mere aggregation of another work not based on the Program
 | 
			
		||||
with the Program (or with a work based on the Program) on a volume of
 | 
			
		||||
a storage or distribution medium does not bring the other work under
 | 
			
		||||
the scope of this License.
 | 
			
		||||
 | 
			
		||||
  3. You may copy and distribute the Program (or a work based on it,
 | 
			
		||||
under Section 2) in object code or executable form under the terms of
 | 
			
		||||
Sections 1 and 2 above provided that you also do one of the following:
 | 
			
		||||
 | 
			
		||||
    a) Accompany it with the complete corresponding machine-readable
 | 
			
		||||
    source code, which must be distributed under the terms of Sections
 | 
			
		||||
    1 and 2 above on a medium customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
    b) Accompany it with a written offer, valid for at least three
 | 
			
		||||
    years, to give any third party, for a charge no more than your
 | 
			
		||||
    cost of physically performing source distribution, a complete
 | 
			
		||||
    machine-readable copy of the corresponding source code, to be
 | 
			
		||||
    distributed under the terms of Sections 1 and 2 above on a medium
 | 
			
		||||
    customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
    c) Accompany it with the information you received as to the offer
 | 
			
		||||
    to distribute corresponding source code.  (This alternative is
 | 
			
		||||
    allowed only for noncommercial distribution and only if you
 | 
			
		||||
    received the program in object code or executable form with such
 | 
			
		||||
    an offer, in accord with Subsection b above.)
 | 
			
		||||
 | 
			
		||||
The source code for a work means the preferred form of the work for
 | 
			
		||||
making modifications to it.  For an executable work, complete source
 | 
			
		||||
code means all the source code for all modules it contains, plus any
 | 
			
		||||
associated interface definition files, plus the scripts used to
 | 
			
		||||
control compilation and installation of the executable.  However, as a
 | 
			
		||||
special exception, the source code distributed need not include
 | 
			
		||||
anything that is normally distributed (in either source or binary
 | 
			
		||||
form) with the major components (compiler, kernel, and so on) of the
 | 
			
		||||
operating system on which the executable runs, unless that component
 | 
			
		||||
itself accompanies the executable.
 | 
			
		||||
 | 
			
		||||
If distribution of executable or object code is made by offering
 | 
			
		||||
access to copy from a designated place, then offering equivalent
 | 
			
		||||
access to copy the source code from the same place counts as
 | 
			
		||||
distribution of the source code, even though third parties are not
 | 
			
		||||
compelled to copy the source along with the object code.
 | 
			
		||||
 | 
			
		||||
  4. You may not copy, modify, sublicense, or distribute the Program
 | 
			
		||||
except as expressly provided under this License.  Any attempt
 | 
			
		||||
otherwise to copy, modify, sublicense or distribute the Program is
 | 
			
		||||
void, and will automatically terminate your rights under this License.
 | 
			
		||||
However, parties who have received copies, or rights, from you under
 | 
			
		||||
this License will not have their licenses terminated so long as such
 | 
			
		||||
parties remain in full compliance.
 | 
			
		||||
 | 
			
		||||
  5. You are not required to accept this License, since you have not
 | 
			
		||||
signed it.  However, nothing else grants you permission to modify or
 | 
			
		||||
distribute the Program or its derivative works.  These actions are
 | 
			
		||||
prohibited by law if you do not accept this License.  Therefore, by
 | 
			
		||||
modifying or distributing the Program (or any work based on the
 | 
			
		||||
Program), you indicate your acceptance of this License to do so, and
 | 
			
		||||
all its terms and conditions for copying, distributing or modifying
 | 
			
		||||
the Program or works based on it.
 | 
			
		||||
 | 
			
		||||
  6. Each time you redistribute the Program (or any work based on the
 | 
			
		||||
Program), the recipient automatically receives a license from the
 | 
			
		||||
original licensor to copy, distribute or modify the Program subject to
 | 
			
		||||
these terms and conditions.  You may not impose any further
 | 
			
		||||
restrictions on the recipients' exercise of the rights granted herein.
 | 
			
		||||
You are not responsible for enforcing compliance by third parties to
 | 
			
		||||
this License.
 | 
			
		||||
 | 
			
		||||
  7. If, as a consequence of a court judgment or allegation of patent
 | 
			
		||||
infringement or for any other reason (not limited to patent issues),
 | 
			
		||||
conditions are imposed on you (whether by court order, agreement or
 | 
			
		||||
otherwise) that contradict the conditions of this License, they do not
 | 
			
		||||
excuse you from the conditions of this License.  If you cannot
 | 
			
		||||
distribute so as to satisfy simultaneously your obligations under this
 | 
			
		||||
License and any other pertinent obligations, then as a consequence you
 | 
			
		||||
may not distribute the Program at all.  For example, if a patent
 | 
			
		||||
license would not permit royalty-free redistribution of the Program by
 | 
			
		||||
all those who receive copies directly or indirectly through you, then
 | 
			
		||||
the only way you could satisfy both it and this License would be to
 | 
			
		||||
refrain entirely from distribution of the Program.
 | 
			
		||||
 | 
			
		||||
If any portion of this section is held invalid or unenforceable under
 | 
			
		||||
any particular circumstance, the balance of the section is intended to
 | 
			
		||||
apply and the section as a whole is intended to apply in other
 | 
			
		||||
circumstances.
 | 
			
		||||
 | 
			
		||||
It is not the purpose of this section to induce you to infringe any
 | 
			
		||||
patents or other property right claims or to contest validity of any
 | 
			
		||||
such claims; this section has the sole purpose of protecting the
 | 
			
		||||
integrity of the free software distribution system, which is
 | 
			
		||||
implemented by public license practices.  Many people have made
 | 
			
		||||
generous contributions to the wide range of software distributed
 | 
			
		||||
through that system in reliance on consistent application of that
 | 
			
		||||
system; it is up to the author/donor to decide if he or she is willing
 | 
			
		||||
to distribute software through any other system and a licensee cannot
 | 
			
		||||
impose that choice.
 | 
			
		||||
 | 
			
		||||
This section is intended to make thoroughly clear what is believed to
 | 
			
		||||
be a consequence of the rest of this License.
 | 
			
		||||
 | 
			
		||||
  8. If the distribution and/or use of the Program is restricted in
 | 
			
		||||
certain countries either by patents or by copyrighted interfaces, the
 | 
			
		||||
original copyright holder who places the Program under this License
 | 
			
		||||
may add an explicit geographical distribution limitation excluding
 | 
			
		||||
those countries, so that distribution is permitted only in or among
 | 
			
		||||
countries not thus excluded.  In such case, this License incorporates
 | 
			
		||||
the limitation as if written in the body of this License.
 | 
			
		||||
 | 
			
		||||
  9. The Free Software Foundation may publish revised and/or new versions
 | 
			
		||||
of the General Public License from time to time.  Such new versions will
 | 
			
		||||
be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
Each version is given a distinguishing version number.  If the Program
 | 
			
		||||
specifies a version number of this License which applies to it and "any
 | 
			
		||||
later version", you have the option of following the terms and conditions
 | 
			
		||||
either of that version or of any later version published by the Free
 | 
			
		||||
Software Foundation.  If the Program does not specify a version number of
 | 
			
		||||
this License, you may choose any version ever published by the Free Software
 | 
			
		||||
Foundation.
 | 
			
		||||
 | 
			
		||||
  10. If you wish to incorporate parts of the Program into other free
 | 
			
		||||
programs whose distribution conditions are different, write to the author
 | 
			
		||||
to ask for permission.  For software which is copyrighted by the Free
 | 
			
		||||
Software Foundation, write to the Free Software Foundation; we sometimes
 | 
			
		||||
make exceptions for this.  Our decision will be guided by the two goals
 | 
			
		||||
of preserving the free status of all derivatives of our free software and
 | 
			
		||||
of promoting the sharing and reuse of software generally.
 | 
			
		||||
 | 
			
		||||
			    NO WARRANTY
 | 
			
		||||
 | 
			
		||||
  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 | 
			
		||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 | 
			
		||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 | 
			
		||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 | 
			
		||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
 | 
			
		||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 | 
			
		||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 | 
			
		||||
REPAIR OR CORRECTION.
 | 
			
		||||
 | 
			
		||||
  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 | 
			
		||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
			
		||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 | 
			
		||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 | 
			
		||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 | 
			
		||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 | 
			
		||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 | 
			
		||||
POSSIBILITY OF SUCH DAMAGES.
 | 
			
		||||
 | 
			
		||||
		     END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
	    How to Apply These Terms to Your New Programs
 | 
			
		||||
 | 
			
		||||
  If you develop a new program, and you want it to be of the greatest
 | 
			
		||||
possible use to the public, the best way to achieve this is to make it
 | 
			
		||||
free software which everyone can redistribute and change under these terms.
 | 
			
		||||
 | 
			
		||||
  To do so, attach the following notices to the program.  It is safest
 | 
			
		||||
to attach them to the start of each source file to most effectively
 | 
			
		||||
convey the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper mail.
 | 
			
		||||
 | 
			
		||||
If the program is interactive, make it output a short notice like this
 | 
			
		||||
when it starts in an interactive mode:
 | 
			
		||||
 | 
			
		||||
    Gnomovision version 69, Copyright (C) year name of author
 | 
			
		||||
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
			
		||||
    This is free software, and you are welcome to redistribute it
 | 
			
		||||
    under certain conditions; type `show c' for details.
 | 
			
		||||
 | 
			
		||||
The hypothetical commands `show w' and `show c' should show the appropriate
 | 
			
		||||
parts of the General Public License.  Of course, the commands you use may
 | 
			
		||||
be called something other than `show w' and `show c'; they could even be
 | 
			
		||||
mouse-clicks or menu items--whatever suits your program.
 | 
			
		||||
 | 
			
		||||
You should also get your employer (if you work as a programmer) or your
 | 
			
		||||
school, if any, to sign a "copyright disclaimer" for the program, if
 | 
			
		||||
necessary.  Here is a sample; alter the names:
 | 
			
		||||
 | 
			
		||||
  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 | 
			
		||||
  `Gnomovision' (which makes passes at compilers) written by James Hacker.
 | 
			
		||||
 | 
			
		||||
  <signature of Ty Coon>, 1 April 1989
 | 
			
		||||
  Ty Coon, President of Vice
 | 
			
		||||
 | 
			
		||||
This General Public License does not permit incorporating your program into
 | 
			
		||||
proprietary programs.  If your program is a subroutine library, you may
 | 
			
		||||
consider it more useful to permit linking proprietary applications with the
 | 
			
		||||
library.  If this is what you want to do, use the GNU Lesser General
 | 
			
		||||
Public License instead of this License.
 | 
			
		||||
							
								
								
									
										10
									
								
								openbsc/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								openbsc/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 | 
			
		||||
 | 
			
		||||
INCLUDES = $(all_includes) -I$(top_srcdir)/include
 | 
			
		||||
SUBDIRS = include src tests
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = openbsc.pc
 | 
			
		||||
 | 
			
		||||
#dist-hook:
 | 
			
		||||
#	rm -rf `find $(distdir) -name .svn`
 | 
			
		||||
							
								
								
									
										18
									
								
								openbsc/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								openbsc/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
About OpenBSC
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
OpenBSC is a minimalistic implementation of the GSM Network, with particular
 | 
			
		||||
emphasis on the functionality typically provided by the BSC, MSC, HLR, VLR.
 | 
			
		||||
 | 
			
		||||
Its only current interface is a mISDN based E1 interface utilizing the A-bis
 | 
			
		||||
protocol between BSC and BTS.  In other words, you can connect an existing
 | 
			
		||||
GSM Base Transceiver Station (BTS) through E1 to OpenBSC.
 | 
			
		||||
 | 
			
		||||
So far, it has only been tested with the Siemens microBTS BS-11.  Test reports
 | 
			
		||||
with other BTS are appreciated!
 | 
			
		||||
 | 
			
		||||
This project is still in its early days, and there are lots of areas where it
 | 
			
		||||
doesn't behave as per GSM spec.
 | 
			
		||||
 | 
			
		||||
December 29, 2008
 | 
			
		||||
	Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
							
								
								
									
										54
									
								
								openbsc/configure.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								openbsc/configure.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
dnl Process this file with autoconf to produce a configure script
 | 
			
		||||
AC_INIT
 | 
			
		||||
 | 
			
		||||
AM_INIT_AUTOMAKE(openbsc, 0.3.1onwaves)
 | 
			
		||||
 | 
			
		||||
dnl kernel style compile messages
 | 
			
		||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 | 
			
		||||
 | 
			
		||||
dnl checks for programs
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
AC_PROG_RANLIB
 | 
			
		||||
 | 
			
		||||
dnl checks for libraries
 | 
			
		||||
AC_SEARCH_LIBS(crypt, crypt,
 | 
			
		||||
    [LIBCRYPT="-lcrypt"; AC_DEFINE([VTY_CRYPT_PW], [], [Use crypt functionality of vty.])])
 | 
			
		||||
 | 
			
		||||
dnl checks for header files
 | 
			
		||||
AC_HEADER_STDC
 | 
			
		||||
 | 
			
		||||
dnl Checks for typedefs, structures and compiler characteristics
 | 
			
		||||
 | 
			
		||||
# The following test is taken from WebKit's webkit.m4
 | 
			
		||||
saved_CFLAGS="$CFLAGS"
 | 
			
		||||
CFLAGS="$CFLAGS -fvisibility=hidden "
 | 
			
		||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
 | 
			
		||||
AC_COMPILE_IFELSE([char foo;],
 | 
			
		||||
      [ AC_MSG_RESULT([yes])
 | 
			
		||||
        SYMBOL_VISIBILITY="-fvisibility=hidden"],
 | 
			
		||||
        AC_MSG_RESULT([no]))
 | 
			
		||||
CFLAGS="$saved_CFLAGS"
 | 
			
		||||
AC_SUBST(SYMBOL_VISIBILITY)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
dnl Generate the output
 | 
			
		||||
AM_CONFIG_HEADER(bscconfig.h)
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT(
 | 
			
		||||
    openbsc.pc
 | 
			
		||||
    include/openbsc/Makefile
 | 
			
		||||
    include/vty/Makefile
 | 
			
		||||
    include/sccp/Makefile
 | 
			
		||||
    include/Makefile
 | 
			
		||||
    src/Makefile
 | 
			
		||||
    tests/Makefile
 | 
			
		||||
    tests/debug/Makefile
 | 
			
		||||
    tests/timer/Makefile
 | 
			
		||||
    tests/sms/Makefile
 | 
			
		||||
    tests/gsm0408/Makefile
 | 
			
		||||
    tests/db/Makefile
 | 
			
		||||
    tests/channel/Makefile
 | 
			
		||||
    tests/sccp/Makefile
 | 
			
		||||
    Makefile)
 | 
			
		||||
							
								
								
									
										2
									
								
								openbsc/contrib/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								openbsc/contrib/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
This contains a set of scripts used for the development of the
 | 
			
		||||
MSC functionality.
 | 
			
		||||
							
								
								
									
										33
									
								
								openbsc/contrib/bt.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								openbsc/contrib/bt.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
f = open("unbalanced")
 | 
			
		||||
lines = []
 | 
			
		||||
for line in f:
 | 
			
		||||
    lines.append(line)
 | 
			
		||||
 | 
			
		||||
filenames = {}
 | 
			
		||||
 | 
			
		||||
output = []
 | 
			
		||||
for line in lines:
 | 
			
		||||
    if "[0x" in line:
 | 
			
		||||
        start = line.find("[")
 | 
			
		||||
        end = line.find("]")
 | 
			
		||||
        addr = line[start+1:end]
 | 
			
		||||
        try:
 | 
			
		||||
            file = filenames[addr]
 | 
			
		||||
        except KeyError:
 | 
			
		||||
            r = os.popen("addr2line -fs -e ./bsc_hack %s" % addr)
 | 
			
		||||
            all = r.read().replace("\n", ",")
 | 
			
		||||
            file = all
 | 
			
		||||
            filenames[addr] = file
 | 
			
		||||
 | 
			
		||||
        line = line.replace(addr, file)
 | 
			
		||||
    output.append(line)
 | 
			
		||||
 | 
			
		||||
g = open("unbalanced.2", "w")
 | 
			
		||||
g.write("".join(output))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								openbsc/contrib/convert_to_enum.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								openbsc/contrib/convert_to_enum.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Convert ETSI documents to an enum
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
import re, sys
 | 
			
		||||
 | 
			
		||||
def convert(string):
 | 
			
		||||
    string = string.strip().replace(" ", "").rjust(8, "0")
 | 
			
		||||
    var = 0
 | 
			
		||||
    offset = 7
 | 
			
		||||
    for char in string:
 | 
			
		||||
        assert offset >= 0
 | 
			
		||||
        var = var | (int(char) << offset)
 | 
			
		||||
        offset = offset - 1
 | 
			
		||||
 | 
			
		||||
    return var
 | 
			
		||||
 | 
			
		||||
def string(name):
 | 
			
		||||
    name = name.replace(" ", "_")
 | 
			
		||||
    name = name.replace('"', "")
 | 
			
		||||
    name = name.replace('/', '_')
 | 
			
		||||
    name = name.replace('(', '_')
 | 
			
		||||
    name = name.replace(')', '_')
 | 
			
		||||
    return "%s_%s" % (sys.argv[2], name.upper())
 | 
			
		||||
 | 
			
		||||
file = open(sys.argv[1])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
for line in file:
 | 
			
		||||
    m = re.match(r"[ \t]*(?P<value>[01 ]+)[ ]+(?P<name>[a-zA-Z /0-9()]+)", line[:-1])
 | 
			
		||||
 | 
			
		||||
    if m:
 | 
			
		||||
        print "\t%s\t\t= %d," % (string(m.groupdict()["name"]), convert(m.groupdict()["value"]))
 | 
			
		||||
    else:
 | 
			
		||||
        print line[:-1]
 | 
			
		||||
@@ -10,7 +10,7 @@ rsip_resp = """200 321321332\r\n"""
 | 
			
		||||
audit_packet = """AUEP %d 13@mgw MGCP 1.0\r\n"""
 | 
			
		||||
crcx_packet = """CRCX %d 14@mgw MGCP 1.0\r\nC: 4a84ad5d25f\r\nL: p:20, a:GSM-EFR, nt:IN\r\nM: recvonly\r\n"""
 | 
			
		||||
dlcx_packet = """DLCX %d 14@mgw MGCP 1.0\r\nC: 4a84ad5d25f\r\nI: %d\r\n"""
 | 
			
		||||
mdcx_packet = """MDCX %d 14@mgw MGCP 1.0\r\nC: 4a84ad5d25f\r\nI: %d\r\nL: p:20, a:GSM-EFR, nt:IN\r\nM: recvonly\r\n\r\nv=0\r\no=- 258696477 0 IN IP4 172.16.1.107\r\ns=-\r\nc=IN IP4 172.16.1.107\r\nt=0 0\r\nm=audio 6666 RTP/AVP 127\r\na=rtpmap:127 GSM-EFR/8000/1\r\na=ptime:20\r\na=recvonly\r\nm=image 4402 udptl t38\r\na=T38FaxVersion:0\r\na=T38MaxBitRate:14400\r\n"""
 | 
			
		||||
mdcx_packet = """MDCX %d 14@mgw MGCP 1.0\r\nC: 4a84ad5d25f\r\nI: %d\r\nL: p:20, a:GSM-EFR, nt:IN\r\nM: recvonly\r\n\r\nv=0\r\no=- 258696477 0 IN IP4 172.16.1.107\r\ns=-\r\nc=IN IP4 172.16.1.107\r\nt=0 0\r\nm=audio 4400 RTP/AVP 127\r\na=rtpmap:127 GSM-EFR/8000/1\r\na=ptime:20\r\na=recvonly\r\nm=image 4402 udptl t38\r\na=T38FaxVersion:0\r\na=T38MaxBitRate:14400\r\n"""
 | 
			
		||||
 | 
			
		||||
def hexdump(src, length=8):
 | 
			
		||||
    """Recipe is from http://code.activestate.com/recipes/142812/"""
 | 
			
		||||
@@ -25,24 +25,15 @@ def hexdump(src, length=8):
 | 
			
		||||
 | 
			
		||||
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 | 
			
		||||
server_socket.bind(("127.0.0.1", MGCP_CALLAGENT_PORT))
 | 
			
		||||
server_socket.setblocking(1)
 | 
			
		||||
server_socket.setblocking(0)
 | 
			
		||||
 | 
			
		||||
last_ci = 1
 | 
			
		||||
def send_and_receive(packet):
 | 
			
		||||
    global last_ci
 | 
			
		||||
 | 
			
		||||
def send_receive(packet):
 | 
			
		||||
    server_socket.sendto(packet, ("127.0.0.1", MGCP_GATEWAY_PORT))
 | 
			
		||||
    try:
 | 
			
		||||
        data, addr = server_socket.recvfrom(4096)
 | 
			
		||||
 | 
			
		||||
        # attempt to store the CI of the response
 | 
			
		||||
        list = data.split("\n")
 | 
			
		||||
        for item in list:
 | 
			
		||||
           if item.startswith("I: "):
 | 
			
		||||
               last_ci = int(item[3:])
 | 
			
		||||
 | 
			
		||||
        print hexdump(data), addr
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        print e
 | 
			
		||||
    except socket.error:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
def generate_tid():
 | 
			
		||||
@@ -51,10 +42,13 @@ def generate_tid():
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
i = 1
 | 
			
		||||
while True:
 | 
			
		||||
    send_and_receive(audit_packet % generate_tid())
 | 
			
		||||
    send_and_receive(crcx_packet % generate_tid() )
 | 
			
		||||
    send_and_receive(mdcx_packet % (generate_tid(), last_ci))
 | 
			
		||||
    send_and_receive(dlcx_packet % (generate_tid(), last_ci))
 | 
			
		||||
    send_receive(rsip_resp)
 | 
			
		||||
    send_receive(audit_packet)
 | 
			
		||||
    send_receive(crcx_packet % generate_tid() )
 | 
			
		||||
    send_receive(mdcx_packet % (generate_tid(), i))
 | 
			
		||||
    send_receive(dlcx_packet % (generate_tid(), i))
 | 
			
		||||
    i = i + 1
 | 
			
		||||
 | 
			
		||||
    time.sleep(3)
 | 
			
		||||
							
								
								
									
										30
									
								
								openbsc/contrib/send_handshake.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										30
									
								
								openbsc/contrib/send_handshake.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
# packages
 | 
			
		||||
ACK ="\x00\x01\xfe\x06"
 | 
			
		||||
RESET_ACK = "\x00\x13\xfd\x09\x00\x03\x07\x0b\x04\x43\x01\x00\xfe\x04\x43\x5c\x00\xfe\x03\x00\x01\x31"
 | 
			
		||||
PAGE = "\x00\x20\xfd\x09\x00\x03\x07\x0b\x04\x43\x01\x00\xfe\x04\x43\x5c\x00\xfe\x10\x00\x0e\x52\x08\x08\x29\x42\x08\x05\x03\x12\x23\x42\x1a\x01\x06"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# simple handshake...
 | 
			
		||||
sys.stdout.write(ACK)
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
sys.stdin.read(4)
 | 
			
		||||
 | 
			
		||||
# wait for some data and send reset ack
 | 
			
		||||
sys.stdin.read(21)
 | 
			
		||||
sys.stdout.write(RESET_ACK)
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
 | 
			
		||||
sys.stdout.write(RESET_ACK)
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
 | 
			
		||||
# page a subscriber
 | 
			
		||||
sys.stdout.write(PAGE)
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
 | 
			
		||||
while True:
 | 
			
		||||
    sys.stdin.read(1)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								openbsc/doc/BS11-OML.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								openbsc/doc/BS11-OML.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
The Siemens BS-11 supports the following additional GSM 12.21 OML operations:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CREATE OBJECT
 | 
			
		||||
 | 
			
		||||
abis_om_fom_hdr.obj_class can be 
 | 
			
		||||
A3:
 | 
			
		||||
A5: ALCO, BBSIG, CCLK, GPSU, LI, PA
 | 
			
		||||
A8: EnvaBTSE
 | 
			
		||||
A9: BPORT
 | 
			
		||||
 | 
			
		||||
the abis_om_obj_inst.trx_nr field indicates the index of object, whereas the
 | 
			
		||||
abis_om_fom_hdr.bts_nr indicates the type of the object.
 | 
			
		||||
 | 
			
		||||
enum abis_bs11_objtype {
 | 
			
		||||
	BS11_OBJ_ALCO		= 0x01,
 | 
			
		||||
	BS11_OBJ_BBSIG		= 0x02,	/* obj_class: 0,1 */
 | 
			
		||||
	BS11_OBJ_TRX1		= 0x03,	/* only DEACTIVATE TRX1 */
 | 
			
		||||
	BS11_OBJ_CCLK		= 0x04,
 | 
			
		||||
	BS11_OBJ_GPSU		= 0x06,
 | 
			
		||||
	BS11_OBJ_LI		= 0x07,
 | 
			
		||||
	BS11_OBJ_PA		= 0x09,	/* obj_class: 0, 1*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
In case of CREATE ENVABTSE, the abis_om_obj_inst.trx_nr indicates the EnvaBTSEx
 | 
			
		||||
number.
 | 
			
		||||
 | 
			
		||||
In case of A9 (CREAETE BPORT), the abis_om_obj_inst.bts_nr indicates which BPORT
 | 
			
		||||
shall be used.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								openbsc/doc/call-routing.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								openbsc/doc/call-routing.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
Call routing in OpenBSC
 | 
			
		||||
 | 
			
		||||
Flow of events:
 | 
			
		||||
 | 
			
		||||
 # MO call initiated by MS, CHANNEL RQD, IMMEDIATE ASSIGN
 | 
			
		||||
 # MS sends CC SETUP message, we assume already on TCH/H FACCH
 | 
			
		||||
 # OpenBSC does a subscriber lookup based on the target extension
 | 
			
		||||
  * If a subscriber is found:
 | 
			
		||||
   # send CALL PROCEEDING message to MO
 | 
			
		||||
   # page the MT subscriber and ask itI to ask for TCH/H
 | 
			
		||||
   # once paging completes, we have the TCH/H for the MT end
 | 
			
		||||
   # send SETUP to MT
 | 
			
		||||
   # receive CALL CONFIRMED from MT
 | 
			
		||||
   # set-up the TRAU mux mapping between the E1 subslots for both TCH/H
 | 
			
		||||
   # receive ALERTING from MT, route ALERTING to MO
 | 
			
		||||
   # receive CONNECT from MT, confirm to MT with CONNECT_ACK
 | 
			
		||||
   # send a CONNECT message to MO, receive CONNECT_ACK from MO
 | 
			
		||||
 * If subscriber is not found:
 | 
			
		||||
  # send RELEASE COMPLETE with apropriate cause to MO (1: unalloacated 3: no route)
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Thoughts about RR/MM:
 | 
			
		||||
 | 
			
		||||
* we allocate RR/MM entities on demand, when we need them
 | 
			
		||||
							
								
								
									
										74
									
								
								openbsc/doc/channel_release.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								openbsc/doc/channel_release.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
 | 
			
		||||
GSM 04.08 7.1.7 / 9.1.7		RR CHANNEL RELESE
 | 
			
		||||
 | 
			
		||||
RSL 08.58 3.4 / ?		RLL Link Release Request
 | 
			
		||||
 | 
			
		||||
RSL 08.58 4.6 / 8.4.5		DEACTivate SACCH
 | 
			
		||||
	* Deactivate SACCH according to Channel Release Proc 04.08
 | 
			
		||||
	* to be sent after RR CHANNEL RELEASE is sent to MS
 | 
			
		||||
 | 
			
		||||
RSL 08.58 4.7 / 8.4.14		RF CHANnel RELease
 | 
			
		||||
	* tells the BTS to release a radio channel
 | 
			
		||||
	* "when an activated radio channel is no longer needed"
 | 
			
		||||
	* BTS responds with RF CHANnel RELease ACKnowledge
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GSM 04.08 3.4.13: RR connection release procedure
 | 
			
		||||
 | 
			
		||||
* network sends RR CHANNEL RELEASE to MS on the DCCH
 | 
			
		||||
  * start T3109
 | 
			
		||||
  * deactivate SACCH
 | 
			
		||||
* MS disconnects main signalling link (by sending DISC)
 | 
			
		||||
  * all other data links are disconnected by local end link release
 | 
			
		||||
* network receives DISC (BTS sends RLL REL IND to BSC)
 | 
			
		||||
  * stop T3109
 | 
			
		||||
  * start T3111 
 | 
			
		||||
* when T3111 times out, the network can reuse the channls
 | 
			
		||||
* if T3109 times out, the network deactivates the channels 
 | 
			
		||||
  and can reuse them
 | 
			
		||||
  * this probably means simply RF CHANnel RELease
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
== Implementation in OpenBSC ==
 | 
			
		||||
 | 
			
		||||
chan_alloc.c:lchan_auto_release()
 | 
			
		||||
	* checks if use count still > 0 (abort)
 | 
			
		||||
	* calls gsm48_send_rr_release()
 | 
			
		||||
		* which calls rsl_deact_sacch()
 | 
			
		||||
	* calls rsl_release_request()
 | 
			
		||||
		* which sends RLL Link Release request
 | 
			
		||||
	
 | 
			
		||||
RX of RELease INDication:
 | 
			
		||||
	* call rsl_rf_chan_release() (send RF_CHAN_REL)
 | 
			
		||||
 | 
			
		||||
RX of RELease CONFimem:
 | 
			
		||||
	* call rsl_rf_chan_release() (send RF_CHAN_REL)
 | 
			
		||||
 | 
			
		||||
* RX of RF_CHAN_REL_ACK
 | 
			
		||||
	* call lchan_free()
 | 
			
		||||
		* subscr_put()
 | 
			
		||||
		* delete release_timer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=== Integration with SMS ===
 | 
			
		||||
 | 
			
		||||
* RX of CP_ERROR or unimplemented MT
 | 
			
		||||
	* trigger trans_free() which will lchan_auto_release()
 | 
			
		||||
 | 
			
		||||
* CP TC1* expired while waiting for CP-ACK
 | 
			
		||||
	* trigger trans_free() which will lchan_auto_release()
 | 
			
		||||
 | 
			
		||||
* RX of RP_ERROR
 | 
			
		||||
	* trigger trans_free() which will lchan_auto_release()
 | 
			
		||||
	
 | 
			
		||||
* TX of CP-ACK in MT DELIVER
 | 
			
		||||
	* trigger trans_free() which will lchan_auto_release()
 | 
			
		||||
 | 
			
		||||
* RX of CP-ACK in MO SUBMIT
 | 
			
		||||
	* trigger trans_free() which will lchan_auto_release()
 | 
			
		||||
	
 | 
			
		||||
* RX of RP-ACK in MT DELIVER (and no more messages)
 | 
			
		||||
	* trigger rsl_release_request() for SAPI3
 | 
			
		||||
 | 
			
		||||
* RX of RP-SMMA in MT DELIVER (and no more messages)
 | 
			
		||||
	* trigger rsl_release_request() for SAPI3
 | 
			
		||||
							
								
								
									
										172
									
								
								openbsc/doc/e1-data-model.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								openbsc/doc/e1-data-model.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,172 @@
 | 
			
		||||
E1 related data model
 | 
			
		||||
 | 
			
		||||
This data model describes the physical relationship of the individual
 | 
			
		||||
parts in the network, it is not the logical/protocol side of the GSM
 | 
			
		||||
network.
 | 
			
		||||
 | 
			
		||||
A BTS is connected to the BSC by some physical link.  It could be an actual
 | 
			
		||||
E1 link, but it could also be abis-over-IP with a mixture of TCP and RTP/UDP.
 | 
			
		||||
 | 
			
		||||
To further complicate the fact, multiple BTS can share one such pysical
 | 
			
		||||
link.  On a single E1 line, we can easily accomodate up to three BTS with
 | 
			
		||||
two TRX each.
 | 
			
		||||
 | 
			
		||||
Thus, it is best for OpenBSC to have some kind of abstraction layer.  The BSC's
 | 
			
		||||
view of a BTS connected to it.  We call this 'bts_link'.  A bts_link can be
 | 
			
		||||
* all the TCP and UDP streams of a Abis-over-IP BTS
 | 
			
		||||
* a set of E1 timeslots for OML, RSL and TRAU connections on a E1 link
 | 
			
		||||
* a serial line exclusively used for OML messages (T-Link)
 | 
			
		||||
 | 
			
		||||
A bts_link can be registered with the OpenBSC core at runtime.
 | 
			
		||||
 | 
			
		||||
struct trx_link {
 | 
			
		||||
	struct gsm_bts_trx *trx;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct bts_link {
 | 
			
		||||
	struct gsm_bts *bts;
 | 
			
		||||
	struct trx_link trx_links[NUM_TRX];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Interface from stack to input core:
 | 
			
		||||
======================================================================
 | 
			
		||||
int abis_rsl_sendmsg(struct msgb *msg);
 | 
			
		||||
	send a message through a RSL link to the TRX specified by the caller in
 | 
			
		||||
	msg->trx.
 | 
			
		||||
 | 
			
		||||
int abis_rsl_rcvmsg(struct msgb *msg);
 | 
			
		||||
	receive a message from a RSL link from the TRX specified by the
 | 
			
		||||
	caller in msg->trx.
 | 
			
		||||
 | 
			
		||||
int abis_nm_sendmsg(struct msgb *msg);
 | 
			
		||||
	send a message through a OML link to the BTS specified by the caller in
 | 
			
		||||
	msg->trx->bts.  The caller can just use bts->c0 to get the first TRX
 | 
			
		||||
	in a BTS. (OML messages are not really sent to a TRX but to the BTS)
 | 
			
		||||
 | 
			
		||||
int abis_nm_rcvmsg(struct msgb *msg);
 | 
			
		||||
	receive a message from a OML link from the BTS specified by the caller
 | 
			
		||||
	in msg->trx->bts.  The caller can just use bts->c0 to get the first
 | 
			
		||||
	TRX in a BTS.
 | 
			
		||||
 | 
			
		||||
int abis_link_event(int event, void *data);
 | 
			
		||||
	signal some event (such as layer 1 connect/disconnect) from the
 | 
			
		||||
	input core to the stack.
 | 
			
		||||
 | 
			
		||||
int subch_demux_in(mx, const u_int8_t *data, int len);
 | 
			
		||||
	receive 'len' bytes from a given E1 timeslot (TRAU frames)
 | 
			
		||||
 | 
			
		||||
int subchan_mux_out(mx, u_int8_t *data, int len);
 | 
			
		||||
	obtain 'len' bytes of output data to be sent on E1 timeslot
 | 
			
		||||
 | 
			
		||||
Intrface by Input Core for Input Plugins
 | 
			
		||||
======================================================================
 | 
			
		||||
 | 
			
		||||
int btslink_register_plugin();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Configuration for the E1 input module
 | 
			
		||||
======================================================================
 | 
			
		||||
 | 
			
		||||
BTS
 | 
			
		||||
	BTS number
 | 
			
		||||
	number of TRX
 | 
			
		||||
	OML link
 | 
			
		||||
		E1 line number
 | 
			
		||||
		timeslot number
 | 
			
		||||
		[subslot number]
 | 
			
		||||
		SAPI
 | 
			
		||||
		TEI
 | 
			
		||||
	for each TRX
 | 
			
		||||
		RSL link
 | 
			
		||||
			E1 line number
 | 
			
		||||
			timeslot number
 | 
			
		||||
			[subslot number]
 | 
			
		||||
			SAPI
 | 
			
		||||
			TEI
 | 
			
		||||
		for each TS
 | 
			
		||||
			E1 line number
 | 
			
		||||
			timeslot number
 | 
			
		||||
			subslot number
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
E1 input module data model
 | 
			
		||||
======================================================================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum e1inp_sign_type {
 | 
			
		||||
	E1INP_SIGN_NONE,
 | 
			
		||||
	E1INP_SIGN_OML,
 | 
			
		||||
	E1INP_SIGN_RSL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct e1inp_sign_link {
 | 
			
		||||
	/* list of signalling links */
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
 | 
			
		||||
	enum e1inp_sign_type type;
 | 
			
		||||
 | 
			
		||||
	/* trx for msg->trx of received msgs */	
 | 
			
		||||
	struct gsm_bts_trx *trx;
 | 
			
		||||
 | 
			
		||||
	/* msgb queue of to-be-transmitted msgs */
 | 
			
		||||
	struct llist_head tx_list;
 | 
			
		||||
 | 
			
		||||
	/* SAPI and TEI on the E1 TS */
 | 
			
		||||
	u_int8_t sapi;
 | 
			
		||||
	u_int8_t tei;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum e1inp_ts_type {
 | 
			
		||||
	E1INP_TS_TYPE_NONE,
 | 
			
		||||
	E1INP_TS_TYPE_SIGN,
 | 
			
		||||
	E1INP_TS_TYPE_TRAU,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* A timeslot in the E1 interface */
 | 
			
		||||
struct e1inp_ts {
 | 
			
		||||
	enum e1inp_ts_type type;
 | 
			
		||||
	struct e1inp_line *line;
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			struct llist_head sign_links;
 | 
			
		||||
		} sign;
 | 
			
		||||
		struct {
 | 
			
		||||
			/* subchannel demuxer for frames from E1 */
 | 
			
		||||
			struct subch_demux demux;
 | 
			
		||||
			/* subchannel muxer for frames to E1 */
 | 
			
		||||
			struct subch_mux mux;
 | 
			
		||||
		} trau;
 | 
			
		||||
	};
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			/* mISDN driver has one fd for each ts */
 | 
			
		||||
			struct bsc_fd;
 | 
			
		||||
		} misdn;
 | 
			
		||||
	} driver;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct e1inp_line {
 | 
			
		||||
	unsigned int num;
 | 
			
		||||
	char *name;
 | 
			
		||||
 | 
			
		||||
	struct e1inp_ts ts[NR_E1_TS];
 | 
			
		||||
 | 
			
		||||
	char *e1inp_driver;
 | 
			
		||||
	void *driver_data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Call from the Stack: configuration of this TS has changed */
 | 
			
		||||
int e1inp_update_ts(struct e1inp_ts *ts);
 | 
			
		||||
 | 
			
		||||
/* Receive a packet from the E1 driver */
 | 
			
		||||
int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
 | 
			
		||||
		u_int8_t tei, u_int8_t sapi);
 | 
			
		||||
 | 
			
		||||
/* Send a packet, callback function in the driver */
 | 
			
		||||
int e1driver_tx_ts(struct e1inp_ts *ts, struct msgb *msg)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct e1inp_driver {
 | 
			
		||||
	const char *name;
 | 
			
		||||
	int (*want_write)(struct e1inp_ts *ts);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										54
									
								
								openbsc/doc/gsm-hopping.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								openbsc/doc/gsm-hopping.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
according to GSM 05.02:
 | 
			
		||||
 | 
			
		||||
general parameters from CCCH:
 | 
			
		||||
* CA cell allocation of ARFCN's (System Information / BCCH)
 | 
			
		||||
* FN: TDMA frame number (t1,t2,t3') in SCH
 | 
			
		||||
 | 
			
		||||
specific parameters from channel assignment:
 | 
			
		||||
* MA: mobile allocation, defines set of ARFCN's, up to 64
 | 
			
		||||
* MAIO: index
 | 
			
		||||
* HSN: hopping sequence generator number (0..64)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
hopping sequence generation (6.2.3):
 | 
			
		||||
 | 
			
		||||
u_int8_t rntable[114] = {
 | 
			
		||||
	 48,  98,  63,   1,  36,  95,  78, 102,  94,  73,
 | 
			
		||||
	  0,  64,  25,  81,  76,  59, 124,  23, 104, 100,
 | 
			
		||||
	101,  47, 118,  85,  18,  56,  96,  86,  54,   2,
 | 
			
		||||
	 80,  34, 127,  13,   6,  89,  57, 103,  12,  74,
 | 
			
		||||
	 55, 111,  75,  38, 109,  71, 112,  29,  11,  88,
 | 
			
		||||
	 87,  19,   3,  68, 110,  26,  33,  31,   8,  45,
 | 
			
		||||
	 82,  58,  40, 107,  32,   5, 106,  92,  62,  67,
 | 
			
		||||
	 77, 108, 122,  37,  60,  66, 121,  42,  51, 126,
 | 
			
		||||
	117, 114,   4,  90,  43,  52,  53, 113, 120,  72,
 | 
			
		||||
	 16,  49,   7,  79, 119,  61,  22,  84,   9,  97,
 | 
			
		||||
	125,  99,  17, 123
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* mai=0 represents lowest ARFCN in the MA */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
u_int8_t hopping_mai(u_int8_t hsn, u_int32_t fn, u_int8_t maio,
 | 
			
		||||
		     u_int8_t t1, u_int8_t t2, u_int8_t t3_)
 | 
			
		||||
{
 | 
			
		||||
	u_int8_t mai;
 | 
			
		||||
 | 
			
		||||
	if (hsn == 0) /* cyclic hopping */
 | 
			
		||||
		mai = (fn + maio) % n;
 | 
			
		||||
	else {
 | 
			
		||||
		u_int32_t m, m_, t_, s;
 | 
			
		||||
 | 
			
		||||
		m = t2 + rntable[(hsn xor (t1 % 64)) + t3];
 | 
			
		||||
		m_ = m % (2^NBIN);
 | 
			
		||||
		t_ = t3 % (2^NBIN);
 | 
			
		||||
		if (m_ < n then)
 | 
			
		||||
			s = m_;
 | 
			
		||||
		else
 | 
			
		||||
			s = (m_ + t_) % n;
 | 
			
		||||
		mai = (s + maio) % n;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return mai;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										89
									
								
								openbsc/doc/handover.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								openbsc/doc/handover.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
Ideas about a handover algorithm
 | 
			
		||||
======================================================================
 | 
			
		||||
 | 
			
		||||
This is mostly based on the results presented in Chapter 8 of "Performance
 | 
			
		||||
Enhancements in a Frequency Hopping GSM Network" by Thomas Toftegaard Nielsen
 | 
			
		||||
and Joeroen Wigard. 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=== Reasons for performing handover ===
 | 
			
		||||
 | 
			
		||||
Section 2.1.1: Handover used in their CAPACITY simulation:
 | 
			
		||||
 | 
			
		||||
1) Interference Handover
 | 
			
		||||
 | 
			
		||||
Average RXLEV is satisfactory high, but average RXQUAL too low indicates
 | 
			
		||||
interference to the channel.  Handover should be made.
 | 
			
		||||
 | 
			
		||||
2) Bad Quality
 | 
			
		||||
 | 
			
		||||
Averaged RXQUAL is lower than a threshold
 | 
			
		||||
 | 
			
		||||
3) Low Level / Signal Strength
 | 
			
		||||
 | 
			
		||||
Average RXLEV is lower than a threshold
 | 
			
		||||
 | 
			
		||||
4) Distance Handover
 | 
			
		||||
 | 
			
		||||
MS is too far away from a cell (measured by TA)
 | 
			
		||||
 | 
			
		||||
5) Power budget / Better Cell
 | 
			
		||||
 | 
			
		||||
RX Level of neighbor cell is at least "HO Margin dB" dB better than the
 | 
			
		||||
current serving cell.
 | 
			
		||||
 | 
			
		||||
=== Ideal parameters for HO algorithm ===
 | 
			
		||||
 | 
			
		||||
Chapter 8, Section 2.2, Table 24:
 | 
			
		||||
 | 
			
		||||
Window RXLEV averaging:		10 SACCH frames (no weighting)
 | 
			
		||||
Window RXQUAL averaging:	1 SACCH frame (no averaging)
 | 
			
		||||
Level Threashold:		1 of the last 1 AV-RXLEV values < -110dBm
 | 
			
		||||
Quality Threshold:		3 of the last 4 AV-RXQUAL values >= 5
 | 
			
		||||
Interference Threshold:		1 of the last AV-RXLEV > -85 dBm &
 | 
			
		||||
				3 of the last 4 AV-RXQUAL values >= 5
 | 
			
		||||
Power Budget:			Level of neighbor cell > 3 dB better
 | 
			
		||||
Power Budget Interval:		Every 6 SACCH frames (6 seconds ?!?)
 | 
			
		||||
Distance Handover:		Disabled
 | 
			
		||||
Evaluation rule 1:		RXLEV of the candidate cell a tleast -104 dBm
 | 
			
		||||
Evaluation rule 2:		Level of candidate cell > 3dB better own cell
 | 
			
		||||
Timer Successful HO:		5 SACCH frames
 | 
			
		||||
Timer Unsuccessful HO:		1 SACCH frame
 | 
			
		||||
 | 
			
		||||
In a non-frequency hopping case, RXQUAL threshold can be decreased to
 | 
			
		||||
RXLEV >= 4
 | 
			
		||||
 | 
			
		||||
When frequency hopping is enabled, the following additional parameters
 | 
			
		||||
should be introduced:
 | 
			
		||||
 | 
			
		||||
* No intra-cell handover
 | 
			
		||||
* Use a HO Margin of 2dB
 | 
			
		||||
 | 
			
		||||
=== Handover Channel Reservation ===
 | 
			
		||||
 | 
			
		||||
In loaded network, each cell should reserve some channels for handovers,
 | 
			
		||||
rather than using all of them for new call establishment.  This reduces the
 | 
			
		||||
need to drop calls due to failing handovers, at the expense of failing new call
 | 
			
		||||
attempts.
 | 
			
		||||
 | 
			
		||||
=== Dynamic HO Margin ===
 | 
			
		||||
 | 
			
		||||
The handover margin (hysteresis) should depend on the RXQUAL. Optimal results
 | 
			
		||||
were achieved with the following settings:
 | 
			
		||||
* RXQUAL <= 4: 9 dB
 | 
			
		||||
* RXQUAL == 5: 6 dB
 | 
			
		||||
* RXQUAL >= 6: 1 dB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
== Actual Handover on a protocol level ==
 | 
			
		||||
 | 
			
		||||
After the BSC has decided a handover shall be done, it has to
 | 
			
		||||
 | 
			
		||||
# allocate a channel at the new BTS
 | 
			
		||||
# allocate a handover reference
 | 
			
		||||
# activate the channel on the BTS side using RSL CHANNEL ACTIVATION,
 | 
			
		||||
  indicating the HO reference
 | 
			
		||||
# BTS responds with CHAN ACT ACK, including GSM frame number
 | 
			
		||||
# BSC sends 04.08 HO CMD to MS using old BTS
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								openbsc/doc/oml-interface.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								openbsc/doc/oml-interface.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
oml interface design notes
 | 
			
		||||
 | 
			
		||||
problems:
 | 
			
		||||
 | 
			
		||||
* there is no way how to tag a command sent to the BTS, with the response
 | 
			
		||||
  having the same tag to identify the originator of the command
 | 
			
		||||
* therefore, we can have e.g. both the BSC and the OML interface send a
 | 
			
		||||
  SET ATTRIBUTE message, where the responses would end up at the wrong
 | 
			
		||||
  query.
 | 
			
		||||
 | 
			
		||||
the only possible solutions i can imagine:
 | 
			
		||||
* have some kind of exclusive locking, where the OML interface gets blocked
 | 
			
		||||
  from the BSC and is exclusively assigned to the OML console until all commands
 | 
			
		||||
  of the OML console have terminated.  This can either be done explicitly
 | 
			
		||||
  dynamically or on demand
 | 
			
		||||
 | 
			
		||||
* use the OML interface synchronously, i.e. always wait for the response from
 | 
			
		||||
  the BTS before
 | 
			
		||||
 | 
			
		||||
* unilateral / unsolicited messages need to be broadcasted to both the BSC and
 | 
			
		||||
  the OML console
 | 
			
		||||
							
								
								
									
										3
									
								
								openbsc/include/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								openbsc/include/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
SUBDIRS = openbsc vty sccp
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS = mISDNif.h compat_af_isdn.h
 | 
			
		||||
							
								
								
									
										39
									
								
								openbsc/include/compat_af_isdn.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								openbsc/include/compat_af_isdn.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
#ifdef MISDN_OLD_AF_COMPATIBILITY
 | 
			
		||||
#undef AF_ISDN
 | 
			
		||||
#undef PF_ISDN
 | 
			
		||||
 | 
			
		||||
extern	int	AF_ISDN;
 | 
			
		||||
#define PF_ISDN	AF_ISDN
 | 
			
		||||
 | 
			
		||||
int	AF_ISDN;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void init_af_isdn(void);
 | 
			
		||||
 | 
			
		||||
#ifdef AF_COMPATIBILITY_FUNC
 | 
			
		||||
#ifdef MISDN_OLD_AF_COMPATIBILITY
 | 
			
		||||
void init_af_isdn(void)
 | 
			
		||||
{
 | 
			
		||||
	int	s;
 | 
			
		||||
 | 
			
		||||
	/* test for new value */
 | 
			
		||||
	AF_ISDN = 34;
 | 
			
		||||
	s = socket(AF_ISDN, SOCK_RAW, ISDN_P_BASE);
 | 
			
		||||
	if (s >= 0) {
 | 
			
		||||
		close(s);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	AF_ISDN = 27;
 | 
			
		||||
	s = socket(AF_ISDN, SOCK_RAW, ISDN_P_BASE);
 | 
			
		||||
	if (s >= 0) {
 | 
			
		||||
		close(s);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
void init_af_isdn(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										387
									
								
								openbsc/include/mISDNif.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										387
									
								
								openbsc/include/mISDNif.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,387 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Author	Karsten Keil <kkeil@novell.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2008  by Karsten Keil <kkeil@novell.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This code is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
 | 
			
		||||
 * version 2.1 as published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This code 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.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef mISDNIF_H
 | 
			
		||||
#define mISDNIF_H
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#ifdef linux
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#include <linux/errno.h>
 | 
			
		||||
#include <linux/socket.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/errno.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ABI Version 32 bit
 | 
			
		||||
 *
 | 
			
		||||
 * <8 bit> Major version
 | 
			
		||||
 *		- changed if any interface become backwards incompatible
 | 
			
		||||
 *
 | 
			
		||||
 * <8 bit> Minor version
 | 
			
		||||
 *              - changed if any interface is extended but backwards compatible
 | 
			
		||||
 *
 | 
			
		||||
 * <16 bit> Release number
 | 
			
		||||
 *              - should be incremented on every checkin
 | 
			
		||||
 */
 | 
			
		||||
#define	MISDN_MAJOR_VERSION	1
 | 
			
		||||
#define	MISDN_MINOR_VERSION	1
 | 
			
		||||
#define MISDN_RELEASE		20
 | 
			
		||||
 | 
			
		||||
/* primitives for information exchange
 | 
			
		||||
 * generell format
 | 
			
		||||
 * <16  bit  0 >
 | 
			
		||||
 * <8  bit command>
 | 
			
		||||
 *    BIT 8 = 1 LAYER private
 | 
			
		||||
 *    BIT 7 = 1 answer
 | 
			
		||||
 *    BIT 6 = 1 DATA
 | 
			
		||||
 * <8  bit target layer mask>
 | 
			
		||||
 *
 | 
			
		||||
 * Layer = 00 is reserved for general commands
 | 
			
		||||
   Layer = 01  L2 -> HW
 | 
			
		||||
   Layer = 02  HW -> L2
 | 
			
		||||
   Layer = 04  L3 -> L2
 | 
			
		||||
   Layer = 08  L2 -> L3
 | 
			
		||||
 * Layer = FF is reserved for broadcast commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define MISDN_CMDMASK		0xff00
 | 
			
		||||
#define MISDN_LAYERMASK		0x00ff
 | 
			
		||||
 | 
			
		||||
/* generell commands */
 | 
			
		||||
#define OPEN_CHANNEL		0x0100
 | 
			
		||||
#define CLOSE_CHANNEL		0x0200
 | 
			
		||||
#define CONTROL_CHANNEL		0x0300
 | 
			
		||||
#define CHECK_DATA		0x0400
 | 
			
		||||
 | 
			
		||||
/* layer 2 -> layer 1 */
 | 
			
		||||
#define PH_ACTIVATE_REQ		0x0101
 | 
			
		||||
#define PH_DEACTIVATE_REQ	0x0201
 | 
			
		||||
#define PH_DATA_REQ		0x2001
 | 
			
		||||
#define MPH_ACTIVATE_REQ	0x0501
 | 
			
		||||
#define MPH_DEACTIVATE_REQ	0x0601
 | 
			
		||||
#define MPH_INFORMATION_REQ	0x0701
 | 
			
		||||
#define PH_CONTROL_REQ		0x0801
 | 
			
		||||
 | 
			
		||||
/* layer 1 -> layer 2 */
 | 
			
		||||
#define PH_ACTIVATE_IND		0x0102
 | 
			
		||||
#define PH_ACTIVATE_CNF		0x4102
 | 
			
		||||
#define PH_DEACTIVATE_IND	0x0202
 | 
			
		||||
#define PH_DEACTIVATE_CNF	0x4202
 | 
			
		||||
#define PH_DATA_IND		0x2002
 | 
			
		||||
#define PH_DATA_E_IND		0x3002
 | 
			
		||||
#define MPH_ACTIVATE_IND	0x0502
 | 
			
		||||
#define MPH_DEACTIVATE_IND	0x0602
 | 
			
		||||
#define MPH_INFORMATION_IND	0x0702
 | 
			
		||||
#define PH_DATA_CNF		0x6002
 | 
			
		||||
#define PH_CONTROL_IND		0x0802
 | 
			
		||||
#define PH_CONTROL_CNF		0x4802
 | 
			
		||||
 | 
			
		||||
/* layer 3 -> layer 2 */
 | 
			
		||||
#define DL_ESTABLISH_REQ	0x1004
 | 
			
		||||
#define DL_RELEASE_REQ		0x1104
 | 
			
		||||
#define DL_DATA_REQ		0x3004
 | 
			
		||||
#define DL_UNITDATA_REQ		0x3104
 | 
			
		||||
#define DL_INFORMATION_REQ	0x0004
 | 
			
		||||
 | 
			
		||||
/* layer 2 -> layer 3 */
 | 
			
		||||
#define DL_ESTABLISH_IND	0x1008
 | 
			
		||||
#define DL_ESTABLISH_CNF	0x5008
 | 
			
		||||
#define DL_RELEASE_IND		0x1108
 | 
			
		||||
#define DL_RELEASE_CNF		0x5108
 | 
			
		||||
#define DL_DATA_IND		0x3008
 | 
			
		||||
#define DL_UNITDATA_IND		0x3108
 | 
			
		||||
#define DL_INFORMATION_IND	0x0008
 | 
			
		||||
 | 
			
		||||
/* intern layer 2 managment */
 | 
			
		||||
#define MDL_ASSIGN_REQ		0x1804
 | 
			
		||||
#define MDL_ASSIGN_IND		0x1904
 | 
			
		||||
#define MDL_REMOVE_REQ		0x1A04
 | 
			
		||||
#define MDL_REMOVE_IND		0x1B04
 | 
			
		||||
#define MDL_STATUS_UP_IND	0x1C04
 | 
			
		||||
#define MDL_STATUS_DOWN_IND	0x1D04
 | 
			
		||||
#define MDL_STATUS_UI_IND	0x1E04
 | 
			
		||||
#define MDL_ERROR_IND		0x1F04
 | 
			
		||||
#define MDL_ERROR_RSP		0x5F04
 | 
			
		||||
 | 
			
		||||
/* DL_INFORMATION_IND types */
 | 
			
		||||
#define DL_INFO_L2_CONNECT	0x0001
 | 
			
		||||
#define DL_INFO_L2_REMOVED	0x0002
 | 
			
		||||
 | 
			
		||||
/* PH_CONTROL types */
 | 
			
		||||
/* TOUCH TONE IS 0x20XX  XX "0"..."9", "A","B","C","D","*","#" */
 | 
			
		||||
#define DTMF_TONE_VAL		0x2000
 | 
			
		||||
#define DTMF_TONE_MASK		0x007F
 | 
			
		||||
#define DTMF_TONE_START		0x2100
 | 
			
		||||
#define DTMF_TONE_STOP		0x2200
 | 
			
		||||
#define DTMF_HFC_COEF		0x4000
 | 
			
		||||
#define DSP_CONF_JOIN		0x2403
 | 
			
		||||
#define DSP_CONF_SPLIT		0x2404
 | 
			
		||||
#define DSP_RECEIVE_OFF		0x2405
 | 
			
		||||
#define DSP_RECEIVE_ON		0x2406
 | 
			
		||||
#define DSP_ECHO_ON		0x2407
 | 
			
		||||
#define DSP_ECHO_OFF		0x2408
 | 
			
		||||
#define DSP_MIX_ON		0x2409
 | 
			
		||||
#define DSP_MIX_OFF		0x240a
 | 
			
		||||
#define DSP_DELAY		0x240b
 | 
			
		||||
#define DSP_JITTER		0x240c
 | 
			
		||||
#define DSP_TXDATA_ON		0x240d
 | 
			
		||||
#define DSP_TXDATA_OFF		0x240e
 | 
			
		||||
#define DSP_TX_DEJITTER		0x240f
 | 
			
		||||
#define DSP_TX_DEJ_OFF		0x2410
 | 
			
		||||
#define DSP_TONE_PATT_ON	0x2411
 | 
			
		||||
#define DSP_TONE_PATT_OFF	0x2412
 | 
			
		||||
#define DSP_VOL_CHANGE_TX	0x2413
 | 
			
		||||
#define DSP_VOL_CHANGE_RX	0x2414
 | 
			
		||||
#define DSP_BF_ENABLE_KEY	0x2415
 | 
			
		||||
#define DSP_BF_DISABLE		0x2416
 | 
			
		||||
#define DSP_BF_ACCEPT		0x2416
 | 
			
		||||
#define DSP_BF_REJECT		0x2417
 | 
			
		||||
#define DSP_PIPELINE_CFG	0x2418
 | 
			
		||||
#define HFC_VOL_CHANGE_TX	0x2601
 | 
			
		||||
#define HFC_VOL_CHANGE_RX	0x2602
 | 
			
		||||
#define HFC_SPL_LOOP_ON		0x2603
 | 
			
		||||
#define HFC_SPL_LOOP_OFF	0x2604
 | 
			
		||||
 | 
			
		||||
/* DSP_TONE_PATT_ON parameter */
 | 
			
		||||
#define TONE_OFF			0x0000
 | 
			
		||||
#define TONE_GERMAN_DIALTONE		0x0001
 | 
			
		||||
#define TONE_GERMAN_OLDDIALTONE		0x0002
 | 
			
		||||
#define TONE_AMERICAN_DIALTONE		0x0003
 | 
			
		||||
#define TONE_GERMAN_DIALPBX		0x0004
 | 
			
		||||
#define TONE_GERMAN_OLDDIALPBX		0x0005
 | 
			
		||||
#define TONE_AMERICAN_DIALPBX		0x0006
 | 
			
		||||
#define TONE_GERMAN_RINGING		0x0007
 | 
			
		||||
#define TONE_GERMAN_OLDRINGING		0x0008
 | 
			
		||||
#define TONE_AMERICAN_RINGPBX		0x000b
 | 
			
		||||
#define TONE_GERMAN_RINGPBX		0x000c
 | 
			
		||||
#define TONE_GERMAN_OLDRINGPBX		0x000d
 | 
			
		||||
#define TONE_AMERICAN_RINGING		0x000e
 | 
			
		||||
#define TONE_GERMAN_BUSY		0x000f
 | 
			
		||||
#define TONE_GERMAN_OLDBUSY		0x0010
 | 
			
		||||
#define TONE_AMERICAN_BUSY		0x0011
 | 
			
		||||
#define TONE_GERMAN_HANGUP		0x0012
 | 
			
		||||
#define TONE_GERMAN_OLDHANGUP		0x0013
 | 
			
		||||
#define TONE_AMERICAN_HANGUP		0x0014
 | 
			
		||||
#define TONE_SPECIAL_INFO		0x0015
 | 
			
		||||
#define TONE_GERMAN_GASSENBESETZT	0x0016
 | 
			
		||||
#define TONE_GERMAN_AUFSCHALTTON	0x0016
 | 
			
		||||
 | 
			
		||||
/* MPH_INFORMATION_IND */
 | 
			
		||||
#define L1_SIGNAL_LOS_OFF	0x0010
 | 
			
		||||
#define L1_SIGNAL_LOS_ON	0x0011
 | 
			
		||||
#define L1_SIGNAL_AIS_OFF	0x0012
 | 
			
		||||
#define L1_SIGNAL_AIS_ON	0x0013
 | 
			
		||||
#define L1_SIGNAL_RDI_OFF	0x0014
 | 
			
		||||
#define L1_SIGNAL_RDI_ON	0x0015
 | 
			
		||||
#define L1_SIGNAL_SLIP_RX	0x0020
 | 
			
		||||
#define L1_SIGNAL_SLIP_TX	0x0021
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * protocol ids
 | 
			
		||||
 * D channel 1-31
 | 
			
		||||
 * B channel 33 - 63
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ISDN_P_NONE		0
 | 
			
		||||
#define ISDN_P_BASE		0
 | 
			
		||||
#define ISDN_P_TE_S0		0x01
 | 
			
		||||
#define ISDN_P_NT_S0  		0x02
 | 
			
		||||
#define ISDN_P_TE_E1		0x03
 | 
			
		||||
#define ISDN_P_NT_E1  		0x04
 | 
			
		||||
#define ISDN_P_TE_UP0		0x05
 | 
			
		||||
#define ISDN_P_NT_UP0		0x06
 | 
			
		||||
 | 
			
		||||
#define IS_ISDN_P_TE(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_TE_E1) || \
 | 
			
		||||
				(p == ISDN_P_TE_UP0) || (p == ISDN_P_LAPD_TE))
 | 
			
		||||
#define IS_ISDN_P_NT(p) ((p == ISDN_P_NT_S0) || (p == ISDN_P_NT_E1) || \
 | 
			
		||||
				(p == ISDN_P_NT_UP0) || (p == ISDN_P_LAPD_NT))
 | 
			
		||||
#define IS_ISDN_P_S0(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_NT_S0))
 | 
			
		||||
#define IS_ISDN_P_E1(p) ((p == ISDN_P_TE_E1) || (p == ISDN_P_NT_E1))
 | 
			
		||||
#define IS_ISDN_P_UP0(p) ((p == ISDN_P_TE_UP0) || (p == ISDN_P_NT_UP0))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define ISDN_P_LAPD_TE		0x10
 | 
			
		||||
#define	ISDN_P_LAPD_NT		0x11
 | 
			
		||||
 | 
			
		||||
#define ISDN_P_B_MASK		0x1f
 | 
			
		||||
#define ISDN_P_B_START		0x20
 | 
			
		||||
 | 
			
		||||
#define ISDN_P_B_RAW		0x21
 | 
			
		||||
#define ISDN_P_B_HDLC		0x22
 | 
			
		||||
#define ISDN_P_B_X75SLP		0x23
 | 
			
		||||
#define ISDN_P_B_L2DTMF		0x24
 | 
			
		||||
#define ISDN_P_B_L2DSP		0x25
 | 
			
		||||
#define ISDN_P_B_L2DSPHDLC	0x26
 | 
			
		||||
 | 
			
		||||
#define OPTION_L2_PMX		1
 | 
			
		||||
#define OPTION_L2_PTP		2
 | 
			
		||||
#define OPTION_L2_FIXEDTEI	3
 | 
			
		||||
#define OPTION_L2_CLEANUP	4
 | 
			
		||||
 | 
			
		||||
/* should be in sync with linux/kobject.h:KOBJ_NAME_LEN */
 | 
			
		||||
#define MISDN_MAX_IDLEN		20
 | 
			
		||||
 | 
			
		||||
struct mISDNhead {
 | 
			
		||||
	unsigned int	prim;
 | 
			
		||||
	unsigned int	id;
 | 
			
		||||
}  __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
#define MISDN_HEADER_LEN	sizeof(struct mISDNhead)
 | 
			
		||||
#define MAX_DATA_SIZE		2048
 | 
			
		||||
#define MAX_DATA_MEM		(MAX_DATA_SIZE + MISDN_HEADER_LEN)
 | 
			
		||||
#define MAX_DFRAME_LEN		260
 | 
			
		||||
 | 
			
		||||
#define MISDN_ID_ADDR_MASK	0xFFFF
 | 
			
		||||
#define MISDN_ID_TEI_MASK	0xFF00
 | 
			
		||||
#define MISDN_ID_SAPI_MASK	0x00FF
 | 
			
		||||
#define MISDN_ID_TEI_ANY	0x7F00
 | 
			
		||||
 | 
			
		||||
#define MISDN_ID_ANY		0xFFFF
 | 
			
		||||
#define MISDN_ID_NONE		0xFFFE
 | 
			
		||||
 | 
			
		||||
#define GROUP_TEI		127
 | 
			
		||||
#define TEI_SAPI		63
 | 
			
		||||
#define CTRL_SAPI		0
 | 
			
		||||
 | 
			
		||||
#define MISDN_MAX_CHANNEL	127
 | 
			
		||||
#define MISDN_CHMAP_SIZE	((MISDN_MAX_CHANNEL + 1) >> 3)
 | 
			
		||||
 | 
			
		||||
#define SOL_MISDN	0
 | 
			
		||||
 | 
			
		||||
struct sockaddr_mISDN {
 | 
			
		||||
	sa_family_t    family;
 | 
			
		||||
	unsigned char	dev;
 | 
			
		||||
	unsigned char	channel;
 | 
			
		||||
	unsigned char	sapi;
 | 
			
		||||
	unsigned char	tei;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mISDNversion {
 | 
			
		||||
	unsigned char	major;
 | 
			
		||||
	unsigned char	minor;
 | 
			
		||||
	unsigned short	release;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MAX_DEVICE_ID 63
 | 
			
		||||
 | 
			
		||||
struct mISDN_devinfo {
 | 
			
		||||
	u_int			id;
 | 
			
		||||
	u_int			Dprotocols;
 | 
			
		||||
	u_int			Bprotocols;
 | 
			
		||||
	u_int			protocol;
 | 
			
		||||
	u_char			channelmap[MISDN_CHMAP_SIZE];
 | 
			
		||||
	u_int			nrbchan;
 | 
			
		||||
	char			name[MISDN_MAX_IDLEN];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mISDN_devrename {
 | 
			
		||||
	u_int			id;
 | 
			
		||||
	char			name[MISDN_MAX_IDLEN];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ph_info_ch {
 | 
			
		||||
	int32_t 		protocol;
 | 
			
		||||
	int64_t			Flags;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ph_info_dch {
 | 
			
		||||
	struct ph_info_ch	ch;
 | 
			
		||||
	int16_t			state;
 | 
			
		||||
	int16_t			num_bch;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ph_info {
 | 
			
		||||
	struct ph_info_dch	dch;
 | 
			
		||||
	struct ph_info_ch 	bch[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* timer device ioctl */
 | 
			
		||||
#define IMADDTIMER	_IOR('I', 64, int)
 | 
			
		||||
#define IMDELTIMER	_IOR('I', 65, int)
 | 
			
		||||
/* socket ioctls */
 | 
			
		||||
#define	IMGETVERSION	_IOR('I', 66, int)
 | 
			
		||||
#define	IMGETCOUNT	_IOR('I', 67, int)
 | 
			
		||||
#define IMGETDEVINFO	_IOR('I', 68, int)
 | 
			
		||||
#define IMCTRLREQ	_IOR('I', 69, int)
 | 
			
		||||
#define IMCLEAR_L2	_IOR('I', 70, int)
 | 
			
		||||
#define IMSETDEVNAME	_IOR('I', 71, struct mISDN_devrename)
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
test_channelmap(u_int nr, u_char *map)
 | 
			
		||||
{
 | 
			
		||||
	if (nr <= MISDN_MAX_CHANNEL)
 | 
			
		||||
		return map[nr >> 3] & (1 << (nr & 7));
 | 
			
		||||
	else
 | 
			
		||||
		return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
set_channelmap(u_int nr, u_char *map)
 | 
			
		||||
{
 | 
			
		||||
	map[nr >> 3] |= (1 << (nr & 7));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
clear_channelmap(u_int nr, u_char *map)
 | 
			
		||||
{
 | 
			
		||||
	map[nr >> 3] &= ~(1 << (nr & 7));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* CONTROL_CHANNEL parameters */
 | 
			
		||||
#define MISDN_CTRL_GETOP		0x0000
 | 
			
		||||
#define MISDN_CTRL_LOOP			0x0001
 | 
			
		||||
#define MISDN_CTRL_CONNECT		0x0002
 | 
			
		||||
#define MISDN_CTRL_DISCONNECT		0x0004
 | 
			
		||||
#define MISDN_CTRL_PCMCONNECT		0x0010
 | 
			
		||||
#define MISDN_CTRL_PCMDISCONNECT	0x0020
 | 
			
		||||
#define MISDN_CTRL_SETPEER		0x0040
 | 
			
		||||
#define MISDN_CTRL_UNSETPEER		0x0080
 | 
			
		||||
#define MISDN_CTRL_RX_OFF		0x0100
 | 
			
		||||
#define MISDN_CTRL_FILL_EMPTY		0x0200
 | 
			
		||||
#define MISDN_CTRL_GETPEER		0x0400
 | 
			
		||||
#define MISDN_CTRL_HW_FEATURES_OP	0x2000
 | 
			
		||||
#define MISDN_CTRL_HW_FEATURES		0x2001
 | 
			
		||||
#define MISDN_CTRL_HFC_OP		0x4000
 | 
			
		||||
#define MISDN_CTRL_HFC_PCM_CONN		0x4001
 | 
			
		||||
#define MISDN_CTRL_HFC_PCM_DISC		0x4002
 | 
			
		||||
#define MISDN_CTRL_HFC_CONF_JOIN	0x4003
 | 
			
		||||
#define MISDN_CTRL_HFC_CONF_SPLIT	0x4004
 | 
			
		||||
#define MISDN_CTRL_HFC_RECEIVE_OFF	0x4005
 | 
			
		||||
#define MISDN_CTRL_HFC_RECEIVE_ON	0x4006
 | 
			
		||||
#define MISDN_CTRL_HFC_ECHOCAN_ON 	0x4007
 | 
			
		||||
#define MISDN_CTRL_HFC_ECHOCAN_OFF 	0x4008
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* socket options */
 | 
			
		||||
#define MISDN_TIME_STAMP		0x0001
 | 
			
		||||
 | 
			
		||||
struct mISDN_ctrl_req {
 | 
			
		||||
	int		op;
 | 
			
		||||
	int		channel;
 | 
			
		||||
	int		p1;
 | 
			
		||||
	int		p2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* muxer options */
 | 
			
		||||
#define MISDN_OPT_ALL		1
 | 
			
		||||
#define MISDN_OPT_TEIMGR	2
 | 
			
		||||
 | 
			
		||||
#endif /* mISDNIF_H */
 | 
			
		||||
							
								
								
									
										8
									
								
								openbsc/include/openbsc/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								openbsc/include/openbsc/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
noinst_HEADERS = abis_nm.h abis_rsl.h debug.h db.h gsm_04_08.h gsm_data.h \
 | 
			
		||||
		 gsm_subscriber.h linuxlist.h msgb.h select.h tlv.h gsm_04_11.h \
 | 
			
		||||
		 timer.h misdn.h chan_alloc.h telnet_interface.h paging.h \
 | 
			
		||||
		 subchan_demux.h trau_frame.h e1_input.h trau_mux.h signal.h \
 | 
			
		||||
		 gsm_utils.h ipaccess.h rs232.h openbscdefines.h rtp_proxy.h \
 | 
			
		||||
		 bsc_rll.h mncc.h talloc.h transaction.h ussd.h gsm_04_80.h \
 | 
			
		||||
		 silent_call.h mgcp.h meas_rep.h bitvec.h rest_octets.h \
 | 
			
		||||
		 system_information.h handover.h bssap.h bsc_msc.h bsc_nat.h
 | 
			
		||||
							
								
								
									
										822
									
								
								openbsc/include/openbsc/abis_nm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										822
									
								
								openbsc/include/openbsc/abis_nm.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,822 @@
 | 
			
		||||
/* GSM Network Management messages on the A-bis interface 
 | 
			
		||||
 * 3GPP TS 12.21 version 8.0.0 Release 1999 / ETSI TS 100 623 V8.0.0 */
 | 
			
		||||
 | 
			
		||||
/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _NM_H
 | 
			
		||||
#define _NM_H
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <openbsc/tlv.h>
 | 
			
		||||
 | 
			
		||||
/* PRIVATE */
 | 
			
		||||
 | 
			
		||||
/* generic header in front of every OML message according to TS 08.59 */
 | 
			
		||||
struct abis_om_hdr {
 | 
			
		||||
	u_int8_t	mdisc;
 | 
			
		||||
	u_int8_t	placement;
 | 
			
		||||
	u_int8_t	sequence;
 | 
			
		||||
	u_int8_t	length;
 | 
			
		||||
	u_int8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
#define ABIS_OM_MDISC_FOM		0x80
 | 
			
		||||
#define ABIS_OM_MDISC_MMI		0x40
 | 
			
		||||
#define ABIS_OM_MDISC_TRAU		0x20
 | 
			
		||||
#define ABIS_OM_MDISC_MANUF		0x10
 | 
			
		||||
#define ABIS_OM_PLACEMENT_ONLY		0x80
 | 
			
		||||
#define ABIS_OM_PLACEMENT_FIRST 	0x40
 | 
			
		||||
#define ABIS_OM_PLACEMENT_MIDDLE	0x20
 | 
			
		||||
#define ABIS_OM_PLACEMENT_LAST		0x10
 | 
			
		||||
 | 
			
		||||
struct abis_om_obj_inst {
 | 
			
		||||
	u_int8_t	bts_nr;
 | 
			
		||||
	u_int8_t	trx_nr;
 | 
			
		||||
	u_int8_t	ts_nr;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct abis_om_fom_hdr {
 | 
			
		||||
	u_int8_t	msg_type;
 | 
			
		||||
	u_int8_t	obj_class;
 | 
			
		||||
	struct abis_om_obj_inst	obj_inst;
 | 
			
		||||
	u_int8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
#define ABIS_OM_FOM_HDR_SIZE	(sizeof(struct abis_om_hdr) + sizeof(struct abis_om_fom_hdr))
 | 
			
		||||
 | 
			
		||||
/* Section 9.1: Message Types */
 | 
			
		||||
enum abis_nm_msgtype {
 | 
			
		||||
	/* SW Download Management Messages */
 | 
			
		||||
	NM_MT_LOAD_INIT			= 0x01,
 | 
			
		||||
	NM_MT_LOAD_INIT_ACK,
 | 
			
		||||
	NM_MT_LOAD_INIT_NACK,
 | 
			
		||||
	NM_MT_LOAD_SEG,
 | 
			
		||||
	NM_MT_LOAD_SEG_ACK,
 | 
			
		||||
	NM_MT_LOAD_ABORT,
 | 
			
		||||
	NM_MT_LOAD_END,
 | 
			
		||||
	NM_MT_LOAD_END_ACK,
 | 
			
		||||
	NM_MT_LOAD_END_NACK,
 | 
			
		||||
	NM_MT_SW_ACT_REQ,		/* BTS->BSC */
 | 
			
		||||
	NM_MT_SW_ACT_REQ_ACK,
 | 
			
		||||
	NM_MT_SW_ACT_REQ_NACK,
 | 
			
		||||
	NM_MT_ACTIVATE_SW,		/* BSC->BTS */
 | 
			
		||||
	NM_MT_ACTIVATE_SW_ACK,
 | 
			
		||||
	NM_MT_ACTIVATE_SW_NACK,
 | 
			
		||||
	NM_MT_SW_ACTIVATED_REP,		/* 0x10 */
 | 
			
		||||
	/* A-bis Interface Management Messages */
 | 
			
		||||
	NM_MT_ESTABLISH_TEI		= 0x21,
 | 
			
		||||
	NM_MT_ESTABLISH_TEI_ACK,
 | 
			
		||||
	NM_MT_ESTABLISH_TEI_NACK,
 | 
			
		||||
	NM_MT_CONN_TERR_SIGN,
 | 
			
		||||
	NM_MT_CONN_TERR_SIGN_ACK,
 | 
			
		||||
	NM_MT_CONN_TERR_SIGN_NACK,
 | 
			
		||||
	NM_MT_DISC_TERR_SIGN,
 | 
			
		||||
	NM_MT_DISC_TERR_SIGN_ACK,
 | 
			
		||||
	NM_MT_DISC_TERR_SIGN_NACK,
 | 
			
		||||
	NM_MT_CONN_TERR_TRAF,
 | 
			
		||||
	NM_MT_CONN_TERR_TRAF_ACK,
 | 
			
		||||
	NM_MT_CONN_TERR_TRAF_NACK,
 | 
			
		||||
	NM_MT_DISC_TERR_TRAF,
 | 
			
		||||
	NM_MT_DISC_TERR_TRAF_ACK,
 | 
			
		||||
	NM_MT_DISC_TERR_TRAF_NACK,
 | 
			
		||||
	/* Transmission Management Messages */
 | 
			
		||||
	NM_MT_CONN_MDROP_LINK		= 0x31,
 | 
			
		||||
	NM_MT_CONN_MDROP_LINK_ACK,
 | 
			
		||||
	NM_MT_CONN_MDROP_LINK_NACK,
 | 
			
		||||
	NM_MT_DISC_MDROP_LINK,
 | 
			
		||||
	NM_MT_DISC_MDROP_LINK_ACK,
 | 
			
		||||
	NM_MT_DISC_MDROP_LINK_NACK,
 | 
			
		||||
	/* Air Interface Management Messages */
 | 
			
		||||
	NM_MT_SET_BTS_ATTR		= 0x41,
 | 
			
		||||
	NM_MT_SET_BTS_ATTR_ACK,
 | 
			
		||||
	NM_MT_SET_BTS_ATTR_NACK,
 | 
			
		||||
	NM_MT_SET_RADIO_ATTR,
 | 
			
		||||
	NM_MT_SET_RADIO_ATTR_ACK,
 | 
			
		||||
	NM_MT_SET_RADIO_ATTR_NACK,
 | 
			
		||||
	NM_MT_SET_CHAN_ATTR,
 | 
			
		||||
	NM_MT_SET_CHAN_ATTR_ACK,
 | 
			
		||||
	NM_MT_SET_CHAN_ATTR_NACK,
 | 
			
		||||
	/* Test Management Messages */
 | 
			
		||||
	NM_MT_PERF_TEST			= 0x51,
 | 
			
		||||
	NM_MT_PERF_TEST_ACK,
 | 
			
		||||
	NM_MT_PERF_TEST_NACK,
 | 
			
		||||
	NM_MT_TEST_REP,
 | 
			
		||||
	NM_MT_SEND_TEST_REP,
 | 
			
		||||
	NM_MT_SEND_TEST_REP_ACK,
 | 
			
		||||
	NM_MT_SEND_TEST_REP_NACK,
 | 
			
		||||
	NM_MT_STOP_TEST,
 | 
			
		||||
	NM_MT_STOP_TEST_ACK,
 | 
			
		||||
	NM_MT_STOP_TEST_NACK,
 | 
			
		||||
	/* State Management and Event Report Messages */
 | 
			
		||||
	NM_MT_STATECHG_EVENT_REP	= 0x61,
 | 
			
		||||
	NM_MT_FAILURE_EVENT_REP,
 | 
			
		||||
	NM_MT_STOP_EVENT_REP,
 | 
			
		||||
	NM_MT_STOP_EVENT_REP_ACK,
 | 
			
		||||
	NM_MT_STOP_EVENT_REP_NACK,
 | 
			
		||||
	NM_MT_REST_EVENT_REP,
 | 
			
		||||
	NM_MT_REST_EVENT_REP_ACK,
 | 
			
		||||
	NM_MT_REST_EVENT_REP_NACK,
 | 
			
		||||
	NM_MT_CHG_ADM_STATE,
 | 
			
		||||
	NM_MT_CHG_ADM_STATE_ACK,
 | 
			
		||||
	NM_MT_CHG_ADM_STATE_NACK,
 | 
			
		||||
	NM_MT_CHG_ADM_STATE_REQ,
 | 
			
		||||
	NM_MT_CHG_ADM_STATE_REQ_ACK,
 | 
			
		||||
	NM_MT_CHG_ADM_STATE_REQ_NACK,
 | 
			
		||||
	NM_MT_REP_OUTST_ALARMS		= 0x93,
 | 
			
		||||
	NM_MT_REP_OUTST_ALARMS_ACK,
 | 
			
		||||
	NM_MT_REP_OUTST_ALARMS_NACK,
 | 
			
		||||
	/* Equipment Management Messages */
 | 
			
		||||
	NM_MT_CHANGEOVER		= 0x71,
 | 
			
		||||
	NM_MT_CHANGEOVER_ACK,
 | 
			
		||||
	NM_MT_CHANGEOVER_NACK,
 | 
			
		||||
	NM_MT_OPSTART,
 | 
			
		||||
	NM_MT_OPSTART_ACK,
 | 
			
		||||
	NM_MT_OPSTART_NACK,
 | 
			
		||||
	NM_MT_REINIT,
 | 
			
		||||
	NM_MT_REINIT_ACK,
 | 
			
		||||
	NM_MT_REINIT_NACK,
 | 
			
		||||
	NM_MT_SET_SITE_OUT,		/* BS11: get alarm ?!? */
 | 
			
		||||
	NM_MT_SET_SITE_OUT_ACK,
 | 
			
		||||
	NM_MT_SET_SITE_OUT_NACK,
 | 
			
		||||
	NM_MT_CHG_HW_CONF		= 0x90,
 | 
			
		||||
	NM_MT_CHG_HW_CONF_ACK,
 | 
			
		||||
	NM_MT_CHG_HW_CONF_NACK,
 | 
			
		||||
	/* Measurement Management Messages */
 | 
			
		||||
	NM_MT_MEAS_RES_REQ		= 0x8a,
 | 
			
		||||
	NM_MT_MEAS_RES_RESP,
 | 
			
		||||
	NM_MT_STOP_MEAS,
 | 
			
		||||
	NM_MT_START_MEAS,
 | 
			
		||||
	/* Other Messages */
 | 
			
		||||
	NM_MT_GET_ATTR			= 0x81,
 | 
			
		||||
	NM_MT_GET_ATTR_RESP,
 | 
			
		||||
	NM_MT_GET_ATTR_NACK,
 | 
			
		||||
	NM_MT_SET_ALARM_THRES,
 | 
			
		||||
	NM_MT_SET_ALARM_THRES_ACK,
 | 
			
		||||
	NM_MT_SET_ALARM_THRES_NACK,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_nm_msgtype_bs11 {
 | 
			
		||||
	NM_MT_BS11_RESET_RESOURCE	= 0x74,
 | 
			
		||||
 | 
			
		||||
	NM_MT_BS11_BEGIN_DB_TX		= 0xa3,
 | 
			
		||||
	NM_MT_BS11_BEGIN_DB_TX_ACK,
 | 
			
		||||
	NM_MT_BS11_BEGIN_DB_TX_NACK,
 | 
			
		||||
	NM_MT_BS11_END_DB_TX		= 0xa6,
 | 
			
		||||
	NM_MT_BS11_END_DB_TX_ACK,
 | 
			
		||||
	NM_MT_BS11_END_DB_TX_NACK,
 | 
			
		||||
	NM_MT_BS11_CREATE_OBJ		= 0xa9,
 | 
			
		||||
	NM_MT_BS11_CREATE_OBJ_ACK,
 | 
			
		||||
	NM_MT_BS11_CREATE_OBJ_NACK,
 | 
			
		||||
	NM_MT_BS11_DELETE_OBJ		= 0xac,
 | 
			
		||||
	NM_MT_BS11_DELETE_OBJ_ACK,
 | 
			
		||||
	NM_MT_BS11_DELETE_OBJ_NACK,
 | 
			
		||||
 | 
			
		||||
	NM_MT_BS11_SET_ATTR		= 0xd0,
 | 
			
		||||
	NM_MT_BS11_SET_ATTR_ACK,
 | 
			
		||||
	NM_MT_BS11_SET_ATTR_NACK,
 | 
			
		||||
	NM_MT_BS11_LMT_SESSION		= 0xdc,
 | 
			
		||||
 | 
			
		||||
	NM_MT_BS11_GET_STATE		= 0xe3,
 | 
			
		||||
	NM_MT_BS11_GET_STATE_ACK,
 | 
			
		||||
	NM_MT_BS11_LMT_LOGON		= 0xe5,
 | 
			
		||||
	NM_MT_BS11_LMT_LOGON_ACK,
 | 
			
		||||
	NM_MT_BS11_RESTART		= 0xe7,
 | 
			
		||||
	NM_MT_BS11_RESTART_ACK,
 | 
			
		||||
	NM_MT_BS11_DISCONNECT		= 0xe9,
 | 
			
		||||
	NM_MT_BS11_DISCONNECT_ACK,
 | 
			
		||||
	NM_MT_BS11_LMT_LOGOFF		= 0xec,
 | 
			
		||||
	NM_MT_BS11_LMT_LOGOFF_ACK,
 | 
			
		||||
	NM_MT_BS11_RECONNECT		= 0xf1,
 | 
			
		||||
	NM_MT_BS11_RECONNECT_ACK,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_nm_msgtype_ipacc {
 | 
			
		||||
	NM_MT_IPACC_RESTART		= 0x87,
 | 
			
		||||
	NM_MT_IPACC_RESTART_ACK,
 | 
			
		||||
	NM_MT_IPACC_RSL_CONNECT		= 0xe0,
 | 
			
		||||
	NM_MT_IPACC_RSL_CONNECT_ACK,
 | 
			
		||||
	NM_MT_IPACC_RSL_CONNECT_NACK,
 | 
			
		||||
	NM_MT_IPACC_RSL_DISCONNECT	= 0xe3,
 | 
			
		||||
	NM_MT_IPACC_RSL_DISCONNECT_ACK,
 | 
			
		||||
	NM_MT_IPACC_RSL_DISCONNECT_NACK,
 | 
			
		||||
	NM_MT_IPACC_CONN_TRAF		= 0xe6,
 | 
			
		||||
	NM_MT_IPACC_CONN_TRAF_ACK,
 | 
			
		||||
	NM_MT_IPACC_CONN_TRAF_NACK,
 | 
			
		||||
	NM_MT_IPACC_DEF_BOOT_SW		= 0xec,
 | 
			
		||||
	NM_MT_IPACC_DEF_BOOT_SW_ACK,
 | 
			
		||||
	MN_MT_IPACC_DEF_BOOT_SW_NACK,
 | 
			
		||||
	NM_MT_IPACC_SET_NVATTR		= 0xef,
 | 
			
		||||
	NM_MT_IPACC_SET_NVATTR_ACK,
 | 
			
		||||
	NM_MT_IPACC_SET_NVATTR_NACK,
 | 
			
		||||
	NM_MT_IPACC_GET_NVATTR		= 0xf2,
 | 
			
		||||
	NM_MT_IPACC_GET_NVATTR_ACK,
 | 
			
		||||
	NM_MT_IPACC_GET_NVATTR_NACK,
 | 
			
		||||
	NM_MT_IPACC_SET_ATTR		= 0xf5,
 | 
			
		||||
	NM_MT_IPACC_SET_ATTR_ACK,
 | 
			
		||||
	NM_MT_IPACC_SET_ATTR_NACK,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_nm_bs11_cell_alloc {
 | 
			
		||||
	NM_BS11_CANR_GSM	= 0x00,
 | 
			
		||||
	NM_BS11_CANR_DCS1800	= 0x01,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.2: Object Class */
 | 
			
		||||
enum abis_nm_obj_class {
 | 
			
		||||
	NM_OC_SITE_MANAGER		= 0x00,
 | 
			
		||||
	NM_OC_BTS,
 | 
			
		||||
	NM_OC_RADIO_CARRIER,
 | 
			
		||||
	NM_OC_CHANNEL,
 | 
			
		||||
	NM_OC_BASEB_TRANSC,
 | 
			
		||||
	/* RFU: 05-FE */
 | 
			
		||||
 | 
			
		||||
	NM_OC_IPAC_E1_TRUNK		= 0x0e,
 | 
			
		||||
	NM_OC_IPAC_E1_PORT		= 0x0f,
 | 
			
		||||
	NM_OC_IPAC_E1_CHAN		= 0x10,
 | 
			
		||||
	NM_OC_IPAC_CLK_MODULE		= 0x22,
 | 
			
		||||
 | 
			
		||||
	NM_OC_BS11_ADJC			= 0xa0,
 | 
			
		||||
	NM_OC_BS11_HANDOVER		= 0xa1,
 | 
			
		||||
	NM_OC_BS11_PWR_CTRL		= 0xa2,
 | 
			
		||||
	NM_OC_BS11_BTSE			= 0xa3,		/* LMT? */
 | 
			
		||||
	NM_OC_BS11_RACK			= 0xa4,
 | 
			
		||||
	NM_OC_BS11			= 0xa5,		/* 01: ALCO */
 | 
			
		||||
	NM_OC_BS11_TEST			= 0xa6,
 | 
			
		||||
	NM_OC_BS11_ENVABTSE		= 0xa8,
 | 
			
		||||
	NM_OC_BS11_BPORT		= 0xa9,
 | 
			
		||||
 | 
			
		||||
	NM_OC_GPRS_NSE			= 0xf0,
 | 
			
		||||
	NM_OC_GPRS_CELL			= 0xf1,
 | 
			
		||||
	NM_OC_GPRS_NSVC			= 0xf2,
 | 
			
		||||
 | 
			
		||||
	NM_OC_NULL			= 0xff,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4: Attributes */
 | 
			
		||||
enum abis_nm_attr {
 | 
			
		||||
	NM_ATT_ABIS_CHANNEL	= 0x01,
 | 
			
		||||
	NM_ATT_ADD_INFO,
 | 
			
		||||
	NM_ATT_ADD_TEXT,
 | 
			
		||||
	NM_ATT_ADM_STATE,
 | 
			
		||||
	NM_ATT_ARFCN_LIST,
 | 
			
		||||
	NM_ATT_AUTON_REPORT,
 | 
			
		||||
	NM_ATT_AVAIL_STATUS,
 | 
			
		||||
	NM_ATT_BCCH_ARFCN,
 | 
			
		||||
	NM_ATT_BSIC,
 | 
			
		||||
	NM_ATT_BTS_AIR_TIMER,
 | 
			
		||||
	NM_ATT_CCCH_L_I_P,
 | 
			
		||||
	NM_ATT_CCCH_L_T,
 | 
			
		||||
	NM_ATT_CHAN_COMB,
 | 
			
		||||
	NM_ATT_CONN_FAIL_CRIT,
 | 
			
		||||
	NM_ATT_DEST,
 | 
			
		||||
	/* res */
 | 
			
		||||
	NM_ATT_EVENT_TYPE	= 0x11, /* BS11: file data ?!? */
 | 
			
		||||
	NM_ATT_FILE_ID,
 | 
			
		||||
	NM_ATT_FILE_VERSION,
 | 
			
		||||
	NM_ATT_GSM_TIME,
 | 
			
		||||
	NM_ATT_HSN,
 | 
			
		||||
	NM_ATT_HW_CONFIG,
 | 
			
		||||
	NM_ATT_HW_DESC,
 | 
			
		||||
	NM_ATT_INTAVE_PARAM,
 | 
			
		||||
	NM_ATT_INTERF_BOUND,
 | 
			
		||||
	NM_ATT_LIST_REQ_ATTR,
 | 
			
		||||
	NM_ATT_MAIO,
 | 
			
		||||
	NM_ATT_MANUF_STATE,
 | 
			
		||||
	NM_ATT_MANUF_THRESH,
 | 
			
		||||
	NM_ATT_MANUF_ID,
 | 
			
		||||
	NM_ATT_MAX_TA,
 | 
			
		||||
	NM_ATT_MDROP_LINK,	/* 0x20 */
 | 
			
		||||
	NM_ATT_MDROP_NEXT,
 | 
			
		||||
	NM_ATT_NACK_CAUSES,
 | 
			
		||||
	NM_ATT_NY1,
 | 
			
		||||
	NM_ATT_OPER_STATE,
 | 
			
		||||
	NM_ATT_OVERL_PERIOD,
 | 
			
		||||
	NM_ATT_PHYS_CONF,
 | 
			
		||||
	NM_ATT_POWER_CLASS,
 | 
			
		||||
	NM_ATT_POWER_THRESH,
 | 
			
		||||
	NM_ATT_PROB_CAUSE,
 | 
			
		||||
	NM_ATT_RACH_B_THRESH,
 | 
			
		||||
	NM_ATT_LDAVG_SLOTS,
 | 
			
		||||
	NM_ATT_RAD_SUBC,
 | 
			
		||||
	NM_ATT_RF_MAXPOWR_R,
 | 
			
		||||
	NM_ATT_SITE_INPUTS,
 | 
			
		||||
	NM_ATT_SITE_OUTPUTS,
 | 
			
		||||
	NM_ATT_SOURCE,		/* 0x30 */
 | 
			
		||||
	NM_ATT_SPEC_PROB,
 | 
			
		||||
	NM_ATT_START_TIME,
 | 
			
		||||
	NM_ATT_T200,
 | 
			
		||||
	NM_ATT_TEI,
 | 
			
		||||
	NM_ATT_TEST_DUR,
 | 
			
		||||
	NM_ATT_TEST_NO,
 | 
			
		||||
	NM_ATT_TEST_REPORT,
 | 
			
		||||
	NM_ATT_VSWR_THRESH,
 | 
			
		||||
	NM_ATT_WINDOW_SIZE,
 | 
			
		||||
	/* Res  */
 | 
			
		||||
	NM_ATT_BS11_RSSI_OFFS	= 0x3d,
 | 
			
		||||
	NM_ATT_BS11_TXPWR	= 0x3e,
 | 
			
		||||
	NM_ATT_BS11_DIVERSITY	= 0x3f,
 | 
			
		||||
	/* Res  */
 | 
			
		||||
	NM_ATT_TSC		= 0x40,
 | 
			
		||||
	NM_ATT_SW_CONFIG,
 | 
			
		||||
	NM_ATT_SW_DESCR,
 | 
			
		||||
	NM_ATT_SEVERITY,
 | 
			
		||||
	NM_ATT_GET_ARI,
 | 
			
		||||
	NM_ATT_HW_CONF_CHG,
 | 
			
		||||
	NM_ATT_OUTST_ALARM,
 | 
			
		||||
	NM_ATT_FILE_DATA,
 | 
			
		||||
	NM_ATT_MEAS_RES,
 | 
			
		||||
	NM_ATT_MEAS_TYPE,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_ESN_FW_CODE_NO	= 0x4c,
 | 
			
		||||
	NM_ATT_BS11_ESN_HW_CODE_NO	= 0x4f,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_ESN_PCB_SERIAL	= 0x55,
 | 
			
		||||
	NM_ATT_BS11_EXCESSIVE_DISTANCE	= 0x58,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_ALL_TEST_CATG	= 0x60,
 | 
			
		||||
	NM_ATT_BS11_BTSLS_HOPPING,
 | 
			
		||||
	NM_ATT_BS11_CELL_ALLOC_NR,
 | 
			
		||||
	NM_ATT_BS11_CELL_GLOBAL_ID,
 | 
			
		||||
	NM_ATT_BS11_ENA_INTERF_CLASS	= 0x66,
 | 
			
		||||
	NM_ATT_BS11_ENA_INT_INTEC_HANDO	= 0x67,
 | 
			
		||||
	NM_ATT_BS11_ENA_INT_INTRC_HANDO	= 0x68,
 | 
			
		||||
	NM_ATT_BS11_ENA_MS_PWR_CTRL	= 0x69,
 | 
			
		||||
	NM_ATT_BS11_ENA_PWR_BDGT_HO	= 0x6a,
 | 
			
		||||
	NM_ATT_BS11_ENA_PWR_CTRL_RLFW	= 0x6b,
 | 
			
		||||
	NM_ATT_BS11_ENA_RXLEV_HO	= 0x6c,
 | 
			
		||||
	NM_ATT_BS11_ENA_RXQUAL_HO	= 0x6d,
 | 
			
		||||
	NM_ATT_BS11_FACCH_QUAL		= 0x6e,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_IPACC_DST_IP		= 0x80,
 | 
			
		||||
	NM_ATT_IPACC_DST_IP_PORT	= 0x81,
 | 
			
		||||
	NM_ATT_IPACC_SSRC		= 0x82,
 | 
			
		||||
	NM_ATT_IPACC_RTP_PAYLD_TYPE	= 0x83,
 | 
			
		||||
	NM_ATT_IPACC_BASEB_ID		= 0x84,
 | 
			
		||||
	NM_ATT_IPACC_STREAM_ID		= 0x85,
 | 
			
		||||
	NM_ATT_IPACC_NV_FLAGS		= 0x86,
 | 
			
		||||
	NM_ATT_IPACC_FREQ_CTRL		= 0x87,
 | 
			
		||||
	NM_ATT_IPACC_PRIM_OML_CFG	= 0x88,
 | 
			
		||||
	NM_ATT_IPACC_SEC_OML_CFG	= 0x89,
 | 
			
		||||
	NM_ATT_IPACC_IP_IF_CFG		= 0x8a,		/* IP interface */
 | 
			
		||||
	NM_ATT_IPACC_IP_GW_CFG		= 0x8b,		/* IP gateway */
 | 
			
		||||
	NM_ATT_IPACC_IN_SERV_TIME	= 0x8c,
 | 
			
		||||
	NM_ATT_IPACC_TRX_BTS_ASS	= 0x8d,
 | 
			
		||||
	NM_ATT_IPACC_LOCATION		= 0x8e,		/* string describing location */
 | 
			
		||||
	NM_ATT_IPACC_PAGING_CFG		= 0x8f,
 | 
			
		||||
	NM_ATT_IPACC_FILE_DATA		= 0x90,
 | 
			
		||||
	NM_ATT_IPACC_UNIT_ID		= 0x91,		/* Site/BTS/TRX */
 | 
			
		||||
	NM_ATT_IPACC_PARENT_UNIT_ID	= 0x92,
 | 
			
		||||
	NM_ATT_IPACC_UNIT_NAME		= 0x93,		/* default: nbts-<mac-as-string> */
 | 
			
		||||
	NM_ATT_IPACC_SNMP_CFG		= 0x94,
 | 
			
		||||
	NM_ATT_IPACC_PRIM_OML_CFG_LIST	= 0x95,
 | 
			
		||||
	NM_ATT_IPACC_PRIM_OML_FB_TOUT	= 0x96,
 | 
			
		||||
	NM_ATT_IPACC_CUR_SW_CFG		= 0x97,
 | 
			
		||||
	NM_ATT_IPACC_TIMING_BUS		= 0x98,
 | 
			
		||||
	NM_ATT_IPACC_CGI		= 0x99,
 | 
			
		||||
	NM_ATT_IPACC_RAC		= 0x9a,
 | 
			
		||||
	NM_ATT_IPACC_OBJ_VERSION	= 0x9b,
 | 
			
		||||
	NM_ATT_IPACC_GPRS_PAGING_CFG	= 0x9c,
 | 
			
		||||
	NM_ATT_IPACC_NSEI		= 0x9d,
 | 
			
		||||
	NM_ATT_IPACC_BVCI		= 0x9e,
 | 
			
		||||
	NM_ATT_IPACC_NSVCI		= 0x9f,
 | 
			
		||||
	NM_ATT_IPACC_NS_CFG		= 0xa0,
 | 
			
		||||
	NM_ATT_IPACC_BSSGP_CFG		= 0xa1,
 | 
			
		||||
	NM_ATT_IPACC_NS_LINK_CFG	= 0xa2,
 | 
			
		||||
	NM_ATT_IPACC_RLC_CFG		= 0xa3,	
 | 
			
		||||
	NM_ATT_IPACC_ALM_THRESH_LIST	= 0xa4,
 | 
			
		||||
	NM_ATT_IPACC_MONIT_VAL_LIST	= 0xa5,
 | 
			
		||||
	NM_ATT_IPACC_TIB_CONTROL	= 0xa6,
 | 
			
		||||
	NM_ATT_IPACC_SUPP_FEATURES	= 0xa7,
 | 
			
		||||
	NM_ATT_IPACC_CODING_SCHEMES	= 0xa8,
 | 
			
		||||
	NM_ATT_IPACC_RLC_CFG_2		= 0xa9,
 | 
			
		||||
	NM_ATT_IPACC_HEARTB_TOUT	= 0xaa,
 | 
			
		||||
	NM_ATT_IPACC_UPTIME		= 0xab,
 | 
			
		||||
	NM_ATT_IPACC_RLC_CFG_3		= 0xac,
 | 
			
		||||
	NM_ATT_IPACC_SSL_CFG		= 0xad,
 | 
			
		||||
	NM_ATT_IPACC_SEC_POSSIBLE	= 0xae,
 | 
			
		||||
	NM_ATT_IPACC_IML_SSL_STATE	= 0xaf,
 | 
			
		||||
	NM_ATT_IPACC_REVOC_DATE		= 0xb0,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_RF_RES_IND_PER	= 0x8f,
 | 
			
		||||
	
 | 
			
		||||
	NM_ATT_BS11_RX_LEV_MIN_CELL	= 0x90,
 | 
			
		||||
	NM_ATT_BS11_ABIS_EXT_TIME	= 0x91,
 | 
			
		||||
	NM_ATT_BS11_TIMER_HO_REQUEST	= 0x92,
 | 
			
		||||
	NM_ATT_BS11_TIMER_NCELL		= 0x93,
 | 
			
		||||
	NM_ATT_BS11_TSYNC		= 0x94,
 | 
			
		||||
	NM_ATT_BS11_TTRAU		= 0x95,
 | 
			
		||||
	NM_ATT_BS11_EMRG_CFG_MEMBER	= 0x9b,
 | 
			
		||||
	NM_ATT_BS11_TRX_AREA		= 0x9f,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_BCCH_RECONF		= 0xd7,
 | 
			
		||||
	NM_ATT_BS11_BIT_ERR_THESH	= 0xa0,
 | 
			
		||||
	NM_ATT_BS11_BOOT_SW_VERS	= 0xa1,
 | 
			
		||||
	NM_ATT_BS11_CCLK_ACCURACY	= 0xa3,
 | 
			
		||||
	NM_ATT_BS11_CCLK_TYPE		= 0xa4,
 | 
			
		||||
	NM_ATT_BS11_INP_IMPEDANCE	= 0xaa,
 | 
			
		||||
	NM_ATT_BS11_L1_PROT_TYPE	= 0xab,
 | 
			
		||||
	NM_ATT_BS11_LINE_CFG		= 0xac,
 | 
			
		||||
	NM_ATT_BS11_LI_PORT_1		= 0xad,
 | 
			
		||||
	NM_ATT_BS11_LI_PORT_2		= 0xae,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_L1_REM_ALM_TYPE	= 0xb0,
 | 
			
		||||
	NM_ATT_BS11_SW_LOAD_INTENDED	= 0xbb,
 | 
			
		||||
	NM_ATT_BS11_SW_LOAD_SAFETY	= 0xbc,
 | 
			
		||||
	NM_ATT_BS11_SW_LOAD_STORED	= 0xbd,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_VENDOR_NAME		= 0xc1,
 | 
			
		||||
	NM_ATT_BS11_HOPPING_MODE	= 0xc5,
 | 
			
		||||
	NM_ATT_BS11_LMT_LOGON_SESSION	= 0xc6,
 | 
			
		||||
	NM_ATT_BS11_LMT_LOGIN_TIME	= 0xc7,
 | 
			
		||||
	NM_ATT_BS11_LMT_USER_ACC_LEV	= 0xc8,
 | 
			
		||||
	NM_ATT_BS11_LMT_USER_NAME	= 0xc9,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_L1_CONTROL_TS	= 0xd8,
 | 
			
		||||
	NM_ATT_BS11_RADIO_MEAS_GRAN	= 0xdc,	/* in SACCH multiframes */
 | 
			
		||||
	NM_ATT_BS11_RADIO_MEAS_REP	= 0xdd,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_SH_LAPD_INT_TIMER	= 0xe8,
 | 
			
		||||
 | 
			
		||||
	NM_ATT_BS11_BTS_STATE		= 0xf0,
 | 
			
		||||
	NM_ATT_BS11_E1_STATE		= 0xf1,
 | 
			
		||||
	NM_ATT_BS11_PLL			= 0xf2,
 | 
			
		||||
	NM_ATT_BS11_RX_OFFSET		= 0xf3,
 | 
			
		||||
	NM_ATT_BS11_ANT_TYPE		= 0xf4,
 | 
			
		||||
	NM_ATT_BS11_PLL_MODE		= 0xfc,
 | 
			
		||||
	NM_ATT_BS11_PASSWORD		= 0xfd,
 | 
			
		||||
};
 | 
			
		||||
#define NM_ATT_BS11_FILE_DATA	NM_ATT_EVENT_TYPE
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.4: Administrative State */
 | 
			
		||||
enum abis_nm_adm_state {
 | 
			
		||||
	NM_STATE_LOCKED		= 0x01,
 | 
			
		||||
	NM_STATE_UNLOCKED	= 0x02,
 | 
			
		||||
	NM_STATE_SHUTDOWN	= 0x03,
 | 
			
		||||
	NM_STATE_NULL		= 0xff,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.7: Administrative State */
 | 
			
		||||
enum abis_nm_avail_state {
 | 
			
		||||
	NM_AVSTATE_IN_TEST	= 1,
 | 
			
		||||
	NM_AVSTATE_POWER_OFF	= 2,
 | 
			
		||||
	NM_AVSTATE_OFF_LINE	= 3,
 | 
			
		||||
	NM_AVSTATE_DEPENDENCY	= 5,
 | 
			
		||||
	NM_AVSTATE_DEGRADED	= 6,
 | 
			
		||||
	NM_AVSTATE_NOT_INSTALLED= 7,
 | 
			
		||||
	NM_AVSTATE_OK		= 0xff,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.13: Channel Combination */
 | 
			
		||||
enum abis_nm_chan_comb {
 | 
			
		||||
	NM_CHANC_TCHFull	= 0x00,	/* TCH/F + TCH/H + SACCH/TF */
 | 
			
		||||
	NM_CHANC_TCHHalf	= 0x01, /* TCH/H(0,1) + FACCH/H(0,1) +
 | 
			
		||||
					   SACCH/TH(0,1) */
 | 
			
		||||
	NM_CHANC_TCHHalf2	= 0x02, /* TCH/H(0) + FACCH/H(0) + SACCH/TH(0) +
 | 
			
		||||
					   TCH/H(1) */
 | 
			
		||||
	NM_CHANC_SDCCH		= 0x03,	/* SDCCH/8 + SACCH/8 */
 | 
			
		||||
	NM_CHANC_mainBCCH	= 0x04,	/* FCCH + SCH + BCCH + CCCH */
 | 
			
		||||
	NM_CHANC_BCCHComb	= 0x05,	/* FCCH + SCH + BCCH + CCCH + SDCCH/4 +
 | 
			
		||||
					   SACCH/C4 */
 | 
			
		||||
	NM_CHANC_BCCH		= 0x06,	/* BCCH + CCCH */
 | 
			
		||||
	NM_CHANC_BCCH_CBCH	= 0x07,	/* CHANC_BCCHComb + CBCH */
 | 
			
		||||
	NM_CHANC_SDCCH_CBCH	= 0x08,	/* CHANC_SDCCH8 + CBCH */
 | 
			
		||||
	/* ip.access */
 | 
			
		||||
	NM_CHANC_IPAC_bPDCH	= 0x0b,	/* PBCCH + PCCCH + PDTCH/F + PACCH/F +
 | 
			
		||||
					   PTCCH/F */
 | 
			
		||||
	NM_CHANC_IPAC_cPDCH	= 0x0c, /* PBCCH + PDTCH/F + PACCH/F + PTCCH/F */
 | 
			
		||||
	NM_CHANC_IPAC_PDCH	= 0x0d,	/* PDTCH/F + PACCH/F + PTCCH/F */
 | 
			
		||||
	NM_CHANC_IPAC_TCHFull_PDCH = 0x80,
 | 
			
		||||
	NM_CHANC_IPAC_TCHFull_TCHHalf = 0x81,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.16: Event Type */
 | 
			
		||||
enum abis_nm_event_type {
 | 
			
		||||
	NM_EVT_COMM_FAIL	= 0x00,
 | 
			
		||||
	NM_EVT_QOS_FAIL		= 0x01,
 | 
			
		||||
	NM_EVT_PROC_FAIL	= 0x02,
 | 
			
		||||
	NM_EVT_EQUIP_FAIL	= 0x03,
 | 
			
		||||
	NM_EVT_ENV_FAIL		= 0x04,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section: 9.4.63: Perceived Severity */
 | 
			
		||||
enum abis_nm_severity {
 | 
			
		||||
	NM_SEVER_CEASED		= 0x00,
 | 
			
		||||
	NM_SEVER_CRITICAL	= 0x01,
 | 
			
		||||
	NM_SEVER_MAJOR		= 0x02,
 | 
			
		||||
	NM_SEVER_MINOR		= 0x03,
 | 
			
		||||
	NM_SEVER_WARNING	= 0x04,
 | 
			
		||||
	NM_SEVER_INDETERMINATE	= 0x05,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.43: Probable Cause Type */
 | 
			
		||||
enum abis_nm_pcause_type {
 | 
			
		||||
	NM_PCAUSE_T_X721	= 0x01,
 | 
			
		||||
	NM_PCAUSE_T_GSM		= 0x02,
 | 
			
		||||
	NM_PCAUSE_T_MANUF	= 0x03,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.36: NACK Causes */
 | 
			
		||||
enum abis_nm_nack_cause {
 | 
			
		||||
	/* General Nack Causes */
 | 
			
		||||
	NM_NACK_INCORR_STRUCT		= 0x01,
 | 
			
		||||
	NM_NACK_MSGTYPE_INVAL		= 0x02,
 | 
			
		||||
	NM_NACK_OBJCLASS_INVAL		= 0x05,
 | 
			
		||||
	NM_NACK_OBJCLASS_NOTSUPP	= 0x06,
 | 
			
		||||
	NM_NACK_BTSNR_UNKN		= 0x07,
 | 
			
		||||
	NM_NACK_TRXNR_UNKN		= 0x08,
 | 
			
		||||
	NM_NACK_OBJINST_UNKN		= 0x09,
 | 
			
		||||
	NM_NACK_ATTRID_INVAL		= 0x0c,
 | 
			
		||||
	NM_NACK_ATTRID_NOTSUPP		= 0x0d,
 | 
			
		||||
	NM_NACK_PARAM_RANGE		= 0x0e,
 | 
			
		||||
	NM_NACK_ATTRLIST_INCONSISTENT	= 0x0f,
 | 
			
		||||
	NM_NACK_SPEC_IMPL_NOTSUPP	= 0x10,
 | 
			
		||||
	NM_NACK_CANT_PERFORM		= 0x11,
 | 
			
		||||
	/* Specific Nack Causes */
 | 
			
		||||
	NM_NACK_RES_NOTIMPL		= 0x19,
 | 
			
		||||
	NM_NACK_RES_NOTAVAIL		= 0x1a,
 | 
			
		||||
	NM_NACK_FREQ_NOTAVAIL		= 0x1b,
 | 
			
		||||
	NM_NACK_TEST_NOTSUPP		= 0x1c,
 | 
			
		||||
	NM_NACK_CAPACITY_RESTR		= 0x1d,
 | 
			
		||||
	NM_NACK_PHYSCFG_NOTPERFORM	= 0x1e,
 | 
			
		||||
	NM_NACK_TEST_NOTINIT		= 0x1f,
 | 
			
		||||
	NM_NACK_PHYSCFG_NOTRESTORE	= 0x20,
 | 
			
		||||
	NM_NACK_TEST_NOSUCH		= 0x21,
 | 
			
		||||
	NM_NACK_TEST_NOSTOP		= 0x22,
 | 
			
		||||
	NM_NACK_MSGINCONSIST_PHYSCFG	= 0x23,
 | 
			
		||||
	NM_NACK_FILE_INCOMPLETE		= 0x25,
 | 
			
		||||
	NM_NACK_FILE_NOTAVAIL		= 0x26,
 | 
			
		||||
	NM_NACK_FILE_NOTACTIVATE	= 0x27,
 | 
			
		||||
	NM_NACK_REQ_NOT_GRANT		= 0x28,
 | 
			
		||||
	NM_NACK_WAIT			= 0x29,
 | 
			
		||||
	NM_NACK_NOTH_REPORT_EXIST	= 0x2a,
 | 
			
		||||
	NM_NACK_MEAS_NOTSUPP		= 0x2b,
 | 
			
		||||
	NM_NACK_MEAS_NOTSTART		= 0x2c,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 9.4.1 */
 | 
			
		||||
struct abis_nm_channel {
 | 
			
		||||
	u_int8_t	attrib;
 | 
			
		||||
	u_int8_t	bts_port;
 | 
			
		||||
	u_int8_t	timeslot;
 | 
			
		||||
	u_int8_t	subslot;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Siemens BS-11 specific objects in the SienemsHW (0xA5) object class */
 | 
			
		||||
enum abis_bs11_objtype {
 | 
			
		||||
	BS11_OBJ_ALCO		= 0x01,
 | 
			
		||||
	BS11_OBJ_BBSIG		= 0x02,	/* obj_class: 0,1 */
 | 
			
		||||
	BS11_OBJ_TRX1		= 0x03,	/* only DEACTIVATE TRX1 */
 | 
			
		||||
	BS11_OBJ_CCLK		= 0x04,
 | 
			
		||||
	BS11_OBJ_GPSU		= 0x06,
 | 
			
		||||
	BS11_OBJ_LI		= 0x07,
 | 
			
		||||
	BS11_OBJ_PA		= 0x09,	/* obj_class: 0, 1*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_bs11_trx_power {
 | 
			
		||||
	BS11_TRX_POWER_GSM_2W	= 0x06,
 | 
			
		||||
	BS11_TRX_POWER_GSM_250mW= 0x07,
 | 
			
		||||
	BS11_TRX_POWER_GSM_80mW	= 0x08,
 | 
			
		||||
	BS11_TRX_POWER_GSM_30mW	= 0x09,
 | 
			
		||||
	BS11_TRX_POWER_DCS_3W	= 0x0a,
 | 
			
		||||
	BS11_TRX_POWER_DCS_1W6	= 0x0b,
 | 
			
		||||
	BS11_TRX_POWER_DCS_500mW= 0x0c,
 | 
			
		||||
	BS11_TRX_POWER_DCS_160mW= 0x0d,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_bs11_li_pll_mode {
 | 
			
		||||
	BS11_LI_PLL_LOCKED	= 2,
 | 
			
		||||
	BS11_LI_PLL_STANDALONE	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_bs11_line_cfg {
 | 
			
		||||
	BS11_LINE_CFG_STAR	= 0x00,
 | 
			
		||||
	BS11_LINE_CFG_MULTIDROP	= 0x01,
 | 
			
		||||
	BS11_LINE_CFG_LOOP	= 0x02,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_bs11_phase {
 | 
			
		||||
	BS11_STATE_SOFTWARE_RQD		= 0x01,
 | 
			
		||||
	BS11_STATE_LOAD_SMU_INTENDED	= 0x11,
 | 
			
		||||
	BS11_STATE_LOAD_SMU_SAFETY	= 0x21,
 | 
			
		||||
	BS11_STATE_LOAD_FAILED		= 0x31,
 | 
			
		||||
	BS11_STATE_LOAD_DIAGNOSTIC	= 0x41,
 | 
			
		||||
	BS11_STATE_WARM_UP		= 0x51,
 | 
			
		||||
	BS11_STATE_WARM_UP_2		= 0x52,
 | 
			
		||||
	BS11_STATE_WAIT_MIN_CFG		= 0x62,
 | 
			
		||||
	BS11_STATE_MAINTENANCE		= 0x72,
 | 
			
		||||
	BS11_STATE_LOAD_MBCCU		= 0x92,
 | 
			
		||||
	BS11_STATE_WAIT_MIN_CFG_2	= 0xA2,
 | 
			
		||||
	BS11_STATE_NORMAL		= 0x03,
 | 
			
		||||
	BS11_STATE_ABIS_LOAD		= 0x13,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_nm_ipacc_test_no {
 | 
			
		||||
	NM_IPACC_TESTNO_RLOOP_ANT	= 0x01,
 | 
			
		||||
	NM_IPACC_TESTNO_RLOOP_XCVR	= 0x02,
 | 
			
		||||
	NM_IPACC_TESTNO_FUNC_OBJ	= 0x03,
 | 
			
		||||
	NM_IPACC_TESTNO_CHAN_USAGE	= 0x40,
 | 
			
		||||
	NM_IPACC_TESTNO_BCCH_CHAN_USAGE	= 0x41,
 | 
			
		||||
	NM_IPACC_TESTNO_FREQ_SYNC	= 0x42,
 | 
			
		||||
	NM_IPACC_TESTNO_BCCH_INFO	= 0x43,
 | 
			
		||||
	NM_IPACC_TESTNO_TX_BEACON	= 0x44,
 | 
			
		||||
	NM_IPACC_TESTNO_SYSINFO_MONITOR	= 0x45,
 | 
			
		||||
	NM_IPACC_TESTNO_BCCCH_MONITOR	= 0x46,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* first byte after length inside NM_ATT_TEST_REPORT */
 | 
			
		||||
enum abis_nm_ipacc_test_res {
 | 
			
		||||
	NM_IPACC_TESTRES_SUCCESS	= 0,
 | 
			
		||||
	NM_IPACC_TESTRES_TIMEOUT	= 1,
 | 
			
		||||
	NM_IPACC_TESTRES_NO_CHANS	= 2,
 | 
			
		||||
	NM_IPACC_TESTRES_PARTIAL	= 3,
 | 
			
		||||
	NM_IPACC_TESTRES_STOPPED	= 4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* internal IE inside NM_ATT_TEST_REPORT */
 | 
			
		||||
enum abis_nm_ipacc_testres_ie {
 | 
			
		||||
	NM_IPACC_TR_IE_FREQ_ERR_LIST	= 3,
 | 
			
		||||
	NM_IPACC_TR_IE_CHAN_USAGE	= 4,
 | 
			
		||||
	NM_IPACC_TR_IE_BCCH_INFO	= 6,
 | 
			
		||||
	NM_IPACC_TR_IE_RESULT_DETAILS	= 8,
 | 
			
		||||
	NM_IPACC_TR_IE_FREQ_ERR		= 18,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ipac_eie {
 | 
			
		||||
	NM_IPAC_EIE_ARFCN_WHITE		= 0x01,
 | 
			
		||||
	NM_IPAC_EIE_ARFCH_BLACK		= 0x02,
 | 
			
		||||
	NM_IPAC_EIE_FREQ_ERR_LIST	= 0x03,
 | 
			
		||||
	NM_IPAC_EIE_CHAN_USE_LIST	= 0x04,
 | 
			
		||||
	NM_IPAC_EIE_BCCH_INFO_TYPE	= 0x05,
 | 
			
		||||
	NM_IPAC_EIE_BCCH_INFO		= 0x06,
 | 
			
		||||
	/* FIXME */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ipac_bcch_info_type {
 | 
			
		||||
	IPAC_BINF_RXLEV			= (1 << 8),
 | 
			
		||||
	IPAC_BINF_RXQUAL		= (1 << 9),
 | 
			
		||||
	IPAC_BINF_FREQ_ERR_QUAL		= (1 << 10),
 | 
			
		||||
	IPAC_BINF_FRAME_OFFSET		= (1 << 11),
 | 
			
		||||
	IPAC_BINF_FRAME_NR_OFFSET	= (1 << 12),
 | 
			
		||||
	IPAC_BINF_BSIC			= (1 << 13),
 | 
			
		||||
	IPAC_BINF_CGI			= (1 << 14),
 | 
			
		||||
	IPAC_BINF_NEIGH_BA_SI2		= (1 << 15),
 | 
			
		||||
	IPAC_BINF_NEIGH_BA_SI2bis	= (1 << 0),
 | 
			
		||||
	IPAC_BINF_NEIGH_BA_SI2ter	= (1 << 1),
 | 
			
		||||
	IPAC_BINF_CELL_ALLOC		= (1 << 2),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct cell_global_id {
 | 
			
		||||
	u_int16_t mcc;
 | 
			
		||||
	u_int16_t mnc;
 | 
			
		||||
	u_int16_t lac;
 | 
			
		||||
	u_int16_t ci;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* The BCCH info from an ip.access test, in host byte order
 | 
			
		||||
 * and already parsed... */
 | 
			
		||||
struct ipac_bcch_info {
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
 | 
			
		||||
	u_int16_t info_type;
 | 
			
		||||
	u_int8_t freq_qual;
 | 
			
		||||
	u_int16_t arfcn;
 | 
			
		||||
	u_int8_t rx_lev;
 | 
			
		||||
	u_int8_t rx_qual;
 | 
			
		||||
	int16_t freq_err;
 | 
			
		||||
	u_int16_t frame_offset;
 | 
			
		||||
	u_int32_t frame_nr_offset;
 | 
			
		||||
	u_int8_t bsic;
 | 
			
		||||
	struct cell_global_id cgi;
 | 
			
		||||
	u_int8_t ba_list_si2[16];
 | 
			
		||||
	u_int8_t ba_list_si2bis[16];
 | 
			
		||||
	u_int8_t ba_list_si2ter[16];
 | 
			
		||||
	u_int8_t ca_list_si1[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* PUBLIC */
 | 
			
		||||
 | 
			
		||||
struct msgb;
 | 
			
		||||
 | 
			
		||||
struct abis_nm_cfg {
 | 
			
		||||
	/* callback for unidirectional reports */
 | 
			
		||||
	int (*report_cb)(struct msgb *,
 | 
			
		||||
			 struct abis_om_fom_hdr *);
 | 
			
		||||
	/* callback for software activate requests from BTS */
 | 
			
		||||
	int (*sw_act_req)(struct msgb *);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern int abis_nm_rcvmsg(struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
int abis_nm_tlv_parse(struct tlv_parsed *tp, const u_int8_t *buf, int len);
 | 
			
		||||
int abis_nm_rx(struct msgb *msg);
 | 
			
		||||
int abis_nm_opstart(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0, u_int8_t i1, u_int8_t i2);
 | 
			
		||||
int abis_nm_chg_adm_state(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0,
 | 
			
		||||
			  u_int8_t i1, u_int8_t i2, enum abis_nm_adm_state adm_state);
 | 
			
		||||
int abis_nm_establish_tei(struct gsm_bts *bts, u_int8_t trx_nr,
 | 
			
		||||
			  u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot,
 | 
			
		||||
			  u_int8_t tei);
 | 
			
		||||
int abis_nm_conn_terr_sign(struct gsm_bts_trx *trx,
 | 
			
		||||
			   u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot);
 | 
			
		||||
int abis_nm_conn_terr_traf(struct gsm_bts_trx_ts *ts,
 | 
			
		||||
			   u_int8_t e1_port, u_int8_t e1_timeslot,
 | 
			
		||||
			   u_int8_t e1_subslot);
 | 
			
		||||
int abis_nm_set_bts_attr(struct gsm_bts *bts, u_int8_t *attr, int attr_len);
 | 
			
		||||
int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, u_int8_t *attr, int attr_len);
 | 
			
		||||
int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, u_int8_t chan_comb);
 | 
			
		||||
int abis_nm_sw_act_req_ack(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i1,
 | 
			
		||||
			u_int8_t i2, u_int8_t i3, int nack, u_int8_t *attr, int att_len);
 | 
			
		||||
int abis_nm_raw_msg(struct gsm_bts *bts, int len, u_int8_t *msg);
 | 
			
		||||
int abis_nm_event_reports(struct gsm_bts *bts, int on);
 | 
			
		||||
int abis_nm_reset_resource(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_software_load(struct gsm_bts *bts, const char *fname,
 | 
			
		||||
			  u_int8_t win_size, int forced,
 | 
			
		||||
			  gsm_cbfn *cbfn, void *cb_data);
 | 
			
		||||
int abis_nm_software_load_status(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_software_activate(struct gsm_bts *bts, const char *fname,
 | 
			
		||||
			      gsm_cbfn *cbfn, void *cb_data);
 | 
			
		||||
 | 
			
		||||
int abis_nm_conn_mdrop_link(struct gsm_bts *bts, u_int8_t e1_port0, u_int8_t ts0,
 | 
			
		||||
			    u_int8_t e1_port1, u_int8_t ts1);
 | 
			
		||||
 | 
			
		||||
int abis_nm_perform_test(struct gsm_bts *bts, u_int8_t obj_class,
 | 
			
		||||
			 u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr,
 | 
			
		||||
			 u_int8_t test_nr, u_int8_t auton_report,
 | 
			
		||||
			 u_int8_t *phys_config, u_int16_t phys_config_len);
 | 
			
		||||
 | 
			
		||||
int abis_nm_chcomb4pchan(enum gsm_phys_chan_config pchan);
 | 
			
		||||
 | 
			
		||||
/* Siemens / BS-11 specific */
 | 
			
		||||
int abis_nm_bs11_reset_resource(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_db_transmission(struct gsm_bts *bts, int begin);
 | 
			
		||||
int abis_nm_bs11_create_object(struct gsm_bts *bts, enum abis_bs11_objtype type,
 | 
			
		||||
			  u_int8_t idx, u_int8_t attr_len, const u_int8_t *attr);
 | 
			
		||||
int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, u_int8_t idx);
 | 
			
		||||
int abis_nm_bs11_create_bport(struct gsm_bts *bts, u_int8_t idx);
 | 
			
		||||
int abis_nm_bs11_delete_object(struct gsm_bts *bts,
 | 
			
		||||
				enum abis_bs11_objtype type, u_int8_t idx);
 | 
			
		||||
int abis_nm_bs11_delete_bport(struct gsm_bts *bts, u_int8_t idx);
 | 
			
		||||
int abis_nm_bs11_conn_oml_tei(struct gsm_bts *bts, u_int8_t e1_port,
 | 
			
		||||
			  u_int8_t e1_timeslot, u_int8_t e1_subslot, u_int8_t tei);
 | 
			
		||||
int abis_nm_bs11_get_oml_tei_ts(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_get_serno(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_set_trx_power(struct gsm_bts_trx *trx, u_int8_t level);
 | 
			
		||||
int abis_nm_bs11_get_trx_power(struct gsm_bts_trx *trx);
 | 
			
		||||
int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on);
 | 
			
		||||
int abis_nm_bs11_set_trx1_pw(struct gsm_bts *bts, const char *password);
 | 
			
		||||
int abis_nm_bs11_set_pll_locked(struct gsm_bts *bts, int locked);
 | 
			
		||||
int abis_nm_bs11_get_pll_mode(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_get_cclk(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_get_state(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname,
 | 
			
		||||
			  u_int8_t win_size, int forced, gsm_cbfn *cbfn);
 | 
			
		||||
int abis_nm_bs11_set_ext_time(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_bs11_set_bport_line_cfg(struct gsm_bts *bts, u_int8_t bport, enum abis_bs11_line_cfg line_cfg);
 | 
			
		||||
int abis_nm_bs11_bsc_disconnect(struct gsm_bts *bts, int reconnect);
 | 
			
		||||
int abis_nm_bs11_restart(struct gsm_bts *bts);
 | 
			
		||||
 | 
			
		||||
/* ip.access nanoBTS specific commands */
 | 
			
		||||
int abis_nm_ipaccess_msg(struct gsm_bts *bts, u_int8_t msg_type,
 | 
			
		||||
			 u_int8_t obj_class, u_int8_t bts_nr,
 | 
			
		||||
			 u_int8_t trx_nr, u_int8_t ts_nr,
 | 
			
		||||
			 u_int8_t *attr, int attr_len);
 | 
			
		||||
int abis_nm_ipaccess_set_nvattr(struct gsm_bts *bts, u_int8_t *attr,
 | 
			
		||||
				int attr_len);
 | 
			
		||||
int abis_nm_ipaccess_restart(struct gsm_bts *bts);
 | 
			
		||||
int abis_nm_ipaccess_set_attr(struct gsm_bts *bts, u_int8_t obj_class,
 | 
			
		||||
				u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr,
 | 
			
		||||
				u_int8_t *attr, u_int8_t attr_len);
 | 
			
		||||
int abis_nm_ipaccess_rsl_connect(struct gsm_bts_trx *trx, 
 | 
			
		||||
				 u_int32_t ip, u_int16_t port, u_int8_t stream);
 | 
			
		||||
int ipac_parse_bcch_info(struct ipac_bcch_info *binf, u_int8_t *buf);
 | 
			
		||||
const char *ipacc_testres_name(u_int8_t res);
 | 
			
		||||
 | 
			
		||||
/* Functions calling into other code parts */
 | 
			
		||||
enum nm_evt {
 | 
			
		||||
	EVT_STATECHG_OPER,
 | 
			
		||||
	EVT_STATECHG_ADM,
 | 
			
		||||
};
 | 
			
		||||
int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
 | 
			
		||||
		   struct gsm_nm_state *old_state, struct gsm_nm_state *new_state); 
 | 
			
		||||
 | 
			
		||||
const char *nm_opstate_name(u_int8_t os);
 | 
			
		||||
const char *nm_avail_name(u_int8_t avail);
 | 
			
		||||
#endif /* _NM_H */
 | 
			
		||||
							
								
								
									
										567
									
								
								openbsc/include/openbsc/abis_rsl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										567
									
								
								openbsc/include/openbsc/abis_rsl.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,567 @@
 | 
			
		||||
/* GSM Radio Signalling Link messages on the A-bis interface 
 | 
			
		||||
 * 3GPP TS 08.58 version 8.6.0 Release 1999 / ETSI TS 100 596 V8.6.0 */
 | 
			
		||||
 | 
			
		||||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _RSL_H
 | 
			
		||||
#define _RSL_H
 | 
			
		||||
 | 
			
		||||
struct abis_rsl_common_hdr {
 | 
			
		||||
	u_int8_t	msg_discr;
 | 
			
		||||
	u_int8_t	msg_type;
 | 
			
		||||
	u_int8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.3 */
 | 
			
		||||
struct abis_rsl_rll_hdr {
 | 
			
		||||
	struct abis_rsl_common_hdr c;
 | 
			
		||||
	u_int8_t	ie_chan;
 | 
			
		||||
	u_int8_t	chan_nr;
 | 
			
		||||
	u_int8_t	ie_link_id;
 | 
			
		||||
	u_int8_t	link_id;
 | 
			
		||||
	u_int8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.3 and 8.4 */
 | 
			
		||||
struct abis_rsl_dchan_hdr {
 | 
			
		||||
	struct abis_rsl_common_hdr c;
 | 
			
		||||
	u_int8_t	ie_chan;
 | 
			
		||||
	u_int8_t	chan_nr;
 | 
			
		||||
	u_int8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1 */
 | 
			
		||||
#define ABIS_RSL_MDISC_RLL		0x02
 | 
			
		||||
#define ABIS_RSL_MDISC_DED_CHAN		0x08
 | 
			
		||||
#define ABIS_RSL_MDISC_COM_CHAN		0x0c
 | 
			
		||||
#define ABIS_RSL_MDISC_TRX		0x10
 | 
			
		||||
#define ABIS_RSL_MDISC_LOC		0x20
 | 
			
		||||
#define ABIS_RSL_MDISC_IPACCESS		0x7e
 | 
			
		||||
#define ABIS_RSL_MDISC_TRANSP		0x01
 | 
			
		||||
 | 
			
		||||
#define ABIS_RSL_MDISC_IS_TRANSP(x)	(x & 0x01)
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1 */
 | 
			
		||||
enum abis_rsl_msgtype {
 | 
			
		||||
	/* Radio Link Layer Management */
 | 
			
		||||
	RSL_MT_DATA_REQ			= 0x01,
 | 
			
		||||
	RSL_MT_DATA_IND,
 | 
			
		||||
	RSL_MT_ERROR_IND,
 | 
			
		||||
	RSL_MT_EST_REQ,
 | 
			
		||||
	RSL_MT_EST_CONF,
 | 
			
		||||
	RSL_MT_EST_IND,
 | 
			
		||||
	RSL_MT_REL_REQ,
 | 
			
		||||
	RSL_MT_REL_CONF,
 | 
			
		||||
	RSL_MT_REL_IND,
 | 
			
		||||
	RSL_MT_UNIT_DATA_REQ,
 | 
			
		||||
	RSL_MT_UNIT_DATA_IND,		/* 0x0b */
 | 
			
		||||
 | 
			
		||||
	/* Common Channel Management / TRX Management */
 | 
			
		||||
	RSL_MT_BCCH_INFO			= 0x11,
 | 
			
		||||
	RSL_MT_CCCH_LOAD_IND,
 | 
			
		||||
	RSL_MT_CHAN_RQD,
 | 
			
		||||
	RSL_MT_DELETE_IND,
 | 
			
		||||
	RSL_MT_PAGING_CMD,
 | 
			
		||||
	RSL_MT_IMMEDIATE_ASSIGN_CMD,
 | 
			
		||||
	RSL_MT_SMS_BC_REQ,
 | 
			
		||||
	/* empty */
 | 
			
		||||
	RSL_MT_RF_RES_IND			= 0x19,
 | 
			
		||||
	RSL_MT_SACCH_FILL,
 | 
			
		||||
	RSL_MT_OVERLOAD,
 | 
			
		||||
	RSL_MT_ERROR_REPORT,
 | 
			
		||||
	RSL_MT_SMS_BC_CMD,
 | 
			
		||||
	RSL_MT_CBCH_LOAD_IND,
 | 
			
		||||
	RSL_MT_NOT_CMD,			/* 0x1f */
 | 
			
		||||
 | 
			
		||||
	/* Dedicate Channel Management */
 | 
			
		||||
	RSL_MT_CHAN_ACTIV			= 0x21,
 | 
			
		||||
	RSL_MT_CHAN_ACTIV_ACK,
 | 
			
		||||
	RSL_MT_CHAN_ACTIV_NACK,
 | 
			
		||||
	RSL_MT_CONN_FAIL,
 | 
			
		||||
	RSL_MT_DEACTIVATE_SACCH,
 | 
			
		||||
	RSL_MT_ENCR_CMD,
 | 
			
		||||
	RSL_MT_HANDO_DET,
 | 
			
		||||
	RSL_MT_MEAS_RES,
 | 
			
		||||
	RSL_MT_MODE_MODIFY_REQ,
 | 
			
		||||
	RSL_MT_MODE_MODIFY_ACK,
 | 
			
		||||
	RSL_MT_MODE_MODIFY_NACK,
 | 
			
		||||
	RSL_MT_PHY_CONTEXT_REQ,
 | 
			
		||||
	RSL_MT_PHY_CONTEXT_CONF,
 | 
			
		||||
	RSL_MT_RF_CHAN_REL,
 | 
			
		||||
	RSL_MT_MS_POWER_CONTROL,
 | 
			
		||||
	RSL_MT_BS_POWER_CONTROL,		/* 0x30 */
 | 
			
		||||
	RSL_MT_PREPROC_CONFIG,
 | 
			
		||||
	RSL_MT_PREPROC_MEAS_RES,
 | 
			
		||||
	RSL_MT_RF_CHAN_REL_ACK,
 | 
			
		||||
	RSL_MT_SACCH_INFO_MODIFY,
 | 
			
		||||
	RSL_MT_TALKER_DET,
 | 
			
		||||
	RSL_MT_LISTENER_DET,
 | 
			
		||||
	RSL_MT_REMOTE_CODEC_CONF_REP,
 | 
			
		||||
	RSL_MT_RTD_REP,
 | 
			
		||||
	RSL_MT_PRE_HANDO_NOTIF,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_REQ,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_ACK,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_NACK,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_PER,
 | 
			
		||||
	RSL_MT_TFO_REP,
 | 
			
		||||
	RSL_MT_TFO_MOD_REQ,		/* 0x3f */
 | 
			
		||||
	RSL_MT_LOCATION_INFO		= 0x41,
 | 
			
		||||
 | 
			
		||||
	/* ip.access specific RSL message types */
 | 
			
		||||
	RSL_MT_IPAC_DIR_RETR_ENQ	= 0x40,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_ACT		= 0x48,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_ACT_ACK,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_ACT_NACK,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_DEACT		= 0x4b,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_DEACT_ACK,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_DEACT_NACK,
 | 
			
		||||
	RSL_MT_IPAC_CONNECT_MUX		= 0x50,
 | 
			
		||||
	RSL_MT_IPAC_CONNECT_MUX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_CONNECT_MUX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_BIND_MUX		= 0x53,
 | 
			
		||||
	RSL_MT_IPAC_BIND_MUX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_BIND_MUX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_DISC_MUX		= 0x56,
 | 
			
		||||
	RSL_MT_IPAC_DISC_MUX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_DISC_MUX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_CRCX		= 0x70,		/* Bind to local BTS RTP port */
 | 
			
		||||
	RSL_MT_IPAC_CRCX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_CRCX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_MDCX		= 0x73,
 | 
			
		||||
	RSL_MT_IPAC_MDCX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_MDCX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_DLCX_IND		= 0x76,
 | 
			
		||||
	RSL_MT_IPAC_DLCX		= 0x77,
 | 
			
		||||
	RSL_MT_IPAC_DLCX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_DLCX_NACK,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Siemens vendor-specific */
 | 
			
		||||
enum abis_rsl_msgtype_siemens {
 | 
			
		||||
	RSL_MT_SIEMENS_MRPCI		= 0x41,
 | 
			
		||||
	RSL_MT_SIEMENS_INTRAC_HO_COND_IND = 0x42,
 | 
			
		||||
	RSL_MT_SIEMENS_INTERC_HO_COND_IND = 0x43,
 | 
			
		||||
	RSL_MT_SIEMENS_FORCED_HO_REQ	= 0x44,
 | 
			
		||||
	RSL_MT_SIEMENS_PREF_AREA_REQ	= 0x45,
 | 
			
		||||
	RSL_MT_SIEMENS_PREF_AREA	= 0x46,
 | 
			
		||||
	RSL_MT_SIEMENS_START_TRACE	= 0x47,
 | 
			
		||||
	RSL_MT_SIEMENS_START_TRACE_ACK	= 0x48,
 | 
			
		||||
	RSL_MT_SIEMENS_STOP_TRACE	= 0x49,
 | 
			
		||||
	RSL_MT_SIEMENS_TRMR		= 0x4a,
 | 
			
		||||
	RSL_MT_SIEMENS_HO_FAIL_IND	= 0x4b,
 | 
			
		||||
	RSL_MT_SIEMENS_STOP_TRACE_ACK	= 0x4c,
 | 
			
		||||
	RSL_MT_SIEMENS_UPLF		= 0x4d,
 | 
			
		||||
	RSL_MT_SIEMENS_UPLB		= 0x4e,
 | 
			
		||||
	RSL_MT_SIEMENS_SET_SYS_INFO_10	= 0x4f,
 | 
			
		||||
	RSL_MT_SIEMENS_MODIF_COND_IND	= 0x50,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3 */
 | 
			
		||||
enum abis_rsl_ie {
 | 
			
		||||
	RSL_IE_CHAN_NR			= 0x01,
 | 
			
		||||
	RSL_IE_LINK_IDENT,
 | 
			
		||||
	RSL_IE_ACT_TYPE,
 | 
			
		||||
	RSL_IE_BS_POWER,
 | 
			
		||||
	RSL_IE_CHAN_IDENT,
 | 
			
		||||
	RSL_IE_CHAN_MODE,
 | 
			
		||||
	RSL_IE_ENCR_INFO,
 | 
			
		||||
	RSL_IE_FRAME_NUMBER,
 | 
			
		||||
	RSL_IE_HANDO_REF,
 | 
			
		||||
	RSL_IE_L1_INFO,
 | 
			
		||||
	RSL_IE_L3_INFO,
 | 
			
		||||
	RSL_IE_MS_IDENTITY,
 | 
			
		||||
	RSL_IE_MS_POWER,
 | 
			
		||||
	RSL_IE_PAGING_GROUP,
 | 
			
		||||
	RSL_IE_PAGING_LOAD,
 | 
			
		||||
	RSL_IE_PYHS_CONTEXT		= 0x10,
 | 
			
		||||
	RSL_IE_ACCESS_DELAY,
 | 
			
		||||
	RSL_IE_RACH_LOAD,
 | 
			
		||||
	RSL_IE_REQ_REFERENCE,
 | 
			
		||||
	RSL_IE_RELEASE_MODE,
 | 
			
		||||
	RSL_IE_RESOURCE_INFO,
 | 
			
		||||
	RSL_IE_RLM_CAUSE,
 | 
			
		||||
	RSL_IE_STARTNG_TIME,
 | 
			
		||||
	RSL_IE_TIMING_ADVANCE,
 | 
			
		||||
	RSL_IE_UPLINK_MEAS,
 | 
			
		||||
	RSL_IE_CAUSE,
 | 
			
		||||
	RSL_IE_MEAS_RES_NR,
 | 
			
		||||
	RSL_IE_MSG_ID,
 | 
			
		||||
	/* reserved */
 | 
			
		||||
	RSL_IE_SYSINFO_TYPE		= 0x1e,
 | 
			
		||||
	RSL_IE_MS_POWER_PARAM,
 | 
			
		||||
	RSL_IE_BS_POWER_PARAM,
 | 
			
		||||
	RSL_IE_PREPROC_PARAM,
 | 
			
		||||
	RSL_IE_PREPROC_MEAS,
 | 
			
		||||
	RSL_IE_IMM_ASS_INFO,		/* Phase 1 (3.6.0), later Full below */
 | 
			
		||||
	RSL_IE_SMSCB_INFO		= 0x24,
 | 
			
		||||
	RSL_IE_MS_TIMING_OFFSET,
 | 
			
		||||
	RSL_IE_ERR_MSG,
 | 
			
		||||
	RSL_IE_FULL_BCCH_INFO,
 | 
			
		||||
	RSL_IE_CHAN_NEEDED,
 | 
			
		||||
	RSL_IE_CB_CMD_TYPE,
 | 
			
		||||
	RSL_IE_SMSCB_MSG,
 | 
			
		||||
	RSL_IE_FULL_IMM_ASS_INFO,
 | 
			
		||||
	RSL_IE_SACCH_INFO,
 | 
			
		||||
	RSL_IE_CBCH_LOAD_INFO,
 | 
			
		||||
	RSL_IE_SMSCB_CHAN_INDICATOR,
 | 
			
		||||
	RSL_IE_GROUP_CALL_REF,
 | 
			
		||||
	RSL_IE_CHAN_DESC		= 0x30,
 | 
			
		||||
	RSL_IE_NCH_DRX_INFO,
 | 
			
		||||
	RSL_IE_CMD_INDICATOR,
 | 
			
		||||
	RSL_IE_EMLPP_PRIO,
 | 
			
		||||
	RSL_IE_UIC,
 | 
			
		||||
	RSL_IE_MAIN_CHAN_REF,
 | 
			
		||||
	RSL_IE_MR_CONFIG,
 | 
			
		||||
	RSL_IE_MR_CONTROL,
 | 
			
		||||
	RSL_IE_SUP_CODEC_TYPES,
 | 
			
		||||
	RSL_IE_CODEC_CONFIG,
 | 
			
		||||
	RSL_IE_RTD,
 | 
			
		||||
	RSL_IE_TFO_STATUS,
 | 
			
		||||
	RSL_IE_LLP_APDU,
 | 
			
		||||
	/* Siemens vendor-specific */
 | 
			
		||||
	RSL_IE_SIEMENS_MRPCI		= 0x40,
 | 
			
		||||
	RSL_IE_SIEMENS_PREF_AREA_TYPE	= 0x43,
 | 
			
		||||
	RSL_IE_SIEMENS_ININ_CELL_HO_PAR	= 0x45,
 | 
			
		||||
	RSL_IE_SIEMENS_TRACE_REF_NR	= 0x46,
 | 
			
		||||
	RSL_IE_SIEMENS_INT_TRACE_IDX	= 0x47,
 | 
			
		||||
	RSL_IE_SIEMENS_L2_HDR_INFO	= 0x48,
 | 
			
		||||
	RSL_IE_SIEMENS_HIGHEST_RATE	= 0x4e,
 | 
			
		||||
	RSL_IE_SIEMENS_SUGGESTED_RATE	= 0x4f,
 | 
			
		||||
 | 
			
		||||
	/* ip.access */
 | 
			
		||||
	RSL_IE_IPAC_SRTP_CONFIG	= 0xe0,
 | 
			
		||||
	RSL_IE_IPAC_PROXY_UDP	= 0xe1,
 | 
			
		||||
	RSL_IE_IPAC_BSCMPL_TOUT	= 0xe2,
 | 
			
		||||
	RSL_IE_IPAC_REMOTE_IP	= 0xf0,
 | 
			
		||||
	RSL_IE_IPAC_REMOTE_PORT	= 0xf1,
 | 
			
		||||
	RSL_IE_IPAC_RTP_PAYLOAD	= 0xf2,
 | 
			
		||||
	RSL_IE_IPAC_LOCAL_PORT	= 0xf3,
 | 
			
		||||
	RSL_IE_IPAC_SPEECH_MODE	= 0xf4,
 | 
			
		||||
	RSL_IE_IPAC_LOCAL_IP	= 0xf5,
 | 
			
		||||
	RSL_IE_IPAC_CONN_STAT	= 0xf6,
 | 
			
		||||
	RSL_IE_IPAC_HO_C_PARMS	= 0xf7,
 | 
			
		||||
	RSL_IE_IPAC_CONN_ID	= 0xf8,
 | 
			
		||||
	RSL_IE_IPAC_RTP_CSD_FMT	= 0xf9,
 | 
			
		||||
	RSL_IE_IPAC_RTP_JIT_BUF	= 0xfa,
 | 
			
		||||
	RSL_IE_IPAC_RTP_COMPR	= 0xfb,
 | 
			
		||||
	RSL_IE_IPAC_RTP_PAYLOAD2= 0xfc,
 | 
			
		||||
	RSL_IE_IPAC_RTP_MPLEX	= 0xfd,
 | 
			
		||||
	RSL_IE_IPAC_RTP_MPLEX_ID= 0xfe,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.1 */
 | 
			
		||||
#define RSL_CHAN_NR_MASK	0xf8
 | 
			
		||||
#define RSL_CHAN_Bm_ACCHs	0x08
 | 
			
		||||
#define RSL_CHAN_Lm_ACCHs	0x10	/* .. 0x18 */
 | 
			
		||||
#define RSL_CHAN_SDCCH4_ACCH	0x20	/* .. 0x38 */
 | 
			
		||||
#define RSL_CHAN_SDCCH8_ACCH	0x40	/* ...0x78 */
 | 
			
		||||
#define RSL_CHAN_BCCH		0x80
 | 
			
		||||
#define RSL_CHAN_RACH		0x88
 | 
			
		||||
#define RSL_CHAN_PCH_AGCH	0x90
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.3 */
 | 
			
		||||
#define RSL_ACT_TYPE_INITIAL	0x00
 | 
			
		||||
#define RSL_ACT_TYPE_REACT	0x80
 | 
			
		||||
#define RSL_ACT_INTRA_IMM_ASS	0x00
 | 
			
		||||
#define RSL_ACT_INTRA_NORM_ASS	0x01
 | 
			
		||||
#define RSL_ACT_INTER_ASYNC	0x02
 | 
			
		||||
#define RSL_ACT_INTER_SYNC	0x03
 | 
			
		||||
#define RSL_ACT_SECOND_ADD	0x04
 | 
			
		||||
#define RSL_ACT_SECOND_MULTI	0x05
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.6 */
 | 
			
		||||
struct rsl_ie_chan_mode {
 | 
			
		||||
	u_int8_t dtx_dtu;
 | 
			
		||||
	u_int8_t spd_ind;
 | 
			
		||||
	u_int8_t chan_rt;
 | 
			
		||||
	u_int8_t chan_rate;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
#define RSL_CMOD_DTXu		0x01	/* uplink */
 | 
			
		||||
#define RSL_CMOD_DTXd		0x02	/* downlink */
 | 
			
		||||
enum rsl_cmod_spd {
 | 
			
		||||
	RSL_CMOD_SPD_SPEECH	= 0x01,
 | 
			
		||||
	RSL_CMOD_SPD_DATA	= 0x02,
 | 
			
		||||
	RSL_CMOD_SPD_SIGN	= 0x03,
 | 
			
		||||
};
 | 
			
		||||
#define RSL_CMOD_CRT_SDCCH	0x01
 | 
			
		||||
#define RSL_CMOD_CRT_TCH_Bm	0x08	/* full-rate */
 | 
			
		||||
#define RSL_CMOD_CRT_TCH_Lm	0x09	/* half-rate */
 | 
			
		||||
/* FIXME: More CRT types */
 | 
			
		||||
/* Speech */
 | 
			
		||||
#define RSL_CMOD_SP_GSM1	0x01
 | 
			
		||||
#define RSL_CMOD_SP_GSM2	0x11
 | 
			
		||||
#define RSL_CMOD_SP_GSM3	0x21
 | 
			
		||||
/* Data */
 | 
			
		||||
#define RSL_CMOD_SP_NT_14k5	0x58
 | 
			
		||||
#define RSL_CMOD_SP_NT_12k0	0x50
 | 
			
		||||
#define RSL_CMOD_SP_NT_6k0	0x51
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.5 */
 | 
			
		||||
struct rsl_ie_chan_ident {
 | 
			
		||||
	/* GSM 04.08 10.5.2.5 */
 | 
			
		||||
	struct {
 | 
			
		||||
		u_int8_t iei;
 | 
			
		||||
		u_int8_t chan_nr;	/* enc_chan_nr */
 | 
			
		||||
		u_int8_t oct3;
 | 
			
		||||
		u_int8_t oct4;
 | 
			
		||||
	} chan_desc;
 | 
			
		||||
#if 0	/* spec says we need this but Abissim doesn't use it */
 | 
			
		||||
	struct {
 | 
			
		||||
		u_int8_t tag;
 | 
			
		||||
		u_int8_t len;
 | 
			
		||||
	} mobile_alloc;
 | 
			
		||||
#endif
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.22 */
 | 
			
		||||
#define RLL_CAUSE_T200_EXPIRED		0x01
 | 
			
		||||
#define RLL_CAUSE_REEST_REQ		0x02
 | 
			
		||||
#define RLL_CAUSE_UNSOL_UA_RESP		0x03
 | 
			
		||||
#define RLL_CAUSE_UNSOL_DM_RESP		0x04
 | 
			
		||||
#define RLL_CAUSE_UNSOL_DM_RESP_MF	0x05
 | 
			
		||||
#define RLL_CAUSE_UNSOL_SPRV_RESP	0x06
 | 
			
		||||
#define RLL_CAUSE_SEQ_ERR		0x07
 | 
			
		||||
#define RLL_CAUSE_UFRM_INC_PARAM	0x08
 | 
			
		||||
#define RLL_CAUSE_SFRM_INC_PARAM	0x09
 | 
			
		||||
#define RLL_CAUSE_IFRM_INC_MBITS	0x0a
 | 
			
		||||
#define RLL_CAUSE_IFRM_INC_LEN		0x0b
 | 
			
		||||
#define RLL_CAUSE_FRM_UNIMPL		0x0c
 | 
			
		||||
#define RLL_CAUSE_SABM_MF		0x0d
 | 
			
		||||
#define RLL_CAUSE_SABM_INFO_NOTALL	0x0e
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.26 */
 | 
			
		||||
#define RSL_ERRCLS_NORMAL		0x00
 | 
			
		||||
#define RSL_ERRCLS_RESOURCE_UNAVAIL	0x20
 | 
			
		||||
#define RSL_ERRCLS_SERVICE_UNAVAIL	0x30
 | 
			
		||||
#define RSL_ERRCLS_SERVICE_UNIMPL	0x40
 | 
			
		||||
#define RSL_ERRCLS_INVAL_MSG		0x50
 | 
			
		||||
#define RSL_ERRCLS_PROTO_ERROR		0x60
 | 
			
		||||
#define RSL_ERRCLS_INTERWORKING		0x70
 | 
			
		||||
 | 
			
		||||
/* normal event */
 | 
			
		||||
#define RSL_ERR_RADIO_IF_FAIL		0x00
 | 
			
		||||
#define RSL_ERR_RADIO_LINK_FAIL		0x01
 | 
			
		||||
#define RSL_ERR_HANDOVER_ACC_FAIL	0x02
 | 
			
		||||
#define RSL_ERR_TALKER_ACC_FAIL		0x03
 | 
			
		||||
#define RSL_ERR_OM_INTERVENTION		0x07
 | 
			
		||||
#define RSL_ERR_NORMAL_UNSPEC		0x0f
 | 
			
		||||
#define RSL_ERR_T_MSRFPCI_EXP		0x18
 | 
			
		||||
/* resource unavailable */
 | 
			
		||||
#define RSL_ERR_EQUIPMENT_FAIL		0x20
 | 
			
		||||
#define RSL_ERR_RR_UNAVAIL		0x21
 | 
			
		||||
#define RSL_ERR_TERR_CH_FAIL		0x22
 | 
			
		||||
#define RSL_ERR_CCCH_OVERLOAD		0x23
 | 
			
		||||
#define RSL_ERR_ACCH_OVERLOAD		0x24
 | 
			
		||||
#define RSL_ERR_PROCESSOR_OVERLOAD	0x25
 | 
			
		||||
#define RSL_ERR_RES_UNAVAIL		0x2f
 | 
			
		||||
/* service or option not available */
 | 
			
		||||
#define RSL_ERR_TRANSC_UNAVAIL		0x30
 | 
			
		||||
#define RSL_ERR_SERV_OPT_UNAVAIL	0x3f
 | 
			
		||||
/* service or option not implemented */
 | 
			
		||||
#define RSL_ERR_ENCR_UNIMPL		0x40
 | 
			
		||||
#define RSL_ERR_SERV_OPT_UNIMPL		0x4f
 | 
			
		||||
/* invalid message */
 | 
			
		||||
#define RSL_ERR_RCH_ALR_ACTV_ALLOC	0x50
 | 
			
		||||
#define RSL_ERR_INVALID_MESSAGE		0x5f
 | 
			
		||||
/* protocol error */
 | 
			
		||||
#define RSL_ERR_MSG_DISCR		0x60
 | 
			
		||||
#define RSL_ERR_MSG_TYPE		0x61
 | 
			
		||||
#define RSL_ERR_MSG_SEQ			0x62
 | 
			
		||||
#define RSL_ERR_IE_ERROR		0x63
 | 
			
		||||
#define RSL_ERR_MAND_IE_ERROR		0x64
 | 
			
		||||
#define RSL_ERR_OPT_IE_ERROR		0x65
 | 
			
		||||
#define RSL_ERR_IE_NONEXIST		0x66
 | 
			
		||||
#define RSL_ERR_IE_LENGTH		0x67
 | 
			
		||||
#define RSL_ERR_IE_CONTENT		0x68
 | 
			
		||||
#define RSL_ERR_PROTO			0x6f
 | 
			
		||||
/* interworking */
 | 
			
		||||
#define RSL_ERR_INTERWORKING		0x7f
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.30 */
 | 
			
		||||
#define RSL_SYSTEM_INFO_8	0x00
 | 
			
		||||
#define RSL_SYSTEM_INFO_1	0x01
 | 
			
		||||
#define RSL_SYSTEM_INFO_2	0x02
 | 
			
		||||
#define RSL_SYSTEM_INFO_3	0x03
 | 
			
		||||
#define RSL_SYSTEM_INFO_4	0x04
 | 
			
		||||
#define RSL_SYSTEM_INFO_5	0x05
 | 
			
		||||
#define RSL_SYSTEM_INFO_6	0x06
 | 
			
		||||
#define RSL_SYSTEM_INFO_7	0x07
 | 
			
		||||
#define RSL_SYSTEM_INFO_16	0x08
 | 
			
		||||
#define RSL_SYSTEM_INFO_17	0x09
 | 
			
		||||
#define RSL_SYSTEM_INFO_2bis	0x0a
 | 
			
		||||
#define RSL_SYSTEM_INFO_2ter	0x0b
 | 
			
		||||
#define RSL_SYSTEM_INFO_5bis	0x0d
 | 
			
		||||
#define RSL_SYSTEM_INFO_5ter	0x0e
 | 
			
		||||
#define RSL_SYSTEM_INFO_10	0x0f
 | 
			
		||||
#define REL_EXT_MEAS_ORDER	0x47
 | 
			
		||||
#define RSL_MEAS_INFO		0x48
 | 
			
		||||
#define RSL_SYSTEM_INFO_13	0x28
 | 
			
		||||
#define RSL_SYSTEM_INFO_2quater	0x29
 | 
			
		||||
#define RSL_SYSTEM_INFO_9	0x2a
 | 
			
		||||
#define RSL_SYSTEM_INFO_18	0x2b
 | 
			
		||||
#define RSL_SYSTEM_INFO_19	0x2c
 | 
			
		||||
#define RSL_SYSTEM_INFO_20	0x2d
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.40 */
 | 
			
		||||
#define RSL_CHANNEED_ANY	0x00
 | 
			
		||||
#define RSL_CHANNEED_SDCCH	0x01
 | 
			
		||||
#define RSL_CHANNEED_TCH_F	0x02
 | 
			
		||||
#define RSL_CHANNEED_TCH_ForH	0x03
 | 
			
		||||
 | 
			
		||||
/* Chapter 3.3.2.3 Brocast control channel */
 | 
			
		||||
/* CCCH-CONF, NC is not combined */
 | 
			
		||||
#define RSL_BCCH_CCCH_CONF_1_NC	0x00
 | 
			
		||||
#define RSL_BCCH_CCCH_CONF_1_C	0x01
 | 
			
		||||
#define RSL_BCCH_CCCH_CONF_2_NC	0x02
 | 
			
		||||
#define RSL_BCCH_CCCH_CONF_3_NC	0x04
 | 
			
		||||
#define RSL_BCCH_CCCH_CONF_4_NC	0x06
 | 
			
		||||
 | 
			
		||||
/* BS-PA-MFRMS */
 | 
			
		||||
#define RSL_BS_PA_MFRMS_2	0x00
 | 
			
		||||
#define RSL_BS_PA_MFRMS_3	0x01
 | 
			
		||||
#define RSL_BS_PA_MFRMS_4	0x02
 | 
			
		||||
#define RSL_BS_PA_MFRMS_5	0x03
 | 
			
		||||
#define RSL_BS_PA_MFRMS_6	0x04
 | 
			
		||||
#define RSL_BS_PA_MFRMS_7	0x05
 | 
			
		||||
#define RSL_BS_PA_MFRMS_8	0x06
 | 
			
		||||
#define RSL_BS_PA_MFRMS_9	0x07
 | 
			
		||||
 | 
			
		||||
/* RSL_IE_IPAC_RTP_PAYLOAD[2] */
 | 
			
		||||
enum rsl_ipac_rtp_payload {
 | 
			
		||||
	RSL_IPAC_RTP_GSM	= 1,
 | 
			
		||||
	RSL_IPAC_RTP_EFR,
 | 
			
		||||
	RSL_IPAC_RTP_AMR,
 | 
			
		||||
	RSL_IPAC_RTP_CSD,
 | 
			
		||||
	RSL_IPAC_RTP_MUX,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* RSL_IE_IPAC_SPEECH_MODE, lower four bits */
 | 
			
		||||
enum rsl_ipac_speech_mode_s {
 | 
			
		||||
	RSL_IPAC_SPEECH_GSM_FR = 0,	/* GSM FR (Type 1, FS) */
 | 
			
		||||
	RSL_IPAC_SPEECH_GSM_EFR = 1,	/* GSM EFR (Type 2, FS) */
 | 
			
		||||
	RSL_IPAC_SPEECH_GSM_AMR_FR = 2,	/* GSM AMR/FR (Type 3, FS) */
 | 
			
		||||
	RSL_IPAC_SPEECH_GSM_HR = 3,	/* GSM HR (Type 1, HS) */
 | 
			
		||||
	RSL_IPAC_SPEECH_GSM_AMR_HR = 5,	/* GSM AMR/hr (Type 3, HS) */
 | 
			
		||||
	RSL_IPAC_SPEECH_AS_RTP = 0xf,	/* As specified by RTP Payload IE */
 | 
			
		||||
};
 | 
			
		||||
/* RSL_IE_IPAC_SPEECH_MODE, upper four bits */
 | 
			
		||||
enum rsl_ipac_speech_mode_m {
 | 
			
		||||
	RSL_IPAC_SPEECH_M_RXTX = 0,	/* Send and Receive */
 | 
			
		||||
	RSL_IPAC_SPEECH_M_RX = 1,	/* Receive only */
 | 
			
		||||
	RSL_IPAC_SPEECH_M_TX = 2,	/* Send only */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* RSL_IE_IPAC_RTP_CSD_FMT, lower four bits */
 | 
			
		||||
enum rsl_ipac_rtp_csd_format_d {
 | 
			
		||||
	RSL_IPAC_RTP_CSD_EXT_TRAU = 0,
 | 
			
		||||
	RSL_IPAC_RTP_CSD_NON_TRAU = 1,
 | 
			
		||||
	RSL_IPAC_RTP_CSD_TRAU_BTS = 2,
 | 
			
		||||
	RSL_IPAC_RTP_CSD_IWF_FREE = 3,
 | 
			
		||||
};
 | 
			
		||||
/* RSL_IE_IPAC_RTP_CSD_FMT, upper four bits */
 | 
			
		||||
enum rsl_ipac_rtp_csd_format_ir {
 | 
			
		||||
	RSL_IPAC_RTP_CSD_IR_8k = 0,
 | 
			
		||||
	RSL_IPAC_RTP_CSD_IR_16k = 1,
 | 
			
		||||
	RSL_IPAC_RTP_CSD_IR_32k = 2,
 | 
			
		||||
	RSL_IPAC_RTP_CSD_IR_64k = 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include "msgb.h"
 | 
			
		||||
 | 
			
		||||
int rsl_bcch_info(struct gsm_bts_trx *trx, u_int8_t type,
 | 
			
		||||
		  const u_int8_t *data, int len);
 | 
			
		||||
int rsl_sacch_filling(struct gsm_bts_trx *trx, u_int8_t type, 
 | 
			
		||||
		      const u_int8_t *data, int len);
 | 
			
		||||
int rsl_chan_activate(struct gsm_bts_trx *trx, u_int8_t chan_nr,
 | 
			
		||||
		      u_int8_t act_type,
 | 
			
		||||
		      struct rsl_ie_chan_mode *chan_mode,
 | 
			
		||||
		      struct rsl_ie_chan_ident *chan_ident,
 | 
			
		||||
		      u_int8_t bs_power, u_int8_t ms_power,
 | 
			
		||||
		      u_int8_t ta);
 | 
			
		||||
int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, 
 | 
			
		||||
			    u_int8_t ta, u_int8_t ho_ref);
 | 
			
		||||
int rsl_chan_mode_modify_req(struct gsm_lchan *ts);
 | 
			
		||||
int rsl_encryption_cmd(struct msgb *msg);
 | 
			
		||||
int rsl_paging_cmd(struct gsm_bts *bts, u_int8_t paging_group, u_int8_t len,
 | 
			
		||||
		   u_int8_t *ms_ident, u_int8_t chan_needed);
 | 
			
		||||
int rsl_paging_cmd_subscr(struct gsm_bts *bts, u_int8_t chan_needed,
 | 
			
		||||
			 struct gsm_subscriber *subscr);
 | 
			
		||||
int rsl_imm_assign_cmd(struct gsm_bts *bts, u_int8_t len, u_int8_t *val);
 | 
			
		||||
 | 
			
		||||
int rsl_data_request(struct msgb *msg, u_int8_t link_id);
 | 
			
		||||
int rsl_establish_request(struct gsm_lchan *lchan, u_int8_t link_id);
 | 
			
		||||
int rsl_relase_request(struct gsm_lchan *lchan, u_int8_t link_id);
 | 
			
		||||
 | 
			
		||||
/* Siemens vendor-specific RSL extensions */
 | 
			
		||||
struct rsl_mrpci {
 | 
			
		||||
	u_int8_t power_class:3,
 | 
			
		||||
		 vgcs_capable:1,
 | 
			
		||||
		 vbs_capable:1,
 | 
			
		||||
		 gsm_phase:2;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
enum rsl_mrpci_pwrclass {
 | 
			
		||||
	RSL_MRPCI_PWRC_1	= 0,
 | 
			
		||||
	RSL_MRPCI_PWRC_2	= 1,
 | 
			
		||||
	RSL_MRPCI_PWRC_3	= 2,
 | 
			
		||||
	RSL_MRPCI_PWRC_4	= 3,
 | 
			
		||||
	RSL_MRPCI_PWRC_5	= 4,
 | 
			
		||||
};
 | 
			
		||||
enum rsl_mrpci_phase {
 | 
			
		||||
	RSL_MRPCI_PHASE_1	= 0,
 | 
			
		||||
	/* reserved */
 | 
			
		||||
	RSL_MRPCI_PHASE_2	= 2,
 | 
			
		||||
	RSL_MRPCI_PHASE_2PLUS	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci);
 | 
			
		||||
 | 
			
		||||
/* ip.access specfic RSL extensions */
 | 
			
		||||
int rsl_ipacc_crcx(struct gsm_lchan *lchan);
 | 
			
		||||
int rsl_ipacc_mdcx(struct gsm_lchan *lchan, u_int32_t ip,
 | 
			
		||||
		   u_int16_t port, u_int8_t rtp_payload2);
 | 
			
		||||
int rsl_ipacc_mdcx_to_rtpsock(struct gsm_lchan *lchan);
 | 
			
		||||
int rsl_ipacc_pdch_activate(struct gsm_lchan *lchan);
 | 
			
		||||
 | 
			
		||||
int abis_rsl_rcvmsg(struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
unsigned int get_paging_group(u_int64_t imsi, unsigned int bs_cc_chans,
 | 
			
		||||
			      int n_pag_blocks);
 | 
			
		||||
unsigned int n_pag_blocks(int bs_ccch_sdcch_comb, unsigned int bs_ag_blks_res);
 | 
			
		||||
u_int64_t str_to_imsi(const char *imsi_str);
 | 
			
		||||
u_int8_t lchan2chan_nr(const struct gsm_lchan *lchan);
 | 
			
		||||
int rsl_release_request(struct gsm_lchan *lchan, u_int8_t link_id);
 | 
			
		||||
 | 
			
		||||
/* to be provided by external code */
 | 
			
		||||
int abis_rsl_sendmsg(struct msgb *msg);
 | 
			
		||||
int rsl_deact_sacch(struct gsm_lchan *lchan);
 | 
			
		||||
int rsl_chan_release(struct gsm_lchan *lchan);
 | 
			
		||||
 | 
			
		||||
/* BCCH related code */
 | 
			
		||||
int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf);
 | 
			
		||||
int rsl_ccch_conf_to_bs_ccch_sdcch_comb(int ccch_conf);
 | 
			
		||||
int rsl_number_of_paging_subchannels(struct gsm_bts *bts);
 | 
			
		||||
 | 
			
		||||
int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db);
 | 
			
		||||
int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm);
 | 
			
		||||
 | 
			
		||||
#endif /* RSL_MT_H */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										65
									
								
								openbsc/include/openbsc/bitvec.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								openbsc/include/openbsc/bitvec.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
#ifndef _BITVEC_H
 | 
			
		||||
#define _BITVEC_H
 | 
			
		||||
 | 
			
		||||
/* bit vector utility routines */
 | 
			
		||||
 | 
			
		||||
/* (C) 2009 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 *
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* In GSM mac blocks, every bit can be 0 or 1, or L or H.  L/H are
 | 
			
		||||
 * defined relative to the 0x2b padding pattern */
 | 
			
		||||
enum bit_value {
 | 
			
		||||
	ZERO	= 0,
 | 
			
		||||
	ONE	= 1,
 | 
			
		||||
	L	= 2,
 | 
			
		||||
	H	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct bitvec {
 | 
			
		||||
	unsigned int cur_bit;	/* curser to the next unused bit */
 | 
			
		||||
	unsigned int data_len;	/* length of data array in bytes */
 | 
			
		||||
	u_int8_t *data;		/* pointer to data array */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* check if the bit is 0 or 1 for a given position inside a bitvec */
 | 
			
		||||
enum bit_value bitvec_get_bit_pos(struct bitvec *bv, unsigned int bitnr);
 | 
			
		||||
 | 
			
		||||
/* get the Nth set bit inside the bit vector */
 | 
			
		||||
unsigned int bitvec_get_nth_set_bit(struct bitvec *bv, unsigned int n);
 | 
			
		||||
 | 
			
		||||
/* Set a bit at given position */
 | 
			
		||||
int bitvec_set_bit_pos(struct bitvec *bv, unsigned int bitnum,
 | 
			
		||||
			enum bit_value bit);
 | 
			
		||||
 | 
			
		||||
/* Set the next bit in the vector */
 | 
			
		||||
int bitvec_set_bit(struct bitvec *bv, enum bit_value bit);
 | 
			
		||||
 | 
			
		||||
/* Set multiple bits at the current position */
 | 
			
		||||
int bitvec_set_bits(struct bitvec *bv, enum bit_value *bits, int count);
 | 
			
		||||
 | 
			
		||||
/* Add an unsigned integer (of length count bits) to current position */
 | 
			
		||||
int bitvec_set_uint(struct bitvec *bv, unsigned int in, int count);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Pad the bit vector up to a certain bit position */
 | 
			
		||||
int bitvec_spare_padding(struct bitvec *bv, unsigned int up_to_bit);
 | 
			
		||||
 | 
			
		||||
#endif /* _BITVEC_H */
 | 
			
		||||
							
								
								
									
										30
									
								
								openbsc/include/openbsc/bsc_msc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								openbsc/include/openbsc/bsc_msc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
/* Routines to talk to the MSC using the IPA Protocol */
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2010 by on-waves.com
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef BSC_MSC_H
 | 
			
		||||
#define BSC_MSC_H
 | 
			
		||||
 | 
			
		||||
#include "select.h"
 | 
			
		||||
 | 
			
		||||
int connect_to_msc(struct bsc_fd *fd, const char *ip, int port);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										33
									
								
								openbsc/include/openbsc/bsc_nat.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								openbsc/include/openbsc/bsc_nat.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2010 by on-waves.com
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef BSC_NAT_H
 | 
			
		||||
#define BSC_NAT_H
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include "msgb.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * filter based on IP Access header in both directions
 | 
			
		||||
 */
 | 
			
		||||
int bsc_nat_filter_ipa(struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										19
									
								
								openbsc/include/openbsc/bsc_rll.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								openbsc/include/openbsc/bsc_rll.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#ifndef _BSC_RLL_H
 | 
			
		||||
#define _BSC_RLL_H
 | 
			
		||||
 | 
			
		||||
#include <openbsc/gsm_data.h>
 | 
			
		||||
 | 
			
		||||
enum bsc_rllr_ind {
 | 
			
		||||
	BSC_RLLR_IND_EST_CONF,
 | 
			
		||||
	BSC_RLLR_IND_REL_IND,
 | 
			
		||||
	BSC_RLLR_IND_ERR_IND,
 | 
			
		||||
	BSC_RLLR_IND_TIMEOUT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int rll_establish(struct gsm_lchan *lchan, u_int8_t link_id,
 | 
			
		||||
		  void (*cb)(struct gsm_lchan *, u_int8_t, void *,
 | 
			
		||||
			     enum bsc_rllr_ind),
 | 
			
		||||
		  void *data);
 | 
			
		||||
void rll_indication(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t type);
 | 
			
		||||
 | 
			
		||||
#endif /* _BSC_RLL_H */
 | 
			
		||||
							
								
								
									
										334
									
								
								openbsc/include/openbsc/bssap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								openbsc/include/openbsc/bssap.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,334 @@
 | 
			
		||||
/* From GSM08.08 */
 | 
			
		||||
 | 
			
		||||
#ifndef BSSAP_H
 | 
			
		||||
#define BSSAP_H
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <openbsc/msgb.h>
 | 
			
		||||
#include <openbsc/gsm_data.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * this is from GSM 03.03 CGI but is copied in GSM 08.08
 | 
			
		||||
 * in § 3.2.2.27 for Cell Identifier List
 | 
			
		||||
 */
 | 
			
		||||
enum CELL_IDENT {
 | 
			
		||||
	CELL_IDENT_WHOLE_GLOBAL		= 0,
 | 
			
		||||
	CELL_IDENT_LAC_AND_CI		= 1,
 | 
			
		||||
	CELL_IDENT_CI			= 2,
 | 
			
		||||
	CELL_IDENT_NO_CELL		= 3,
 | 
			
		||||
	CELL_IDENT_LAI_AND_LAC		= 4,
 | 
			
		||||
	CELL_IDENT_LAC			= 5,
 | 
			
		||||
	CELL_IDENT_BSS			= 6,
 | 
			
		||||
	CELL_IDENT_UTRAN_PLMN_LAC_RNC	= 8,
 | 
			
		||||
	CELL_IDENT_UTRAN_RNC		= 9,
 | 
			
		||||
	CELL_IDENT_UTRAN_LAC_RNC	= 10,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GSM 08.06 § 6.3 */
 | 
			
		||||
enum BSSAP_MSG_TYPE {
 | 
			
		||||
	BSSAP_MSG_BSS_MANAGEMENT    = 0x0,
 | 
			
		||||
	BSSAP_MSG_DTAP		    = 0x1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct bssmap_header {
 | 
			
		||||
	u_int8_t type;
 | 
			
		||||
	u_int8_t length;
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
struct dtap_header {
 | 
			
		||||
	u_int8_t type;
 | 
			
		||||
	u_int8_t link_id;
 | 
			
		||||
	u_int8_t length;
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum BSS_MAP_MSG_TYPE {
 | 
			
		||||
	BSS_MAP_MSG_RESERVED_0		= 0,
 | 
			
		||||
 | 
			
		||||
	/* ASSIGNMENT MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_ASSIGMENT_RQST	= 1,
 | 
			
		||||
	BSS_MAP_MSG_ASSIGMENT_COMPLETE	= 2,
 | 
			
		||||
	BSS_MAP_MSG_ASSIGMENT_FAILURE	= 3,
 | 
			
		||||
 | 
			
		||||
	/*  HANDOVER MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_RQST		= 16,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_REQUIRED		= 17,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_RQST_ACKNOWLEDGE= 18,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_CMD		= 19,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_COMPLETE		= 20,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_SUCCEEDED		= 21,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_FAILURE		= 22,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_PERFORMED		= 23,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_CANDIDATE_ENQUIRE	= 24,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_CANDIDATE_RESPONSE	= 25,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_REQUIRED_REJECT	= 26,
 | 
			
		||||
	BSS_MAP_MSG_HANDOVER_DETECT		= 27,
 | 
			
		||||
 | 
			
		||||
	/* RELEASE MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_CLEAR_CMD		= 32,
 | 
			
		||||
	BSS_MAP_MSG_CLEAR_COMPLETE		= 33,
 | 
			
		||||
	BSS_MAP_MSG_CLEAR_RQST		= 34,
 | 
			
		||||
	BSS_MAP_MSG_RESERVED_1			= 35,
 | 
			
		||||
	BSS_MAP_MSG_RESERVED_2			= 36,
 | 
			
		||||
	BSS_MAP_MSG_SAPI_N_REJECT		= 37,
 | 
			
		||||
	BSS_MAP_MSG_CONFUSION			= 38,
 | 
			
		||||
 | 
			
		||||
	/* OTHER CONNECTION RELATED MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_SUSPEND			= 40,
 | 
			
		||||
	BSS_MAP_MSG_RESUME			= 41,
 | 
			
		||||
	BSS_MAP_MSG_CONNECTION_ORIENTED_INFORMATION = 42,
 | 
			
		||||
	BSS_MAP_MSG_PERFORM_LOCATION_RQST	= 43,
 | 
			
		||||
	BSS_MAP_MSG_LSA_INFORMATION		= 44,
 | 
			
		||||
	BSS_MAP_MSG_PERFORM_LOCATION_RESPONSE	= 45,
 | 
			
		||||
	BSS_MAP_MSG_PERFORM_LOCATION_ABORT	= 46,
 | 
			
		||||
	BSS_MAP_MSG_COMMON_ID			= 47,
 | 
			
		||||
 | 
			
		||||
	/* GENERAL MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_RESET			= 48,
 | 
			
		||||
	BSS_MAP_MSG_RESET_ACKNOWLEDGE		= 49,
 | 
			
		||||
	BSS_MAP_MSG_OVERLOAD			= 50,
 | 
			
		||||
	BSS_MAP_MSG_RESERVED_3			= 51,
 | 
			
		||||
	BSS_MAP_MSG_RESET_CIRCUIT		= 52,
 | 
			
		||||
	BSS_MAP_MSG_RESET_CIRCUIT_ACKNOWLEDGE	= 53,
 | 
			
		||||
	BSS_MAP_MSG_MSC_INVOKE_TRACE		= 54,
 | 
			
		||||
	BSS_MAP_MSG_BSS_INVOKE_TRACE		= 55,
 | 
			
		||||
	BSS_MAP_MSG_CONNECTIONLESS_INFORMATION	= 58,
 | 
			
		||||
 | 
			
		||||
	/* TERRESTRIAL RESOURCE MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_BLOCK			= 64,
 | 
			
		||||
	BSS_MAP_MSG_BLOCKING_ACKNOWLEDGE	= 65,
 | 
			
		||||
	BSS_MAP_MSG_UNBLOCK			= 66,
 | 
			
		||||
	BSS_MAP_MSG_UNBLOCKING_ACKNOWLEDGE	= 67,
 | 
			
		||||
	BSS_MAP_MSG_CIRCUIT_GROUP_BLOCK		= 68,
 | 
			
		||||
	BSS_MAP_MSG_CIRCUIT_GROUP_BLOCKING_ACKNOWLEDGE	= 69,
 | 
			
		||||
	BSS_MAP_MSG_CIRCUIT_GROUP_UNBLOCK	= 70,
 | 
			
		||||
	BSS_MAP_MSG_CIRCUIT_GROUP_UNBLOCKING_ACKNOWLEDGE = 71,
 | 
			
		||||
	BSS_MAP_MSG_UNEQUIPPED_CIRCUIT		= 72,
 | 
			
		||||
	BSS_MAP_MSG_CHANGE_CIRCUIT		= 78,
 | 
			
		||||
	BSS_MAP_MSG_CHANGE_CIRCUIT_ACKNOWLEDGE	= 79,
 | 
			
		||||
 | 
			
		||||
	/* RADIO RESOURCE MESSAGES */
 | 
			
		||||
	BSS_MAP_MSG_RESOURCE_RQST		= 80,
 | 
			
		||||
	BSS_MAP_MSG_RESOURCE_INDICATION		= 81,
 | 
			
		||||
	BSS_MAP_MSG_PAGING			= 82,
 | 
			
		||||
	BSS_MAP_MSG_CIPHER_MODE_CMD		= 83,
 | 
			
		||||
	BSS_MAP_MSG_CLASSMARK_UPDATE		= 84,
 | 
			
		||||
	BSS_MAP_MSG_CIPHER_MODE_COMPLETE	= 85,
 | 
			
		||||
	BSS_MAP_MSG_QUEUING_INDICATION		= 86,
 | 
			
		||||
	BSS_MAP_MSG_COMPLETE_LAYER_3		= 87,
 | 
			
		||||
	BSS_MAP_MSG_CLASSMARK_RQST		= 88,
 | 
			
		||||
	BSS_MAP_MSG_CIPHER_MODE_REJECT		= 89,
 | 
			
		||||
	BSS_MAP_MSG_LOAD_INDICATION		= 90,
 | 
			
		||||
 | 
			
		||||
	/* VGCS/VBS */
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_SETUP		= 4,
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_SETUP_ACK		= 5,
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_SETUP_REFUSE	= 6,
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_RQST	= 7,
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_RESULT	= 28,
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_FAILURE	= 29,
 | 
			
		||||
	BSS_MAP_MSG_VGCS_VBS_QUEUING_INDICATION	= 30,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_RQST		= 31,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_RQST_ACKNOWLEDGE	= 39,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_RQST_CONFIRMATION	= 73,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_RELEASE_INDICATION	= 74,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_REJECT_CMD	= 75,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_RELEASE_CMD	= 76,
 | 
			
		||||
	BSS_MAP_MSG_UPLINK_SEIZED_CMD	= 77,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum GSM0808_IE_CODING {
 | 
			
		||||
	GSM0808_IE_CIRCUIT_IDENTITY_CODE	= 1,
 | 
			
		||||
	GSM0808_IE_RESERVED_0			= 2,
 | 
			
		||||
	GSM0808_IE_RESOURCE_AVAILABLE		= 3,
 | 
			
		||||
	GSM0808_IE_CAUSE			= 4,
 | 
			
		||||
	GSM0808_IE_CELL_IDENTIFIER		= 5,
 | 
			
		||||
	GSM0808_IE_PRIORITY			= 6,
 | 
			
		||||
	GSM0808_IE_LAYER_3_HEADER_INFORMATION	= 7,
 | 
			
		||||
	GSM0808_IE_IMSI				= 8,
 | 
			
		||||
	GSM0808_IE_TMSI				= 9,
 | 
			
		||||
	GSM0808_IE_ENCRYPTION_INFORMATION	= 10,
 | 
			
		||||
	GSM0808_IE_CHANNEL_TYPE			= 11,
 | 
			
		||||
	GSM0808_IE_PERIODICITY			= 12,
 | 
			
		||||
	GSM0808_IE_EXTENDED_RESOURCE_INDICATOR	= 13,
 | 
			
		||||
	GSM0808_IE_NUMBER_OF_MSS		= 14,
 | 
			
		||||
	GSM0808_IE_RESERVED_1			= 15,
 | 
			
		||||
	GSM0808_IE_RESERVED_2			= 16,
 | 
			
		||||
	GSM0808_IE_RESERVED_3			= 17,
 | 
			
		||||
	GSM0808_IE_CLASSMARK_INFORMATION_T2	= 18,
 | 
			
		||||
	GSM0808_IE_CLASSMARK_INFORMATION_T3	= 19,
 | 
			
		||||
	GSM0808_IE_INTERFERENCE_BAND_TO_USE	= 20,
 | 
			
		||||
	GSM0808_IE_RR_CAUSE			= 21,
 | 
			
		||||
	GSM0808_IE_RESERVED_4			= 22,
 | 
			
		||||
	GSM0808_IE_LAYER_3_INFORMATION		= 23,
 | 
			
		||||
	GSM0808_IE_DLCI				= 24,
 | 
			
		||||
	GSM0808_IE_DOWNLINK_DTX_FLAG		= 25,
 | 
			
		||||
	GSM0808_IE_CELL_IDENTIFIER_LIST		= 26,
 | 
			
		||||
	GSM0808_IE_RESPONSE_RQST		= 27,
 | 
			
		||||
	GSM0808_IE_RESOURCE_INDICATION_METHOD	= 28,
 | 
			
		||||
	GSM0808_IE_CLASSMARK_INFORMATION_TYPE_1	= 29,
 | 
			
		||||
	GSM0808_IE_CIRCUIT_IDENTITY_CODE_LIST	= 30,
 | 
			
		||||
	GSM0808_IE_DIAGNOSTIC			= 31,
 | 
			
		||||
	GSM0808_IE_LAYER_3_MESSAGE_CONTENTS	= 32,
 | 
			
		||||
	GSM0808_IE_CHOSEN_CHANNEL		= 33,
 | 
			
		||||
	GSM0808_IE_TOTAL_RESOURCE_ACCESSIBLE	= 34,
 | 
			
		||||
	GSM0808_IE_CIPHER_RESPONSE_MODE		= 35,
 | 
			
		||||
	GSM0808_IE_CHANNEL_NEEDED		= 36,
 | 
			
		||||
	GSM0808_IE_TRACE_TYPE			= 37,
 | 
			
		||||
	GSM0808_IE_TRIGGERID			= 38,
 | 
			
		||||
	GSM0808_IE_TRACE_REFERENCE		= 39,
 | 
			
		||||
	GSM0808_IE_TRANSACTIONID		= 40,
 | 
			
		||||
	GSM0808_IE_MOBILE_IDENTITY		= 41,
 | 
			
		||||
	GSM0808_IE_OMCID			= 42,
 | 
			
		||||
	GSM0808_IE_FORWARD_INDICATOR		= 43,
 | 
			
		||||
	GSM0808_IE_CHOSEN_ENCR_ALG		= 44,
 | 
			
		||||
	GSM0808_IE_CIRCUIT_POOL			= 45,
 | 
			
		||||
	GSM0808_IE_CIRCUIT_POOL_LIST		= 46,
 | 
			
		||||
	GSM0808_IE_TIME_INDICATION		= 47,
 | 
			
		||||
	GSM0808_IE_RESOURCE_SITUATION		= 48,
 | 
			
		||||
	GSM0808_IE_CURRENT_CHANNEL_TYPE_1	= 49,
 | 
			
		||||
	GSM0808_IE_QUEUEING_INDICATOR		= 50,
 | 
			
		||||
	GSM0808_IE_SPEECH_VERSION		= 64,
 | 
			
		||||
	GSM0808_IE_ASSIGNMENT_REQUIREMENT	= 51,
 | 
			
		||||
	GSM0808_IE_TALKER_FLAG			= 53,
 | 
			
		||||
	GSM0808_IE_CONNECTION_RELEASE_RQSTED	= 54,
 | 
			
		||||
	GSM0808_IE_GROUP_CALL_REFERENCE		= 55,
 | 
			
		||||
	GSM0808_IE_EMLPP_PRIORITY		= 56,
 | 
			
		||||
	GSM0808_IE_CONFIG_EVO_INDI		= 57,
 | 
			
		||||
	GSM0808_IE_OLD_BSS_TO_NEW_BSS_INFORMATION	= 58,
 | 
			
		||||
	GSM0808_IE_LSA_IDENTIFIER		= 59,
 | 
			
		||||
	GSM0808_IE_LSA_IDENTIFIER_LIST		= 60,
 | 
			
		||||
	GSM0808_IE_LSA_INFORMATION		= 61,
 | 
			
		||||
	GSM0808_IE_LCS_QOS			= 62,
 | 
			
		||||
	GSM0808_IE_LSA_ACCESS_CTRL_SUPPR	= 63,
 | 
			
		||||
	GSM0808_IE_LCS_PRIORITY			= 67,
 | 
			
		||||
	GSM0808_IE_LOCATION_TYPE		= 68,
 | 
			
		||||
	GSM0808_IE_LOCATION_ESTIMATE		= 69,
 | 
			
		||||
	GSM0808_IE_POSITIONING_DATA		= 70,
 | 
			
		||||
	GSM0808_IE_LCS_CAUSE			= 71,
 | 
			
		||||
	GSM0808_IE_LCS_CLIENT_TYPE		= 72,
 | 
			
		||||
	GSM0808_IE_APDU				= 73,
 | 
			
		||||
	GSM0808_IE_NETWORK_ELEMENT_IDENTITY	= 74,
 | 
			
		||||
	GSM0808_IE_GPS_ASSISTANCE_DATA		= 75,
 | 
			
		||||
	GSM0808_IE_DECIPHERING_KEYS		= 76,
 | 
			
		||||
	GSM0808_IE_RETURN_ERROR_RQST		= 77,
 | 
			
		||||
	GSM0808_IE_RETURN_ERROR_CAUSE		= 78,
 | 
			
		||||
	GSM0808_IE_SEGMENTATION			= 79,
 | 
			
		||||
	GSM0808_IE_SERVICE_HANDOVER		= 80,
 | 
			
		||||
	GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_UMTS	= 81,
 | 
			
		||||
	GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_CDMA2000= 82,
 | 
			
		||||
	GSM0808_IE_RESERVED_5			= 65,
 | 
			
		||||
	GSM0808_IE_RESERVED_6			= 66,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm0808_cause {
 | 
			
		||||
	GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE			= 0,
 | 
			
		||||
	GSM0808_CAUSE_RADIO_INTERFACE_FAILURE				= 1,
 | 
			
		||||
	GSM0808_CAUSE_UPLINK_QUALITY					= 2,
 | 
			
		||||
	GSM0808_CAUSE_UPLINK_STRENGTH					= 3,
 | 
			
		||||
	GSM0808_CAUSE_DOWNLINK_QUALITY					= 4,
 | 
			
		||||
	GSM0808_CAUSE_DOWNLINK_STRENGTH					= 5,
 | 
			
		||||
	GSM0808_CAUSE_DISTANCE						= 6,
 | 
			
		||||
	GSM0808_CAUSE_O_AND_M_INTERVENTION				= 7,
 | 
			
		||||
	GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION			= 8,
 | 
			
		||||
	GSM0808_CAUSE_CALL_CONTROL					= 9,
 | 
			
		||||
	GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION			= 10,
 | 
			
		||||
	GSM0808_CAUSE_HANDOVER_SUCCESSFUL				= 11,
 | 
			
		||||
	GSM0808_CAUSE_BETTER_CELL					= 12,
 | 
			
		||||
	GSM0808_CAUSE_DIRECTED_RETRY					= 13,
 | 
			
		||||
	GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL				= 14,
 | 
			
		||||
	GSM0808_CAUSE_TRAFFIC						= 15,
 | 
			
		||||
	GSM0808_CAUSE_EQUIPMENT_FAILURE					= 32,
 | 
			
		||||
	GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE			= 33,
 | 
			
		||||
	GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE	= 34,
 | 
			
		||||
	GSM0808_CAUSE_CCCH_OVERLOAD					= 35,
 | 
			
		||||
	GSM0808_CAUSE_PROCESSOR_OVERLOAD				= 36,
 | 
			
		||||
	GSM0808_CAUSE_BSS_NOT_EQUIPPED					= 37,
 | 
			
		||||
	GSM0808_CAUSE_MS_NOT_EQUIPPED					= 38,
 | 
			
		||||
	GSM0808_CAUSE_INVALID_CELL					= 39,
 | 
			
		||||
	GSM0808_CAUSE_TRAFFIC_LOAD					= 40,
 | 
			
		||||
	GSM0808_CAUSE_PREEMPTION					= 41,
 | 
			
		||||
	GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE	= 48,
 | 
			
		||||
	GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH				= 49,
 | 
			
		||||
	GSM0808_CAUSE_SWITCH_CIRCUIT_POOL				= 50,
 | 
			
		||||
	GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE		= 51,
 | 
			
		||||
	GSM0808_CAUSE_LSA_NOT_ALLOWED					= 52,
 | 
			
		||||
	GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED			= 64,
 | 
			
		||||
	GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED		= 80,
 | 
			
		||||
	GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS				= 81,
 | 
			
		||||
	GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING		= 82,
 | 
			
		||||
	GSM0808_CAUSE_INCORRECT_VALUE					= 83,
 | 
			
		||||
	GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE				= 84,
 | 
			
		||||
	GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT			= 85,
 | 
			
		||||
	GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC		= 96,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* GSM 08.08 3.2.2.11 Channel Type */
 | 
			
		||||
enum gsm0808_chan_indicator {
 | 
			
		||||
	GSM0808_CHAN_SPEECH = 1,
 | 
			
		||||
	GSM0808_CHAN_DATA   = 2,
 | 
			
		||||
	GSM0808_CHAN_SIGN   = 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm0808_chan_rate_type_data {
 | 
			
		||||
	GSM0808_DATA_FULL_BM	= 0x8,
 | 
			
		||||
	GSM0808_DATA_HALF_LM	= 0x9,
 | 
			
		||||
	GSM0808_DATA_FULL_RPREF	= 0xa,
 | 
			
		||||
	GSM0808_DATA_HALF_PREF	= 0xb,
 | 
			
		||||
	GSM0808_DATA_FULL_PREF_NO_CHANGE	= 0x1a,
 | 
			
		||||
	GSM0808_DATA_HALF_PREF_NO_CHANGE	= 0x1b,
 | 
			
		||||
	GSM0808_DATA_MULTI_MASK	= 0x20,
 | 
			
		||||
	GSM0808_DATA_MULTI_MASK_NO_CHANGE	= 0x30,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm0808_chan_rate_type_speech {
 | 
			
		||||
	GSM0808_SPEECH_FULL_BM	= 0x8,
 | 
			
		||||
	GSM0808_SPEECH_HALF_LM	= 0x9,
 | 
			
		||||
	GSM0808_SPEECH_FULL_PREF= 0xa,
 | 
			
		||||
	GSM0808_SPEECH_HALF_PREF= 0xb,
 | 
			
		||||
	GSM0808_SPEECH_FULL_PREF_NO_CHANGE	= 0x1a,
 | 
			
		||||
	GSM0808_SPEECH_HALF_PREF_NO_CHANGE	= 0x1b,
 | 
			
		||||
	GSM0808_SPEECH_PERM	= 0xf,
 | 
			
		||||
	GSM0808_SPEECH_PERM_NO_CHANGE = 0x1f,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm0808_permitted_speech {
 | 
			
		||||
	GSM0808_PERM_FR1	= 0x01,
 | 
			
		||||
	GSM0808_PERM_FR2	= 0x11,
 | 
			
		||||
	GSM0808_PERM_FR3	= 0x21,
 | 
			
		||||
	GSM0808_PERM_HR1	= GSM0808_PERM_FR1 | 0x4,
 | 
			
		||||
	GSM0808_PERM_HR2	= GSM0808_PERM_FR2 | 0x4,
 | 
			
		||||
	GSM0808_PERM_HR3	= GSM0808_PERM_FR3 | 0x4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int bssmap_rcvmsg_dt1(struct sccp_connection *conn, struct msgb *msg, unsigned int length);
 | 
			
		||||
int bssmap_rcvmsg_udt(struct gsm_network *net, struct msgb *msg, unsigned int length);
 | 
			
		||||
 | 
			
		||||
struct msgb *bssmap_create_layer3(struct msgb *msg);
 | 
			
		||||
struct msgb *bssmap_create_reset(void);
 | 
			
		||||
struct msgb *bssmap_create_clear_complete(void);
 | 
			
		||||
struct msgb *bssmap_create_cipher_complete(struct msgb *layer3);
 | 
			
		||||
struct msgb *bssmap_create_cipher_reject(u_int8_t cause);
 | 
			
		||||
struct msgb *bssmap_create_sapi_reject(u_int8_t link_id);
 | 
			
		||||
struct msgb *bssmap_create_assignment_completed(struct gsm_lchan *lchan, u_int8_t rr_cause);
 | 
			
		||||
struct msgb *bssmap_create_assignment_failure(u_int8_t cause, u_int8_t *rr_cause);
 | 
			
		||||
struct msgb *bssmap_create_classmark_update(const u_int8_t *classmark, u_int8_t length);
 | 
			
		||||
 | 
			
		||||
void gsm0808_send_assignment_failure(struct gsm_lchan *l, u_int8_t cause, u_int8_t *rr_value);
 | 
			
		||||
void gsm0808_send_assignment_compl(struct gsm_lchan *l, u_int8_t rr_value);
 | 
			
		||||
 | 
			
		||||
int dtap_rcvmsg(struct gsm_lchan *lchan, struct msgb *msg, unsigned int length);
 | 
			
		||||
struct msgb *dtap_create_msg(struct msgb *msg_l3, u_int8_t link_id);
 | 
			
		||||
 | 
			
		||||
void bsc_queue_connection_write(struct sccp_connection *conn, struct msgb *msg);
 | 
			
		||||
void bsc_free_queued(struct sccp_connection *conn);
 | 
			
		||||
void bsc_send_queued(struct sccp_connection *conn);
 | 
			
		||||
 | 
			
		||||
void bts_queue_send(struct msgb *msg, int link_id);
 | 
			
		||||
void bts_send_queued(struct bss_sccp_connection_data*);
 | 
			
		||||
void bts_free_queued(struct bss_sccp_connection_data*);
 | 
			
		||||
void bts_unblock_queue(struct bss_sccp_connection_data*);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										74
									
								
								openbsc/include/openbsc/chan_alloc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								openbsc/include/openbsc/chan_alloc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
/* Management functions to allocate/release struct gsm_lchan */
 | 
			
		||||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _CHAN_ALLOC_H
 | 
			
		||||
#define _CHAN_ALLOC_H
 | 
			
		||||
 | 
			
		||||
#include "gsm_subscriber.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Refcounting for the lchan. If the refcount drops to zero
 | 
			
		||||
 * the channel will send a RSL release request.
 | 
			
		||||
 */
 | 
			
		||||
#define use_lchan(lchan) \
 | 
			
		||||
	do {	lchan->use_count++; \
 | 
			
		||||
		DEBUGP(DCC, "lchan (bts=%d,trx=%d,ts=%d,ch=%d) increases usage to: %d\n", \
 | 
			
		||||
			lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr, \
 | 
			
		||||
			lchan->nr, lchan->use_count); \
 | 
			
		||||
	} while(0);
 | 
			
		||||
 | 
			
		||||
#define put_lchan(lchan) \
 | 
			
		||||
	do { lchan->use_count--; \
 | 
			
		||||
		DEBUGP(DCC, "lchan (bts=%d,trx=%d,ts=%d,ch=%d) decreases usage to: %d\n", \
 | 
			
		||||
			lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr, \
 | 
			
		||||
			lchan->nr, lchan->use_count); \
 | 
			
		||||
	    if (lchan->use_count <= 0) \
 | 
			
		||||
		_lchan_release(lchan); \
 | 
			
		||||
	} while(0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Special allocator for C0 of BTS */
 | 
			
		||||
struct gsm_bts_trx_ts *ts_c0_alloc(struct gsm_bts *bts,
 | 
			
		||||
				   enum gsm_phys_chan_config pchan);
 | 
			
		||||
 | 
			
		||||
/* Regular physical channel allocator */
 | 
			
		||||
struct gsm_bts_trx_ts *ts_alloc(struct gsm_bts *bts,
 | 
			
		||||
				enum gsm_phys_chan_config pchan);
 | 
			
		||||
 | 
			
		||||
/* Regular physical channel (TS) */
 | 
			
		||||
void ts_free(struct gsm_bts_trx_ts *ts);
 | 
			
		||||
 | 
			
		||||
/* Find an allocated channel */
 | 
			
		||||
struct gsm_lchan *lchan_find(struct gsm_bts *bts, struct gsm_subscriber *subscr);
 | 
			
		||||
 | 
			
		||||
/* Find an allocated channel for a specified subscriber */
 | 
			
		||||
struct gsm_lchan *lchan_for_subscr(struct gsm_subscriber *subscr);
 | 
			
		||||
 | 
			
		||||
/* Allocate a logical channel (SDCCH, TCH, ...) */
 | 
			
		||||
struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type);
 | 
			
		||||
 | 
			
		||||
/* Free a logical channel (SDCCH, TCH, ...) */
 | 
			
		||||
void lchan_free(struct gsm_lchan *lchan);
 | 
			
		||||
 | 
			
		||||
/* internal.. do not use */
 | 
			
		||||
int _lchan_release(struct gsm_lchan *lchan);
 | 
			
		||||
 | 
			
		||||
#endif /* _CHAN_ALLOC_H */
 | 
			
		||||
							
								
								
									
										56
									
								
								openbsc/include/openbsc/db.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								openbsc/include/openbsc/db.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
/* (C) 2008 by Jan Luebbe <jluebbe@debian.org>
 | 
			
		||||
 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _DB_H
 | 
			
		||||
#define _DB_H
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <openbsc/gsm_subscriber.h>
 | 
			
		||||
 | 
			
		||||
/* one time initialisation */
 | 
			
		||||
int db_init(const char *name);
 | 
			
		||||
int db_prepare();
 | 
			
		||||
int db_fini();
 | 
			
		||||
 | 
			
		||||
/* subscriber management */
 | 
			
		||||
struct gsm_subscriber* db_create_subscriber(struct gsm_network *net,
 | 
			
		||||
					    char *imsi);
 | 
			
		||||
struct gsm_subscriber* db_get_subscriber(struct gsm_network *net,
 | 
			
		||||
					 enum gsm_subscriber_field field,
 | 
			
		||||
					 const char *subscr);
 | 
			
		||||
int db_sync_subscriber(struct gsm_subscriber* subscriber);
 | 
			
		||||
int db_subscriber_alloc_tmsi(struct gsm_subscriber* subscriber);
 | 
			
		||||
int db_subscriber_alloc_exten(struct gsm_subscriber* subscriber);
 | 
			
		||||
int db_subscriber_alloc_token(struct gsm_subscriber* subscriber, u_int32_t* token);
 | 
			
		||||
int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char *imei);
 | 
			
		||||
int db_sync_equipment(struct gsm_equipment *equip);
 | 
			
		||||
 | 
			
		||||
/* SMS store-and-forward */
 | 
			
		||||
int db_sms_store(struct gsm_sms *sms);
 | 
			
		||||
struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id);
 | 
			
		||||
struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr);
 | 
			
		||||
int db_sms_mark_sent(struct gsm_sms *sms);
 | 
			
		||||
 | 
			
		||||
/* APDU blob storage */
 | 
			
		||||
int db_apdu_blob_store(struct gsm_subscriber *subscr, 
 | 
			
		||||
			u_int8_t apdu_id_flags, u_int8_t len,
 | 
			
		||||
			u_int8_t *apdu);
 | 
			
		||||
#endif /* _DB_H */
 | 
			
		||||
							
								
								
									
										58
									
								
								openbsc/include/openbsc/debug.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								openbsc/include/openbsc/debug.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
#ifndef _DEBUG_H
 | 
			
		||||
#define _DEBUG_H
 | 
			
		||||
 | 
			
		||||
#define DEBUG
 | 
			
		||||
 | 
			
		||||
#define DRLL		0x0001
 | 
			
		||||
#define DCC		0x0002
 | 
			
		||||
#define DMM		0x0004
 | 
			
		||||
#define DRR		0x0008
 | 
			
		||||
#define DRSL		0x0010
 | 
			
		||||
#define DNM		0x0020
 | 
			
		||||
 | 
			
		||||
#define DMNCC		0x0080
 | 
			
		||||
#define DSMS		0x0100
 | 
			
		||||
#define DPAG		0x0200
 | 
			
		||||
#define DMEAS		0x0400
 | 
			
		||||
 | 
			
		||||
#define DMI		0x1000
 | 
			
		||||
#define DMIB		0x2000
 | 
			
		||||
#define DMUX		0x4000
 | 
			
		||||
#define DINP		0x8000
 | 
			
		||||
 | 
			
		||||
#define DSCCP		0x10000
 | 
			
		||||
#define DMSC		0x20000
 | 
			
		||||
 | 
			
		||||
#define DMGCP		0x40000
 | 
			
		||||
 | 
			
		||||
#define DHO		0x80000
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
#define DEBUGP(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 0, fmt, ## args)
 | 
			
		||||
#define DEBUGPC(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 1, fmt, ## args)
 | 
			
		||||
#else
 | 
			
		||||
#define DEBUGP(xss, fmt, args...) 
 | 
			
		||||
#define DEBUGPC(ss, fmt, args...)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1];
 | 
			
		||||
 | 
			
		||||
char *hexdump(const unsigned char *buf, int len);
 | 
			
		||||
void debugp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
 | 
			
		||||
void debug_parse_category_mask(const char* mask);
 | 
			
		||||
void debug_use_color(int use_color);
 | 
			
		||||
void debug_timestamp(int enable);
 | 
			
		||||
extern unsigned int debug_mask;
 | 
			
		||||
 | 
			
		||||
/* new logging interface */
 | 
			
		||||
#define LOGP(ss, level, fmt, args...) debugp(ss, __FILE__, __LINE__, 0, fmt, ##args)
 | 
			
		||||
#define LOGPC(ss, level, fmt, args...) debugp(ss, __FILE__, __LINE__, 1, fmt, ##args)
 | 
			
		||||
 | 
			
		||||
/* different levels */
 | 
			
		||||
#define LOGL_DEBUG	1	/* debugging information */
 | 
			
		||||
#define LOGL_INFO	3
 | 
			
		||||
#define LOGL_NOTICE	5	/* abnormal/unexpected condition */
 | 
			
		||||
#define LOGL_ERROR	7	/* error condition, requires user action */
 | 
			
		||||
#define LOGL_FATAL	8	/* fatal, program aborted */
 | 
			
		||||
 | 
			
		||||
#endif /* _DEBUG_H */
 | 
			
		||||
							
								
								
									
										168
									
								
								openbsc/include/openbsc/e1_input.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								openbsc/include/openbsc/e1_input.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
#ifndef _E1_INPUT_H
 | 
			
		||||
#define _E1_INPUT_H
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
#include <openbsc/linuxlist.h>
 | 
			
		||||
#include <openbsc/gsm_data.h>
 | 
			
		||||
#include <openbsc/msgb.h>
 | 
			
		||||
#include <openbsc/select.h>
 | 
			
		||||
#include <openbsc/subchan_demux.h>
 | 
			
		||||
 | 
			
		||||
#define NUM_E1_TS   32
 | 
			
		||||
 | 
			
		||||
enum e1inp_sign_type {
 | 
			
		||||
	E1INP_SIGN_NONE,
 | 
			
		||||
	E1INP_SIGN_OML,
 | 
			
		||||
	E1INP_SIGN_RSL,
 | 
			
		||||
};
 | 
			
		||||
const char *e1inp_signtype_name(enum e1inp_sign_type tp);
 | 
			
		||||
 | 
			
		||||
struct e1inp_ts;
 | 
			
		||||
 | 
			
		||||
struct e1inp_sign_link {
 | 
			
		||||
	/* list of signalling links */
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
 | 
			
		||||
	/* to which timeslot do we belong? */
 | 
			
		||||
	struct e1inp_ts *ts;
 | 
			
		||||
 | 
			
		||||
	enum e1inp_sign_type type;
 | 
			
		||||
 | 
			
		||||
	/* trx for msg->trx of received msgs */	
 | 
			
		||||
	struct gsm_bts_trx *trx;
 | 
			
		||||
 | 
			
		||||
	/* msgb queue of to-be-transmitted msgs */
 | 
			
		||||
	struct llist_head tx_list;
 | 
			
		||||
 | 
			
		||||
	/* SAPI and TEI on the E1 TS */
 | 
			
		||||
	u_int8_t sapi;
 | 
			
		||||
	u_int8_t tei;
 | 
			
		||||
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			u_int8_t channel;
 | 
			
		||||
		} misdn;
 | 
			
		||||
	} driver;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum e1inp_ts_type {
 | 
			
		||||
	E1INP_TS_TYPE_NONE,
 | 
			
		||||
	E1INP_TS_TYPE_SIGN,
 | 
			
		||||
	E1INP_TS_TYPE_TRAU,
 | 
			
		||||
};
 | 
			
		||||
const char *e1inp_tstype_name(enum e1inp_ts_type tp);
 | 
			
		||||
 | 
			
		||||
/* A timeslot in the E1 interface */
 | 
			
		||||
struct e1inp_ts {
 | 
			
		||||
	enum e1inp_ts_type type;
 | 
			
		||||
	int num;
 | 
			
		||||
 | 
			
		||||
	/* to which line do we belong ? */
 | 
			
		||||
	struct e1inp_line *line;
 | 
			
		||||
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			/* list of all signalling links on this TS */
 | 
			
		||||
			struct llist_head sign_links;
 | 
			
		||||
			/* timer when to dequeue next frame */
 | 
			
		||||
			struct timer_list tx_timer;
 | 
			
		||||
		} sign;
 | 
			
		||||
		struct {
 | 
			
		||||
			/* subchannel demuxer for frames from E1 */
 | 
			
		||||
			struct subch_demux demux;
 | 
			
		||||
			/* subchannel muxer for frames to E1 */
 | 
			
		||||
			struct subch_mux mux;
 | 
			
		||||
		} trau;
 | 
			
		||||
	};
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			/* mISDN driver has one fd for each ts */
 | 
			
		||||
			struct bsc_fd fd;
 | 
			
		||||
		} misdn;
 | 
			
		||||
		struct {
 | 
			
		||||
			/* ip.access driver has one fd for each ts */
 | 
			
		||||
			struct bsc_fd fd;
 | 
			
		||||
		} ipaccess;
 | 
			
		||||
 | 
			
		||||
	} driver;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct e1inp_driver {
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
	const char *name;
 | 
			
		||||
	int (*want_write)(struct e1inp_ts *ts);
 | 
			
		||||
};	
 | 
			
		||||
 | 
			
		||||
struct e1inp_line {
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
	unsigned int num;
 | 
			
		||||
	const char *name;
 | 
			
		||||
 | 
			
		||||
	/* array of timestlots */
 | 
			
		||||
	struct e1inp_ts ts[NUM_E1_TS];
 | 
			
		||||
 | 
			
		||||
	struct e1inp_driver *driver;
 | 
			
		||||
	void *driver_data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* register a driver with the E1 core */
 | 
			
		||||
int e1inp_driver_register(struct e1inp_driver *drv);
 | 
			
		||||
 | 
			
		||||
/* register a line with the E1 core */
 | 
			
		||||
int e1inp_line_register(struct e1inp_line *line);
 | 
			
		||||
 | 
			
		||||
/* ensure a certain line exists, return pointer to it */
 | 
			
		||||
struct e1inp_line *e1inp_line_get_create(u_int8_t e1_nr);
 | 
			
		||||
 | 
			
		||||
/* find a sign_link for given TEI and SAPI in a TS */
 | 
			
		||||
struct e1inp_sign_link *
 | 
			
		||||
e1inp_lookup_sign_link(struct e1inp_ts *ts, u_int8_t tei,
 | 
			
		||||
			u_int8_t sapi);
 | 
			
		||||
 | 
			
		||||
/* create a new signalling link in a E1 timeslot */
 | 
			
		||||
struct e1inp_sign_link *
 | 
			
		||||
e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type,
 | 
			
		||||
			struct gsm_bts_trx *trx, u_int8_t tei,
 | 
			
		||||
			u_int8_t sapi);
 | 
			
		||||
 | 
			
		||||
/* configure and initialize one e1inp_ts */
 | 
			
		||||
int e1inp_ts_config(struct e1inp_ts *ts, struct e1inp_line *line,
 | 
			
		||||
		    enum e1inp_ts_type type);
 | 
			
		||||
 | 
			
		||||
/* Call from the Stack: configuration of this TS has changed */
 | 
			
		||||
int e1inp_update_ts(struct e1inp_ts *ts);
 | 
			
		||||
 | 
			
		||||
/* Receive a packet from the E1 driver */
 | 
			
		||||
int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
 | 
			
		||||
		u_int8_t tei, u_int8_t sapi);
 | 
			
		||||
 | 
			
		||||
/* called by driver if it wants to transmit on a given TS */
 | 
			
		||||
struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts,
 | 
			
		||||
			 struct e1inp_sign_link **sign_link);
 | 
			
		||||
 | 
			
		||||
/* called by driver in case some kind of link state event */
 | 
			
		||||
int e1inp_event(struct e1inp_ts *ts, int evt, u_int8_t tei, u_int8_t sapi);
 | 
			
		||||
 | 
			
		||||
/* Write LAPD frames to the fd. */
 | 
			
		||||
void e1_set_pcap_fd(int fd);
 | 
			
		||||
 | 
			
		||||
/* called by TRAU muxer to obtain the destination mux entity */
 | 
			
		||||
struct subch_mux *e1inp_get_mux(u_int8_t e1_nr, u_int8_t ts_nr);
 | 
			
		||||
 | 
			
		||||
void e1inp_sign_link_destroy(struct e1inp_sign_link *link);
 | 
			
		||||
int e1inp_line_update(struct e1inp_line *line);
 | 
			
		||||
 | 
			
		||||
/* e1_config.c */
 | 
			
		||||
int e1_reconfig_ts(struct gsm_bts_trx_ts *ts);
 | 
			
		||||
int e1_reconfig_trx(struct gsm_bts_trx *trx);
 | 
			
		||||
int e1_reconfig_bts(struct gsm_bts *bts);
 | 
			
		||||
 | 
			
		||||
int ia_config_connect(struct gsm_bts *bts, struct sockaddr_in *sin);
 | 
			
		||||
int ipaccess_setup(struct gsm_network *gsmnet);
 | 
			
		||||
 | 
			
		||||
extern struct llist_head e1inp_driver_list;
 | 
			
		||||
extern struct llist_head e1inp_line_list;
 | 
			
		||||
 | 
			
		||||
#endif /* _E1_INPUT_H */
 | 
			
		||||
							
								
								
									
										796
									
								
								openbsc/include/openbsc/gsm_04_08.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										796
									
								
								openbsc/include/openbsc/gsm_04_08.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,796 @@
 | 
			
		||||
#ifndef _GSM_04_08_H
 | 
			
		||||
#define _GSM_04_08_H
 | 
			
		||||
 | 
			
		||||
#include <openbsc/meas_rep.h>
 | 
			
		||||
 | 
			
		||||
/* GSM TS 04.08  definitions */
 | 
			
		||||
struct gsm_lchan;
 | 
			
		||||
 | 
			
		||||
struct gsm48_classmark1 {
 | 
			
		||||
	u_int8_t spare:1,
 | 
			
		||||
		 rev_level:2,
 | 
			
		||||
		 es_ind:1,
 | 
			
		||||
		 a5_1:1,
 | 
			
		||||
		 pwr_lev:3;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.2.5 */
 | 
			
		||||
struct gsm48_chan_desc {
 | 
			
		||||
	u_int8_t chan_nr;
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			u_int8_t maio_high:4,
 | 
			
		||||
				 h:1,
 | 
			
		||||
				 tsc:3;
 | 
			
		||||
			u_int8_t hsn:6,
 | 
			
		||||
				 maio_low:2;
 | 
			
		||||
		} h1;
 | 
			
		||||
		struct {
 | 
			
		||||
			u_int8_t arfcn_high:2,
 | 
			
		||||
				 spare:2,
 | 
			
		||||
				 h:1,
 | 
			
		||||
				 tsc:3;
 | 
			
		||||
			u_int8_t arfcn_low;
 | 
			
		||||
		} h0;
 | 
			
		||||
	};
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.2.21aa */
 | 
			
		||||
struct gsm48_multi_rate_conf {
 | 
			
		||||
	u_int8_t smod : 2,
 | 
			
		||||
		 spare: 1,
 | 
			
		||||
		 icmi : 1,
 | 
			
		||||
		 nscb : 1,
 | 
			
		||||
		 ver : 3;
 | 
			
		||||
	u_int8_t m4_75 : 1,
 | 
			
		||||
		 m5_15 : 1,
 | 
			
		||||
		 m5_90 : 1,
 | 
			
		||||
		 m6_70 : 1,
 | 
			
		||||
		 m7_40 : 1,
 | 
			
		||||
		 m7_95 : 1,
 | 
			
		||||
		 m10_2 : 1,
 | 
			
		||||
		 m12_2 : 1;
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.2.30 */
 | 
			
		||||
struct gsm48_req_ref {
 | 
			
		||||
	u_int8_t ra;
 | 
			
		||||
	u_int8_t t3_high:3,
 | 
			
		||||
		 t1_:5;
 | 
			
		||||
	u_int8_t t2:5,
 | 
			
		||||
		 t3_low:3;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chapter 9.1.5/9.1.6
 | 
			
		||||
 *
 | 
			
		||||
 * For 9.1.6 the chan_desc has the meaning of 10.5.2.5a
 | 
			
		||||
 */
 | 
			
		||||
struct gsm48_chan_mode_modify {
 | 
			
		||||
	struct gsm48_chan_desc chan_desc;
 | 
			
		||||
	u_int8_t mode;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
enum gsm48_chan_mode {
 | 
			
		||||
	GSM48_CMODE_SIGN	= 0x00,
 | 
			
		||||
	GSM48_CMODE_SPEECH_V1	= 0x01,
 | 
			
		||||
	GSM48_CMODE_SPEECH_EFR	= 0x21,
 | 
			
		||||
	GSM48_CMODE_SPEECH_AMR	= 0x41,
 | 
			
		||||
	GSM48_CMODE_DATA_14k5	= 0x0f,
 | 
			
		||||
	GSM48_CMODE_DATA_12k0	= 0x03,
 | 
			
		||||
	GSM48_CMODE_DATA_6k0	= 0x0b,
 | 
			
		||||
	GSM48_CMODE_DATA_3k6	= 0x23,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1.2 */
 | 
			
		||||
struct gsm48_ass_cmd {
 | 
			
		||||
	/* Semantic is from 10.5.2.5a */
 | 
			
		||||
	struct gsm48_chan_desc chan_desc;
 | 
			
		||||
	u_int8_t power_command;
 | 
			
		||||
	u_int8_t data[0];
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.2.2 */
 | 
			
		||||
struct gsm48_cell_desc {
 | 
			
		||||
	u_int8_t bcc:3,
 | 
			
		||||
		 ncc:3,
 | 
			
		||||
		 arfcn_hi:2;
 | 
			
		||||
	u_int8_t arfcn_lo;
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1.15 */
 | 
			
		||||
struct gsm48_ho_cmd {
 | 
			
		||||
	struct gsm48_cell_desc cell_desc;
 | 
			
		||||
	struct gsm48_chan_desc chan_desc;
 | 
			
		||||
	u_int8_t ho_ref;
 | 
			
		||||
	u_int8_t power_command;
 | 
			
		||||
	u_int8_t data[0];
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1.18 */
 | 
			
		||||
struct gsm48_imm_ass {
 | 
			
		||||
	u_int8_t l2_plen;
 | 
			
		||||
	u_int8_t proto_discr;
 | 
			
		||||
	u_int8_t msg_type;
 | 
			
		||||
	u_int8_t page_mode;
 | 
			
		||||
	struct gsm48_chan_desc chan_desc;
 | 
			
		||||
	struct gsm48_req_ref req_ref;
 | 
			
		||||
	u_int8_t timing_advance;
 | 
			
		||||
	u_int8_t mob_alloc_len;
 | 
			
		||||
	u_int8_t mob_alloc[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.1.3 */
 | 
			
		||||
struct gsm48_loc_area_id {
 | 
			
		||||
	u_int8_t digits[3];	/* BCD! */
 | 
			
		||||
	u_int16_t lac;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.2 */
 | 
			
		||||
struct gsm48_auth_req {
 | 
			
		||||
	u_int8_t key_seq:4,
 | 
			
		||||
	         spare:4;
 | 
			
		||||
	u_int8_t rand[16];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.15 */
 | 
			
		||||
struct gsm48_loc_upd_req {
 | 
			
		||||
	u_int8_t type:4,
 | 
			
		||||
		 key_seq:4;
 | 
			
		||||
	struct gsm48_loc_area_id lai;
 | 
			
		||||
	struct gsm48_classmark1 classmark1;
 | 
			
		||||
	u_int8_t mi_len;
 | 
			
		||||
	u_int8_t mi[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 10.1 */
 | 
			
		||||
struct gsm48_hdr {
 | 
			
		||||
	u_int8_t proto_discr;
 | 
			
		||||
	u_int8_t msg_type;
 | 
			
		||||
	u_int8_t data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.3x System information Type header */
 | 
			
		||||
struct gsm48_system_information_type_header {
 | 
			
		||||
	u_int8_t l2_plen;
 | 
			
		||||
	u_int8_t rr_protocol_discriminator :4,
 | 
			
		||||
		skip_indicator:4; 
 | 
			
		||||
	u_int8_t system_information;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct gsm48_rach_control {
 | 
			
		||||
	u_int8_t re :1,
 | 
			
		||||
		 cell_bar :1,
 | 
			
		||||
		 tx_integer :4,
 | 
			
		||||
		 max_trans :2;
 | 
			
		||||
	u_int8_t t2;
 | 
			
		||||
	u_int8_t t3;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.2.4 Cell Selection Parameters */
 | 
			
		||||
struct gsm48_cell_sel_par {
 | 
			
		||||
	u_int8_t ms_txpwr_max_ccch:5,	/* GSM 05.08 MS-TXPWR-MAX-CCCH */
 | 
			
		||||
		 cell_resel_hyst:3;	/* GSM 05.08 CELL-RESELECT-HYSTERESIS */
 | 
			
		||||
	u_int8_t rxlev_acc_min:6,	/* GSM 05.08 RXLEV-ACCESS-MIN */
 | 
			
		||||
		 neci:1,
 | 
			
		||||
		 acs:1;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.2.11 Control Channel Description , Figure 10.5.33 */
 | 
			
		||||
struct gsm48_control_channel_descr {
 | 
			
		||||
	u_int8_t ccch_conf :3,
 | 
			
		||||
		bs_ag_blks_res :3,
 | 
			
		||||
		att :1,
 | 
			
		||||
		spare1 :1;
 | 
			
		||||
	u_int8_t bs_pa_mfrms : 3,
 | 
			
		||||
		spare2 :5;
 | 
			
		||||
	u_int8_t t3212;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct gsm48_cell_options {
 | 
			
		||||
	u_int8_t radio_link_timeout:4,
 | 
			
		||||
		 dtx:2,
 | 
			
		||||
		 pwrc:1,
 | 
			
		||||
		 spare:1;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.9 CM service request */
 | 
			
		||||
struct gsm48_service_request {
 | 
			
		||||
	u_int8_t cm_service_type : 4,
 | 
			
		||||
		 cipher_key_seq  : 4;
 | 
			
		||||
	/* length + 3 bytes */
 | 
			
		||||
	u_int32_t classmark;
 | 
			
		||||
	u_int8_t mi_len;
 | 
			
		||||
	u_int8_t mi[0];
 | 
			
		||||
	/* optional priority level */
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.31 System information Type 1 */
 | 
			
		||||
struct gsm48_system_information_type_1 {
 | 
			
		||||
	struct gsm48_system_information_type_header header;
 | 
			
		||||
	u_int8_t cell_channel_description[16];
 | 
			
		||||
	struct gsm48_rach_control rach_control;
 | 
			
		||||
	u_int8_t rest_octets[0]; /* NCH position on the CCCH */
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.32 System information Type 2 */
 | 
			
		||||
struct gsm48_system_information_type_2 {
 | 
			
		||||
	struct gsm48_system_information_type_header header;
 | 
			
		||||
	u_int8_t bcch_frequency_list[16];
 | 
			
		||||
	u_int8_t ncc_permitted;
 | 
			
		||||
	struct gsm48_rach_control rach_control;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.35 System information Type 3 */
 | 
			
		||||
struct gsm48_system_information_type_3 {
 | 
			
		||||
	struct gsm48_system_information_type_header header;
 | 
			
		||||
	u_int16_t cell_identity;
 | 
			
		||||
	struct gsm48_loc_area_id lai;
 | 
			
		||||
	struct gsm48_control_channel_descr control_channel_desc;
 | 
			
		||||
	struct gsm48_cell_options cell_options;
 | 
			
		||||
	struct gsm48_cell_sel_par cell_sel_par;
 | 
			
		||||
	struct gsm48_rach_control rach_control;
 | 
			
		||||
	u_int8_t rest_octets[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.36 System information Type 4 */
 | 
			
		||||
struct gsm48_system_information_type_4 {
 | 
			
		||||
	struct gsm48_system_information_type_header header;
 | 
			
		||||
	struct gsm48_loc_area_id lai;
 | 
			
		||||
	struct gsm48_cell_sel_par cell_sel_par;
 | 
			
		||||
	struct gsm48_rach_control rach_control;
 | 
			
		||||
	/*	optional CBCH conditional CBCH... followed by
 | 
			
		||||
		mandantory SI 4 Reset Octets
 | 
			
		||||
	 */
 | 
			
		||||
	u_int8_t data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.37 System information Type 5 */
 | 
			
		||||
struct gsm48_system_information_type_5 {
 | 
			
		||||
	u_int8_t rr_protocol_discriminator :4,
 | 
			
		||||
		skip_indicator:4; 
 | 
			
		||||
	u_int8_t system_information;
 | 
			
		||||
	u_int8_t bcch_frequency_list[16];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.40 System information Type 6 */
 | 
			
		||||
struct gsm48_system_information_type_6 {
 | 
			
		||||
	u_int8_t rr_protocol_discriminator :4,
 | 
			
		||||
		skip_indicator:4; 
 | 
			
		||||
	u_int8_t system_information;
 | 
			
		||||
	u_int16_t cell_identity;
 | 
			
		||||
	struct gsm48_loc_area_id lai;
 | 
			
		||||
	struct gsm48_cell_options cell_options;
 | 
			
		||||
	u_int8_t ncc_permitted;
 | 
			
		||||
	u_int8_t rest_octets[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.43a System Information type 13 */
 | 
			
		||||
struct gsm48_system_information_type_13 {
 | 
			
		||||
	struct gsm48_system_information_type_header header;
 | 
			
		||||
	u_int8_t rest_octets[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.12 IMSI Detach Indication */
 | 
			
		||||
struct gsm48_imsi_detach_ind {
 | 
			
		||||
	struct gsm48_classmark1 classmark1;
 | 
			
		||||
	u_int8_t mi_len;
 | 
			
		||||
	u_int8_t mi[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 10.2 + GSM 04.07 12.2.3.1.1 */
 | 
			
		||||
#define GSM48_PDISC_GROUP_CC	0x00
 | 
			
		||||
#define GSM48_PDISC_BCAST_CC	0x01
 | 
			
		||||
#define GSM48_PDISC_PDSS1	0x02
 | 
			
		||||
#define GSM48_PDISC_CC		0x03
 | 
			
		||||
#define GSM48_PDISC_PDSS2	0x04
 | 
			
		||||
#define GSM48_PDISC_MM		0x05
 | 
			
		||||
#define GSM48_PDISC_RR		0x06
 | 
			
		||||
#define GSM48_PDISC_MM_GPRS	0x08
 | 
			
		||||
#define GSM48_PDISC_SMS		0x09
 | 
			
		||||
#define GSM48_PDISC_SM_GPRS	0x0a
 | 
			
		||||
#define GSM48_PDISC_NC_SS	0x0b
 | 
			
		||||
#define GSM48_PDISC_LOC		0x0c
 | 
			
		||||
#define GSM48_PDISC_MASK	0x0f
 | 
			
		||||
#define GSM48_PDISC_USSD	0x11
 | 
			
		||||
 | 
			
		||||
/* Section 10.4 */
 | 
			
		||||
#define GSM48_MT_RR_INIT_REQ		0x3c
 | 
			
		||||
#define GSM48_MT_RR_ADD_ASS		0x3b
 | 
			
		||||
#define GSM48_MT_RR_IMM_ASS		0x3f
 | 
			
		||||
#define GSM48_MT_RR_IMM_ASS_EXT		0x39
 | 
			
		||||
#define GSM48_MT_RR_IMM_ASS_REJ		0x3a
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_CIPH_M_CMD		0x35
 | 
			
		||||
#define GSM48_MT_RR_CIPH_M_COMPL	0x32
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_CFG_CHG_CMD		0x30
 | 
			
		||||
#define GSM48_MT_RR_CFG_CHG_ACK		0x31
 | 
			
		||||
#define GSM48_MT_RR_CFG_CHG_REJ		0x33
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_ASS_CMD		0x2e
 | 
			
		||||
#define GSM48_MT_RR_ASS_COMPL		0x29
 | 
			
		||||
#define GSM48_MT_RR_ASS_FAIL		0x2f
 | 
			
		||||
#define GSM48_MT_RR_HANDO_CMD		0x2b
 | 
			
		||||
#define GSM48_MT_RR_HANDO_COMPL		0x2c
 | 
			
		||||
#define GSM48_MT_RR_HANDO_FAIL		0x28
 | 
			
		||||
#define GSM48_MT_RR_HANDO_INFO		0x2d
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_CELL_CHG_ORDER	0x08
 | 
			
		||||
#define GSM48_MT_RR_PDCH_ASS_CMD	0x23
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_CHAN_REL		0x0d
 | 
			
		||||
#define GSM48_MT_RR_PART_REL		0x0a
 | 
			
		||||
#define GSM48_MT_RR_PART_REL_COMP	0x0f
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_PAG_REQ_1		0x21
 | 
			
		||||
#define GSM48_MT_RR_PAG_REQ_2		0x22
 | 
			
		||||
#define GSM48_MT_RR_PAG_REQ_3		0x24
 | 
			
		||||
#define GSM48_MT_RR_PAG_RESP		0x27
 | 
			
		||||
#define GSM48_MT_RR_NOTIF_NCH		0x20
 | 
			
		||||
#define GSM48_MT_RR_NOTIF_FACCH		0x25
 | 
			
		||||
#define GSM48_MT_RR_NOTIF_RESP		0x26
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_8		0x18
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_1		0x19
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_2		0x1a
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_3		0x1b
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_4		0x1c
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_5		0x1d
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_6		0x1e
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_7		0x1f
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_2bis	0x02
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_2ter	0x03
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_5bis	0x05
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_5ter	0x06
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_9		0x04
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_13		0x00
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_16		0x3d
 | 
			
		||||
#define GSM48_MT_RR_SYSINFO_17		0x3e
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_CHAN_MODE_MODIF	0x10
 | 
			
		||||
#define GSM48_MT_RR_STATUS		0x12
 | 
			
		||||
#define GSM48_MT_RR_CHAN_MODE_MODIF_ACK	0x17
 | 
			
		||||
#define GSM48_MT_RR_FREQ_REDEF		0x14
 | 
			
		||||
#define GSM48_MT_RR_MEAS_REP		0x15
 | 
			
		||||
#define GSM48_MT_RR_CLSM_CHG		0x16
 | 
			
		||||
#define GSM48_MT_RR_CLSM_ENQ		0x13
 | 
			
		||||
#define GSM48_MT_RR_EXT_MEAS_REP	0x36
 | 
			
		||||
#define GSM48_MT_RR_EXT_MEAS_REP_ORD	0x37
 | 
			
		||||
#define GSM48_MT_RR_GPRS_SUSP_REQ	0x34
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_VGCS_UPL_GRANT	0x08
 | 
			
		||||
#define GSM48_MT_RR_UPLINK_RELEASE	0x0e
 | 
			
		||||
#define GSM48_MT_RR_UPLINK_FREE		0x0c
 | 
			
		||||
#define GSM48_MT_RR_UPLINK_BUSY		0x2a
 | 
			
		||||
#define GSM48_MT_RR_TALKER_IND		0x11
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_RR_APP_INFO		0x38
 | 
			
		||||
 | 
			
		||||
/* Table 10.2/3GPP TS 04.08 */
 | 
			
		||||
#define GSM48_MT_MM_IMSI_DETACH_IND	0x01
 | 
			
		||||
#define GSM48_MT_MM_LOC_UPD_ACCEPT	0x02
 | 
			
		||||
#define GSM48_MT_MM_LOC_UPD_REJECT	0x04
 | 
			
		||||
#define GSM48_MT_MM_LOC_UPD_REQUEST	0x08
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_MM_AUTH_REJ		0x11
 | 
			
		||||
#define GSM48_MT_MM_AUTH_REQ		0x12
 | 
			
		||||
#define GSM48_MT_MM_AUTH_RESP		0x14
 | 
			
		||||
#define GSM48_MT_MM_ID_REQ		0x18
 | 
			
		||||
#define GSM48_MT_MM_ID_RESP		0x19
 | 
			
		||||
#define GSM48_MT_MM_TMSI_REALL_CMD	0x1a
 | 
			
		||||
#define GSM48_MT_MM_TMSI_REALL_COMPL	0x1b
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_MM_CM_SERV_ACC		0x21
 | 
			
		||||
#define GSM48_MT_MM_CM_SERV_REJ		0x22
 | 
			
		||||
#define GSM48_MT_MM_CM_SERV_ABORT	0x23
 | 
			
		||||
#define GSM48_MT_MM_CM_SERV_REQ		0x24
 | 
			
		||||
#define GSM48_MT_MM_CM_SERV_PROMPT	0x25
 | 
			
		||||
#define GSM48_MT_MM_CM_REEST_REQ	0x28
 | 
			
		||||
#define GSM48_MT_MM_ABORT		0x29
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_MM_NULL		0x30
 | 
			
		||||
#define GSM48_MT_MM_STATUS		0x31
 | 
			
		||||
#define GSM48_MT_MM_INFO		0x32
 | 
			
		||||
 | 
			
		||||
/* Table 10.3/3GPP TS 04.08 */
 | 
			
		||||
#define GSM48_MT_CC_ALERTING		0x01
 | 
			
		||||
#define GSM48_MT_CC_CALL_CONF		0x08
 | 
			
		||||
#define GSM48_MT_CC_CALL_PROC		0x02
 | 
			
		||||
#define GSM48_MT_CC_CONNECT		0x07
 | 
			
		||||
#define GSM48_MT_CC_CONNECT_ACK		0x0f
 | 
			
		||||
#define GSM48_MT_CC_EMERG_SETUP		0x0e
 | 
			
		||||
#define GSM48_MT_CC_PROGRESS		0x03
 | 
			
		||||
#define GSM48_MT_CC_ESTAB		0x04
 | 
			
		||||
#define GSM48_MT_CC_ESTAB_CONF		0x06
 | 
			
		||||
#define GSM48_MT_CC_RECALL		0x0b
 | 
			
		||||
#define GSM48_MT_CC_START_CC		0x09
 | 
			
		||||
#define GSM48_MT_CC_SETUP		0x05
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_CC_MODIFY		0x17
 | 
			
		||||
#define GSM48_MT_CC_MODIFY_COMPL	0x1f
 | 
			
		||||
#define GSM48_MT_CC_MODIFY_REJECT	0x13
 | 
			
		||||
#define GSM48_MT_CC_USER_INFO		0x10
 | 
			
		||||
#define GSM48_MT_CC_HOLD		0x18
 | 
			
		||||
#define GSM48_MT_CC_HOLD_ACK		0x19
 | 
			
		||||
#define GSM48_MT_CC_HOLD_REJ		0x1a
 | 
			
		||||
#define GSM48_MT_CC_RETR		0x1c
 | 
			
		||||
#define GSM48_MT_CC_RETR_ACK		0x1d
 | 
			
		||||
#define GSM48_MT_CC_RETR_REJ		0x1e
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_CC_DISCONNECT		0x25
 | 
			
		||||
#define GSM48_MT_CC_RELEASE		0x2d
 | 
			
		||||
#define GSM48_MT_CC_RELEASE_COMPL	0x2a
 | 
			
		||||
 | 
			
		||||
#define GSM48_MT_CC_CONG_CTRL		0x39
 | 
			
		||||
#define GSM48_MT_CC_NOTIFY		0x3e
 | 
			
		||||
#define GSM48_MT_CC_STATUS		0x3d
 | 
			
		||||
#define GSM48_MT_CC_STATUS_ENQ		0x34
 | 
			
		||||
#define GSM48_MT_CC_START_DTMF		0x35
 | 
			
		||||
#define GSM48_MT_CC_STOP_DTMF		0x31
 | 
			
		||||
#define GSM48_MT_CC_STOP_DTMF_ACK	0x32
 | 
			
		||||
#define GSM48_MT_CC_START_DTMF_ACK	0x36
 | 
			
		||||
#define GSM48_MT_CC_START_DTMF_REJ	0x37
 | 
			
		||||
#define GSM48_MT_CC_FACILITY		0x3a
 | 
			
		||||
 | 
			
		||||
/* FIXME: Table 10.4 / 10.4a (GPRS) */
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.2.26, Table 10.5.64 */
 | 
			
		||||
#define GSM48_PM_MASK		0x03
 | 
			
		||||
#define GSM48_PM_NORMAL		0x00
 | 
			
		||||
#define GSM48_PM_EXTENDED	0x01
 | 
			
		||||
#define GSM48_PM_REORG		0x02
 | 
			
		||||
#define GSM48_PM_SAME		0x03
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.3.5 / Table 10.5.93 */
 | 
			
		||||
#define GSM48_LUPD_NORMAL	0x0
 | 
			
		||||
#define GSM48_LUPD_PERIODIC	0x1
 | 
			
		||||
#define GSM48_LUPD_IMSI_ATT	0x2
 | 
			
		||||
#define GSM48_LUPD_RESERVED	0x3
 | 
			
		||||
 | 
			
		||||
/* Table 10.5.4 */
 | 
			
		||||
#define GSM_MI_TYPE_MASK	0x07
 | 
			
		||||
#define GSM_MI_TYPE_NONE	0x00
 | 
			
		||||
#define GSM_MI_TYPE_IMSI	0x01
 | 
			
		||||
#define GSM_MI_TYPE_IMEI	0x02
 | 
			
		||||
#define GSM_MI_TYPE_IMEISV	0x03
 | 
			
		||||
#define GSM_MI_TYPE_TMSI	0x04
 | 
			
		||||
#define GSM_MI_ODD		0x08
 | 
			
		||||
 | 
			
		||||
#define GSM48_IE_MUL_RATE_CFG	0x03	/* 10.5.2.21aa */
 | 
			
		||||
#define GSM48_IE_MOBILE_ID	0x17
 | 
			
		||||
#define GSM48_IE_NAME_LONG	0x43	/* 10.5.3.5a */
 | 
			
		||||
#define GSM48_IE_NAME_SHORT	0x45	/* 10.5.3.5a */
 | 
			
		||||
#define GSM48_IE_UTC		0x46	/* 10.5.3.8 */
 | 
			
		||||
#define GSM48_IE_NET_TIME_TZ	0x47	/* 10.5.3.9 */
 | 
			
		||||
#define GSM48_IE_LSA_IDENT	0x48	/* 10.5.3.11 */
 | 
			
		||||
 | 
			
		||||
#define GSM48_IE_BEARER_CAP	0x04	/* 10.5.4.5 */
 | 
			
		||||
#define GSM48_IE_CAUSE		0x08	/* 10.5.4.11 */
 | 
			
		||||
#define GSM48_IE_CC_CAP		0x15	/* 10.5.4.5a */
 | 
			
		||||
#define GSM48_IE_ALERT		0x19	/* 10.5.4.26 */
 | 
			
		||||
#define GSM48_IE_FACILITY	0x1c	/* 10.5.4.15 */
 | 
			
		||||
#define GSM48_IE_PROGR_IND	0x1e	/* 10.5.4.21 */
 | 
			
		||||
#define GSM48_IE_AUX_STATUS	0x24	/* 10.5.4.4 */
 | 
			
		||||
#define GSM48_IE_NOTIFY		0x27	/* 10.5.4.20 */
 | 
			
		||||
#define GSM48_IE_KPD_FACILITY	0x2c	/* 10.5.4.17 */
 | 
			
		||||
#define GSM48_IE_SIGNAL		0x34	/* 10.5.4.23 */
 | 
			
		||||
#define GSM48_IE_CONN_BCD	0x4c	/* 10.5.4.13 */
 | 
			
		||||
#define GSM48_IE_CONN_SUB	0x4d	/* 10.5.4.14 */
 | 
			
		||||
#define GSM48_IE_CALLING_BCD	0x5c	/* 10.5.4.9 */
 | 
			
		||||
#define GSM48_IE_CALLING_SUB	0x5d	/* 10.5.4.10 */
 | 
			
		||||
#define GSM48_IE_CALLED_BCD	0x5e	/* 10.5.4.7 */
 | 
			
		||||
#define GSM48_IE_CALLED_SUB	0x6d	/* 10.5.4.8 */
 | 
			
		||||
#define GSM48_IE_REDIR_BCD	0x74	/* 10.5.4.21a */
 | 
			
		||||
#define GSM48_IE_REDIR_SUB	0x75	/* 10.5.4.21b */
 | 
			
		||||
#define GSM48_IE_LOWL_COMPAT	0x7c	/* 10.5.4.18 */
 | 
			
		||||
#define GSM48_IE_HIGHL_COMPAT	0x7d	/* 10.5.4.16 */
 | 
			
		||||
#define GSM48_IE_USER_USER	0x7e	/* 10.5.4.25 */
 | 
			
		||||
#define GSM48_IE_SS_VERS	0x7f	/* 10.5.4.24 */
 | 
			
		||||
#define GSM48_IE_MORE_DATA	0xa0	/* 10.5.4.19 */
 | 
			
		||||
#define GSM48_IE_CLIR_SUPP	0xa1	/* 10.5.4.11a */
 | 
			
		||||
#define GSM48_IE_CLIR_INVOC	0xa2	/* 10.5.4.11b */
 | 
			
		||||
#define GSM48_IE_REV_C_SETUP	0xa3	/* 10.5.4.22a */
 | 
			
		||||
#define GSM48_IE_REPEAT_CIR	0xd1	/* 10.5.4.22 */
 | 
			
		||||
#define GSM48_IE_REPEAT_SEQ	0xd3	/* 10.5.4.22 */
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.4.11 / Table 10.5.122 */
 | 
			
		||||
#define GSM48_CAUSE_CS_GSM	0x60
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.2 / Table 9.3 */
 | 
			
		||||
#define GSM48_IE_FRQLIST_AFTER	0x05
 | 
			
		||||
#define GSM48_IE_CELL_CH_DESC	0x62
 | 
			
		||||
#define GSM48_IE_MSLOT_DESC	0x10
 | 
			
		||||
#define GSM48_IE_CHANMODE_1	0x63
 | 
			
		||||
#define GSM48_IE_CHANMODE_2	0x11
 | 
			
		||||
#define GSM48_IE_CHANMODE_3	0x13
 | 
			
		||||
#define GSM48_IE_CHANMODE_4	0x14
 | 
			
		||||
#define GSM48_IE_CHANMODE_5	0x15
 | 
			
		||||
#define GSM48_IE_CHANMODE_6	0x16
 | 
			
		||||
#define GSM48_IE_CHANMODE_7	0x17
 | 
			
		||||
#define GSM48_IE_CHANMODE_8	0x18
 | 
			
		||||
#define GSM48_IE_CHANDESC_2	0x64
 | 
			
		||||
/* FIXME */
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.4.23 / Table 10.5.130 */
 | 
			
		||||
enum gsm48_signal_val {
 | 
			
		||||
	GSM48_SIGNAL_DIALTONE	= 0x00,
 | 
			
		||||
	GSM48_SIGNAL_RINGBACK	= 0x01,
 | 
			
		||||
	GSM48_SIGNAL_INTERCEPT	= 0x02,
 | 
			
		||||
	GSM48_SIGNAL_NET_CONG	= 0x03,
 | 
			
		||||
	GSM48_SIGNAL_BUSY	= 0x04,
 | 
			
		||||
	GSM48_SIGNAL_CONFIRM	= 0x05,
 | 
			
		||||
	GSM48_SIGNAL_ANSWER	= 0x06,
 | 
			
		||||
	GSM48_SIGNAL_CALL_WAIT	= 0x07,
 | 
			
		||||
	GSM48_SIGNAL_OFF_HOOK	= 0x08,
 | 
			
		||||
	GSM48_SIGNAL_OFF	= 0x3f,
 | 
			
		||||
	GSM48_SIGNAL_ALERT_OFF	= 0x4f,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm48_cause_loc {
 | 
			
		||||
	GSM48_CAUSE_LOC_USER		= 0x00,
 | 
			
		||||
	GSM48_CAUSE_LOC_PRN_S_LU	= 0x01,
 | 
			
		||||
	GSM48_CAUSE_LOC_PUN_S_LU	= 0x02,
 | 
			
		||||
	GSM48_CAUSE_LOC_TRANS_NET	= 0x03,
 | 
			
		||||
	GSM48_CAUSE_LOC_PUN_S_RU	= 0x04,
 | 
			
		||||
	GSM48_CAUSE_LOC_PRN_S_RU	= 0x05,
 | 
			
		||||
	/* not defined */
 | 
			
		||||
	GSM48_CAUSE_LOC_INN_NET		= 0x07,
 | 
			
		||||
	GSM48_CAUSE_LOC_NET_BEYOND	= 0x0a,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.2.31 RR Cause / Table 10.5.70 */
 | 
			
		||||
enum gsm48_rr_cause {
 | 
			
		||||
	GSM48_RR_CAUSE_NORMAL		= 0x00,
 | 
			
		||||
	GSM48_RR_CAUSE_ABNORMAL_UNSPEC	= 0x01,
 | 
			
		||||
	GSM48_RR_CAUSE_ABNORMAL_UNACCT	= 0x02,
 | 
			
		||||
	GSM48_RR_CAUSE_ABNORMAL_TIMER	= 0x03,
 | 
			
		||||
	GSM48_RR_CAUSE_ABNORMAL_NOACT	= 0x04,
 | 
			
		||||
	GSM48_RR_CAUSE_PREMPTIVE_REL	= 0x05,
 | 
			
		||||
	GSM48_RR_CAUSE_HNDOVER_IMP	= 0x06,
 | 
			
		||||
	GSM48_RR_CAUSE_CHAN_MODE_UNACCT	= 0x07,
 | 
			
		||||
	GSM48_RR_CAUSE_FREQ_NOT_IMPL	= 0x08,
 | 
			
		||||
	GSM48_RR_CAUSE_CALL_CLEARED	= 0x41,
 | 
			
		||||
	GSM48_RR_CAUSE_SEMANT_INCORR	= 0x5f,
 | 
			
		||||
	GSM48_RR_CAUSE_INVALID_MAND_INF = 0x60,
 | 
			
		||||
	GSM48_RR_CAUSE_MSG_TYPE_N	= 0x61,
 | 
			
		||||
	GSM48_RR_CAUSE_MSG_TYPE_N_COMPAT= 0x62,
 | 
			
		||||
	GSM48_RR_CAUSE_COND_IE_ERROR	= 0x64,
 | 
			
		||||
	GSM48_RR_CAUSE_NO_CELL_ALLOC_A	= 0x65,
 | 
			
		||||
	GSM48_RR_CAUSE_PROT_ERROR_UNSPC = 0x6f,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.4.11 CC Cause / Table 10.5.123 */
 | 
			
		||||
enum gsm48_cc_cause {
 | 
			
		||||
	GSM48_CC_CAUSE_UNASSIGNED_NR	= 1,
 | 
			
		||||
	GSM48_CC_CAUSE_NO_ROUTE		= 3,
 | 
			
		||||
	GSM48_CC_CAUSE_CHAN_UNACCEPT	= 6,
 | 
			
		||||
	GSM48_CC_CAUSE_OP_DET_BARRING	= 8,
 | 
			
		||||
	GSM48_CC_CAUSE_NORM_CALL_CLEAR	= 16,
 | 
			
		||||
	GSM48_CC_CAUSE_USER_BUSY	= 17,
 | 
			
		||||
	GSM48_CC_CAUSE_USER_NOTRESPOND	= 18,
 | 
			
		||||
	GSM48_CC_CAUSE_USER_ALERTING_NA	= 19,
 | 
			
		||||
	GSM48_CC_CAUSE_CALL_REJECTED	= 21,
 | 
			
		||||
	GSM48_CC_CAUSE_NUMBER_CHANGED	= 22,
 | 
			
		||||
	GSM48_CC_CAUSE_PRE_EMPTION	= 25,
 | 
			
		||||
	GSM48_CC_CAUSE_NONSE_USER_CLR	= 26,
 | 
			
		||||
	GSM48_CC_CAUSE_DEST_OOO		= 27,
 | 
			
		||||
	GSM48_CC_CAUSE_INV_NR_FORMAT	= 28,
 | 
			
		||||
	GSM48_CC_CAUSE_FACILITY_REJ	= 29,
 | 
			
		||||
	GSM48_CC_CAUSE_RESP_STATUS_INQ	= 30,
 | 
			
		||||
	GSM48_CC_CAUSE_NORMAL_UNSPEC	= 31,
 | 
			
		||||
	GSM48_CC_CAUSE_NO_CIRCUIT_CHAN	= 34,
 | 
			
		||||
	GSM48_CC_CAUSE_NETWORK_OOO	= 38,
 | 
			
		||||
	GSM48_CC_CAUSE_TEMP_FAILURE	= 41,
 | 
			
		||||
	GSM48_CC_CAUSE_SWITCH_CONG	= 42,
 | 
			
		||||
	GSM48_CC_CAUSE_ACC_INF_DISCARD	= 43,
 | 
			
		||||
	GSM48_CC_CAUSE_REQ_CHAN_UNAVAIL	= 44,
 | 
			
		||||
	GSM48_CC_CAUSE_RESOURCE_UNAVAIL	= 47,
 | 
			
		||||
	GSM48_CC_CAUSE_QOS_UNAVAIL	= 49,
 | 
			
		||||
	GSM48_CC_CAUSE_REQ_FAC_NOT_SUBSC= 50,
 | 
			
		||||
	GSM48_CC_CAUSE_INC_BARRED_CUG	= 55,
 | 
			
		||||
	GSM48_CC_CAUSE_BEARER_CAP_UNAUTH= 57,
 | 
			
		||||
	GSM48_CC_CAUSE_BEARER_CA_UNAVAIL= 58,
 | 
			
		||||
	GSM48_CC_CAUSE_SERV_OPT_UNAVAIL	= 63,
 | 
			
		||||
	GSM48_CC_CAUSE_BEARERSERV_UNIMPL= 65,
 | 
			
		||||
	GSM48_CC_CAUSE_ACM_GE_ACM_MAX	= 68,
 | 
			
		||||
	GSM48_CC_CAUSE_REQ_FAC_NOTIMPL	= 69,
 | 
			
		||||
	GSM48_CC_CAUSE_RESTR_BCAP_AVAIL	= 70,
 | 
			
		||||
	GSM48_CC_CAUSE_SERV_OPT_UNIMPL	= 79,
 | 
			
		||||
	GSM48_CC_CAUSE_INVAL_TRANS_ID	= 81,
 | 
			
		||||
	GSM48_CC_CAUSE_USER_NOT_IN_CUG	= 87,
 | 
			
		||||
	GSM48_CC_CAUSE_INCOMPAT_DEST	= 88,
 | 
			
		||||
	GSM48_CC_CAUSE_INVAL_TRANS_NET	= 91,
 | 
			
		||||
	GSM48_CC_CAUSE_SEMANTIC_INCORR	= 95,
 | 
			
		||||
	GSM48_CC_CAUSE_INVAL_MAND_INF	= 96,
 | 
			
		||||
	GSM48_CC_CAUSE_MSGTYPE_NOTEXIST	= 97,
 | 
			
		||||
	GSM48_CC_CAUSE_MSGTYPE_INCOMPAT	= 98,
 | 
			
		||||
	GSM48_CC_CAUSE_IE_NOTEXIST	= 99,
 | 
			
		||||
	GSM48_CC_CAUSE_COND_IE_ERR	= 100,
 | 
			
		||||
	GSM48_CC_CAUSE_MSG_INCOMP_STATE	= 101,
 | 
			
		||||
	GSM48_CC_CAUSE_RECOVERY_TIMER	= 102,
 | 
			
		||||
	GSM48_CC_CAUSE_PROTO_ERR	= 111,
 | 
			
		||||
	GSM48_CC_CAUSE_INTERWORKING	= 127,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Annex G, GSM specific cause values for mobility management */
 | 
			
		||||
enum gsm48_reject_value {
 | 
			
		||||
	GSM48_REJECT_IMSI_UNKNOWN_IN_HLR	= 2,
 | 
			
		||||
	GSM48_REJECT_ILLEGAL_MS			= 3,
 | 
			
		||||
	GSM48_REJECT_IMSI_UNKNOWN_IN_VLR	= 4,
 | 
			
		||||
	GSM48_REJECT_IMEI_NOT_ACCEPTED		= 5,
 | 
			
		||||
	GSM48_REJECT_ILLEGAL_ME			= 6,
 | 
			
		||||
	GSM48_REJECT_PLMN_NOT_ALLOWED		= 11,
 | 
			
		||||
	GSM48_REJECT_LOC_NOT_ALLOWED		= 12,
 | 
			
		||||
	GSM48_REJECT_ROAMING_NOT_ALLOWED	= 13,
 | 
			
		||||
	GSM48_REJECT_NETWORK_FAILURE		= 17,
 | 
			
		||||
	GSM48_REJECT_CONGESTION			= 22,
 | 
			
		||||
	GSM48_REJECT_SRV_OPT_NOT_SUPPORTED	= 32,
 | 
			
		||||
	GSM48_REJECT_RQD_SRV_OPT_NOT_SUPPORTED	= 33,
 | 
			
		||||
	GSM48_REJECT_SRV_OPT_TMP_OUT_OF_ORDER	= 34,
 | 
			
		||||
	GSM48_REJECT_CALL_CAN_NOT_BE_IDENTIFIED	= 38,
 | 
			
		||||
	GSM48_REJECT_INCORRECT_MESSAGE		= 95,
 | 
			
		||||
	GSM48_REJECT_INVALID_MANDANTORY_INF	= 96,
 | 
			
		||||
	GSM48_REJECT_MSG_TYPE_NOT_IMPLEMENTED	= 97,
 | 
			
		||||
	GSM48_REJECT_MSG_TYPE_NOT_COMPATIBLE	= 98,
 | 
			
		||||
	GSM48_REJECT_INF_ELEME_NOT_IMPLEMENTED	= 99,
 | 
			
		||||
	GSM48_REJECT_CONDTIONAL_IE_ERROR	= 100,
 | 
			
		||||
	GSM48_REJECT_MSG_NOT_COMPATIBLE		= 101,
 | 
			
		||||
	GSM48_REJECT_PROTOCOL_ERROR		= 111,
 | 
			
		||||
 | 
			
		||||
	/* according to G.6 Additional cause codes for GMM */
 | 
			
		||||
	GSM48_REJECT_GPRS_NOT_ALLOWED		= 7,
 | 
			
		||||
	GSM48_REJECT_SERVICES_NOT_ALLOWED	= 8,
 | 
			
		||||
	GSM48_REJECT_MS_IDENTITY_NOT_DERVIVABLE = 9,
 | 
			
		||||
	GSM48_REJECT_IMPLICITLY_DETACHED	= 10,
 | 
			
		||||
	GSM48_REJECT_GPRS_NOT_ALLOWED_IN_PLMN	= 14,
 | 
			
		||||
	GSM48_REJECT_MSC_TMP_NOT_REACHABLE	= 16,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum chreq_type {
 | 
			
		||||
	CHREQ_T_EMERG_CALL,
 | 
			
		||||
	CHREQ_T_CALL_REEST_TCH_F,
 | 
			
		||||
	CHREQ_T_CALL_REEST_TCH_H,
 | 
			
		||||
	CHREQ_T_CALL_REEST_TCH_H_DBL,
 | 
			
		||||
	CHREQ_T_SDCCH,
 | 
			
		||||
	CHREQ_T_TCH_F,
 | 
			
		||||
	CHREQ_T_VOICE_CALL_TCH_H,
 | 
			
		||||
	CHREQ_T_DATA_CALL_TCH_H,
 | 
			
		||||
	CHREQ_T_LOCATION_UPD,
 | 
			
		||||
	CHREQ_T_PAG_R_ANY_NECI0,
 | 
			
		||||
	CHREQ_T_PAG_R_ANY_NECI1,
 | 
			
		||||
	CHREQ_T_PAG_R_TCH_F,
 | 
			
		||||
	CHREQ_T_PAG_R_TCH_FH,
 | 
			
		||||
	CHREQ_T_LMU,
 | 
			
		||||
	CHREQ_T_RESERVED_SDCCH,
 | 
			
		||||
	CHREQ_T_RESERVED_IGNORE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 11.3 */
 | 
			
		||||
#define GSM48_T301	180, 0
 | 
			
		||||
#define GSM48_T303	30, 0
 | 
			
		||||
#define GSM48_T305	30, 0
 | 
			
		||||
#define GSM48_T306	30, 0
 | 
			
		||||
#define GSM48_T308	10, 0
 | 
			
		||||
#define GSM48_T310	180, 0
 | 
			
		||||
#define GSM48_T313	30, 0
 | 
			
		||||
#define GSM48_T323	30, 0
 | 
			
		||||
#define GSM48_T331	30, 0
 | 
			
		||||
#define GSM48_T333	30, 0
 | 
			
		||||
#define GSM48_T334	25, 0 /* min 15 */
 | 
			
		||||
#define GSM48_T338	30, 0
 | 
			
		||||
 | 
			
		||||
/* Chapter 5.1.2.2 */
 | 
			
		||||
#define	GSM_CSTATE_NULL			0
 | 
			
		||||
#define	GSM_CSTATE_INITIATED		1
 | 
			
		||||
#define	GSM_CSTATE_MO_CALL_PROC		3
 | 
			
		||||
#define	GSM_CSTATE_CALL_DELIVERED	4
 | 
			
		||||
#define	GSM_CSTATE_CALL_PRESENT		6
 | 
			
		||||
#define	GSM_CSTATE_CALL_RECEIVED	7
 | 
			
		||||
#define	GSM_CSTATE_CONNECT_REQUEST	8
 | 
			
		||||
#define	GSM_CSTATE_MO_TERM_CALL_CONF	9
 | 
			
		||||
#define	GSM_CSTATE_ACTIVE		10
 | 
			
		||||
#define	GSM_CSTATE_DISCONNECT_REQ	12
 | 
			
		||||
#define	GSM_CSTATE_DISCONNECT_IND	12
 | 
			
		||||
#define	GSM_CSTATE_RELEASE_REQ		19
 | 
			
		||||
#define	GSM_CSTATE_MO_ORIG_MODIFY	26
 | 
			
		||||
#define	GSM_CSTATE_MO_TERM_MODIFY	27
 | 
			
		||||
#define	GSM_CSTATE_CONNECT_IND		28
 | 
			
		||||
 | 
			
		||||
#define SBIT(a) (1 << a)
 | 
			
		||||
#define ALL_STATES 0xffffffff
 | 
			
		||||
 | 
			
		||||
/* Table 10.5.3/3GPP TS 04.08: Location Area Identification information element */
 | 
			
		||||
#define GSM_LAC_RESERVED_DETACHED       0x0
 | 
			
		||||
#define GSM_LAC_RESERVED_ALL_BTS        0xfffe
 | 
			
		||||
 | 
			
		||||
/* GSM 04.08 Bearer Capability: Information Transfer Capability */
 | 
			
		||||
enum gsm48_bcap_itcap {
 | 
			
		||||
	GSM48_BCAP_ITCAP_SPEECH		= 0,
 | 
			
		||||
	GSM48_BCAP_ITCAP_UNR_DIG_INF	= 1,
 | 
			
		||||
	GSM48_BCAP_ITCAP_3k1_AUDIO	= 2,
 | 
			
		||||
	GSM48_BCAP_ITCAP_FAX_G3		= 3,
 | 
			
		||||
	GSM48_BCAP_ITCAP_OTHER		= 5,
 | 
			
		||||
	GSM48_BCAP_ITCAP_RESERVED	= 7,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* GSM 04.08 Bearer Capability: Transfer Mode */
 | 
			
		||||
enum gsm48_bcap_tmod {
 | 
			
		||||
	GSM48_BCAP_TMOD_CIRCUIT		= 0,
 | 
			
		||||
	GSM48_BCAP_TMOD_PACKET		= 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* GSM 04.08 Bearer Capability: Coding Standard */
 | 
			
		||||
enum gsm48_bcap_coding {
 | 
			
		||||
	GSM48_BCAP_CODING_GSM_STD	= 0,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* GSM 04.08 Bearer Capability: Radio Channel Requirements */
 | 
			
		||||
enum gsm48_bcap_rrq {
 | 
			
		||||
	GSM48_BCAP_RRQ_FR_ONLY	= 1,
 | 
			
		||||
	GSM48_BCAP_RRQ_DUAL_HR	= 2,
 | 
			
		||||
	GSM48_BCAP_RRQ_DUAL_FR	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define GSM48_TMSI_LEN	5
 | 
			
		||||
#define GSM48_MID_TMSI_LEN	(GSM48_TMSI_LEN + 2)
 | 
			
		||||
#define GSM48_MI_SIZE 32
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct msgb;
 | 
			
		||||
struct gsm_bts;
 | 
			
		||||
struct gsm_subscriber;
 | 
			
		||||
struct gsm_network;
 | 
			
		||||
struct gsm_trans;
 | 
			
		||||
 | 
			
		||||
/* config options controlling the behaviour of the lower leves */
 | 
			
		||||
void gsm0408_allow_everyone(int allow);
 | 
			
		||||
 | 
			
		||||
int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id);
 | 
			
		||||
void gsm0408_generate_lai(struct gsm48_loc_area_id *lai48, u_int16_t mcc, 
 | 
			
		||||
		u_int16_t mnc, u_int16_t lac);
 | 
			
		||||
enum gsm_chan_t get_ctype_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci);
 | 
			
		||||
enum gsm_chreq_reason_t get_reason_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci);
 | 
			
		||||
 | 
			
		||||
int gsm48_tx_mm_info(struct gsm_lchan *lchan);
 | 
			
		||||
int gsm48_tx_mm_auth_req(struct gsm_lchan *lchan, u_int8_t *rand);
 | 
			
		||||
int gsm48_tx_mm_auth_rej(struct gsm_lchan *lchan);
 | 
			
		||||
struct msgb *gsm48_msgb_alloc(void);
 | 
			
		||||
int gsm48_sendmsg(struct msgb *msg, struct gsm_trans *trans);
 | 
			
		||||
int gsm48_generate_mid_from_tmsi(u_int8_t *buf, u_int32_t tmsi);
 | 
			
		||||
int gsm48_generate_mid_from_imsi(u_int8_t *buf, const char* imsi);
 | 
			
		||||
int gsm48_mi_to_string(char *string, const int str_len, const u_int8_t *mi, const int mi_len);
 | 
			
		||||
 | 
			
		||||
int gsm48_send_rr_release(struct gsm_lchan *lchan);
 | 
			
		||||
int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv);
 | 
			
		||||
int gsm48_send_rr_app_info(struct gsm_lchan *lchan, u_int8_t apdu_id,
 | 
			
		||||
			   u_int8_t apdu_len, const u_int8_t *apdu);
 | 
			
		||||
int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, u_int8_t power_class);
 | 
			
		||||
int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan,
 | 
			
		||||
		      u_int8_t power_command, u_int8_t ho_ref);
 | 
			
		||||
 | 
			
		||||
int bsc_upqueue(struct gsm_network *net);
 | 
			
		||||
 | 
			
		||||
int mncc_send(struct gsm_network *net, int msg_type, void *arg);
 | 
			
		||||
 | 
			
		||||
/* convert a ASCII phone number to call-control BCD */
 | 
			
		||||
int encode_bcd_number(u_int8_t *bcd_lv, u_int8_t max_len,
 | 
			
		||||
		      int h_len, const char *input);
 | 
			
		||||
int decode_bcd_number(char *output, int output_len, const u_int8_t *bcd_lv,
 | 
			
		||||
		      int h_len);
 | 
			
		||||
 | 
			
		||||
extern const char *gsm0408_cc_msg_names[];
 | 
			
		||||
 | 
			
		||||
int send_siemens_mrpci(struct gsm_lchan *lchan, u_int8_t *classmark2_lv);
 | 
			
		||||
int gsm48_paging_extract_mi(struct msgb *msg, char *mi_string, u_int8_t *mi_type);
 | 
			
		||||
int gsm48_handle_paging_resp(struct msgb *msg, struct gsm_subscriber *subscr);
 | 
			
		||||
 | 
			
		||||
int gsm48_lchan_modify(struct gsm_lchan *lchan, u_int8_t lchan_mode);
 | 
			
		||||
int gsm48_rx_rr_modif_ack(struct msgb *msg);
 | 
			
		||||
int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										216
									
								
								openbsc/include/openbsc/gsm_04_11.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								openbsc/include/openbsc/gsm_04_11.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,216 @@
 | 
			
		||||
#ifndef _GSM_04_11_H
 | 
			
		||||
#define _GSM_04_11_H
 | 
			
		||||
 | 
			
		||||
/* GSM TS 04.11  definitions */
 | 
			
		||||
 | 
			
		||||
/* Chapter 5.2.3: SMC-CS states at the network side */
 | 
			
		||||
enum gsm411_cp_state {
 | 
			
		||||
	GSM411_CPS_IDLE 		= 0,
 | 
			
		||||
	GSM411_CPS_MM_CONN_PENDING	= 1,	/* only MT ! */
 | 
			
		||||
	GSM411_CPS_WAIT_CP_ACK		= 2,
 | 
			
		||||
	GSM411_CPS_MM_ESTABLISHED	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 6.2.2: SMR states at the network side */
 | 
			
		||||
enum gsm411_rp_state {
 | 
			
		||||
	GSM411_RPS_IDLE			= 0,
 | 
			
		||||
	GSM411_RPS_WAIT_FOR_RP_ACK	= 1,
 | 
			
		||||
	GSM411_RPS_WAIT_TO_TX_RP_ACK	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.1.2 (refers to GSM 04.07 Chapter 11.2.3.1.1 */
 | 
			
		||||
#define GSM411_PDISC_SMS	0x09
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.1.3 */
 | 
			
		||||
#define GSM411_MT_CP_DATA	0x01
 | 
			
		||||
#define GSM411_MT_CP_ACK	0x04
 | 
			
		||||
#define GSM411_MT_CP_ERROR	0x10
 | 
			
		||||
 | 
			
		||||
enum gsm411_cp_ie {
 | 
			
		||||
	GSM411_CP_IE_USER_DATA		= 0x01,	/* 8.1.4.1 */
 | 
			
		||||
	GSM411_CP_IE_CAUSE		= 0x02,	/* 8.1.4.2. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 8.1.4.2 / Table 8.2 */
 | 
			
		||||
enum gsm411_cp_cause {
 | 
			
		||||
	GSM411_CP_CAUSE_NET_FAIL	= 17,
 | 
			
		||||
	GSM411_CP_CAUSE_CONGESTION	= 22,
 | 
			
		||||
	GSM411_CP_CAUSE_INV_TRANS_ID	= 81,
 | 
			
		||||
	GSM411_CP_CAUSE_SEMANT_INC_MSG	= 95,
 | 
			
		||||
	GSM411_CP_CAUSE_INV_MAND_INF	= 96,
 | 
			
		||||
	GSM411_CP_CAUSE_MSGTYPE_NOTEXIST= 97,
 | 
			
		||||
	GSM411_CP_CAUSE_MSG_INCOMP_STATE= 98,
 | 
			
		||||
	GSM411_CP_CAUSE_IE_NOTEXIST	= 99,
 | 
			
		||||
	GSM411_CP_CAUSE_PROTOCOL_ERR	= 111,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.2.2 */
 | 
			
		||||
#define GSM411_MT_RP_DATA_MO	0x00
 | 
			
		||||
#define GSM411_MT_RP_DATA_MT	0x01
 | 
			
		||||
#define GSM411_MT_RP_ACK_MO	0x02
 | 
			
		||||
#define GSM411_MT_RP_ACK_MT	0x03
 | 
			
		||||
#define GSM411_MT_RP_ERROR_MO	0x04
 | 
			
		||||
#define GSM411_MT_RP_ERROR_MT	0x05
 | 
			
		||||
#define GSM411_MT_RP_SMMA_MO	0x06
 | 
			
		||||
 | 
			
		||||
enum gsm411_rp_ie {
 | 
			
		||||
	GSM411_IE_RP_USER_DATA		= 0x41,	/* 8.2.5.3 */
 | 
			
		||||
	GSM411_IE_RP_CAUSE		= 0x42,	/* 8.2.5.4 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.2.5.4 Table 8.4 */
 | 
			
		||||
enum gsm411_rp_cause {
 | 
			
		||||
	/* valid only for MO */
 | 
			
		||||
	GSM411_RP_CAUSE_MO_NUM_UNASSIGNED	= 1,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_OP_DET_BARR		= 8,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_CALL_BARRED		= 10,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_SMS_REJECTED		= 21,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_DEST_OUT_OF_ORDER	= 27,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_UNIDENTIFIED_SUBSCR	= 28,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_FACILITY_REJ		= 29,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_UNKNOWN_SUBSCR	= 30,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_NET_OUT_OF_ORDER	= 38,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_TEMP_FAIL		= 41,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_CONGESTION		= 42,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_RES_UNAVAIL		= 47,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_REQ_FAC_NOTSUBSCR	= 50,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_REQ_FAC_NOTIMPL	= 69,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_INTERWORKING		= 127,
 | 
			
		||||
	/* valid only for MT */
 | 
			
		||||
	GSM411_RP_CAUSE_MT_MEM_EXCEEDED		= 22,
 | 
			
		||||
	/* valid for both directions */
 | 
			
		||||
	GSM411_RP_CAUSE_INV_TRANS_REF		= 81,
 | 
			
		||||
	GSM411_RP_CAUSE_SEMANT_INC_MSG		= 95,
 | 
			
		||||
	GSM411_RP_CAUSE_INV_MAND_INF		= 96,
 | 
			
		||||
	GSM411_RP_CAUSE_MSGTYPE_NOTEXIST	= 97,
 | 
			
		||||
	GSM411_RP_CAUSE_MSG_INCOMP_STATE	= 98,
 | 
			
		||||
	GSM411_RP_CAUSE_IE_NOTEXIST		= 99,
 | 
			
		||||
	GSM411_RP_CAUSE_PROTOCOL_ERR		= 111,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 10: Timers */
 | 
			
		||||
#define GSM411_TMR_TR1M		40, 0	/* 35 < x < 45 seconds */
 | 
			
		||||
#define GSM411_TMR_TRAM		30, 0	/* 25 < x < 35 seconds */
 | 
			
		||||
#define GSM411_TMR_TR2M		15, 0	/* 12 < x < 20 seconds */
 | 
			
		||||
 | 
			
		||||
#define GSM411_TMR_TC1A		30, 0
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.2.1 */
 | 
			
		||||
struct gsm411_rp_hdr {
 | 
			
		||||
	u_int8_t len;
 | 
			
		||||
	u_int8_t msg_type;
 | 
			
		||||
	u_int8_t msg_ref;
 | 
			
		||||
	u_int8_t data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* our own enum, not related to on-air protocol */
 | 
			
		||||
enum sms_alphabet {
 | 
			
		||||
	DCS_NONE,
 | 
			
		||||
	DCS_7BIT_DEFAULT,
 | 
			
		||||
	DCS_UCS2,
 | 
			
		||||
	DCS_8BIT_DATA,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* GSM 03.40 / Chapter 9.2.3.1: TP-Message-Type-Indicator */
 | 
			
		||||
#define GSM340_SMS_DELIVER_SC2MS	0x00
 | 
			
		||||
#define GSM340_SMS_DELIVER_REP_MS2SC	0x00
 | 
			
		||||
#define GSM340_SMS_STATUS_REP_SC2MS	0x02
 | 
			
		||||
#define GSM340_SMS_COMMAND_MS2SC	0x02
 | 
			
		||||
#define GSM340_SMS_SUBMIT_MS2SC		0x01
 | 
			
		||||
#define GSM340_SMS_SUBMIT_REP_SC2MS	0x01
 | 
			
		||||
#define GSM340_SMS_RESSERVED		0x03
 | 
			
		||||
 | 
			
		||||
/* GSM 03.40 / Chapter 9.2.3.2: TP-More-Messages-to-Send */
 | 
			
		||||
#define GSM340_TP_MMS_MORE		0
 | 
			
		||||
#define GSM340_TP_MMS_NO_MORE		1
 | 
			
		||||
 | 
			
		||||
/* GSM 03.40 / Chapter 9.2.3.3: TP-Validity-Period-Format */
 | 
			
		||||
#define GSM340_TP_VPF_NONE		0
 | 
			
		||||
#define GSM340_TP_VPF_RELATIVE		2
 | 
			
		||||
#define GSM340_TP_VPF_ENHANCED		1
 | 
			
		||||
#define GSM340_TP_VPF_ABSOLUTE		3
 | 
			
		||||
 | 
			
		||||
/* GSM 03.40 / Chapter 9.2.3.4: TP-Status-Report-Indication */
 | 
			
		||||
#define GSM340_TP_SRI_NONE		0
 | 
			
		||||
#define GSM340_TP_SRI_PRESENT		1
 | 
			
		||||
 | 
			
		||||
/* GSM 03.40 / Chapter 9.2.3.5: TP-Status-Report-Request */
 | 
			
		||||
#define GSM340_TP_SRR_NONE		0
 | 
			
		||||
#define GSM340_TP_SRR_REQUESTED		1
 | 
			
		||||
 | 
			
		||||
/* GSM 03.40 / Chapter 9.2.3.9: TP-Protocol-Identifier */
 | 
			
		||||
/* telematic interworking (001 or 111 in bits 7-5) */
 | 
			
		||||
#define GSM340_TP_PID_IMPLICIT		0x00
 | 
			
		||||
#define GSM340_TP_PID_TELEX		0x01
 | 
			
		||||
#define GSM340_TP_PID_FAX_G3		0x02
 | 
			
		||||
#define GSM340_TP_PID_FAX_G4		0x03
 | 
			
		||||
#define GSM340_TP_PID_VOICE		0x04
 | 
			
		||||
#define GSM430_TP_PID_ERMES		0x05
 | 
			
		||||
#define GSM430_TP_PID_NATIONAL_PAGING	0x06
 | 
			
		||||
#define GSM430_TP_PID_VIDEOTEX		0x07
 | 
			
		||||
#define GSM430_TP_PID_TELETEX_UNSPEC	0x08
 | 
			
		||||
#define GSM430_TP_PID_TELETEX_PSPDN	0x09
 | 
			
		||||
#define GSM430_TP_PID_TELETEX_CSPDN	0x0a
 | 
			
		||||
#define GSM430_TP_PID_TELETEX_PSTN	0x0b
 | 
			
		||||
#define GSM430_TP_PID_TELETEX_ISDN	0x0c
 | 
			
		||||
#define GSM430_TP_PID_TELETEX_UCI	0x0d
 | 
			
		||||
#define GSM430_TP_PID_MSG_HANDLING	0x10
 | 
			
		||||
#define GSM430_TP_PID_MSG_X400		0x11
 | 
			
		||||
#define GSM430_TP_PID_EMAIL		0x12
 | 
			
		||||
#define GSM430_TP_PID_GSM_MS		0x1f
 | 
			
		||||
/* if bit 7 = 0 and bit 6 = 1 */
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_0	0
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_1	1
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_2	2
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_3	3
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_4	4
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_5	5
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_6	6
 | 
			
		||||
#define GSM430_TP_PID_SMS_TYPE_7	7
 | 
			
		||||
#define GSM430_TP_PID_RETURN_CALL_MSG	0x1f
 | 
			
		||||
#define GSM430_TP_PID_ME_DATA_DNLOAD	0x3d
 | 
			
		||||
#define GSM430_TP_PID_ME_DE_PERSONAL	0x3e
 | 
			
		||||
#define GSM430_TP_PID_ME_SIM_DNLOAD	0x3f
 | 
			
		||||
 | 
			
		||||
/* GSM 03.38 Chapter 4: SMS Data Coding Scheme */
 | 
			
		||||
#define GSM338_DCS_00_
 | 
			
		||||
 | 
			
		||||
#define GSM338_DCS_1110_7BIT		(0 << 2)
 | 
			
		||||
#define GSM338_DCS_1111_7BIT		(0 << 2)
 | 
			
		||||
#define GSM338_DCS_1111_8BIT_DATA	(1 << 2)
 | 
			
		||||
#define GSM338_DCS_1111_CLASS0		0
 | 
			
		||||
#define GSM338_DCS_1111_CLASS1_ME	1
 | 
			
		||||
#define GSM338_DCS_1111_CLASS2_SIM	2
 | 
			
		||||
#define GSM338_DCS_1111_CLASS3_TE	3	/* See TS 07.05 */
 | 
			
		||||
 | 
			
		||||
/* SMS deliver PDU */
 | 
			
		||||
struct sms_deliver {
 | 
			
		||||
	u_int8_t mti:2;		/* message type indicator */
 | 
			
		||||
	u_int8_t mms:1;		/* more messages to send */
 | 
			
		||||
	u_int8_t rp:1;		/* reply path */
 | 
			
		||||
	u_int8_t udhi:1;	/* user data header indicator */
 | 
			
		||||
	u_int8_t sri:1;		/* status report indication */
 | 
			
		||||
	u_int8_t *orig_addr;	/* originating address */
 | 
			
		||||
	u_int8_t pid;		/* protocol identifier */
 | 
			
		||||
	u_int8_t dcs;		/* data coding scheme */
 | 
			
		||||
				/* service centre time stamp */
 | 
			
		||||
	u_int8_t ud_len;	/* user data length */
 | 
			
		||||
	u_int8_t *user_data;	/* user data */
 | 
			
		||||
 | 
			
		||||
	u_int8_t msg_ref;	/* message reference */
 | 
			
		||||
	u_int8_t *smsc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct msgb;
 | 
			
		||||
 | 
			
		||||
int gsm0411_rcv_sms(struct msgb *msg, u_int8_t link_id);
 | 
			
		||||
 | 
			
		||||
int gsm411_send_sms_lchan(struct gsm_lchan *lchan, struct gsm_sms *sms);
 | 
			
		||||
 | 
			
		||||
struct gsm_sms *sms_alloc(void);
 | 
			
		||||
void sms_free(struct gsm_sms *sms);
 | 
			
		||||
 | 
			
		||||
void _gsm411_sms_trans_free(struct gsm_trans *trans);
 | 
			
		||||
int gsm411_send_sms_subscr(struct gsm_subscriber *subscr,
 | 
			
		||||
			   struct gsm_sms *sms);
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										143
									
								
								openbsc/include/openbsc/gsm_04_80.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								openbsc/include/openbsc/gsm_04_80.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
			
		||||
#ifndef _GSM_04_80_H
 | 
			
		||||
#define _GSM_04_80_H
 | 
			
		||||
 | 
			
		||||
/* GSM TS 04.80  definitions (Supplementary Services Specification, Formats and Coding) */
 | 
			
		||||
 | 
			
		||||
/* Section 3.4 */
 | 
			
		||||
#define GSM0480_MTYPE_RELEASE_COMPLETE	0x2A
 | 
			
		||||
#define GSM0480_MTYPE_FACILITY			0x3A
 | 
			
		||||
#define GSM0480_MTYPE_REGISTER			0x3B
 | 
			
		||||
 | 
			
		||||
/* Section 3.5 */
 | 
			
		||||
#define GSM0480_IE_FACILITY			0x1C
 | 
			
		||||
#define GSM0480_IE_SS_VERSION			0x7F
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.2 */
 | 
			
		||||
#define GSM0480_CTYPE_INVOKE			0xA1
 | 
			
		||||
#define GSM0480_CTYPE_RETURN_RESULT		0xA2
 | 
			
		||||
#define GSM0480_CTYPE_RETURN_ERROR		0xA3
 | 
			
		||||
#define GSM0480_CTYPE_REJECT			0xA4
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.3 */
 | 
			
		||||
#define GSM0480_COMPIDTAG_INVOKE_ID		0x02
 | 
			
		||||
#define GSM0480_COMPIDTAG_LINKED_ID		0x80
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.4 */
 | 
			
		||||
#define GSM0480_OPERATION_CODE			0x02
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.5 */
 | 
			
		||||
#define GSM_0480_SEQUENCE_TAG			0x30
 | 
			
		||||
#define GSM_0480_SET_TAG			0x31
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.6 */
 | 
			
		||||
#define GSM_0480_ERROR_CODE_TAG			0x02
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.7 */
 | 
			
		||||
/* Table 3.13 */
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_GENERAL	0x80
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_INVOKE	0x81
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_RETURN_RESULT	0x82
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_RETURN_ERROR	0x83
 | 
			
		||||
 | 
			
		||||
/* Table 3.14 */
 | 
			
		||||
#define GSM_0480_GEN_PROB_CODE_UNRECOGNISED	0x00
 | 
			
		||||
#define GSM_0480_GEN_PROB_CODE_MISTYPED		0x01
 | 
			
		||||
#define GSM_0480_GEN_PROB_CODE_BAD_STRUCTURE	0x02
 | 
			
		||||
 | 
			
		||||
/* Table 3.15 */
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_DUPLICATE_INVOKE_ID		0x00
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNRECOGNISED_OPERATION	0x01
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_MISTYPED_PARAMETER		0x02
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_RESOURCE_LIMITATION		0x03
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_INITIATING_RELEASE		0x04
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNRECOGNISED_LINKED_ID	0x05
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNEXPECTED_LINKED_RESPONSE	0x06
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNEXPECTED_LINKED_OPERATION	0x07
 | 
			
		||||
 | 
			
		||||
/* Table 3.16 */
 | 
			
		||||
#define GSM_0480_RESULT_PROB_CODE_UNRECOGNISED_INVOKE_ID	0x00
 | 
			
		||||
#define GSM_0480_RESULT_PROB_CODE_RETURN_RESULT_UNEXPECTED	0x01
 | 
			
		||||
#define GSM_0480_RESULT_PROB_CODE_MISTYPED_PARAMETER		0x02
 | 
			
		||||
 | 
			
		||||
/* Table 3.17 */
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_UNRECOGNISED_INVOKE_ID		0x00
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_RETURN_ERROR_UNEXPECTED	0x01
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_UNRECOGNISED_ERROR		0x02
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_UNEXPECTED_ERROR		0x03
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_MISTYPED_PARAMETER		0x04
 | 
			
		||||
 | 
			
		||||
/* Section 4.5 */
 | 
			
		||||
#define GSM0480_OP_CODE_REGISTER_SS		0x0A
 | 
			
		||||
#define GSM0480_OP_CODE_ERASE_SS		0x0B
 | 
			
		||||
#define GSM0480_OP_CODE_ACTIVATE_SS		0x0C
 | 
			
		||||
#define GSM0480_OP_CODE_DEACTIVATE_SS		0x0D
 | 
			
		||||
#define GSM0480_OP_CODE_INTERROGATE_SS		0x0E
 | 
			
		||||
#define GSM0480_OP_CODE_NOTIFY_SS		0x10
 | 
			
		||||
#define GSM0480_OP_CODE_REGISTER_PASSWORD	0x11
 | 
			
		||||
#define GSM0480_OP_CODE_GET_PASSWORD		0x12
 | 
			
		||||
#define GSM0480_OP_CODE_PROCESS_USS_DATA	0x13
 | 
			
		||||
#define GSM0480_OP_CODE_FORWARD_CHECK_SS_IND	0x26
 | 
			
		||||
#define GSM0480_OP_CODE_PROCESS_USS_REQ		0x3B
 | 
			
		||||
#define GSM0480_OP_CODE_USS_REQUEST		0x3C
 | 
			
		||||
#define GSM0480_OP_CODE_USS_NOTIFY		0x3D
 | 
			
		||||
#define GSM0480_OP_CODE_FORWARD_CUG_INFO	0x78
 | 
			
		||||
#define GSM0480_OP_CODE_SPLIT_MPTY		0x79
 | 
			
		||||
#define GSM0480_OP_CODE_RETRIEVE_MPTY		0x7A
 | 
			
		||||
#define GSM0480_OP_CODE_HOLD_MPTY		0x7B
 | 
			
		||||
#define GSM0480_OP_CODE_BUILD_MPTY		0x7C
 | 
			
		||||
#define GSM0480_OP_CODE_FORWARD_CHARGE_ADVICE	0x7D
 | 
			
		||||
 | 
			
		||||
#define GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER			0x01
 | 
			
		||||
#define GSM0480_ERR_CODE_ILLEGAL_SUBSCRIBER			0x09
 | 
			
		||||
#define GSM0480_ERR_CODE_BEARER_SERVICE_NOT_PROVISIONED		0x0A
 | 
			
		||||
#define GSM0480_ERR_CODE_TELESERVICE_NOT_PROVISIONED		0x0B
 | 
			
		||||
#define GSM0480_ERR_CODE_ILLEGAL_EQUIPMENT			0x0C
 | 
			
		||||
#define GSM0480_ERR_CODE_CALL_BARRED				0x0D
 | 
			
		||||
#define GSM0480_ERR_CODE_ILLEGAL_SS_OPERATION			0x10
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_ERROR_STATUS			0x11
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_NOT_AVAILABLE			0x12
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_SUBSCRIPTION_VIOLATION		0x13
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_INCOMPATIBILITY			0x14
 | 
			
		||||
#define GSM0480_ERR_CODE_FACILITY_NOT_SUPPORTED			0x15
 | 
			
		||||
#define GSM0480_ERR_CODE_ABSENT_SUBSCRIBER			0x1B
 | 
			
		||||
#define GSM0480_ERR_CODE_SYSTEM_FAILURE				0x22
 | 
			
		||||
#define GSM0480_ERR_CODE_DATA_MISSING				0x23
 | 
			
		||||
#define GSM0480_ERR_CODE_UNEXPECTED_DATA_VALUE			0x24
 | 
			
		||||
#define GSM0480_ERR_CODE_PW_REGISTRATION_FAILURE		0x25
 | 
			
		||||
#define GSM0480_ERR_CODE_NEGATIVE_PW_CHECK			0x26
 | 
			
		||||
#define GSM0480_ERR_CODE_NUM_PW_ATTEMPTS_VIOLATION		0x2B
 | 
			
		||||
#define GSM0480_ERR_CODE_UNKNOWN_ALPHABET			0x47
 | 
			
		||||
#define GSM0480_ERR_CODE_USSD_BUSY				0x48
 | 
			
		||||
#define GSM0480_ERR_CODE_MAX_MPTY_PARTICIPANTS			0x7E
 | 
			
		||||
#define GSM0480_ERR_CODE_RESOURCES_NOT_AVAILABLE		0x7F
 | 
			
		||||
 | 
			
		||||
/* ASN.1 type-tags */
 | 
			
		||||
#define ASN1_BOOLEAN_TAG		0x01
 | 
			
		||||
#define ASN1_INTEGER_TAG		0x02
 | 
			
		||||
#define ASN1_BIT_STRING_TAG		0x03
 | 
			
		||||
#define ASN1_OCTET_STRING_TAG		0x04
 | 
			
		||||
#define ASN1_NULL_TYPE_TAG		0x05
 | 
			
		||||
#define ASN1_OBJECT_ID_TAG		0x06
 | 
			
		||||
#define ASN1_UTF8_STRING_TAG		0x0C
 | 
			
		||||
#define ASN1_PRINTABLE_STRING_TAG	0x13
 | 
			
		||||
#define ASN1_IA5_STRING_TAG		0x16
 | 
			
		||||
#define ASN1_UNICODE_STRING_TAG		0x1E
 | 
			
		||||
 | 
			
		||||
#include <openbsc/msgb.h>
 | 
			
		||||
 | 
			
		||||
#define MAX_LEN_USSD_STRING	31
 | 
			
		||||
 | 
			
		||||
struct ussd_request {
 | 
			
		||||
			char text[MAX_LEN_USSD_STRING + 1];
 | 
			
		||||
			u_int8_t transaction_id;
 | 
			
		||||
			u_int8_t invoke_id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int gsm0480_decode_ussd_request(const struct msgb *msg, 
 | 
			
		||||
				struct ussd_request *request); 
 | 
			
		||||
int gsm0480_send_ussd_response(const struct msgb *in_msg, const char* response_text, 
 | 
			
		||||
						const struct ussd_request *req);
 | 
			
		||||
int gsm0480_send_ussd_reject(const struct msgb *msg, 
 | 
			
		||||
				const struct ussd_request *request);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										699
									
								
								openbsc/include/openbsc/gsm_data.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										699
									
								
								openbsc/include/openbsc/gsm_data.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,699 @@
 | 
			
		||||
#ifndef _GSM_DATA_H
 | 
			
		||||
#define _GSM_DATA_H
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
struct value_string {
 | 
			
		||||
	unsigned int value;
 | 
			
		||||
	const char *str;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const char *get_value_string(const struct value_string *vs, u_int32_t val);
 | 
			
		||||
 | 
			
		||||
enum gsm_band {
 | 
			
		||||
	GSM_BAND_400,
 | 
			
		||||
	GSM_BAND_850,
 | 
			
		||||
	GSM_BAND_900,
 | 
			
		||||
	GSM_BAND_1800,
 | 
			
		||||
	GSM_BAND_1900,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_phys_chan_config {
 | 
			
		||||
	GSM_PCHAN_NONE,
 | 
			
		||||
	GSM_PCHAN_CCCH,
 | 
			
		||||
	GSM_PCHAN_CCCH_SDCCH4,
 | 
			
		||||
	GSM_PCHAN_TCH_F,
 | 
			
		||||
	GSM_PCHAN_TCH_H,
 | 
			
		||||
	GSM_PCHAN_SDCCH8_SACCH8C,
 | 
			
		||||
	GSM_PCHAN_PDCH,		/* GPRS PDCH */
 | 
			
		||||
	GSM_PCHAN_TCH_F_PDCH,	/* TCH/F if used, PDCH otherwise */
 | 
			
		||||
	GSM_PCHAN_UNKNOWN,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_chan_t {
 | 
			
		||||
	GSM_LCHAN_NONE,
 | 
			
		||||
	GSM_LCHAN_SDCCH,
 | 
			
		||||
	GSM_LCHAN_TCH_F,
 | 
			
		||||
	GSM_LCHAN_TCH_H,
 | 
			
		||||
	GSM_LCHAN_UNKNOWN,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* RRLP mode of operation */
 | 
			
		||||
enum rrlp_mode {
 | 
			
		||||
	RRLP_MODE_NONE,
 | 
			
		||||
	RRLP_MODE_MS_BASED,
 | 
			
		||||
	RRLP_MODE_MS_PREF,
 | 
			
		||||
	RRLP_MODE_ASS_PREF,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Channel Request reason */
 | 
			
		||||
enum gsm_chreq_reason_t {
 | 
			
		||||
	GSM_CHREQ_REASON_EMERG,
 | 
			
		||||
	GSM_CHREQ_REASON_PAG,
 | 
			
		||||
	GSM_CHREQ_REASON_CALL,
 | 
			
		||||
	GSM_CHREQ_REASON_LOCATION_UPD,
 | 
			
		||||
	GSM_CHREQ_REASON_OTHER,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <openbsc/timer.h>
 | 
			
		||||
#include <openbsc/gsm_04_08.h>
 | 
			
		||||
#include <openbsc/abis_rsl.h>
 | 
			
		||||
#include <openbsc/mncc.h>
 | 
			
		||||
#include <openbsc/tlv.h>
 | 
			
		||||
#include <openbsc/bitvec.h>
 | 
			
		||||
 | 
			
		||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 | 
			
		||||
 | 
			
		||||
#define TRX_NR_TS	8
 | 
			
		||||
#define TS_MAX_LCHAN	8
 | 
			
		||||
 | 
			
		||||
#define HARDCODED_ARFCN 123
 | 
			
		||||
#define HARDCODED_TSC	7
 | 
			
		||||
#define HARDCODED_BSIC	0x3f	/* NCC = 7 / BCC = 7 */
 | 
			
		||||
 | 
			
		||||
/* for multi-drop config */
 | 
			
		||||
#define HARDCODED_BTS0_TS	1
 | 
			
		||||
#define HARDCODED_BTS1_TS	6
 | 
			
		||||
#define HARDCODED_BTS2_TS	11
 | 
			
		||||
 | 
			
		||||
enum gsm_hooks {
 | 
			
		||||
	GSM_HOOK_NM_SWLOAD,
 | 
			
		||||
	GSM_HOOK_RR_PAGING,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_paging_event {
 | 
			
		||||
	GSM_PAGING_SUCCEEDED,
 | 
			
		||||
	GSM_PAGING_EXPIRED,
 | 
			
		||||
	GSM_PAGING_OOM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct msgb;
 | 
			
		||||
typedef int gsm_cbfn(unsigned int hooknum,
 | 
			
		||||
		     unsigned int event,
 | 
			
		||||
		     struct msgb *msg,
 | 
			
		||||
		     void *data, void *param);
 | 
			
		||||
 | 
			
		||||
/* communications link with a BTS */
 | 
			
		||||
struct gsm_bts_link {
 | 
			
		||||
	struct gsm_bts *bts;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct sccp_connection;
 | 
			
		||||
struct gsm_lchan;
 | 
			
		||||
struct gsm_subscriber;
 | 
			
		||||
struct gsm_mncc;
 | 
			
		||||
struct rtp_socket;
 | 
			
		||||
 | 
			
		||||
/* BSC/MSC data holding them together */
 | 
			
		||||
struct bss_sccp_connection_data {
 | 
			
		||||
	struct gsm_lchan *lchan;
 | 
			
		||||
	struct gsm_lchan *secondary_lchan;
 | 
			
		||||
	struct sccp_connection *sccp;
 | 
			
		||||
	int ciphering_handled : 1;
 | 
			
		||||
 | 
			
		||||
        /* Timers... */
 | 
			
		||||
 | 
			
		||||
        /* for assginment command */
 | 
			
		||||
        struct timer_list T10;
 | 
			
		||||
 | 
			
		||||
	/* for SCCP ... */
 | 
			
		||||
	struct timer_list sccp_it;
 | 
			
		||||
 | 
			
		||||
	/* audio handling */
 | 
			
		||||
	int rtp_port;
 | 
			
		||||
 | 
			
		||||
	/* Queue SCCP and GSM0408 messages */
 | 
			
		||||
	int block_gsm;
 | 
			
		||||
	struct llist_head gsm_queue;
 | 
			
		||||
	unsigned int gsm_queue_size;
 | 
			
		||||
 | 
			
		||||
	struct llist_head sccp_queue;
 | 
			
		||||
	unsigned int sccp_queue_size;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define GSM0808_T10_VALUE	6, 0
 | 
			
		||||
#define sccp_get_lchan(data_ctx) ((struct bss_sccp_connection_data *)data_ctx)->lchan
 | 
			
		||||
#define lchan_get_sccp(lchan) lchan->msc_data->sccp
 | 
			
		||||
struct bss_sccp_connection_data *bss_sccp_create_data();
 | 
			
		||||
void bss_sccp_free_data(struct bss_sccp_connection_data *);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Network Management State */
 | 
			
		||||
struct gsm_nm_state {
 | 
			
		||||
	u_int8_t operational;
 | 
			
		||||
	u_int8_t administrative;
 | 
			
		||||
	u_int8_t availability;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LOCATION UPDATING REQUEST state
 | 
			
		||||
 *
 | 
			
		||||
 * Our current operation is:
 | 
			
		||||
 *	- Get imei/tmsi
 | 
			
		||||
 *	- Accept/Reject according to global policy
 | 
			
		||||
 */
 | 
			
		||||
struct gsm_loc_updating_operation {
 | 
			
		||||
        struct timer_list updating_timer;
 | 
			
		||||
	unsigned int waiting_for_imsi : 1;
 | 
			
		||||
	unsigned int waiting_for_imei : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Maximum number of neighbor cells whose average we track */
 | 
			
		||||
#define MAX_NEIGH_MEAS		10
 | 
			
		||||
/* Maximum size of the averaging window for neighbor cells */
 | 
			
		||||
#define MAX_WIN_NEIGH_AVG	10
 | 
			
		||||
 | 
			
		||||
/* processed neighbor measurements for one cell */
 | 
			
		||||
struct neigh_meas_proc {
 | 
			
		||||
	u_int16_t arfcn;
 | 
			
		||||
	u_int8_t bsic;
 | 
			
		||||
	u_int8_t rxlev[MAX_WIN_NEIGH_AVG];
 | 
			
		||||
	unsigned int rxlev_cnt;
 | 
			
		||||
	u_int8_t last_seen_nr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MAX_A5_KEY_LEN	(128/8)
 | 
			
		||||
#define RSL_ENC_ALG_A5(x)	(x+1)
 | 
			
		||||
 | 
			
		||||
/* is the data link established? who established it? */
 | 
			
		||||
#define LCHAN_SAPI_UNUSED	0
 | 
			
		||||
#define LCHAN_SAPI_MS		1
 | 
			
		||||
#define LCHAN_SAPI_NET		2
 | 
			
		||||
 | 
			
		||||
/* state of a logical channel */
 | 
			
		||||
enum gsm_lchan_state {
 | 
			
		||||
	LCHAN_S_NONE,		/* channel is not active */
 | 
			
		||||
	LCHAN_S_ACTIVE,		/* channel is active and operational */
 | 
			
		||||
	LCHAN_S_INACTIVE,	/* channel is set inactive */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_lchan {
 | 
			
		||||
	/* The TS that we're part of */
 | 
			
		||||
	struct gsm_bts_trx_ts *ts;
 | 
			
		||||
	/* The logical subslot number in the TS */
 | 
			
		||||
	u_int8_t nr;
 | 
			
		||||
	/* The logical channel type */
 | 
			
		||||
	enum gsm_chan_t type;
 | 
			
		||||
	/* RSL channel mode */
 | 
			
		||||
	enum rsl_cmod_spd rsl_cmode;
 | 
			
		||||
	/* If TCH, traffic channel mode */
 | 
			
		||||
	enum gsm48_chan_mode tch_mode;
 | 
			
		||||
	/* State */
 | 
			
		||||
	enum gsm_lchan_state state;
 | 
			
		||||
	/* Power levels for MS and BTS */
 | 
			
		||||
	u_int8_t bs_power;
 | 
			
		||||
	u_int8_t ms_power;
 | 
			
		||||
	/* Encryption information */
 | 
			
		||||
	struct {
 | 
			
		||||
		u_int8_t alg_id;
 | 
			
		||||
		u_int8_t key_len;
 | 
			
		||||
		u_int8_t key[MAX_A5_KEY_LEN];
 | 
			
		||||
	} encr;
 | 
			
		||||
 | 
			
		||||
	/* AMR bits */
 | 
			
		||||
	struct gsm48_multi_rate_conf mr_conf;
 | 
			
		||||
	
 | 
			
		||||
	/* To whom we are allocated at the moment */
 | 
			
		||||
	struct gsm_subscriber *subscr;
 | 
			
		||||
 | 
			
		||||
	struct timer_list T3101;
 | 
			
		||||
 | 
			
		||||
	/* Established data link layer services */
 | 
			
		||||
	u_int8_t sapis[8];
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Operations that have a state and might be pending
 | 
			
		||||
	 */
 | 
			
		||||
	struct gsm_loc_updating_operation *loc_operation;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * MSC handling...
 | 
			
		||||
	 */
 | 
			
		||||
	struct bss_sccp_connection_data *msc_data;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* use count. how many users use this channel */
 | 
			
		||||
	unsigned int use_count;
 | 
			
		||||
 | 
			
		||||
	/* cache of last measurement reports on this lchan */
 | 
			
		||||
	struct gsm_meas_rep meas_rep[6];
 | 
			
		||||
	int meas_rep_idx;
 | 
			
		||||
 | 
			
		||||
	/* table of neighbor cell measurements */
 | 
			
		||||
	struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];
 | 
			
		||||
 | 
			
		||||
	struct {
 | 
			
		||||
		u_int32_t bound_ip;
 | 
			
		||||
		u_int32_t connect_ip;
 | 
			
		||||
		u_int16_t bound_port;
 | 
			
		||||
		u_int16_t connect_port;
 | 
			
		||||
		u_int16_t conn_id;
 | 
			
		||||
		u_int8_t rtp_payload2;
 | 
			
		||||
		u_int8_t speech_mode;
 | 
			
		||||
		struct rtp_socket *rtp_socket;
 | 
			
		||||
	} abis_ip;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_e1_subslot {
 | 
			
		||||
	/* Number of E1 link */
 | 
			
		||||
	u_int8_t	e1_nr;
 | 
			
		||||
	/* Number of E1 TS inside E1 link */
 | 
			
		||||
	u_int8_t	e1_ts;
 | 
			
		||||
	/* Sub-slot within the E1 TS, 0xff if full TS */
 | 
			
		||||
	u_int8_t	e1_ts_ss;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define BTS_TRX_F_ACTIVATED	0x0001
 | 
			
		||||
/* One Timeslot in a TRX */
 | 
			
		||||
struct gsm_bts_trx_ts {
 | 
			
		||||
	struct gsm_bts_trx *trx;
 | 
			
		||||
	/* number of this timeslot at the TRX */
 | 
			
		||||
	u_int8_t nr;
 | 
			
		||||
 | 
			
		||||
	enum gsm_phys_chan_config pchan;
 | 
			
		||||
 | 
			
		||||
	unsigned int flags;
 | 
			
		||||
	struct gsm_nm_state nm_state;
 | 
			
		||||
	struct tlv_parsed nm_attr;
 | 
			
		||||
	u_int8_t nm_chan_comb;
 | 
			
		||||
 | 
			
		||||
	/* To which E1 subslot are we connected */
 | 
			
		||||
	struct gsm_e1_subslot e1_link;
 | 
			
		||||
 | 
			
		||||
	struct gsm_lchan lchan[TS_MAX_LCHAN];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* One TRX in a BTS */
 | 
			
		||||
struct gsm_bts_trx {
 | 
			
		||||
	/* list header in bts->trx_list */
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
 | 
			
		||||
	struct gsm_bts *bts;
 | 
			
		||||
	/* number of this TRX in the BTS */
 | 
			
		||||
	u_int8_t nr;
 | 
			
		||||
	/* how do we talk RSL with this TRX? */
 | 
			
		||||
	struct gsm_e1_subslot rsl_e1_link;
 | 
			
		||||
	u_int8_t rsl_tei;
 | 
			
		||||
	struct e1inp_sign_link *rsl_link;
 | 
			
		||||
 | 
			
		||||
	struct gsm_nm_state nm_state;
 | 
			
		||||
	struct tlv_parsed nm_attr;
 | 
			
		||||
	struct {
 | 
			
		||||
		struct gsm_nm_state nm_state;
 | 
			
		||||
	} bb_transc;
 | 
			
		||||
 | 
			
		||||
	u_int16_t arfcn;
 | 
			
		||||
	int nominal_power;		/* in dBm */
 | 
			
		||||
	unsigned int max_power_red;	/* in actual dB */
 | 
			
		||||
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			struct {
 | 
			
		||||
				struct gsm_nm_state nm_state;
 | 
			
		||||
			} bbsig;
 | 
			
		||||
			struct {
 | 
			
		||||
				struct gsm_nm_state nm_state;
 | 
			
		||||
			} pa;
 | 
			
		||||
		} bs11;
 | 
			
		||||
	};
 | 
			
		||||
	struct gsm_bts_trx_ts ts[TRX_NR_TS];
 | 
			
		||||
 | 
			
		||||
	/* NM state */
 | 
			
		||||
	int rf_locked;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_bts_type {
 | 
			
		||||
	GSM_BTS_TYPE_UNKNOWN,
 | 
			
		||||
	GSM_BTS_TYPE_BS11,
 | 
			
		||||
	GSM_BTS_TYPE_NANOBTS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A pending paging request 
 | 
			
		||||
 */
 | 
			
		||||
struct gsm_paging_request {
 | 
			
		||||
	/* list_head for list of all paging requests */
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
	/* the subscriber which we're paging. Later gsm_paging_request
 | 
			
		||||
	 * should probably become a part of the gsm_subscriber struct? */
 | 
			
		||||
	struct gsm_subscriber *subscr;
 | 
			
		||||
	/* back-pointer to the BTS on which we are paging */
 | 
			
		||||
	struct gsm_bts *bts;
 | 
			
		||||
	/* what kind of channel type do we ask the MS to establish */
 | 
			
		||||
	int chan_type;
 | 
			
		||||
 | 
			
		||||
	/* Timer 3113: how long do we try to page? */
 | 
			
		||||
	struct timer_list T3113;
 | 
			
		||||
 | 
			
		||||
	/* callback to be called in case paging completes */
 | 
			
		||||
	gsm_cbfn *cbfn;
 | 
			
		||||
	void *cbfn_param;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This keeps track of the paging status of one BTS. It
 | 
			
		||||
 * includes a number of pending requests, a back pointer
 | 
			
		||||
 * to the gsm_bts, a timer and some more state.
 | 
			
		||||
 */
 | 
			
		||||
struct gsm_bts_paging_state {
 | 
			
		||||
	/* pending requests */
 | 
			
		||||
	struct llist_head pending_requests;
 | 
			
		||||
	struct gsm_paging_request *last_request;
 | 
			
		||||
	struct gsm_bts *bts;
 | 
			
		||||
 | 
			
		||||
	struct timer_list work_timer;
 | 
			
		||||
 | 
			
		||||
	/* load */
 | 
			
		||||
	u_int16_t available_slots;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_envabtse {
 | 
			
		||||
	struct gsm_nm_state nm_state;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_bts_gprs_nsvc {
 | 
			
		||||
	struct gsm_bts *bts;
 | 
			
		||||
	int id;
 | 
			
		||||
	struct gsm_nm_state nm_state;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* One BTS */
 | 
			
		||||
struct gsm_bts {
 | 
			
		||||
	/* list header in net->bts_list */
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
 | 
			
		||||
	struct gsm_network *network;
 | 
			
		||||
	/* number of ths BTS in network */
 | 
			
		||||
	u_int8_t nr;
 | 
			
		||||
	/* Cell Identity */
 | 
			
		||||
	u_int16_t cell_identity;
 | 
			
		||||
	/* location area code of this BTS */
 | 
			
		||||
	u_int16_t location_area_code;
 | 
			
		||||
	/* Training Sequence Code */
 | 
			
		||||
	u_int8_t tsc;
 | 
			
		||||
	/* Base Station Identification Code (BSIC) */
 | 
			
		||||
	u_int8_t bsic;
 | 
			
		||||
	/* type of BTS */
 | 
			
		||||
	enum gsm_bts_type type;
 | 
			
		||||
	enum gsm_band band;
 | 
			
		||||
	/* should the channel allocator allocate channels from high TRX to TRX0,
 | 
			
		||||
	 * rather than starting from TRX0 and go upwards? */
 | 
			
		||||
	int chan_alloc_reverse;
 | 
			
		||||
	/* maximum Tx power that the MS is permitted to use in this cell */
 | 
			
		||||
	int ms_max_power;
 | 
			
		||||
 | 
			
		||||
	/* how do we talk OML with this TRX? */
 | 
			
		||||
	struct gsm_e1_subslot oml_e1_link;
 | 
			
		||||
	u_int8_t oml_tei;
 | 
			
		||||
	struct e1inp_sign_link *oml_link;
 | 
			
		||||
 | 
			
		||||
	/* Abis network management O&M handle */
 | 
			
		||||
	struct abis_nm_h *nmh;
 | 
			
		||||
	struct gsm_nm_state nm_state;
 | 
			
		||||
	struct tlv_parsed nm_attr;
 | 
			
		||||
 | 
			
		||||
	/* number of this BTS on given E1 link */
 | 
			
		||||
	u_int8_t bts_nr;
 | 
			
		||||
 | 
			
		||||
	/* paging state and control */
 | 
			
		||||
	struct gsm_bts_paging_state paging;
 | 
			
		||||
 | 
			
		||||
	/* CCCH is on C0 */
 | 
			
		||||
	struct gsm_bts_trx *c0;
 | 
			
		||||
 | 
			
		||||
	struct {
 | 
			
		||||
		struct gsm_nm_state nm_state;
 | 
			
		||||
	} site_mgr;
 | 
			
		||||
 | 
			
		||||
	/* parameters from which we build SYSTEM INFORMATION */
 | 
			
		||||
	struct {
 | 
			
		||||
		struct gsm48_rach_control rach_control;
 | 
			
		||||
		u_int8_t ncc_permitted;
 | 
			
		||||
		struct gsm48_cell_sel_par cell_sel_par;
 | 
			
		||||
		struct gsm48_cell_options cell_options;
 | 
			
		||||
		struct gsm48_control_channel_descr chan_desc;
 | 
			
		||||
		struct bitvec neigh_list;
 | 
			
		||||
		struct bitvec cell_alloc;
 | 
			
		||||
		struct {
 | 
			
		||||
			/* bitmask large enough for all possible ARFCN's */
 | 
			
		||||
			u_int8_t neigh_list[1024/8];
 | 
			
		||||
			u_int8_t cell_alloc[1024/8];
 | 
			
		||||
		} data;
 | 
			
		||||
	} si_common;
 | 
			
		||||
 | 
			
		||||
	/* ip.accesss Unit ID's have Site/BTS/TRX layout */
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			u_int16_t site_id;
 | 
			
		||||
			u_int16_t bts_id;
 | 
			
		||||
			u_int32_t flags;
 | 
			
		||||
		} ip_access;
 | 
			
		||||
		struct {
 | 
			
		||||
			struct {
 | 
			
		||||
				struct gsm_nm_state nm_state;
 | 
			
		||||
			} cclk;
 | 
			
		||||
			struct {
 | 
			
		||||
				struct gsm_nm_state nm_state;
 | 
			
		||||
			} rack;
 | 
			
		||||
			struct gsm_envabtse envabtse[4];
 | 
			
		||||
		} bs11;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	/* Not entirely sure how ip.access specific this is */
 | 
			
		||||
	struct {
 | 
			
		||||
		struct {
 | 
			
		||||
			struct gsm_nm_state nm_state;
 | 
			
		||||
		} nse;
 | 
			
		||||
		struct {
 | 
			
		||||
			struct gsm_nm_state nm_state;
 | 
			
		||||
		} cell;
 | 
			
		||||
		struct gsm_bts_gprs_nsvc nsvc[2];
 | 
			
		||||
	} gprs;
 | 
			
		||||
	
 | 
			
		||||
	/* transceivers */
 | 
			
		||||
	int num_trx;
 | 
			
		||||
	struct llist_head trx_list;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Some statistics of our network */
 | 
			
		||||
struct gsmnet_stats {
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long total;
 | 
			
		||||
		unsigned long no_channel;
 | 
			
		||||
	} chreq;
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long attempted;
 | 
			
		||||
		unsigned long no_channel;	/* no channel available */
 | 
			
		||||
		unsigned long timeout;		/* T3103 timeout */
 | 
			
		||||
		unsigned long completed;	/* HO COMPL received */
 | 
			
		||||
		unsigned long failed;		/* HO FAIL received */
 | 
			
		||||
	} handover;
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long attach;
 | 
			
		||||
		unsigned long normal;
 | 
			
		||||
		unsigned long periodic;
 | 
			
		||||
		unsigned long detach;
 | 
			
		||||
	} loc_upd_type;
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long reject;
 | 
			
		||||
		unsigned long accept;
 | 
			
		||||
	} loc_upd_resp;
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long attempted;
 | 
			
		||||
		unsigned long detached;
 | 
			
		||||
		unsigned long completed;
 | 
			
		||||
		unsigned long expired;
 | 
			
		||||
	} paging;
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long submitted; /* MO SMS submissions */
 | 
			
		||||
		unsigned long no_receiver;
 | 
			
		||||
		unsigned long delivered; /* MT SMS deliveries */
 | 
			
		||||
		unsigned long rp_err_mem;
 | 
			
		||||
		unsigned long rp_err_other;
 | 
			
		||||
	} sms;
 | 
			
		||||
	struct {
 | 
			
		||||
		unsigned long dialled;	/* total number of dialled calls */
 | 
			
		||||
		unsigned long alerted;	/* we alerted the other end */
 | 
			
		||||
		unsigned long connected;/* how many calls were accepted */
 | 
			
		||||
	} call;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_auth_policy {
 | 
			
		||||
	GSM_AUTH_POLICY_CLOSED, /* only subscribers authorized in DB */
 | 
			
		||||
	GSM_AUTH_POLICY_ACCEPT_ALL, /* accept everyone, even if not authorized in DB */
 | 
			
		||||
	GSM_AUTH_POLICY_TOKEN, /* accept first, send token per sms, then revoke authorization */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define GSM_T3101_DEFAULT 10
 | 
			
		||||
#define GSM_T3113_DEFAULT 60
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * internal data for audio management
 | 
			
		||||
 */
 | 
			
		||||
struct gsm_audio_support {
 | 
			
		||||
	u_int8_t hr  : 1,
 | 
			
		||||
		 ver : 7;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_network {
 | 
			
		||||
	/* global parameters */
 | 
			
		||||
	u_int16_t country_code;
 | 
			
		||||
	u_int16_t network_code;
 | 
			
		||||
	char *name_long;
 | 
			
		||||
	char *name_short;
 | 
			
		||||
	enum gsm_auth_policy auth_policy;
 | 
			
		||||
	enum gsm48_reject_value reject_cause;
 | 
			
		||||
	int a5_encryption;
 | 
			
		||||
	int neci;
 | 
			
		||||
	int send_mm_info;
 | 
			
		||||
	struct {
 | 
			
		||||
		int active;
 | 
			
		||||
		/* Window RXLEV averaging */
 | 
			
		||||
		unsigned int win_rxlev_avg;	/* number of SACCH frames */
 | 
			
		||||
		/* Window RXQUAL averaging */
 | 
			
		||||
		unsigned int win_rxqual_avg;	/* number of SACCH frames */
 | 
			
		||||
		/* Window RXLEV neighbouring cells averaging */
 | 
			
		||||
		unsigned int win_rxlev_avg_neigh; /* number of SACCH frames */
 | 
			
		||||
 | 
			
		||||
		/* how often should we check for power budget HO */
 | 
			
		||||
		unsigned int pwr_interval;	/* SACCH frames */
 | 
			
		||||
		/* how much better does a neighbor cell have to be ? */
 | 
			
		||||
		unsigned int pwr_hysteresis;	/* dBm */
 | 
			
		||||
		/* maximum distacne before we try a handover */
 | 
			
		||||
		unsigned int max_distance;	/* TA values */
 | 
			
		||||
	} handover;
 | 
			
		||||
 | 
			
		||||
	struct gsmnet_stats stats;
 | 
			
		||||
 | 
			
		||||
	struct gsm_audio_support **audio_support;
 | 
			
		||||
	int audio_length;
 | 
			
		||||
	int rtp_payload;
 | 
			
		||||
	int rtp_base_port;
 | 
			
		||||
 | 
			
		||||
	/* layer 4 */
 | 
			
		||||
	int (*mncc_recv) (struct gsm_network *net, int msg_type, void *arg);
 | 
			
		||||
	struct llist_head upqueue;
 | 
			
		||||
	struct llist_head trans_list;
 | 
			
		||||
 | 
			
		||||
	unsigned int num_bts;
 | 
			
		||||
	struct llist_head bts_list;
 | 
			
		||||
 | 
			
		||||
	/* timer values */
 | 
			
		||||
	int T3101;
 | 
			
		||||
	int T3103;
 | 
			
		||||
	int T3105;
 | 
			
		||||
	int T3107;
 | 
			
		||||
	int T3109;
 | 
			
		||||
	int T3111;
 | 
			
		||||
	int T3113;
 | 
			
		||||
	int T3115;
 | 
			
		||||
	int T3117;
 | 
			
		||||
	int T3119;
 | 
			
		||||
	int T3141;
 | 
			
		||||
 | 
			
		||||
	/* Radio Resource Location Protocol (TS 04.31) */
 | 
			
		||||
	struct {
 | 
			
		||||
		enum rrlp_mode mode;
 | 
			
		||||
	} rrlp;
 | 
			
		||||
 | 
			
		||||
	/* a hack for On Waves. It must be signed */
 | 
			
		||||
	int32_t core_country_code;
 | 
			
		||||
	int32_t core_network_code;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define SMS_HDR_SIZE	128
 | 
			
		||||
#define SMS_TEXT_SIZE	256
 | 
			
		||||
struct gsm_sms {
 | 
			
		||||
	unsigned long long id;
 | 
			
		||||
	struct gsm_subscriber *sender;
 | 
			
		||||
	struct gsm_subscriber *receiver;
 | 
			
		||||
 | 
			
		||||
	unsigned long validity_minutes;
 | 
			
		||||
	u_int8_t reply_path_req;
 | 
			
		||||
	u_int8_t status_rep_req;
 | 
			
		||||
	u_int8_t ud_hdr_ind;
 | 
			
		||||
	u_int8_t protocol_id;
 | 
			
		||||
	u_int8_t data_coding_scheme;
 | 
			
		||||
	u_int8_t msg_ref;
 | 
			
		||||
	char dest_addr[20+1];	/* DA LV is 12 bytes max, i.e. 10 bytes
 | 
			
		||||
				 * BCD == 20 bytes string */
 | 
			
		||||
	u_int8_t user_data_len;
 | 
			
		||||
	u_int8_t user_data[SMS_TEXT_SIZE];
 | 
			
		||||
 | 
			
		||||
	char text[SMS_TEXT_SIZE];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_code,
 | 
			
		||||
				     int (*mncc_recv)(struct gsm_network *, int, void *));
 | 
			
		||||
struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type,
 | 
			
		||||
			      u_int8_t tsc, u_int8_t bsic);
 | 
			
		||||
struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);
 | 
			
		||||
 | 
			
		||||
struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);
 | 
			
		||||
 | 
			
		||||
/* Get reference to a neighbor cell on a given BCCH ARFCN */
 | 
			
		||||
struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
 | 
			
		||||
				 u_int16_t arfcn, u_int8_t bsic);
 | 
			
		||||
 | 
			
		||||
struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num);
 | 
			
		||||
 | 
			
		||||
const char *gsm_pchan_name(enum gsm_phys_chan_config c);
 | 
			
		||||
enum gsm_phys_chan_config gsm_pchan_parse(const char *name);
 | 
			
		||||
const char *gsm_lchan_name(enum gsm_chan_t c);
 | 
			
		||||
const char *gsm_chreq_name(enum gsm_chreq_reason_t c);
 | 
			
		||||
char *gsm_ts_name(struct gsm_bts_trx_ts *ts);
 | 
			
		||||
 | 
			
		||||
enum gsm_e1_event {
 | 
			
		||||
	EVT_E1_NONE,
 | 
			
		||||
	EVT_E1_TEI_UP,
 | 
			
		||||
	EVT_E1_TEI_DN,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void set_ts_e1link(struct gsm_bts_trx_ts *ts, u_int8_t e1_nr,
 | 
			
		||||
		   u_int8_t e1_ts, u_int8_t e1_ts_ss);
 | 
			
		||||
enum gsm_bts_type parse_btstype(const char *arg);
 | 
			
		||||
const char *btstype2str(enum gsm_bts_type type);
 | 
			
		||||
struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
 | 
			
		||||
				struct gsm_bts *start_bts);
 | 
			
		||||
 | 
			
		||||
char *gsm_band_name(enum gsm_band band);
 | 
			
		||||
enum gsm_band gsm_band_parse(const char *mhz);
 | 
			
		||||
 | 
			
		||||
extern void *tall_bsc_ctx;
 | 
			
		||||
extern int ipacc_rtp_direct;
 | 
			
		||||
 | 
			
		||||
static inline int is_ipaccess_bts(struct gsm_bts *bts)
 | 
			
		||||
{
 | 
			
		||||
	switch (bts->type) {
 | 
			
		||||
	case GSM_BTS_TYPE_NANOBTS:
 | 
			
		||||
		return 1;
 | 
			
		||||
	default:
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int is_siemens_bts(struct gsm_bts *bts)
 | 
			
		||||
{
 | 
			
		||||
	switch (bts->type) {
 | 
			
		||||
	case GSM_BTS_TYPE_BS11:
 | 
			
		||||
		return 1;
 | 
			
		||||
	default:
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum gsm_auth_policy gsm_auth_policy_parse(const char *arg);
 | 
			
		||||
const char *gsm_auth_policy_name(enum gsm_auth_policy policy);
 | 
			
		||||
 | 
			
		||||
enum rrlp_mode rrlp_mode_parse(const char *arg);
 | 
			
		||||
const char *rrlp_mode_name(enum rrlp_mode mode);
 | 
			
		||||
 | 
			
		||||
void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked);
 | 
			
		||||
 | 
			
		||||
struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										95
									
								
								openbsc/include/openbsc/gsm_subscriber.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								openbsc/include/openbsc/gsm_subscriber.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
#ifndef _GSM_SUBSCR_H
 | 
			
		||||
#define _GSM_SUBSCR_H
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include "gsm_data.h"
 | 
			
		||||
#include "linuxlist.h"
 | 
			
		||||
 | 
			
		||||
#define GSM_IMEI_LENGTH 17
 | 
			
		||||
#define GSM_IMSI_LENGTH 17
 | 
			
		||||
#define GSM_NAME_LENGTH 128
 | 
			
		||||
 | 
			
		||||
#define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */
 | 
			
		||||
#define GSM_MIN_EXTEN 20000
 | 
			
		||||
#define GSM_MAX_EXTEN 49999
 | 
			
		||||
 | 
			
		||||
/* reserved according to GSM 03.03 § 2.4 */
 | 
			
		||||
#define GSM_RESERVED_TMSI   0xFFFFFFFF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define GSM_SUBSCRIBER_FIRST_CONTACT	0x00000001
 | 
			
		||||
#define tmsi_from_string(str) strtoul(str, NULL, 10)
 | 
			
		||||
 | 
			
		||||
struct gsm_equipment {
 | 
			
		||||
	long long unsigned int id;
 | 
			
		||||
	char imei[GSM_IMEI_LENGTH];
 | 
			
		||||
	char name[GSM_NAME_LENGTH];
 | 
			
		||||
 | 
			
		||||
	struct gsm48_classmark1 classmark1;
 | 
			
		||||
	u_int8_t classmark2_len;
 | 
			
		||||
	u_int8_t classmark2[3];
 | 
			
		||||
	u_int8_t classmark3_len;
 | 
			
		||||
	u_int8_t classmark3[14];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_subscriber {
 | 
			
		||||
	struct gsm_network *net;
 | 
			
		||||
	long long unsigned int id;
 | 
			
		||||
	char imsi[GSM_IMSI_LENGTH];
 | 
			
		||||
	u_int32_t tmsi;
 | 
			
		||||
	u_int16_t lac;
 | 
			
		||||
	char name[GSM_NAME_LENGTH];
 | 
			
		||||
	char extension[GSM_EXTENSION_LENGTH];
 | 
			
		||||
	int authorized;
 | 
			
		||||
 | 
			
		||||
	/* Temporary field which is not stored in the DB/HLR */
 | 
			
		||||
	u_int32_t flags;
 | 
			
		||||
 | 
			
		||||
	/* Every user can only have one equipment in use at any given
 | 
			
		||||
	 * point in time */
 | 
			
		||||
	struct gsm_equipment equipment;
 | 
			
		||||
 | 
			
		||||
	/* for internal management */
 | 
			
		||||
	int use_count;
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	/* pending requests */
 | 
			
		||||
	int in_callback;
 | 
			
		||||
	struct llist_head requests;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_subscriber_field {
 | 
			
		||||
	GSM_SUBSCRIBER_IMSI,
 | 
			
		||||
	GSM_SUBSCRIBER_TMSI,
 | 
			
		||||
	GSM_SUBSCRIBER_EXTENSION,
 | 
			
		||||
	GSM_SUBSCRIBER_ID,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_subscriber_update_reason {
 | 
			
		||||
	GSM_SUBSCRIBER_UPDATE_ATTACHED,
 | 
			
		||||
	GSM_SUBSCRIBER_UPDATE_DETACHED,
 | 
			
		||||
	GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
 | 
			
		||||
struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
 | 
			
		||||
struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
 | 
			
		||||
					  u_int32_t tmsi);
 | 
			
		||||
struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
 | 
			
		||||
					  const char *imsi);
 | 
			
		||||
struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
 | 
			
		||||
					       const char *ext);
 | 
			
		||||
struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
 | 
			
		||||
					unsigned long long id);
 | 
			
		||||
struct gsm_subscriber *subscr_get_or_create(struct gsm_network *net,
 | 
			
		||||
					    const char *imsi);
 | 
			
		||||
int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
 | 
			
		||||
void subscr_put_channel(struct gsm_lchan *lchan);
 | 
			
		||||
void subscr_get_channel(struct gsm_subscriber *subscr,
 | 
			
		||||
                        int type, gsm_cbfn *cbfn, void *param);
 | 
			
		||||
 | 
			
		||||
/* internal */
 | 
			
		||||
struct gsm_subscriber *subscr_alloc(void);
 | 
			
		||||
extern struct llist_head active_subscribers;
 | 
			
		||||
 | 
			
		||||
#endif /* _GSM_SUBSCR_H */
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user