mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-11-03 21:43:32 +00:00 
			
		
		
		
	Compare commits
	
		
			263 Commits
		
	
	
		
			laforge/si
			...
			on-waves/0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6cc4dbfd46 | ||
| 
						 | 
					9960d59fff | ||
| 
						 | 
					161bd6d253 | ||
| 
						 | 
					add3472e9f | ||
| 
						 | 
					33b0bee457 | ||
| 
						 | 
					6949db1bd8 | ||
| 
						 | 
					8ae0080e21 | ||
| 
						 | 
					546c296c4a | ||
| 
						 | 
					86f42eb6a5 | ||
| 
						 | 
					494c086dca | ||
| 
						 | 
					6b18c8f3b6 | ||
| 
						 | 
					87f6d26c2e | ||
| 
						 | 
					fab2ff34c4 | ||
| 
						 | 
					06d353e02e | ||
| 
						 | 
					dfe47549c6 | ||
| 
						 | 
					c70e8c2103 | ||
| 
						 | 
					b462a03c35 | ||
| 
						 | 
					6e0ec5b6fa | ||
| 
						 | 
					6768387f16 | ||
| 
						 | 
					5ef1234dd3 | ||
| 
						 | 
					581e58d166 | ||
| 
						 | 
					e308bb466a | ||
| 
						 | 
					e4be5394ef | ||
| 
						 | 
					81e1edd3e6 | ||
| 
						 | 
					cfd1c28604 | ||
| 
						 | 
					3ba8963a1d | ||
| 
						 | 
					238d156481 | ||
| 
						 | 
					516c4f073a | ||
| 
						 | 
					fa22aa6bbd | ||
| 
						 | 
					4072ceed32 | ||
| 
						 | 
					cf6bf63a0d | ||
| 
						 | 
					88b614110f | ||
| 
						 | 
					d9b825a5f5 | ||
| 
						 | 
					b91e5f1da4 | ||
| 
						 | 
					07bb509434 | ||
| 
						 | 
					08db6ca509 | ||
| 
						 | 
					6446ded81c | ||
| 
						 | 
					7b8f6064d6 | ||
| 
						 | 
					c6a1fe773d | ||
| 
						 | 
					729d468fdf | ||
| 
						 | 
					b37ce4c5a4 | ||
| 
						 | 
					5cd62c0ba5 | ||
| 
						 | 
					1e1acafafd | ||
| 
						 | 
					fb83b7a86d | ||
| 
						 | 
					ef0b641f63 | ||
| 
						 | 
					27e0bfd3c7 | ||
| 
						 | 
					bbfff6ec39 | ||
| 
						 | 
					dc0914df09 | ||
| 
						 | 
					0db691dcf6 | ||
| 
						 | 
					bb45b73b20 | ||
| 
						 | 
					5f5c1b6bcb | ||
| 
						 | 
					e51cf4f946 | ||
| 
						 | 
					749ba7f5ad | ||
| 
						 | 
					860c8955c3 | ||
| 
						 | 
					c33701c4e5 | ||
| 
						 | 
					44d92b4728 | ||
| 
						 | 
					8aaec620da | ||
| 
						 | 
					a5a4014d67 | ||
| 
						 | 
					9d519189ae | ||
| 
						 | 
					f0fc618782 | ||
| 
						 | 
					c57575bea8 | ||
| 
						 | 
					8cdfe9fc37 | ||
| 
						 | 
					0959f8cbe6 | ||
| 
						 | 
					f21028985e | ||
| 
						 | 
					483b768ab2 | ||
| 
						 | 
					82cb311c4f | ||
| 
						 | 
					2980442e33 | ||
| 
						 | 
					fa7afb31e9 | ||
| 
						 | 
					7513b3a1c2 | ||
| 
						 | 
					135d99b36e | ||
| 
						 | 
					5aaf7c164c | ||
| 
						 | 
					790db1e01b | ||
| 
						 | 
					81a8975662 | ||
| 
						 | 
					fd876b7488 | ||
| 
						 | 
					2ffe7aa340 | ||
| 
						 | 
					538ea6d5c6 | ||
| 
						 | 
					e14ec0dab4 | ||
| 
						 | 
					8252b9b947 | ||
| 
						 | 
					9fb88021dd | ||
| 
						 | 
					b031d6ecae | ||
| 
						 | 
					fcfdde5390 | ||
| 
						 | 
					571ba8e4da | ||
| 
						 | 
					bed6234e26 | ||
| 
						 | 
					9d24578812 | ||
| 
						 | 
					a087c4e75d | ||
| 
						 | 
					6b64b26d8b | ||
| 
						 | 
					22252a98e3 | ||
| 
						 | 
					957bc93244 | ||
| 
						 | 
					18bbe2e8a0 | ||
| 
						 | 
					1b17913cbc | ||
| 
						 | 
					ce2a36840d | ||
| 
						 | 
					0e09feccb0 | ||
| 
						 | 
					40a1de699a | ||
| 
						 | 
					d906a366c8 | ||
| 
						 | 
					d44d4c8c8b | ||
| 
						 | 
					af0e1d7a85 | ||
| 
						 | 
					d21b4d7f98 | ||
| 
						 | 
					3bdaa69fb2 | ||
| 
						 | 
					5c0132882a | ||
| 
						 | 
					ed443e949e | ||
| 
						 | 
					1df69f3c64 | ||
| 
						 | 
					d7cafafeee | ||
| 
						 | 
					e09348d366 | ||
| 
						 | 
					5f1b7c14f5 | ||
| 
						 | 
					5b3e9198f0 | ||
| 
						 | 
					f0b21dfd25 | ||
| 
						 | 
					e165d1aaa4 | ||
| 
						 | 
					649496eb57 | ||
| 
						 | 
					135a45c833 | ||
| 
						 | 
					1a3d9dbabf | ||
| 
						 | 
					a91d15df7e | ||
| 
						 | 
					3368e2a3d1 | ||
| 
						 | 
					929d788e21 | ||
| 
						 | 
					6958065f85 | ||
| 
						 | 
					097c82b2bc | ||
| 
						 | 
					abaeb3f55f | ||
| 
						 | 
					f42e29c79c | ||
| 
						 | 
					3177580cc1 | ||
| 
						 | 
					cbe77e1657 | ||
| 
						 | 
					3cedc4738f | ||
| 
						 | 
					0834fd9b85 | ||
| 
						 | 
					7b65c986eb | ||
| 
						 | 
					17d751531e | ||
| 
						 | 
					facb5cdfc2 | ||
| 
						 | 
					aebea482f5 | ||
| 
						 | 
					12f20d369c | ||
| 
						 | 
					2008d3f54c | ||
| 
						 | 
					a26ebe40f5 | ||
| 
						 | 
					a52f1cacb3 | ||
| 
						 | 
					f5e71415a2 | ||
| 
						 | 
					82a8d6e393 | ||
| 
						 | 
					1226c93937 | ||
| 
						 | 
					b9c520f9b3 | ||
| 
						 | 
					8a7ca57d3e | ||
| 
						 | 
					29f9f9fc79 | ||
| 
						 | 
					d512e454b3 | ||
| 
						 | 
					22481bf76d | ||
| 
						 | 
					b973955295 | ||
| 
						 | 
					9d51a36528 | ||
| 
						 | 
					ba3bbe55c1 | ||
| 
						 | 
					0619478073 | ||
| 
						 | 
					f8f184edab | ||
| 
						 | 
					d838951302 | ||
| 
						 | 
					f8e1b45a78 | ||
| 
						 | 
					dd2c9fdbcf | ||
| 
						 | 
					9991421cfb | ||
| 
						 | 
					e30f0e1c75 | ||
| 
						 | 
					18598ff66d | ||
| 
						 | 
					8882c9e3a8 | ||
| 
						 | 
					fdc64f6806 | ||
| 
						 | 
					16b331d14f | ||
| 
						 | 
					ab46372e2a | ||
| 
						 | 
					be807e4250 | ||
| 
						 | 
					71ddbf5c4f | ||
| 
						 | 
					63bb29fac0 | ||
| 
						 | 
					04b4f915a7 | ||
| 
						 | 
					4d95ab2231 | ||
| 
						 | 
					17944f7285 | ||
| 
						 | 
					d2964b6cd1 | ||
| 
						 | 
					1ce5d7c8b7 | ||
| 
						 | 
					846457b10a | ||
| 
						 | 
					e7b9771c4d | ||
| 
						 | 
					d709900efa | ||
| 
						 | 
					55b4f5cc2e | ||
| 
						 | 
					1ac5ac75a9 | ||
| 
						 | 
					5cf38ed1ab | ||
| 
						 | 
					35d1531089 | ||
| 
						 | 
					47e3777caa | ||
| 
						 | 
					710f3c615c | ||
| 
						 | 
					3111560e8a | ||
| 
						 | 
					7396afbba4 | ||
| 
						 | 
					52a72e217e | ||
| 
						 | 
					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 | 
							
								
								
									
										65
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,65 +0,0 @@
 | 
			
		||||
debian/*.log
 | 
			
		||||
*.o
 | 
			
		||||
*.lo
 | 
			
		||||
*.a
 | 
			
		||||
*.la
 | 
			
		||||
.deps
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
bscconfig.h
 | 
			
		||||
bscconfig.h.in
 | 
			
		||||
src/osmo-mgw/osmo-mgw
 | 
			
		||||
*.*~
 | 
			
		||||
*.sw?
 | 
			
		||||
.libs
 | 
			
		||||
*.pyc
 | 
			
		||||
*.gcda
 | 
			
		||||
*.gcno
 | 
			
		||||
*.pc
 | 
			
		||||
 | 
			
		||||
#configure
 | 
			
		||||
aclocal.m4
 | 
			
		||||
autom4te.cache/
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
config.guess
 | 
			
		||||
config.sub
 | 
			
		||||
configure
 | 
			
		||||
compile
 | 
			
		||||
depcomp
 | 
			
		||||
install-sh
 | 
			
		||||
missing
 | 
			
		||||
stamp-h1
 | 
			
		||||
libtool
 | 
			
		||||
ltmain.sh
 | 
			
		||||
m4/*.m4
 | 
			
		||||
 | 
			
		||||
# git-version-gen magic
 | 
			
		||||
.tarball-version
 | 
			
		||||
.version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#tests
 | 
			
		||||
tests/testsuite.dir
 | 
			
		||||
tests/*/*_test
 | 
			
		||||
 | 
			
		||||
tests/atconfig
 | 
			
		||||
tests/atlocal
 | 
			
		||||
tests/package.m4
 | 
			
		||||
tests/testsuite
 | 
			
		||||
tests/testsuite.log
 | 
			
		||||
 | 
			
		||||
writtenconfig/
 | 
			
		||||
 | 
			
		||||
# manuals
 | 
			
		||||
doc/manuals/*.html
 | 
			
		||||
doc/manuals/*.svg
 | 
			
		||||
doc/manuals/*.pdf
 | 
			
		||||
doc/manuals/*__*.png
 | 
			
		||||
doc/manuals/*.check
 | 
			
		||||
doc/manuals/generated/
 | 
			
		||||
doc/manuals/osmomsc-usermanual.xml
 | 
			
		||||
doc/manuals/common
 | 
			
		||||
doc/manuals/build
 | 
			
		||||
 | 
			
		||||
contrib/osmo-mgw.spec
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
[gerrit]
 | 
			
		||||
host=gerrit.osmocom.org
 | 
			
		||||
project=osmo-mgw
 | 
			
		||||
							
								
								
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							@@ -1,12 +0,0 @@
 | 
			
		||||
Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
Harald Welte <laforge@gnumonks.org> <laflocal@hanuman.gnumonks.org>
 | 
			
		||||
Harald Welte <laforge@gnumonks.org> <laflocal@goeller.de.gnumonks.org>
 | 
			
		||||
Holger Hans Peter Freyther <holger@moiji-mobile.com> <zecke@selfish.org>
 | 
			
		||||
Holger Hans Peter Freyther <holger@moiji-mobile.com> <ich@tamarin.(none)>
 | 
			
		||||
Holger Hans Peter Freyther <holgre@moiji-mobile.com> <holger@freyther.de>
 | 
			
		||||
Andreas Eversberg <jolly@eversberg.eu>
 | 
			
		||||
Andreas Eversberg <jolly@eversberg.eu> <Andreas.Eversberg@versatel.de>
 | 
			
		||||
Andreas Eversberg <jolly@eversberg.eu> <root@nuedel.(none)>
 | 
			
		||||
Pablo Neira Ayuso <pablo@soleta.eu> <pablo@gnumonks.org>
 | 
			
		||||
Max Suraev <msuraev@sysmocom.de>
 | 
			
		||||
Tom Tsou <tom.tsou@ettus.com> <tom@tsou.cc>
 | 
			
		||||
							
								
								
									
										41
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -1,41 +0,0 @@
 | 
			
		||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 | 
			
		||||
 | 
			
		||||
## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac
 | 
			
		||||
## remove line below when OE toolchain is updated to version which include those
 | 
			
		||||
ACLOCAL_AMFLAGS = -I m4
 | 
			
		||||
AM_CPPFLAGS = \
 | 
			
		||||
	$(all_includes) \
 | 
			
		||||
	-I$(top_srcdir)/include \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	include \
 | 
			
		||||
	src \
 | 
			
		||||
	tests \
 | 
			
		||||
	doc \
 | 
			
		||||
	contrib \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = \
 | 
			
		||||
	libosmo-mgcp-client.pc \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES = $(top_srcdir)/.version
 | 
			
		||||
EXTRA_DIST = \
 | 
			
		||||
	     .version \
 | 
			
		||||
	     contrib/osmo-mgw.spec.in \
 | 
			
		||||
	     debian \
 | 
			
		||||
	     git-version-gen \
 | 
			
		||||
	     osmoappdesc.py \
 | 
			
		||||
	     $(NULL)
 | 
			
		||||
 | 
			
		||||
AM_DISTCHECK_CONFIGURE_FLAGS = \
 | 
			
		||||
	--with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir)
 | 
			
		||||
 | 
			
		||||
@RELMAKE@
 | 
			
		||||
 | 
			
		||||
$(top_srcdir)/.version:
 | 
			
		||||
	echo $(VERSION) > $@-t && mv $@-t $@
 | 
			
		||||
dist-hook:
 | 
			
		||||
	echo $(VERSION) > $(distdir)/.tarball-version
 | 
			
		||||
							
								
								
									
										24
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								README
									
									
									
									
									
								
							@@ -1,24 +0,0 @@
 | 
			
		||||
About OsmoMGW
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
OsmoMGW originated from the OpenBSC project, which started as a minimalistic
 | 
			
		||||
all-in-one implementation of the GSM Network. In 2017, OpenBSC had reached
 | 
			
		||||
maturity and diversity (including M3UA SIGTRAN and 3G support in the form of
 | 
			
		||||
IuCS and IuPS interfaces) that naturally lead to a separation of the all-in-one
 | 
			
		||||
approach to fully independent separate programs as in typical GSM networks.
 | 
			
		||||
 | 
			
		||||
OsmoMGW was one of the parts split off from the old openbsc.git. It originated
 | 
			
		||||
as a solution to merely navigate RTP streams through a NAT, but has since
 | 
			
		||||
matured to a Media Gateway implementation that is capable of streaming RTP for
 | 
			
		||||
2G (AoIP) and 3G (IuCS) GSM networks as well as (still not implemented at time
 | 
			
		||||
of writing) transcoding between TRAU, various RTP payloads and IuUP.
 | 
			
		||||
 | 
			
		||||
The OsmoMGW program exposes an MGCP interface towards clients like OsmoMSC and
 | 
			
		||||
OsmoBSC, and receives and sends RTP streams as configured via MGCP.
 | 
			
		||||
 | 
			
		||||
The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC (found
 | 
			
		||||
in osmo-msc.git) to instruct OsmoMGW via its MGCP service.
 | 
			
		||||
 | 
			
		||||
Find OsmoMGW issue tracker and wiki online at
 | 
			
		||||
https://osmocom.org/projects/osmo-mgw
 | 
			
		||||
https://osmocom.org/projects/osmo-mgw/wiki
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
To run the configuration parsing and output (VTY) test suite, first install
 | 
			
		||||
 | 
			
		||||
  git://git.osmocom.org/python/osmo-python-tests
 | 
			
		||||
 | 
			
		||||
and pass the following configure options here:
 | 
			
		||||
 | 
			
		||||
  ./configure --enable-vty-tests --enable-external-tests
 | 
			
		||||
 | 
			
		||||
The VTY tests are then included in the standard check target:
 | 
			
		||||
 | 
			
		||||
  make check
 | 
			
		||||
							
								
								
									
										28
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								TODO-RELEASE
									
									
									
									
									
								
							@@ -1,28 +0,0 @@
 | 
			
		||||
# When cleaning up this file upon a release:
 | 
			
		||||
#
 | 
			
		||||
# - Note that the release version number is entirely unrelated to the API
 | 
			
		||||
#   versions. A release version 5.2.3 may happily have an API version of 42:7:5.
 | 
			
		||||
#
 | 
			
		||||
# - Bump API version in src/lib*/Makefile.am files according to chapter
 | 
			
		||||
#   "Library interface versions" of the libtool documentation.
 | 
			
		||||
#   https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
 | 
			
		||||
#
 | 
			
		||||
# - Iff the 'current' API version has changed, rename debian/lib*.install
 | 
			
		||||
#
 | 
			
		||||
# API version bumping for the impatient:
 | 
			
		||||
# LIBVERSION=c:r:a  (current:revision_of_current:backwards_compat_age)
 | 
			
		||||
# 5:2:4 means that
 | 
			
		||||
# - this implements version 5 of the API;
 | 
			
		||||
# - this is the 2nd (compatible) revision of API version 5;
 | 
			
		||||
# - this is backwards compatible to all APIs since 4 versions ago,
 | 
			
		||||
#   i.e. callers that need API versions from 1 to 5 can use this.
 | 
			
		||||
#
 | 
			
		||||
# Bumping API versions recipe:
 | 
			
		||||
# If the library source code has changed at all since the last update, r++;
 | 
			
		||||
# If any interfaces have been added, removed, or changed since the last update, c++, r=0;
 | 
			
		||||
# If any interfaces have been added since the last public release, a++;
 | 
			
		||||
# If any interfaces have been removed or changed since the last public release, a=0.
 | 
			
		||||
#
 | 
			
		||||
#library		what		description / commit summary line
 | 
			
		||||
osmo-mgw        update osmo-gsm-manuals dependency to > 0.3.0 for vty_cpu_sched.adoc include
 | 
			
		||||
libosmo-mgcp-client     mgcp_response, mgcp_conn_peer   struct size change, breaks ABI
 | 
			
		||||
							
								
								
									
										215
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										215
									
								
								configure.ac
									
									
									
									
									
								
							@@ -1,215 +0,0 @@
 | 
			
		||||
dnl Process this file with autoconf to produce a configure script
 | 
			
		||||
AC_INIT([osmo-mgw],
 | 
			
		||||
	m4_esyscmd([./git-version-gen .tarball-version]),
 | 
			
		||||
	[openbsc@lists.osmocom.org])
 | 
			
		||||
 | 
			
		||||
dnl *This* is the root dir, even if an install-sh exists in ../ or ../../
 | 
			
		||||
AC_CONFIG_AUX_DIR([.])
 | 
			
		||||
 | 
			
		||||
AM_INIT_AUTOMAKE([dist-bzip2])
 | 
			
		||||
AC_CONFIG_TESTDIR(tests)
 | 
			
		||||
 | 
			
		||||
dnl kernel style compile messages
 | 
			
		||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 | 
			
		||||
 | 
			
		||||
dnl include release helper
 | 
			
		||||
RELMAKE='-include osmo-release.mk'
 | 
			
		||||
AC_SUBST([RELMAKE])
 | 
			
		||||
 | 
			
		||||
dnl checks for programs
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
LT_INIT
 | 
			
		||||
 | 
			
		||||
dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang
 | 
			
		||||
AS_CASE(["$LD"],[*clang*],
 | 
			
		||||
  [AS_CASE(["${host_os}"],
 | 
			
		||||
     [*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])
 | 
			
		||||
 | 
			
		||||
dnl check for pkg-config (explained in detail in libosmocore/configure.ac)
 | 
			
		||||
AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)
 | 
			
		||||
if test "x$PKG_CONFIG_INSTALLED" = "xno"; then
 | 
			
		||||
        AC_MSG_WARN([You need to install pkg-config])
 | 
			
		||||
fi
 | 
			
		||||
PKG_PROG_PKG_CONFIG([0.20])
 | 
			
		||||
 | 
			
		||||
dnl check for AX_CHECK_COMPILE_FLAG
 | 
			
		||||
m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [
 | 
			
		||||
	AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])
 | 
			
		||||
	])
 | 
			
		||||
 | 
			
		||||
dnl checks for libraries
 | 
			
		||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
 | 
			
		||||
AC_SUBST(LIBRARY_DL)
 | 
			
		||||
 | 
			
		||||
AC_SEARCH_LIBS([dlsym], [dl dld], [LIBRARY_DLSYM="$LIBS";LIBS=""])
 | 
			
		||||
AC_SUBST(LIBRARY_DLSYM)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.4.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.4.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.4.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.4.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.6.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 1.0.0)
 | 
			
		||||
PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 1.0.0)
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(sanitize,
 | 
			
		||||
	[AS_HELP_STRING(
 | 
			
		||||
		[--enable-sanitize],
 | 
			
		||||
		[Compile with address sanitizer enabled],
 | 
			
		||||
	)],
 | 
			
		||||
	[sanitize=$enableval], [sanitize="no"])
 | 
			
		||||
if test x"$sanitize" = x"yes"
 | 
			
		||||
then
 | 
			
		||||
	CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined"
 | 
			
		||||
	CPPFLAGS="$CPPFLAGS -fsanitize=address -fsanitize=undefined"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(werror,
 | 
			
		||||
	[AS_HELP_STRING(
 | 
			
		||||
		[--enable-werror],
 | 
			
		||||
		[Turn all compiler warnings into errors, with exceptions:
 | 
			
		||||
		 a) deprecation (allow upstream to mark deprecation without breaking builds);
 | 
			
		||||
		 b) "#warning" pragmas (allow to remind ourselves of errors without breaking builds)
 | 
			
		||||
		]
 | 
			
		||||
	)],
 | 
			
		||||
	[werror=$enableval], [werror="no"])
 | 
			
		||||
if test x"$werror" = x"yes"
 | 
			
		||||
then
 | 
			
		||||
	WERROR_FLAGS="-Werror"
 | 
			
		||||
	WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations"
 | 
			
		||||
	WERROR_FLAGS+=" -Wno-error=cpp" # "#warning"
 | 
			
		||||
	CFLAGS="$CFLAGS $WERROR_FLAGS"
 | 
			
		||||
	CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
dnl Checks for typedefs, structures and compiler characteristics
 | 
			
		||||
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Wnull-dereference], [CFLAGS="$CFLAGS -Wnull-dereference"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])
 | 
			
		||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])
 | 
			
		||||
 | 
			
		||||
# Coverage build taken from WebKit's configure.in
 | 
			
		||||
AC_MSG_CHECKING([whether to enable code coverage support])
 | 
			
		||||
AC_ARG_ENABLE(coverage,
 | 
			
		||||
              AC_HELP_STRING([--enable-coverage],
 | 
			
		||||
                             [enable code coverage support [default=no]]),
 | 
			
		||||
              [],[enable_coverage="no"])
 | 
			
		||||
AC_MSG_RESULT([$enable_coverage])
 | 
			
		||||
if test "$enable_coverage" = "yes"; then
 | 
			
		||||
   COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
 | 
			
		||||
   COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
 | 
			
		||||
   AC_SUBST([COVERAGE_CFLAGS])
 | 
			
		||||
   AC_SUBST([COVERAGE_LDFLAGS])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE([vty_tests],
 | 
			
		||||
		AC_HELP_STRING([--enable-vty-tests],
 | 
			
		||||
				[Include the VTY/CTRL tests in make check (deprecated)
 | 
			
		||||
				[default=no]]),
 | 
			
		||||
		[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
 | 
			
		||||
AC_ARG_ENABLE([external_tests],
 | 
			
		||||
		AC_HELP_STRING([--enable-external-tests],
 | 
			
		||||
				[Include the VTY/CTRL tests in make check [default=no]]),
 | 
			
		||||
		[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
 | 
			
		||||
if test "x$enable_ext_tests" = "xyes" ; then
 | 
			
		||||
	AM_PATH_PYTHON
 | 
			
		||||
	AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)
 | 
			
		||||
	 if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then
 | 
			
		||||
		AC_MSG_ERROR([Please install git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
AC_MSG_CHECKING([whether to enable VTY/CTRL tests])
 | 
			
		||||
AC_MSG_RESULT([$enable_ext_tests])
 | 
			
		||||
AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")
 | 
			
		||||
 | 
			
		||||
# Generate manuals
 | 
			
		||||
AC_ARG_ENABLE(manuals,
 | 
			
		||||
	[AS_HELP_STRING(
 | 
			
		||||
		[--enable-manuals],
 | 
			
		||||
		[Generate manual PDFs [default=no]],
 | 
			
		||||
	)],
 | 
			
		||||
	[osmo_ac_build_manuals=$enableval], [osmo_ac_build_manuals="no"])
 | 
			
		||||
AM_CONDITIONAL([BUILD_MANUALS], [test x"$osmo_ac_build_manuals" = x"yes"])
 | 
			
		||||
AC_ARG_VAR(OSMO_GSM_MANUALS_DIR, [path to common osmo-gsm-manuals files, overriding pkg-config and "../osmo-gsm-manuals"
 | 
			
		||||
	fallback])
 | 
			
		||||
if test x"$osmo_ac_build_manuals" = x"yes"
 | 
			
		||||
then
 | 
			
		||||
	# Find OSMO_GSM_MANUALS_DIR (env, pkg-conf, fallback)
 | 
			
		||||
	if test -n "$OSMO_GSM_MANUALS_DIR"; then
 | 
			
		||||
		echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from env)"
 | 
			
		||||
	else
 | 
			
		||||
		OSMO_GSM_MANUALS_DIR="$($PKG_CONFIG osmo-gsm-manuals --variable=osmogsmmanualsdir 2>/dev/null)"
 | 
			
		||||
		if test -n "$OSMO_GSM_MANUALS_DIR"; then
 | 
			
		||||
			echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from pkg-conf)"
 | 
			
		||||
		else
 | 
			
		||||
			OSMO_GSM_MANUALS_DIR="../osmo-gsm-manuals"
 | 
			
		||||
			echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (fallback)"
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	if ! test -d "$OSMO_GSM_MANUALS_DIR"; then
 | 
			
		||||
		AC_MSG_ERROR("OSMO_GSM_MANUALS_DIR does not exist! Install osmo-gsm-manuals or set OSMO_GSM_MANUALS_DIR.")
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# Find and run check-depends
 | 
			
		||||
	CHECK_DEPENDS="$OSMO_GSM_MANUALS_DIR/check-depends.sh"
 | 
			
		||||
	if ! test -x "$CHECK_DEPENDS"; then
 | 
			
		||||
		CHECK_DEPENDS="osmo-gsm-manuals-check-depends"
 | 
			
		||||
	fi
 | 
			
		||||
	if ! $CHECK_DEPENDS; then
 | 
			
		||||
		AC_MSG_ERROR("missing dependencies for --enable-manuals")
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# Put in Makefile with absolute path
 | 
			
		||||
	OSMO_GSM_MANUALS_DIR="$(realpath "$OSMO_GSM_MANUALS_DIR")"
 | 
			
		||||
	AC_SUBST([OSMO_GSM_MANUALS_DIR])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# https://www.freedesktop.org/software/systemd/man/daemon.html
 | 
			
		||||
AC_ARG_WITH([systemdsystemunitdir],
 | 
			
		||||
     [AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files])],,
 | 
			
		||||
     [with_systemdsystemunitdir=auto])
 | 
			
		||||
AS_IF([test "x$with_systemdsystemunitdir" = "xyes" -o "x$with_systemdsystemunitdir" = "xauto"], [
 | 
			
		||||
     def_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
 | 
			
		||||
 | 
			
		||||
     AS_IF([test "x$def_systemdsystemunitdir" = "x"],
 | 
			
		||||
   [AS_IF([test "x$with_systemdsystemunitdir" = "xyes"],
 | 
			
		||||
    [AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])])
 | 
			
		||||
    with_systemdsystemunitdir=no],
 | 
			
		||||
   [with_systemdsystemunitdir="$def_systemdsystemunitdir"])])
 | 
			
		||||
AS_IF([test "x$with_systemdsystemunitdir" != "xno"],
 | 
			
		||||
      [AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])])
 | 
			
		||||
AM_CONDITIONAL([HAVE_SYSTEMD], [test "x$with_systemdsystemunitdir" != "xno"])
 | 
			
		||||
 | 
			
		||||
AC_MSG_RESULT([CFLAGS="$CFLAGS"])
 | 
			
		||||
AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"])
 | 
			
		||||
 | 
			
		||||
dnl Generate the output
 | 
			
		||||
AM_CONFIG_HEADER(bscconfig.h)
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT(
 | 
			
		||||
    libosmo-mgcp-client.pc
 | 
			
		||||
    include/Makefile
 | 
			
		||||
    include/osmocom/Makefile
 | 
			
		||||
    include/osmocom/mgcp_client/Makefile
 | 
			
		||||
    include/osmocom/mgcp/Makefile
 | 
			
		||||
    src/Makefile
 | 
			
		||||
    src/libosmo-mgcp-client/Makefile
 | 
			
		||||
    src/libosmo-mgcp/Makefile
 | 
			
		||||
    src/osmo-mgw/Makefile
 | 
			
		||||
    tests/Makefile
 | 
			
		||||
    tests/atlocal
 | 
			
		||||
    tests/mgcp_client/Makefile
 | 
			
		||||
    tests/mgcp/Makefile
 | 
			
		||||
    doc/Makefile
 | 
			
		||||
    doc/examples/Makefile
 | 
			
		||||
    doc/manuals/Makefile
 | 
			
		||||
    contrib/Makefile
 | 
			
		||||
    contrib/systemd/Makefile
 | 
			
		||||
    contrib/osmo-mgw.spec
 | 
			
		||||
    Makefile)
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
SUBDIRS = systemd
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = ipa.py
 | 
			
		||||
							
								
								
									
										278
									
								
								contrib/ipa.py
									
									
									
									
									
								
							
							
						
						
									
										278
									
								
								contrib/ipa.py
									
									
									
									
									
								
							@@ -1,278 +0,0 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- mode: python-mode; py-indent-tabs-mode: nil -*-
 | 
			
		||||
"""
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2016 sysmocom s.f.m.c. GmbH
 | 
			
		||||
 *
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 */
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import struct, random, sys
 | 
			
		||||
 | 
			
		||||
class IPA(object):
 | 
			
		||||
    """
 | 
			
		||||
    Stateless IPA protocol multiplexer: add/remove/parse (extended) header
 | 
			
		||||
    """
 | 
			
		||||
    version = "0.0.5"
 | 
			
		||||
    TCP_PORT_OML = 3002
 | 
			
		||||
    TCP_PORT_RSL = 3003
 | 
			
		||||
    # OpenBSC extensions: OSMO, MGCP_OLD
 | 
			
		||||
    PROTO = dict(RSL=0x00, CCM=0xFE, SCCP=0xFD, OML=0xFF, OSMO=0xEE, MGCP_OLD=0xFC)
 | 
			
		||||
    # ...OML Router Control, GSUP GPRS extension, Osmocom Authn Protocol
 | 
			
		||||
    EXT = dict(CTRL=0, MGCP=1, LAC=2, SMSC=3, ORC=4, GSUP=5, OAP=6)
 | 
			
		||||
    # OpenBSC extension: SCCP_OLD
 | 
			
		||||
    MSGT = dict(PING=0x00, PONG=0x01, ID_GET=0x04, ID_RESP=0x05, ID_ACK=0x06, SCCP_OLD=0xFF)
 | 
			
		||||
    _IDTAG = dict(SERNR=0, UNITNAME=1, LOCATION=2, TYPE=3, EQUIPVERS=4, SWVERSION=5, IPADDR=6, MACADDR=7, UNIT=8)
 | 
			
		||||
    CTRL_GET = 'GET'
 | 
			
		||||
    CTRL_SET = 'SET'
 | 
			
		||||
    CTRL_REP = 'REPLY'
 | 
			
		||||
    CTRL_ERR = 'ERR'
 | 
			
		||||
    CTRL_TRAP = 'TRAP'
 | 
			
		||||
 | 
			
		||||
    def _l(self, d, p):
 | 
			
		||||
        """
 | 
			
		||||
        Reverse dictionary lookup: return key for a given value
 | 
			
		||||
        """
 | 
			
		||||
        if p is None:
 | 
			
		||||
            return 'UNKNOWN'
 | 
			
		||||
        return list(d.keys())[list(d.values()).index(p)]
 | 
			
		||||
 | 
			
		||||
    def _tag(self, t, v):
 | 
			
		||||
        """
 | 
			
		||||
        Create TAG as TLV data
 | 
			
		||||
        """
 | 
			
		||||
        return struct.pack(">HB", len(v) + 1, t) + v
 | 
			
		||||
 | 
			
		||||
    def proto(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup protocol name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self.PROTO, p)
 | 
			
		||||
 | 
			
		||||
    def ext(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup protocol extension name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self.EXT, p)
 | 
			
		||||
 | 
			
		||||
    def msgt(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup message type name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self.MSGT, p)
 | 
			
		||||
 | 
			
		||||
    def idtag(self, p):
 | 
			
		||||
        """
 | 
			
		||||
        Lookup ID tag name
 | 
			
		||||
        """
 | 
			
		||||
        return self._l(self._IDTAG, p)
 | 
			
		||||
 | 
			
		||||
    def ext_name(self, proto, exten):
 | 
			
		||||
        """
 | 
			
		||||
        Return proper extension byte name depending on the protocol used
 | 
			
		||||
        """
 | 
			
		||||
        if self.PROTO['CCM'] == proto:
 | 
			
		||||
            return self.msgt(exten)
 | 
			
		||||
        if self.PROTO['OSMO'] == proto:
 | 
			
		||||
            return self.ext(exten)
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def add_header(self, data, proto, ext=None):
 | 
			
		||||
        """
 | 
			
		||||
        Add IPA header (with extension if necessary), data must be represented as bytes
 | 
			
		||||
        """
 | 
			
		||||
        if ext is None:
 | 
			
		||||
            return struct.pack(">HB", len(data) + 1, proto) + data
 | 
			
		||||
        return struct.pack(">HBB", len(data) + 1, proto, ext) + data
 | 
			
		||||
 | 
			
		||||
    def del_header(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Strip IPA protocol header correctly removing extension if present
 | 
			
		||||
        Returns data length, IPA protocol, extension (or None if not defined for a give protocol) and the data without header
 | 
			
		||||
        """
 | 
			
		||||
        if not len(data):
 | 
			
		||||
            return None, None, None, None
 | 
			
		||||
        (dlen, proto) = struct.unpack('>HB', data[:3])
 | 
			
		||||
        if self.PROTO['OSMO'] == proto or self.PROTO['CCM'] == proto: # there's extension which we have to unpack
 | 
			
		||||
            return struct.unpack('>HBB', data[:4]) + (data[4:], ) # length, protocol, extension, data
 | 
			
		||||
        return dlen, proto, None, data[3:] # length, protocol, _, data
 | 
			
		||||
 | 
			
		||||
    def split_combined(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Split the data which contains multiple concatenated IPA messages into tuple (first, rest) where rest contains remaining messages, first is the single IPA message
 | 
			
		||||
        """
 | 
			
		||||
        (length, _, _, _) = self.del_header(data)
 | 
			
		||||
        return data[:(length + 3)], data[(length + 3):]
 | 
			
		||||
 | 
			
		||||
    def tag_serial(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for serial number
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['SERNR'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_name(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for unit name
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['UNITNAME'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_loc(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for location
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['LOCATION'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_type(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for unit type
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['TYPE'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_equip(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for equipment version
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['EQUIPVERS'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_sw(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for software version
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['SWVERSION'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_ip(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for IP address
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['IPADDR'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_mac(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for MAC address
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['MACADDR'], data)
 | 
			
		||||
 | 
			
		||||
    def tag_unit(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make TAG for unit ID
 | 
			
		||||
        """
 | 
			
		||||
        return self._tag(self._IDTAG['UNIT'], data)
 | 
			
		||||
 | 
			
		||||
    def identity(self, unit=b'', mac=b'', location=b'', utype=b'', equip=b'', sw=b'', name=b'', serial=b''):
 | 
			
		||||
        """
 | 
			
		||||
        Make IPA IDENTITY tag list, by default returns empty concatenated bytes of tag list
 | 
			
		||||
        """
 | 
			
		||||
        return self.tag_unit(unit) + self.tag_mac(mac) + self.tag_loc(location) + self.tag_type(utype) + self.tag_equip(equip) + self.tag_sw(sw) + self.tag_name(name) + self.tag_serial(serial)
 | 
			
		||||
 | 
			
		||||
    def ping(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make PING message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PING'])
 | 
			
		||||
 | 
			
		||||
    def pong(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make PONG message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PONG'])
 | 
			
		||||
 | 
			
		||||
    def id_ack(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make ID_ACK CCM message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(b'', self.PROTO['CCM'], self.MSGT['ID_ACK'])
 | 
			
		||||
 | 
			
		||||
    def id_get(self):
 | 
			
		||||
        """
 | 
			
		||||
        Make ID_GET CCM message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(self.identity(), self.PROTO['CCM'], self.MSGT['ID_GET'])
 | 
			
		||||
 | 
			
		||||
    def id_resp(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Make ID_RESP CCM message
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header(data, self.PROTO['CCM'], self.MSGT['ID_RESP'])
 | 
			
		||||
 | 
			
		||||
class Ctrl(IPA):
 | 
			
		||||
    """
 | 
			
		||||
    Osmocom CTRL protocol implemented on top of IPA multiplexer
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        random.seed()
 | 
			
		||||
 | 
			
		||||
    def add_header(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Add CTRL header
 | 
			
		||||
        """
 | 
			
		||||
        return super(Ctrl, self).add_header(data.encode('utf-8'), IPA.PROTO['OSMO'], IPA.EXT['CTRL'])
 | 
			
		||||
 | 
			
		||||
    def rem_header(self, data):
 | 
			
		||||
        """
 | 
			
		||||
        Remove CTRL header, check for appropriate protocol and extension
 | 
			
		||||
        """
 | 
			
		||||
        (_, proto, ext, d) = super(Ctrl, self).del_header(data)
 | 
			
		||||
        if self.PROTO['OSMO'] != proto or self.EXT['CTRL'] != ext:
 | 
			
		||||
            return None
 | 
			
		||||
        return d
 | 
			
		||||
 | 
			
		||||
    def parse(self, data, op=None):
 | 
			
		||||
        """
 | 
			
		||||
        Parse Ctrl string returning (var, value) pair
 | 
			
		||||
        var could be None in case of ERROR message
 | 
			
		||||
        value could be None in case of GET message
 | 
			
		||||
        """
 | 
			
		||||
        (s, i, v) = data.split(' ', 2)
 | 
			
		||||
        if s == self.CTRL_ERR:
 | 
			
		||||
            return None, v
 | 
			
		||||
        if s == self.CTRL_GET:
 | 
			
		||||
            return v, None
 | 
			
		||||
        (s, i, var, val) = data.split(' ', 3)
 | 
			
		||||
        if s == self.CTRL_TRAP and i != '0':
 | 
			
		||||
            return None, '%s with non-zero id %s' % (s, i)
 | 
			
		||||
        if op is not None and i != op:
 | 
			
		||||
            if s == self.CTRL_GET + '_' + self.CTRL_REP or s == self.CTRL_SET + '_' + self.CTRL_REP:
 | 
			
		||||
                return None, '%s with unexpected id %s' % (s, i)
 | 
			
		||||
        return var, val
 | 
			
		||||
 | 
			
		||||
    def trap(self, var, val):
 | 
			
		||||
        """
 | 
			
		||||
        Make TRAP message with given (vak, val) pair
 | 
			
		||||
        """
 | 
			
		||||
        return self.add_header("%s 0 %s %s" % (self.CTRL_TRAP, var, val))
 | 
			
		||||
 | 
			
		||||
    def cmd(self, var, val=None):
 | 
			
		||||
        """
 | 
			
		||||
        Make SET/GET command message: returns (r, m) tuple where r is random operation id and m is assembled message
 | 
			
		||||
        """
 | 
			
		||||
        r = random.randint(1, sys.maxsize)
 | 
			
		||||
        if val is not None:
 | 
			
		||||
            return r, self.add_header("%s %s %s %s" % (self.CTRL_SET, r, var, val))
 | 
			
		||||
        return r, self.add_header("%s %s %s" % (self.CTRL_GET, r, var))
 | 
			
		||||
 | 
			
		||||
    def verify(self, reply, r, var, val=None):
 | 
			
		||||
        """
 | 
			
		||||
        Verify reply to SET/GET command: returns (b, v) tuple where v is True/False verification result and v is the variable value
 | 
			
		||||
        """
 | 
			
		||||
        (k, v) = self.parse(reply)
 | 
			
		||||
        if k != var or (val is not None and v != val):
 | 
			
		||||
            return False, v
 | 
			
		||||
        return True, v
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    print("IPA multiplexer v%s loaded." % IPA.version)
 | 
			
		||||
@@ -1,67 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# jenkins build helper script for openbsc.  This is how we build on jenkins.osmocom.org
 | 
			
		||||
#
 | 
			
		||||
# environment variables:
 | 
			
		||||
# * WITH_MANUALS: build manual PDFs if set to "1"
 | 
			
		||||
# * PUBLISH: upload manuals after building if set to "1" (ignored without WITH_MANUALS = "1")
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ! [ -x "$(command -v osmo-build-dep.sh)" ]; then
 | 
			
		||||
	echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"
 | 
			
		||||
	exit 2
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
base="$PWD"
 | 
			
		||||
deps="$base/deps"
 | 
			
		||||
inst="$deps/install"
 | 
			
		||||
export deps inst
 | 
			
		||||
 | 
			
		||||
osmo-clean-workspace.sh
 | 
			
		||||
 | 
			
		||||
mkdir "$deps" || true
 | 
			
		||||
osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
 | 
			
		||||
 | 
			
		||||
verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
 | 
			
		||||
 | 
			
		||||
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
 | 
			
		||||
export LD_LIBRARY_PATH="$inst/lib"
 | 
			
		||||
export PATH="$inst/bin:$PATH"
 | 
			
		||||
 | 
			
		||||
osmo-build-dep.sh libosmo-abis
 | 
			
		||||
osmo-build-dep.sh libosmo-netif
 | 
			
		||||
 | 
			
		||||
# Additional configure options and depends
 | 
			
		||||
CONFIG=""
 | 
			
		||||
if [ "$WITH_MANUALS" = "1" ]; then
 | 
			
		||||
	osmo-build-dep.sh osmo-gsm-manuals
 | 
			
		||||
	CONFIG="--enable-manuals"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
set +x
 | 
			
		||||
echo
 | 
			
		||||
echo
 | 
			
		||||
echo
 | 
			
		||||
echo " =============================== osmo-mgw ==============================="
 | 
			
		||||
echo
 | 
			
		||||
set -x
 | 
			
		||||
 | 
			
		||||
cd "$base"
 | 
			
		||||
autoreconf --install --force
 | 
			
		||||
./configure --enable-vty-tests --enable-external-tests --enable-werror $CONFIG
 | 
			
		||||
$MAKE $PARALLEL_MAKE
 | 
			
		||||
LD_LIBRARY_PATH="$inst/lib" $MAKE check \
 | 
			
		||||
  || cat-testlogs.sh
 | 
			
		||||
LD_LIBRARY_PATH="$inst/lib" \
 | 
			
		||||
  DISTCHECK_CONFIGURE_FLAGS="--enable-vty-tests --enable-external-tests $CONFIG" \
 | 
			
		||||
  $MAKE distcheck \
 | 
			
		||||
  || cat-testlogs.sh
 | 
			
		||||
 | 
			
		||||
if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then
 | 
			
		||||
	make -C "$base/doc/manuals" publish
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
$MAKE maintainer-clean
 | 
			
		||||
osmo-clean-workspace.sh
 | 
			
		||||
@@ -1,137 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# spec file for package osmo-mgw
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2017, Martin Hauke <mardnh@gmx.de>
 | 
			
		||||
#
 | 
			
		||||
# All modifications and additions to the file contributed by third parties
 | 
			
		||||
# remain the property of their copyright owners, unless otherwise agreed
 | 
			
		||||
# upon. The license for this file, and modifications and additions to the
 | 
			
		||||
# file, is the same license as for the pristine package itself (unless the
 | 
			
		||||
# license for the pristine package is not an Open Source License, in which
 | 
			
		||||
# case the license is the MIT License). An "Open Source License" is a
 | 
			
		||||
# license that conforms to the Open Source Definition (Version 1.9)
 | 
			
		||||
# published by the Open Source Initiative.
 | 
			
		||||
 | 
			
		||||
# Please submit bugfixes or comments via http://bugs.opensuse.org/
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
Name:           osmo-mgw
 | 
			
		||||
Version:        @VERSION@
 | 
			
		||||
Release:        0
 | 
			
		||||
Summary:        Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks
 | 
			
		||||
License:        AGPL-3.0-or-later AND GPL-2.0-or-later
 | 
			
		||||
Group:          Hardware/Mobile
 | 
			
		||||
URL:            https://osmocom.org/projects/osmo-mgw
 | 
			
		||||
Source:         %{name}-%{version}.tar.xz
 | 
			
		||||
BuildRequires:  automake >= 1.9
 | 
			
		||||
BuildRequires:  libtool >= 2
 | 
			
		||||
BuildRequires:  pkgconfig >= 0.20
 | 
			
		||||
%if 0%{?suse_version}
 | 
			
		||||
BuildRequires:  systemd-rpm-macros
 | 
			
		||||
%endif
 | 
			
		||||
BuildRequires:  pkgconfig(libosmo-netif) >= 0.6.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmocore) >= 1.0.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmoctrl) >= 1.1.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmogsm) >= 1.0.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmovty) >= 1.0.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmocoding) >= 1.0.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmoabis) >= 1.0.0
 | 
			
		||||
BuildRequires:  pkgconfig(libosmotrau) >= 1.0.0
 | 
			
		||||
%{?systemd_requires}
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
OsmoMGW is Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks.
 | 
			
		||||
 | 
			
		||||
%package -n libosmo-mgcp-client6
 | 
			
		||||
Summary:        Osmocom's Media Gateway Control Protocol client library
 | 
			
		||||
Group:          System/Libraries
 | 
			
		||||
 | 
			
		||||
%description -n libosmo-mgcp-client6
 | 
			
		||||
Osmocom's Media Gateway Control Protocol client library.
 | 
			
		||||
 | 
			
		||||
%package -n libosmo-mgcp-client-devel
 | 
			
		||||
Summary:        Development files for Osmocom's Media Gateway Control Protocol client library
 | 
			
		||||
Group:          Development/Libraries/C and C++
 | 
			
		||||
Requires:       libosmo-mgcp-client6 = %{version}
 | 
			
		||||
 | 
			
		||||
%description -n libosmo-mgcp-client-devel
 | 
			
		||||
Osmocom's Media Gateway Control Protocol client librarary.
 | 
			
		||||
 | 
			
		||||
This subpackage contains libraries and header files for developing
 | 
			
		||||
applications that want to make use of libosmo-mgcp-client.
 | 
			
		||||
 | 
			
		||||
%package -n libosmo-mgcp-devel
 | 
			
		||||
Summary:        Development files for Osmocom's Media Gateway server library
 | 
			
		||||
Group:          Development/Libraries/C and C++
 | 
			
		||||
 | 
			
		||||
%description -n libosmo-mgcp-devel
 | 
			
		||||
Osmocom's Media Gateway Control Protocol server library.
 | 
			
		||||
 | 
			
		||||
This subpackage contains libraries and header files for developing
 | 
			
		||||
applications that want to make use of libosmo-mgcp.
 | 
			
		||||
 | 
			
		||||
%prep
 | 
			
		||||
%setup -q
 | 
			
		||||
 | 
			
		||||
%build
 | 
			
		||||
echo "%{version}" >.tarball-version
 | 
			
		||||
autoreconf -fi
 | 
			
		||||
%configure \
 | 
			
		||||
  --disable-static \
 | 
			
		||||
  --docdir=%{_docdir}/%{name} \
 | 
			
		||||
  --with-systemdsystemunitdir=%{_unitdir}
 | 
			
		||||
 | 
			
		||||
make %{?_smp_mflags}
 | 
			
		||||
 | 
			
		||||
%install
 | 
			
		||||
%make_install
 | 
			
		||||
find %{buildroot} -type f -name "*.la" -delete -print
 | 
			
		||||
 | 
			
		||||
%check
 | 
			
		||||
make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)
 | 
			
		||||
 | 
			
		||||
%post   -n libosmo-mgcp-client6 -p /sbin/ldconfig
 | 
			
		||||
%postun -n libosmo-mgcp-client6 -p /sbin/ldconfig
 | 
			
		||||
 | 
			
		||||
%if 0%{?suse_version}
 | 
			
		||||
%preun
 | 
			
		||||
%service_del_preun osmo-mgw.service
 | 
			
		||||
 | 
			
		||||
%postun
 | 
			
		||||
%service_del_postun osmo-mgw.service
 | 
			
		||||
 | 
			
		||||
%pre
 | 
			
		||||
%service_add_pre osmo-mgw.service
 | 
			
		||||
 | 
			
		||||
%post
 | 
			
		||||
%service_add_post osmo-mgw.service
 | 
			
		||||
%endif
 | 
			
		||||
 | 
			
		||||
%files
 | 
			
		||||
%license COPYING
 | 
			
		||||
%doc AUTHORS README
 | 
			
		||||
%dir %{_docdir}/%{name}/examples
 | 
			
		||||
%dir %{_docdir}/%{name}/examples/osmo-mgw
 | 
			
		||||
%{_docdir}/%{name}/examples/osmo-mgw/osmo-mgw.cfg
 | 
			
		||||
%{_docdir}/%{name}/examples/osmo-mgw/osmo-mgw-abis_e1.cfg
 | 
			
		||||
%{_bindir}/osmo-mgw
 | 
			
		||||
%{_unitdir}/osmo-mgw.service
 | 
			
		||||
%dir %{_sysconfdir}/osmocom
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/osmocom/osmo-mgw.cfg
 | 
			
		||||
 | 
			
		||||
%files -n libosmo-mgcp-client6
 | 
			
		||||
%{_libdir}/libosmo-mgcp-client.so.6*
 | 
			
		||||
 | 
			
		||||
%files -n libosmo-mgcp-client-devel
 | 
			
		||||
%{_libdir}/libosmo-mgcp-client.so
 | 
			
		||||
%{_libdir}/pkgconfig/libosmo-mgcp-client.pc
 | 
			
		||||
%dir %{_includedir}/osmocom
 | 
			
		||||
%dir %{_includedir}/osmocom/mgcp_client
 | 
			
		||||
%{_includedir}/osmocom/mgcp_client/*.h
 | 
			
		||||
 | 
			
		||||
%files -n libosmo-mgcp-devel
 | 
			
		||||
%dir %{_includedir}/osmocom
 | 
			
		||||
%dir %{_includedir}/osmocom/mgcp
 | 
			
		||||
%{_includedir}/osmocom/mgcp/*.h
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
CFLAGS:= -O2 -g -Wall $(shell pkg-config --cflags libosmocore libosmotrau)
 | 
			
		||||
LIBS:= $(shell pkg-config --libs libosmocore libosmotrau)
 | 
			
		||||
 | 
			
		||||
all: osmo-simcom2rtp
 | 
			
		||||
 | 
			
		||||
osmo-simcom2rtp: g711.o g711_table.o simcom2rtp.o
 | 
			
		||||
	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
 | 
			
		||||
 | 
			
		||||
%.o: %.c
 | 
			
		||||
	$(CC) $(CFLAGS) -o $@ -c $^
 | 
			
		||||
 | 
			
		||||
@@ -1,313 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This source code is a product of Sun Microsystems, Inc. and is provided
 | 
			
		||||
 * for unrestricted use.  Users may copy or modify this source code without
 | 
			
		||||
 * charge.
 | 
			
		||||
 *
 | 
			
		||||
 * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
 | 
			
		||||
 * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
 | 
			
		||||
 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
 | 
			
		||||
 *
 | 
			
		||||
 * Sun source code is provided with no support and without any obligation on
 | 
			
		||||
 * the part of Sun Microsystems, Inc. to assist in its use, correction,
 | 
			
		||||
 * modification or enhancement.
 | 
			
		||||
 *
 | 
			
		||||
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
 | 
			
		||||
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
 | 
			
		||||
 * OR ANY PART THEREOF.
 | 
			
		||||
 *
 | 
			
		||||
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
 | 
			
		||||
 * or profits or other special, indirect and consequential damages, even if
 | 
			
		||||
 * Sun has been advised of the possibility of such damages.
 | 
			
		||||
 *
 | 
			
		||||
 * Sun Microsystems, Inc.
 | 
			
		||||
 * 2550 Garcia Avenue
 | 
			
		||||
 * Mountain View, California  94043
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * December 30, 1994:
 | 
			
		||||
 * Functions linear2alaw, linear2ulaw have been updated to correctly
 | 
			
		||||
 * convert unquantized 16 bit values.
 | 
			
		||||
 * Tables for direct u- to A-law and A- to u-law conversions have been
 | 
			
		||||
 * corrected.
 | 
			
		||||
 * Borge Lindberg, Center for PersonKommunikation, Aalborg University.
 | 
			
		||||
 * bli@cpk.auc.dk
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * Downloaded from comp.speech site in Cambridge.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "g711.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * g711.c
 | 
			
		||||
 *
 | 
			
		||||
 * u-law, A-law and linear PCM conversions.
 | 
			
		||||
 * Source: http://www.speech.kth.se/cost250/refsys/latest/src/g711.c
 | 
			
		||||
 */
 | 
			
		||||
#define	SIGN_BIT	(0x80)		/* Sign bit for a A-law byte. */
 | 
			
		||||
#define	QUANT_MASK	(0xf)		/* Quantization field mask. */
 | 
			
		||||
#define	NSEGS		(8)		/* Number of A-law segments. */
 | 
			
		||||
#define	SEG_SHIFT	(4)		/* Left shift for segment number. */
 | 
			
		||||
#define	SEG_MASK	(0x70)		/* Segment field mask. */
 | 
			
		||||
 | 
			
		||||
static short seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF,
 | 
			
		||||
			    0x1FF, 0x3FF, 0x7FF, 0xFFF};
 | 
			
		||||
static short seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,
 | 
			
		||||
			    0x3FF, 0x7FF, 0xFFF, 0x1FFF};
 | 
			
		||||
 | 
			
		||||
/* copy from CCITT G.711 specifications */
 | 
			
		||||
unsigned char _u2a[128] = {			/* u- to A-law conversions */
 | 
			
		||||
	1,	1,	2,	2,	3,	3,	4,	4,
 | 
			
		||||
	5,	5,	6,	6,	7,	7,	8,	8,
 | 
			
		||||
	9,	10,	11,	12,	13,	14,	15,	16,
 | 
			
		||||
	17,	18,	19,	20,	21,	22,	23,	24,
 | 
			
		||||
	25,	27,	29,	31,	33,	34,	35,	36,
 | 
			
		||||
	37,	38,	39,	40,	41,	42,	43,	44,
 | 
			
		||||
	46,	48,	49,	50,	51,	52,	53,	54,
 | 
			
		||||
	55,	56,	57,	58,	59,	60,	61,	62,
 | 
			
		||||
	64,	65,	66,	67,	68,	69,	70,	71,
 | 
			
		||||
	72,	73,	74,	75,	76,	77,	78,	79,
 | 
			
		||||
/* corrected:
 | 
			
		||||
	81,	82,	83,	84,	85,	86,	87,	88, 
 | 
			
		||||
   should be: */
 | 
			
		||||
	80,	82,	83,	84,	85,	86,	87,	88,
 | 
			
		||||
	89,	90,	91,	92,	93,	94,	95,	96,
 | 
			
		||||
	97,	98,	99,	100,	101,	102,	103,	104,
 | 
			
		||||
	105,	106,	107,	108,	109,	110,	111,	112,
 | 
			
		||||
	113,	114,	115,	116,	117,	118,	119,	120,
 | 
			
		||||
	121,	122,	123,	124,	125,	126,	127,	128};
 | 
			
		||||
 | 
			
		||||
unsigned char _a2u[128] = {			/* A- to u-law conversions */
 | 
			
		||||
	1,	3,	5,	7,	9,	11,	13,	15,
 | 
			
		||||
	16,	17,	18,	19,	20,	21,	22,	23,
 | 
			
		||||
	24,	25,	26,	27,	28,	29,	30,	31,
 | 
			
		||||
	32,	32,	33,	33,	34,	34,	35,	35,
 | 
			
		||||
	36,	37,	38,	39,	40,	41,	42,	43,
 | 
			
		||||
	44,	45,	46,	47,	48,	48,	49,	49,
 | 
			
		||||
	50,	51,	52,	53,	54,	55,	56,	57,
 | 
			
		||||
	58,	59,	60,	61,	62,	63,	64,	64,
 | 
			
		||||
	65,	66,	67,	68,	69,	70,	71,	72,
 | 
			
		||||
/* corrected:
 | 
			
		||||
	73,	74,	75,	76,	77,	78,	79,	79,
 | 
			
		||||
   should be: */
 | 
			
		||||
	73,	74,	75,	76,	77,	78,	79,	80,
 | 
			
		||||
	80,	81,	82,	83,	84,	85,	86,	87,
 | 
			
		||||
	88,	89,	90,	91,	92,	93,	94,	95,
 | 
			
		||||
	96,	97,	98,	99,	100,	101,	102,	103,
 | 
			
		||||
	104,	105,	106,	107,	108,	109,	110,	111,
 | 
			
		||||
	112,	113,	114,	115,	116,	117,	118,	119,
 | 
			
		||||
	120,	121,	122,	123,	124,	125,	126,	127};
 | 
			
		||||
 | 
			
		||||
static short search(
 | 
			
		||||
   short val,
 | 
			
		||||
   short *table,
 | 
			
		||||
   short size)
 | 
			
		||||
{
 | 
			
		||||
   short i;
 | 
			
		||||
   
 | 
			
		||||
   for (i = 0; i < size; i++) {
 | 
			
		||||
      if (val <= *table++)
 | 
			
		||||
	 return (i);
 | 
			
		||||
   }
 | 
			
		||||
   return (size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * linear2alaw() - Convert a 16-bit linear PCM value to 8-bit A-law
 | 
			
		||||
 *
 | 
			
		||||
 * linear2alaw() accepts an 16-bit integer and encodes it as A-law data.
 | 
			
		||||
 *
 | 
			
		||||
 *		Linear Input Code	Compressed Code
 | 
			
		||||
 *	------------------------	---------------
 | 
			
		||||
 *	0000000wxyza			000wxyz
 | 
			
		||||
 *	0000001wxyza			001wxyz
 | 
			
		||||
 *	000001wxyzab			010wxyz
 | 
			
		||||
 *	00001wxyzabc			011wxyz
 | 
			
		||||
 *	0001wxyzabcd			100wxyz
 | 
			
		||||
 *	001wxyzabcde			101wxyz
 | 
			
		||||
 *	01wxyzabcdef			110wxyz
 | 
			
		||||
 *	1wxyzabcdefg			111wxyz
 | 
			
		||||
 *
 | 
			
		||||
 * For further information see John C. Bellamy's Digital Telephony, 1982,
 | 
			
		||||
 * John Wiley & Sons, pps 98-111 and 472-476.
 | 
			
		||||
 */
 | 
			
		||||
unsigned char
 | 
			
		||||
linear2alaw(short pcm_val)	/* 2's complement (16-bit range) */
 | 
			
		||||
{
 | 
			
		||||
   short	 mask;
 | 
			
		||||
   short	 seg;
 | 
			
		||||
   unsigned char aval;
 | 
			
		||||
   
 | 
			
		||||
   pcm_val = pcm_val >> 3;
 | 
			
		||||
 | 
			
		||||
   if (pcm_val >= 0) {
 | 
			
		||||
      mask = 0xD5;		/* sign (7th) bit = 1 */
 | 
			
		||||
   } else {
 | 
			
		||||
      mask = 0x55;		/* sign bit = 0 */
 | 
			
		||||
      pcm_val = -pcm_val - 1;
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
   /* Convert the scaled magnitude to segment number. */
 | 
			
		||||
   seg = search(pcm_val, seg_aend, 8);
 | 
			
		||||
   
 | 
			
		||||
   /* Combine the sign, segment, and quantization bits. */
 | 
			
		||||
   
 | 
			
		||||
   if (seg >= 8)		/* out of range, return maximum value. */
 | 
			
		||||
      return (unsigned char) (0x7F ^ mask);
 | 
			
		||||
   else {
 | 
			
		||||
      aval = (unsigned char) seg << SEG_SHIFT;
 | 
			
		||||
      if (seg < 2)
 | 
			
		||||
	 aval |= (pcm_val >> 1) & QUANT_MASK;
 | 
			
		||||
      else
 | 
			
		||||
	 aval |= (pcm_val >> seg) & QUANT_MASK;
 | 
			
		||||
      return (aval ^ mask);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * alaw2linear() - Convert an A-law value to 16-bit linear PCM
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
short
 | 
			
		||||
alaw2linear(
 | 
			
		||||
   unsigned char	a_val)
 | 
			
		||||
{
 | 
			
		||||
   short t;
 | 
			
		||||
   short seg;
 | 
			
		||||
   
 | 
			
		||||
   a_val ^= 0x55;
 | 
			
		||||
   
 | 
			
		||||
   t = (a_val & QUANT_MASK) << 4;
 | 
			
		||||
   seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
 | 
			
		||||
   switch (seg) {
 | 
			
		||||
   case 0:
 | 
			
		||||
      t += 8;
 | 
			
		||||
      break;
 | 
			
		||||
   case 1:
 | 
			
		||||
      t += 0x108;
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      t += 0x108;
 | 
			
		||||
      t <<= seg - 1;
 | 
			
		||||
   }
 | 
			
		||||
   return ((a_val & SIGN_BIT) ? t : -t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	BIAS		(0x84)		/* Bias for linear code. */
 | 
			
		||||
#define CLIP            8159
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* linear2ulaw() - Convert a linear PCM value to u-law
 | 
			
		||||
*
 | 
			
		||||
* In order to simplify the encoding process, the original linear magnitude
 | 
			
		||||
* is biased by adding 33 which shifts the encoding range from (0 - 8158) to
 | 
			
		||||
* (33 - 8191). The result can be seen in the following encoding table:
 | 
			
		||||
*
 | 
			
		||||
*	Biased Linear Input Code	Compressed Code
 | 
			
		||||
*	------------------------	---------------
 | 
			
		||||
*	00000001wxyza			000wxyz
 | 
			
		||||
*	0000001wxyzab			001wxyz
 | 
			
		||||
*	000001wxyzabc			010wxyz
 | 
			
		||||
*	00001wxyzabcd			011wxyz
 | 
			
		||||
*	0001wxyzabcde			100wxyz
 | 
			
		||||
*	001wxyzabcdef			101wxyz
 | 
			
		||||
*	01wxyzabcdefg			110wxyz
 | 
			
		||||
*	1wxyzabcdefgh			111wxyz
 | 
			
		||||
*
 | 
			
		||||
* Each biased linear code has a leading 1 which identifies the segment
 | 
			
		||||
* number. The value of the segment number is equal to 7 minus the number
 | 
			
		||||
* of leading 0's. The quantization interval is directly available as the
 | 
			
		||||
* four bits wxyz.  * The trailing bits (a - h) are ignored.
 | 
			
		||||
*
 | 
			
		||||
* Ordinarily the complement of the resulting code word is used for
 | 
			
		||||
* transmission, and so the code word is complemented before it is returned.
 | 
			
		||||
*
 | 
			
		||||
* For further information see John C. Bellamy's Digital Telephony, 1982,
 | 
			
		||||
* John Wiley & Sons, pps 98-111 and 472-476.
 | 
			
		||||
*/
 | 
			
		||||
unsigned char
 | 
			
		||||
linear2ulaw(
 | 
			
		||||
   short pcm_val)	/* 2's complement (16-bit range) */
 | 
			
		||||
{
 | 
			
		||||
   short         mask;
 | 
			
		||||
   short	 seg;
 | 
			
		||||
   unsigned char uval;
 | 
			
		||||
   
 | 
			
		||||
   /* Get the sign and the magnitude of the value. */
 | 
			
		||||
   pcm_val = pcm_val >> 2;
 | 
			
		||||
   if (pcm_val < 0) {
 | 
			
		||||
      pcm_val = -pcm_val;
 | 
			
		||||
      mask = 0x7F;
 | 
			
		||||
   } else {
 | 
			
		||||
      mask = 0xFF;
 | 
			
		||||
   }
 | 
			
		||||
   if ( pcm_val > CLIP ) pcm_val = CLIP;		/* clip the magnitude */
 | 
			
		||||
   pcm_val += (BIAS >> 2);
 | 
			
		||||
   
 | 
			
		||||
   /* Convert the scaled magnitude to segment number. */
 | 
			
		||||
   seg = search(pcm_val, seg_uend, 8);
 | 
			
		||||
   
 | 
			
		||||
   /*
 | 
			
		||||
   * Combine the sign, segment, quantization bits;
 | 
			
		||||
   * and complement the code word.
 | 
			
		||||
   */
 | 
			
		||||
   if (seg >= 8)		/* out of range, return maximum value. */
 | 
			
		||||
      return (unsigned char) (0x7F ^ mask);
 | 
			
		||||
   else {
 | 
			
		||||
      uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF);
 | 
			
		||||
      return (uval ^ mask);
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ulaw2linear() - Convert a u-law value to 16-bit linear PCM
 | 
			
		||||
 *
 | 
			
		||||
 * First, a biased linear code is derived from the code word. An unbiased
 | 
			
		||||
 * output can then be obtained by subtracting 33 from the biased code.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that this function expects to be passed the complement of the
 | 
			
		||||
 * original code word. This is in keeping with ISDN conventions.
 | 
			
		||||
 */
 | 
			
		||||
short
 | 
			
		||||
ulaw2linear(
 | 
			
		||||
   unsigned char	u_val)
 | 
			
		||||
{
 | 
			
		||||
   short t;
 | 
			
		||||
   
 | 
			
		||||
   /* Complement to obtain normal u-law value. */
 | 
			
		||||
   u_val = ~u_val;
 | 
			
		||||
   
 | 
			
		||||
   /*
 | 
			
		||||
    * Extract and bias the quantization bits. Then
 | 
			
		||||
    * shift up by the segment number and subtract out the bias.
 | 
			
		||||
    */
 | 
			
		||||
   t = ((u_val & QUANT_MASK) << 3) + BIAS;
 | 
			
		||||
   t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
 | 
			
		||||
   
 | 
			
		||||
   return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* A-law to u-law conversion */
 | 
			
		||||
unsigned char
 | 
			
		||||
alaw2ulaw(
 | 
			
		||||
   unsigned char	aval)
 | 
			
		||||
{
 | 
			
		||||
   aval &= 0xff;
 | 
			
		||||
   return (unsigned char) ((aval & 0x80) ? (0xFF ^ _a2u[aval ^ 0xD5]) :
 | 
			
		||||
	   (0x7F ^ _a2u[aval ^ 0x55]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* u-law to A-law conversion */
 | 
			
		||||
unsigned char
 | 
			
		||||
ulaw2alaw(
 | 
			
		||||
   unsigned char	uval)
 | 
			
		||||
{
 | 
			
		||||
   uval &= 0xff;
 | 
			
		||||
   return (unsigned char) ((uval & 0x80) ? (0xD5 ^ (_u2a[0xFF ^ uval] - 1)) :
 | 
			
		||||
			   (0x55 ^ (_u2a[0x7F ^ uval] - 1)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ---------- end of g711.c ----------------------------------------------------- */
 | 
			
		||||
@@ -1,27 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * g711.h
 | 
			
		||||
 *
 | 
			
		||||
 * u-law, A-law and linear PCM conversions.
 | 
			
		||||
 * Source: http://www.speech.kth.se/cost250/refsys/latest/src/g711.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _G711_H_
 | 
			
		||||
#define _G711_H_
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unsigned char	linear2alaw(short pcm_val);
 | 
			
		||||
short		    alaw2linear(unsigned char a_val);
 | 
			
		||||
unsigned char	linear2ulaw(short pcm_val);
 | 
			
		||||
short		    ulaw2linear(unsigned char u_val);
 | 
			
		||||
unsigned char	alaw2ulaw(unsigned char aval);
 | 
			
		||||
unsigned char	ulaw2alaw(unsigned char uval);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* _G711_H_ */
 | 
			
		||||
@@ -1,102 +0,0 @@
 | 
			
		||||
#ifndef G711_TABLE_H
 | 
			
		||||
#define G711_TABLE_H
 | 
			
		||||
 | 
			
		||||
#include "g711.h"
 | 
			
		||||
 | 
			
		||||
/* 16384 entries per table (16 bit) */
 | 
			
		||||
unsigned char linear_to_alaw[65536];
 | 
			
		||||
unsigned char linear_to_ulaw[65536];
 | 
			
		||||
 | 
			
		||||
/* 16384 entries per table (8 bit) */
 | 
			
		||||
unsigned short alaw_to_linear[256];
 | 
			
		||||
unsigned short ulaw_to_linear[256];
 | 
			
		||||
 | 
			
		||||
static void build_linear_to_xlaw_table(unsigned char *linear_to_xlaw,
 | 
			
		||||
                                       unsigned char (*linear2xlaw)(short))
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i=0; i<65536;i++){
 | 
			
		||||
        linear_to_xlaw[i] = linear2xlaw((short) i);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void build_xlaw_to_linear_table(unsigned short *xlaw_to_linear,
 | 
			
		||||
                                       short (*xlaw2linear)(unsigned char))
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i=0; i<256;i++){
 | 
			
		||||
        xlaw_to_linear[i] = (unsigned short) xlaw2linear(i);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void pcm16_to_xlaw(unsigned char *linear_to_xlaw, int src_length, const char *src_samples, char *dst_samples)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    const unsigned short *s_samples;
 | 
			
		||||
 | 
			
		||||
    s_samples = (const unsigned short *)src_samples;
 | 
			
		||||
 | 
			
		||||
    for (i=0; i < src_length / 2; i++)
 | 
			
		||||
    {
 | 
			
		||||
        dst_samples[i] = linear_to_xlaw[s_samples[i]];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void xlaw_to_pcm16(unsigned short *xlaw_to_linear, int src_length, const char *src_samples, char *dst_samples)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    unsigned char *s_samples;
 | 
			
		||||
    unsigned short *d_samples;
 | 
			
		||||
 | 
			
		||||
    s_samples = (unsigned char *) src_samples;
 | 
			
		||||
    d_samples = (unsigned short *)dst_samples;
 | 
			
		||||
 | 
			
		||||
    for (i=0; i < src_length; i++)
 | 
			
		||||
    {
 | 
			
		||||
        d_samples[i] = xlaw_to_linear[s_samples[i]];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pcm16_to_alaw(int src_length, const char *src_samples, char *dst_samples)
 | 
			
		||||
{
 | 
			
		||||
    pcm16_to_xlaw(linear_to_alaw, src_length, src_samples, dst_samples);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pcm16_to_ulaw(int src_length, const char *src_samples, char *dst_samples)
 | 
			
		||||
{
 | 
			
		||||
    pcm16_to_xlaw(linear_to_ulaw, src_length, src_samples, dst_samples);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void alaw_to_pcm16(int src_length, const char *src_samples, char *dst_samples)
 | 
			
		||||
{
 | 
			
		||||
    xlaw_to_pcm16(alaw_to_linear, src_length, src_samples, dst_samples);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ulaw_to_pcm16(int src_length, const char *src_samples, char *dst_samples)
 | 
			
		||||
{
 | 
			
		||||
    xlaw_to_pcm16(ulaw_to_linear, src_length, src_samples, dst_samples);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pcm16_alaw_tableinit()
 | 
			
		||||
{
 | 
			
		||||
    build_linear_to_xlaw_table(linear_to_alaw, linear2alaw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pcm16_ulaw_tableinit()
 | 
			
		||||
{
 | 
			
		||||
    build_linear_to_xlaw_table(linear_to_ulaw, linear2ulaw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void alaw_pcm16_tableinit()
 | 
			
		||||
{
 | 
			
		||||
    build_xlaw_to_linear_table(alaw_to_linear, alaw2linear);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ulaw_pcm16_tableinit()
 | 
			
		||||
{
 | 
			
		||||
    build_xlaw_to_linear_table(ulaw_to_linear, ulaw2linear);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // G711_TABLE_H
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
#ifndef G711_TABLE_H
 | 
			
		||||
#define G711_TABLE_H
 | 
			
		||||
 | 
			
		||||
void pcm16_to_alaw(int length, const char *src_samples, char *dst_samples);
 | 
			
		||||
void pcm16_to_ulaw(int length, const char *src_samples, char *dst_samples);
 | 
			
		||||
void alaw_to_pcm16(int length, const char *src_samples, char *dst_samples);
 | 
			
		||||
void ulaw_to_pcm16(int length, const char *src_samples, char *dst_samples);
 | 
			
		||||
 | 
			
		||||
void pcm16_alaw_tableinit();
 | 
			
		||||
void pcm16_ulaw_tableinit();
 | 
			
		||||
void alaw_pcm16_tableinit();
 | 
			
		||||
void ulaw_pcm16_tableinit();
 | 
			
		||||
 | 
			
		||||
#endif // G711_TABLE_H
 | 
			
		||||
@@ -1,218 +0,0 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/select.h>
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/core/fsm.h>
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
#include <osmocom/core/application.h>
 | 
			
		||||
#include <osmocom/core/serial.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/trau/osmo_ortp.h>
 | 
			
		||||
 | 
			
		||||
#include "g711.h"
 | 
			
		||||
 | 
			
		||||
#define RTP_PT_PCMU	0
 | 
			
		||||
#define RTP_PT_PCMA	8
 | 
			
		||||
 | 
			
		||||
struct modem_state {
 | 
			
		||||
	struct osmo_fd data_fd;
 | 
			
		||||
	struct osmo_rtp_socket *rtp;
 | 
			
		||||
	/* queue of linear PCM audio in RTP -> modem direction */
 | 
			
		||||
	struct llist_head rtp2modem;
 | 
			
		||||
	/* message buffer used if samples insufficient for next RTP frame were received */
 | 
			
		||||
	struct msgb *modem2rtp;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void *g_tall_ctx;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* call-back on received RTP data */
 | 
			
		||||
static void ortp_rx_cb(struct osmo_rtp_socket *rs, const uint8_t *payload,
 | 
			
		||||
			unsigned int payload_len, uint16_t seq_nr, uint32_t timestamp, bool marker)
 | 
			
		||||
{
 | 
			
		||||
	/* we received a RTP frame */
 | 
			
		||||
	struct modem_state *ms = rs->priv;
 | 
			
		||||
	struct msgb *msg = msgb_alloc(payload_len*2, "RTP Rx");
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	int16_t *out;
 | 
			
		||||
 | 
			
		||||
	OSMO_ASSERT(msg);
 | 
			
		||||
 | 
			
		||||
	out = (int16_t *) msgb_put(msg, payload_len*2);
 | 
			
		||||
 | 
			
		||||
	if (payload_len != 160) {
 | 
			
		||||
		fprintf(stderr, "RTP payload length %d != 160, dropping\n", payload_len);
 | 
			
		||||
		msgb_free(msg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* convert from Alaw to linear PCM (160 -> 320 bytes) */
 | 
			
		||||
	for (i = 0; i < payload_len; i++)
 | 
			
		||||
		out[i] = alaw2linear(payload[i]);
 | 
			
		||||
 | 
			
		||||
	/* append to the write queue */
 | 
			
		||||
	msgb_enqueue(&ms->rtp2modem, msg);
 | 
			
		||||
	ms->data_fd.when |= OSMO_FD_WRITE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void modem2rtp(struct modem_state *ms, const uint8_t *data, unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
	const int16_t *data16 = (const int16_t *)data;
 | 
			
		||||
	unsigned int samples = len / 2;
 | 
			
		||||
	unsigned int offset = 0;
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
 | 
			
		||||
	/* samples are always 16bit, we cannot read half a sample */
 | 
			
		||||
	OSMO_ASSERT((len & 1) == 0);
 | 
			
		||||
 | 
			
		||||
	/* first complete any pending incomplete RTP frame */
 | 
			
		||||
	if (ms->modem2rtp) {
 | 
			
		||||
		struct msgb *msg = ms->modem2rtp;
 | 
			
		||||
		unsigned int missing_samples = 160 - msgb_length(msg);
 | 
			
		||||
		for (i = 0; i < missing_samples; i++) {
 | 
			
		||||
			if (i >= samples)
 | 
			
		||||
				break;
 | 
			
		||||
			msgb_put_u8(msg, linear2alaw(data16[i]));
 | 
			
		||||
		}
 | 
			
		||||
		offset = i;
 | 
			
		||||
		if (msgb_length(msg) == 160) {
 | 
			
		||||
			osmo_rtp_send_frame_ext(ms->rtp, msgb_data(msg), msgb_length(msg), 160, false);
 | 
			
		||||
			msgb_free(msg);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* then send as many RTP frames as we have samples */
 | 
			
		||||
	for (offset = offset; offset + 160 <= samples; offset += 160) {
 | 
			
		||||
		uint8_t buf[160];
 | 
			
		||||
		for (i = 0; i < sizeof(buf); i++)
 | 
			
		||||
			buf[i] = linear2alaw(data16[offset + i]);
 | 
			
		||||
		osmo_rtp_send_frame_ext(ms->rtp, buf, sizeof(buf), 160, false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* store remainder in msgb */
 | 
			
		||||
	if (offset < samples) {
 | 
			
		||||
		struct msgb *msg = msgb_alloc_c(ms, 160, "modem2rtp");
 | 
			
		||||
		OSMO_ASSERT(msg);
 | 
			
		||||
		OSMO_ASSERT(len - offset < 160);
 | 
			
		||||
		for (i = 0; i < len - offset; i++)
 | 
			
		||||
			msgb_put_u8(msg, linear2alaw(data16[offset + i]));
 | 
			
		||||
		ms->modem2rtp = msg;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* call back on file descriptor events of the modem DATA ttyUSB device */
 | 
			
		||||
static int modem_data_fd_cb(struct osmo_fd *ofd, unsigned int what)
 | 
			
		||||
{
 | 
			
		||||
	struct modem_state *ms = ofd->data;
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	if (what & OSMO_FD_READ) {
 | 
			
		||||
		/* SIM5360 USB AUDIO Application Note v1.01 states 1600 bytes every 100ms */
 | 
			
		||||
		uint8_t rx_buf[1600];
 | 
			
		||||
		rc = read(ofd->fd, rx_buf, sizeof(rx_buf));
 | 
			
		||||
		OSMO_ASSERT(rc > 0);
 | 
			
		||||
		modem2rtp(ms, rx_buf, rc);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (what & OSMO_FD_WRITE) {
 | 
			
		||||
		struct msgb *msg = msgb_dequeue(&ms->rtp2modem);
 | 
			
		||||
		if (!msg)
 | 
			
		||||
			ofd->when &= ~OSMO_FD_WRITE;
 | 
			
		||||
		else {
 | 
			
		||||
			/* SIM5300 USB AUDIO Application Note v1.01 states 640 bytes every 40ms;
 | 
			
		||||
			 * we simply write every RTP frame individually (320 bytes every 20ms) */
 | 
			
		||||
			rc = write(ofd->fd, msgb_data(msg), msgb_length(msg));
 | 
			
		||||
			if (rc != msgb_length(msg))
 | 
			
		||||
				fprintf(stderr, "Short write: %d < %u\n", rc, msgb_length(msg));
 | 
			
		||||
			msgb_free(msg);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int modem_data_open(struct modem_state *ms, const char *basepath)
 | 
			
		||||
{
 | 
			
		||||
	char fname[PATH_MAX+1];
 | 
			
		||||
	int fd;
 | 
			
		||||
 | 
			
		||||
	/* the assumption is that the caller provides something like
 | 
			
		||||
	 * "/dev/serial/by-path/pci-0000:00:14.0-usb-0:2:1" */
 | 
			
		||||
	snprintf(fname, sizeof(fname), "%s.0-port0", basepath);
 | 
			
		||||
 | 
			
		||||
	fd = osmo_serial_init(fname, 921600);
 | 
			
		||||
	if (fd < 0) {
 | 
			
		||||
		fprintf(stderr, "failed to open device '%s': %s\n", fname, strerror(errno));
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	osmo_fd_setup(&ms->data_fd, fd, OSMO_FD_READ, modem_data_fd_cb, ms, 0);
 | 
			
		||||
	osmo_fd_register(&ms->data_fd);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct modem_state *modem_create(void *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct modem_state *ms = talloc_zero(ctx, struct modem_state);
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	INIT_LLIST_HEAD(&ms->rtp2modem);
 | 
			
		||||
 | 
			
		||||
	ms->rtp = osmo_rtp_socket_create(ms, 0);
 | 
			
		||||
	OSMO_ASSERT(ms->rtp);
 | 
			
		||||
	osmo_rtp_socket_set_pt(ms->rtp, RTP_PT_PCMA);
 | 
			
		||||
	ms->rtp->priv = ms;
 | 
			
		||||
	ms->rtp->rx_cb = ortp_rx_cb;
 | 
			
		||||
 | 
			
		||||
	rc = osmo_rtp_socket_bind(ms->rtp, "0.0.0.0", 1111);
 | 
			
		||||
	OSMO_ASSERT(rc == 0);
 | 
			
		||||
 | 
			
		||||
	rc = osmo_rtp_socket_connect(ms->rtp, "127.0.0.1", 2222);
 | 
			
		||||
	//rc = osmo_rtp_socket_autoconnect(ms->rtp);
 | 
			
		||||
	OSMO_ASSERT(rc == 0);
 | 
			
		||||
 | 
			
		||||
	osmo_rtp_set_source_desc(ms->rtp, "cname", "simcom2rtp", NULL, NULL, NULL,
 | 
			
		||||
				 "osmo-simcom2rtp", NULL);
 | 
			
		||||
 | 
			
		||||
	return ms;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	talloc_enable_null_tracking();
 | 
			
		||||
	g_tall_ctx = talloc_named_const(NULL, 1, "simcom2rtp");
 | 
			
		||||
 | 
			
		||||
	msgb_talloc_ctx_init(g_tall_ctx, 0);
 | 
			
		||||
	osmo_init_logging2(g_tall_ctx, NULL);
 | 
			
		||||
	osmo_fsm_log_timeouts(true);
 | 
			
		||||
	osmo_fsm_log_addr(true);
 | 
			
		||||
	//osmo_stats_init(g_tall_ctx);
 | 
			
		||||
	osmo_rtp_init(g_tall_ctx);
 | 
			
		||||
 | 
			
		||||
	struct modem_state *ms = modem_create(g_tall_ctx);
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	OSMO_ASSERT(ms);
 | 
			
		||||
	rc = modem_data_open(ms, "/dev/serial/by-path/pci-0000:00:14.0-usb-0:2:1");
 | 
			
		||||
	OSMO_ASSERT(rc == 0);
 | 
			
		||||
 | 
			
		||||
	while (1) {
 | 
			
		||||
		osmo_select_main(0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
EXTRA_DIST = osmo-mgw.service
 | 
			
		||||
 | 
			
		||||
if HAVE_SYSTEMD
 | 
			
		||||
systemdsystemunit_DATA = \
 | 
			
		||||
  osmo-mgw.service
 | 
			
		||||
endif
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Osmocom Media Gateway (MGW)
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
Restart=always
 | 
			
		||||
ExecStart=/usr/bin/osmo-mgw -s -c /etc/osmocom/osmo-mgw.cfg
 | 
			
		||||
RestartSec=2
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
							
								
								
									
										476
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										476
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							@@ -1,476 +0,0 @@
 | 
			
		||||
osmo-mgw (1.7.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  [ Neels Hofmeyr ]
 | 
			
		||||
  * rename codecs_cmp() to codecs_same()
 | 
			
		||||
  * mgcp_codec: constify 'param' arg
 | 
			
		||||
  * fix crashes: don't assert on incoming RTP packet size
 | 
			
		||||
  * mgcp_send(): stop looping on conversion error
 | 
			
		||||
  * mgcp_codec: split codec_free() off of codec_init()
 | 
			
		||||
  * fix memleak: actually free strings in mgcp_codec_reset_all()
 | 
			
		||||
  * mgcp_test: extend / rewrite test_mgcp_codec_pt_translate()
 | 
			
		||||
  * test_mgcp_codec_pt_translate(): more tests
 | 
			
		||||
  * differentiate AMR octet-aligned=0 vs =1
 | 
			
		||||
  * ptmap: implicitly match  '/8000' and '/8000/1'
 | 
			
		||||
  * mgcp_codec: codec_set(): log about all possible errors
 | 
			
		||||
  * mgcp_codec_add: fix audio_name size check
 | 
			
		||||
  * explicitly free codecs in mgcp_rtp_conn_cleanup()
 | 
			
		||||
  * tweak mgcp_parse_audio_ptime_rtpmap()
 | 
			
		||||
  * SDP: store all ptmap entries
 | 
			
		||||
  * mgcp_client_fsm cleanup: Do not assert on DLCX failure
 | 
			
		||||
  * clear pending requests on MGCP failure
 | 
			
		||||
  * client: endp fsm: add notify struct, prep for cancel-notify
 | 
			
		||||
  * client: endp fsm: clear ci[] before dispatching DLCX success
 | 
			
		||||
  * client: endp fsm: allow cancelling a notify event
 | 
			
		||||
  * client: endp fsm: add osmo_mgcpc_ep_ci_ep()
 | 
			
		||||
  * accept MGCP without SDP
 | 
			
		||||
  * fix use-after-free: require new fsm deferred dealloc, check for term
 | 
			
		||||
 | 
			
		||||
  [ Pau Espin Pedrol ]
 | 
			
		||||
  * mgcp_test: Correctly release all endpoints allocated
 | 
			
		||||
  * mgw: Allocate mgcp_conn instance under tcfg->endpoints
 | 
			
		||||
 | 
			
		||||
  [ Harald Welte ]
 | 
			
		||||
  * manual: Fix copy+paste error
 | 
			
		||||
  * mgcp_client: Check for osmo_fsm_register() error return value
 | 
			
		||||
  * Move fsm_mgcp_client regstration to __attribute__((contructor))
 | 
			
		||||
  * exit(2) on unsupported positional arguments on command line
 | 
			
		||||
 | 
			
		||||
  [ Oliver Smith ]
 | 
			
		||||
  * osmoappdesc.py: switch to python 3
 | 
			
		||||
 | 
			
		||||
 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 03 Jan 2020 13:35:09 +0100
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.6.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  [ Oliver Smith ]
 | 
			
		||||
  * Cosmetic: fix spaces/tabs in mgcp_requests[]
 | 
			
		||||
  * Inactive connection cleanup (disabled by default)
 | 
			
		||||
  * debian: create -doc subpackage with pdf manuals
 | 
			
		||||
  * vty: allow 0 as conn-timeout to disable it
 | 
			
		||||
  * vty: update desc of conn-timeout
 | 
			
		||||
  * manuals: update VTY documentation
 | 
			
		||||
  * "make dist" fix for: no rule to make mgcp_common.h
 | 
			
		||||
  * contrib/jenkins.sh: run "make maintainer-clean"
 | 
			
		||||
 | 
			
		||||
  [ Philipp Maier ]
 | 
			
		||||
  * Add option to GSM HR frames to RFC5593 representation
 | 
			
		||||
  * mgcp_sdp: cosmetic: correct typo in comment
 | 
			
		||||
  * mgco_client: cosmetic: remove excess whitespace
 | 
			
		||||
  * mgcp_sdp: mgcp_sdp.c does not include own header file
 | 
			
		||||
  * mgcp_sdp: untangle parsing of a= parameters
 | 
			
		||||
  * mgcp_network: use mgcp_rtp_codec in downlink format callback
 | 
			
		||||
  * AMR: Add function to convert between bw-effient and octet aligned mode
 | 
			
		||||
 | 
			
		||||
  [ Neels Hofmeyr ]
 | 
			
		||||
  * log: don't spam with "can not patch PT" messages
 | 
			
		||||
  * mgcp client: allow setting conn mode for CRCX and MDCX
 | 
			
		||||
  * make codec_table public as osmo_mgcpc_codec_names
 | 
			
		||||
  * move MGW endpoint FSM from osmo-bsc to here
 | 
			
		||||
  * fix: multiple initial CRCX
 | 
			
		||||
  * constify map_codec_to_pt() ptmap arg
 | 
			
		||||
 | 
			
		||||
  [ Pau Espin Pedrol ]
 | 
			
		||||
  * mgcp-client: whitespace cleanup in mgcp_client.c
 | 
			
		||||
  * mgcp-client: Sanitize implementation of mgcp_client_rtpbridge_wildcard
 | 
			
		||||
  * libosmo-mgcp: Use trunk type during endpoint allocation
 | 
			
		||||
  * cosmetic: Fix typos in comment
 | 
			
		||||
  * cosmetic: tests: mgcp_client_test: clean trailing whitespace
 | 
			
		||||
  * mgcp_msg: Log faulty line on Osmux parsing error
 | 
			
		||||
  * cosmetic: handle_modify_con: Fix indentation level
 | 
			
		||||
  * Introduce log fmt helpers LOGPENDP and LOGPCONN
 | 
			
		||||
  * create_response_with_sdp: Fix inclusion of X-Osmux
 | 
			
		||||
  * osmux: Cleanup of CID alloc pool APIs
 | 
			
		||||
  * mgcp_osmux.c: osmux_enable_endpoint: Fix incorrect return check
 | 
			
		||||
  * osmux: Log osmux socket during osmux_init
 | 
			
		||||
  * mgcp-cli: Change osmo_mgcpc_ep_fsm name to avoid collision with old osmo-bsc
 | 
			
		||||
  * osmux: Document func and return different rc upon osmux init failure
 | 
			
		||||
  * osmux: Fix reception of legacy dummy payloads
 | 
			
		||||
  * osmux: Use LOGPCONN in several log calls
 | 
			
		||||
  * cosmetic: mgcp_udp_send: Document port param is in network byte order
 | 
			
		||||
  * cosmetic: osmux: Document network byte order in port variable
 | 
			
		||||
  * vty: Allow enabling Osmux
 | 
			
		||||
  * osmux: Allocate CID during CRCX
 | 
			
		||||
  * osmux: Introduce mgcp_conn_rtp_is_osmux() helper
 | 
			
		||||
  * osmux: Mark conn_rtp->type as osmux during CRCX
 | 
			
		||||
  * mgcp-cli: Allow submitting X-Osmux on CRCX request
 | 
			
		||||
  * mgcp-cli: Parse X-Osmux on CRCX response
 | 
			
		||||
  * osmux: Handle Osmux MGCP extension in MDCX messages
 | 
			
		||||
  * mgcp-cli: Allow submitting X-Osmux on MDCX request
 | 
			
		||||
  * mgcp-cli: Parse X-Osmux on MDCX response
 | 
			
		||||
  * osmux: Drop unneeded OSMUX_STATE_NEGOTIATING
 | 
			
		||||
  * mgcp-cli: endpoint_fsm: Add API to retrieve Osmux CID from MGW
 | 
			
		||||
  * osmux: Provide correct local port during mgcp resp
 | 
			
		||||
  * osmux: Use remote port to send osmux frames
 | 
			
		||||
  * osmux: Improve logging around osmux enabling events
 | 
			
		||||
  * osmux: Delay osmux enable of conn until remote addr is configured by MDCX
 | 
			
		||||
  * osmux: Redo read/write osmux glue code to have data routed correctly
 | 
			
		||||
  * mgw, mgcp-li: Handle X-Osmux param name as case insensitive
 | 
			
		||||
  * osmux: Use DUMMY ft msg as per Osmux spec
 | 
			
		||||
  * osmux: Fix loopback for Osmux connections
 | 
			
		||||
  * osmux: Fix CID release for non-enabled connections
 | 
			
		||||
  * osmux: Fix hardcoded rtp payload_type 98 in osmux conn
 | 
			
		||||
  * mgcp-cli: Validate osmux cid value during mgcp_msg_gen
 | 
			
		||||
  * mgw: Support uppercase LCO options
 | 
			
		||||
  * mgw: Support lowercase header parameters
 | 
			
		||||
  * mgcp-cli: Support lowercase header parameters
 | 
			
		||||
  * mgw: Support receiving uppercase connection mode
 | 
			
		||||
  * mgw: Support receiving lowercase LCO codec
 | 
			
		||||
  * mgw: Make check of duplicated LCO fields case insensitive
 | 
			
		||||
  * mgw: Allow receiving lowercase MGCP header keyword
 | 
			
		||||
  * mgw: Allow receiving lowercase X-Osmo-Ign Callid field
 | 
			
		||||
  * mgw: Allow receiving uppercase noanswer keyword
 | 
			
		||||
  * doc: X-Osmo-IGN: small formatting and typo fixes
 | 
			
		||||
  * doc: Add Osmux documentation to OsmoMGW User Manual
 | 
			
		||||
  * Catch unsigned integer MGCP parsing errors with strtoul
 | 
			
		||||
  * Fix return variable of strtoul()
 | 
			
		||||
  * Remove undefined param passed to {logging,osmo_stats}_vty_add_cmds
 | 
			
		||||
  * configure.ac: Require libosmo-netif 0.6.0
 | 
			
		||||
 | 
			
		||||
  [ Alexander Couzens ]
 | 
			
		||||
  * mgcp_internal: LOGPENDP: ensure *endp is not NULL
 | 
			
		||||
 | 
			
		||||
  [ Harald Welte ]
 | 
			
		||||
  * handle NULL return of rate_ctr_group_alloc()
 | 
			
		||||
  * update .gitignore
 | 
			
		||||
  * mgcp_sdp: Don't check if an unsigned int is below 0
 | 
			
		||||
 | 
			
		||||
  [ Vadim Yanitskiy ]
 | 
			
		||||
  * configure.ac: drop useless check for -fvisibility=hidden
 | 
			
		||||
 | 
			
		||||
  [ Daniel Willmann ]
 | 
			
		||||
  * manuals: Add script to regenerate vty/counter documentation
 | 
			
		||||
  * manuals: Update vty/counter documentation
 | 
			
		||||
 | 
			
		||||
  [ Hoernchen ]
 | 
			
		||||
  * turn -Werror=null-dereference into a warning
 | 
			
		||||
 | 
			
		||||
 -- Pau Espin Pedrol <pespin@sysmocom.de>  Wed, 07 Aug 2019 16:52:58 +0200
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.5.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  [ Pau Espin Pedrol ]
 | 
			
		||||
  * gitignore: Filter *.pc
 | 
			
		||||
  * configure: Find correct libgsm's gsm.h header
 | 
			
		||||
  * vty: Fix typo writing bts-jitter-buffer-delay-{min,max}
 | 
			
		||||
  * Remove libosmo-legacy-mgcp and osmo-bsc-mgcp
 | 
			
		||||
  * debian: Remove dangling symlink to osmo-bsc-mgcp.service
 | 
			
		||||
  * Install systemd services with autotools
 | 
			
		||||
  * Install sample cfg file to /etc/osmocom
 | 
			
		||||
  * mgcp: Fix osmux_cid_bitmap static array size calculation
 | 
			
		||||
  * mgcp_osmux: Use define to calculate rtp_ssrc_winlen
 | 
			
		||||
  * osmux: Avoid initing output without enabling osmux
 | 
			
		||||
  * mgcp: Log endpoint nr consistently as hex
 | 
			
		||||
  * osmux_send_dummy: Avoid logging incorrectly and sending if osmux not enabled
 | 
			
		||||
  * osmux: Don't process regular osmux frames if disabled by cfg
 | 
			
		||||
  * osmux: Move parse_cid of legacy dummy frames to own function
 | 
			
		||||
  * osmux: Make func handling dummy frames independent of endp type
 | 
			
		||||
  * osmux: allow enabling osmux only on correct activating state
 | 
			
		||||
  * osmux: Improve checks around activating and using enabled osmux
 | 
			
		||||
  * osmux.h: Document enum osmux_state
 | 
			
		||||
  * osmux: Avoid processing further frames if conn not found
 | 
			
		||||
 | 
			
		||||
  [ Philipp Maier ]
 | 
			
		||||
  * mgcp_client_fsm: allow ptmap in mgcp_client_fsm as well
 | 
			
		||||
  * mgcp_network: translate payload type numbers in RTP packets
 | 
			
		||||
  * mgcp_client: use IETF source port as for MGCP
 | 
			
		||||
  * mgcp_client: increment local port number when port is in use
 | 
			
		||||
  * mgcp_test: release endpoints after use
 | 
			
		||||
  * network: do not patch PT of RTCP packets
 | 
			
		||||
  * network: check packets before further processing
 | 
			
		||||
  * Cosmetic: remove misplaced line break
 | 
			
		||||
  * mgcp_sdp: restructure mgcp_write_response_sdp() (rtpmap)
 | 
			
		||||
  * mgcp_sdp: restructure mgcp_write_response_sdp() (audio)
 | 
			
		||||
  * mgcp_client: check local port only once
 | 
			
		||||
  * mgcp_client_fsm: switch to MGCP_CONN_RECV_SEND in add_audio()
 | 
			
		||||
  * mgcp_protocol: increase buffer space for codec name in LCO
 | 
			
		||||
  * osmo-mgw: Add vty reference manual
 | 
			
		||||
 | 
			
		||||
  [ Neels Hofmeyr ]
 | 
			
		||||
  * fix handling of "Wrong domain name" error
 | 
			
		||||
  * interpret domain '*' as 'allow any domain'
 | 
			
		||||
  * cosmetic: log: fix "CallIDs does not match"
 | 
			
		||||
  * fix 3G hack: allow any IP for loopback and 0.0.0.0
 | 
			
		||||
  * cosmetic: drop code dup in mgcp_client_fsm.c CRCX
 | 
			
		||||
  * add X-Osmo-IGN MGCP header to ignore CallID
 | 
			
		||||
  * X-Osmo-IGN: rather parse items by token, not char
 | 
			
		||||
  * mgcp_test: fix log of conn_id presence
 | 
			
		||||
  * mgcp_test: fix get_conn_id_from_response() CI length
 | 
			
		||||
  * mgcp_client_test: cosmetically re-arrange reply_to() args
 | 
			
		||||
  * mgcp_client_test: use "\r\n\r\n" instead of "\n\n"
 | 
			
		||||
  * mgcp_client_test: also verify received conn_id
 | 
			
		||||
  * mgcp_client_test: test long conn_id
 | 
			
		||||
  * mgcp_client: error on too long conn id
 | 
			
		||||
  * mgcp_common: rename to MGCP_CONN_ID_MAXLEN
 | 
			
		||||
  * doc: fix mgcp_verify_ci() return val doc
 | 
			
		||||
  * mgcp_verify_ci(): return meaningful error codes
 | 
			
		||||
  * fix mgcp_verify_ci(): off-by-one in max len check
 | 
			
		||||
  * generate shorter 'I:' conn IDs
 | 
			
		||||
  * mgcp_conn_get(): compare conn Id ('I:') case insensitively
 | 
			
		||||
  * mgcp_conn_get(): match conn Id ('I:') despite leading zeros
 | 
			
		||||
  * cosmetic: mgcp_test: fix get_conn_id_from_response()
 | 
			
		||||
  * comment: indicate struct type for mgcp_endpoint.conns
 | 
			
		||||
  * log: avoid logging early media as error
 | 
			
		||||
  * fix osmo-mgw -s; fixes osmo-mgw.service using -s
 | 
			
		||||
  * Importing history from osmo-gsm-manuals.git
 | 
			
		||||
  * OsmoMGW: update VTY reference
 | 
			
		||||
  * OsmoMGW: document the 'X-Osmo-IGN' MGCP extension
 | 
			
		||||
  * mgw: update vty reference
 | 
			
		||||
  * drop/replace very weird logging in mgcp_client.c
 | 
			
		||||
  * check_rtp: on IP:port errors, log the IP and port
 | 
			
		||||
  * osmo-mgw: err-log: include expected domain name
 | 
			
		||||
  * mgcp_client_vty: fix missing talloc_free
 | 
			
		||||
  * mgcp_client: drop a bunch of dead code
 | 
			
		||||
  * mgcp_client: logging tweaks
 | 
			
		||||
  * mgcp_client: make domain part of endpoint configurable
 | 
			
		||||
  * mgcp_client: tweak some log levels INFO -> {DEBUG,ERROR}
 | 
			
		||||
 | 
			
		||||
  [ Stefan Sperling ]
 | 
			
		||||
  * add VTY commands which show specific mgcp endpoints
 | 
			
		||||
  * add MGCP CRCX command statistics to osmo-mgw
 | 
			
		||||
  * show RTP TX/RX stats in 'mgcp show stats' output
 | 
			
		||||
  * use local variable for rate counters in handle_create_con()
 | 
			
		||||
  * add more mgcp crxc error counters
 | 
			
		||||
  * add MDCX command statistics to osmo-mgw
 | 
			
		||||
  * add aggregated rtp connection stats to osmo-mgw
 | 
			
		||||
  * add DLCX command statistics to osmo-mgw
 | 
			
		||||
 | 
			
		||||
  [ Harald Welte ]
 | 
			
		||||
  * debian/rules: Don't overwrite .tarball-version
 | 
			
		||||
  * check_rtp_origin(): Don't memcmp sockadd_in and in_addr
 | 
			
		||||
  * check_rtp_origin(): Avoid using memcmp for comparing integer types
 | 
			
		||||
  * vty-ref: Update URI of docbook 5.0 schema
 | 
			
		||||
 | 
			
		||||
  [ Daniel Willmann ]
 | 
			
		||||
  * mgw: Add new VTY reference
 | 
			
		||||
  * Add initial OsmoMGW manual
 | 
			
		||||
 | 
			
		||||
  [ Oliver Smith ]
 | 
			
		||||
  * build manuals moved here from osmo-gsm-manuals.git
 | 
			
		||||
  * jenkins.sh: remove leftover MGCP env variable
 | 
			
		||||
  * Fix DISTCHECK_CONFIGURE_FLAGS override
 | 
			
		||||
  * contrib/jenkins.sh: build and publish manuals
 | 
			
		||||
  * contrib: fix makedistcheck with disabled systemd
 | 
			
		||||
 | 
			
		||||
 -- Harald Welte <laforge@gnumonks.org>  Sun, 20 Jan 2019 15:02:18 +0100
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.4.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  [ Philipp Maier ]
 | 
			
		||||
  * network: independently initalize state->out_stream
 | 
			
		||||
  * stats: use libosmocore rate counter for in/out_stream.err_ts_counter
 | 
			
		||||
  * mgcp_sdp: correct apidoc of mgcp_parse_sdp_data
 | 
			
		||||
  * vty: clean up rtp port-range command
 | 
			
		||||
  * sdp: remove unused alt_codec field from struct mgcp_rtp_end
 | 
			
		||||
  * sdp: remove circular inclusion
 | 
			
		||||
  * protocol: Try whole port range on port allocation
 | 
			
		||||
  * client: do not start connections in loopback mode
 | 
			
		||||
  * mgcp_network: do not log destination invalid ip/port as error
 | 
			
		||||
  * cosmetic: fix log output
 | 
			
		||||
  * conn: call talloc_free before setting the pointer to NULL
 | 
			
		||||
  * protocol: do not change LCO, when no LCO are present
 | 
			
		||||
  * protocol: reject illegal lco options
 | 
			
		||||
  * cosmetic: fix typo
 | 
			
		||||
  * mgw: clean up codec negotiation (sdp)
 | 
			
		||||
  * client: add features to generate and parse codec information
 | 
			
		||||
  * mgcp_internal: remove unused struct member
 | 
			
		||||
  * stats: replace packet statistic counters with libosmocore rate counters
 | 
			
		||||
  * stat+vty: fix printing of rate counter values
 | 
			
		||||
  * protocol: prevent unnecessary null pointer deref
 | 
			
		||||
 | 
			
		||||
  [ Pau Espin Pedrol ]
 | 
			
		||||
  * legacy-mgcp: Add jitter buffer on the uplink receiver
 | 
			
		||||
  * legacy-mgcp: switch to new osmux output APIs
 | 
			
		||||
  * mgcp: mgcp_osmux: use conn_bts when forwarding pkts from bsc_nat
 | 
			
		||||
  * mgcp: switch to new osmux output APIs
 | 
			
		||||
  * debian: Package installed example doc files
 | 
			
		||||
  * gitignore: Add m4 scripts from m4 subdir
 | 
			
		||||
 | 
			
		||||
  [ Neels Hofmeyr ]
 | 
			
		||||
  * api doc: fix parameter name for mgcp_conn_create()
 | 
			
		||||
  * mgcp-client: add mgcp_conn_get_ci()
 | 
			
		||||
  * mgcp_client_fsm: improve error logging
 | 
			
		||||
  * cosmetic: fix doxygen comment markers
 | 
			
		||||
  * cosmetic: mgcp_network.c: merge one LOGPC to its preceding LOGP
 | 
			
		||||
  * IuUP hack: make RTP patching less general
 | 
			
		||||
 | 
			
		||||
  [ Harald Welte ]
 | 
			
		||||
  * cosmetic: fix typo in log message: 'abrupt' instead of 'aprupt'
 | 
			
		||||
 | 
			
		||||
  [ Daniel Willmann ]
 | 
			
		||||
  * git-version-gen: Don't check for .git directory
 | 
			
		||||
 | 
			
		||||
 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 27 Jul 2018 19:05:22 +0200
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.3.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  [ Pau Espin Pedrol ]
 | 
			
		||||
  * contrib: Add osmo-mgw systemd service
 | 
			
		||||
  * legacy: mgcp_protocol: Don't print osmux stats if it is off
 | 
			
		||||
  * mgcp_stat: Don't print osmux stats if it is off
 | 
			
		||||
 | 
			
		||||
  [ Neels Hofmeyr ]
 | 
			
		||||
  * fix segfault: DLCX for unknown endpoint: dont try to log NULL endpoint
 | 
			
		||||
  * MGCP endpoints: parse as decimal, not hex
 | 
			
		||||
  * add --enable-sanitize config option
 | 
			
		||||
  * legacy_mgcp: mgcp_test: sanitize: free msgb_ctx
 | 
			
		||||
  * mgcp_test: test_packet_error_detection: sanitize: free all conns
 | 
			
		||||
  * mgcp_test: test_no_cycle: sanitize: free endp
 | 
			
		||||
  * mgcp_test: sanitize: free msgb_ctx
 | 
			
		||||
  * mgcp_client: don't configure "bts base"
 | 
			
		||||
  * Revert "mgcp_client: don't configure "bts base"" until osmo-msc is ready
 | 
			
		||||
  * mgcp_client: add transaction cleanup
 | 
			
		||||
  * mgcp_client_test makefile: add update_exp target
 | 
			
		||||
  * cosmetic: mgcp_network: typo in log
 | 
			
		||||
  * osmo-mgw: Add talloc context introspection via VTY
 | 
			
		||||
  * mgcp_client: show failure by MGCP SDP section parsing test
 | 
			
		||||
  * mgcp_client: cosmetic: clean up SDP params parsing
 | 
			
		||||
  * mgcp_client: detect SDP section-start parsing errors
 | 
			
		||||
  * compiler warning: ignore deprecated in mgcp_client_test.c
 | 
			
		||||
  * configure: add --enable-werror
 | 
			
		||||
  * jenkins.sh: add --enable-werror to configure flags
 | 
			
		||||
  * cosmetic: mgcp, legacy_mgcp: drop unused vty.h definitions
 | 
			
		||||
  * use osmo_init_logging2() with proper talloc ctx
 | 
			
		||||
 | 
			
		||||
  [ Philipp Maier ]
 | 
			
		||||
  * osmux: fix nullpointer dereference
 | 
			
		||||
  * cosmetic: guard dead osmux vty code with ifdef
 | 
			
		||||
  * cosmetic: remove prefix "net" from rtp related vty commands
 | 
			
		||||
  * doc: update sample config file
 | 
			
		||||
  * cosmetic: use correct VTY port number constant
 | 
			
		||||
  * vty: simplify endpoint allocation
 | 
			
		||||
  * vty: do not change number_endpoints at runtime
 | 
			
		||||
  * MGCP: Connection Identifiers are hex strings
 | 
			
		||||
  * libosmo-mgcp: Connection Identifiers are allocated by MGW, not CA
 | 
			
		||||
  * client: use osmo_strlcpy instead of strncpy
 | 
			
		||||
  * cosmetic: fix sourcecode formatting
 | 
			
		||||
  * cosmetic: clearly mark endpoint numbers as hex
 | 
			
		||||
  * client: use string as connection identifier
 | 
			
		||||
  * conn: remove assertions
 | 
			
		||||
  * mgcp_test: fix wrong strcmp() parameters
 | 
			
		||||
  * mgcp_test: fix nullpointer dereference
 | 
			
		||||
  * mgcp_test: add returncode check
 | 
			
		||||
  * mgcp_test: fix possible double free
 | 
			
		||||
  * mcgp_client: mgcp_msg_gen(): add checks to verify params
 | 
			
		||||
  * network: use originating RTP packet address for loopback
 | 
			
		||||
  * client: mgcp_response_parse_params: check rtp port
 | 
			
		||||
  * mgcp: allow endpoints beginning from zero
 | 
			
		||||
  * client/common: move constant MGCP_ENDPOINT_MAXLEN
 | 
			
		||||
  * mgcp: make domain name configurable
 | 
			
		||||
  * cosmetic: protocol: remove unnecessary nul termination
 | 
			
		||||
  * client: do not insist on \n\n when parsing MGCP messages
 | 
			
		||||
  * main: display mgcp ip/port
 | 
			
		||||
  * client: make callid in MDCX mandatory
 | 
			
		||||
  * client: add missing mandatory SDP fields
 | 
			
		||||
  * mgcp: permit wildcarded endpoint assignment (CRCX)
 | 
			
		||||
  * mgcp: add prefix to virtual trunk
 | 
			
		||||
  * client: eliminate destructive parameter parsing
 | 
			
		||||
  * client: eliminate destructive head parsing
 | 
			
		||||
  * cosmetic: client: add doxygen comments
 | 
			
		||||
  * protocol: fix problem with line break and OSMUX
 | 
			
		||||
  * protocol: fix missing carriage return
 | 
			
		||||
  * client: fix sdp parameter ordering
 | 
			
		||||
  * protocol: check the packetization in local cx options
 | 
			
		||||
  * cosmetic: remove spaces from pointer symbol
 | 
			
		||||
  * client: Do not accept endpoint ids with wildcards in responses
 | 
			
		||||
  * client: do not accept endpoint ids without @ character in responses
 | 
			
		||||
  * client: prohibit endpoint ids without @ character
 | 
			
		||||
  * protocol: on wildcarded CRCX return endpoint number as hex
 | 
			
		||||
  * msg: fix response code on exhausted endp resources
 | 
			
		||||
  * cosmetic: move mgcp_release_endp() to mgcp_ep.c
 | 
			
		||||
  * client: use heap to store mgcp_response
 | 
			
		||||
  * ep: move endpoint struct and define to mgcp_ep.h
 | 
			
		||||
  * cosmetic: rename mgcp_release_endp to mgcp_endp_release
 | 
			
		||||
  * cosmetic: rename mgcp_ep.c/h to mgcp_endp.c/h
 | 
			
		||||
  * protocol: reject DLCX/CRCX/MDCX on unsupported parameters
 | 
			
		||||
  * protocol: exit cleanly when local cx options check fails
 | 
			
		||||
  * cosmetic: Add missing \n on log line
 | 
			
		||||
  * protocol: check requested connection mode
 | 
			
		||||
  * protocol: fix tagging of wildcarded requests
 | 
			
		||||
  * protocol: prohibit wildcarded requests for MDCX and DLCX
 | 
			
		||||
  * mgcp: fix use-after-free and add callback for endpoint cleanup
 | 
			
		||||
  * client: add an optional FSM interface
 | 
			
		||||
  * mgcp_client_fsm: Add FSM event names
 | 
			
		||||
  * cosmetic: mgcp_client_fsm: rename enums
 | 
			
		||||
  * cosmetic: rename function .._conn_reset() to .._conn_init()
 | 
			
		||||
  * mgcp_conn: do not touch u.rtp in mgcp_conn_alloc()
 | 
			
		||||
  * cosmetic: rename .._codec_reset() to .._codec_init()
 | 
			
		||||
  * mgcp_conn: add function mgcp_rtp_conn_cleanup()
 | 
			
		||||
  * stats: use libosmocore rate counter for in/out_stream.err_ts_counter
 | 
			
		||||
 | 
			
		||||
  [ Alexander Couzens ]
 | 
			
		||||
  * debian/control: correct library dependency of osmo-mgw against libosmo-mgcp1
 | 
			
		||||
  * debian: include systemd service osmo-mgw.service
 | 
			
		||||
  * Revert "stats: use libosmocore rate counter for in/out_stream.err_ts_counter"
 | 
			
		||||
 | 
			
		||||
  [ Harald Welte ]
 | 
			
		||||
  * cosmetic: fix whitespaces; we use tabs for indentation
 | 
			
		||||
  * Fix possible buffer overflow in mgcp_conn_dump()
 | 
			
		||||
  * osmo-mgw: Update copyright statement
 | 
			
		||||
  * osmo-mgw: Config file is osmo-mgw.cfg, and not mgcp.cfg
 | 
			
		||||
  * osmo-mgw: Fix copyright notice
 | 
			
		||||
  * strct mgcp_rtp_state: Group + document struct members related to patching
 | 
			
		||||
  * mgcp_rtp_state: grup 'stats' members into sub-structure
 | 
			
		||||
  * mgcp_rtp_end: Group statistics members into 'stats' sub-struct
 | 
			
		||||
  * libosmo-mgcp: Cosmetic spelling fixes in comments
 | 
			
		||||
  * mgcp_msg: We must parse endpoint numbers as hex, not decimal!
 | 
			
		||||
  * mgcp_internal.h: document more struct members with comments
 | 
			
		||||
  * centralize handling of common errors like "endpoint not found"
 | 
			
		||||
  * Return proper MGCP Error codes, as per spec
 | 
			
		||||
  * osmo-mgw: Use libosmocore socket abstraction
 | 
			
		||||
  * osmo-bsc_mgcp: Add LIBOSMONETIF_{CFLAGS,LIBS}
 | 
			
		||||
  * libosmo-mgcp-client is GPLv2+, not AGPLv3+
 | 
			
		||||
  * Turn libosmo-mgcp into local, non-installed library
 | 
			
		||||
 | 
			
		||||
  [ Stefan Sperling ]
 | 
			
		||||
  * enable osmo_fsm vty commands in libosmo-mgcp-client vty
 | 
			
		||||
 | 
			
		||||
 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 03 May 2018 17:40:35 +0200
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.2.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  [ Neels Hofmeyr ]
 | 
			
		||||
  * jenkins: use osmo-clean-workspace.sh before and after build
 | 
			
		||||
  * vty: skip installing cmds now always installed by default
 | 
			
		||||
  * mgcp-client vty: use name 'mgw' instead of 'mgcpgw'
 | 
			
		||||
  * mgcp client: vty: tweak doc strings
 | 
			
		||||
 | 
			
		||||
  [ Philipp Maier ]
 | 
			
		||||
  * sdp: refactoring sdp parser/generator
 | 
			
		||||
  * cosmetic: rename bts_codec to codec_str
 | 
			
		||||
  * cosmetic: fix coding style for mgcp_parse_sdp_data()
 | 
			
		||||
  * cosmetic: fix commenting style
 | 
			
		||||
  * cosmetic: correct whitespaces
 | 
			
		||||
  * client: fix stderror logging in unit-test
 | 
			
		||||
  * client: add unified function to generate MGCP messages
 | 
			
		||||
  * client: add ip address parsing to the client
 | 
			
		||||
  * protocol: allow wildcarded DLCX
 | 
			
		||||
  * mgcp: remove port/timeslot calculator functions from  mgcp.h
 | 
			
		||||
  * network: add separate log category
 | 
			
		||||
  * cosmetic: make dummy packet handling more explicit
 | 
			
		||||
  * network: autdetect rtp bind ip-address
 | 
			
		||||
  * network: fix rtp packet length
 | 
			
		||||
  * network: remove unused return code
 | 
			
		||||
 | 
			
		||||
  [ Pau Espin Pedrol ]
 | 
			
		||||
  * mgcp_client_vty.c: Fix VTY compatibility with 'mgcpgw bts-base'
 | 
			
		||||
 | 
			
		||||
 -- Harald Welte <laforge@gnumonks.org>  Fri, 10 Nov 2017 11:10:23 +0900
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.1.0) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * New upstream release
 | 
			
		||||
 | 
			
		||||
 -- Harald Welte <lafore@gnumonks.org>  Sat, 28 Oct 2017 12:48:41 +0200
 | 
			
		||||
 | 
			
		||||
osmo-mgw (1.0.2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * First release after major rename.
 | 
			
		||||
 | 
			
		||||
 -- Max Suraev <msuraev@sysmocom.de>  Thu, 14 Sep 2017 18:41:05 +0200
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
osmo-mgw (0.1.0) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Initial release.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Couzens <lynxis@fe80.eu>  Tue, 08 Aug 2017 01:12:53 +0000
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
9
 | 
			
		||||
							
								
								
									
										46
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							@@ -1,46 +0,0 @@
 | 
			
		||||
Source: osmo-mgw
 | 
			
		||||
Section: net
 | 
			
		||||
Priority: extra
 | 
			
		||||
Maintainer: Osmocom team <openbsc@lists.osmocom.org>
 | 
			
		||||
Build-Depends: debhelper (>=9),
 | 
			
		||||
               dh-autoreconf,
 | 
			
		||||
               pkg-config,
 | 
			
		||||
               autotools-dev,
 | 
			
		||||
               libosmocore-dev (>= 1.4.0),
 | 
			
		||||
               libosmo-netif-dev,
 | 
			
		||||
               libosmo-abis-dev,
 | 
			
		||||
               osmo-gsm-manuals-dev
 | 
			
		||||
Standards-Version: 3.9.8
 | 
			
		||||
Vcs-Git: git://git.osmocom.org/osmo-mgw.git
 | 
			
		||||
Vcs-Browser: https://git.osmocom.org/osmo-mgw/
 | 
			
		||||
Homepage: https://osmocom.org/projects/osmo-mgw
 | 
			
		||||
 | 
			
		||||
Package: osmo-mgw
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: foreign
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: OsmoMGW: Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks
 | 
			
		||||
 | 
			
		||||
Package: libosmo-mgcp-client6
 | 
			
		||||
Section: libs
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Pre-Depends: ${misc:Pre-Depends}
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
 | 
			
		||||
 | 
			
		||||
Package: libosmo-mgcp-client-dev
 | 
			
		||||
Section: libdevel
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: same
 | 
			
		||||
Depends: libosmo-mgcp-client6 (= ${binary:Version}), ${misc:Depends}
 | 
			
		||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
 | 
			
		||||
 | 
			
		||||
Package: osmo-mgw-doc
 | 
			
		||||
Architecture: all
 | 
			
		||||
Section: doc
 | 
			
		||||
Priority: optional
 | 
			
		||||
Depends: ${misc:Depends}
 | 
			
		||||
Description: ${misc:Package} PDF documentation
 | 
			
		||||
 Various manuals: user manual, VTY reference manual and/or
 | 
			
		||||
 protocol/interface manuals.
 | 
			
		||||
							
								
								
									
										65
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
								
							@@ -1,65 +0,0 @@
 | 
			
		||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 | 
			
		||||
Upstream-Name: osmo-mgw
 | 
			
		||||
Source: git://git.osmocom.org/osmo-mgw
 | 
			
		||||
 | 
			
		||||
Files:     *
 | 
			
		||||
Copyright: 2009-2014 On-Waves
 | 
			
		||||
           2009-2015 Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
           2013 Jacob Erlbeck <jerlbeck@sysmocom.de>
 | 
			
		||||
           2016-2017 sysmocom s.m.f.c. GmbH <info@sysmocom.de>
 | 
			
		||||
License:   AGPL-3.0+
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 (at your option) any later version.
 | 
			
		||||
 .
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU Affero General Public License for more details.
 | 
			
		||||
 .
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Files:     src/libosmo-mgcp-client/* include/osmocom/mgcp_client/*
 | 
			
		||||
Copyright: 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
 | 
			
		||||
           Based on OpenBSC interface to quagga VTY (libmsc/vty_interface_layer3.c)
 | 
			
		||||
           2009 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
           2009-2011 by Holger Hans Peter Freyther
 | 
			
		||||
License:   GPL-2.0+
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 (at your option) any later version.
 | 
			
		||||
 .
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
 .
 | 
			
		||||
 You should have received a copy of the GNU General Public License
 | 
			
		||||
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Files:     tests/vty_test_runner.py
 | 
			
		||||
Copyright: 2013 Holger Hans Peter Freyther
 | 
			
		||||
           2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
 | 
			
		||||
License:   GPL-3.0+
 | 
			
		||||
 This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU General Public License as published by
 | 
			
		||||
 the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 (at your option) any later version.
 | 
			
		||||
 .
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
 .
 | 
			
		||||
 You should have received a copy of the GNU General Public License
 | 
			
		||||
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 .
 | 
			
		||||
 On Debian systems, the complete text of the GNU General Public License
 | 
			
		||||
 Version 3 can be found in `/usr/share/common-licenses/GPL-3'.
 | 
			
		||||
 | 
			
		||||
Files:     osmoappdesc.py
 | 
			
		||||
Copyright: 2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
 | 
			
		||||
License:   GPL-3.0+
 | 
			
		||||
							
								
								
									
										4
									
								
								debian/libosmo-mgcp-client-dev.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/libosmo-mgcp-client-dev.install
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
usr/include/osmocom/mgcp_client
 | 
			
		||||
usr/lib/*/libosmo-mgcp-client.so
 | 
			
		||||
usr/lib/*/libosmo-mgcp-client.a
 | 
			
		||||
usr/lib/*/pkgconfig/libosmo-mgcp-client.pc
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/libosmo-mgcp-client6.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/libosmo-mgcp-client6.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/lib/*/libosmo-mgcp-client.so.*
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/osmo-mgw-doc.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/osmo-mgw-doc.install
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
usr/share/doc/osmo-mgw-doc/*.pdf
 | 
			
		||||
							
								
								
									
										5
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +0,0 @@
 | 
			
		||||
etc/osmocom/osmo-mgw.cfg
 | 
			
		||||
lib/systemd/system/osmo-mgw.service
 | 
			
		||||
usr/bin/osmo-mgw
 | 
			
		||||
usr/share/doc/osmo-mgw/examples/osmo-mgw/osmo-mgw.cfg
 | 
			
		||||
usr/share/doc/osmo-mgw/examples/osmo-mgw/osmo-mgw-abis_e1.cfg
 | 
			
		||||
							
								
								
									
										39
									
								
								debian/rules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								debian/rules
									
									
									
									
										vendored
									
									
								
							@@ -1,39 +0,0 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
# You must remove unused comment lines for the released package.
 | 
			
		||||
# See debhelper(7) (uncomment to enable)
 | 
			
		||||
# This is an autogenerated template for debian/rules.
 | 
			
		||||
#
 | 
			
		||||
# Output every command that modifies files on the build system.
 | 
			
		||||
#export DH_VERBOSE = 1
 | 
			
		||||
 | 
			
		||||
DEBIAN  := $(shell dpkg-parsechangelog | grep '^Version:' | cut -d' ' -f2)
 | 
			
		||||
DEBVERS := $(shell echo '$(DEBIAN)' | cut -d- -f1)
 | 
			
		||||
VERSION := $(shell echo '$(DEBVERS)' | sed -e 's/[+-].*//' -e 's/~//g')
 | 
			
		||||
 | 
			
		||||
CFLAGS += -g
 | 
			
		||||
 | 
			
		||||
# main packaging script based on dh7 syntax
 | 
			
		||||
%:
 | 
			
		||||
	dh $@ --with autoreconf
 | 
			
		||||
 | 
			
		||||
# debmake generated override targets
 | 
			
		||||
# Set options for ./configure
 | 
			
		||||
#CONFIGURE_FLAGS = <options for ./configure>
 | 
			
		||||
#overrride_dh_configure:
 | 
			
		||||
#	dh_configure -- $(CONFIGURE_FLAGS)
 | 
			
		||||
#
 | 
			
		||||
# Do not install libtool archive, python .pyc .pyo
 | 
			
		||||
#override_dh_install:
 | 
			
		||||
#	dh_install --list-missing -X.la -X.pyc -X.pyo
 | 
			
		||||
 | 
			
		||||
override_dh_auto_test:
 | 
			
		||||
	dh_auto_test || (find . -name testsuite.log -exec cat {} \; ; false)
 | 
			
		||||
 | 
			
		||||
override_dh_auto_configure:
 | 
			
		||||
	dh_auto_configure -- --with-systemdsystemunitdir=/lib/systemd/system --enable-manuals
 | 
			
		||||
 | 
			
		||||
# Don't create .pdf.gz files (barely saves space and they can't be opened directly by most pdf readers)
 | 
			
		||||
override_dh_compress:
 | 
			
		||||
	dh_compress -X.pdf
 | 
			
		||||
 | 
			
		||||
# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/source/format
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/source/format
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
3.0 (native)
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	examples \
 | 
			
		||||
	manuals \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
OSMOCONF_FILES = \
 | 
			
		||||
	osmo-mgw/osmo-mgw.cfg
 | 
			
		||||
 | 
			
		||||
osmoconfdir = $(sysconfdir)/osmocom
 | 
			
		||||
osmoconf_DATA = $(OSMOCONF_FILES)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = $(OSMOCONF_FILES)
 | 
			
		||||
 | 
			
		||||
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,25 +0,0 @@
 | 
			
		||||
!
 | 
			
		||||
! MGCP configuration example
 | 
			
		||||
!
 | 
			
		||||
e1_input
 | 
			
		||||
 e1_line 0 driver dahdi
 | 
			
		||||
 e1_line 0 port 0
 | 
			
		||||
mgcp
 | 
			
		||||
  bind ip 127.0.0.1
 | 
			
		||||
  rtp port-range 4002 16000
 | 
			
		||||
  rtp bind-ip 127.0.0.1
 | 
			
		||||
  rtp ip-probing
 | 
			
		||||
  rtp ip-tos 184
 | 
			
		||||
  bind port 2427
 | 
			
		||||
  sdp audio payload number 98
 | 
			
		||||
  sdp audio payload name GSM
 | 
			
		||||
  number endpoints 31
 | 
			
		||||
  loop 0
 | 
			
		||||
  force-realloc 1
 | 
			
		||||
  rtcp-omit
 | 
			
		||||
  rtp-patch ssrc
 | 
			
		||||
  rtp-patch timestamp
 | 
			
		||||
  trunk 1
 | 
			
		||||
   rtp keep-alive once
 | 
			
		||||
   no rtp keep-alive
 | 
			
		||||
   line 0
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
!
 | 
			
		||||
! MGCP configuration example
 | 
			
		||||
!
 | 
			
		||||
mgcp
 | 
			
		||||
  bind ip 127.0.0.1
 | 
			
		||||
  rtp port-range 4002 16000
 | 
			
		||||
  rtp bind-ip 127.0.0.1
 | 
			
		||||
  rtp ip-probing
 | 
			
		||||
  rtp ip-tos 184
 | 
			
		||||
  bind port 2427
 | 
			
		||||
  sdp audio payload number 98
 | 
			
		||||
  sdp audio payload name GSM
 | 
			
		||||
  number endpoints 31
 | 
			
		||||
  loop 0
 | 
			
		||||
  force-realloc 1
 | 
			
		||||
  rtcp-omit
 | 
			
		||||
  rtp-patch ssrc
 | 
			
		||||
  rtp-patch timestamp
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
EXTRA_DIST = osmomgw-usermanual.adoc \
 | 
			
		||||
    osmomgw-usermanual-docinfo.xml \
 | 
			
		||||
    osmomgw-vty-reference.xml \
 | 
			
		||||
    regen_doc.sh \
 | 
			
		||||
    chapters \
 | 
			
		||||
    vty
 | 
			
		||||
 | 
			
		||||
if BUILD_MANUALS
 | 
			
		||||
  ASCIIDOC = osmomgw-usermanual.adoc
 | 
			
		||||
  ASCIIDOC_DEPS = $(srcdir)/chapters/*.adoc
 | 
			
		||||
  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc
 | 
			
		||||
 | 
			
		||||
  VTY_REFERENCE = osmomgw-vty-reference.xml
 | 
			
		||||
  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc
 | 
			
		||||
 | 
			
		||||
  BUILT_REFERENCE_XML = $(builddir)/vty/mgw_vty_reference.xml
 | 
			
		||||
  $(builddir)/vty/mgw_vty_reference.xml: $(top_builddir)/src/osmo-mgw/osmo-mgw
 | 
			
		||||
	mkdir -p $(builddir)/vty
 | 
			
		||||
	$(top_builddir)/src/osmo-mgw/osmo-mgw --vty-ref-xml > $@
 | 
			
		||||
 | 
			
		||||
  OSMO_REPOSITORY = osmo-mgw
 | 
			
		||||
  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.common.inc
 | 
			
		||||
endif
 | 
			
		||||
@@ -1,57 +0,0 @@
 | 
			
		||||
== Configuring OsmoMGW
 | 
			
		||||
 | 
			
		||||
A basic configation of OsmoMGW mainly consists of specifying the IP address
 | 
			
		||||
and port on which to listen to MGCP commands, but changing the port range at
 | 
			
		||||
which the RTP streams terminate as well as limiting operation to a single call
 | 
			
		||||
agent can be done as well as changing the number of endpoints.
 | 
			
		||||
 | 
			
		||||
=== Configuring MGCP
 | 
			
		||||
 | 
			
		||||
By default OsmoMGW listens for MGCP on port 2427 on any IP address. If a call
 | 
			
		||||
agent address is configured then OsmoMGW will only answer MGCP commands from
 | 
			
		||||
that IP port 2727, otherwise all sources are handled. A domain can be
 | 
			
		||||
specified
 | 
			
		||||
 | 
			
		||||
.Example: MGCP configuration
 | 
			
		||||
----
 | 
			
		||||
OsmoMGW(config-mgcp)# bind ip 127.0.0.1
 | 
			
		||||
OsmoMGW(config-mgcp)# bind port 2427
 | 
			
		||||
OsmoMGW(config-mgcp)# call-agent ip 127.0.0.1
 | 
			
		||||
OsmoMGW(config-mgcp)# domain mgw-bsc
 | 
			
		||||
OsmoMGW(config-mgcp)# local ip 127.0.0.1
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
=== Configuring the trunk
 | 
			
		||||
 | 
			
		||||
The first trunk (trunk 0) is considered a virtual trunk in OsmoMGW. All
 | 
			
		||||
endpoints of type "rtpbridge" are routed here. The virtual trunk is configured
 | 
			
		||||
in the config-mgcp context.
 | 
			
		||||
 | 
			
		||||
All other trunks are configured in the config-mgcp-trunk context, but the
 | 
			
		||||
commands used are identical. Right now trunks are considered only for ds/e1
 | 
			
		||||
type endpoints which are not yet implemented. Don't use trunks other than the
 | 
			
		||||
"virtual" trunk 0.
 | 
			
		||||
 | 
			
		||||
.Example: MGCP trunk configuration
 | 
			
		||||
----
 | 
			
		||||
OsmoMGW(config-mgcp)# number endpoints 63 <1>
 | 
			
		||||
OsmoMGW(config-mgcp)# rtp bind-ip 10.0.0.1 <2>
 | 
			
		||||
OsmoMGW(config-mgcp)# rtp port-range 12000-14000 <3>
 | 
			
		||||
----
 | 
			
		||||
<1> Maximum number of endpoints that can be allocated at once
 | 
			
		||||
<2> Use this IP when binding RTP endpoints
 | 
			
		||||
<3> Use ports in this range when binding RTP endpoints
 | 
			
		||||
 | 
			
		||||
There are some options to tweak how RTP forwarding behaves in OsmoMGW:
 | 
			
		||||
 | 
			
		||||
.Example: MGCP trunk rtp options
 | 
			
		||||
----
 | 
			
		||||
OsmoMGW(config-mgcp)# rtp keep-alive 30 <1>
 | 
			
		||||
OsmoMGW(config-mgcp)# rtp-patch ssrc <2>
 | 
			
		||||
OsmoMGW(config-mgcp)# rtp-patch timestamp <3>
 | 
			
		||||
----
 | 
			
		||||
<1> Send dummy UDP packets periodically to RTP destination
 | 
			
		||||
<2> Hide SSRC changes
 | 
			
		||||
<3> Ensure RTP timestamp is aligned with frame duration
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
[[counters]]
 | 
			
		||||
== Counters
 | 
			
		||||
 | 
			
		||||
include::./counters_generated.adoc[]
 | 
			
		||||
@@ -1,83 +0,0 @@
 | 
			
		||||
 | 
			
		||||
// autogenerated by show asciidoc counters
 | 
			
		||||
These counters and their description based on OsmoMGW 1.5.0.64-189f (OsmoMGW).
 | 
			
		||||
 | 
			
		||||
=== Rate Counters
 | 
			
		||||
 | 
			
		||||
// generating tables for rate_ctr_group
 | 
			
		||||
// rate_ctr_group table aggregated statistics for all rtp connections
 | 
			
		||||
.all_rtp_conn - aggregated statistics for all rtp connections
 | 
			
		||||
[options="header"]
 | 
			
		||||
|===
 | 
			
		||||
| Name | Reference | Description
 | 
			
		||||
| all_rtp:err_tstmp_in | <<all_rtp_conn_all_rtp:err_tstmp_in>> | Total inbound rtp-stream timestamp errors.
 | 
			
		||||
| all_rtp:err_tstmp_out | <<all_rtp_conn_all_rtp:err_tstmp_out>> | Total outbound rtp-stream timestamp errors.
 | 
			
		||||
| all_rtp:packets_rx | <<all_rtp_conn_all_rtp:packets_rx>> | Total inbound rtp packets.
 | 
			
		||||
| all_rtp:octets_rx | <<all_rtp_conn_all_rtp:octets_rx>> | Total inbound rtp octets.
 | 
			
		||||
| all_rtp:packets_tx | <<all_rtp_conn_all_rtp:packets_tx>> | Total outbound rtp packets.
 | 
			
		||||
| all_rtp:octets_tx | <<all_rtp_conn_all_rtp:octets_tx>> | Total outbound rtp octets.
 | 
			
		||||
| all_rtp:dropped | <<all_rtp_conn_all_rtp:dropped>> | Total dropped rtp packets.
 | 
			
		||||
| all_rtp:num_closed_conns | <<all_rtp_conn_all_rtp:num_closed_conns>> | Total number of rtp connections closed.
 | 
			
		||||
|===
 | 
			
		||||
// rate_ctr_group table dlcx statistics
 | 
			
		||||
.dlcx - dlcx statistics
 | 
			
		||||
[options="header"]
 | 
			
		||||
|===
 | 
			
		||||
| Name | Reference | Description
 | 
			
		||||
| dlcx:success | <<dlcx_dlcx:success>> | DLCX command processed successfully.
 | 
			
		||||
| dlcx:wildcard | <<dlcx_dlcx:wildcard>> | wildcard names in DLCX commands are unsupported.
 | 
			
		||||
| dlcx:no_conn | <<dlcx_dlcx:no_conn>> | endpoint specified in DLCX command has no active connections.
 | 
			
		||||
| dlcx:callid | <<dlcx_dlcx:callid>> | CallId specified in DLCX command mismatches endpoint's CallId .
 | 
			
		||||
| dlcx:connid | <<dlcx_dlcx:connid>> | connection ID specified in DLCX command does not exist on endpoint.
 | 
			
		||||
| dlcx:unhandled_param | <<dlcx_dlcx:unhandled_param>> | unhandled parameter in DLCX command.
 | 
			
		||||
| dlcx:rejected | <<dlcx_dlcx:rejected>> | connection deletion rejected by policy.
 | 
			
		||||
| dlcx:deferred | <<dlcx_dlcx:deferred>> | connection deletion deferred by policy.
 | 
			
		||||
|===
 | 
			
		||||
// rate_ctr_group table mdcx statistics
 | 
			
		||||
.mdcx - mdcx statistics
 | 
			
		||||
[options="header"]
 | 
			
		||||
|===
 | 
			
		||||
| Name | Reference | Description
 | 
			
		||||
| mdcx:success | <<mdcx_mdcx:success>> | MDCX command processed successfully.
 | 
			
		||||
| mdcx:wildcard | <<mdcx_mdcx:wildcard>> | wildcard endpoint names in MDCX commands are unsupported.
 | 
			
		||||
| mdcx:no_conn | <<mdcx_mdcx:no_conn>> | endpoint specified in MDCX command has no active connections.
 | 
			
		||||
| mdcx:callid | <<mdcx_mdcx:callid>> | invalid CallId specified in MDCX command.
 | 
			
		||||
| mdcx:connid | <<mdcx_mdcx:connid>> | invalid connection ID specified in MDCX command.
 | 
			
		||||
| crcx:unhandled_param | <<mdcx_crcx:unhandled_param>> | unhandled parameter in MDCX command.
 | 
			
		||||
| mdcx:no_connid | <<mdcx_mdcx:no_connid>> | no connection ID specified in MDCX command.
 | 
			
		||||
| mdcx:conn_not_found | <<mdcx_mdcx:conn_not_found>> | connection specified in MDCX command does not exist.
 | 
			
		||||
| mdcx:invalid_mode | <<mdcx_mdcx:invalid_mode>> | invalid connection mode in MDCX command.
 | 
			
		||||
| mdcx:conn_opt | <<mdcx_mdcx:conn_opt>> | connection options invalid.
 | 
			
		||||
| mdcx:no_remote_conn_desc | <<mdcx_mdcx:no_remote_conn_desc>> | no opposite end specified for connection.
 | 
			
		||||
| mdcx:start_rtp_failure | <<mdcx_mdcx:start_rtp_failure>> | failure to start RTP processing.
 | 
			
		||||
| mdcx:conn_rejected | <<mdcx_mdcx:conn_rejected>> | connection rejected by policy.
 | 
			
		||||
| mdcx:conn_deferred | <<mdcx_mdcx:conn_deferred>> | connection deferred by policy.
 | 
			
		||||
|===
 | 
			
		||||
// rate_ctr_group table crxc statistics
 | 
			
		||||
.crcx - crxc statistics
 | 
			
		||||
[options="header"]
 | 
			
		||||
|===
 | 
			
		||||
| Name | Reference | Description
 | 
			
		||||
| crcx:success | <<crcx_crcx:success>> | CRCX command processed successfully.
 | 
			
		||||
| crcx:bad_action | <<crcx_crcx:bad_action>> | bad action in CRCX command.
 | 
			
		||||
| crcx:unhandled_param | <<crcx_crcx:unhandled_param>> | unhandled parameter in CRCX command.
 | 
			
		||||
| crcx:missing_callid | <<crcx_crcx:missing_callid>> | missing CallId in CRCX command.
 | 
			
		||||
| crcx:invalid_mode | <<crcx_crcx:invalid_mode>> | invalid connection mode in CRCX command.
 | 
			
		||||
| crcx:limit_exceeded | <<crcx_crcx:limit_exceeded>> | limit of concurrent connections was reached.
 | 
			
		||||
| crcx:unkown_callid | <<crcx_crcx:unkown_callid>> | unknown CallId in CRCX command.
 | 
			
		||||
| crcx:alloc_conn_fail | <<crcx_crcx:alloc_conn_fail>> | connection allocation failure.
 | 
			
		||||
| crcx:no_remote_conn_desc | <<crcx_crcx:no_remote_conn_desc>> | no opposite end specified for connection.
 | 
			
		||||
| crcx:start_rtp_failure | <<crcx_crcx:start_rtp_failure>> | failure to start RTP processing.
 | 
			
		||||
| crcx:conn_rejected | <<crcx_crcx:conn_rejected>> | connection rejected by policy.
 | 
			
		||||
| crcx:no_osmux | <<crcx_crcx:no_osmux>> | no osmux offered by peer.
 | 
			
		||||
| crcx:conn_opt | <<crcx_crcx:conn_opt>> | connection options invalid.
 | 
			
		||||
| crcx:codec_nego | <<crcx_crcx:codec_nego>> | codec negotiation failure.
 | 
			
		||||
| crcx:bind_port | <<crcx_crcx:bind_port>> | port bind failure.
 | 
			
		||||
|===
 | 
			
		||||
== Osmo Stat Items
 | 
			
		||||
 | 
			
		||||
// generating tables for osmo_stat_items
 | 
			
		||||
== Osmo Counters
 | 
			
		||||
 | 
			
		||||
// generating tables for osmo_counters
 | 
			
		||||
// there are no ungrouped osmo_counters
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
== MGCP Extensions
 | 
			
		||||
 | 
			
		||||
The MGCP protocol is extendable. The following non-standard extensions are
 | 
			
		||||
understood by OsmoMGW.
 | 
			
		||||
 | 
			
		||||
=== `X-Osmo-IGN`
 | 
			
		||||
 | 
			
		||||
`X-Osmo-IGN` indicates to OsmoMGW that specific items of an endpoint should be
 | 
			
		||||
ignored, so that it is lenient on mismatching values that would normally
 | 
			
		||||
indicate collisions or configuration errors.
 | 
			
		||||
 | 
			
		||||
==== `X-Osmo-IGN` Format
 | 
			
		||||
 | 
			
		||||
The value part of `X-Osmo-IGN` must be one or more items separated by one or more
 | 
			
		||||
spaces. Each item consists of one or more non-whitespace characters.
 | 
			
		||||
 | 
			
		||||
.Example: `X-Osmo-IGN` format with three ficticious items "X", "abc" and "123".
 | 
			
		||||
----
 | 
			
		||||
X-Osmo-IGN: X abc 123
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
`X-Osmo-IGN` must be issued in the MGCP header section (typically as its last item),
 | 
			
		||||
before the SDP section starts.
 | 
			
		||||
 | 
			
		||||
==== Supported `X-Osmo-IGN` Items
 | 
			
		||||
 | 
			
		||||
Currently, the following `X-Osmo-IGN` items are supported:
 | 
			
		||||
 | 
			
		||||
* `C`: ignore CallID mismatches, i.e. differing "C" values between connections
 | 
			
		||||
  on the same endpoint.
 | 
			
		||||
 | 
			
		||||
.Note:
 | 
			
		||||
`X-Osmo-IGN` does not support ignoring mismatches on the domain part of
 | 
			
		||||
an endpoint name, e.g. ignoring a mismatch on "example.com" in
 | 
			
		||||
`rtpbridge/123abc@example.com`. Instead, you may globally configure OsmoMGW
 | 
			
		||||
with `mgcp` / `domain *` to permit all domain parts.
 | 
			
		||||
 | 
			
		||||
===== `X-Osmo-IGN: C`
 | 
			
		||||
 | 
			
		||||
By default, OsmoMGW verifies that all CallIDs ("C" values) match for all
 | 
			
		||||
connections on any one given endpoint. To ignore CallID mismatches, pass a `C`
 | 
			
		||||
in the `X-Osmo-IGN` header, for the first or the second `CRCX` on an endpoint.
 | 
			
		||||
When the `X-Osmo-IGN: C` is sent for any one `CRCX` on an endpoint, CallID
 | 
			
		||||
mismatches will be ignored for that and all subsequent messages for that
 | 
			
		||||
endpoint. Hence this header only needs to be included once per endpoint, in any
 | 
			
		||||
`CRCX` message that precedes or coincides with a CallID mismatch.
 | 
			
		||||
 | 
			
		||||
This is particularly useful for a BSC that is connected to an A/SCCPlite MSC,
 | 
			
		||||
where the BSC and MSC each are expected to configure their respective own
 | 
			
		||||
connection on a shared endpoint. For A/SCCPlite, it is impossible for the BSC
 | 
			
		||||
to know the CallID that the MSC will use, so CallID mismatches are inevitable.
 | 
			
		||||
See also OsmoBSC, which will by default pass the `X-Osmo-IGN: C` header for
 | 
			
		||||
endpoints associated with an A/SCCPlite MSC.
 | 
			
		||||
 | 
			
		||||
.Example: `CRCX` message that instructs OsmoMGW to ignore CallID mismatches
 | 
			
		||||
----
 | 
			
		||||
CRCX 2 rtpbridge/123abc@mgw MGCP 1.0
 | 
			
		||||
M: recvonly
 | 
			
		||||
C: 2
 | 
			
		||||
L: p:20
 | 
			
		||||
X-Osmo-IGN: C
 | 
			
		||||
 | 
			
		||||
v=0
 | 
			
		||||
c=IN IP4 123.12.12.123
 | 
			
		||||
m=audio 5904 RTP/AVP 97
 | 
			
		||||
a=rtpmap:97 GSM-EFR/8000
 | 
			
		||||
a=ptime:40
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
=== `X-Osmux`
 | 
			
		||||
 | 
			
		||||
See <<mgcp-extension-osmux>>
 | 
			
		||||
@@ -1,100 +0,0 @@
 | 
			
		||||
[[overview]]
 | 
			
		||||
== Overview
 | 
			
		||||
 | 
			
		||||
This manual should help you getting started with OsmoMGW. It will cover
 | 
			
		||||
aspects of configuring and running the media gateway.
 | 
			
		||||
 | 
			
		||||
[[intro_overview]]
 | 
			
		||||
=== About OsmoMGW
 | 
			
		||||
 | 
			
		||||
OsmoMGW is the Osmocom implementation of a media gateway to handle user
 | 
			
		||||
plane (voice) traffic in cellular networks. It can connect and optionally
 | 
			
		||||
transcode RTP voice streams between different network elements such as BTSs
 | 
			
		||||
and external entities like SIP. It is typically co-located with both OsmoBSC
 | 
			
		||||
and OsmoMSC and controlled by them via MGCP, the Media Gateway Control
 | 
			
		||||
Protocol.
 | 
			
		||||
 | 
			
		||||
[[fig-bsc]]
 | 
			
		||||
.OsmoMGW used with OsmoBSC
 | 
			
		||||
[graphviz]
 | 
			
		||||
----
 | 
			
		||||
digraph G {
 | 
			
		||||
    rankdir = LR;
 | 
			
		||||
    OsmoBTS -> OsmoBSC [label="Abis/IP"];
 | 
			
		||||
    OsmoBSC -> OsmoMSC [label="3GPP AoIP"];
 | 
			
		||||
    OsmoBSC -> OsmoMGW [label="MGCP"];
 | 
			
		||||
    OsmoBTS -> OsmoMGW [label="RTP",dir=both];
 | 
			
		||||
    OsmoMGW -> OsmoMSC [label="RTP",dir=both];
 | 
			
		||||
    {rank=same OsmoBSC OsmoMGW}
 | 
			
		||||
    OsmoMGW [color=red];
 | 
			
		||||
}
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[[fig-msc]]
 | 
			
		||||
.OsmoMGW used with OsmoMSC
 | 
			
		||||
[graphviz]
 | 
			
		||||
----
 | 
			
		||||
digraph G {
 | 
			
		||||
    rankdir = LR;
 | 
			
		||||
    BTS -> BSC [label="Abis"];
 | 
			
		||||
    BSC -> OsmoMSC [label="3GPP AoIP"];
 | 
			
		||||
    OsmoMSC -> OsmoMGW [label="MGCP"];
 | 
			
		||||
    BSC -> OsmoMGW [label="RTP",dir=both];
 | 
			
		||||
    OsmoMSC -> OsmoSIP [label="MNCC"];
 | 
			
		||||
    OsmoSIP -> PBX [label="SIP Trunk"];
 | 
			
		||||
    OsmoMGW -> PBX [label="RTP",dir=both];
 | 
			
		||||
    {rank=same OsmoMSC OsmoMGW}
 | 
			
		||||
    OsmoSIP [label="osmo-sip-connector"];
 | 
			
		||||
    OsmoMGW [color=red];
 | 
			
		||||
 | 
			
		||||
    hNodeB -> OsmoHNBGW [label="Iuh"];
 | 
			
		||||
    OsmoHNBGW -> OsmoMSC [label="IuCS"];
 | 
			
		||||
    hNodeB -> OsmoMGW [label="RTP",dir=both];
 | 
			
		||||
}
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
=== Software Components
 | 
			
		||||
 | 
			
		||||
OsmoMGW contains a variety of different software components, which we’ll
 | 
			
		||||
quickly describe in this section.
 | 
			
		||||
 | 
			
		||||
==== MGCP Implementation
 | 
			
		||||
 | 
			
		||||
OsmoMGW brings its own MGCP implementation through which OsmoMGW is
 | 
			
		||||
controlled.
 | 
			
		||||
 | 
			
		||||
The commands implemented are CRCX, MDCX, DLCX and RSIP. The command AUEP is
 | 
			
		||||
implemented as a stub and will simply respond with OK.
 | 
			
		||||
 | 
			
		||||
==== RTP implementation
 | 
			
		||||
 | 
			
		||||
Support for IuUP which is used in 3G cells is quite lacking at the moment.
 | 
			
		||||
3G<->3G and 2G<->2G calls should work, but 3G<->2G does not.
 | 
			
		||||
 | 
			
		||||
==== Audio transcoder
 | 
			
		||||
 | 
			
		||||
Transcoding is currently not supported in OsmoMGW.
 | 
			
		||||
 | 
			
		||||
=== Limitations
 | 
			
		||||
 | 
			
		||||
Osmux is not yet supported in OsmoMGW.
 | 
			
		||||
 | 
			
		||||
At the moment (July 2018), OsmoMGW only implements RTP proxy / RTP bridge
 | 
			
		||||
type endpoints, to each of which two RTP connections can be established.
 | 
			
		||||
We are planning to add endpoint types for:
 | 
			
		||||
 | 
			
		||||
- classic E1/T1 timeslots (64kBps alaw/ulaw)
 | 
			
		||||
- classic E1/T1 16k sub-slots with TRAU frames for classic BTS support
 | 
			
		||||
- announcement/playout end-points
 | 
			
		||||
- conference endpoints
 | 
			
		||||
 | 
			
		||||
=== Additional resources
 | 
			
		||||
 | 
			
		||||
You can find the OsmoMGW issue tracker and wiki online at
 | 
			
		||||
 | 
			
		||||
- https://osmocom.org/projects/osmomgw
 | 
			
		||||
- https://osmocom.org/projects/osmomgw/wiki
 | 
			
		||||
 | 
			
		||||
RFC 3435 for MGCP is located at
 | 
			
		||||
 | 
			
		||||
- https://tools.ietf.org/html/rfc3435
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
== Running OsmoMGW
 | 
			
		||||
 | 
			
		||||
The OsmoMGW executable (`osmo-mgw`) offers the following command-line
 | 
			
		||||
arguments:
 | 
			
		||||
 | 
			
		||||
=== SYNOPSIS
 | 
			
		||||
 | 
			
		||||
*osmo-mgw* [-h|-V] [-D] [-c 'CONFIGFILE'] [-s]
 | 
			
		||||
 | 
			
		||||
=== OPTIONS
 | 
			
		||||
 | 
			
		||||
*-h, --help*::
 | 
			
		||||
	Print a short help message about the supported options
 | 
			
		||||
*-V, --version*::
 | 
			
		||||
	Print the compile-time version number of the program
 | 
			
		||||
*-D, --daemonize*::
 | 
			
		||||
	Fork the process as a daemon into background.
 | 
			
		||||
*-c, --config-file 'CONFIGFILE'*::
 | 
			
		||||
	Specify the file and path name of the configuration file to be
 | 
			
		||||
	used. If none is specified, use `osmo-mgw.cfg` in the current
 | 
			
		||||
	working directory.
 | 
			
		||||
*-s, --disable-color*::
 | 
			
		||||
	Disable colors for logging to stderr. This has mostly been
 | 
			
		||||
	deprecated by VTY based logging configuration, see <<logging>>
 | 
			
		||||
	for more information.
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
<revhistory>
 | 
			
		||||
  <revision>
 | 
			
		||||
    <revnumber>1</revnumber>
 | 
			
		||||
    <date>July 24th, 2018</date>
 | 
			
		||||
    <authorinitials>DW</authorinitials>
 | 
			
		||||
    <revremark>
 | 
			
		||||
      Initial version
 | 
			
		||||
    </revremark>
 | 
			
		||||
  </revision>
 | 
			
		||||
</revhistory>
 | 
			
		||||
 | 
			
		||||
<authorgroup>
 | 
			
		||||
  <author>
 | 
			
		||||
    <firstname>Daniel</firstname>
 | 
			
		||||
    <surname>Willmann</surname>
 | 
			
		||||
    <email>dwillmann@sysmocom.de</email>
 | 
			
		||||
    <authorinitials>DW</authorinitials>
 | 
			
		||||
    <affiliation>
 | 
			
		||||
      <shortaffil>sysmocom</shortaffil>
 | 
			
		||||
      <orgname>sysmocom - s.f.m.c. GmbH</orgname>
 | 
			
		||||
    </affiliation>
 | 
			
		||||
  </author>
 | 
			
		||||
</authorgroup>
 | 
			
		||||
 | 
			
		||||
<copyright>
 | 
			
		||||
  <year>2018</year>
 | 
			
		||||
  <holder>sysmocom - s.f.m.c. GmbH</holder>
 | 
			
		||||
</copyright>
 | 
			
		||||
 | 
			
		||||
<legalnotice>
 | 
			
		||||
  <para>
 | 
			
		||||
	Permission is granted to copy, distribute and/or modify this
 | 
			
		||||
	document under the terms of the GNU Free Documentation License,
 | 
			
		||||
	Version 1.3 or any later version published by the Free Software
 | 
			
		||||
	Foundation; with the Invariant Sections being just 'Foreword',
 | 
			
		||||
	'Acknowledgements' and 'Preface', with no Front-Cover Texts,
 | 
			
		||||
	and no Back-Cover Texts.  A copy of the license is included in
 | 
			
		||||
	the section entitled "GNU Free Documentation License".
 | 
			
		||||
  </para>
 | 
			
		||||
  <para>
 | 
			
		||||
	The Asciidoc source code of this manual can be found at
 | 
			
		||||
	<ulink url="http://git.osmocom.org/osmo-gsm-manuals/">
 | 
			
		||||
		http://git.osmocom.org/osmo-gsm-manuals/
 | 
			
		||||
	</ulink>
 | 
			
		||||
  </para>
 | 
			
		||||
</legalnotice>
 | 
			
		||||
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
:gfdl-enabled:
 | 
			
		||||
:program-name: OsmoMGW
 | 
			
		||||
 | 
			
		||||
OsmoMGW User Manual
 | 
			
		||||
====================
 | 
			
		||||
Daniel Willmann <dwillmann@sysmocom.de>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/preface.adoc[]
 | 
			
		||||
 | 
			
		||||
include::{srcdir}/chapters/overview.adoc[]
 | 
			
		||||
 | 
			
		||||
include::{srcdir}/chapters/running.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/vty.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/logging.adoc[]
 | 
			
		||||
 | 
			
		||||
include::{srcdir}/chapters/configuration.adoc[]
 | 
			
		||||
 | 
			
		||||
include::{srcdir}/chapters/mgcp_extensions.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/osmux/osmux.adoc[]
 | 
			
		||||
 | 
			
		||||
//include::{srcdir}/chapters/counters.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/vty_cpu_sched.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/port_numbers.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/bibliography.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/glossary.adoc[]
 | 
			
		||||
 | 
			
		||||
include::./common/chapters/gfdl.adoc[]
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!--
 | 
			
		||||
  ex:ts=2:sw=42sts=2:et
 | 
			
		||||
  -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
-->
 | 
			
		||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML 5.0//EN"
 | 
			
		||||
"http://docbook.org/xml/5.0/dtd/docbook.dtd" [
 | 
			
		||||
<!ENTITY chapter-vty      SYSTEM      "./common/chapters/vty.xml" >
 | 
			
		||||
<!ENTITY sections-vty     SYSTEM      "generated/docbook_vty.xml"  >
 | 
			
		||||
]>
 | 
			
		||||
 | 
			
		||||
<book>
 | 
			
		||||
  <info>
 | 
			
		||||
    <revhistory>
 | 
			
		||||
        <revision>
 | 
			
		||||
            <revnumber>v1</revnumber>
 | 
			
		||||
            <date>12th December 2017</date>
 | 
			
		||||
            <authorinitials>pm</authorinitials>
 | 
			
		||||
            <revremark>Initial</revremark>
 | 
			
		||||
        </revision>
 | 
			
		||||
    </revhistory>
 | 
			
		||||
 | 
			
		||||
    <title>OsmoMGW VTY Reference</title>
 | 
			
		||||
 | 
			
		||||
    <copyright>
 | 
			
		||||
      <year>2017</year>
 | 
			
		||||
    </copyright>
 | 
			
		||||
 | 
			
		||||
    <legalnotice>
 | 
			
		||||
      <para>This work is copyright by <orgname>sysmocom - s.f.m.c. GmbH</orgname>. All rights reserved.
 | 
			
		||||
      </para>
 | 
			
		||||
    </legalnotice>
 | 
			
		||||
  </info>
 | 
			
		||||
 | 
			
		||||
  <!-- Main chapters-->
 | 
			
		||||
  &chapter-vty;
 | 
			
		||||
</book>
 | 
			
		||||
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
#!/bin/sh -x
 | 
			
		||||
 | 
			
		||||
if [ -z "$DOCKER_PLAYGROUND" ]; then
 | 
			
		||||
	echo "You need to set DOCKER_PLAYGROUND"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
SCRIPT=$(realpath "$0")
 | 
			
		||||
MANUAL_DIR=$(dirname "$SCRIPT")
 | 
			
		||||
 | 
			
		||||
COMMIT=${COMMIT:-$(git log -1 --format=format:%H)}
 | 
			
		||||
 | 
			
		||||
cd "$DOCKER_PLAYGROUND/scripts" || exit 1
 | 
			
		||||
 | 
			
		||||
OSMO_MGW_BRANCH=$COMMIT ./regen_doc.sh osmo-mgw 4243 \
 | 
			
		||||
	"$MANUAL_DIR/chapters/counters_generated.adoc" \
 | 
			
		||||
	"$MANUAL_DIR/vty/mgw_vty_reference.xml"
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
<vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'>
 | 
			
		||||
</vtydoc>
 | 
			
		||||
							
								
								
									
										125
									
								
								hlrsync/hlrsync.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										125
									
								
								hlrsync/hlrsync.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,125 @@
 | 
			
		||||
#!/usr/bin/python2.5
 | 
			
		||||
 | 
			
		||||
from __future__ import with_statement
 | 
			
		||||
 | 
			
		||||
from pysqlite2 import dbapi2 as sqlite3
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
hlr = sqlite3.connect(sys.argv[1])
 | 
			
		||||
web = sqlite3.connect(sys.argv[2])
 | 
			
		||||
 | 
			
		||||
# switch to autocommit
 | 
			
		||||
hlr.isolation_level = None
 | 
			
		||||
web.isolation_level = None
 | 
			
		||||
 | 
			
		||||
hlr.row_factory = sqlite3.Row
 | 
			
		||||
web.row_factory = sqlite3.Row
 | 
			
		||||
 | 
			
		||||
with hlr:
 | 
			
		||||
	hlr_subscrs = hlr.execute("""
 | 
			
		||||
		SELECT * FROM Subscriber
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
	hlr_tokens = hlr.execute("""
 | 
			
		||||
		SELECT * FROM AuthToken
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
 | 
			
		||||
with web:
 | 
			
		||||
	web_tokens = web.execute("""
 | 
			
		||||
		SELECT * FROM reg_tokens
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
	web_sms = web.execute("""
 | 
			
		||||
		SELECT * FROM sms_queue
 | 
			
		||||
	""").fetchall()
 | 
			
		||||
 | 
			
		||||
# index by subscr id
 | 
			
		||||
hlr_subscrs_by_id = {}
 | 
			
		||||
hlr_subscrs_by_ext = {}
 | 
			
		||||
hlr_tokens_by_subscr_id = {}
 | 
			
		||||
for x in hlr_subscrs:
 | 
			
		||||
	hlr_subscrs_by_id[x['id']] = x
 | 
			
		||||
	hlr_subscrs_by_ext[x['extension']] = x
 | 
			
		||||
del hlr_subscrs
 | 
			
		||||
for x in hlr_tokens:
 | 
			
		||||
	hlr_tokens_by_subscr_id[x['subscriber_id']] = x
 | 
			
		||||
del hlr_tokens
 | 
			
		||||
 | 
			
		||||
web_tokens_by_subscr_id = {}
 | 
			
		||||
for x in web_tokens:
 | 
			
		||||
	web_tokens_by_subscr_id[x['subscriber_id']] = x
 | 
			
		||||
del web_tokens
 | 
			
		||||
 | 
			
		||||
# remove leftover web_tokens and correct inconsistent fields
 | 
			
		||||
with web:
 | 
			
		||||
	for x in web_tokens_by_subscr_id.values():
 | 
			
		||||
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if subscr is None:
 | 
			
		||||
			web.execute("""
 | 
			
		||||
				      DELETE FROM reg_tokens WHERE subscriber_id = ?
 | 
			
		||||
				   """, (x['subscriber_id'],))
 | 
			
		||||
			del web_tokens_by_subscr_id[x['subscriber_id']]
 | 
			
		||||
			continue
 | 
			
		||||
		if str(x['imsi']) != str(subscr['imsi']) or \
 | 
			
		||||
		   x['extension'] != subscr['extension'] or \
 | 
			
		||||
		   x['tmsi'] != subscr['tmsi'] or \
 | 
			
		||||
		   x['lac'] != subscr['lac']:
 | 
			
		||||
			web.execute("""
 | 
			
		||||
				      UPDATE reg_tokens
 | 
			
		||||
				      SET imsi = ?, extension = ?, tmsi = ?, lac = ?
 | 
			
		||||
				      WHERE subscriber_id = ?
 | 
			
		||||
				   """, (str(subscr['imsi']), subscr['extension'],
 | 
			
		||||
				   subscr['tmsi'], subscr['lac'], x['subscriber_id']))
 | 
			
		||||
 | 
			
		||||
# add missing web_tokens
 | 
			
		||||
with web:
 | 
			
		||||
	for x in hlr_tokens_by_subscr_id.values():
 | 
			
		||||
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if subscr is None:
 | 
			
		||||
			hlr.execute("""
 | 
			
		||||
				      DELETE FROM AuthToken WHERE subscriber_id = ?
 | 
			
		||||
				   """, (x['subscriber_id'],))
 | 
			
		||||
			del hlr_tokens_by_subscr_id[x['subscriber_id']]
 | 
			
		||||
			continue
 | 
			
		||||
		webtoken = web_tokens_by_subscr_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if webtoken is None:
 | 
			
		||||
			web.execute("""
 | 
			
		||||
				      INSERT INTO reg_tokens
 | 
			
		||||
				      (subscriber_id, extension, reg_completed, name, email, lac, imsi, token, tmsi)
 | 
			
		||||
				      VALUES
 | 
			
		||||
				      (?, ?, 0, ?, '', ?, ?, ?, ?)
 | 
			
		||||
				   """, (x['subscriber_id'], subscr['extension'], subscr['name'],
 | 
			
		||||
				   subscr['lac'], str(subscr['imsi']), x['token'], subscr['tmsi']))
 | 
			
		||||
 | 
			
		||||
# authorize subscribers
 | 
			
		||||
with hlr:
 | 
			
		||||
	for x in web_tokens_by_subscr_id.values():
 | 
			
		||||
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
 | 
			
		||||
		if x['reg_completed'] and not subscr['authorized']:
 | 
			
		||||
			hlr.execute("""
 | 
			
		||||
				      UPDATE Subscriber
 | 
			
		||||
				      SET authorized = 1
 | 
			
		||||
				      WHERE id = ?
 | 
			
		||||
				   """, (x['subscriber_id'],))
 | 
			
		||||
 | 
			
		||||
# Sync SMS from web to hlr
 | 
			
		||||
with hlr:
 | 
			
		||||
	for sms in web_sms:
 | 
			
		||||
		subscr = hlr_subscrs_by_ext.get(sms['receiver_ext'])
 | 
			
		||||
		if subscr is None:
 | 
			
		||||
			print '%s not found' % sms['receiver_ext']
 | 
			
		||||
			continue
 | 
			
		||||
		hlr.execute("""
 | 
			
		||||
				      INSERT INTO SMS
 | 
			
		||||
				      (created, sender_id, receiver_id, reply_path_req, status_rep_req, protocol_id, data_coding_scheme, ud_hdr_ind, text)
 | 
			
		||||
				      VALUES
 | 
			
		||||
				      (?, 1, ?, 0, 0, 0, 0, 0, ?)
 | 
			
		||||
				   """, (sms['created'], subscr['id'], sms['text']))
 | 
			
		||||
with web:
 | 
			
		||||
	for sms in web_sms:
 | 
			
		||||
		web.execute("""
 | 
			
		||||
				      DELETE FROM sms_queue WHERE id = ?
 | 
			
		||||
				   """, (sms['id'],))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
hlr.close()
 | 
			
		||||
web.close()
 | 
			
		||||
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	osmocom \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
nobase_include_HEADERS = \
 | 
			
		||||
	osmocom/mgcp_client/mgcp_client.h \
 | 
			
		||||
	osmocom/mgcp_client/mgcp_client_endpoint_fsm.h \
 | 
			
		||||
	osmocom/mgcp_client/mgcp_client_fsm.h \
 | 
			
		||||
	osmocom/mgcp/mgcp.h \
 | 
			
		||||
	osmocom/mgcp/mgcp_common.h \
 | 
			
		||||
	osmocom/mgcp/osmux.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
# This gets copied during make from osmocom/mgcp/mgcp_common.h. Therefore it is not included in the source tree and we
 | 
			
		||||
# don't need to distribute it (OS#4084).
 | 
			
		||||
nobase_nodist_include_HEADERS = \
 | 
			
		||||
	osmocom/mgcp_client/mgcp_common.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
SUBDIRS = \
 | 
			
		||||
	mgcp_client \
 | 
			
		||||
	mgcp \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
noinst_HEADERS = \
 | 
			
		||||
	vty.h \
 | 
			
		||||
	mgcp_msg.h \
 | 
			
		||||
	mgcp_conn.h \
 | 
			
		||||
	mgcp_stat.h \
 | 
			
		||||
	mgcp_endp.h \
 | 
			
		||||
	mgcp_sdp.h \
 | 
			
		||||
	mgcp_codec.h \
 | 
			
		||||
	mgcp_ctrl.h \
 | 
			
		||||
	mgcp_trunk.h \
 | 
			
		||||
	debug.h \
 | 
			
		||||
	mgcp_ratectr.h \
 | 
			
		||||
	mgcp_e1.h \
 | 
			
		||||
	mgcp_network.h \
 | 
			
		||||
	mgcp_protocol.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/* (C) 2017 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Philipp Maier
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <osmocom/core/linuxlist.h>
 | 
			
		||||
 | 
			
		||||
#define DEBUG
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
 | 
			
		||||
/* Debug Areas of the code */
 | 
			
		||||
enum {
 | 
			
		||||
	DRTP,
 | 
			
		||||
	DE1,
 | 
			
		||||
	Debug_LastEntry,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const struct log_info log_info;
 | 
			
		||||
@@ -1,212 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/core/socket.h>
 | 
			
		||||
#include <osmocom/core/write_queue.h>
 | 
			
		||||
#include <osmocom/core/timer.h>
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp_common.h>
 | 
			
		||||
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
#include "mgcp_ratectr.h"
 | 
			
		||||
 | 
			
		||||
#define RTP_PORT_DEFAULT_RANGE_START 16002
 | 
			
		||||
#define RTP_PORT_DEFAULT_RANGE_END RTP_PORT_DEFAULT_RANGE_START + 64
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Handling of MGCP Endpoints and the MGCP Config
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_endpoint;
 | 
			
		||||
struct mgcp_config;
 | 
			
		||||
struct mgcp_trunk;
 | 
			
		||||
struct mgcp_rtp_end;
 | 
			
		||||
 | 
			
		||||
#define MGCP_ENDP_CRCX 1
 | 
			
		||||
#define MGCP_ENDP_DLCX 2
 | 
			
		||||
#define MGCP_ENDP_MDCX 3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * what to do with the msg?
 | 
			
		||||
 *	- continue as usual?
 | 
			
		||||
 *	- reject and send a failure code?
 | 
			
		||||
 *	- defer? do not send anything
 | 
			
		||||
 */
 | 
			
		||||
#define MGCP_POLICY_CONT	4
 | 
			
		||||
#define MGCP_POLICY_REJECT	5
 | 
			
		||||
#define MGCP_POLICY_DEFER	6
 | 
			
		||||
 | 
			
		||||
typedef int (*mgcp_change)(struct mgcp_endpoint *endp, int state);
 | 
			
		||||
typedef int (*mgcp_policy)(struct mgcp_endpoint *endp, int state, const char *transaction_id);
 | 
			
		||||
typedef int (*mgcp_reset)(struct mgcp_trunk *cfg);
 | 
			
		||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return:
 | 
			
		||||
 *   <  0 in case no audio was processed
 | 
			
		||||
 *   >= 0 in case audio was processed. The remaining payload
 | 
			
		||||
 *   length will be returned.
 | 
			
		||||
 */
 | 
			
		||||
typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
 | 
			
		||||
			       struct mgcp_rtp_end *dst_end,
 | 
			
		||||
			       char *data, int *len, int buf_size);
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn_rtp;
 | 
			
		||||
 | 
			
		||||
typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
 | 
			
		||||
				     struct mgcp_conn_rtp *conn_dst,
 | 
			
		||||
				     struct mgcp_conn_rtp *conn_src);
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_codec;
 | 
			
		||||
 | 
			
		||||
typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
 | 
			
		||||
				const struct mgcp_rtp_codec **codec,
 | 
			
		||||
				const char **fmtp_extra,
 | 
			
		||||
				struct mgcp_conn_rtp *conn);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This holds information on how to allocate ports
 | 
			
		||||
 */
 | 
			
		||||
struct mgcp_port_range {
 | 
			
		||||
	/* addr or NULL to fall-back to default */
 | 
			
		||||
	char *bind_addr_v4;
 | 
			
		||||
	char *bind_addr_v6;
 | 
			
		||||
 | 
			
		||||
	/* dynamically allocated */
 | 
			
		||||
	int range_start;
 | 
			
		||||
	int range_end;
 | 
			
		||||
	int last_port;
 | 
			
		||||
 | 
			
		||||
	/* set to true to enable automatic probing
 | 
			
		||||
	 * of the local bind IP-Address, bind_addr
 | 
			
		||||
	 * (or its fall back) is used when automatic
 | 
			
		||||
	 * probing fails */
 | 
			
		||||
	bool bind_addr_probe;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* There are up to three modes in which the keep-alive dummy packet can be
 | 
			
		||||
 * sent. The behaviour is controlled via the keepalive_interval member of the
 | 
			
		||||
 * trunk config. If that member is set to 0 (MGCP_KEEPALIVE_NEVER) no dummy-
 | 
			
		||||
 * packet is sent at all and the timer that sends regular dummy packets
 | 
			
		||||
 * is no longer scheduled. If the keepalive_interval is set to -1, only
 | 
			
		||||
 * one dummy packet is sent when an CRCX or an MDCX is performed. No timer
 | 
			
		||||
 * is scheduled. For all vales greater 0, the timer is scheduled and the
 | 
			
		||||
 * value is used as interval. See also mgcp_keepalive_timer_cb(),
 | 
			
		||||
 * handle_modify_con(), and handle_create_con() */
 | 
			
		||||
#define MGCP_KEEPALIVE_ONCE (-1)
 | 
			
		||||
#define MGCP_KEEPALIVE_NEVER 0
 | 
			
		||||
 | 
			
		||||
enum mgcp_role {
 | 
			
		||||
	MGCP_BSC = 0,
 | 
			
		||||
	MGCP_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_config {
 | 
			
		||||
	int source_port;
 | 
			
		||||
	char *local_ip;
 | 
			
		||||
	char *source_addr;
 | 
			
		||||
	char *call_agent_addr;
 | 
			
		||||
 | 
			
		||||
	/* RTP processing */
 | 
			
		||||
	mgcp_processing rtp_processing_cb;
 | 
			
		||||
	mgcp_processing_setup setup_rtp_processing_cb;
 | 
			
		||||
 | 
			
		||||
	mgcp_get_format get_net_downlink_format_cb;
 | 
			
		||||
 | 
			
		||||
	struct osmo_wqueue gw_fd;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_port_range net_ports;
 | 
			
		||||
	int endp_dscp;
 | 
			
		||||
 | 
			
		||||
	int force_ptime;
 | 
			
		||||
 | 
			
		||||
	mgcp_change change_cb;
 | 
			
		||||
	mgcp_policy policy_cb;
 | 
			
		||||
	mgcp_reset reset_cb;
 | 
			
		||||
	mgcp_rqnt rqnt_cb;
 | 
			
		||||
	void *data;
 | 
			
		||||
 | 
			
		||||
	uint32_t last_call_id;
 | 
			
		||||
 | 
			
		||||
	/* list holding the trunks */
 | 
			
		||||
	struct llist_head trunks;
 | 
			
		||||
 | 
			
		||||
	enum mgcp_role role;
 | 
			
		||||
 | 
			
		||||
	/* osmux translator: 0 means disabled, 1 means enabled */
 | 
			
		||||
	int osmux;
 | 
			
		||||
	/* addr to bind the server to */
 | 
			
		||||
	char *osmux_addr;
 | 
			
		||||
	/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
 | 
			
		||||
	 * the osmux socket is already initialized.
 | 
			
		||||
	 */
 | 
			
		||||
	int osmux_init;
 | 
			
		||||
	/* osmux batch factor: from 1 to 4 maximum */
 | 
			
		||||
	int osmux_batch;
 | 
			
		||||
	/* osmux batch size (in bytes) */
 | 
			
		||||
	int osmux_batch_size;
 | 
			
		||||
	/* osmux port */
 | 
			
		||||
	uint16_t osmux_port;
 | 
			
		||||
	/* Pad circuit with dummy messages until we see the first voice
 | 
			
		||||
	 * message.
 | 
			
		||||
	 */
 | 
			
		||||
	uint16_t osmux_dummy;
 | 
			
		||||
	/* domain name of the media gateway */
 | 
			
		||||
	char domain[255+1];
 | 
			
		||||
 | 
			
		||||
	/* time after which inactive connections (CIs) get closed */
 | 
			
		||||
	int conn_timeout;
 | 
			
		||||
 | 
			
		||||
	/* osmocom CTRL interface */
 | 
			
		||||
	struct ctrl_handle *ctrl;
 | 
			
		||||
 | 
			
		||||
	/* global rate counters to measure the MGWs overall performance and
 | 
			
		||||
	 * health */
 | 
			
		||||
	struct mgcp_ratectr_global ratectr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* config management */
 | 
			
		||||
struct mgcp_config *mgcp_config_alloc(void);
 | 
			
		||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
 | 
			
		||||
		      enum mgcp_role role);
 | 
			
		||||
int mgcp_vty_init(void);
 | 
			
		||||
void mgcp_trunk_set_keepalive(struct mgcp_trunk *trunk, int interval);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * format helper functions
 | 
			
		||||
 */
 | 
			
		||||
struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mgcp_send_reset_ep(struct mgcp_endpoint *endp);
 | 
			
		||||
int mgcp_send_reset_all(struct mgcp_config *cfg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
 | 
			
		||||
int mgcp_udp_send(int fd, struct osmo_sockaddr *addr, int port, char *buf, int len);
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_DEFAULT_RATE  8000
 | 
			
		||||
#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
 | 
			
		||||
 | 
			
		||||
#define PTYPE_UNDEFINED (-1)
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn_rtp;
 | 
			
		||||
 | 
			
		||||
void mgcp_codec_summary(struct mgcp_conn_rtp *conn);
 | 
			
		||||
void mgcp_codec_reset_all(struct mgcp_conn_rtp *conn);
 | 
			
		||||
int mgcp_codec_add(struct mgcp_conn_rtp *conn, int payload_type, const char *audio_name, const struct mgcp_codec_param *param);
 | 
			
		||||
int mgcp_codec_decide(struct mgcp_conn_rtp *conn);
 | 
			
		||||
int mgcp_codec_pt_translate(struct mgcp_conn_rtp *conn_src, struct mgcp_conn_rtp *conn_dst, int payload_type);
 | 
			
		||||
const struct mgcp_rtp_codec *mgcp_codec_pt_find_by_subtype_name(struct mgcp_conn_rtp *conn,
 | 
			
		||||
								const char *subtype_name, unsigned int match_nr);
 | 
			
		||||
@@ -1,111 +0,0 @@
 | 
			
		||||
/* MGCP common implementations.
 | 
			
		||||
 * These are used in libosmo-mgcp as well as libosmo-mgcp-client.
 | 
			
		||||
 * To avoid interdependency, these are implemented in .h file only. */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Two copies of this file are kept in osmocom/mgcp/ and osmocom/mgcp_client/.
 | 
			
		||||
 * Since both are by definition identical, use the old header exclusion ifdefs
 | 
			
		||||
 * instead of '#pragma once' to avoid including both of these files.
 | 
			
		||||
 * Though at the time of writing there are no such users, this allows including
 | 
			
		||||
 * both libosmo-mgcp and libosmo-mgcp-client headers in the same file. */
 | 
			
		||||
#ifndef OSMO_MGCP_COMMON_H
 | 
			
		||||
#define OSMO_MGCP_COMMON_H
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/core/logging.h>
 | 
			
		||||
 | 
			
		||||
#define for_each_non_empty_line(line, save)			\
 | 
			
		||||
	for (line = strtok_r(NULL, "\r\n", &save); line;	\
 | 
			
		||||
	     line = strtok_r(NULL, "\r\n", &save))
 | 
			
		||||
 | 
			
		||||
enum mgcp_connection_mode {
 | 
			
		||||
	MGCP_CONN_NONE = 0,
 | 
			
		||||
	MGCP_CONN_RECV_ONLY = 1,
 | 
			
		||||
	MGCP_CONN_SEND_ONLY = 2,
 | 
			
		||||
	MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
 | 
			
		||||
	MGCP_CONN_LOOPBACK  = 4 | MGCP_CONN_RECV_SEND,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MGCP_X_OSMO_IGN_HEADER "X-Osmo-IGN:"
 | 
			
		||||
#define MGCP_X_OSMO_OSMUX_HEADER "X-Osmux:"
 | 
			
		||||
 | 
			
		||||
/* Values should be bitwise-OR-able */
 | 
			
		||||
enum mgcp_x_osmo_ign {
 | 
			
		||||
	MGCP_X_OSMO_IGN_NONE = 0,
 | 
			
		||||
	MGCP_X_OSMO_IGN_CALLID = 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Codec parameters (communicated via SDP/fmtp) */
 | 
			
		||||
struct mgcp_codec_param {
 | 
			
		||||
	bool amr_octet_aligned_present;
 | 
			
		||||
	bool amr_octet_aligned;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Ensure that the msg->l2h is NUL terminated. */
 | 
			
		||||
static inline int mgcp_msg_terminate_nul(struct msgb *msg)
 | 
			
		||||
{
 | 
			
		||||
	unsigned char *tail = msg->l2h + msgb_l2len(msg); /* char after l2 data */
 | 
			
		||||
	if (tail[-1] == '\0')
 | 
			
		||||
		/* nothing to do */;
 | 
			
		||||
	else if (msgb_tailroom(msg) > 0)
 | 
			
		||||
		tail[0] = '\0';
 | 
			
		||||
	else if (tail[-1] == '\r' || tail[-1] == '\n')
 | 
			
		||||
		tail[-1] = '\0';
 | 
			
		||||
	else {
 | 
			
		||||
		LOGP(DLMGCP, LOGL_ERROR, "Cannot NUL terminate MGCP message: "
 | 
			
		||||
		     "Length: %d, Buffer size: %d\n",
 | 
			
		||||
		     msgb_l2len(msg), msg->data_len);
 | 
			
		||||
		return -ENOTSUP;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Maximum length of the comment field */
 | 
			
		||||
#define MGCP_COMMENT_MAXLEN 256
 | 
			
		||||
 | 
			
		||||
/* Maximum allowed String length of Connection Identifiers as per spec
 | 
			
		||||
 * (see also RFC3435 2.1.3.2 Names of Connections), plus one for '\0'. */
 | 
			
		||||
#define MGCP_CONN_ID_MAXLEN 32+1
 | 
			
		||||
 | 
			
		||||
/* Deprecated: old name of MGCP_CONN_ID_MAXLEN. */
 | 
			
		||||
#define MGCP_CONN_ID_LENGTH MGCP_CONN_ID_MAXLEN
 | 
			
		||||
 | 
			
		||||
/* String length of Endpoint Identifiers.
 | 
			
		||||
/  (see also RFC3435 section 3.2.1.3) */
 | 
			
		||||
#define MGCP_ENDPOINT_MAXLEN (255*2+1+1)
 | 
			
		||||
 | 
			
		||||
/* A prefix to denote the virtual trunk (RTP on both ends) */
 | 
			
		||||
#define MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK "rtpbridge/"
 | 
			
		||||
 | 
			
		||||
/* A prefix to denote the e1 trunk
 | 
			
		||||
 * (see also RFC3435 section E.2) */
 | 
			
		||||
#define MGCP_ENDPOINT_PREFIX_E1_TRUNK "ds/e1-"
 | 
			
		||||
 | 
			
		||||
/* Maximal number of payload types / codecs that can be negotiated via SDP at
 | 
			
		||||
 * at once. */
 | 
			
		||||
#define MGCP_MAX_CODECS 10
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,190 +0,0 @@
 | 
			
		||||
/* Message connection list handling */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Philipp Maier
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp.h>
 | 
			
		||||
#include <osmocom/mgcp/mgcp_network.h>
 | 
			
		||||
#include <osmocom/mgcp/osmux.h>
 | 
			
		||||
#include <osmocom/core/linuxlist.h>
 | 
			
		||||
#include <osmocom/core/rate_ctr.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
#define LOGPCONN(conn, cat, level, fmt, args...) \
 | 
			
		||||
LOGPENDP((conn)->endp, cat, level, "CI:%s " fmt, \
 | 
			
		||||
         (conn)->id, \
 | 
			
		||||
         ## args)
 | 
			
		||||
 | 
			
		||||
#define LOG_CONN(conn, level, fmt, args...) \
 | 
			
		||||
	LOGP(DRTP, level, "(%s I:%s) " fmt, \
 | 
			
		||||
	     (conn)->endp ? (conn)->endp->name : "none", (conn)->id, ## args)
 | 
			
		||||
 | 
			
		||||
#define LOG_CONN_RTP(conn_rtp, level, fmt, args...) \
 | 
			
		||||
	LOG_CONN((conn_rtp)->conn, level, fmt, ## args)
 | 
			
		||||
 | 
			
		||||
/* Specific rtp connection type (see struct mgcp_conn_rtp) */
 | 
			
		||||
enum mgcp_conn_rtp_type {
 | 
			
		||||
	MGCP_RTP_DEFAULT	= 0,
 | 
			
		||||
	MGCP_OSMUX_BSC,
 | 
			
		||||
	MGCP_OSMUX_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! Connection type, specifies which member of the union "u" in mgcp_conn
 | 
			
		||||
 *  contains a useful connection description (currently only RTP) */
 | 
			
		||||
enum mgcp_conn_type {
 | 
			
		||||
	MGCP_CONN_TYPE_RTP,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* MGCP connection (RTP) */
 | 
			
		||||
struct mgcp_conn_rtp {
 | 
			
		||||
 | 
			
		||||
	/* Backpointer to conn struct */
 | 
			
		||||
	struct mgcp_conn *conn;
 | 
			
		||||
 | 
			
		||||
	/* Specific connection type */
 | 
			
		||||
	enum mgcp_conn_rtp_type type;
 | 
			
		||||
 | 
			
		||||
	/* Port status */
 | 
			
		||||
	struct mgcp_rtp_end end;
 | 
			
		||||
 | 
			
		||||
	/* Sequence bits */
 | 
			
		||||
	struct mgcp_rtp_state state;
 | 
			
		||||
 | 
			
		||||
	/* taps for the rtp connection; one per direction */
 | 
			
		||||
	struct mgcp_rtp_tap tap_in;
 | 
			
		||||
	struct mgcp_rtp_tap tap_out;
 | 
			
		||||
 | 
			
		||||
	/* Osmux states (optional) */
 | 
			
		||||
	struct {
 | 
			
		||||
		/* Osmux state: disabled, activating, active */
 | 
			
		||||
		enum osmux_state state;
 | 
			
		||||
		/* Is cid holding valid data? is it allocated from pool? */
 | 
			
		||||
		bool cid_allocated;
 | 
			
		||||
		/* Allocated Osmux circuit ID for this conn */
 | 
			
		||||
		uint8_t cid;
 | 
			
		||||
		/* handle to batch messages */
 | 
			
		||||
		struct osmux_in_handle *in;
 | 
			
		||||
		/* handle to unbatch messages */
 | 
			
		||||
		struct osmux_out_handle out;
 | 
			
		||||
		/* statistics */
 | 
			
		||||
		struct {
 | 
			
		||||
			uint32_t chunks;
 | 
			
		||||
			uint32_t octets;
 | 
			
		||||
		} stats;
 | 
			
		||||
	} osmux;
 | 
			
		||||
 | 
			
		||||
	struct rate_ctr_group *rate_ctr_group;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! MGCP connection (untyped) */
 | 
			
		||||
struct mgcp_conn {
 | 
			
		||||
	/*! list head */
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	/*! Backpointer to the endpoint where the conn belongs to */
 | 
			
		||||
	struct mgcp_endpoint *endp;
 | 
			
		||||
 | 
			
		||||
	/*! type of the connection (union) */
 | 
			
		||||
	enum mgcp_conn_type type;
 | 
			
		||||
 | 
			
		||||
	/*! mode of the connection */
 | 
			
		||||
	enum mgcp_connection_mode mode;
 | 
			
		||||
 | 
			
		||||
	/*! copy of the mode to restore the original setting (VTY) */
 | 
			
		||||
	enum mgcp_connection_mode mode_orig;
 | 
			
		||||
 | 
			
		||||
	/*! connection id to identify the connection */
 | 
			
		||||
	char id[MGCP_CONN_ID_MAXLEN];
 | 
			
		||||
 | 
			
		||||
	/*! human readable name (vty, logging) */
 | 
			
		||||
	char name[256];
 | 
			
		||||
 | 
			
		||||
	/*! activity tracker (for cleaning up inactive connections) */
 | 
			
		||||
	struct osmo_timer_list watchdog;
 | 
			
		||||
 | 
			
		||||
	/*! union with connection description */
 | 
			
		||||
	union {
 | 
			
		||||
		struct mgcp_conn_rtp rtp;
 | 
			
		||||
	} u;
 | 
			
		||||
 | 
			
		||||
	/*! pointer to optional private data */
 | 
			
		||||
	void *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* RTP connection related counters */
 | 
			
		||||
enum {
 | 
			
		||||
	IN_STREAM_ERR_TSTMP_CTR,
 | 
			
		||||
	OUT_STREAM_ERR_TSTMP_CTR,
 | 
			
		||||
        RTP_PACKETS_RX_CTR,
 | 
			
		||||
        RTP_OCTETS_RX_CTR,
 | 
			
		||||
        RTP_PACKETS_TX_CTR,
 | 
			
		||||
        RTP_OCTETS_TX_CTR,
 | 
			
		||||
        RTP_DROPPED_PACKETS_CTR,
 | 
			
		||||
        RTP_NUM_CONNECTIONS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* RTP per-connection statistics. Instances of the corresponding rate counter group
 | 
			
		||||
 * exist for the lifetime of an RTP connection.
 | 
			
		||||
 * Must be kept in sync with all_rtp_conn_rate_ctr_desc below */
 | 
			
		||||
static const struct rate_ctr_desc mgcp_conn_rate_ctr_desc[] = {
 | 
			
		||||
	[IN_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:in", "Inbound rtp-stream timestamp errors."},
 | 
			
		||||
	[OUT_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:out", "Outbound rtp-stream timestamp errors."},
 | 
			
		||||
	[RTP_PACKETS_RX_CTR] = {"rtp:packets_rx", "Inbound rtp packets."},
 | 
			
		||||
	[RTP_OCTETS_RX_CTR] = {"rtp:octets_rx", "Inbound rtp octets."},
 | 
			
		||||
	[RTP_PACKETS_TX_CTR] = {"rtp:packets_tx", "Outbound rtp packets."},
 | 
			
		||||
	[RTP_OCTETS_TX_CTR] = {"rtp:octets_tx", "Outbound rtp octets."},
 | 
			
		||||
	[RTP_DROPPED_PACKETS_CTR] = {"rtp:dropped", "dropped rtp packets."}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Aggregated RTP connection stats. These are updated when an RTP connection is freed.
 | 
			
		||||
 * Must be kept in sync with mgcp_conn_rate_ctr_desc above */
 | 
			
		||||
static const struct rate_ctr_desc all_rtp_conn_rate_ctr_desc[] = {
 | 
			
		||||
	[IN_STREAM_ERR_TSTMP_CTR] = {"all_rtp:err_tstmp_in", "Total inbound rtp-stream timestamp errors."},
 | 
			
		||||
	[OUT_STREAM_ERR_TSTMP_CTR] = {"all_rtp:err_tstmp_out", "Total outbound rtp-stream timestamp errors."},
 | 
			
		||||
	[RTP_PACKETS_RX_CTR] = {"all_rtp:packets_rx", "Total inbound rtp packets."},
 | 
			
		||||
	[RTP_OCTETS_RX_CTR] = {"all_rtp:octets_rx", "Total inbound rtp octets."},
 | 
			
		||||
	[RTP_PACKETS_TX_CTR] = {"all_rtp:packets_tx", "Total outbound rtp packets."},
 | 
			
		||||
	[RTP_OCTETS_TX_CTR] = {"all_rtp:octets_tx", "Total outbound rtp octets."},
 | 
			
		||||
	[RTP_DROPPED_PACKETS_CTR] = {"all_rtp:dropped", "Total dropped rtp packets."},
 | 
			
		||||
 | 
			
		||||
	/* This last counter does not exist in per-connection stats, only here. */
 | 
			
		||||
	[RTP_NUM_CONNECTIONS] = {"all_rtp:num_closed_conns", "Total number of rtp connections closed."}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Was conn configured to handle Osmux? */
 | 
			
		||||
static inline bool mgcp_conn_rtp_is_osmux(const struct mgcp_conn_rtp *conn) {
 | 
			
		||||
	return conn->type == MGCP_OSMUX_BSC || conn->type == MGCP_OSMUX_BSC_NAT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp,
 | 
			
		||||
				  enum mgcp_conn_type type, char *name);
 | 
			
		||||
struct mgcp_conn *mgcp_conn_get(struct mgcp_endpoint *endp, const char *id);
 | 
			
		||||
struct mgcp_conn_rtp *mgcp_conn_get_rtp(struct mgcp_endpoint *endp,
 | 
			
		||||
					const char *id);
 | 
			
		||||
void mgcp_conn_free(struct mgcp_endpoint *endp, const char *id);
 | 
			
		||||
void mgcp_conn_free_oldest(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_conn_free_all(struct mgcp_endpoint *endp);
 | 
			
		||||
char *mgcp_conn_dump(struct mgcp_conn *conn);
 | 
			
		||||
struct mgcp_conn *mgcp_find_dst_conn(struct mgcp_conn *conn);
 | 
			
		||||
struct mgcp_conn *mgcp_conn_get_oldest(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_conn_watchdog_kick(struct mgcp_conn *conn);
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2020 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/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
struct ctrl_handle *mgw_ctrl_interface_setup(struct mgcp_config *cfg,
 | 
			
		||||
                                             const char *bind_addr, uint16_t port);
 | 
			
		||||
 | 
			
		||||
@@ -1,27 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
/* A 64k timeslot on an E1 line can be subdevied into the following
 | 
			
		||||
 * subslot combinations:
 | 
			
		||||
 *
 | 
			
		||||
 * subslot:                                          offset:
 | 
			
		||||
 * [          ][          ][   16k    ][8k_subslot]  0
 | 
			
		||||
 * [          ][   32k    ][_subslot__][8k_subslot]  1
 | 
			
		||||
 * [          ][ subslot  ][   16k    ][8k_subslot]  2
 | 
			
		||||
 * [   64k    ][__________][_subslot__][8k_subslot]  3
 | 
			
		||||
 * [ timeslot ][          ][   16k    ][8k_subslot]  4
 | 
			
		||||
 * [          ][   32K    ][_subslot__][8k_subslot]  5
 | 
			
		||||
 * [          ][ subslot  ][   16k    ][8k_subslot]  6
 | 
			
		||||
 * [          ][          ][ subslot  ][8k_subslot]  7
 | 
			
		||||
 *
 | 
			
		||||
 * Since overlapping assignment of subslots is not possible there is a limited
 | 
			
		||||
 * set of subslot assignments possible. The e1_rates array lists the possible
 | 
			
		||||
 * assignments as depicted above. Also each subslot assignment comes along with
 | 
			
		||||
 * a bit offset in the E1 bitstream. The e1_offsets arrays lists the bit
 | 
			
		||||
 * offsets. */
 | 
			
		||||
static const uint8_t e1_rates[] = { 64, 32, 32, 16, 16, 16, 16, 8, 8, 8, 8, 8, 8, 8, 8 };
 | 
			
		||||
static const uint8_t e1_offsets[] = { 0, 0, 4, 0, 2, 4, 6, 0, 1, 2, 3, 4, 5, 6, 7 };
 | 
			
		||||
 | 
			
		||||
int mgcp_e1_endp_equip(struct mgcp_endpoint *endp, uint8_t ts, uint8_t ss, uint8_t offs);
 | 
			
		||||
void mgcp_e1_endp_update(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_e1_endp_release(struct mgcp_endpoint *endp);
 | 
			
		||||
int mgcp_e1_send_rtp(struct mgcp_endpoint *endp, struct mgcp_rtp_codec *codec, struct msgb *msg);
 | 
			
		||||
@@ -1,143 +0,0 @@
 | 
			
		||||
/* Endpoint types */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Philipp Maier
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/msgb.h>
 | 
			
		||||
#include <osmocom/gsm/i460_mux.h>
 | 
			
		||||
 | 
			
		||||
struct sockaddr;
 | 
			
		||||
struct mgcp_conn;
 | 
			
		||||
struct mgcp_conn_rtp;
 | 
			
		||||
struct mgcp_endpoint;
 | 
			
		||||
 | 
			
		||||
/* Number of E1 subslots (different variants, not all useable at the same time) */
 | 
			
		||||
#define MGCP_ENDP_E1_SUBSLOTS 15
 | 
			
		||||
 | 
			
		||||
#define LOGPENDP(endp, cat, level, fmt, args...) \
 | 
			
		||||
LOGP(cat, level, "endpoint:%s " fmt, \
 | 
			
		||||
     endp ? endp->name : "none", \
 | 
			
		||||
     ## args)
 | 
			
		||||
 | 
			
		||||
struct osmo_rtp_msg_ctx {
 | 
			
		||||
	int proto;
 | 
			
		||||
	struct mgcp_conn_rtp *conn_src;
 | 
			
		||||
	struct osmo_sockaddr *from_addr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define OSMO_RTP_MSG_CTX(MSGB) ((struct osmo_rtp_msg_ctx*)(MSGB)->cb)
 | 
			
		||||
 | 
			
		||||
osmo_static_assert(sizeof(((struct msgb*)0)->cb) >= sizeof(struct osmo_rtp_msg_ctx), osmo_rtp_msg_ctx_fits_in_msgb_cb);
 | 
			
		||||
 | 
			
		||||
/* Callback type for RTP dispatcher functions (e.g mgcp_dispatch_rtp_bridge_cb, see below).
 | 
			
		||||
 * The OSMO_RTP_MSG_CTX() should be set appropriately on the msg. */
 | 
			
		||||
typedef int (*mgcp_dispatch_rtp_cb) (struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
/* Callback type for endpoint specific cleanup actions. This function
 | 
			
		||||
 * is automatically executed when a connection is freed (see mgcp_conn_free()
 | 
			
		||||
 * in mgcp_conn.c). Depending on the type of the endpoint there may be endpoint
 | 
			
		||||
 * specific things to take care of once a connection has been removed. */
 | 
			
		||||
typedef void (*mgcp_cleanup_cp) (struct mgcp_endpoint *endp,
 | 
			
		||||
				 struct mgcp_conn *conn);
 | 
			
		||||
 | 
			
		||||
/*! MGCP endpoint properties */
 | 
			
		||||
struct mgcp_endpoint_type {
 | 
			
		||||
	/*! maximum number of connections */
 | 
			
		||||
	int max_conns;
 | 
			
		||||
 | 
			
		||||
	/*! callback that defines how to dispatch incoming RTP data */
 | 
			
		||||
	mgcp_dispatch_rtp_cb dispatch_rtp_cb;
 | 
			
		||||
 | 
			
		||||
	/*! callback that implements endpoint specific cleanup actions */
 | 
			
		||||
	mgcp_cleanup_cp cleanup_cb;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! MGCP endpoint typeset */
 | 
			
		||||
struct mgcp_endpoint_typeset {
 | 
			
		||||
	struct mgcp_endpoint_type rtp;
 | 
			
		||||
	struct mgcp_endpoint_type e1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*! static MGCP endpoint typeset (pre-initalized, read-only) */
 | 
			
		||||
extern const struct mgcp_endpoint_typeset ep_typeset;
 | 
			
		||||
 | 
			
		||||
/*! MGCP endpoint model */
 | 
			
		||||
struct mgcp_endpoint {
 | 
			
		||||
 | 
			
		||||
	/*! Unique endpoint name, used for addressing via MGCP */
 | 
			
		||||
	char *name;
 | 
			
		||||
 | 
			
		||||
	/*! Call identifier string (as supplied by the call agant) */
 | 
			
		||||
	char *callid;
 | 
			
		||||
 | 
			
		||||
	/*! Local connection options (see mgcp_internal.h) */
 | 
			
		||||
	struct mgcp_lco local_options;
 | 
			
		||||
 | 
			
		||||
	/*! List of struct mgcp_conn, of the connections active on this endpoint */
 | 
			
		||||
	struct llist_head conns;
 | 
			
		||||
 | 
			
		||||
	/*! Backpointer to the MGW configuration */
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
 | 
			
		||||
	/*! Backpointer to the trunk this endpoint belongs to */
 | 
			
		||||
	struct mgcp_trunk *trunk;
 | 
			
		||||
 | 
			
		||||
	/*! Endpoint properties (see above) */
 | 
			
		||||
	const struct mgcp_endpoint_type *type;
 | 
			
		||||
 | 
			
		||||
	/*! Last MGCP transmission (in case re-transmission is required) */
 | 
			
		||||
	char *last_trans;
 | 
			
		||||
 | 
			
		||||
	/*! Last MGCP response (in case re-transmission is required) */
 | 
			
		||||
	char *last_response;
 | 
			
		||||
 | 
			
		||||
	/*! Memorize if this endpoint was choosen by the MGW (wildcarded, true)
 | 
			
		||||
	 *   or if the user has choosen the particular endpoint explicitly. */
 | 
			
		||||
	bool wildcarded_req;
 | 
			
		||||
 | 
			
		||||
	/*! MGCP_X_OSMO_IGN_* flags from 'X-Osmo-IGN:' header */
 | 
			
		||||
	uint32_t x_osmo_ign;
 | 
			
		||||
 | 
			
		||||
	/* E1 specific */
 | 
			
		||||
	struct {
 | 
			
		||||
		struct osmo_i460_schan_desc scd;
 | 
			
		||||
		struct osmo_i460_subchan *schan;
 | 
			
		||||
		struct osmo_fsm_inst *trau_sync_fi;
 | 
			
		||||
		struct osmo_trau2rtp_state *trau_rtp_st;
 | 
			
		||||
		uint8_t last_amr_ft;
 | 
			
		||||
		struct mgcp_rtp_codec *last_codec;
 | 
			
		||||
	} e1;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_endpoint *mgcp_endp_alloc(struct mgcp_trunk *trunk, unsigned int index);
 | 
			
		||||
void mgcp_endp_release(struct mgcp_endpoint *endp);
 | 
			
		||||
int mgcp_endp_claim(struct mgcp_endpoint *endp, const char *callid);
 | 
			
		||||
void mgcp_endp_update(struct mgcp_endpoint *endp);
 | 
			
		||||
struct mgcp_endpoint *mgcp_endp_by_name_trunk(int *cause, const char *epname,
 | 
			
		||||
					      const struct mgcp_trunk *trunk);
 | 
			
		||||
struct mgcp_endpoint *mgcp_endp_by_name(int *cause, const char *epname,
 | 
			
		||||
					struct mgcp_config *cfg);
 | 
			
		||||
bool mgcp_endp_avail(struct mgcp_endpoint *endp);
 | 
			
		||||
void mgcp_endp_add_conn(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
 | 
			
		||||
void mgcp_endp_remove_conn(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
 | 
			
		||||
@@ -1,56 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
/* Message parser/generator utilities */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn;
 | 
			
		||||
struct mgcp_parse_data;
 | 
			
		||||
struct mgcp_endpoint;
 | 
			
		||||
 | 
			
		||||
void mgcp_disp_msg(unsigned char *message, unsigned int len, char *preamble);
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_conn_mode(const char *msg, struct mgcp_endpoint *endp,
 | 
			
		||||
			 struct mgcp_conn *conn);
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_header(struct mgcp_parse_data *pdata, char *data);
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_osmux_cid(const char *line);
 | 
			
		||||
 | 
			
		||||
int mgcp_check_param(const struct mgcp_endpoint *endp, const char *line);
 | 
			
		||||
 | 
			
		||||
int mgcp_verify_call_id(struct mgcp_endpoint *endp, const char *callid);
 | 
			
		||||
 | 
			
		||||
int mgcp_verify_ci(struct mgcp_endpoint *endp, const char *conn_id);
 | 
			
		||||
 | 
			
		||||
char *mgcp_strline(char *str, char **saveptr);
 | 
			
		||||
 | 
			
		||||
#define for_each_line(line, save)\
 | 
			
		||||
	for (line = mgcp_strline(NULL, &save); line;\
 | 
			
		||||
	     line = mgcp_strline(NULL, &save))
 | 
			
		||||
 | 
			
		||||
#define for_each_non_empty_line(line, save)\
 | 
			
		||||
	for (line = strtok_r(NULL, "\r\n", &save); line;\
 | 
			
		||||
	     line = strtok_r(NULL, "\r\n", &save))
 | 
			
		||||
@@ -1,169 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/socket.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp/mgcp.h>
 | 
			
		||||
 | 
			
		||||
#define MGCP_DUMMY_LOAD 0x23
 | 
			
		||||
#define RTP_BUF_SIZE	4096
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_stream_state {
 | 
			
		||||
	uint32_t ssrc;
 | 
			
		||||
	uint16_t last_seq;
 | 
			
		||||
	uint32_t last_timestamp;
 | 
			
		||||
	struct rate_ctr *err_ts_ctr;
 | 
			
		||||
	int32_t last_tsdelta;
 | 
			
		||||
	uint32_t last_arrival_time;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_state {
 | 
			
		||||
	/* has this state structure been initialized? */
 | 
			
		||||
	int initialized;
 | 
			
		||||
 | 
			
		||||
	struct {
 | 
			
		||||
		/* are we patching the SSRC value? */
 | 
			
		||||
		int patch_ssrc;
 | 
			
		||||
		/* original SSRC (to which we shall patch any different SSRC) */
 | 
			
		||||
		uint32_t orig_ssrc;
 | 
			
		||||
		/* offset to apply on the sequence number */
 | 
			
		||||
		int seq_offset;
 | 
			
		||||
		/* offset to apply on the timestamp number */
 | 
			
		||||
		int32_t timestamp_offset;
 | 
			
		||||
	} patch;
 | 
			
		||||
 | 
			
		||||
	/* duration of a packet (FIXME: in which unit?) */
 | 
			
		||||
	uint32_t packet_duration;
 | 
			
		||||
 | 
			
		||||
	/* Note: These states are not continuously updated, they serve as an
 | 
			
		||||
	 * information source to patch certain values in the RTP header. Do
 | 
			
		||||
	 * not use this state if constantly updated data about the RTP stream
 | 
			
		||||
	 * is needed. (see also mgcp_patch_and_count() */
 | 
			
		||||
	struct mgcp_rtp_stream_state in_stream;
 | 
			
		||||
	struct mgcp_rtp_stream_state out_stream;
 | 
			
		||||
 | 
			
		||||
	/* jitter and packet loss calculation */
 | 
			
		||||
	struct {
 | 
			
		||||
		int initialized;
 | 
			
		||||
		uint16_t base_seq;
 | 
			
		||||
		uint16_t max_seq;
 | 
			
		||||
		uint32_t ssrc;
 | 
			
		||||
		uint32_t jitter;
 | 
			
		||||
		int32_t transit;
 | 
			
		||||
		int cycles;
 | 
			
		||||
	} stats;
 | 
			
		||||
 | 
			
		||||
	/* Alternative values for RTP tx, in case no sufficient header
 | 
			
		||||
	 * information is available so the header needs to be generated
 | 
			
		||||
	 * locally (when just forwarding packets, the header of incoming
 | 
			
		||||
	 * data is just re-used) */
 | 
			
		||||
	uint16_t alt_rtp_tx_sequence;
 | 
			
		||||
	uint32_t alt_rtp_tx_ssrc;
 | 
			
		||||
 | 
			
		||||
	bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_codec {
 | 
			
		||||
	uint32_t rate;
 | 
			
		||||
	int channels;
 | 
			
		||||
	uint32_t frame_duration_num;
 | 
			
		||||
	uint32_t frame_duration_den;
 | 
			
		||||
 | 
			
		||||
	int payload_type;
 | 
			
		||||
	char *audio_name;
 | 
			
		||||
	char *subtype_name;
 | 
			
		||||
 | 
			
		||||
	bool param_present;
 | 
			
		||||
	struct mgcp_codec_param param;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 'mgcp_rtp_end': basically a wrapper around the RTP+RTCP ports */
 | 
			
		||||
struct mgcp_rtp_end {
 | 
			
		||||
	/* remote IP address of the RTP socket */
 | 
			
		||||
	struct osmo_sockaddr addr;
 | 
			
		||||
 | 
			
		||||
	/* in network byte order */
 | 
			
		||||
	int rtp_port, rtcp_port;
 | 
			
		||||
 | 
			
		||||
	/* currently selected audio codec */
 | 
			
		||||
	struct mgcp_rtp_codec *codec;
 | 
			
		||||
 | 
			
		||||
	/* array with assigned audio codecs to choose from (SDP) */
 | 
			
		||||
	struct mgcp_rtp_codec codecs[MGCP_MAX_CODECS];
 | 
			
		||||
 | 
			
		||||
	/* number of assigned audio codecs (SDP) */
 | 
			
		||||
	unsigned int codecs_assigned;
 | 
			
		||||
 | 
			
		||||
	/* per endpoint data */
 | 
			
		||||
	int  frames_per_packet;
 | 
			
		||||
	uint32_t packet_duration_ms;
 | 
			
		||||
	int maximum_packet_time; /* -1: not set */
 | 
			
		||||
	char *fmtp_extra;
 | 
			
		||||
	/* are we transmitting packets (1) or dropping (0) outbound packets */
 | 
			
		||||
	int output_enabled;
 | 
			
		||||
	/* FIXME: This parameter can be set + printed, but is nowhere used! */
 | 
			
		||||
	int force_output_ptime;
 | 
			
		||||
 | 
			
		||||
	/* RTP patching */
 | 
			
		||||
	int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
 | 
			
		||||
	/* should we perform align_rtp_timestamp_offset() (1) or not (0) */
 | 
			
		||||
	int force_aligned_timing;
 | 
			
		||||
	bool rfc5993_hr_convert;
 | 
			
		||||
 | 
			
		||||
	/* Each end has a separate socket for RTP and RTCP */
 | 
			
		||||
	struct osmo_fd rtp;
 | 
			
		||||
	struct osmo_fd rtcp;
 | 
			
		||||
 | 
			
		||||
	/* local UDP port number of the RTP socket; RTCP is +1 */
 | 
			
		||||
	int local_port;
 | 
			
		||||
	/* where the endpoint RTP connection binds to, set during CRCX and
 | 
			
		||||
	 * possibly updated during MDCX */
 | 
			
		||||
	char local_addr[INET6_ADDRSTRLEN];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_tap {
 | 
			
		||||
	/* is this tap active (1) or not (0) */
 | 
			
		||||
	int enabled;
 | 
			
		||||
	/* IP/port to which we're forwarding the tapped data */
 | 
			
		||||
	struct osmo_sockaddr forward;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_conn;
 | 
			
		||||
 | 
			
		||||
int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct osmo_sockaddr *addr,
 | 
			
		||||
	      struct msgb *msg, struct mgcp_conn_rtp *conn_src,
 | 
			
		||||
	      struct mgcp_conn_rtp *conn_dst);
 | 
			
		||||
int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
 | 
			
		||||
int mgcp_dispatch_rtp_bridge_cb(struct msgb *msg);
 | 
			
		||||
void mgcp_cleanup_rtp_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
 | 
			
		||||
int mgcp_dispatch_e1_bridge_cb(struct msgb *msg);
 | 
			
		||||
void mgcp_cleanup_e1_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
 | 
			
		||||
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port,
 | 
			
		||||
			   struct mgcp_conn_rtp *conn);
 | 
			
		||||
void mgcp_free_rtp_port(struct mgcp_rtp_end *end);
 | 
			
		||||
void mgcp_patch_and_count(struct mgcp_endpoint *endp,
 | 
			
		||||
			  struct mgcp_rtp_state *state,
 | 
			
		||||
			  struct mgcp_rtp_end *rtp_end,
 | 
			
		||||
			  struct osmo_sockaddr *addr, struct msgb *msg);
 | 
			
		||||
void mgcp_get_local_addr(char *addr, struct mgcp_conn_rtp *conn);
 | 
			
		||||
int mgcp_set_ip_tos(int fd, int tos);
 | 
			
		||||
 | 
			
		||||
/* payload processing default functions */
 | 
			
		||||
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
 | 
			
		||||
				char *data, int *len, int buf_size);
 | 
			
		||||
 | 
			
		||||
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
 | 
			
		||||
				      struct mgcp_conn_rtp *conn_dst,
 | 
			
		||||
				      struct mgcp_conn_rtp *conn_src);
 | 
			
		||||
 | 
			
		||||
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
 | 
			
		||||
					  const struct mgcp_rtp_codec **codec,
 | 
			
		||||
					  const char **fmtp_extra,
 | 
			
		||||
					  struct mgcp_conn_rtp *conn);
 | 
			
		||||
 | 
			
		||||
/* internal RTP Annex A counting */
 | 
			
		||||
void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
 | 
			
		||||
			const uint16_t seq, const int32_t transit,
 | 
			
		||||
			const uint32_t ssrc);
 | 
			
		||||
@@ -1,27 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
/* Internal structure while parsing a request */
 | 
			
		||||
struct mgcp_parse_data {
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
	struct mgcp_endpoint *endp;
 | 
			
		||||
	char *trans;
 | 
			
		||||
	char *save;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Local connection options */
 | 
			
		||||
struct mgcp_lco {
 | 
			
		||||
	char *string;
 | 
			
		||||
	char *codec;
 | 
			
		||||
	int pkt_period_min; /* time in ms */
 | 
			
		||||
	int pkt_period_max; /* time in ms */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
char *get_lco_identifier(const char *options);
 | 
			
		||||
int check_local_cx_options(void *ctx, const char *options);
 | 
			
		||||
 | 
			
		||||
struct mgcp_rtp_end;
 | 
			
		||||
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
 | 
			
		||||
			 struct mgcp_rtp_end *rtp);
 | 
			
		||||
 | 
			
		||||
uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
 | 
			
		||||
				  struct mgcp_rtp_end *rtp);
 | 
			
		||||
@@ -1,95 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Global MCGP general rate counters */
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_GENERAL_RX_MSGS_TOTAL,
 | 
			
		||||
	MGCP_GENERAL_RX_MSGS_RETRANSMITTED,
 | 
			
		||||
	MGCP_GENERAL_RX_MSGS_HANDLED,
 | 
			
		||||
	MGCP_GENERAL_RX_MSGS_UNHANDLED,
 | 
			
		||||
	MGCP_GENERAL_RX_FAIL_MSG_PARSE,
 | 
			
		||||
	MGCP_GENERAL_RX_FAIL_NO_ENDPOINT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Trunk-global MCGP CRCX related rate counters */
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_CRCX_SUCCESS,
 | 
			
		||||
	MGCP_CRCX_FAIL_BAD_ACTION,
 | 
			
		||||
	MGCP_CRCX_FAIL_UNHANDLED_PARAM,
 | 
			
		||||
	MGCP_CRCX_FAIL_MISSING_CALLID,
 | 
			
		||||
	MGCP_CRCX_FAIL_INVALID_MODE,
 | 
			
		||||
	MGCP_CRCX_FAIL_LIMIT_EXCEEDED,
 | 
			
		||||
	MGCP_CRCX_FAIL_UNKNOWN_CALLID,
 | 
			
		||||
	MGCP_CRCX_FAIL_ALLOC_CONN,
 | 
			
		||||
	MGCP_CRCX_FAIL_NO_REMOTE_CONN_DESC,
 | 
			
		||||
	MGCP_CRCX_FAIL_START_RTP,
 | 
			
		||||
	MGCP_CRCX_FAIL_REJECTED_BY_POLICY,
 | 
			
		||||
	MGCP_CRCX_FAIL_NO_OSMUX,
 | 
			
		||||
	MGCP_CRCX_FAIL_INVALID_CONN_OPTIONS,
 | 
			
		||||
	MGCP_CRCX_FAIL_CODEC_NEGOTIATION,
 | 
			
		||||
	MGCP_CRCX_FAIL_BIND_PORT,
 | 
			
		||||
	MGCP_CRCX_FAIL_AVAIL,
 | 
			
		||||
	MGCP_CRCX_FAIL_CLAIM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Trunk-global MCGP MDCX related rate counters */
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_MDCX_SUCCESS,
 | 
			
		||||
	MGCP_MDCX_FAIL_WILDCARD,
 | 
			
		||||
	MGCP_MDCX_FAIL_NO_CONN,
 | 
			
		||||
	MGCP_MDCX_FAIL_INVALID_CALLID,
 | 
			
		||||
	MGCP_MDCX_FAIL_INVALID_CONNID,
 | 
			
		||||
	MGCP_MDCX_FAIL_UNHANDLED_PARAM,
 | 
			
		||||
	MGCP_MDCX_FAIL_NO_CONNID,
 | 
			
		||||
	MGCP_MDCX_FAIL_CONN_NOT_FOUND,
 | 
			
		||||
	MGCP_MDCX_FAIL_INVALID_MODE,
 | 
			
		||||
	MGCP_MDCX_FAIL_INVALID_CONN_OPTIONS,
 | 
			
		||||
	MGCP_MDCX_FAIL_NO_REMOTE_CONN_DESC,
 | 
			
		||||
	MGCP_MDCX_FAIL_START_RTP,
 | 
			
		||||
	MGCP_MDCX_FAIL_REJECTED_BY_POLICY,
 | 
			
		||||
	MGCP_MDCX_DEFERRED_BY_POLICY,
 | 
			
		||||
	MGCP_MDCX_FAIL_AVAIL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Trunk-global MCGP DLCX related rate counters */
 | 
			
		||||
enum {
 | 
			
		||||
	MGCP_DLCX_SUCCESS,
 | 
			
		||||
	MGCP_DLCX_FAIL_WILDCARD,
 | 
			
		||||
	MGCP_DLCX_FAIL_NO_CONN,
 | 
			
		||||
	MGCP_DLCX_FAIL_INVALID_CALLID,
 | 
			
		||||
	MGCP_DLCX_FAIL_INVALID_CONNID,
 | 
			
		||||
	MGCP_DLCX_FAIL_UNHANDLED_PARAM,
 | 
			
		||||
	MGCP_DLCX_FAIL_REJECTED_BY_POLICY,
 | 
			
		||||
	MGCP_DLCX_DEFERRED_BY_POLICY,
 | 
			
		||||
	MGCP_DLCX_FAIL_AVAIL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Trunk-global E1 related counters */
 | 
			
		||||
enum {
 | 
			
		||||
        E1_I460_TRAU_RX_FAIL_CTR,
 | 
			
		||||
        E1_I460_TRAU_TX_FAIL_CTR,
 | 
			
		||||
        E1_I460_TRAU_MUX_EMPTY_CTR,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* NOTE: When adding counters, also the dump_ratectr_* routines in vty.c must be updated. */
 | 
			
		||||
 | 
			
		||||
struct mgcp_ratectr_global {
 | 
			
		||||
	/* Rate counter group which contains stats for generic MGCP events. */
 | 
			
		||||
	struct rate_ctr_group *mgcp_general_ctr_group;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_ratectr_trunk {
 | 
			
		||||
	/* Rate counter group which contains stats for processed CRCX commands. */
 | 
			
		||||
	struct rate_ctr_group *mgcp_crcx_ctr_group;
 | 
			
		||||
	/* Rate counter group which contains stats for processed MDCX commands. */
 | 
			
		||||
	struct rate_ctr_group *mgcp_mdcx_ctr_group;
 | 
			
		||||
	/* Rate counter group which contains stats for processed DLCX commands. */
 | 
			
		||||
	struct rate_ctr_group *mgcp_dlcx_ctr_group;
 | 
			
		||||
	/* Rate counter group which aggregates stats of individual RTP connections. */
 | 
			
		||||
	struct rate_ctr_group *all_rtp_conn_stats;
 | 
			
		||||
	/* Rate counter group which contains stats for E1 events (only valid for E1 trunks) */
 | 
			
		||||
	struct rate_ctr_group *e1_stats;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mgcp_ratectr_global_alloc(void *ctx, struct mgcp_ratectr_global *ratectr);
 | 
			
		||||
int mgcp_ratectr_trunk_alloc(void *ctx, struct mgcp_ratectr_trunk *ratectr);
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SDP generation and parsing
 | 
			
		||||
 *
 | 
			
		||||
 * (C) 2009-2015 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2014 by On-Waves
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
int mgcp_parse_sdp_data(const struct mgcp_endpoint *endp,
 | 
			
		||||
			struct mgcp_conn_rtp *conn,
 | 
			
		||||
			struct mgcp_parse_data *p);
 | 
			
		||||
 | 
			
		||||
int mgcp_write_response_sdp(const struct mgcp_endpoint *endp,
 | 
			
		||||
			    const struct mgcp_conn_rtp *conn, struct msgb *sdp,
 | 
			
		||||
			    const char *addr);
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
 | 
			
		||||
/* The statistics generator */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2012 by On-Waves
 | 
			
		||||
 * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
void mgcp_format_stats(char *str, size_t str_len,  struct mgcp_conn *conn);
 | 
			
		||||
 | 
			
		||||
/* Exposed for test purposes only, do not use actively */
 | 
			
		||||
void calc_loss(struct mgcp_conn_rtp *conn, uint32_t *expected, int *loss);
 | 
			
		||||
 | 
			
		||||
/* Exposed for test purposes only, do not use actively */
 | 
			
		||||
uint32_t calc_jitter(struct mgcp_rtp_state *);
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/gsm/i460_mux.h>
 | 
			
		||||
 | 
			
		||||
#define LOGPTRUNK(trunk, cat, level, fmt, args...) \
 | 
			
		||||
LOGP(cat, level, "trunk:%u " fmt, \
 | 
			
		||||
     trunk ? trunk->trunk_nr : 0, \
 | 
			
		||||
     ## args)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum mgcp_trunk_type {
 | 
			
		||||
	MGCP_TRUNK_VIRTUAL,
 | 
			
		||||
	MGCP_TRUNK_E1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_trunk {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	struct mgcp_config *cfg;
 | 
			
		||||
 | 
			
		||||
	int trunk_nr;
 | 
			
		||||
	enum mgcp_trunk_type trunk_type;
 | 
			
		||||
 | 
			
		||||
	char *audio_fmtp_extra;
 | 
			
		||||
	int audio_send_ptime;
 | 
			
		||||
	int audio_send_name;
 | 
			
		||||
 | 
			
		||||
	int no_audio_transcoding;
 | 
			
		||||
 | 
			
		||||
	int omit_rtcp;
 | 
			
		||||
	int keepalive_interval;
 | 
			
		||||
 | 
			
		||||
	/* RTP patching */
 | 
			
		||||
	int force_constant_ssrc; /* 0: don't, 1: once */
 | 
			
		||||
	int force_aligned_timing;
 | 
			
		||||
	bool rfc5993_hr_convert;
 | 
			
		||||
 | 
			
		||||
	/* spec handling */
 | 
			
		||||
	int force_realloc;
 | 
			
		||||
 | 
			
		||||
	/* timer */
 | 
			
		||||
	struct osmo_timer_list keepalive_timer;
 | 
			
		||||
 | 
			
		||||
	/* When set, incoming RTP packets are not filtered
 | 
			
		||||
	 * when ports and ip-address do not match (debug) */
 | 
			
		||||
	int rtp_accept_all;
 | 
			
		||||
 | 
			
		||||
	unsigned int number_endpoints;
 | 
			
		||||
	struct mgcp_endpoint **endpoints;
 | 
			
		||||
 | 
			
		||||
	/* global rate counters to measure the trunks overall performance and health */
 | 
			
		||||
	struct mgcp_ratectr_trunk ratectr;
 | 
			
		||||
 | 
			
		||||
	union {
 | 
			
		||||
		/* Virtual trunk specific */
 | 
			
		||||
		struct {
 | 
			
		||||
			unsigned int vty_number_endpoints;
 | 
			
		||||
		} v;
 | 
			
		||||
		/* E1 specific */
 | 
			
		||||
		struct {
 | 
			
		||||
			unsigned int vty_line_nr;
 | 
			
		||||
			bool ts_in_use[31];
 | 
			
		||||
			struct osmo_i460_timeslot i460_ts[31];
 | 
			
		||||
		} e1;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_trunk *mgcp_trunk_alloc(struct mgcp_config *cfg, enum mgcp_trunk_type ttype, int nr);
 | 
			
		||||
int mgcp_trunk_equip(struct mgcp_trunk *trunk);
 | 
			
		||||
struct mgcp_trunk *mgcp_trunk_by_num(const struct mgcp_config *cfg, enum mgcp_trunk_type ttype, int nr);
 | 
			
		||||
struct mgcp_trunk *mgcp_trunk_by_name(const struct mgcp_config *cfg, const char *epname);
 | 
			
		||||
int e1_trunk_nr_from_epname(const char *epname);
 | 
			
		||||
struct mgcp_trunk *mgcp_trunk_by_line_num(const struct mgcp_config *cfg, unsigned int num);
 | 
			
		||||
 | 
			
		||||
/* The virtual trunk is always created on trunk id 0 for historical reasons,
 | 
			
		||||
 * use this define constant as ID when allocating a virtual trunk. Other
 | 
			
		||||
 * trunks may be assigned with arbritrary id numbers */
 | 
			
		||||
#define MGCP_VIRT_TRUNK_ID 0
 | 
			
		||||
@@ -1,40 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/socket.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/netif/osmux.h>
 | 
			
		||||
struct mgcp_conn_rtp;
 | 
			
		||||
 | 
			
		||||
#define OSMUX_PORT	1984
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	OSMUX_ROLE_BSC = 0,
 | 
			
		||||
	OSMUX_ROLE_BSC_NAT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int osmux_init(int role, struct mgcp_config *cfg);
 | 
			
		||||
int osmux_enable_conn(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn,
 | 
			
		||||
		      struct osmo_sockaddr *addr, uint16_t port);
 | 
			
		||||
void conn_osmux_disable(struct mgcp_conn_rtp *conn);
 | 
			
		||||
int conn_osmux_allocate_cid(struct mgcp_conn_rtp *conn, int osmux_cid);
 | 
			
		||||
void conn_osmux_release_cid(struct mgcp_conn_rtp *conn);
 | 
			
		||||
int osmux_xfrm_to_osmux(char *buf, int buf_len, struct mgcp_conn_rtp *conn);
 | 
			
		||||
int osmux_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
 | 
			
		||||
 | 
			
		||||
void osmux_cid_pool_get(uint8_t osmux_cid);
 | 
			
		||||
int osmux_cid_pool_get_next(void);
 | 
			
		||||
void osmux_cid_pool_put(uint8_t osmux_cid);
 | 
			
		||||
bool osmux_cid_pool_allocated(uint8_t osmux_cid);
 | 
			
		||||
int osmux_cid_pool_count_used(void);
 | 
			
		||||
 | 
			
		||||
enum osmux_state {
 | 
			
		||||
	OSMUX_STATE_DISABLED = 0, /* Osmux not being currently used by endp */
 | 
			
		||||
	OSMUX_STATE_ACTIVATING,   /* Osmux was accepted in MGCP CRCX ACK. It can now be enabled by \ref osmux_enable_endpoint. */
 | 
			
		||||
	OSMUX_STATE_ENABLED,	  /* Osmux was initialized by \ref osmux_enable_endpoint and can process frames */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum osmux_usage {
 | 
			
		||||
	OSMUX_USAGE_OFF = 0,
 | 
			
		||||
	OSMUX_USAGE_ON = 1,
 | 
			
		||||
	OSMUX_USAGE_ONLY = 2,
 | 
			
		||||
};
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/vty/command.h>
 | 
			
		||||
 | 
			
		||||
enum mgcp_vty_node {
 | 
			
		||||
	MGCP_NODE = _LAST_OSMOVTY_NODE + 1,
 | 
			
		||||
	TRUNK_NODE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mgw_vty_cmd_attr {
 | 
			
		||||
	MGW_CMD_ATTR_NEWCONN = 0,
 | 
			
		||||
};
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
BUILT_SOURCES = \
 | 
			
		||||
	mgcp_common.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS = \
 | 
			
		||||
	mgcp_client_internal.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
mgcp_common.h: $(top_srcdir)/include/osmocom/mgcp/mgcp_common.h
 | 
			
		||||
	echo -e "/*\n\n   DO NOT EDIT THIS FILE!\n   THIS IS OVERWRITTEN DURING BUILD\n   This is an automatic copy of <osmocom/mgcp/mgcp_common.h>\n\n */" > mgcp_common.h
 | 
			
		||||
	cat $(top_srcdir)/include/osmocom/mgcp/mgcp_common.h >> mgcp_common.h
 | 
			
		||||
 | 
			
		||||
CLEANFILES = mgcp_common.h
 | 
			
		||||
@@ -1,167 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp_client/mgcp_common.h>
 | 
			
		||||
 | 
			
		||||
/* See also: RFC 3435, chapter 3.5 Transmission over UDP */
 | 
			
		||||
#define MGCP_CLIENT_LOCAL_ADDR_DEFAULT NULL /* INADDR(6)_ANY */
 | 
			
		||||
#define MGCP_CLIENT_LOCAL_PORT_DEFAULT 2727
 | 
			
		||||
#define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
 | 
			
		||||
#define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427
 | 
			
		||||
 | 
			
		||||
#define MGCP_CLIENT_MGW_STR "Configure MGCP connection to Media Gateway\n"
 | 
			
		||||
 | 
			
		||||
struct msgb;
 | 
			
		||||
struct vty;
 | 
			
		||||
struct mgcp_client;
 | 
			
		||||
 | 
			
		||||
struct mgcp_client_conf {
 | 
			
		||||
	const char *local_addr;
 | 
			
		||||
	int local_port;
 | 
			
		||||
	const char *remote_addr;
 | 
			
		||||
	int remote_port;
 | 
			
		||||
 | 
			
		||||
	/* By default, we are always addressing the MGW with e.g. 'rtpbridge/123@mgw'.
 | 
			
		||||
	 * If this is nonempty, the contained name will be used instead of 'mgw'. */
 | 
			
		||||
	char endpoint_domain_name[MGCP_ENDPOINT_MAXLEN];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef unsigned int mgcp_trans_id_t;
 | 
			
		||||
 | 
			
		||||
/*! Enumeration of the codec types that mgcp_client is able to handle. */
 | 
			
		||||
enum mgcp_codecs {
 | 
			
		||||
	CODEC_PCMU_8000_1 = 0,
 | 
			
		||||
	CODEC_GSM_8000_1 = 3,
 | 
			
		||||
	CODEC_PCMA_8000_1 = 8,
 | 
			
		||||
	CODEC_G729_8000_1 = 18,
 | 
			
		||||
	CODEC_GSMEFR_8000_1 = 110,
 | 
			
		||||
	CODEC_GSMHR_8000_1 = 111,
 | 
			
		||||
	CODEC_AMR_8000_1 = 112,
 | 
			
		||||
	CODEC_AMRWB_16000_1 = 113,
 | 
			
		||||
};
 | 
			
		||||
/* Note: when new codec types are added, the corresponding value strings
 | 
			
		||||
 * in mgcp_client.c (codec_table) must be updated as well. Enumerations
 | 
			
		||||
 * in enum mgcp_codecs must correspond to a valid payload type. However,
 | 
			
		||||
 * this is an internal assumption that is made to avoid lookup tables.
 | 
			
		||||
 * The API-User should not rely on this coincidence! */
 | 
			
		||||
 | 
			
		||||
extern const struct value_string osmo_mgcpc_codec_names[];
 | 
			
		||||
static inline const char *osmo_mgcpc_codec_name(enum mgcp_codecs val)
 | 
			
		||||
{ return get_value_string(osmo_mgcpc_codec_names, val); }
 | 
			
		||||
 | 
			
		||||
/*! Structure to build a payload type map to allow the defiition custom payload
 | 
			
		||||
 *  types. */
 | 
			
		||||
struct ptmap {
 | 
			
		||||
	/*! codec for which a payload type number should be defined */
 | 
			
		||||
	enum mgcp_codecs codec;
 | 
			
		||||
 | 
			
		||||
	/*! payload type number (96-127) */
 | 
			
		||||
	unsigned int pt;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_response_head {
 | 
			
		||||
	int response_code;
 | 
			
		||||
	mgcp_trans_id_t trans_id;
 | 
			
		||||
	char comment[MGCP_COMMENT_MAXLEN];
 | 
			
		||||
	char conn_id[MGCP_CONN_ID_MAXLEN];
 | 
			
		||||
	char endpoint[MGCP_ENDPOINT_MAXLEN];
 | 
			
		||||
	bool x_osmo_osmux_use;
 | 
			
		||||
	uint8_t x_osmo_osmux_cid;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_response {
 | 
			
		||||
	char *body;
 | 
			
		||||
	struct mgcp_response_head head;
 | 
			
		||||
	uint16_t audio_port;
 | 
			
		||||
	char audio_ip[INET6_ADDRSTRLEN];
 | 
			
		||||
	unsigned int ptime;
 | 
			
		||||
	enum mgcp_codecs codecs[MGCP_MAX_CODECS];
 | 
			
		||||
	unsigned int codecs_len;
 | 
			
		||||
	struct ptmap ptmap[MGCP_MAX_CODECS];
 | 
			
		||||
	unsigned int ptmap_len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mgcp_verb {
 | 
			
		||||
	MGCP_VERB_CRCX,
 | 
			
		||||
	MGCP_VERB_MDCX,
 | 
			
		||||
	MGCP_VERB_DLCX,
 | 
			
		||||
	MGCP_VERB_AUEP,
 | 
			
		||||
	MGCP_VERB_RSIP,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MGCP_MSG_PRESENCE_ENDPOINT	0x0001
 | 
			
		||||
#define MGCP_MSG_PRESENCE_CALL_ID	0x0002
 | 
			
		||||
#define MGCP_MSG_PRESENCE_CONN_ID	0x0004
 | 
			
		||||
#define MGCP_MSG_PRESENCE_AUDIO_IP	0x0008
 | 
			
		||||
#define MGCP_MSG_PRESENCE_AUDIO_PORT	0x0010
 | 
			
		||||
#define MGCP_MSG_PRESENCE_CONN_MODE	0x0020
 | 
			
		||||
#define MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID 0x4000
 | 
			
		||||
#define MGCP_MSG_PRESENCE_X_OSMO_IGN	0x8000
 | 
			
		||||
 | 
			
		||||
struct mgcp_msg {
 | 
			
		||||
	enum mgcp_verb verb;
 | 
			
		||||
	/* See MGCP_MSG_PRESENCE_* constants */
 | 
			
		||||
	uint32_t presence;
 | 
			
		||||
	char endpoint[MGCP_ENDPOINT_MAXLEN];
 | 
			
		||||
	unsigned int call_id;
 | 
			
		||||
	char *conn_id;
 | 
			
		||||
	uint16_t audio_port;
 | 
			
		||||
	char *audio_ip;
 | 
			
		||||
	enum mgcp_connection_mode conn_mode;
 | 
			
		||||
	unsigned int ptime;
 | 
			
		||||
	enum mgcp_codecs codecs[MGCP_MAX_CODECS];
 | 
			
		||||
	unsigned int codecs_len;
 | 
			
		||||
	struct ptmap ptmap[MGCP_MAX_CODECS];
 | 
			
		||||
	unsigned int ptmap_len;
 | 
			
		||||
	uint32_t x_osmo_ign;
 | 
			
		||||
	bool x_osmo_osmux_use;
 | 
			
		||||
	int x_osmo_osmux_cid; /* -1 is wildcard */
 | 
			
		||||
	bool param_present;
 | 
			
		||||
	struct mgcp_codec_param param;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void mgcp_client_conf_init(struct mgcp_client_conf *conf);
 | 
			
		||||
void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
 | 
			
		||||
int mgcp_client_config_write(struct vty *vty, const char *indent);
 | 
			
		||||
struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
 | 
			
		||||
 | 
			
		||||
struct mgcp_client *mgcp_client_init(void *ctx,
 | 
			
		||||
				     struct mgcp_client_conf *conf);
 | 
			
		||||
int mgcp_client_connect(struct mgcp_client *mgcp);
 | 
			
		||||
 | 
			
		||||
const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
 | 
			
		||||
uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
 | 
			
		||||
uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp) OSMO_DEPRECATED("deprecated, returns 0");
 | 
			
		||||
 | 
			
		||||
const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp);
 | 
			
		||||
const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp);
 | 
			
		||||
const char *mgcp_client_e1_epname(void *ctx, const struct mgcp_client *mgcp, uint8_t trunk_id, uint8_t ts,
 | 
			
		||||
				  uint8_t rate, uint8_t offset);
 | 
			
		||||
 | 
			
		||||
/* Invoked when an MGCP response is received or sending failed.  When the
 | 
			
		||||
 * response is passed as NULL, this indicates failure during transmission. */
 | 
			
		||||
typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
 | 
			
		||||
int mgcp_response_parse_params(struct mgcp_response *r);
 | 
			
		||||
 | 
			
		||||
int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
 | 
			
		||||
		   mgcp_response_cb_t response_cb, void *priv);
 | 
			
		||||
int mgcp_client_cancel(struct mgcp_client *mgcp, mgcp_trans_id_t trans_id);
 | 
			
		||||
 | 
			
		||||
enum mgcp_connection_mode;
 | 
			
		||||
 | 
			
		||||
struct msgb *mgcp_msg_gen(struct mgcp_client *mgcp, struct mgcp_msg *mgcp_msg);
 | 
			
		||||
mgcp_trans_id_t mgcp_msg_trans_id(struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
extern const struct value_string mgcp_client_connection_mode_strs[];
 | 
			
		||||
static inline const char *mgcp_client_cmode_name(enum mgcp_connection_mode mode)
 | 
			
		||||
{
 | 
			
		||||
	return get_value_string(mgcp_client_connection_mode_strs, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum mgcp_codecs map_str_to_codec(const char *str);
 | 
			
		||||
unsigned int map_codec_to_pt(const struct ptmap *ptmap, unsigned int ptmap_len,
 | 
			
		||||
			     enum mgcp_codecs codec);
 | 
			
		||||
enum mgcp_codecs map_pt_to_codec(struct ptmap *ptmap, unsigned int ptmap_len,
 | 
			
		||||
				 unsigned int pt);
 | 
			
		||||
@@ -1,51 +0,0 @@
 | 
			
		||||
/* FSM to manage multiple connections of an MGW endpoint */
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp_client/mgcp_client_fsm.h>
 | 
			
		||||
 | 
			
		||||
#define LOG_MGCPC_EP(ep, level, fmt, args...) do { \
 | 
			
		||||
	LOGPFSML(ep->fi, level, "%s " fmt, \
 | 
			
		||||
		 osmo_mgcpc_ep_name(ep), ## args); \
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
struct osmo_mgcpc_ep;
 | 
			
		||||
struct osmo_mgcpc_ep_ci;
 | 
			
		||||
struct osmo_tdef;
 | 
			
		||||
 | 
			
		||||
struct osmo_mgcpc_ep *osmo_mgcpc_ep_alloc(struct osmo_fsm_inst *parent, uint32_t parent_term_event,
 | 
			
		||||
					  struct mgcp_client *mgcp_client,
 | 
			
		||||
					  const struct osmo_tdef *T_defs,
 | 
			
		||||
					  const char *fsm_id,
 | 
			
		||||
					  const char *endpoint_str_fmt, ...);
 | 
			
		||||
 | 
			
		||||
struct osmo_mgcpc_ep_ci *osmo_mgcpc_ep_ci_add(struct osmo_mgcpc_ep *ep, const char *label_fmt, ...);
 | 
			
		||||
const struct mgcp_conn_peer *osmo_mgcpc_ep_ci_get_rtp_info(const struct osmo_mgcpc_ep_ci *ci);
 | 
			
		||||
bool osmo_mgcpc_ep_ci_get_crcx_info_to_sockaddr(const struct osmo_mgcpc_ep_ci *ci, struct sockaddr_storage *dest);
 | 
			
		||||
bool osmo_mgcpc_ep_ci_get_crcx_info_to_osmux_cid(const struct osmo_mgcpc_ep_ci *ci, uint8_t* cid);
 | 
			
		||||
 | 
			
		||||
void osmo_mgcpc_ep_ci_request(struct osmo_mgcpc_ep_ci *ci,
 | 
			
		||||
			      enum mgcp_verb verb, const struct mgcp_conn_peer *verb_info,
 | 
			
		||||
			      struct osmo_fsm_inst *notify,
 | 
			
		||||
			      uint32_t event_success, uint32_t event_failure,
 | 
			
		||||
			      void *notify_data);
 | 
			
		||||
 | 
			
		||||
void osmo_mgcpc_ep_cancel_notify(struct osmo_mgcpc_ep *ep, struct osmo_fsm_inst *notify);
 | 
			
		||||
struct osmo_mgcpc_ep *osmo_mgcpc_ep_ci_ep(struct osmo_mgcpc_ep_ci *ci);
 | 
			
		||||
 | 
			
		||||
/*! Dispatch a DLCX for the given connection.
 | 
			
		||||
 * \param ci  Connection identifier as obtained from osmo_mgcpc_ep_ci_add().
 | 
			
		||||
 */
 | 
			
		||||
static inline void osmo_mgcpc_ep_ci_dlcx(struct osmo_mgcpc_ep_ci *ci)
 | 
			
		||||
{
 | 
			
		||||
	osmo_mgcpc_ep_ci_request(ci, MGCP_VERB_DLCX, NULL, NULL, 0, 0, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void osmo_mgcpc_ep_clear(struct osmo_mgcpc_ep *ep);
 | 
			
		||||
 | 
			
		||||
const char *osmo_mgcpc_ep_name(const struct osmo_mgcpc_ep *ep);
 | 
			
		||||
const char *osmo_mgcpc_ep_ci_name(const struct osmo_mgcpc_ep_ci *ci);
 | 
			
		||||
const char *osmo_mgcpc_ep_ci_id(const struct osmo_mgcpc_ep_ci *ci);
 | 
			
		||||
 | 
			
		||||
extern const struct value_string osmo_mgcp_verb_names[];
 | 
			
		||||
static inline const char *osmo_mgcp_verb_name(enum mgcp_verb val)
 | 
			
		||||
{ return get_value_string(osmo_mgcp_verb_names, val); }
 | 
			
		||||
@@ -1,73 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/mgcp_client/mgcp_common.h>
 | 
			
		||||
#include <osmocom/mgcp_client/mgcp_client.h>
 | 
			
		||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
 | 
			
		||||
 | 
			
		||||
/*! This struct organizes the connection infromation one connection side
 | 
			
		||||
 *  (either remote or local). It is used to pass parameters (local) to the FSM
 | 
			
		||||
 *  and get responses (remote) from the FSM as pointer attached to the FSM
 | 
			
		||||
 *  event.
 | 
			
		||||
 *
 | 
			
		||||
 *  When modifiying a connection, the endpoint and call_id members may be left
 | 
			
		||||
 *  unpopulated. The call_id field is ignored in this case. If an endpoint
 | 
			
		||||
 *  identifier is supplied it is checked against the internal state to make
 | 
			
		||||
 *  sure it is correct. */
 | 
			
		||||
struct mgcp_conn_peer {
 | 
			
		||||
	/*! RTP connection IP-Address (optional, string e.g. "127.0.0.1") */
 | 
			
		||||
	char addr[INET6_ADDRSTRLEN];
 | 
			
		||||
 | 
			
		||||
	/*! RTP connection IP-Port (optional)  */
 | 
			
		||||
	uint16_t port;
 | 
			
		||||
 | 
			
		||||
	/*! RTP endpoint */
 | 
			
		||||
	char endpoint[MGCP_ENDPOINT_MAXLEN];
 | 
			
		||||
 | 
			
		||||
	/*! CALL ID (unique per connection) */
 | 
			
		||||
	unsigned int call_id;
 | 
			
		||||
 | 
			
		||||
	/*! RTP packetization interval (optional) */
 | 
			
		||||
	unsigned int ptime;
 | 
			
		||||
 | 
			
		||||
	/*! RTP codec list (optional) */
 | 
			
		||||
	enum mgcp_codecs codecs[MGCP_MAX_CODECS];
 | 
			
		||||
 | 
			
		||||
	/*! Number of codecs in RTP codec list (optional) */
 | 
			
		||||
	unsigned int codecs_len;
 | 
			
		||||
 | 
			
		||||
	/*! RTP payload type map (optional, only needed when payload types are
 | 
			
		||||
	 * used that differ from what IANA/3GPP defines) */
 | 
			
		||||
	struct ptmap ptmap[MGCP_MAX_CODECS];
 | 
			
		||||
 | 
			
		||||
	/*! RTP payload type map length (optional, only needed when payload
 | 
			
		||||
	 * types are used that differ from what IANA/3GPP defines) */
 | 
			
		||||
	unsigned int ptmap_len;
 | 
			
		||||
 | 
			
		||||
	/*! If nonzero, send 'X-Osmo-IGN:' header. This is useful e.g. for SCCPlite MSCs where the MSC is
 | 
			
		||||
	 * known to issue incoherent or unknown CallIDs / to issue CRCX commands with a different domain
 | 
			
		||||
	 * name than the BSC. An OsmoMGW will then ignore these and not fail on mismatches. */
 | 
			
		||||
	uint32_t x_osmo_ign;
 | 
			
		||||
 | 
			
		||||
	/*! send 'X-Osmux: %d' header (or "*" as wildcard). */
 | 
			
		||||
	bool x_osmo_osmux_use;
 | 
			
		||||
	/*! -1 means send wildcard. */
 | 
			
		||||
	int x_osmo_osmux_cid;
 | 
			
		||||
 | 
			
		||||
	/*! If left MGCP_CONN_NONE, use MGCP_CONN_RECV_ONLY or MGCP_CONN_RECV_SEND, depending on whether an audio RTP
 | 
			
		||||
	 * address is set. If != MGCP_CONN_NONE, force this conn mode. */
 | 
			
		||||
	enum mgcp_connection_mode conn_mode;
 | 
			
		||||
 | 
			
		||||
	/*! If the codec requires additional format parameters (fmtp), those cann be set here, see also
 | 
			
		||||
	 * mgcp_common.h */
 | 
			
		||||
	bool param_present;
 | 
			
		||||
	struct mgcp_codec_param param;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct osmo_fsm_inst *mgcp_conn_create(struct mgcp_client *mgcp, struct osmo_fsm_inst *parent_fi, uint32_t parent_term_evt,
 | 
			
		||||
				       uint32_t parent_evt, struct mgcp_conn_peer *conn_peer);
 | 
			
		||||
int mgcp_conn_modify(struct osmo_fsm_inst *fi, uint32_t parent_evt, struct mgcp_conn_peer *conn_peer);
 | 
			
		||||
void mgcp_conn_delete(struct osmo_fsm_inst *fi);
 | 
			
		||||
 | 
			
		||||
const char *mgcp_conn_get_ci(struct osmo_fsm_inst *fi);
 | 
			
		||||
 | 
			
		||||
const char *osmo_mgcpc_conn_peer_name(const struct mgcp_conn_peer *info);
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <osmocom/core/write_queue.h>
 | 
			
		||||
 | 
			
		||||
#define MSGB_CB_MGCP_TRANS_ID 0
 | 
			
		||||
 | 
			
		||||
struct mgcp_client {
 | 
			
		||||
	struct mgcp_client_conf actual;
 | 
			
		||||
	struct osmo_wqueue wq;
 | 
			
		||||
	mgcp_trans_id_t next_trans_id;
 | 
			
		||||
	struct llist_head responses_pending;
 | 
			
		||||
	struct llist_head inuse_endpoints;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_inuse_endpoint {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
	uint16_t id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mgcp_response_pending {
 | 
			
		||||
	struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	mgcp_trans_id_t trans_id;
 | 
			
		||||
	mgcp_response_cb_t response_cb;
 | 
			
		||||
	void *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mgcp_client_rx(struct mgcp_client *mgcp, struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
struct mgcp_response_pending * mgcp_client_pending_add(
 | 
			
		||||
					struct mgcp_client *mgcp,
 | 
			
		||||
					mgcp_trans_id_t trans_id,
 | 
			
		||||
					mgcp_response_cb_t response_cb,
 | 
			
		||||
					void *priv);
 | 
			
		||||
							
								
								
									
										25
									
								
								libosmocore/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								libosmocore/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
.deps
 | 
			
		||||
.libs
 | 
			
		||||
*.o
 | 
			
		||||
*.lo
 | 
			
		||||
*.la
 | 
			
		||||
*.pc
 | 
			
		||||
aclocal.m4
 | 
			
		||||
autom4te.cache
 | 
			
		||||
config.h*
 | 
			
		||||
config.sub
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
config.guess
 | 
			
		||||
configure
 | 
			
		||||
depcomp
 | 
			
		||||
missing
 | 
			
		||||
ltmain.sh
 | 
			
		||||
install-sh
 | 
			
		||||
stamp-h1
 | 
			
		||||
libtool
 | 
			
		||||
 | 
			
		||||
.tarball-version
 | 
			
		||||
.version
 | 
			
		||||
							
								
								
									
										339
									
								
								libosmocore/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								libosmocore/COPYING
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,339 @@
 | 
			
		||||
		    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
		       Version 2, June 1991
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 | 
			
		||||
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
			
		||||
 of this license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
			    Preamble
 | 
			
		||||
 | 
			
		||||
  The licenses for most software are designed to take away your
 | 
			
		||||
freedom to share and change it.  By contrast, the GNU General Public
 | 
			
		||||
License is intended to guarantee your freedom to share and change free
 | 
			
		||||
software--to make sure the software is free for all its users.  This
 | 
			
		||||
General Public License applies to most of the Free Software
 | 
			
		||||
Foundation's software and to any other program whose authors commit to
 | 
			
		||||
using it.  (Some other Free Software Foundation software is covered by
 | 
			
		||||
the GNU Lesser General Public License instead.)  You can apply it to
 | 
			
		||||
your programs, too.
 | 
			
		||||
 | 
			
		||||
  When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price.  Our General Public Licenses are designed to make sure that you
 | 
			
		||||
have the freedom to distribute copies of free software (and charge for
 | 
			
		||||
this service if you wish), that you receive source code or can get it
 | 
			
		||||
if you want it, that you can change the software or use pieces of it
 | 
			
		||||
in new free programs; and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
  To protect your rights, we need to make restrictions that forbid
 | 
			
		||||
anyone to deny you these rights or to ask you to surrender the rights.
 | 
			
		||||
These restrictions translate to certain responsibilities for you if you
 | 
			
		||||
distribute copies of the software, or if you modify it.
 | 
			
		||||
 | 
			
		||||
  For example, if you distribute copies of such a program, whether
 | 
			
		||||
gratis or for a fee, you must give the recipients all the rights that
 | 
			
		||||
you have.  You must make sure that they, too, receive or can get the
 | 
			
		||||
source code.  And you must show them these terms so they know their
 | 
			
		||||
rights.
 | 
			
		||||
 | 
			
		||||
  We protect your rights with two steps: (1) copyright the software, and
 | 
			
		||||
(2) offer you this license which gives you legal permission to copy,
 | 
			
		||||
distribute and/or modify the software.
 | 
			
		||||
 | 
			
		||||
  Also, for each author's protection and ours, we want to make certain
 | 
			
		||||
that everyone understands that there is no warranty for this free
 | 
			
		||||
software.  If the software is modified by someone else and passed on, we
 | 
			
		||||
want its recipients to know that what they have is not the original, so
 | 
			
		||||
that any problems introduced by others will not reflect on the original
 | 
			
		||||
authors' reputations.
 | 
			
		||||
 | 
			
		||||
  Finally, any free program is threatened constantly by software
 | 
			
		||||
patents.  We wish to avoid the danger that redistributors of a free
 | 
			
		||||
program will individually obtain patent licenses, in effect making the
 | 
			
		||||
program proprietary.  To prevent this, we have made it clear that any
 | 
			
		||||
patent must be licensed for everyone's free use or not licensed at all.
 | 
			
		||||
 | 
			
		||||
  The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
 | 
			
		||||
		    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
			
		||||
 | 
			
		||||
  0. This License applies to any program or other work which contains
 | 
			
		||||
a notice placed by the copyright holder saying it may be distributed
 | 
			
		||||
under the terms of this General Public License.  The "Program", below,
 | 
			
		||||
refers to any such program or work, and a "work based on the Program"
 | 
			
		||||
means either the Program or any derivative work under copyright law:
 | 
			
		||||
that is to say, a work containing the Program or a portion of it,
 | 
			
		||||
either verbatim or with modifications and/or translated into another
 | 
			
		||||
language.  (Hereinafter, translation is included without limitation in
 | 
			
		||||
the term "modification".)  Each licensee is addressed as "you".
 | 
			
		||||
 | 
			
		||||
Activities other than copying, distribution and modification are not
 | 
			
		||||
covered by this License; they are outside its scope.  The act of
 | 
			
		||||
running the Program is not restricted, and the output from the Program
 | 
			
		||||
is covered only if its contents constitute a work based on the
 | 
			
		||||
Program (independent of having been made by running the Program).
 | 
			
		||||
Whether that is true depends on what the Program does.
 | 
			
		||||
 | 
			
		||||
  1. You may copy and distribute verbatim copies of the Program's
 | 
			
		||||
source code as you receive it, in any medium, provided that you
 | 
			
		||||
conspicuously and appropriately publish on each copy an appropriate
 | 
			
		||||
copyright notice and disclaimer of warranty; keep intact all the
 | 
			
		||||
notices that refer to this License and to the absence of any warranty;
 | 
			
		||||
and give any other recipients of the Program a copy of this License
 | 
			
		||||
along with the Program.
 | 
			
		||||
 | 
			
		||||
You may charge a fee for the physical act of transferring a copy, and
 | 
			
		||||
you may at your option offer warranty protection in exchange for a fee.
 | 
			
		||||
 | 
			
		||||
  2. You may modify your copy or copies of the Program or any portion
 | 
			
		||||
of it, thus forming a work based on the Program, and copy and
 | 
			
		||||
distribute such modifications or work under the terms of Section 1
 | 
			
		||||
above, provided that you also meet all of these conditions:
 | 
			
		||||
 | 
			
		||||
    a) You must cause the modified files to carry prominent notices
 | 
			
		||||
    stating that you changed the files and the date of any change.
 | 
			
		||||
 | 
			
		||||
    b) You must cause any work that you distribute or publish, that in
 | 
			
		||||
    whole or in part contains or is derived from the Program or any
 | 
			
		||||
    part thereof, to be licensed as a whole at no charge to all third
 | 
			
		||||
    parties under the terms of this License.
 | 
			
		||||
 | 
			
		||||
    c) If the modified program normally reads commands interactively
 | 
			
		||||
    when run, you must cause it, when started running for such
 | 
			
		||||
    interactive use in the most ordinary way, to print or display an
 | 
			
		||||
    announcement including an appropriate copyright notice and a
 | 
			
		||||
    notice that there is no warranty (or else, saying that you provide
 | 
			
		||||
    a warranty) and that users may redistribute the program under
 | 
			
		||||
    these conditions, and telling the user how to view a copy of this
 | 
			
		||||
    License.  (Exception: if the Program itself is interactive but
 | 
			
		||||
    does not normally print such an announcement, your work based on
 | 
			
		||||
    the Program is not required to print an announcement.)
 | 
			
		||||
 | 
			
		||||
These requirements apply to the modified work as a whole.  If
 | 
			
		||||
identifiable sections of that work are not derived from the Program,
 | 
			
		||||
and can be reasonably considered independent and separate works in
 | 
			
		||||
themselves, then this License, and its terms, do not apply to those
 | 
			
		||||
sections when you distribute them as separate works.  But when you
 | 
			
		||||
distribute the same sections as part of a whole which is a work based
 | 
			
		||||
on the Program, the distribution of the whole must be on the terms of
 | 
			
		||||
this License, whose permissions for other licensees extend to the
 | 
			
		||||
entire whole, and thus to each and every part regardless of who wrote it.
 | 
			
		||||
 | 
			
		||||
Thus, it is not the intent of this section to claim rights or contest
 | 
			
		||||
your rights to work written entirely by you; rather, the intent is to
 | 
			
		||||
exercise the right to control the distribution of derivative or
 | 
			
		||||
collective works based on the Program.
 | 
			
		||||
 | 
			
		||||
In addition, mere aggregation of another work not based on the Program
 | 
			
		||||
with the Program (or with a work based on the Program) on a volume of
 | 
			
		||||
a storage or distribution medium does not bring the other work under
 | 
			
		||||
the scope of this License.
 | 
			
		||||
 | 
			
		||||
  3. You may copy and distribute the Program (or a work based on it,
 | 
			
		||||
under Section 2) in object code or executable form under the terms of
 | 
			
		||||
Sections 1 and 2 above provided that you also do one of the following:
 | 
			
		||||
 | 
			
		||||
    a) Accompany it with the complete corresponding machine-readable
 | 
			
		||||
    source code, which must be distributed under the terms of Sections
 | 
			
		||||
    1 and 2 above on a medium customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
    b) Accompany it with a written offer, valid for at least three
 | 
			
		||||
    years, to give any third party, for a charge no more than your
 | 
			
		||||
    cost of physically performing source distribution, a complete
 | 
			
		||||
    machine-readable copy of the corresponding source code, to be
 | 
			
		||||
    distributed under the terms of Sections 1 and 2 above on a medium
 | 
			
		||||
    customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
    c) Accompany it with the information you received as to the offer
 | 
			
		||||
    to distribute corresponding source code.  (This alternative is
 | 
			
		||||
    allowed only for noncommercial distribution and only if you
 | 
			
		||||
    received the program in object code or executable form with such
 | 
			
		||||
    an offer, in accord with Subsection b above.)
 | 
			
		||||
 | 
			
		||||
The source code for a work means the preferred form of the work for
 | 
			
		||||
making modifications to it.  For an executable work, complete source
 | 
			
		||||
code means all the source code for all modules it contains, plus any
 | 
			
		||||
associated interface definition files, plus the scripts used to
 | 
			
		||||
control compilation and installation of the executable.  However, as a
 | 
			
		||||
special exception, the source code distributed need not include
 | 
			
		||||
anything that is normally distributed (in either source or binary
 | 
			
		||||
form) with the major components (compiler, kernel, and so on) of the
 | 
			
		||||
operating system on which the executable runs, unless that component
 | 
			
		||||
itself accompanies the executable.
 | 
			
		||||
 | 
			
		||||
If distribution of executable or object code is made by offering
 | 
			
		||||
access to copy from a designated place, then offering equivalent
 | 
			
		||||
access to copy the source code from the same place counts as
 | 
			
		||||
distribution of the source code, even though third parties are not
 | 
			
		||||
compelled to copy the source along with the object code.
 | 
			
		||||
 | 
			
		||||
  4. You may not copy, modify, sublicense, or distribute the Program
 | 
			
		||||
except as expressly provided under this License.  Any attempt
 | 
			
		||||
otherwise to copy, modify, sublicense or distribute the Program is
 | 
			
		||||
void, and will automatically terminate your rights under this License.
 | 
			
		||||
However, parties who have received copies, or rights, from you under
 | 
			
		||||
this License will not have their licenses terminated so long as such
 | 
			
		||||
parties remain in full compliance.
 | 
			
		||||
 | 
			
		||||
  5. You are not required to accept this License, since you have not
 | 
			
		||||
signed it.  However, nothing else grants you permission to modify or
 | 
			
		||||
distribute the Program or its derivative works.  These actions are
 | 
			
		||||
prohibited by law if you do not accept this License.  Therefore, by
 | 
			
		||||
modifying or distributing the Program (or any work based on the
 | 
			
		||||
Program), you indicate your acceptance of this License to do so, and
 | 
			
		||||
all its terms and conditions for copying, distributing or modifying
 | 
			
		||||
the Program or works based on it.
 | 
			
		||||
 | 
			
		||||
  6. Each time you redistribute the Program (or any work based on the
 | 
			
		||||
Program), the recipient automatically receives a license from the
 | 
			
		||||
original licensor to copy, distribute or modify the Program subject to
 | 
			
		||||
these terms and conditions.  You may not impose any further
 | 
			
		||||
restrictions on the recipients' exercise of the rights granted herein.
 | 
			
		||||
You are not responsible for enforcing compliance by third parties to
 | 
			
		||||
this License.
 | 
			
		||||
 | 
			
		||||
  7. If, as a consequence of a court judgment or allegation of patent
 | 
			
		||||
infringement or for any other reason (not limited to patent issues),
 | 
			
		||||
conditions are imposed on you (whether by court order, agreement or
 | 
			
		||||
otherwise) that contradict the conditions of this License, they do not
 | 
			
		||||
excuse you from the conditions of this License.  If you cannot
 | 
			
		||||
distribute so as to satisfy simultaneously your obligations under this
 | 
			
		||||
License and any other pertinent obligations, then as a consequence you
 | 
			
		||||
may not distribute the Program at all.  For example, if a patent
 | 
			
		||||
license would not permit royalty-free redistribution of the Program by
 | 
			
		||||
all those who receive copies directly or indirectly through you, then
 | 
			
		||||
the only way you could satisfy both it and this License would be to
 | 
			
		||||
refrain entirely from distribution of the Program.
 | 
			
		||||
 | 
			
		||||
If any portion of this section is held invalid or unenforceable under
 | 
			
		||||
any particular circumstance, the balance of the section is intended to
 | 
			
		||||
apply and the section as a whole is intended to apply in other
 | 
			
		||||
circumstances.
 | 
			
		||||
 | 
			
		||||
It is not the purpose of this section to induce you to infringe any
 | 
			
		||||
patents or other property right claims or to contest validity of any
 | 
			
		||||
such claims; this section has the sole purpose of protecting the
 | 
			
		||||
integrity of the free software distribution system, which is
 | 
			
		||||
implemented by public license practices.  Many people have made
 | 
			
		||||
generous contributions to the wide range of software distributed
 | 
			
		||||
through that system in reliance on consistent application of that
 | 
			
		||||
system; it is up to the author/donor to decide if he or she is willing
 | 
			
		||||
to distribute software through any other system and a licensee cannot
 | 
			
		||||
impose that choice.
 | 
			
		||||
 | 
			
		||||
This section is intended to make thoroughly clear what is believed to
 | 
			
		||||
be a consequence of the rest of this License.
 | 
			
		||||
 | 
			
		||||
  8. If the distribution and/or use of the Program is restricted in
 | 
			
		||||
certain countries either by patents or by copyrighted interfaces, the
 | 
			
		||||
original copyright holder who places the Program under this License
 | 
			
		||||
may add an explicit geographical distribution limitation excluding
 | 
			
		||||
those countries, so that distribution is permitted only in or among
 | 
			
		||||
countries not thus excluded.  In such case, this License incorporates
 | 
			
		||||
the limitation as if written in the body of this License.
 | 
			
		||||
 | 
			
		||||
  9. The Free Software Foundation may publish revised and/or new versions
 | 
			
		||||
of the General Public License from time to time.  Such new versions will
 | 
			
		||||
be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
Each version is given a distinguishing version number.  If the Program
 | 
			
		||||
specifies a version number of this License which applies to it and "any
 | 
			
		||||
later version", you have the option of following the terms and conditions
 | 
			
		||||
either of that version or of any later version published by the Free
 | 
			
		||||
Software Foundation.  If the Program does not specify a version number of
 | 
			
		||||
this License, you may choose any version ever published by the Free Software
 | 
			
		||||
Foundation.
 | 
			
		||||
 | 
			
		||||
  10. If you wish to incorporate parts of the Program into other free
 | 
			
		||||
programs whose distribution conditions are different, write to the author
 | 
			
		||||
to ask for permission.  For software which is copyrighted by the Free
 | 
			
		||||
Software Foundation, write to the Free Software Foundation; we sometimes
 | 
			
		||||
make exceptions for this.  Our decision will be guided by the two goals
 | 
			
		||||
of preserving the free status of all derivatives of our free software and
 | 
			
		||||
of promoting the sharing and reuse of software generally.
 | 
			
		||||
 | 
			
		||||
			    NO WARRANTY
 | 
			
		||||
 | 
			
		||||
  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 | 
			
		||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 | 
			
		||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 | 
			
		||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 | 
			
		||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
 | 
			
		||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 | 
			
		||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 | 
			
		||||
REPAIR OR CORRECTION.
 | 
			
		||||
 | 
			
		||||
  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 | 
			
		||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
			
		||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 | 
			
		||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 | 
			
		||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 | 
			
		||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 | 
			
		||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 | 
			
		||||
POSSIBILITY OF SUCH DAMAGES.
 | 
			
		||||
 | 
			
		||||
		     END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
	    How to Apply These Terms to Your New Programs
 | 
			
		||||
 | 
			
		||||
  If you develop a new program, and you want it to be of the greatest
 | 
			
		||||
possible use to the public, the best way to achieve this is to make it
 | 
			
		||||
free software which everyone can redistribute and change under these terms.
 | 
			
		||||
 | 
			
		||||
  To do so, attach the following notices to the program.  It is safest
 | 
			
		||||
to attach them to the start of each source file to most effectively
 | 
			
		||||
convey the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper mail.
 | 
			
		||||
 | 
			
		||||
If the program is interactive, make it output a short notice like this
 | 
			
		||||
when it starts in an interactive mode:
 | 
			
		||||
 | 
			
		||||
    Gnomovision version 69, Copyright (C) year name of author
 | 
			
		||||
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
			
		||||
    This is free software, and you are welcome to redistribute it
 | 
			
		||||
    under certain conditions; type `show c' for details.
 | 
			
		||||
 | 
			
		||||
The hypothetical commands `show w' and `show c' should show the appropriate
 | 
			
		||||
parts of the General Public License.  Of course, the commands you use may
 | 
			
		||||
be called something other than `show w' and `show c'; they could even be
 | 
			
		||||
mouse-clicks or menu items--whatever suits your program.
 | 
			
		||||
 | 
			
		||||
You should also get your employer (if you work as a programmer) or your
 | 
			
		||||
school, if any, to sign a "copyright disclaimer" for the program, if
 | 
			
		||||
necessary.  Here is a sample; alter the names:
 | 
			
		||||
 | 
			
		||||
  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 | 
			
		||||
  `Gnomovision' (which makes passes at compilers) written by James Hacker.
 | 
			
		||||
 | 
			
		||||
  <signature of Ty Coon>, 1 April 1989
 | 
			
		||||
  Ty Coon, President of Vice
 | 
			
		||||
 | 
			
		||||
This General Public License does not permit incorporating your program into
 | 
			
		||||
proprietary programs.  If your program is a subroutine library, you may
 | 
			
		||||
consider it more useful to permit linking proprietary applications with the
 | 
			
		||||
library.  If this is what you want to do, use the GNU Lesser General
 | 
			
		||||
Public License instead of this License.
 | 
			
		||||
							
								
								
									
										14
									
								
								libosmocore/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								libosmocore/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 | 
			
		||||
ACLOCAL_AMFLAGS = -I m4
 | 
			
		||||
 | 
			
		||||
INCLUDES = $(all_includes) -I$(top_srcdir)/include
 | 
			
		||||
SUBDIRS = include src tests
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = libosmocore.pc
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES = $(top_srcdir)/.version
 | 
			
		||||
$(top_srcdir)/.version:
 | 
			
		||||
	echo $(VERSION) > $@-t && mv $@-t $@
 | 
			
		||||
dist-hook:
 | 
			
		||||
	echo $(VERSION) > $(distdir)/.tarball-version
 | 
			
		||||
							
								
								
									
										56
									
								
								libosmocore/configure.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								libosmocore/configure.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
AC_INIT([libosmocore],
 | 
			
		||||
	m4_esyscmd([./git-version-gen .tarball-version]),
 | 
			
		||||
	[openbsc-devel@lists.openbsc.org])
 | 
			
		||||
 | 
			
		||||
AM_INIT_AUTOMAKE([dist-bzip2])
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
LT_INIT
 | 
			
		||||
AC_PROG_LIBTOOL
 | 
			
		||||
 | 
			
		||||
AC_CONFIG_MACRO_DIR([m4])
 | 
			
		||||
 | 
			
		||||
dnl checks for header files
 | 
			
		||||
AC_HEADER_STDC
 | 
			
		||||
AC_CHECK_HEADERS(execinfo.h sys/select.h)
 | 
			
		||||
 | 
			
		||||
# 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(config.h)
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(talloc,
 | 
			
		||||
	[  --disable-talloc Disable building talloc memory allocator ],
 | 
			
		||||
	[enable_talloc=0], [enable_talloc=1])
 | 
			
		||||
AM_CONDITIONAL(ENABLE_TALLOC, test "x$enable_talloc" = "x1")
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(tests,
 | 
			
		||||
	[  --disable-tests Disable building test programs ],
 | 
			
		||||
	[enable_tests=0], [enable_tests=1])
 | 
			
		||||
AM_CONDITIONAL(ENABLE_TESTS, test "x$enable_tests" = "x1")
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT(
 | 
			
		||||
	libosmocore.pc
 | 
			
		||||
	include/osmocore/Makefile
 | 
			
		||||
	include/osmocore/protocol/Makefile
 | 
			
		||||
	include/Makefile
 | 
			
		||||
	src/Makefile
 | 
			
		||||
	tests/Makefile
 | 
			
		||||
	tests/timer/Makefile
 | 
			
		||||
	tests/sms/Makefile
 | 
			
		||||
	Makefile)
 | 
			
		||||
							
								
								
									
										1
									
								
								libosmocore/include/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libosmocore/include/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
SUBDIRS = osmocore
 | 
			
		||||
							
								
								
									
										12
									
								
								libosmocore/include/osmocore/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								libosmocore/include/osmocore/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
osmocore_HEADERS = signal.h linuxlist.h timer.h select.h msgb.h \
 | 
			
		||||
		   tlv.h bitvec.h comp128.h statistics.h gsm_utils.h utils.h \
 | 
			
		||||
		   gsmtap.h write_queue.h rsl.h gsm48.h rxlev_stat.h mncc.h \
 | 
			
		||||
		   gsm48_ie.h logging.h
 | 
			
		||||
 | 
			
		||||
if ENABLE_TALLOC
 | 
			
		||||
osmocore_HEADERS += talloc.h
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
osmocoredir = $(includedir)/osmocore
 | 
			
		||||
 | 
			
		||||
SUBDIRS = protocol
 | 
			
		||||
							
								
								
									
										65
									
								
								libosmocore/include/osmocore/bitvec.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								libosmocore/include/osmocore/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 */
 | 
			
		||||
	uint8_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(const struct bitvec *bv, unsigned int bitnr);
 | 
			
		||||
 | 
			
		||||
/* get the Nth set bit inside the bit vector */
 | 
			
		||||
unsigned int bitvec_get_nth_set_bit(const 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 */
 | 
			
		||||
							
								
								
									
										22
									
								
								libosmocore/include/osmocore/comp128.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								libosmocore/include/osmocore/comp128.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
/*
 | 
			
		||||
 * COMP128 header
 | 
			
		||||
 *
 | 
			
		||||
 * See comp128.c for details
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __COMP128_H__
 | 
			
		||||
#define __COMP128_H__
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Performs the COMP128 algorithm (used as A3/A8)
 | 
			
		||||
 * ki    : uint8_t [16]
 | 
			
		||||
 * srand : uint8_t [16]
 | 
			
		||||
 * sres  : uint8_t [4]
 | 
			
		||||
 * kc    : uint8_t [8]
 | 
			
		||||
 */
 | 
			
		||||
void comp128(uint8_t *ki, uint8_t *srand, uint8_t *sres, uint8_t *kc);
 | 
			
		||||
 | 
			
		||||
#endif /* __COMP128_H__ */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								libosmocore/include/osmocore/gsm48.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								libosmocore/include/osmocore/gsm48.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef _OSMOCORE_GSM48_H
 | 
			
		||||
 | 
			
		||||
#include <osmocore/tlv.h>
 | 
			
		||||
#include <osmocore/protocol/gsm_04_08.h>
 | 
			
		||||
#include <osmocore/gsm48_ie.h>
 | 
			
		||||
 | 
			
		||||
extern const struct tlv_definition gsm48_att_tlvdef;
 | 
			
		||||
const char *gsm48_cc_state_name(uint8_t state);
 | 
			
		||||
const char *gsm48_cc_msg_name(uint8_t msgtype);
 | 
			
		||||
const char *rr_cause_name(uint8_t cause);
 | 
			
		||||
 | 
			
		||||
void gsm48_generate_lai(struct gsm48_loc_area_id *lai48, uint16_t mcc,
 | 
			
		||||
			uint16_t mnc, uint16_t lac);
 | 
			
		||||
int gsm48_generate_mid_from_tmsi(uint8_t *buf, uint32_t tmsi);
 | 
			
		||||
int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										107
									
								
								libosmocore/include/osmocore/gsm48_ie.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								libosmocore/include/osmocore/gsm48_ie.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
#ifndef _OSMOCORE_GSM48_IE_H
 | 
			
		||||
#define _OSMOCORE_GSM48_IE_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <osmocore/msgb.h>
 | 
			
		||||
#include <osmocore/tlv.h>
 | 
			
		||||
#include <osmocore/mncc.h>
 | 
			
		||||
#include <osmocore/protocol/gsm_04_08.h>
 | 
			
		||||
 | 
			
		||||
/* decode a 'called/calling/connect party BCD number' as in 10.5.4.7 */
 | 
			
		||||
int gsm48_decode_bcd_number(char *output, int output_len,
 | 
			
		||||
			    const uint8_t *bcd_lv, int h_len);
 | 
			
		||||
 | 
			
		||||
/* convert a ASCII phone number to 'called/calling/connect party BCD number' */
 | 
			
		||||
int gsm48_encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len,
 | 
			
		||||
			    int h_len, const char *input);
 | 
			
		||||
/* decode 'bearer capability' */
 | 
			
		||||
int gsm48_decode_bearer_cap(struct gsm_mncc_bearer_cap *bcap,
 | 
			
		||||
			     const uint8_t *lv);
 | 
			
		||||
/* encode 'bearer capability' */
 | 
			
		||||
int gsm48_encode_bearer_cap(struct msgb *msg, int lv_only,
 | 
			
		||||
			     const struct gsm_mncc_bearer_cap *bcap);
 | 
			
		||||
/* decode 'call control cap' */
 | 
			
		||||
int gsm48_decode_cccap(struct gsm_mncc_cccap *ccap, const uint8_t *lv);
 | 
			
		||||
/* encode 'call control cap' */
 | 
			
		||||
int gsm48_encode_cccap(struct msgb *msg,
 | 
			
		||||
			const struct gsm_mncc_cccap *ccap);
 | 
			
		||||
/* decode 'called party BCD number' */
 | 
			
		||||
int gsm48_decode_called(struct gsm_mncc_number *called,
 | 
			
		||||
			 const uint8_t *lv);
 | 
			
		||||
/* encode 'called party BCD number' */
 | 
			
		||||
int gsm48_encode_called(struct msgb *msg,
 | 
			
		||||
			 const struct gsm_mncc_number *called);
 | 
			
		||||
/* decode callerid of various IEs */
 | 
			
		||||
int gsm48_decode_callerid(struct gsm_mncc_number *callerid,
 | 
			
		||||
			 const uint8_t *lv);
 | 
			
		||||
/* encode callerid of various IEs */
 | 
			
		||||
int gsm48_encode_callerid(struct msgb *msg, int ie, int max_len,
 | 
			
		||||
			   const struct gsm_mncc_number *callerid);
 | 
			
		||||
/* decode 'cause' */
 | 
			
		||||
int gsm48_decode_cause(struct gsm_mncc_cause *cause,
 | 
			
		||||
			const uint8_t *lv);
 | 
			
		||||
/* encode 'cause' */
 | 
			
		||||
int gsm48_encode_cause(struct msgb *msg, int lv_only,
 | 
			
		||||
			const struct gsm_mncc_cause *cause);
 | 
			
		||||
/* decode 'calling number' */
 | 
			
		||||
int gsm48_decode_calling(struct gsm_mncc_number *calling,
 | 
			
		||||
			 const uint8_t *lv);
 | 
			
		||||
/* encode 'calling number' */
 | 
			
		||||
int gsm48_encode_calling(struct msgb *msg, 
 | 
			
		||||
			  const struct gsm_mncc_number *calling);
 | 
			
		||||
/* decode 'connected number' */
 | 
			
		||||
int gsm48_decode_connected(struct gsm_mncc_number *connected,
 | 
			
		||||
			 const uint8_t *lv);
 | 
			
		||||
/* encode 'connected number' */
 | 
			
		||||
int gsm48_encode_connected(struct msgb *msg,
 | 
			
		||||
			    const struct gsm_mncc_number *connected);
 | 
			
		||||
/* decode 'redirecting number' */
 | 
			
		||||
int gsm48_decode_redirecting(struct gsm_mncc_number *redirecting,
 | 
			
		||||
			 const uint8_t *lv);
 | 
			
		||||
/* encode 'redirecting number' */
 | 
			
		||||
int gsm48_encode_redirecting(struct msgb *msg,
 | 
			
		||||
			      const struct gsm_mncc_number *redirecting);
 | 
			
		||||
/* decode 'facility' */
 | 
			
		||||
int gsm48_decode_facility(struct gsm_mncc_facility *facility,
 | 
			
		||||
			   const uint8_t *lv);
 | 
			
		||||
/* encode 'facility' */
 | 
			
		||||
int gsm48_encode_facility(struct msgb *msg, int lv_only,
 | 
			
		||||
			   const struct gsm_mncc_facility *facility);
 | 
			
		||||
/* decode 'notify' */
 | 
			
		||||
int gsm48_decode_notify(int *notify, const uint8_t *v);
 | 
			
		||||
/* encode 'notify' */
 | 
			
		||||
int gsm48_encode_notify(struct msgb *msg, int notify);
 | 
			
		||||
/* decode 'signal' */
 | 
			
		||||
int gsm48_decode_signal(int *signal, const uint8_t *v);
 | 
			
		||||
/* encode 'signal' */
 | 
			
		||||
int gsm48_encode_signal(struct msgb *msg, int signal);
 | 
			
		||||
/* decode 'keypad' */
 | 
			
		||||
int gsm48_decode_keypad(int *keypad, const uint8_t *lv);
 | 
			
		||||
/* encode 'keypad' */
 | 
			
		||||
int gsm48_encode_keypad(struct msgb *msg, int keypad);
 | 
			
		||||
/* decode 'progress' */
 | 
			
		||||
int gsm48_decode_progress(struct gsm_mncc_progress *progress,
 | 
			
		||||
			   const uint8_t *lv);
 | 
			
		||||
/* encode 'progress' */
 | 
			
		||||
int gsm48_encode_progress(struct msgb *msg, int lv_only,
 | 
			
		||||
			   const struct gsm_mncc_progress *p);
 | 
			
		||||
/* decode 'user-user' */
 | 
			
		||||
int gsm48_decode_useruser(struct gsm_mncc_useruser *uu,
 | 
			
		||||
			   const uint8_t *lv);
 | 
			
		||||
/* encode 'useruser' */
 | 
			
		||||
int gsm48_encode_useruser(struct msgb *msg, int lv_only,
 | 
			
		||||
			   const struct gsm_mncc_useruser *uu);
 | 
			
		||||
/* decode 'ss version' */
 | 
			
		||||
int gsm48_decode_ssversion(struct gsm_mncc_ssversion *ssv,
 | 
			
		||||
			    const uint8_t *lv);
 | 
			
		||||
/* encode 'ss version' */
 | 
			
		||||
int gsm48_encode_ssversion(struct msgb *msg,
 | 
			
		||||
			   const struct gsm_mncc_ssversion *ssv);
 | 
			
		||||
/* decode 'more data' does not require a function, because it has no value */
 | 
			
		||||
/* encode 'more data' */
 | 
			
		||||
int gsm48_encode_more(struct msgb *msg);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										84
									
								
								libosmocore/include/osmocore/gsm_utils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								libosmocore/include/osmocore/gsm_utils.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
/* GSM utility functions, e.g. coding and decoding */
 | 
			
		||||
/*
 | 
			
		||||
 * (C) 2008 by Daniel Willmann <daniel@totalueberwachung.de>
 | 
			
		||||
 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
 | 
			
		||||
 * (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 *
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef GSM_UTILS_H
 | 
			
		||||
#define GSM_UTILS_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
struct gsm_time {
 | 
			
		||||
	uint32_t	fn;	/* FN count */
 | 
			
		||||
	uint16_t	t1;	/* FN div (26*51) */
 | 
			
		||||
	uint8_t		t2;	/* FN modulo 26 */
 | 
			
		||||
	uint8_t		t3;	/* FN modulo 51 */
 | 
			
		||||
	uint8_t		tc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gsm_band {
 | 
			
		||||
	GSM_BAND_850	= 1,
 | 
			
		||||
	GSM_BAND_900	= 2,
 | 
			
		||||
	GSM_BAND_1800	= 4,
 | 
			
		||||
	GSM_BAND_1900	= 8,
 | 
			
		||||
	GSM_BAND_450	= 0x10,
 | 
			
		||||
	GSM_BAND_480	= 0x20,
 | 
			
		||||
	GSM_BAND_750	= 0x40,
 | 
			
		||||
	GSM_BAND_810	= 0x80,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const char *gsm_band_name(enum gsm_band band);
 | 
			
		||||
enum gsm_band gsm_band_parse(const char *mhz);
 | 
			
		||||
 | 
			
		||||
int gsm_7bit_decode(char *decoded, const uint8_t *user_data, uint8_t length);
 | 
			
		||||
int gsm_7bit_encode(uint8_t *result, const char *data);
 | 
			
		||||
 | 
			
		||||
int ms_pwr_ctl_lvl(enum gsm_band band, unsigned int dbm);
 | 
			
		||||
int ms_pwr_dbm(enum gsm_band band, uint8_t lvl);
 | 
			
		||||
 | 
			
		||||
/* According to TS 08.05 Chapter 8.1.4 */
 | 
			
		||||
int rxlev2dbm(uint8_t rxlev);
 | 
			
		||||
uint8_t dbm2rxlev(int dbm);
 | 
			
		||||
 | 
			
		||||
/* According to GSM 04.08 Chapter 10.5.2.29 */
 | 
			
		||||
static inline int rach_max_trans_val2raw(int val) { return (val >> 1) & 3; }
 | 
			
		||||
static inline int rach_max_trans_raw2val(int raw) {
 | 
			
		||||
	const int tbl[4] = { 1, 2, 4, 7 };
 | 
			
		||||
	return tbl[raw & 3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	ARFCN_PCS	0x8000
 | 
			
		||||
#define	ARFCN_UPLINK	0x4000
 | 
			
		||||
 | 
			
		||||
enum gsm_band gsm_arfcn2band(uint16_t arfcn);
 | 
			
		||||
 | 
			
		||||
/* Convert an ARFCN to the frequency in MHz * 10 */
 | 
			
		||||
uint16_t gsm_arfcn2freq10(uint16_t arfcn, int uplink);
 | 
			
		||||
 | 
			
		||||
/* Convert from frame number to GSM time */
 | 
			
		||||
void gsm_fn2gsmtime(struct gsm_time *time, uint32_t fn);
 | 
			
		||||
 | 
			
		||||
/* Convert from GSM time to frame number */
 | 
			
		||||
uint32_t gsm_gsmtime2fn(struct gsm_time *time);
 | 
			
		||||
 | 
			
		||||
void generate_backtrace();
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										72
									
								
								libosmocore/include/osmocore/gsmtap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								libosmocore/include/osmocore/gsmtap.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#ifndef _GSMTAP_H
 | 
			
		||||
#define _GSMTAP_H
 | 
			
		||||
 | 
			
		||||
/* gsmtap header, pseudo-header in front of the actua GSM payload */
 | 
			
		||||
 | 
			
		||||
/* GSMTAP is a generic header format for GSM protocol captures,
 | 
			
		||||
 * it uses the IANA-assigned UDP port number 4729 and carries
 | 
			
		||||
 * payload in various formats of GSM interfaces such as Um MAC
 | 
			
		||||
 * blocks or Um bursts.
 | 
			
		||||
 *
 | 
			
		||||
 * Example programs generating GSMTAP data are airprobe
 | 
			
		||||
 * (http://airprobe.org/) or OsmocomBB (http://bb.osmocom.org/)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define GSMTAP_VERSION		0x02
 | 
			
		||||
 | 
			
		||||
#define GSMTAP_TYPE_UM		0x01
 | 
			
		||||
#define GSMTAP_TYPE_ABIS	0x02
 | 
			
		||||
#define GSMTAP_TYPE_UM_BURST	0x03	/* raw burst bits */
 | 
			
		||||
 | 
			
		||||
#define GSMTAP_BURST_UNKNOWN		0x00
 | 
			
		||||
#define GSMTAP_BURST_FCCH		0x01
 | 
			
		||||
#define GSMTAP_BURST_PARTIAL_SCH	0x02
 | 
			
		||||
#define GSMTAP_BURST_SCH		0x03
 | 
			
		||||
#define GSMTAP_BURST_CTS_SCH		0x04
 | 
			
		||||
#define GSMTAP_BURST_COMPACT_SCH	0x05
 | 
			
		||||
#define GSMTAP_BURST_NORMAL		0x06
 | 
			
		||||
#define GSMTAP_BURST_DUMMY		0x07
 | 
			
		||||
#define GSMTAP_BURST_ACCESS		0x08
 | 
			
		||||
#define GSMTAP_BURST_NONE		0x09
 | 
			
		||||
 | 
			
		||||
#define GSMTAP_CHANNEL_UNKNOWN	0x00
 | 
			
		||||
#define GSMTAP_CHANNEL_BCCH	0x01
 | 
			
		||||
#define GSMTAP_CHANNEL_CCCH	0x02
 | 
			
		||||
#define GSMTAP_CHANNEL_RACH	0x03
 | 
			
		||||
#define GSMTAP_CHANNEL_AGCH	0x04
 | 
			
		||||
#define GSMTAP_CHANNEL_PCH	0x05
 | 
			
		||||
#define GSMTAP_CHANNEL_SDCCH	0x06
 | 
			
		||||
#define GSMTAP_CHANNEL_SDCCH4	0x07
 | 
			
		||||
#define GSMTAP_CHANNEL_SDCCH8	0x08
 | 
			
		||||
#define GSMTAP_CHANNEL_TCH_F	0x09
 | 
			
		||||
#define GSMTAP_CHANNEL_TCH_H	0x0a
 | 
			
		||||
#define GSMTAP_CHANNEL_ACCH	0x80
 | 
			
		||||
 | 
			
		||||
#define GSMTAP_ARFCN_F_PCS	0x8000
 | 
			
		||||
#define GSMTAP_ARFCN_F_UPLINK	0x4000
 | 
			
		||||
#define GSMTAP_ARFCN_MASK	0x3fff
 | 
			
		||||
 | 
			
		||||
#define GSMTAP_UDP_PORT			4729
 | 
			
		||||
 | 
			
		||||
struct gsmtap_hdr {
 | 
			
		||||
	uint8_t version;	/* version, set to 0x01 currently */
 | 
			
		||||
	uint8_t hdr_len;	/* length in number of 32bit words */
 | 
			
		||||
	uint8_t type;		/* see GSMTAP_TYPE_* */
 | 
			
		||||
	uint8_t timeslot;	/* timeslot (0..7 on Um) */
 | 
			
		||||
 | 
			
		||||
	uint16_t arfcn;		/* ARFCN (frequency) */
 | 
			
		||||
	int8_t signal_dbm;	/* signal level in dBm */
 | 
			
		||||
	int8_t snr_db;		/* signal/noise ratio in dB */
 | 
			
		||||
 | 
			
		||||
	uint32_t frame_number;	/* GSM Frame Number (FN) */
 | 
			
		||||
 | 
			
		||||
	uint8_t sub_type;	/* Type of burst/channel, see above */
 | 
			
		||||
	uint8_t antenna_nr;	/* Antenna Number */
 | 
			
		||||
	uint8_t sub_slot;	/* sub-slot within timeslot */
 | 
			
		||||
	uint8_t res;		/* reserved for future use (RFU) */
 | 
			
		||||
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
#endif /* _GSMTAP_H */
 | 
			
		||||
							
								
								
									
										360
									
								
								libosmocore/include/osmocore/linuxlist.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										360
									
								
								libosmocore/include/osmocore/linuxlist.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,360 @@
 | 
			
		||||
#ifndef _LINUX_LLIST_H
 | 
			
		||||
#define _LINUX_LLIST_H
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
#ifndef inline
 | 
			
		||||
#define inline __inline__
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static inline void prefetch(const void *x) {;}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * container_of - cast a member of a structure out to the containing structure
 | 
			
		||||
 *
 | 
			
		||||
 * @ptr:	the pointer to the member.
 | 
			
		||||
 * @type:	the type of the container struct this is embedded in.
 | 
			
		||||
 * @member:	the name of the member within the struct.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define container_of(ptr, type, member) ({			\
 | 
			
		||||
        const typeof( ((type *)0)->member ) *__mptr = (typeof( ((type *)0)->member ) *)(ptr);	\
 | 
			
		||||
        (type *)( (char *)__mptr - offsetof(type, member) );})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * These are non-NULL pointers that will result in page faults
 | 
			
		||||
 * under normal circumstances, used to verify that nobody uses
 | 
			
		||||
 * non-initialized llist entries.
 | 
			
		||||
 */
 | 
			
		||||
#define LLIST_POISON1  ((void *) 0x00100100)
 | 
			
		||||
#define LLIST_POISON2  ((void *) 0x00200200)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Simple doubly linked llist implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * Some of the internal functions ("__xxx") are useful when
 | 
			
		||||
 * manipulating whole llists rather than single entries, as
 | 
			
		||||
 * sometimes we already know the next/prev entries and we can
 | 
			
		||||
 * generate better code by using them directly rather than
 | 
			
		||||
 * using the generic single-entry routines.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
struct llist_head {
 | 
			
		||||
	struct llist_head *next, *prev;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define LLIST_HEAD_INIT(name) { &(name), &(name) }
 | 
			
		||||
 | 
			
		||||
#define LLIST_HEAD(name) \
 | 
			
		||||
	struct llist_head name = LLIST_HEAD_INIT(name)
 | 
			
		||||
 | 
			
		||||
#define INIT_LLIST_HEAD(ptr) do { \
 | 
			
		||||
	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Insert a new entry between two known consecutive entries. 
 | 
			
		||||
 *
 | 
			
		||||
 * This is only for internal llist manipulation where we know
 | 
			
		||||
 * the prev/next entries already!
 | 
			
		||||
 */
 | 
			
		||||
static inline void __llist_add(struct llist_head *_new,
 | 
			
		||||
			      struct llist_head *prev,
 | 
			
		||||
			      struct llist_head *next)
 | 
			
		||||
{
 | 
			
		||||
	next->prev = _new;
 | 
			
		||||
	_new->next = next;
 | 
			
		||||
	_new->prev = prev;
 | 
			
		||||
	prev->next = _new;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_add - add a new entry
 | 
			
		||||
 * @new: new entry to be added
 | 
			
		||||
 * @head: llist head to add it after
 | 
			
		||||
 *
 | 
			
		||||
 * Insert a new entry after the specified head.
 | 
			
		||||
 * This is good for implementing stacks.
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_add(struct llist_head *_new, struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
	__llist_add(_new, head, head->next);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_add_tail - add a new entry
 | 
			
		||||
 * @new: new entry to be added
 | 
			
		||||
 * @head: llist head to add it before
 | 
			
		||||
 *
 | 
			
		||||
 * Insert a new entry before the specified head.
 | 
			
		||||
 * This is useful for implementing queues.
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_add_tail(struct llist_head *_new, struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
	__llist_add(_new, head->prev, head);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Delete a llist entry by making the prev/next entries
 | 
			
		||||
 * point to each other.
 | 
			
		||||
 *
 | 
			
		||||
 * This is only for internal llist manipulation where we know
 | 
			
		||||
 * the prev/next entries already!
 | 
			
		||||
 */
 | 
			
		||||
static inline void __llist_del(struct llist_head * prev, struct llist_head * next)
 | 
			
		||||
{
 | 
			
		||||
	next->prev = prev;
 | 
			
		||||
	prev->next = next;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_del - deletes entry from llist.
 | 
			
		||||
 * @entry: the element to delete from the llist.
 | 
			
		||||
 * Note: llist_empty on entry does not return true after this, the entry is
 | 
			
		||||
 * in an undefined state.
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_del(struct llist_head *entry)
 | 
			
		||||
{
 | 
			
		||||
	__llist_del(entry->prev, entry->next);
 | 
			
		||||
	entry->next = (struct llist_head *)LLIST_POISON1;
 | 
			
		||||
	entry->prev = (struct llist_head *)LLIST_POISON2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_del_init - deletes entry from llist and reinitialize it.
 | 
			
		||||
 * @entry: the element to delete from the llist.
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_del_init(struct llist_head *entry)
 | 
			
		||||
{
 | 
			
		||||
	__llist_del(entry->prev, entry->next);
 | 
			
		||||
	INIT_LLIST_HEAD(entry); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_move - delete from one llist and add as another's head
 | 
			
		||||
 * @llist: the entry to move
 | 
			
		||||
 * @head: the head that will precede our entry
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_move(struct llist_head *llist, struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
        __llist_del(llist->prev, llist->next);
 | 
			
		||||
        llist_add(llist, head);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_move_tail - delete from one llist and add as another's tail
 | 
			
		||||
 * @llist: the entry to move
 | 
			
		||||
 * @head: the head that will follow our entry
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_move_tail(struct llist_head *llist,
 | 
			
		||||
				  struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
        __llist_del(llist->prev, llist->next);
 | 
			
		||||
        llist_add_tail(llist, head);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_empty - tests whether a llist is empty
 | 
			
		||||
 * @head: the llist to test.
 | 
			
		||||
 */
 | 
			
		||||
static inline int llist_empty(const struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
	return head->next == head;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void __llist_splice(struct llist_head *llist,
 | 
			
		||||
				 struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
	struct llist_head *first = llist->next;
 | 
			
		||||
	struct llist_head *last = llist->prev;
 | 
			
		||||
	struct llist_head *at = head->next;
 | 
			
		||||
 | 
			
		||||
	first->prev = head;
 | 
			
		||||
	head->next = first;
 | 
			
		||||
 | 
			
		||||
	last->next = at;
 | 
			
		||||
	at->prev = last;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_splice - join two llists
 | 
			
		||||
 * @llist: the new llist to add.
 | 
			
		||||
 * @head: the place to add it in the first llist.
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_splice(struct llist_head *llist, struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
	if (!llist_empty(llist))
 | 
			
		||||
		__llist_splice(llist, head);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_splice_init - join two llists and reinitialise the emptied llist.
 | 
			
		||||
 * @llist: the new llist to add.
 | 
			
		||||
 * @head: the place to add it in the first llist.
 | 
			
		||||
 *
 | 
			
		||||
 * The llist at @llist is reinitialised
 | 
			
		||||
 */
 | 
			
		||||
static inline void llist_splice_init(struct llist_head *llist,
 | 
			
		||||
				    struct llist_head *head)
 | 
			
		||||
{
 | 
			
		||||
	if (!llist_empty(llist)) {
 | 
			
		||||
		__llist_splice(llist, head);
 | 
			
		||||
		INIT_LLIST_HEAD(llist);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_entry - get the struct for this entry
 | 
			
		||||
 * @ptr:	the &struct llist_head pointer.
 | 
			
		||||
 * @type:	the type of the struct this is embedded in.
 | 
			
		||||
 * @member:	the name of the llist_struct within the struct.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_entry(ptr, type, member) \
 | 
			
		||||
	container_of(ptr, type, member)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each	-	iterate over a llist
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each(pos, head) \
 | 
			
		||||
	for (pos = (head)->next, prefetch(pos->next); pos != (head); \
 | 
			
		||||
        	pos = pos->next, prefetch(pos->next))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * __llist_for_each	-	iterate over a llist
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 *
 | 
			
		||||
 * This variant differs from llist_for_each() in that it's the
 | 
			
		||||
 * simplest possible llist iteration code, no prefetching is done.
 | 
			
		||||
 * Use this for code that knows the llist to be very short (empty
 | 
			
		||||
 * or 1 entry) most of the time.
 | 
			
		||||
 */
 | 
			
		||||
#define __llist_for_each(pos, head) \
 | 
			
		||||
	for (pos = (head)->next; pos != (head); pos = pos->next)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_prev	-	iterate over a llist backwards
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_prev(pos, head) \
 | 
			
		||||
	for (pos = (head)->prev, prefetch(pos->prev); pos != (head); \
 | 
			
		||||
        	pos = pos->prev, prefetch(pos->prev))
 | 
			
		||||
        	
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_safe	-	iterate over a llist safe against removal of llist entry
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @n:		another &struct llist_head to use as temporary storage
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_safe(pos, n, head) \
 | 
			
		||||
	for (pos = (head)->next, n = pos->next; pos != (head); \
 | 
			
		||||
		pos = n, n = pos->next)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_entry	-	iterate over llist of given type
 | 
			
		||||
 * @pos:	the type * to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 * @member:	the name of the llist_struct within the struct.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_entry(pos, head, member)				\
 | 
			
		||||
	for (pos = llist_entry((head)->next, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.next);			\
 | 
			
		||||
	     &pos->member != (head); 					\
 | 
			
		||||
	     pos = llist_entry(pos->member.next, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.next))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_entry_reverse - iterate backwards over llist of given type.
 | 
			
		||||
 * @pos:	the type * to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 * @member:	the name of the llist_struct within the struct.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_entry_reverse(pos, head, member)			\
 | 
			
		||||
	for (pos = llist_entry((head)->prev, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.prev);			\
 | 
			
		||||
	     &pos->member != (head); 					\
 | 
			
		||||
	     pos = llist_entry(pos->member.prev, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.prev))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_entry_continue -	iterate over llist of given type
 | 
			
		||||
 *			continuing after existing point
 | 
			
		||||
 * @pos:	the type * to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 * @member:	the name of the llist_struct within the struct.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_entry_continue(pos, head, member) 		\
 | 
			
		||||
	for (pos = llist_entry(pos->member.next, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.next);			\
 | 
			
		||||
	     &pos->member != (head);					\
 | 
			
		||||
	     pos = llist_entry(pos->member.next, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.next))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_entry_safe - iterate over llist of given type safe against removal of llist entry
 | 
			
		||||
 * @pos:	the type * to use as a loop counter.
 | 
			
		||||
 * @n:		another type * to use as temporary storage
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 * @member:	the name of the llist_struct within the struct.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_entry_safe(pos, n, head, member)			\
 | 
			
		||||
	for (pos = llist_entry((head)->next, typeof(*pos), member),	\
 | 
			
		||||
		n = llist_entry(pos->member.next, typeof(*pos), member);	\
 | 
			
		||||
	     &pos->member != (head); 					\
 | 
			
		||||
	     pos = n, n = llist_entry(n->member.next, typeof(*n), member))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_rcu	-	iterate over an rcu-protected llist
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_rcu(pos, head) \
 | 
			
		||||
	for (pos = (head)->next, prefetch(pos->next); pos != (head); \
 | 
			
		||||
        	pos = pos->next, ({ smp_read_barrier_depends(); 0;}), prefetch(pos->next))
 | 
			
		||||
        	
 | 
			
		||||
#define __llist_for_each_rcu(pos, head) \
 | 
			
		||||
	for (pos = (head)->next; pos != (head); \
 | 
			
		||||
        	pos = pos->next, ({ smp_read_barrier_depends(); 0;}))
 | 
			
		||||
        	
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_safe_rcu	-	iterate over an rcu-protected llist safe
 | 
			
		||||
 *					against removal of llist entry
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @n:		another &struct llist_head to use as temporary storage
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_safe_rcu(pos, n, head) \
 | 
			
		||||
	for (pos = (head)->next, n = pos->next; pos != (head); \
 | 
			
		||||
		pos = n, ({ smp_read_barrier_depends(); 0;}), n = pos->next)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_entry_rcu	-	iterate over rcu llist of given type
 | 
			
		||||
 * @pos:	the type * to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 * @member:	the name of the llist_struct within the struct.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_entry_rcu(pos, head, member)			\
 | 
			
		||||
	for (pos = llist_entry((head)->next, typeof(*pos), member),	\
 | 
			
		||||
		     prefetch(pos->member.next);			\
 | 
			
		||||
	     &pos->member != (head); 					\
 | 
			
		||||
	     pos = llist_entry(pos->member.next, typeof(*pos), member),	\
 | 
			
		||||
		     ({ smp_read_barrier_depends(); 0;}),		\
 | 
			
		||||
		     prefetch(pos->member.next))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * llist_for_each_continue_rcu	-	iterate over an rcu-protected llist 
 | 
			
		||||
 *			continuing after existing point.
 | 
			
		||||
 * @pos:	the &struct llist_head to use as a loop counter.
 | 
			
		||||
 * @head:	the head for your llist.
 | 
			
		||||
 */
 | 
			
		||||
#define llist_for_each_continue_rcu(pos, head) \
 | 
			
		||||
	for ((pos) = (pos)->next, prefetch((pos)->next); (pos) != (head); \
 | 
			
		||||
        	(pos) = (pos)->next, ({ smp_read_barrier_depends(); 0;}), prefetch((pos)->next))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										130
									
								
								libosmocore/include/osmocore/logging.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								libosmocore/include/osmocore/logging.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
			
		||||
#ifndef _OSMOCORE_LOGGING_H
 | 
			
		||||
#define _OSMOCORE_LOGGING_H
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <osmocore/linuxlist.h>
 | 
			
		||||
 | 
			
		||||
#define LOG_MAX_CATEGORY	32
 | 
			
		||||
#define LOG_MAX_CTX		8
 | 
			
		||||
#define LOG_MAX_FILTERS	8
 | 
			
		||||
 | 
			
		||||
#define DEBUG
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
#define DEBUGP(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 0, fmt, ## args)
 | 
			
		||||
#define DEBUGPC(ss, fmt, args...) logp(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 logp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
 | 
			
		||||
 | 
			
		||||
/* new logging interface */
 | 
			
		||||
#define LOGP(ss, level, fmt, args...) \
 | 
			
		||||
	logp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
 | 
			
		||||
#define LOGPC(ss, level, fmt, args...) \
 | 
			
		||||
	logp2(ss, level, __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 */
 | 
			
		||||
 | 
			
		||||
#define LOG_FILTER_ALL	0x0001
 | 
			
		||||
 | 
			
		||||
struct log_category {
 | 
			
		||||
	uint8_t loglevel;
 | 
			
		||||
	uint8_t enabled;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct log_info_cat {
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *color;
 | 
			
		||||
	const char *description;
 | 
			
		||||
	uint8_t loglevel;
 | 
			
		||||
	uint8_t enabled;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* log context information, passed to filter */
 | 
			
		||||
struct log_context {
 | 
			
		||||
	void *ctx[LOG_MAX_CTX+1];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct log_target;
 | 
			
		||||
 | 
			
		||||
typedef int log_filter(const struct log_context *ctx,
 | 
			
		||||
		       struct log_target *target);
 | 
			
		||||
 | 
			
		||||
struct log_info {
 | 
			
		||||
	/* filter callback function */
 | 
			
		||||
	log_filter *filter_fn;
 | 
			
		||||
 | 
			
		||||
	/* per-category information */
 | 
			
		||||
	const struct log_info_cat *cat;
 | 
			
		||||
	unsigned int num_cat;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct log_target {
 | 
			
		||||
        struct llist_head entry;
 | 
			
		||||
 | 
			
		||||
	int filter_map;
 | 
			
		||||
	void *filter_data[LOG_MAX_FILTERS+1];
 | 
			
		||||
 | 
			
		||||
	struct log_category categories[LOG_MAX_CATEGORY+1];
 | 
			
		||||
	uint8_t loglevel;
 | 
			
		||||
	int use_color:1;
 | 
			
		||||
	int print_timestamp:1;
 | 
			
		||||
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			FILE *out;
 | 
			
		||||
		} tgt_stdout;
 | 
			
		||||
 | 
			
		||||
		struct {
 | 
			
		||||
			int priority;
 | 
			
		||||
		} tgt_syslog;
 | 
			
		||||
 | 
			
		||||
		struct {
 | 
			
		||||
			void *vty;
 | 
			
		||||
		} tgt_vty;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
        void (*output) (struct log_target *target, const char *string);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* use the above macros */
 | 
			
		||||
void logp2(unsigned int subsys, unsigned int level, char *file,
 | 
			
		||||
	   int line, int cont, const char *format, ...)
 | 
			
		||||
				__attribute__ ((format (printf, 6, 7)));
 | 
			
		||||
void log_init(const struct log_info *cat);
 | 
			
		||||
 | 
			
		||||
/* context management */
 | 
			
		||||
void log_reset_context(void);
 | 
			
		||||
int log_set_context(uint8_t ctx, void *value);
 | 
			
		||||
 | 
			
		||||
/* filter on the targets */
 | 
			
		||||
void log_set_all_filter(struct log_target *target, int);
 | 
			
		||||
 | 
			
		||||
void log_set_use_color(struct log_target *target, int);
 | 
			
		||||
void log_set_print_timestamp(struct log_target *target, int);
 | 
			
		||||
void log_set_log_level(struct log_target *target, int log_level);
 | 
			
		||||
void log_parse_category_mask(struct log_target *target, const char* mask);
 | 
			
		||||
int log_parse_level(const char *lvl);
 | 
			
		||||
int log_parse_category(const char *category);
 | 
			
		||||
void log_set_category_filter(struct log_target *target, int category,
 | 
			
		||||
			       int enable, int level);
 | 
			
		||||
 | 
			
		||||
/* management of the targets */
 | 
			
		||||
struct log_target *log_target_create(void);
 | 
			
		||||
struct log_target *log_target_create_stderr(void);
 | 
			
		||||
void log_add_target(struct log_target *target);
 | 
			
		||||
void log_del_target(struct log_target *target);
 | 
			
		||||
 | 
			
		||||
#endif /* _OSMOCORE_LOGGING_H */
 | 
			
		||||
							
								
								
									
										71
									
								
								libosmocore/include/osmocore/mncc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								libosmocore/include/osmocore/mncc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
#ifndef _OSMOCORE_MNCC_H
 | 
			
		||||
#define _OSMOCORE_MNCC_H
 | 
			
		||||
 | 
			
		||||
#define GSM_MAX_FACILITY       128
 | 
			
		||||
#define GSM_MAX_SSVERSION      128
 | 
			
		||||
#define GSM_MAX_USERUSER       128
 | 
			
		||||
 | 
			
		||||
/* Expanded fields from GSM TS 04.08, Table 10.5.102 */
 | 
			
		||||
struct gsm_mncc_bearer_cap {
 | 
			
		||||
	int		transfer;	/* Information Transfer Capability */
 | 
			
		||||
	int 		mode;		/* Transfer Mode */
 | 
			
		||||
	int		coding;		/* Coding Standard */
 | 
			
		||||
	int		radio;		/* Radio Channel Requirement */
 | 
			
		||||
	int		speech_ctm;	/* CTM text telephony indication */
 | 
			
		||||
	int		speech_ver[8];	/* Speech version indication */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_number {
 | 
			
		||||
	int 		type;
 | 
			
		||||
	int 		plan;
 | 
			
		||||
	int		present;
 | 
			
		||||
	int		screen;
 | 
			
		||||
	char		number[33];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_cause {
 | 
			
		||||
	int		location;
 | 
			
		||||
	int		coding;
 | 
			
		||||
	int		rec;
 | 
			
		||||
	int		rec_val;
 | 
			
		||||
	int		value;
 | 
			
		||||
	int		diag_len;
 | 
			
		||||
	char		diag[32];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_useruser {
 | 
			
		||||
	int		proto;
 | 
			
		||||
	char		info[GSM_MAX_USERUSER + 1]; /* + termination char */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_progress {
 | 
			
		||||
	int		coding;
 | 
			
		||||
	int		location;
 | 
			
		||||
	int 		descr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_facility {
 | 
			
		||||
	int		len;
 | 
			
		||||
	char		info[GSM_MAX_FACILITY];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_ssversion {
 | 
			
		||||
	int		len;
 | 
			
		||||
	char		info[GSM_MAX_SSVERSION];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct gsm_mncc_cccap {
 | 
			
		||||
	int		dtmf;
 | 
			
		||||
	int		pcp;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	GSM_MNCC_BCAP_SPEECH	= 0,
 | 
			
		||||
	GSM_MNCC_BCAP_UNR_DIG	= 1,
 | 
			
		||||
	GSM_MNCC_BCAP_AUDIO	= 2,
 | 
			
		||||
	GSM_MNCC_BCAP_FAX_G3	= 3,
 | 
			
		||||
	GSM_MNCC_BCAP_OTHER_ITC = 5,
 | 
			
		||||
	GSM_MNCC_BCAP_RESERVED	= 7,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										175
									
								
								libosmocore/include/osmocore/msgb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								libosmocore/include/osmocore/msgb.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,175 @@
 | 
			
		||||
#ifndef _MSGB_H
 | 
			
		||||
#define _MSGB_H
 | 
			
		||||
 | 
			
		||||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include "linuxlist.h"
 | 
			
		||||
 | 
			
		||||
struct bts_link;
 | 
			
		||||
 | 
			
		||||
struct msgb {
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
 | 
			
		||||
	/* ptr to the physical E1 link to the BTS(s) */
 | 
			
		||||
	struct gsm_bts_link *bts_link;
 | 
			
		||||
 | 
			
		||||
	/* Part of which TRX logical channel we were received / transmitted */
 | 
			
		||||
	struct gsm_bts_trx *trx;
 | 
			
		||||
	struct gsm_lchan *lchan;
 | 
			
		||||
 | 
			
		||||
	/* the Layer1 header (if any) */
 | 
			
		||||
	unsigned char *l1h;
 | 
			
		||||
	/* the A-bis layer 2 header: OML, RSL(RLL), NS */
 | 
			
		||||
	unsigned char *l2h;
 | 
			
		||||
	/* the layer 3 header. For OML: FOM; RSL: 04.08; GPRS: BSSGP */
 | 
			
		||||
	unsigned char *l3h;
 | 
			
		||||
 | 
			
		||||
	/* the layer 4 header */
 | 
			
		||||
	union {
 | 
			
		||||
		unsigned char *smsh;
 | 
			
		||||
		unsigned char *llch;
 | 
			
		||||
		unsigned char *l4h;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	/* the layer 5 header, GPRS: GMM header */
 | 
			
		||||
	unsigned char *gmmh;
 | 
			
		||||
	uint32_t tlli;
 | 
			
		||||
 | 
			
		||||
	uint16_t data_len;
 | 
			
		||||
	uint16_t len;
 | 
			
		||||
 | 
			
		||||
	unsigned char *head;
 | 
			
		||||
	unsigned char *tail;
 | 
			
		||||
	unsigned char *data;
 | 
			
		||||
	unsigned char _data[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern struct msgb *msgb_alloc(uint16_t size, const char *name);
 | 
			
		||||
extern void msgb_free(struct msgb *m);
 | 
			
		||||
extern void msgb_enqueue(struct llist_head *queue, struct msgb *msg);
 | 
			
		||||
extern struct msgb *msgb_dequeue(struct llist_head *queue);
 | 
			
		||||
extern void msgb_reset(struct msgb *m);
 | 
			
		||||
 | 
			
		||||
#define msgb_l1(m)	((void *)(m->l1h))
 | 
			
		||||
#define msgb_l2(m)	((void *)(m->l2h))
 | 
			
		||||
#define msgb_l3(m)	((void *)(m->l3h))
 | 
			
		||||
#define msgb_sms(m)	((void *)(m->smsh))
 | 
			
		||||
 | 
			
		||||
static inline unsigned int msgb_l1len(const struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	return msgb->tail - (uint8_t *)msgb_l1(msgb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned int msgb_l2len(const struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	return msgb->tail - (uint8_t *)msgb_l2(msgb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned int msgb_l3len(const struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	return msgb->tail - (uint8_t *)msgb_l3(msgb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned int msgb_headlen(const struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	return msgb->len - msgb->data_len;
 | 
			
		||||
}
 | 
			
		||||
static inline unsigned char *msgb_put(struct msgb *msgb, unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
	unsigned char *tmp = msgb->tail;
 | 
			
		||||
	msgb->tail += len;
 | 
			
		||||
	msgb->len += len;
 | 
			
		||||
	return tmp;
 | 
			
		||||
}
 | 
			
		||||
static inline void msgb_put_u8(struct msgb *msgb, uint8_t word)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *space = msgb_put(msgb, 1);
 | 
			
		||||
	space[0] = word & 0xFF;
 | 
			
		||||
}
 | 
			
		||||
static inline void msgb_put_u16(struct msgb *msgb, uint16_t word)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *space = msgb_put(msgb, 2);
 | 
			
		||||
	space[0] = word >> 8 & 0xFF;
 | 
			
		||||
	space[1] = word & 0xFF;
 | 
			
		||||
}
 | 
			
		||||
static inline void msgb_put_u32(struct msgb *msgb, uint32_t word)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *space = msgb_put(msgb, 4);
 | 
			
		||||
	space[0] = word >> 24 & 0xFF;
 | 
			
		||||
	space[1] = word >> 16 & 0xFF;
 | 
			
		||||
	space[2] = word >> 8 & 0xFF;
 | 
			
		||||
	space[3] = word & 0xFF;
 | 
			
		||||
}
 | 
			
		||||
static inline unsigned char *msgb_get(struct msgb *msgb, unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
	unsigned char *tmp = msgb->data;
 | 
			
		||||
	msgb->data += len;
 | 
			
		||||
	msgb->len -= len;
 | 
			
		||||
	return tmp;
 | 
			
		||||
}
 | 
			
		||||
static inline uint8_t msgb_get_u8(struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *space = msgb_get(msgb, 1);
 | 
			
		||||
	return space[0];
 | 
			
		||||
}
 | 
			
		||||
static inline uint16_t msgb_get_u16(struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *space = msgb_get(msgb, 2);
 | 
			
		||||
	return space[0] << 8 | space[1];
 | 
			
		||||
}
 | 
			
		||||
static inline uint32_t msgb_get_u32(struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *space = msgb_get(msgb, 4);
 | 
			
		||||
	return space[0] << 24 | space[1] << 16 | space[2] << 8 | space[3];
 | 
			
		||||
}
 | 
			
		||||
static inline unsigned char *msgb_push(struct msgb *msgb, unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
	msgb->data -= len;
 | 
			
		||||
	msgb->len += len;
 | 
			
		||||
	return msgb->data;
 | 
			
		||||
}
 | 
			
		||||
static inline unsigned char *msgb_pull(struct msgb *msgb, unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
	msgb->len -= len;
 | 
			
		||||
	return msgb->data += len;
 | 
			
		||||
}
 | 
			
		||||
static inline int msgb_tailroom(const struct msgb *msgb)
 | 
			
		||||
{
 | 
			
		||||
	return (msgb->head + msgb->data_len) - msgb->tail;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* increase the headroom of an empty msgb, reducing the tailroom */
 | 
			
		||||
static inline void msgb_reserve(struct msgb *msg, int len)
 | 
			
		||||
{
 | 
			
		||||
	msg->data += len;
 | 
			
		||||
	msg->tail += len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline struct msgb *msgb_alloc_headroom(int size, int headroom,
 | 
			
		||||
						const char *name)
 | 
			
		||||
{
 | 
			
		||||
	struct msgb *msg = msgb_alloc(size, name);
 | 
			
		||||
	if (msg)
 | 
			
		||||
		msgb_reserve(msg, headroom);
 | 
			
		||||
	return msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* _MSGB_H */
 | 
			
		||||
							
								
								
									
										3
									
								
								libosmocore/include/osmocore/protocol/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								libosmocore/include/osmocore/protocol/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
osmocore_proto_HEADERS = gsm_04_08.h gsm_04_11.h gsm_04_80.h gsm_08_58.h gsm_12_21.h
 | 
			
		||||
 | 
			
		||||
osmocore_protodir = $(includedir)/osmocore/protocol
 | 
			
		||||
							
								
								
									
										743
									
								
								libosmocore/include/osmocore/protocol/gsm_04_08.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										743
									
								
								libosmocore/include/osmocore/protocol/gsm_04_08.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,743 @@
 | 
			
		||||
#ifndef PROTO_GSM_04_08_H
 | 
			
		||||
#define PROTO_GSM_04_08_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* GSM TS 04.08  definitions */
 | 
			
		||||
struct gsm_lchan;
 | 
			
		||||
 | 
			
		||||
struct gsm48_classmark1 {
 | 
			
		||||
	uint8_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 {
 | 
			
		||||
	uint8_t chan_nr;
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			uint8_t maio_high:4,
 | 
			
		||||
				 h:1,
 | 
			
		||||
				 tsc:3;
 | 
			
		||||
			uint8_t hsn:6,
 | 
			
		||||
				 maio_low:2;
 | 
			
		||||
		} h1;
 | 
			
		||||
		struct {
 | 
			
		||||
			uint8_t arfcn_high:2,
 | 
			
		||||
				 spare:2,
 | 
			
		||||
				 h:1,
 | 
			
		||||
				 tsc:3;
 | 
			
		||||
			uint8_t arfcn_low;
 | 
			
		||||
		} h0;
 | 
			
		||||
	};
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.2.21aa */
 | 
			
		||||
struct gsm48_multi_rate_conf {
 | 
			
		||||
	uint8_t smod : 2,
 | 
			
		||||
		 spare: 1,
 | 
			
		||||
		 icmi : 1,
 | 
			
		||||
		 nscb : 1,
 | 
			
		||||
		 ver : 3;
 | 
			
		||||
	uint8_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 {
 | 
			
		||||
	uint8_t ra;
 | 
			
		||||
	uint8_t t3_high:3,
 | 
			
		||||
		 t1_:5;
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint8_t power_command;
 | 
			
		||||
	uint8_t data[0];
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.2.2 */
 | 
			
		||||
struct gsm48_cell_desc {
 | 
			
		||||
	uint8_t bcc:3,
 | 
			
		||||
		 ncc:3,
 | 
			
		||||
		 arfcn_hi:2;
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint8_t ho_ref;
 | 
			
		||||
	uint8_t power_command;
 | 
			
		||||
	uint8_t data[0];
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1.18 */
 | 
			
		||||
struct gsm48_imm_ass {
 | 
			
		||||
	uint8_t l2_plen;
 | 
			
		||||
	uint8_t proto_discr;
 | 
			
		||||
	uint8_t msg_type;
 | 
			
		||||
	uint8_t page_mode;
 | 
			
		||||
	struct gsm48_chan_desc chan_desc;
 | 
			
		||||
	struct gsm48_req_ref req_ref;
 | 
			
		||||
	uint8_t timing_advance;
 | 
			
		||||
	uint8_t mob_alloc_len;
 | 
			
		||||
	uint8_t mob_alloc[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 10.5.1.3 */
 | 
			
		||||
struct gsm48_loc_area_id {
 | 
			
		||||
	uint8_t digits[3];	/* BCD! */
 | 
			
		||||
	uint16_t lac;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.2 */
 | 
			
		||||
struct gsm48_auth_req {
 | 
			
		||||
	uint8_t key_seq:4,
 | 
			
		||||
	         spare:4;
 | 
			
		||||
	uint8_t rand[16];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.15 */
 | 
			
		||||
struct gsm48_loc_upd_req {
 | 
			
		||||
	uint8_t type:4,
 | 
			
		||||
		 key_seq:4;
 | 
			
		||||
	struct gsm48_loc_area_id lai;
 | 
			
		||||
	struct gsm48_classmark1 classmark1;
 | 
			
		||||
	uint8_t mi_len;
 | 
			
		||||
	uint8_t mi[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 10.1 */
 | 
			
		||||
struct gsm48_hdr {
 | 
			
		||||
	uint8_t proto_discr;
 | 
			
		||||
	uint8_t msg_type;
 | 
			
		||||
	uint8_t data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.3x System information Type header */
 | 
			
		||||
struct gsm48_system_information_type_header {
 | 
			
		||||
	uint8_t l2_plen;
 | 
			
		||||
	uint8_t rr_protocol_discriminator :4,
 | 
			
		||||
		skip_indicator:4; 
 | 
			
		||||
	uint8_t system_information;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct gsm48_rach_control {
 | 
			
		||||
	uint8_t re :1,
 | 
			
		||||
		 cell_bar :1,
 | 
			
		||||
		 tx_integer :4,
 | 
			
		||||
		 max_trans :2;
 | 
			
		||||
	uint8_t t2;
 | 
			
		||||
	uint8_t t3;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 10.5.2.4 Cell Selection Parameters */
 | 
			
		||||
struct gsm48_cell_sel_par {
 | 
			
		||||
	uint8_t ms_txpwr_max_ccch:5,	/* GSM 05.08 MS-TXPWR-MAX-CCCH */
 | 
			
		||||
		 cell_resel_hyst:3;	/* GSM 05.08 CELL-RESELECT-HYSTERESIS */
 | 
			
		||||
	uint8_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 {
 | 
			
		||||
	uint8_t ccch_conf :3,
 | 
			
		||||
		bs_ag_blks_res :3,
 | 
			
		||||
		att :1,
 | 
			
		||||
		spare1 :1;
 | 
			
		||||
	uint8_t bs_pa_mfrms : 3,
 | 
			
		||||
		spare2 :5;
 | 
			
		||||
	uint8_t t3212;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct gsm48_cell_options {
 | 
			
		||||
	uint8_t radio_link_timeout:4,
 | 
			
		||||
		 dtx:2,
 | 
			
		||||
		 pwrc:1,
 | 
			
		||||
		 spare:1;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.9 CM service request */
 | 
			
		||||
struct gsm48_service_request {
 | 
			
		||||
	uint8_t cm_service_type : 4,
 | 
			
		||||
		 cipher_key_seq  : 4;
 | 
			
		||||
	/* length + 3 bytes */
 | 
			
		||||
	uint32_t classmark;
 | 
			
		||||
	uint8_t mi_len;
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint8_t cell_channel_description[16];
 | 
			
		||||
	struct gsm48_rach_control rach_control;
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint8_t bcch_frequency_list[16];
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint16_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;
 | 
			
		||||
	uint8_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
 | 
			
		||||
	 */
 | 
			
		||||
	uint8_t data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.37 System information Type 5 */
 | 
			
		||||
struct gsm48_system_information_type_5 {
 | 
			
		||||
	uint8_t rr_protocol_discriminator :4,
 | 
			
		||||
		skip_indicator:4; 
 | 
			
		||||
	uint8_t system_information;
 | 
			
		||||
	uint8_t bcch_frequency_list[16];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.1.40 System information Type 6 */
 | 
			
		||||
struct gsm48_system_information_type_6 {
 | 
			
		||||
	uint8_t rr_protocol_discriminator :4,
 | 
			
		||||
		skip_indicator:4; 
 | 
			
		||||
	uint8_t system_information;
 | 
			
		||||
	uint16_t cell_identity;
 | 
			
		||||
	struct gsm48_loc_area_id lai;
 | 
			
		||||
	struct gsm48_cell_options cell_options;
 | 
			
		||||
	uint8_t ncc_permitted;
 | 
			
		||||
	uint8_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;
 | 
			
		||||
	uint8_t rest_octets[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Section 9.2.12 IMSI Detach Indication */
 | 
			
		||||
struct gsm48_imsi_detach_ind {
 | 
			
		||||
	struct gsm48_classmark1 classmark1;
 | 
			
		||||
	uint8_t mi_len;
 | 
			
		||||
	uint8_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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* PROTO_GSM_04_08_H */
 | 
			
		||||
							
								
								
									
										188
									
								
								libosmocore/include/osmocore/protocol/gsm_04_11.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								libosmocore/include/osmocore/protocol/gsm_04_11.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,188 @@
 | 
			
		||||
#ifndef PROTO_GSM_04_11_H
 | 
			
		||||
#define PROTO_GSM_04_11_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* GSM TS 04.11  definitions */
 | 
			
		||||
 | 
			
		||||
/* Chapter 5.2.3: SMC-CS states at the network side */
 | 
			
		||||
enum gsm411_cp_state {
 | 
			
		||||
	GSM411_CPS_IDLE 		= 0,
 | 
			
		||||
	GSM411_CPS_MM_CONN_PENDING	= 1,	/* only MT ! */
 | 
			
		||||
	GSM411_CPS_WAIT_CP_ACK		= 2,
 | 
			
		||||
	GSM411_CPS_MM_ESTABLISHED	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 6.2.2: SMR states at the network side */
 | 
			
		||||
enum gsm411_rp_state {
 | 
			
		||||
	GSM411_RPS_IDLE			= 0,
 | 
			
		||||
	GSM411_RPS_WAIT_FOR_RP_ACK	= 1,
 | 
			
		||||
	GSM411_RPS_WAIT_TO_TX_RP_ACK	= 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.1.2 (refers to GSM 04.07 Chapter 11.2.3.1.1 */
 | 
			
		||||
#define GSM411_PDISC_SMS	0x09
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.1.3 */
 | 
			
		||||
#define GSM411_MT_CP_DATA	0x01
 | 
			
		||||
#define GSM411_MT_CP_ACK	0x04
 | 
			
		||||
#define GSM411_MT_CP_ERROR	0x10
 | 
			
		||||
 | 
			
		||||
enum gsm411_cp_ie {
 | 
			
		||||
	GSM411_CP_IE_USER_DATA		= 0x01,	/* 8.1.4.1 */
 | 
			
		||||
	GSM411_CP_IE_CAUSE		= 0x02,	/* 8.1.4.2. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Section 8.1.4.2 / Table 8.2 */
 | 
			
		||||
enum gsm411_cp_cause {
 | 
			
		||||
	GSM411_CP_CAUSE_NET_FAIL	= 17,
 | 
			
		||||
	GSM411_CP_CAUSE_CONGESTION	= 22,
 | 
			
		||||
	GSM411_CP_CAUSE_INV_TRANS_ID	= 81,
 | 
			
		||||
	GSM411_CP_CAUSE_SEMANT_INC_MSG	= 95,
 | 
			
		||||
	GSM411_CP_CAUSE_INV_MAND_INF	= 96,
 | 
			
		||||
	GSM411_CP_CAUSE_MSGTYPE_NOTEXIST= 97,
 | 
			
		||||
	GSM411_CP_CAUSE_MSG_INCOMP_STATE= 98,
 | 
			
		||||
	GSM411_CP_CAUSE_IE_NOTEXIST	= 99,
 | 
			
		||||
	GSM411_CP_CAUSE_PROTOCOL_ERR	= 111,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.2.2 */
 | 
			
		||||
#define GSM411_MT_RP_DATA_MO	0x00
 | 
			
		||||
#define GSM411_MT_RP_DATA_MT	0x01
 | 
			
		||||
#define GSM411_MT_RP_ACK_MO	0x02
 | 
			
		||||
#define GSM411_MT_RP_ACK_MT	0x03
 | 
			
		||||
#define GSM411_MT_RP_ERROR_MO	0x04
 | 
			
		||||
#define GSM411_MT_RP_ERROR_MT	0x05
 | 
			
		||||
#define GSM411_MT_RP_SMMA_MO	0x06
 | 
			
		||||
 | 
			
		||||
enum gsm411_rp_ie {
 | 
			
		||||
	GSM411_IE_RP_USER_DATA		= 0x41,	/* 8.2.5.3 */
 | 
			
		||||
	GSM411_IE_RP_CAUSE		= 0x42,	/* 8.2.5.4 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.2.5.4 Table 8.4 */
 | 
			
		||||
enum gsm411_rp_cause {
 | 
			
		||||
	/* valid only for MO */
 | 
			
		||||
	GSM411_RP_CAUSE_MO_NUM_UNASSIGNED	= 1,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_OP_DET_BARR		= 8,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_CALL_BARRED		= 10,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_SMS_REJECTED		= 21,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_DEST_OUT_OF_ORDER	= 27,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_UNIDENTIFIED_SUBSCR	= 28,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_FACILITY_REJ		= 29,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_UNKNOWN_SUBSCR	= 30,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_NET_OUT_OF_ORDER	= 38,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_TEMP_FAIL		= 41,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_CONGESTION		= 42,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_RES_UNAVAIL		= 47,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_REQ_FAC_NOTSUBSCR	= 50,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_REQ_FAC_NOTIMPL	= 69,
 | 
			
		||||
	GSM411_RP_CAUSE_MO_INTERWORKING		= 127,
 | 
			
		||||
	/* valid only for MT */
 | 
			
		||||
	GSM411_RP_CAUSE_MT_MEM_EXCEEDED		= 22,
 | 
			
		||||
	/* valid for both directions */
 | 
			
		||||
	GSM411_RP_CAUSE_INV_TRANS_REF		= 81,
 | 
			
		||||
	GSM411_RP_CAUSE_SEMANT_INC_MSG		= 95,
 | 
			
		||||
	GSM411_RP_CAUSE_INV_MAND_INF		= 96,
 | 
			
		||||
	GSM411_RP_CAUSE_MSGTYPE_NOTEXIST	= 97,
 | 
			
		||||
	GSM411_RP_CAUSE_MSG_INCOMP_STATE	= 98,
 | 
			
		||||
	GSM411_RP_CAUSE_IE_NOTEXIST		= 99,
 | 
			
		||||
	GSM411_RP_CAUSE_PROTOCOL_ERR		= 111,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 10: Timers */
 | 
			
		||||
#define GSM411_TMR_TR1M		40, 0	/* 35 < x < 45 seconds */
 | 
			
		||||
#define GSM411_TMR_TRAM		30, 0	/* 25 < x < 35 seconds */
 | 
			
		||||
#define GSM411_TMR_TR2M		15, 0	/* 12 < x < 20 seconds */
 | 
			
		||||
 | 
			
		||||
#define GSM411_TMR_TC1A		30, 0
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.2.1 */
 | 
			
		||||
struct gsm411_rp_hdr {
 | 
			
		||||
	uint8_t len;
 | 
			
		||||
	uint8_t msg_type;
 | 
			
		||||
	uint8_t msg_ref;
 | 
			
		||||
	uint8_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 */
 | 
			
		||||
 | 
			
		||||
#endif /* PROTO_GSM_04_11_H */
 | 
			
		||||
							
								
								
									
										126
									
								
								libosmocore/include/osmocore/protocol/gsm_04_80.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								libosmocore/include/osmocore/protocol/gsm_04_80.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
#ifndef PROTO_GSM_04_80_H
 | 
			
		||||
#define PROTO_GSM_04_80_H
 | 
			
		||||
 | 
			
		||||
/* GSM TS 04.80  definitions (Supplementary Services Specification, Formats and Coding) */
 | 
			
		||||
 | 
			
		||||
/* Section 3.4 */
 | 
			
		||||
#define GSM0480_MTYPE_RELEASE_COMPLETE	0x2A
 | 
			
		||||
#define GSM0480_MTYPE_FACILITY			0x3A
 | 
			
		||||
#define GSM0480_MTYPE_REGISTER			0x3B
 | 
			
		||||
 | 
			
		||||
/* Section 3.5 */
 | 
			
		||||
#define GSM0480_IE_FACILITY			0x1C
 | 
			
		||||
#define GSM0480_IE_SS_VERSION			0x7F
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.2 */
 | 
			
		||||
#define GSM0480_CTYPE_INVOKE			0xA1
 | 
			
		||||
#define GSM0480_CTYPE_RETURN_RESULT		0xA2
 | 
			
		||||
#define GSM0480_CTYPE_RETURN_ERROR		0xA3
 | 
			
		||||
#define GSM0480_CTYPE_REJECT			0xA4
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.3 */
 | 
			
		||||
#define GSM0480_COMPIDTAG_INVOKE_ID		0x02
 | 
			
		||||
#define GSM0480_COMPIDTAG_LINKED_ID		0x80
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.4 */
 | 
			
		||||
#define GSM0480_OPERATION_CODE			0x02
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.5 */
 | 
			
		||||
#define GSM_0480_SEQUENCE_TAG			0x30
 | 
			
		||||
#define GSM_0480_SET_TAG			0x31
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.6 */
 | 
			
		||||
#define GSM_0480_ERROR_CODE_TAG			0x02
 | 
			
		||||
 | 
			
		||||
/* Section 3.6.7 */
 | 
			
		||||
/* Table 3.13 */
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_GENERAL	0x80
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_INVOKE	0x81
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_RETURN_RESULT	0x82
 | 
			
		||||
#define GSM_0480_PROBLEM_CODE_TAG_RETURN_ERROR	0x83
 | 
			
		||||
 | 
			
		||||
/* Table 3.14 */
 | 
			
		||||
#define GSM_0480_GEN_PROB_CODE_UNRECOGNISED	0x00
 | 
			
		||||
#define GSM_0480_GEN_PROB_CODE_MISTYPED		0x01
 | 
			
		||||
#define GSM_0480_GEN_PROB_CODE_BAD_STRUCTURE	0x02
 | 
			
		||||
 | 
			
		||||
/* Table 3.15 */
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_DUPLICATE_INVOKE_ID		0x00
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNRECOGNISED_OPERATION	0x01
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_MISTYPED_PARAMETER		0x02
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_RESOURCE_LIMITATION		0x03
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_INITIATING_RELEASE		0x04
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNRECOGNISED_LINKED_ID	0x05
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNEXPECTED_LINKED_RESPONSE	0x06
 | 
			
		||||
#define GSM_0480_INVOKE_PROB_CODE_UNEXPECTED_LINKED_OPERATION	0x07
 | 
			
		||||
 | 
			
		||||
/* Table 3.16 */
 | 
			
		||||
#define GSM_0480_RESULT_PROB_CODE_UNRECOGNISED_INVOKE_ID	0x00
 | 
			
		||||
#define GSM_0480_RESULT_PROB_CODE_RETURN_RESULT_UNEXPECTED	0x01
 | 
			
		||||
#define GSM_0480_RESULT_PROB_CODE_MISTYPED_PARAMETER		0x02
 | 
			
		||||
 | 
			
		||||
/* Table 3.17 */
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_UNRECOGNISED_INVOKE_ID		0x00
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_RETURN_ERROR_UNEXPECTED	0x01
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_UNRECOGNISED_ERROR		0x02
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_UNEXPECTED_ERROR		0x03
 | 
			
		||||
#define GSM_0480_ERROR_PROB_CODE_MISTYPED_PARAMETER		0x04
 | 
			
		||||
 | 
			
		||||
/* Section 4.5 */
 | 
			
		||||
#define GSM0480_OP_CODE_REGISTER_SS		0x0A
 | 
			
		||||
#define GSM0480_OP_CODE_ERASE_SS		0x0B
 | 
			
		||||
#define GSM0480_OP_CODE_ACTIVATE_SS		0x0C
 | 
			
		||||
#define GSM0480_OP_CODE_DEACTIVATE_SS		0x0D
 | 
			
		||||
#define GSM0480_OP_CODE_INTERROGATE_SS		0x0E
 | 
			
		||||
#define GSM0480_OP_CODE_NOTIFY_SS		0x10
 | 
			
		||||
#define GSM0480_OP_CODE_REGISTER_PASSWORD	0x11
 | 
			
		||||
#define GSM0480_OP_CODE_GET_PASSWORD		0x12
 | 
			
		||||
#define GSM0480_OP_CODE_PROCESS_USS_DATA	0x13
 | 
			
		||||
#define GSM0480_OP_CODE_FORWARD_CHECK_SS_IND	0x26
 | 
			
		||||
#define GSM0480_OP_CODE_PROCESS_USS_REQ		0x3B
 | 
			
		||||
#define GSM0480_OP_CODE_USS_REQUEST		0x3C
 | 
			
		||||
#define GSM0480_OP_CODE_USS_NOTIFY		0x3D
 | 
			
		||||
#define GSM0480_OP_CODE_FORWARD_CUG_INFO	0x78
 | 
			
		||||
#define GSM0480_OP_CODE_SPLIT_MPTY		0x79
 | 
			
		||||
#define GSM0480_OP_CODE_RETRIEVE_MPTY		0x7A
 | 
			
		||||
#define GSM0480_OP_CODE_HOLD_MPTY		0x7B
 | 
			
		||||
#define GSM0480_OP_CODE_BUILD_MPTY		0x7C
 | 
			
		||||
#define GSM0480_OP_CODE_FORWARD_CHARGE_ADVICE	0x7D
 | 
			
		||||
 | 
			
		||||
#define GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER			0x01
 | 
			
		||||
#define GSM0480_ERR_CODE_ILLEGAL_SUBSCRIBER			0x09
 | 
			
		||||
#define GSM0480_ERR_CODE_BEARER_SERVICE_NOT_PROVISIONED		0x0A
 | 
			
		||||
#define GSM0480_ERR_CODE_TELESERVICE_NOT_PROVISIONED		0x0B
 | 
			
		||||
#define GSM0480_ERR_CODE_ILLEGAL_EQUIPMENT			0x0C
 | 
			
		||||
#define GSM0480_ERR_CODE_CALL_BARRED				0x0D
 | 
			
		||||
#define GSM0480_ERR_CODE_ILLEGAL_SS_OPERATION			0x10
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_ERROR_STATUS			0x11
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_NOT_AVAILABLE			0x12
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_SUBSCRIPTION_VIOLATION		0x13
 | 
			
		||||
#define GSM0480_ERR_CODE_SS_INCOMPATIBILITY			0x14
 | 
			
		||||
#define GSM0480_ERR_CODE_FACILITY_NOT_SUPPORTED			0x15
 | 
			
		||||
#define GSM0480_ERR_CODE_ABSENT_SUBSCRIBER			0x1B
 | 
			
		||||
#define GSM0480_ERR_CODE_SYSTEM_FAILURE				0x22
 | 
			
		||||
#define GSM0480_ERR_CODE_DATA_MISSING				0x23
 | 
			
		||||
#define GSM0480_ERR_CODE_UNEXPECTED_DATA_VALUE			0x24
 | 
			
		||||
#define GSM0480_ERR_CODE_PW_REGISTRATION_FAILURE		0x25
 | 
			
		||||
#define GSM0480_ERR_CODE_NEGATIVE_PW_CHECK			0x26
 | 
			
		||||
#define GSM0480_ERR_CODE_NUM_PW_ATTEMPTS_VIOLATION		0x2B
 | 
			
		||||
#define GSM0480_ERR_CODE_UNKNOWN_ALPHABET			0x47
 | 
			
		||||
#define GSM0480_ERR_CODE_USSD_BUSY				0x48
 | 
			
		||||
#define GSM0480_ERR_CODE_MAX_MPTY_PARTICIPANTS			0x7E
 | 
			
		||||
#define GSM0480_ERR_CODE_RESOURCES_NOT_AVAILABLE		0x7F
 | 
			
		||||
 | 
			
		||||
/* ASN.1 type-tags */
 | 
			
		||||
#define ASN1_BOOLEAN_TAG		0x01
 | 
			
		||||
#define ASN1_INTEGER_TAG		0x02
 | 
			
		||||
#define ASN1_BIT_STRING_TAG		0x03
 | 
			
		||||
#define ASN1_OCTET_STRING_TAG		0x04
 | 
			
		||||
#define ASN1_NULL_TYPE_TAG		0x05
 | 
			
		||||
#define ASN1_OBJECT_ID_TAG		0x06
 | 
			
		||||
#define ASN1_UTF8_STRING_TAG		0x0C
 | 
			
		||||
#define ASN1_PRINTABLE_STRING_TAG	0x13
 | 
			
		||||
#define ASN1_IA5_STRING_TAG		0x16
 | 
			
		||||
#define ASN1_UNICODE_STRING_TAG		0x1E
 | 
			
		||||
 | 
			
		||||
#endif /* PROTO_GSM_04_80_H */
 | 
			
		||||
							
								
								
									
										512
									
								
								libosmocore/include/osmocore/protocol/gsm_08_58.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										512
									
								
								libosmocore/include/osmocore/protocol/gsm_08_58.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,512 @@
 | 
			
		||||
#ifndef PROTO_GSM_08_58_H
 | 
			
		||||
#define PROTO_GSM_08_58_H
 | 
			
		||||
 | 
			
		||||
/* GSM Radio Signalling Link messages on the A-bis interface 
 | 
			
		||||
 * 3GPP TS 08.58 version 8.6.0 Release 1999 / ETSI TS 100 596 V8.6.0 */
 | 
			
		||||
 | 
			
		||||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
struct abis_rsl_common_hdr {
 | 
			
		||||
	uint8_t	msg_discr;
 | 
			
		||||
	uint8_t	msg_type;
 | 
			
		||||
	uint8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.3 */
 | 
			
		||||
struct abis_rsl_rll_hdr {
 | 
			
		||||
	struct abis_rsl_common_hdr c;
 | 
			
		||||
	uint8_t	ie_chan;
 | 
			
		||||
	uint8_t	chan_nr;
 | 
			
		||||
	uint8_t	ie_link_id;
 | 
			
		||||
	uint8_t	link_id;
 | 
			
		||||
	uint8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
/* Chapter 8.3 and 8.4 */
 | 
			
		||||
struct abis_rsl_dchan_hdr {
 | 
			
		||||
	struct abis_rsl_common_hdr c;
 | 
			
		||||
	uint8_t	ie_chan;
 | 
			
		||||
	uint8_t	chan_nr;
 | 
			
		||||
	uint8_t	data[0];
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1 */
 | 
			
		||||
#define ABIS_RSL_MDISC_RLL		0x02
 | 
			
		||||
#define ABIS_RSL_MDISC_DED_CHAN		0x08
 | 
			
		||||
#define ABIS_RSL_MDISC_COM_CHAN		0x0c
 | 
			
		||||
#define ABIS_RSL_MDISC_TRX		0x10
 | 
			
		||||
#define ABIS_RSL_MDISC_LOC		0x20
 | 
			
		||||
#define ABIS_RSL_MDISC_IPACCESS		0x7e
 | 
			
		||||
#define ABIS_RSL_MDISC_TRANSP		0x01
 | 
			
		||||
 | 
			
		||||
#define ABIS_RSL_MDISC_IS_TRANSP(x)	(x & 0x01)
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.1 */
 | 
			
		||||
enum abis_rsl_msgtype {
 | 
			
		||||
	/* Radio Link Layer Management */
 | 
			
		||||
	RSL_MT_DATA_REQ			= 0x01,
 | 
			
		||||
	RSL_MT_DATA_IND,
 | 
			
		||||
	RSL_MT_ERROR_IND,
 | 
			
		||||
	RSL_MT_EST_REQ,
 | 
			
		||||
	RSL_MT_EST_CONF,
 | 
			
		||||
	RSL_MT_EST_IND,
 | 
			
		||||
	RSL_MT_REL_REQ,
 | 
			
		||||
	RSL_MT_REL_CONF,
 | 
			
		||||
	RSL_MT_REL_IND,
 | 
			
		||||
	RSL_MT_UNIT_DATA_REQ,
 | 
			
		||||
	RSL_MT_UNIT_DATA_IND,		/* 0x0b */
 | 
			
		||||
 | 
			
		||||
	/* Common Channel Management / TRX Management */
 | 
			
		||||
	RSL_MT_BCCH_INFO			= 0x11,
 | 
			
		||||
	RSL_MT_CCCH_LOAD_IND,
 | 
			
		||||
	RSL_MT_CHAN_RQD,
 | 
			
		||||
	RSL_MT_DELETE_IND,
 | 
			
		||||
	RSL_MT_PAGING_CMD,
 | 
			
		||||
	RSL_MT_IMMEDIATE_ASSIGN_CMD,
 | 
			
		||||
	RSL_MT_SMS_BC_REQ,
 | 
			
		||||
	/* empty */
 | 
			
		||||
	RSL_MT_RF_RES_IND			= 0x19,
 | 
			
		||||
	RSL_MT_SACCH_FILL,
 | 
			
		||||
	RSL_MT_OVERLOAD,
 | 
			
		||||
	RSL_MT_ERROR_REPORT,
 | 
			
		||||
	RSL_MT_SMS_BC_CMD,
 | 
			
		||||
	RSL_MT_CBCH_LOAD_IND,
 | 
			
		||||
	RSL_MT_NOT_CMD,			/* 0x1f */
 | 
			
		||||
 | 
			
		||||
	/* Dedicate Channel Management */
 | 
			
		||||
	RSL_MT_CHAN_ACTIV			= 0x21,
 | 
			
		||||
	RSL_MT_CHAN_ACTIV_ACK,
 | 
			
		||||
	RSL_MT_CHAN_ACTIV_NACK,
 | 
			
		||||
	RSL_MT_CONN_FAIL,
 | 
			
		||||
	RSL_MT_DEACTIVATE_SACCH,
 | 
			
		||||
	RSL_MT_ENCR_CMD,
 | 
			
		||||
	RSL_MT_HANDO_DET,
 | 
			
		||||
	RSL_MT_MEAS_RES,
 | 
			
		||||
	RSL_MT_MODE_MODIFY_REQ,
 | 
			
		||||
	RSL_MT_MODE_MODIFY_ACK,
 | 
			
		||||
	RSL_MT_MODE_MODIFY_NACK,
 | 
			
		||||
	RSL_MT_PHY_CONTEXT_REQ,
 | 
			
		||||
	RSL_MT_PHY_CONTEXT_CONF,
 | 
			
		||||
	RSL_MT_RF_CHAN_REL,
 | 
			
		||||
	RSL_MT_MS_POWER_CONTROL,
 | 
			
		||||
	RSL_MT_BS_POWER_CONTROL,		/* 0x30 */
 | 
			
		||||
	RSL_MT_PREPROC_CONFIG,
 | 
			
		||||
	RSL_MT_PREPROC_MEAS_RES,
 | 
			
		||||
	RSL_MT_RF_CHAN_REL_ACK,
 | 
			
		||||
	RSL_MT_SACCH_INFO_MODIFY,
 | 
			
		||||
	RSL_MT_TALKER_DET,
 | 
			
		||||
	RSL_MT_LISTENER_DET,
 | 
			
		||||
	RSL_MT_REMOTE_CODEC_CONF_REP,
 | 
			
		||||
	RSL_MT_RTD_REP,
 | 
			
		||||
	RSL_MT_PRE_HANDO_NOTIF,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_REQ,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_ACK,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_NACK,
 | 
			
		||||
	RSL_MT_MR_CODEC_MOD_PER,
 | 
			
		||||
	RSL_MT_TFO_REP,
 | 
			
		||||
	RSL_MT_TFO_MOD_REQ,		/* 0x3f */
 | 
			
		||||
	RSL_MT_LOCATION_INFO		= 0x41,
 | 
			
		||||
 | 
			
		||||
	/* ip.access specific RSL message types */
 | 
			
		||||
	RSL_MT_IPAC_DIR_RETR_ENQ	= 0x40,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_ACT		= 0x48,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_ACT_ACK,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_ACT_NACK,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_DEACT		= 0x4b,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_DEACT_ACK,
 | 
			
		||||
	RSL_MT_IPAC_PDCH_DEACT_NACK,
 | 
			
		||||
	RSL_MT_IPAC_CONNECT_MUX		= 0x50,
 | 
			
		||||
	RSL_MT_IPAC_CONNECT_MUX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_CONNECT_MUX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_BIND_MUX		= 0x53,
 | 
			
		||||
	RSL_MT_IPAC_BIND_MUX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_BIND_MUX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_DISC_MUX		= 0x56,
 | 
			
		||||
	RSL_MT_IPAC_DISC_MUX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_DISC_MUX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_CRCX		= 0x70,		/* Bind to local BTS RTP port */
 | 
			
		||||
	RSL_MT_IPAC_CRCX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_CRCX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_MDCX		= 0x73,
 | 
			
		||||
	RSL_MT_IPAC_MDCX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_MDCX_NACK,
 | 
			
		||||
	RSL_MT_IPAC_DLCX_IND		= 0x76,
 | 
			
		||||
	RSL_MT_IPAC_DLCX		= 0x77,
 | 
			
		||||
	RSL_MT_IPAC_DLCX_ACK,
 | 
			
		||||
	RSL_MT_IPAC_DLCX_NACK,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Siemens vendor-specific */
 | 
			
		||||
enum abis_rsl_msgtype_siemens {
 | 
			
		||||
	RSL_MT_SIEMENS_MRPCI		= 0x41,
 | 
			
		||||
	RSL_MT_SIEMENS_INTRAC_HO_COND_IND = 0x42,
 | 
			
		||||
	RSL_MT_SIEMENS_INTERC_HO_COND_IND = 0x43,
 | 
			
		||||
	RSL_MT_SIEMENS_FORCED_HO_REQ	= 0x44,
 | 
			
		||||
	RSL_MT_SIEMENS_PREF_AREA_REQ	= 0x45,
 | 
			
		||||
	RSL_MT_SIEMENS_PREF_AREA	= 0x46,
 | 
			
		||||
	RSL_MT_SIEMENS_START_TRACE	= 0x47,
 | 
			
		||||
	RSL_MT_SIEMENS_START_TRACE_ACK	= 0x48,
 | 
			
		||||
	RSL_MT_SIEMENS_STOP_TRACE	= 0x49,
 | 
			
		||||
	RSL_MT_SIEMENS_TRMR		= 0x4a,
 | 
			
		||||
	RSL_MT_SIEMENS_HO_FAIL_IND	= 0x4b,
 | 
			
		||||
	RSL_MT_SIEMENS_STOP_TRACE_ACK	= 0x4c,
 | 
			
		||||
	RSL_MT_SIEMENS_UPLF		= 0x4d,
 | 
			
		||||
	RSL_MT_SIEMENS_UPLB		= 0x4e,
 | 
			
		||||
	RSL_MT_SIEMENS_SET_SYS_INFO_10	= 0x4f,
 | 
			
		||||
	RSL_MT_SIEMENS_MODIF_COND_IND	= 0x50,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3 */
 | 
			
		||||
enum abis_rsl_ie {
 | 
			
		||||
	RSL_IE_CHAN_NR			= 0x01,
 | 
			
		||||
	RSL_IE_LINK_IDENT,
 | 
			
		||||
	RSL_IE_ACT_TYPE,
 | 
			
		||||
	RSL_IE_BS_POWER,
 | 
			
		||||
	RSL_IE_CHAN_IDENT,
 | 
			
		||||
	RSL_IE_CHAN_MODE,
 | 
			
		||||
	RSL_IE_ENCR_INFO,
 | 
			
		||||
	RSL_IE_FRAME_NUMBER,
 | 
			
		||||
	RSL_IE_HANDO_REF,
 | 
			
		||||
	RSL_IE_L1_INFO,
 | 
			
		||||
	RSL_IE_L3_INFO,
 | 
			
		||||
	RSL_IE_MS_IDENTITY,
 | 
			
		||||
	RSL_IE_MS_POWER,
 | 
			
		||||
	RSL_IE_PAGING_GROUP,
 | 
			
		||||
	RSL_IE_PAGING_LOAD,
 | 
			
		||||
	RSL_IE_PYHS_CONTEXT		= 0x10,
 | 
			
		||||
	RSL_IE_ACCESS_DELAY,
 | 
			
		||||
	RSL_IE_RACH_LOAD,
 | 
			
		||||
	RSL_IE_REQ_REFERENCE,
 | 
			
		||||
	RSL_IE_RELEASE_MODE,
 | 
			
		||||
	RSL_IE_RESOURCE_INFO,
 | 
			
		||||
	RSL_IE_RLM_CAUSE,
 | 
			
		||||
	RSL_IE_STARTNG_TIME,
 | 
			
		||||
	RSL_IE_TIMING_ADVANCE,
 | 
			
		||||
	RSL_IE_UPLINK_MEAS,
 | 
			
		||||
	RSL_IE_CAUSE,
 | 
			
		||||
	RSL_IE_MEAS_RES_NR,
 | 
			
		||||
	RSL_IE_MSG_ID,
 | 
			
		||||
	/* reserved */
 | 
			
		||||
	RSL_IE_SYSINFO_TYPE		= 0x1e,
 | 
			
		||||
	RSL_IE_MS_POWER_PARAM,
 | 
			
		||||
	RSL_IE_BS_POWER_PARAM,
 | 
			
		||||
	RSL_IE_PREPROC_PARAM,
 | 
			
		||||
	RSL_IE_PREPROC_MEAS,
 | 
			
		||||
	RSL_IE_IMM_ASS_INFO,		/* Phase 1 (3.6.0), later Full below */
 | 
			
		||||
	RSL_IE_SMSCB_INFO		= 0x24,
 | 
			
		||||
	RSL_IE_MS_TIMING_OFFSET,
 | 
			
		||||
	RSL_IE_ERR_MSG,
 | 
			
		||||
	RSL_IE_FULL_BCCH_INFO,
 | 
			
		||||
	RSL_IE_CHAN_NEEDED,
 | 
			
		||||
	RSL_IE_CB_CMD_TYPE,
 | 
			
		||||
	RSL_IE_SMSCB_MSG,
 | 
			
		||||
	RSL_IE_FULL_IMM_ASS_INFO,
 | 
			
		||||
	RSL_IE_SACCH_INFO,
 | 
			
		||||
	RSL_IE_CBCH_LOAD_INFO,
 | 
			
		||||
	RSL_IE_SMSCB_CHAN_INDICATOR,
 | 
			
		||||
	RSL_IE_GROUP_CALL_REF,
 | 
			
		||||
	RSL_IE_CHAN_DESC		= 0x30,
 | 
			
		||||
	RSL_IE_NCH_DRX_INFO,
 | 
			
		||||
	RSL_IE_CMD_INDICATOR,
 | 
			
		||||
	RSL_IE_EMLPP_PRIO,
 | 
			
		||||
	RSL_IE_UIC,
 | 
			
		||||
	RSL_IE_MAIN_CHAN_REF,
 | 
			
		||||
	RSL_IE_MR_CONFIG,
 | 
			
		||||
	RSL_IE_MR_CONTROL,
 | 
			
		||||
	RSL_IE_SUP_CODEC_TYPES,
 | 
			
		||||
	RSL_IE_CODEC_CONFIG,
 | 
			
		||||
	RSL_IE_RTD,
 | 
			
		||||
	RSL_IE_TFO_STATUS,
 | 
			
		||||
	RSL_IE_LLP_APDU,
 | 
			
		||||
	/* Siemens vendor-specific */
 | 
			
		||||
	RSL_IE_SIEMENS_MRPCI		= 0x40,
 | 
			
		||||
	RSL_IE_SIEMENS_PREF_AREA_TYPE	= 0x43,
 | 
			
		||||
	RSL_IE_SIEMENS_ININ_CELL_HO_PAR	= 0x45,
 | 
			
		||||
	RSL_IE_SIEMENS_TRACE_REF_NR	= 0x46,
 | 
			
		||||
	RSL_IE_SIEMENS_INT_TRACE_IDX	= 0x47,
 | 
			
		||||
	RSL_IE_SIEMENS_L2_HDR_INFO	= 0x48,
 | 
			
		||||
	RSL_IE_SIEMENS_HIGHEST_RATE	= 0x4e,
 | 
			
		||||
	RSL_IE_SIEMENS_SUGGESTED_RATE	= 0x4f,
 | 
			
		||||
 | 
			
		||||
	/* ip.access */
 | 
			
		||||
	RSL_IE_IPAC_SRTP_CONFIG	= 0xe0,
 | 
			
		||||
	RSL_IE_IPAC_PROXY_UDP	= 0xe1,
 | 
			
		||||
	RSL_IE_IPAC_BSCMPL_TOUT	= 0xe2,
 | 
			
		||||
	RSL_IE_IPAC_REMOTE_IP	= 0xf0,
 | 
			
		||||
	RSL_IE_IPAC_REMOTE_PORT	= 0xf1,
 | 
			
		||||
	RSL_IE_IPAC_RTP_PAYLOAD	= 0xf2,
 | 
			
		||||
	RSL_IE_IPAC_LOCAL_PORT	= 0xf3,
 | 
			
		||||
	RSL_IE_IPAC_SPEECH_MODE	= 0xf4,
 | 
			
		||||
	RSL_IE_IPAC_LOCAL_IP	= 0xf5,
 | 
			
		||||
	RSL_IE_IPAC_CONN_STAT	= 0xf6,
 | 
			
		||||
	RSL_IE_IPAC_HO_C_PARMS	= 0xf7,
 | 
			
		||||
	RSL_IE_IPAC_CONN_ID	= 0xf8,
 | 
			
		||||
	RSL_IE_IPAC_RTP_CSD_FMT	= 0xf9,
 | 
			
		||||
	RSL_IE_IPAC_RTP_JIT_BUF	= 0xfa,
 | 
			
		||||
	RSL_IE_IPAC_RTP_COMPR	= 0xfb,
 | 
			
		||||
	RSL_IE_IPAC_RTP_PAYLOAD2= 0xfc,
 | 
			
		||||
	RSL_IE_IPAC_RTP_MPLEX	= 0xfd,
 | 
			
		||||
	RSL_IE_IPAC_RTP_MPLEX_ID= 0xfe,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.1 */
 | 
			
		||||
#define RSL_CHAN_NR_MASK	0xf8
 | 
			
		||||
#define RSL_CHAN_Bm_ACCHs	0x08
 | 
			
		||||
#define RSL_CHAN_Lm_ACCHs	0x10	/* .. 0x18 */
 | 
			
		||||
#define RSL_CHAN_SDCCH4_ACCH	0x20	/* .. 0x38 */
 | 
			
		||||
#define RSL_CHAN_SDCCH8_ACCH	0x40	/* ...0x78 */
 | 
			
		||||
#define RSL_CHAN_BCCH		0x80
 | 
			
		||||
#define RSL_CHAN_RACH		0x88
 | 
			
		||||
#define RSL_CHAN_PCH_AGCH	0x90
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.3 */
 | 
			
		||||
#define RSL_ACT_TYPE_INITIAL	0x00
 | 
			
		||||
#define RSL_ACT_TYPE_REACT	0x80
 | 
			
		||||
#define RSL_ACT_INTRA_IMM_ASS	0x00
 | 
			
		||||
#define RSL_ACT_INTRA_NORM_ASS	0x01
 | 
			
		||||
#define RSL_ACT_INTER_ASYNC	0x02
 | 
			
		||||
#define RSL_ACT_INTER_SYNC	0x03
 | 
			
		||||
#define RSL_ACT_SECOND_ADD	0x04
 | 
			
		||||
#define RSL_ACT_SECOND_MULTI	0x05
 | 
			
		||||
 | 
			
		||||
/* Chapter 9.3.6 */
 | 
			
		||||
struct rsl_ie_chan_mode {
 | 
			
		||||
	uint8_t dtx_dtu;
 | 
			
		||||
	uint8_t spd_ind;
 | 
			
		||||
	uint8_t chan_rt;
 | 
			
		||||
	uint8_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 {
 | 
			
		||||
		uint8_t iei;
 | 
			
		||||
		uint8_t chan_nr;	/* enc_chan_nr */
 | 
			
		||||
		uint8_t oct3;
 | 
			
		||||
		uint8_t oct4;
 | 
			
		||||
	} chan_desc;
 | 
			
		||||
#if 0	/* spec says we need this but Abissim doesn't use it */
 | 
			
		||||
	struct {
 | 
			
		||||
		uint8_t tag;
 | 
			
		||||
		uint8_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,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Siemens vendor-specific RSL extensions */
 | 
			
		||||
struct rsl_mrpci {
 | 
			
		||||
	uint8_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,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* PROTO_GSM_08_58_H */
 | 
			
		||||
							
								
								
									
										713
									
								
								libosmocore/include/osmocore/protocol/gsm_12_21.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										713
									
								
								libosmocore/include/osmocore/protocol/gsm_12_21.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,713 @@
 | 
			
		||||
#ifndef PROTO_GSM_12_21_H
 | 
			
		||||
#define PROTO_GSM_12_21_H
 | 
			
		||||
 | 
			
		||||
/* GSM Network Management messages on the A-bis interface 
 | 
			
		||||
 * 3GPP TS 12.21 version 8.0.0 Release 1999 / ETSI TS 100 623 V8.0.0 */
 | 
			
		||||
 | 
			
		||||
/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
 | 
			
		||||
 * All Rights Reserved
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License along
 | 
			
		||||
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <osmocore/tlv.h>
 | 
			
		||||
 | 
			
		||||
/* generic header in front of every OML message according to TS 08.59 */
 | 
			
		||||
struct abis_om_hdr {
 | 
			
		||||
	uint8_t	mdisc;
 | 
			
		||||
	uint8_t	placement;
 | 
			
		||||
	uint8_t	sequence;
 | 
			
		||||
	uint8_t	length;
 | 
			
		||||
	uint8_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 {
 | 
			
		||||
	uint8_t	bts_nr;
 | 
			
		||||
	uint8_t	trx_nr;
 | 
			
		||||
	uint8_t	ts_nr;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct abis_om_fom_hdr {
 | 
			
		||||
	uint8_t	msg_type;
 | 
			
		||||
	uint8_t	obj_class;
 | 
			
		||||
	struct abis_om_obj_inst	obj_inst;
 | 
			
		||||
	uint8_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_RESTART_NACK,
 | 
			
		||||
	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,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum abis_nm_op_state {
 | 
			
		||||
	NM_OPSTATE_DISABLED	= 1,
 | 
			
		||||
	NM_OPSTATE_ENABLED	= 2,
 | 
			
		||||
	NM_OPSTATE_NULL		= 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 {
 | 
			
		||||
	uint8_t	attrib;
 | 
			
		||||
	uint8_t	bts_port;
 | 
			
		||||
	uint8_t	timeslot;
 | 
			
		||||
	uint8_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,
 | 
			
		||||
	NM_IPAC_EIE_CONFIG		= 0x07,
 | 
			
		||||
	NM_IPAC_EIE_RES_DETAILS		= 0x08,
 | 
			
		||||
	NM_IPAC_EIE_RXLEV_THRESH	= 0x09,
 | 
			
		||||
	NM_IPAC_EIE_FREQ_SYNC_OPTS	= 0x0a,
 | 
			
		||||
	NM_IPAC_EIE_MAC_ADDR		= 0x0b,
 | 
			
		||||
	NM_IPAC_EIE_HW_SW_COMPAT_NR	= 0x0c,
 | 
			
		||||
	NM_IPAC_EIE_MANUF_SER_NR	= 0x0d,
 | 
			
		||||
	NM_IPAC_EIE_OEM_ID		= 0x0e,
 | 
			
		||||
	NM_IPAC_EIE_DATE_TIME_MANUF	= 0x0f,
 | 
			
		||||
	NM_IPAC_EIE_DATE_TIME_CALIB	= 0x10,
 | 
			
		||||
	NM_IPAC_EIE_BEACON_INFO		= 0x11,
 | 
			
		||||
	NM_IPAC_EIE_FREQ_ERR		= 0x12,
 | 
			
		||||
	/* FIXME */
 | 
			
		||||
	NM_IPAC_EIE_FREQ_BANDS		= 0x1c,
 | 
			
		||||
	NM_IPAC_EIE_MAX_TA		= 0x1d,
 | 
			
		||||
	NM_IPAC_EIE_CIPH_ALGOS		= 0x1e,
 | 
			
		||||
	NM_IPAC_EIE_CHAN_TYPES		= 0x1f,
 | 
			
		||||
	NM_IPAC_EIE_CHAN_MODES		= 0x20,
 | 
			
		||||
	NM_IPAC_EIE_GPRS_CODING		= 0x21,
 | 
			
		||||
	NM_IPAC_EIE_RTP_FEATURES	= 0x22,
 | 
			
		||||
	NM_IPAC_EIE_RSL_FEATURES	= 0x23,
 | 
			
		||||
	NM_IPAC_EIE_BTS_HW_CLASS	= 0x24,
 | 
			
		||||
	NM_IPAC_EIE_BTS_ID		= 0x25,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* PROTO_GSM_12_21_H */
 | 
			
		||||
							
								
								
									
										32
									
								
								libosmocore/include/osmocore/rsl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								libosmocore/include/osmocore/rsl.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
#ifndef _OSMOCORE_RSL_H
 | 
			
		||||
#define _OSMOCORE_RSL_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <osmocore/utils.h>
 | 
			
		||||
#include <osmocore/protocol/gsm_08_58.h>
 | 
			
		||||
 | 
			
		||||
void rsl_init_rll_hdr(struct abis_rsl_rll_hdr *dh, uint8_t msg_type);
 | 
			
		||||
 | 
			
		||||
extern const struct tlv_definition rsl_att_tlvdef;
 | 
			
		||||
#define rsl_tlv_parse(dec, buf, len)     \
 | 
			
		||||
			tlv_parse(dec, &rsl_att_tlvdef, buf, len, 0, 0)
 | 
			
		||||
 | 
			
		||||
/* encode channel number as per Section 9.3.1 */
 | 
			
		||||
uint8_t rsl_enc_chan_nr(uint8_t type, uint8_t subch, uint8_t timeslot);
 | 
			
		||||
/* decode channel number as per Section 9.3.1 */
 | 
			
		||||
int rsl_dec_chan_nr(uint8_t chan_nr, uint8_t *type, uint8_t *subch, uint8_t *timeslot);
 | 
			
		||||
 | 
			
		||||
const char *rsl_err_name(uint8_t err);
 | 
			
		||||
const char *rsl_rlm_cause_name(uint8_t err);
 | 
			
		||||
 | 
			
		||||
/* Section 3.3.2.3 TS 05.02. I think this looks like a table */
 | 
			
		||||
int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf);
 | 
			
		||||
 | 
			
		||||
/* Push a RSL RLL header with L3_INFO IE */
 | 
			
		||||
void rsl_rll_push_l3(struct msgb *msg, uint8_t msg_type, uint8_t chan_nr,
 | 
			
		||||
		     uint8_t link_id, int transparent);
 | 
			
		||||
 | 
			
		||||
/* Allocate msgb and fill with simple RSL RLL header */
 | 
			
		||||
struct msgb *rsl_rll_simple(uint8_t msg_type, uint8_t chan_nr,
 | 
			
		||||
			    uint8_t link_id, int transparent);
 | 
			
		||||
#endif /* _OSMOCORE_RSL_H */
 | 
			
		||||
							
								
								
									
										22
									
								
								libosmocore/include/osmocore/rxlev_stat.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								libosmocore/include/osmocore/rxlev_stat.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef _OSMOCORE_RXLEV_STATS_H
 | 
			
		||||
#define _OSMOCORE_RXLEV_STATS_H
 | 
			
		||||
 | 
			
		||||
#define NUM_RXLEVS 32
 | 
			
		||||
#define NUM_ARFCNS 1024
 | 
			
		||||
 | 
			
		||||
struct rxlev_stats {
 | 
			
		||||
	/* the maximum number of ARFCN's is 1024, and there are 32 RxLevels,
 | 
			
		||||
	 * so in we keep one 1024bit-bitvec for each RxLev */
 | 
			
		||||
	uint8_t rxlev_buckets[NUM_RXLEVS][NUM_ARFCNS/8];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void rxlev_stat_input(struct rxlev_stats *st, uint16_t arfcn, uint8_t rxlev);
 | 
			
		||||
 | 
			
		||||
/* get the next ARFCN that has the specified Rxlev */
 | 
			
		||||
int16_t rxlev_stat_get_next(const struct rxlev_stats *st, uint8_t rxlev, int16_t arfcn);
 | 
			
		||||
 | 
			
		||||
void rxlev_stat_reset(struct rxlev_stats *st);
 | 
			
		||||
 | 
			
		||||
void rxlev_stat_dump(const struct rxlev_stats *st);
 | 
			
		||||
 | 
			
		||||
#endif /* _OSMOCORE_RXLEV_STATS_H */
 | 
			
		||||
							
								
								
									
										22
									
								
								libosmocore/include/osmocore/select.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								libosmocore/include/osmocore/select.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef _BSC_SELECT_H
 | 
			
		||||
#define _BSC_SELECT_H
 | 
			
		||||
 | 
			
		||||
#include "linuxlist.h"
 | 
			
		||||
 | 
			
		||||
#define BSC_FD_READ	0x0001
 | 
			
		||||
#define BSC_FD_WRITE	0x0002
 | 
			
		||||
#define BSC_FD_EXCEPT	0x0004
 | 
			
		||||
 | 
			
		||||
struct bsc_fd {
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
	int fd;
 | 
			
		||||
	unsigned int when;
 | 
			
		||||
	int (*cb)(struct bsc_fd *fd, unsigned int what);
 | 
			
		||||
	void *data;
 | 
			
		||||
	unsigned int priv_nr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int bsc_register_fd(struct bsc_fd *fd);
 | 
			
		||||
void bsc_unregister_fd(struct bsc_fd *fd);
 | 
			
		||||
int bsc_select_main(int polling);
 | 
			
		||||
#endif /* _BSC_SELECT_H */
 | 
			
		||||
							
								
								
									
										15
									
								
								libosmocore/include/osmocore/signal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								libosmocore/include/osmocore/signal.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef OSMOCORE_SIGNAL_H
 | 
			
		||||
#define OSMOCORE_SIGNAL_H
 | 
			
		||||
 | 
			
		||||
typedef int signal_cbfn(unsigned int subsys, unsigned int signal,
 | 
			
		||||
			void *handler_data, void *signal_data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Management */
 | 
			
		||||
int register_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data);
 | 
			
		||||
void unregister_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data);
 | 
			
		||||
 | 
			
		||||
/* Dispatch */
 | 
			
		||||
void dispatch_signal(unsigned int subsys, unsigned int signal, void *signal_data);
 | 
			
		||||
 | 
			
		||||
#endif /* OSMOCORE_SIGNAL_H */
 | 
			
		||||
							
								
								
									
										31
									
								
								libosmocore/include/osmocore/statistics.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								libosmocore/include/osmocore/statistics.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
#ifndef _STATISTICS_H
 | 
			
		||||
#define _STATISTICS_H
 | 
			
		||||
 | 
			
		||||
struct counter {
 | 
			
		||||
	struct llist_head list;
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *description;
 | 
			
		||||
	unsigned long value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline void counter_inc(struct counter *ctr)
 | 
			
		||||
{
 | 
			
		||||
	ctr->value++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned long counter_get(struct counter *ctr)
 | 
			
		||||
{
 | 
			
		||||
	return ctr->value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void counter_reset(struct counter *ctr)
 | 
			
		||||
{
 | 
			
		||||
	ctr->value = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct counter *counter_alloc(const char *name);
 | 
			
		||||
void counter_free(struct counter *ctr);
 | 
			
		||||
 | 
			
		||||
int counters_for_each(int (*handle_counter)(struct counter *, void *), void *data);
 | 
			
		||||
 | 
			
		||||
#endif /* _STATISTICS_H */
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user