mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-11-03 21:43:32 +00:00 
			
		
		
		
	Compare commits
	
		
			92 Commits
		
	
	
		
			openbsc/0.
			...
			on-waves/0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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 | 
							
								
								
									
										36
									
								
								openbsc/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								openbsc/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -3,12 +3,8 @@
 | 
				
			|||||||
.deps
 | 
					.deps
 | 
				
			||||||
Makefile
 | 
					Makefile
 | 
				
			||||||
Makefile.in
 | 
					Makefile.in
 | 
				
			||||||
bscconfig.h
 | 
					bsc_hack
 | 
				
			||||||
bscconfig.h.in
 | 
					bsc_msc_ip
 | 
				
			||||||
openbsc.pc
 | 
					 | 
				
			||||||
src/osmo-nitb/osmo-nitb
 | 
					 | 
				
			||||||
bsc_mgcp
 | 
					 | 
				
			||||||
src/osmo-bsc/osmo-bsc
 | 
					 | 
				
			||||||
*.*~
 | 
					*.*~
 | 
				
			||||||
*.sw?
 | 
					*.sw?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,41 +19,21 @@ install-sh
 | 
				
			|||||||
missing
 | 
					missing
 | 
				
			||||||
stamp-h1
 | 
					stamp-h1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# git-version-gen magic
 | 
					 | 
				
			||||||
.tarball-version
 | 
					 | 
				
			||||||
.version
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# apps and app data
 | 
					# apps and app data
 | 
				
			||||||
hlr.sqlite3
 | 
					hlr.sqlite3
 | 
				
			||||||
src/utils/bs11_config
 | 
					bs11_config
 | 
				
			||||||
src/ipaccess/ipaccess-config
 | 
					ipaccess-config
 | 
				
			||||||
src/ipaccess/ipaccess-find
 | 
					ipaccess-find
 | 
				
			||||||
src/ipaccess/ipaccess-firmware
 | 
					isdnsync
 | 
				
			||||||
src/ipaccess/ipaccess-proxy
 | 
					 | 
				
			||||||
src/utils/isdnsync
 | 
					 | 
				
			||||||
src/nat/bsc_nat
 | 
					 | 
				
			||||||
src/gprs/osmo-sgsn
 | 
					 | 
				
			||||||
src/gprs/osmo-gbproxy
 | 
					 | 
				
			||||||
src/osmo-bsc_nat/osmo-bsc_nat
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#tests
 | 
					#tests
 | 
				
			||||||
tests/bsc-nat/bsc_nat_test
 | 
					 | 
				
			||||||
tests/channel/channel_test
 | 
					tests/channel/channel_test
 | 
				
			||||||
tests/db/db_test
 | 
					tests/db/db_test
 | 
				
			||||||
tests/debug/debug_test
 | 
					tests/debug/debug_test
 | 
				
			||||||
tests/gsm0408/gsm0408_test
 | 
					tests/gsm0408/gsm0408_test
 | 
				
			||||||
tests/mgcp/mgcp_test
 | 
					 | 
				
			||||||
tests/sccp/sccp_test
 | 
					tests/sccp/sccp_test
 | 
				
			||||||
tests/sms/sms_test
 | 
					tests/sms/sms_test
 | 
				
			||||||
tests/timer/timer_test
 | 
					tests/timer/timer_test
 | 
				
			||||||
tests/gprs/gprs_test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
tests/atconfig
 | 
					 | 
				
			||||||
tests/atlocal
 | 
					 | 
				
			||||||
tests/package.m4
 | 
					 | 
				
			||||||
tests/testsuite
 | 
					 | 
				
			||||||
tests/testsuite.log
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
src/openbsc.cfg*
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,5 +3,3 @@ Holger Freyther <zecke@selfish.org>
 | 
				
			|||||||
Jan Luebbe <jluebbe@debian.org>
 | 
					Jan Luebbe <jluebbe@debian.org>
 | 
				
			||||||
Stefan Schmidt <stefan@datenfreihafen.org>
 | 
					Stefan Schmidt <stefan@datenfreihafen.org>
 | 
				
			||||||
Daniel Willmann <daniel@totalueberwachung.de>
 | 
					Daniel Willmann <daniel@totalueberwachung.de>
 | 
				
			||||||
Andreas Eversberg <Andreas.Eversberg@versatel.de>
 | 
					 | 
				
			||||||
Sylvain Munaut <246tnt@gmail.com>
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										890
									
								
								openbsc/COPYING
									
									
									
									
									
								
							
							
						
						
									
										890
									
								
								openbsc/COPYING
									
									
									
									
									
								
							@@ -1,624 +1,285 @@
 | 
				
			|||||||
                    GNU AFFERO GENERAL PUBLIC LICENSE
 | 
							    GNU GENERAL PUBLIC LICENSE
 | 
				
			||||||
                       Version 3, 19 November 2007
 | 
							       Version 2, June 1991
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 | 
					 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
 | 
					 Everyone is permitted to copy and distribute verbatim copies
 | 
				
			||||||
 of this license document, but changing it is not allowed.
 | 
					 of this license document, but changing it is not allowed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            Preamble
 | 
								    Preamble
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  The GNU Affero General Public License is a free, copyleft license for
 | 
					  The licenses for most software are designed to take away your
 | 
				
			||||||
software and other kinds of works, specifically designed to ensure
 | 
					freedom to share and change it.  By contrast, the GNU General Public
 | 
				
			||||||
cooperation with the community in the case of network server software.
 | 
					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
 | 
				
			||||||
  The licenses for most software and other practical works are designed
 | 
					General Public License applies to most of the Free Software
 | 
				
			||||||
to take away your freedom to share and change the works.  By contrast,
 | 
					Foundation's software and to any other program whose authors commit to
 | 
				
			||||||
our General Public Licenses are intended to guarantee your freedom to
 | 
					using it.  (Some other Free Software Foundation software is covered by
 | 
				
			||||||
share and change all versions of a program--to make sure it remains free
 | 
					the GNU Lesser General Public License instead.)  You can apply it to
 | 
				
			||||||
software for all its users.
 | 
					your programs, too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  When we speak of free software, we are referring to freedom, not
 | 
					  When we speak of free software, we are referring to freedom, not
 | 
				
			||||||
price.  Our General Public Licenses are designed to make sure that you
 | 
					price.  Our General Public Licenses are designed to make sure that you
 | 
				
			||||||
have the freedom to distribute copies of free software (and charge for
 | 
					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
 | 
					this service if you wish), that you receive source code or can get it
 | 
				
			||||||
want it, that you can change the software or use pieces of it in new
 | 
					if you want it, that you can change the software or use pieces of it
 | 
				
			||||||
free programs, and that you know you can do these things.
 | 
					in new free programs; and that you know you can do these things.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Developers that use our General Public Licenses protect your rights
 | 
					  To protect your rights, we need to make restrictions that forbid
 | 
				
			||||||
with two steps: (1) assert copyright on the software, and (2) offer
 | 
					anyone to deny you these rights or to ask you to surrender the rights.
 | 
				
			||||||
you this License which gives you legal permission to copy, distribute
 | 
					These restrictions translate to certain responsibilities for you if you
 | 
				
			||||||
and/or modify the software.
 | 
					distribute copies of the software, or if you modify it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  A secondary benefit of defending all users' freedom is that
 | 
					  For example, if you distribute copies of such a program, whether
 | 
				
			||||||
improvements made in alternate versions of the program, if they
 | 
					gratis or for a fee, you must give the recipients all the rights that
 | 
				
			||||||
receive widespread use, become available for other developers to
 | 
					you have.  You must make sure that they, too, receive or can get the
 | 
				
			||||||
incorporate.  Many developers of free software are heartened and
 | 
					source code.  And you must show them these terms so they know their
 | 
				
			||||||
encouraged by the resulting cooperation.  However, in the case of
 | 
					rights.
 | 
				
			||||||
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
 | 
					  We protect your rights with two steps: (1) copyright the software, and
 | 
				
			||||||
ensure that, in such cases, the modified source code becomes available
 | 
					(2) offer you this license which gives you legal permission to copy,
 | 
				
			||||||
to the community.  It requires the operator of a network server to
 | 
					distribute and/or modify the software.
 | 
				
			||||||
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
 | 
					  Also, for each author's protection and ours, we want to make certain
 | 
				
			||||||
published by Affero, was designed to accomplish similar goals.  This is
 | 
					that everyone understands that there is no warranty for this free
 | 
				
			||||||
a different license, not a version of the Affero GPL, but Affero has
 | 
					software.  If the software is modified by someone else and passed on, we
 | 
				
			||||||
released a new version of the Affero GPL which permits relicensing under
 | 
					want its recipients to know that what they have is not the original, so
 | 
				
			||||||
this license.
 | 
					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
 | 
					  The precise terms and conditions for copying, distribution and
 | 
				
			||||||
modification follow.
 | 
					modification follow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                       TERMS AND CONDITIONS
 | 
							    GNU GENERAL PUBLIC LICENSE
 | 
				
			||||||
 | 
					   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
				
			||||||
  0. Definitions.
 | 
					
 | 
				
			||||||
 | 
					  0. This License applies to any program or other work which contains
 | 
				
			||||||
  "This License" refers to version 3 of the GNU Affero General Public License.
 | 
					a notice placed by the copyright holder saying it may be distributed
 | 
				
			||||||
 | 
					under the terms of this General Public License.  The "Program", below,
 | 
				
			||||||
  "Copyright" also means copyright-like laws that apply to other kinds of
 | 
					refers to any such program or work, and a "work based on the Program"
 | 
				
			||||||
works, such as semiconductor masks.
 | 
					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,
 | 
				
			||||||
  "The Program" refers to any copyrightable work licensed under this
 | 
					either verbatim or with modifications and/or translated into another
 | 
				
			||||||
License.  Each licensee is addressed as "you".  "Licensees" and
 | 
					language.  (Hereinafter, translation is included without limitation in
 | 
				
			||||||
"recipients" may be individuals or organizations.
 | 
					the term "modification".)  Each licensee is addressed as "you".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  To "modify" a work means to copy from or adapt all or part of the work
 | 
					Activities other than copying, distribution and modification are not
 | 
				
			||||||
in a fashion requiring copyright permission, other than the making of an
 | 
					covered by this License; they are outside its scope.  The act of
 | 
				
			||||||
exact copy.  The resulting work is called a "modified version" of the
 | 
					running the Program is not restricted, and the output from the Program
 | 
				
			||||||
earlier work or a work "based on" the earlier work.
 | 
					is covered only if its contents constitute a work based on the
 | 
				
			||||||
 | 
					Program (independent of having been made by running the Program).
 | 
				
			||||||
  A "covered work" means either the unmodified Program or a work based
 | 
					Whether that is true depends on what the Program does.
 | 
				
			||||||
on the Program.
 | 
					
 | 
				
			||||||
 | 
					  1. You may copy and distribute verbatim copies of the Program's
 | 
				
			||||||
  To "propagate" a work means to do anything with it that, without
 | 
					source code as you receive it, in any medium, provided that you
 | 
				
			||||||
permission, would make you directly or secondarily liable for
 | 
					conspicuously and appropriately publish on each copy an appropriate
 | 
				
			||||||
infringement under applicable copyright law, except executing it on a
 | 
					copyright notice and disclaimer of warranty; keep intact all the
 | 
				
			||||||
computer or modifying a private copy.  Propagation includes copying,
 | 
					notices that refer to this License and to the absence of any warranty;
 | 
				
			||||||
distribution (with or without modification), making available to the
 | 
					and give any other recipients of the Program a copy of this License
 | 
				
			||||||
public, and in some countries other activities as well.
 | 
					along with the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  To "convey" a work means any kind of propagation that enables other
 | 
					You may charge a fee for the physical act of transferring a copy, and
 | 
				
			||||||
parties to make or receive copies.  Mere interaction with a user through
 | 
					you may at your option offer warranty protection in exchange for a fee.
 | 
				
			||||||
a computer network, with no transfer of a copy, is not conveying.
 | 
					
 | 
				
			||||||
 | 
					  2. You may modify your copy or copies of the Program or any portion
 | 
				
			||||||
  An interactive user interface displays "Appropriate Legal Notices"
 | 
					of it, thus forming a work based on the Program, and copy and
 | 
				
			||||||
to the extent that it includes a convenient and prominently visible
 | 
					distribute such modifications or work under the terms of Section 1
 | 
				
			||||||
feature that (1) displays an appropriate copyright notice, and (2)
 | 
					above, provided that you also meet all of these conditions:
 | 
				
			||||||
tells the user that there is no warranty for the work (except to the
 | 
					
 | 
				
			||||||
extent that warranties are provided), that licensees may convey the
 | 
					    a) You must cause the modified files to carry prominent notices
 | 
				
			||||||
work under this License, and how to view a copy of this License.  If
 | 
					    stating that you changed the files and the date of any change.
 | 
				
			||||||
the interface presents a list of user commands or options, such as a
 | 
					
 | 
				
			||||||
menu, a prominent item in the list meets this criterion.
 | 
					    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
 | 
				
			||||||
  1. Source Code.
 | 
					    part thereof, to be licensed as a whole at no charge to all third
 | 
				
			||||||
 | 
					    parties under the terms of this License.
 | 
				
			||||||
  The "source code" for a work means the preferred form of the work
 | 
					
 | 
				
			||||||
for making modifications to it.  "Object code" means any non-source
 | 
					    c) If the modified program normally reads commands interactively
 | 
				
			||||||
form of a work.
 | 
					    when run, you must cause it, when started running for such
 | 
				
			||||||
 | 
					    interactive use in the most ordinary way, to print or display an
 | 
				
			||||||
  A "Standard Interface" means an interface that either is an official
 | 
					    announcement including an appropriate copyright notice and a
 | 
				
			||||||
standard defined by a recognized standards body, or, in the case of
 | 
					    notice that there is no warranty (or else, saying that you provide
 | 
				
			||||||
interfaces specified for a particular programming language, one that
 | 
					    a warranty) and that users may redistribute the program under
 | 
				
			||||||
is widely used among developers working in that language.
 | 
					    these conditions, and telling the user how to view a copy of this
 | 
				
			||||||
 | 
					    License.  (Exception: if the Program itself is interactive but
 | 
				
			||||||
  The "System Libraries" of an executable work include anything, other
 | 
					    does not normally print such an announcement, your work based on
 | 
				
			||||||
than the work as a whole, that (a) is included in the normal form of
 | 
					    the Program is not required to print an announcement.)
 | 
				
			||||||
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
 | 
					These requirements apply to the modified work as a whole.  If
 | 
				
			||||||
Major Component, or to implement a Standard Interface for which an
 | 
					identifiable sections of that work are not derived from the Program,
 | 
				
			||||||
implementation is available to the public in source code form.  A
 | 
					and can be reasonably considered independent and separate works in
 | 
				
			||||||
"Major Component", in this context, means a major essential component
 | 
					themselves, then this License, and its terms, do not apply to those
 | 
				
			||||||
(kernel, window system, and so on) of the specific operating system
 | 
					sections when you distribute them as separate works.  But when you
 | 
				
			||||||
(if any) on which the executable work runs, or a compiler used to
 | 
					distribute the same sections as part of a whole which is a work based
 | 
				
			||||||
produce the work, or an object code interpreter used to run it.
 | 
					on the Program, the distribution of the whole must be on the terms of
 | 
				
			||||||
 | 
					this License, whose permissions for other licensees extend to the
 | 
				
			||||||
  The "Corresponding Source" for a work in object code form means all
 | 
					entire whole, and thus to each and every part regardless of who wrote it.
 | 
				
			||||||
the source code needed to generate, install, and (for an executable
 | 
					
 | 
				
			||||||
work) run the object code and to modify the work, including scripts to
 | 
					Thus, it is not the intent of this section to claim rights or contest
 | 
				
			||||||
control those activities.  However, it does not include the work's
 | 
					your rights to work written entirely by you; rather, the intent is to
 | 
				
			||||||
System Libraries, or general-purpose tools or generally available free
 | 
					exercise the right to control the distribution of derivative or
 | 
				
			||||||
programs which are used unmodified in performing those activities but
 | 
					collective works based on the Program.
 | 
				
			||||||
which are not part of the work.  For example, Corresponding Source
 | 
					
 | 
				
			||||||
includes interface definition files associated with source files for
 | 
					In addition, mere aggregation of another work not based on the Program
 | 
				
			||||||
the work, and the source code for shared libraries and dynamically
 | 
					with the Program (or with a work based on the Program) on a volume of
 | 
				
			||||||
linked subprograms that the work is specifically designed to require,
 | 
					a storage or distribution medium does not bring the other work under
 | 
				
			||||||
such as by intimate data communication or control flow between those
 | 
					the scope of this License.
 | 
				
			||||||
subprograms and other parts of the work.
 | 
					
 | 
				
			||||||
 | 
					  3. You may copy and distribute the Program (or a work based on it,
 | 
				
			||||||
  The Corresponding Source need not include anything that users
 | 
					under Section 2) in object code or executable form under the terms of
 | 
				
			||||||
can regenerate automatically from other parts of the Corresponding
 | 
					Sections 1 and 2 above provided that you also do one of the following:
 | 
				
			||||||
Source.
 | 
					
 | 
				
			||||||
 | 
					    a) Accompany it with the complete corresponding machine-readable
 | 
				
			||||||
  The Corresponding Source for a work in source code form is that
 | 
					    source code, which must be distributed under the terms of Sections
 | 
				
			||||||
same work.
 | 
					    1 and 2 above on a medium customarily used for software interchange; or,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  2. Basic Permissions.
 | 
					    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
 | 
				
			||||||
  All rights granted under this License are granted for the term of
 | 
					    cost of physically performing source distribution, a complete
 | 
				
			||||||
copyright on the Program, and are irrevocable provided the stated
 | 
					    machine-readable copy of the corresponding source code, to be
 | 
				
			||||||
conditions are met.  This License explicitly affirms your unlimited
 | 
					    distributed under the terms of Sections 1 and 2 above on a medium
 | 
				
			||||||
permission to run the unmodified Program.  The output from running a
 | 
					    customarily used for software interchange; or,
 | 
				
			||||||
covered work is covered by this License only if the output, given its
 | 
					
 | 
				
			||||||
content, constitutes a covered work.  This License acknowledges your
 | 
					    c) Accompany it with the information you received as to the offer
 | 
				
			||||||
rights of fair use or other equivalent, as provided by copyright law.
 | 
					    to distribute corresponding source code.  (This alternative is
 | 
				
			||||||
 | 
					    allowed only for noncommercial distribution and only if you
 | 
				
			||||||
  You may make, run and propagate covered works that you do not
 | 
					    received the program in object code or executable form with such
 | 
				
			||||||
convey, without conditions so long as your license otherwise remains
 | 
					    an offer, in accord with Subsection b above.)
 | 
				
			||||||
in force.  You may convey covered works to others for the sole purpose
 | 
					
 | 
				
			||||||
of having them make modifications exclusively for you, or provide you
 | 
					The source code for a work means the preferred form of the work for
 | 
				
			||||||
with facilities for running those works, provided that you comply with
 | 
					making modifications to it.  For an executable work, complete source
 | 
				
			||||||
the terms of this License in conveying all material for which you do
 | 
					code means all the source code for all modules it contains, plus any
 | 
				
			||||||
not control copyright.  Those thus making or running the covered works
 | 
					associated interface definition files, plus the scripts used to
 | 
				
			||||||
for you must do so exclusively on your behalf, under your direction
 | 
					control compilation and installation of the executable.  However, as a
 | 
				
			||||||
and control, on terms that prohibit them from making any copies of
 | 
					special exception, the source code distributed need not include
 | 
				
			||||||
your copyrighted material outside their relationship with you.
 | 
					anything that is normally distributed (in either source or binary
 | 
				
			||||||
 | 
					form) with the major components (compiler, kernel, and so on) of the
 | 
				
			||||||
  Conveying under any other circumstances is permitted solely under
 | 
					operating system on which the executable runs, unless that component
 | 
				
			||||||
the conditions stated below.  Sublicensing is not allowed; section 10
 | 
					itself accompanies the executable.
 | 
				
			||||||
makes it unnecessary.
 | 
					
 | 
				
			||||||
 | 
					If distribution of executable or object code is made by offering
 | 
				
			||||||
  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 | 
					access to copy from a designated place, then offering equivalent
 | 
				
			||||||
 | 
					access to copy the source code from the same place counts as
 | 
				
			||||||
  No covered work shall be deemed part of an effective technological
 | 
					distribution of the source code, even though third parties are not
 | 
				
			||||||
measure under any applicable law fulfilling obligations under article
 | 
					compelled to copy the source along with the object code.
 | 
				
			||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
 | 
					
 | 
				
			||||||
similar laws prohibiting or restricting circumvention of such
 | 
					  4. You may not copy, modify, sublicense, or distribute the Program
 | 
				
			||||||
measures.
 | 
					except as expressly provided under this License.  Any attempt
 | 
				
			||||||
 | 
					otherwise to copy, modify, sublicense or distribute the Program is
 | 
				
			||||||
  When you convey a covered work, you waive any legal power to forbid
 | 
					void, and will automatically terminate your rights under this License.
 | 
				
			||||||
circumvention of technological measures to the extent such circumvention
 | 
					However, parties who have received copies, or rights, from you under
 | 
				
			||||||
is effected by exercising rights under this License with respect to
 | 
					this License will not have their licenses terminated so long as such
 | 
				
			||||||
the covered work, and you disclaim any intention to limit operation or
 | 
					parties remain in full compliance.
 | 
				
			||||||
modification of the work as a means of enforcing, against the work's
 | 
					
 | 
				
			||||||
users, your or third parties' legal rights to forbid circumvention of
 | 
					  5. You are not required to accept this License, since you have not
 | 
				
			||||||
technological measures.
 | 
					signed it.  However, nothing else grants you permission to modify or
 | 
				
			||||||
 | 
					distribute the Program or its derivative works.  These actions are
 | 
				
			||||||
  4. Conveying Verbatim Copies.
 | 
					prohibited by law if you do not accept this License.  Therefore, by
 | 
				
			||||||
 | 
					modifying or distributing the Program (or any work based on the
 | 
				
			||||||
  You may convey verbatim copies of the Program's source code as you
 | 
					Program), you indicate your acceptance of this License to do so, and
 | 
				
			||||||
receive it, in any medium, provided that you conspicuously and
 | 
					all its terms and conditions for copying, distributing or modifying
 | 
				
			||||||
appropriately publish on each copy an appropriate copyright notice;
 | 
					the Program or works based on it.
 | 
				
			||||||
keep intact all notices stating that this License and any
 | 
					
 | 
				
			||||||
non-permissive terms added in accord with section 7 apply to the code;
 | 
					  6. Each time you redistribute the Program (or any work based on the
 | 
				
			||||||
keep intact all notices of the absence of any warranty; and give all
 | 
					Program), the recipient automatically receives a license from the
 | 
				
			||||||
recipients a copy of this License along with the Program.
 | 
					original licensor to copy, distribute or modify the Program subject to
 | 
				
			||||||
 | 
					these terms and conditions.  You may not impose any further
 | 
				
			||||||
  You may charge any price or no price for each copy that you convey,
 | 
					restrictions on the recipients' exercise of the rights granted herein.
 | 
				
			||||||
and you may offer support or warranty protection for a fee.
 | 
					You are not responsible for enforcing compliance by third parties to
 | 
				
			||||||
 | 
					 | 
				
			||||||
  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.
 | 
					this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Each contributor grants you a non-exclusive, worldwide, royalty-free
 | 
					  7. If, as a consequence of a court judgment or allegation of patent
 | 
				
			||||||
patent license under the contributor's essential patent claims, to
 | 
					infringement or for any other reason (not limited to patent issues),
 | 
				
			||||||
make, use, sell, offer for sale, import and otherwise run, modify and
 | 
					conditions are imposed on you (whether by court order, agreement or
 | 
				
			||||||
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
 | 
					otherwise) that contradict the conditions of this License, they do not
 | 
				
			||||||
excuse you from the conditions of this License.  If you cannot convey a
 | 
					excuse you from the conditions of this License.  If you cannot
 | 
				
			||||||
covered work so as to satisfy simultaneously your obligations under this
 | 
					distribute so as to satisfy simultaneously your obligations under this
 | 
				
			||||||
License and any other pertinent obligations, then as a consequence you may
 | 
					License and any other pertinent obligations, then as a consequence you
 | 
				
			||||||
not convey it at all.  For example, if you agree to terms that obligate you
 | 
					may not distribute the Program at all.  For example, if a patent
 | 
				
			||||||
to collect a royalty for further conveying from those to whom you convey
 | 
					license would not permit royalty-free redistribution of the Program by
 | 
				
			||||||
the Program, the only way you could satisfy both those terms and this
 | 
					all those who receive copies directly or indirectly through you, then
 | 
				
			||||||
License would be to refrain entirely from conveying the Program.
 | 
					the only way you could satisfy both it and this License would be to
 | 
				
			||||||
 | 
					refrain entirely from distribution of the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  13. Remote Network Interaction; Use with the GNU General Public License.
 | 
					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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Notwithstanding any other provision of this License, if you modify the
 | 
					It is not the purpose of this section to induce you to infringe any
 | 
				
			||||||
Program, your modified version must prominently offer all users
 | 
					patents or other property right claims or to contest validity of any
 | 
				
			||||||
interacting with it remotely through a computer network (if your version
 | 
					such claims; this section has the sole purpose of protecting the
 | 
				
			||||||
supports such interaction) an opportunity to receive the Corresponding
 | 
					integrity of the free software distribution system, which is
 | 
				
			||||||
Source of your version by providing access to the Corresponding Source
 | 
					implemented by public license practices.  Many people have made
 | 
				
			||||||
from a network server at no charge, through some standard or customary
 | 
					generous contributions to the wide range of software distributed
 | 
				
			||||||
means of facilitating copying of software.  This Corresponding Source
 | 
					through that system in reliance on consistent application of that
 | 
				
			||||||
shall include the Corresponding Source for any work covered by version 3
 | 
					system; it is up to the author/donor to decide if he or she is willing
 | 
				
			||||||
of the GNU General Public License that is incorporated pursuant to the
 | 
					to distribute software through any other system and a licensee cannot
 | 
				
			||||||
following paragraph.
 | 
					impose that choice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Notwithstanding any other provision of this License, you have
 | 
					This section is intended to make thoroughly clear what is believed to
 | 
				
			||||||
permission to link or combine any covered work with a work licensed
 | 
					be a consequence of the rest of this License.
 | 
				
			||||||
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.
 | 
					  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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  The Free Software Foundation may publish revised and/or new versions of
 | 
					  9. The Free Software Foundation may publish revised and/or new versions
 | 
				
			||||||
the GNU Affero General Public License from time to time.  Such new versions
 | 
					of the General Public License from time to time.  Such new versions will
 | 
				
			||||||
will be similar in spirit to the present version, but may differ in detail to
 | 
					be similar in spirit to the present version, but may differ in detail to
 | 
				
			||||||
address new problems or concerns.
 | 
					address new problems or concerns.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Each version is given a distinguishing version number.  If the
 | 
					Each version is given a distinguishing version number.  If the Program
 | 
				
			||||||
Program specifies that a certain numbered version of the GNU Affero General
 | 
					specifies a version number of this License which applies to it and "any
 | 
				
			||||||
Public License "or any later version" applies to it, you have the
 | 
					later version", you have the option of following the terms and conditions
 | 
				
			||||||
option of following the terms and conditions either of that numbered
 | 
					either of that version or of any later version published by the Free
 | 
				
			||||||
version or of any later version published by the Free Software
 | 
					Software Foundation.  If the Program does not specify a version number of
 | 
				
			||||||
Foundation.  If the Program does not specify a version number of the
 | 
					this License, you may choose any version ever published by the Free Software
 | 
				
			||||||
GNU Affero General Public License, you may choose any version ever published
 | 
					Foundation.
 | 
				
			||||||
by the Free Software Foundation.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  If the Program specifies that a proxy can decide which future
 | 
					  10. If you wish to incorporate parts of the Program into other free
 | 
				
			||||||
versions of the GNU Affero General Public License can be used, that proxy's
 | 
					programs whose distribution conditions are different, write to the author
 | 
				
			||||||
public statement of acceptance of a version permanently authorizes you
 | 
					to ask for permission.  For software which is copyrighted by the Free
 | 
				
			||||||
to choose that version for the Program.
 | 
					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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Later license versions may give you additional or different
 | 
								    NO WARRANTY
 | 
				
			||||||
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.
 | 
					  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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
 | 
					  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
				
			||||||
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
 | 
					WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 | 
				
			||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
 | 
					REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
				
			||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
 | 
					INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 | 
				
			||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
					OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 | 
				
			||||||
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
 | 
					TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 | 
				
			||||||
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
 | 
					YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 | 
				
			||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 | 
					PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 | 
				
			||||||
 | 
					POSSIBILITY OF SUCH DAMAGES.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  16. Limitation of Liability.
 | 
							     END OF TERMS AND CONDITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
						    How to Apply These Terms to Your New Programs
 | 
				
			||||||
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
 | 
					  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
 | 
					possible use to the public, the best way to achieve this is to make it
 | 
				
			||||||
@@ -626,36 +287,53 @@ 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 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
 | 
					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
 | 
					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.
 | 
					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.>
 | 
					    <one line to give the program's name and a brief idea of what it does.>
 | 
				
			||||||
    Copyright (C) <year>  <name of author>
 | 
					    Copyright (C) <year>  <name of author>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This program is free software: you can redistribute it and/or modify
 | 
					    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
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
    the Free Software Foundation, either version 3 of the License, or
 | 
					    the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
    (at your option) any later version.
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
    GNU Affero General Public License for more details.
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    You should have received a copy of the GNU Affero General Public License
 | 
					    You should have received a copy of the GNU General Public License along
 | 
				
			||||||
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					    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.
 | 
					Also add information on how to contact you by electronic and paper mail.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  If your software can interact with users remotely through a computer
 | 
					If the program is interactive, make it output a short notice like this
 | 
				
			||||||
network, you should also make sure that it provides a way for users to
 | 
					when it starts in an interactive mode:
 | 
				
			||||||
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,
 | 
					    Gnomovision version 69, Copyright (C) year name of author
 | 
				
			||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
 | 
					    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
				
			||||||
For more information on this, and how to apply and follow the GNU AGPL, see
 | 
					    This is free software, and you are welcome to redistribute it
 | 
				
			||||||
<http://www.gnu.org/licenses/>.
 | 
					    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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,10 @@
 | 
				
			|||||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 | 
					AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INCLUDES = $(all_includes) -I$(top_srcdir)/include
 | 
					INCLUDES = $(all_includes) -I$(top_srcdir)/include
 | 
				
			||||||
SUBDIRS = doc include src tests
 | 
					SUBDIRS = include src tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
					pkgconfigdir = $(libdir)/pkgconfig
 | 
				
			||||||
pkgconfig_DATA = openbsc.pc
 | 
					pkgconfig_DATA = openbsc.pc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BUILT_SOURCES = $(top_srcdir)/.version
 | 
					#dist-hook:
 | 
				
			||||||
EXTRA_DIST = git-version-gen
 | 
					#	rm -rf `find $(distdir) -name .svn`
 | 
				
			||||||
$(top_srcdir)/.version:
 | 
					 | 
				
			||||||
	echo $(VERSION) > $@-t && mv $@-t $@
 | 
					 | 
				
			||||||
dist-hook:
 | 
					 | 
				
			||||||
	echo $(VERSION) > $(distdir)/.tarball-version
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,32 +1,18 @@
 | 
				
			|||||||
About OpenBSC
 | 
					About OpenBSC
 | 
				
			||||||
=============
 | 
					=============
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OpenBSC is a minimalistic implementation of the GSM Network, with
 | 
					OpenBSC is a minimalistic implementation of the GSM Network, with particular
 | 
				
			||||||
particular emphasis on the functionality typically provided by the BSC,
 | 
					emphasis on the functionality typically provided by the BSC, MSC, HLR, VLR.
 | 
				
			||||||
MSC, HLR, VLR and SMSC.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Its currently supported interfaces towards the BTS are:
 | 
					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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 * Classic A-bis over E1 using a mISDN based E1 interface. In other
 | 
					So far, it has only been tested with the Siemens microBTS BS-11.  Test reports
 | 
				
			||||||
   words, you can connect existing GSM Base Transceiver Station (BTS)
 | 
					with other BTS are appreciated!
 | 
				
			||||||
   through E1 to OpenBSC.  So far, we have only tested the Siemens BS-11
 | 
					 | 
				
			||||||
   Test reports with other BTS are much appreciated!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 * A-bis over IP as used by the ip.access nanoBTS product family
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can find the project documentation at http://openbsc.gnumonks.org/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
This project is still in its early days, and there are lots of areas where it
 | 
					This project is still in its early days, and there are lots of areas where it
 | 
				
			||||||
doesn't behave as per GSM spec.
 | 
					doesn't behave as per GSM spec.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					December 29, 2008
 | 
				
			||||||
	Harald Welte <laforge@gnumonks.org>
 | 
						Harald Welte <laforge@gnumonks.org>
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libosmocore
 | 
					 | 
				
			||||||
===========
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please note that as of March 2010, OpenBSC has a dependency to a library
 | 
					 | 
				
			||||||
called "libosmocore".  You can obtain that library from
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	git://git.osmocom.org/libosmocore.git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,120 +0,0 @@
 | 
				
			|||||||
dnl Process this file with autoconf to produce a configure script
 | 
					 | 
				
			||||||
AC_INIT([openbsc],
 | 
					 | 
				
			||||||
	m4_esyscmd([./git-version-gen .tarball-version]),
 | 
					 | 
				
			||||||
	[openbsc-devel@lists.openbsc.org])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AM_INIT_AUTOMAKE([dist-bzip2])
 | 
					 | 
				
			||||||
AC_CONFIG_TESTDIR(tests)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl kernel style compile messages
 | 
					 | 
				
			||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl checks for programs
 | 
					 | 
				
			||||||
AC_PROG_MAKE_SET
 | 
					 | 
				
			||||||
AC_PROG_CC
 | 
					 | 
				
			||||||
AC_PROG_INSTALL
 | 
					 | 
				
			||||||
AC_PROG_RANLIB
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl checks for libraries
 | 
					 | 
				
			||||||
AC_SEARCH_LIBS(crypt, crypt,
 | 
					 | 
				
			||||||
    [LIBCRYPT="-lcrypt"; AC_DEFINE([VTY_CRYPT_PW], [], [Use crypt functionality of vty.])])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_ARG_ENABLE([nat], [AS_HELP_STRING([--enable-nat], [Build the BSC NAT. Requires SCCP])],
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.2)
 | 
					 | 
				
			||||||
        osmo_ac_build_nat="yes"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        osmo_ac_build_nat="no"
 | 
					 | 
				
			||||||
    ])
 | 
					 | 
				
			||||||
AM_CONDITIONAL(BUILD_NAT, test "x$osmo_ac_build_nat" = "xyes")
 | 
					 | 
				
			||||||
AC_SUBST(osmo_ac_build_nat)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_ARG_ENABLE([osmo-bsc], [AS_HELP_STRING([--enable-osmo-bsc], [Build the Osmo BSC])],
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.6)
 | 
					 | 
				
			||||||
        osmo_ac_build_bsc="yes"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        osmo_ac_build_bsc="no"
 | 
					 | 
				
			||||||
    ])
 | 
					 | 
				
			||||||
AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.2)
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0)
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.3.0)
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.1.0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
found_libgtp=yes
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(LIBGTP, libgtp, , found_libgtp=no)
 | 
					 | 
				
			||||||
AM_CONDITIONAL(HAVE_LIBGTP, test "$found_libgtp" = yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl checks for header files
 | 
					 | 
				
			||||||
AC_HEADER_STDC
 | 
					 | 
				
			||||||
AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built))
 | 
					 | 
				
			||||||
AC_CHECK_HEADERS(dbi/dbd.h,,AC_MSG_ERROR(DBI library is not installed))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl Checks for typedefs, structures and compiler characteristics
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The following test is taken from WebKit's webkit.m4
 | 
					 | 
				
			||||||
saved_CFLAGS="$CFLAGS"
 | 
					 | 
				
			||||||
CFLAGS="$CFLAGS -fvisibility=hidden "
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
 | 
					 | 
				
			||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
 | 
					 | 
				
			||||||
      [ AC_MSG_RESULT([yes])
 | 
					 | 
				
			||||||
        SYMBOL_VISIBILITY="-fvisibility=hidden"],
 | 
					 | 
				
			||||||
        AC_MSG_RESULT([no]))
 | 
					 | 
				
			||||||
CFLAGS="$saved_CFLAGS"
 | 
					 | 
				
			||||||
AC_SUBST(SYMBOL_VISIBILITY)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Coverage build taken from WebKit's configure.in
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([whether to enable code coverage support])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(coverage,
 | 
					 | 
				
			||||||
              AC_HELP_STRING([--enable-coverage],
 | 
					 | 
				
			||||||
                             [enable code coverage support [default=no]]),
 | 
					 | 
				
			||||||
              [],[enable_coverage="no"])
 | 
					 | 
				
			||||||
AC_MSG_RESULT([$enable_coverage])
 | 
					 | 
				
			||||||
if test "$enable_coverage" = "yes"; then
 | 
					 | 
				
			||||||
   COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
 | 
					 | 
				
			||||||
   COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
 | 
					 | 
				
			||||||
   AC_SUBST([COVERAGE_CFLAGS])
 | 
					 | 
				
			||||||
   AC_SUBST([COVERAGE_LDFLAGS])
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl Generate the output
 | 
					 | 
				
			||||||
AM_CONFIG_HEADER(bscconfig.h)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_OUTPUT(
 | 
					 | 
				
			||||||
    openbsc.pc
 | 
					 | 
				
			||||||
    include/openbsc/Makefile
 | 
					 | 
				
			||||||
    include/Makefile
 | 
					 | 
				
			||||||
    src/Makefile
 | 
					 | 
				
			||||||
    src/libtrau/Makefile
 | 
					 | 
				
			||||||
    src/libbsc/Makefile
 | 
					 | 
				
			||||||
    src/libctrl/Makefile
 | 
					 | 
				
			||||||
    src/libmsc/Makefile
 | 
					 | 
				
			||||||
    src/libmgcp/Makefile
 | 
					 | 
				
			||||||
    src/libcommon/Makefile
 | 
					 | 
				
			||||||
    src/osmo-nitb/Makefile
 | 
					 | 
				
			||||||
    src/osmo-bsc/Makefile
 | 
					 | 
				
			||||||
    src/osmo-bsc_nat/Makefile
 | 
					 | 
				
			||||||
    src/osmo-bsc_mgcp/Makefile
 | 
					 | 
				
			||||||
    src/ipaccess/Makefile
 | 
					 | 
				
			||||||
    src/utils/Makefile
 | 
					 | 
				
			||||||
    src/libgb/Makefile
 | 
					 | 
				
			||||||
    src/gprs/Makefile
 | 
					 | 
				
			||||||
    tests/Makefile
 | 
					 | 
				
			||||||
    tests/atlocal
 | 
					 | 
				
			||||||
    tests/debug/Makefile
 | 
					 | 
				
			||||||
    tests/gsm0408/Makefile
 | 
					 | 
				
			||||||
    tests/db/Makefile
 | 
					 | 
				
			||||||
    tests/channel/Makefile
 | 
					 | 
				
			||||||
    tests/bsc-nat/Makefile
 | 
					 | 
				
			||||||
    tests/mgcp/Makefile
 | 
					 | 
				
			||||||
    tests/gprs/Makefile
 | 
					 | 
				
			||||||
    doc/Makefile
 | 
					 | 
				
			||||||
    doc/examples/Makefile
 | 
					 | 
				
			||||||
    Makefile)
 | 
					 | 
				
			||||||
							
								
								
									
										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.3onwaves)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
@@ -1,170 +0,0 @@
 | 
				
			|||||||
-- Split trace based on SCCP Source
 | 
					 | 
				
			||||||
-- There are still bugs to find... bugs bugs bugs... hmm
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
        local function init_listener()
 | 
					 | 
				
			||||||
                print("CREATED LISTENER")
 | 
					 | 
				
			||||||
		local tap = Listener.new("ip", "sccp && (ip.src == 172.16.1.81 || ip.dst == 172.16.1.81)")
 | 
					 | 
				
			||||||
		local sccp_type_field = Field.new("sccp.message_type")
 | 
					 | 
				
			||||||
		local sccp_src_field = Field.new("sccp.slr")
 | 
					 | 
				
			||||||
		local sccp_dst_field = Field.new("sccp.dlr")
 | 
					 | 
				
			||||||
		local msg_type_field = Field.new("gsm_a.dtap_msg_mm_type")
 | 
					 | 
				
			||||||
		local lu_rej_field = Field.new("gsm_a.dtap.rej_cause")
 | 
					 | 
				
			||||||
		local ip_src_field = Field.new("ip.src")
 | 
					 | 
				
			||||||
		local ip_dst_field = Field.new("ip.dst")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		--
 | 
					 | 
				
			||||||
		local bssmap_msgtype_field = Field.new("gsm_a.bssmap_msgtype")
 | 
					 | 
				
			||||||
		-- assignment failure 0x03
 | 
					 | 
				
			||||||
		-- 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		--
 | 
					 | 
				
			||||||
		local dtap_cause_field = Field.new("gsm_a_dtap.cause")
 | 
					 | 
				
			||||||
		local dtap_cc_field = Field.new("gsm_a.dtap_msg_cc_type")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local connections = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function check_failure(con)
 | 
					 | 
				
			||||||
			check_lu_reject(con)
 | 
					 | 
				
			||||||
			check_disconnect(con)
 | 
					 | 
				
			||||||
			check_failures(con)
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- cipher mode reject
 | 
					 | 
				
			||||||
		function check_failures(con)
 | 
					 | 
				
			||||||
			local msgtype = bssmap_msgtype_field()
 | 
					 | 
				
			||||||
			if not msgtype then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			msgtype = tonumber(msgtype)
 | 
					 | 
				
			||||||
			if msgtype == 89 then
 | 
					 | 
				
			||||||
				print("Cipher mode reject")
 | 
					 | 
				
			||||||
				con[4] = true
 | 
					 | 
				
			||||||
			elseif msgtype == 0x03 then
 | 
					 | 
				
			||||||
				print("Assignment failure")
 | 
					 | 
				
			||||||
				con[4] = true
 | 
					 | 
				
			||||||
			elseif msgtype == 0x22 then
 | 
					 | 
				
			||||||
				print("Clear Request... RF failure?")
 | 
					 | 
				
			||||||
				con[4] = true
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- check if a DISCONNECT is normal
 | 
					 | 
				
			||||||
		function check_disconnect(con)
 | 
					 | 
				
			||||||
			local msg_type = dtap_cc_field()
 | 
					 | 
				
			||||||
			if not msg_type then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if tonumber(msg_type) ~= 0x25 then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local cause = dtap_cause_field()
 | 
					 | 
				
			||||||
			if not cause then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			cause = tonumber(cause)
 | 
					 | 
				
			||||||
			if cause ~= 0x10 then
 | 
					 | 
				
			||||||
				print("DISCONNECT != Normal")
 | 
					 | 
				
			||||||
				con[4] = true
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- check if we have a LU Reject
 | 
					 | 
				
			||||||
		function check_lu_reject(con)
 | 
					 | 
				
			||||||
			local msg_type =  msg_type_field()
 | 
					 | 
				
			||||||
			if not msg_type then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			msg_type = tonumber(tostring(msg_type))
 | 
					 | 
				
			||||||
			if msg_type == 0x04 then
 | 
					 | 
				
			||||||
				print("LU REJECT with " .. tostring(lu_rej_field()))
 | 
					 | 
				
			||||||
				con[4] = true
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                function tap.packet(pinfo,tvb,ip)
 | 
					 | 
				
			||||||
			local ip_src = tostring(ip_src_field())
 | 
					 | 
				
			||||||
			local ip_dst = tostring(ip_dst_field())
 | 
					 | 
				
			||||||
			local sccp_type = tonumber(tostring(sccp_type_field()))
 | 
					 | 
				
			||||||
			local sccp_src = sccp_src_field()
 | 
					 | 
				
			||||||
			local sccp_dst = sccp_dst_field()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local con
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if sccp_type == 0x01 then
 | 
					 | 
				
			||||||
			elseif sccp_type == 0x2 then
 | 
					 | 
				
			||||||
				local src = string.format("%s-%s", ip_src, tostring(sccp_src))
 | 
					 | 
				
			||||||
				local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
 | 
					 | 
				
			||||||
				local datestring = os.date("%Y%m%d%H%M%S")
 | 
					 | 
				
			||||||
				local pcap_name = string.format("alink_trace_%s-%s_%s.pcap", src, dst, datestring)
 | 
					 | 
				
			||||||
				local dumper = Dumper.new_for_current(pcap_name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				local con = { ip_src, tostring(sccp_src), tostring(sccp_dst), false, dumper, pcap_name }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				dumper:dump_current()
 | 
					 | 
				
			||||||
				connections[src] = con
 | 
					 | 
				
			||||||
				connections[dst] = con
 | 
					 | 
				
			||||||
			elseif sccp_type == 0x4 then
 | 
					 | 
				
			||||||
				-- close a connection... remove it from the list
 | 
					 | 
				
			||||||
				local src = string.format("%s-%s", ip_src, tostring(sccp_src))
 | 
					 | 
				
			||||||
				local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				local con = connections[src]
 | 
					 | 
				
			||||||
				if not con then
 | 
					 | 
				
			||||||
					return
 | 
					 | 
				
			||||||
				end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				con[5]:dump_current()
 | 
					 | 
				
			||||||
				con[5]:flush()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				-- this causes a crash on unpacted wireshark
 | 
					 | 
				
			||||||
				con[5]:close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				-- the connection had a failure
 | 
					 | 
				
			||||||
				if con[4] == true then
 | 
					 | 
				
			||||||
					local datestring = os.date("%Y%m%d%H%M%S")
 | 
					 | 
				
			||||||
					local new_name = string.format("alink_failure_%s_%s-%s.pcap", datestring, con[2], con[3])
 | 
					 | 
				
			||||||
					os.rename(con[6], new_name)
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					os.remove(con[6])
 | 
					 | 
				
			||||||
				end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				-- clear the old connection
 | 
					 | 
				
			||||||
				connections[src] = nil
 | 
					 | 
				
			||||||
				connections[dst] = nil
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			elseif sccp_type == 0x5 then
 | 
					 | 
				
			||||||
				-- not handled yet... we should verify stuff here...
 | 
					 | 
				
			||||||
				local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
 | 
					 | 
				
			||||||
				local con = connections[dst]
 | 
					 | 
				
			||||||
				if not con then
 | 
					 | 
				
			||||||
					return
 | 
					 | 
				
			||||||
				end
 | 
					 | 
				
			||||||
				con[5]:dump_current()
 | 
					 | 
				
			||||||
			elseif sccp_type == 0x6 then
 | 
					 | 
				
			||||||
				local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
 | 
					 | 
				
			||||||
				local con = connections[dst]
 | 
					 | 
				
			||||||
				if not con then
 | 
					 | 
				
			||||||
					print("DON'T KNOW THIS CONNECTION for " .. ip_dst)
 | 
					 | 
				
			||||||
					return
 | 
					 | 
				
			||||||
				end
 | 
					 | 
				
			||||||
				con[5]:dump_current()
 | 
					 | 
				
			||||||
				check_failure(con)
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                end
 | 
					 | 
				
			||||||
                function tap.draw()
 | 
					 | 
				
			||||||
                        print("DRAW")
 | 
					 | 
				
			||||||
                end
 | 
					 | 
				
			||||||
                function tap.reset()
 | 
					 | 
				
			||||||
                        print("RESET")
 | 
					 | 
				
			||||||
                end
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        init_listener()
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
Some crazy scripts call testing... and MSC link failure simulation
 | 
					 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
ABORT BUSY
 | 
					 | 
				
			||||||
ABORT 'NO CARRIER'
 | 
					 | 
				
			||||||
ABORT 'OK'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'' AT
 | 
					 | 
				
			||||||
SAY "Dialing a number\n"
 | 
					 | 
				
			||||||
'OK' ATD05660066;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,11 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
# Evil dial script..
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
while true;
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	chat -v -f all_dial < /dev/ttyACM0 > /dev/ttyACM0
 | 
					 | 
				
			||||||
	sleep 5s
 | 
					 | 
				
			||||||
	chat -v -f hangup < /dev/ttyACM0 > /dev/ttyACM0
 | 
					 | 
				
			||||||
	sleep 2s
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,6 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
sleep 3
 | 
					 | 
				
			||||||
echo "enable"
 | 
					 | 
				
			||||||
sleep 1
 | 
					 | 
				
			||||||
echo "drop bts connection 0 oml"
 | 
					 | 
				
			||||||
sleep 1
 | 
					 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
while true;
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	echo "Going to drop the OML connection"
 | 
					 | 
				
			||||||
	./drop-oml.sh | telnet 127.0.0.1 4242
 | 
					 | 
				
			||||||
	sleep 58m
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
@@ -1,4 +0,0 @@
 | 
				
			|||||||
TIMEOUT 10
 | 
					 | 
				
			||||||
'' ^Z
 | 
					 | 
				
			||||||
SAY "Waiting for hangup confirm\n"
 | 
					 | 
				
			||||||
'' ATH;
 | 
					 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
while true;
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	echo "Kill the osmo-bsc"
 | 
					 | 
				
			||||||
	/usr/bin/kill -s SIGUSR2 `pidof osmo-bsc`
 | 
					 | 
				
			||||||
	sleep 58s
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
@@ -1,104 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/python
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import sys,os
 | 
					 | 
				
			||||||
from optparse import OptionParser
 | 
					 | 
				
			||||||
import socket
 | 
					 | 
				
			||||||
import struct
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
verbose = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def prefix_ipa_ctrl_header(data):
 | 
					 | 
				
			||||||
	return struct.pack(">HBB", len(data)+1, 0xee, 0) + data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def remove_ipa_ctrl_header(data):
 | 
					 | 
				
			||||||
	if (len(data) < 4):
 | 
					 | 
				
			||||||
		raise BaseException("Answer too short!")
 | 
					 | 
				
			||||||
	(plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", data[:4])
 | 
					 | 
				
			||||||
	if (plen + 3 > len(data)):
 | 
					 | 
				
			||||||
		print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3)
 | 
					 | 
				
			||||||
	if (ipa_proto != 0xee or osmo_proto != 0):
 | 
					 | 
				
			||||||
		raise BaseException("Wrong protocol in answer!")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return data[4:plen+3], data[plen+3:]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def connect(host, port):
 | 
					 | 
				
			||||||
	if verbose:
 | 
					 | 
				
			||||||
		print "Connecting to host %s:%i" % (host, port)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 | 
					 | 
				
			||||||
	sck.setblocking(1)
 | 
					 | 
				
			||||||
	sck.connect((host, port))
 | 
					 | 
				
			||||||
	return sck
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def send(sck, data):
 | 
					 | 
				
			||||||
	if verbose:
 | 
					 | 
				
			||||||
		print "Sending \"%s\"" %(data)
 | 
					 | 
				
			||||||
	data = prefix_ipa_ctrl_header(data)
 | 
					 | 
				
			||||||
	sck.send(data)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def do_set(var, value, id, sck):
 | 
					 | 
				
			||||||
	setmsg = "SET %s %s %s" %(options.id, var, value)
 | 
					 | 
				
			||||||
	send(sck, setmsg)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def do_get(var, id, sck):
 | 
					 | 
				
			||||||
	getmsg = "GET %s %s" %(options.id, var)
 | 
					 | 
				
			||||||
	send(sck, getmsg)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
parser = OptionParser("Usage: %prog [options] var [value]")
 | 
					 | 
				
			||||||
parser.add_option("-d", "--host", dest="host",
 | 
					 | 
				
			||||||
  help="connect to HOST", metavar="HOST")
 | 
					 | 
				
			||||||
parser.add_option("-p", "--port", dest="port", type="int",
 | 
					 | 
				
			||||||
  help="use PORT", metavar="PORT", default=4249)
 | 
					 | 
				
			||||||
parser.add_option("-g", "--get", action="store_true",
 | 
					 | 
				
			||||||
  dest="cmd_get", help="perform GET operation")
 | 
					 | 
				
			||||||
parser.add_option("-s", "--set", action="store_true",
 | 
					 | 
				
			||||||
  dest="cmd_set", help="perform SET operation")
 | 
					 | 
				
			||||||
parser.add_option("-i", "--id", dest="id", default="1",
 | 
					 | 
				
			||||||
  help="set id manually", metavar="ID")
 | 
					 | 
				
			||||||
parser.add_option("-v", "--verbose", action="store_true",
 | 
					 | 
				
			||||||
  dest="verbose", help="be verbose", default=False)
 | 
					 | 
				
			||||||
parser.add_option("-m", "--monitor", action="store_true",
 | 
					 | 
				
			||||||
  dest="monitor", help="monitor the connection for traps", default=False)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(options, args) = parser.parse_args()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
verbose = options.verbose
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if options.cmd_set and options.cmd_get:
 | 
					 | 
				
			||||||
	parser.error("Get and set options are mutually exclusive!")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if not (options.cmd_get or options.cmd_set or options.monitor):
 | 
					 | 
				
			||||||
	parser.error("One of -m, -g, or -s must be set")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if not (options.host):
 | 
					 | 
				
			||||||
	parser.error("Destination host and port required!")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sock = connect(options.host, options.port)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if options.cmd_set:
 | 
					 | 
				
			||||||
	if len(args) < 2:
 | 
					 | 
				
			||||||
		parser.error("Set requires var and value arguments")
 | 
					 | 
				
			||||||
	do_set(args[0], ' '.join(args[1:]), options.id, sock)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if options.cmd_get:
 | 
					 | 
				
			||||||
	if len(args) != 1:
 | 
					 | 
				
			||||||
		parser.error("Get requires the var argument")
 | 
					 | 
				
			||||||
	do_get(args[0], options.id, sock)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
data = sock.recv(1024)
 | 
					 | 
				
			||||||
while (len(data)>0):
 | 
					 | 
				
			||||||
	(answer, data) = remove_ipa_ctrl_header(data)
 | 
					 | 
				
			||||||
	print "Got message:", answer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if options.monitor:
 | 
					 | 
				
			||||||
	while (True):
 | 
					 | 
				
			||||||
		data = sock.recv(1024)
 | 
					 | 
				
			||||||
		if len(data) == 0:
 | 
					 | 
				
			||||||
			print "Connection is gone."
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		while (len(data)>0):
 | 
					 | 
				
			||||||
			(answer, data) = remove_ipa_ctrl_header(data)
 | 
					 | 
				
			||||||
			print "Got message:", answer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sock.close()
 | 
					 | 
				
			||||||
@@ -1,58 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/env python
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
demonstrate a unblock bug on the GB Proxy..
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bts_ns_reset = "\x02\x00\x81\x01\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
 | 
					 | 
				
			||||||
ns_reset_ack = "\x03\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bts_ns_unblock = "\x06"
 | 
					 | 
				
			||||||
ns_unblock_ack = "\x07"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bts_bvc_reset_0 = "\x00\x00\x00\x00\x22\x04\x82\x00\x00\x07\x81\x03\x3b\x81\x02"
 | 
					 | 
				
			||||||
ns_bvc_reset_0_ack = "\x00\x00\x00\x00\x23\x04\x82\x00\x00"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bts_bvc_reset_8167 = "\x00\x00\x00\x00\x22\x04\x82\x1f\xe7\x07\x81\x08\x08\x88\x72\xf4\x80\x10\x1c\x00\x9c\x40"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import socket
 | 
					 | 
				
			||||||
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 | 
					 | 
				
			||||||
socket.bind(("0.0.0.0", 0))
 | 
					 | 
				
			||||||
socket.setblocking(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
port = int(sys.argv[1])
 | 
					 | 
				
			||||||
print "Sending data to port: %d" % port
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def send_and_receive(packet):
 | 
					 | 
				
			||||||
    socket.sendto(packet, ("127.0.0.1", port))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        data, addr = socket.recvfrom(4096)
 | 
					 | 
				
			||||||
    except socket.error, e:
 | 
					 | 
				
			||||||
        print "ERROR", e
 | 
					 | 
				
			||||||
        import sys
 | 
					 | 
				
			||||||
        sys.exit(0)
 | 
					 | 
				
			||||||
    return data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#send stuff once
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
to_send = [
 | 
					 | 
				
			||||||
    (bts_ns_reset, ns_reset_ack, "reset ack"),
 | 
					 | 
				
			||||||
    (bts_ns_unblock, ns_unblock_ack, "unblock ack"),
 | 
					 | 
				
			||||||
    (bts_bvc_reset_0, ns_bvc_reset_0_ack, "BVCI=0 reset ack"),
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for (out, inp, type) in to_send:
 | 
					 | 
				
			||||||
    res = send_and_receive(out)
 | 
					 | 
				
			||||||
    if res != inp:
 | 
					 | 
				
			||||||
        print "Failed to get the %s" % type
 | 
					 | 
				
			||||||
        sys.exit(-1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import time
 | 
					 | 
				
			||||||
time.sleep(3)
 | 
					 | 
				
			||||||
res = send_and_receive(bts_bvc_reset_8167)
 | 
					 | 
				
			||||||
print "Sent all messages... check wireshark for the last response"
 | 
					 | 
				
			||||||
@@ -1,78 +0,0 @@
 | 
				
			|||||||
-- Simple LUA script to print the size of BSSGP messages over their type...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	local ip_bucket = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local pdu_types = {}
 | 
					 | 
				
			||||||
	pdu_types[ 6] = "PAGING"
 | 
					 | 
				
			||||||
	pdu_types[11] = "SUSPEND"
 | 
					 | 
				
			||||||
	pdu_types[12] = "SUSPEND-ACK"
 | 
					 | 
				
			||||||
	pdu_types[32] = "BVC-BLOCK"
 | 
					 | 
				
			||||||
	pdu_types[33] = "BVC-BLOCK-ACK"
 | 
					 | 
				
			||||||
	pdu_types[34] = "BVC-RESET"
 | 
					 | 
				
			||||||
	pdu_types[35] = "BVC-RESET-ACK"
 | 
					 | 
				
			||||||
	pdu_types[36] = "UNBLOCK"
 | 
					 | 
				
			||||||
	pdu_types[37] = "UNBLOCK-ACK"
 | 
					 | 
				
			||||||
	pdu_types[38] = "FLOW-CONTROL-BVC"
 | 
					 | 
				
			||||||
	pdu_types[39] = "FLOW-CONTROL-BVC-ACK"
 | 
					 | 
				
			||||||
	pdu_types[40] = "FLOW-CONTROL-MS"
 | 
					 | 
				
			||||||
	pdu_types[41] = "FLOW-CONTROL-MS-ACK"
 | 
					 | 
				
			||||||
	pdu_types[44] = "LLC-DISCARDED"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local function init_listener()
 | 
					 | 
				
			||||||
		-- handle the port as NS over IP
 | 
					 | 
				
			||||||
		local udp_port_table = DissectorTable.get("udp.port")
 | 
					 | 
				
			||||||
		local gprs_ns_dis = Dissector.get("gprs_ns")
 | 
					 | 
				
			||||||
		udp_port_table:add(23000,gprs_ns_dis)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- bssgp filters
 | 
					 | 
				
			||||||
		local bssgp_pdu_get = Field.new("bssgp.pdu_type")
 | 
					 | 
				
			||||||
		local udp_length_get = Field.new("udp.length")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local tap = Listener.new("ip", "udp.port == 23000")
 | 
					 | 
				
			||||||
		function tap.packet(pinfo,tvb,ip)
 | 
					 | 
				
			||||||
			local pdu = bssgp_pdu_get()
 | 
					 | 
				
			||||||
			local len = udp_length_get()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			-- only handle bssgp, but we also want the IP frame
 | 
					 | 
				
			||||||
			if not pdu then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			pdu = tostring(pdu)
 | 
					 | 
				
			||||||
			if tonumber(pdu) == 0 or tonumber(pdu) == 1 then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local ip_src = tostring(ip.ip_src)
 | 
					 | 
				
			||||||
			local bssgp_histo = ip_bucket[ip_src]
 | 
					 | 
				
			||||||
			if not bssgp_histo then
 | 
					 | 
				
			||||||
				bssgp_histo = {}
 | 
					 | 
				
			||||||
				ip_bucket[ip_src] = bssgp_histo
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local key = pdu
 | 
					 | 
				
			||||||
			local bucket = bssgp_histo[key]
 | 
					 | 
				
			||||||
			if not bucket then
 | 
					 | 
				
			||||||
				bucket = {}
 | 
					 | 
				
			||||||
				bssgp_histo[key] = bucket
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			table.insert(bucket, tostring(len))
 | 
					 | 
				
			||||||
			print("IP: " .. ip_src .. " PDU: " .. pdu_types[tonumber(pdu)] .. " Length: " .. tostring(len))
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function tap.draw()
 | 
					 | 
				
			||||||
			-- well... this will not be called...
 | 
					 | 
				
			||||||
--			for ip,bssgp_histo in pairs(dumpers) do
 | 
					 | 
				
			||||||
--				print("IP " .. ip)
 | 
					 | 
				
			||||||
--			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function tap.reset()
 | 
					 | 
				
			||||||
			-- well... this will not be called...
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	init_listener()
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@@ -1,80 +0,0 @@
 | 
				
			|||||||
-- I count the buffer space needed for LLC PDUs in the worse case and print it
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	local function init_listener()
 | 
					 | 
				
			||||||
		-- handle the port as NS over IP
 | 
					 | 
				
			||||||
		local udp_port_table = DissectorTable.get("udp.port")
 | 
					 | 
				
			||||||
		local gprs_ns_dis = Dissector.get("gprs_ns")
 | 
					 | 
				
			||||||
		udp_port_table:add(23000,gprs_ns_dis)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- bssgp filters
 | 
					 | 
				
			||||||
		local bssgp_pdu_get = Field.new("bssgp.pdu_type")
 | 
					 | 
				
			||||||
		local bssgp_delay_get = Field.new("bssgp.delay_val")
 | 
					 | 
				
			||||||
		local llcgprs_get = Field.new("llcgprs")
 | 
					 | 
				
			||||||
		local pdus = nil
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		print("START...")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local tap = Listener.new("ip", "udp.port == 23000 && bssgp.pdu_type == 0")
 | 
					 | 
				
			||||||
		function tap.packet(pinfo,tvb,ip)
 | 
					 | 
				
			||||||
			local pdu = bssgp_pdu_get()
 | 
					 | 
				
			||||||
			local len = llcgprs_get().len
 | 
					 | 
				
			||||||
			local delay = bssgp_delay_get()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			-- only handle bssgp, but we also want the IP frame
 | 
					 | 
				
			||||||
			if not pdu then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if tonumber(tostring(delay)) == 65535 then
 | 
					 | 
				
			||||||
				pdus = { next = pdus,
 | 
					 | 
				
			||||||
					 len = len,
 | 
					 | 
				
			||||||
					 expires = -1 }
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				local off = tonumber(tostring(delay)) / 100.0
 | 
					 | 
				
			||||||
				pdus = { next = pdus,
 | 
					 | 
				
			||||||
					 len = len,
 | 
					 | 
				
			||||||
					 expires = pinfo.rel_ts + off }
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			local now_time = tonumber(tostring(pinfo.rel_ts))
 | 
					 | 
				
			||||||
			local now_size = 0
 | 
					 | 
				
			||||||
			local l = pdus
 | 
					 | 
				
			||||||
			local prev = nil
 | 
					 | 
				
			||||||
			local count = 0
 | 
					 | 
				
			||||||
			while l do
 | 
					 | 
				
			||||||
				if now_time < l.expires or l.expires == -1 then
 | 
					 | 
				
			||||||
					now_size = now_size + l.len
 | 
					 | 
				
			||||||
					prev = l
 | 
					 | 
				
			||||||
					l = l.next
 | 
					 | 
				
			||||||
					count = count + 1
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					-- delete things
 | 
					 | 
				
			||||||
					if prev == nil then
 | 
					 | 
				
			||||||
						pdus = nil
 | 
					 | 
				
			||||||
						l = nil
 | 
					 | 
				
			||||||
					else
 | 
					 | 
				
			||||||
						prev.next = l.next
 | 
					 | 
				
			||||||
						l = l.next
 | 
					 | 
				
			||||||
					end
 | 
					 | 
				
			||||||
				end
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
--			print("TOTAL: " .. now_time .. " PDU_SIZE: " .. now_size)
 | 
					 | 
				
			||||||
			print(now_time .. " " .. now_size / 1024.0 .. " " .. count)
 | 
					 | 
				
			||||||
--			print("NOW: " .. tostring(pinfo.rel_ts) .. " Delay: " .. tostring(delay) .. " Length: " .. tostring(len))
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function tap.draw()
 | 
					 | 
				
			||||||
			-- well... this will not be called...
 | 
					 | 
				
			||||||
--			for ip,bssgp_histo in pairs(dumpers) do
 | 
					 | 
				
			||||||
--				print("IP " .. ip)
 | 
					 | 
				
			||||||
--			end
 | 
					 | 
				
			||||||
			print("END")
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function tap.reset()
 | 
					 | 
				
			||||||
			-- well... this will not be called...
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	init_listener()
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@@ -1,46 +0,0 @@
 | 
				
			|||||||
-- Create a file named by_ip/''ip_addess''.cap with all ip traffic of each ip host. (works for tshark only)
 | 
					 | 
				
			||||||
-- Dump files are created for both source and destination hosts
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	local dir = "by_tlli"
 | 
					 | 
				
			||||||
	local dumpers = {}
 | 
					 | 
				
			||||||
	local function init_listener()
 | 
					 | 
				
			||||||
		local udp_port_table = DissectorTable.get("udp.port")
 | 
					 | 
				
			||||||
		local gprs_ns_dis = Dissector.get("gprs_ns")
 | 
					 | 
				
			||||||
		udp_port_table:add(23000,gprs_ns_dis)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local field_tlli = Field.new("bssgp.tlli")
 | 
					 | 
				
			||||||
		local tap = Listener.new("ip", "udp.port == 23000")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- we will be called once for every IP Header.
 | 
					 | 
				
			||||||
		-- If there's more than one IP header in a given packet we'll dump the packet once per every header
 | 
					 | 
				
			||||||
		function tap.packet(pinfo,tvb,ip)
 | 
					 | 
				
			||||||
			local tlli = field_tlli()
 | 
					 | 
				
			||||||
			if not tlli then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local tlli_str = tostring(tlli)
 | 
					 | 
				
			||||||
			tlli_dmp = dumpers[tlli_str]
 | 
					 | 
				
			||||||
			if not tlli_dmp then
 | 
					 | 
				
			||||||
				local tlli_hex = string.format("0x%x", tonumber(tlli_str))
 | 
					 | 
				
			||||||
				print("Creating dump for TLLI " .. tlli_hex)
 | 
					 | 
				
			||||||
				tlli_dmp = Dumper.new_for_current(dir .. "/" .. tlli_hex .. ".pcap")
 | 
					 | 
				
			||||||
				dumpers[tlli_str] = tlli_dmp
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			tlli_dmp:dump_current()
 | 
					 | 
				
			||||||
			tlli_dmp:flush()
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
		function tap.draw()
 | 
					 | 
				
			||||||
			for tlli,dumper in pairs(dumpers) do
 | 
					 | 
				
			||||||
				 dumper:flush()
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
		function tap.reset()
 | 
					 | 
				
			||||||
			for tlli,dumper in pairs(dumpers) do
 | 
					 | 
				
			||||||
				 dumper:close()
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			dumpers = {}
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	init_listener()
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@@ -1,59 +0,0 @@
 | 
				
			|||||||
-- This script verifies that the N(U) is increasing...
 | 
					 | 
				
			||||||
--
 | 
					 | 
				
			||||||
do
 | 
					 | 
				
			||||||
	local nu_state_src = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local function init_listener()
 | 
					 | 
				
			||||||
		-- handle the port as NS over IP
 | 
					 | 
				
			||||||
		local udp_port_table = DissectorTable.get("udp.port")
 | 
					 | 
				
			||||||
		local gprs_ns_dis = Dissector.get("gprs_ns")
 | 
					 | 
				
			||||||
		udp_port_table:add(23000,gprs_ns_dis)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- we want to look here...
 | 
					 | 
				
			||||||
		local llc_sapi_get = Field.new("llcgprs.sapib")
 | 
					 | 
				
			||||||
		local llc_nu_get = Field.new("llcgprs.nu")
 | 
					 | 
				
			||||||
		local bssgp_tlli_get = Field.new("bssgp.tlli")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local tap = Listener.new("ip", "udp.port == 23000")
 | 
					 | 
				
			||||||
		function tap.packet(pinfo,tvb,ip)
 | 
					 | 
				
			||||||
			local llc_sapi = llc_sapi_get()
 | 
					 | 
				
			||||||
			local llc_nu = llc_nu_get()
 | 
					 | 
				
			||||||
			local bssgp_tlli = bssgp_tlli_get()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if not llc_sapi or not llc_nu or not bssgp_tlli then
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local ip_src = tostring(ip.ip_src)
 | 
					 | 
				
			||||||
			local bssgp_tlli = tostring(bssgp_tlli)
 | 
					 | 
				
			||||||
			local llc_nu = tostring(llc_nu)
 | 
					 | 
				
			||||||
			local llc_sapi = tostring(llc_sapi)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local src_key = ip_src .. "-" .. bssgp_tlli .. "-" .. llc_sapi
 | 
					 | 
				
			||||||
			local last_nu = nu_state_src[src_key]
 | 
					 | 
				
			||||||
			if not last_nu then
 | 
					 | 
				
			||||||
				-- print("Establishing mapping for " .. src_key)
 | 
					 | 
				
			||||||
				nu_state_src[src_key] = llc_nu
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local function tohex(number)
 | 
					 | 
				
			||||||
				return string.format("0x%x", tonumber(number))
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			nu_state_src[src_key] = llc_nu
 | 
					 | 
				
			||||||
			if tonumber(last_nu) + 1 ~= tonumber(llc_nu) then
 | 
					 | 
				
			||||||
				print("JUMP in N(U) on TLLI " .. tohex(bssgp_tlli) .. " and SAPI: " .. llc_sapi .. " src: " .. ip_src)
 | 
					 | 
				
			||||||
				print("\t last: " .. last_nu .. " now: " .. llc_nu)
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function tap.draw()
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		function tap.reset()
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	init_listener()
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -10,7 +10,7 @@ rsip_resp = """200 321321332\r\n"""
 | 
				
			|||||||
audit_packet = """AUEP %d 13@mgw MGCP 1.0\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"""
 | 
					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"""
 | 
					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):
 | 
					def hexdump(src, length=8):
 | 
				
			||||||
    """Recipe is from http://code.activestate.com/recipes/142812/"""
 | 
					    """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 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 | 
				
			||||||
server_socket.bind(("127.0.0.1", MGCP_CALLAGENT_PORT))
 | 
					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):
 | 
					def send_receive(packet):
 | 
				
			||||||
    global last_ci
 | 
					 | 
				
			||||||
    server_socket.sendto(packet, ("127.0.0.1", MGCP_GATEWAY_PORT))
 | 
					    server_socket.sendto(packet, ("127.0.0.1", MGCP_GATEWAY_PORT))
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        data, addr = server_socket.recvfrom(4096)
 | 
					        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
 | 
					        print hexdump(data), addr
 | 
				
			||||||
    except socket.error, e:
 | 
					    except socket.error:
 | 
				
			||||||
        print e
 | 
					 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def generate_tid():
 | 
					def generate_tid():
 | 
				
			||||||
@@ -51,10 +42,13 @@ def generate_tid():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					i = 1
 | 
				
			||||||
while True:
 | 
					while True:
 | 
				
			||||||
    send_and_receive(audit_packet % generate_tid())
 | 
					    send_receive(rsip_resp)
 | 
				
			||||||
    send_and_receive(crcx_packet % generate_tid() )
 | 
					    send_receive(audit_packet)
 | 
				
			||||||
    send_and_receive(mdcx_packet % (generate_tid(), last_ci))
 | 
					    send_receive(crcx_packet % generate_tid() )
 | 
				
			||||||
    send_and_receive(dlcx_packet % (generate_tid(), last_ci))
 | 
					    send_receive(mdcx_packet % (generate_tid(), i))
 | 
				
			||||||
 | 
					    send_receive(dlcx_packet % (generate_tid(), i))
 | 
				
			||||||
 | 
					    i = i + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    time.sleep(3)
 | 
					    time.sleep(3)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,30 +0,0 @@
 | 
				
			|||||||
/* make test_regexp */
 | 
					 | 
				
			||||||
#include <sys/types.h>
 | 
					 | 
				
			||||||
#include <regex.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char **argv)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	regex_t reg;
 | 
					 | 
				
			||||||
	regmatch_t matches[2];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (argc != 4) {
 | 
					 | 
				
			||||||
		printf("Invoke with: test_regexp REGEXP REPLACE NR\n");
 | 
					 | 
				
			||||||
		return -1;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (regcomp(®, argv[1], REG_EXTENDED) != 0) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "Regexp '%s' is not valid.\n", argv[1]);
 | 
					 | 
				
			||||||
		return -1;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (regexec(®, argv[3], 2, matches, 0) == 0 && matches[1].rm_eo != -1)
 | 
					 | 
				
			||||||
		printf("New Number: %s%s\n", argv[2], &argv[3][matches[1].rm_so]);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		printf("No match.\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	regfree(®);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,66 +0,0 @@
 | 
				
			|||||||
"I create output for some simple SQL statements for the HLR db"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Eval [
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Create tables if they don't exist"
 | 
					 | 
				
			||||||
Transcript show: 'CREATE TABLE SMS (
 | 
					 | 
				
			||||||
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
 | 
					 | 
				
			||||||
                    created TIMESTAMP NOT NULL,
 | 
					 | 
				
			||||||
                    sent TIMESTAMP,
 | 
					 | 
				
			||||||
                    sender_id INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    receiver_id INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    deliver_attempts INTEGER NOT NULL DEFAULT 0,
 | 
					 | 
				
			||||||
                    valid_until TIMESTAMP,
 | 
					 | 
				
			||||||
                    reply_path_req INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    status_rep_req INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    protocol_id INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    data_coding_scheme INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    ud_hdr_ind INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                    dest_addr TEXT,
 | 
					 | 
				
			||||||
                    user_data BLOB,
 | 
					 | 
				
			||||||
                    header BLOB,
 | 
					 | 
				
			||||||
                    text TEXT);'; nl;
 | 
					 | 
				
			||||||
	     show: 'CREATE TABLE Subscriber (
 | 
					 | 
				
			||||||
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
 | 
					 | 
				
			||||||
                    created TIMESTAMP NOT NULL,
 | 
					 | 
				
			||||||
                    updated TIMESTAMP NOT NULL,
 | 
					 | 
				
			||||||
                    imsi NUMERIC UNIQUE NOT NULL,
 | 
					 | 
				
			||||||
                    name TEXT,
 | 
					 | 
				
			||||||
                    extension TEXT UNIQUE,
 | 
					 | 
				
			||||||
                    authorized INTEGER NOT NULL DEFAULT 0,
 | 
					 | 
				
			||||||
                    tmsi TEXT UNIQUE,
 | 
					 | 
				
			||||||
                    lac INTEGER NOT NULL DEFAULT 0);'; nl.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Create some dummy subscribers"
 | 
					 | 
				
			||||||
num_sub := 1000.
 | 
					 | 
				
			||||||
num_sms := 30.
 | 
					 | 
				
			||||||
lac := 1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Transcript show: 'BEGIN;'; nl.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1 to: num_sub do: [:each |
 | 
					 | 
				
			||||||
   Transcript show: 'INSERT INTO Subscriber
 | 
					 | 
				
			||||||
                        (imsi, created, updated, authorized, lac, extension)
 | 
					 | 
				
			||||||
                        VALUES
 | 
					 | 
				
			||||||
                        (%1, datetime(''now''), datetime(''now''), 1, %2, %3);' %
 | 
					 | 
				
			||||||
                        {(274090000000000 + each). lac. each}; nl.
 | 
					 | 
				
			||||||
].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1 to: num_sms do: [:sms |
 | 
					 | 
				
			||||||
    1 to: num_sub do: [:sub |
 | 
					 | 
				
			||||||
        Transcript show: 'INSERT INTO SMS
 | 
					 | 
				
			||||||
                            (created, sender_id, receiver_id, valid_until,
 | 
					 | 
				
			||||||
                             reply_path_req, status_rep_req, protocol_id,
 | 
					 | 
				
			||||||
                             data_coding_scheme, ud_hdr_ind, dest_addr,
 | 
					 | 
				
			||||||
                             text) VALUES
 | 
					 | 
				
			||||||
                            (datetime(''now''), 1, %1, ''2222-2-2'',
 | 
					 | 
				
			||||||
                             0, 0, 0,
 | 
					 | 
				
			||||||
                             0, 0, ''123456'',
 | 
					 | 
				
			||||||
                             ''abc'');' % {sub}; nl.
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Transcript show: 'COMMIT;'; nl.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
@@ -1,10 +0,0 @@
 | 
				
			|||||||
"Query for one SMS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Eval [
 | 
					 | 
				
			||||||
1 to: 100 do: [:each |
 | 
					 | 
				
			||||||
    Transcript show: 'SELECT SMS.* FROM SMS
 | 
					 | 
				
			||||||
                        JOIN Subscriber ON SMS.receiver_id = Subscriber.id
 | 
					 | 
				
			||||||
                            WHERE SMS.id >= 1 AND SMS.sent IS NULL AND Subscriber.lac > 0
 | 
					 | 
				
			||||||
                            ORDER BY SMS.id LIMIT 1;'; nl.
 | 
					 | 
				
			||||||
].
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
probe process("/usr/lib/libsqlite3.so.0.8.6").function("sqlite3_get_table")
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  a = user_string($zSql);
 | 
					 | 
				
			||||||
  printf("sqlite3_get_table called '%s'\n", a);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,11 +0,0 @@
 | 
				
			|||||||
openbsc (0.9.13.115.eb113-1) natty; urgency=low
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * New upstream release
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 -- Harald Welte <laforge@gnumonks.org>  Wed, 11 May 2011 18:41:24 +0000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
openbsc (0.9.4-1) unstable; urgency=low
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 -- Harald Welte <laforge@gnumonks.org>  Tue, 24 Aug 2010 13:34:24 +0200
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
7
 | 
					 | 
				
			||||||
@@ -1,44 +0,0 @@
 | 
				
			|||||||
Source: openbsc
 | 
					 | 
				
			||||||
Section: net
 | 
					 | 
				
			||||||
Priority: optional
 | 
					 | 
				
			||||||
Maintainer: Harald Welte <laforge@gnumonks.org>
 | 
					 | 
				
			||||||
Build-Depends: debhelper (>= 7.0.0~), autotools-dev, pkg-config, libgtp, libosmocore-dev, libosmo-sccp-dev, libdbi0-dev
 | 
					 | 
				
			||||||
Standards-Version: 3.8.4
 | 
					 | 
				
			||||||
Homepage: http://openbsc.osmocom.org/
 | 
					 | 
				
			||||||
Vcs-Git: git://bs11-abis.gnumonks.org/openbsc.git
 | 
					 | 
				
			||||||
Vcs-Browser: http://openbsc.osmocom.org/trac/browser
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-bsc
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libosmo-sccp
 | 
					 | 
				
			||||||
Description: GSM Base Station Controller; BSC-only version of OpenBSC.  Needs a real MSC!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-nitb
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libdbd-sqlite3, libdbi0
 | 
					 | 
				
			||||||
Description: GSM Network-in-a-Box, implements BSC, MSC, SMSC, HLR, VLR
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-ipaccess-utils
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
 | 
					 | 
				
			||||||
Description: Command line utilities for ip.access nanoBTS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-bs11-utils
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
 | 
					 | 
				
			||||||
Description: Command line utilities for Siemens BS-11 BTS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-sgsn
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libgtp
 | 
					 | 
				
			||||||
Description: Osmocom Serving GPRS Support Node
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-gbproxy
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
 | 
					 | 
				
			||||||
Description: Osmocom GPRS Gb Interface Proxy
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Package: osmocom-bsc-nat
 | 
					 | 
				
			||||||
Architecture: any
 | 
					 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
 | 
					 | 
				
			||||||
Description: Osmocom Base Station Controller Network Address Translation
 | 
					 | 
				
			||||||
@@ -1,50 +0,0 @@
 | 
				
			|||||||
This work was packaged for Debian by:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Harald Welte <laforge@gnumonks.org> on Tue, 24 Aug 2010 10:55:04 +0200
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
It was downloaded from:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    git://bs11-abis.gnumonks.org/openbsc.git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Upstream Author(s):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Harald Welte <laforge@gnumonks.org>
 | 
					 | 
				
			||||||
    Dieter Spaar <spaar@mirider.augusta.de>
 | 
					 | 
				
			||||||
    Holger Hans Peter Freyther <zecke@selfish.org>
 | 
					 | 
				
			||||||
    Sylvain Munaut <tnt@246tNt.com>
 | 
					 | 
				
			||||||
    Daniel Willmann <daniel@totalueberwachung.de>
 | 
					 | 
				
			||||||
    Jan Luebbe <jluebbe@debian.org>
 | 
					 | 
				
			||||||
    Mike Haben <michael.haben@btinternet.com>
 | 
					 | 
				
			||||||
    Andreas Eversberg <Andreas.Eversberg@versatel.de>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright (C) 2008-2010 Harald Welte <laforge@gnumonks.org>
 | 
					 | 
				
			||||||
    Copyright (C) 2008-2009 Dieter Spaar <spaar@mirider.augusta.de>
 | 
					 | 
				
			||||||
    Copyright (C) 2008-2010 Holger Hans Peter Freyther <zecke@selfish.org>
 | 
					 | 
				
			||||||
    Copyright (C) 2009-2010 Sylvain Munaut <tnt@246tNt.com>
 | 
					 | 
				
			||||||
    Copyright (C) 2009-2010 On-Waves
 | 
					 | 
				
			||||||
    Copyright (C) 2008 Daniel Willmann <daniel@totalueberwachung.de>
 | 
					 | 
				
			||||||
    Copyright (C) 2008 Jan Luebbe <jluebbe@debian.org>
 | 
					 | 
				
			||||||
    Copyright (C) 2009 by Mike Haben <michael.haben@btinternet.com>
 | 
					 | 
				
			||||||
    Copyright (C) 2009 Andreas Eversberg <Andreas.Eversberg@versatel.de>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
License:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    GNU General Public License, Version 2 or later
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The Debian packaging is:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Please chose a license for your packaging work. If the program you package
 | 
					 | 
				
			||||||
# uses a mainstream license, using the same license is the safest choice.
 | 
					 | 
				
			||||||
# Please avoid to pick license terms that are more restrictive than the
 | 
					 | 
				
			||||||
# packaged work, as it may make Debian's contributions unacceptable upstream.
 | 
					 | 
				
			||||||
# If you just want it to be GPL version 3, leave the following lines in.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
and is licensed under the GPL version 3,
 | 
					 | 
				
			||||||
see "/usr/share/common-licenses/GPL-3".
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Please also look if there are files or directories which have a
 | 
					 | 
				
			||||||
# different copyright/license attached and list them here.
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
README
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
/usr/bin/bs11_config
 | 
					 | 
				
			||||||
/usr/bin/isdnsync
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
/usr/bin/osmo-bsc_nat
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
doc/examples/osmo-bsc_mgcp
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
/usr/bin/bsc_mgcp
 | 
					 | 
				
			||||||
/usr/bin/osmo-bsc
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
/usr/bin/osmo-gbproxy
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
/usr/bin/ipaccess-config
 | 
					 | 
				
			||||||
/usr/bin/ipaccess-find
 | 
					 | 
				
			||||||
/usr/bin/ipaccess-proxy
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
# Configuration file
 | 
					 | 
				
			||||||
CONFIG_FILE="/etc/osmocom/osmo-nitb.cfg"
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
doc/examples/osmo-nitb
 | 
					 | 
				
			||||||
@@ -1,156 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
### BEGIN INIT INFO
 | 
					 | 
				
			||||||
# Provides:          osmo-nitb
 | 
					 | 
				
			||||||
# Required-Start:    $network $local_fs
 | 
					 | 
				
			||||||
# Required-Stop:
 | 
					 | 
				
			||||||
# Default-Start:     2 3 4 5
 | 
					 | 
				
			||||||
# Default-Stop:      0 1 6
 | 
					 | 
				
			||||||
# Short-Description: Osmocom GSM network-in-a-box
 | 
					 | 
				
			||||||
# Description:       A minimal implementation of the GSM Base Station Controller,
 | 
					 | 
				
			||||||
#                    Mobile Switching Center, Home Location regster and all other
 | 
					 | 
				
			||||||
#                    components to run a self-contained GSM network.
 | 
					 | 
				
			||||||
### END INIT INFO
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Author: Harald Welte <laforge@gnumonks.org>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
 | 
					 | 
				
			||||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
 | 
					 | 
				
			||||||
DESC=osmo-nitb             # Introduce a short description here
 | 
					 | 
				
			||||||
NAME=osmo-nitb             # Introduce the short server's name here
 | 
					 | 
				
			||||||
DAEMON=/usr/sbin/osmo-nitb # Introduce the server's location here
 | 
					 | 
				
			||||||
DAEMON_ARGS="-D"           # Arguments to run the daemon with
 | 
					 | 
				
			||||||
PIDFILE=/var/run/$NAME.pid
 | 
					 | 
				
			||||||
SCRIPTNAME=/etc/init.d/$NAME
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Exit if the package is not installed
 | 
					 | 
				
			||||||
[ -x $DAEMON ] || exit 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Read configuration variable file if it is present
 | 
					 | 
				
			||||||
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Load the VERBOSE setting and other rcS variables
 | 
					 | 
				
			||||||
. /lib/init/vars.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Define LSB log_* functions.
 | 
					 | 
				
			||||||
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
 | 
					 | 
				
			||||||
. /lib/lsb/init-functions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DAEMON_ARGS="$DAEMON_ARGS -c $CONFIG_FILE"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Function that starts the daemon/service
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
do_start()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	# Return
 | 
					 | 
				
			||||||
	#   0 if daemon has been started
 | 
					 | 
				
			||||||
	#   1 if daemon was already running
 | 
					 | 
				
			||||||
	#   2 if daemon could not be started
 | 
					 | 
				
			||||||
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
 | 
					 | 
				
			||||||
		|| return 1
 | 
					 | 
				
			||||||
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
 | 
					 | 
				
			||||||
		$DAEMON_ARGS \
 | 
					 | 
				
			||||||
		|| return 2
 | 
					 | 
				
			||||||
	# Add code here, if necessary, that waits for the process to be ready
 | 
					 | 
				
			||||||
	# to handle requests from services started subsequently which depend
 | 
					 | 
				
			||||||
	# on this one.  As a last resort, sleep for some time.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Function that stops the daemon/service
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
do_stop()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	# Return
 | 
					 | 
				
			||||||
	#   0 if daemon has been stopped
 | 
					 | 
				
			||||||
	#   1 if daemon was already stopped
 | 
					 | 
				
			||||||
	#   2 if daemon could not be stopped
 | 
					 | 
				
			||||||
	#   other if a failure occurred
 | 
					 | 
				
			||||||
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
 | 
					 | 
				
			||||||
	RETVAL="$?"
 | 
					 | 
				
			||||||
	[ "$RETVAL" = 2 ] && return 2
 | 
					 | 
				
			||||||
	# Wait for children to finish too if this is a daemon that forks
 | 
					 | 
				
			||||||
	# and if the daemon is only ever run from this initscript.
 | 
					 | 
				
			||||||
	# If the above conditions are not satisfied then add some other code
 | 
					 | 
				
			||||||
	# that waits for the process to drop all resources that could be
 | 
					 | 
				
			||||||
	# needed by services started subsequently.  A last resort is to
 | 
					 | 
				
			||||||
	# sleep for some time.
 | 
					 | 
				
			||||||
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
 | 
					 | 
				
			||||||
	[ "$?" = 2 ] && return 2
 | 
					 | 
				
			||||||
	# Many daemons don't delete their pidfiles when they exit.
 | 
					 | 
				
			||||||
	rm -f $PIDFILE
 | 
					 | 
				
			||||||
	return "$RETVAL"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Function that sends a SIGHUP to the daemon/service
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
do_reload() {
 | 
					 | 
				
			||||||
	#
 | 
					 | 
				
			||||||
	# If the daemon can reload its configuration without
 | 
					 | 
				
			||||||
	# restarting (for example, when it is sent a SIGHUP),
 | 
					 | 
				
			||||||
	# then implement that here.
 | 
					 | 
				
			||||||
	#
 | 
					 | 
				
			||||||
	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
case "$1" in
 | 
					 | 
				
			||||||
  start)
 | 
					 | 
				
			||||||
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
 | 
					 | 
				
			||||||
    do_start
 | 
					 | 
				
			||||||
    case "$?" in
 | 
					 | 
				
			||||||
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 | 
					 | 
				
			||||||
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 | 
					 | 
				
			||||||
	esac
 | 
					 | 
				
			||||||
  ;;
 | 
					 | 
				
			||||||
  stop)
 | 
					 | 
				
			||||||
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
 | 
					 | 
				
			||||||
	do_stop
 | 
					 | 
				
			||||||
	case "$?" in
 | 
					 | 
				
			||||||
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 | 
					 | 
				
			||||||
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 | 
					 | 
				
			||||||
	esac
 | 
					 | 
				
			||||||
	;;
 | 
					 | 
				
			||||||
  status)
 | 
					 | 
				
			||||||
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
 | 
					 | 
				
			||||||
       ;;
 | 
					 | 
				
			||||||
  #reload|force-reload)
 | 
					 | 
				
			||||||
	#
 | 
					 | 
				
			||||||
	# If do_reload() is not implemented then leave this commented out
 | 
					 | 
				
			||||||
	# and leave 'force-reload' as an alias for 'restart'.
 | 
					 | 
				
			||||||
	#
 | 
					 | 
				
			||||||
	#log_daemon_msg "Reloading $DESC" "$NAME"
 | 
					 | 
				
			||||||
	#do_reload
 | 
					 | 
				
			||||||
	#log_end_msg $?
 | 
					 | 
				
			||||||
	#;;
 | 
					 | 
				
			||||||
  restart|force-reload)
 | 
					 | 
				
			||||||
	#
 | 
					 | 
				
			||||||
	# If the "reload" option is implemented then remove the
 | 
					 | 
				
			||||||
	# 'force-reload' alias
 | 
					 | 
				
			||||||
	#
 | 
					 | 
				
			||||||
	log_daemon_msg "Restarting $DESC" "$NAME"
 | 
					 | 
				
			||||||
	do_stop
 | 
					 | 
				
			||||||
	case "$?" in
 | 
					 | 
				
			||||||
	  0|1)
 | 
					 | 
				
			||||||
		do_start
 | 
					 | 
				
			||||||
		case "$?" in
 | 
					 | 
				
			||||||
			0) log_end_msg 0 ;;
 | 
					 | 
				
			||||||
			1) log_end_msg 1 ;; # Old process is still running
 | 
					 | 
				
			||||||
			*) log_end_msg 1 ;; # Failed to start
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
		;;
 | 
					 | 
				
			||||||
	  *)
 | 
					 | 
				
			||||||
	  	# Failed to stop
 | 
					 | 
				
			||||||
		log_end_msg 1
 | 
					 | 
				
			||||||
		;;
 | 
					 | 
				
			||||||
	esac
 | 
					 | 
				
			||||||
	;;
 | 
					 | 
				
			||||||
  *)
 | 
					 | 
				
			||||||
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
 | 
					 | 
				
			||||||
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
 | 
					 | 
				
			||||||
	exit 3
 | 
					 | 
				
			||||||
	;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
/usr/bin/osmo-nitb
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
doc/examples/osmo-sgsn
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
/usr/bin/osmo-sgsn
 | 
					 | 
				
			||||||
@@ -1,29 +0,0 @@
 | 
				
			|||||||
Description: Upstream changes introduced in version 0.9.4-1
 | 
					 | 
				
			||||||
 This patch has been created by dpkg-source during the package build.
 | 
					 | 
				
			||||||
 Here's the last changelog entry, hopefully it gives details on why
 | 
					 | 
				
			||||||
 those changes were made:
 | 
					 | 
				
			||||||
 .
 | 
					 | 
				
			||||||
 openbsc (0.9.4-1) unstable; urgency=low
 | 
					 | 
				
			||||||
 .
 | 
					 | 
				
			||||||
   * Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>
 | 
					 | 
				
			||||||
 .
 | 
					 | 
				
			||||||
 The person named in the Author field signed this changelog entry.
 | 
					 | 
				
			||||||
Author: Harald Welte <laforge@gnumonks.org>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
The information above should follow the Patch Tagging Guidelines, please
 | 
					 | 
				
			||||||
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
 | 
					 | 
				
			||||||
are templates for supplementary fields that you might want to add:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Origin: <vendor|upstream|other>, <url of original patch>
 | 
					 | 
				
			||||||
Bug: <url in upstream bugtracker>
 | 
					 | 
				
			||||||
Bug-Debian: http://bugs.debian.org/<bugnumber>
 | 
					 | 
				
			||||||
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
 | 
					 | 
				
			||||||
Forwarded: <no|not-needed|url proving that it has been forwarded>
 | 
					 | 
				
			||||||
Reviewed-By: <name and email of someone who approved the patch>
 | 
					 | 
				
			||||||
Last-Update: <YYYY-MM-DD>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
--- /dev/null
 | 
					 | 
				
			||||||
+++ openbsc-0.9.4/.version
 | 
					 | 
				
			||||||
@@ -0,0 +1 @@
 | 
					 | 
				
			||||||
+0.9.4
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
debian-changes-0.9.4-1
 | 
					 | 
				
			||||||
@@ -1,31 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/make -f
 | 
					 | 
				
			||||||
# -*- makefile -*-
 | 
					 | 
				
			||||||
# Sample debian/rules that uses debhelper.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This file was originally written by Joey Hess and Craig Small.
 | 
					 | 
				
			||||||
# As a special exception, when this file is copied by dh-make into a
 | 
					 | 
				
			||||||
# dh-make output file, you may use that output file without restriction.
 | 
					 | 
				
			||||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Modified to make a template file for a multi-binary package with separated
 | 
					 | 
				
			||||||
# build-arch and build-indep targets  by Bill Allombert 2001
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Uncomment this to turn on verbose mode.
 | 
					 | 
				
			||||||
#export DH_VERBOSE=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This has to be exported to make some magic below work.
 | 
					 | 
				
			||||||
export DH_OPTIONS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# this requires debhelper 7.0.50 or above, which lenny doesn't have yet!
 | 
					 | 
				
			||||||
#override_dh_auto_configure:
 | 
					 | 
				
			||||||
#	dh_auto_configure -- --enable-nat --enable-osmo-bsc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build: build-stamp
 | 
					 | 
				
			||||||
build-stamp:
 | 
					 | 
				
			||||||
	dh build --before configure
 | 
					 | 
				
			||||||
	dh_auto_configure -- --enable-nat --enable-osmo-bsc
 | 
					 | 
				
			||||||
	dh build --after configure
 | 
					 | 
				
			||||||
	touch build-stamp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%:
 | 
					 | 
				
			||||||
	dh $@ 
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
3.0 (quilt)
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
SUBDIRS = examples
 | 
					 | 
				
			||||||
@@ -31,65 +31,44 @@ GSM 04.08 3.4.13: RR connection release procedure
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
== Implementation in OpenBSC ==
 | 
					== Implementation in OpenBSC ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There are two possible reasons a gsm_subscriber_connection
 | 
					chan_alloc.c:lchan_auto_release()
 | 
				
			||||||
will be released. One is a network failure, the other is
 | 
						* checks if use count still > 0 (abort)
 | 
				
			||||||
the completion of an operation/transaction.
 | 
						* calls gsm48_send_rr_release()
 | 
				
			||||||
 | 
							* which calls rsl_deact_sacch()
 | 
				
			||||||
=== Failure ===
 | 
						* calls rsl_release_request()
 | 
				
			||||||
The BSC API will call the gsm_04_08.c:gsm0408_clear_request callback
 | 
							* which sends RLL Link Release request
 | 
				
			||||||
and the MSC part will release all transactions, operations and such
 | 
						
 | 
				
			||||||
and the channels will be released as error case.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
=== Success ===
 | 
					 | 
				
			||||||
Every time an 'operation' or 'transaction' is finished msc_release_connection
 | 
					 | 
				
			||||||
will be called and it will determine if the gsm_subscriber_connection can
 | 
					 | 
				
			||||||
be released.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In case it can be released bsc_api.c:gsm0808_clear will be called
 | 
					 | 
				
			||||||
which will release all lchan's associated with the connection. For the
 | 
					 | 
				
			||||||
primary channel a SACH Deactivate will be send with the release
 | 
					 | 
				
			||||||
reason NORMAL RELEASE.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bsc_api.c:gsm0808_clear
 | 
					 | 
				
			||||||
	* Release a channel used for handover
 | 
					 | 
				
			||||||
	* Release the primary lchan with normal release, SACH deactivate
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chan_alloc.c:lchan_release(chan, sach_deactivate, reason)
 | 
					 | 
				
			||||||
	* Start release procedure. It is working in steps with callbacks
 | 
					 | 
				
			||||||
          coming from the abis_rsl.c code.
 | 
					 | 
				
			||||||
        * Release all SAPI's > 0, wait for them to be released
 | 
					 | 
				
			||||||
	* Send SACH Deactivate on SAPI=0
 | 
					 | 
				
			||||||
	* Finally Release the channel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
RX of RELease INDication:
 | 
					RX of RELease INDication:
 | 
				
			||||||
        * Calls internal rsl_handle_release which might release the RF.
 | 
						* call rsl_rf_chan_release() (send RF_CHAN_REL)
 | 
				
			||||||
        * Informs chan_alloc.c about the release with
 | 
					 | 
				
			||||||
          rsl_lchan_rll_release.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
RX of RELease CONFimem:
 | 
					RX of RELease CONFimem:
 | 
				
			||||||
        * Calls internal rsl_handle_release which might release the RF.
 | 
						* call rsl_rf_chan_release() (send RF_CHAN_REL)
 | 
				
			||||||
        * Informs chan_alloc.c about the release with
 | 
					 | 
				
			||||||
          rsl_lchan_rll_release.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
* RX of RF_CHAN_REL_ACK
 | 
					* RX of RF_CHAN_REL_ACK
 | 
				
			||||||
	* call lchan_free()
 | 
						* call lchan_free()
 | 
				
			||||||
 | 
							* subscr_put()
 | 
				
			||||||
 | 
							* delete release_timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
=== Integration with SMS ===
 | 
					=== Integration with SMS ===
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* RX of CP_ERROR or unimplemented MT
 | 
					* RX of CP_ERROR or unimplemented MT
 | 
				
			||||||
	* trigger trans_free() which will msc_release_connection()
 | 
						* trigger trans_free() which will lchan_auto_release()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* CP TC1* expired while waiting for CP-ACK
 | 
					* CP TC1* expired while waiting for CP-ACK
 | 
				
			||||||
	* trigger trans_free() which will msc_release_connection()
 | 
						* trigger trans_free() which will lchan_auto_release()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* RX of RP_ERROR
 | 
					* RX of RP_ERROR
 | 
				
			||||||
	* trigger trans_free() which will msc_release_connection()
 | 
						* trigger trans_free() which will lchan_auto_release()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
* TX of CP-ACK in MT DELIVER
 | 
					* TX of CP-ACK in MT DELIVER
 | 
				
			||||||
	* trigger trans_free() which will msc_release_connection()
 | 
						* trigger trans_free() which will lchan_auto_release()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* RX of CP-ACK in MO SUBMIT
 | 
					* RX of CP-ACK in MO SUBMIT
 | 
				
			||||||
	* trigger trans_free() which will msc_release_connection()
 | 
						* 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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,21 +0,0 @@
 | 
				
			|||||||
The protocol for the control interface is wrapped inside the ip.access header
 | 
					 | 
				
			||||||
with the IPAC_PROTO_OSMO protocol ID (0xee). Inside the ip.access header is
 | 
					 | 
				
			||||||
a struct ipaccess_head_ext with protocol ID 0x00 which indicates the control
 | 
					 | 
				
			||||||
interface.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
After that the actual protocol is text based:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* Getting the value of a variable
 | 
					 | 
				
			||||||
-> GET <id> <var>
 | 
					 | 
				
			||||||
<- GET_REPLY <id> <var> <val>
 | 
					 | 
				
			||||||
or ERROR <id> <reason>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* Setting the value of a variable
 | 
					 | 
				
			||||||
-> SET <id> <var> <val>
 | 
					 | 
				
			||||||
<- SET_REPLY <id> <var> <val>
 | 
					 | 
				
			||||||
or ERROR <id> <reason>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* A value changes which triggers a trap
 | 
					 | 
				
			||||||
<- TRAP <var> <val>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<id> needs to be unique within a connection. '0' is not allowed
 | 
					 | 
				
			||||||
@@ -52,10 +52,10 @@ int abis_link_event(int event, void *data);
 | 
				
			|||||||
	signal some event (such as layer 1 connect/disconnect) from the
 | 
						signal some event (such as layer 1 connect/disconnect) from the
 | 
				
			||||||
	input core to the stack.
 | 
						input core to the stack.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int subch_demux_in(mx, const uint8_t *data, int len);
 | 
					int subch_demux_in(mx, const u_int8_t *data, int len);
 | 
				
			||||||
	receive 'len' bytes from a given E1 timeslot (TRAU frames)
 | 
						receive 'len' bytes from a given E1 timeslot (TRAU frames)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int subchan_mux_out(mx, uint8_t *data, int len);
 | 
					int subchan_mux_out(mx, u_int8_t *data, int len);
 | 
				
			||||||
	obtain 'len' bytes of output data to be sent on E1 timeslot
 | 
						obtain 'len' bytes of output data to be sent on E1 timeslot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Intrface by Input Core for Input Plugins
 | 
					Intrface by Input Core for Input Plugins
 | 
				
			||||||
@@ -112,8 +112,8 @@ struct e1inp_sign_link {
 | 
				
			|||||||
	struct llist_head tx_list;
 | 
						struct llist_head tx_list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* SAPI and TEI on the E1 TS */
 | 
						/* SAPI and TEI on the E1 TS */
 | 
				
			||||||
	uint8_t sapi;
 | 
						u_int8_t sapi;
 | 
				
			||||||
	uint8_t tei;
 | 
						u_int8_t tei;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum e1inp_ts_type {
 | 
					enum e1inp_ts_type {
 | 
				
			||||||
@@ -140,7 +140,7 @@ struct e1inp_ts {
 | 
				
			|||||||
	union {
 | 
						union {
 | 
				
			||||||
		struct {
 | 
							struct {
 | 
				
			||||||
			/* mISDN driver has one fd for each ts */
 | 
								/* mISDN driver has one fd for each ts */
 | 
				
			||||||
			struct osmo_fd;
 | 
								struct bsc_fd;
 | 
				
			||||||
		} misdn;
 | 
							} misdn;
 | 
				
			||||||
	} driver;
 | 
						} driver;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -160,7 +160,7 @@ int e1inp_update_ts(struct e1inp_ts *ts);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Receive a packet from the E1 driver */
 | 
					/* Receive a packet from the E1 driver */
 | 
				
			||||||
int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
 | 
					int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
 | 
				
			||||||
		uint8_t tei, uint8_t sapi);
 | 
							u_int8_t tei, u_int8_t sapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Send a packet, callback function in the driver */
 | 
					/* Send a packet, callback function in the driver */
 | 
				
			||||||
int e1driver_tx_ts(struct e1inp_ts *ts, struct msgb *msg)
 | 
					int e1driver_tx_ts(struct e1inp_ts *ts, struct msgb *msg)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,23 +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,133 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OsmoBSC (0.9.14+gitr1+3d331c0062bb0c9694dbd4d1eab7adc58138c3ae) configuration saved from vty
 | 
					 | 
				
			||||||
!!
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
log stderr
 | 
					 | 
				
			||||||
  logging color 1
 | 
					 | 
				
			||||||
  logging timestamp 0
 | 
					 | 
				
			||||||
  logging level all everything
 | 
					 | 
				
			||||||
  logging level rll notice
 | 
					 | 
				
			||||||
  logging level cc notice
 | 
					 | 
				
			||||||
  logging level mm notice
 | 
					 | 
				
			||||||
  logging level rr notice
 | 
					 | 
				
			||||||
  logging level rsl notice
 | 
					 | 
				
			||||||
  logging level nm info
 | 
					 | 
				
			||||||
  logging level mncc notice
 | 
					 | 
				
			||||||
  logging level sms notice
 | 
					 | 
				
			||||||
  logging level pag notice
 | 
					 | 
				
			||||||
  logging level meas notice
 | 
					 | 
				
			||||||
  logging level mi notice
 | 
					 | 
				
			||||||
  logging level mib notice
 | 
					 | 
				
			||||||
  logging level mux notice
 | 
					 | 
				
			||||||
  logging level inp notice
 | 
					 | 
				
			||||||
  logging level sccp notice
 | 
					 | 
				
			||||||
  logging level msc notice
 | 
					 | 
				
			||||||
  logging level mgcp notice
 | 
					 | 
				
			||||||
  logging level ho notice
 | 
					 | 
				
			||||||
  logging level db notice
 | 
					 | 
				
			||||||
  logging level ref notice
 | 
					 | 
				
			||||||
  logging level gprs debug
 | 
					 | 
				
			||||||
  logging level ns info
 | 
					 | 
				
			||||||
  logging level bssgp debug
 | 
					 | 
				
			||||||
  logging level llc debug
 | 
					 | 
				
			||||||
  logging level sndcp debug
 | 
					 | 
				
			||||||
  logging level nat notice
 | 
					 | 
				
			||||||
  logging level lglobal notice
 | 
					 | 
				
			||||||
  logging level llapdm notice
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver ipa
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 1
 | 
					 | 
				
			||||||
 mobile network code 1
 | 
					 | 
				
			||||||
 short name OsmoBSC
 | 
					 | 
				
			||||||
 long name OsmoBSC
 | 
					 | 
				
			||||||
 auth policy closed
 | 
					 | 
				
			||||||
 location updating reject cause 13
 | 
					 | 
				
			||||||
 encryption a5 0
 | 
					 | 
				
			||||||
 neci 1
 | 
					 | 
				
			||||||
 paging any use tch 0
 | 
					 | 
				
			||||||
 rrlp mode none
 | 
					 | 
				
			||||||
 mm info 1
 | 
					 | 
				
			||||||
 handover 0
 | 
					 | 
				
			||||||
 handover window rxlev averaging 10
 | 
					 | 
				
			||||||
 handover window rxqual averaging 1
 | 
					 | 
				
			||||||
 handover window rxlev neighbor averaging 10
 | 
					 | 
				
			||||||
 handover power budget interval 6
 | 
					 | 
				
			||||||
 handover power budget hysteresis 3
 | 
					 | 
				
			||||||
 handover maximum distance 9999
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3103 0
 | 
					 | 
				
			||||||
 timer t3105 0
 | 
					 | 
				
			||||||
 timer t3107 0
 | 
					 | 
				
			||||||
 timer t3109 0
 | 
					 | 
				
			||||||
 timer t3111 0
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 timer t3115 0
 | 
					 | 
				
			||||||
 timer t3117 0
 | 
					 | 
				
			||||||
 timer t3119 0
 | 
					 | 
				
			||||||
 timer t3122 0
 | 
					 | 
				
			||||||
 timer t3141 0
 | 
					 | 
				
			||||||
 dtx-used 0
 | 
					 | 
				
			||||||
 subscriber-keep-in-ram 0
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type nanobts
 | 
					 | 
				
			||||||
  band DCS1800
 | 
					 | 
				
			||||||
  cell_identity 0
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  training_sequence_code 7
 | 
					 | 
				
			||||||
  base_station_id_code 63
 | 
					 | 
				
			||||||
  ms max power 15
 | 
					 | 
				
			||||||
  cell reselection hysteresis 4
 | 
					 | 
				
			||||||
  rxlev access min 0
 | 
					 | 
				
			||||||
  channel allocator ascending
 | 
					 | 
				
			||||||
  rach tx integer 9
 | 
					 | 
				
			||||||
  rach max transmission 7
 | 
					 | 
				
			||||||
  ip.access unit_id 0 0
 | 
					 | 
				
			||||||
  oml ip.access stream_id 255 line 0
 | 
					 | 
				
			||||||
  neighbor-list mode manual-si5
 | 
					 | 
				
			||||||
  neighbor-list add arfcn 100
 | 
					 | 
				
			||||||
  neighbor-list add arfcn 200
 | 
					 | 
				
			||||||
  si5 neighbor-list add arfcn 10
 | 
					 | 
				
			||||||
  si5 neighbor-list add arfcn 20
 | 
					 | 
				
			||||||
  gprs mode none
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 871
 | 
					 | 
				
			||||||
   nominal power 23
 | 
					 | 
				
			||||||
   max_power_red 20
 | 
					 | 
				
			||||||
   rsl e1 tei 0
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH+SDCCH4
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
msc
 | 
					 | 
				
			||||||
 ip.access rtp-base 4000
 | 
					 | 
				
			||||||
 timeout-ping 20
 | 
					 | 
				
			||||||
 timeout-pong 5
 | 
					 | 
				
			||||||
 mid-call-timeout 0
 | 
					 | 
				
			||||||
 dest 192.168.100.11 6666 0
 | 
					 | 
				
			||||||
@@ -1,164 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OpenBSC (0.9.0.845-57c4) configuration saved from vty
 | 
					 | 
				
			||||||
!!
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver misdn
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 1
 | 
					 | 
				
			||||||
 mobile network code 1
 | 
					 | 
				
			||||||
 short name OpenBSC
 | 
					 | 
				
			||||||
 long name OpenBSC
 | 
					 | 
				
			||||||
 auth policy closed
 | 
					 | 
				
			||||||
 location updating reject cause 13
 | 
					 | 
				
			||||||
 encryption a5 0
 | 
					 | 
				
			||||||
 neci 1
 | 
					 | 
				
			||||||
 rrlp mode none
 | 
					 | 
				
			||||||
 mm info 0
 | 
					 | 
				
			||||||
 handover 0
 | 
					 | 
				
			||||||
 handover window rxlev averaging 10
 | 
					 | 
				
			||||||
 handover window rxqual averaging 1
 | 
					 | 
				
			||||||
 handover window rxlev neighbor averaging 10
 | 
					 | 
				
			||||||
 handover power budget interval 6
 | 
					 | 
				
			||||||
 handover power budget hysteresis 3
 | 
					 | 
				
			||||||
 handover maximum distance 9999
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3103 0
 | 
					 | 
				
			||||||
 timer t3105 0
 | 
					 | 
				
			||||||
 timer t3107 0
 | 
					 | 
				
			||||||
 timer t3109 0
 | 
					 | 
				
			||||||
 timer t3111 0
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 timer t3115 0
 | 
					 | 
				
			||||||
 timer t3117 0
 | 
					 | 
				
			||||||
 timer t3119 0
 | 
					 | 
				
			||||||
 timer t3141 0
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type bs11
 | 
					 | 
				
			||||||
  band GSM900
 | 
					 | 
				
			||||||
  cell_identity 0
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  training_sequence_code 7
 | 
					 | 
				
			||||||
  base_station_id_code 63
 | 
					 | 
				
			||||||
  ms max power 15
 | 
					 | 
				
			||||||
  cell reselection hysteresis 4
 | 
					 | 
				
			||||||
  rxlev access min 0
 | 
					 | 
				
			||||||
  channel allocator descending
 | 
					 | 
				
			||||||
  rach tx integer 9
 | 
					 | 
				
			||||||
  rach max transmission 7
 | 
					 | 
				
			||||||
  oml e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
  oml e1 tei 25
 | 
					 | 
				
			||||||
  gprs mode none
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 121
 | 
					 | 
				
			||||||
   nominal power 24
 | 
					 | 
				
			||||||
   max_power_red 12
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 1
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 2 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 2 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 2 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 3
 | 
					 | 
				
			||||||
  trx 1
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 119
 | 
					 | 
				
			||||||
   nominal power 24
 | 
					 | 
				
			||||||
   max_power_red 12
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 2
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config SDCCH8
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 4 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 4 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 4 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 1
 | 
					 | 
				
			||||||
     hopping sequence-number 0
 | 
					 | 
				
			||||||
     hopping maio 0
 | 
					 | 
				
			||||||
     hopping arfcn add 117
 | 
					 | 
				
			||||||
     hopping arfcn add 119
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 3
 | 
					 | 
				
			||||||
@@ -1,90 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OpenBSC (0.9.11.261-32c0) configuration saved from vty
 | 
					 | 
				
			||||||
!!
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver hsl
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 262
 | 
					 | 
				
			||||||
 mobile network code 42
 | 
					 | 
				
			||||||
 short name OpenBSC
 | 
					 | 
				
			||||||
 long name OpenBSC
 | 
					 | 
				
			||||||
 auth policy closed
 | 
					 | 
				
			||||||
 location updating reject cause 13
 | 
					 | 
				
			||||||
 encryption a5 0
 | 
					 | 
				
			||||||
 neci 1
 | 
					 | 
				
			||||||
 paging any use tch 0
 | 
					 | 
				
			||||||
 rrlp mode none
 | 
					 | 
				
			||||||
 mm info 0
 | 
					 | 
				
			||||||
 handover 0
 | 
					 | 
				
			||||||
 handover window rxlev averaging 10
 | 
					 | 
				
			||||||
 handover window rxqual averaging 1
 | 
					 | 
				
			||||||
 handover window rxlev neighbor averaging 10
 | 
					 | 
				
			||||||
 handover power budget interval 6
 | 
					 | 
				
			||||||
 handover power budget hysteresis 3
 | 
					 | 
				
			||||||
 handover maximum distance 9999
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3103 0
 | 
					 | 
				
			||||||
 timer t3105 0
 | 
					 | 
				
			||||||
 timer t3107 0
 | 
					 | 
				
			||||||
 timer t3109 0
 | 
					 | 
				
			||||||
 timer t3111 0
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 timer t3115 0
 | 
					 | 
				
			||||||
 timer t3117 0
 | 
					 | 
				
			||||||
 timer t3119 0
 | 
					 | 
				
			||||||
 timer t3122 0
 | 
					 | 
				
			||||||
 timer t3141 0
 | 
					 | 
				
			||||||
 dtx-used 1
 | 
					 | 
				
			||||||
 subscriber-keep-in-ram 0
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type hsl_femto
 | 
					 | 
				
			||||||
  band DCS1800
 | 
					 | 
				
			||||||
  cell_identity 0
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  training_sequence_code 0
 | 
					 | 
				
			||||||
  base_station_id_code 0
 | 
					 | 
				
			||||||
  ms max power 15
 | 
					 | 
				
			||||||
  cell reselection hysteresis 4
 | 
					 | 
				
			||||||
  rxlev access min 0
 | 
					 | 
				
			||||||
  channel allocator ascending
 | 
					 | 
				
			||||||
  rach tx integer 9
 | 
					 | 
				
			||||||
  rach max transmission 1
 | 
					 | 
				
			||||||
  hsl serial-number 8303701
 | 
					 | 
				
			||||||
  neighbor-list mode automatic
 | 
					 | 
				
			||||||
  oml hsl line 0
 | 
					 | 
				
			||||||
  gprs mode none
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 871
 | 
					 | 
				
			||||||
   nominal power 23
 | 
					 | 
				
			||||||
   max_power_red 20
 | 
					 | 
				
			||||||
   rsl e1 tei 0
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH+SDCCH4
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
@@ -1,99 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OpenBSC configuration saved from vty
 | 
					 | 
				
			||||||
!   !
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver ipa
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 1
 | 
					 | 
				
			||||||
 mobile network code 1
 | 
					 | 
				
			||||||
 short name OpenBSC
 | 
					 | 
				
			||||||
 long name OpenBSC
 | 
					 | 
				
			||||||
 auth policy closed
 | 
					 | 
				
			||||||
 location updating reject cause 13
 | 
					 | 
				
			||||||
 encryption a5 0
 | 
					 | 
				
			||||||
 neci 1
 | 
					 | 
				
			||||||
 rrlp mode none
 | 
					 | 
				
			||||||
 mm info 0
 | 
					 | 
				
			||||||
 handover 0
 | 
					 | 
				
			||||||
 handover window rxlev averaging 10
 | 
					 | 
				
			||||||
 handover window rxqual averaging 1
 | 
					 | 
				
			||||||
 handover window rxlev neighbor averaging 10
 | 
					 | 
				
			||||||
 handover power budget interval 6
 | 
					 | 
				
			||||||
 handover power budget hysteresis 3
 | 
					 | 
				
			||||||
 handover maximum distance 9999
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3103 0
 | 
					 | 
				
			||||||
 timer t3105 0
 | 
					 | 
				
			||||||
 timer t3107 0
 | 
					 | 
				
			||||||
 timer t3109 0
 | 
					 | 
				
			||||||
 timer t3111 0
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 timer t3115 0
 | 
					 | 
				
			||||||
 timer t3117 0
 | 
					 | 
				
			||||||
 timer t3119 0
 | 
					 | 
				
			||||||
 timer t3141 0
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type nanobts
 | 
					 | 
				
			||||||
  band DCS1800
 | 
					 | 
				
			||||||
  cell_identity 0
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  training_sequence_code 7
 | 
					 | 
				
			||||||
  base_station_id_code 63
 | 
					 | 
				
			||||||
  ms max power 15
 | 
					 | 
				
			||||||
  cell reselection hysteresis 4
 | 
					 | 
				
			||||||
  rxlev access min 0
 | 
					 | 
				
			||||||
  channel allocator ascending
 | 
					 | 
				
			||||||
  rach tx integer 9
 | 
					 | 
				
			||||||
  rach max transmission 7
 | 
					 | 
				
			||||||
  ip.access unit_id 1800 0
 | 
					 | 
				
			||||||
  oml ip.access stream_id 255 line 0
 | 
					 | 
				
			||||||
  gprs mode none
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 871
 | 
					 | 
				
			||||||
   nominal power 23
 | 
					 | 
				
			||||||
   max_power_red 0
 | 
					 | 
				
			||||||
   rsl e1 tei 0
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH+SDCCH4
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config SDCCH8
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
  trx 1
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 873
 | 
					 | 
				
			||||||
   nominal power 23
 | 
					 | 
				
			||||||
   max_power_red 0
 | 
					 | 
				
			||||||
   rsl e1 tei 0
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config SDCCH8
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
@@ -1,77 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OpenBSC configuration saved from vty
 | 
					 | 
				
			||||||
!   !
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver ipa
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 1
 | 
					 | 
				
			||||||
 mobile network code 1
 | 
					 | 
				
			||||||
 short name OpenBSC
 | 
					 | 
				
			||||||
 long name OpenBSC
 | 
					 | 
				
			||||||
 auth policy closed
 | 
					 | 
				
			||||||
 location updating reject cause 13
 | 
					 | 
				
			||||||
 encryption a5 0
 | 
					 | 
				
			||||||
 neci 1
 | 
					 | 
				
			||||||
 rrlp mode none
 | 
					 | 
				
			||||||
 mm info 1
 | 
					 | 
				
			||||||
 handover 0
 | 
					 | 
				
			||||||
 handover window rxlev averaging 10
 | 
					 | 
				
			||||||
 handover window rxqual averaging 1
 | 
					 | 
				
			||||||
 handover window rxlev neighbor averaging 10
 | 
					 | 
				
			||||||
 handover power budget interval 6
 | 
					 | 
				
			||||||
 handover power budget hysteresis 3
 | 
					 | 
				
			||||||
 handover maximum distance 9999
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3103 0
 | 
					 | 
				
			||||||
 timer t3105 0
 | 
					 | 
				
			||||||
 timer t3107 0
 | 
					 | 
				
			||||||
 timer t3109 0
 | 
					 | 
				
			||||||
 timer t3111 0
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 timer t3115 0
 | 
					 | 
				
			||||||
 timer t3117 0
 | 
					 | 
				
			||||||
 timer t3119 0
 | 
					 | 
				
			||||||
 timer t3141 0
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type nanobts
 | 
					 | 
				
			||||||
  band DCS1800
 | 
					 | 
				
			||||||
  cell_identity 0
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  training_sequence_code 7
 | 
					 | 
				
			||||||
  base_station_id_code 63
 | 
					 | 
				
			||||||
  ms max power 15
 | 
					 | 
				
			||||||
  cell reselection hysteresis 4
 | 
					 | 
				
			||||||
  rxlev access min 0
 | 
					 | 
				
			||||||
  channel allocator ascending
 | 
					 | 
				
			||||||
  rach tx integer 9
 | 
					 | 
				
			||||||
  rach max transmission 7
 | 
					 | 
				
			||||||
  ip.access unit_id 1801 0
 | 
					 | 
				
			||||||
  oml ip.access stream_id 255 line 0
 | 
					 | 
				
			||||||
  gprs mode none
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 514
 | 
					 | 
				
			||||||
   nominal power 23
 | 
					 | 
				
			||||||
   max_power_red 20
 | 
					 | 
				
			||||||
   rsl e1 tei 0
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH+SDCCH4
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config SDCCH8
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
@@ -1,118 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OpenBSC configuration saved from vty
 | 
					 | 
				
			||||||
!   !
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver misdn
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 1
 | 
					 | 
				
			||||||
 mobile network code 1
 | 
					 | 
				
			||||||
 short name OpenBSC
 | 
					 | 
				
			||||||
 long name OpenBSC
 | 
					 | 
				
			||||||
 auth policy accept-all
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type nokia_site
 | 
					 | 
				
			||||||
  band GSM1800
 | 
					 | 
				
			||||||
  cell_identity 1
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  base_station_id_code 63
 | 
					 | 
				
			||||||
  training_sequence_code 7
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  oml e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
  oml e1 tei 1
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   arfcn 866
 | 
					 | 
				
			||||||
   max_power_red 24
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 2 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 1
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH+SDCCH4
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot full
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config SDCCH8
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 7 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 7 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 7 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 7 sub-slot 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  trx 1
 | 
					 | 
				
			||||||
   arfcn 870
 | 
					 | 
				
			||||||
   max_power_red 24
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 3 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 2
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  trx 2
 | 
					 | 
				
			||||||
   arfcn 874
 | 
					 | 
				
			||||||
   max_power_red 24
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 4 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 3
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 10 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 10 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 10 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 10 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 3
 | 
					 | 
				
			||||||
@@ -1,221 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! OpenBSC (0.9.11.308-62d46) configuration saved from vty
 | 
					 | 
				
			||||||
!!
 | 
					 | 
				
			||||||
password foo
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
network
 | 
					 | 
				
			||||||
 network country code 262
 | 
					 | 
				
			||||||
 mobile network code 42
 | 
					 | 
				
			||||||
 short name OpenBSC
 | 
					 | 
				
			||||||
 long name OpenBSC
 | 
					 | 
				
			||||||
 auth policy closed
 | 
					 | 
				
			||||||
 location updating reject cause 13
 | 
					 | 
				
			||||||
 encryption a5 0
 | 
					 | 
				
			||||||
 neci 0
 | 
					 | 
				
			||||||
 paging any use tch 0
 | 
					 | 
				
			||||||
 rrlp mode none
 | 
					 | 
				
			||||||
 mm info 0
 | 
					 | 
				
			||||||
 handover 0
 | 
					 | 
				
			||||||
 handover window rxlev averaging 10
 | 
					 | 
				
			||||||
 handover window rxqual averaging 1
 | 
					 | 
				
			||||||
 handover window rxlev neighbor averaging 10
 | 
					 | 
				
			||||||
 handover power budget interval 6
 | 
					 | 
				
			||||||
 handover power budget hysteresis 3
 | 
					 | 
				
			||||||
 handover maximum distance 9999
 | 
					 | 
				
			||||||
 timer t3101 10
 | 
					 | 
				
			||||||
 timer t3103 0
 | 
					 | 
				
			||||||
 timer t3105 0
 | 
					 | 
				
			||||||
 timer t3107 0
 | 
					 | 
				
			||||||
 timer t3109 0
 | 
					 | 
				
			||||||
 timer t3111 0
 | 
					 | 
				
			||||||
 timer t3113 60
 | 
					 | 
				
			||||||
 timer t3115 0
 | 
					 | 
				
			||||||
 timer t3117 0
 | 
					 | 
				
			||||||
 timer t3119 0
 | 
					 | 
				
			||||||
 timer t3122 0
 | 
					 | 
				
			||||||
 timer t3141 0
 | 
					 | 
				
			||||||
 dtx-used 0
 | 
					 | 
				
			||||||
 subscriber-keep-in-ram 0
 | 
					 | 
				
			||||||
 bts 0
 | 
					 | 
				
			||||||
  type rbs2000
 | 
					 | 
				
			||||||
  band GSM900
 | 
					 | 
				
			||||||
  cell_identity 0
 | 
					 | 
				
			||||||
  location_area_code 1
 | 
					 | 
				
			||||||
  training_sequence_code 7
 | 
					 | 
				
			||||||
  base_station_id_code 63
 | 
					 | 
				
			||||||
  ms max power 15
 | 
					 | 
				
			||||||
  cell reselection hysteresis 4
 | 
					 | 
				
			||||||
  rxlev access min 0
 | 
					 | 
				
			||||||
  channel allocator descending
 | 
					 | 
				
			||||||
  rach tx integer 9
 | 
					 | 
				
			||||||
  rach max transmission 7
 | 
					 | 
				
			||||||
  oml e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
  oml e1 tei 62
 | 
					 | 
				
			||||||
  neighbor-list mode automatic
 | 
					 | 
				
			||||||
  gprs mode none
 | 
					 | 
				
			||||||
  is-connection-list add 4 512 12
 | 
					 | 
				
			||||||
  is-connection-list add 16 524 12
 | 
					 | 
				
			||||||
  is-connection-list add 28 536 12
 | 
					 | 
				
			||||||
  is-connection-list add 40 548 12
 | 
					 | 
				
			||||||
  trx 0
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 55
 | 
					 | 
				
			||||||
   nominal power 24
 | 
					 | 
				
			||||||
   max_power_red 12
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 0
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config CCCH+SDCCH4
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 1 sub-slot full
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 2 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 2 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 2 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 3 sub-slot 3
 | 
					 | 
				
			||||||
  trx 1
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 57
 | 
					 | 
				
			||||||
   nominal power 24
 | 
					 | 
				
			||||||
   max_power_red 12
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 4 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 1
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 5 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 6 sub-slot 3
 | 
					 | 
				
			||||||
  trx 2
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 59
 | 
					 | 
				
			||||||
   nominal power 24
 | 
					 | 
				
			||||||
   max_power_red 12
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 7 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 2
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 8 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 9 sub-slot 3
 | 
					 | 
				
			||||||
  trx 3
 | 
					 | 
				
			||||||
   rf_locked 0
 | 
					 | 
				
			||||||
   arfcn 61
 | 
					 | 
				
			||||||
   nominal power 24
 | 
					 | 
				
			||||||
   max_power_red 12
 | 
					 | 
				
			||||||
   rsl e1 line 0 timeslot 10 sub-slot full
 | 
					 | 
				
			||||||
   rsl e1 tei 3
 | 
					 | 
				
			||||||
    timeslot 0
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 1
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 2
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 3
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 11 sub-slot 3
 | 
					 | 
				
			||||||
    timeslot 4
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 12 sub-slot 0
 | 
					 | 
				
			||||||
    timeslot 5
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 12 sub-slot 1
 | 
					 | 
				
			||||||
    timeslot 6
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 12 sub-slot 2
 | 
					 | 
				
			||||||
    timeslot 7
 | 
					 | 
				
			||||||
     phys_chan_config TCH/F
 | 
					 | 
				
			||||||
     hopping enabled 0
 | 
					 | 
				
			||||||
     e1 line 0 timeslot 12 sub-slot 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
e1_input
 | 
					 | 
				
			||||||
 e1_line 0 driver dahdi
 | 
					 | 
				
			||||||
@@ -1,26 +0,0 @@
 | 
				
			|||||||
!
 | 
					 | 
				
			||||||
! Osmocom SGSN configuration
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
line vty
 | 
					 | 
				
			||||||
 no login
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
sgsn
 | 
					 | 
				
			||||||
 gtp local-ip 10.23.23.23
 | 
					 | 
				
			||||||
 ggsn 0 remote-ip 192.168.0.101
 | 
					 | 
				
			||||||
 ggsn 0 gtp-version 1
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
ns
 | 
					 | 
				
			||||||
 timer tns-block 3
 | 
					 | 
				
			||||||
 timer tns-block-retries 3
 | 
					 | 
				
			||||||
 timer tns-reset 3
 | 
					 | 
				
			||||||
 timer tns-reset-retries 3
 | 
					 | 
				
			||||||
 timer tns-test 30
 | 
					 | 
				
			||||||
 timer tns-alive 3
 | 
					 | 
				
			||||||
 timer tns-alive-retries 10
 | 
					 | 
				
			||||||
 encapsulation udp local-ip 192.168.0.101
 | 
					 | 
				
			||||||
 encapsulation udp local-port 23000
 | 
					 | 
				
			||||||
 encapsulation framerelay-gre enabled 0
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
bssgp
 | 
					 | 
				
			||||||
!
 | 
					 | 
				
			||||||
@@ -12,7 +12,7 @@ specific parameters from channel assignment:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
hopping sequence generation (6.2.3):
 | 
					hopping sequence generation (6.2.3):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t rntable[114] = {
 | 
					u_int8_t rntable[114] = {
 | 
				
			||||||
	 48,  98,  63,   1,  36,  95,  78, 102,  94,  73,
 | 
						 48,  98,  63,   1,  36,  95,  78, 102,  94,  73,
 | 
				
			||||||
	  0,  64,  25,  81,  76,  59, 124,  23, 104, 100,
 | 
						  0,  64,  25,  81,  76,  59, 124,  23, 104, 100,
 | 
				
			||||||
	101,  47, 118,  85,  18,  56,  96,  86,  54,   2,
 | 
						101,  47, 118,  85,  18,  56,  96,  86,  54,   2,
 | 
				
			||||||
@@ -29,15 +29,15 @@ uint8_t rntable[114] = {
 | 
				
			|||||||
/* mai=0 represents lowest ARFCN in the MA */
 | 
					/* mai=0 represents lowest ARFCN in the MA */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t hopping_mai(uint8_t hsn, uint32_t fn, uint8_t maio,
 | 
					u_int8_t hopping_mai(u_int8_t hsn, u_int32_t fn, u_int8_t maio,
 | 
				
			||||||
		     uint8_t t1, uint8_t t2, uint8_t t3_)
 | 
							     u_int8_t t1, u_int8_t t2, u_int8_t t3_)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t mai;
 | 
						u_int8_t mai;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (hsn == 0) /* cyclic hopping */
 | 
						if (hsn == 0) /* cyclic hopping */
 | 
				
			||||||
		mai = (fn + maio) % n;
 | 
							mai = (fn + maio) % n;
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
		uint32_t m, m_, t_, s;
 | 
							u_int32_t m, m_, t_, s;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m = t2 + rntable[(hsn xor (t1 % 64)) + t3];
 | 
							m = t2 + rntable[(hsn xor (t1 % 64)) + t3];
 | 
				
			||||||
		m_ = m % (2^NBIN);
 | 
							m_ = m % (2^NBIN);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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:
 | 
					 | 
				
			||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
SUBDIRS = openbsc
 | 
					SUBDIRS = openbsc vty sccp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_HEADERS = mISDNif.h compat_af_isdn.h
 | 
					noinst_HEADERS = mISDNif.h compat_af_isdn.h
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,8 @@
 | 
				
			|||||||
noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \
 | 
					noinst_HEADERS = abis_nm.h abis_rsl.h debug.h db.h gsm_04_08.h gsm_data.h \
 | 
				
			||||||
		 gsm_subscriber.h gsm_04_11.h debug.h signal.h \
 | 
							 gsm_subscriber.h linuxlist.h msgb.h select.h tlv.h gsm_04_11.h \
 | 
				
			||||||
		 misdn.h chan_alloc.h paging.h \
 | 
							 timer.h misdn.h chan_alloc.h telnet_interface.h paging.h \
 | 
				
			||||||
		 trau_mux.h rs232.h openbscdefines.h rtp_proxy.h \
 | 
							 subchan_demux.h trau_frame.h e1_input.h trau_mux.h signal.h \
 | 
				
			||||||
		 bsc_rll.h mncc.h transaction.h ussd.h gsm_04_80.h \
 | 
							 gsm_utils.h ipaccess.h rs232.h openbscdefines.h rtp_proxy.h \
 | 
				
			||||||
		 silent_call.h mgcp.h meas_rep.h rest_octets.h \
 | 
							 bsc_rll.h mncc.h talloc.h transaction.h ussd.h gsm_04_80.h \
 | 
				
			||||||
		 system_information.h handover.h mgcp_internal.h \
 | 
							 silent_call.h mgcp.h meas_rep.h bitvec.h rest_octets.h \
 | 
				
			||||||
		 vty.h socket.h e1_config.h trau_upqueue.h token_auth.h \
 | 
							 system_information.h handover.h bssap.h bsc_msc.h bsc_nat.h
 | 
				
			||||||
		 handover_decision.h rrlp.h control_if.h \
 | 
					 | 
				
			||||||
		crc24.h gprs_bssgp.h gprs_llc.h gprs_ns.h gprs_gmm.h \
 | 
					 | 
				
			||||||
		gb_proxy.h gprs_sgsn.h gsm_04_08_gprs.h sgsn.h \
 | 
					 | 
				
			||||||
		gprs_ns_frgre.h auth.h osmo_msc.h bsc_msc.h bsc_nat.h \
 | 
					 | 
				
			||||||
		osmo_bsc_rf.h osmo_bsc.h network_listen.h bsc_nat_sccp.h \
 | 
					 | 
				
			||||||
		osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \
 | 
					 | 
				
			||||||
		bss.h gsm_data_shared.h control_cmd.h ipaccess.h mncc_int.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h
 | 
					 | 
				
			||||||
openbscdir = $(includedir)/openbsc
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,32 +5,690 @@
 | 
				
			|||||||
 * All Rights Reserved
 | 
					 * All Rights Reserved
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 * GNU Affero General Public License for more details.
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 * You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef _NM_H
 | 
				
			||||||
#define _NM_H
 | 
					#define _NM_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/gsm/tlv.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
#include <osmocom/gsm/abis_nm.h>
 | 
					
 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_12_21.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 {
 | 
					struct cell_global_id {
 | 
				
			||||||
	uint16_t mcc;
 | 
						u_int16_t mcc;
 | 
				
			||||||
	uint16_t mnc;
 | 
						u_int16_t mnc;
 | 
				
			||||||
	uint16_t lac;
 | 
						u_int16_t lac;
 | 
				
			||||||
	uint16_t ci;
 | 
						u_int16_t ci;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The BCCH info from an ip.access test, in host byte order
 | 
					/* The BCCH info from an ip.access test, in host byte order
 | 
				
			||||||
@@ -38,20 +696,20 @@ struct cell_global_id {
 | 
				
			|||||||
struct ipac_bcch_info {
 | 
					struct ipac_bcch_info {
 | 
				
			||||||
	struct llist_head list;
 | 
						struct llist_head list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint16_t info_type;
 | 
						u_int16_t info_type;
 | 
				
			||||||
	uint8_t freq_qual;
 | 
						u_int8_t freq_qual;
 | 
				
			||||||
	uint16_t arfcn;
 | 
						u_int16_t arfcn;
 | 
				
			||||||
	uint8_t rx_lev;
 | 
						u_int8_t rx_lev;
 | 
				
			||||||
	uint8_t rx_qual;
 | 
						u_int8_t rx_qual;
 | 
				
			||||||
	int16_t freq_err;
 | 
						int16_t freq_err;
 | 
				
			||||||
	uint16_t frame_offset;
 | 
						u_int16_t frame_offset;
 | 
				
			||||||
	uint32_t frame_nr_offset;
 | 
						u_int32_t frame_nr_offset;
 | 
				
			||||||
	uint8_t bsic;
 | 
						u_int8_t bsic;
 | 
				
			||||||
	struct cell_global_id cgi;
 | 
						struct cell_global_id cgi;
 | 
				
			||||||
	uint8_t ba_list_si2[16];
 | 
						u_int8_t ba_list_si2[16];
 | 
				
			||||||
	uint8_t ba_list_si2bis[16];
 | 
						u_int8_t ba_list_si2bis[16];
 | 
				
			||||||
	uint8_t ba_list_si2ter[16];
 | 
						u_int8_t ba_list_si2ter[16];
 | 
				
			||||||
	uint8_t ca_list_si1[16];
 | 
						u_int8_t ca_list_si1[16];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PUBLIC */
 | 
					/* PUBLIC */
 | 
				
			||||||
@@ -68,100 +726,97 @@ struct abis_nm_cfg {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern int abis_nm_rcvmsg(struct msgb *msg);
 | 
					extern int abis_nm_rcvmsg(struct msgb *msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int abis_nm_tlv_parse(struct tlv_parsed *tp, struct gsm_bts *bts, const uint8_t *buf, int len);
 | 
					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_rx(struct msgb *msg);
 | 
				
			||||||
int abis_nm_opstart(struct gsm_bts *bts, uint8_t obj_class, uint8_t i0, uint8_t i1, uint8_t i2);
 | 
					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, uint8_t obj_class, uint8_t i0,
 | 
					int abis_nm_chg_adm_state(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0,
 | 
				
			||||||
			  uint8_t i1, uint8_t i2, enum abis_nm_adm_state adm_state);
 | 
								  u_int8_t i1, u_int8_t i2, enum abis_nm_adm_state adm_state);
 | 
				
			||||||
int abis_nm_establish_tei(struct gsm_bts *bts, uint8_t trx_nr,
 | 
					int abis_nm_establish_tei(struct gsm_bts *bts, u_int8_t trx_nr,
 | 
				
			||||||
			  uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot,
 | 
								  u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot,
 | 
				
			||||||
			  uint8_t tei);
 | 
								  u_int8_t tei);
 | 
				
			||||||
int abis_nm_conn_terr_sign(struct gsm_bts_trx *trx,
 | 
					int abis_nm_conn_terr_sign(struct gsm_bts_trx *trx,
 | 
				
			||||||
			   uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot);
 | 
								   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,
 | 
					int abis_nm_conn_terr_traf(struct gsm_bts_trx_ts *ts,
 | 
				
			||||||
			   uint8_t e1_port, uint8_t e1_timeslot,
 | 
								   u_int8_t e1_port, u_int8_t e1_timeslot,
 | 
				
			||||||
			   uint8_t e1_subslot);
 | 
								   u_int8_t e1_subslot);
 | 
				
			||||||
int abis_nm_set_bts_attr(struct gsm_bts *bts, uint8_t *attr, int attr_len);
 | 
					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, uint8_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, uint8_t chan_comb);
 | 
					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, uint8_t obj_class, uint8_t i1,
 | 
					int abis_nm_sw_act_req_ack(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i1,
 | 
				
			||||||
			uint8_t i2, uint8_t i3, int nack, uint8_t *attr, int att_len);
 | 
								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, uint8_t *msg);
 | 
					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_event_reports(struct gsm_bts *bts, int on);
 | 
				
			||||||
int abis_nm_reset_resource(struct gsm_bts *bts);
 | 
					int abis_nm_reset_resource(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_software_load(struct gsm_bts *bts, int trx_nr, const char *fname,
 | 
					int abis_nm_software_load(struct gsm_bts *bts, const char *fname,
 | 
				
			||||||
			  uint8_t win_size, int forced,
 | 
								  u_int8_t win_size, int forced,
 | 
				
			||||||
			  gsm_cbfn *cbfn, void *cb_data);
 | 
								  gsm_cbfn *cbfn, void *cb_data);
 | 
				
			||||||
int abis_nm_software_load_status(struct gsm_bts *bts);
 | 
					int abis_nm_software_load_status(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_software_activate(struct gsm_bts *bts, const char *fname,
 | 
					int abis_nm_software_activate(struct gsm_bts *bts, const char *fname,
 | 
				
			||||||
			      gsm_cbfn *cbfn, void *cb_data);
 | 
								      gsm_cbfn *cbfn, void *cb_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int abis_nm_conn_mdrop_link(struct gsm_bts *bts, uint8_t e1_port0, uint8_t ts0,
 | 
					int abis_nm_conn_mdrop_link(struct gsm_bts *bts, u_int8_t e1_port0, u_int8_t ts0,
 | 
				
			||||||
			    uint8_t e1_port1, uint8_t ts1);
 | 
								    u_int8_t e1_port1, u_int8_t ts1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int abis_nm_perform_test(struct gsm_bts *bts, uint8_t obj_class,
 | 
					int abis_nm_perform_test(struct gsm_bts *bts, u_int8_t obj_class,
 | 
				
			||||||
			 uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
 | 
								 u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr,
 | 
				
			||||||
			 uint8_t test_nr, uint8_t auton_report, struct msgb *msg);
 | 
								 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 */
 | 
					/* Siemens / BS-11 specific */
 | 
				
			||||||
int abis_nm_bs11_reset_resource(struct gsm_bts *bts);
 | 
					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_db_transmission(struct gsm_bts *bts, int begin);
 | 
				
			||||||
int abis_nm_bs11_create_object(struct gsm_bts *bts, enum abis_bs11_objtype type,
 | 
					int abis_nm_bs11_create_object(struct gsm_bts *bts, enum abis_bs11_objtype type,
 | 
				
			||||||
			  uint8_t idx, uint8_t attr_len, const uint8_t *attr);
 | 
								  u_int8_t idx, u_int8_t attr_len, const u_int8_t *attr);
 | 
				
			||||||
int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, uint8_t idx);
 | 
					int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, u_int8_t idx);
 | 
				
			||||||
int abis_nm_bs11_create_bport(struct gsm_bts *bts, uint8_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,
 | 
					int abis_nm_bs11_delete_object(struct gsm_bts *bts,
 | 
				
			||||||
				enum abis_bs11_objtype type, uint8_t idx);
 | 
									enum abis_bs11_objtype type, u_int8_t idx);
 | 
				
			||||||
int abis_nm_bs11_delete_bport(struct gsm_bts *bts, uint8_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, uint8_t e1_port,
 | 
					int abis_nm_bs11_conn_oml_tei(struct gsm_bts *bts, u_int8_t e1_port,
 | 
				
			||||||
			  uint8_t e1_timeslot, uint8_t e1_subslot, uint8_t tei);
 | 
								  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_oml_tei_ts(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_bs11_get_serno(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, uint8_t level);
 | 
					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_get_trx_power(struct gsm_bts_trx *trx);
 | 
				
			||||||
int abis_nm_bs11_logon(struct gsm_bts *bts, uint8_t level, const char *name, int on);
 | 
					 | 
				
			||||||
int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on);
 | 
					int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on);
 | 
				
			||||||
int abis_nm_bs11_infield_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_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_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_pll_mode(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_bs11_set_pll(struct gsm_bts *bts, int value);
 | 
					 | 
				
			||||||
int abis_nm_bs11_get_cclk(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_get_state(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname,
 | 
					int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname,
 | 
				
			||||||
			  uint8_t win_size, int forced, gsm_cbfn *cbfn);
 | 
								  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_ext_time(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_bs11_get_bport_line_cfg(struct gsm_bts *bts, uint8_t bport);
 | 
					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_set_bport_line_cfg(struct gsm_bts *bts, uint8_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_bsc_disconnect(struct gsm_bts *bts, int reconnect);
 | 
				
			||||||
int abis_nm_bs11_restart(struct gsm_bts *bts);
 | 
					int abis_nm_bs11_restart(struct gsm_bts *bts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ip.access nanoBTS specific commands */
 | 
					/* ip.access nanoBTS specific commands */
 | 
				
			||||||
int abis_nm_ipaccess_msg(struct gsm_bts *bts, uint8_t msg_type,
 | 
					int abis_nm_ipaccess_msg(struct gsm_bts *bts, u_int8_t msg_type,
 | 
				
			||||||
			 uint8_t obj_class, uint8_t bts_nr,
 | 
								 u_int8_t obj_class, u_int8_t bts_nr,
 | 
				
			||||||
			 uint8_t trx_nr, uint8_t ts_nr,
 | 
								 u_int8_t trx_nr, u_int8_t ts_nr,
 | 
				
			||||||
			 uint8_t *attr, int attr_len);
 | 
								 u_int8_t *attr, int attr_len);
 | 
				
			||||||
int abis_nm_ipaccess_set_nvattr(struct gsm_bts_trx *trx, uint8_t *attr,
 | 
					int abis_nm_ipaccess_set_nvattr(struct gsm_bts *bts, u_int8_t *attr,
 | 
				
			||||||
				int attr_len);
 | 
									int attr_len);
 | 
				
			||||||
int abis_nm_ipaccess_restart(struct gsm_bts_trx *trx);
 | 
					int abis_nm_ipaccess_restart(struct gsm_bts *bts);
 | 
				
			||||||
int abis_nm_ipaccess_set_attr(struct gsm_bts *bts, uint8_t obj_class,
 | 
					int abis_nm_ipaccess_set_attr(struct gsm_bts *bts, u_int8_t obj_class,
 | 
				
			||||||
				uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
 | 
									u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr,
 | 
				
			||||||
				uint8_t *attr, uint8_t attr_len);
 | 
									u_int8_t *attr, u_int8_t attr_len);
 | 
				
			||||||
int abis_nm_ipaccess_rsl_connect(struct gsm_bts_trx *trx, 
 | 
					int abis_nm_ipaccess_rsl_connect(struct gsm_bts_trx *trx, 
 | 
				
			||||||
				 uint32_t ip, uint16_t port, uint8_t stream);
 | 
									 u_int32_t ip, u_int16_t port, u_int8_t stream);
 | 
				
			||||||
void abis_nm_ipaccess_cgi(uint8_t *buf, struct gsm_bts *bts);
 | 
					int ipac_parse_bcch_info(struct ipac_bcch_info *binf, u_int8_t *buf);
 | 
				
			||||||
int ipac_parse_bcch_info(struct ipac_bcch_info *binf, uint8_t *buf);
 | 
					const char *ipacc_testres_name(u_int8_t res);
 | 
				
			||||||
const char *ipacc_testres_name(uint8_t res);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Functions calling into other code parts */
 | 
					/* Functions calling into other code parts */
 | 
				
			||||||
int nm_is_running(struct gsm_nm_state *s);
 | 
					enum nm_evt {
 | 
				
			||||||
 | 
						EVT_STATECHG_OPER,
 | 
				
			||||||
int abis_nm_vty_init(void);
 | 
						EVT_STATECHG_ADM,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
void abis_nm_clear_queue(struct gsm_bts *bts);
 | 
					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); 
 | 
				
			||||||
int _abis_nm_sendmsg(struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void abis_nm_queue_send_next(struct gsm_bts *bts);	/* for bs11_config. */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *nm_opstate_name(u_int8_t os);
 | 
				
			||||||
 | 
					const char *nm_avail_name(u_int8_t avail);
 | 
				
			||||||
#endif /* _NM_H */
 | 
					#endif /* _NM_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,98 +0,0 @@
 | 
				
			|||||||
#ifndef OPENBSC_ABIS_OM2K_H
 | 
					 | 
				
			||||||
#define OPENBSC_ABIS_OM2K_H
 | 
					 | 
				
			||||||
/* Ericsson RBS 2xxx GSM O&M (OM2000) messages on the A-bis interface
 | 
					 | 
				
			||||||
 * implemented based on protocol trace analysis, no formal documentation */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* (C) 2010-2011 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 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/>.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum abis_om2k_mo_cls {
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_TRXC			= 0x01,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_TS				= 0x03,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_TF				= 0x04,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_IS				= 0x05,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_CON				= 0x06,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_DP				= 0x07,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_CF				= 0x0a,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_TX				= 0x0b,
 | 
					 | 
				
			||||||
	OM2K_MO_CLS_RX				= 0x0c,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum om2k_mo_state {
 | 
					 | 
				
			||||||
	OM2K_MO_S_RESET = 0,
 | 
					 | 
				
			||||||
	OM2K_MO_S_STARTED,
 | 
					 | 
				
			||||||
	OM2K_MO_S_ENABLED,
 | 
					 | 
				
			||||||
	OM2K_MO_S_DISABLED,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct abis_om2k_mo {
 | 
					 | 
				
			||||||
	uint8_t class;
 | 
					 | 
				
			||||||
	uint8_t bts;
 | 
					 | 
				
			||||||
	uint8_t assoc_so;
 | 
					 | 
				
			||||||
	uint8_t inst;
 | 
					 | 
				
			||||||
} __attribute__ ((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* on-wire format for IS conn group */
 | 
					 | 
				
			||||||
struct om2k_is_conn_grp {
 | 
					 | 
				
			||||||
	uint16_t icp1;
 | 
					 | 
				
			||||||
	uint16_t icp2;
 | 
					 | 
				
			||||||
	uint8_t cont_idx;
 | 
					 | 
				
			||||||
} __attribute__ ((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* internal data formant for IS conn group */
 | 
					 | 
				
			||||||
struct is_conn_group {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
	uint16_t icp1;
 | 
					 | 
				
			||||||
	uint16_t icp2;
 | 
					 | 
				
			||||||
	uint8_t ci;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern const struct abis_om2k_mo om2k_mo_cf;
 | 
					 | 
				
			||||||
extern const struct abis_om2k_mo om2k_mo_is;
 | 
					 | 
				
			||||||
extern const struct abis_om2k_mo om2k_mo_con;
 | 
					 | 
				
			||||||
extern const struct abis_om2k_mo om2k_mo_tf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern const struct value_string om2k_mo_class_short_vals[];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int abis_om2k_rcvmsg(struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern const struct abis_om2k_mo om2k_mo_cf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int abis_om2k_tx_reset_cmd(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_start_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_status_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_connect_cmd(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_disconnect_cmd(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_enable_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_disable_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_test_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 | 
					 | 
				
			||||||
int abis_om2k_tx_op_info(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
 | 
					 | 
				
			||||||
			 uint8_t operational);
 | 
					 | 
				
			||||||
int abis_om2k_tx_is_conf_req(struct gsm_bts *bts);
 | 
					 | 
				
			||||||
int abis_om2k_tx_tf_conf_req(struct gsm_bts *bts);
 | 
					 | 
				
			||||||
int abis_om2k_tx_rx_conf_req(struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int abis_om2k_vty_init(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct vty;
 | 
					 | 
				
			||||||
void abis_om2k_config_write_bts(struct vty *vty, struct gsm_bts *bts);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* OPENBCS_ABIS_OM2K_H */
 | 
					 | 
				
			||||||
@@ -5,97 +5,563 @@
 | 
				
			|||||||
 * All Rights Reserved
 | 
					 * All Rights Reserved
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 * GNU Affero General Public License for more details.
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 * You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef _RSL_H
 | 
				
			||||||
#define _RSL_H
 | 
					#define _RSL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_08_58.h>
 | 
					struct abis_rsl_common_hdr {
 | 
				
			||||||
 | 
						u_int8_t	msg_discr;
 | 
				
			||||||
 | 
						u_int8_t	msg_type;
 | 
				
			||||||
 | 
						u_int8_t	data[0];
 | 
				
			||||||
 | 
					} __attribute__ ((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					/* 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));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_bts;
 | 
					/* Chapter 8.3 and 8.4 */
 | 
				
			||||||
struct gsm_lchan;
 | 
					struct abis_rsl_dchan_hdr {
 | 
				
			||||||
struct gsm_subscriber;
 | 
						struct abis_rsl_common_hdr c;
 | 
				
			||||||
struct gsm_bts_trx_ts;
 | 
						u_int8_t	ie_chan;
 | 
				
			||||||
 | 
						u_int8_t	chan_nr;
 | 
				
			||||||
 | 
						u_int8_t	data[0];
 | 
				
			||||||
 | 
					} __attribute__ ((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int rsl_bcch_info(struct gsm_bts_trx *trx, uint8_t type,
 | 
					/* Chapter 9.1 */
 | 
				
			||||||
		  const uint8_t *data, int len);
 | 
					#define ABIS_RSL_MDISC_RLL		0x02
 | 
				
			||||||
int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
 | 
					#define ABIS_RSL_MDISC_DED_CHAN		0x08
 | 
				
			||||||
		      const uint8_t *data, int len);
 | 
					#define ABIS_RSL_MDISC_COM_CHAN		0x0c
 | 
				
			||||||
int rsl_chan_activate(struct gsm_bts_trx *trx, uint8_t chan_nr,
 | 
					#define ABIS_RSL_MDISC_TRX		0x10
 | 
				
			||||||
		      uint8_t act_type,
 | 
					#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_mode *chan_mode,
 | 
				
			||||||
		      struct rsl_ie_chan_ident *chan_ident,
 | 
							      struct rsl_ie_chan_ident *chan_ident,
 | 
				
			||||||
		      uint8_t bs_power, uint8_t ms_power,
 | 
							      u_int8_t bs_power, u_int8_t ms_power,
 | 
				
			||||||
		      uint8_t ta);
 | 
							      u_int8_t ta);
 | 
				
			||||||
int rsl_chan_activate_lchan(struct gsm_lchan *lchan, uint8_t act_type,
 | 
					int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, 
 | 
				
			||||||
			    uint8_t ta, uint8_t ho_ref);
 | 
								    u_int8_t ta, u_int8_t ho_ref);
 | 
				
			||||||
int rsl_chan_mode_modify_req(struct gsm_lchan *ts);
 | 
					int rsl_chan_mode_modify_req(struct gsm_lchan *ts);
 | 
				
			||||||
int rsl_encryption_cmd(struct msgb *msg);
 | 
					int rsl_encryption_cmd(struct msgb *msg);
 | 
				
			||||||
int rsl_paging_cmd(struct gsm_bts *bts, uint8_t paging_group, uint8_t len,
 | 
					int rsl_paging_cmd(struct gsm_bts *bts, u_int8_t paging_group, u_int8_t len,
 | 
				
			||||||
		   uint8_t *ms_ident, uint8_t chan_needed);
 | 
							   u_int8_t *ms_ident, u_int8_t chan_needed);
 | 
				
			||||||
int rsl_imm_assign_cmd(struct gsm_bts *bts, uint8_t len, uint8_t *val);
 | 
					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, uint8_t link_id);
 | 
					int rsl_data_request(struct msgb *msg, u_int8_t link_id);
 | 
				
			||||||
int rsl_establish_request(struct gsm_lchan *lchan, uint8_t link_id);
 | 
					int rsl_establish_request(struct gsm_lchan *lchan, u_int8_t link_id);
 | 
				
			||||||
int rsl_relase_request(struct gsm_lchan *lchan, uint8_t link_id);
 | 
					int rsl_relase_request(struct gsm_lchan *lchan, u_int8_t link_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Siemens vendor-specific RSL extensions */
 | 
					/* 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);
 | 
					int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ip.access specfic RSL extensions */
 | 
					/* ip.access specfic RSL extensions */
 | 
				
			||||||
int rsl_ipacc_crcx(struct gsm_lchan *lchan);
 | 
					int rsl_ipacc_crcx(struct gsm_lchan *lchan);
 | 
				
			||||||
int rsl_ipacc_mdcx(struct gsm_lchan *lchan, uint32_t ip,
 | 
					int rsl_ipacc_mdcx(struct gsm_lchan *lchan, u_int32_t ip,
 | 
				
			||||||
		   uint16_t port, uint8_t rtp_payload2);
 | 
							   u_int16_t port, u_int8_t rtp_payload2);
 | 
				
			||||||
int rsl_ipacc_mdcx_to_rtpsock(struct gsm_lchan *lchan);
 | 
					int rsl_ipacc_mdcx_to_rtpsock(struct gsm_lchan *lchan);
 | 
				
			||||||
int rsl_ipacc_pdch_activate(struct gsm_bts_trx_ts *ts, int act);
 | 
					int rsl_ipacc_pdch_activate(struct gsm_lchan *lchan);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int abis_rsl_rcvmsg(struct msgb *msg);
 | 
					int abis_rsl_rcvmsg(struct msgb *msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint64_t str_to_imsi(const char *imsi_str);
 | 
					unsigned int get_paging_group(u_int64_t imsi, unsigned int bs_cc_chans,
 | 
				
			||||||
int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id, uint8_t reason);
 | 
								      int n_pag_blocks);
 | 
				
			||||||
 | 
					unsigned int n_pag_blocks(int bs_ccch_sdcch_comb, unsigned int bs_ag_blks_res);
 | 
				
			||||||
int rsl_lchan_set_state(struct gsm_lchan *lchan, int);
 | 
					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 */
 | 
					/* to be provided by external code */
 | 
				
			||||||
int abis_rsl_sendmsg(struct msgb *msg);
 | 
					int abis_rsl_sendmsg(struct msgb *msg);
 | 
				
			||||||
int rsl_deact_sacch(struct gsm_lchan *lchan);
 | 
					int rsl_deact_sacch(struct gsm_lchan *lchan);
 | 
				
			||||||
int rsl_lchan_rll_release(struct gsm_lchan *lchan, uint8_t link_id);
 | 
					int rsl_chan_release(struct gsm_lchan *lchan);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* BCCH related code */
 | 
					/* BCCH related code */
 | 
				
			||||||
int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf);
 | 
					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_ccch_conf_to_bs_ccch_sdcch_comb(int ccch_conf);
 | 
				
			||||||
 | 
					int rsl_number_of_paging_subchannels(struct gsm_bts *bts);
 | 
				
			||||||
int rsl_sacch_info_modify(struct gsm_lchan *lchan, uint8_t type,
 | 
					 | 
				
			||||||
			  const uint8_t *data, int len);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db);
 | 
					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);
 | 
					int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SMSCB functionality */
 | 
					 | 
				
			||||||
int rsl_sms_cb_command(struct gsm_bts *bts, uint8_t chan_number,
 | 
					 | 
				
			||||||
		       uint8_t cb_command, const uint8_t *data, int len);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* some Nokia specific stuff */
 | 
					 | 
				
			||||||
int rsl_nokia_si_begin(struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
int rsl_nokia_si_end(struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* required for Nokia BTS power control */
 | 
					 | 
				
			||||||
int rsl_bs_power_control(struct gsm_bts_trx *trx, uint8_t channel, uint8_t reduction);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* RSL_MT_H */
 | 
					#endif /* RSL_MT_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,17 +0,0 @@
 | 
				
			|||||||
#ifndef _AUTH_H
 | 
					 | 
				
			||||||
#define _AUTH_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_auth_tuple;
 | 
					 | 
				
			||||||
struct gsm_subscriber;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum auth_action {
 | 
					 | 
				
			||||||
	AUTH_NOT_AVAIL		= 0,	/* No auth tuple available */
 | 
					 | 
				
			||||||
	AUTH_DO_AUTH_THAN_CIPH	= 1,	/* Firsth authenticate, then cipher */
 | 
					 | 
				
			||||||
	AUTH_DO_CIPH		= 2,	/* Only ciphering */
 | 
					 | 
				
			||||||
	AUTH_DO_AUTH		= 3,	/* Only authentication, no ciphering */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int auth_get_tuple_for_subscr(struct gsm_auth_tuple *atuple,
 | 
					 | 
				
			||||||
                              struct gsm_subscriber *subscr, int key_seq);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _AUTH_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 */
 | 
				
			||||||
@@ -1,44 +0,0 @@
 | 
				
			|||||||
/* GSM 08.08 like API for OpenBSC */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef OPENBSC_BSC_API_H
 | 
					 | 
				
			||||||
#define OPENBSC_BSC_API_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "gsm_data.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BSC_API_CONN_POL_ACCEPT	0
 | 
					 | 
				
			||||||
#define BSC_API_CONN_POL_REJECT	1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_api {
 | 
					 | 
				
			||||||
	/*! \brief BTS->MSC: tell MSC a SAPI was not established */
 | 
					 | 
				
			||||||
	void (*sapi_n_reject)(struct gsm_subscriber_connection *conn, int dlci);
 | 
					 | 
				
			||||||
	/*! \brief MS->MSC: Tell MSC that ciphering has been enabled */
 | 
					 | 
				
			||||||
	void (*cipher_mode_compl)(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
				  struct msgb *msg, uint8_t chosen_encr);
 | 
					 | 
				
			||||||
	/*! \brief MS->MSC: New MM context with L3 payload */
 | 
					 | 
				
			||||||
	int (*compl_l3)(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
			struct msgb *msg, uint16_t chosen_channel); 
 | 
					 | 
				
			||||||
	/*! \brief MS->BSC/MSC: Um L3 message */
 | 
					 | 
				
			||||||
	void (*dtap)(struct gsm_subscriber_connection *conn, uint8_t link_id,
 | 
					 | 
				
			||||||
			struct msgb *msg);
 | 
					 | 
				
			||||||
	/*! \brief BSC->MSC: Assignment of lchan successful */
 | 
					 | 
				
			||||||
	void (*assign_compl)(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
			  uint8_t rr_cause, uint8_t chosen_channel,
 | 
					 | 
				
			||||||
			  uint8_t encr_alg_id, uint8_t speech_mode);
 | 
					 | 
				
			||||||
	/*! \brief BSC->MSC: Assignment of lchan failed */
 | 
					 | 
				
			||||||
	void (*assign_fail)(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
			 uint8_t cause, uint8_t *rr_cause);
 | 
					 | 
				
			||||||
	/*! \brief BSC->MSC: RR conn has been cleared */
 | 
					 | 
				
			||||||
	int (*clear_request)(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
			      uint32_t cause);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int bsc_api_init(struct gsm_network *network, struct bsc_api *api);
 | 
					 | 
				
			||||||
int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id, int allow_sach);
 | 
					 | 
				
			||||||
int gsm0808_assign_req(struct gsm_subscriber_connection *conn, int chan_mode, int full_rate);
 | 
					 | 
				
			||||||
int gsm0808_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,
 | 
					 | 
				
			||||||
			const uint8_t *key, int len, int include_imeisv);
 | 
					 | 
				
			||||||
int gsm0808_page(struct gsm_bts *bts, unsigned int page_group,
 | 
					 | 
				
			||||||
		 unsigned int mi_len, uint8_t *mi, int chan_type);
 | 
					 | 
				
			||||||
int gsm0808_clear(struct gsm_subscriber_connection *conn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -1,59 +1,30 @@
 | 
				
			|||||||
/* Routines to talk to the MSC using the IPA Protocol */
 | 
					/* Routines to talk to the MSC using the IPA Protocol */
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
					 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
				
			||||||
 * (C) 2010 by On-Waves
 | 
					 * (C) 2010 by on-waves.com
 | 
				
			||||||
 * All Rights Reserved
 | 
					 * All Rights Reserved
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 * GNU Affero General Public License for more details.
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 * You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef BSC_MSC_H
 | 
				
			||||||
#define BSC_MSC_H
 | 
					#define BSC_MSC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/core/write_queue.h>
 | 
					#include "select.h"
 | 
				
			||||||
#include <osmocom/core/timer.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct bsc_msc_dest {
 | 
					int connect_to_msc(struct bsc_fd *fd, const char *ip, int port);
 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *ip;
 | 
					 | 
				
			||||||
	int port;
 | 
					 | 
				
			||||||
	int dscp;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_msc_connection {
 | 
					 | 
				
			||||||
	struct osmo_wqueue write_queue;
 | 
					 | 
				
			||||||
	int is_connected;
 | 
					 | 
				
			||||||
	int is_authenticated;
 | 
					 | 
				
			||||||
	int first_contact;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct llist_head *dests;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void (*connection_loss) (struct bsc_msc_connection *);
 | 
					 | 
				
			||||||
	void (*connected) (struct bsc_msc_connection *);
 | 
					 | 
				
			||||||
	struct osmo_timer_list reconnect_timer;
 | 
					 | 
				
			||||||
	struct osmo_timer_list timeout_timer;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_msc_connection *bsc_msc_create(void *ctx, struct llist_head *dest);
 | 
					 | 
				
			||||||
int bsc_msc_connect(struct bsc_msc_connection *);
 | 
					 | 
				
			||||||
void bsc_msc_schedule_connect(struct bsc_msc_connection *);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void bsc_msc_lost(struct bsc_msc_connection *);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct msgb *bsc_msc_id_get_resp(const char *token);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,439 +1,33 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
					 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
				
			||||||
 * (C) 2010-2011 by On-Waves
 | 
					 * (C) 2010 by on-waves.com
 | 
				
			||||||
 * All Rights Reserved
 | 
					 * All Rights Reserved
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 * GNU Affero General Public License for more details.
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 * You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef BSC_NAT_H
 | 
				
			||||||
#define BSC_NAT_H
 | 
					#define BSC_NAT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "mgcp.h"
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include "msgb.h"
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/select.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/msgfile.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/timer.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/write_queue.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/rate_ctr.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/statistics.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <regex.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DIR_BSC 1
 | 
					 | 
				
			||||||
#define DIR_MSC 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define PAGIN_GROUP_UNASSIGNED -1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct sccp_source_reference;
 | 
					 | 
				
			||||||
struct sccp_connections;
 | 
					 | 
				
			||||||
struct bsc_nat_parsed;
 | 
					 | 
				
			||||||
struct bsc_nat;
 | 
					 | 
				
			||||||
struct bsc_nat_ussd_con;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum {
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_NONE,
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_LU,
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_CM_SERV_REQ,
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_PAG_RESP,
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_SSA,
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_LOCAL_REJECT,
 | 
					 | 
				
			||||||
	NAT_CON_TYPE_OTHER,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Is this terminated to the MSC, to the local machine (release
 | 
					 | 
				
			||||||
 * handling for IMSI filtering) or to a USSD provider?
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
enum {
 | 
					 | 
				
			||||||
	NAT_CON_END_MSC,
 | 
					 | 
				
			||||||
	NAT_CON_END_LOCAL,
 | 
					 | 
				
			||||||
	NAT_CON_END_USSD,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Pending command entry
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_cmd_list {
 | 
					 | 
				
			||||||
	struct llist_head list_entry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct osmo_timer_list timeout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The NATed ID used on the bsc_con*/
 | 
					 | 
				
			||||||
	int nat_id;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The control connection from which the command originated */
 | 
					 | 
				
			||||||
	struct ctrl_connection *ccon;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The command from the control connection */
 | 
					 | 
				
			||||||
	struct ctrl_cmd *cmd;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Per BSC data structure
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_connection {
 | 
					 | 
				
			||||||
	struct llist_head list_entry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* do we know anything about this BSC? */
 | 
					 | 
				
			||||||
	int authenticated;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* the fd we use to communicate */
 | 
					 | 
				
			||||||
	struct osmo_wqueue write_queue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* the BSS associated */
 | 
					 | 
				
			||||||
	struct bsc_config *cfg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* a timeout node */
 | 
					 | 
				
			||||||
	struct osmo_timer_list id_timeout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* pong timeout */
 | 
					 | 
				
			||||||
	struct osmo_timer_list ping_timeout;
 | 
					 | 
				
			||||||
	struct osmo_timer_list pong_timeout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* mgcp related code */
 | 
					 | 
				
			||||||
	char *_endpoint_status;
 | 
					 | 
				
			||||||
	int number_multiplexes;
 | 
					 | 
				
			||||||
	int max_endpoints;
 | 
					 | 
				
			||||||
	int last_endpoint;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* track the pending commands for this BSC */
 | 
					 | 
				
			||||||
	struct llist_head cmd_pending;
 | 
					 | 
				
			||||||
	int last_id;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* a back pointer */
 | 
					 | 
				
			||||||
	struct bsc_nat *nat;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Stats per BSC
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_config_stats {
 | 
					 | 
				
			||||||
	struct rate_ctr_group *ctrg;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum bsc_cfg_ctr {
 | 
					 | 
				
			||||||
	BCFG_CTR_SCCP_CONN,
 | 
					 | 
				
			||||||
	BCFG_CTR_SCCP_CALLS,
 | 
					 | 
				
			||||||
	BCFG_CTR_NET_RECONN,
 | 
					 | 
				
			||||||
	BCFG_CTR_DROPPED_SCCP,
 | 
					 | 
				
			||||||
	BCFG_CTR_DROPPED_CALLS,
 | 
					 | 
				
			||||||
	BCFG_CTR_REJECTED_CR,
 | 
					 | 
				
			||||||
	BCFG_CTR_REJECTED_MSG,
 | 
					 | 
				
			||||||
	BCFG_CTR_ILL_PACKET,
 | 
					 | 
				
			||||||
	BCFG_CTR_CON_TYPE_LU,
 | 
					 | 
				
			||||||
	BCFG_CTR_CON_CMSERV_RQ,
 | 
					 | 
				
			||||||
	BCFG_CTR_CON_PAG_RESP,
 | 
					 | 
				
			||||||
	BCFG_CTR_CON_SSA,
 | 
					 | 
				
			||||||
	BCFG_CTR_CON_OTHER,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * One BSC entry in the config
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_config {
 | 
					 | 
				
			||||||
	struct llist_head entry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *token;
 | 
					 | 
				
			||||||
	int nr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *description;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* imsi white and blacklist */
 | 
					 | 
				
			||||||
	char *acc_lst_name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	int forbid_paging;
 | 
					 | 
				
			||||||
	int paging_group;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* audio handling */
 | 
					 | 
				
			||||||
	int max_endpoints;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* backpointer */
 | 
					 | 
				
			||||||
	struct bsc_nat *nat;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct bsc_config_stats stats;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct llist_head lac_list;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_lac_entry {
 | 
					 | 
				
			||||||
	struct llist_head entry;
 | 
					 | 
				
			||||||
	uint16_t lac;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_nat_paging_group {
 | 
					 | 
				
			||||||
	struct llist_head entry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* list of lac entries */
 | 
					 | 
				
			||||||
	struct llist_head lists;
 | 
					 | 
				
			||||||
	int nr;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * BSCs point of view of endpoints
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_endpoint {
 | 
					 | 
				
			||||||
	/* the operation that is carried out */
 | 
					 | 
				
			||||||
	int transaction_state;
 | 
					 | 
				
			||||||
	/* the pending transaction id */
 | 
					 | 
				
			||||||
	char *transaction_id;
 | 
					 | 
				
			||||||
	/* the bsc we are talking to */
 | 
					 | 
				
			||||||
	struct bsc_connection *bsc;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Statistic for the nat.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_nat_statistics {
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_counter *conn;
 | 
					 | 
				
			||||||
		struct osmo_counter *calls;
 | 
					 | 
				
			||||||
	} sccp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_counter *reconn;
 | 
					 | 
				
			||||||
                struct osmo_counter *auth_fail;
 | 
					 | 
				
			||||||
	} bsc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_counter *reconn;
 | 
					 | 
				
			||||||
	} msc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_counter *reconn;
 | 
					 | 
				
			||||||
	} ussd;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum bsc_nat_acc_ctr {
 | 
					 | 
				
			||||||
	ACC_LIST_BSC_FILTER,
 | 
					 | 
				
			||||||
	ACC_LIST_NAT_FILTER,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_nat_acc_lst {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* counter */
 | 
					 | 
				
			||||||
	struct rate_ctr_group *stats;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* the name of the list */
 | 
					 | 
				
			||||||
	const char *name;
 | 
					 | 
				
			||||||
	struct llist_head fltr_list;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_nat_acc_lst_entry {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* the filter */
 | 
					 | 
				
			||||||
	char *imsi_allow;
 | 
					 | 
				
			||||||
	regex_t imsi_allow_re;
 | 
					 | 
				
			||||||
	char *imsi_deny;
 | 
					 | 
				
			||||||
	regex_t imsi_deny_re;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * the structure of the "nat" network
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_nat {
 | 
					 | 
				
			||||||
	/* active SCCP connections that need patching */
 | 
					 | 
				
			||||||
	struct llist_head sccp_connections;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* active BSC connections that need patching */
 | 
					 | 
				
			||||||
	struct llist_head bsc_connections;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* access lists */
 | 
					 | 
				
			||||||
	struct llist_head access_lists;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* paging groups */
 | 
					 | 
				
			||||||
	struct llist_head paging_groups;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* known BSC's */
 | 
					 | 
				
			||||||
	struct llist_head bsc_configs;
 | 
					 | 
				
			||||||
	int num_bsc;
 | 
					 | 
				
			||||||
	int bsc_ip_dscp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* MGCP config */
 | 
					 | 
				
			||||||
	struct mgcp_config *mgcp_cfg;
 | 
					 | 
				
			||||||
	uint8_t mgcp_msg[4096];
 | 
					 | 
				
			||||||
	int mgcp_length;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* msc things */
 | 
					 | 
				
			||||||
	struct llist_head dests;
 | 
					 | 
				
			||||||
	struct bsc_msc_dest *main_dest;
 | 
					 | 
				
			||||||
	struct bsc_msc_connection *msc_con;
 | 
					 | 
				
			||||||
	char *token;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* timeouts */
 | 
					 | 
				
			||||||
	int auth_timeout;
 | 
					 | 
				
			||||||
	int ping_timeout;
 | 
					 | 
				
			||||||
	int pong_timeout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct bsc_endpoint *bsc_endpoints;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* filter */
 | 
					 | 
				
			||||||
	char *acc_lst_name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* number rewriting */
 | 
					 | 
				
			||||||
	char *num_rewr_name;
 | 
					 | 
				
			||||||
	struct llist_head num_rewr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *smsc_rewr_name;
 | 
					 | 
				
			||||||
	struct llist_head smsc_rewr;
 | 
					 | 
				
			||||||
	char *tpdest_match_name;
 | 
					 | 
				
			||||||
	struct llist_head tpdest_match;
 | 
					 | 
				
			||||||
	char *sms_clear_tp_srr_name;
 | 
					 | 
				
			||||||
	struct llist_head sms_clear_tp_srr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* USSD messages  we want to match */
 | 
					 | 
				
			||||||
	char *ussd_lst_name;
 | 
					 | 
				
			||||||
	char *ussd_query;
 | 
					 | 
				
			||||||
	regex_t ussd_query_re;
 | 
					 | 
				
			||||||
	char *ussd_token;
 | 
					 | 
				
			||||||
	char *ussd_local;
 | 
					 | 
				
			||||||
	struct osmo_fd ussd_listen;
 | 
					 | 
				
			||||||
	struct bsc_nat_ussd_con *ussd_con;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* for maintainenance */
 | 
					 | 
				
			||||||
	int blocked;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* statistics */
 | 
					 | 
				
			||||||
	struct bsc_nat_statistics stats;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_nat_ussd_con {
 | 
					 | 
				
			||||||
	struct osmo_wqueue queue;
 | 
					 | 
				
			||||||
	struct bsc_nat *nat;
 | 
					 | 
				
			||||||
	int authorized;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct osmo_timer_list auth_timeout;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* create and init the structures */
 | 
					 | 
				
			||||||
struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token);
 | 
					 | 
				
			||||||
struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num);
 | 
					 | 
				
			||||||
void bsc_config_free(struct bsc_config *);
 | 
					 | 
				
			||||||
void bsc_config_add_lac(struct bsc_config *cfg, int lac);
 | 
					 | 
				
			||||||
void bsc_config_del_lac(struct bsc_config *cfg, int lac);
 | 
					 | 
				
			||||||
int bsc_config_handles_lac(struct bsc_config *cfg, int lac);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_nat *bsc_nat_alloc(void);
 | 
					 | 
				
			||||||
struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
void bsc_nat_set_msc_ip(struct bsc_nat *bsc, const char *ip);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sccp_connection_destroy(struct sccp_connections *);
 | 
					 | 
				
			||||||
void bsc_close_connection(struct bsc_connection *);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const char *bsc_con_type_to_string(int type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * parse the given message into the above structure
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * filter based on IP Access header in both directions
 | 
					 * filter based on IP Access header in both directions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int bsc_nat_filter_ipa(int direction, struct msgb *msg, struct bsc_nat_parsed *parsed);
 | 
					int bsc_nat_filter_ipa(struct msgb *msg);
 | 
				
			||||||
int bsc_nat_vty_init(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
int bsc_nat_find_paging(struct msgb *msg, const uint8_t **,int *len);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Content filtering.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
 | 
					 | 
				
			||||||
			   struct bsc_nat_parsed *, int *con_type, char **imsi);
 | 
					 | 
				
			||||||
int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
 | 
					 | 
				
			||||||
		      struct sccp_connections *con, struct bsc_nat_parsed *parsed);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * SCCP patching and handling
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct sccp_connections *create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed);
 | 
					 | 
				
			||||||
int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *parsed);
 | 
					 | 
				
			||||||
void remove_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed);
 | 
					 | 
				
			||||||
struct sccp_connections *patch_sccp_src_ref_to_bsc(struct msgb *, struct bsc_nat_parsed *, struct bsc_nat *);
 | 
					 | 
				
			||||||
struct sccp_connections *patch_sccp_src_ref_to_msc(struct msgb *, struct bsc_nat_parsed *, struct bsc_connection *);
 | 
					 | 
				
			||||||
struct sccp_connections *bsc_nat_find_con_by_bsc(struct bsc_nat *, struct sccp_source_reference *);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * MGCP/Audio handling
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int bsc_mgcp_nr_multiplexes(int max_endpoints);
 | 
					 | 
				
			||||||
int bsc_write_mgcp(struct bsc_connection *bsc, const uint8_t *data, unsigned int length);
 | 
					 | 
				
			||||||
int bsc_mgcp_assign_patch(struct sccp_connections *, struct msgb *msg);
 | 
					 | 
				
			||||||
void bsc_mgcp_init(struct sccp_connections *);
 | 
					 | 
				
			||||||
void bsc_mgcp_dlcx(struct sccp_connections *);
 | 
					 | 
				
			||||||
void bsc_mgcp_free_endpoints(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
int bsc_mgcp_nat_init(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct sccp_connections *bsc_mgcp_find_con(struct bsc_nat *, int endpoint_number);
 | 
					 | 
				
			||||||
struct msgb *bsc_mgcp_rewrite(char *input, int length, int endp, const char *ip, int port);
 | 
					 | 
				
			||||||
void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void bsc_mgcp_clear_endpoints_for(struct bsc_connection *bsc);
 | 
					 | 
				
			||||||
int bsc_mgcp_parse_response(const char *str, int *code, char transaction[60]);
 | 
					 | 
				
			||||||
uint32_t bsc_mgcp_extract_ci(const char *resp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id);
 | 
					 | 
				
			||||||
int bsc_do_write(struct osmo_wqueue *queue, struct msgb *msg, int id);
 | 
					 | 
				
			||||||
int bsc_write_msg(struct osmo_wqueue *queue, struct msgb *msg);
 | 
					 | 
				
			||||||
int bsc_write_cb(struct osmo_fd *bfd, struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* IMSI allow/deny handling */
 | 
					 | 
				
			||||||
struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct bsc_nat *nat, const char *name);
 | 
					 | 
				
			||||||
struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(struct bsc_nat *nat, const char *name);
 | 
					 | 
				
			||||||
void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bsc_nat_acc_lst_entry *bsc_nat_acc_lst_entry_create(struct bsc_nat_acc_lst *);
 | 
					 | 
				
			||||||
int bsc_nat_lst_check_allow(struct bsc_nat_acc_lst *lst, const char *imsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int bsc_nat_msc_is_connected(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int bsc_conn_type_to_ctr(struct sccp_connections *conn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm48_hdr *bsc_unpack_dtap(struct bsc_nat_parsed *parsed, struct msgb *msg, uint32_t *len);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** USSD filtering */
 | 
					 | 
				
			||||||
int bsc_ussd_init(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
 | 
					 | 
				
			||||||
int bsc_close_ussd_connections(struct bsc_nat *nat);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct msgb *bsc_nat_rewrite_msg(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** paging group handling */
 | 
					 | 
				
			||||||
struct bsc_nat_paging_group *bsc_nat_paging_group_num(struct bsc_nat *nat, int group);
 | 
					 | 
				
			||||||
struct bsc_nat_paging_group *bsc_nat_paging_group_create(struct bsc_nat *nat, int group);
 | 
					 | 
				
			||||||
void bsc_nat_paging_group_delete(struct bsc_nat_paging_group *);
 | 
					 | 
				
			||||||
void bsc_nat_paging_group_add_lac(struct bsc_nat_paging_group *grp, int lac);
 | 
					 | 
				
			||||||
void bsc_nat_paging_group_del_lac(struct bsc_nat_paging_group *grp, int lac);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Number rewriting support below
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_nat_num_rewr_entry {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	regex_t msisdn_reg;
 | 
					 | 
				
			||||||
	regex_t num_reg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *replace;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void bsc_nat_num_rewr_entry_adapt(void *ctx, struct llist_head *head, const struct osmo_config_list *);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,98 +0,0 @@
 | 
				
			|||||||
/* NAT utilities using SCCP types */
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
					 | 
				
			||||||
 * (C) 2010 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 BSC_NAT_SCCP_H
 | 
					 | 
				
			||||||
#define BSC_NAT_SCCP_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/sccp/sccp_types.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * For the NAT we will need to analyze and later patch
 | 
					 | 
				
			||||||
 * the received message. This would require us to parse
 | 
					 | 
				
			||||||
 * the IPA and SCCP header twice. Instead of doing this
 | 
					 | 
				
			||||||
 * we will have one analyze structure and have the patching
 | 
					 | 
				
			||||||
 * and filter operate on the same structure.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct bsc_nat_parsed {
 | 
					 | 
				
			||||||
	/* ip access prototype */
 | 
					 | 
				
			||||||
	int ipa_proto;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* source local reference */
 | 
					 | 
				
			||||||
	struct sccp_source_reference *src_local_ref;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* destination local reference */
 | 
					 | 
				
			||||||
	struct sccp_source_reference *dest_local_ref;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* called ssn number */
 | 
					 | 
				
			||||||
	int called_ssn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* calling ssn number */
 | 
					 | 
				
			||||||
	int calling_ssn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* sccp message type */
 | 
					 | 
				
			||||||
	int sccp_type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* bssap type, e.g. 0 for BSS Management */
 | 
					 | 
				
			||||||
	int bssap;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* the gsm0808 message type */
 | 
					 | 
				
			||||||
	int gsm_type;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Per SCCP source local reference patch table. It needs to
 | 
					 | 
				
			||||||
 * be updated on new SCCP connections, connection confirm and reject,
 | 
					 | 
				
			||||||
 * and on the loss of the BSC connection.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct sccp_connections {
 | 
					 | 
				
			||||||
	struct llist_head list_entry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct bsc_connection *bsc;
 | 
					 | 
				
			||||||
	struct bsc_msc_connection *msc_con;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct sccp_source_reference real_ref;
 | 
					 | 
				
			||||||
	struct sccp_source_reference patched_ref;
 | 
					 | 
				
			||||||
	struct sccp_source_reference remote_ref;
 | 
					 | 
				
			||||||
	int has_remote_ref;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* status */
 | 
					 | 
				
			||||||
	int con_type;
 | 
					 | 
				
			||||||
	int con_local;
 | 
					 | 
				
			||||||
	int authorized;
 | 
					 | 
				
			||||||
	int imsi_checked;
 | 
					 | 
				
			||||||
	char *imsi;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* remember which Transactions we run over the bypass */
 | 
					 | 
				
			||||||
	char ussd_ti[8];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * audio handling. Remember if we have ever send a CRCX,
 | 
					 | 
				
			||||||
	 * remember the endpoint used by the MSC and BSC.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	int msc_endp;
 | 
					 | 
				
			||||||
	int bsc_endp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* timeout handling */
 | 
					 | 
				
			||||||
	struct timespec creation_time;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -10,10 +10,10 @@ enum bsc_rllr_ind {
 | 
				
			|||||||
	BSC_RLLR_IND_TIMEOUT,
 | 
						BSC_RLLR_IND_TIMEOUT,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int rll_establish(struct gsm_lchan *lchan, uint8_t link_id,
 | 
					int rll_establish(struct gsm_lchan *lchan, u_int8_t link_id,
 | 
				
			||||||
		  void (*cb)(struct gsm_lchan *, uint8_t, void *,
 | 
							  void (*cb)(struct gsm_lchan *, u_int8_t, void *,
 | 
				
			||||||
			     enum bsc_rllr_ind),
 | 
								     enum bsc_rllr_ind),
 | 
				
			||||||
		  void *data);
 | 
							  void *data);
 | 
				
			||||||
void rll_indication(struct gsm_lchan *lchan, uint8_t link_id, uint8_t type);
 | 
					void rll_indication(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _BSC_RLL_H */
 | 
					#endif /* _BSC_RLL_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +0,0 @@
 | 
				
			|||||||
#ifndef _BSS_H_
 | 
					 | 
				
			||||||
#define _BSS_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_network;
 | 
					 | 
				
			||||||
struct msgb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* start and stop network */
 | 
					 | 
				
			||||||
extern int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), const char *cfg_file);
 | 
					 | 
				
			||||||
extern int bsc_shutdown_net(struct gsm_network *net);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* register all supported BTS */
 | 
					 | 
				
			||||||
extern int bts_init(void);
 | 
					 | 
				
			||||||
extern int bts_model_bs11_init(void);
 | 
					 | 
				
			||||||
extern int bts_model_rbs2k_init(void);
 | 
					 | 
				
			||||||
extern int bts_model_nanobts_init(void);
 | 
					 | 
				
			||||||
extern int bts_model_hslfemto_init(void);
 | 
					 | 
				
			||||||
extern int bts_model_nokia_site_init(void);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
							
								
								
									
										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
 | 
				
			||||||
@@ -4,25 +4,46 @@
 | 
				
			|||||||
 * All Rights Reserved
 | 
					 * All Rights Reserved
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 * GNU Affero General Public License for more details.
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 * You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef _CHAN_ALLOC_H
 | 
				
			||||||
#define _CHAN_ALLOC_H
 | 
					#define _CHAN_ALLOC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "gsm_data.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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_subscriber_connection;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Special allocator for C0 of BTS */
 | 
					/* Special allocator for C0 of BTS */
 | 
				
			||||||
struct gsm_bts_trx_ts *ts_c0_alloc(struct gsm_bts *bts,
 | 
					struct gsm_bts_trx_ts *ts_c0_alloc(struct gsm_bts *bts,
 | 
				
			||||||
@@ -35,31 +56,19 @@ struct gsm_bts_trx_ts *ts_alloc(struct gsm_bts *bts,
 | 
				
			|||||||
/* Regular physical channel (TS) */
 | 
					/* Regular physical channel (TS) */
 | 
				
			||||||
void ts_free(struct gsm_bts_trx_ts *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 */
 | 
					/* Find an allocated channel for a specified subscriber */
 | 
				
			||||||
struct gsm_subscriber_connection *connection_for_subscr(struct gsm_subscriber *subscr);
 | 
					struct gsm_lchan *lchan_for_subscr(struct gsm_subscriber *subscr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Allocate a logical channel (SDCCH, TCH, ...) */
 | 
					/* Allocate a logical channel (SDCCH, TCH, ...) */
 | 
				
			||||||
struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type, int allow_bigger);
 | 
					struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Free a logical channel (SDCCH, TCH, ...) */
 | 
					/* Free a logical channel (SDCCH, TCH, ...) */
 | 
				
			||||||
void lchan_free(struct gsm_lchan *lchan);
 | 
					void lchan_free(struct gsm_lchan *lchan);
 | 
				
			||||||
void lchan_reset(struct gsm_lchan *lchan);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Release the given lchan */
 | 
					/* internal.. do not use */
 | 
				
			||||||
int lchan_release(struct gsm_lchan *lchan, int sach_deact, int reason);
 | 
					int _lchan_release(struct gsm_lchan *lchan);
 | 
				
			||||||
 | 
					 | 
				
			||||||
struct load_counter {
 | 
					 | 
				
			||||||
	unsigned int total;
 | 
					 | 
				
			||||||
	unsigned int used;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct pchan_load {
 | 
					 | 
				
			||||||
	struct load_counter pchan[GSM_PCHAN_UNKNOWN];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void bts_chan_load(struct pchan_load *cl, const struct gsm_bts *bts);
 | 
					 | 
				
			||||||
void network_chan_load(struct pchan_load *pl, struct gsm_network *net);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int trx_is_usable(struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _CHAN_ALLOC_H */
 | 
					#endif /* _CHAN_ALLOC_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,155 +0,0 @@
 | 
				
			|||||||
#ifndef _CONTROL_CMD_H
 | 
					 | 
				
			||||||
#define _CONTROL_CMD_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/write_queue.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/vty/vector.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CTRL_CMD_ERROR		-1
 | 
					 | 
				
			||||||
#define CTRL_CMD_HANDLED	0
 | 
					 | 
				
			||||||
#define CTRL_CMD_REPLY		1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum ctrl_node_type {
 | 
					 | 
				
			||||||
	CTRL_NODE_ROOT,	/* Root elements */
 | 
					 | 
				
			||||||
	CTRL_NODE_NET,	/* Network specific (net.) */
 | 
					 | 
				
			||||||
	CTRL_NODE_BTS,	/* BTS specific (net.btsN.) */
 | 
					 | 
				
			||||||
	CTRL_NODE_TRX,	/* TRX specific (net.btsN.trxM.) */
 | 
					 | 
				
			||||||
	CTRL_NODE_TS,	/* TS specific (net.btsN.trxM.tsI.) */
 | 
					 | 
				
			||||||
	_LAST_CTRL_NODE
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum ctrl_type {
 | 
					 | 
				
			||||||
	CTRL_TYPE_UNKNOWN,
 | 
					 | 
				
			||||||
	CTRL_TYPE_GET,
 | 
					 | 
				
			||||||
	CTRL_TYPE_SET,
 | 
					 | 
				
			||||||
	CTRL_TYPE_GET_REPLY,
 | 
					 | 
				
			||||||
	CTRL_TYPE_SET_REPLY,
 | 
					 | 
				
			||||||
	CTRL_TYPE_TRAP,
 | 
					 | 
				
			||||||
	CTRL_TYPE_ERROR
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ctrl_connection {
 | 
					 | 
				
			||||||
	struct llist_head list_entry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The queue for sending data back */
 | 
					 | 
				
			||||||
	struct osmo_wqueue write_queue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Callback if the connection was closed */
 | 
					 | 
				
			||||||
	void (*closed_cb)(struct ctrl_connection *conn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Pending commands for this connection */
 | 
					 | 
				
			||||||
	struct llist_head cmds;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ctrl_cmd {
 | 
					 | 
				
			||||||
	struct ctrl_connection *ccon;
 | 
					 | 
				
			||||||
	enum ctrl_type type;
 | 
					 | 
				
			||||||
	char *id;
 | 
					 | 
				
			||||||
	void *node;
 | 
					 | 
				
			||||||
	char *variable;
 | 
					 | 
				
			||||||
	char *value;
 | 
					 | 
				
			||||||
	char *reply;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ctrl_cmd_struct {
 | 
					 | 
				
			||||||
	int nr_commands;
 | 
					 | 
				
			||||||
	char **command;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ctrl_cmd_element {
 | 
					 | 
				
			||||||
	const char *name;
 | 
					 | 
				
			||||||
	const char *param;
 | 
					 | 
				
			||||||
	struct ctrl_cmd_struct strcmd;
 | 
					 | 
				
			||||||
	int (*set)(struct ctrl_cmd *cmd, void *data);
 | 
					 | 
				
			||||||
	int (*get)(struct ctrl_cmd *cmd, void *data);
 | 
					 | 
				
			||||||
	int (*verify)(struct ctrl_cmd *cmd, const char *value, void *data);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ctrl_cmd_map {
 | 
					 | 
				
			||||||
	char *cmd;
 | 
					 | 
				
			||||||
	enum ctrl_type type;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int ctrl_cmd_exec(vector vline, struct ctrl_cmd *command, vector node, void *data);
 | 
					 | 
				
			||||||
int ctrl_cmd_install(enum ctrl_node_type node, struct ctrl_cmd_element *cmd);
 | 
					 | 
				
			||||||
int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data);
 | 
					 | 
				
			||||||
int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd);
 | 
					 | 
				
			||||||
struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg);
 | 
					 | 
				
			||||||
struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd);
 | 
					 | 
				
			||||||
struct ctrl_cmd *ctrl_cmd_cpy(void *ctx, struct ctrl_cmd *cmd);
 | 
					 | 
				
			||||||
struct ctrl_cmd *ctrl_cmd_create(void *ctx, enum ctrl_type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CTRL_CMD_DEFINE_RANGE(cmdname, cmdstr, dtype, element, min, max) \
 | 
					 | 
				
			||||||
static int get_##cmdname(struct ctrl_cmd *cmd, void *data) \
 | 
					 | 
				
			||||||
{ \
 | 
					 | 
				
			||||||
	dtype *node = data; \
 | 
					 | 
				
			||||||
	cmd->reply = talloc_asprintf(cmd, "%i", node->element); \
 | 
					 | 
				
			||||||
	if (!cmd->reply) { \
 | 
					 | 
				
			||||||
		cmd->reply = "OOM"; \
 | 
					 | 
				
			||||||
		return CTRL_CMD_ERROR; \
 | 
					 | 
				
			||||||
	} \
 | 
					 | 
				
			||||||
	return CTRL_CMD_REPLY; \
 | 
					 | 
				
			||||||
} \
 | 
					 | 
				
			||||||
static int set_##cmdname(struct ctrl_cmd *cmd, void *data) \
 | 
					 | 
				
			||||||
{ \
 | 
					 | 
				
			||||||
	dtype *node = data; \
 | 
					 | 
				
			||||||
	int tmp = atoi(cmd->value); \
 | 
					 | 
				
			||||||
	node->element = tmp; \
 | 
					 | 
				
			||||||
	return get_##cmdname(cmd, data); \
 | 
					 | 
				
			||||||
} \
 | 
					 | 
				
			||||||
static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data) \
 | 
					 | 
				
			||||||
{ \
 | 
					 | 
				
			||||||
	int tmp = atoi(value); \
 | 
					 | 
				
			||||||
	if ((tmp >= min)&&(tmp <= max)) { \
 | 
					 | 
				
			||||||
		return 0; \
 | 
					 | 
				
			||||||
	} \
 | 
					 | 
				
			||||||
	return -1; \
 | 
					 | 
				
			||||||
} \
 | 
					 | 
				
			||||||
struct ctrl_cmd_element cmd_##cmdname = { \
 | 
					 | 
				
			||||||
	.name = cmdstr, \
 | 
					 | 
				
			||||||
	.param = NULL, \
 | 
					 | 
				
			||||||
	.get = &get_##cmdname, \
 | 
					 | 
				
			||||||
	.set = &set_##cmdname, \
 | 
					 | 
				
			||||||
	.verify = &verify_##cmdname, \
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CTRL_CMD_DEFINE_STRING(cmdname, cmdstr, dtype, element) \
 | 
					 | 
				
			||||||
static int get_##cmdname(struct ctrl_cmd *cmd, dtype *data) \
 | 
					 | 
				
			||||||
{ \
 | 
					 | 
				
			||||||
	cmd->reply = talloc_asprintf(cmd, "%s", data->element); \
 | 
					 | 
				
			||||||
	if (!cmd->reply) { \
 | 
					 | 
				
			||||||
		cmd->reply = "OOM"; \
 | 
					 | 
				
			||||||
		return CTRL_CMD_ERROR; \
 | 
					 | 
				
			||||||
	} \
 | 
					 | 
				
			||||||
	return CTRL_CMD_REPLY; \
 | 
					 | 
				
			||||||
} \
 | 
					 | 
				
			||||||
static int set_##cmdname(struct ctrl_cmd *cmd, dtype *data) \
 | 
					 | 
				
			||||||
{ \
 | 
					 | 
				
			||||||
	bsc_replace_string(cmd->node, &data->element, cmd->value); \
 | 
					 | 
				
			||||||
	return get_##cmdname(cmd, data); \
 | 
					 | 
				
			||||||
} \
 | 
					 | 
				
			||||||
struct ctrl_cmd_element cmd_##cmdname = { \
 | 
					 | 
				
			||||||
	.name = cmdstr, \
 | 
					 | 
				
			||||||
	.param = NULL, \
 | 
					 | 
				
			||||||
	.get = &get_##cmdname, \
 | 
					 | 
				
			||||||
	.set = &set_##cmdname, \
 | 
					 | 
				
			||||||
	.verify = NULL, \
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CTRL_CMD_DEFINE(cmdname, cmdstr) \
 | 
					 | 
				
			||||||
static int get_##cmdname(struct ctrl_cmd *cmd, void *data); \
 | 
					 | 
				
			||||||
static int set_##cmdname(struct ctrl_cmd *cmd, void *data); \
 | 
					 | 
				
			||||||
static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data); \
 | 
					 | 
				
			||||||
struct ctrl_cmd_element cmd_##cmdname = { \
 | 
					 | 
				
			||||||
	.name = cmdstr, \
 | 
					 | 
				
			||||||
	.param = NULL, \
 | 
					 | 
				
			||||||
	.get = &get_##cmdname, \
 | 
					 | 
				
			||||||
	.set = &set_##cmdname, \
 | 
					 | 
				
			||||||
	.verify = &verify_##cmdname, \
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_network;
 | 
					 | 
				
			||||||
int controlif_setup(struct gsm_network *gsmnet, uint16_t port);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _CONTROL_CMD_H */
 | 
					 | 
				
			||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
#ifndef _CONTROL_IF_H
 | 
					 | 
				
			||||||
#define _CONTROL_IF_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/write_queue.h>
 | 
					 | 
				
			||||||
#include <openbsc/control_cmd.h>
 | 
					 | 
				
			||||||
#include <openbsc/gsm_data.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd);
 | 
					 | 
				
			||||||
int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data);
 | 
					 | 
				
			||||||
int controlif_setup(struct gsm_network *gsmnet, uint16_t port);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _CONTROL_IF_H */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,10 +0,0 @@
 | 
				
			|||||||
#ifndef _CRC24_H
 | 
					 | 
				
			||||||
#define _CRC24_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define INIT_CRC24	0xffffff
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint32_t crc24_calc(uint32_t fcs, uint8_t *cp, unsigned int len);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -3,79 +3,54 @@
 | 
				
			|||||||
 * All Rights Reserved
 | 
					 * All Rights Reserved
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 * GNU Affero General Public License for more details.
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 * You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef _DB_H
 | 
				
			||||||
#define _DB_H
 | 
					#define _DB_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "gsm_subscriber.h"
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_equipment;
 | 
					#include <openbsc/gsm_subscriber.h>
 | 
				
			||||||
struct gsm_network;
 | 
					 | 
				
			||||||
struct gsm_auth_info;
 | 
					 | 
				
			||||||
struct gsm_auth_tuple;
 | 
					 | 
				
			||||||
struct gsm_sms;
 | 
					 | 
				
			||||||
struct gsm_subscriber;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* one time initialisation */
 | 
					/* one time initialisation */
 | 
				
			||||||
int db_init(const char *name);
 | 
					int db_init(const char *name);
 | 
				
			||||||
int db_prepare(void);
 | 
					int db_prepare();
 | 
				
			||||||
int db_fini(void);
 | 
					int db_fini();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* subscriber management */
 | 
					/* subscriber management */
 | 
				
			||||||
struct gsm_subscriber *db_create_subscriber(struct gsm_network *net,
 | 
					struct gsm_subscriber* db_create_subscriber(struct gsm_network *net,
 | 
				
			||||||
					    char *imsi);
 | 
										    char *imsi);
 | 
				
			||||||
struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
 | 
					struct gsm_subscriber* db_get_subscriber(struct gsm_network *net,
 | 
				
			||||||
					 enum gsm_subscriber_field field,
 | 
										 enum gsm_subscriber_field field,
 | 
				
			||||||
					 const char *subscr);
 | 
										 const char *subscr);
 | 
				
			||||||
int db_sync_subscriber(struct gsm_subscriber *subscriber);
 | 
					int db_sync_subscriber(struct gsm_subscriber* subscriber);
 | 
				
			||||||
int db_subscriber_alloc_tmsi(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_exten(struct gsm_subscriber* subscriber);
 | 
				
			||||||
int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, uint32_t* token);
 | 
					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_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char *imei);
 | 
				
			||||||
int db_sync_equipment(struct gsm_equipment *equip);
 | 
					int db_sync_equipment(struct gsm_equipment *equip);
 | 
				
			||||||
int db_subscriber_update(struct gsm_subscriber *subscriber);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* auth info */
 | 
					 | 
				
			||||||
int db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo,
 | 
					 | 
				
			||||||
                               struct gsm_subscriber *subscr);
 | 
					 | 
				
			||||||
int db_sync_authinfo_for_subscr(struct gsm_auth_info *ainfo,
 | 
					 | 
				
			||||||
                                struct gsm_subscriber *subscr);
 | 
					 | 
				
			||||||
int db_get_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
 | 
					 | 
				
			||||||
                                    struct gsm_subscriber *subscr);
 | 
					 | 
				
			||||||
int db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
 | 
					 | 
				
			||||||
                                     struct gsm_subscriber *subscr);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SMS store-and-forward */
 | 
					/* SMS store-and-forward */
 | 
				
			||||||
int db_sms_store(struct gsm_sms *sms);
 | 
					int db_sms_store(struct gsm_sms *sms);
 | 
				
			||||||
struct gsm_sms *db_sms_get(struct gsm_network *net, unsigned long long id);
 | 
					struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id);
 | 
				
			||||||
struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, unsigned long long min_id);
 | 
					 | 
				
			||||||
struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, unsigned long long min_subscr_id, unsigned int failed);
 | 
					 | 
				
			||||||
struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr);
 | 
					struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr);
 | 
				
			||||||
int db_sms_mark_sent(struct gsm_sms *sms);
 | 
					int db_sms_mark_sent(struct gsm_sms *sms);
 | 
				
			||||||
int db_sms_inc_deliver_attempts(struct gsm_sms *sms);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* APDU blob storage */
 | 
					/* APDU blob storage */
 | 
				
			||||||
int db_apdu_blob_store(struct gsm_subscriber *subscr, 
 | 
					int db_apdu_blob_store(struct gsm_subscriber *subscr, 
 | 
				
			||||||
			uint8_t apdu_id_flags, uint8_t len,
 | 
								u_int8_t apdu_id_flags, u_int8_t len,
 | 
				
			||||||
			uint8_t *apdu);
 | 
								u_int8_t *apdu);
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Statistics counter storage */
 | 
					 | 
				
			||||||
struct osmo_counter;
 | 
					 | 
				
			||||||
int db_store_counter(struct osmo_counter *ctr);
 | 
					 | 
				
			||||||
struct rate_ctr_group;
 | 
					 | 
				
			||||||
int db_store_rate_ctr_group(struct rate_ctr_group *ctrg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _DB_H */
 | 
					#endif /* _DB_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,67 +1,58 @@
 | 
				
			|||||||
#ifndef _DEBUG_H
 | 
					#ifndef _DEBUG_H
 | 
				
			||||||
#define _DEBUG_H
 | 
					#define _DEBUG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/linuxlist.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DEBUG
 | 
					#define DEBUG
 | 
				
			||||||
#include <osmocom/core/logging.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Debug Areas of the code */
 | 
					#define DRLL		0x0001
 | 
				
			||||||
enum {
 | 
					#define DCC		0x0002
 | 
				
			||||||
	DRLL,
 | 
					#define DMM		0x0004
 | 
				
			||||||
	DCC,
 | 
					#define DRR		0x0008
 | 
				
			||||||
	DMM,
 | 
					#define DRSL		0x0010
 | 
				
			||||||
	DRR,
 | 
					#define DNM		0x0020
 | 
				
			||||||
	DRSL,
 | 
					 | 
				
			||||||
	DNM,
 | 
					 | 
				
			||||||
	DMNCC,
 | 
					 | 
				
			||||||
	DSMS,
 | 
					 | 
				
			||||||
	DPAG,
 | 
					 | 
				
			||||||
	DMEAS,
 | 
					 | 
				
			||||||
	DSCCP,
 | 
					 | 
				
			||||||
	DMSC,
 | 
					 | 
				
			||||||
	DMGCP,
 | 
					 | 
				
			||||||
	DHO,
 | 
					 | 
				
			||||||
	DDB,
 | 
					 | 
				
			||||||
	DREF,
 | 
					 | 
				
			||||||
	DGPRS,
 | 
					 | 
				
			||||||
	DNS,
 | 
					 | 
				
			||||||
	DBSSGP,
 | 
					 | 
				
			||||||
	DLLC,
 | 
					 | 
				
			||||||
	DSNDCP,
 | 
					 | 
				
			||||||
	DNAT,
 | 
					 | 
				
			||||||
	DCTRL,
 | 
					 | 
				
			||||||
	Debug_LastEntry,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* context */
 | 
					#define DMNCC		0x0080
 | 
				
			||||||
#define BSC_CTX_LCHAN	0
 | 
					#define DSMS		0x0100
 | 
				
			||||||
#define BSC_CTX_SUBSCR	1
 | 
					#define DPAG		0x0200
 | 
				
			||||||
#define BSC_CTX_BTS	2
 | 
					#define DMEAS		0x0400
 | 
				
			||||||
#define BSC_CTX_SCCP	3
 | 
					 | 
				
			||||||
#define BSC_CTX_NSVC	4
 | 
					 | 
				
			||||||
#define BSC_CTX_BVC	5
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* target */
 | 
					#define DMI		0x1000
 | 
				
			||||||
 | 
					#define DMIB		0x2000
 | 
				
			||||||
 | 
					#define DMUX		0x4000
 | 
				
			||||||
 | 
					#define DINP		0x8000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					#define DSCCP		0x10000
 | 
				
			||||||
	//DEBUG_FILTER_ALL = 1 << 0,
 | 
					#define DMSC		0x20000
 | 
				
			||||||
	LOG_FILTER_IMSI = 1 << 1,
 | 
					 | 
				
			||||||
	LOG_FILTER_NSVC = 1 << 2,
 | 
					 | 
				
			||||||
	LOG_FILTER_BVC  = 1 << 3,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* we don't need a header dependency for this... */
 | 
					#define DMGCP		0x40000
 | 
				
			||||||
struct gprs_nsvc;
 | 
					 | 
				
			||||||
struct bssgp_bvc_ctx;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void log_set_imsi_filter(struct log_target *target, const char *imsi);
 | 
					#define DHO		0x80000
 | 
				
			||||||
void log_set_nsvc_filter(struct log_target *target,
 | 
					 | 
				
			||||||
			 struct gprs_nsvc *nsvc);
 | 
					 | 
				
			||||||
void log_set_bvc_filter(struct log_target *target,
 | 
					 | 
				
			||||||
			struct bssgp_bvc_ctx *bctx);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const struct log_info log_info;
 | 
					#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 */
 | 
					#endif /* _DEBUG_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +0,0 @@
 | 
				
			|||||||
#ifndef _E1_CONFIG_H
 | 
					 | 
				
			||||||
#define _E1_CONFIG_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <openbsc/gsm_data_shared.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _E1_CONFIG_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 */
 | 
				
			||||||
@@ -1,38 +0,0 @@
 | 
				
			|||||||
#ifndef _GB_PROXY_H
 | 
					 | 
				
			||||||
#define _GB_PROXY_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <openbsc/gprs_ns.h>
 | 
					 | 
				
			||||||
#include <osmocom/vty/command.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gbproxy_config {
 | 
					 | 
				
			||||||
	/* parsed from config file */
 | 
					 | 
				
			||||||
	uint16_t nsip_sgsn_nsei;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* misc */
 | 
					 | 
				
			||||||
	struct gprs_ns_inst *nsi;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct gbproxy_config gbcfg;
 | 
					 | 
				
			||||||
extern struct cmd_element show_gbproxy_cmd;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* gb_proxy_vty .c */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gbproxy_vty_init(void);
 | 
					 | 
				
			||||||
int gbproxy_parse_config(const char *config_file, struct gbproxy_config *cfg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* gb_proxy.c */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Main input function for Gb proxy */
 | 
					 | 
				
			||||||
int gbprox_rcvmsg(struct msgb *msg, struct gprs_nsvc *nsvc, uint16_t ns_bvci);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gbprox_signal(unsigned int subsys, unsigned int signal,
 | 
					 | 
				
			||||||
		  void *handler_data, void *signal_data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Reset all persistent NS-VC's */
 | 
					 | 
				
			||||||
int gbprox_reset_persistent_nsvcs(struct gprs_ns_inst *nsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -1,250 +0,0 @@
 | 
				
			|||||||
#ifndef _GPRS_BSSGP_H
 | 
					 | 
				
			||||||
#define _GPRS_BSSGP_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief Fixed BVCI definitions (Section 5.4.1) */
 | 
					 | 
				
			||||||
#define BVCI_SIGNALLING	0x0000
 | 
					 | 
				
			||||||
#define BVCI_PTM	0x0001
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP PDU types (Section 11.3.26 / Table 11.27) */
 | 
					 | 
				
			||||||
enum bssgp_pdu_type {
 | 
					 | 
				
			||||||
	/* PDUs between RL and BSSGP SAPs */
 | 
					 | 
				
			||||||
	BSSGP_PDUT_DL_UNITDATA		= 0x00,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_UL_UNITDATA		= 0x01,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RA_CAPABILITY	= 0x02,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_PTM_UNITDATA		= 0x03,
 | 
					 | 
				
			||||||
	/* PDUs between GMM SAPs */
 | 
					 | 
				
			||||||
	BSSGP_PDUT_PAGING_PS		= 0x06,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_PAGING_CS		= 0x07,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RA_CAPA_UDPATE	= 0x08,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RA_CAPA_UPDATE_ACK	= 0x09,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RADIO_STATUS		= 0x0a,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_SUSPEND		= 0x0b,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_SUSPEND_ACK		= 0x0c,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_SUSPEND_NACK		= 0x0d,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RESUME		= 0x0e,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RESUME_ACK		= 0x0f,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_RESUME_NACK		= 0x10,
 | 
					 | 
				
			||||||
	/* PDus between NM SAPs */
 | 
					 | 
				
			||||||
	BSSGP_PDUT_BVC_BLOCK		= 0x20,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_BVC_BLOCK_ACK	= 0x21,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_BVC_RESET		= 0x22,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_BVC_RESET_ACK	= 0x23,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_BVC_UNBLOCK		= 0x24,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_BVC_UNBLOCK_ACK	= 0x25,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_FLOW_CONTROL_BVC	= 0x26,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_FLOW_CONTROL_BVC_ACK	= 0x27,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_FLOW_CONTROL_MS	= 0x28,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_FLOW_CONTROL_MS_ACK	= 0x29,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_FLUSH_LL		= 0x2a,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_FLUSH_LL_ACK		= 0x2b,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_LLC_DISCARD		= 0x2c,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_SGSN_INVOKE_TRACE	= 0x40,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_STATUS		= 0x41,
 | 
					 | 
				
			||||||
	/* PDUs between PFM SAP's */
 | 
					 | 
				
			||||||
	BSSGP_PDUT_DOWNLOAD_BSS_PFC	= 0x50,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_CREATE_BSS_PFC	= 0x51,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_CREATE_BSS_PFC_ACK	= 0x52,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_CREATE_BSS_PFC_NACK	= 0x53,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_MODIFY_BSS_PFC	= 0x54,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_MODIFY_BSS_PFC_ACK	= 0x55,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_DELETE_BSS_PFC	= 0x56,
 | 
					 | 
				
			||||||
	BSSGP_PDUT_DELETE_BSS_PFC_ACK	= 0x57,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP User-Data header (Section 10.2.1 and 10.2.2) */
 | 
					 | 
				
			||||||
struct bssgp_ud_hdr {
 | 
					 | 
				
			||||||
	uint8_t pdu_type;	/*!< BSSGP PDU type */
 | 
					 | 
				
			||||||
	uint32_t tlli;		/*!< Temporary Link-Local Identifier */
 | 
					 | 
				
			||||||
	uint8_t qos_profile[3];	/*!< QoS profile */
 | 
					 | 
				
			||||||
	uint8_t data[0];	/* optional/conditional IEs as TLVs */
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP normal header */
 | 
					 | 
				
			||||||
struct bssgp_normal_hdr {
 | 
					 | 
				
			||||||
	uint8_t pdu_type;	/*!< BSSGP PDU type */
 | 
					 | 
				
			||||||
	uint8_t data[0];	/*!< optional/conditional IEs as TLVs */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP Information Element Identifiers */
 | 
					 | 
				
			||||||
enum bssgp_iei_type {
 | 
					 | 
				
			||||||
	BSSGP_IE_ALIGNMENT		= 0x00,
 | 
					 | 
				
			||||||
	BSSGP_IE_BMAX_DEFAULT_MS	= 0x01,
 | 
					 | 
				
			||||||
	BSSGP_IE_BSS_AREA_ID		= 0x02,
 | 
					 | 
				
			||||||
	BSSGP_IE_BUCKET_LEAK_RATE	= 0x03,
 | 
					 | 
				
			||||||
	BSSGP_IE_BVCI			= 0x04,
 | 
					 | 
				
			||||||
	BSSGP_IE_BVC_BUCKET_SIZE	= 0x05,
 | 
					 | 
				
			||||||
	BSSGP_IE_BVC_MEASUREMENT	= 0x06,
 | 
					 | 
				
			||||||
	BSSGP_IE_CAUSE			= 0x07,
 | 
					 | 
				
			||||||
	BSSGP_IE_CELL_ID		= 0x08,
 | 
					 | 
				
			||||||
	BSSGP_IE_CHAN_NEEDED		= 0x09,
 | 
					 | 
				
			||||||
	BSSGP_IE_DRX_PARAMS		= 0x0a,
 | 
					 | 
				
			||||||
	BSSGP_IE_EMLPP_PRIO		= 0x0b,
 | 
					 | 
				
			||||||
	BSSGP_IE_FLUSH_ACTION		= 0x0c,
 | 
					 | 
				
			||||||
	BSSGP_IE_IMSI			= 0x0d,
 | 
					 | 
				
			||||||
	BSSGP_IE_LLC_PDU		= 0x0e,
 | 
					 | 
				
			||||||
	BSSGP_IE_LLC_FRAMES_DISCARDED	= 0x0f,
 | 
					 | 
				
			||||||
	BSSGP_IE_LOCATION_AREA		= 0x10,
 | 
					 | 
				
			||||||
	BSSGP_IE_MOBILE_ID		= 0x11,
 | 
					 | 
				
			||||||
	BSSGP_IE_MS_BUCKET_SIZE		= 0x12,
 | 
					 | 
				
			||||||
	BSSGP_IE_MS_RADIO_ACCESS_CAP	= 0x13,
 | 
					 | 
				
			||||||
	BSSGP_IE_OMC_ID			= 0x14,
 | 
					 | 
				
			||||||
	BSSGP_IE_PDU_IN_ERROR		= 0x15,
 | 
					 | 
				
			||||||
	BSSGP_IE_PDU_LIFETIME		= 0x16,
 | 
					 | 
				
			||||||
	BSSGP_IE_PRIORITY		= 0x17,
 | 
					 | 
				
			||||||
	BSSGP_IE_QOS_PROFILE		= 0x18,
 | 
					 | 
				
			||||||
	BSSGP_IE_RADIO_CAUSE		= 0x19,
 | 
					 | 
				
			||||||
	BSSGP_IE_RA_CAP_UPD_CAUSE	= 0x1a,
 | 
					 | 
				
			||||||
	BSSGP_IE_ROUTEING_AREA		= 0x1b,
 | 
					 | 
				
			||||||
	BSSGP_IE_R_DEFAULT_MS		= 0x1c,
 | 
					 | 
				
			||||||
	BSSGP_IE_SUSPEND_REF_NR		= 0x1d,
 | 
					 | 
				
			||||||
	BSSGP_IE_TAG			= 0x1e,
 | 
					 | 
				
			||||||
	BSSGP_IE_TLLI			= 0x1f,
 | 
					 | 
				
			||||||
	BSSGP_IE_TMSI			= 0x20,
 | 
					 | 
				
			||||||
	BSSGP_IE_TRACE_REFERENC		= 0x21,
 | 
					 | 
				
			||||||
	BSSGP_IE_TRACE_TYPE		= 0x22,
 | 
					 | 
				
			||||||
	BSSGP_IE_TRANSACTION_ID		= 0x23,
 | 
					 | 
				
			||||||
	BSSGP_IE_TRIGGER_ID		= 0x24,
 | 
					 | 
				
			||||||
	BSSGP_IE_NUM_OCT_AFF		= 0x25,
 | 
					 | 
				
			||||||
	BSSGP_IE_LSA_ID_LIST		= 0x26,
 | 
					 | 
				
			||||||
	BSSGP_IE_LSA_INFORMATION	= 0x27,
 | 
					 | 
				
			||||||
	BSSGP_IE_PACKET_FLOW_ID		= 0x28,
 | 
					 | 
				
			||||||
	BSSGP_IE_PACKET_FLOW_TIMER	= 0x29,
 | 
					 | 
				
			||||||
	BSSGP_IE_AGG_BSS_QOS_PROFILE	= 0x3a,
 | 
					 | 
				
			||||||
	BSSGP_IE_FEATURE_BITMAP		= 0x3b,
 | 
					 | 
				
			||||||
	BSSGP_IE_BUCKET_FULL_RATIO	= 0x3c,
 | 
					 | 
				
			||||||
	BSSGP_IE_SERVICE_UTRAN_CCO	= 0x3d,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief Cause coding (Section 11.3.8 / Table 11.10) */
 | 
					 | 
				
			||||||
enum gprs_bssgp_cause {
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_PROC_OVERLOAD	= 0x00,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_EQUIP_FAIL		= 0x01,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_TRASIT_NET_FAIL	= 0x02,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_CAPA_GREATER_0KPBS	= 0x03,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_UNKNOWN_MS		= 0x04,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_UNKNOWN_BVCI	= 0x05,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_CELL_TRAF_CONG	= 0x06,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_SGSN_CONG		= 0x07,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_OML_INTERV		= 0x08,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_BVCI_BLOCKED	= 0x09,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_PFC_CREATE_FAIL	= 0x0a,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_SEM_INCORR_PDU	= 0x20,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_INV_MAND_INF	= 0x21,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_MISSING_MAND_IE	= 0x22,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_MISSING_COND_IE	= 0x23,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_UNEXP_COND_IE	= 0x24,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_COND_IE_ERR		= 0x25,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_PDU_INCOMP_STATE	= 0x26,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_PROTO_ERR_UNSPEC	= 0x27,
 | 
					 | 
				
			||||||
	BSSGP_CAUSE_PDU_INCOMP_FEAT	= 0x28,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Our implementation */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* gprs_bssgp_util.c */
 | 
					 | 
				
			||||||
extern struct gprs_ns_inst *bssgp_nsi;
 | 
					 | 
				
			||||||
struct msgb *bssgp_msgb_alloc(void);
 | 
					 | 
				
			||||||
const char *bssgp_cause_str(enum gprs_bssgp_cause cause);
 | 
					 | 
				
			||||||
/* Transmit a simple response such as BLOCK/UNBLOCK/RESET ACK/NACK */
 | 
					 | 
				
			||||||
int bssgp_tx_simple_bvci(uint8_t pdu_type, uint16_t nsei,
 | 
					 | 
				
			||||||
			 uint16_t bvci, uint16_t ns_bvci);
 | 
					 | 
				
			||||||
/* Chapter 10.4.14: Status */
 | 
					 | 
				
			||||||
int bssgp_tx_status(uint8_t cause, uint16_t *bvci, struct msgb *orig_msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* gprs_bssgp.c */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BVC_S_BLOCKED	0x0001
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* The per-BTS context that we keep on the SGSN side of the BSSGP link */
 | 
					 | 
				
			||||||
struct bssgp_bvc_ctx {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gprs_ra_id ra_id; /*!< parsed RA ID of the remote BTS */
 | 
					 | 
				
			||||||
	uint16_t cell_id; /*!< Cell ID of the remote BTS */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* NSEI and BVCI of underlying Gb link.  Together they
 | 
					 | 
				
			||||||
	 * uniquely identify a link to a BTS (5.4.4) */
 | 
					 | 
				
			||||||
	uint16_t bvci;
 | 
					 | 
				
			||||||
	uint16_t nsei;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint32_t state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct rate_ctr_group *ctrg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* we might want to add this as a shortcut later, avoiding the NSVC
 | 
					 | 
				
			||||||
	 * lookup for every packet, similar to a routing cache */
 | 
					 | 
				
			||||||
	//struct gprs_nsvc *nsvc;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
extern struct llist_head bssgp_bvc_ctxts;
 | 
					 | 
				
			||||||
/* Find a BTS Context based on parsed RA ID and Cell ID */
 | 
					 | 
				
			||||||
struct bssgp_bvc_ctx *btsctx_by_raid_cid(const struct gprs_ra_id *raid, uint16_t cid);
 | 
					 | 
				
			||||||
/* Find a BTS context based on BVCI+NSEI tuple */
 | 
					 | 
				
			||||||
struct bssgp_bvc_ctx *btsctx_by_bvci_nsei(uint16_t bvci, uint16_t nsei);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BVC_F_BLOCKED	0x0001
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum bssgp_ctr {
 | 
					 | 
				
			||||||
	BSSGP_CTR_PKTS_IN,
 | 
					 | 
				
			||||||
	BSSGP_CTR_PKTS_OUT,
 | 
					 | 
				
			||||||
	BSSGP_CTR_BYTES_IN,
 | 
					 | 
				
			||||||
	BSSGP_CTR_BYTES_OUT,
 | 
					 | 
				
			||||||
	BSSGP_CTR_BLOCKED,
 | 
					 | 
				
			||||||
	BSSGP_CTR_DISCARDED,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/gsm/tlv.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* BSSGP-UL-UNITDATA.ind */
 | 
					 | 
				
			||||||
int gprs_bssgp_rcvmsg(struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* BSSGP-DL-UNITDATA.req */
 | 
					 | 
				
			||||||
struct sgsn_mm_ctx;
 | 
					 | 
				
			||||||
int gprs_bssgp_tx_dl_ud(struct msgb *msg, struct sgsn_mm_ctx *mmctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t bssgp_parse_cell_id(struct gprs_ra_id *raid, const uint8_t *buf);
 | 
					 | 
				
			||||||
int bssgp_create_cell_id(uint8_t *buf, const struct gprs_ra_id *raid,
 | 
					 | 
				
			||||||
			 uint16_t cid);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Wrapper around TLV parser to parse BSSGP IEs */
 | 
					 | 
				
			||||||
static inline int bssgp_tlv_parse(struct tlv_parsed *tp, uint8_t *buf, int len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return tlv_parse(tp, &tvlv_att_def, buf, len, 0, 0);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP Paging mode */
 | 
					 | 
				
			||||||
enum bssgp_paging_mode {
 | 
					 | 
				
			||||||
	BSSGP_PAGING_PS,
 | 
					 | 
				
			||||||
	BSSGP_PAGING_CS,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP Paging scope */
 | 
					 | 
				
			||||||
enum bssgp_paging_scope {
 | 
					 | 
				
			||||||
	BSSGP_PAGING_BSS_AREA,		/*!< all cells in BSS */
 | 
					 | 
				
			||||||
	BSSGP_PAGING_LOCATION_AREA,	/*!< all cells in LA */
 | 
					 | 
				
			||||||
	BSSGP_PAGING_ROUTEING_AREA,	/*!< all cells in RA */
 | 
					 | 
				
			||||||
	BSSGP_PAGING_BVCI,		/*!< one cell */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief BSSGP paging information */
 | 
					 | 
				
			||||||
struct bssgp_paging_info {
 | 
					 | 
				
			||||||
	enum bssgp_paging_mode mode;	/*!< CS or PS paging */
 | 
					 | 
				
			||||||
	enum bssgp_paging_scope scope;	/*!< bssgp_paging_scope */
 | 
					 | 
				
			||||||
	struct gprs_ra_id raid;		/*!< RA Identifier */
 | 
					 | 
				
			||||||
	uint16_t bvci;			/*!< BVCI */
 | 
					 | 
				
			||||||
	char *imsi;			/*!< IMSI, if any */
 | 
					 | 
				
			||||||
	uint32_t *ptmsi;		/*!< P-TMSI, if any */
 | 
					 | 
				
			||||||
	uint16_t drx_params;		/*!< DRX parameters */
 | 
					 | 
				
			||||||
	uint8_t qos[3];			/*!< QoS parameters */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Send a single GMM-PAGING.req to a given NSEI/NS-BVCI */
 | 
					 | 
				
			||||||
int gprs_bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci,
 | 
					 | 
				
			||||||
			 struct bssgp_paging_info *pinfo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* gprs_bssgp_vty.c */
 | 
					 | 
				
			||||||
int gprs_bssgp_vty_init(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _GPRS_BSSGP_H */
 | 
					 | 
				
			||||||
@@ -1,19 +0,0 @@
 | 
				
			|||||||
#ifndef _GPRS_GMM_H
 | 
					 | 
				
			||||||
#define _GPRS_GMM_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					 | 
				
			||||||
#include <openbsc/gprs_sgsn.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gsm48_tx_gsm_deact_pdp_req(struct sgsn_pdp_ctx *pdp, uint8_t sm_cause);
 | 
					 | 
				
			||||||
int gsm48_tx_gsm_act_pdp_rej(struct sgsn_mm_ctx *mm, uint8_t tid,
 | 
					 | 
				
			||||||
			     uint8_t cause, uint8_t pco_len, uint8_t *pco_v);
 | 
					 | 
				
			||||||
int gsm48_tx_gsm_act_pdp_acc(struct sgsn_pdp_ctx *pdp);
 | 
					 | 
				
			||||||
int gsm48_tx_gsm_deact_pdp_acc(struct sgsn_pdp_ctx *pdp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gsm0408_gprs_rcvmsg(struct msgb *msg, struct gprs_llc_llme *llme);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gprs_gmm_rx_suspend(struct gprs_ra_id *raid, uint32_t tlli);
 | 
					 | 
				
			||||||
int gprs_gmm_rx_resume(struct gprs_ra_id *raid, uint32_t tlli,
 | 
					 | 
				
			||||||
		       uint8_t suspend_ref);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _GPRS_GMM_H */
 | 
					 | 
				
			||||||
@@ -1,198 +0,0 @@
 | 
				
			|||||||
#ifndef _GPRS_LLC_H
 | 
					 | 
				
			||||||
#define _GPRS_LLC_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <openbsc/gprs_sgsn.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 4.7 LLC Layer Structure */
 | 
					 | 
				
			||||||
enum gprs_llc_sapi {
 | 
					 | 
				
			||||||
	GPRS_SAPI_GMM		= 1,
 | 
					 | 
				
			||||||
	GPRS_SAPI_TOM2		= 2,
 | 
					 | 
				
			||||||
	GPRS_SAPI_SNDCP3	= 3,
 | 
					 | 
				
			||||||
	GPRS_SAPI_SNDCP5	= 5,
 | 
					 | 
				
			||||||
	GPRS_SAPI_SMS		= 7,
 | 
					 | 
				
			||||||
	GPRS_SAPI_TOM8		= 8,
 | 
					 | 
				
			||||||
	GPRS_SAPI_SNDCP9	= 9,
 | 
					 | 
				
			||||||
	GPRS_SAPI_SNDCP11	= 11,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 6.4 Commands and Responses */
 | 
					 | 
				
			||||||
enum gprs_llc_u_cmd {
 | 
					 | 
				
			||||||
	GPRS_LLC_U_DM_RESP		= 0x01,
 | 
					 | 
				
			||||||
	GPRS_LLC_U_DISC_CMD		= 0x04,
 | 
					 | 
				
			||||||
	GPRS_LLC_U_UA_RESP		= 0x06,
 | 
					 | 
				
			||||||
	GPRS_LLC_U_SABM_CMD		= 0x07,
 | 
					 | 
				
			||||||
	GPRS_LLC_U_FRMR_RESP		= 0x08,
 | 
					 | 
				
			||||||
	GPRS_LLC_U_XID			= 0x0b,
 | 
					 | 
				
			||||||
	GPRS_LLC_U_NULL_CMD		= 0x00,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 6.4.1.6 / Table 6 */
 | 
					 | 
				
			||||||
enum gprs_llc_xid_type {
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_VERSION		= 0,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_IOV_UI		= 1,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_IOV_I		= 2,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_T200		= 3,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_N200		= 4,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_N201_U		= 5,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_N201_I		= 6,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_mD		= 7,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_mU		= 8,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_kD		= 9,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_kU		= 10,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_L3_PAR		= 11,
 | 
					 | 
				
			||||||
	GPRS_LLC_XID_T_RESET		= 12,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* TS 04.64 Section 7.1.2 Table 7: LLC layer primitives (GMM/SNDCP/SMS/TOM) */
 | 
					 | 
				
			||||||
/* TS 04.65 Section 5.1.2 Table 2: Service primitives used by SNDCP */
 | 
					 | 
				
			||||||
enum gprs_llc_primitive {
 | 
					 | 
				
			||||||
	/* GMM <-> LLME */
 | 
					 | 
				
			||||||
	LLGMM_ASSIGN_REQ,	/* GMM tells us new TLLI: TLLI old, TLLI new, Kc, CiphAlg */
 | 
					 | 
				
			||||||
	LLGMM_RESET_REQ,	/* GMM tells us to perform XID negotiation: TLLI */
 | 
					 | 
				
			||||||
	LLGMM_RESET_CNF,	/* LLC informs GMM that XID has completed: TLLI */
 | 
					 | 
				
			||||||
	LLGMM_SUSPEND_REQ,	/* GMM tells us MS has suspended: TLLI, Page */
 | 
					 | 
				
			||||||
	LLGMM_RESUME_REQ,	/* GMM tells us MS has resumed: TLLI */
 | 
					 | 
				
			||||||
	LLGMM_PAGE_IND,		/* LLC asks GMM to page MS: TLLI */
 | 
					 | 
				
			||||||
	LLGMM_IOV_REQ,		/* GMM tells us to perform XID: TLLI */
 | 
					 | 
				
			||||||
	LLGMM_STATUS_IND,	/* LLC informs GMM about error: TLLI, Cause */
 | 
					 | 
				
			||||||
	/* LLE <-> (GMM/SNDCP/SMS/TOM) */
 | 
					 | 
				
			||||||
	LL_RESET_IND,		/* TLLI */
 | 
					 | 
				
			||||||
	LL_ESTABLISH_REQ,	/* TLLI, XID Req */
 | 
					 | 
				
			||||||
	LL_ESTABLISH_IND,	/* TLLI, XID Req, N201-I, N201-U */
 | 
					 | 
				
			||||||
	LL_ESTABLISH_RESP,	/* TLLI, XID Negotiated */
 | 
					 | 
				
			||||||
	LL_ESTABLISH_CONF,	/* TLLI, XID Neg, N201-i, N201-U */
 | 
					 | 
				
			||||||
	LL_RELEASE_REQ,		/* TLLI, Local */
 | 
					 | 
				
			||||||
	LL_RELEASE_IND,		/* TLLI, Cause */
 | 
					 | 
				
			||||||
	LL_RELEASE_CONF,	/* TLLI */
 | 
					 | 
				
			||||||
	LL_XID_REQ,		/* TLLI, XID Requested */
 | 
					 | 
				
			||||||
	LL_XID_IND,		/* TLLI, XID Req, N201-I, N201-U */
 | 
					 | 
				
			||||||
	LL_XID_RESP,		/* TLLI, XID Negotiated */
 | 
					 | 
				
			||||||
	LL_XID_CONF,		/* TLLI, XID Neg, N201-I, N201-U */
 | 
					 | 
				
			||||||
	LL_DATA_REQ,		/* TLLI, SN-PDU, Ref, QoS, Radio Prio, Ciph */
 | 
					 | 
				
			||||||
	LL_DATA_IND,		/* TLLI, SN-PDU */
 | 
					 | 
				
			||||||
	LL_DATA_CONF,		/* TLLI, Ref */
 | 
					 | 
				
			||||||
	LL_UNITDATA_REQ,	/* TLLI, SN-PDU, Ref, QoS, Radio Prio, Ciph */
 | 
					 | 
				
			||||||
	LL_UNITDATA_IND,	/* TLLI, SN-PDU */
 | 
					 | 
				
			||||||
	LL_STATUS_IND,		/* TLLI, Cause */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 4.5.2 Logical Link States + Annex C.2 */
 | 
					 | 
				
			||||||
enum gprs_llc_lle_state {
 | 
					 | 
				
			||||||
	GPRS_LLES_UNASSIGNED	= 1,	/* No TLLI yet */
 | 
					 | 
				
			||||||
	GPRS_LLES_ASSIGNED_ADM	= 2,	/* TLLI assigned */
 | 
					 | 
				
			||||||
	GPRS_LLES_LOCAL_EST	= 3,	/* Local Establishment */
 | 
					 | 
				
			||||||
	GPRS_LLES_REMOTE_EST	= 4,	/* Remote Establishment */
 | 
					 | 
				
			||||||
	GPRS_LLES_ABM		= 5,
 | 
					 | 
				
			||||||
	GPRS_LLES_LOCAL_REL	= 6,	/* Local Release */
 | 
					 | 
				
			||||||
	GPRS_LLES_TIMER_REC 	= 7,	/* Timer Recovery */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gprs_llc_llme_state {
 | 
					 | 
				
			||||||
	GPRS_LLMS_UNASSIGNED	= 1,	/* No TLLI yet */
 | 
					 | 
				
			||||||
	GPRS_LLMS_ASSIGNED	= 2,	/* TLLI assigned */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 8.9.9 LLC layer parameter default values */
 | 
					 | 
				
			||||||
struct gprs_llc_params {
 | 
					 | 
				
			||||||
	uint16_t iov_i_exp;
 | 
					 | 
				
			||||||
	uint16_t t200_201;
 | 
					 | 
				
			||||||
	uint16_t n200;
 | 
					 | 
				
			||||||
	uint16_t n201_u;
 | 
					 | 
				
			||||||
	uint16_t n201_i;
 | 
					 | 
				
			||||||
	uint16_t mD;
 | 
					 | 
				
			||||||
	uint16_t mU;
 | 
					 | 
				
			||||||
	uint16_t kD;
 | 
					 | 
				
			||||||
	uint16_t kU;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 4.7.1: Logical Link Entity: One per DLCI (TLLI + SAPI) */
 | 
					 | 
				
			||||||
struct gprs_llc_lle {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint32_t sapi;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gprs_llc_llme *llme;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enum gprs_llc_lle_state state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct osmo_timer_list t200;
 | 
					 | 
				
			||||||
	struct osmo_timer_list t201;	/* wait for acknowledgement */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint16_t v_sent;
 | 
					 | 
				
			||||||
	uint16_t v_ack;
 | 
					 | 
				
			||||||
	uint16_t v_recv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint16_t vu_send;
 | 
					 | 
				
			||||||
	uint16_t vu_recv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Overflow Counter for ABM */
 | 
					 | 
				
			||||||
	uint32_t oc_i_send;
 | 
					 | 
				
			||||||
	uint32_t oc_i_recv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Overflow Counter for unconfirmed transfer */
 | 
					 | 
				
			||||||
	uint32_t oc_ui_send;
 | 
					 | 
				
			||||||
	uint32_t oc_ui_recv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned int retrans_ctr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gprs_llc_params params;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NUM_SAPIS	16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gprs_llc_llme {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enum gprs_llc_llme_state state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint32_t tlli;
 | 
					 | 
				
			||||||
	uint32_t old_tlli;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Crypto parameters */
 | 
					 | 
				
			||||||
	enum gprs_ciph_algo algo;
 | 
					 | 
				
			||||||
	uint8_t kc[8];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* over which BSSGP BTS ctx do we need to transmit */
 | 
					 | 
				
			||||||
	uint16_t bvci;
 | 
					 | 
				
			||||||
	uint16_t nsei;
 | 
					 | 
				
			||||||
	struct gprs_llc_lle lle[NUM_SAPIS];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct llist_head gprs_llc_llmes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* BSSGP-UL-UNITDATA.ind */
 | 
					 | 
				
			||||||
int gprs_llc_rcvmsg(struct msgb *msg, struct tlv_parsed *tv);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* LL-UNITDATA.req */
 | 
					 | 
				
			||||||
int gprs_llc_tx_ui(struct msgb *msg, uint8_t sapi, int command,
 | 
					 | 
				
			||||||
		   void *mmctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 7.2.1.2 LLGMM-RESET.req */
 | 
					 | 
				
			||||||
int gprs_llgmm_reset(struct gprs_llc_llme *llme);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* 04.64 Chapter 7.2.1.1 LLGMM-ASSIGN */
 | 
					 | 
				
			||||||
int gprs_llgmm_assign(struct gprs_llc_llme *llme,
 | 
					 | 
				
			||||||
		      uint32_t old_tlli, uint32_t new_tlli,
 | 
					 | 
				
			||||||
		      enum gprs_ciph_algo alg, const uint8_t *kc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gprs_llc_init(const char *cipher_plugin_path);
 | 
					 | 
				
			||||||
int gprs_llc_vty_init(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * \short Check if N(U) should be considered a retransmit
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Implements the range check as of GSM 04.64 8.4.2
 | 
					 | 
				
			||||||
 * Receipt of unacknowledged information.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @returns Returns 1 if  (V(UR)-32) <= N(U) < V(UR)
 | 
					 | 
				
			||||||
 * @param nu N(U) unconfirmed sequence number of the UI frame
 | 
					 | 
				
			||||||
 * @param vur V(UR) unconfirmend received state variable
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline int gprs_llc_is_retransmit(uint16_t nu, uint16_t vur)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int delta = (vur - nu) & 0x1ff;
 | 
					 | 
				
			||||||
	return 0 < delta && delta < 32;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -1,250 +0,0 @@
 | 
				
			|||||||
#ifndef _GPRS_NS_H
 | 
					 | 
				
			||||||
#define _GPRS_NS_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* GPRS Networks Service (NS) messages on the Gb interface
 | 
					 | 
				
			||||||
 * 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05)
 | 
					 | 
				
			||||||
 * 3GPP TS 48.016 version 6.5.0 Release 6 / ETSI TS 148 016 V6.5.0 (2005-11) */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \addtogroup libgb
 | 
					 | 
				
			||||||
 *  @{
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \file gprs_ns.h */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief Common header of GPRS NS */
 | 
					 | 
				
			||||||
struct gprs_ns_hdr {
 | 
					 | 
				
			||||||
	uint8_t pdu_type;	/*!< NS PDU type */
 | 
					 | 
				
			||||||
	uint8_t data[0];	/*!< variable-length payload */
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief NS PDU Type (TS 08.16, Section 10.3.7, Table 14) */
 | 
					 | 
				
			||||||
enum ns_pdu_type {
 | 
					 | 
				
			||||||
	NS_PDUT_UNITDATA	= 0x00,
 | 
					 | 
				
			||||||
	NS_PDUT_RESET		= 0x02,
 | 
					 | 
				
			||||||
	NS_PDUT_RESET_ACK	= 0x03,
 | 
					 | 
				
			||||||
	NS_PDUT_BLOCK		= 0x04,
 | 
					 | 
				
			||||||
	NS_PDUT_BLOCK_ACK	= 0x05,
 | 
					 | 
				
			||||||
	NS_PDUT_UNBLOCK		= 0x06,
 | 
					 | 
				
			||||||
	NS_PDUT_UNBLOCK_ACK	= 0x07,
 | 
					 | 
				
			||||||
	NS_PDUT_STATUS		= 0x08,
 | 
					 | 
				
			||||||
	NS_PDUT_ALIVE		= 0x0a,
 | 
					 | 
				
			||||||
	NS_PDUT_ALIVE_ACK	= 0x0b,
 | 
					 | 
				
			||||||
	/* TS 48.016 Section 10.3.7, Table 10.3.7.1 */
 | 
					 | 
				
			||||||
	SNS_PDUT_ACK		= 0x0c,
 | 
					 | 
				
			||||||
	SNS_PDUT_ADD		= 0x0d,
 | 
					 | 
				
			||||||
	SNS_PDUT_CHANGE_WEIGHT	= 0x0e,
 | 
					 | 
				
			||||||
	SNS_PDUT_CONFIG		= 0x0f,
 | 
					 | 
				
			||||||
	SNS_PDUT_CONFIG_ACK	= 0x10,
 | 
					 | 
				
			||||||
	SNS_PDUT_DELETE		= 0x11,
 | 
					 | 
				
			||||||
	SNS_PDUT_SIZE		= 0x12,
 | 
					 | 
				
			||||||
	SNS_PDUT_SIZE_ACK	= 0x13,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief NS Control IE (TS 08.16, Section 10.3, Table 12) */
 | 
					 | 
				
			||||||
enum ns_ctrl_ie {
 | 
					 | 
				
			||||||
	NS_IE_CAUSE		= 0x00,
 | 
					 | 
				
			||||||
	NS_IE_VCI		= 0x01,
 | 
					 | 
				
			||||||
	NS_IE_PDU		= 0x02,
 | 
					 | 
				
			||||||
	NS_IE_BVCI		= 0x03,
 | 
					 | 
				
			||||||
	NS_IE_NSEI		= 0x04,
 | 
					 | 
				
			||||||
	/* TS 48.016 Section 10.3, Table 10.3.1 */
 | 
					 | 
				
			||||||
	NS_IE_IPv4_LIST		= 0x05,
 | 
					 | 
				
			||||||
	NS_IE_IPv6_LIST		= 0x06,
 | 
					 | 
				
			||||||
	NS_IE_MAX_NR_NSVC	= 0x07,
 | 
					 | 
				
			||||||
	NS_IE_IPv4_EP_NR	= 0x08,
 | 
					 | 
				
			||||||
	NS_IE_IPv6_EP_NR	= 0x09,
 | 
					 | 
				
			||||||
	NS_IE_RESET_FLAG	= 0x0a,
 | 
					 | 
				
			||||||
	NS_IE_IP_ADDR		= 0x0b,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief NS Cause (TS 08.16, Section 10.3.2, Table 13) */
 | 
					 | 
				
			||||||
enum ns_cause {
 | 
					 | 
				
			||||||
	NS_CAUSE_TRANSIT_FAIL		= 0x00,
 | 
					 | 
				
			||||||
	NS_CAUSE_OM_INTERVENTION	= 0x01,
 | 
					 | 
				
			||||||
	NS_CAUSE_EQUIP_FAIL		= 0x02,
 | 
					 | 
				
			||||||
	NS_CAUSE_NSVC_BLOCKED		= 0x03,
 | 
					 | 
				
			||||||
	NS_CAUSE_NSVC_UNKNOWN		= 0x04,
 | 
					 | 
				
			||||||
	NS_CAUSE_BVCI_UNKNOWN		= 0x05,
 | 
					 | 
				
			||||||
	NS_CAUSE_SEM_INCORR_PDU		= 0x08,
 | 
					 | 
				
			||||||
	NS_CAUSE_PDU_INCOMP_PSTATE	= 0x0a,
 | 
					 | 
				
			||||||
	NS_CAUSE_PROTO_ERR_UNSPEC	= 0x0b,
 | 
					 | 
				
			||||||
	NS_CAUSE_INVAL_ESSENT_IE	= 0x0c,
 | 
					 | 
				
			||||||
	NS_CAUSE_MISSING_ESSENT_IE	= 0x0d,
 | 
					 | 
				
			||||||
	/* TS 48.016 Section 10.3.2, Table 10.3.2.1 */
 | 
					 | 
				
			||||||
	NS_CAUSE_INVAL_NR_IPv4_EP	= 0x0e,
 | 
					 | 
				
			||||||
	NS_CAUSE_INVAL_NR_IPv6_EP	= 0x0f,
 | 
					 | 
				
			||||||
	NS_CAUSE_INVAL_NR_NS_VC		= 0x10,
 | 
					 | 
				
			||||||
	NS_CAUSE_INVAL_WEIGH		= 0x11,
 | 
					 | 
				
			||||||
	NS_CAUSE_UNKN_IP_EP		= 0x12,
 | 
					 | 
				
			||||||
	NS_CAUSE_UNKN_IP_ADDR		= 0x13,
 | 
					 | 
				
			||||||
	NS_CAUSE_UNKN_IP_TEST_FAILED	= 0x14,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Our Implementation */
 | 
					 | 
				
			||||||
#include <netinet/in.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/linuxlist.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/timer.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/select.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NS_TIMERS_COUNT 7
 | 
					 | 
				
			||||||
#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries)"
 | 
					 | 
				
			||||||
#define NS_TIMERS_HELP	\
 | 
					 | 
				
			||||||
	"(un)blocking Timer (Tns-block) timeout\n"		\
 | 
					 | 
				
			||||||
	"(un)blocking Timer (Tns-block) number of retries\n"	\
 | 
					 | 
				
			||||||
	"Reset Timer (Tns-reset) timeout\n"			\
 | 
					 | 
				
			||||||
	"Reset Timer (Tns-reset) number of retries\n"		\
 | 
					 | 
				
			||||||
	"Test Timer (Tns-test) timeout\n"			\
 | 
					 | 
				
			||||||
	"Alive Timer (Tns-alive) timeout\n"			\
 | 
					 | 
				
			||||||
	"Alive Timer (Tns-alive) number of retries\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum ns_timeout {
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_BLOCK,
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_BLOCK_RETRIES,
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_RESET,
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_RESET_RETRIES,
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_TEST,
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_ALIVE,
 | 
					 | 
				
			||||||
	NS_TOUT_TNS_ALIVE_RETRIES,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NSE_S_BLOCKED	0x0001
 | 
					 | 
				
			||||||
#define NSE_S_ALIVE	0x0002
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief Osmocom NS link layer types */
 | 
					 | 
				
			||||||
enum gprs_ns_ll {
 | 
					 | 
				
			||||||
	GPRS_NS_LL_UDP,		/*!< NS/UDP/IP */
 | 
					 | 
				
			||||||
	GPRS_NS_LL_E1,		/*!< NS/E1 */
 | 
					 | 
				
			||||||
	GPRS_NS_LL_FR_GRE,	/*!< NS/FR/GRE/IP */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief Osmoco NS events */
 | 
					 | 
				
			||||||
enum gprs_ns_evt {
 | 
					 | 
				
			||||||
	GPRS_NS_EVT_UNIT_DATA,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gprs_nsvc;
 | 
					 | 
				
			||||||
/*! \brief Osmocom GPRS callback function type */
 | 
					 | 
				
			||||||
typedef int gprs_ns_cb_t(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
 | 
					 | 
				
			||||||
			 struct msgb *msg, uint16_t bvci);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief An instance of the NS protocol stack */
 | 
					 | 
				
			||||||
struct gprs_ns_inst {
 | 
					 | 
				
			||||||
	/*! \brief callback to the user for incoming UNIT DATA IND */
 | 
					 | 
				
			||||||
	gprs_ns_cb_t *cb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*! \brief linked lists of all NSVC in this instance */
 | 
					 | 
				
			||||||
	struct llist_head gprs_nsvcs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*! \brief a NSVC object that's needed to deal with packets for
 | 
					 | 
				
			||||||
	 * 	   unknown NSVC */
 | 
					 | 
				
			||||||
	struct gprs_nsvc *unknown_nsvc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint16_t timeout[NS_TIMERS_COUNT];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*! \brief NS-over-IP specific bits */
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_fd fd;
 | 
					 | 
				
			||||||
		uint32_t local_ip;
 | 
					 | 
				
			||||||
		uint16_t local_port;
 | 
					 | 
				
			||||||
	} nsip;
 | 
					 | 
				
			||||||
	/*! \brief NS-over-FR-over-GRE-over-IP specific bits */
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_fd fd;
 | 
					 | 
				
			||||||
		uint32_t local_ip;
 | 
					 | 
				
			||||||
		int enabled:1;
 | 
					 | 
				
			||||||
	} frgre;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum nsvc_timer_mode {
 | 
					 | 
				
			||||||
	/* standard timers */
 | 
					 | 
				
			||||||
	NSVC_TIMER_TNS_TEST,
 | 
					 | 
				
			||||||
	NSVC_TIMER_TNS_ALIVE,
 | 
					 | 
				
			||||||
	NSVC_TIMER_TNS_RESET,
 | 
					 | 
				
			||||||
	_NSVC_TIMER_NR,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! \brief Structure representing a single NS-VC */
 | 
					 | 
				
			||||||
struct gprs_nsvc {
 | 
					 | 
				
			||||||
	/*! \brief list of NS-VCs within NS Instance */
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
	/*! \brief pointer to NS Instance */
 | 
					 | 
				
			||||||
	struct gprs_ns_inst *nsi;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint16_t nsei;	/*! \brief end-to-end significance */
 | 
					 | 
				
			||||||
	uint16_t nsvci;	/*! \brief uniquely identifies NS-VC at SGSN */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint32_t state;
 | 
					 | 
				
			||||||
	uint32_t remote_state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct osmo_timer_list timer;
 | 
					 | 
				
			||||||
	enum nsvc_timer_mode timer_mode;
 | 
					 | 
				
			||||||
	int alive_retries;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned int remote_end_is_sgsn:1;
 | 
					 | 
				
			||||||
	unsigned int persistent:1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct rate_ctr_group *ctrg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*! \brief which link-layer are we based on? */
 | 
					 | 
				
			||||||
	enum gprs_ns_ll ll;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	union {
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct sockaddr_in bts_addr;
 | 
					 | 
				
			||||||
		} ip;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct sockaddr_in bts_addr;
 | 
					 | 
				
			||||||
		} frgre;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Create a new NS protocol instance */
 | 
					 | 
				
			||||||
struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Destroy a NS protocol instance */
 | 
					 | 
				
			||||||
void gprs_ns_destroy(struct gprs_ns_inst *nsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Listen for incoming GPRS packets via NS/UDP */
 | 
					 | 
				
			||||||
int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct sockaddr_in;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* main function for higher layers (BSSGP) to send NS messages */
 | 
					 | 
				
			||||||
int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause);
 | 
					 | 
				
			||||||
int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause);
 | 
					 | 
				
			||||||
int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Listen for incoming GPRS packets via NS/FR/GRE */
 | 
					 | 
				
			||||||
int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Establish a connection (from the BSS) to the SGSN */
 | 
					 | 
				
			||||||
struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
 | 
					 | 
				
			||||||
				struct sockaddr_in *dest, uint16_t nsei,
 | 
					 | 
				
			||||||
				uint16_t nsvci);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci);
 | 
					 | 
				
			||||||
void nsvc_delete(struct gprs_nsvc *nsvc);
 | 
					 | 
				
			||||||
struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
 | 
					 | 
				
			||||||
struct gprs_nsvc *nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Initiate a RESET procedure (including timer start, ...)*/
 | 
					 | 
				
			||||||
void gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Add NS-specific VTY stuff */
 | 
					 | 
				
			||||||
int gprs_ns_vty_init(struct gprs_ns_inst *nsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NS_ALLOC_SIZE	2048
 | 
					 | 
				
			||||||
#define NS_ALLOC_HEADROOM 20
 | 
					 | 
				
			||||||
static inline struct msgb *gprs_ns_msgb_alloc(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM, "GPRS/NS");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*! }@ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -1,6 +0,0 @@
 | 
				
			|||||||
#ifndef _GPRS_NS_FRGRE_H
 | 
					 | 
				
			||||||
#define _GPRS_NS_FRGRE_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gprs_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -1,222 +0,0 @@
 | 
				
			|||||||
#ifndef _GPRS_SGSN_H
 | 
					 | 
				
			||||||
#define _GPRS_SGSN_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <netinet/in.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/timer.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/gsm/gsm48.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/crypt/gprs_cipher.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GSM_IMSI_LENGTH 17
 | 
					 | 
				
			||||||
#define GSM_IMEI_LENGTH 17
 | 
					 | 
				
			||||||
#define GSM_EXTENSION_LENGTH 15
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gprs_llc_lle;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* TS 04.08 4.1.3.3 GMM mobility management states on the network side */
 | 
					 | 
				
			||||||
enum gprs_mm_state {
 | 
					 | 
				
			||||||
	GMM_DEREGISTERED,		/* 4.1.3.3.1.1 */
 | 
					 | 
				
			||||||
	GMM_COMMON_PROC_INIT,		/* 4.1.3.3.1.2 */
 | 
					 | 
				
			||||||
	GMM_REGISTERED_NORMAL,		/* 4.1.3.3.2.1 */
 | 
					 | 
				
			||||||
	GMM_REGISTERED_SUSPENDED,	/* 4.1.3.3.2.2 */
 | 
					 | 
				
			||||||
	GMM_DEREGISTERED_INIT,		/* 4.1.3.3.1.4 */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gprs_mm_ctr {
 | 
					 | 
				
			||||||
	GMM_CTR_PKTS_SIG_IN,
 | 
					 | 
				
			||||||
	GMM_CTR_PKTS_SIG_OUT,
 | 
					 | 
				
			||||||
	GMM_CTR_PKTS_UDATA_IN,
 | 
					 | 
				
			||||||
	GMM_CTR_PKTS_UDATA_OUT,
 | 
					 | 
				
			||||||
	GMM_CTR_BYTES_UDATA_IN,
 | 
					 | 
				
			||||||
	GMM_CTR_BYTES_UDATA_OUT,
 | 
					 | 
				
			||||||
	GMM_CTR_PDP_CTX_ACT,
 | 
					 | 
				
			||||||
	GMM_CTR_SUSPEND,
 | 
					 | 
				
			||||||
	GMM_CTR_PAGING_PS,
 | 
					 | 
				
			||||||
	GMM_CTR_PAGING_CS,
 | 
					 | 
				
			||||||
	GMM_CTR_RA_UPDATE,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gprs_pdp_ctx {
 | 
					 | 
				
			||||||
	PDP_CTR_PKTS_UDATA_IN,
 | 
					 | 
				
			||||||
	PDP_CTR_PKTS_UDATA_OUT,
 | 
					 | 
				
			||||||
	PDP_CTR_BYTES_UDATA_IN,
 | 
					 | 
				
			||||||
	PDP_CTR_BYTES_UDATA_OUT,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gprs_t3350_mode {
 | 
					 | 
				
			||||||
	GMM_T3350_MODE_ATT,
 | 
					 | 
				
			||||||
	GMM_T3350_MODE_RAU,
 | 
					 | 
				
			||||||
	GMM_T3350_MODE_PTMSI_REALL,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MS_RADIO_ACCESS_CAPA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* According to TS 03.60, Table 5: SGSN MM and PDP Contexts */
 | 
					 | 
				
			||||||
/* Extended by 3GPP TS 23.060, Table 6: SGSN MM and PDP Contexts */
 | 
					 | 
				
			||||||
struct sgsn_mm_ctx {
 | 
					 | 
				
			||||||
	struct llist_head	list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char 			imsi[GSM_IMSI_LENGTH];
 | 
					 | 
				
			||||||
	enum gprs_mm_state	mm_state;
 | 
					 | 
				
			||||||
	uint32_t 		p_tmsi;
 | 
					 | 
				
			||||||
	uint32_t 		p_tmsi_old;	/* old P-TMSI before new is confirmed */
 | 
					 | 
				
			||||||
	uint32_t 		p_tmsi_sig;
 | 
					 | 
				
			||||||
	char 			imei[GSM_IMEI_LENGTH];
 | 
					 | 
				
			||||||
	/* Opt: Software Version Numbber / TS 23.195 */
 | 
					 | 
				
			||||||
	char 			msisdn[GSM_EXTENSION_LENGTH];
 | 
					 | 
				
			||||||
	struct gprs_ra_id	ra;
 | 
					 | 
				
			||||||
	uint16_t		cell_id;
 | 
					 | 
				
			||||||
	uint32_t		cell_id_age;
 | 
					 | 
				
			||||||
	uint16_t		sac;	/* Iu: Service Area Code */
 | 
					 | 
				
			||||||
	uint32_t		sac_age;/* Iu: Service Area Code age */
 | 
					 | 
				
			||||||
	/* VLR number */
 | 
					 | 
				
			||||||
	uint32_t		new_sgsn_addr;
 | 
					 | 
				
			||||||
	/* Authentication Triplets */
 | 
					 | 
				
			||||||
	/* Kc */
 | 
					 | 
				
			||||||
	/* Iu: CK, IK, KSI */
 | 
					 | 
				
			||||||
	/* CKSN */
 | 
					 | 
				
			||||||
	enum gprs_ciph_algo	ciph_algo;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		uint8_t	buf[52];	/* 10.5.5.12a */
 | 
					 | 
				
			||||||
		uint8_t	len;
 | 
					 | 
				
			||||||
	} ms_radio_access_capa;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		uint8_t	buf[4];		/* 10.5.5.12 */
 | 
					 | 
				
			||||||
		uint8_t	len;
 | 
					 | 
				
			||||||
	} ms_network_capa;
 | 
					 | 
				
			||||||
	uint16_t		drx_parms;
 | 
					 | 
				
			||||||
	int			mnrg;	/* MS reported to HLR? */
 | 
					 | 
				
			||||||
	int			ngaf;	/* MS reported to MSC/VLR? */
 | 
					 | 
				
			||||||
	int			ppf;	/* paging for GPRS + non-GPRS? */
 | 
					 | 
				
			||||||
	/* SMS Parameters */
 | 
					 | 
				
			||||||
	int			recovery;
 | 
					 | 
				
			||||||
	uint8_t			radio_prio_sms;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct llist_head	pdp_list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Additional bits not present in the GSM TS */
 | 
					 | 
				
			||||||
	struct gprs_llc_llme	*llme;
 | 
					 | 
				
			||||||
	uint32_t		tlli;
 | 
					 | 
				
			||||||
	uint32_t		tlli_new;
 | 
					 | 
				
			||||||
	uint16_t		nsei;
 | 
					 | 
				
			||||||
	uint16_t		bvci;
 | 
					 | 
				
			||||||
	struct rate_ctr_group	*ctrg;
 | 
					 | 
				
			||||||
	struct osmo_timer_list	timer;
 | 
					 | 
				
			||||||
	unsigned int		T;		/* Txxxx number */
 | 
					 | 
				
			||||||
	unsigned int		num_T_exp;	/* number of consecutive T expirations */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enum gprs_t3350_mode	t3350_mode;
 | 
					 | 
				
			||||||
	uint8_t			t3370_id_type;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* look-up a SGSN MM context based on TLLI + RAI */
 | 
					 | 
				
			||||||
struct sgsn_mm_ctx *sgsn_mm_ctx_by_tlli(uint32_t tlli,
 | 
					 | 
				
			||||||
					const struct gprs_ra_id *raid);
 | 
					 | 
				
			||||||
struct sgsn_mm_ctx *sgsn_mm_ctx_by_ptmsi(uint32_t tmsi);
 | 
					 | 
				
			||||||
struct sgsn_mm_ctx *sgsn_mm_ctx_by_imsi(const char *imsi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Allocate a new SGSN MM context */
 | 
					 | 
				
			||||||
struct sgsn_mm_ctx *sgsn_mm_ctx_alloc(uint32_t tlli,
 | 
					 | 
				
			||||||
					const struct gprs_ra_id *raid);
 | 
					 | 
				
			||||||
void sgsn_mm_ctx_free(struct sgsn_mm_ctx *mm);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum pdp_ctx_state {
 | 
					 | 
				
			||||||
	PDP_STATE_NONE,
 | 
					 | 
				
			||||||
	PDP_STATE_CR_REQ,
 | 
					 | 
				
			||||||
	PDP_STATE_CR_CONF,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* 04.08 / Figure 6.2 / 6.1.2.2 */
 | 
					 | 
				
			||||||
	PDP_STATE_INACT_PEND,
 | 
					 | 
				
			||||||
	PDP_STATE_INACTIVE = PDP_STATE_NONE,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum pdp_type {
 | 
					 | 
				
			||||||
	PDP_TYPE_NONE,
 | 
					 | 
				
			||||||
	PDP_TYPE_ETSI_PPP,
 | 
					 | 
				
			||||||
	PDP_TYPE_IANA_IPv4,
 | 
					 | 
				
			||||||
	PDP_TYPE_IANA_IPv6,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct sgsn_pdp_ctx {
 | 
					 | 
				
			||||||
	struct llist_head	list;	/* list_head for mmctx->pdp_list */
 | 
					 | 
				
			||||||
	struct llist_head	g_list;	/* list_head for global list */
 | 
					 | 
				
			||||||
	struct sgsn_mm_ctx	*mm;	/* back pointer to MM CTX */
 | 
					 | 
				
			||||||
	struct sgsn_ggsn_ctx	*ggsn;	/* which GGSN serves this PDP */
 | 
					 | 
				
			||||||
	struct rate_ctr_group	*ctrg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	//unsigned int		id;
 | 
					 | 
				
			||||||
	struct pdp_t		*lib;	/* pointer to libgtp PDP ctx */
 | 
					 | 
				
			||||||
	enum pdp_ctx_state	state;
 | 
					 | 
				
			||||||
	enum pdp_type		type;
 | 
					 | 
				
			||||||
	uint32_t		address;
 | 
					 | 
				
			||||||
	char 			*apn_subscribed;
 | 
					 | 
				
			||||||
	//char 			*apn_used;
 | 
					 | 
				
			||||||
	uint16_t		nsapi;	/* SNDCP */
 | 
					 | 
				
			||||||
	uint16_t		sapi;	/* LLC */
 | 
					 | 
				
			||||||
	uint8_t			ti;	/* transaction identifier */
 | 
					 | 
				
			||||||
	int			vplmn_allowed;
 | 
					 | 
				
			||||||
	uint32_t		qos_profile_subscr;
 | 
					 | 
				
			||||||
	//uint32_t		qos_profile_req;
 | 
					 | 
				
			||||||
	//uint32_t		qos_profile_neg;
 | 
					 | 
				
			||||||
	uint8_t			radio_prio;
 | 
					 | 
				
			||||||
	uint32_t		tx_npdu_nr;
 | 
					 | 
				
			||||||
	uint32_t		rx_npdu_nr;
 | 
					 | 
				
			||||||
	uint32_t		tx_gtp_snd;
 | 
					 | 
				
			||||||
	uint32_t		rx_gtp_snu;
 | 
					 | 
				
			||||||
	//uint32_t		charging_id;
 | 
					 | 
				
			||||||
	int			reordering_reqd;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct osmo_timer_list	timer;
 | 
					 | 
				
			||||||
	unsigned int		T;		/* Txxxx number */
 | 
					 | 
				
			||||||
	unsigned int		num_T_exp;	/* number of consecutive T expirations */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* look up PDP context by MM context and NSAPI */
 | 
					 | 
				
			||||||
struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_nsapi(const struct sgsn_mm_ctx *mm,
 | 
					 | 
				
			||||||
					   uint8_t nsapi);
 | 
					 | 
				
			||||||
/* look up PDP context by MM context and transaction ID */
 | 
					 | 
				
			||||||
struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_tid(const struct sgsn_mm_ctx *mm,
 | 
					 | 
				
			||||||
					 uint8_t tid);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct sgsn_pdp_ctx *sgsn_pdp_ctx_alloc(struct sgsn_mm_ctx *mm,
 | 
					 | 
				
			||||||
					uint8_t nsapi);
 | 
					 | 
				
			||||||
void sgsn_pdp_ctx_free(struct sgsn_pdp_ctx *pdp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct sgsn_ggsn_ctx {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
	uint32_t id;
 | 
					 | 
				
			||||||
	unsigned int gtp_version;
 | 
					 | 
				
			||||||
	struct in_addr remote_addr;
 | 
					 | 
				
			||||||
	int remote_restart_ctr;
 | 
					 | 
				
			||||||
	struct gsn_t *gsn;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_alloc(uint32_t id);
 | 
					 | 
				
			||||||
struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_by_id(uint32_t id);
 | 
					 | 
				
			||||||
struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_by_addr(struct in_addr *addr);
 | 
					 | 
				
			||||||
struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_find_alloc(uint32_t id);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct apn_ctx {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
	struct sgsn_ggsn_ctx *ggsn;
 | 
					 | 
				
			||||||
	char *name;
 | 
					 | 
				
			||||||
	char *description;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct llist_head sgsn_mm_ctxts;
 | 
					 | 
				
			||||||
extern struct llist_head sgsn_ggsn_ctxts;
 | 
					 | 
				
			||||||
extern struct llist_head sgsn_apn_ctxts;
 | 
					 | 
				
			||||||
extern struct llist_head sgsn_pdp_ctxts;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint32_t sgsn_alloc_ptmsi(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* High-level function to be called in case a GGSN has disappeared or
 | 
					 | 
				
			||||||
 * ottherwise lost state (recovery procedure) */
 | 
					 | 
				
			||||||
int drop_all_pdp_for_ggsn(struct sgsn_ggsn_ctx *ggsn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _GPRS_SGSN_H */
 | 
					 | 
				
			||||||
@@ -1,72 +1,796 @@
 | 
				
			|||||||
#ifndef _GSM_04_08_H
 | 
					#ifndef _GSM_04_08_H
 | 
				
			||||||
#define _GSM_04_08_H
 | 
					#define _GSM_04_08_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/gsm/gsm48.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/gsm_utils.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <openbsc/meas_rep.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 msgb;
 | 
				
			||||||
struct gsm_bts;
 | 
					struct gsm_bts;
 | 
				
			||||||
struct gsm_subscriber;
 | 
					struct gsm_subscriber;
 | 
				
			||||||
struct gsm_network;
 | 
					struct gsm_network;
 | 
				
			||||||
struct gsm_trans;
 | 
					struct gsm_trans;
 | 
				
			||||||
struct gsm_subscriber_connection;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GSM48_ALLOC_SIZE	2048
 | 
					 | 
				
			||||||
#define GSM48_ALLOC_HEADROOM	256
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline struct msgb *gsm48_msgb_alloc(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return msgb_alloc_headroom(GSM48_ALLOC_SIZE, GSM48_ALLOC_HEADROOM,
 | 
					 | 
				
			||||||
				   "GSM 04.08");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* config options controlling the behaviour of the lower leves */
 | 
					/* config options controlling the behaviour of the lower leves */
 | 
				
			||||||
void gsm0408_allow_everyone(int allow);
 | 
					void gsm0408_allow_everyone(int allow);
 | 
				
			||||||
void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);
 | 
					 | 
				
			||||||
void gsm0408_clear_all_trans(struct gsm_network *net, int protocol);
 | 
					 | 
				
			||||||
int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id);
 | 
					int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id);
 | 
				
			||||||
int gsm0408_new_conn(struct gsm_subscriber_connection *conn);
 | 
					void gsm0408_generate_lai(struct gsm48_loc_area_id *lai48, u_int16_t mcc, 
 | 
				
			||||||
enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, uint8_t ra);
 | 
							u_int16_t mnc, u_int16_t lac);
 | 
				
			||||||
/* don't use "enum gsm_chreq_reason_t" to avoid circular dependency */
 | 
					enum gsm_chan_t get_ctype_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci);
 | 
				
			||||||
int get_reason_by_chreq(uint8_t ra, int neci);
 | 
					enum gsm_chreq_reason_t get_reason_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci);
 | 
				
			||||||
void gsm_net_update_ctype(struct gsm_network *net);
 | 
					
 | 
				
			||||||
 | 
					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_tx_mm_info(struct gsm_subscriber_connection *conn);
 | 
					 | 
				
			||||||
int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, uint8_t *rand, int key_seq);
 | 
					 | 
				
			||||||
int gsm48_tx_mm_auth_rej(struct gsm_subscriber_connection *conn);
 | 
					 | 
				
			||||||
int gsm48_send_rr_release(struct gsm_lchan *lchan);
 | 
					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_ciph_mode(struct gsm_lchan *lchan, int want_imeisv);
 | 
				
			||||||
int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, uint8_t apdu_id,
 | 
					int gsm48_send_rr_app_info(struct gsm_lchan *lchan, u_int8_t apdu_id,
 | 
				
			||||||
			   uint8_t apdu_len, const uint8_t *apdu);
 | 
								   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, uint8_t power_class);
 | 
					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,
 | 
					int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan,
 | 
				
			||||||
		      uint8_t power_command, uint8_t ho_ref);
 | 
							      u_int8_t power_command, u_int8_t ho_ref);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg);
 | 
					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 */
 | 
					/* convert a ASCII phone number to call-control BCD */
 | 
				
			||||||
int encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len,
 | 
					int encode_bcd_number(u_int8_t *bcd_lv, u_int8_t max_len,
 | 
				
			||||||
		      int h_len, const char *input);
 | 
							      int h_len, const char *input);
 | 
				
			||||||
int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv,
 | 
					int decode_bcd_number(char *output, int output_len, const u_int8_t *bcd_lv,
 | 
				
			||||||
		      int h_len);
 | 
							      int h_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
 | 
					extern const char *gsm0408_cc_msg_names[];
 | 
				
			||||||
int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type);
 | 
					 | 
				
			||||||
int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type);
 | 
					 | 
				
			||||||
int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, struct msgb *msg, struct gsm_subscriber *subscr);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
 | 
					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_rx_rr_modif_ack(struct msgb *msg);
 | 
				
			||||||
int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
 | 
					int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value);
 | 
					 | 
				
			||||||
struct msgb *gsm48_create_loc_upd_rej(uint8_t cause);
 | 
					 | 
				
			||||||
void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,
 | 
					 | 
				
			||||||
			   const struct gsm_lchan *lchan);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,381 +0,0 @@
 | 
				
			|||||||
#ifndef _GSM48_GPRS_H
 | 
					 | 
				
			||||||
#define _GSM48_GPRS_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Table 10.4 / 10.4a, GPRS Mobility Management (GMM) */
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_ATTACH_REQ		0x01
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_ATTACH_ACK		0x02
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_ATTACH_COMPL	0x03
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_ATTACH_REJ		0x04
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_DETACH_REQ		0x05
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_DETACH_ACK		0x06
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_RA_UPD_REQ		0x08
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_RA_UPD_ACK		0x09
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_RA_UPD_COMPL	0x0a
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_RA_UPD_REJ		0x0b
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_PTMSI_REALL_CMD	0x10
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_PTMSI_REALL_COMPL	0x11
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_AUTH_CIPH_REQ	0x12
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_AUTH_CIPH_RESP	0x13
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_AUTH_CIPH_REJ	0x14
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_ID_REQ		0x15
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_ID_RESP		0x16
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_STATUS		0x20
 | 
					 | 
				
			||||||
#define GSM48_MT_GMM_INFO		0x21
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Table 10.4a, GPRS Session Management (GSM) */
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_ACT_PDP_REQ	0x41
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_ACT_PDP_ACK	0x42
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_ACT_PDP_REJ	0x43
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_REQ_PDP_ACT	0x44
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_REQ_PDP_ACT_REJ	0x45
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_DEACT_PDP_REQ	0x46
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_DEACT_PDP_ACK	0x47
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_ACT_AA_PDP_REQ	0x50
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_ACT_AA_PDP_ACK	0x51
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_ACT_AA_PDP_REJ	0x52
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_DEACT_AA_PDP_REQ	0x53
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_DEACT_AA_PDP_ACK	0x54
 | 
					 | 
				
			||||||
#define GSM48_MT_GSM_STATUS		0x55
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 10.5.5.2 / Table 10.5.135 */
 | 
					 | 
				
			||||||
#define GPRS_ATT_T_ATTACH		1
 | 
					 | 
				
			||||||
#define GPRS_ATT_T_ATT_WHILE_IMSI	2
 | 
					 | 
				
			||||||
#define GPRS_ATT_T_COMBINED		3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 10.5.5.5 / Table 10.5.138 */
 | 
					 | 
				
			||||||
#define GPRS_DET_T_MO_GPRS		1
 | 
					 | 
				
			||||||
#define GPRS_DET_T_MO_IMSI		2
 | 
					 | 
				
			||||||
#define GPRS_DET_T_MO_COMBINED		3
 | 
					 | 
				
			||||||
/* Network to MS direction */
 | 
					 | 
				
			||||||
#define GPRS_DET_T_MT_REATT_REQ		1
 | 
					 | 
				
			||||||
#define GPRS_DET_T_MT_REATT_NOTREQ	2
 | 
					 | 
				
			||||||
#define GPRS_DET_T_MT_IMSI		3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 10.5.5.18 / Table 105.150 */
 | 
					 | 
				
			||||||
#define GPRS_UPD_T_RA			0
 | 
					 | 
				
			||||||
#define GPRS_UPD_T_RA_LA		1
 | 
					 | 
				
			||||||
#define GPRS_UPD_T_RA_LA_IMSI_ATT	2
 | 
					 | 
				
			||||||
#define GPRS_UPD_T_PERIODIC		3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gsm48_gprs_ie_mm {
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_CIPH_CKSN		= 0x08, /* 10.5.1.2 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_TIMER_READY	= 0x17,	/* 10.5.7.3 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_ALLOC_PTMSI	= 0x18,	/* 10.5.1.4 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_PTMSI_SIG		= 0x19,	/* 10.5.5.8 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_AUTH_RAND		= 0x21,	/* 10.5.3.1 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_AUTH_SRES		= 0x22,	/* 10.5.3.2 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_IMEISV		= 0x23,	/* 10.5.1.4 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_DRX_PARAM		= 0x27,	/* 10.5.5.6 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_MS_NET_CAPA	= 0x31,	/* 10.5.5.12 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_PDP_CTX_STATUS	= 0x32,	/* 10.5.7.1 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_PS_LCS_CAPA	= 0x33,	/* 10.5.5.22 */
 | 
					 | 
				
			||||||
	GSM48_IE_GMM_GMM_MBMS_CTX_ST	= 0x35,	/* 10.5.7.6 */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gsm48_gprs_ie_sm {
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_APN		= 0x28,	/* 10.5.6.1 */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_PROTO_CONF_OPT	= 0x27,	/* 10.5.6.3 */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_PDP_ADDR		= 0x2b, /* 10.5.6.4 */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_AA_TMR		= 0x29,	/* 10.5.7.3 */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_NAME_FULL		= 0x43, /* 10.5.3.5a */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_NAME_SHORT		= 0x45, /* 10.5.3.5a */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_TIMEZONE		= 0x46, /* 10.5.3.8 */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_UTC_AND_TZ		= 0x47, /* 10.5.3.9 */
 | 
					 | 
				
			||||||
	GSM48_IE_GSM_LSA_ID		= 0x48, /* 10.5.3.11 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Fake IEs that are not present on the Layer3 air interface,
 | 
					 | 
				
			||||||
	 * but which we use to simplify internal APIs */
 | 
					 | 
				
			||||||
	OSMO_IE_GSM_REQ_QOS		= 0xfd,
 | 
					 | 
				
			||||||
	OSMO_IE_GSM_REQ_PDP_ADDR	= 0xfe,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 9.4.15 / Table 9.4.15 */
 | 
					 | 
				
			||||||
struct gsm48_ra_upd_ack {
 | 
					 | 
				
			||||||
	uint8_t force_stby:4,	/* 10.5.5.7 */
 | 
					 | 
				
			||||||
		 upd_result:4;	/* 10.5.5.17 */
 | 
					 | 
				
			||||||
	uint8_t ra_upd_timer;	/* 10.5.7.3 */
 | 
					 | 
				
			||||||
	struct gsm48_ra_id ra_id; /* 10.5.5.15 */
 | 
					 | 
				
			||||||
	uint8_t data[0];
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 10.5.7.3 */
 | 
					 | 
				
			||||||
enum gsm48_gprs_tmr_unit {
 | 
					 | 
				
			||||||
	GPRS_TMR_2SECONDS	= 0 << 5,
 | 
					 | 
				
			||||||
	GPRS_TMR_MINUTE		= 1 << 5,
 | 
					 | 
				
			||||||
	GPRS_TMR_6MINUTE	= 2 << 5,
 | 
					 | 
				
			||||||
	GPRS_TMR_DEACTIVATED	= 3 << 5,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 9.4.2 / Table 9.4.2 */
 | 
					 | 
				
			||||||
struct gsm48_attach_ack {
 | 
					 | 
				
			||||||
	uint8_t att_result:4,	/* 10.5.5.7 */
 | 
					 | 
				
			||||||
		 force_stby:4;	/* 10.5.5.1 */
 | 
					 | 
				
			||||||
	uint8_t ra_upd_timer;	/* 10.5.7.3 */
 | 
					 | 
				
			||||||
	uint8_t radio_prio;	/* 10.5.7.2 */
 | 
					 | 
				
			||||||
	struct gsm48_ra_id ra_id; /* 10.5.5.15 */
 | 
					 | 
				
			||||||
	uint8_t data[0];
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 9.4.9 / Table 9.4.9 */
 | 
					 | 
				
			||||||
struct gsm48_auth_ciph_req {
 | 
					 | 
				
			||||||
	uint8_t ciph_alg:4,	/* 10.5.5.3 */
 | 
					 | 
				
			||||||
		imeisv_req:4;	/* 10.5.5.10 */
 | 
					 | 
				
			||||||
	uint8_t force_stby:4,	/* 10.5.5.7 */
 | 
					 | 
				
			||||||
		ac_ref_nr:4;	/* 10.5.5.19 */
 | 
					 | 
				
			||||||
	uint8_t data[0];
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
/* optional: TV RAND, TV CKSN */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm48_auth_ciph_resp {
 | 
					 | 
				
			||||||
	uint8_t ac_ref_nr:4,
 | 
					 | 
				
			||||||
		spare:4;
 | 
					 | 
				
			||||||
	uint8_t data[0];
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 9.5.1 / Table 9.5.1 */
 | 
					 | 
				
			||||||
struct gsm48_act_pdp_ctx_req {
 | 
					 | 
				
			||||||
	uint8_t req_nsapi;
 | 
					 | 
				
			||||||
	uint8_t req_llc_sapi;
 | 
					 | 
				
			||||||
	uint8_t data[0];
 | 
					 | 
				
			||||||
} __attribute__((packed));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 10.5.5.14 / Table 10.5.147 */
 | 
					 | 
				
			||||||
enum gsm48_gmm_cause {
 | 
					 | 
				
			||||||
	GMM_CAUSE_IMSI_UNKNOWN		= 0x02,
 | 
					 | 
				
			||||||
	GMM_CAUSE_ILLEGAL_MS		= 0x03,
 | 
					 | 
				
			||||||
	GMM_CAUSE_ILLEGAL_ME		= 0x06,
 | 
					 | 
				
			||||||
	GMM_CAUSE_GPRS_NOTALLOWED	= 0x07,
 | 
					 | 
				
			||||||
	GMM_CAUSE_GPRS_OTHER_NOTALLOWED	= 0x08,
 | 
					 | 
				
			||||||
	GMM_CAUSE_MS_ID_NOT_DERIVED	= 0x09,
 | 
					 | 
				
			||||||
	GMM_CAUSE_IMPL_DETACHED		= 0x0a,
 | 
					 | 
				
			||||||
	GMM_CAUSE_PLMN_NOTALLOWED	= 0x0b,
 | 
					 | 
				
			||||||
	GMM_CAUSE_LA_NOTALLOWED		= 0x0c,
 | 
					 | 
				
			||||||
	GMM_CAUSE_ROAMING_NOTALLOWED	= 0x0d,
 | 
					 | 
				
			||||||
	GMM_CAUSE_NO_GPRS_PLMN		= 0x0e,
 | 
					 | 
				
			||||||
	GMM_CAUSE_MSC_TEMP_NOTREACH	= 0x10,
 | 
					 | 
				
			||||||
	GMM_CAUSE_NET_FAIL		= 0x11,
 | 
					 | 
				
			||||||
	GMM_CAUSE_CONGESTION		= 0x16,
 | 
					 | 
				
			||||||
	GMM_CAUSE_SEM_INCORR_MSG	= 0x5f,
 | 
					 | 
				
			||||||
	GMM_CAUSE_INV_MAND_INFO		= 0x60,
 | 
					 | 
				
			||||||
	GMM_CAUSE_MSGT_NOTEXIST_NOTIMPL	= 0x61,
 | 
					 | 
				
			||||||
	GMM_CAUSE_MSGT_INCOMP_P_STATE	= 0x62,
 | 
					 | 
				
			||||||
	GMM_CAUSE_IE_NOTEXIST_NOTIMPL	= 0x63,
 | 
					 | 
				
			||||||
	GMM_CAUSE_COND_IE_ERR		= 0x64,
 | 
					 | 
				
			||||||
	GMM_CAUSE_MSG_INCOMP_P_STATE	= 0x65,
 | 
					 | 
				
			||||||
	GMM_CAUSE_PROTO_ERR_UNSPEC	= 0x6f,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Chapter 10.4.6.6 / Table 10.5.157 */
 | 
					 | 
				
			||||||
enum gsm48_gsm_cause {
 | 
					 | 
				
			||||||
	GSM_CAUSE_INSUFF_RSRC		= 0x1a,
 | 
					 | 
				
			||||||
	GSM_CAUSE_MISSING_APN		= 0x1b,
 | 
					 | 
				
			||||||
	GSM_CAUSE_UNKNOWN_PDP		= 0x1c,
 | 
					 | 
				
			||||||
	GSM_CAUSE_AUTH_FAILED		= 0x1d,
 | 
					 | 
				
			||||||
	GSM_CAUSE_ACT_REJ_GGSN		= 0x1e,
 | 
					 | 
				
			||||||
	GSM_CAUSE_ACT_REJ_UNSPEC	= 0x1f,
 | 
					 | 
				
			||||||
	GSM_CAUSE_SERV_OPT_NOTSUPP	= 0x20,
 | 
					 | 
				
			||||||
	GSM_CAUSE_REQ_SERV_OPT_NOTSUB	= 0x21,
 | 
					 | 
				
			||||||
	GSM_CAUSE_SERV_OPT_TEMP_OOO	= 0x22,
 | 
					 | 
				
			||||||
	GSM_CAUSE_NSAPI_IN_USE		= 0x23,
 | 
					 | 
				
			||||||
	GSM_CAUSE_DEACT_REGULAR		= 0x24,
 | 
					 | 
				
			||||||
	GSM_CAUSE_QOS_NOT_ACCEPTED	= 0x25,
 | 
					 | 
				
			||||||
	GSM_CAUSE_NET_FAIL		= 0x26,
 | 
					 | 
				
			||||||
	GSM_CAUSE_REACT_RQD		= 0x27,
 | 
					 | 
				
			||||||
	GSM_CAUSE_FEATURE_NOTSUPP	= 0x28,
 | 
					 | 
				
			||||||
	GSM_CAUSE_INVALID_TRANS_ID	= 0x51,
 | 
					 | 
				
			||||||
	GSM_CAUSE_SEM_INCORR_MSG	= 0x5f,
 | 
					 | 
				
			||||||
	GSM_CAUSE_INV_MAND_INFO		= 0x60,
 | 
					 | 
				
			||||||
	GSM_CAUSE_MSGT_NOTEXIST_NOTIMPL	= 0x61,
 | 
					 | 
				
			||||||
	GSM_CAUSE_MSGT_INCOMP_P_STATE	= 0x62,
 | 
					 | 
				
			||||||
	GSM_CAUSE_IE_NOTEXIST_NOTIMPL	= 0x63,
 | 
					 | 
				
			||||||
	GSM_CAUSE_COND_IE_ERR		= 0x64,
 | 
					 | 
				
			||||||
	GSM_CAUSE_MSG_INCOMP_P_STATE	= 0x65,
 | 
					 | 
				
			||||||
	GSM_CAUSE_PROTO_ERR_UNSPEC	= 0x6f,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Section 6.1.2.2: Session management states on the network side */
 | 
					 | 
				
			||||||
enum gsm48_pdp_state {
 | 
					 | 
				
			||||||
	PDP_S_INACTIVE,
 | 
					 | 
				
			||||||
	PDP_S_ACTIVE_PENDING,
 | 
					 | 
				
			||||||
	PDP_S_ACTIVE,
 | 
					 | 
				
			||||||
	PDP_S_INACTIVE_PENDING,
 | 
					 | 
				
			||||||
	PDP_S_MODIFY_PENDING,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Table 10.5.155/3GPP TS 24.008 */
 | 
					 | 
				
			||||||
enum gsm48_pdp_type_org {
 | 
					 | 
				
			||||||
	PDP_TYPE_ORG_ETSI		= 0x00,
 | 
					 | 
				
			||||||
	PDP_TYPE_ORG_IETF		= 0x01,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
enum gsm48_pdp_type_nr {
 | 
					 | 
				
			||||||
	PDP_TYPE_N_ETSI_RESERVED	= 0x00,
 | 
					 | 
				
			||||||
	PDP_TYPE_N_ETSI_PPP		= 0x01,
 | 
					 | 
				
			||||||
	PDP_TYPE_N_IETF_IPv4		= 0x21,
 | 
					 | 
				
			||||||
	PDP_TYPE_N_IETF_IPv6		= 0x57,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_reliab_class {
 | 
					 | 
				
			||||||
	GSM48_QOS_RC_LLC_ACK_RLC_ACK_DATA_PROT	= 2,
 | 
					 | 
				
			||||||
	GSM48_QOS_RC_LLC_UN_RLC_ACK_DATA_PROT	= 3,
 | 
					 | 
				
			||||||
	GSM48_QOS_RC_LLC_UN_RLC_UN_PROT_DATA	= 4,
 | 
					 | 
				
			||||||
	GSM48_QOS_RC_LLC_UN_RLC_UN_DATA_UN	= 5,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_preced_class {
 | 
					 | 
				
			||||||
	GSM48_QOS_PC_HIGH	= 1,
 | 
					 | 
				
			||||||
	GSM48_QOS_PC_NORMAL	= 2,
 | 
					 | 
				
			||||||
	GSM48_QOS_PC_LOW	= 3,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_peak_tput {
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_1000bps	= 1,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_2000bps	= 2,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_4000bps	= 3,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_8000bps	= 4,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_16000bps	= 5,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_32000bps	= 6,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_64000bps	= 7,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_128000bps	= 8,
 | 
					 | 
				
			||||||
	GSM48_QOS_PEAK_TPUT_256000bps	= 9,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_mean_tput {
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_100bph	= 1,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_200bph	= 2,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_500bph	= 3,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_1000bph	= 4,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_2000bph	= 5,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_5000bph	= 6,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_10000bph	= 7,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_20000bph	= 8,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_50000bph	= 9,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_100kbph	= 10,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_200kbph	= 11,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_500kbph	= 0xc,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_1Mbph	= 0xd,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_2Mbph	= 0xe,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_5Mbph	= 0xf,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_10Mbph	= 0x10,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_20Mbph	= 0x11,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_50Mbph	= 0x12,
 | 
					 | 
				
			||||||
	GSM48_QOS_MEAN_TPUT_BEST_EFFORT	= 0x1f,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_err_sdu {
 | 
					 | 
				
			||||||
	GSM48_QOS_ERRSDU_NODETECT	= 1,
 | 
					 | 
				
			||||||
	GSM48_QOS_ERRSDU_YES		= 2,
 | 
					 | 
				
			||||||
	GSM48_QOS_ERRSDU_NO		= 3,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_deliv_order {
 | 
					 | 
				
			||||||
	GSM48_QOS_DO_ORDERED		= 1,
 | 
					 | 
				
			||||||
	GSM48_QOS_DO_UNORDERED		= 2,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_traf_class {
 | 
					 | 
				
			||||||
	GSM48_QOS_TC_CONVERSATIONAL	= 1,
 | 
					 | 
				
			||||||
	GSM48_QOS_TC_STREAMING		= 2,
 | 
					 | 
				
			||||||
	GSM48_QOS_TC_INTERACTIVE	= 3,
 | 
					 | 
				
			||||||
	GSM48_QOS_TC_BACKGROUND		= 4,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_max_sdu_size {
 | 
					 | 
				
			||||||
	/* values below in 10 octet granularity */
 | 
					 | 
				
			||||||
	GSM48_QOS_MAXSDU_1502		= 0x97,
 | 
					 | 
				
			||||||
	GSM48_QOS_MAXSDU_1510		= 0x98,
 | 
					 | 
				
			||||||
	GSM48_QOS_MAXSDU_1520		= 0x99,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_max_bitrate {
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_1k		= 0x01,
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_63k		= 0x3f,
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_64k		= 0x40,
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_568k		= 0x7f,
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_576k		= 0x80,
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_8640k		= 0xfe,
 | 
					 | 
				
			||||||
	GSM48_QOS_MBRATE_0k		= 0xff,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_resid_ber {
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_5e_2		= 0x01,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_1e_2		= 0x02,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_5e_3		= 0x03,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_4e_3		= 0x04,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_1e_3		= 0x05,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_1e_4		= 0x06,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_1e_5		= 0x07,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_1e_6		= 0x08,
 | 
					 | 
				
			||||||
	GSM48_QOS_RBER_6e_8		= 0x09,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
enum gsm48_qos_sdu_err {
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_1e_2		= 0x01,
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_7e_2		= 0x02,
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_1e_3		= 0x03,
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_1e_4		= 0x04,
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_1e_5		= 0x05,
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_1e_6		= 0x06,
 | 
					 | 
				
			||||||
	GSM48_QOS_SERR_1e_1		= 0x07,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Figure 10.5.138/24.008 / Chapter 10.5.6.5 */
 | 
					 | 
				
			||||||
struct gsm48_qos {
 | 
					 | 
				
			||||||
	/* octet 3 */
 | 
					 | 
				
			||||||
	uint8_t reliab_class:3;
 | 
					 | 
				
			||||||
	uint8_t delay_class:3;
 | 
					 | 
				
			||||||
	uint8_t spare:2;
 | 
					 | 
				
			||||||
	/* octet 4 */
 | 
					 | 
				
			||||||
	uint8_t preced_class:3;
 | 
					 | 
				
			||||||
	uint8_t spare2:1;
 | 
					 | 
				
			||||||
	uint8_t peak_tput:4;
 | 
					 | 
				
			||||||
	/* octet 5 */
 | 
					 | 
				
			||||||
	uint8_t mean_tput:5;
 | 
					 | 
				
			||||||
	uint8_t spare3:3;
 | 
					 | 
				
			||||||
	/* octet 6 */
 | 
					 | 
				
			||||||
	uint8_t deliv_err_sdu:3;
 | 
					 | 
				
			||||||
	uint8_t deliv_order:2;
 | 
					 | 
				
			||||||
	uint8_t traf_class:3;
 | 
					 | 
				
			||||||
	/* octet 7 */
 | 
					 | 
				
			||||||
	uint8_t max_sdu_size;
 | 
					 | 
				
			||||||
	/* octet 8 */
 | 
					 | 
				
			||||||
	uint8_t max_bitrate_up;
 | 
					 | 
				
			||||||
	/* octet 9 */
 | 
					 | 
				
			||||||
	uint8_t max_bitrate_down;
 | 
					 | 
				
			||||||
	/* octet 10 */
 | 
					 | 
				
			||||||
	uint8_t sdu_err_ratio:4;
 | 
					 | 
				
			||||||
	uint8_t resid_ber:4;
 | 
					 | 
				
			||||||
	/* octet 11 */
 | 
					 | 
				
			||||||
	uint8_t handling_prio:2;
 | 
					 | 
				
			||||||
	uint8_t xfer_delay:6;
 | 
					 | 
				
			||||||
	/* octet 12 */
 | 
					 | 
				
			||||||
	uint8_t guar_bitrate_up;
 | 
					 | 
				
			||||||
	/* octet 13 */
 | 
					 | 
				
			||||||
	uint8_t guar_bitrate_down;
 | 
					 | 
				
			||||||
	/* octet 14 */
 | 
					 | 
				
			||||||
	uint8_t src_stats_desc:4;
 | 
					 | 
				
			||||||
	uint8_t sig_ind:1;
 | 
					 | 
				
			||||||
	uint8_t spare5:3;
 | 
					 | 
				
			||||||
	/* octet 15 */
 | 
					 | 
				
			||||||
	uint8_t max_bitrate_down_ext;
 | 
					 | 
				
			||||||
	/* octet 16 */
 | 
					 | 
				
			||||||
	uint8_t guar_bitrate_down_ext;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _GSM48_GPRS_H */
 | 
					 | 
				
			||||||
@@ -1,40 +1,216 @@
 | 
				
			|||||||
#ifndef _GSM_04_11_H
 | 
					#ifndef _GSM_04_11_H
 | 
				
			||||||
#define _GSM_04_11_H
 | 
					#define _GSM_04_11_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_04_11.h>
 | 
					/* GSM TS 04.11  definitions */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UM_SAPI_SMS 3	/* See GSM 04.05/04.06 */
 | 
					/* 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 */
 | 
					/* SMS deliver PDU */
 | 
				
			||||||
struct sms_deliver {
 | 
					struct sms_deliver {
 | 
				
			||||||
	uint8_t mti:2;		/* message type indicator */
 | 
						u_int8_t mti:2;		/* message type indicator */
 | 
				
			||||||
	uint8_t mms:1;		/* more messages to send */
 | 
						u_int8_t mms:1;		/* more messages to send */
 | 
				
			||||||
	uint8_t rp:1;		/* reply path */
 | 
						u_int8_t rp:1;		/* reply path */
 | 
				
			||||||
	uint8_t udhi:1;	/* user data header indicator */
 | 
						u_int8_t udhi:1;	/* user data header indicator */
 | 
				
			||||||
	uint8_t sri:1;		/* status report indication */
 | 
						u_int8_t sri:1;		/* status report indication */
 | 
				
			||||||
	uint8_t *orig_addr;	/* originating address */
 | 
						u_int8_t *orig_addr;	/* originating address */
 | 
				
			||||||
	uint8_t pid;		/* protocol identifier */
 | 
						u_int8_t pid;		/* protocol identifier */
 | 
				
			||||||
	uint8_t dcs;		/* data coding scheme */
 | 
						u_int8_t dcs;		/* data coding scheme */
 | 
				
			||||||
				/* service centre time stamp */
 | 
									/* service centre time stamp */
 | 
				
			||||||
	uint8_t ud_len;	/* user data length */
 | 
						u_int8_t ud_len;	/* user data length */
 | 
				
			||||||
	uint8_t *user_data;	/* user data */
 | 
						u_int8_t *user_data;	/* user data */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint8_t msg_ref;	/* message reference */
 | 
						u_int8_t msg_ref;	/* message reference */
 | 
				
			||||||
	uint8_t *smsc;
 | 
						u_int8_t *smsc;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct msgb;
 | 
					struct msgb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn, struct msgb *msg);
 | 
					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);
 | 
					struct gsm_sms *sms_alloc(void);
 | 
				
			||||||
void sms_free(struct gsm_sms *sms);
 | 
					void sms_free(struct gsm_sms *sms);
 | 
				
			||||||
struct gsm_sms *sms_from_text(struct gsm_subscriber *receiver, int dcs, const char *text);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void _gsm411_sms_trans_free(struct gsm_trans *trans);
 | 
					void _gsm411_sms_trans_free(struct gsm_trans *trans);
 | 
				
			||||||
int gsm411_send_sms_subscr(struct gsm_subscriber *subscr,
 | 
					int gsm411_send_sms_subscr(struct gsm_subscriber *subscr,
 | 
				
			||||||
			   struct gsm_sms *sms);
 | 
								   struct gsm_sms *sms);
 | 
				
			||||||
int gsm411_send_sms(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
		    struct gsm_sms *sms);
 | 
					 | 
				
			||||||
void gsm411_sapi_n_reject(struct gsm_subscriber_connection *conn);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,20 +1,143 @@
 | 
				
			|||||||
#ifndef _GSM_04_80_H
 | 
					#ifndef _GSM_04_80_H
 | 
				
			||||||
#define _GSM_04_80_H
 | 
					#define _GSM_04_80_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/core/msgb.h>
 | 
					/* GSM TS 04.80  definitions (Supplementary Services Specification, Formats and Coding) */
 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_04_80.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/gsm0480.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_subscriber_connection;
 | 
					/* Section 3.4 */
 | 
				
			||||||
 | 
					#define GSM0480_MTYPE_RELEASE_COMPLETE	0x2A
 | 
				
			||||||
 | 
					#define GSM0480_MTYPE_FACILITY			0x3A
 | 
				
			||||||
 | 
					#define GSM0480_MTYPE_REGISTER			0x3B
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm0480_send_ussd_response(struct gsm_subscriber_connection *conn,
 | 
					/* Section 3.5 */
 | 
				
			||||||
			       const struct msgb *in_msg, const char* response_text, 
 | 
					#define GSM0480_IE_FACILITY			0x1C
 | 
				
			||||||
			       const struct ussd_request *req);
 | 
					#define GSM0480_IE_SS_VERSION			0x7F
 | 
				
			||||||
int gsm0480_send_ussd_reject(struct gsm_subscriber_connection *conn,
 | 
					 | 
				
			||||||
			     const struct msgb *msg, 
 | 
					 | 
				
			||||||
			     const struct ussd_request *request);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm0480_send_ussdNotify(struct gsm_subscriber_connection *conn, int level, const char *text);
 | 
					/* Section 3.6.2 */
 | 
				
			||||||
int gsm0480_send_releaseComplete(struct gsm_subscriber_connection *conn);
 | 
					#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
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,49 +1,90 @@
 | 
				
			|||||||
#ifndef _GSM_DATA_H
 | 
					#ifndef _GSM_DATA_H
 | 
				
			||||||
#define _GSM_DATA_H
 | 
					#define _GSM_DATA_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <osmocom/core/timer.h>
 | 
					struct value_string {
 | 
				
			||||||
#include <osmocom/core/select.h>
 | 
						unsigned int value;
 | 
				
			||||||
 | 
						const char *str;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <openbsc/rest_octets.h>
 | 
					const char *get_value_string(const struct value_string *vs, u_int32_t val);
 | 
				
			||||||
#include <osmocom/abis/e1_input.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OBSC_NM_W_ACK_CB(__msgb) (__msgb)->cb[3]
 | 
					enum gsm_band {
 | 
				
			||||||
 | 
						GSM_BAND_400,
 | 
				
			||||||
 | 
						GSM_BAND_850,
 | 
				
			||||||
 | 
						GSM_BAND_900,
 | 
				
			||||||
 | 
						GSM_BAND_1800,
 | 
				
			||||||
 | 
						GSM_BAND_1900,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct mncc_sock_state;
 | 
					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,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* the data structure stored in msgb->cb for openbsc apps */
 | 
					enum gsm_chan_t {
 | 
				
			||||||
struct openbsc_msgb_cb {
 | 
						GSM_LCHAN_NONE,
 | 
				
			||||||
	unsigned char *bssgph;
 | 
						GSM_LCHAN_SDCCH,
 | 
				
			||||||
	unsigned char *llch;
 | 
						GSM_LCHAN_TCH_F,
 | 
				
			||||||
 | 
						GSM_LCHAN_TCH_H,
 | 
				
			||||||
 | 
						GSM_LCHAN_UNKNOWN,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Cell Identifier */
 | 
					/* RRLP mode of operation */
 | 
				
			||||||
	unsigned char *bssgp_cell_id;
 | 
					enum rrlp_mode {
 | 
				
			||||||
 | 
						RRLP_MODE_NONE,
 | 
				
			||||||
 | 
						RRLP_MODE_MS_BASED,
 | 
				
			||||||
 | 
						RRLP_MODE_MS_PREF,
 | 
				
			||||||
 | 
						RRLP_MODE_ASS_PREF,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Identifiers of a BTS, equal to 'struct bssgp_bts_ctx' */
 | 
					/* Channel Request reason */
 | 
				
			||||||
	uint16_t nsei;
 | 
					enum gsm_chreq_reason_t {
 | 
				
			||||||
	uint16_t bvci;
 | 
						GSM_CHREQ_REASON_EMERG,
 | 
				
			||||||
 | 
						GSM_CHREQ_REASON_PAG,
 | 
				
			||||||
 | 
						GSM_CHREQ_REASON_CALL,
 | 
				
			||||||
 | 
						GSM_CHREQ_REASON_LOCATION_UPD,
 | 
				
			||||||
 | 
						GSM_CHREQ_REASON_OTHER,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Identifier of a MS (inside BTS), equal to 'struct sgsn_mm_ctx' */
 | 
					#include <openbsc/timer.h>
 | 
				
			||||||
	uint32_t tlli;
 | 
					#include <openbsc/gsm_04_08.h>
 | 
				
			||||||
} __attribute__((packed));
 | 
					#include <openbsc/abis_rsl.h>
 | 
				
			||||||
#define OBSC_MSGB_CB(__msgb)	((struct openbsc_msgb_cb *)&((__msgb)->cb[0]))
 | 
					#include <openbsc/mncc.h>
 | 
				
			||||||
#define msgb_tlli(__x)		OBSC_MSGB_CB(__x)->tlli
 | 
					#include <openbsc/tlv.h>
 | 
				
			||||||
#define msgb_nsei(__x)		OBSC_MSGB_CB(__x)->nsei
 | 
					#include <openbsc/bitvec.h>
 | 
				
			||||||
#define msgb_bvci(__x)		OBSC_MSGB_CB(__x)->bvci
 | 
					 | 
				
			||||||
#define msgb_gmmh(__x)		(__x)->l3h
 | 
					 | 
				
			||||||
#define msgb_bssgph(__x)	OBSC_MSGB_CB(__x)->bssgph
 | 
					 | 
				
			||||||
#define msgb_bssgp_len(__x)	((__x)->tail - (uint8_t *)msgb_bssgph(__x))
 | 
					 | 
				
			||||||
#define msgb_bcid(__x)		OBSC_MSGB_CB(__x)->bssgp_cell_id
 | 
					 | 
				
			||||||
#define msgb_llch(__x)		OBSC_MSGB_CB(__x)->llch
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OBSC_LINKID_CB(__msgb)	(__msgb)->cb[3]
 | 
					#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum gsm_security_event {
 | 
					#define TRX_NR_TS	8
 | 
				
			||||||
	GSM_SECURITY_NOAVAIL,
 | 
					#define TS_MAX_LCHAN	8
 | 
				
			||||||
	GSM_SECURITY_AUTH_FAILED,
 | 
					
 | 
				
			||||||
	GSM_SECURITY_SUCCEEDED,
 | 
					#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;
 | 
					struct msgb;
 | 
				
			||||||
@@ -52,27 +93,57 @@ typedef int gsm_cbfn(unsigned int hooknum,
 | 
				
			|||||||
		     struct msgb *msg,
 | 
							     struct msgb *msg,
 | 
				
			||||||
		     void *data, void *param);
 | 
							     void *data, void *param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Real authentication information containing Ki */
 | 
					/* communications link with a BTS */
 | 
				
			||||||
enum gsm_auth_algo {
 | 
					struct gsm_bts_link {
 | 
				
			||||||
	AUTH_ALGO_NONE,
 | 
						struct gsm_bts *bts;
 | 
				
			||||||
	AUTH_ALGO_XOR,
 | 
					 | 
				
			||||||
	AUTH_ALGO_COMP128v1,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_auth_info {
 | 
					struct sccp_connection;
 | 
				
			||||||
	enum gsm_auth_algo auth_algo;
 | 
					struct gsm_lchan;
 | 
				
			||||||
	unsigned int a3a8_ki_len;
 | 
					struct gsm_subscriber;
 | 
				
			||||||
	uint8_t a3a8_ki[16];
 | 
					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;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_auth_tuple {
 | 
					#define GSM0808_T10_VALUE	6, 0
 | 
				
			||||||
	int use_count;
 | 
					#define sccp_get_lchan(data_ctx) ((struct bss_sccp_connection_data *)data_ctx)->lchan
 | 
				
			||||||
	int key_seq;
 | 
					#define lchan_get_sccp(lchan) lchan->msc_data->sccp
 | 
				
			||||||
	uint8_t rand[16];
 | 
					struct bss_sccp_connection_data *bss_sccp_create_data();
 | 
				
			||||||
	uint8_t sres[4];
 | 
					void bss_sccp_free_data(struct bss_sccp_connection_data *);
 | 
				
			||||||
	uint8_t kc[8];
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Network Management State */
 | 
				
			||||||
 | 
					struct gsm_nm_state {
 | 
				
			||||||
 | 
						u_int8_t operational;
 | 
				
			||||||
 | 
						u_int8_t administrative;
 | 
				
			||||||
 | 
						u_int8_t availability;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#define GSM_KEY_SEQ_INVAL	7	/* GSM 04.08 - 10.5.1.2 */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * LOCATION UPDATING REQUEST state
 | 
					 * LOCATION UPDATING REQUEST state
 | 
				
			||||||
@@ -82,27 +153,9 @@ struct gsm_auth_tuple {
 | 
				
			|||||||
 *	- Accept/Reject according to global policy
 | 
					 *	- Accept/Reject according to global policy
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct gsm_loc_updating_operation {
 | 
					struct gsm_loc_updating_operation {
 | 
				
			||||||
        struct osmo_timer_list updating_timer;
 | 
					        struct timer_list updating_timer;
 | 
				
			||||||
	unsigned int waiting_for_imsi : 1;
 | 
						unsigned int waiting_for_imsi : 1;
 | 
				
			||||||
	unsigned int waiting_for_imei : 1;
 | 
						unsigned int waiting_for_imei : 1;
 | 
				
			||||||
	unsigned int key_seq : 4;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * AUTHENTICATION/CIPHERING state
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct gsm_security_operation {
 | 
					 | 
				
			||||||
	struct gsm_auth_tuple atuple;
 | 
					 | 
				
			||||||
	gsm_cbfn *cb;
 | 
					 | 
				
			||||||
	void *cb_data;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * A dummy to keep a connection up for at least
 | 
					 | 
				
			||||||
 * a couple of seconds to work around MSC issues.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct gsm_anchor_operation {
 | 
					 | 
				
			||||||
	struct osmo_timer_list timeout;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Maximum number of neighbor cells whose average we track */
 | 
					/* Maximum number of neighbor cells whose average we track */
 | 
				
			||||||
@@ -112,101 +165,357 @@ struct gsm_anchor_operation {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* processed neighbor measurements for one cell */
 | 
					/* processed neighbor measurements for one cell */
 | 
				
			||||||
struct neigh_meas_proc {
 | 
					struct neigh_meas_proc {
 | 
				
			||||||
	uint16_t arfcn;
 | 
						u_int16_t arfcn;
 | 
				
			||||||
	uint8_t bsic;
 | 
						u_int8_t bsic;
 | 
				
			||||||
	uint8_t rxlev[MAX_WIN_NEIGH_AVG];
 | 
						u_int8_t rxlev[MAX_WIN_NEIGH_AVG];
 | 
				
			||||||
	unsigned int rxlev_cnt;
 | 
						unsigned int rxlev_cnt;
 | 
				
			||||||
	uint8_t last_seen_nr;
 | 
						u_int8_t last_seen_nr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* the per subscriber data for lchan */
 | 
					#define MAX_A5_KEY_LEN	(128/8)
 | 
				
			||||||
struct gsm_subscriber_connection {
 | 
					#define RSL_ENC_ALG_A5(x)	(x+1)
 | 
				
			||||||
	struct llist_head entry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 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 */
 | 
						/* To whom we are allocated at the moment */
 | 
				
			||||||
	struct gsm_subscriber *subscr;
 | 
						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
 | 
						 * Operations that have a state and might be pending
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	struct gsm_loc_updating_operation *loc_operation;
 | 
						struct gsm_loc_updating_operation *loc_operation;
 | 
				
			||||||
	struct gsm_security_operation *sec_operation;
 | 
					 | 
				
			||||||
	struct gsm_anchor_operation *anch_operation;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Are we part of a special "silent" call */
 | 
						/*
 | 
				
			||||||
	int silent_call;
 | 
						 * MSC handling...
 | 
				
			||||||
	int put_channel;
 | 
						 */
 | 
				
			||||||
 | 
						struct bss_sccp_connection_data *msc_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* bsc structures */
 | 
					 | 
				
			||||||
	struct osmo_bsc_sccp_con *sccp_con;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* back pointers */
 | 
						/* use count. how many users use this channel */
 | 
				
			||||||
	int in_release;
 | 
						unsigned int use_count;
 | 
				
			||||||
	struct gsm_lchan *lchan;
 | 
					 | 
				
			||||||
	struct gsm_lchan *ho_lchan;
 | 
					 | 
				
			||||||
	struct gsm_bts *bts;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* for assignment handling */
 | 
						/* cache of last measurement reports on this lchan */
 | 
				
			||||||
	struct osmo_timer_list T10;
 | 
						struct gsm_meas_rep meas_rep[6];
 | 
				
			||||||
	struct gsm_lchan *secondary_lchan;
 | 
						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 ROLE_BSC
 | 
					#define BTS_TRX_F_ACTIVATED	0x0001
 | 
				
			||||||
#include "gsm_data_shared.h"
 | 
					/* 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 */
 | 
					/* Some statistics of our network */
 | 
				
			||||||
struct gsmnet_stats {
 | 
					struct gsmnet_stats {
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *total;
 | 
							unsigned long total;
 | 
				
			||||||
		struct osmo_counter *no_channel;
 | 
							unsigned long no_channel;
 | 
				
			||||||
	} chreq;
 | 
						} chreq;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *attempted;
 | 
							unsigned long attempted;
 | 
				
			||||||
		struct osmo_counter *no_channel;	/* no channel available */
 | 
							unsigned long no_channel;	/* no channel available */
 | 
				
			||||||
		struct osmo_counter *timeout;		/* T3103 timeout */
 | 
							unsigned long timeout;		/* T3103 timeout */
 | 
				
			||||||
		struct osmo_counter *completed;	/* HO COMPL received */
 | 
							unsigned long completed;	/* HO COMPL received */
 | 
				
			||||||
		struct osmo_counter *failed;		/* HO FAIL received */
 | 
							unsigned long failed;		/* HO FAIL received */
 | 
				
			||||||
	} handover;
 | 
						} handover;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *attach;
 | 
							unsigned long attach;
 | 
				
			||||||
		struct osmo_counter *normal;
 | 
							unsigned long normal;
 | 
				
			||||||
		struct osmo_counter *periodic;
 | 
							unsigned long periodic;
 | 
				
			||||||
		struct osmo_counter *detach;
 | 
							unsigned long detach;
 | 
				
			||||||
	} loc_upd_type;
 | 
						} loc_upd_type;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *reject;
 | 
							unsigned long reject;
 | 
				
			||||||
		struct osmo_counter *accept;
 | 
							unsigned long accept;
 | 
				
			||||||
	} loc_upd_resp;
 | 
						} loc_upd_resp;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *attempted;
 | 
							unsigned long attempted;
 | 
				
			||||||
		struct osmo_counter *detached;
 | 
							unsigned long detached;
 | 
				
			||||||
		struct osmo_counter *completed;
 | 
							unsigned long completed;
 | 
				
			||||||
		struct osmo_counter *expired;
 | 
							unsigned long expired;
 | 
				
			||||||
	} paging;
 | 
						} paging;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *submitted; /* MO SMS submissions */
 | 
							unsigned long submitted; /* MO SMS submissions */
 | 
				
			||||||
		struct osmo_counter *no_receiver;
 | 
							unsigned long no_receiver;
 | 
				
			||||||
		struct osmo_counter *delivered; /* MT SMS deliveries */
 | 
							unsigned long delivered; /* MT SMS deliveries */
 | 
				
			||||||
		struct osmo_counter *rp_err_mem;
 | 
							unsigned long rp_err_mem;
 | 
				
			||||||
		struct osmo_counter *rp_err_other;
 | 
							unsigned long rp_err_other;
 | 
				
			||||||
	} sms;
 | 
						} sms;
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct osmo_counter *mo_setup;
 | 
							unsigned long dialled;	/* total number of dialled calls */
 | 
				
			||||||
		struct osmo_counter *mo_connect_ack;
 | 
							unsigned long alerted;	/* we alerted the other end */
 | 
				
			||||||
		struct osmo_counter *mt_setup;
 | 
							unsigned long connected;/* how many calls were accepted */
 | 
				
			||||||
		struct osmo_counter *mt_connect;
 | 
					 | 
				
			||||||
	} call;
 | 
						} call;
 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_counter *rf_fail;
 | 
					 | 
				
			||||||
		struct osmo_counter *rll_err;
 | 
					 | 
				
			||||||
	} chan;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct osmo_counter *oml_fail;
 | 
					 | 
				
			||||||
		struct osmo_counter *rsl_fail;
 | 
					 | 
				
			||||||
	} bts;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum gsm_auth_policy {
 | 
					enum gsm_auth_policy {
 | 
				
			||||||
@@ -218,10 +527,18 @@ enum gsm_auth_policy {
 | 
				
			|||||||
#define GSM_T3101_DEFAULT 10
 | 
					#define GSM_T3101_DEFAULT 10
 | 
				
			||||||
#define GSM_T3113_DEFAULT 60
 | 
					#define GSM_T3113_DEFAULT 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * internal data for audio management
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct gsm_audio_support {
 | 
				
			||||||
 | 
						u_int8_t hr  : 1,
 | 
				
			||||||
 | 
							 ver : 7;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_network {
 | 
					struct gsm_network {
 | 
				
			||||||
	/* global parameters */
 | 
						/* global parameters */
 | 
				
			||||||
	uint16_t country_code;
 | 
						u_int16_t country_code;
 | 
				
			||||||
	uint16_t network_code;
 | 
						u_int16_t network_code;
 | 
				
			||||||
	char *name_long;
 | 
						char *name_long;
 | 
				
			||||||
	char *name_short;
 | 
						char *name_short;
 | 
				
			||||||
	enum gsm_auth_policy auth_policy;
 | 
						enum gsm_auth_policy auth_policy;
 | 
				
			||||||
@@ -248,12 +565,15 @@ struct gsm_network {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	struct gsmnet_stats stats;
 | 
						struct gsmnet_stats stats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct gsm_audio_support **audio_support;
 | 
				
			||||||
 | 
						int audio_length;
 | 
				
			||||||
 | 
						int rtp_payload;
 | 
				
			||||||
 | 
						int rtp_base_port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* layer 4 */
 | 
						/* layer 4 */
 | 
				
			||||||
	struct mncc_sock_state *mncc_state;
 | 
						int (*mncc_recv) (struct gsm_network *net, int msg_type, void *arg);
 | 
				
			||||||
	int (*mncc_recv) (struct gsm_network *net, struct msgb *msg);
 | 
					 | 
				
			||||||
	struct llist_head upqueue;
 | 
						struct llist_head upqueue;
 | 
				
			||||||
	struct llist_head trans_list;
 | 
						struct llist_head trans_list;
 | 
				
			||||||
	struct bsc_api *bsc_api;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int num_bts;
 | 
						unsigned int num_bts;
 | 
				
			||||||
	struct llist_head bts_list;
 | 
						struct llist_head bts_list;
 | 
				
			||||||
@@ -269,7 +589,6 @@ struct gsm_network {
 | 
				
			|||||||
	int T3115;
 | 
						int T3115;
 | 
				
			||||||
	int T3117;
 | 
						int T3117;
 | 
				
			||||||
	int T3119;
 | 
						int T3119;
 | 
				
			||||||
	int T3122;
 | 
					 | 
				
			||||||
	int T3141;
 | 
						int T3141;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Radio Resource Location Protocol (TS 04.31) */
 | 
						/* Radio Resource Location Protocol (TS 04.31) */
 | 
				
			||||||
@@ -277,20 +596,9 @@ struct gsm_network {
 | 
				
			|||||||
		enum rrlp_mode mode;
 | 
							enum rrlp_mode mode;
 | 
				
			||||||
	} rrlp;
 | 
						} rrlp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* enable the DTXu and DTXd for this network */
 | 
						/* a hack for On Waves. It must be signed */
 | 
				
			||||||
	int dtx_enabled;
 | 
						int32_t core_country_code;
 | 
				
			||||||
 | 
						int32_t core_network_code;
 | 
				
			||||||
	enum gsm_chan_t ctype_by_chreq[16];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Use a TCH for handling requests of type paging any */
 | 
					 | 
				
			||||||
	int pag_any_tch;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* MSC data in case we are a true BSC */
 | 
					 | 
				
			||||||
	struct osmo_msc_data *msc_data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* subscriber related features */
 | 
					 | 
				
			||||||
	int keep_subscr;
 | 
					 | 
				
			||||||
	struct gsm_sms_queue *sms_queue;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SMS_HDR_SIZE	128
 | 
					#define SMS_HDR_SIZE	128
 | 
				
			||||||
@@ -301,35 +609,56 @@ struct gsm_sms {
 | 
				
			|||||||
	struct gsm_subscriber *receiver;
 | 
						struct gsm_subscriber *receiver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned long validity_minutes;
 | 
						unsigned long validity_minutes;
 | 
				
			||||||
	uint8_t reply_path_req;
 | 
						u_int8_t reply_path_req;
 | 
				
			||||||
	uint8_t status_rep_req;
 | 
						u_int8_t status_rep_req;
 | 
				
			||||||
	uint8_t ud_hdr_ind;
 | 
						u_int8_t ud_hdr_ind;
 | 
				
			||||||
	uint8_t protocol_id;
 | 
						u_int8_t protocol_id;
 | 
				
			||||||
	uint8_t data_coding_scheme;
 | 
						u_int8_t data_coding_scheme;
 | 
				
			||||||
	uint8_t msg_ref;
 | 
						u_int8_t msg_ref;
 | 
				
			||||||
	char dest_addr[20+1];	/* DA LV is 12 bytes max, i.e. 10 bytes
 | 
						char dest_addr[20+1];	/* DA LV is 12 bytes max, i.e. 10 bytes
 | 
				
			||||||
				 * BCD == 20 bytes string */
 | 
									 * BCD == 20 bytes string */
 | 
				
			||||||
	uint8_t user_data_len;
 | 
						u_int8_t user_data_len;
 | 
				
			||||||
	uint8_t user_data[SMS_TEXT_SIZE];
 | 
						u_int8_t user_data[SMS_TEXT_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char text[SMS_TEXT_SIZE];
 | 
						char text[SMS_TEXT_SIZE];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code,
 | 
					struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_code,
 | 
				
			||||||
				     int (*mncc_recv)(struct gsm_network *, struct msgb *));
 | 
									     int (*mncc_recv)(struct gsm_network *, int, void *));
 | 
				
			||||||
int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
 | 
					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);
 | 
					struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Get reference to a neighbor cell on a given BCCH ARFCN */
 | 
					/* Get reference to a neighbor cell on a given BCCH ARFCN */
 | 
				
			||||||
struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
 | 
					struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
 | 
				
			||||||
				 uint16_t arfcn, uint8_t bsic);
 | 
									 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);
 | 
					enum gsm_bts_type parse_btstype(const char *arg);
 | 
				
			||||||
const char *btstype2str(enum gsm_bts_type type);
 | 
					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 *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
 | 
				
			||||||
				struct gsm_bts *start_bts);
 | 
									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 void *tall_bsc_ctx;
 | 
				
			||||||
extern int ipacc_rtp_direct;
 | 
					extern int ipacc_rtp_direct;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -356,36 +685,15 @@ static inline int is_siemens_bts(struct gsm_bts *bts)
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum gsm_auth_policy gsm_auth_policy_parse(const char *arg);
 | 
					enum gsm_auth_policy gsm_auth_policy_parse(const char *arg);
 | 
				
			||||||
const char *gsm_auth_policy_name(enum gsm_auth_policy policy);
 | 
					const char *gsm_auth_policy_name(enum gsm_auth_policy policy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum rrlp_mode rrlp_mode_parse(const char *arg);
 | 
					enum rrlp_mode rrlp_mode_parse(const char *arg);
 | 
				
			||||||
const char *rrlp_mode_name(enum rrlp_mode mode);
 | 
					const char *rrlp_mode_name(enum rrlp_mode mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum bts_gprs_mode bts_gprs_mode_parse(const char *arg);
 | 
					void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked);
 | 
				
			||||||
const char *bts_gprs_mode_name(enum bts_gprs_mode mode);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm48_ra_id_by_bts(uint8_t *buf, struct gsm_bts *bts);
 | 
					 | 
				
			||||||
void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts);
 | 
					 | 
				
			||||||
struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan);
 | 
					struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat);
 | 
					#endif
 | 
				
			||||||
int gsm_bts_model_register(struct gsm_bts_model *model);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_subscriber_connection *subscr_con_allocate(struct gsm_lchan *lchan);
 | 
					 | 
				
			||||||
void subscr_con_free(struct gsm_subscriber_connection *conn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net,
 | 
					 | 
				
			||||||
					enum gsm_bts_type type,
 | 
					 | 
				
			||||||
					uint8_t tsc, uint8_t bsic);
 | 
					 | 
				
			||||||
void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr,
 | 
					 | 
				
			||||||
		   uint8_t e1_ts, uint8_t e1_ts_ss);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked);
 | 
					 | 
				
			||||||
int gsm_bts_has_feature(struct gsm_bts *bts, enum gsm_bts_features feat);
 | 
					 | 
				
			||||||
struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* generic E1 line operations for all ISDN-based BTS. */
 | 
					 | 
				
			||||||
extern struct e1inp_line_ops bts_isdn_e1inp_line_ops;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _GSM_DATA_H */
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,632 +0,0 @@
 | 
				
			|||||||
#ifndef _GSM_DATA_SHAREDH
 | 
					 | 
				
			||||||
#define _GSM_DATA_SHAREDH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <regex.h>
 | 
					 | 
				
			||||||
#include <stdbool.h>
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/core/timer.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/bitvec.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/statistics.h>
 | 
					 | 
				
			||||||
#include <osmocom/core/utils.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/gsm_utils.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/tlv.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/rxlev_stat.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/sysinfo.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_08_58.h>
 | 
					 | 
				
			||||||
#include <osmocom/gsm/protocol/gsm_12_21.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <osmocom/abis/e1_input.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct osmo_msc_data;
 | 
					 | 
				
			||||||
struct osmo_bsc_sccp_con;
 | 
					 | 
				
			||||||
struct gsm_sms_queue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* 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,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* reserved according to GSM 03.03 § 2.4 */
 | 
					 | 
				
			||||||
#define GSM_RESERVED_TMSI   0xFFFFFFFF
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gsm_hooks {
 | 
					 | 
				
			||||||
	GSM_HOOK_NM_SWLOAD,
 | 
					 | 
				
			||||||
	GSM_HOOK_RR_PAGING,
 | 
					 | 
				
			||||||
	GSM_HOOK_RR_SECURITY,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gsm_paging_event {
 | 
					 | 
				
			||||||
	GSM_PAGING_SUCCEEDED,
 | 
					 | 
				
			||||||
	GSM_PAGING_EXPIRED,
 | 
					 | 
				
			||||||
	GSM_PAGING_OOM,
 | 
					 | 
				
			||||||
	GSM_PAGING_BUSY,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum bts_gprs_mode {
 | 
					 | 
				
			||||||
	BTS_GPRS_NONE = 0,
 | 
					 | 
				
			||||||
	BTS_GPRS_GPRS = 1,
 | 
					 | 
				
			||||||
	BTS_GPRS_EGPRS = 2,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_lchan;
 | 
					 | 
				
			||||||
struct gsm_subscriber;
 | 
					 | 
				
			||||||
struct gsm_mncc;
 | 
					 | 
				
			||||||
struct osmo_rtp_socket;
 | 
					 | 
				
			||||||
struct rtp_socket;
 | 
					 | 
				
			||||||
struct bsc_api;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Network Management State */
 | 
					 | 
				
			||||||
struct gsm_nm_state {
 | 
					 | 
				
			||||||
	uint8_t operational;
 | 
					 | 
				
			||||||
	uint8_t administrative;
 | 
					 | 
				
			||||||
	uint8_t availability;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_abis_mo {
 | 
					 | 
				
			||||||
	uint8_t obj_class;
 | 
					 | 
				
			||||||
	struct abis_om_obj_inst obj_inst;
 | 
					 | 
				
			||||||
	const char *name;
 | 
					 | 
				
			||||||
	struct gsm_nm_state nm_state;
 | 
					 | 
				
			||||||
	struct tlv_parsed *nm_attr;
 | 
					 | 
				
			||||||
	struct gsm_bts *bts;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAX_A5_KEY_LEN	(128/8)
 | 
					 | 
				
			||||||
#define A38_XOR_MIN_KEY_LEN	12
 | 
					 | 
				
			||||||
#define A38_XOR_MAX_KEY_LEN	16
 | 
					 | 
				
			||||||
#define A38_COMP128_KEY_LEN	16
 | 
					 | 
				
			||||||
#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_ACT_REQ,	/* channel activatin requested */
 | 
					 | 
				
			||||||
	LCHAN_S_ACTIVE,		/* channel is active and operational */
 | 
					 | 
				
			||||||
	LCHAN_S_REL_REQ,	/* channel release has been requested */
 | 
					 | 
				
			||||||
	LCHAN_S_REL_ERR,	/* channel is in an error state */
 | 
					 | 
				
			||||||
	LCHAN_S_INACTIVE,	/* channel is set inactive */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* BTS ONLY */
 | 
					 | 
				
			||||||
#define MAX_NUM_UL_MEAS	104
 | 
					 | 
				
			||||||
#define LC_UL_M_F_L1_VALID	(1 << 0)
 | 
					 | 
				
			||||||
#define LC_UL_M_F_RES_VALID	(1 << 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct bts_ul_meas {
 | 
					 | 
				
			||||||
	/* BER in units of 0.01%: 10.000 == 100% ber, 0 == 0% ber */
 | 
					 | 
				
			||||||
	uint16_t ber10k;
 | 
					 | 
				
			||||||
	/* timing advance offset (in quarter bits) */
 | 
					 | 
				
			||||||
	int16_t ta_offs_qbits;
 | 
					 | 
				
			||||||
	/* C/I ratio in dB */
 | 
					 | 
				
			||||||
	float c_i;
 | 
					 | 
				
			||||||
	/* flags */
 | 
					 | 
				
			||||||
	uint8_t is_sub:1;
 | 
					 | 
				
			||||||
	/* RSSI in dBm * -1 */
 | 
					 | 
				
			||||||
	uint8_t inv_rssi;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct amr_mode {
 | 
					 | 
				
			||||||
	uint8_t mode;
 | 
					 | 
				
			||||||
	uint8_t threshold;
 | 
					 | 
				
			||||||
	uint8_t hysteresis;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
struct amr_multirate_conf {
 | 
					 | 
				
			||||||
	uint8_t gsm48_ie[2];
 | 
					 | 
				
			||||||
	struct amr_mode mode[4];
 | 
					 | 
				
			||||||
	uint8_t num_modes;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
/* /BTS ONLY */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_lchan {
 | 
					 | 
				
			||||||
	/* The TS that we're part of */
 | 
					 | 
				
			||||||
	struct gsm_bts_trx_ts *ts;
 | 
					 | 
				
			||||||
	/* The logical subslot number in the TS */
 | 
					 | 
				
			||||||
	uint8_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 */
 | 
					 | 
				
			||||||
	uint8_t bs_power;
 | 
					 | 
				
			||||||
	uint8_t ms_power;
 | 
					 | 
				
			||||||
	/* Encryption information */
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		uint8_t alg_id;
 | 
					 | 
				
			||||||
		uint8_t key_len;
 | 
					 | 
				
			||||||
		uint8_t key[MAX_A5_KEY_LEN];
 | 
					 | 
				
			||||||
	} encr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* AMR bits */
 | 
					 | 
				
			||||||
	struct gsm48_multi_rate_conf mr_conf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Established data link layer services */
 | 
					 | 
				
			||||||
	uint8_t sapis[8];
 | 
					 | 
				
			||||||
	int sach_deact;
 | 
					 | 
				
			||||||
	int release_reason;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		uint32_t bound_ip;
 | 
					 | 
				
			||||||
		uint32_t connect_ip;
 | 
					 | 
				
			||||||
		uint16_t bound_port;
 | 
					 | 
				
			||||||
		uint16_t connect_port;
 | 
					 | 
				
			||||||
		uint16_t conn_id;
 | 
					 | 
				
			||||||
		uint8_t rtp_payload;
 | 
					 | 
				
			||||||
		uint8_t rtp_payload2;
 | 
					 | 
				
			||||||
		uint8_t speech_mode;
 | 
					 | 
				
			||||||
#ifdef ROLE_BSC
 | 
					 | 
				
			||||||
		struct rtp_socket *rtp_socket;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
		struct osmo_rtp_socket *rtp_socket;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	} abis_ip;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint8_t rqd_ta;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef ROLE_BSC
 | 
					 | 
				
			||||||
	struct osmo_timer_list T3101;
 | 
					 | 
				
			||||||
	struct osmo_timer_list T3111;
 | 
					 | 
				
			||||||
	struct osmo_timer_list error_timer;
 | 
					 | 
				
			||||||
	struct osmo_timer_list act_timer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* table of neighbor cell measurements */
 | 
					 | 
				
			||||||
	struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* cache of last measurement reports on this lchan */
 | 
					 | 
				
			||||||
	struct gsm_meas_rep meas_rep[6];
 | 
					 | 
				
			||||||
	int meas_rep_idx;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* GSM Random Access data */
 | 
					 | 
				
			||||||
	struct gsm48_req_ref *rqd_ref;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gsm_subscriber_connection *conn;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	struct lapdm_channel lapdm_ch;
 | 
					 | 
				
			||||||
	struct llist_head dl_tch_queue;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		/* bitmask of all SI that are present/valid in si_buf */
 | 
					 | 
				
			||||||
		uint32_t valid;
 | 
					 | 
				
			||||||
		uint32_t last;
 | 
					 | 
				
			||||||
		/* buffers where we put the pre-computed SI */
 | 
					 | 
				
			||||||
		sysinfo_buf_t buf[_MAX_SYSINFO_TYPE];
 | 
					 | 
				
			||||||
	} si;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		uint8_t flags;
 | 
					 | 
				
			||||||
		/* RSL measurment result number, 0 at lchan_act */
 | 
					 | 
				
			||||||
		uint8_t res_nr;
 | 
					 | 
				
			||||||
		/* current Tx power level of the BTS */
 | 
					 | 
				
			||||||
		uint8_t bts_tx_pwr;
 | 
					 | 
				
			||||||
		/* number of measurements stored in array below */
 | 
					 | 
				
			||||||
		uint8_t num_ul_meas;
 | 
					 | 
				
			||||||
		struct bts_ul_meas uplink[MAX_NUM_UL_MEAS];
 | 
					 | 
				
			||||||
		/* last L1 header from the MS */
 | 
					 | 
				
			||||||
		uint8_t l1_info[2];
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			uint8_t rxlev_full;
 | 
					 | 
				
			||||||
			uint8_t rxlev_sub;
 | 
					 | 
				
			||||||
			uint8_t rxqual_full;
 | 
					 | 
				
			||||||
			uint8_t rxqual_sub;
 | 
					 | 
				
			||||||
		} res;
 | 
					 | 
				
			||||||
	} meas;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct amr_multirate_conf amr_mr;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			uint8_t buf[16];
 | 
					 | 
				
			||||||
			uint8_t len;
 | 
					 | 
				
			||||||
		} last_sid;
 | 
					 | 
				
			||||||
	} tch;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define TS_F_PDCH_MODE	0x1000
 | 
					 | 
				
			||||||
/* One Timeslot in a TRX */
 | 
					 | 
				
			||||||
struct gsm_bts_trx_ts {
 | 
					 | 
				
			||||||
	struct gsm_bts_trx *trx;
 | 
					 | 
				
			||||||
	/* number of this timeslot at the TRX */
 | 
					 | 
				
			||||||
	uint8_t nr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enum gsm_phys_chan_config pchan;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned int flags;
 | 
					 | 
				
			||||||
	struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
	struct tlv_parsed nm_attr;
 | 
					 | 
				
			||||||
	uint8_t nm_chan_comb;
 | 
					 | 
				
			||||||
	int tsc;		/* -1 == use BTS TSC */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		/* Parameters below are configured by VTY */
 | 
					 | 
				
			||||||
		int enabled;
 | 
					 | 
				
			||||||
		uint8_t maio;
 | 
					 | 
				
			||||||
		uint8_t hsn;
 | 
					 | 
				
			||||||
		struct bitvec arfcns;
 | 
					 | 
				
			||||||
		uint8_t arfcns_data[1024/8];
 | 
					 | 
				
			||||||
		/* This is the pre-computed MA for channel assignments */
 | 
					 | 
				
			||||||
		struct bitvec ma;
 | 
					 | 
				
			||||||
		uint8_t ma_len;	/* part of ma_data that is used */
 | 
					 | 
				
			||||||
		uint8_t ma_data[8];	/* 10.5.2.21: max 8 bytes value part */
 | 
					 | 
				
			||||||
	} hopping;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* 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 */
 | 
					 | 
				
			||||||
	uint8_t nr;
 | 
					 | 
				
			||||||
	/* human readable name / description */
 | 
					 | 
				
			||||||
	char *description;
 | 
					 | 
				
			||||||
	/* how do we talk RSL with this TRX? */
 | 
					 | 
				
			||||||
	struct gsm_e1_subslot rsl_e1_link;
 | 
					 | 
				
			||||||
	uint8_t rsl_tei;
 | 
					 | 
				
			||||||
	struct e1inp_sign_link *rsl_link;
 | 
					 | 
				
			||||||
	/* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */
 | 
					 | 
				
			||||||
	struct e1inp_sign_link *oml_link;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
	struct tlv_parsed nm_attr;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
	} bb_transc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint16_t arfcn;
 | 
					 | 
				
			||||||
	int nominal_power;		/* in dBm */
 | 
					 | 
				
			||||||
	unsigned int max_power_red;	/* in actual dB */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		void *l1h;
 | 
					 | 
				
			||||||
	} role_bts;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	union {
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			} bbsig;
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			} pa;
 | 
					 | 
				
			||||||
		} bs11;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			unsigned int test_state;
 | 
					 | 
				
			||||||
			uint8_t test_nr;
 | 
					 | 
				
			||||||
			struct rxlev_stats rxlev_stat;
 | 
					 | 
				
			||||||
		} ipaccess;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
	struct gsm_bts_trx_ts ts[TRX_NR_TS];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GSM_BTS_SI(bts, i)	(void *)(bts->si_buf[i])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gsm_bts_type {
 | 
					 | 
				
			||||||
	GSM_BTS_TYPE_UNKNOWN,
 | 
					 | 
				
			||||||
	GSM_BTS_TYPE_BS11,
 | 
					 | 
				
			||||||
	GSM_BTS_TYPE_NANOBTS,
 | 
					 | 
				
			||||||
	GSM_BTS_TYPE_RBS2000,
 | 
					 | 
				
			||||||
	GSM_BTS_TYPE_HSL_FEMTO,
 | 
					 | 
				
			||||||
	GSM_BTS_TYPE_NOKIA_SITE,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct vty;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_bts_model {
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enum gsm_bts_type type;
 | 
					 | 
				
			||||||
	const char *name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bool started;
 | 
					 | 
				
			||||||
	int (*start)(struct gsm_network *net);
 | 
					 | 
				
			||||||
	int (*oml_rcvmsg)(struct msgb *msg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void (*e1line_bind_ops)(struct e1inp_line *line);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts);
 | 
					 | 
				
			||||||
	void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
	void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct tlv_definition nm_att_tlvdef;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct bitvec features;
 | 
					 | 
				
			||||||
	uint8_t _features_data[128/8];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum gsm_bts_features {
 | 
					 | 
				
			||||||
	BTS_FEAT_HSCSD,
 | 
					 | 
				
			||||||
	BTS_FEAT_GPRS,
 | 
					 | 
				
			||||||
	BTS_FEAT_EGPRS,
 | 
					 | 
				
			||||||
	BTS_FEAT_ECSD,
 | 
					 | 
				
			||||||
	BTS_FEAT_HOPPING,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * 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_bts *bts;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct osmo_timer_list work_timer;
 | 
					 | 
				
			||||||
	struct osmo_timer_list credit_timer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* free chans needed */
 | 
					 | 
				
			||||||
	int free_chans_need;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* load */
 | 
					 | 
				
			||||||
	uint16_t available_slots;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_envabtse {
 | 
					 | 
				
			||||||
	struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_bts_gprs_nsvc {
 | 
					 | 
				
			||||||
	struct gsm_bts *bts;
 | 
					 | 
				
			||||||
	/* data read via VTY config file, to configure the BTS
 | 
					 | 
				
			||||||
	 * via OML from BSC */
 | 
					 | 
				
			||||||
	int id;
 | 
					 | 
				
			||||||
	uint16_t nsvci;
 | 
					 | 
				
			||||||
	uint16_t local_port;	/* on the BTS */
 | 
					 | 
				
			||||||
	uint16_t remote_port;	/* on the SGSN */
 | 
					 | 
				
			||||||
	uint32_t remote_ip;	/* on the SGSN */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum neigh_list_manual_mode {
 | 
					 | 
				
			||||||
	NL_MODE_AUTOMATIC = 0,
 | 
					 | 
				
			||||||
	NL_MODE_MANUAL = 1,
 | 
					 | 
				
			||||||
	NL_MODE_MANUAL_SI5SEP = 2, /* SI2 and SI5 have separate neighbor lists */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* One BTS */
 | 
					 | 
				
			||||||
struct gsm_bts {
 | 
					 | 
				
			||||||
	/* list header in net->bts_list */
 | 
					 | 
				
			||||||
	struct llist_head list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* number of ths BTS in network */
 | 
					 | 
				
			||||||
	uint8_t nr;
 | 
					 | 
				
			||||||
	/* human readable name / description */
 | 
					 | 
				
			||||||
	char *description;
 | 
					 | 
				
			||||||
	/* Cell Identity */
 | 
					 | 
				
			||||||
	uint16_t cell_identity;
 | 
					 | 
				
			||||||
	/* location area code of this BTS */
 | 
					 | 
				
			||||||
	uint16_t location_area_code;
 | 
					 | 
				
			||||||
	/* Training Sequence Code */
 | 
					 | 
				
			||||||
	uint8_t tsc;
 | 
					 | 
				
			||||||
	/* Base Station Identification Code (BSIC) */
 | 
					 | 
				
			||||||
	uint8_t bsic;
 | 
					 | 
				
			||||||
	/* type of BTS */
 | 
					 | 
				
			||||||
	enum gsm_bts_type type;
 | 
					 | 
				
			||||||
	struct gsm_bts_model *model;
 | 
					 | 
				
			||||||
	enum gsm_band band;
 | 
					 | 
				
			||||||
	/* 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;
 | 
					 | 
				
			||||||
	uint8_t oml_tei;
 | 
					 | 
				
			||||||
	struct e1inp_sign_link *oml_link;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Abis network management O&M handle */
 | 
					 | 
				
			||||||
	struct abis_nm_h *nmh;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* number of this BTS on given E1 link */
 | 
					 | 
				
			||||||
	uint8_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_abis_mo mo;
 | 
					 | 
				
			||||||
	} site_mgr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* bitmask of all SI that are present/valid in si_buf */
 | 
					 | 
				
			||||||
	uint32_t si_valid;
 | 
					 | 
				
			||||||
	/* buffers where we put the pre-computed SI */
 | 
					 | 
				
			||||||
	sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* TimeZone hours, mins, and bts specific */
 | 
					 | 
				
			||||||
	int tzhr;
 | 
					 | 
				
			||||||
	int tzmn;
 | 
					 | 
				
			||||||
	int tz_bts_specific;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* ip.accesss Unit ID's have Site/BTS/TRX layout */
 | 
					 | 
				
			||||||
	union {
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			uint16_t site_id;
 | 
					 | 
				
			||||||
			uint16_t bts_id;
 | 
					 | 
				
			||||||
			uint32_t flags;
 | 
					 | 
				
			||||||
		} ip_access;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			} cclk;
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			} rack;
 | 
					 | 
				
			||||||
			struct gsm_envabtse envabtse[4];
 | 
					 | 
				
			||||||
		} bs11;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
				struct llist_head conn_groups;
 | 
					 | 
				
			||||||
			} is;
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
				struct llist_head conn_groups;
 | 
					 | 
				
			||||||
			} con;
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			} dp;
 | 
					 | 
				
			||||||
			struct {
 | 
					 | 
				
			||||||
				struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			} tf;
 | 
					 | 
				
			||||||
		} rbs2000;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			unsigned long serno;
 | 
					 | 
				
			||||||
		} hsl;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			uint8_t bts_type;
 | 
					 | 
				
			||||||
			int configured:1,
 | 
					 | 
				
			||||||
			    skip_reset:1,
 | 
					 | 
				
			||||||
			    did_reset:1,
 | 
					 | 
				
			||||||
			    wait_reset:1;
 | 
					 | 
				
			||||||
			struct osmo_timer_list reset_timer;
 | 
					 | 
				
			||||||
		} nokia;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Not entirely sure how ip.access specific this is */
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		enum bts_gprs_mode mode;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			uint16_t nsei;
 | 
					 | 
				
			||||||
			uint8_t timer[7];
 | 
					 | 
				
			||||||
		} nse;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			struct gsm_abis_mo mo;
 | 
					 | 
				
			||||||
			uint16_t bvci;
 | 
					 | 
				
			||||||
			uint8_t timer[11];
 | 
					 | 
				
			||||||
		} cell;
 | 
					 | 
				
			||||||
		struct gsm_bts_gprs_nsvc nsvc[2];
 | 
					 | 
				
			||||||
		uint8_t rac;
 | 
					 | 
				
			||||||
	} gprs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* RACH NM values */
 | 
					 | 
				
			||||||
	int rach_b_thresh;
 | 
					 | 
				
			||||||
	int rach_ldavg_slots;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* transceivers */
 | 
					 | 
				
			||||||
	int num_trx;
 | 
					 | 
				
			||||||
	struct llist_head trx_list;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef ROLE_BSC
 | 
					 | 
				
			||||||
	/* Abis NM queue */
 | 
					 | 
				
			||||||
	struct llist_head abis_queue;
 | 
					 | 
				
			||||||
	int abis_nm_pend;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct gsm_network *network;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* should the channel allocator allocate channels from high TRX to TRX0,
 | 
					 | 
				
			||||||
	 * rather than starting from TRX0 and go upwards? */
 | 
					 | 
				
			||||||
	int chan_alloc_reverse;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enum neigh_list_manual_mode neigh_list_manual_mode;
 | 
					 | 
				
			||||||
	/* parameters from which we build SYSTEM INFORMATION */
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		struct gsm48_rach_control rach_control;
 | 
					 | 
				
			||||||
		uint8_t ncc_permitted;
 | 
					 | 
				
			||||||
		struct gsm48_cell_sel_par cell_sel_par;
 | 
					 | 
				
			||||||
		struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */
 | 
					 | 
				
			||||||
		struct gsm48_cell_options cell_options;
 | 
					 | 
				
			||||||
		struct gsm48_control_channel_descr chan_desc;
 | 
					 | 
				
			||||||
		struct bitvec neigh_list;
 | 
					 | 
				
			||||||
		struct bitvec cell_alloc;
 | 
					 | 
				
			||||||
		struct bitvec si5_neigh_list;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			/* bitmask large enough for all possible ARFCN's */
 | 
					 | 
				
			||||||
			uint8_t neigh_list[1024/8];
 | 
					 | 
				
			||||||
			uint8_t cell_alloc[1024/8];
 | 
					 | 
				
			||||||
			/* If the user wants a different neighbor list in SI5 than in SI2 */
 | 
					 | 
				
			||||||
			uint8_t si5_neigh_list[1024/8];
 | 
					 | 
				
			||||||
		} data;
 | 
					 | 
				
			||||||
	} si_common;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* do we use static (user-defined) system information messages? (bitmask) */
 | 
					 | 
				
			||||||
	uint32_t si_mode_static;
 | 
					 | 
				
			||||||
#endif /* ROLE_BSC */
 | 
					 | 
				
			||||||
	void *role;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_bts *gsm_bts_alloc(void *talloc_ctx);
 | 
					 | 
				
			||||||
struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_bts_trx *gsm_bts_trx_num(const 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_lchant_name(enum gsm_chan_t c);
 | 
					 | 
				
			||||||
const char *gsm_chreq_name(enum gsm_chreq_reason_t c);
 | 
					 | 
				
			||||||
char *gsm_trx_name(const struct gsm_bts_trx *trx);
 | 
					 | 
				
			||||||
char *gsm_ts_name(const struct gsm_bts_trx_ts *ts);
 | 
					 | 
				
			||||||
char *gsm_lchan_name(const struct gsm_lchan *lchan);
 | 
					 | 
				
			||||||
const char *gsm_lchans_name(enum gsm_lchan_state s);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gsm_abis_mo_reset(struct gsm_abis_mo *mo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_abis_mo *
 | 
					 | 
				
			||||||
gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
 | 
					 | 
				
			||||||
	    const struct abis_om_obj_inst *obj_inst);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct gsm_nm_state *
 | 
					 | 
				
			||||||
gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,
 | 
					 | 
				
			||||||
		 const struct abis_om_obj_inst *obj_inst);
 | 
					 | 
				
			||||||
void *
 | 
					 | 
				
			||||||
gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,
 | 
					 | 
				
			||||||
	     const struct abis_om_obj_inst *obj_inst);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* reset the state of all MO in the BTS */
 | 
					 | 
				
			||||||
void gsm_bts_mo_reset(struct gsm_bts *bts);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gsm_ts2chan_nr(const struct gsm_bts_trx_ts *ts, uint8_t lchan_nr);
 | 
					 | 
				
			||||||
uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * help with parsing regexps
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int gsm_parse_reg(void *ctx, regex_t *reg, char **str,
 | 
					 | 
				
			||||||
		int argc, const char **argv) __attribute__ ((warn_unused_result));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user